/* ===========================================================================
   MH Betriebsportal — gemeinsames Aussehen
   ===========================================================================

   Eine Datei für alle Module. Wer eine neue Seite anlegt, bindet diese hier
   und portal.js ein und bekommt Palette, Kopfzeile und Anmeldung mitgeliefert.

   Die Farben stammen aus dem Störungsportal und damit aus der Hausmarke:
   Sand #D5C893 und Warmgrau #8C8171 sind die Farben des Logos. Für das helle
   Schema sind die Akzente abgedunkelt — das Sand des Logos ist auf Weiß nicht
   lesbar. Im Logo selbst bleiben die Originalfarben.

   Die Variablennamen (--braun, --messing, --papier …) sind aus der ersten
   Fassung übernommen und bewusst nicht umbenannt: sie stecken an rund achtzig
   Stellen in index.html. Umgehängt wurde, worauf sie zeigen, nicht wie sie
   heißen.

   Keine externen Schriften. Das Störungsportal lädt Outfit und JetBrains Mono
   von Google — hier ist das nach Regel 5 nicht zulässig, also stehen
   Systemschriften darin. Wer die Hausschriften will, legt die woff2-Dateien
   nach web/schriften/ und ergänzt zwei @font-face-Regeln; ausliefern würde
   sie dann der eigene Server.
   =========================================================================== */

:root {
  /* Helles Schema — fürs Büro. Voreinstellung folgt dem Betriebssystem. */
  --tinte:      #2A2521;   /* Fließtext          */
  /* NACHGEZOGEN AN DIE NEUE WEBSITE (mh-haustechnik.de, Stand 08.08.2026).
     Das helle Schema fuehrt jetzt deren Gold #C9A063 und deren Creme
     #F6F2EA — ein Betrieb, ein Erscheinungsbild. Wer vom Angebot auf das
     Portal wechselt, soll nicht das Gefuehl haben, das Haus gewechselt zu
     haben.

     AM PRINZIP AENDERT SICH NICHTS, nur am Ton: Gold traegt weiterhin als
     FLAECHE mit dunkler Schrift, nicht als Schrift auf hell. Gemessen:
       Tinte auf Gold   7,79:1  ✓ (AAA)
       Gold auf Creme   2,16:1  ✗ — als Schrift unbrauchbar, auch gross
     Der bisherige Sand lag bei 11,22:1 als Flaeche, also hoeher. Beide
     bestehen AA und AAA deutlich; den Ausschlag gibt die Marke.

     Im DUNKLEN Schema bleibt der Originalsand #D5C893 (9,68:1 als Schrift).
     Dort ist er lesbar, und dort ist er die Farbe des Logos.

     DIE DREI FARBEN DES LOGOS, unveraendert:
       Sand #D5C893 · Warmgrau #8C8171 · Tinte #131110
     Frueher standen hier abgedunkelte Ableitungen (#8A6F33), weil das Sand
     als TEXT auf hellem Grund nur 1,57:1 ergibt — unlesbar. Gemessen, nicht
     geschaetzt.
     Die Loesung ist nicht, die Farbe zu veraendern, sondern sie richtig zu
     verwenden: Sand traegt als FLAECHE mit Tinte darauf 11,22:1. Knoepfe und
     Hervorhebungen sind deshalb sandfarben mit dunkler Schrift, nicht
     sandfarbene Schrift auf Weiss.
     Wo ein farbiger TEXT noetig waere (Verweise), steht Tinte mit
     Unterstreichung. Eine vierte Farbe kommt nicht dazu. */
  --braun:      #C9A063;   /* Gold der Website — Flaeche fuer Knoepfe */
  --messing:    #C9A063;   /* Gold — Hervorhebung                     */
  --kupfer:     #B03F2C;   /* Fehler, Abbruch    */
  --gruen:      #4A7A34;   /* Erfolg             */
  --bernstein:  #A66F22;   /* Warnung            */
  --papier:     #F6F2EA;   /* Creme der Website  */
  --karte:      #FFFFFF;   /* Kartengrund        */
  --grund-alt:  #EFE9DD;   /* abgesetzte Fläche  */
  --linie:      #E3DACA;
  --linie-weich:#EEE7DA;
  --grau:       #6B6156;   /* Beschriftungen     */
  --grau-fein:  #9A9086;   /* Nebensächliches    */
  --auf-akzent: #131110;   /* Tinte auf Sand — 11,22:1 */
  --verweis:    #131110;   /* Sand waere hier 1,57:1 */
  /* AKZENT ALS SCHRIFT — eigener Ton, und zwar aus Notwendigkeit.
     Ueber zwanzig Stellen im Portal setzen den Akzent als Schriftfarbe:
     aktive Reiter, Absatzkoepfe, Codenummern, Uhrzeiten. Im hellen Schema
     war das mit dem Sand 1,50:1 und damit unlesbar — die Regel "Sand traegt
     als Flaeche, nicht als Schrift" stand in der Datei, aber niemand hat
     sie an diesen zwanzig Stellen durchgesetzt.
     Gemessen auf Creme / Karte / abgesetzter Flaeche: 5,47 / 6,11 / 5,05.
     Im dunklen Schema bleibt der Originalsand (9,68:1) — dort ist er
     lesbar und dort ist er die Farbe des Logos. */
  --akzent-text:#7D5C2A;
  /* DIESELBE UNTERSCHEIDUNG WIE BEIM AKZENT, und aus demselben Grund.
     `--bernstein` und `--kupfer` sind FLAECHEN — sie tragen `--auf-akzent`
     als Schrift. Als Schriftfarbe auf hellem Grund sind sie zu schwach:
     gemessen `--bernstein` 4,27 / 3,82 / 3,53 auf Karte, Papier und
     abgesetzter Flaeche, noetig sind 4,5.
     Den Flaechenton dafuer abzudunkeln waere falsch herum — dann sinkt der
     Kontrast der dunklen Schrift DARAUF. Also ein eigener Ton, wie
     `--akzent-text` einer ist.
     Betroffen war unter anderem die Bindefristwarnung „heute" in der
     Angebotsliste und der Schweregrad am Stoerungscode. */
  --bernstein-text:#8F5F1C;   /* 5,50 / 4,92 / 4,55 */
  --kupfer-text:#B03F2C;      /* 5,84 / 5,23 / 4,83 — hell schon in Ordnung */
  --schleier:   rgba(38,33,28,.45);
  /* Der Anmeldekopf hat KEINE eigene Flaeche mehr. Erst war er braun (sah
     olivfarben aus), dann tintenschwarz — und das Schwarz gehoert gar nicht
     zum Logo, es war beim Ableiten des App-Symbols hinzugekommen. Das
     Zeichen steht jetzt frei auf dem Kartengrund, wie im Original. Getrennt
     wird mit einer Haarlinie, nicht mit Farbe. */
  --marke-leise:#8C8171;   /* Warmgrau des Zeichens, fuer Nebensaechliches */

  --schrift: "Public Sans", "Segoe UI", system-ui, -apple-system, sans-serif;
  --schrift-kopf: Lora, Georgia, "Times New Roman", serif;
  --schrift-mono: ui-monospace, "Cascadia Mono", "SF Mono", Menlo, monospace;

  /* EINE Rundung fuer das ganze Portal.
     Die Website rundet grosszuegig; das Portal stand auf 3px und wirkte
     daneben kantig. Ein Wert und keine Skala: gemischte Radien (runde
     Knoepfe in eckigen Karten) sehen nach Versehen aus, und der
     Unterschied zwischen 8 und 10 Pixeln traegt keine Bedeutung.

     Listenzeilen bleiben ausdruecklich eckig — sie sind Tabellenzeilen,
     und eine gerundete Zeile in einer Liste bricht die Kante, an der das
     Auge entlangliest. */
  --rundung: 10px;

  color-scheme: light;
}

/* Dunkles Schema — fürs Handy im Heizungskeller und für den Abend.
   Hier stehen die Originaltöne des Logos: auf dunklem Grund sind sie lesbar.

   Der Block steht zweimal, einmal am Attribut und einmal an der Medienabfrage.
   Zusammenfassen ließe sich das nur mit @media in einer Selektorliste, und das
   gibt es in CSS nicht. Wer die Werte ändert, muss beide Stellen anfassen —
   deshalb stehen sie direkt untereinander. */
:root[data-schema="dunkel"] {
  --tinte:      #F5F1E9;
  --braun:      #D5C893;
  --messing:    #D5C893;
  --kupfer:     #D9705C;
  --gruen:      #96BE7E;
  --bernstein:  #E4B36B;
  --papier:     #22201D;
  --karte:      #332E2A;
  --grund-alt:  #2B2724;
  --linie:      #463F38;
  --linie-weich:#3B352F;
  --grau:       #B5ABA0;
  --grau-fein:  #867C71;
  --auf-akzent: #1F1B17;
  --verweis:    #D5C893;   /* Sand, 9,68:1 auf dunklem Grund */
  --akzent-text:#D5C893;   /* Sand — auf dunkel lesbar */
  --bernstein-text:#E4B36B;   /* 7,00 / 8,48 — als Schrift schon gut */
  /* GEMESSEN 4,10 auf --karte. Das traegt die Marke „kritisch" am
     Stoerungscode — die Angabe mit der hoechsten Folgenschwere im Portal,
     auf dem Geraet und im Schema, in dem ein Monteur sie liest. */
  --kupfer-text:#E28271;      /* 4,90 / 5,93 */
  --schleier:   rgba(12,10,9,.88);
  color-scheme: dark;
}

@media (prefers-color-scheme: dark) {
  :root:not([data-schema="hell"]) {
    --tinte:      #F5F1E9;
    --braun:      #D5C893;
    --messing:    #D5C893;
    --kupfer:     #D9705C;
    --gruen:      #96BE7E;
    --bernstein:  #E4B36B;
    --papier:     #22201D;
    --karte:      #332E2A;
    --grund-alt:  #2B2724;
    --linie:      #463F38;
    --linie-weich:#3B352F;
    --grau:       #B5ABA0;
    --grau-fein:  #867C71;
    --auf-akzent: #1F1B17;
    --verweis:    #D5C893;   /* Sand, 9,68:1 auf dunklem Grund */
    --akzent-text:#D5C893;   /* Sand — auf dunkel lesbar */
  --bernstein-text:#E4B36B;   /* 7,00 / 8,48 — als Schrift schon gut */
  /* GEMESSEN 4,10 auf --karte. Das traegt die Marke „kritisch" am
     Stoerungscode — die Angabe mit der hoechsten Folgenschwere im Portal,
     auf dem Geraet und im Schema, in dem ein Monteur sie liest. */
  --kupfer-text:#E28271;      /* 4,90 / 5,93 */
    --schleier:   rgba(12,10,9,.88);
  }
}

/* --- Grundgerüst --------------------------------------------------------- */

*{box-sizing:border-box}
body{margin:0;background:var(--papier);color:var(--tinte);
     font-family:var(--schrift);font-size:16px;-webkit-text-size-adjust:100%}
/* ÜBERSCHRIFTEN IM WERKZEUG SIND SANS, NICHT SERIF.
   Hier stand Lora, und auf der Website ist das richtig: dort wird gelesen.
   Im Portal wird gearbeitet, acht Stunden am Tag — und eine Serifenschrift
   über einer Terminliste sagt "Dokument", nicht "Anwendung". Kein Werkzeug,
   das eine Warenwirtschaft ablöst, setzt seine Spaltenköpfe in Georgia.

   DIE MARKE BEHÄLT DIE SERIFE. `.anmeldetitel` auf dem Anmeldebildschirm
   bleibt Lora: das ist der eine Moment, in dem das Portal sich vorstellt
   statt zu arbeiten. Genau diese Trennung machen Produkte, die beides
   haben — Anzeigeschrift fürs Auftreten, Oberflächenschrift fürs Bedienen. */
h1,h2,h3{font-family:var(--schrift);font-weight:600;margin:0;
         letter-spacing:-.01em}
/* Verweise tragen Tinte und eine Unterstreichung, keine Akzentfarbe: das
   Sand des Logos ergibt als Text auf hellem Grund 1,57:1. Im dunklen Schema
   ist Sand lesbar (9,68:1) und wird dort als Verweisfarbe gesetzt. */
a{color:var(--verweis);text-decoration-thickness:1px;text-underline-offset:2px}

.huelle{max-width:1180px;margin:0 auto;
        padding:0 16px calc(56px + env(safe-area-inset-bottom))}

/* Zwei Spalten ab 1100px: links die Modulwahl, rechts alles andere. Darunter
   bleibt es einspaltig, die Regeln dafür stehen im @media weiter unten. */
/* ANWENDUNG STATT DOKUMENT — ab 1101px.
 *
 * Bis hierher war die Hülle eine zentrierte Spalte von 1320px, und die Seite
 * scrollte als Ganzes: die Kopfzeile mit Marke, Rolle und Abmeldeknopf fuhr
 * nach oben weg, die Modulwahl mit ihr. Das ist Zeitschriftenlayout. Ein
 * Werkzeug, das acht Stunden am Tag offen ist und TAIFUN ablösen soll, hält
 * seine Bedienelemente an Ort und Stelle und scrollt nur den Inhalt.
 *
 * Drei Dinge machen den Unterschied, und alle drei stehen hier:
 *   1. Die Schale ist genau so hoch wie das Fenster (100dvh, nicht 100vh —
 *      auf iOS wandert die Adressleiste und vh springt).
 *   2. Kopf und Leiste stehen fest, `.inhalt` bekommt den Rest und scrollt
 *      für sich.
 *   3. Volle Fensterbreite statt zentrierter Spalte. Eine Terminwoche mit
 *      sechs Tagen und eine Nachkalkulation brauchen den Platz; auf einem
 *      1600px-Schirm 280px links und rechts zu verschenken ist Verschwendung.
 *
 * UNTER 1101px BLEIBT ES BEIM DOKUMENTSCROLL. Am Handy ist das die native
 * Bewegung; eine feste Schale mit innerem Scrollbereich kämpft dort mit der
 * Adressleiste und dem Gummiband-Effekt. Der Monteur soll wischen können.
 */
/* `.huelle.schmal` stand hier und ist ersatzlos entfallen. Sie begrenzte auf
   640px und war richtig, solange das Portal keine Menüleiste hatte: eine
   einzelne Spalte mittig liest sich besser als eine über den ganzen Schirm
   gezogene Zeile.

   Mit der Leiste war sie falsch. Von den 640px gingen 216 an die Leiste und
   28 an den Abstand — der Inhalt bekam knapp 400px, mitten in einem 1600px
   breiten Fenster. Auf dem Schirm sah es aus, als zeige der Rechner die
   Handyansicht.

   Die beiden Seiten, die sie trugen (Störungscodes, Zeiterfassung), regeln
   ihre Breite jetzt selbst und dort, wo sie entsteht: die Codeliste über
   `auto-fill`, der Stempelbereich über eine eigene Spaltenbreite. Damit
   bleibt keine Regel übrig, die von einer Annahme über das Gerüst lebt. */

/* --- Kopfzeile mit Wortmarke und Modulwahl -------------------------------- */

.kopf{display:flex;flex-wrap:wrap;gap:12px;align-items:center;
      justify-content:space-between;padding:16px 0 12px}
.kopf-marke{display:flex;align-items:center;gap:12px;min-width:0}
/* Nur das Zeichen, nahezu quadratisch — deshalb über die Höhe bemessen. Die
   volle Wortmarke wäre 1650:649 und nähme auf einem Handy die halbe Zeile. */
.wortmarke{height:46px;width:auto;flex-shrink:0}

/* Die Marke ist ein Verweis auf die Startseite. Als <a> erbt sie sonst
   Unterstreichung und Verweisfarbe; beides hat an einem Logo nichts zu
   suchen. Der sichtbare Fokusrahmen bleibt — er ist der einzige Hinweis
   für jemanden, der mit der Tastatur bedient. */
/* Mindestens 44×44. Sobald die Marke anklickbar ist, ist sie kein Bild mehr,
   sondern ein Bedienelement — und dafür gilt im Portal überall dasselbe Maß.
   Das Zeichen allein misst 39×40 und läge darunter. Der Innenabstand kostet
   in der Kopfzeile sechs Pixel Breite. */
.markenweg{display:inline-flex;align-items:center;justify-content:center;
      min-width:44px;min-height:44px;padding:0 3px;
      text-decoration:none;border-radius:var(--rundung);flex-shrink:0}
.markenweg:hover{opacity:.82}
/* DER FOKUSRAHMEN TRUG --messing, ALSO GOLD ALS KANTE AUF HELL.
   Gemessen 2,42 auf --karte, 2,16 auf --papier, 2,00 auf --grund-alt;
   WCAG 1.4.11 und 2.4.11 verlangen 3,0. Im dunklen Schema war alles in
   Ordnung — der Fehler war rein hell, und genau dort arbeitet die
   Sachbearbeitung acht Stunden am Formular. Wer mit Tabulator arbeitet,
   sah nicht, wo er steht.
   Der Satz „Sand traegt als Flaeche, nicht als Schrift" stand in dieser
   Datei seit Langem — auf eine KANTE ist er nie angewendet worden.
   --akzent-text liefert 6,11 / 5,47 / 5,05 und ist keine vierte Farbe. */
.markenweg:focus-visible{outline:2px solid var(--akzent-text);outline-offset:3px}

/* Klappknopf. Erscheint erst, wenn die Kopfzeile eng wird. */
.menuknopf{display:none;width:44px;height:44px;min-height:0;padding:0;
      font-size:20px;line-height:1;background:var(--grund-alt);color:var(--akzent-text);
      border:1px solid var(--linie);flex-shrink:0}
.kopf-titel{font-family:var(--schrift);font-size:20px;font-weight:600;
            color:var(--akzent-text);white-space:nowrap}
.kopf-strich{width:1px;height:34px;background:var(--linie);flex-shrink:0}
.kopf-rechts{display:flex;align-items:center;gap:9px;flex-wrap:wrap;
      justify-content:flex-end;min-width:0}
/* Die Benutzerkennung ist das einzige Stück hier, dessen Breite vom Inhalt
   abhängt — "M. HUBER · SACHBEARBEITER" sind über 200 px. Sie darf deshalb
   schrumpfen und abschneiden; die Knöpfe daneben dürfen es nicht, die muss
   man treffen können. */
.wer{font-size:10px;letter-spacing:.13em;text-transform:uppercase;font-weight:600;
     padding:5px 10px;border:1px solid var(--linie);color:var(--grau);
     white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
     min-width:0;max-width:46vw}
.wer.an{border-color:var(--gruen);color:var(--gruen)}

/* Netzanzeige. Nur sichtbar, wenn nichts geht — eine Marke, die dauernd
   "online" meldet, liest nach dem zweiten Tag niemand mehr. Kupfer und
   nicht Rot: es ist kein Fehler, sondern der Regelfall im Heizungskeller. */
.netzweg{font-size:10px;letter-spacing:.13em;text-transform:uppercase;
     font-weight:700;padding:5px 9px;white-space:nowrap;flex-shrink:0;
     background:var(--kupfer);color:var(--auf-akzent)}

/* --- Modulwahl als linke Leiste ------------------------------------------
   Zehn Module passen in keine Kopfzeile. Vorher lief die waagerechte Leiste
   bei 1280px um 136px über, danach brach sie auf zwei Zeilen um — beides
   liest sich wie ein Fehler. Senkrecht wächst eine Liste dagegen, ohne dass
   die Gestaltung dagegen arbeitet, und russische Beschriftungen brauchen dort
   Höhe statt Breite.

   Umgesetzt als Raster auf der Hülle, nicht als eigenes Gerüst: die Reihenfolge
   im Dokument bleibt Kopf → Leiste → Inhalt, also ändert sich an keiner der
   zehn Modulseiten etwas, und ohne Anmeldung (Leiste verborgen) fällt die
   Spalte einfach weg.

   Keine Sinnbilder neben den Einträgen. Eine Bildzeichensammlung ist hier
   nicht ladbar (keine externen Skripte, Datenschutzauflage), und selbst
   gezeichnete Zeichen sehen selbst gezeichnet aus. Text mit ordentlichem
   Abstand liest sich besser als zehn schiefe Piktogramme. */

.module{align-self:start;position:sticky;top:16px;
        display:flex;flex-direction:column;gap:1px;padding:6px 0 10px}

/* Gruppenüberschrift. Bei zehn Einträgen ist die Bündelung kein Zierrat —
   sie halbiert die Suchzeit, weil man erst den Bereich und dann den Eintrag
   sucht. */
/* --grau, nicht --grau-fein: gemessen kam das feine Grau im hellen Schema auf
   2,93:1 gegen den Seitengrund und im dunklen auf 3,97:1. Nötig sind 4,5:1
   (WCAG AA, kleiner Text). Mit --grau sind es 5,66:1 bzw. 7,19:1. */
.module .gruppe{font-size:10px;letter-spacing:.14em;text-transform:uppercase;
        font-weight:600;color:var(--grau);padding:14px 12px 6px}
.module .gruppe:first-child{padding-top:2px}

/* 12px oben und unten plus Zeilenhöhe ergibt 45px — knapp über der
   Vorgabe von 44px. Bei 11px waren es 43, gemessen. */
.module a{display:block;padding:12px;text-decoration:none;color:var(--grau);
        font-weight:500;border-radius:8px;line-height:1.3;
        border-left:3px solid transparent;
        transition:background-color .12s ease, color .12s ease}
.module a:hover{background:var(--grund-alt);color:var(--tinte)}
.module a:focus-visible{outline:2px solid var(--akzent-text);outline-offset:2px}

/* Der offene Eintrag trägt Farbe UND einen Balken. Farbe allein genügt nicht:
   wer sie nicht unterscheidet, sieht sonst zehn gleiche Zeilen. */
/* Der offene Eintrag trägt Tinte, nicht Messing. Messing auf der abgesetzten
   Fläche ergab im hellen Schema 4,02:1 — zu wenig für 16px fett. Den Akzent
   trägt jetzt der Balken links, und der muss keinen Text lesbar halten.
   Drei Merkmale bleiben: Balken, Fläche, Fettung. */
.module a[aria-current="page"]{color:var(--tinte);font-weight:600;
        background:var(--grund-alt);border-left-color:var(--messing);
        border-radius:0 8px 8px 0}

@media (prefers-reduced-motion:reduce){.module a{transition:none}}

/* Ab hier wird es eng: die Leiste fährt hinter den Klappknopf. Ein Handy im
   Heizungskeller hat keinen Platz für eine feste Spalte. */
@media (max-width: 1100px) {
  .kopf{padding:12px 0 8px}

  /* KEIN Umbruch mehr in der rechten Gruppe.
     Gemessen auf einem 375px-Gerät: Kennung 143 + Sprachwahl 58 + Schema 42
     + Abmelden 101 + drei Abstände = 371px bei 343px Platz. Es fehlten 28,
     also brach die Gruppe um — und die Kopfzeile war 161px hoch. Drei
     Zeilen, bevor überhaupt Inhalt kam; auf einem Handy im Heizungskeller
     ein Fünftel des Schirms für nichts.

     Statt an Breiten zu drehen, bis es bei 375px gerade passt und bei 360px
     wieder nicht: die Kennung bekommt den Rest. Sie ist das einzige Stück
     hier, das schrumpfen DARF — sie schneidet mit Auslassungspunkten ab und
     bleibt lesbar. Die Knöpfe daneben dürfen es nicht, die muss man mit
     Arbeitshandschuhen treffen. So passt es bei jeder Breite, ohne dass
     irgendwo eine Zahl steht, die zu einem bestimmten Gerät gehört. */
  .kopf-rechts{flex-wrap:nowrap}
  .wer{max-width:none;flex:1 1 auto}
  .kopf-rechts > *:not(.wer){flex-shrink:0}

  .kopf-titel, .kopf-strich{display:none}
  .wortmarke{height:40px}
  .menuknopf{display:grid;place-items:center}

  .module{position:absolute;left:0;right:0;z-index:150;flex-direction:column;
        background:var(--karte);border:1px solid var(--linie);
        border-top:none;padding:4px;gap:0;display:none;position:absolute;
        box-shadow:0 8px 24px rgba(0,0,0,.22)}
  body.menu-offen .module{display:flex}
  /* 15px hoch mal zwei plus Zeilenhöhe ergibt gut 46px Trefferfläche — die
     Vorgabe für ein Handy mit Handschuhen. */
  .module a{padding:15px 16px;border-radius:0;
        border-bottom:1px solid var(--linie-weich);
        border-left:3px solid transparent}
  .module a:last-child{border-bottom:none}
  .module a[aria-current="page"]{border-radius:0;
        border-bottom-color:var(--linie-weich);
        border-left-color:var(--messing);background:var(--grund-alt)}
  /* Im Klappmenü trennt die Gruppenüberschrift sichtbar, statt nur zu
     beschriften — hier stehen die Einträge dichter beieinander. */
  .module .gruppe{padding:12px 16px 6px;background:var(--grund-alt);
        border-bottom:1px solid var(--linie-weich)}
  .module .gruppe:first-child{padding-top:12px}
  body.menu-offen .menuknopf{background:var(--braun);color:var(--auf-akzent);
        border-color:var(--braun)}
}

/* --- Anmeldekarte ---------------------------------------------------------
   Vorbild war der Anmeldebildschirm eines anderen Betriebsportals: farbig
   hinterlegter Kopf mit Marke und Fassung, darunter die Felder, darunter ein
   ruhiger Fuss. Der Aufbau ist übernommen, die Farben nicht — die gehören
   dem anderen Haus. Hier steht das Braun der MH-Hausfarben.

   Nicht übernommen: "Passwort vergessen?" und "Zugang beantragen". Beide
   führen hier nirgendwohin — Zugänge legt das Büro an, ein Kennwort setzt es
   neu. Ein Verweis, der nichts tut, ist schlimmer als keiner. An ihre Stelle
   tritt der Satz, der die Frage tatsächlich beantwortet. */

.anmeldekarte{max-width:430px;margin:24px auto;background:var(--karte);
      border:1px solid var(--linie);border-radius:14px;overflow:hidden;
      padding:0;box-shadow:0 10px 34px rgba(38,33,28,.10)}

.anmeldekopf{display:flex;align-items:center;gap:14px;padding:20px 22px;
      border-bottom:1px solid var(--linie-weich)}
.anmeldemarke{height:38px;width:auto;flex-shrink:0}
.anmeldetitel{font-family:var(--schrift-kopf);font-size:19px;font-weight:600;
      line-height:1.2}
/* Weiss auf dem Hausbraun ergibt 4,77:1 — knapp ueber der Schwelle. Deshalb
   steht hier nirgends eine Deckkraft unter 1: schon 95 % fallen auf 4,49:1
   und damit durch. */
/* Die Fassung rutscht nach rechts und bleibt klein. Sie ist für den Anruf
   beim Büro da, nicht zum Lesen. */
/* Warmgrau ergibt auf hellem Grund nur 3,57:1 — zu wenig fuer 11px. Auf dem
   Kartengrund traegt --grau (5,66:1 hell, 7,19:1 dunkel). Die Farbe des
   Zeichens bleibt dem Zeichen. */
.anmeldefassung{margin-left:auto;align-self:flex-start;font-size:11px;
      letter-spacing:.04em;color:var(--grau)}

.anmeldeleib{display:grid;gap:14px;padding:22px}
.anmeldeleib button{width:100%;margin-top:2px}
/* Erscheint nur, wenn der Server unter der geratenen Adresse schweigt.
   Dann ist es kein Beiwerk mehr, sondern das Einzige, was hilft — deshalb
   in Warnfarbe und nicht als kleingedruckte Klappe. */
.anmeldewarnung{font-size:11.5px;color:var(--bernstein-text);margin-top:6px;
      line-height:1.4}
#serverbereich input{border-color:var(--bernstein)}

@media (max-width: 480px) {
  /* Auf dem Handy schluckt der abgerundete Rahmen Breite, die der Inhalt
     braucht. Die Karte legt sich dort über die volle Breite. */
  .anmeldekarte{margin:12px 0;border-radius:var(--rundung)}
  .anmeldekopf{padding:16px 18px;gap:11px}
  .anmeldeleib{padding-left:18px;padding-right:18px}
}

/* --- Bausteine ------------------------------------------------------------ */

/* GEMEINSAME BAUSTEINE, die vorher in jeder Modulseite noch einmal standen.
   Gemessen: `.leer` in 10 Seiten und 3 Fassungen, `.reiter` in 9 und 3,
   `.schleier` und `.eintrag` je dreimal WORTGLEICH kopiert. Dieselbe Reihe
   wie bei `alsDatum` (8 Fassungen) und dem Escaper (16 Definitionen) — nur
   fällt es hier nicht auf, weil ein leicht anderer Innenabstand immer noch
   wie Gestaltung aussieht. */

/* Der Leerzustand. Grundform: eine stille Zeile INNERHALB einer Karte.
   `.frei` ist die freistehende Fassung, die selbst eine Karte bildet — sie
   ersetzt eine Liste, statt in ihr zu stehen. Der Unterschied ist echt und
   heißt deshalb jetzt so; 22px gegen 24px Innenabstand war es nicht. */
.leer{padding:14px;color:var(--grau);font-size:14px}
.leer.frei{padding:24px 18px;background:var(--karte);
      border:1px solid var(--linie);border-radius:var(--rundung);
      font-size:inherit;line-height:1.55}

/* Reiterleiste. Die drei Fassungen unterschieden sich in `gap` (4 gegen 2)
   und `margin-top` (10 gegen 4) — Zahlen, die niemand entschieden hat.
   `-webkit-overflow-scrolling` stand nur auf einer Seite und gehört auf
   alle: die Leiste rollt am Handy waagerecht. */
.reiter{display:flex;gap:4px;border-bottom:1px solid var(--linie);
      margin-top:10px;overflow-x:auto;-webkit-overflow-scrolling:touch}

/* Ein anklickbarer Listeneintrag — dreimal wortgleich kopiert.
   `font-weight:400` und `color:var(--tinte)` sind kein Feinschliff: das ist
   oft ein <button> oder <label>, und ohne die beiden erbt er die
   Beschriftungsgestaltung (11px, Versalien, gesperrt, grau) — dann stehen
   Kundennamen in Großbuchstaben da. */
.eintrag{display:block;width:100%;text-align:left;background:none;border:none;
      border-bottom:1px solid var(--linie-weich);border-left:3px solid transparent;
      border-radius:0;color:var(--tinte);font:inherit;font-weight:400;
      padding:11px 13px;min-height:56px;cursor:pointer}

/* Formularraster. Sieben Seiten, sechs Fassungen — sie unterschieden sich
   in `gap` (11/12/14) und der Mindestspaltenbreite (160 bis 230). Der
   Abstand war Zufall, die Spaltenbreite NICHT: ein Formular aus Datums-
   feldern verträgt schmalere Spalten als eines aus Anschriften. Die
   Grundform steht hier, die Abweichung bleibt in der Seite — dann sieht man
   dort auch, dass sie eine ist. */
.felder{display:grid;gap:12px;
      grid-template-columns:repeat(auto-fit,minmax(190px,1fr))}

/* Knopfleiste unter einem Formular. Vier Fassungen, in der Sache identisch
   — sie unterschieden sich allein im Randabstand nach oben. */
.knoepfe{display:flex;gap:8px;flex-wrap:wrap;margin-top:14px}

/* Der Schleier hinter einem Blatt — dreimal wortgleich kopiert. */
.schleier{position:fixed;inset:0;background:var(--schleier);z-index:200}

.karte{background:var(--karte);border:1px solid var(--linie);padding:16px;margin:16px 0}
.zeile{display:flex;gap:12px;align-items:center}
/* `min-width:0` ist hier kein Feinschliff, sondern behebt einen Fehler, der
   erst mit echten Daten auftritt.
   Ein Flex-Kind hat von sich aus `min-width:auto` und schrumpft deshalb NIE
   unter seinen Inhalt. Ein `<select>` bemisst sich an seiner längsten Option
   — "A-2026-100 · Hausverwaltung Schneider · Heizungserneuerung Bestandsbau"
   sind 367px. Auf einem 375px-Handy schob es die ganze Seite auf 494px, und
   der Benutzer musste seitwärts wischen, um den Knopf daneben zu erreichen.
   Gemessen mit Probeaufträgen, nicht mit den kurzen Bezeichnungen, mit denen
   sich so etwas beim Schreiben von selbst versteckt.
   Mit `min-width:0` schrumpft das Feld und schneidet ab. Abgeschnitten ist
   unschön; seitwärts scrollen ist unbedienbar. */
.zeile > *{min-width:0}
.raster{display:grid;gap:16px;grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}

label{display:block;font-size:11px;letter-spacing:.1em;text-transform:uppercase;
      color:var(--grau);font-weight:600;margin-bottom:4px}

/* Die Überschrift eines Abschnitts INNERHALB einer Seite — "Termine an
   diesem Tag", "Aufträge ohne Termin". Sieht aus wie eine Formularbe-
   schriftung, weil sie dasselbe tut: benennen, ohne sich vorzudrängen.

   Stand bis hierher in vier Seiten wortgleich und in einer fünften gar
   nicht: `stammdaten.html` benutzte die Klasse, ohne sie zu definieren,
   und zeigte ihre Absatzköpfe deshalb unformatiert. Genau dafür gibt es
   eine gemeinsame Datei. */
.absatzkopf{font-size:11px;letter-spacing:.1em;text-transform:uppercase;
      color:var(--grau);font-weight:600;margin:20px 0 8px}
/* 12px STATT 11px SENKRECHT. Gemessen kam ein Eingabefeld damit auf 43 px
   und lag portalweit einen Pixel unter dem Mass, das dieses Projekt an
   mindestens sechs Stellen festhaelt. Jetzt 45. */
input,select,textarea{width:100%;padding:12px 11px;border:1px solid var(--linie);
      background:var(--karte);color:var(--tinte);font:inherit;border-radius:var(--rundung)}
input:focus,select:focus,textarea:focus,button:focus-visible{
      outline:2px solid var(--akzent-text);outline-offset:1px}
::placeholder{color:var(--grau)}
/* Häkchen und Auswahlknöpfe zeichnet der Browser selbst — ohne das hier in
   seinem eigenen Blau, mitten in einer sandfarbenen Oberfläche. */
input[type=checkbox],input[type=radio]{accent-color:var(--braun);width:auto;
      min-height:0;transform:scale(1.15);margin-right:2px}

button{font:inherit;font-weight:500;padding:11px 17px;border:none;border-radius:var(--rundung);
       background:var(--braun);color:var(--auf-akzent);cursor:pointer;min-height:46px}
button.leise{background:var(--karte);color:var(--akzent-text);border:1px solid var(--linie)}
button.gruen{background:var(--gruen);color:var(--auf-akzent)}
button:disabled{background:var(--grau-fein);color:var(--karte);cursor:not-allowed}
/* Ein Verweis, der wie ein Knopf aussieht — weil er sich wie einer verhält:
   er führt an genau eine Stelle. Ein <button>, der `location.href` setzt,
   wäre dasselbe ohne Mittelklick, ohne "in neuem Tab öffnen" und ohne die
   Statuszeile, die das Ziel verrät. */
.knopf-verweis{display:inline-flex;align-items:center;justify-content:center;
     min-height:46px;padding:11px 17px;border-radius:var(--rundung);font-weight:500;
     text-decoration:none;background:var(--braun);color:var(--auf-akzent)}
.knopf-verweis:hover{filter:brightness(1.06)}
.knopf-verweis:active{transform:translateY(1px)}
@media (prefers-reduced-motion:reduce){.knopf-verweis:active{transform:none}}

button.schema{width:42px;height:42px;min-height:0;padding:0;font-size:18px;
       background:var(--grund-alt);color:var(--grau);border:1px solid var(--linie)}

table{width:100%;border-collapse:collapse;font-size:15px}
th{text-align:left;font-size:10px;letter-spacing:.1em;text-transform:uppercase;
   color:var(--grau);border-bottom:1px solid var(--linie);padding:6px 7px}
td{padding:8px 7px;border-bottom:1px solid var(--linie-weich)}
.zahl{text-align:right;font-variant-numeric:tabular-nums}
.mono{font-family:var(--schrift-mono);font-variant-numeric:tabular-nums}

.kennung{display:inline-block;font-size:11px;padding:2px 7px;
         background:var(--grund-alt);color:var(--akzent-text);border-radius:var(--rundung)}
/* Umrandete Marke für Zustände (Auftragsstatus, angemeldeter Benutzer).
   Farbe kommt von der Fundstelle, damit sie den Zustand mitträgt. */
.marke-status{display:inline-block;font-size:10px;letter-spacing:.13em;
         text-transform:uppercase;font-weight:600;padding:5px 10px;
         border:1px solid currentColor;white-space:nowrap}

/* Das Schliesskreuz an einer Fehlermeldung. Sie bleibt stehen, bis jemand
   sie wegklickt — ein Hinweis darf von selbst gehen, ein Fehler nicht. */
.meldung-zu{background:none;border:none;color:inherit;cursor:pointer;
      font-size:15px;line-height:1;padding:0;margin-left:10px;
      min-width:44px;min-height:44px;opacity:.7}
.meldung-zu:hover{opacity:1}

.meldung{padding:11px 13px;margin:12px 0;border:1px solid var(--messing);
         background:var(--grund-alt);font-size:15px}
.meldung.fehler{border-color:var(--kupfer)}
.meldung.gut{border-color:var(--gruen)}
/* Weder Fehler noch Erfolg: "es ist etwas anderes passiert, als du erwartet
   hast". Der Versand ohne Mailserver ist genau das — er ist gelungen, aber
   die Mail ist nicht rausgegangen, sondern liegt zum Kopieren bereit. Ohne
   eigene Kennzeichnung sah das aus wie eine beliebige Notiz.
   Keine neue Farbe: --bernstein steht schon fuer Hinweise im Portal. */
.meldung.warnung{border-color:var(--bernstein)}

/* Impressum und Datenschutz am Fuß der Anmeldekarte. Klein und grau: eine
   Pflichtangabe, kein Bedienelement — wer sich anmelden will, soll nicht
   darüber stolpern. Trefferfläche trotzdem 44px hoch, das gilt auch für
   selten Gebrauchtes am Handy. */
.anmelderecht{padding:12px 0 2px;text-align:center;border-top:1px solid var(--linie-weich)}
.anmelderecht a{display:inline-block;min-height:44px;line-height:44px;
      padding:0 12px;font-size:13px;color:var(--grau)}
.anmelderecht a:hover{color:var(--tinte)}

.befund{border-left:3px solid var(--kupfer);background:var(--grund-alt);
        padding:9px 12px;margin-top:8px;font-size:14px}
.befund.hinweis{border-left-color:var(--bernstein)}

.variante{border:1px solid var(--linie);border-left:3px solid var(--linie);
          padding:12px 14px;margin-bottom:10px;background:var(--karte)}
.variante.v1{border-left-color:var(--grau)}
.variante.v2{border-left-color:var(--messing)}
.variante.v3{border-left-color:var(--kupfer)}

.verborgen{display:none}
.fuss{margin-top:30px;padding-top:12px;border-top:1px solid var(--linie);
      font-size:12px;color:var(--grau)}

@media (prefers-reduced-motion:reduce){*{transition:none!important}}

.sprachwahl{width:auto;min-width:58px;padding:8px 6px;font-size:12px;
       font-weight:600;letter-spacing:.06em;background:var(--grund-alt);
       color:var(--grau);border:1px solid var(--linie);cursor:pointer}

/* --- Trefferflächen in Kopf- und Fußzeile --------------------------------
   Am Schreibtisch darf die Kopfzeile flach sein — dort zeigt eine Maus auf
   den Pixel genau. Am Handy nicht: das Zielgerät wird mit Arbeitshandschuhen
   bedient, und das Projekt hält an mehreren Stellen 44px als Maß fest.

   Gemessen wurde: Abmelden 34px, Sprachwahl 35px, "Auf allen Geräten
   abmelden" 15px. Die Regel galt für die Modulliste und für die großen
   Knöpfe, nur nicht für die Kopfzeile — dort stand die Größe in einem
   style-Attribut und war damit für jede Medienabfrage unerreichbar. */
#abmelden{min-height:0;padding:7px 12px}

@media (max-width: 1100px) {
  #abmelden{min-height:44px;padding:9px 14px}
  .sprachwahl{min-height:44px}
  button.schema{width:44px;height:44px}
  /* Ein Textverweis in der Fußzeile ist von sich aus so hoch wie seine
     Zeile — 15px. Das trifft niemand mit Handschuhen. */
  .fuss a{display:inline-block;padding:12px 0;min-height:44px}
}

/* ===========================================================================
   DIE ANWENDUNGSSCHALE — ganz am Ende, und das ist der Punkt
   ===========================================================================

   EINE MEDIENABFRAGE ERHÖHT DIE SPEZIFITÄT NICHT. Dieser Block stand zuerst
   oben bei den Gerüstregeln, dort wo er thematisch hingehört — und die
   Hälfte davon wirkte nicht: `.kopf` und `.module` werden weiter unten in
   der Datei erneut gesetzt, gleiche Spezifität, und dann gewinnt die spätere
   Regel. Gemessen: die Randlinie der Leiste kam an, `position:static` nicht.

   Dieselbe Falle steht in CLAUDE.md schon für `display` in den Modulseiten.
   Sie sieht hier nur anders aus, weil man einer Medienabfrage ansieht, dass
   sie etwas Besonderes ist — und ihr deshalb zutraut, sich durchzusetzen.
   =========================================================================== */
@media (min-width: 1101px) {
  /* GEBUNDEN AN `.inhalt`, und das ist der Punkt.
     `.inhalt` entsteht ausschliesslich in portal.js. Wo die Schale laeuft,
     gibt es den Kasten; wo nicht, nicht.

     Der Unterschied ist nicht theoretisch: `einladung.html` bindet portal.js
     bewusst NICHT ein (die Schale braechte dort einen Anmeldebildschirm mit),
     hat aber eine eigene `.huelle` UND eine eigene `.kopf`. An der Kopfzeile
     laesst sie sich also nicht unterscheiden. Ungebunden bekam sie das
     Cockpitraster: gemessen 224px Geisterspalte neben 296px Formular, dazu
     `overflow:hidden` — bei der Zweitfaktor-Einrichtung waere das Geheimnis
     unerreichbar unter dem Fensterrand gelandet. */
  html:has(.inhalt), body:has(.inhalt){height:100%;overflow:hidden}
  /* 248px und nicht 224: gemessen braucht der breiteste Modulname Platz für
     173px Schrift, und das ist NICHT der deutsche. "Коды неисправностей"
     ist länger als "Aufnahme & Angebot" (159px) und als "Document cockpit"
     (136px). Wer nur auf Deutsch nachsieht, kappt Russisch.
     Dass die Spalte damit breiter ist, kostet nichts mehr — sie lässt sich
     jetzt einklappen. */
  .huelle:has(> .inhalt){max-width:none;height:100dvh;display:grid;
          column-gap:0;padding:0;
          grid-template-columns:248px minmax(0, 1fr);
          grid-template-rows:auto minmax(0, 1fr)}
  .huelle:has(> .inhalt) > .kopf{grid-column:1 / -1}
  /* Die Leiste greift über ALLE Inhaltszeilen. Ohne das Übergreifen macht sie
     die zweite Zeile so hoch wie sich selbst, und der Inhalt beginnt erst
     unterhalb des letzten Menüpunkts — rechts oben klaffte eine leere Fläche
     von rund 360px. Gemessen, nicht vermutet. */
  /* Die Leiste steht fest und scrollt für sich, falls einmal mehr Module
     hineinpassen als Höhe da ist. */
  /* `position:sticky` und `align-self:start` aus der Grundregel sind hier
     hinderlich: in einer festen Schale klebt nichts, es STEHT. */
  .module{grid-column:1;grid-row:2;position:static;align-self:stretch;
          overflow-y:auto;min-height:0;
          border-right:1px solid var(--linie);padding:10px 10px 16px}
  /* Der eine scrollende Kasten. `min-height:0` ist nicht schmückend: ohne das
     wächst ein Grid-Element auf seinen Inhalt statt sich zu begrenzen, und
     dann scrollt wieder die ganze Seite. */
  .inhalt{grid-column:2;grid-row:2;overflow-y:auto;min-height:0;
          padding:16px 24px calc(24px + env(safe-area-inset-bottom));
          scrollbar-gutter:stable}
  /* Ohne Anmeldung ist die Leiste verborgen — dann soll die Spalte nicht als
     leerer Streifen stehen bleiben, und der Anmeldekasten steht wieder
     mittig statt am linken Rand einer Cockpitfläche. */
  .huelle:has(.module.verborgen){grid-template-columns:minmax(0, 1fr)}
  .huelle:has(.module.verborgen) > *{grid-column:1}
  .huelle:has(.module.verborgen) .inhalt{max-width:1180px;margin:0 auto;
          width:100%}

  /* Die Kopfzeile ist jetzt eine Werkzeugleiste, keine Seitenüberschrift:
     flacher, mit eigener Randlinie, und sie umbricht nicht mehr. Vorher
     16px oben und 12px unten plus 46px Marke ergaben 74px — bei 900px
     Bildschirmhöhe ist das ein Zwölftel der Fläche für nichts. */
  .huelle:has(> .inhalt) > .kopf{padding:8px 20px 8px 12px;
        border-bottom:1px solid var(--linie);flex-wrap:nowrap}
  .huelle:has(> .inhalt) .wortmarke{height:34px}
  .kopf-titel{font-size:16px}

  /* Die Fußzeile schließt den Inhalt ab und steht nicht mehr am Seitenende
     im Nirgendwo. */
  .fuss{margin-top:24px}
}


/* --- Schnellwahl (Strg+K) -------------------------------------------------
   Sie liegt über allem, deshalb der einzige hohe z-index im Portal. Nicht
   mittig, sondern im oberen Drittel: das Auge sucht dort, und darunter
   bleibt die Liste sichtbar, ohne dass der Kasten springt, wenn sie kürzer
   wird. */
.palette{position:fixed;inset:0;z-index:900;background:var(--schleier);
      display:flex;justify-content:center;align-items:flex-start;
      padding:12vh 16px 16px}
.palettenkasten{width:100%;max-width:520px;background:var(--karte);
      border:1px solid var(--linie);border-radius:var(--rundung);
      box-shadow:0 24px 60px rgba(0,0,0,.28);overflow:hidden}
.palettenkasten input{border:none;border-bottom:1px solid var(--linie);
      border-radius:0;font-size:17px;padding:15px 16px}
/* HIER STAND `outline:none` MIT --linie ALS ERSATZ — und das ist die Farbe
   des UNGEFOKUSSIERTEN Zustands, also gar kein Ersatz. Das Suchfeld ist das
   einzige Bedienelement der Schnellwahl; wer sie mit Strg+K oeffnet, muss
   sehen, dass er tippen kann. Der Rahmen bleibt weg (er wuerde den Kasten
   sprengen), stattdessen die Unterkante in der Akzentfarbe. */
.palettenkasten input:focus{outline:none;
      border-bottom:2px solid var(--akzent-text);padding-bottom:14px}
#palettenliste{max-height:52vh;overflow-y:auto}
.palettenzeile{display:flex;align-items:center;justify-content:space-between;
      gap:12px;padding:11px 16px;min-height:46px;text-decoration:none;
      color:var(--tinte);font-weight:500}
/* Die Auswahl trägt eine Fläche, keine Schriftfarbe: Gold als Text ist auf
   dem hellen Kartengrund 2,16:1 (siehe Kopf dieser Datei). */
.palettenzeile.gewaehlt{background:var(--messing);color:var(--auf-akzent)}
.palettenzeile.gewaehlt .palettengruppe{color:var(--auf-akzent);opacity:.75}
.palettengruppe{font-size:11px;letter-spacing:.1em;text-transform:uppercase;
      color:var(--grau);font-weight:600;white-space:nowrap}
.palettenleer{padding:16px;color:var(--grau);font-size:14px}

/* Der Hinweis in der Kopfzeile. Eine Tastenkombination, die niemand kennt,
   gibt es nicht — deshalb steht sie da, wo man sie sieht. Unter 1100px
   verschwindet sie: an einem Handy gibt es kein Strg. */
.tastenhinweis{display:none}
@media (min-width: 1101px){
  /* `background:none` ist hier Pflicht und nicht Geschmack: die Grundregel
     fuer `button` setzt die Messingflaeche, und grauer Text darauf ergibt
     1,4:1 — der Knopf stand als leerer Kasten in der Kopfzeile. Gemessen,
     nachdem er ausgeliefert aussah wie ein Darstellungsfehler. */
  .tastenhinweis{display:inline-flex;align-items:center;gap:5px;
      background:none;min-height:0;
      font-family:var(--schrift-mono);font-size:11px;color:var(--grau);
      border:1px solid var(--linie);border-radius:var(--rundung);
      padding:5px 9px;white-space:nowrap}
  .tastenhinweis:hover{color:var(--tinte);border-color:var(--grau-fein)}
}

/* --- Sinnbilder und einklappbare Leiste -----------------------------------

   Die Zeichen stehen in web/zeichen.js: 24×24, Strichstärke 1.75, keine
   Füllung, `currentColor`. Warum es sie überhaupt gibt, steht dort im Kopf.
   Hier stehen nur ihre Maße. */
.zeichen{width:19px;height:19px;flex-shrink:0;opacity:.72}
.module a{display:flex;align-items:center;gap:11px}
.module a[aria-current="page"] .zeichen{opacity:1}
.module a:hover .zeichen{opacity:.95}
.modulwort{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* Der Klappknopf. Ein Zeichen und kein Wort: neben Marke, Rolle, Sprache
   und Schema ist in der Kopfzeile kein Platz für einen Satz. */
.leisteknopf{display:none;width:32px;height:32px;min-height:0;padding:0;
      background:none;border:1px solid var(--linie);border-radius:var(--rundung);
      color:var(--grau);font-size:15px;line-height:1;flex-shrink:0}
.leisteknopf:hover{color:var(--tinte);border-color:var(--grau-fein)}

@media (min-width: 1101px){
  .leisteknopf:not(.verborgen){display:inline-flex;align-items:center;
      justify-content:center}

  /* EINGEKLAPPT: nur noch die Zeichen. 56px statt 224px — das ist die
     Breite, bei der ein 19px-Zeichen mittig steht und die Trefferfläche
     noch 44px hoch bleibt.

     Der Name wird ausgeblendet und nicht entfernt: er trägt den Tooltip,
     und nach einem Sprachwechsel müsste er sonst neu geschrieben werden. */
  :root[data-leiste-zu] .huelle:has(> .inhalt){grid-template-columns:56px minmax(0,1fr)}
  :root[data-leiste-zu] .module{padding:10px 6px 16px}
  /* 13px oben und unten, nicht 12: eingeklappt fehlt die Zeilenhöhe des
     Namens, und die Trefferfläche kam auf 43px — einen Pixel unter dem
     Maß, das im Portal überall gilt. Gemessen, nicht überschlagen. */
  :root[data-leiste-zu] .module a{justify-content:center;gap:0;
      padding:13px 0;min-height:44px}
  :root[data-leiste-zu] .modulwort{display:none}
  /* Die Gruppenüberschriften verschwinden mit. "AUFTRÄGE" auf 56px wäre
     abgeschnitten, und abgeschnittene Versalien liest niemand. Eine
     Haarlinie trennt die Gruppen stattdessen. */
  :root[data-leiste-zu] .module .gruppe{height:0;overflow:hidden;padding:0;
      margin:7px 8px;border-top:1px solid var(--linie)}
  :root[data-leiste-zu] .module .gruppe:first-child{border-top:none;margin-top:0}
  .module a, .huelle:has(> .inhalt){transition:grid-template-columns .16s ease}
}
@media (prefers-reduced-motion:reduce){
  .huelle:has(> .inhalt){transition:none}
}

/* Die Fassung in der Kopfzeile. Leise: man sucht sie selten, aber dann
   sofort. Unter 1101px weg — dort ist die Zeile ohnehin knapp, und wer am
   Handy anruft, kann sie im Anmeldebildschirm nachsehen. */
.kopffassung{display:none}
@media (min-width: 1101px){
  .kopffassung:not(.verborgen){display:inline;font-family:var(--schrift-mono);
      font-size:11px;color:var(--grau);white-space:nowrap}
}

/* Die Zugangskarte tritt zurueck, solange es nichts zu tun gibt.
   Kein Rahmen, keine Ueberschrift — nur der Knopf, der wie ein Verweis
   aussieht. Begruendung in web/seiten/start.js ueber `zeichneZugang`. */
.karte.zurueckhaltend{border:none;background:none;padding:0;margin-top:26px}
.karte.zurueckhaltend > .absatzkopf{display:none}
.karte.zurueckhaltend #zf_start{padding:0;border:none;background:none;
      color:var(--grau);font-size:13px;text-decoration:underline}

/* Die Forderungsmarke. Kupfer wie die Fristwarnungen — es geht um Geld, das
   nicht gekommen ist, und das ist ein Hinweis und kein Fehler. */
.marke.m-forderung{background:var(--kupfer);color:var(--papier)}

/* Ein Knopf, der in einer Textzeile mitlaeuft — Verlauf, Fristen aendern.
   Er darf die Zeilenhoehe nicht sprengen, sonst springt die Liste. */
button.leise.klein{padding:2px 8px;font-size:12px;min-height:0}
