/* ==========================================================================
   glass.css — Liquid-Glass-Schicht fuer das Handbuch (public/dom.html)
   --------------------------------------------------------------------------
   Uebernommen aus _uebergabe/design_handoff_handbuch_liquid_glass/
   code/glass-styles.js — inhaltlich unveraendert, nur aus dem JS-String
   in eine echte CSS-Datei geholt. Grund: CSS als JavaScript-String hat uns
   im August zweimal das Handbuch zerlegt (Backtick im Kommentar,
   Anfuehrungszeichen im Selektor). Als .css kann diese Fehlerklasse nicht
   mehr auftreten. Das README erlaubt diesen Weg ausdruecklich.

   Enthaelt NUR Neues: Klassen mit Praefix .g- und Variablen mit --g-.
   Bestehende Klassen (.task .kpi .cl .dnav) und Variablen (--cd --bd …)
   werden nicht angefasst; alt und neu koennen nebeneinander laufen.

   Material nachgezogen am 13.09.2026 (Uebergabe, zweite Fassung): die
   Flaechen sind duenner (.41/.46/.60 statt .55/.62/.74), blur 28/20/34,
   saturate 205 %, und JEDE Glasflaeche traegt eine Haarlinien-Kante
   0 0 0 .5px rgba(22,45,66,.14) plus den Lichtsaum oben. Ohne die Kante
   franst eine duenne Flaeche aus; das README verbietet zwar echte Raender, die
   Kante ist keiner, sondern der erste Schatten.

   Die Farbkreise sind die andere Haelfte: ohne sie ist eine Glasflaeche
   weiss auf weiss und der Effekt faellt aus. Sie stehen seit dem
   13.09.2026 am <html> (dom.html, oben im Stilblock) und gelten damit fuer
   ALLE 58 Ansichten, nicht nur die sechs mit .g-app. Kraeftiger als
   vorher — aber NICHT auf den Werten der Uebergabe: nachgerechnet gegen
   die duennste Glasschicht ist bei Blau bei .37 Schluss. Mit dem
   Uebergabewert .50 faellt --g-blau auf 4,30 und --g-gruen-ink auf 4,14,
   beide unter 4,5. Blau steht deshalb auf .36.

   Gerechnet gegen die unguenstigste Flaeche (.40 ueber Blaukreis .36 =
   rgb(194,221,250)): --g-ink 12,07 · --g-ink-2 5,47 · --g-ink-3 4,62 ·
   --g-blau 4,69 · --g-gruen-ink 4,52 · --g-orange-ink 5,36 ·
   --g-rot-ink 5,09 — alle ueber Ziel. Der Pruefstand rechnet es nach, und
   zwar mit den Werten AUS DIESEN DATEIEN, nicht mit abgeschriebenen.
   ========================================================================== */

:root { --g-bg:#e9edf2;--g-ink:#1d1d1f;--g-ink-2:#4f545b;--g-ink-3:#5a5f66;--g-ink-4:rgba(29,29,31,.28);--g-line:rgba(29,29,31,.06);--g-blau:#005bbb;--g-blau-flaeche:linear-gradient(145deg,#3d9bff,#0057c8);--g-held:linear-gradient(145deg,#0057c8,#00347a);--g-gruen:#34c759;--g-gruen-ink:#16582a;--g-gruen-fl:rgba(52,199,89,.18);--g-orange:#ff9f0a;--g-orange-ink:#6b4104;--g-orange-fl:rgba(255,159,10,.18);--g-rot:#ff453a;--g-rot-ink:#842119;--g-rot-fl:rgba(255,69,58,.16);--g-neutral:rgba(29,29,31,.14);--g-matrix-fl:#f1f4f8;--g-feder:cubic-bezier(.34,1.56,.64,1); }
.g-app,.g-app *,.g-app *::before,.g-app *::after { box-sizing:border-box }
.g-app { position:relative;overflow:hidden;background:transparent;color:var(--g-ink);font-family:-apple-system,BlinkMacSystemFont,"SF Pro Display","SF Pro Text",system-ui,sans-serif;-webkit-font-smoothing:antialiased;font-size:17px }
.g-app { min-height:100vh }
.g-blob { position:fixed;border-radius:50%;pointer-events:none;filter:blur(46px);z-index:0 }
.g-blob--blau { background:radial-gradient(circle,rgba(10,132,255,.36),transparent 66%) }
.g-blob--tuerkis { background:radial-gradient(circle,rgba(92,200,220,.47),transparent 66%) }
.g-blob--pfirsich { background:radial-gradient(circle,rgba(255,176,120,.30),transparent 66%) }
.g-blob--violett { background:radial-gradient(circle,rgba(175,140,240,.43),transparent 66%) }
.g-blob--gruen { background:radial-gradient(circle,rgba(52,199,89,.43),transparent 66%) }
.g-blob--orange { background:radial-gradient(circle,rgba(255,159,10,.38),transparent 66%) }
.g-glas1 { background:rgba(255,255,255,.41);-webkit-backdrop-filter:blur(28px) saturate(205%);backdrop-filter:blur(28px) saturate(205%);box-shadow:0 0 0 .5px rgba(22,45,66,.14),0 1px 0 rgba(255,255,255,.85) inset,0 14px 36px rgba(20,40,60,.12) }
.g-glas2 { background:rgba(255,255,255,.46);-webkit-backdrop-filter:blur(20px) saturate(205%);backdrop-filter:blur(20px) saturate(205%);box-shadow:0 0 0 .5px rgba(22,45,66,.14),0 1px 0 rgba(255,255,255,.9) inset,0 8px 22px rgba(20,40,60,.09) }
.g-glas3 { background:rgba(255,255,255,.60);-webkit-backdrop-filter:blur(34px) saturate(205%);backdrop-filter:blur(34px) saturate(205%);box-shadow:0 0 0 .5px rgba(22,45,66,.14),0 1px 0 rgba(255,255,255,.98) inset,0 32px 70px rgba(10,22,36,.34) }
.g-glas-matt { background:rgba(255,255,255,.40);-webkit-backdrop-filter:blur(20px);backdrop-filter:blur(20px);box-shadow:0 0 0 .5px rgba(22,45,66,.14),0 1px 0 rgba(255,255,255,.8) inset }
@supports not ((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))) {
  .g-glas1,.g-glas2,.g-glas3,.g-glas-matt { background:rgba(255,255,255,.92) }
  .g-blob { display:none }
}
.g-t-large { font-size:34px;font-weight:700;letter-spacing:-.024em;line-height:1.1;margin:0 }
.g-t1 { font-size:28px;font-weight:700;letter-spacing:-.022em;line-height:1.12;margin:0 }
.g-t3 { font-size:22px;font-weight:600;letter-spacing:-.02em;line-height:1.2;margin:0 }
.g-body { font-size:17px;line-height:1.5;margin:0 }
.g-body-6 { font-size:17px;font-weight:600;letter-spacing:-.01em;line-height:1.3;margin:0 }
.g-fuss { font-size:13px;line-height:1.45;color:var(--g-ink-2);margin:0 }
.g-caption { font-size:11px;font-weight:600;letter-spacing:.09em;text-transform:uppercase;color:var(--g-ink-3);margin:0 }
.g-zahl { font-variant-numeric:tabular-nums }
.g-karte { border-radius:24px;padding:17px 19px;display:flex;align-items:center;gap:16px }
.g-karte--still { background:rgba(255,255,255,.40);box-shadow:0 0 0 .5px rgba(22,45,66,.14),0 1px 0 rgba(255,255,255,.8) inset }
.g-block { border-radius:26px;padding:22px 24px }
.g-flaeche { border-radius:30px;padding:24px 26px }
.g-wachsen { flex:1;min-width:0 }
.g-marke { width:40px;height:40px;border-radius:999px;display:flex;align-items:center;justify-content:center;flex:0 0 auto }
.g-marke--kachel { border-radius:14px }
.g-marke--gruen { background:var(--g-gruen-fl);color:var(--g-gruen-ink) }
.g-marke--orange { background:var(--g-orange-fl);color:var(--g-orange-ink) }
.g-marke--rot { background:var(--g-rot-fl);color:var(--g-rot-ink) }
.g-marke--blau { background:rgba(10,132,255,.16);color:var(--g-blau) }
/* Die unbunte Marke: eine abgesagte Reservierung. Kein Zustand, der ruft. */
.g-marke--still { background:rgba(29,29,31,.07);color:#44484d }
.g-pille { display:inline-flex;align-items:center;gap:10px;padding:13px 20px;border-radius:999px;font-size:15px;font-weight:600;border:0;cursor:pointer;color:var(--g-ink);font-family:inherit;transition:transform .5s var(--g-feder) }
.g-pille:active { transform:scale(.95) }
.g-chip { display:inline-flex;align-items:center;padding:6px 13px;border-radius:999px;font-size:13px;font-weight:600 }
.g-chip--gruen { background:var(--g-gruen-fl);color:var(--g-gruen-ink) }
.g-chip--orange { background:var(--g-orange-fl);color:var(--g-orange-ink) }
.g-chip--rot { background:var(--g-rot-fl);color:var(--g-rot-ink) }
/* Der unbunte Chip: "Optional", "Gesperrt". Er sagt einen Zustand, aber
   keinen, der ruft. Farbe heisst in diesem Handbuch "hier liegt etwas an" —
   Freiwilliges und Gesperrtes liegt gerade nicht an. */
.g-chip--still { background:rgba(29,29,31,.07);color:#44484d }
.g-knopf { display:inline-flex;align-items:center;justify-content:center;gap:11px;padding:16px 26px;border-radius:26px;font-size:17px;font-weight:600;font-family:inherit;border:0;cursor:pointer;color:#fff;background:var(--g-blau-flaeche);box-shadow:0 14px 32px rgba(0,87,200,.32),0 1px 0 rgba(255,255,255,.4) inset;transition:transform .5s var(--g-feder) }
.g-knopf:active { transform:scale(.96) }
.g-knopf--gruen { background:linear-gradient(145deg,#3ddc6b,#209044);box-shadow:0 14px 32px rgba(32,144,68,.34),0 1px 0 rgba(255,255,255,.4) inset }
.g-knopf--glas { color:var(--g-ink-2);background:rgba(255,255,255,.72);box-shadow:0 0 0 .5px rgba(22,45,66,.14),0 1px 0 rgba(255,255,255,.95) inset,0 6px 16px rgba(20,40,60,.08) }
.g-knopf--warn { color:var(--g-orange-ink);background:rgba(255,255,255,.72);box-shadow:0 0 0 .5px rgba(22,45,66,.14),0 1px 0 rgba(255,255,255,.95) inset,0 6px 16px rgba(20,40,60,.08) }
.g-knopf[disabled] { color:#6b7077;background:rgba(255,255,255,.5);-webkit-backdrop-filter:blur(20px);backdrop-filter:blur(20px);box-shadow:0 0 0 .5px rgba(22,45,66,.14),0 1px 0 rgba(255,255,255,.8) inset;cursor:default }
.g-knopf[disabled]:active { transform:none }
.g-knopf--gross { min-height:60px;font-size:17px;padding:0 28px;flex:0 0 auto }
/* Ein kleiner Knopf. Vier davon stehen unter einer Reservierung; in der
   grossen Form waere die Zeile hoeher als ihr Inhalt. */
.g-knopf--klein { padding:9px 15px;border-radius:999px;font-size:13.5px;gap:7px;box-shadow:0 0 0 .5px rgba(22,45,66,.14),0 1px 0 rgba(255,255,255,.9) inset }
/* „Absagen" und „Nicht erschienen": nicht rot, aber auch nicht gleich laut
   wie „Bestaetigen". Rot waere eine Warnung — es ist aber eine normale
   Handlung, nur eine, die etwas wegnimmt. */
.g-knopf--zurueckhaltend { color:var(--g-ink-3);background:rgba(255,255,255,.42) }
.g-balken { height:8px;border-radius:999px;background:rgba(29,29,31,.09);overflow:hidden }
.g-balken > i { display:block;height:100%;border-radius:999px;background:linear-gradient(90deg,#34c759,#248a3d);transition:width .6s cubic-bezier(.34,1.4,.64,1) }
.g-balken--auf-farbe { background:rgba(255,255,255,.28) }
.g-balken--auf-farbe > i { background:#fff }
.g-punkt { width:13px;height:13px;border-radius:999px;display:inline-block }
.g-punkt--gruen { background:var(--g-gruen);box-shadow:0 2px 6px rgba(20,40,60,.18) }
.g-punkt--orange { background:var(--g-orange);box-shadow:0 2px 6px rgba(20,40,60,.18) }
.g-punkt--rot { background:var(--g-rot);box-shadow:0 2px 6px rgba(20,40,60,.18) }
.g-punkt--neutral { background:var(--g-neutral) }
.g-avatar { width:34px;height:34px;border-radius:999px;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:700;flex:0 0 auto;background:rgba(29,29,31,.07);color:#44484e }
.g-avatar--blau { background:linear-gradient(150deg,#9ad1ff,#4a8fe0);color:#fff }
/* ==========================================================================
   Die Heldflaeche — und warum sie blau bleibt.
   --------------------------------------------------------------------------
   Alles, was hier steht, ist gerechnet, nicht gewaehlt. Weisser Text auf
   einer farbigen Flaeche ist der Fall, in dem eine huebsche Farbe am
   schnellsten unlesbar wird, und Ueberlagerungen (Glanz, Lichtfleck)
   schlagen direkt auf den Kontrast durch.

   Gemessen am 13.09.2026, weisser Text gegen die HELLSTE Stelle:

     Amber #e89a1c -> #9c5f04   2,32 blank, 2,09 mit Glanz   verworfen
     #0a84ff (bis heute hier)   3,65 blank, 2,54 mit Glanz .28
     #0057c8 -> #00347a         6,57 blank, 5,17 mit Glanz .12   gebaut

   Die bis heute gebaute Flaeche war also selbst OHNE Glanz unter 4,5:1 —
   aufgefallen erst, als die Regel aus der Uebergabe („Warnzustaende in den
   Chip, nicht in die Flaeche") an einer neuen Ansicht nachgerechnet wurde.

   Drei Regeln daraus, alle drei vom Pruefstand bewacht:
     1. Glanz hoechstens .12.
     2. Der Lichtfleck oben rechts hoechstens .07 — bei .28 faellt die
        Stelle unter ihm auf 3,10:1, und ein langer Titel laeuft hinein.
     3. KEINE opacity auf Text ueber farbigen Flaechen. Opazitaet frisst den
        Kontrast unmittelbar; wer Text zuruecknehmen will, nimmt eine
        hellere Textfarbe mit gerechnetem Wert.
   ========================================================================== */
.g-held { position:relative;overflow:hidden;border-radius:34px;padding:26px 28px;color:#fff;background:var(--g-held);box-shadow:0 18px 44px rgba(0,52,122,.34) }
.g-held::before { content:"";position:absolute;inset:0;background:linear-gradient(180deg,rgba(255,255,255,.12),transparent 48%) }
.g-held::after { content:"";position:absolute;top:-50px;right:-30px;width:200px;height:200px;border-radius:50%;background:radial-gradient(circle,rgba(255,255,255,.07),transparent 68%) }
.g-held > * { position:relative }
.g-seite { position:relative;display:flex;min-height:100vh }
.g-nav { flex:0 0 236px;margin:16px 0 16px 16px;border-radius:30px;padding:20px 14px;display:flex;flex-direction:column;gap:3px }
.g-nav a { display:flex;align-items:center;gap:12px;padding:11px 13px;border-radius:16px;font-size:15px;color:#4f545b;text-decoration:none }
.g-nav a:hover { color:var(--g-ink) }
.g-nav a.is-aktiv { font-weight:600;color:var(--g-blau);background:rgba(255,255,255,.9);box-shadow:0 0 0 .5px rgba(22,45,66,.14),0 1px 0 rgba(255,255,255,.95) inset,0 4px 12px rgba(20,40,60,.1) }
.g-nav .g-nav-zahl { margin-left:auto;font-size:13px;color:#5a5f66;font-variant-numeric:tabular-nums }
.g-inhalt { position:relative;flex:1;min-width:0;padding:30px 32px;display:flex;flex-direction:column }
.g-reiter { position:relative;display:flex;align-items:center;gap:6px;margin:16px 18px 0;padding:8px 10px;border-radius:24px }
.g-reiter a { padding:10px 18px;border-radius:999px;font-size:15px;text-decoration:none;color:var(--g-ink-2) }
.g-reiter a.is-aktiv { font-weight:600;color:var(--g-blau);background:rgba(255,255,255,.9);box-shadow:0 0 0 .5px rgba(22,45,66,.14),0 1px 0 rgba(255,255,255,.95) inset,0 4px 12px rgba(20,40,60,.1) }
.g-rund { width:38px;height:38px;border-radius:999px;display:flex;align-items:center;justify-content:center;border:0;cursor:pointer;background:transparent;color:#4f545b;transition:transform .5s var(--g-feder) }
.g-rund:active { transform:scale(.92) }
.g-liste { flex:0 0 262px;display:flex;flex-direction:column;gap:7px;padding:16px 14px;border-radius:30px;background:rgba(255,255,255,.42);-webkit-backdrop-filter:blur(30px) saturate(180%);backdrop-filter:blur(30px) saturate(180%);box-shadow:0 0 0 .5px rgba(22,45,66,.14),0 1px 0 rgba(255,255,255,.85) inset,0 12px 30px rgba(20,40,60,.1);overflow:auto }
.g-liste-zeile { display:flex;gap:12px;align-items:flex-start;padding:12px 13px;border-radius:18px;border:0;width:100%;text-align:left;font-family:inherit;cursor:pointer;background:rgba(255,255,255,.4);transition:transform .45s var(--g-feder) }
.g-liste-zeile:active { transform:scale(.98) }
.g-liste-zeile.is-aktiv { background:rgba(255,255,255,.92);box-shadow:0 0 0 .5px rgba(22,45,66,.14),0 1px 0 rgba(255,255,255,.98) inset,0 8px 20px rgba(20,40,60,.12) }
.g-haken { width:22px;height:22px;border-radius:999px;flex:0 0 auto;display:flex;align-items:center;justify-content:center;margin-top:1px;background:rgba(29,29,31,.08);box-shadow:0 1px 0 rgba(255,255,255,.8) inset }
.g-haken svg { opacity:0;width:13px;height:13px;display:block }
.is-erledigt .g-haken { background:var(--g-gruen);box-shadow:0 2px 6px rgba(52,199,89,.4) }
.is-erledigt .g-haken svg { opacity:1 }
.g-liste-text { font-size:14px;line-height:1.4;color:rgba(29,29,31,.78) }
.is-erledigt .g-liste-text { color:var(--g-ink-3);text-decoration:line-through }
.g-matrix { border-radius:30px;overflow:hidden;display:flex;flex-direction:column;min-height:0;background:var(--g-matrix-fl);-webkit-backdrop-filter:none;backdrop-filter:none }
.g-matrix-rolle { overflow-x:auto }
/* min-content statt 1fr auf den Themenspalten: Bei 14 Themen wuerde 1fr sie
   auf die Rahmenbreite quetschen statt zu scrollen — und 44px waeren
   unterschritten, obwohl genau das ausgeschlossen wurde. */
.g-matrix-kopf,.g-matrix-zeile { display:grid;align-items:center;grid-template-columns:240px repeat(var(--g-spalten,7),minmax(48px,1fr)) 132px;min-width:max-content }
.g-matrix-kopf { padding:20px 0 12px;align-items:end }
.g-matrix-zeile { padding:15px 0;border-top:1px solid var(--g-line) }
.g-matrix-zelle { display:flex;justify-content:center }
.g-matrix-fuss { padding:15px 22px;display:flex;align-items:center;gap:20px;font-size:12.5px;color:var(--g-ink-2);border-top:1px solid var(--g-line) }
.g-overlay { position:fixed;inset:0;z-index:60;display:flex;justify-content:center;padding-top:78px;background:rgba(16,26,38,.3) }
/* Schrift und Textfarbe kommen sonst aus dem Bestand — .g-app gibt sie
   seinen Kindern, der Overlay haengt nicht darunter (siehe unten beim
   Dunkelmodus). Ohne diese Zeile traegt die Palette die Schrift der
   alten App, und .g-suchfeld erbt sie mit font:inherit weiter. */
.g-overlay { color:var(--g-ink);font-family:-apple-system,BlinkMacSystemFont,"SF Pro Display","SF Pro Text",system-ui,sans-serif;-webkit-font-smoothing:antialiased;font-size:17px }
/* Der sichtbare Fokusrahmen haengt an .g-app — aus demselben Grund hier
   noch einmal. Wer mit der Tastatur blaettert, muss sehen, wo er steht. */
.g-overlay :focus-visible { outline:3px solid var(--g-blau);outline-offset:3px;border-radius:12px }
.g-blatt { width:672px;max-width:calc(100% - 32px);max-height:600px;border-radius:34px;display:flex;flex-direction:column;overflow:hidden;animation:gRise .75s cubic-bezier(.34,1.5,.64,1) both }
/* min-width:0 ist tragend, nicht Kosmetik: Ein <input> hat min-width:auto
   und weigert sich damit, unter seine Eigenbreite zu schrumpfen. Auf dem
   Telefon (390px) schob es die esc-Marke aus dem Blatt heraus — gemessen
   am 12.09.2026, nicht vermutet. */
.g-suchfeld { flex:1;min-width:0;border:0;outline:0;background:none;font:inherit;font-size:22px;letter-spacing:-.015em;color:var(--g-ink) }
/* Die Zeile, die jede Liste benutzt.
   --------------------------------------------------------------------------
   Hiess bis zum 12.09.2026 .g-treffer und gehoerte der Suche. Beim Umbau des
   Wissens zeigte sich: dieselbe Form — Marke links, Titel und Herkunft in der
   Mitte, Pfeil rechts. Eine zweite Klasse mit denselben Werten waere der
   Anfang davon gewesen, dass beide auseinanderlaufen und jemand die eine fuer
   die richtige haelt. Dieselbe Lehre wie bei escA/onbAttr am selben Tag. */
.g-zeile { display:flex;gap:15px;align-items:center;padding:12px;border-radius:20px;cursor:pointer;text-decoration:none;color:inherit }
.g-zeile:hover { background:rgba(255,255,255,.72) }
/* Die mit den Pfeiltasten gewaehlte Zeile. Der Fuss der Suche
   verspricht "pfeil-hoch/runter blaettern" — ohne sichtbare Marke
   waere die Aufschrift wahr und trotzdem nutzlos, weil niemand sieht,
   WAS Enter oeffnen wuerde. Gleiche Marke wie in der Navigation. */
.g-zeile.is-aktiv { background:rgba(255,255,255,.9);box-shadow:0 0 0 .5px rgba(22,45,66,.14),0 1px 0 rgba(255,255,255,.95) inset,0 4px 12px rgba(20,40,60,.1) }
/* Gruppenueberschrift in einer Liste.
   KEIN Knopf: Im Bestand traegt grpKopf ein data-grp, aber es gibt nirgends
   einen Klick-Handler dafuer — die Gruppen klappen nur programmatisch zu,
   wenn ein Filter greift. Ein cursor:pointer waere hier also eine Aufschrift
   ohne Wirkung, dieselbe Fehlerklasse wie der Scrollhinweis, der auf breitem
   Schirm log. Am 12.09.2026 nachgesehen, nicht angenommen. */
.g-gruppe { display:flex;align-items:center;gap:10px;padding:18px 12px 8px }
/* Warum diese vier Bauteile einen EIGENEN Wert tragen statt des Tokens
   ---------------------------------------------------------------------
   .g-gruppe-zahl, .g-tastenmarke, .g-avatar und .g-regel-nr sitzen in
   einer getoenten Pille. Eine Farbe, die auf blankem Glas reicht, reicht
   dort nicht mehr: die Fuellung hellt den Untergrund noch einmal auf
   (siehe den Abschnitt "dritte Schicht" in glas-grundlage-test).

   An der WURZEL zu ziehen waere hier falsch. Nachgezaehlt am 13.09.2026:
   --g-ink-3 steht an 14 Stellen frei (jede Caption, jede Metazeile) und
   nur an zwei auf einer Fuellung; --g-blau an neun frei und an drei auf
   einer Fuellung. Das ganze Handbuch dunkler zu machen, um vier Pillen
   zu reparieren, waere die teurere Loesung.

   Bei den drei Statusfarben ist es umgekehrt — --g-gruen-ink,
   --g-rot-ink und --g-orange-ink werden AUSSCHLIESSLICH auf ihrer
   eigenen Fuellung benutzt. Die sind deshalb an der Wurzel korrigiert.

   Gerechnet: Zaehler 4,68 · Tastenmarke 4,60 · Avatar 4,59 ·
   Regelnummer 4,56 hell / 4,75 dunkel. */
.g-gruppe-zahl { margin-left:auto;font-size:12.5px;font-weight:600;color:#44484d;background:rgba(29,29,31,.06);padding:3px 10px;border-radius:999px }
/* Die Filterleiste. .g-chip gab es, aber ohne Auswahlzustand — die Chips im
   Bestand (.rchip) hatten ihn. Ohne ihn saehe man nicht, wonach gefiltert
   ist: eine Leiste, die etwas tut, aber nicht zeigt, was. */
.g-filter { display:flex;flex-wrap:wrap;gap:8px;padding:4px 12px 10px }
.g-filter-chip { display:inline-flex;align-items:center;gap:7px;padding:9px 15px;border-radius:999px;font-size:13.5px;font-weight:600;font-family:inherit;border:0;cursor:pointer;color:var(--g-ink-2);background:rgba(255,255,255,.5) }
.g-filter-chip.is-aktiv { color:var(--g-blau);background:rgba(255,255,255,.92);box-shadow:0 0 0 .5px rgba(22,45,66,.14),0 1px 0 rgba(255,255,255,.95) inset,0 4px 12px rgba(20,40,60,.1) }
/* Suchfeld einer Liste — nicht .g-suchfeld, das sitzt in der Befehlspalette
   und ist dort 22px gross. */
.g-listensuche { display:flex;align-items:center;gap:11px;margin:0 12px 8px;padding:13px 17px;border-radius:999px }
.g-listensuche input { flex:1;min-width:0;border:0;outline:0;background:none;font:inherit;font-size:16px;color:var(--g-ink) }
/* Der Lesetext eines Wissensartikels.
   --------------------------------------------------------------------------
   Zwei Formen, weil zwei Arten von Text: Kurze Saetze sind in Wahrheit
   Regeln — die liest man als nummerierte Liste. Laengerer Text bleibt
   Fliesstext. Die Unterscheidung stand schon im Bestand (Grenze 220 Zeichen)
   und wird hier nur anders gezeichnet, nicht neu entschieden. */
.g-lese { max-width:64ch }
.g-lese p { margin:0 0 14px;font-size:17px;line-height:1.62;color:var(--g-ink-2) }
.g-lese p:first-child { font-size:19px;line-height:1.55;color:var(--g-ink) }
/* Vorspann und Nachsatz eines Hilfeartikels. Der Vorspann liest sich wie der
   erste Absatz einer Lesespalte, steht aber ueber den nummerierten Schritten
   und gehoert deshalb nicht in .g-lese. */
.g-artikel-lead { font-size:19px;line-height:1.55;color:var(--g-ink);margin:0 0 24px;max-width:64ch;text-wrap:pretty }
.g-artikel-hinweis { display:flex;gap:15px;align-items:flex-start;padding:17px 19px;border-radius:22px;margin-top:28px;max-width:64ch }
/* .g-regel und nicht .g-punkt: .g-punkt ist der Statuspunkt der Matrix.
   Zwei Bedeutungen unter einem Namen waeren der Anfang davon, dass jemand
   die falsche Regel trifft. */
.g-regel { display:flex;gap:15px;align-items:flex-start;padding:14px 0 }
.g-regel + .g-regel { border-top:1px solid var(--g-line) }
.g-regel-nr { flex:0 0 auto;width:29px;height:29px;border-radius:999px;display:flex;align-items:center;justify-content:center;font-size:13.5px;font-weight:700;background:rgba(10,132,255,.16);color:#004791 }
.g-regel-text { font-size:16.5px;line-height:1.5;color:var(--g-ink);margin:2px 0 0 }
.g-tastenmarke { font-size:12px;font-weight:600;color:#44484d;padding:5px 10px;border-radius:9px;background:rgba(29,29,31,.07) }
/* Die esc-Marke ist ein KNOPF, nicht nur eine Aufschrift.
   --------------------------------------------------------------------
   Der Entwurf kannte nur Escape als Ausweg. Auf einem iPad ohne Tastatur
   war die Suche damit eine Sackgasse: Der Overlay liegt ueber allem, die
   Navigation darunter ist nicht erreichbar, und wer nichts Passendes
   findet, kommt nicht mehr heraus. Dieselbe Lehre wie bei der PDF-Huelle
   ('drei Wege hinaus statt keinem'): Taste, Knopf, Klick auf den Rand.
   44px ist Apples Richtwert fuer eine Trefferflaeche. */
.g-schliessen { flex:0 0 auto;min-width:44px;min-height:44px;display:inline-flex;align-items:center;justify-content:center;border:0;cursor:pointer;font-family:inherit }
/* Die Fussleiste der Suche stand als Inline-Stil in der Ansicht, mit
   background:rgba(255,255,255,.45) fest verdrahtet. Im Dunkelmodus wurde
   daraus ein hellgrauer Balken, auf dem --g-ink-3 (#98a3ac) stand: die
   Tastenhinweise waren kaum zu lesen. Der Kontrasttest konnte es nicht
   sehen, weil er Regeln liest und keine Inline-Stile — also wird daraus
   eine Regel. Das ist auch die Hausregel: Glas-Stil liegt in glass.css. */
.g-blatt-fuss { margin-top:auto;padding:14px 24px;display:flex;gap:18px;flex-wrap:wrap;font-size:12.5px;color:var(--g-ink-2);background:rgba(255,255,255,.45) }
.g-blatt-fuss .g-fuss-arten { margin-left:auto }
/* Der Messwertkasten des Merkzettels.
   --------------------------------------------------------------------
   Stand als Inline-Stil in viewChecklisteGlas, mit background
   rgba(255,255,255,.7) fest verdrahtet. Im Dunkelmodus wurde daraus ein
   fast weisser Kasten — mit --g-ink-2 (#b3bcc4) als Beschriftung und
   --g-ink (#eef3f6) als Zahl darauf. Gemessen am 12.09.2026: 1,02 bzw.
   1,3 zu 1. Die Sollwerte der Kuehlung waren damit im Dunkeln nicht
   lesbar, und das ist der eine Wert, wegen dem der Schritt existiert.
   Gefunden beim Umbau der Suche — dieselbe Ursache, gleiche Loesung:
   raus aus dem Inline-Stil, damit der Kontrasttest es sehen kann. */
.g-messkasten { margin-top:24px;display:flex;align-items:center;gap:18px;padding:18px 22px;border-radius:24px;max-width:430px;background:rgba(255,255,255,.7);box-shadow:0 0 0 .5px rgba(22,45,66,.14),0 1px 0 rgba(255,255,255,.95) inset,0 6px 18px rgba(20,40,60,.08) }
/* Auf dem Telefon nahm der Fuss drei Zeilen und damit zwei Treffer weg —
   fuer Tastenhinweise, die dort niemand ausloesen kann. Was bleibt, ist
   die Aufzaehlung dessen, worin gesucht wird. */
@media (max-width:560px) {
  .g-blatt-fuss .g-fuss-tasten { display:none }
  .g-blatt-fuss .g-fuss-arten { margin-left:0 }
}
.g-status { display:inline-flex;align-items:center;gap:12px;padding:12px 22px;border-radius:999px }
.g-status-punkt { width:9px;height:9px;border-radius:999px;animation:gPulse 2.2s ease-in-out infinite }
@keyframes gRise {
  from { opacity:0;transform:translateY(18px) scale(.985) }
  to { opacity:1;transform:none }
}
@keyframes gPulse {
  0%,100% { opacity:.5;transform:scale(1) }
  50% { opacity:.95;transform:scale(1.5) }
}
.g-rise { animation:gRise .75s cubic-bezier(.34,1.5,.64,1) both }
@media (prefers-reduced-motion:reduce) {
  .g-rise,.g-status-punkt { animation:none }
  .g-knopf,.g-pille,.g-rund,.g-liste-zeile,.g-balken > i { transition:opacity .15s linear }
  .g-knopf:active,.g-pille:active,.g-rund:active,.g-liste-zeile:active { transform:none;opacity:.7 }
}
.g-app :focus-visible { outline:3px solid var(--g-blau);outline-offset:3px;border-radius:12px }


/* ==========================================================================
   Start fuer die Leitung — die neunte Ansicht (13.09.2026).
   --------------------------------------------------------------------------
   Die Mitarbeiter-Startseite zeigt eine Person, ihre Themen, einen Auftrag.
   Die Leitung sieht das Team. Diese Vorlage fehlte in den ersten Uebergaben,
   und die Startseite der Leitung war deshalb aus Bestandsteilen gebaut:
   eine weisse Karte in einer weissen Karte in einer Sektion mit doppelter
   Ueberschrift. Vier Unterschiede raeumen das auf — sie stehen einzeln in
   viewStartLeitungGlas beschrieben.

   Hier nur das Material. Nichts davon als Inline-Stil: der Kontrastpruefer
   liest Regeln, keine style-Attribute. Genau dort sassen im August beide
   Dunkelmodus-Fehler.
   ========================================================================== */
.g-kopf { display:flex;align-items:flex-start;gap:14px }
.g-kopf-titel { margin-top:5px }
/* Der Rollenwechsler hat echte Funktion und gehoert nach oben zu Suche und
   Mond — nicht als blauer Knopf mitten in den Inhalt. */
.g-kopfpille { display:flex;align-items:center;gap:9px;padding:8px 9px 8px 15px;border-radius:999px;flex:0 0 auto }
.g-kopfpille button { border:0;background:none;font:inherit;cursor:pointer }
.g-rollenwahl { font-size:15px;font-weight:600;color:var(--g-ink);display:inline-flex;align-items:center;gap:7px }
.g-kopfpille .g-strich { width:1px;height:20px;background:rgba(22,45,66,.14);flex:0 0 auto }
.g-kopfpille .g-rund { width:30px;height:30px }

.g-held-kopf { display:flex;align-items:center;gap:10px;flex-wrap:wrap }
.g-held .g-caption { color:#fff }
/* Der Warnzustand steckt im Chip, nicht in der Flaeche. Weisse Pille, Text
   im dunklen Orange — 7,03:1, gerechnet. */
.g-held-chip { padding:4px 11px;border-radius:999px;background:rgba(255,255,255,.96);color:#7a4a05;font-size:12px;font-weight:700 }
.g-held-satz { margin-top:5px;max-width:52ch }
.g-held-fuss { display:flex;align-items:center;gap:14px;margin-top:18px;flex-wrap:wrap }
.g-held-knopf { padding:13px 22px;border-radius:999px;background:rgba(255,255,255,.96);color:#00458f;box-shadow:0 8px 20px rgba(0,32,80,.24) }
/* 15px statt einer Opazitaet: Opazitaet frisst den Kontrast. */
.g-held-dauer { font-size:15px;color:#fff }

.g-abschnitt { display:flex;align-items:baseline;gap:10px;margin:22px 4px 10px }
.g-abschnitt a { margin-left:auto;font-size:15px }
.g-teamliste { display:flex;flex-direction:column;gap:8px }
.g-teamliste .g-karte { border-radius:20px;padding:13px 17px;align-items:center;text-decoration:none;color:inherit }
.g-teamliste .g-balken { height:5px;margin-top:7px;display:block }

/* Kennzahlen: eine Reihe Glaszeilen. KEINE Deko-Symbole in den Ecken — ein
   Symbol, das nichts unterscheidet, ist Farbe ohne Aussage. */
/* Kein margin-top:auto. Es hat die Kennzahlen an den unteren Rand
   gedrueckt und bei 1440 x 980 gemessen eine Luecke von 130 px gelassen —
   eine leere Flaeche mitten in der Seite sieht aus wie ein Ladefehler,
   dieselbe Sorte Fehler wie die schwebende Leiste. Die Kennzahlen stehen
   jetzt im normalen Rhythmus der Abschnitte hinter der Teamliste. */
.g-kennzahlreihe { display:flex;gap:9px;margin-top:22px }
.g-kennzahl { flex:1;min-width:0;border-radius:20px;padding:14px 16px }
.g-kennzahl b { display:block;font-size:26px;font-weight:700;letter-spacing:-.03em;line-height:1;font-variant-numeric:tabular-nums }
.g-kennzahl span { display:block;margin-top:5px }
/* Die Zusatzzeile der Kachel. Enger an ihre Beschriftung gesetzt als diese
   an die Zahl — sie erlaeutert die Beschriftung, nicht die Zahl. */
.g-kennzahl-unten { margin-top:2px;color:var(--g-ink-3) }
@media (max-width:999px) {
  /* Schmal: Kennzahlen als 2 x 2, Rollenwechsler als eigene Zeile. */
  .g-kennzahlreihe { flex-wrap:wrap }
  .g-kennzahl { flex:1 1 calc(50% - 5px) }
  .g-kopf { flex-direction:column;align-items:stretch;gap:10px }
  .g-kopfpille { align-self:flex-start }
}
[data-theme="dark"] .g-kopfpille .g-strich { background:rgba(255,255,255,.16) }
[data-theme="dark"] .g-rollenwahl { color:var(--g-ink) }

/* ==========================================================================
   Wissen — die achte Ansicht (13.09.2026).
   --------------------------------------------------------------------------
   Drei Dinge, die diese Ansicht von den bisherigen Listen unterscheidet:

   1. Der Kopf und die Filter bleiben stehen, die LISTE scrollt. Auf einem
      iPad mit 768 px Hoehe war die Filterleiste nach zwei Zeilen aus dem
      Bild. Der Innenabstand unten an der Liste sorgt dafuer, dass die letzte
      Karte nicht halb abgeschnitten am Rand klebt.
      Nur ab 1000 px: darunter scrollt die Seite, und das ist dort richtig
      — ein innerer Roller neben dem Seitenroller ist auf dem Telefon
      genau der Fehler, den man nicht mehr los wird.
      Die 44 px sind der senkrechte Innenabstand von .domapp (16 oben,
      28 unten, gesetzt im 700er Block von dom.html) — keine geratene Zahl.

   2. Die Marke traegt den Ton der Gruppe, drei im Wechsel. Gerechnet gegen
      den unguenstigsten Grund (Kachel auf Glas .46 auf Farbkreis):
      Blau 3,85 · Gruen 4,18 · Violett 5,00 — Ziel fuer Grafik ist 3,0.
      Dunkel: 4,63 · 4,20 · 4,13.

   3. „Alle Bereiche" ist ein Textknopf, kein Chip. Er waehlt nichts aus,
      er zeigt mehr — ein Chip daneben saehe aus wie ein weiterer Filter.
   ========================================================================== */
.g-wissen-kopf, .g-sammlung-kopf { display:flex;align-items:flex-end;gap:16px }
/* Am Telefon bricht der Untertitel auf drei Zeilen um, und die Zahl
   stand dann auf halber Hoehe daneben, als gehoerte sie zur mittleren
   Zeile. Untereinander ist sie eindeutig. Gemessen bei 430 px. */
@media (max-width:700px) {
  .g-wissen-kopf, .g-sammlung-kopf { flex-direction:column;align-items:flex-start;gap:6px }
}
.g-wissen-unter, .g-sammlung-unter { color:var(--g-ink-2);margin-top:5px;max-width:62ch;text-wrap:pretty }
.g-wissen-zahl, .g-sammlung-zahl { white-space:nowrap;color:var(--g-ink-3) }
.g-wissen .g-listensuche, .g-sammlung .g-listensuche { margin:20px 0 0 }
.g-wissen .g-filter { padding:16px 0 0 }
.g-wissen .g-filter--alle { padding:10px 0 0 }
.g-wissen .g-gruppe, .g-sammlung .g-gruppe { padding:20px 4px 8px }
.g-wissen .g-zeile, .g-sammlung .g-zeile { border-radius:20px;padding:14px 17px }
/* Luft zwischen den Karten. Ohne sie kleben sie aneinander und sehen
   aus wie eine Tabelle mit unsichtbaren Linien. */
.g-wissen .g-zeile + .g-zeile, .g-sammlung .g-zeile + .g-zeile { margin-top:8px }
.g-mehr-bereiche { align-self:center;font:inherit;font-size:13.5px;font-weight:600;border:0;background:none;cursor:pointer;color:var(--g-ink-3);padding:9px 8px;border-radius:999px }
.g-mehr-bereiche:hover { color:var(--g-blau) }
.g-wissen-liste, .g-sammlung-liste { margin-top:14px;padding-bottom:22px }
@media (min-width:1000px) {
  /* Die Kette muss durchgehend sein: feste Hoehe oben, dann in jeder Stufe
     flex:1 und min-height:0. Faellt EINE Stufe aus, waechst die Liste
     stattdessen nach unten aus dem Bild — und der Roller erscheint gar
     nicht. min-height:0 ist dabei das Entscheidende: ein Flex-Kind ist von
     sich aus mindestens so hoch wie sein Inhalt. */
  .g-app.g-wissen, .g-app.g-sammlung { height:calc(100dvh - 44px);min-height:0;display:flex;flex-direction:column }
  .g-wissen .g-wissen-inhalt, .g-sammlung .g-sammlung-inhalt { flex:1;min-height:0 }
  .g-wissen .g-wissen-liste, .g-sammlung .g-sammlung-liste,
  .g-wissen .g-rolle, .g-sammlung .g-rolle { flex:1;min-height:0;overflow:auto;overscroll-behavior:contain;scrollbar-gutter:stable }
}
/* .g-rolle ist dasselbe Glied der Kette wie .g-sammlung-liste, nur ohne
   dessen Listen-Abstaende.
   --------------------------------------------------------------------------
   Anlass, 14.09.2026. John: "telefon und auswertung scrollen nicht." Beide
   tragen .g-sammlung und bekamen damit oben die feste Hoehe — aber sie
   bauten keine .g-sammlung-liste, also fehlte das UNTERSTE Glied. Ergebnis
   genau das, was der Kommentar darueber ankuendigt: Der Inhalt waechst aus
   dem Bild, und der Roller erscheint gar nicht. .g-app hat overflow:hidden,
   also war alles unterhalb der Faltkante schlicht weg.

   Betroffen waren DREI Ansichten, nicht zwei: Auswertung, Telefon und
   Auftraege. Bei den Auftraegen war es nur noch niemandem aufgefallen.

   Warum eine eigene Klasse und nicht .g-sammlung-liste: Diese drei Seiten
   sind keine Listen. .g-sammlung-liste bringt margin-top und padding-bottom
   einer Liste mit; eine Auswertung mit Diagrammen will die nicht. */
.g-rolle { min-width:0 }
/* In einem .g-rolle ist eine Liste eine Liste — kein zweiter Roller.
   --------------------------------------------------------------------------
   15.09.2026, beim Beheben von „Leitung scrollt nicht" gemessen: Die Regel
   oben macht JEDE .g-sammlung-liste zum Roller, egal wie tief sie haengt.
   Bei „Meins" traf das eine 22 px hohe Liste mitten auf der Seite. Sie bekam
   flex:1 und overflow:auto, rollte also als Einzige — und der Rest der Seite
   blieb stehen. Das Rad tat etwas, nur nicht das, was der Benutzer erwartete.

   Sobald ein .g-rolle die Seite traegt, ist es das unterste Glied der Kette.
   Alles darin ist Inhalt. */
@media (min-width:1000px) {
  .g-wissen .g-rolle .g-sammlung-liste, .g-sammlung .g-rolle .g-sammlung-liste,
  .g-wissen .g-rolle .g-wissen-liste, .g-sammlung .g-rolle .g-wissen-liste {
    flex:0 1 auto;min-height:auto;overflow:visible }
}

/* ==========================================================================
   Der Nachweis-Block der Leitung
   --------------------------------------------------------------------------
   Er wird in die fertige Leitungsseite NACHGELADEN. Bis zum 14.09.2026 kam
   er im alten Look (.kpis, .task, .block, .btnP) und war damit der letzte
   sichtbare Bruch in einer Glas-Seite.

   Fast alles teilt er sich mit dem Bestand: .g-kennzahlreihe wie in der
   Auswertung, .g-zeile wie in den Sammel-Listen, .g-chip wie ueberall. Neu
   sind nur der Kasten fuer den Geraetemodus und das Auswahlfeld darin.
   ========================================================================== */
.g-geraet { display:block;border-radius:22px;padding:18px 19px 19px;margin-top:6px }
.g-geraet-text { margin:0 0 14px;max-width:64ch;text-wrap:pretty }
.g-geraet-titel { display:block;margin:0 0 7px }
.g-geraet-hinweis { margin:9px 0 15px;max-width:64ch;text-wrap:pretty }

/* Das Auswahlfeld. Eigene Regel statt der alten .signame: das war ein
   Unterschriften-Feld, und ein Name ist keine Abteilung. appearance:none,
   damit das System nicht sein eigenes Grau darueberlegt; der Pfeil kommt
   als Hintergrundbild, weil ein <select> kein Kind aufnimmt.
   44px Mindesthoehe ist Apples Richtwert fuer eine Trefferflaeche. */
.g-auswahl { display:block;width:100%;max-width:340px;min-height:44px;padding:11px 40px 11px 15px;border:0;border-radius:16px;font-family:inherit;font-size:15.5px;font-weight:600;color:var(--g-ink);background-color:rgba(255,255,255,.72);background-repeat:no-repeat;background-position:right 14px center;background-size:13px;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2344484d' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");-webkit-appearance:none;appearance:none;cursor:pointer;box-shadow:0 0 0 .5px rgba(22,45,66,.14),0 1px 0 rgba(255,255,255,.95) inset,0 3px 10px rgba(20,40,60,.07) }

[data-theme="dark"] .g-auswahl { color:var(--g-ink);background-color:rgba(255,255,255,.10);background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23b3bcc4' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");box-shadow:0 0 0 .5px rgba(255,255,255,.10),0 1px 0 rgba(255,255,255,.06) inset }
/* Die Liste selbst zeichnet das System; ohne diese Zeile steht im Dunkeln
   weisse Schrift auf weissem Grund. */
.g-auswahl option { color:#1d1d1f;background:#fff }

/* ==========================================================================
   Die Getraenkelisten — ein Raster aus Fotos
   --------------------------------------------------------------------------
   Vier Listen teilen sich diese Form: Cocktails, Longdrinks, Spritz, Kaffee.
   Sie sind die einzige Stelle im Handbuch, an der das BILD die Auskunft ist
   und der Text nur danebensteht — wer den Namen kennt, braucht die Liste
   nicht; wer ihn nicht kennt, erkennt den Drink am Glas. Deshalb ein Raster
   und keine Zeilen, und deshalb bleibt das Bild quadratisch: eine Reihe
   Fotos mit verschiedenen Hoehen liest sich als Unordnung.

   Die Mindestbreite 176px ist kein runder Wert, sondern die Breite, bei der
   auf einem iPad hochkant drei Karten nebeneinander stehen und der Name
   einer Karte ("Aperol Spritz") noch in eine Zeile passt.
   ========================================================================== */
.g-fotoraster { display:grid;grid-template-columns:repeat(auto-fill,minmax(176px,1fr));gap:14px;margin-top:16px;padding-bottom:22px }
@media (max-width:430px) { .g-fotoraster { grid-template-columns:repeat(auto-fill,minmax(148px,1fr));gap:11px } }

.g-fotokarte { display:block;border-radius:22px;overflow:hidden;text-decoration:none;color:inherit;cursor:pointer;transition:transform .5s var(--g-feder) }
.g-fotokarte:active { transform:scale(.975) }
/* overflow:hidden am Rahmen schneidet das Bild rund — kein zweiter Radius
   am <img>, der bei jedem Seitenverhaeltnis anders sitzen wuerde. */
.g-fotobild { display:block;width:100%;aspect-ratio:1/1;object-fit:cover;background:rgba(29,29,31,.06) }
/* --g-ink-4 (Alpha .28) waere hier zu leise: Das ist keine Zierlinie wie
   ein Pfeilchen, sondern der EINZIGE Inhalt der Flaeche, solange kein Foto
   hinterlegt ist. Nachgerechnet gegen die Flaeche: #5a5f66 auf dem
   aufgehellten Grund ergibt 5,3:1, --g-ink-4 kaeme auf 1,6:1. */
.g-fotoleer { display:flex;align-items:center;justify-content:center;color:var(--g-ink-3) }
.g-fototext { display:block;padding:12px 14px 14px }

[data-theme="dark"] .g-fotobild { background:rgba(255,255,255,.07) }

/* ==========================================================================
   Die Protokollseite (HACCP)
   --------------------------------------------------------------------------
   Die einzige Seite im Handbuch, die ein FORMULAR ist: Messwerte, Auswahl,
   Haken, Korrekturmassnahme, Foto, Unterschrift. Deshalb hier mehr Felder
   als sonst — und deshalb sind die ids in dom.html unantastbar
   (test/haccp-vertrag-test.js).

   Ein abgehakter Schritt verschwindet nicht, er wird ruhig: gruene Flaeche,
   Haken statt Symbol, keine Felder mehr. Wer zurueckblaettert, muss sehen
   koennen, was er schon getan hat.
   ========================================================================== */
.g-haccp-kopf { display:flex;align-items:center;gap:12px }
.g-haccp-kopf .g-chip { margin-left:auto;flex:0 0 auto }
.g-haccp-tasten { display:flex;gap:9px;flex-wrap:wrap;margin:10px 2px 0 }
.g-haccp-blatt { display:block;border-radius:24px;padding:16px 17px 18px;margin-top:12px }

/* Die Anlage, um die es geht. Die Linie laeuft bis zum Rand, damit man beim
   Rollen sieht, wo ein Geraet aufhoert und das naechste anfaengt. */
.g-haccp-anlage { display:flex;align-items:center;gap:11px;margin:20px 0 12px }
.g-haccp-anlage:first-child { margin-top:2px }
.g-haccp-linie { flex:1;height:1px;background:var(--g-line) }

/* Der Fortschritt. Dieselben Bauteile wie in der Auswertung. */
/* KEIN .g-karte an diesem Kasten: .g-karte ist display:flex, und dann steht
   der Balken NEBEN dem Text statt darunter. Genau dieser Fehler ist am
   Vormittag des 14.09. schon einmal passiert (Auswertung, sieben Tagesbalken
   nebeneinander) — und am Nachmittag noch einmal, hier. Deshalb eine eigene
   Flaeche statt der geteilten Karte. */
.g-haccp-fortschritt { display:block;border-radius:20px;padding:15px 18px 17px;margin:4px 2px 0 }
/* Der Balken hat hier ZWEI Abschnitte, und das ist der ganze Punkt:
   durchgezogen = eingetragen, schraffiert = abgehakt, aber noch nicht
   gespeichert. John, 14.09.2026: "Was nicht passieren darf, ist ein
   voller Balken, der aussieht wie ein gefuehrtes Protokoll, waehrend
   nichts gespeichert ist — bei HACCP ist das kein Schoenheitsfehler."
   Ein komplett schraffierter Balken sieht auch voll nicht aus wie ein
   fertiges Blatt. Die Schraffur traegt die Auskunft NICHT allein: Unter
   dem Balken steht sie in Worten. */
.g-haccp-fortschritt .g-dia-spur { display:block;width:100%;position:relative;overflow:hidden }
.g-fort-offen { position:absolute;top:0;height:100%;
  background:repeating-linear-gradient(135deg,
    rgba(0,91,187,.42) 0 4px, rgba(0,91,187,.10) 4px 8px) }
[data-theme="dark"] .g-fort-offen { background:repeating-linear-gradient(135deg,
    rgba(134,196,255,.55) 0 4px, rgba(134,196,255,.14) 4px 8px) }

/* Der Nachweis. Getrennt vom Balken, mit Abstand darueber — es sind zwei
   Auskuenfte, nicht eine mit Unterzeile. */
.g-nachweis { display:flex;align-items:center;gap:8px;margin:11px 0 0 }
.g-nachweis-punkt { width:9px;height:9px;flex:0 0 auto;border-radius:999px;background:var(--g-neutral) }
.g-nachweis--ja .g-nachweis-punkt { background:var(--g-gruen) }
.g-nachweis--teil .g-nachweis-punkt { background:var(--g-orange) }
.g-nachweis--nein .g-nachweis-punkt { background:transparent;box-shadow:0 0 0 1.5px var(--g-ink-4) inset }
.g-fortschritt-zeile { display:flex;justify-content:space-between;align-items:baseline;gap:12px;margin-bottom:10px }

/* ---- Zeit: Stempeluhr und Meine Stunden -------------------------------
   Die Stempeluhr ist eine Maske mit genau einem Feld — dem Knopf. Er ist
   absichtlich gross: gestempelt wird im Vorbeigehen, oft einhaendig, oft
   mit nassen Fingern. */
.g-zt { display:block }
.g-zt-meld { margin-top:14px }
.g-zt-kopf { align-items:center;gap:14px;margin-top:16px;padding:16px 18px }
.g-zt-punkt { width:13px;height:13px;flex:0 0 auto;border-radius:999px;background:var(--g-neutral) }
.g-zt-punkt--drin { background:var(--g-gruen) }
.g-zt-punkt--pause { background:var(--g-orange) }
.g-zt-punkt--draussen { box-shadow:0 0 0 1.5px var(--g-ink-4) inset;background:transparent }
/* Der Stempelknopf — gerechnet, nicht gefuehlt. 14.09.2026.
   -----------------------------------------------------------------------
   John: "Stempelknopf messen, nicht fuehlen. Er ist die haeufigste
   Handlung des Tages: mindestens 48 px hoch, das gemessene Blau, weisser
   Text, Haltezustand scale(.96). Wenn du unsicher bist, welcher Wert —
   nimm den aus der Heldflaeche, der ist gerechnet."

   Nachgerechnet wurde mit scripts/_mess-verlauf.js, das den Verlauf
   abtastet statt nur seine zwei Stopps anzusehen. Ergebnis:

     --g-blau-flaeche  weiss haelt 4,5:1 erst ab 57 % der Strecke
                       (heller Stopp 2,86 · Mitte 4,27 · dunkler 6,57)
     --g-held          weiss haelt UEBERALL
                       (6,57 · 8,78 · 11,85; dunkel 7,42 · 10,52 · 14,72)

   Also die Heldflaeche, genau wie John sagt.

   Der schwerere Fund steckte bei Pause und Feierabend, und er war nicht
   die Flaeche, sondern die Kaskade: Die beiden Knoepfe tragen auch
   .g-knopf--glas, das color:var(--g-ink-2) setzt. Ueberschrieben wurde
   nur der Hintergrund — die Tinte blieb. Gemalt wurde dadurch:

     hell   #4f545b auf Orange   4,28 · 3,35 · 2,56
     dunkel #b9c2ca auf Orange   1,01 · 1,26 · 1,65   <- unlesbar
     dunkel #b9c2ca auf Gruen    1,10 · 1,44 · 1,94   <- unlesbar

   Im Dunkelmodus war die Beschriftung der beiden Knoepfe praktisch
   unsichtbar — live, bei allen acht Betrieben. Dasselbe Fehlerbild wie
   beim Kaestchen: eine Flaeche ohne Dunkel-Gegenstueck, hier aber
   andersherum — die Flaeche stand fest und die TINTE kippte mit dem
   Modus.

   Deshalb jetzt bei allen drei Knoepfen: Fuellung UND Tinte stehen
   zusammen, in beiden Modi gleich, weisser Text auf tiefer Farbe. Die
   Toene sind geloest, nicht gewaehlt (scripts/_loese-knopffarbe.js):
   heller Orangeton und helles Gruen tragen Weiss NIRGENDS, ein dunkler
   Ton traegt es ueberall.

     Pause        #a9640a..#8f5208   4,65 · 5,37 · 6,22
     Feierabend   #1c8038..#16702f   5,01 · 5,56 · 6,19

   Beide liegen bei einer Leuchtdichte von 0,12 bis 0,18 — also im Band
   der Akzentfarben, nicht bei den hellen Flaechen. Sie brauchen darum
   keinen Eintrag in ABSICHT von test/helle-flaechen-test.js.

   Die Hoehe bleibt bei 72 px (Zweitknopf 60): beide ueber den 48, die
   John als Untergrenze nennt. Neu ist nicht der Wert, sondern dass er
   jetzt geprueft wird. Der Haltezustand scale(.96) kommt aus .g-knopf
   und gilt damit hier mit — bei reduzierter Bewegung wird daraus
   opacity, siehe die Regel weiter oben. */
.g-zt-stempel { width:100%;margin-top:14px;min-height:72px;font-size:19px;color:#fff;
  background:var(--g-held);box-shadow:0 16px 36px rgba(0,52,122,.34),0 1px 0 rgba(255,255,255,.35) inset }
.g-zt-stempel--sek { min-height:60px;font-size:17px }
/* Feierabend und Pause haben eigene Toene: Wer zwanzigmal am Tag stempelt,
   trifft den richtigen Knopf nach der Farbe, nicht nach dem Wort. Das Wort
   steht trotzdem drauf — die Farbe ist die schnelle Spur, nicht die
   einzige. */
.g-zt-pause { color:#fff;background:linear-gradient(145deg,#a9640a,#8f5208);box-shadow:0 14px 32px rgba(120,70,0,.30),0 1px 0 rgba(255,255,255,.28) inset }
.g-zt-gehen { color:#fff;background:linear-gradient(145deg,#1c8038,#16702f);box-shadow:0 14px 32px rgba(14,80,34,.30),0 1px 0 rgba(255,255,255,.28) inset }
.g-zt-weg { width:100%;margin-top:22px }

.g-zm { display:block }
.g-zm-kopf { display:flex;align-items:center;gap:12px;margin-top:18px }
/* Der gesperrte Pfeil ist KEIN Knopf — er sieht nur so aus, damit die
   Zeile nicht springt. Was ihn sperrt, steht im Markup: dort sitzt kein
   Klickziel. */
.g-zm-pfeil--aus { opacity:.35;display:inline-flex;align-items:center;justify-content:center }
.g-zm-hinweis { margin-top:14px }
.g-zm-fuss { margin:18px 2px 0;max-width:64ch;color:var(--g-ink-3) }
.g-ztag { align-items:center;gap:14px;margin-top:9px;padding:13px 16px }
.g-ztag--unklar { box-shadow:0 0 0 1.5px var(--g-orange) inset }
/* Die Personenzeile der Leitung ist ein Knopf, kein Kasten — sie fuehrt
   seit dem 14.09.2026 zu den Stunden dieser Person. Als <button> braucht
   sie drei Dinge zurueckgesetzt, die der Browser selbst mitbringt
   (Rahmen, Schriftart, Textausrichtung), und den Pfeil als Zeichen, dass
   es weitergeht: eine Zeile, die nur beim Antippen verraet, dass sie ein
   Klickziel ist, wird nicht angetippt. */
.g-ztag--klick { width:100%;border:0;font-family:inherit;text-align:left;cursor:pointer;
  color:var(--g-ink);transition:transform .5s var(--g-feder) }
.g-ztag--klick:active { transform:scale(.99) }
.g-ztag-pfeil { flex:0 0 auto;display:inline-flex;color:var(--g-ink-3) }
.g-ztag-dat { flex:0 0 42px;text-align:center }
.g-ztag-dauer { flex:0 0 auto;text-align:right }
.g-ztag-marken { display:flex;flex-wrap:wrap;gap:6px;margin-top:7px }

/* ---- Arbeitszeit (Leitung) --------------------------------------------- */
.g-zl { display:block }
.g-zl-person { align-items:center;gap:13px;margin-top:9px;padding:13px 16px }
.g-zl-hinweis { margin-top:14px }
.g-zl-tasten { display:flex;flex-wrap:wrap;gap:10px;margin-top:12px }
.g-zl-tasten .g-knopf { flex:1;min-width:250px }
.g-zl-fuss { margin:14px 2px 0;max-width:64ch;color:var(--g-ink-3) }

/* ---- Pflicht-Detailseite -----------------------------------------------
   Eine Eingabemaske, keine Leseansicht: Was hier steht, ist der Nachweis
   bei einer Pruefung. Die Bauteile kommen aus dem Bestand (.g-feld,
   .g-auswahl, .g-karte); hier stehen die Abstaende und das mehrzeilige
   Feld. */
.g-rd-grundlage { margin:6px 2px 0;color:var(--g-ink-3) }
.g-rd-quelle { margin:8px 2px 0;max-width:64ch }
.g-rd-hinweis { margin:16px 2px 0 }
.g-rd-msg:empty { display:none }
.g-rd-msg { margin:12px 2px 0 }
/* Die Bloecke stapeln, statt nebeneinander zu stehen: .g-karte ist
   display:flex, und ein Formular in einer Reihe waere eine Zeile aus
   Feldern. Derselbe Fehler wie am 14.09. beim Fortschrittsbalken. */
.g-rd-block { display:block;margin-top:18px;padding:18px 20px 20px }
.g-rd-block .g-feld,.g-rd-block .g-auswahl { display:block;width:100%;max-width:none;margin-top:10px }
.g-rd-block .g-caption { display:block }
/* Ein mehrzeiliges Feld ist kein hohes einzeiliges: Zeilenhoehe und
   Hoehe muessen mit, sonst klebt der Text am oberen Rand. */
.g-feld--mehr { min-height:88px;line-height:1.5;resize:vertical;padding:12px 14px }
.g-rd-label { display:block;margin:14px 2px 0;color:var(--g-ink-3) }
.g-rd-auto { margin:8px 2px 0;color:var(--g-ink-3) }
.g-rd-beleg { display:flex;align-items:flex-start;gap:11px;min-height:44px;
  padding:6px 0;cursor:pointer }
.g-rd-tasten { display:flex;flex-wrap:wrap;gap:10px;margin:20px 2px 0 }
.g-rd-tasten .g-knopf { flex:1;min-width:220px }
.g-rd-stand { margin:10px 2px 0;color:var(--g-ink-3) }

/* ---- Prueffristen ------------------------------------------------------
   Die Seite ist eine Leseansicht mit vier Klickvertraegen. Die Bauteile
   kommen alle aus dem Bestand (.g-kennzahlreihe, .g-filter, .g-zeile,
   .g-artikel-hinweis); hier stehen nur die Abstaende dazwischen. */
.g-pf-hinweis { margin:14px 2px 0 }
.g-pf-filter { padding:14px 2px 4px }
/* Leer nimmt keinen Platz: Die Meldezeile steht fast immer leer da, und
   ein leerer Absatz mit Aussenabstand schoebe die Liste dauerhaft nach
   unten. Siehe .g-hzmsg, dieselbe Sache an der Protokollseite. */
.g-pf-msg:empty { display:none }
.g-pf-msg { margin:0 2px 10px }
.g-pf-tasten { display:flex;flex-wrap:wrap;gap:10px;margin:18px 2px 4px }
.g-pf-tasten .g-knopf { flex:1;min-width:240px }

/* ---- Eine Schrittzeile ------------------------------------------------- */
.g-hz { border-radius:18px;padding:11px 13px;background:rgba(255,255,255,.5);margin-bottom:9px }
.g-hz--fertig { background:var(--g-gruen-fl) }
.g-hzkopf { display:flex;align-items:center;gap:11px;width:100% }
/* Die ganze Zeile ist das Haekchen — im Kuehlhaus wird mit Handschuhen
   abgehakt, und ein Kaestchen allein trifft man dort nicht. Gemessen am
   14.09.: 833x44 px, ein Klick 120 px vom rechten Rand hakt ab. */
.g-hzhaken { cursor:pointer;min-height:44px }

/* Das Kaestchen steht NICHT mehr hier. Es ist eine Regel des ganzen
   Handbuchs geworden und wohnt in dom.html bei "Finger statt Maus" —
   zusammen mit den Tokens --kbd/--kfuell/--khaken/--khaken-blass, die
   in beiden Modi gesetzt sind. Eine Ausnahme fuer das Glas waere genau
   der Grund, aus dem der Fehler die naechste neue Ansicht wieder
   erwischt haette. (John, 14.09.2026) */
.g-hzic { width:30px;height:30px;flex:0 0 auto;display:flex;align-items:center;justify-content:center;border-radius:10px;background:rgba(29,29,31,.06);color:var(--g-ink-3) }
.g-hzic svg { width:17px;height:17px }
.g-hzok { width:30px;height:30px;flex:0 0 auto;display:flex;align-items:center;justify-content:center;border-radius:999px;background:var(--g-gruen-fl);color:var(--g-gruen-ink) }
.g-hzok svg { width:17px;height:17px }
.g-hzk { flex:0 0 auto;color:var(--g-ink-3);white-space:nowrap }
.g-hzgrenz { display:block;margin-top:2px;color:var(--g-ink-3) }
.g-hzin { display:flex;align-items:center;gap:9px;margin-top:10px }
.g-hzu { flex:0 0 auto;color:var(--g-ink-3) }
.g-hzsub { margin-top:9px }
.g-hzlabel { display:block;margin-bottom:5px }
.g-hzplan { margin:7px 0 0;color:var(--g-ink-3) }
.g-hzfoto { margin-left:9px }
.g-hzmsg:empty { display:none }
.g-hzmsg { margin-top:8px }

/* Ein Eingabefeld im Glas. Mindesthoehe 44px: Apples Richtwert fuer eine
   Trefferflaeche, und hier wird mit nassen Fingern getippt. */
.g-feld { flex:1;min-width:0;min-height:44px;padding:11px 14px;border:0;border-radius:14px;font-family:inherit;font-size:16px;color:var(--g-ink);background:rgba(255,255,255,.8);box-shadow:0 0 0 .5px rgba(22,45,66,.14),0 1px 0 rgba(255,255,255,.95) inset }
/* 16px ist kein Geschmack: Darunter zoomt iOS Safari beim Hineintippen in
   das Feld, und die halbe Seite ist weg. */
.g-feld::placeholder { color:var(--g-ink-4) }

.g-haccp-sig { display:block;width:100%;height:96px;margin-top:16px;border-radius:16px;border:1.5px dashed rgba(22,45,66,.22);background:#fff }
.g-haccp-sighinweis { margin:6px 2px 0;color:var(--g-ink-3) }
.g-haccp-senden { width:100%;margin-top:14px }

[data-theme="dark"] .g-hz { background:rgba(255,255,255,.06) }
[data-theme="dark"] .g-hz--fertig { background:var(--g-gruen-fl) }
[data-theme="dark"] .g-hzic { background:rgba(255,255,255,.09);color:var(--g-ink-3) }
[data-theme="dark"] .g-feld { background:rgba(255,255,255,.10);box-shadow:0 0 0 .5px rgba(255,255,255,.10),0 1px 0 rgba(255,255,255,.06) inset }
/* Das Unterschriftenfeld bleibt weiss — unterschrieben wird auf Papierfarbe,
   und der Strich muss dunkel sein, egal wie die App gerade aussieht. */
[data-theme="dark"] .g-haccp-sig { border-color:rgba(255,255,255,.22) }
[data-theme="dark"] .g-auswahl option { color:#eef3f6;background:#1a2128 }
/* ==========================================================================
   Die Sammel-Listen: Arbeitsschutz, Checklisten, Nachweise, Getraenke
   --------------------------------------------------------------------------
   Kopf, Suche, Gruppen, Zeilen und Rollkette teilt sich diese Seite mit dem
   Wissen — die Regeln oben nennen beide Klassen, statt sie zu verdoppeln.
   Zwei Wahrheiten fuer dasselbe Material waeren die teurere Loesung.

   Eigen ist nur, was das Wissen nicht hat: der Hinweistext der Kategorie,
   der Rollenhinweis, die Kacheln der Getraenke, die PDF-Marke und die
   Zeile, hinter der keine Datei liegt.
   ========================================================================== */
.g-sammlung-lead { color:var(--g-ink-2);margin:14px 0 0;max-width:64ch;text-wrap:pretty }
.g-sammlung-hinweis { display:flex;align-items:center;gap:7px;margin:12px 0 0;color:var(--g-ink-3) }
.g-sammlung-leer { text-align:center;color:var(--g-ink-3);padding:30px 14px }
/* Der Knopf im Leertext ("Nochmal versuchen"). Blau und unterstrichen,
   weil er in einem Satz steht: ohne beides waere er von Text nicht zu
   unterscheiden.

   NICHT --g-blau: dieser Satz steht OHNE Glasflaeche direkt auf dem
   Grund, und dort traegt #005bbb nur 3,69 : 1 (ueber der dichtesten
   Stelle des Blaukreises). #00458f traegt dort 5,28. Gerechnet im
   Pruefstand, nicht geschaetzt. */
.g-nochmal { color:#00458f;text-decoration:underline;cursor:pointer;font-weight:600 }

/* ---- Diagramme ---------------------------------------------------------
   Eine Groesse, ein Farbton: Menge wird durch LAENGE gezeigt. Die leere
   Spur ist eine helle Stufe desselben Blaus, nicht Grau — so liest sich
   der ganze Balken als eine Skala. Text traegt nie die Datenfarbe.
   Die Zahl steht neben dem Balken, nie darin: dort passt sie bei kurzen
   Balken nicht, und abgeschnittene Ziffern sind schlimmer als keine. */
/* NICHT .g-karte: die ist im Bestand display:flex mit align-items:center
   — die sieben Tageszeilen standen darin NEBENeinander, jede 97 px breit,
   die ganze Karte 42 px hoch. Im Pruefbild gemessen, nicht vermutet. */
.g-diagramm { display:block;border-radius:22px;padding:16px 18px;margin-top:2px }
/* .g-diazeile und NICHT .g-balken: den Namen gibt es im Glas-Satz schon
   (Zeile 90, der Fortschrittsbalken der Teamliste, height:8px mit
   overflow:hidden). Zwei Regeln gleichen Namens haetten sich gegenseitig
   Eigenschaften geliehen — meine Zeilen waren dadurch 8 px hoch mit
   abgeschnittener Beschriftung, und mein display:flex waere auf die
   Teamliste der LIVE-Startseite durchgeschlagen. Im Pruefbild gesehen. */
.g-diazeile { display:flex;align-items:center;gap:12px;padding:5px 0 }
.g-dia-name { flex:0 0 38px;color:var(--g-ink-3) }
.g-dia-spur { flex:1;height:10px;border-radius:5px;background:rgba(0,91,187,.11) }
.g-dia-fuell { display:block;height:100%;background:var(--g-blau);border-radius:5px;min-width:5px }
.g-dia-zahl { flex:0 0 30px;text-align:right;font-weight:600;color:var(--g-ink);font-variant-numeric:tabular-nums }
/* 2px Abstand zwischen den Saeulen, und der Abstand trennt — kein Rand um
   die Saeule herum, der waere Tinte ohne Aussage. Oben 4px rund, unten
   eckig: die Grundlinie ist die Null und soll gerade sein. */
.g-stunden { display:flex;align-items:flex-end;gap:2px;height:78px }
.g-stunde { flex:1;border-radius:4px 4px 0 0;background:var(--g-blau);min-height:3px }
/* Eine Stunde ohne Anruf ist eine gemessene Null, keine fehlende Stunde —
   deshalb ein Stummel und kein Nichts. */
.g-stunde--leer { background:rgba(0,91,187,.14);height:3px }
.g-stunden-achse { display:flex;justify-content:space-between;margin-top:8px;color:var(--g-ink-3) }
.g-rangzeile { display:flex;align-items:center;gap:12px;padding:7px 0 }
.g-rangzeile + .g-rangzeile { border-top:1px solid var(--g-line) }
.g-rangzahl { margin-left:0 }
/* Die Zahl am Ende einer Nachschlage-Zeile. Keine Pille wie .g-gruppe-zahl:
   sie zaehlt, was dahinter liegt, und ist keine Meldung. Eine Pille haette
   ausgesehen wie der Warnchip zwei Gruppen darueber. */
.g-rangzahl-schlicht { color:var(--g-ink-3);font-variant-numeric:tabular-nums;flex:0 0 auto }
/* ---- Auftraege: Eintraege, an denen etwas getan wird -------------------
   Die Zeile ist KEIN Link — kein Zeiger, kein Pfeil. Ausgeloest wird nur an
   den Knoepfen darunter. */
.g-auftrag { border-radius:22px;padding:14px 16px 13px;margin-top:9px }
.g-auftrag-zeile { display:flex;align-items:center;gap:15px }
.g-auftrag-tasten { display:flex;flex-wrap:wrap;gap:8px;margin:13px 0 1px }
/* Abgesagt oder erledigt: der Eintrag bleibt lesbar, tritt aber zurueck.
   Nicht ueber die Deckkraft der ganzen Karte — das nimmt auch dem Knopf
   „Doch nicht absagen" den Kontrast, und der wird gerade gebraucht. */
.g-auftrag--blass .g-body-6, .g-auftrag--blass .g-fuss { color:var(--g-ink-3) }
.g-durch { text-decoration:line-through }
/* Die Meldung nach einer Handlung. Zwei Faecher: eines fuer den Stand beim
   Zeichnen, eines, in das auftTun() spaeter schreibt, ohne neu zu zeichnen. */
.g-auftmeldung { margin:14px 4px 0 }
.g-auftmeldung--ok { color:var(--g-gruen-ink) }
.g-auftmeldung--fehler { color:var(--g-rot-ink) }
.g-auftmeldung--neutral { color:var(--g-ink-2) }
.g-auftmeldung-fach { margin:0 4px }
.g-auftmeldung-fach:not(:empty) { margin-top:12px }

/* ---- Telefon: Schalter, die in die laufende Anlage greifen -------------
   Der Schalter traegt seinen Zustand in der Stellung UND im Satz darunter.
   Gruen heisst hier nicht „gut", sondern „an" — das ist die einzige Stelle
   des Handbuchs, an der Farbe einen Schalterzustand zeigt, und sie steht
   deshalb nie allein. */
.g-schaltkasten { display:block;border-radius:22px;padding:6px 18px 10px;margin-top:18px }
.g-schalt-nummer { padding:12px 0 4px }
.g-schaltzeile { display:flex;align-items:center;gap:16px;padding:14px 0;cursor:pointer }
.g-schaltzeile + .g-schaltzeile { border-top:1px solid var(--g-line) }
.g-schalter { position:relative;display:block;width:51px;height:31px;flex:0 0 auto }
.g-schalter input { position:absolute;inset:0;width:100%;height:100%;margin:0;opacity:0;cursor:pointer }
/* Die Spur des Schalters ist KEINE Glasflaeche: auf ihr steht kein Text,
   und sie darf deshalb auch nicht als eine gelesen werden. Im Dunkeln
   deshalb ein Grauton und nicht rgba(255,255,255,…) — der Pruefstand
   sammelt weisse Flaechen ein und rechnet danach jede Tinte gegen sie. */
.g-schalter i { position:absolute;inset:0;border-radius:999px;background:rgba(29,29,31,.18);transition:background .2s ease;pointer-events:none }
.g-schalter i::after { content:"";position:absolute;top:2px;left:2px;width:27px;height:27px;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.28);transition:transform .2s ease }
.g-schalter input:checked + i { background:#209044 }
.g-schalter input:checked + i::after { transform:translateX(20px) }
.g-schalter input:focus-visible + i { box-shadow:0 0 0 3px rgba(10,132,255,.45) }
.g-schalt-meldung { color:var(--g-ink-2);font-size:13px;line-height:1.45 }
.g-schalt-meldung:not(:empty) { padding:2px 0 10px }
.g-schalt-meldung--ok { color:var(--g-gruen-ink) }
.g-schalt-meldung--fehler { color:var(--g-rot-ink) }
.g-schalt-meldung--neutral { color:var(--g-ink-2) }
.g-telweiter { margin-top:12px }
.g-telkopf { display:flex;align-items:baseline;gap:12px }
/* „Alle oeffnen": kein Knopf, sondern ein Wort, das etwas tut. Ein Knopf
   neben einer Abschnittsmarke saehe aus wie die Hauptsache. */
.g-telalle { margin-left:auto;border:0;background:none;font-family:inherit;font-size:13.5px;font-weight:600;color:#00458f;cursor:pointer;padding:0 }

/* ---- Telefon: ein Gespraech ------------------------------------------- */
.g-anruf { border-radius:22px;padding:4px 16px;margin-top:9px }
.g-anruf-zeile { display:flex;align-items:center;gap:15px;padding:12px 0;cursor:pointer }
.g-anruf-pfeil { color:var(--g-ink-4);display:flex;transition:transform .15s ease }
.g-anruf-pfeil.is-offen { transform:rotate(90deg) }
.g-anruf-ergebnis { border-left:3px solid var(--g-blau);padding:2px 0 2px 12px;margin:2px 0 14px 55px }
.g-anruf-feld { color:var(--g-ink-3) }
.g-anruf-warn { color:var(--g-orange-ink) }
.g-anruf-ohne { color:var(--g-ink-3);margin:0 0 14px 55px }
.g-anruf-verlauf { margin:0 0 14px 55px }
/* Abstand zwischen ALLEN Teilen des Verlaufs, nicht nur zwischen zwei
   Beitraegen: die Zeile „Nichts verstanden" stand sonst ohne Luft unter dem
   Satz davor und las sich wie dessen Fortsetzung. Im Pruefbild gesehen. */
.g-anruf-verlauf > * + * { margin-top:13px }
.g-anruf-sie { color:var(--g-blau) }
.g-anruf-guete { margin-left:7px;font-weight:700 }
.g-anruf-text { font-size:15px;white-space:pre-wrap;margin-top:3px }
.g-anruf-still { color:var(--g-orange-ink);margin:0 }
@media (max-width:560px) {
  .g-anruf-ergebnis, .g-anruf-ohne, .g-anruf-verlauf { margin-left:0 }
}
/* Der Fortschritt ganz oben: eine Zahl, ein Balken, ein Satz. Er benutzt
   die Balkenbauteile der Auswertung (.g-dia-spur / .g-dia-fuell), damit es
   nicht zwei Fortschrittsbalken mit zwei Materialien gibt. */
.g-fortschritt { border-radius:20px;padding:15px 18px 17px;margin-top:18px }
.g-fortschritt-kopf { display:flex;align-items:baseline;gap:12px;margin-bottom:11px }
.g-fortschritt-kopf .g-body { flex:1;min-width:0 }
.g-fortschritt-zahl { flex:0 0 auto;font-variant-numeric:tabular-nums }
/* Die Spur ist in der Auswertung ein Flex-Kind und wird dort von selbst
   zum Block. Hier haengt sie direkt in einer Karte: als <span> bliebe sie
   INLINE, und dann gelten weder Hoehe noch Breite — der Balken lief im
   ersten Pruefbild aus der Karte heraus ueber den Text darunter. */
.g-fortschritt .g-dia-spur { display:block;width:100% }
/* Die Unterzeile einer Gruppe. Negativer Abstand nach oben, weil .g-gruppe
   unten schon 8px traegt — sonst stuende die Erklaerung weiter von ihrer
   Ueberschrift entfernt als von der ersten Zeile darunter. */
.g-gruppe-unter { color:var(--g-ink-3);margin:-4px 0 8px;padding:0 12px;max-width:64ch;text-wrap:pretty }
/* Der Satz unter der Liste. Er schliesst die Seite ab und bekommt Luft nach
   unten, damit er nicht auf der Kante des Fensters klebt. */
.g-sammlung-fuss { color:var(--g-ink-3);margin:26px 12px 0;padding-bottom:30px;max-width:64ch;text-wrap:pretty }

/* Kacheln statt Zeilen: jede fuehrt in eine eigene Liste. Bei 430 px eine
   Spalte — zwei nebeneinander lassen von „Aperitif & Spritz" nichts uebrig. */
/* Die Gruppenueberschrift einer Kachelseite. Sie traegt keinen Zaehler:
   bei einem Wegweiser ist "wie viele Wege" keine Auskunft, die jemand
   sucht — anders als bei einer Liste, wo die Zahl sagt, wie viel Arbeit
   dahintersteckt. */
/* Der Zurueck-Knopf im Kopf einer Sammel- oder Kachelseite. Er steht
   links neben dem Titel und nur dann, wenn es wirklich ein Zurueck gibt.
   Bis zum 13.09.2026 hatten diese Seiten ihn ueber domHeader(); beim
   Umbau auf Glas ist er stillschweigend verschwunden. Gefunden hat es
   die Pruefung "Ohne Vorgeschichte kein Zurueck-Pfeil im Leitungs-
   Bereich" in nachweis-test. */
.g-sammlung-kopf .g-zurueck { border-radius:999px;align-self:flex-start;margin-top:6px }
.g-kachelgruppe { padding:22px 4px 8px }
.g-kachelgruppe-unter { color:var(--g-ink-3);margin:3px 0 0;max-width:64ch;text-wrap:pretty }
/* Der Behaelter, den eine eigene Funktion spaeter fuellt. Sein Inhalt
   traegt noch die alte Optik; damit er nicht mitten im Glas klebt,
   bekommt er Luft nach unten und keine eigene Flaeche. */
.g-nachladen { margin-top:6px;padding-bottom:26px }
.g-sammlung-kacheln { display:grid;grid-template-columns:repeat(auto-fill,minmax(196px,1fr));gap:10px;margin-top:20px }
.g-sammlung-kachel { display:block;padding:16px 17px 17px;border-radius:22px;text-decoration:none;color:inherit;cursor:pointer }
.g-sammlung-kachelzahl { display:block;margin-top:10px;color:var(--g-ink-3) }
@media (max-width:430px) { .g-sammlung-kacheln { grid-template-columns:1fr } }

/* Die Marke am PDF-Link. Sie traegt Text, also gilt 4,5 und nicht 3,0 —
   und sie liegt auf DREI Schichten: Farbflaeche auf Glas auf Grund.
   Gerechnet (13.09.2026): hell 5,13 : 1, dunkel 4,61 : 1.
   Der erste Entwurf stand auf #0a5ec2 und trug hell nur 4,01 — dieselbe
   Farbe, die als Symbolton (.g-ton-0) ausreicht, weil dort 3,0 gilt. */
.g-sammlung-pdf { flex:0 0 auto;font-size:11.5px;font-weight:700;letter-spacing:.04em;padding:3px 8px;border-radius:7px;background:rgba(10,132,255,.14);color:#0a498a }
[data-theme="dark"] .g-sammlung-pdf { background:rgba(10,132,255,.22);color:#8eceff }

/* Hinter dieser Zeile liegt nichts. Sie ist kein Link, also bekommt sie
   auch keine Zeigehand und keine Aufhellung beim Ueberfahren — vorher sah
   sie aus wie die anderen, und man tippte ins Leere. Der Chip sagt es in
   Worten; die blassere Schrift allein waere Farbe als einziger Traeger. */
.g-sammlung .g-zeile--tot { cursor:default }
.g-sammlung .g-zeile--tot:hover { background:none }
.g-sammlung .g-zeile--tot .g-body-6 { color:var(--g-ink-2) }

/* Der Warnzustand steht im Zaehler, nicht in der Flaeche der Gruppe.
   Dieselben Tokens wie .g-chip--orange. Gerechnet: hell 5,04 : 1,
   dunkel 4,71 : 1 (mit dem korrigierten --g-orange-ink, siehe unten). */
.g-gruppe-zahl--warn { background:var(--g-orange-fl);color:var(--g-orange-ink) }
.g-ton-0 { background:rgba(10,132,255,.18);color:#0a5ec2 }
.g-ton-1 { background:rgba(52,199,89,.20);color:#1c6e35 }
.g-ton-2 { background:rgba(175,140,240,.22);color:#5b3ea8 }
[data-theme="dark"] .g-ton-0 { background:rgba(10,132,255,.22);color:#86c4ff }
[data-theme="dark"] .g-ton-1 { background:rgba(52,199,89,.22);color:#7bd4b6 }
[data-theme="dark"] .g-ton-2 { background:rgba(175,140,240,.24);color:#cbb4ff }
[data-theme="dark"] .g-mehr-bereiche:hover { color:var(--g-blau) }

/* ==========================================================================
   Dunkel. Nicht aus dem Entwurf — der hat keins — sondern gerechnet.
   Gemessen gegen die hellste Flaeche, weil heller Text dort am knappsten
   steht. Am 13.09.2026 nachgerechnet — und dabei stellte sich heraus, dass
   die hellste Flaeche NICHT die war, die hier stand: der Pruefstand hatte
   „Blatt ueber Blaukreis" angenommen, tatsaechlich ist es der gewaehlte
   Filterchip (.16) ueber dem Tuerkiskreis (.14) = rgb(62,79,85). Seit er
   jede Flaeche mit jedem Kreis durchrechnet, statt eine Paarung zu raten,
   kamen zwei Werte als zu schwach heraus:
     sekundaer #b3bcc4 4,41 → #b9c2ca 4,70
     rot       #ffa49b 4,46 → #ffaaa1 4,66
   Die uebrigen halten: primaer #eef3f6 7,60 · tertiaer #98a3ac 3,30 ·
   blau #86c4ff 4,59 · gruen #7bd4b6 4,83 · orange #f0b45c 4,60.
   (Ziel 4,5, fuer tertiaer 3,0.)
   Frueher schon aufgehellt: #6bb6ff, #5ec2a2 und #ff8a80 lagen bei 4,1 bis
   4,4 — unter hellem Glas sieht man den Unterschied sofort.
   ========================================================================== */
/* Der Overlay der Suche steht NICHT in einem .g-app.
   --------------------------------------------------------------------------
   domRender setzt ihn direkt in #domApp (Klasse "domapp view-search"), weil
   eine Befehlspalette ueber allem liegt und keine Seite ist. Damit endete
   die Vererbung der dunklen Tokens vor ihm: .g-glas3 wurde dunkel (die
   Regel haengt nicht an .g-app), --g-ink blieb beim hellen #1d1d1f aus
   :root. Ergebnis im Dunkelmodus: schwarze Schrift auf schwarzem Glas.
   Gemessen am 12.09.2026 im Browser, nicht vermutet.
   Deshalb bekommt .g-overlay dieselben Tokens wie .g-app. */
[data-theme="dark"] .g-app,[data-theme="dark"] .g-overlay { --g-bg:#0f151a;--g-ink:#eef3f6;--g-ink-2:#b9c2ca;--g-ink-3:#98a3ac;--g-ink-4:rgba(238,243,246,.30);--g-line:rgba(255,255,255,.08);--g-blau:#86c4ff;--g-blau-flaeche:linear-gradient(145deg,#2b7fd4,#12488f);--g-held:linear-gradient(145deg,#14559f,#08284f);--g-gruen:#34c759;--g-gruen-ink:#87e4c4;--g-gruen-fl:rgba(52,199,89,.18);--g-orange:#ff9f0a;--g-orange-ink:#fec46d;--g-orange-fl:rgba(255,159,10,.16);--g-rot:#ff453a;--g-rot-ink:#ffaaa1;--g-rot-fl:rgba(255,69,58,.16);--g-neutral:rgba(238,243,246,.16);--g-matrix-fl:#1a2128 }

/* Glas ist im Dunkeln aufgehelltes Weiss mit wenig Deckung, nicht Weiss mit
   viel. Die helle Innenkante oben wird zur zarten Aufhellung, der Schatten
   traegt nicht mehr — im Dunkeln hebt nur die Helligkeit eine Flaeche ab. */
[data-theme="dark"] .g-glas1 { background:rgba(255,255,255,.07);box-shadow:0 0 0 .5px rgba(255,255,255,.10),0 1px 0 rgba(255,255,255,.10) inset,0 14px 36px rgba(0,0,0,.45) }
[data-theme="dark"] .g-glas2 { background:rgba(255,255,255,.09);box-shadow:0 0 0 .5px rgba(255,255,255,.10),0 1px 0 rgba(255,255,255,.10) inset,0 8px 22px rgba(0,0,0,.38) }
[data-theme="dark"] .g-glas3 { background:rgba(255,255,255,.13);box-shadow:0 0 0 .5px rgba(255,255,255,.12),0 1px 0 rgba(255,255,255,.12) inset,0 32px 70px rgba(0,0,0,.55) }
[data-theme="dark"] .g-glas-matt { background:rgba(255,255,255,.05);box-shadow:0 0 0 .5px rgba(255,255,255,.09),0 1px 0 rgba(255,255,255,.08) inset }
[data-theme="dark"] .g-karte--still { background:rgba(255,255,255,.04);box-shadow:0 0 0 .5px rgba(255,255,255,.08),0 1px 0 rgba(255,255,255,.07) inset }

/* Die Farbkreise deutlich schwaecher: auf hellem Grund sind sie Farbe, auf
   dunklem waeren sie Leuchten — und Leuchten ist genau das, was auf einem
   iPad in der Sonne als Erstes verschwindet. */
[data-theme="dark"] .g-blob--blau { background:radial-gradient(circle,rgba(10,132,255,.16),transparent 66%) }
[data-theme="dark"] .g-blob--tuerkis { background:radial-gradient(circle,rgba(92,200,220,.14),transparent 66%) }
[data-theme="dark"] .g-blob--pfirsich { background:radial-gradient(circle,rgba(255,176,120,.13),transparent 66%) }
[data-theme="dark"] .g-blob--violett { background:radial-gradient(circle,rgba(175,140,240,.13),transparent 66%) }
[data-theme="dark"] .g-blob--gruen { background:radial-gradient(circle,rgba(52,199,89,.13),transparent 66%) }
[data-theme="dark"] .g-blob--orange { background:radial-gradient(circle,rgba(255,159,10,.12),transparent 66%) }

/* Aktive Zeile und Navigation: im Hellen weiss mit Schatten, im Dunkeln
   heller als die Umgebung — dieselbe Aussage, umgedrehte Mittel. */
[data-theme="dark"] .g-nav a.is-aktiv { background:rgba(255,255,255,.13);color:var(--g-blau);box-shadow:none }
[data-theme="dark"] .g-nav a { color:#b3bcc4 }
[data-theme="dark"] .g-reiter a.is-aktiv { background:rgba(255,255,255,.13);color:var(--g-blau);box-shadow:none }
[data-theme="dark"] .g-liste-zeile.is-aktiv { background:rgba(255,255,255,.14);box-shadow:none }
[data-theme="dark"] .g-knopf--glas { background:rgba(255,255,255,.10);color:var(--g-ink) }

/* Der Ersatz ohne backdrop-filter: im Hellen fast weiss, im Dunkeln fast
   schwarz — sonst bliebe auf alten Geraeten eine weisse Flaeche stehen. */
@supports not ((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))) {
  [data-theme="dark"] .g-glas1,[data-theme="dark"] .g-glas2,[data-theme="dark"] .g-glas3,[data-theme="dark"] .g-glas-matt { background:#1a2128 }
}

/* ==========================================================================
   Die Navigation des Handbuchs im Glas-Look.
   --------------------------------------------------------------------------
   Das Handbuch zeichnet ueber domNav() bereits eine Leiste — am Telefon
   unten, ab 820 px als Seitenleiste. Die Glas-Leiste des Entwurfs
   ZUSAETZLICH einzuschalten haette zwei Navigationen ergeben. Also bekommt
   die vorhandene den Look.

   Geaendert wird nur die Optik. Position, Richtung, Bruchpunkte und das
   Ausblenden per "nurbreit" bleiben, wo sie sind — sonst waeren acht
   Bruchpunkte nachzupruefen statt einer Farbe.

   ".domapp .g-dnav" statt ".g-dnav": Der Stilblock in dom.html steht im
   Dokument NACH diesem Stylesheet und gewaenne sonst bei gleicher
   Spezifitaet.
   ========================================================================== */
.domapp .g-dnav { background:rgba(255,255,255,.41);-webkit-backdrop-filter:blur(28px) saturate(205%);backdrop-filter:blur(28px) saturate(205%);border:0;border-radius:26px;box-shadow:0 0 0 .5px rgba(22,45,66,.14),0 1px 0 rgba(255,255,255,.9) inset,0 14px 36px rgba(20,40,60,.14) }
/* Ab 1000 px steht die Leiste am Rand und geht ueber die ganze Hoehe.
   Der Radius muss HIER weg, nicht in dom.html: '.domapp .g-dnav' ist
   spezifischer als das '.dnav' im Stilblock von dom.html und wuerde ein
   dort gesetztes 0 wieder ueberschreiben. Genau dafuer ist der doppelte
   Selektor da (siehe Kommentar oben) — er gilt in beide Richtungen.
   Der Schlagschatten legt sich nach RECHTS auf den Inhalt, nicht nach
   unten: die Leiste hat keine untere Kante mehr. */
@media (min-width:1000px) {
  .domapp .g-dnav { border-radius:0;box-shadow:0 0 0 .5px rgba(22,45,66,.14),0 1px 0 rgba(255,255,255,.9) inset,14px 0 36px rgba(20,40,60,.10) }
}
/* ==========================================================================
   Der Grund der Seite — und warum hier nichts mehr steht.
   --------------------------------------------------------------------------
   .domapp malte bis zum 15.09.2026 einen eigenen, deckenden Verlauf. Er lag
   UEBER dem Grund vom <html>, also lagen die Glasflaechen einer Ansicht auf
   einer flachen Flaeche statt auf den Farbkreisen — Glas auf Weiss,
   unsichtbar. Am 13.09.2026 im Browser gemessen: der Rahmen war 744 px
   breit und deckte die ganze Lesespalte.

   Die Antwort darauf war eine Klasse .domapp--glas, mit der hier zwei
   Regeln den Verlauf fuer Glas-Ansichten zurueckgenommen haben. Sie war der
   einzige Griff dieses Stylesheets in den Bestand.

   Am 15.09.2026 hat John gesehen, wozu die halbe Loesung fuehrt: Auf den
   nicht umgebauten Ansichten stand der Verlauf weiter — und weil .domapp
   die INHALTSSPALTE ist (1160 px breit, so hoch wie ihr Inhalt), war er
   dort ein Rechteck mitten auf der Seite, mit sichtbarer Kante an drei
   Seiten. Die eine Haelfte des Handbuchs stand auf dem richtigen Grund, die
   andere in einem Kasten.

   Jetzt malt .domapp gar nichts mehr. Der Grund der Seite steht am <html>,
   in beiden Modi, und gilt fuer alle Ansichten gleich. Damit ist die Klasse
   gegenstandslos und diese beiden Regeln mit ihr.
   Siehe claude/hintergrund-war-ein-kasten.md.
   ========================================================================== */

/* Der Kopf der Leiste traegt die Textfarben des Glas-Looks. */
.domapp .g-dnav .navmarktx b { color:var(--g-ink) }
.domapp .g-dnav .navmarktx i { color:var(--g-ink-3) }
[data-theme="dark"] .domapp .g-dnav .navmarktx b { color:#eef3f6 }
[data-theme="dark"] .domapp .g-dnav .navmarktx i { color:#98a3ac }
.domapp .g-dnav a { color:#4f545b;border-radius:14px }
.domapp .g-dnav a.on { color:#005bbb;background:rgba(255,255,255,.92);box-shadow:0 0 0 .5px rgba(22,45,66,.14),0 1px 0 rgba(255,255,255,.95) inset,0 4px 12px rgba(20,40,60,.10) }
.domapp .g-dnav .navgrp { color:var(--g-ink-3);font-size:10.5px;font-weight:700;letter-spacing:.1em;text-transform:uppercase }
.domapp .g-dnav .nbadge { background:rgba(255,159,10,.9);color:#3d2600 }
.domapp .g-dnav .nu { background:rgba(255,255,255,.86);border-radius:999px;box-shadow:0 0 0 .5px rgba(22,45,66,.14),0 1px 0 rgba(255,255,255,.95) inset,0 3px 10px rgba(20,40,60,.08) }
.domapp .g-dnav .navout { border-radius:999px }

/* Im Dunkeln ist Glas aufgehelltes Weiss mit wenig Deckung, nicht Weiss mit
   viel — dieselbe Aussage, umgedrehte Mittel. Die Textwerte sind dieselben
   wie im dunklen Tokenblock oben und dort gegengerechnet. */
[data-theme="dark"] .domapp .g-dnav { background:rgba(255,255,255,.07);box-shadow:0 0 0 .5px rgba(255,255,255,.10),0 1px 0 rgba(255,255,255,.10) inset,0 14px 36px rgba(0,0,0,.45) }
[data-theme="dark"] .domapp .g-dnav a { color:#b3bcc4 }
[data-theme="dark"] .domapp .g-dnav a.on { color:#86c4ff;background:rgba(255,255,255,.13);box-shadow:none }

[data-theme="dark"] .domapp .g-dnav .nu { background:rgba(255,255,255,.10);box-shadow:none }
[data-theme="dark"] .domapp .g-dnav .nbadge { background:rgba(255,159,10,.85);color:#231600 }

@supports not ((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))) {
  .domapp .g-dnav { background:rgba(255,255,255,.94) }
  [data-theme="dark"] .domapp .g-dnav { background:#1a2128 }
}

/* ==========================================================================
   Unterweisung: die uebernommenen Bausteine.
   --------------------------------------------------------------------------
   .g-app davor, weil .q, .opt, .btnP und .signame auch auf den noch alten
   Seiten vorkommen — ohne die Verschachtelung wuerde hier ueberall
   mitgefaerbt. Und .domapp davor, wo der Stilblock in dom.html sonst bei
   gleicher Spezifitaet gewaenne (er steht im Dokument spaeter).
   ========================================================================== */
.g-app .g-notfall { background:var(--g-rot-fl);color:var(--g-rot-ink) }
.g-app .g-merksatz { background:rgba(255,255,255,.62);border-left:4px solid var(--g-blau) }

/* Pflicht-Dokumente */
.g-app .pdfrow { display:flex;flex-wrap:wrap;gap:9px;margin-top:13px }
.domapp .g-app .pdfbtn { display:flex;align-items:center;gap:9px;font:inherit;font-size:14.5px;font-weight:600;cursor:pointer;padding:12px 15px;border-radius:16px;border:0;background:rgba(255,255,255,.72);color:var(--g-ink);box-shadow:0 0 0 .5px rgba(22,45,66,.14),0 1px 0 rgba(255,255,255,.9) inset,0 3px 10px rgba(20,40,60,.07) }
.domapp .g-app .pdfbtn.pflicht { background:var(--g-orange-fl);color:var(--g-orange-ink) }
.domapp .g-app .pdfbtn.gesehen { background:var(--g-gruen-fl);color:var(--g-gruen-ink) }
.g-app .pdfbtn svg { width:17px;height:17px;flex:0 0 auto }
.g-app .pdfmuss { font-size:11.5px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;opacity:.8 }
.g-app .pdfnote { font-size:13px;color:var(--g-ink-2);margin-top:10px;line-height:1.45 }

/* Fragen */
.g-app .g-quiz .q { margin-top:16px }
.g-app .g-quiz .q + .q { border-top:1px solid var(--g-line);padding-top:18px }
.g-app .qq { font-size:17px;font-weight:700;line-height:1.35;margin-bottom:12px }
.domapp .g-app .opt { display:flex;align-items:center;gap:13px;background:rgba(255,255,255,.7);border:0;border-radius:16px;padding:15px 17px;font-size:15.5px;margin-bottom:9px;cursor:pointer;box-shadow:0 0 0 .5px rgba(22,45,66,.14),0 1px 0 rgba(255,255,255,.9) inset }
.domapp .g-app .opt .mk { width:22px;height:22px;flex:0 0 auto;border-radius:999px;border:2px solid rgba(29,29,31,.22);background:transparent;display:flex;align-items:center;justify-content:center;color:transparent }
.domapp .g-app .opt .mk svg { width:13px;height:13px }
.domapp .g-app .opt.correct { background:var(--g-gruen-fl);color:var(--g-gruen-ink) }
.domapp .g-app .opt.correct .mk { background:var(--g-gruen);border-color:var(--g-gruen);color:#fff }
.domapp .g-app .opt.wrong { background:var(--g-rot-fl);color:var(--g-rot-ink) }
.domapp .g-app .opt.wrong .mk { border-color:var(--g-rot-ink) }
.g-app .expl { display:none;margin-top:6px;font-size:14px;color:var(--g-ink-2);line-height:1.5;padding:2px 4px 6px }
.g-app .expl.show { display:block }

/* Abschluss */
.g-app .g-abschluss .g-caption { margin-bottom:2px }
.domapp .g-app .signame { width:100%;box-sizing:border-box;font:inherit;font-size:16px;padding:13px 15px;border-radius:16px;border:0;background:rgba(255,255,255,.8);color:var(--g-ink);box-shadow:0 0 0 .5px rgba(22,45,66,.14),0 1px 0 rgba(255,255,255,.9) inset }
.domapp .g-app .domsig { display:block;width:100%;height:132px;margin-top:16px;border-radius:22px;touch-action:none;background:rgba(255,255,255,.78);box-shadow:0 0 0 .5px rgba(22,45,66,.14),0 1px 0 rgba(255,255,255,.9) inset,0 2px 10px rgba(20,40,60,.08) }
.g-app .sigbar { display:flex;justify-content:space-between;align-items:center;margin-top:11px;font-size:13px;color:var(--g-ink-2) }
.domapp .g-app .sigclr { font:inherit;font-size:14.5px;font-weight:600;border:0;background:transparent;color:var(--g-blau);cursor:pointer;padding:4px 6px }
.domapp .g-app .btnP { display:flex;align-items:center;justify-content:center;width:100%;box-sizing:border-box;font:inherit;font-size:16.5px;font-weight:700;cursor:pointer;margin-top:18px;padding:18px;border-radius:24px;border:0;color:#fff;background:var(--g-blau-flaeche);box-shadow:0 10px 24px rgba(0,73,173,.28) }
.domapp .g-app .btnP[disabled] { background:rgba(255,255,255,.5);color:var(--g-ink-3);box-shadow:none;cursor:default }

/* Das Unterschriftenfeld bleibt in BEIDEN Modi hell. Die Tinte ist dunkel
   und landet unveraendert auf dem Unterweisungsnachweis — also auf weissem
   Papier. Ein dunkles Feld hiesse: man unterschreibt und sieht nichts;
   helle Tinte hiesse: der Ausdruck ist leer. Bei einem Dokument, das
   gegenueber der Berufsgenossenschaft zaehlt, ist beides inakzeptabel.
   (Dieselbe Entscheidung wie im Bestand, siehe claude/handbuch-oberflaeche.md.) */
[data-theme="dark"] .domapp .g-app .domsig { background:#f4f7f9;box-shadow:0 2px 10px rgba(0,0,0,.35) }

[data-theme="dark"] .g-app .g-merksatz { background:rgba(255,255,255,.07) }
[data-theme="dark"] .domapp .g-app .pdfbtn { background:rgba(255,255,255,.09);color:var(--g-ink);box-shadow:none }
[data-theme="dark"] .domapp .g-app .opt { background:rgba(255,255,255,.08);box-shadow:none }
[data-theme="dark"] .domapp .g-app .opt .mk { border-color:rgba(238,243,246,.3) }
[data-theme="dark"] .domapp .g-app .signame { background:rgba(255,255,255,.10);color:var(--g-ink);box-shadow:none }
[data-theme="dark"] .domapp .g-app .btnP[disabled] { background:rgba(255,255,255,.08);color:var(--g-ink-3) }

/* ==========================================================================
   Die Personenspalte bleibt stehen.
   --------------------------------------------------------------------------
   Ohne sie scrollt man bei 14 Themen nach rechts und weiss nicht mehr, in
   wessen Zeile man ist — die Matrix beantwortet dann keine Frage mehr,
   sondern stellt eine. Der Hintergrund muss deckend sein, sonst scheinen die
   Punkte darunter durch; deshalb hier eine eigene Flaeche statt Glas.
   ========================================================================== */
.g-matrix-person { position:sticky;left:0;z-index:2;display:flex;align-items:center;gap:12px;min-width:0;margin:-15px 0;padding:15px 22px 15px 22px;background:linear-gradient(90deg,var(--g-matrix-fl) 80%,rgba(241,244,248,0)) }
/* Links denselben Einzug wie die Zeile — der Kopf setzt nur die
   senkrechten Abstaende zurueck, nicht den waagerechten. Vorher stand
   "PERSON" 22px links vom Bild darunter und klebte am Rand. */
.g-matrix-kopf .g-matrix-person { margin:0;padding:0 22px 0 22px }
.g-matrix-rolle { overflow-x:auto;overflow-y:auto;-webkit-overflow-scrolling:touch;scroll-padding-left:240px;flex:1;min-height:0 }

/* Der Hinweis, dass es rechts weitergeht. Ohne ihn merkt es nur, wer
   zufaellig wischt — und bei sieben sichtbaren von vierzehn Spalten ist das
   der Unterschied zwischen halber und ganzer Wahrheit. */
.g-matrix-mehr { margin:14px 2px 0;font-size:12.5px;color:var(--g-ink-3) }

[data-theme="dark"] .g-matrix-person { background:linear-gradient(90deg,var(--g-matrix-fl) 80%,rgba(26,33,40,0)) }


/* ==========================================================================
   Fest verdrahtetes Weiss, das im Dunkeln stehenblieb.
   --------------------------------------------------------------------------
   Diese vier Regeln setzen ihre Flaeche direkt auf rgba(255,255,255,...)
   statt ueber ein Token. Der Dunkelmodus-Test prueft Token auf Kontrast und
   sah sie deshalb nicht — aufgefallen ist es erst am Standbild: ein fast
   weisses Band unter der Matrix, graue Schrift darauf, unlesbar.

   test/glas-grundlage-test.js prueft das seitdem selbst.

   .g-balken--auf-farbe steht bewusst NICHT hier: der liegt auf dem
   Held-Verlauf, und der ist in beiden Modi dunkelblau.
   ========================================================================== */

[data-theme="dark"] .g-knopf--warn { background:rgba(255,159,10,.16);box-shadow:none }
[data-theme="dark"] .g-knopf[disabled] { background:rgba(255,255,255,.08);color:var(--g-ink-3);box-shadow:none }
[data-theme="dark"] .g-zeile:hover { background:rgba(255,255,255,.09) }
[data-theme="dark"] .g-zeile.is-aktiv { background:rgba(255,255,255,.15);box-shadow:none }
[data-theme="dark"] .g-gruppe-zahl { background:rgba(255,255,255,.10);color:var(--g-ink-3) }
/* Die Tastenmarke hatte nie eine dunkle Fassung — sie kam bisher ueber
   das Token durch. Seit sie einen eigenen hellen Wert traegt, braucht sie
   hier ihren eigenen dunklen, sonst steht dunkel auf dunkel (gemessen
   1,98). Gefunden hat es die bestehende Pruefung "jede Textfarbe traegt
   in BEIDEN Modi ueber 4,5" — genau dafuer ist sie da.
   --g-ink-2 statt --g-ink-3: auf der eigenen Fuellung traegt das Token
   nur 3,82, --g-ink-2 dagegen 5,44. */
[data-theme="dark"] .g-tastenmarke { color:var(--g-ink-2) }
/* Muss NACH der Zeile darueber stehen und dasselbe Gewicht tragen:
   [data-theme="dark"] .g-gruppe-zahl wiegt 0,2,0 und haette den
   Warnzaehler im Dunkeln wieder grau gemacht. Dieselbe Falle wie bei
   .domapp .g-dnav .nu am 13.09.2026. */
/* Der Dunkelmodus ist GEWAEHLT, nicht gespiegelt. Gerechnet gegen die
   unguenstigste dunkle Flaeche: --g-blau (#005bbb) traegt dort 1,44:1 —
   ein Balken, den man schlicht nicht sieht. #4da3ff traegt 3,58:1 und
   liegt damit ueber dem Ziel 3,0 fuer Grafik. Der Pruefstand rechnet es
   nach, mit den Werten aus diesen Dateien. */
[data-theme="dark"] .g-chip--still { background:rgba(255,255,255,.11);color:var(--g-ink-2) }
[data-theme="dark"] .g-marke--still { background:rgba(255,255,255,.11);color:var(--g-ink-2) }
[data-theme="dark"] .g-schalter i { background:rgba(128,138,148,.45) }
[data-theme="dark"] .g-schalter input:checked + i { background:#2fa85a }
[data-theme="dark"] .g-anruf-ergebnis { border-left-color:#86c4ff }
[data-theme="dark"] .g-anruf-sie { color:#86c4ff }
[data-theme="dark"] .g-telalle { color:#7cbcff }
[data-theme="dark"] .g-knopf--zurueckhaltend { color:var(--g-ink-3);background:rgba(255,255,255,.06) }
[data-theme="dark"] .g-dia-spur { background:rgba(77,163,255,.16) }
[data-theme="dark"] .g-dia-fuell { background:#4da3ff }
[data-theme="dark"] .g-stunde { background:#4da3ff }
[data-theme="dark"] .g-stunde--leer { background:rgba(77,163,255,.20) }
[data-theme="dark"] .g-nochmal { color:#7cbcff }
[data-theme="dark"] .g-gruppe-zahl--warn { background:var(--g-orange-fl);color:var(--g-orange-ink) }
[data-theme="dark"] .g-filter-chip { background:rgba(255,255,255,.09);color:var(--g-ink-2) }
[data-theme="dark"] .g-filter-chip.is-aktiv { background:rgba(255,255,255,.16);color:var(--g-blau);box-shadow:none }
[data-theme="dark"] .g-regel-nr { background:rgba(134,196,255,.18);color:#9fe3ff }
[data-theme="dark"] .g-blatt-fuss { background:rgba(255,255,255,.07);color:var(--g-ink-2) }
[data-theme="dark"] .g-messkasten { background:rgba(255,255,255,.10);box-shadow:0 1px 0 rgba(255,255,255,.10) inset,0 6px 18px rgba(0,0,0,.32) }

/* ==========================================================================
   Die Offen-Spalte bleibt auch stehen.
   --------------------------------------------------------------------------
   Sie ist die wichtigste Zahl der Zeile und stand hinter vierzehn
   Themenspalten ganz rechts — auf dem iPad also erst nach dem Scrollen
   sichtbar. Dieselbe Loesung wie bei der Personenspalte, nur andersherum:
   deckende Flaeche, damit die Punkte nicht durchscheinen, und der Verlauf
   laeuft nach links aus, weil von dort die Punkte heranscrollen.
   ========================================================================== */
.g-matrix-stand { position:sticky;right:0;z-index:2;text-align:right;margin:-15px 0;padding:15px 22px 15px 18px;background:linear-gradient(270deg,var(--g-matrix-fl) 76%,rgba(241,244,248,0)) }
.g-matrix-kopf .g-matrix-stand { margin:0;padding:0 22px 0 18px }
[data-theme="dark"] .g-matrix-stand { background:linear-gradient(270deg,var(--g-matrix-fl) 76%,rgba(26,33,40,0)) }
.g-matrix-rolle { scroll-padding-right:132px }

/* ==========================================================================
   Der Dunkelmodus war halb gemacht.
   --------------------------------------------------------------------------
   Nachgerechnet wurde jede Regel mit fester Farbe ohne dunkle Fassung.
   Fuenfzehn waren es, fuenf unlesbar — und am Standbild bewiesen: Die
   Schrittliste im Merkzettel blieb im Dunkeln ein HELLES Feld neben einer
   dunklen Spalte. Beim Dunkelmodus hatte ich .g-liste-zeile.is-aktiv
   bedacht und den Rest der Liste uebersehen.

   test/glas-grundlage-test.js rechnet das jetzt selbst nach, in beiden
   Modi, statt nur nach weissen Flaechen zu suchen.
   ========================================================================== */

/* Die Schrittliste im Merkzettel — der ganze Kasten, nicht nur die aktive Zeile */
[data-theme="dark"] .g-liste { background:rgba(255,255,255,.06);box-shadow:0 1px 0 rgba(255,255,255,.08) inset,0 12px 30px rgba(0,0,0,.4) }
[data-theme="dark"] .g-liste-zeile { background:rgba(255,255,255,.05) }
[data-theme="dark"] .g-liste-text { color:var(--g-ink) }

[data-theme="dark"] .g-haken { background:rgba(255,255,255,.13);box-shadow:none }

/* Der Zurueck-Knopf und die Initialen. Beide standen auf 2,4 — sichtbar nur,
   wenn man weiss, dass sie da sind. */
[data-theme="dark"] .g-rund { color:var(--g-ink-2) }
[data-theme="dark"] .g-avatar { background:rgba(255,255,255,.10);color:var(--g-ink-2) }
[data-theme="dark"] .g-nav .g-nav-zahl { color:var(--g-ink-2) }

/* ==========================================================================
   Der Grund liegt am <html>, nicht mehr hier.
   --------------------------------------------------------------------------
   Bis zum 13.09.2026 malte .g-app::before den Grund und jede Glas-Ansicht
   ihre eigenen Farbkreise. Das hatte zwei Folgen:

   1. Die 52 Ansichten OHNE .g-app hatten gar nichts dahinter. Seit die
      Navigationsleiste ueberall Glas ist, stand sie dort weiss auf weiss —
      und Glas, das man nicht sieht, ist keins.
   2. Grund und Kreise waren an sechs Stellen im Code verteilt. Wer eine
      Ansicht hinzufuegte und sie vergass, bekam wieder weiss auf weiss.

   Beides faellt weg: der Grund steht einmal am <html> (dom.html, oben im
   Stilblock), die Kreise sind Teil davon. .g-app traegt nur noch seinen
   eigenen Inhalt.

   .g-blob bleibt als Klasse bestehen, wird aber von keiner Ansicht mehr
   benutzt. Die Uebergabe sieht fuer die Offline-Ansicht einen Kreis nach
   Zustand vor (orange = kein Netz, gruen = verbunden). Auf dem neuen Grund
   geht das nicht mehr: der steht mit Blau .36 bereits an seiner Obergrenze,
   ein zweiter Kreis DARUEBER duerfte rechnerisch hoechstens .02 haben — das
   sieht niemand. Gemessen, nicht geschaetzt. Der Weg, wenn die Ansicht
   verdrahtet wird (heute kennt domRender keine „sync“-Ansicht): den
   Zustand als andere Fassung des GRUNDES zeigen, ueber ein Attribut am
   <html>. „Kein Netz“ ist ohnehin ein Zustand der ganzen App.
   Siehe claude/glas-wissen-und-leiste.md.
   ========================================================================== */

/* Der Inhalt muss ueber Grund und Flecken liegen. Ohne das verschwaende
   ein Farbfleck den Text, ueber dem er zufaellig liegt. */
.g-app > * { position:relative;z-index:1 }
/* Muss position:fixed WIEDERHOLEN: .g-app > * oben hat dieselbe
   Spezifitaet und steht spaeter — ohne das werden aus den Flecken Bloecke
   im Fluss, die den Inhalt um 740px nach unten schieben. */
.g-app > .g-blob { position:fixed;z-index:0 }
/* Dieselbe Falle, gleiche Wiederholung: Sollte eine Glas-Ansicht den
   Overlay je in sich tragen, naehme .g-app > * ihm position:fixed, und
   die Palette rutschte in den Textfluss — genau so ist es beim ersten
   Aufbau des Pruefbildes passiert. */
.g-app > .g-overlay { position:fixed;z-index:60 }

/* ==========================================================================
   Bruch & Schwund (public/dom-bruch.js). Nur Anordnung — Farben, Flaechen
   und Schrift kommen aus den vorhandenen Bausteinen, damit Hell und Dunkel
   ohne eigene Fassung stimmen. Einzige neue Farbe: die lila Marke, mit
   Dunkelfassung direkt darunter.
   ========================================================================== */
.g-br { display:flex;flex-direction:column;gap:12px;padding-bottom:28px }
.g-br .g-gruppe { margin-top:10px }
.g-br-raster { display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:12px }
.g-br-kachel { text-align:left;border:0;font:inherit;color:inherit;cursor:pointer;min-height:76px }
.g-br-kachel:active,.g-br-taste:active { transform:scale(.97) }
.g-br-gewaehlt { padding:12px 16px }
.g-br-scan { display:flex;flex-wrap:wrap;gap:10px;align-items:center }
.g-br-scan .g-feld { flex:1 1 200px;font-size:20px;letter-spacing:.04em }
.g-br-scanner { align-self:flex-start }
.g-br-suche { margin:0 }
.g-br-liste { display:flex;flex-direction:column;gap:8px }
.g-br-zeile { border:0;font:inherit;text-align:left;width:100% }
.g-br-breit { width:100% }
.g-br-fuss { padding:0 4px }
.g-br-zwei { display:flex;flex-wrap:wrap;gap:10px }
.g-br-zwei > span { flex:1 1 160px;display:flex;flex-direction:column;gap:4px;min-width:0 }
.g-br-zwei .g-auswahl { max-width:none }
.g-br-tasten { display:flex;flex-wrap:wrap;gap:10px;align-items:center }
.g-br-meld { margin:0 }
.g-br-unbekannt,.g-br-form,.g-br-export { display:flex;flex-direction:column;gap:8px }
.g-br-menge { display:flex;flex-direction:column;gap:14px }
.g-br-anzeige { display:flex;align-items:baseline;gap:10px;min-height:44px }
.g-br-block { display:grid;grid-template-columns:repeat(3,1fr);gap:10px;max-width:420px }
.g-br-taste { min-height:64px;font-size:26px;padding:0;border-radius:20px }
.g-br-foto { display:flex;flex-wrap:wrap;gap:12px;align-items:center }
.g-br-foto img,.g-br-bild { max-width:220px;max-height:220px;border-radius:16px;display:block }
.g-br-kamera { border-radius:20px;padding:10px;display:flex;flex-direction:column;gap:8px;align-items:flex-start }
.g-br-kamera video { width:100%;max-width:480px;border-radius:14px;background:#000 }
.g-br-buchung { display:flex;flex-direction:column;gap:4px;align-items:stretch }
.g-karte.g-br-buchung { flex-direction:row;align-items:center }
.g-br-zeile1 { display:flex;gap:12px;align-items:baseline }
.g-br-marken { display:flex;flex-wrap:wrap;gap:6px }
.g-br-marken:empty { display:none }
/* Storniert: durchgestrichen UND ein Chip mit Wort — nie nur die Linie. */
.g-br-storniert .g-br-name { text-decoration:line-through;opacity:.62 }
.g-br-dia-name { flex:0 0 40%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap }
.g-br-dia-zahl { flex:0 0 92px }
.g-br-stammzeile { display:flex;flex-direction:column;gap:8px }
.g-br-haken-reihe { display:flex;flex-wrap:wrap;gap:6px 16px }
.g-br-haken { display:inline-flex;align-items:center;gap:8px;font-size:15px;min-height:36px;cursor:pointer }
.g-br-haken input { width:20px;height:20px }
.g-br-tabelle { overflow-x:auto }
.g-br-tabelle table { border-collapse:collapse;font-size:13px;width:100% }
.g-br-tabelle th,.g-br-tabelle td { text-align:left;padding:5px 8px;border-bottom:1px solid var(--g-line);white-space:nowrap }
.g-br-fehlerliste { margin:0;padding-left:18px }
.g-br-prot { padding:10px 16px }
.g-marke--lila { background:rgba(175,82,222,.16);color:#5a2178 }
[data-theme="dark"] .g-marke--lila { background:rgba(191,90,242,.24);color:#e2b8f7 }
@media (max-width:520px) {
  .g-br-raster { grid-template-columns:1fr }
  .g-br-block { max-width:none }
}

/* ==========================================================================
   Protokolle einstellen (der HACCP-Editor der Leitung)
   --------------------------------------------------------------------------
   17.09.2026, John: „Ganz in Glas + feste Speicherleiste". Die Zeilen sind
   dieselben Bauteile wie auf der Protokollseite (.g-hz, .g-hzkopf,
   .g-haccp-anlage, .g-feld, .g-auswahl) — ein Schritt soll im Editor so
   aussehen wie dort, wo er abgehakt wird.

   Die Leiste steht als letztes Kind IN .g-rolle. Ab 1000px ist .g-rolle
   der Roller (siehe Rollkette), dort klebt sie mit sticky am unteren Rand,
   hat dieselbe Breite wie die Karten, und die Zeilen laufen unter dem Glas
   durch. Darunter rollt das Fenster; .g-app hat overflow:hidden, damit
   greift sticky nicht, also fixed. Der Inhalt bekommt dann unten Platz,
   sonst laege die letzte Zeile unter der Leiste.
   ========================================================================== */
.g-hed-hinweis { margin-top:12px;max-width:none }
.g-hed-hinweistext { margin:0 }
.g-hed-hinweisknopf { margin-top:10px }
.g-hed-kopf { display:flex;align-items:center;gap:12px;padding-top:28px }
.g-hed-kopf .g-chip { flex:0 0 auto }
.g-hed-kaputt .g-fuss { color:var(--g-ink-3) }
.g-hed-geprueft { margin:8px 2px 0;color:var(--g-ink-3) }
.g-hed-blatt { display:block;border-radius:24px;padding:16px 17px 18px;margin-top:12px }
.g-hed-neu { margin:2px 0 6px }
.g-hed-zeile { transition:opacity .25s ease }
/* Abgeschaltet heisst: steht nicht im Blatt. Blasser, aber lesbar — man
   muss es wiederfinden koennen, um es einzuschalten. */
.g-hed-zeile--aus { opacity:.55 }
.g-hed-text { text-wrap:pretty }
.g-hed-eigenkopf { flex-wrap:wrap }
.g-hed-name { flex:1 1 220px }
.g-hed-felder { display:flex;flex-wrap:wrap;align-items:flex-end;gap:10px 12px;margin-top:10px }
.g-hed-feld { display:flex;flex-direction:column;gap:4px;min-width:0 }
.g-hed-feld--text { flex:1 1 170px }
.g-hed-feld--schmal { flex:1 1 110px }
.g-hed-etikett { color:var(--g-ink-3);padding-left:4px }
.g-hed-takt { width:auto;min-width:180px }
.g-hed-zahl { flex:0 0 auto;width:96px }
.g-hed-einheit { padding:0 0 11px;color:var(--g-ink-3) }
.g-hed-std { display:flex;flex-wrap:wrap;align-items:center;gap:8px 12px;margin-top:10px;padding-top:10px;border-top:1px solid var(--g-line) }
.g-hed-std[hidden] { display:none }
.g-hed-std .g-fuss { color:var(--g-ink-3) }

.g-hed-leiste { display:flex;align-items:center;gap:14px;border-radius:24px;padding:12px 12px 12px 20px;margin:12px 0 14px;position:sticky;bottom:14px;z-index:5 }
.g-hed-leiste[hidden] { display:none }
/* Dichter als .g-glas2: Auf dieser Leiste steht Text, und darunter laufen
   Zeilen mit Text durch. Bei .g-glas2 im Dunkeln (Alpha .09) war
   „Leitungen durchspuelen" durch „Alles gespeichert" hindurch zu lesen.
   Aus dem Grund-Token gemischt, damit beide Modi mitkommen; zwei Klassen,
   damit es die dunkle .g-glas2-Regel schlaegt. */
.g-hed .g-hed-leiste { background:color-mix(in srgb,var(--g-bg) 86%,transparent) }
.g-hed-stand { color:var(--g-ink-3) }
.g-hed-leiste--offen .g-hed-stand { color:var(--g-orange-ink) }
.g-hed-msg { max-height:30vh;overflow-y:auto;color:var(--g-ink-3);margin-top:2px }
.g-hed-msg:empty { display:none }
.g-hed-msg--fehler { color:var(--g-rot-ink) }
.g-hed-msg--ok { color:var(--g-gruen-ink) }
.g-hed-speichern { flex:0 0 auto;min-height:48px;padding:0 28px }
@media (max-width:999px) {
  .g-hed .g-rolle { padding-bottom:120px }
  .g-hed-leiste { position:fixed;left:18px;right:18px;bottom:calc(14px + env(safe-area-inset-bottom));z-index:30;margin:0 }
}
/* Unter 700px schwebt die Navigation unten (.dnav: sticky, bottom 8px,
   62px hoch, 18px vom Rand — gemessen am 17.09.). Die Leiste steht
   darueber, in derselben Flucht, sonst verdeckt der Reiter „Hilfe" den
   Speichern-Knopf. Kein safe-area hier: die Navigation rechnet es auch
   nicht, und beide sollen zusammen stehen bleiben. */
@media (max-width:699px) {
  .g-hed-leiste { bottom:80px }
}
/* Der Hilfe-Knopf (.hfab, fest rechts unten, 88px ueber dem Rand, 48px
   gross) sass unter 700px genau auf „Speichern". Solange die Leiste steht,
   rueckt er ueber sie. :has statt eines Schalters in dom.html — die Regel
   gilt, solange die Leiste da ist, und niemand muss sie zuruecksetzen. */
@media (max-width:999px) {
  body:has(.g-hed-leiste:not([hidden])) .hfab { bottom:100px }
}
@media (max-width:699px) {
  body:has(.g-hed-leiste:not([hidden])) .hfab { bottom:166px }
}
/* 700–999px: Die Navigation steht oben, 50px vom Rand (24 Rand + 26
   Polster von .domapp). Die Leiste unten nimmt dieselbe Flucht. */
@media (min-width:700px) and (max-width:999px) {
  .g-hed-leiste { left:50px;right:50px }
}
@media (max-width:520px) {
  .g-hed-zahl { width:84px }
  .g-hed-takt { min-width:0;width:100% }
  .g-hed-feld:first-child { flex:1 1 100% }
  .g-hed-speichern { padding:0 20px }
  .g-hed-stand { font-size:15px }
}
