/* DIE Hauptschrift der App (24.10.2026) - siehe schrift.js. --f-text: Fliesstext, Knoepfe, Zahlen; --f-kopf: Ueberschriften
   (heute dieselbe Schrift; steht hier getrennt, damit "Ueberschrift anders als Text" ein Wert ist und keine Umbauarbeit). */
:root {
  --f-text: 'Rubik', 'Rubik Fallback', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
  --f-kopf: var(--f-text);
}
@font-face {
  font-family: 'Rubik';
  font-style: normal;
  font-weight: 400 700;
  font-display: swap;
  src: url(/f/rubik-latin-ext.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
  size-adjust: 102%;
  ascent-override: 102.94%;
  descent-override: 34.31%;
  line-gap-override: 9.8%;
}
@font-face {
  font-family: 'Rubik';
  font-style: normal;
  font-weight: 400 700;
  font-display: swap;
  src: url(/f/rubik-latin.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
  size-adjust: 102%;
  ascent-override: 102.94%;
  descent-override: 34.31%;
  line-gap-override: 9.8%;
}
/* Ersatzschrift fuer die Zeit, bis die Datei da ist: Arial, auf die Textbreite und die senkrechten Masse der echten Schrift
   gezogen (size-adjust & Co.) - dann springt beim Tausch nichts. Rechnung: tools/metrik.py, Haeufigkeit deutscher Buchstaben. */
@font-face {
  font-family: 'Rubik Fallback';
  src: local('Arial'), local('ArialMT');
  size-adjust: 107.61%;
  ascent-override: 97.58%;
  descent-override: 32.53%;
  line-gap-override: 9.29%;
}
@font-face {
  font-family: 'Anton';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(/f/anton-400-latin.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Archivo Black';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(/f/archivo-black-400-latin.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Fraunces';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url(/f/fraunces-500-latin-ext.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: 'Fraunces';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url(/f/fraunces-500-latin.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Source Serif 4';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(/f/source-serif-4-400-latin.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Source Serif 4';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url(/f/source-serif-4-600-latin.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Source Serif 4';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url(/f/source-serif-4-700-latin.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

:root {
  /* Vintage-Retro nach Mathieus Vorlage (06.09.2026: "das ist fast zu 100%
     wie ich will das die app aussieht"). Warmes Creme als Papier, gedecktes
     Marine fuer die dunklen Bloecke, Tuerkis als Signalfarbe - dazu
     Salbei, Waldgruen, Pfirsich und Senf als Kartenfarben.

     Der wichtigste Wechsel: --accent war die Marken-Navy und ist jetzt
     Tuerkis. Alles, was "hier klicken / das ist aktiv" heisst - Knoepfe,
     der offene Tag im Streifen, der aktive Menuepunkt, die Haupt-Kachel -
     wird damit tuerkis. Die dunklen Flaechen (Deckblock, Kennzahlen) haben
     mit --deep eine eigene Farbe bekommen, weil sie eben KEINE Aktion sind:
     vorher haben sich beide dieselbe Variable geteilt, und mit Orange als
     Aktionsfarbe waere daraus eine ganze Seite in Orange geworden. */
  --bg: #F5EEE1;
  --surface: #FDF8EF;
  --surface-2: #EFE4D2;
  --surface-3: #E4D6BE;
  --border: #E3D6C0;
  --border-strong: #C8B698;
  /* Rand der Eingabefelder (15.10.2026): vorher --hair-strong mit 1,38:1 -
     ein leeres Feld war kaum zu sehen. #8A8F94 hat 3,08:1 gegen die Karte
     (WCAG 1.4.11: Rand eines Bedienelements mindestens 3:1). */
  --feldrand: #8A8F94;
  /* Seit dem Dunkelmodus der Planung (25.10.2026) als Namen, was vorher fest in Regeln stand. --balken: die neutralen Balken der
     Diagramme (Verlauf auf Heute) - vorher --border-strong mit 1,87:1 gegen die Karte, fuer eine Diagrammmarke gilt 3:1; jetzt 3,08:1. */
  --balken: #8A8F94;
  --strich-aus: #C4B69E;
  --chip-flaeche: #FFFFFF;
  --schleier-blatt: rgba(20, 24, 35, .42);
  --schatten-leiste: 0 -8px 22px rgba(16, 24, 32, .1);
  /* Diese vier setzt der Nachtmodus der Team-App NICHT um (und Welt 1 auch nicht): die Team-App sieht damit genau aus wie vorher, nur die
     Planung im Dunkeln setzt eigene Werte (stil-dunkel.js). */
  --feier-gruen: #42714A;
  --fehler-ring: rgba(163, 49, 42, .18);
  --deep-ink-leise: rgba(251, 245, 234, .72);
  /* Die Zeichen der Bereiche im Hub (18.09./05.10.2026, gemessen in kontrast.test.js) und die Schrift auf dem News-Band - bewusst in
     beiden Modi derselbe Wert, wie vorher fest in den Regeln. */
  --abz-bar: #866AD2;
  --abz-kueche: #238B72;
  --abz-event: #C954A6;
  --news-band-ink: #FFFFFF;
  /* Trennlinien durchscheinend statt deckend: eine Haarlinie liest sich
     deutlich leichter als eine volle Linie - das ist der auffaelligste
     Unterschied zwischen "Formular" und "Liste". */
  --hair: rgba(44, 58, 71, .11);
  --hair-strong: rgba(44, 58, 71, .18);
  --fill: rgba(44, 58, 71, .055);
  --text: #2C3A47;
  --text-soft: #2C3A47;
  /* #6B7883 war zu hell: gemessen 3,92:1 auf --bg, 4,28 auf --surface, 3,60
     auf --surface-2 und 3,16 auf --surface-3 - alle unter den 4,5:1, die
     Text braucht. #525B64 ist dieselbe Farbfamilie, nur dunkler, und kommt
     auf dem schlechtesten Grund auf 4,82:1. Der Nachtmodus war in Ordnung
     (5,59 bis 7,53:1) und bleibt, wie er ist. */
  /* Die vier Bereichstoene der Startseite (Mathieu, 15.09.2026: "lass uns die
     startseite etwas farbenfroher machen mit schöne Pastel farben ... das die
     verschiedenen bereiche besser getrennt sind", danach "Bau gerne A").

     GRUNDSATZ: Pastell ist Papier, keine Aussage. Die gesaettigten Farben
     dieser App bedeuten schon etwas - Orange "das geht dich jetzt an", Gruen
     "ich mache das", Gold Kueche, Rot Allergie, und Blau ist tabu (Lab
     Coffee). Kaemen fuenf kraeftige Toene dazu, hoerte keiner dieser Toene
     mehr zu. Deshalb 5 bis 8 Prozent Saettigung: sie trennen die Bereiche
     und reden nicht mit. Die Signalkarte bleibt das Lauteste auf der Seite -
     daran sind die Toene gemessen, in beiden Modi.

     Honig = dein Tag, Salbei = deine Woche, Flieder = Aufgaben,
     Rosé = was los ist. */
  /* SEIT DEM 05.10.2026 AUCH IN DER PLANUNG: kein Orange, kein Gold, zwei
     Signalfarben (Mathieu: "Ja, mach das Backend auch so", nach der
     Mitarbeiter-App: "nimm im hellen Modus auch das Orange raus. Ersetze
     es" - gewaehlt "Nimm 2 Marine getoent"). Was unten ueber Signalorange,
     Gold und die Bereichsfarben steht, ist die Geschichte dieser Werte; die
     Werte selbst sind jetzt: Wahl = Marine getoent, knapp = Rot wie
     kritisch, Gold = Grau ("wartet", "zu viel"), Bereiche = Grau. */
  --p-tag: #E3EEDA;   --p-tag-ink: #2F5E34;
  --p-woche: #F1EDE6; --p-woche-ink: #525B64;
  --p-hub: #F1EDE6;   --p-hub-ink: #525B64;
  --p-event: #F1EDE6; --p-event-ink: #525B64;
  --muted: #525B64;
  /* Die vierte Stufe der Tinte: „ausgeblendet". Nach Mathieus Vorbild-Blatt
     (09.09.2026) ist Schrift EINE Tinte in Deckkraft-Stufen - 100 / 87 / 64 /
     36 %. Beim Nachmessen stand heraus, dass die App die ersten drei schon
     hat, nur ohne Namen: --text ist 100 %, --text-soft 87 %, --muted 64 %.
     Die vierte fehlte, und ausgeblendete Zeilen behalfen sich mit
     "opacity: .62" an der GANZEN Zeile - das nimmt auch den Raendern und
     Knoepfen die Deckung mit. */
  /* 18.10.2026 (Pruefung F13): #8A8F94 hatte auf Creme nur 3,08:1 - und er steht
     an TEXT (ausgeblendete Personen "Adieu Bar", "noch nicht", leise Tabellenzeilen,
     ca. 80 Stellen). #666D74 kommt auf der Karte auf 4,96:1, auf dem Papier auf
     4,54:1 und bleibt sichtbar heller als --muted (#525B64): die vierte Stufe
     "ausgeblendet" gibt es weiter. Der RAND der Eingabefelder bleibt --feldrand
     (#8A8F94): fuer Umrisse reichen 3:1. */
  --text-aus: #666D74;
  /* Das "+" in der Woche und der gestrichelte Rand der Avatare bei "wartet"/"frei" (16.10.2026): vorher 1,86:1 bzw. 1,87:1, unter den 3:1 fuer Bedienelemente. */
  /* 18.10.2026: das "+" ist ein Zeichen, also TEXT - #747A82 hatte 4,09:1, #6B7279 hat 4,61:1. */
  --plus: #6B7279;
  /* Gruppenfarben des Team Hubs (16.10.2026). Mathieu: "Finde die Richtung gut.
     Maybe nicht ganz so viele Farben, sondern man fasst Bereiche wie Bestellung,
     To-Dos etc. in Kategorien zusammen ... Soll nicht ganz so bunt sein, aber mehr
     als nur Grau." Danach, nach vier Farben: "Ich finde, das sind immer noch zu
     viele Farben." - und zu den Vorschlaegen: "Ich finde zwei Farben am besten."
     Zwei gedaempfte Farben, der Name steht immer daneben:
       Haselnuss (tun)    To-Dos, Checklisten, Bestandsabgleich, Bestellung, Bestaende
       Petrol (wissen)    Nachschlagen, Hand Outs, Events   (Torten seit 17.10.2026 bei Haselnuss, Mathieu: "Mach Torte auch in der selben Farbe wie To-Dos")
     News bleibt Rosa-Rot (25.09.2026). Kein Gruen, kein Rot, kein Blau: gemessen
     mindestens dE2000 18 zu Gruen, Rot, News und Marine, 32 untereinander
     (gruppenfarben.test.js). Bar, Kueche und Office bleiben grau (05.10.2026). */
  --g-tun-ink: #6F5242; --g-tun-tint: #F7ECE7; --g-wissen-ink: #006A70; --g-wissen-tint: #DCF3F4; --g-auf: #FFFFFF;
  /* EINE TINTE (Mathieu, 08.09.2026: "dann bau deinen vorschlag so ein").
     Die Handlungsfarbe ist das CI-Marine selbst - #283045, die echte
     Markenfarbe von Adieu.

     Warum keine fuenfte Farbe mehr: Terrakotta, Kobalt und Tuerkis sind
     der Reihe nach durchgefallen. Beim Nachrechnen war klar, warum. Der
     Farbkreis ist voll - Rot ist "fehlt" (32 Grad), Gold ist "wartet"
     (84), Gruen ist "bestaetigt" (146), Marine ist Struktur (259), dazu
     Kueche (64) und Office (347). Frei sind zwei schmale Zonen. Jede
     fuenfte Farbe muss sich dazwischen durchquetschen und wirkt darum
     beliebig. Bordeaux waere fuer eine Bar naheliegend gewesen und liegt
     19 Grad vom "fehlt"-Rot: Weinrot und Fehler waeren dieselbe Farbe.

     Und ein Fund beim Nachrechnen: die App hat das CI-Marine nie benutzt.
     Sie hatte #2C3A47 - aehnlich, aber nicht dieselbe Farbe. Die
     Markenfarbe kam im ganzen Produkt nicht vor.

     Der Preis dieses Weges, offen benannt: im Hellen ist die Handlung vom
     Text nicht zu unterscheiden - #283045 gegen #2C3A47 sind 1,13:1. Die
     Handlung kann also NICHT ueber den Ton gesagt werden, nur ueber die
     FORM. Daran haengt der ganze Entwurf, und er faellt, wenn die
     Disziplin rutscht:
       gefuellt        = das eine Wichtige (Hauptknopf, heute)
       umrandet        = kannst du machen (Schicht nehmen, zweiter Rang)
       unterstrichen   = Link im Text
       leise / Tinte   = Struktur, keine Handlung
     Das sind die drei Knopfraenge, die im Styleguide stehen und uns
     gefehlt haben. Im Dunkeln traegt der Ton wieder: #A9B6CC gegen creme
     #F0E9DA sind 1,69:1 und unterscheidbar.

     Kontraste: als Schrift 12,4:1 auf der Karte, creme auf der Flaeche
     ebenfalls 12,4:1, auf der Toenung 9,9:1. Naechste Statusfarbe 111
     Grad entfernt - weiter weg als jede Farbe, die wir probiert haben. */
  --accent: #283045;
  --accent-hover: #1A2031;
  /* Die Toenung ist der einzige Ort, an dem die Handlung im Hellen ohne
     Form erkennbar ist - deshalb ein blaugrauer Papierton, nicht Creme.
     (Vorher #F7DFCF - genau der Wert, der auch in der Toenung von
     "kritisch" stand. "Hier tippen" und "kritisch" teilten sich also eine
     Flaeche. Der Variablenname steht hier bewusst ohne Doppelpunkt
     dahinter: der Palette-Test liest einen Variablennamen mit Doppelpunkt
     als Deklaration, auch im Kommentar, und frisst dann alles bis zum
     naechsten Semikolon - also die naechste echte Variable mit. Das ist
     mir in dieser Sitzung viermal passiert, einmal sogar in dem Satz, der
     davor warnen sollte.) */
  --accent-soft: #DDE0E8;
  --accent-ink: #FDF8EF;
  /* --- WAS GERADE OFFEN IST (Mathieu, 09.09.2026) -------------------------
     „bei Checklisten die Auswahl welche Liste man gerade angeklickt hat
     nicht gut hervor" — gemessen war es schlimmer als eine Farbfrage: die
     offene Liste war ÜBERHAUPT nicht markiert, ihre Zeile sah aus wie jede
     andere. Und die Tönung, mit der die App sonst „das betrifft dich" sagt,
     kommt im Dunkeln auf 1,42:1 gegen die Karte - eine Fläche kann das dort
     nicht tragen.
     Deshalb eine eigene Farbe, die NUR eines sagt: „das hier ist gerade
     offen". Sie kommt als 4-px-Kante plus Tönung plus Name im Ton - die
     Kante macht die Arbeit, die Fläche macht das Feld.
     Das bricht „Eine Tinte" nicht: Handlung bleibt Marine und wird durch die
     FORM gesagt. Dies ist ein ZUSTAND, kein Knopf, und er ist je Seite
     genau einmal da.
     SIGNALORANGE, von Mathieu gewählt (09.09.2026, aus neun Vorschlägen).
     Er hat sich vorher Referenzen angesehen - satte, flächige Apps - und
     danach entschieden.
     Der bekannte Preis, offen benannt: 5 Grad von der Kuechen-Farbe (30°)
     und 22 von Rot = "fehlt" (3°). Tragfaehig ist es, weil die Kueche ein
     LEISES Braun ist (#C79A6E) und dieses Orange laut - und weil eine
     Auswahl je Seite genau einmal vorkommt, ein Status aber ueberall.
     Die anderen Vorschläge, alle nachgerechnet, falls es doch wandert:
       Kobalt  hell #1358B8 / #DCE7F8   dunkel #7FBBFF / #244463
       Türkis  hell #0E7A66 / #D6F0E9   dunkel #5CDCC2 / #1B4741
       Kupfer  hell #A0500C / #FBE3CE   dunkel #FFB275 / #5F3D1E
       Messing hell #8A6A12 / #F6E9C4   dunkel #F5D468 / #52411B
       Kirsche hell #A8123C / #F9D3DE   dunkel #FF7A99 / #4E2130
       Senf    hell #7A5809 / #F7E6B8   dunkel #EFC03A / #4A3A12
       Limette hell #4E680B / #DCEFA8   dunkel #C6EE55 / #3A4A16
       Pflaume hell #5B2C9E / #E6DCFA   dunkel #C39BFF / #39285F
     Die dunklen Töne sind eine Stufe heller als mein erster Entwurf: der
     NAME steht im Wahlton auf der Tönung, und mit #5FA8FF auf #244463 waren
     das 4,10:1 - unter den 4,5, die Schrift braucht. Der eigene Test hat das
     gefunden, nicht das Auge. Heller machen statt die Tönung zurücknehmen:
     die Tönung ist das Feld, das Mathieu sehen will. */
  /* Ein Tag, an dem etwas laeuft: getoente Flaeche plus Punkt (Mathieu,
     10.09.2026: "Getönte Kachel und Punkt finde ich für Events gut"). Steht
     an der Wurzel und nicht am Kalender, weil zwei Stellen ihn brauchen -
     der Monatskalender im Backend und der Wochenblock der Startseite. Er lag
     bis zum 11.09.2026 in .plankalender; die Regel im Wochenblock griff
     deshalb NICHT, ohne dass etwas kaputt aussah: eine unbekannte Variable
     macht aus box-shadow ein stilles "none". Nur an der Messung zu sehen. */
  --event-ton: rgba(40, 48, 69, .11);
  --event-ton-stark: rgba(40, 48, 69, .17);
  --wahl: #283045;
  /* Die Toenung ist am 11.09.2026 von #FBDFC8 auf #FFDDC0 gerueckt. Grund
     war eine Messung, nicht ein Eindruck: der einzige wirklich knappe Abstand
     im ganzen Farbsystem lag hier, zwischen diesem blassen Pfirsich und der
     blassen Rot-Toenung (#F3D8D4) - zwei Baender hintereinander in derselben
     Liste, DeltaE2000 8,5. Jetzt sind es 10,1, und zum Gold-Band sind es
     unveraendert 10,2.
     Die Farbe SELBST bleibt Signalorange - Mathieu hat sie aus neun
     Vorschlaegen gewaehlt, und daran aendert sich nichts. Verschoben ist nur
     die Toenung, und zwar um 2,3: nebeneinander sichtbar, im Gebrauch
     dieselbe Farbe.
     Bewusst NICHT weiter: ein kraeftigeres Band trennt besser (bis 13,1
     waeren drin), kostet aber den Namen im Wahlton darauf - er faellt dann
     auf 4,52 und klebt an der 4,5-Grenze. So bleiben es 5,13, also dieselbe
     Luft wie vorher. Im Dunkeln war nichts zu tun: dort stehen die
     Toenungen schon 13,2 und 12,1 auseinander. */
  --wahl-soft: #DDE0E8;
  --wahl-ink: #FDF8EF;
  /* Echtes, eigenstaendiges Rot NUR fuer die News-Karte (Mathieu, 25.09.2026:
     "Rot NUR fuer News, bewusst als einzige Ausnahme von der einen
     App-Signalfarbe. Ab jetzt bedeutet Rot 'News'"). Bewusst NICHT --crit
     wiederverwendet, obwohl das die einzige andere rote Farbe im System ist:
     --crit steht auf zwei Dutzend Fehler-/Kritisch-Stellen (Fehlerbanner,
     "wenig Bestand", Notfall-Nummer) - eine News in derselben Farbe saehe aus
     wie eine Fehlermeldung. Der Farbton ist deshalb 18 Grad von --crit weg
     gedreht (Richtung Himbeere/Karmesin statt Feuerwehrrot) - derselbe
     Abstand, den Mathieu am 09.09.2026 schon fuer "ein echtes Rot" gegenueber
     dem alten Terrakotta fuer ausreichend befunden hat. Kontrast Schrift auf
     Toenung nachgerechnet: 5,51:1 hell, 5,47:1 dunkel - beides ueber 4,5. */
  --news: #A61E45;
  --news-soft: #F7D9DE;
  /* Rote FLAECHE mit weisser Schrift (News-Karte, 13.10.2026): hell das
     News-Rot selbst (7,3:1), dunkel ein eigenes, weil Weiss auf dem
     Rosa-Rot dort nur 2,7:1 haette - #C8325A hat 5,2:1. */
  --news-band: #A61E45;
  /* Die dunkle Flaeche: Deckblock, Kennzahlen-Kacheln, alles Ruhige. */
  --deep: #2C3A47;
  --deep-hover: #223038;
  --deep-ink: #FBF5EA;
  /* Nur fuer den "Schicht eintragen"-Knopf. Kontrast zur cremen Schrift
     darauf: 5,4:1 - nachgerechnet, nicht geschaetzt. */
  --gruen: #42714A;
  --gruen-hover: #35603D;
  --gruen-ink: #FFF8EE;
  /* Gold bleibt unser weicheres Messing statt des satten Senfs aus der
     Vorlage - es steckt in jedem Icon, und satter Senf war dort schon
     eine Farbe zu viel. Salbei, Waldgruen und Pfirsich standen hier auch
     mal als eigene Kartenfarben; sie sind wieder raus (siehe .tile), und
     unbenutzte Variablen bleiben nicht stehen. */
  --gold: #B8BEC6;
  --gold-soft: #ECE9E3;
  /* Bereichsfarben fuer Bar und Kueche (Mathieu, 07.09.2026: "trenne Kueche &
     Bar farblich und praesenter").
     Bewusst KEINE der Statusfarben: Gold heisst "wartet", Gruen "bestaetigt",
     Tuerkis "hier klicken / heute", Rot "fehlt". Nimmt ein Bereich eine
     davon, bedeutet dieselbe Farbe an zwei Stellen zwei verschiedene Dinge,
     und die Ampel im Raster darunter ist nicht mehr lesbar.
     Uebrig bleiben zwei dunkle, warme Toene aus derselben Familie: das
     Marine der App fuer die Bar (der dunkle Tresen) und ein Lehmbraun fuer
     die Kueche. Beide tragen creme Schrift, beide sind vom hellen
     Tuerkis klar zu unterscheiden. */
  --bar: #525B64;
  --kueche: #525B64;
  /* Office als dritter Bereich (Mathieu, 07.09.2026). Wieder KEINE
     Statusfarbe: Gold heisst "wartet", Gruen "bestaetigt", Tuerkis "hier
     klicken", Rot "fehlt". Uebrig bleibt ein dunkles, warmes Pflaume - aus
     derselben Familie wie das Marine der Bar und das Lehmbraun der Kueche,
     und von beiden klar zu unterscheiden. */
  --office: #525B64;
  /* Vier Farben fuer PERSONEN in der Kuechenplanung (Mathieu, 09.09.2026:
     "dann bekommen die quasi in diese Tabelle jeweils eine eigene Farbe").
     Hier ist Farbe ausnahmsweise Information und nicht Handlung.
     Die Palette war eng: Tuerkis heisst "Menge" (das Bedarfsraster steht auf
     derselben Seite), Lehmbraun IST die Kueche, Pflaume das Office, Gold
     "wartet", Gruen "bestaetigt", Rot "fehlt", Marine "hier klicken", Blau
     ist ganz draussen. Uebrig bleiben Beere, Kupfer, Moos und ein warmes
     Anthrazit - vier verschiedene FARBTOENE, nachgerechnet gegen die
     Zellflaeche (3,9-7,8:1) und mit cremer Schrift darauf (5,1-8,6:1).
     Kupfer stand zuerst auf #B4602A und kam mit der Schrift nur auf 4,27:1 -
     nachgerechnet, nicht geschaetzt, und dann nachgedunkelt.
     WICHTIG: die Farbe ist nicht die einzige Unterscheidung. Jede Person hat
     ihren festen PLATZ in der Zelle (erste Person oben, zweite darunter).
     In der Helligkeit liegen die vier Toene nah beieinander - wer Farben
     schlecht unterscheidet, liest die Ueberschneidung trotzdem, weil beide
     Balken gefuellt sind. */
  /* Die Mengenrampe des Bedarfsrasters als Tokens. Sie stand als feste
     Hexwerte in den Regeln - und war damit im NACHTMODUS unlesbar: Stufe 2
     hatte creme Schrift auf hellem Tuerkis, gemessen 1,09:1. Der Kommentar
     daneben behauptete "jede Stufe 4,7:1 oder mehr"; das galt nur fuer hell.
     Gefunden beim Umbau auf getippte Zellen (09.09.2026).
     Stufen 1-4 tragen --text, 5-6 --accent-ink - in beiden Ansichten, weil
     beide Tokens mitkippen. Der Rand einer Stufe ist die Farbe der naechsten,
     damit die blasse Stufe 1 ueberhaupt eine Kante hat. */
  --br1: #E8F1F0;
  --br2: #CFE3E1;
  --br3: #B5D6D3;
  --br4: #96C4C1;
  --br5: #2E7B77;
  --br6: #283045;
  --pf1: #7A2E4A;
  --pf2: #A4551F;
  --pf3: #4C6B2F;
  --pf4: #4A4F55;
  --pf-ink: #FDF8EF;
  /* Die weichen Toene absichtlich DURCHSCHEINEND und nicht als eigene
     Vollfarbe: so mischen sie sich mit dem Papier darunter und bleiben warm.
     Als flaches #DDE3E8 war der Bar-Ton ein kaltes Blaugrau und fiel sofort
     aus der Palette - am Bild gesehen, nicht am Wert. */
  --bar-soft: rgba(44, 58, 71, .07);
  --kueche-soft: rgba(44, 58, 71, .07);
  --office-soft: rgba(44, 58, 71, .07);
  --ok: #2F5E34;
  --ok-soft: #C3D9B8;
  --ok-ink: #FBF5EA;
  /* Eine Nuance dunkler als frueher (#8A6A08, 12.09.2026). Grund ist eine
     Messung, keine Laune: Gold-auf-Goldton kam auf 3,96:1, und in genau
     dieser Paarung steht das Wort "offen" auf jeder Schichtkarte, im
     Wochenkopf und in den Personaldaten - alles kleine, fette Schrift, fuer
     die WCAG 1.4.3 4,5:1 verlangt. Jetzt 4,84:1 auf dem Goldton und 6,03:1
     auf Papier. */
  --warn: #A82B2B;
  --warn-soft: #F6D0CA;
  /* "Fehlt" war ein gebranntes Orange (#B4451C) - im Farbton nur DREI Grad
     vom Terrakotta entfernt, das die Aktionsfarbe war. Solange beides da
     war, hat das nicht gestoert: warm neben warm. Seit die Handlung tuerkis
     ist (08.09.2026), ist Rot die einzige warme Farbe auf dem Bildschirm -
     und jedes "0/4" im Kalender liest sich wie die Farbe, die wir grade
     rausgenommen haben. Jetzt ein echtes Rot: 18 Grad weg vom alten
     Terrakotta, 54 vom Gold ("wartet"), und als Schrift auf Creme 6,5:1
     statt 5,2:1. */
  --crit: #A82B2B;
  --crit-ink: #FDF8EF;
  --crit-soft: #F6D0CA;
  /* Die vier Elevation-Stufen von Mathieus Blatt, mit negativer Streuung
     (dort ausdruecklich als "0 2 4 -1" bis "0 4 4 -3" notiert): der
     Schatten sitzt dicht an der Kante, statt als weite Wolke unter der Karte
     zu liegen. Vorher waren es 26 und 44 px Weichzeichnung ohne Streuung -
     weich und wolkig, das Gegenteil vom knappen Studio-Look. */
  /* Die Schattenleiter aus Mathieus Styleguide. Sie stand hier, wurde aber
     nur fuenfmal benutzt - daneben lagen neunzehn handgeschriebene Schatten,
     dieselbe Absicht in anderen Zahlen (Mathieu, 16.09.2026: "denk immer
     alle seiten durch in der app. das es einheitlich ist").
     Jetzt gilt sie: -1 heisst "liegt auf" (Karte, Kachel, Knopf), -3 heisst
     "schwebt" (Leiste, Schublade, Dialog). Und sie hat Nachtwerte, was die
     handgeschriebenen nicht hatten. */
  --schatten-1: 0 1px 2px -1px rgba(44,58,71,.10), 0 2px 4px -2px rgba(44,58,71,.08);
  --schatten-2: 0 2px 4px -1px rgba(44,58,71,.11), 0 4px 8px -2px rgba(44,58,71,.08);
  --schatten-3: 0 4px 8px -2px rgba(44,58,71,.12), 0 8px 16px -4px rgba(44,58,71,.09);
  --schatten-4: 0 8px 16px -4px rgba(44,58,71,.14), 0 4px 4px -3px rgba(44,58,71,.10);
  /* Die alten Namen bleiben und zeigen auf die Leiter - sonst muesste ich
     achtzig Regeln anfassen, um zwei Werte zu aendern. */
  --shadow: var(--schatten-2);
  --shadow-lift: var(--schatten-3);
  /* Ein feines Rauschen macht aus einer Farbflaeche Papier (Mathieu,
     06.09.2026: "behalt die Papier optik bei"). Es ist ein winziges Bild,
     das im Text der Seite selbst steht - keine zusaetzliche Datei, kein
     Nachladen, und "img-src data:" steht ohnehin schon in der CSP. */
  --korn: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='200' height='200'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.7' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='200' height='200' filter='url(%23n)'/%3E%3C/svg%3E");
  /* Die Sicherheitszone oben am iPhone, als Variable (Mathieu, 07.09.2026:
     "ueber adieu team hub und jm muss das feld die gleiche hintergrund farbe
     haben und soll nich transparent sein sonst scrollt man beim iphone da
     ueber den hintergrund").
     Als Variable und nicht direkt als env() in einer Regel: die Leiste hat
     VIER Stellen, die ihre Polsterung setzen - die Grundregel, ".topbar.emp"
     (spezifischer!) und zwei Kurzschreibweisen in Medienabfragen. Beim
     ersten Versuch stand env() nur in der Grundregel, und ausgerechnet die
     Mitarbeiterleiste - die mit "Adieu Team Hub und JM" - hat sie
     ueberschrieben. Am Wert gemessen, nicht am Code gesehen: 8,8px statt der
     erwarteten Polsterung. Vierter Fall derselben Sorte an diesem Tag.
     Auf Geraeten ohne Sicherheitszone ist der Wert 0. */
  /* Die Tinte des Wochenblocks auf der Startseite - als Variable, damit sie
     im Nachtmodus umdrehen kann (dann ist sie creme, und der Block ist von
     selbst der "Nachtblock" aus den Entwuerfen). */
  --marine-ink: #2C3A47;
  --safetop: env(safe-area-inset-top, 0px);
  /* Die Radiusleiter aus Mathieus "Product UI Styleguide": 0 / 4 / 8 / 12 /
     16. Vorher standen hier 18 / 13 / 10 - drei Werte, die auf keiner Leiter
     lagen und einfach nach Gefuehl gesetzt waren. */
  --radius: 16px;
  --radius-sm: 12px;
  --radius-xs: 8px;
  --radius-klein: 4px;
  /* Die fuenfte Stufe: die Pille. Sie stand 73-mal als "999px" und 7-mal als
     "99px" im Stylesheet - derselbe Gedanke in zwei Schreibweisen.
     (Mathieu, 16.09.2026: "denk immer alle seiten durch in der app. das es
     einheitlich ist.") */
  --radius-pille: 999px;

  /* Der Seitenrand des Inhalts. Die Kopfzone zieht ihn negativ wieder ab, um
     randlos zu sein - dafuer muss beides derselbe Wert sein. */
  --pad: 1.1rem;
  /* Nicht festgenagelt: die Nachtpalette setzt es auf dark, damit auch
     Formularfelder und Scrollbalken mitgehen. */
  color-scheme: light;
}
/* --- Nachtmodus ---------------------------------------------------------
   Wieder angeschaltet (Mathieu, 07.09.2026: "schalte den night modus mal
   wieder an"; abgeschaltet war er seit dem 06.09.: "lass es uns mal ohne
   Night Modus machen ... Nightmodus kuemmern wir uns wann anders drum").

   Die alte, auskommentierte Fassung liess sich NICHT einfach anschalten:
   sie stammte aus der Zeit, als die Aktionsfarbe das Waldgruen war, und
   setzte genau das als Akzent. Angeschaltet haette sie die halbe App im
   Dunkeln gruen gemacht - jeden Knopf, jeden aktiven Reiter, jede Kachel.
   Darum ist die Palette hier neu geschrieben, Ton fuer Ton gegen die helle.
   (Der alte Wert steht bewusst nicht mehr im Stylesheet: er geht sonst an
   jeden Browser mit raus, und ein Test sucht nach ihm.)

   Zwei Bloecke, und beide braucht es:
     - die Medienabfrage folgt der Systemeinstellung des Geraets. Das ist,
       was "Nachtmodus an" im Alltag heisst.
     - :root[data-theme="dark"] ist fuer eine spaetere Umschaltung von Hand.
       Sie greift auch dann, wenn das System hell steht - und
       :root:not([data-theme="light"]) in der Medienabfrage sorgt umgekehrt
       dafuer, dass eine ausdrueckliche Wahl "hell" ein dunkles System
       schlaegt.

   Die PLANUNG nimmt an alledem nicht teil (Mathieu, 04.10.2026: "Die
   Backend Seite sollte immer hell sein und nicht im Nachtmodus"): der Server
   setzt dort data-theme="light" fest, und weil jede Dunkel-Regel mit
   :root:not([data-theme="light"]) beginnt, bleibt sie hell - egal, was das
   Telefon oder ein Cookie sagt. Der Nachtmodus gilt fuer die Mitarbeiter-App.

   Bis zum 05.10.2026 war der Grundton ein warmes Marineschwarz mit
   einer blaugrauen Handlungsfarbe (#A9B6CC). Seitdem gilt der Nachtmodus
   "AC": Schwarz und Grau, Handlung weiss und an der Form erkennbar, nur
   Gruen und Rot als Signal - Begruendung im Block selbst. */
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) {
    /* Der Nachtmodus "AC" (Mathieu, 05.10.2026, nach fuenf gerenderten
       Runden: "Bau A mit frischem Akzent, aber nimm das Orange raus").
       Vorlage: Apple-modern - echtes Schwarz, Flaechen nur ueber die
       Helligkeit gestaffelt, keine Raender, kein Korn - und genau EIN
       frischer Gruen-Mint-Verlauf je Bildschirm (siehe DUNKEL_AC unten).
       Vorher stand hier "Nacht-Marine" (#0A0E13, seit ca12011). Mathieu
       dazu: "Finde das sieht so billig aus im Dunkelmodus" - gezaehlt lag
       das an sieben Schriftgewichten, bis zu 13 Rahmenlinien je Bildschirm
       und matschigen deckenden Toenungen, nicht am Farbton
       (nachweise/dunkel-marine/runde4/).

       ZWEI Signalfarben im Dunkeln (Mathieu, 05.10.2026: "maybe sind da zu
       viele verschiedene Farben im Spiel - brauchen wir die alle?"):
         Gruen = deins / nehmbar,  Rot = es fehlt jemand.
       Gold und Orange gibt es im Dunkeln nicht mehr:
         - --warn (knapp) spricht Rot wie --crit. "1 fehlt" und "4 fehlen"
           unterscheidet die Zahl, nicht die Farbe.
         - --gold ist ein helles Grau: was gold war, hiess "wartet" oder
           "Pause", und das ist kein Fehlen.
         - --wahl ("gerade offen") ist Weiss: im Dunkeln sagt es die FORM
           (ein kraeftiger heller Rahmen), nicht die Farbe.
       Die Karte liegt 10,3 L* ueber dem Grund (Flaechen-Ordnung bleibt):
       #1C1C1E auf #000000. Fliesstext 15,6:1 auf der Karte, Nebentext
       #AAAAAF 7,4:1 auf der Karte und 4,9:1 noch auf der dritten Stufe. */
    --bg: #000000;
    --surface: #1C1C1E;
    --surface-2: #2C2C2E;
    --surface-3: #3A3A3C;
    --border: #38383A;
    --border-strong: #48484A;
    --feldrand: #6E6E73;
    --hair: rgba(255, 255, 255, .10);
    --hair-strong: rgba(255, 255, 255, .16);
    --fill: rgba(118, 118, 128, .24);
    --text: #F5F5F7;
    --text-soft: #D1D1D6;
    --muted: #AAAAAF;
    /* 36 % Schrift auf der Karte = 3,15:1. Bewusst UNTER 4,5: "ausgeblendet"
       soll leise sein, und daneben steht immer das Wort. */
    --text-aus: #6A6A6C;
    --plus: #8E8E93;
    --g-tun-ink: #D3AE9B; --g-tun-tint: #1C1410; --g-wissen-ink: #6BCFD6; --g-wissen-tint: #05191A; --g-auf: #0A0A0A;
    /* Eine Tinte, auch im Dunkeln: Handlung ist hier Weiss, und was eine
       Handlung ist, sagt die Form (gefuellt, getoent, unterstrichen). */
    --accent: #F5F5F7;
    --accent-hover: #FFFFFF;
    --accent-soft: #2C2C2E;
    --accent-ink: #000000;
    --event-ton: rgba(255, 255, 255, .10);
    --event-ton-stark: rgba(255, 255, 255, .16);
    --wahl: #F5F5F7;
    --wahl-soft: #3C3C3E;
    --wahl-ink: #000000;
    /* News bleibt Rosa-Rot - die eine Ausnahme, die Mathieu am 25.09.2026
       ausdruecklich beschlossen hat ("Rot NUR fuer News"). */
    --news: #FF6B8A;
    --news-soft: #40292F;
    --news-band: #C8325A;
    --deep: #1C1C1E;
    --deep-hover: #2C2C2E;
    --deep-ink: #F5F5F7;
    --gruen: #35CC68;
    --gruen-hover: #48DE78;
    --gruen-ink: #04140C;
    --gold: #D1D1D6;
    --gold-soft: #2E2E30;
    --bar: #AAAAAF;
    --kueche: #AAAAAF;
    --office: #AAAAAF;
    --br1: #1E3231;
    --br2: #26433F;
    --br3: #2E534E;
    --br4: #38655F;
    --br5: #7FBAB6;
    --br6: #A9D6D2;
    --pf1: #E39AB4;
    --pf2: #E8A268;
    --pf3: #A9C77E;
    --pf4: #B0AAA1;
    --pf-ink: #1A1814;
    --bar-soft: rgba(255, 255, 255, .06);
    --kueche-soft: rgba(255, 255, 255, .06);
    --office-soft: rgba(255, 255, 255, .06);
    --ok: #3AEE85;
    --ok-soft: #1B4228;
    --ok-ink: #04140C;
    --warn: #FF5C4F;
    --warn-soft: #402626;
    --crit: #FF5C4F;
    --crit-ink: #2A0705;
    --crit-soft: #402626;
    /* Keine Schatten auf Karten: auf Schwarz sieht man sie nicht, und
       vorher mussten sie darum Rahmen tragen. Nur was schwebt (Leiste,
       Menue, Fenster), behaelt einen. */
    --schatten-1: none;
    --schatten-2: none;
    --schatten-3: 0 4px 8px -2px rgba(0,0,0,.6), 0 8px 16px -4px rgba(0,0,0,.5);
    --schatten-4: 0 8px 16px -4px rgba(0,0,0,.7), 0 4px 4px -3px rgba(0,0,0,.6);
    --shadow: var(--schatten-2);
    --shadow-lift: var(--schatten-3);
    --marine-ink: #F5F5F7;
    --radius: 20px;
    --radius-sm: 14px;
    --nacht-kopf: #000000; --nacht-kante: rgba(255, 255, 255, .1); --nacht-leiste: #1C1C1E; --nacht-aktiv: rgba(255, 255, 255, .14); --nacht-punkt: #48484A; --nacht-punkt-ink: #FFFFFF; --nacht-menue-aktiv: rgba(255, 255, 255, .12); --nacht-menue-icon: rgba(255, 255, 255, .08); --nacht-heute: rgba(255, 255, 255, .06); --nacht-streifen: rgba(255, 255, 255, .05); --nacht-schleier: rgba(0, 0, 0, .6); --nacht-wahl: #505052; --nacht-gruen-ton: rgba(53, 204, 104, .18); --nacht-gruen-ton-hover: rgba(53, 204, 104, .26); --nacht-gruen-tinte: #4BE38A; --nacht-glanz: 0 8px 22px -10px rgba(62, 230, 176, .75); --nacht-glanz-leise: 0 10px 32px -14px rgba(62, 230, 176, .45); --nacht-gestrichelt: rgba(255, 255, 255, .45); --schatten-leiste: 0 -8px 22px rgba(0, 0, 0, .5); --balken: #6E6E73; --strich-aus: #48484A; --chip-flaeche: #2C2C2E; --schleier-blatt: rgba(0, 0, 0, .6); --feier-gruen: #42714A; --fehler-ring: rgba(163, 49, 42, .18); --deep-ink-leise: rgba(251, 245, 234, .72); --abz-bar: #866AD2; --abz-kueche: #238B72; --abz-event: #C954A6; --news-band-ink: #FFFFFF;
    color-scheme: dark;
  }
  /* Bereiche haben im Dunkeln keinen eigenen Farbton mehr, nur eine Stufe
     unter der Karte (#131315, 4,4 L* darunter - die Karte liegt obenauf,
     Flaechen-Ordnung vom 16.09.2026). "Dein Tag" spricht Gruen (deins),
     alles andere Grau. */
  :root:not([data-theme="light"]) {
    --p-tag: #091A10;   --p-tag-ink: #3AEE85;
    --p-woche: #131315; --p-woche-ink: #AAAAAF;
    --p-hub: #131315;   --p-hub-ink: #AAAAAF;
    --p-event: #131315; --p-event-ink: #AAAAAF;
  }
  /* Kein Korn im Dunkeln: aufhellendes Korn auf Schwarz ist Rauschen. */
  :root:not([data-theme="light"]) body::after,
  :root:not([data-theme="light"]) .card::after,
  :root:not([data-theme="light"]) .deckblock::after,
  :root:not([data-theme="light"]) .planday::after,
  :root:not([data-theme="light"]) .wblock::after,
  :root:not([data-theme="light"]) .stkarte::after { opacity: 0; }
}
:root[data-theme="dark"] {
  /* Siehe die Begruendung in der Medienabfrage oben. */
  --p-tag: #091A10; --p-tag-ink: #3AEE85;
  --p-woche: #131315; --p-woche-ink: #AAAAAF;
  --p-hub: #131315; --p-hub-ink: #AAAAAF;
  --p-event: #131315; --p-event-ink: #AAAAAF;
  --bg: #000000; --surface: #1C1C1E; --surface-2: #2C2C2E; --surface-3: #3A3A3C;
  --border: #38383A; --border-strong: #48484A; --feldrand: #6E6E73;
  --hair: rgba(255, 255, 255, .10); --hair-strong: rgba(255, 255, 255, .16); --fill: rgba(118, 118, 128, .24);
  --text: #F5F5F7; --text-soft: #D1D1D6; --muted: #AAAAAF; --text-aus: #6A6A6C; --plus: #8E8E93;
  --g-tun-ink: #D3AE9B; --g-tun-tint: #1C1410; --g-wissen-ink: #6BCFD6; --g-wissen-tint: #05191A; --g-auf: #0A0A0A;
  --accent: #F5F5F7; --accent-hover: #FFFFFF; --accent-soft: #2C2C2E; --accent-ink: #000000;
  --event-ton: rgba(255, 255, 255, .10); --event-ton-stark: rgba(255, 255, 255, .16);
  --wahl: #F5F5F7; --wahl-soft: #3C3C3E; --wahl-ink: #000000;
  --news: #FF6B8A; --news-soft: #40292F; --news-band: #C8325A;
  --deep: #1C1C1E; --deep-hover: #2C2C2E; --deep-ink: #F5F5F7;
  --gruen: #35CC68; --gruen-hover: #48DE78; --gruen-ink: #04140C;
  --gold: #D1D1D6; --gold-soft: #2E2E30;
  --bar: #AAAAAF; --kueche: #AAAAAF; --office: #AAAAAF;
  --br1: #1E3231; --br2: #26433F; --br3: #2E534E; --br4: #38655F; --br5: #7FBAB6; --br6: #A9D6D2;
  --pf1: #E39AB4; --pf2: #E8A268; --pf3: #A9C77E; --pf4: #B0AAA1; --pf-ink: #1A1814;
  --bar-soft: rgba(255, 255, 255, .06); --kueche-soft: rgba(255, 255, 255, .06); --office-soft: rgba(255, 255, 255, .06);
  --ok: #3AEE85; --ok-soft: #1B4228; --ok-ink: #04140C;
  --warn: #FF5C4F; --warn-soft: #402626;
  --crit: #FF5C4F; --crit-ink: #2A0705; --crit-soft: #402626;
  --schatten-1: none;
  --schatten-2: none;
  --schatten-3: 0 4px 8px -2px rgba(0,0,0,.6), 0 8px 16px -4px rgba(0,0,0,.5);
  --schatten-4: 0 8px 16px -4px rgba(0,0,0,.7), 0 4px 4px -3px rgba(0,0,0,.6);
  --shadow: var(--schatten-2); --shadow-lift: var(--schatten-3);
  --marine-ink: #F5F5F7;
  --radius: 20px; --radius-sm: 14px;
  --nacht-kopf: #000000; --nacht-kante: rgba(255, 255, 255, .1); --nacht-leiste: #1C1C1E; --nacht-aktiv: rgba(255, 255, 255, .14); --nacht-punkt: #48484A; --nacht-punkt-ink: #FFFFFF; --nacht-menue-aktiv: rgba(255, 255, 255, .12); --nacht-menue-icon: rgba(255, 255, 255, .08); --nacht-heute: rgba(255, 255, 255, .06); --nacht-streifen: rgba(255, 255, 255, .05); --nacht-schleier: rgba(0, 0, 0, .6); --nacht-wahl: #505052; --nacht-gruen-ton: rgba(53, 204, 104, .18); --nacht-gruen-ton-hover: rgba(53, 204, 104, .26); --nacht-gruen-tinte: #4BE38A; --nacht-glanz: 0 8px 22px -10px rgba(62, 230, 176, .75); --nacht-glanz-leise: 0 10px 32px -14px rgba(62, 230, 176, .45); --nacht-gestrichelt: rgba(255, 255, 255, .45); --schatten-leiste: 0 -8px 22px rgba(0, 0, 0, .5); --balken: #6E6E73; --strich-aus: #48484A; --chip-flaeche: #2C2C2E; --schleier-blatt: rgba(0, 0, 0, .6); --feier-gruen: #42714A; --fehler-ring: rgba(163, 49, 42, .18); --deep-ink-leise: rgba(251, 245, 234, .72); --abz-bar: #866AD2; --abz-kueche: #238B72; --abz-event: #C954A6; --news-band-ink: #FFFFFF;
  color-scheme: dark;
}
:root[data-theme="dark"] body::after,
:root[data-theme="dark"] .card::after,
:root[data-theme="dark"] .deckblock::after,
:root[data-theme="dark"] .planday::after,
:root[data-theme="dark"] .wblock::after,
:root[data-theme="dark"] .stkarte::after { opacity: 0; }
/* Die Haken und Radios der ganzen App. Bis zum 09.09.2026 stand hier
   NICHTS - also malte jeder Browser jeden Haken in seinem eigenen Blau, und
   Blau ist in diesem Haus tabu. Bei 43 Punkten auf einer Opening-Liste war
   das die haeufigste Farbe der App, und sie war nicht von uns.
   GRUEN, nicht die Wahlfarbe: ein gesetzter Haken heisst „erledigt", und
   erledigt ist in dieser App gruen. Die Wahlfarbe sagt „das hier ist gerade
   offen" - das ist etwas anderes. (Radios sind streng genommen eine Auswahl
   und keine Bestaetigung; sie teilen sich die Eigenschaft mit den Haken, und
   die Haken sind hundertmal haeufiger.) */
:root { accent-color: var(--gruen); }
* { box-sizing: border-box; }
html { -webkit-text-size-adjust: 100%; }
html { overscroll-behavior-y: none; }
body {
  margin: 0;
  overscroll-behavior-y: none;
  background: var(--bg);
  color: var(--text);
  font-family: var(--f-text);
  font-size: 1rem;
  line-height: 1.47;
  -webkit-font-smoothing: antialiased;
  /* Alle Ziffern tabellarisch, im ganzen Dokument. In einem Dienstplan stehen
     Zeiten und Stunden ueberall untereinander - mit proportionalen Ziffern
     springen sie, und die Spalte sieht kaputt aus, ohne dass man sagen kann,
     warum. */
  font-variant-numeric: tabular-nums;
  font-feature-settings: 'tnum' 1;
}

/* Das Rauschen liegt zweimal auf der Seite: einmal ganz fein ueber allem,
   und einmal etwas staerker auf jeder Karte, damit jede ihre eigene
   Oberflaeche hat statt einer Folie darueber. "multiply" heisst: es dunkelt
   nur ab, es hellt nie auf - deshalb sieht es nach Papier aus und nicht
   nach Fernsehflimmern. Beide Schichten sind fuer Maus und Finger nicht da. */
/* Der Streifen unter Uhrzeit und Batterie, deckend und in der Farbe der
   Kopfzeile. Zusaetzlich zur Polsterung der Leiste, nicht anstelle: die
   Polsterung hilft nur, solange die Leiste wirklich oben klebt. In Safari
   klappt die eigene Werkzeugleiste beim Scrollen weg, und in dem Moment
   rutscht der Inhalt fuer einen Augenblick darueber - genau das zeigt
   Mathieus Bild. Ein fest verankerter Streifen kann das nicht passieren.
   Liegt ueber der Kopfzeile (20), unter Seitenleiste (30), Korn (39) und
   Schublade (60). Hoehe 0 auf Geraeten ohne Sicherheitszone. */
body::before {
  content: ""; position: fixed; top: 0; left: 0; right: 0;
  height: var(--safetop); background: var(--surface);
  z-index: 25; pointer-events: none;
}

/* Das Korn liegt UNTER der Leiste unten (40), nicht mehr ueber allem (90).
   Mathieu, 15.10.2026: "die Menüzeile unten schwebt, wenn man scrollt, im
   Raum - das ist ein Bug ... Das passiert immer mal wieder, wenn du was
   umbaust". Es war diese Schicht, seit dem 06.09. (a16ba8f):
   Safari ab iOS 26 zieht eine Leiste, die unten am Rand klebt, unter seiner
   schwebenden Adressleiste bis an den Glasrand weiter - aber nur, wenn sie
   die OBERSTE feste Schicht am unteren Rand ist. Das Korn ist eine feste
   Schicht ueber dem ganzen Bildschirm; mit z-index 90 lag es ueber der
   Leiste, Safari sah dort "keine Leiste", und die Leiste stand frei ueber der
   Adressleiste, darunter scrollte die Seite durch. Im iPhone-Simulator
   (iOS 27, Safari) Schicht fuer Schicht nachgestellt: Leiste allein - klebt;
   Leiste + Korn darueber - schwebt; Korn darunter - klebt.
   Deshalb haben die Fixes vom 16.09. (Streifen dahinter) und 05.10.
   (bottom: 0, 61a3ab3) am iPhone nie gegriffen: sie haben an der Leiste
   gedreht, das Korn lag weiter darueber. Am Rechner sieht man den Fehler
   nicht - Chrome hat diese Adressleiste nicht.
   Was das kostet: Schublade (60), Schleier (55), Blaetter (70) und
   Rueckmeldung (45) liegen jetzt ueber dem Korn statt darunter - bei 9 %
   Deckkraft auf deckenden Flaechen kaum zu sehen. unterleiste-fest.test.js
   haelt die Reihenfolge fest. */
body::after {
  content: ""; position: fixed; inset: 0; pointer-events: none; z-index: 39;
  background-image: var(--korn); opacity: .045; mix-blend-mode: multiply;
}
.card, .deckblock, .planday, .empmenu-icon {
  position: relative; isolation: isolate;
}
.card::after, .deckblock::after, .planday::after {
  content: ""; position: absolute; inset: 0; border-radius: inherit;
  pointer-events: none; z-index: 0;
  background-image: var(--korn); opacity: .1; mix-blend-mode: multiply;
}
/* Der Inhalt muss ueber dem Korn liegen, sonst legt es sich auf die Schrift
   und die wird grieselig. */
.card > *, .deckblock > *, .planday > * { position: relative; z-index: 1; }
@media (prefers-reduced-transparency: reduce) {
  body::after, .card::after, .deckblock::after, .planday::after { display: none; }
}

/* Schriftstufen nach dem Muster von Apples Textstilen: wenige, klar
   getrennte Groessen, halbfett statt fett, und je groesser die Zeile, desto
   enger der Buchstabenabstand. */
h1, h2, h3 { font-family: var(--f-kopf); font-weight: 600; margin: 0; }
h1 { font-size: 2rem; line-height: 1.18; letter-spacing: -.022em; }
h2 { font-size: 1.3125rem; line-height: 1.25; letter-spacing: -.018em; }
h3 { font-size: 1.125rem; line-height: 1.3; letter-spacing: -.011em; }
p { margin: 0 0 .75rem; }
a { color: var(--accent); text-decoration: none; font-weight: 550; }
/* Ein Link im laufenden Text ist im Hellen NICHT am Ton zu erkennen - die
   Handlungsfarbe und die Schriftfarbe sind 1,13:1 auseinander. Also traegt
   ihn die Unterstreichung.
   Die Regel greift ueber den ORT, nicht ueber "hat keine Klasse". Erster
   Versuch war umgekehrt - alle nackten <a> unterstrichen, alles mit Klasse
   wieder aus - und hat sofort die Wortmarke oben links erwischt: "Adieu Team
   Hub" ist ein <a> im .brand, ohne eigene Klasse. So herum ist der Fehler in
   die harmlose Richtung: ein vergessener Link im Text bleibt ohne
   Unterstreichung, aber nichts in der Navigation bekommt eine. */
p a, li a, dd a, blockquote a, figcaption a, .hinweis a, .infoklapp a {
  text-decoration: underline; text-underline-offset: .18em;
  text-decoration-thickness: from-font;
}
a:hover { text-decoration: underline; }
small, .small { font-size: .875rem; line-height: 1.4; }
.duenn { font-weight: 300; }
.num, .mono, td .num { font-variant-numeric: tabular-nums; }

/* Grosse Zahlen brauchen weniger Abstand als Text, sonst fallen sie
   auseinander. */
.bignum, .invstationstat .num, .invrhythm .cnt { letter-spacing: -.025em; }

/* Ein Wert am Zeilenende: rechtsbuendig, tabellarisch, bricht nie um. Das ist
   die Stelle, an der die Zeiten im Dienstplan vorher umgebrochen sind. */
.value {
  margin-left: auto; flex: none; text-align: right; white-space: nowrap;
  font-variant-numeric: tabular-nums; color: var(--muted); font-size: 1rem;
}
.value strong { color: var(--text); font-weight: 600; }
/* "+1" heisst: die Schicht endet am naechsten Tag. In einer Bar ist das die
   Regel, nicht die Ausnahme - also gehoert es an die Zahl. */
/* Gilt ueberall, wo eine Zeitspanne steht - nicht nur in .value. Sonst klebt
   die "+1" auf der eigenen Schichtliste in voller Groesse an der Uhrzeit. */
.nextday {
  font-size: .68em; font-weight: 700; vertical-align: .35em; margin-left: .12em;
  color: var(--muted); letter-spacing: 0;
}

.topbar {
  background: var(--surface);
  border-bottom: 1px solid var(--border);
  /* Der Streifen ueber der Leiste gehoert der Leiste (Mathieu, 07.09.2026:
     "ueber adieu team hub und jm muss das feld die gleiche hintergrund farbe
     haben und soll nich transparent sein sonst scrollt man beim iphone da
     ueber den hintergrund").
     Am iPhone reicht die Seite in die Sicherheitszone unter Uhrzeit und
     Batterie. Dort stand nichts - also sah man den Seitenhintergrund in
     einem anderen Creme als die Leiste, und beim Scrollen lief der Inhalt
     dahinter durch. Die Leiste klebt an top: 0, also deckt ihre eigene
     Flaeche den Streifen ab, sobald sie oben mitwaechst.
     Auf Geraeten ohne Sicherheitszone ist der Wert 0 und es aendert sich
     nichts. */
  padding: calc(.75rem + var(--safetop)) 1rem .75rem;
  display: flex; flex-wrap: wrap; align-items: center; gap: .5rem 1rem;
  position: sticky; top: 0; z-index: 20;
}
.topbar .brand { font-family: var(--f-kopf); font-weight: 700; font-size: 1.125rem; letter-spacing: -.02em; }
.topbar .brand span { color: var(--muted); font-weight: 500; }
.topbar nav { display: flex; flex-wrap: wrap; gap: .25rem; margin-left: auto; }
@media (max-width: 720px) {
  /* Drei umgebrochene Reihen Navigation haben auf dem Handy mehr Platz
     gebraucht als der Inhalt darunter. Jetzt: Titelzeile oben, darunter eine
     Zeile Navigation, die man schiebt. */
  .topbar { flex-wrap: wrap; gap: .25rem 0; padding: calc(.75rem + var(--safetop)) 0 .5rem; }
  .topbar .brand { flex: 1 0 100%; padding: 0 1rem; font-size: 1rem; }
  .topbar .brand span { display: none; }
  .topbar nav {
    flex: 1 0 100%; flex-wrap: nowrap; overflow-x: auto; margin: 0;
    padding: .125rem 1rem .125rem .75rem;
    -webkit-overflow-scrolling: touch; scrollbar-width: none;
    -webkit-mask-image: linear-gradient(90deg, transparent, #000 12px, #000 calc(100% - 22px), transparent);
          mask-image: linear-gradient(90deg, transparent, #000 12px, #000 calc(100% - 22px), transparent);
  }
  .topbar nav::-webkit-scrollbar { display: none; }
  .topbar nav a, .topbar nav .navform button { flex: none; white-space: nowrap; }
}
.topbar nav a, .topbar nav .navform button {
  padding: .5rem .75rem; border-radius: var(--radius-pille); font-size: .875rem; font-weight: 550;
  color: var(--text-soft);
}
.topbar nav a:hover { background: var(--fill); text-decoration: none; }
.topbar nav a[aria-current="page"] { background: var(--accent); color: var(--accent-ink); }
/* Ein Punkt mit Zahl, nicht mit Farbe allein - Farbe uebertraegt sich nicht
   in den Reiter-Text, den Screenreader vorlesen. */
.navbadge {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 17px; height: 17px; margin-left: .25rem; padding: 0 .25rem;
  border-radius: var(--radius-pille); background: var(--crit); color: var(--crit-ink);
  font-size: .75rem; font-weight: 700; font-variant-numeric: tabular-nums; line-height: 1;
  vertical-align: 1px;
}
.topbar nav a[aria-current="page"] .navbadge { background: var(--crit-ink); color: var(--crit); }
.topbar nav .navform { display: inline; margin: 0; }
.topbar nav .navform button {
  border: 0; background: none; font-family: inherit; cursor: pointer; line-height: inherit;
}
.topbar nav .navform button:hover { background: var(--surface-2); }

/* Team-Menue: dieselbe Karte auf jeder Mitarbeiter-Seite, damit man nie
   ohne Weg zurueck oder zu einer anderen Seite dasteht (Mathieu, 06.09.2026).
   Zurueck-Pfeil links, das Menue geht ueber die Initialen rechts auf - reines
   CSS (Checkbox-Trick), kein Skript noetig, die CSP bleibt unangetastet. */
/* Schlanker, seit der Menue-Knopf raus ist (08.09.2026: "Dann mach lieber
   oben Schlanker"). Vorher bestimmte der 46 px hohe Avatar die Hoehe; jetzt
   ist die Leiste das, was sie sein soll - Zurueck-Pfeil und Titel.
   Gemessen: 65 px vorher, 53 px jetzt. Tiefer geht es NICHT, und das ist
   Absicht: 44 px davon sind die Trefferflaeche des Titel-Links, und die ist
   die Untergrenze aus Mathieus eigener Regelliste ("KEEP HIT AREA 44PX").
   Was hier gespart wurde, ist genau das Polster - nicht die Bedienbarkeit. */
.topbar.emp {
  gap: .5rem; flex-wrap: nowrap;
  padding-top: calc(.25rem + var(--safetop)); padding-bottom: .25rem;
}
.topbar.emp .brand {
  flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis;
  white-space: nowrap; padding: 0;
}
/* Der Weg zurueck auf die Startseite ist in der Mitarbeiter-App der
   haeufigste Griff in dieser Leiste - er hatte aber nur 23 px Trefferhoehe
   in einer 46 px hohen Leiste (gemessen, 08.09.2026). Jetzt fuellt er sie.
   Der Elternteil behaelt Ellipsis und nowrap, darum inline-flex und nicht
   block. */
.topbar.emp .brand a {
  color: inherit; display: inline-flex; align-items: center; min-height: 44px;
}
.topbar.emp .brand a:hover { text-decoration: none; }
/* Hier stand der Avatar-Knopf, der das Schubfach oeffnete - mit den
   Initialen und einem Menue-Abzeichen (Mathieu, 06.09.2026: "JM klarer als
   Menuesymbol"). Er ist am 08.09.2026 weg: seit die Unterleiste einen
   eigenen Menuepunkt hat, oeffneten zwei Knoepfe auf jedem Bildschirm
   dasselbe Schubfach ("das ist etwas unnoetig oder? Dann mach lieber oben
   Schlanker"). Die Initialen sind kein Verlust - der Kopf des Schubfachs
   nennt den vollen Namen, und darum ging es dabei. */
/* Die Planung hat keine Initialen in der Kopfzeile (man ist der Betrieb,
   nicht eine Person) - dort steht an derselben Stelle ein schlichtes
   Menuesymbol. Der Punkt daran erscheint nur, wenn irgendwo etwas wartet. */
.burgerbtn {
  position: relative; margin-left: auto; cursor: pointer; flex: none;
  width: 46px; height: 46px; border-radius: var(--radius-pille);
  background: var(--surface); border: 1.5px solid var(--accent); color: var(--accent);
  display: flex; align-items: center; justify-content: center;
}
.burgerbtn svg { width: 18px; height: 14px; display: block; }
.burgerbadge {
  position: absolute; right: 4px; top: 4px; width: 10px; height: 10px;
  border-radius: var(--radius-pille); background: var(--crit); border: 2px solid var(--surface);
}
/* Deckblatt: Vollflaechen-Farbblock direkt unter der Kopfzeile (Mathieu,
   06.09.2026, Waldgruen-Karten-Prototyp: "uebernehm einfach den prototyp
   genau so"). Randlos wie .hero, aber als kraeftige Flaeche statt sanftem
   Verlauf - eigene Klasse, damit die bestehende .hero (Startseite) davon
   unberuehrt bleibt. */
/* Der Farbblock ist eine Karte, kein Balken (Mathieu, 06.09.2026: "doch nicht
   so abrunden unten... oder du machst um Kalender und Hallo Mathieu so nen
   ganzen Abstand zum Rand wie auf dem Bild"). Nur unten abzurunden hiess:
   oben klebt er am Rand, unten schwebt er - das sah nach halber Sache aus.
   Jetzt Abstand ringsum und ringsum rund.

   Dieselbe Breite wie der Inhalt darunter (720 px, mittig), damit die Kanten
   auf einer Linie liegen; ohne das waere der Block am Rechner breiter als
   alles, was unter ihm steht. */
.deckblock {
  background: var(--deep); color: var(--deep-ink);
  /* Die Karten darunter stehen in .wrap.narrow: 720 px breit, davon links
     und rechts je --pad Innenabstand. Ihre Aussenkante liegt also bei
     720 minus zweimal --pad - genau darauf muss dieser Block, sonst steht er
     am Rechner einen Daumen breiter da als alles unter ihm. */
  /* width UND max-width: max-width allein hat auf dem Handy nichts bewirkt -
     dort ist der Bildschirm schmaler als die Obergrenze, also lief der Block
     wieder von Kante zu Kante. Die Breite nimmt den Abstand links und rechts
     jetzt selbst heraus. */
  width: calc(100% - 2 * var(--pad));
  max-width: calc(720px - 2 * var(--pad));
  margin: var(--pad) auto 0;
  padding: 1.5rem 1.25rem 1.25rem;
  border-radius: var(--radius);
}
.deckblock .deckkicker { font-size: .75rem; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; opacity: .8; margin-bottom: .25rem; }

/* Auf Unterseiten ist der Farbblock ein Titel, keine Begruessung: die
   Startseite darf gross auftreten ("Hallo Aina"), eine Unterseite soll den
   Platz dem Inhalt lassen. */
.deckblock { padding: 1rem 1rem 1rem; }
.deckblock h1 { font-size: 1.5rem; }
.deckblock .deckkicker { margin-bottom: .125rem; }
.deckblock .deckcaption { margin-top: .5rem; }

.deckblock h1 { color: var(--deep-ink); font-size: 1.75rem; letter-spacing: -.02em; margin: 0; }
/* Im Dunkeln traegt der Block keinen Lichtschein mehr (Nachtmodus AC,
   05.10.2026): die Flaeche ist die Karte, siehe DUNKEL_AC am Ende. */
.deckblock .deckcaption { display: flex; justify-content: space-between; gap: 1rem; margin-top: 1rem; font-size: .875rem; opacity: .85; flex-wrap: wrap; }
/* Das kleine "i" im Farbblock: fuehrt nach unten zur Hilfe. Bewusst leise -
   es ist eine Nebentuer, kein Knopf, und der Kalender soll den Blick
   bekommen. */
/* Eine Erklaerung hinter einem "i" (Mathieu, 08.09.2026). Das "i" sitzt in
   der Ecke der Karte, die Erklaerung klappt darunter auf.

   Das "i" ist ABSOLUT gesetzt und liegt damit ausserhalb des Textflusses.
   Der erste Versuch hatte es als Feld in der Kartenueberschrift, und beim
   Aufklappen sprang es in eine neue Zeile - am Bild gesehen. Jetzt bleibt es
   an derselben Stelle, ob offen oder zu.

   Die Trefferflaeche ist 34 px, nicht die Groesse des Zeichens: ein "i" ist
   16 px breit, und das trifft am Handy niemand. */
/* --- "Etwas melden" auf dem Hub, eingeklappt ---------------------------
   Mathieu, 08.09.2026. Das Formular hat offen sieben Felder und damit zwei
   Drittel des Bildschirms gefuellt - waehrend "To-Dos" und "Kaufen", die
   zwei Sachen, wegen denen man den Hub aufmacht, zwei graue Saetze darueber
   waren. Melden ist das, was man am seltensten tut.
   Der Aufklapper sieht aus wie der Kartenkopf, den er ersetzt: derselbe
   Schriftgrad, dieselbe Zeile mit dem Hinweis rechts. Dazu ein Pfeil, damit
   man sieht, dass da noch etwas ist - und 44 px Trefferflaeche, weil der
   Kopf jetzt der Schalter ist. */
details.meldeklapp > summary {
  display: flex; align-items: center; gap: .5rem;
  cursor: pointer; list-style: none; padding: 0; min-height: 44px;
}
details.meldeklapp > summary::-webkit-details-marker { display: none; }
.mkltitel { font-size: 1.125rem; font-weight: 700; letter-spacing: -.02em; color: var(--text); }
details.meldeklapp > summary::after {
  content: ""; margin-left: auto; flex: none;
  width: .5rem; height: .5rem;
  border-right: 2px solid var(--muted); border-bottom: 2px solid var(--muted);
  transform: rotate(45deg); transition: transform .12s ease;
}
details.meldeklapp[open] > summary::after { transform: rotate(-135deg); }
details.meldeklapp > summary:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: var(--radius-klein); }
details.meldeklapp[open] > summary { margin-bottom: .5rem; border-bottom: 1px solid var(--hair); padding-bottom: .5rem; }
/* position: static ist hier NOETIG und kein Versehen. ".card > *" gibt
   jedem direkten Kind der Karte "position: relative" (damit der Text ueber
   dem Papierkorn liegt) - damit wurde das <details> selbst der Anker fuer
   das absolut gesetzte "i", und das "i" hing an der Erklaerung statt an der
   Karte. Gemessen: offsetParent war ".infoklapp", nicht ".card".
   Siebter Fall derselben Fehlerfamilie in dieser Woche.
   Die Schicht ueber dem Korn holen sich Zeichen und Text unten selbst. */
.infoklapp { position: static; margin: 0; }
/* Das "i" sitzt absolut in der rechten obenen Ecke der Karte - also muss die
   Kopfzeile dort Platz lassen, sonst laeuft ihr rechter Teil darunter.
   Gefunden im eigenen Screenshot der Nachweis-Seite: "Dienstag, 8. September"
   lag unter dem Zeichen. Dieselbe Klasse Fehler wie beim Zurueckziehen-Knopf
   am 08.09. - ein absolut positioniertes Element ueber Text, im Quelltext
   nicht zu sehen.
   Als :has()-Regel und nicht von Hand an dieser einen Karte: sonst faellt es
   an der naechsten Karte mit "i" wieder auf. */
.card:has(> .infoklapp) > .card-head,
.card:has(> details.infoklapp) > .card-head { padding-right: 2.5rem; }
.infoklapp > summary {
  position: absolute; top: .8rem; right: .85rem; z-index: 2;
  list-style: none; cursor: pointer;
  width: 34px; height: 34px;
  display: grid; place-items: center;
  color: var(--muted); font-size: 1rem; line-height: 1;
  border-radius: var(--radius-pille);
}
.infoklapp > summary::-webkit-details-marker { display: none; }
/* Das Zeichen bleibt 34 px gross, die Tippflaeche waechst unsichtbar auf 44
   (Team-Ansicht, 15.10.2026). */
.infoklapp > summary::before { content: ''; position: absolute; inset: -5px; }
.infoklapp > summary:hover { color: var(--text); background: var(--fill); }
.infoklapp > summary:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
.infoklapp[open] > summary { color: var(--accent); background: var(--accent-soft); }
.infoklapp > p {
  /* Kein negativer Rand: er kollabierte durch das <details> hindurch und
     zog beim Aufklappen den ganzen Block um 6 px nach oben. Am gemessenen
     Wert gesehen, nicht am Code. */
  position: relative; z-index: 1;
  margin: 0 0 .75rem; font-size: .875rem;
  border-left: 3px solid var(--border); padding-left: .75rem;
}
/* Startseite: keine weisse Leiste darueber, der Farbblock traegt den Kopf
   selbst. Wortmarke und Menue auf einer Zeile, darunter die Begruessung. */

/* Die Ziehharmonika der sieben Tage (Radio + Label, ohne Skript) ist am
   12.09.2026 entfallen - mit ihr der Tagesstreifen davor, der schon vorher
   abgeloest worden war. Was sie konnte, kann die Wippe unten besser: sie
   zeigte alle sieben Tage, aber der heutige begann an einem Samstag bei
   819 px, und der Bildschirm ist 812 hoch. */

/* --- Ein Tag statt sieben (12.09.2026) ---------------------------------
   Die Woche war eine Ziehharmonika: sieben Balken, einer offen. An einem
   Samstag begann der heutige Tag damit bei 819 px, und der Bildschirm ist 812
   hoch. Jetzt steht EIN Tag da, gewechselt wird mit der Wippe oben - der
   Griff, den Mathieu aus Gastromatic kannte. */
.tagwechsler { display: flex; align-items: center; gap: .5rem; margin: 0 0 1rem; }
/* 44 px, weil das hier der am oeftesten gedrueckte Knopf der Seite wird. */
.twpfeil {
  flex: none; width: 44px; height: 44px; border-radius: var(--radius-pille);
  border: 1.5px solid var(--border); background: var(--surface);
  display: flex; align-items: center; justify-content: center;
  font-size: 1.3125rem; line-height: 1; color: var(--text); text-decoration: none;
}
.twpfeil:hover { border-color: var(--accent); text-decoration: none; }
.twpfeil:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
/* Gibt es keine Nachbarwoche, bleibt der Platz - aber der Pfeil ist kein
   Weg mehr. Ein Knopf, der nichts tut, ist schlimmer als eine Luecke. */
.twpfeil.aus { color: var(--text-aus); border-style: dashed; cursor: default; }
.twmitte { flex: 1; text-align: center; min-width: 0; }
.twtag {
  display: block; font-family: var(--f-text); font-weight: 700;
  font-size: 1.3125rem; letter-spacing: -.02em; line-height: 1.15;
}
.twdatum { display: block; font-size: .875rem; color: var(--muted); margin-top: .125rem; }
.twheute {
  display: inline-block; margin-left: .5rem; padding: .125rem .5rem;
  border-radius: var(--radius-pille); background: var(--accent); color: var(--accent-ink);
  font-size: .625rem; font-weight: 700; letter-spacing: .06em; text-transform: uppercase;
  vertical-align: middle;
}

/* --- Der Tageskopf im Team-Bereich (Mathieu, 16.09.2026: "Ja, bau 1-4") ---
   Drei Bloecke haben auf "Schicht eintragen" denselben Tag ausgesucht:
   Umschalter, Wippe, Streifen - gemessen 279 px ueber der ersten Schicht,
   ein Drittel des Bildschirms bei 390x844. Jetzt zwei Zeilen: hier das
   Datum mit dem Umschalter daneben, darunter der Streifen.
   Die Wippe bleibt, wo sie gebraucht wird - in der Planung im Backend. */
.tagkopf { display: flex; align-items: flex-end; justify-content: space-between; gap: .5rem; margin: 0 0 .75rem; }
.tkwo { display: flex; flex-direction: column; min-width: 0; }
.tkrechts { flex: none; }
/* Der Wochentag ist die Marke, das DATUM ist die Ueberschrift - umgekehrt
   zur Wippe. "Freitag" gibt es jede Woche, "18. September" nur einmal. */
.tagkopf .twtag {
  display: block; font-size: .625rem; font-weight: 800; letter-spacing: .14em;
  text-transform: uppercase; color: var(--muted); line-height: 1.2;
}
.tagkopf .tkdatum {
  display: block; font-family: Anton, "Archivo Black", sans-serif; font-weight: 400;
  font-size: 1.5rem; line-height: 1.05; letter-spacing: .01em; color: var(--text);
}
/* Nur, was KEINE Zahl ist ("du hast Urlaub"). Leer faellt die Zeile weg. */
.tagkopf .twdatum { display: block; font-size: .75rem; color: var(--muted); margin-top: .125rem; }
.tagkopf .twdatum:empty { display: none; }
.tagkopf .twheute {
  margin-left: .25rem; padding: .125rem .25rem; font-size: .625rem;
  background: var(--accent); color: var(--accent-ink);
}
/* Der Umschalter neben dem Datum: kleiner als in einer eigenen Zeile, weil
   er dort die ganze Breite hatte und hier nur seine zwei Woerter braucht. */
.tagkopf .ansichtwahl2 { margin: 0; padding: 3px; }
/* Kleiner in der Schrift, aber NICHT im Tippziel: "min-height: 0" hat ihn
   am 16.09.2026 auf 29 px gedrueckt - gemessen im Rundgang durch alle
   Seiten, nicht bemerkt beim Bauen. Die Regel der App ist 44. */
.tagkopf .aw2 { font-size: .75rem; padding: .25rem .75rem; }

/* Die Winkel - die Pfeile der alten Wippe. Seit dem 05.10.2026 stehen sie
   im Tageskopf neben dem Umschalter und sind ein volles Tippziel: 44 x 44.
   An den Enden des Streifens waren sie 22 px breit, weil die sieben Tage die
   Breite brauchten - sieben mal 44 plus zwei mal 44 passt in 358 px nicht. */
.wszwinkel {
  flex: none; width: 44px; min-height: 44px; border-radius: var(--radius-pille);
  display: flex; align-items: center; justify-content: center;
  color: var(--muted); text-decoration: none; font-size: 1.125rem; line-height: 1;
}
.wszwinkel:hover { color: var(--text); text-decoration: none; background: var(--fill); }
.wszwinkel:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
/* Gibt es keinen Nachbartag, bleibt der Platz - aber der Winkel ist kein
   Weg mehr. Dieselbe Regel wie bei den Pfeilen der Wippe. */
.wszwinkel.aus { color: var(--text-aus); cursor: default; }

/* Eingesprungen: die eigene Bilanz und das, was im Laden gerade passiert ist.
   Gold, weil es dieselbe Farbe ist, mit der die App "hier fehlt jemand" sagt -
   wer einspringt, macht genau daraus ein Gruen. */
.card.einspring { border-color: var(--gold); }
.espruch { display: flex; align-items: center; gap: .75rem; padding: .5rem .75rem; border-radius: var(--radius-sm); background: var(--gold-soft); }
.eszahl {
  flex: none; width: 38px; height: 38px; border-radius: var(--radius-pille); display: grid; place-items: center;
  background: var(--gold); color: var(--deep); font-size: .875rem; font-weight: 800;
  font-variant-numeric: tabular-nums;
}
/* Die Liste der ANDEREN Einspringer ist am 15.09.2026 weggefallen (Mathieu:
   "bei mir steht immer noch eingesprungen alexandra das sollte nur bei
   Alexandra stehen") - und mit ihr ihre Regeln. Totes CSS faellt nicht auf,
   bis jemand eine Klasse wiederverwendet und sich wundert. */

/* Mit wem du stehst: kleine Kreise unter der eigenen Schicht im Wochenblock
   (Mathieu, 12.09.2026). Gold heisst "wartet noch auf Bestaetigung" -
   dieselbe Bedeutung wie ueberall sonst. */
.wcrew { display: inline-flex; align-items: center; gap: .125rem; margin-left: .125rem; vertical-align: middle; }
.wcav {
  width: 20px; height: 20px; border-radius: var(--radius-pille); display: inline-grid; place-items: center;
  background: var(--fill); border: 1px solid var(--hair); color: var(--text-soft);
  font-size: .625rem; font-weight: 800; letter-spacing: .01em;
}
.wcav.wartet { background: var(--gold); border-color: var(--gold); color: var(--deep); }
.wcmehr { font-size: .625rem; font-weight: 700; color: var(--muted); margin-left: .125rem; }

/* Deine Woche als Balken - das Ziel, auf das sich das Eintragen zubewegt
   (Mathieu, 12.09.2026: "es soll eine art belohnungs gefuehl geben wenn ein
   mitarbeiter sich z.b schichten eintraegt"). Belohnung braucht ein Ziel,
   sonst ist sie Konfetti ohne Anlass. */
.wfort {
  margin: 0 0 .75rem; padding: .5rem .75rem;
  border: 1px solid var(--hair); border-radius: var(--radius-sm); background: var(--surface);
}
.wfkopf { display: flex; align-items: baseline; justify-content: space-between; gap: .5rem; }
.wftitel { font-size: .75rem; font-weight: 800; letter-spacing: .06em; text-transform: uppercase; color: var(--muted); }
.wfzahl { font-size: .875rem; font-weight: 700; font-variant-numeric: tabular-nums; }
.wfbahn {
  display: block; height: 8px; border-radius: var(--radius-pille); background: var(--fill);
  margin: .5rem 0 .25rem; overflow: hidden;
}
.wffuell {
  display: block; height: 100%; border-radius: var(--radius-pille);
  background: linear-gradient(90deg, var(--gold), var(--accent));
  transition: width .35s ease;
}
.wfsatz { font-size: .75rem; color: var(--muted); }
/* Erreicht: der Balken wird gruen, die Zahl auch - und der Satz sagt es in
   drei Woertern. Gefeiert wird nur der Moment, in dem es kippt. */
.wfort.voll { border-color: var(--gruen); }
.wfort.voll .wffuell { background: var(--gruen); }
.wfort.voll .wfzahl { color: var(--ok); }
.wfort.voll .wfsatz { color: var(--ok); font-weight: 650; }
@media (prefers-reduced-motion: reduce) {
  .wffuell { transition: none; }
}

/* Der Wochenkopf: eine Zeile fuer das, wofuer vorher ein 107-px-Block oben
   auf der Seite stand (Mathieu, 12.09.2026: "ist zwar informativ, aber nimmt
   viel platz weg"). Und er traegt den Wochenwechsel, den die Tagesansicht
   sonst gar nicht mehr hatte. */
.wochenkopf {
  display: flex; align-items: center; gap: .5rem; margin: 0 0 .75rem;
}
.wkmitte {
  flex: 1; min-width: 0; display: flex; align-items: center; justify-content: center;
  gap: .5rem; flex-wrap: wrap;
}
.wklabel {
  font-size: .875rem; font-weight: 650; color: var(--text-soft);
  font-variant-numeric: tabular-nums;
}
.wkfehlt {
  font-size: .75rem; font-weight: 700; padding: .125rem .5rem; border-radius: var(--radius-pille);
  background: var(--warn-soft); color: var(--warn); flex: none;
}
.wkfehlt.voll { background: var(--ok-soft); color: var(--ok); }
.wkpfeil {
  flex: none; width: 34px; height: 34px; border-radius: var(--radius-pille);
  display: flex; align-items: center; justify-content: center;
  font-size: 1.125rem; line-height: 1; color: var(--text-soft);
  background: var(--fill); text-decoration: none;
}
.wkpfeil:hover { text-decoration: none; }
.wkpfeil.aus { opacity: .28; }
.wkpfeil:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }

/* Die Woche als schmaler Streifen: sieben Felder mit der Zahl offener
   Schichten. Er beantwortet "wo fehlt noch jemand" ohne einen Tipp - das
   konnte die Ziehharmonika auch, nur brauchte sie 350 px dafuer. */
.wochestreifen { display: flex; gap: .25rem; margin: 0 0 1.25rem; }
.wsztag {
  flex: 1; min-width: 0; min-height: 48px; border-radius: var(--radius-sm);
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: .125rem; padding: .25rem .125rem;
  background: var(--fill); color: var(--muted); text-decoration: none;
  font-size: .75rem; font-weight: 700; letter-spacing: .02em;
}
.wsztag:hover { text-decoration: none; }
.wsztag.ist-an { background: var(--accent); color: var(--accent-ink); }
/* Vorbei heisst blass, nicht weg: nachsehen will man manchmal doch. */
.wsztag.vorbei { opacity: .78; } /* 18.10.2026: .45 gab 1,9:1 - siehe Block "Grosse Schrift" unten */
.wsztag:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }

/* Die Zahl sitzt in einer Pille und traegt die Farbe (Mathieu, 12.09.2026:
   "dann sollte die zahl rot sein oder so ... bzw. orange" und "dann sollte
   das irgendwie gruen sein oder nen haken"). Drei Zustaende, eine Sprache -
   dieselbe, die auch die Schichtkarte spricht:
     gold      es fehlt jemand
     rot       es faengt binnen 72 Std an ODER es fehlen drei und mehr
     gruen ✓   hier passt alles
   Welcher Zustand wann gilt, steht in bedarf.js, nicht hier. */
/* Die Tagesnummer unter dem Wochentag. Erst noetig, seit der Streifen rollt:
   "Mo" ist dann nicht mehr "der Montag dieser Woche", sondern irgendein
   Montag - und welcher, sagt nur das Datum. */
.wszdatum { display: block; font-size: .625rem; font-weight: 600; color: var(--muted); line-height: 1.1;
  font-variant-numeric: tabular-nums; }
.wsztag.ist-an .wszdatum { color: inherit; opacity: .85; }
.wszzahl {
  /* inline-flex mit zentrierter Achse, nicht nur min-width: sonst klebt eine
     einstellige Zahl am linken Rand, sobald die Pille breiter ist als ihr
     Inhalt - und das ist sie bei jeder einzelnen Ziffer (Mathieu,
     12.09.2026: "mach die zahlen immer mittig von der Pille"). Gilt fuer
     beide Achsen: der Haken sitzt sonst auch einen Hauch zu tief. */
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 22px; height: 22px; padding: 0 .25rem; border-radius: var(--radius-pille);
  font-size: .875rem; font-weight: 800; line-height: 1;
  /* Ein Pixel nach unten. Gemessen, nicht geschaetzt: eine Ziffer in Poppins
     800 hat bei 13,44 px eine Oberlaenge von 9,68 px und KEINE Unterlaenge -
     mittig gesetzt sass sie damit 5,60 px unter der Oberkante und 6,72 px
     ueber der Unterkante, also 1,1 px zu hoch. Die Zeilenbox war mittig, die
     Glyphe darin nicht. */
  padding-top: 1px;
  font-variant-numeric: tabular-nums;
  background: var(--gold); color: var(--deep);
}
/* Gefuellt statt zart getoent, und das ist nachgerechnet: die Zahl ist 13 px
   fett und damit kleine Schrift - WCAG 1.4.3 fordert 4,5:1. Gold auf dem
   zarten Goldton kam auf 3,96:1 hell. Die gefuellten Paare liegen bei
   5,20 (Gold/Tinte), 6,52 (Rot) und 8,27 (Gruen) hell und noch hoeher
   dunkel. Es sind dieselben Paare, mit denen die App sonst schon
   "wartet" und "bestaetigt" sagt. */
.stufe-knapp > .wszzahl { background: var(--gold); color: var(--deep); }
.stufe-kritisch > .wszzahl { background: var(--crit); color: var(--crit-ink); }
.stufe-voll > .wszzahl { background: var(--ok); color: var(--ok-ink); }
/* Vergangene Tage rufen nach keiner Entscheidung mehr - die Zahl bleibt, die
   Farbe geht. Sonst zieht ein rotes Feld den Blick auf etwas, an dem sich
   nichts mehr aendern laesst. */
.stufe-vergangen > .wszzahl { background: transparent; color: var(--text-soft); }

/* Tag oder Monat. Der Monatskalender ist damit nicht weg - er liegt nur nicht
   mehr ueber der Tagesarbeit (Mathieu, 12.09.2026: "der Monatsansicht finde
   ich gut das man oben so wechseln kann"). */
.ansichtwahl2 {
  display: flex; gap: .25rem; margin: 0 0 1rem;
  background: var(--fill); border-radius: var(--radius-pille); padding: .25rem;
}
.aw2 {
  flex: 1; text-align: center; padding: .5rem 0; border-radius: var(--radius-pille);
  font-size: .875rem; font-weight: 650; color: var(--text-soft); text-decoration: none;
  min-height: 44px; display: flex; align-items: center; justify-content: center;
}
.aw2:hover { text-decoration: none; }
.aw2.ist-an { background: var(--surface); color: var(--text); box-shadow: var(--schatten-1); }
.aw2:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.monatssatz { font-size: .875rem; color: var(--text-soft); margin: 1rem 0 .5rem; }
.monatssatz strong { color: var(--text); }
/* Was der Monat noch frei hat - ein Weg, kein Satz: wer das liest, will
   meistens gleich hin (Mathieu, 16.09.2026). Deshalb ein Link mit Winkel und
   kein Absatz mit einer Zahl darin.
   Die Wahlfarbe, weil es genau das heisst, wofuer sie da ist: "geht dich
   jetzt an". */
.monatsfrei { margin: .125rem 0 .5rem; font-size: .875rem; }
.monatsfrei a {
  display: inline-flex; align-items: center; gap: .25rem; min-height: 44px;
  color: var(--text); text-decoration: none; font-weight: 600;
}
.monatsfrei a strong { color: var(--wahl); }
.monatsfrei a:hover { text-decoration: underline; }

/* Eine Schicht als Karte: oben Name und Zeit, darunter wer schon drin ist,
   unten der Knopf. Die Stundenzahl steht AUF dem Knopf - vorher sagte sie nur
   der Summenknopf unten, und den gibt es nicht mehr. */
/* Die Schicht als ZEILE (Mathieu, 13.09.2026: "wie koennen wir die eintragen
   seite wochenansicht noch uebersichtlicher machen?").
   Gemessen: eine Karte brauchte 176 px fuer fuenf Woerter, ein Freitag mit
   sieben Schichten 1495 px. Jetzt passt derselbe Tag auf einen Bildschirm -
   mit Kueche, Stundenleiste und Wochenbalken. */
.szliste {
  background: var(--surface); border: 1.5px solid var(--border);
  border-radius: var(--radius-sm); overflow: hidden;
}
.schichtkarte {
  display: flex; align-items: center; gap: .5rem; flex-wrap: wrap;
  padding: .5rem .75rem; border-top: 1px solid var(--hair);
  background: var(--surface);
}
.schichtkarte:first-child { border-top: 0; }
/* Der Text links darf schrumpfen, der Knopf rechts nie. */
/* flex-basis 0, nicht auto: mit "auto" ist die Grundgroesse die BREITE DES
   INHALTS ("12:00 - 20:30 · 8,5 Std" sind rund 230 px), und in einer
   umbrechenden Zeile schiebt das den Knopf in die naechste Zeile, bevor
   ueberhaupt geschrumpft wird. Mit 0 nimmt die Spalte, was uebrig bleibt -
   und Pille und Knopf stehen in jeder Zeile an derselben Stelle. */
.szwas { flex: 1 1 0; min-width: 0; display: flex; flex-direction: column; gap: .125rem; }
.skkopf { display: flex; align-items: baseline; gap: .5rem; min-width: 0; }
/* Der Name ist seit dem 16.09.2026 ein LINK auf die grosse Ansicht - er
   klappt nichts mehr auf. Eine Zeile, abgeschnitten wenn noetig: nur so
   stehen Pille und Knopf in jeder Zeile an derselben Stelle (Mathieu,
   13.09.2026). */
.skname {
  display: block; font-weight: 700;
  font-size: 1rem; line-height: 1.25; color: inherit; text-decoration: none;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  /* Poppins, nicht mehr Fraunces (05.10.2026, Richtung A: eine Schrift im
     Inhalt). Fraunces ist nur in 500 geladen, stand hier aber in 700 - der
     Browser hat das Fett selbst gerechnet, und der Name sah aus wie aus einer
     fremden App. Anton bleibt dem Datum im Kopf. */
  font-family: var(--f-text);
}
.skname:hover { text-decoration: underline; }
/* Der Name ist 19 px hoch - als LINK auf die grosse Ansicht ist das zu
   wenig (gemessen im Rundgang, 17.09.2026). Die Flaeche waechst nach oben
   und unten auf 44, ohne dass die Zeile hoeher wird: eine unsichtbare
   Erweiterung statt eines groesseren Buchstabens. Unter ihm liegt die
   Uhrzeit derselben Schicht - wer die trifft, will ohnehin dorthin. */
.skkopf { position: relative; }
.skname::after {
  content: ''; position: absolute; left: 0; right: 0; top: -12px; bottom: -13px;
}
.skzeit { font-size: .75rem; color: var(--text-soft); font-variant-numeric: tabular-nums; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
/* Der Stand rechts: eine Pille, keine Zeile. */
/* Feste Breiten fuer die zwei rechten Spalten: die Pille und der Knopf
   stehen damit in JEDER Zeile untereinander, egal wie lang der Name ist.
   Vorher wanderten sie mit dem Text - bei sieben Zeilen sieben Positionen. */
.skfehlt, .skvoll { flex: 0 0 3.6rem; text-align: center; }
.schichtkarte > .btn, .szform { flex: 0 0 6.3rem; }
/* Ohne nowrap: die Spalte ist breit genug fuer "Nehme ich", wenn der
   Innenabstand kleiner ist als der von .btn.small (0,8 rem links und
   rechts - das liess nur 75 px fuer 78 px Text, und der Knopf brach um).
   Zwei Klassen im Selektor, sonst gewinnt .btn.small ueber die Reihenfolge.
   Ein generelles nowrap am .btn waere falsch: lange Aufschriften anderswo
   muessen umbrechen duerfen. */
.szliste .schichtkarte > .btn,
.szliste .szform .btn { width: 100%; padding-left: .5rem; padding-right: .5rem; }
.skfehlt {
  font-size: .75rem; font-weight: 700;
  padding: .125rem .25rem; border-radius: var(--radius-pille);
  background: var(--warn-soft); color: var(--warn);
}
/* Dieselben drei Stufen wie im Wochenstreifen. .dringend bleibt als Name
   bestehen, weil Tests und Kommentare daran haengen - stufe-kritisch ist
   dasselbe aus der gemeinsamen Quelle. */
.skfehlt.dringend, .skfehlt.stufe-kritisch { background: var(--crit-soft); color: var(--crit); }
.skfehlt.stufe-voll { background: var(--ok-soft); color: var(--ok); }
.skvoll { font-size: .75rem; font-weight: 700; color: var(--ok); }



/* Wer schon drinsteht: eine umbrechende Zeile unter der Uhrzeit. Vorher eine
   eigene Zeile je Person - bei drei Leuten waren das drei Zeilen fuer eine
   Auskunft, die in eine passt. */
.skleute { display: flex; flex-wrap: wrap; gap: .25rem; margin: .25rem 0 0; }
/* Der Kreis ist jetzt die ganze Auskunft - also darf er auch gelesen werden
   koennen: 24 px statt 21, und die Schrift gross genug fuer zwei bis drei
   Buchstaben. Bei drei wird aus dem Kreis eine kurze Pille, statt dass der
   dritte Buchstabe herausragt. */
.skkreis {
  min-width: 24px; height: 24px; padding: 0 .25rem; border-radius: var(--radius-pille); flex: none;
  background: var(--fill); border: 1px solid var(--hair);
  display: flex; align-items: center; justify-content: center;
  font-size: .625rem; font-weight: 800; color: var(--text); letter-spacing: .02em;
}
/* Gold heisst "wartet", dieselbe Farbe, mit der die Planung im Backend
   dasselbe sagt (Mathieu, 07.09.2026). Das Woertchen "wartet" daneben ist
   weg - es war der dritte Platz fuer eine Auskunft, die der Kreis traegt und
   die rechts in der Zeile ohnehin steht ("Zurueckziehen" gibt es nur,
   solange nichts bestaetigt ist). */
.skkreis.wartet { background: var(--gold); color: var(--deep); border-color: var(--gold); }
/* Der eigene Kreis gruen (Mathieu, 13.09.2026: "sollte mein eigener Name
   immer grün geschrieben sein. Das man direkt sieht ah da arbeite ich").
   Gruen ist in dieser App die Farbe fuer "passt, steht". Seit der Name weg
   ist, traegt der Kreis beides - aber an zwei verschiedenen Stellen: die
   Fuellung sagt "wartet", der Rand sagt "das bist du". */
.skkreis.ich {
  border-color: var(--ok); color: var(--ok);
  box-shadow: 0 0 0 2px var(--ok);
}
/* Gold gewinnt ueber Gruen, was die Flaeche angeht - "wartet noch" ist die
   dringendere Auskunft. Der gruene Ring bleibt trotzdem stehen: beide
   Aussagen passen an einen Kreis, weil die eine die Fuellung ist und die
   andere der Rand. */
.skkreis.wartet.ich { color: var(--deep); }
.sksoll { flex: none; font-size: .75rem; color: var(--muted); white-space: nowrap; }

/* Eigene Zeiten - nur sichtbar, wenn jemand unten danach gefragt hat. */
/* Die Zeitfelder brauchen eine eigene Zeile: nebeneinander mit Name, Pille
   und Knopf blieben dem Namen 60 px, und "11:00 - 19:30" stand dann
   untereinander statt nebeneinander. Gemessen bei 375 px. */
.szfelder { flex: 1 0 100%; display: flex; gap: .25rem; align-items: center; font-size: .75rem; color: var(--muted); }
.szfelder label { display: flex; align-items: center; gap: .25rem; }
/* Unter 16 px zoomt iOS beim Antippen in das Feld hinein - das ist der
   Grund fuer die Schriftgroesse, nicht der Geschmack. */
.szfelder input { min-height: 44px; padding: .25rem .5rem; min-width: 5.6rem; width: 5.6rem; font-size: 1rem; }
.szmehr {
  display: block; text-align: center; padding: .5rem; font-size: .875rem;
  color: var(--text-soft); border-top: 1px solid var(--hair); text-decoration: underline;
  min-height: 44px; box-sizing: border-box;
}

/* Dieselbe Zeile in drei Zustaenden. Der wichtigste Unterschied ist, was NICHT
   unterschiedlich ist: die Kreise mit den Leuten stehen ueberall (Mathieu,
   12.09.2026: "man sieht jetzt nicht mehr wer noch arbietet ich dachte wir
   loesen das mit diesen buttons JM AT etc"). */
/* Die Kante als inset-Schatten, nicht als border: seit die Zeile runde
   Ecken hat, schnitte eine echte Kante sie gerade ab. Dieselbe Form wie
   "heute" im Wochenblock der Startseite. */
.schichtkarte.meine { background: var(--surface-2); box-shadow: inset 3px 0 0 var(--accent); }
/* Gerade eingetragen: ein kurzer Ring, damit das Auge die Zeile findet, zu
   der das Konfetti gehoert. Die Klasse steht nur in der Antwort auf den
   Klick - beim naechsten Laden ist sie weg. */
/* Der Ring kommt zur Kante DAZU, sonst loescht er sie. */
.schichtkarte.meine.frisch { box-shadow: inset 3px 0 0 var(--accent), 0 0 0 3px var(--ok-soft); }
.schichtkarte.meine .skname::before {
  content: "✓"; margin-right: .25rem; color: var(--ok); font-weight: 700;
}

/* Geht fuer diese Person nicht: die Zeile bleibt stehen und zeigt die Leute,
   nur der Knopf fehlt - und an seiner Stelle steht, warum. */
.schichtkarte.gesperrt { background: var(--fill); }
/* Der Grund ist ein ZUSTAND und sieht seit dem 17.09.2026 auch so aus
   (Mathieu: "bau alle drei"). Vorher stand er als grauer Fliesstext
   rechtsbuendig ueber zwei Zeilen - zwei Zentimeter daneben, in derselben
   Karte, stand "bestaetigt" als gruenes Zeichen. Zweimal ein Zustand,
   zweimal anders gesagt: einen musste man lesen, den anderen sah man.
   Der WORTLAUT bleibt vollstaendig. "du hast an dem Tag Urlaub" auf "Urlaub"
   zu kuerzen waere der zweite Fehler - die Seite soll den Grund sagen, nicht
   andeuten (11.09.2026). Ein Grund, der zwei Zeilen braucht, bekommt sie. */
.skgrund {
  flex: 0 1 auto; align-self: center; max-width: 10.5rem;
  padding: .25rem .5rem; border-radius: var(--radius-pille);
  background: var(--fill); color: var(--muted);
  font-size: .75rem; font-weight: 700; line-height: 1.3; text-align: left;
}
/* "Bestaetigt" und "Besetzt" als Pille mit rundem Icon-Abzeichen (Mathieu,
   17.09.2026: "mach den Besetzt und Bestaetigt Button wie im Screenshot") -
   dieselbe Bauart wie die Statuspille im Hub (.statuspill/.ic2), nur unter
   eigenem Namen: sie steht an einer Schicht, nicht an einer Aufgabe.
   .ok bekommt das leise Gluehen der anderen Zustandspillen; .still (besetzt)
   bewusst OHNE - das ist keine Auskunft, die auf sich aufmerksam machen soll,
   nur die Feststellung, dass hier nichts zu tun ist. */
.skpille {
  flex: none; display: inline-flex; align-items: center; gap: .35rem;
  font-size: .75rem; font-weight: 700; padding: .3rem .65rem;
  border-radius: var(--radius-pille); border: 1.5px solid; align-self: center;
}
.skic { width: 16px; height: 16px; border-radius: 999px; flex: none; display: flex; align-items: center; justify-content: center; }
.skic svg { width: 10px; height: 10px; }
/* "Bestätigt" ist seit Vorschlag 4 (15.10.2026) keine Pille mehr, sondern ein
   Wort in der Kopfzeile der eigenen Schicht - wie "Wartet auf Bestätigung".
   Es erbt Farbe und Versalien von .skdeine; umrandet waere es ein Knopf. */
.skbestaetigt { white-space: nowrap; }
.sdstand { margin: 0; font-size: .75rem; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; color: var(--ok); }
.skpille.still { color: var(--muted); border-color: var(--border); background: var(--fill); box-shadow: none; }
.skpille.still .skic { background: var(--muted); color: var(--bg); }

/* Der ruhige Hinweis in der Planung (Backend): leise, keine Farbe, keine Sperre. */
.stufenhinweis { margin: .25rem 0 0; font-size: .75rem; color: var(--muted); }

/* --- Zustaende sichtbar machen (Mathieu, 05.10.2026) ---------------------
   Gemessen am Testbetrieb: "wartet auf Bestaetigung" stand nur fuer
   Vorlesegeraete da, der Haken vor dem Namen sah bei einer wartenden Schicht
   genauso aus wie bei einer bestaetigten, und die Rueckmeldung nach dem
   Tippen lag ueber dem Bildschirmrand. */
/* Der Haken gehoert zu "Bestaetigt". Wer noch wartet, bekommt das Wort. */
.schichtkarte.meine.wartet .skname::before { content: none; }
/* Gold = "wartet" (dieselbe Farbe wie der Kreis und das Backend). Das Wort
   traegt die Auskunft, die Farbe nur die Naehe - deshalb Schrift in Tinte. */
.skwartet {
  align-self: flex-start; margin-top: .25rem;
  padding: .125rem .5rem; border-radius: var(--radius-pille);
  border: 1.5px solid var(--gold); background: var(--gold-soft); color: var(--text);
  font-size: .75rem; font-weight: 700; line-height: 1.3;
}
/* Daumengroesse: 44 px statt 40 fuer die zwei Knoepfe in der Karte. */
.szliste .schichtkarte > .btn,
.szliste .szform .btn { min-height: 44px; }

/* "Geht fuer dich nicht" - EINE Zeile je Grund, aufklappbar. */
.sperrgruppe {
  background: var(--fill); border-radius: var(--radius-sm);
  border: 1px solid var(--hair);
}
.sperrkopf {
  display: flex; align-items: center; gap: .75rem; cursor: pointer;
  list-style: none; min-height: 56px; padding: .5rem .75rem;
}
.sperrkopf::-webkit-details-marker { display: none; }
.sperrwas { flex: 1 1 0; min-width: 0; display: flex; flex-direction: column; gap: .125rem; }
.sperrwas strong { font-size: 1rem; line-height: 1.3; }
.sperrgrund { font-size: .875rem; color: var(--muted); line-height: 1.35; }
.sperrpfeil { flex: none; font-size: 1.3125rem; color: var(--muted); transition: transform .15s; }
.sperrgruppe[open] > .sperrkopf .sperrpfeil { transform: rotate(90deg); }
.sperrliste { display: flex; flex-direction: column; gap: .5rem; padding: 0 .5rem .5rem; }
.sperrliste .schichtkarte { background: var(--surface); }

/* Die Rueckmeldung: ein Streifen UNTEN ueber der Leiste. Fest, damit der
   Sprung zur Karte (#s-...) sie nicht ueber den Rand schiebt. Blendet sich
   nach 14 s selbst aus (reines CSS, kein Skript); das Kreuz schliesst sofort.
   Die Kante links traegt die Art: gruen "geklappt", gold "wartet", rot
   "hat nicht geklappt" - Form und Wort stehen daneben, die Farbe allein
   sagt es nicht. */
.banner.rueckmeldung {
  position: fixed; left: .6rem; right: .6rem; z-index: 45; margin: 0 auto;
  bottom: calc(5.75rem + env(safe-area-inset-bottom, 0px));
  max-width: 38rem; align-items: center; flex-wrap: wrap; gap: .25rem .5rem;
  padding: .5rem .5rem .5rem 1rem;
  background: linear-gradient(var(--ok-soft), var(--ok-soft)), var(--surface);
  border: 1px solid var(--border-strong);
  box-shadow: inset 4px 0 0 var(--ok), var(--schatten-3);
  font-size: .875rem; line-height: 1.35;
  animation: rmweg .01s linear 14s forwards;
}
.banner.rueckmeldung.wartet { box-shadow: inset 4px 0 0 var(--gold), var(--schatten-3); }
.banner.rueckmeldung.err {
  background: linear-gradient(var(--crit-soft), var(--crit-soft)), var(--surface);
  box-shadow: inset 4px 0 0 var(--crit), var(--schatten-3);
  animation: none;
}
.rmzeichen { flex: none; font-weight: 700; }
.rmtext { flex: 1 1 0; min-width: 0; }
.rmzusatz { display: block; color: var(--muted); }
.rmform { order: 3; flex: 1 0 100%; padding-left: 1.5rem; }
.banner.rueckmeldung .rmform .btn { min-height: 44px; }
.rmzu {
  flex: none; display: flex; align-items: center; justify-content: center;
  min-width: 44px; min-height: 44px; color: var(--muted); text-decoration: none; font-size: 1rem;
}
@keyframes rmweg { to { visibility: hidden; opacity: 0; pointer-events: none; } }

/* --- Die Schicht als Karte (Mathieu, 16.09.2026: "Ja, bau 1-4") ----------
   Bis heute war die Liste eine Tabelle: ein Rahmen aussen, Haarlinien
   innen. Das liest sich nuechtern - und die Startseite besteht seit dem
   Wochenblock aus Karten. Eine Sprache, nicht zwei.
   Der Rahmen faellt weg, die Zeile bekommt Ecken und Abstand. */
.szliste { background: none; border: 0; border-radius: 0; overflow: visible;
  display: flex; flex-direction: column; gap: .5rem; }
.szliste .schichtkarte { border-top: 0; border-radius: var(--radius-sm); }
.schichtkarte:first-child { border-top: 0; }

/* Die Zeitspur: 11 bis 3 Uhr, in JEDER Karte dieselbe Skala - dieselbe
   Rechnung wie im Wochenblock (bahnFuer). Untereinander gelesen ist sie
   das, wofuer bis heute ein eigener Block unter den Schichten stand: wer
   wann da ist, und wo der Abend eine Luecke hat.
   Ein abgeschnittenes Ende bleibt eckig - eine Schicht ab 09:00 faengt vor
   der Skala an, und ein rundes Ende wuerde das Gegenteil behaupten. */
.skspur {
  flex: 1 0 100%; position: relative; display: block; height: 5px; border-radius: var(--radius-pille);
  margin: .5rem 0 1.25rem; background: color-mix(in srgb, var(--text) 12%, transparent);
}
/* Die Stundenlinien HINTER der Spur - 11, 15, 19, 23, 03, also alle vier
   Stunden ein Strich. Sie stehen im Hintergrund der Spur selbst, damit sie
   mit ihr wandern und nie danebenliegen koennen. */
.skspur {
  background-image: repeating-linear-gradient(
    to right,
    color-mix(in srgb, var(--text) 22%, transparent) 0 1px,
    transparent 1px 25%
  );
}
.skbalken { position: absolute; top: 0; bottom: 0; border-radius: var(--radius-pille); background: var(--bar); z-index: 1; }
/* Anfang und Ende an den Enden des Balkens. Sie haengen an seiner Position,
   wandern also mit - erst damit sagt der Balken eine Uhrzeit und nicht nur
   "spaeter als der darueber" (Mathieu, 16.09.2026).
   Die linke Marke haengt mit ihrem Anfang am Balkenanfang, die rechte mit
   ihrem ENDE am Balkenende (translateX(-100%)) - sonst stuende sie bei einer
   Schicht bis 01:00 halb ausserhalb der Spur. */
.skvon, .skbis {
  position: absolute; top: 8px; font-style: normal;
  font-size: .625rem; font-weight: 600; color: var(--muted);
  font-variant-numeric: tabular-nums; white-space: nowrap;
}
.skbis { transform: translateX(-100%); }

/* Die beschriftete Achse unter der letzten Karte ist am 05.10.2026
   entfallen: die Uhrzeit steht links in jeder Karte (Richtung A). */
.skbalken.vorher { border-top-left-radius: 1px; border-bottom-left-radius: 1px; }
.skbalken.nachher { border-top-right-radius: 1px; border-bottom-right-radius: 1px; }
/* EINE Farbe fuer alle Balken (Mathieu, 16.09.2026: "mach bei eingetragen
   den balken in einer farbe"). Vorher sprachen sie dieselbe Sprache wie die
   Karte drumherum - gruen meine, gold die Kueche, blass das Gesperrte - und
   damit dreimal dasselbe auf derselben Zeile. Die Spur beantwortet genau
   eine Frage: WANN. Wem die Schicht gehoert, steht daneben. */

.szmehr { border-top: 0; }

/* --- Schicht eintragen, Richtung A (Mathieu, 05.10.2026) -----------------
   "Nimm A mit der Lückenzeile, Knopf grün." Aus dem Vergleich dreier
   Richtungen (nachweise/design-ordio/schichten/). Gemessen auf dem ersten
   Bildschirm vorher: drei Schriften, sechs Gewichte, elf farbig gefuellte
   Flaechen, 13 von 18 Tippzielen unter 44 px. Die Regeln hier gelten nur in
   der Schichtliste (.szliste) und im Streifen mit dem Rahmen "team" - die
   grosse Ansicht einer Schicht und der Streifen im Backend bleiben, wie sie
   sind. */

/* Der Kopf: Winkel und Umschalter rechts, darf umbrechen, statt zu
   ueberlaufen ("30. September" ist das laengste Datum). */
.tagkopf { flex-wrap: wrap; }
.tagkopf .tkrechts { display: flex; align-items: center; gap: .25rem; }

/* Der Bereich als kleines Etikett mit Haarlinie (statt einer Zeile ohne
   Linie) - die Haarlinie fuehrt das Auge zur Zahl rechts. */
.bkopf .blinie { flex: 1 1 1.5rem; align-self: center; height: 1px; background: var(--hair-strong); }

/* Die Lueckenzeile: WANN am Tag noch Leute fehlen. Rot ist "fehlt" - als
   Schrift, nicht als Flaeche. */
.lueckenzeile {
  display: flex; flex-wrap: wrap; align-items: baseline; gap: .125rem .375rem;
  margin: 0 .25rem .25rem; font-size: .875rem; line-height: 1.4; color: var(--text-soft);
}
.lzname { font-size: .625rem; font-weight: 600; letter-spacing: .08em; text-transform: uppercase; color: var(--muted); margin-right: .125rem; }
.lzfenster { font-weight: 600; color: var(--crit); font-variant-numeric: tabular-nums; white-space: nowrap; }
.lztrenn { color: var(--muted); }

/* Die Karte: Uhrzeit links, Name und Leute in der Mitte, rechts genau EIN
   Ding - der Knopf, das Zurueckziehen oder der Zustand. */
.szliste .schichtkarte {
  position: relative; display: grid; grid-template-columns: 3.25rem minmax(0, 1fr) auto;
  align-items: center; column-gap: .875rem; row-gap: .375rem;
  padding: .875rem .875rem 1.125rem 1rem;
  background: var(--surface); border-radius: var(--radius); box-shadow: var(--schatten-1);
}
.szliste .schichtkarte > .skuhr { grid-column: 1; grid-row: 1; }
.szliste .schichtkarte > .szwas { grid-column: 2; grid-row: 1; }
.szliste .schichtkarte > .btn,
.szliste .schichtkarte > .szform,
.szliste .schichtkarte > .skpille,
.szliste .schichtkarte > .skgrund { grid-column: 3; grid-row: 1; position: relative; z-index: 1; }
.szliste .schichtkarte > .szfelder { grid-column: 1 / -1; position: relative; z-index: 1; }
.skuhr { display: flex; flex-direction: column; line-height: 1.25; font-variant-numeric: tabular-nums; }
.skuhr b { font-size: 1rem; font-weight: 600; color: var(--text); }
.skuhr span { font-size: .75rem; color: var(--muted); }
.skuhr.ohne span { font-size: .75rem; }
/* Die Zeit als Satz bleibt fuer Vorlesegeraete (die Spalte links ist
   aria-hidden) - am Bildschirm stuende sie sonst zweimal da. */
.szliste .skzeit {
  position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap;
}
.szliste .skname { font-size: 1rem; font-weight: 600; line-height: 1.3; white-space: normal; overflow: visible; }
/* Die ganze Karte ist der Weg in die grosse Ansicht - Knopf, Formular und
   Zeitfelder liegen darueber (z-index) und bleiben, was sie sind. */
.szliste .skkopf { position: static; }
.szliste .skname::after { top: 0; right: 0; bottom: 0; left: 0; border-radius: var(--radius); }
.szliste .skleute { display: block; margin: .125rem 0 0; font-size: .875rem; line-height: 1.4; color: var(--text-soft); }
.skwer.ich { color: var(--ok); font-weight: 600; }
.skwer.wartet::before {
  content: ''; display: inline-block; width: 7px; height: 7px; margin-right: 4px; vertical-align: 1px;
  border-radius: var(--radius-pille); box-shadow: inset 0 0 0 1.5px currentColor;
}
.skniemand { color: var(--muted); }
.sktrenn { color: var(--muted); }
/* Was noch fehlt: Schrift in der Farbe der Dringlichkeit, keine Pille. */
.szliste .skfehlt { padding: 0; background: none; font-size: inherit; font-weight: 600; color: var(--warn); flex: none; text-align: left; }
.szliste .skfehlt.dringend, .szliste .skfehlt.stufe-kritisch { background: none; color: var(--crit); }
.szliste .skfehlt.stufe-voll { background: none; color: var(--ok); }
.szliste .skvoll { flex: none; text-align: left; }
.szliste .skwartet { display: inline-block; align-self: auto; margin-top: .375rem; }
/* Wartet die eigene Schicht noch, rutscht "Zurückziehen" unter den Namen -
   neben dem Knopf brach "Wartet auf Bestätigung" sonst in zwei Zeilen. */
.szliste .schichtkarte.meine.wartet > .szform { grid-column: 2 / -1; grid-row: 2; justify-self: start; }
.szliste .sksoll { display: block; margin-top: .25rem; }
/* "Nehme ich · 8,5 Std" - gruen gefuellt, zwei Zeilen, Daumengroesse. */
.szliste .schichtkarte > .btn.sknehmen {
  width: auto; min-width: 6rem; min-height: 48px; padding: .3125rem .875rem;
  display: flex; flex-direction: column; align-items: center; justify-content: center; line-height: 1.15;
}
.skstd { display: block; font-size: .75rem; font-weight: 500; opacity: .9; }
.szliste .szform .btn { width: auto; }
/* Die Zeitspur: eine 2-px-Linie am unteren Rand der Karte. Die Uhrzeiten
   an ihren Enden braucht sie nicht mehr - sie stehen links. */
.szliste .schichtkarte > .skspur {
  position: absolute; left: 1rem; right: 1rem; bottom: 8px; height: 2px; margin: 0;
  background: var(--hair); background-image: none; pointer-events: none;
}
.szliste .skspur .skvon, .szliste .skspur .skbis { display: none; }
.szliste .skspur .skbalken { opacity: .75; }
/* Meine Schicht: Karte mit Kante, wie "heute" im Wochenblock. */
.szliste .schichtkarte.meine { background: var(--surface); box-shadow: inset 3px 0 0 var(--accent), var(--schatten-1); }
.szliste .schichtkarte.meine.frisch { box-shadow: inset 3px 0 0 var(--accent), 0 0 0 3px var(--ok-soft); }
/* Voll und "geht nicht": leise, nur umrandet - hier ist nichts zu tun. */
.szliste .schichtkarte.gesperrt {
  background: transparent; box-shadow: inset 0 0 0 1px var(--hair-strong);
  padding-top: .75rem; padding-bottom: 1rem;
}
.szliste .schichtkarte.gesperrt .skname,
.szliste .schichtkarte.gesperrt .skuhr b { color: var(--text-soft); font-weight: 500; }
.sperrliste .schichtkarte.gesperrt { background: var(--surface); }
.szliste .skpille.still { padding: 0; border: 0; background: none; color: var(--muted); font-weight: 500; }
.szliste .skpille.still .skic { display: none; }
.skvollkopf { margin: .5rem .25rem 0; font-size: .75rem; font-weight: 500; color: var(--muted); }
/* "Andere Zeiten eintragen": ein Weg, also ein volles Tippziel. */
.szliste .szmehr { display: flex; align-items: center; justify-content: center; min-height: 44px; }
/* "Mit kuerzerer Zeit eintragen" unter dem Jugendschutz-Grund (Mathieu, 23.10.2026): unterstrichen = die leise Handlung, 44 px hoch. */
/* Eine gesperrte Jugendschutz-Karte: Name oben, der Grund in Zeile 2 (ueber die zwei breiten Spalten), der Weg zur kuerzeren Zeit darunter -
   nicht in der schmalen dritten Spalte, in der er den Namen zerdrueckt (am eigenen Bild gesehen). */
.szliste .schichtkarte > .szjugendgrund { grid-column: 2 / -1; grid-row: 2; font-size: .875rem; line-height: 1.35; color: var(--muted); position: relative; z-index: 1; }
.szliste .schichtkarte > .szkurz { grid-column: 2 / -1; grid-row: 3; position: relative; z-index: 1; }
.szliste .schichtkarte.jugendkarte > .szfelder { grid-row: 3; }
.szliste .schichtkarte > .szkurzknopf { grid-column: 1 / -1; grid-row: 4; position: relative; z-index: 1; width: 100%; min-height: 48px; }
.szkurz { display: flex; align-items: center; min-height: 44px; font-size: .875rem; font-weight: 600; color: var(--accent); text-decoration: underline; text-underline-offset: 3px; }

/* --- Feinschliff (Mathieu, 05.10.2026: "Bau alles so und U1 bei Zeitleiste")
   "die Schichten bisschen mehr vom Hintergrund abheben. Wenn man arbeitet
   irgendwie deutlicher machen. Wenn ne Person fehlt deutlicher machen."
   Rangfolge auf der Seite: eigene Schicht > es fehlt jemand > voll (leise).
   Vorschlag mit Messwerten: nachweise/feinschliff/. */

/* 1a - jede Karte mit Rand und der zweiten Schattenstufe. */
.szliste .schichtkarte { box-shadow: 0 0 0 1px var(--border), var(--schatten-2); }

/* 2 - "Hier arbeite ich": gruen getoent, gruene Kante, Kicker. Wartet sie
   noch, ist die Flaeche NICHT getoent und der Rahmen gestrichelt - erst die
   Bestaetigung macht sie fest. Die Toenung (L* 93,8) liegt ueber dem
   dunkleren Grund (91,6): Karte bleibt Karte. */
.szliste .schichtkarte.meine {
  background: color-mix(in srgb, var(--surface) 72%, var(--ok-soft));
  box-shadow: inset 5px 0 0 var(--ok), 0 0 0 1px color-mix(in srgb, var(--ok) 35%, transparent), var(--schatten-2);
}
.szliste .schichtkarte.meine.wartet {
  background: var(--surface);
  box-shadow: inset 5px 0 0 var(--ok), var(--schatten-2);
  outline: 1.5px dashed var(--ok); outline-offset: -1.5px;
}
.szliste .schichtkarte.meine.frisch { box-shadow: inset 5px 0 0 var(--ok), 0 0 0 3px var(--ok-soft), var(--schatten-2); }
/* Der Haken vor dem Namen ist doppelt, seit "Deine Schicht" darueber steht
   und "Bestaetigt" daneben. */
.szliste .schichtkarte.meine .skname::before { content: none; }
.skdeine {
  display: block; margin-bottom: 2px; font-size: .75rem; font-weight: 700;
  letter-spacing: .08em; text-transform: uppercase; color: var(--ok);
}
.skdeine.wartet { color: var(--warn); }
.szliste .skdeine .skwartet {
  display: inline; margin: 0; padding: 0; border: 0; background: none;
  font: inherit; color: inherit; letter-spacing: inherit;
}
.szliste .meine .skuhr b { font-size: 1.125rem; }
/* 3 - "Es fehlt jemand": Kante in der Farbe der Luecke (gold, rot nur wenn
   kritisch), die Zahl als Plakette (4,84:1 gold, 5,12:1 rot), die
   Lueckenzeile als Band. */
.szliste .schichtkarte.offen { box-shadow: inset 4px 0 0 var(--warn), 0 0 0 1px var(--border), var(--schatten-2); }
.szliste .schichtkarte.offen.stufe-kritisch { box-shadow: inset 4px 0 0 var(--crit), 0 0 0 1px var(--border), var(--schatten-2); }
.szliste .skleute .skfehlt {
  display: inline-block; padding: 0 .5rem; border-radius: var(--radius-pille);
  background: var(--warn-soft); color: var(--warn); font-weight: 700;
}
.szliste .skleute .skfehlt.dringend, .szliste .skleute .skfehlt.stufe-kritisch { background: var(--crit-soft); color: var(--crit); }
.lueckenzeile { margin: 0 0 .625rem; padding: .5rem .75rem; border-radius: var(--radius-sm); background: var(--crit-soft); color: var(--crit); }
.lueckenzeile .lzname, .lueckenzeile .lztrenn { color: var(--crit); }
/* Voll am leisesten: ohne Spur, blasse Schrift, nur ein Rand. */
.szliste .schichtkarte.gesperrt { box-shadow: inset 0 0 0 1px var(--hair-strong); }
.szliste .schichtkarte.gesperrt .skspur { display: none; }
.szliste .schichtkarte.gesperrt .skname,
.szliste .schichtkarte.gesperrt .skuhr b,
.szliste .schichtkarte.gesperrt .skleute { color: var(--muted); }

/* 4a - der Leerzustand: ein Weg zur naechsten Luecke. */
.naechsteluecke {
  display: flex; align-items: center; justify-content: space-between; gap: .75rem;
  min-height: 52px; margin: 0 0 1rem; padding: .625rem .875rem; border-radius: var(--radius-sm);
  background: var(--surface); box-shadow: 0 0 0 1px var(--border), var(--schatten-1);
  color: var(--text); text-decoration: none; font-size: .875rem; line-height: 1.4;
}
.naechsteluecke:hover { text-decoration: none; }
.naechsteluecke b { display: block; font-weight: 600; }
.nlpfeil { flex: none; font-size: 1.125rem; color: var(--muted); }
/* 4b - "geht fuer dich nicht" ist eine Auskunft, keine Schicht: kein Feld,
   gestrichelter Rand, die Ueberschrift halbfett in der zweiten Tinte. Die
   Schrift bleibt so gross wie bisher. */
.szliste .sperrgruppe { background: transparent; border: 1px dashed var(--border-strong); }
.szliste .sperrwas strong { font-weight: 600; color: var(--text-soft); }
.szliste .sperrkopf { min-height: 48px; }
/* 4c - "+1" an der Endzeit links. */
.skuhr .nextday { font-size: .625rem; }
/* 4d - Rhythmus: etwas mehr Luft zwischen Karten und Gruppen. */
.szliste { gap: .625rem; }
.bgruppe:has(.szliste) { margin-bottom: 1.5rem; }
.skvollkopf { margin-top: .875rem; }
.wszlegende { margin-bottom: .75rem; }

/* Die Zeitleiste: eine Karte, in Welt 1 je PERSON eine Zeile (Mathieu,
   23.10.2026, E2 - die Regeln der Zeilen stehen in stil-w1-schichten.js). Hier
   bleiben die Karte und die Luecken-Spur unten. Die Regeln der alten Bahnen
   (.zlbahn, .zlbalken, .zlleute ...) und des alten Umschalters (.tagform,
   .tfwahl) sind mit ihrem Markup gegangen. */
.zeitleiste {
  position: relative; padding: .75rem .875rem .75rem 1rem; border-radius: var(--radius);
  background: var(--surface); box-shadow: 0 0 0 1px var(--border), var(--schatten-2);
}
.zlluecken {
  position: relative;
  background-image: repeating-linear-gradient(to right, var(--hair) 0 1px, transparent 1px 12.5%);
}
.zlluecken { min-height: 46px; margin-top: 2px; border-top: 1px dashed var(--hair-strong); }
.zllname {
  position: absolute; left: 0; top: 5px; font-size: .625rem; font-weight: 600;
  letter-spacing: .08em; text-transform: uppercase; color: var(--muted);
}
.zlluecke {
  position: absolute; top: 21px; height: 20px; border-radius: 5px; overflow: hidden;
  display: flex; align-items: center; justify-content: center;
  background: var(--crit-soft); color: var(--crit); font-size: .75rem; font-weight: 700; white-space: nowrap;
}
/* Das Blatt unter der Zeitleiste: was die angetippte Schicht ist, und die
   eine Handlung dazu - "Nehme ich" gruen wie in der Liste. */
.zlblatt {
  display: flex; flex-direction: column; gap: .625rem; margin: .625rem 0 0; padding: .875rem 1rem;
  border-radius: var(--radius); background: var(--surface);
  box-shadow: inset 0 0 0 2px var(--wahl), var(--schatten-2);
}
.zlbkopf { display: flex; flex-direction: column; line-height: 1.35; }
.zlbkopf b { font-size: 1rem; font-weight: 600; }
.zlbzeit { font-size: .875rem; color: var(--text-soft); font-variant-numeric: tabular-nums; }
.zlbkopf .skleute { display: block; margin-top: .125rem; font-size: .875rem; color: var(--text-soft); }
.zlbkopf .skfehlt { padding: 0 .5rem; border-radius: var(--radius-pille); background: var(--warn-soft); color: var(--warn); font-weight: 700; }
.zlbkopf .skfehlt.stufe-kritisch { background: var(--crit-soft); color: var(--crit); }
.zlbaktion { display: flex; align-items: center; justify-content: space-between; gap: .75rem; flex-wrap: wrap; }
.zlbaktion .btn { min-height: 48px; }
.zlbmehr { display: inline-flex; align-items: center; gap: .25rem; min-height: 44px; font-size: .875rem; font-weight: 600; color: var(--accent); }
.zlblatt .szfelder { flex: none; }


.empmenu-cb { position: absolute; opacity: 0; pointer-events: none; width: 0; height: 0; }
.empmenu-backdrop { display: none; }
.empmenu {
  position: fixed; top: 0; right: -320px; bottom: 0; width: 300px; max-width: 84vw;
  background: var(--surface); z-index: 60; overflow-y: auto;
  /* Die Schublade beginnt am Bildrand, also unter der Uhrzeit - ihr eigener
     Kopf braucht denselben Abstand wie die Leiste. */
  padding-top: var(--safetop);
  box-shadow: -12px 0 32px rgba(0, 0, 0, .18);
  transition: right .22s ease;
}
.empmenu-head {
  display: flex; align-items: center; justify-content: space-between;
  padding: 1rem 1rem 1rem; font-weight: 700; font-size: 1rem;
  border-bottom: 1px solid var(--hair);
}
.empmenu-close {
  /* 44x44 statt 30x30 (gemessen 08.09.2026). Ein Kreuz allein hat keinen
     Text, an dem sich der Finger orientieren kann - da ist die Flaeche alles. */
  cursor: pointer; width: 44px; height: 44px; border-radius: var(--radius-pille);
  display: flex; align-items: center; justify-content: center; color: var(--muted);
}
.empmenu-close:hover { background: var(--fill); }
.empmenu a {
  display: flex; align-items: center; gap: .75rem;
  padding: .75rem 1rem; border-bottom: 1px solid var(--hair);
  color: var(--text); text-decoration: none;
}
.empmenu a:hover { background: var(--fill); text-decoration: none; }
/* Ein Wort je Zeile und ein Pfeil (Vorschlag 7, 15.10.2026) - wie "Mehr" in
   der Planung. Mindestens 56 px hoch: die Zeilen sind jetzt ohne Unterzeile,
   das Tippziel soll dadurch nicht kleiner werden. */
.empmenu.emp a { min-height: 56px; }
.empmenu-text { flex: 1 1 auto; }
/* "Tauschen" ist UMRANDET (Vorschlag 5, 15.10.2026): "kannst du machen",
   zweiter Rang - wie "Annehmen" in der Planung. Vorher fuenf gefuellte
   Knoepfe untereinander, und gefuellt heisst "das eine Wichtige" (Eine
   Tinte). 44 px hoch, das Daumenmass. */
.btn.tauschknopf {
  background: transparent; color: var(--accent); border: 1.5px solid currentColor;
  min-height: 44px; padding: .5rem 1rem; font-size: .875rem;
}
.btn.tauschknopf:hover { background: var(--fill); }
/* Stempeluhr (Vorschlag 6): oben die Schicht, unten der Rechtstext zum
   Aufklappen. Die Zusammenfassung ist ein 44-px-Tippziel. */
.stschicht { margin: 0; }
.stschichtzeit { font-weight: 500; white-space: nowrap; }
.erfasstklapp { margin: 1rem 0 0; color: var(--muted); font-size: .875rem; }
.erfasstklapp > summary {
  min-height: 44px; display: flex; align-items: center; gap: .375rem;
  font-weight: 600; color: var(--text-soft); cursor: pointer; list-style: none;
}
.erfasstklapp > summary::-webkit-details-marker { display: none; }
.erfasstklapp > p { margin: .25rem 0 .75rem; line-height: 1.5; }
.empmenu a[aria-current="page"] { background: var(--accent-soft); }
.empmenu-icon {
  flex: none; width: 38px; height: 38px; border-radius: var(--radius-xs); background: var(--fill);
  display: flex; align-items: center; justify-content: center;
}
/* Die gezeichneten Icons brauchen mehr Platz als die Emojis vorher: eine
   Kontur mit Flaeche darin wird bei 20 px matschig. --ak ist die gefuellte
   Flaeche, die Kontur nimmt die Farbe der Zeile (currentColor). */
.ic { --ak: var(--gold); --ak-auf: currentColor; width: 100%; height: 100%; display: block; }
/* Das Notfall-Dreieck ist rot (Mathieu, 11.09.2026: "notfall vielleicht das
   dreieck rot?"). Die einzige Ausnahme von der goldenen Flaeche - und eine,
   die sich rechtfertigt: Rot heisst in dieser App "fehlt, kritisch", und
   genau das ist dieser Menuepunkt. Das Ausrufezeichen darin nimmt --crit-ink,
   den Ton, der fuer Schrift AUF Rot gedacht ist: mit currentColor waere es
   Tinte auf Rot, 1,69:1, und damit unsichtbar. Nachgerechnet: 6,52 hell,
   7,62 dunkel. */
.ic-warnung { --ak: var(--crit); --ak-auf: var(--crit-ink); }
.empmenu-icon .ic { width: 24px; height: 24px; }
/* --- Nur das Mitarbeiter-Menue (.empmenu.emp), NICHT die Planung im
   Backend -------------------------------------------------------------
   Beide teilen sich .empmenu/.empmenu-icon (dieselbe Vorlage in layout()),
   aber nur die Mitarbeiterseite bekommt die neue Optik (Mathieu,
   17.09.2026: "mach jetzt auch das Menü so wie im Entwurf", nach einer
   eigens gezeigten und freigegebenen Vorschau). Das Backend bleibt bei
   Marine/Gold - der Entwurf war nie fuer die Planung gedacht. */
.empmenu.emp a[aria-current="page"] {
  background: #F2660A; color: #200E02;
}
.empmenu.emp a[aria-current="page"] .empmenu-hint { color: inherit; opacity: .78; }
.empmenu.emp a[aria-current="page"] .empmenu-icon { background: rgba(32, 14, 2, .16); color: #200E02; }
.empmenu.emp a[aria-current="page"] .empmenu-icon .ic { --ak: #200E02; }
/* Rund statt eckig, mit oranger Toenung statt der stillen Flaeche. Die
   Toenung ist eine feste Farbe mit Deckkraft statt eines Hell/Dunkel-Paars -
   auf dem jeweiligen --surface darunter ergibt das in beiden Modi genug
   Abstand, ohne zwei Werte pflegen zu muessen. */
.empmenu.emp .empmenu-icon {
  border-radius: 999px; background: rgba(242, 102, 10, .14); color: #F2660A;
  width: 42px; height: 42px;
}
.empmenu.emp .empmenu-icon .ic { --ak: #F2660A; }
.empmenu.emp .empmenu-icon:has(.ic-warnung) { background: var(--crit-soft); color: var(--crit); }
/* Falls Notfall selbst die aktive Seite ist (die Person hat das Menue von
   dort aus geoeffnet): Rot bleibt Rot, gewinnt also ueber die orange
   Aktiv-Flaeche oben. */
.empmenu.emp a[aria-current="page"] .empmenu-icon:has(.ic-warnung) { background: var(--crit-soft); color: var(--crit); }
.empmenu.emp a[aria-current="page"] .empmenu-icon:has(.ic-warnung) .ic { --ak: var(--crit); }
/* Auf Orange ginge das Gold im Icon unter - zwei warme Toene dicht
   beieinander. Dort wird die Flaeche das dunkle Marine; auf dunklem Grund
   bleibt sie Gold. */
.deckblock .ic { --ak: var(--gold); }
.empmenu-gruppe {
  font-size: .625rem; font-weight: 700; letter-spacing: .09em; text-transform: uppercase;
  color: var(--muted); padding: 1rem 1rem .25rem; background: var(--surface-2);
  border-bottom: 1px solid var(--hair);
}
.empmenu-text { display: flex; flex-direction: column; gap: .125rem; min-width: 0; }
.empmenu-label { font-weight: 650; font-size: 1rem; }
.empmenu-hint { font-size: .75rem; color: var(--muted); }
/* "Abmelden" muss ein Formular sein (POST), soll aber wie die Links daneben
   aussehen - deshalb ein Knopf ohne eigenes Aussehen im Schubfach. */
.empmenu-form { margin: 0; }
.empmenu-form button {
  display: flex; align-items: center; gap: .75rem; width: 100%;
  padding: .75rem 1rem; border: 0; border-bottom: 1px solid var(--hair);
  background: none; color: var(--text); font: inherit; text-align: left; cursor: pointer;
}
.empmenu-form button:hover { background: var(--fill); }
.empmenu .navbadge {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 1.25rem; height: 1.25rem; margin-left: .5rem; padding: 0 .25rem;
  border-radius: var(--radius-pille); background: var(--crit); color: var(--crit-ink);
  font-size: .75rem; font-weight: 700;
}
.empmenu-cb:checked ~ .empmenu-backdrop {
  display: block; position: fixed; inset: 0; z-index: 55; background: rgba(0, 0, 0, .35);
}
.empmenu-cb:checked ~ .empmenu { right: 0; }

/* ---- Seitenleiste der Planung ------------------------------------------ */
/* Am Rechner steht die Navigation fest links, am Handy bleibt es beim
   Schubfach. Beide kommen aus DERSELBEN Liste (adminNav) - nur so kann ein
   neuer Menuepunkt nicht an einer der beiden Stellen fehlen.

   Die Grenze liegt bei 1000 px: darunter frisst eine feste Leiste zu viel
   von der Breite, die der Dienstplan fuer seine Tageskarten braucht. */
.adminseite { display: none; }
.burgerbtn { display: flex; }
@media (min-width: 1000px) {
  .adminseite {
    display: flex; flex-direction: column; gap: .125rem;
    position: fixed; left: 0; top: 0; bottom: 0; width: 210px; z-index: 30;
    background: var(--surface); border-right: 1px solid var(--border);
    padding: calc(1rem + var(--safetop)) .75rem 1.25rem; overflow-y: auto;
  }
  /* Der Inhalt rueckt nach rechts, statt dass die Leiste ueber ihm liegt. */
  body.mit-seite { padding-left: 210px; }
  /* Kopfzeile und Menuesymbol werden dann nicht mehr gebraucht. */
  body.mit-seite > .topbar, body.mit-seite .empmenu, body.mit-seite .empmenu-backdrop { display: none; }
}
.asmarke {
  font-family: var(--f-text); font-weight: 700; font-size: 1rem;
  letter-spacing: -.02em; padding: .25rem .5rem 1rem; color: var(--text); text-decoration: none;
}
.asmarke:hover { text-decoration: none; }
.asgruppe {
  font-size: .625rem; font-weight: 700; letter-spacing: .09em; text-transform: uppercase;
  color: var(--muted); margin: 1rem 0 .25rem .5rem;
}
.aslink {
  display: flex; align-items: center; gap: .5rem;
  padding: .5rem .5rem; border-radius: var(--radius-xs);
  font-size: .875rem; font-weight: 500; color: var(--text); text-decoration: none;
}
.aslink:hover { background: var(--fill); text-decoration: none; }
.aslink[aria-current="page"] { background: var(--deep); color: var(--deep-ink); font-weight: 650; }
.aslink .ic { width: 16px; height: 16px; flex: none; opacity: .78; }
.aslink[aria-current="page"] .ic { opacity: 1; --ak: var(--deep-ink); }
.aslink .navbadge {
  margin-left: auto; min-width: 18px; height: 18px; padding: 0 .25rem; border-radius: var(--radius-pille);
  background: var(--accent); color: var(--accent-ink);
  font-size: .625rem; font-weight: 700; display: flex; align-items: center; justify-content: center;
}
.asform { margin: .25rem 0 0; }
.asform button {
  display: flex; align-items: center; gap: .5rem; width: 100%;
  padding: .5rem .5rem; border: 0; border-radius: var(--radius-xs); background: none;
  color: var(--muted); font: inherit; font-size: .875rem; text-align: left; cursor: pointer;
}
.asform button:hover { background: var(--fill); }
.asform button .ic { width: 16px; height: 16px; flex: none; opacity: .7; }

.wrap { max-width: 1120px; margin: 0 auto; padding: 1.5rem var(--pad) 4rem; }
.wrap.narrow { max-width: 720px; }

/* ---- Uebersicht der Planung ------------------------------------------- */
.ukacheln { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: .75rem; margin-bottom: 1rem; }
.ukachel {
  background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-sm);
  padding: .75rem 1rem; text-decoration: none; color: var(--text); display: block;
}
a.ukachel:hover { border-color: var(--accent); text-decoration: none; }
.ukachel.dunkel { background: var(--deep); border-color: var(--deep); color: var(--deep-ink); }
.ukachel .lbl { font-size: .625rem; font-weight: 700; letter-spacing: .07em; text-transform: uppercase; color: var(--muted); }
.ukachel.dunkel .lbl, .ukachel.dunkel .ukfuss { color: var(--deep-ink); opacity: .68; }
.ukgross {
  font-family: var(--f-text); font-size: 1.75rem; font-weight: 700;
  letter-spacing: -.035em; line-height: 1.05; margin-top: .25rem; font-variant-numeric: tabular-nums;
}
.ukfuss { font-size: .75rem; color: var(--muted); margin-top: .125rem; }
.uzwei { display: grid; grid-template-columns: 1.25fr 1fr; gap: 1rem; align-items: start; }
@media (max-width: 780px) { .uzwei { grid-template-columns: 1fr; } }

/* Die Saeulen "2/3" der Uebersicht (leere Huellen je Tag) sind am 15.10.2026
   entfallen - "Wo noch Leute fehlen" zaehlt jetzt Koepfe aus dem Bedarf
   (.ufehlt weiter unten). */

.uliste { display: flex; flex-direction: column; }
.uzeile {
  display: flex; align-items: center; gap: .75rem; padding: .5rem 0;
  border-top: 1px solid var(--hair); text-decoration: none; color: var(--text);
}
.uzeile:first-child { border-top: 0; }
.uzeile:hover { text-decoration: none; }
.uzeile:hover .uwas { text-decoration: underline; }
.utext { flex: 1; min-width: 0; }
.uwas { display: block; font-weight: 600; font-size: .875rem; }
.uwer { display: block; font-size: .75rem; color: var(--muted); }
/* Dringend in "Wartet auf dich": eine Kante links in der Fehlt-Farbe, als
   inset-Schatten wie die Bereichskante (runde Ecken bleiben), dazu das rote
   Aktionswort. Nicht dringend bleibt ohne Kante und mit leisem Wort. */
.uzeile.dringend { box-shadow: inset 4px 0 0 var(--crit); padding-left: .75rem; }

/* Flach statt schwebend (Studio-Klarheit, Mathieu: "bau alles in dem design
   um") - klarer Rahmen traegt die Abgrenzung, kein Schlagschatten mehr. */
.card {
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 1.25rem 1.25rem 1.25rem;
  margin-bottom: 1rem;
}
.card > h2, .card > h3 { margin-bottom: .25rem; }
/* News. Mathieu, 13.09.2026: "pack die News ... mit signal farbe nach ganz
   oben. aber mach so nen Button gelesen und dann klappt es sich ein."

   Zwei Zustaende, zwei Lautstaerken: was neu ist, traegt die Signalfarbe und
   steht vor allem anderen; was gelesen ist, ist ein zugeklappter Kasten an
   der alten Stelle. Dieselbe Bauart wie .nfbetont - getoente Flaeche plus
   Kante links -, damit die App nicht fuer jede Betonung eine neue erfindet. */
/* Der Signalkasten: "das ist neu und geht dich an". Er traegt die Wahlfarbe
   und steht vor allem anderen. Seit dem 13.09.2026 nutzen ihn ZWEI Sorten -
   neue Schichtnachrichten und die Schichtuebergabe/Torten-Erinnerung
   (Mathieu: "sollte diese auch in Orange oben stehen wie bei News"). Deshalb
   haengen die Regeln an .signal und nicht an einer Einzelklasse: eine
   Bauform, ein Selektor.

   Die News-Karte selbst ist seit dem 25.09.2026 NICHT mehr dabei - sie hat
   ihre eigene Farbklasse .newsrot (weiter unten), weil "neu" bei News jetzt
   Rot heisst und nicht mehr die Wahlfarbe. Die Bauform (Toenung + Kante
   links) bleibt dieselbe, nur die Variablen wechseln. */
.card.signal {
  background: var(--wahl-soft); border-color: transparent;
  border-left: 4px solid var(--wahl);
}
/* Die Nachricht selbst ist der Text, nicht eine Ueberschrift darueber -
   deshalb steht der Empfaengerkopf klein DARUEBER und der Satz in Lesegroesse
   darunter. */
.card.signal .msghead {
  font-size: .625rem; font-weight: 800; letter-spacing: .06em;
  text-transform: uppercase; color: var(--wahl); margin-bottom: .125rem;
}
.card.signal.msgneu + .card.signal.msgneu { margin-top: .75rem; }
.card.signal .card-head { margin-bottom: .5rem; }
.card.signal .card-head h2 { color: var(--wahl); }
/* Hier stand .card.newsrot - die rote News-Karte oben (Mathieu, 25.09.2026:
   "Rot NUR fuer News"). Seit dem 05.10.2026 stehen neue News als Zeile im
   Streifen "Neu für dich"; das Rot traegt dort der Punkt und die Zeile
   darueber (.nfpunkt.news, .nfkick.news) - weiter die einzige Stelle, an der
   Rot "neu" heisst. */
.newsliste { display: grid; gap: .75rem; }
/* Ab dem ZWEITEN Stueck eine Haarlinie: bei nur einer Ansage waere sie ein
   Strich ohne Aufgabe. */
.newsstueck + .newsstueck { border-top: 1px solid var(--hair); padding-top: .75rem; }
.newstitel { margin: 0; font-size: 1rem; font-weight: 650; letter-spacing: -.01em; }
.newsbody { margin: .25rem 0 0; font-size: 1rem; line-height: 1.5; color: var(--text-soft); }
.newsweg { margin-top: .5rem; }
/* Der Knopf auf der getoenten Flaeche: keine zweite Farbe, nur eine Kante -
   dieselbe Regel wie ueberall (Handlung sagt sich durch die Form). Die
   Schrift nimmt --text und steht damit auf der Toenung bei 9,1:1 im Hellen
   und 9,4:1 im Dunkeln. 44 px, weil er mit dem Daumen getroffen wird; ohne
   die Zeile waren es gemessene 40. */
.card.signal .newsweg .btn.secondary {
  background: transparent; color: var(--text);
  border: 1px solid var(--wahl); min-height: 44px;
}

/* Ein zugeklappter Kasten - fuer die gelesene News UND die gelesene
   Schichtuebergabe (Mathieu, 13.09.2026: "wie bei News"). Der Selektor haengt
   deshalb an einer allgemeinen Klasse und nicht mehr an .news: zwei Regeln
   fuer dieselbe Bauform waeren der Anfang von zwei Bauformen. */
details.card.eingeklappt > summary {
  display: flex; align-items: center; gap: .5rem;
  cursor: pointer; list-style: none; min-height: 44px;
}
details.card.eingeklappt > summary::-webkit-details-marker { display: none; }
details.card.eingeklappt > summary::after {
  content: ""; margin-left: auto; flex: none;
  width: .5rem; height: .5rem;
  border-right: 2px solid var(--muted); border-bottom: 2px solid var(--muted);
  transform: rotate(45deg); transition: transform .12s ease;
}
details.card.eingeklappt[open] > summary::after { transform: rotate(-135deg); }
details.card.eingeklappt[open] > summary {
  margin-bottom: .75rem; border-bottom: 1px solid var(--hair); padding-bottom: .5rem;
}
details.card.eingeklappt > summary:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: var(--radius-klein); }
.klappsum { font-size: 1rem; font-weight: 700; letter-spacing: -.02em; color: var(--text); }
.card-head { display: flex; flex-wrap: wrap; align-items: baseline; gap: .5rem 1rem; margin-bottom: 1rem; }
/* Datenschutz-Unterlagen (06.10.2026): ein langer Rechtstext auf dem Handy.
   Listen ruecken weniger ein (bei 390 px fraß der Standard-Einzug ein Viertel
   der Zeile), Tabellen bekommen Abstand, und was Mathieu noch ausfuellen muss,
   steht im warmen Grau statt im Gelb des Browsers - ein Zustand, keine
   Handlung (Eine Tinte). */
.dsdoc ul { padding-left: 1.1rem; }
.dsdoc li { margin: .25rem 0; }
.dsdoc .table-scroll { margin: .6rem 0 1rem; }
/* Gemessen bei 390 px: die Tabelle der Loeschfristen war 6 px breiter als ihr
   Kasten ("Abrechnungsjahres" passt nicht in die halbe Zeile) - lieber
   trennen als seitlich wischen. */
.dsdoc td { hyphens: auto; overflow-wrap: anywhere; }
mark.dsoffen { background: var(--gold-soft); color: var(--text); font-weight: 600; padding: 0 .25em; border-radius: 4px; }
/* Dieselbe Chevron-Sprache wie details.card.eingeklappt oben, jetzt auch fuer
   die Signalkarten selbst und fuer einzelne Ansagen/Nachrichten (Mathieu,
   17.09.2026: "auf der startseite ist mega viel los ... übersichtlicher
   machen") - jede ist jetzt eine Zeile, der Text kommt erst beim Antippen.
   currentColor statt var(--muted): auf den Signalkarten ist die Schrift
   schon die Wahlfarbe, der Pfeil soll dieselbe Farbe tragen wie die
   Ueberschrift daneben, nicht grau danebenstehen. */
summary.card-head, .newsstueck > summary {
  cursor: pointer; list-style: none; min-height: 44px;
}
summary.card-head::-webkit-details-marker, .newsstueck > summary::-webkit-details-marker { display: none; }
summary.card-head::after, .newsstueck > summary::after {
  content: ""; margin-left: auto; flex: none; align-self: center;
  width: .5rem; height: .5rem; opacity: .6;
  border-right: 2px solid currentColor; border-bottom: 2px solid currentColor;
  transform: rotate(45deg); transition: transform .12s ease;
}
details[open] > summary.card-head::after, .newsstueck[open] > summary::after { transform: rotate(-135deg); }
summary.card-head:focus-visible, .newsstueck > summary:focus-visible {
  outline: 2px solid var(--accent); outline-offset: 2px; border-radius: var(--radius-klein);
}
/* Die einzelne Ansage/Nachricht ist jetzt ein <details> statt eines <article>
   - Rand und Abstand zum Nachbarn traegt weiterhin die Regel oben
   (.newsstueck + .newsstueck), hier nur die Zeile selbst. */
.newsstueck > summary { display: flex; align-items: center; gap: .5rem; padding: .1rem 0; }
.newsstueck[open] > summary { margin-bottom: .5rem; }
.newsstueck > summary.newstitel { font-size: 1rem; font-weight: 700; margin: 0; }
.newsstueck > summary .msghead { flex: 1; }

/* Personaldaten als Liste statt als Rolle (Mathieu, 12.09.2026: "mach bei
   Personaldaten auch so ne unterordnung damit das Uebersichtlicher ist").
   Eine Zeile je Abschnitt, getrennt durch Haarlinien - die Karte ist der
   Rahmen, die Zeile braucht keinen eigenen. Tippziel 56 px, also ueber den
   44 px, die Apple und WCAG als Mindestmass nennen. */
.pdliste { display: flex; flex-direction: column; margin: 0 -1.25rem -1.25rem; }
.pdzeile {
  display: flex; align-items: center; gap: .75rem; min-height: 56px;
  padding: .75rem 1.25rem; color: var(--text); text-decoration: none;
  border-top: 1px solid var(--hair);
}
.pdzeile:first-child { border-top: 0; }
.pdzeile:last-child { border-bottom-left-radius: var(--radius); border-bottom-right-radius: var(--radius); }
.pdzeile:hover { background: var(--fill); text-decoration: none; }
.pdzeile:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
.pdicon {
  flex: none; width: 34px; height: 34px; border-radius: var(--radius-xs); background: var(--fill);
  display: flex; align-items: center; justify-content: center;
}
.pdicon .ic { width: 21px; height: 21px; }
.pdtext { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; gap: .125rem; }
.pdtitel { font-size: 1rem; font-weight: 620; letter-spacing: -.01em; }
/* Die Feldnamen darunter sagen, was einen hinter der Zeile erwartet - sonst
   muss man jede Zeile einmal aufmachen, um sie zu kennen. Eine Zeile, der
   Rest wird abgeschnitten. */
.pdsub {
  font-size: .75rem; color: var(--muted);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.pdstand {
  flex: none; font-size: .75rem; font-weight: 700; padding: .125rem .5rem; border-radius: var(--radius-pille);
}
.pdstand.offen { background: var(--warn-soft); color: var(--warn); }
/* Fertig ist ein Haken, keine Null: "0 offen" liest sich wie ein Fehler. */
.pdstand.voll { background: var(--ok-soft); color: var(--ok); padding: .125rem .5rem; }
.pdpfeil { flex: none; color: var(--muted); font-size: 1.3125rem; line-height: 1; }
.card-head h2, .card-head h3 { margin: 0; }
.card-head h2 a, .card-head h3 a { color: inherit; text-decoration: none; }
.card-head h2 a:hover, .card-head h3 a:hover { text-decoration: underline; }
/* Der Beisatz ist ueberall derselbe - aber die Regel hing nur an .card-head.
   In einem zugeklappten Kasten traegt ihn das <summary>, und dort stand er
   deshalb in voller Textgroesse: gemessen 17 statt 14 px, wodurch "gelesen ·
   heute 18:16" neben dem Titel umbrach. Betrifft die gelesene News genauso -
   dort war die Aufschrift nur kurz genug, dass es niemandem auffiel. */
.card-head .hint,
details.card.eingeklappt > summary .hint { color: var(--muted); font-size: .875rem; }
.lede { color: var(--text-soft); max-width: 62ch; }

/* Das hidden-Attribut muss staerker sein als jede eigene display-Regel. Der
   Browser setzt dafuer nur [hidden]{display:none} - eine Klasse mit
   display:flex schlaegt das, und das Ding steht da. Auf der Bedarfsseite hing
   deshalb dauerhaft "Noch nicht gespeichert." unter der Tabelle, auch direkt
   nach dem Speichern: eine Warnung, die immer leuchtet, ist keine Warnung.
   Am Bild gesehen, nicht im Code (11.09.2026). */
[hidden] { display: none !important; }

.banner {
  border-radius: var(--radius-sm);
  padding: .75rem 1rem;
  margin-bottom: 1rem;
  border: 1px solid transparent;
  font-weight: 500;
  display: flex; gap: .5rem; align-items: flex-start;
}
.banner.ok { background: var(--ok-soft); border-color: transparent; color: var(--text); }
.banner.err { background: var(--crit-soft); border-color: transparent; color: var(--text); }
.banner.info { background: var(--accent-soft); border-color: transparent; color: var(--text); }
/* Gelb heisst hier "fehlt noch etwas", nicht "kaputt" - dieselbe Trennung wie
   bei den Marken in der Liste. Gebraucht zuerst fuer die Personalnummern, die
   in der DATEV-Datei fehlen wuerden. */
.banner.warn { background: var(--warn-soft); border-color: transparent; color: var(--text); }

/* Die Sprachwahl auf der Einstellungsseite. Zwei Knoepfe nebeneinander, der
   aktive gefuellt - dieselbe Art, wie die App ueberall "das hier gilt gerade"
   sagt (Form statt zweiter Farbe). Bei zwei Sprachen ist eine Auswahlliste
   ein Umweg: sie kostet einen Tipp mehr und zeigt die Wahl nicht. */
.sprachwahl { display: flex; gap: .5rem; flex-wrap: wrap; }
.sprachwahl button {
  font: inherit; font-size: 1rem; font-weight: 600; cursor: pointer;
  min-height: 46px; padding: 0 1.25rem; border-radius: var(--radius-pille);
  border: 1px solid var(--hair-strong); background: transparent; color: var(--text);
}
.sprachwahl button.an { background: var(--deep); color: var(--deep-ink); border-color: transparent; }

/* Hell, dunkel oder wie das Telefon - die Einstellungen der Team-App (25.10.2026). Dieselbe Gestalt wie die Sprachwahl: drei Pillen,
   die gewaehlte gefuellt UND mit Haken (die Form sagt es, nicht nur die Farbe). Es sind echte Radios: der Kreis ist unsichtbar ueber
   die ganze Pille gelegt, das Tippziel ist die Pille (46 px hoch). Farben nur ueber Namen. */
.tdarst { border: 0; margin: 0; padding: 0; min-width: 0; }
.tdarstlegende { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
.tdarstseg { display: flex; gap: .5rem; flex-wrap: wrap; }
.tdarstopt { position: relative; display: inline-flex; }
.tdarstopt input { position: absolute; inset: 0; width: 100%; height: 100%; margin: 0; opacity: 0; cursor: pointer; }
.tdarstwort {
  display: inline-flex; align-items: center; justify-content: center; min-height: 46px; padding: 0 1.25rem;
  border-radius: var(--radius-pille); border: 1px solid var(--feldrand); background: transparent; color: var(--text);
  font-size: 1rem; font-weight: 600;
}
.tdarstopt input:checked + .tdarstwort { background: var(--deep); color: var(--deep-ink); border-color: transparent; }
.tdarstopt input:checked + .tdarstwort::before { content: '✓ '; white-space: pre; }
.tdarstopt input:focus-visible + .tdarstwort { outline: 3px solid var(--text); outline-offset: 2px; }
.tdarstsatz { margin: .75rem 0 0; }

/* Mitteilungen in den Einstellungen (Mathieu, 14.10.2026: "bau ne Kategorie
   für Push-Benachrichtigungen"). Je Kategorie eine Zeile: Titel, ein Satz,
   was drin ist, rechts der Schalter. Die ganze Zeile ist das Tippziel
   (label, mindestens 44 px) - nicht nur der Schalter.
   Der Schalter ist an GRUEN und gefuellt, aus nur umrandet: Gruen ist im
   Hellen wie im Dunkeln die Farbe fuer "deins / laeuft" (Nachtmodus AC, zwei
   Signalfarben), und die Form sagt es ein zweites Mal - gefuellt mit dem
   Knopf rechts heisst an, Rahmen mit dem Knopf links heisst aus. So bleibt
   "aus" auch im Dunkeln sichtbar, wo ein grauer Grund verschwand. */
.mtgeraet { padding-bottom: 1rem; margin-bottom: .25rem; border-bottom: 1px solid var(--hair); }
.mtzeile { display: flex; align-items: center; gap: .75rem; flex-wrap: wrap; }
.mttext { flex: 1 1 12rem; min-width: 0; display: flex; flex-direction: column; gap: .15rem; }
.mttext strong { font-weight: 600; color: var(--text); }
.mttext span { color: var(--muted); font-size: .875rem; font-weight: 400; line-height: 1.4; }
.mthinweis { margin: .6rem 0 0; }
.mttest { margin-top: .75rem; }
.mtmeldung { margin: .5rem 0 0; }
.mtmeldung.fehler { color: var(--crit); }
.mtwahl .lede { margin: .75rem 0 0; }
.mtliste { list-style: none; margin: .25rem 0 0; padding: 0; }
.mtliste li + li { border-top: 1px solid var(--hair); }
.mtschalter { display: flex; align-items: center; gap: .9rem; min-height: 44px; padding: .75rem 0; cursor: pointer; }
.mtschalter:has(.schalter:disabled) { cursor: default; }
.schalter {
  appearance: none; -webkit-appearance: none; flex: none; position: relative;
  width: 52px; height: 32px; margin: 0; border-radius: var(--radius-pille);
  background: transparent; border: 2px solid var(--muted); cursor: pointer;
  transition: background-color .15s ease, border-color .15s ease;
}
.schalter::after {
  content: ''; position: absolute; top: 5px; left: 5px; width: 18px; height: 18px;
  border-radius: 50%; background: var(--muted);
  transition: transform .15s ease, width .15s ease, height .15s ease, top .15s ease, left .15s ease;
}
.schalter:checked { background: var(--gruen); border-color: var(--gruen); }
.schalter:checked::after { top: 2px; left: 2px; width: 24px; height: 24px; transform: translateX(20px); background: var(--gruen-ink); }
.schalter:disabled { opacity: .6; cursor: default; }
.schalter:focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; }
@media (prefers-reduced-motion: reduce) { .schalter, .schalter::after { transition: none; } }
.mtspeichern { margin-top: .5rem; }

/* Was der Tag kostet. Drei Zahlen nebeneinander, am Handy untereinander -
   keine Kacheln mit Rahmen: sie gehoeren zusammen und sind eine Auskunft,
   nicht drei. */
.tagesgeld .tgreihe { display: grid; gap: 1rem; grid-template-columns: repeat(3, 1fr); }
@media (max-width: 46rem) { .tagesgeld .tgreihe { grid-template-columns: 1fr; gap: .75rem; } }
.tgblock.weit { grid-column: 1 / -1; }
.tgzahl {
  display: block; font-size: 1.55rem; font-weight: 700; letter-spacing: -.03em;
  font-variant-numeric: tabular-nums; line-height: 1.1;
}
/* Rot erst, wenn die Quote wirklich weh tut. Eine Farbe, die immer leuchtet,
   sagt nichts. */
.tgzahl.hoch { color: var(--crit); }
.tglabel { display: block; margin-top: .25rem; font-size: .875rem; color: var(--muted); line-height: 1.4; }

/* Rezeptbuch. Ein Gitter aus Karten, weil man Rezepte vergleicht statt sie
   zu lesen - untereinander waere jedes einzeln und keines im Verhaeltnis. */
.rzkat { font-size: 1rem; margin: 1.25rem 0 .5rem; letter-spacing: -.02em; color: var(--text-soft); }
.rzgitter { display: grid; gap: 1rem; grid-template-columns: repeat(auto-fill, minmax(21rem, 1fr)); margin-bottom: .5rem; }
.rezeptkarte { margin-bottom: 0; display: flex; flex-direction: column; }
.rzzutaten { list-style: none; margin: 0; padding: 0; display: grid; gap: .25rem; font-size: 1rem; }
.rzzutaten li { display: flex; gap: .5rem; align-items: baseline; }
.rzzutaten b { font-variant-numeric: tabular-nums; white-space: nowrap; }
/* EINE Zeile statt eines Merkmals an jeder Zutat: die Frage an ein Rezept
   ist "was zieht das ab", nicht "welche Zeile ist nur Text". */
.rzabzug { margin: .5rem 0 0; font-size: .875rem; color: var(--muted); }

/* Die zwei Abschnitte. Cocktails und Premixes sind nicht zwei Kategorien
   unter vielen, sondern die oberste Ordnung - also bekommen sie einen Kopf
   mit einem Satz dazu und nicht nur eine Ueberschrift. */
/* Zwei Seiten, nicht zwei Abschnitte: der Reiter traegt die Auswahl, und
   welche gerade gilt, sagt die Fuellung - keine zweite Farbe. */
.rzreiter { display: flex; gap: .5rem; flex-wrap: wrap; margin: 0 0 1.5rem; }
.rzreiter a {
  display: flex; align-items: center; gap: .5rem;
  font-size: 1rem; font-weight: 600; text-decoration: none;
  padding: .5rem 1rem; border-radius: var(--radius-pille);
  border: 1px solid var(--hair-strong); color: var(--text);
}
.rzreiter a span {
  font-size: .75rem; font-weight: 700; color: var(--muted);
  font-variant-numeric: tabular-nums;
}
.rzreiter a:hover { background: var(--fill); text-decoration: none; }
.rzreiter a.an { background: var(--deep); color: var(--deep-ink); border-color: transparent; }
.rzreiter a.an span { color: var(--deep-ink); opacity: .7; }
.rzteilkopf { margin-bottom: 1rem; padding-bottom: .75rem; border-bottom: 2px solid var(--hair-strong); }
.rzteilkopf h2 { margin: 0; font-size: 1.5rem; letter-spacing: -.025em; }
.rzteilkopf p { margin: .25rem 0 0; color: var(--text-soft); font-size: 1rem; max-width: 46rem; }
/* Die Beziehung, um die es geht: welcher Cocktail nimmt diesen Premix. */
.rzverbraucher {
  margin: .5rem 0 0; padding: .5rem .75rem; border-radius: var(--radius-xs);
  background: var(--wahl-soft); font-size: .875rem; line-height: 1.5;
}
.rzverbraucher.leer { background: var(--fill); color: var(--muted); }

/* "Gestern verkauft". Eine Zeile je Cocktail, das Feld rechts - am Handy
   tippt man sich von oben nach unten durch, ohne den Blick zu wechseln. */
.vkliste { display: grid; gap: .125rem; grid-template-columns: minmax(0, 1fr); }
.vkzeile {
  display: flex; align-items: center; gap: .25rem .75rem; flex-wrap: wrap;
  padding: .5rem 0; border-top: 1px solid var(--hair); cursor: text;
}
.vkzeile:first-child { border-top: 0; }
/* Grosse Schrift (Mathieu, 24.10.2026: Bestandsabgleich lief bei 200 % auf 390 px um 31 px ueber den Rand): zwei Dinge hielten die
   Zeile breit - die Gitterspalte war "auto" und nahm die Mindestbreite der Zeile (Name "alkoholfrei" + Feld = 342 px) statt
   der Breite der Karte (minmax(0, 1fr) oben), und der Name durfte nur schrumpfen, nicht umbrechen. Jetzt hat der Name eine
   Grundbreite von 5rem: passt er mit dem Feld nicht mehr in eine Zeile, rutscht das Feld unter den Namen (rechts, wie sonst).
   Bei Normalgroesse ist die Zeile auf 320 px noch 254 px breit - Name 80 + Fuge 12 + Feld 74 = 166, da bricht nichts um. */
.vkname { flex: 1 1 5rem; min-width: 0; font-size: 1rem; overflow-wrap: anywhere; }
.vkzeile input {
  flex: 0 0 4.6rem; margin-left: auto; text-align: center; font-variant-numeric: tabular-nums;
  min-height: 44px;
}
/* Was schon eingetragen ist, sieht man - sonst tippt jemand denselben Abend
   ein zweites Mal, weil er es nicht mehr weiss. */
.vkzeile.schon .vkname { font-weight: 600; }
.vkzeile.schon input { border-color: var(--wahl); }
/* Der Lohn fuers Eintragen, ganz oben. */
.vklage .vklageliste { list-style: none; margin: 0; padding: 0; display: grid; gap: .25rem; }
.vklage .vklageliste li { display: flex; flex-wrap: wrap; gap: .125rem .5rem; align-items: baseline; font-size: 1rem; }
.vklage .vklageliste b { font-variant-numeric: tabular-nums; min-width: 2.6rem; }
.vklage .vklageliste li.knapp { color: var(--crit); font-weight: 600; }
/* Der Name hat eine Grundbreite statt "so breit wie der Text": bei 200 % stand "Adieu Hangover" zwischen "0x" und "Ziel 20" in 19 px
   und brach als "Adi/eu/Ha/ng/ov/er". Passt er mit dem Ziel nicht in eine Zeile, rutscht das Ziel darunter. */
.vklagename { flex: 1 1 5rem; min-width: 0; overflow-wrap: anywhere; }
/* Der Kartentitel "Bestandsabgleich" (der Kopf der Seite hat eigene Regeln, .w1titel.lang in stil-w1.js): er ist 1,75rem gross und
   auf 390 px bei 200 % Schrift 56 px - "Bestands-" braucht dann 281 px, die Karte hat 260, und das Wort brach als "Bestand/sabgleich"
   (bei 360 px als "Bestand/s/abgleich"). Jetzt schrumpft die Schrift so weit, dass "Bestands-" (5,02 em breit, gemessen) in die Karte passt:
   Kartenbreite = 100vw - 4rem (Seitenrand und Kartenrand) - 2px Rand, geteilt durch 5,3 (5 % Luft). Unter 20 px nicht weiter.
   Bei Normalgroesse (28 px) greift die Rechnung nie: auf 320 px waeren es 48 px. */
#vk-form .card-head h1 { font-size: max(20px, min(1.75rem, calc((100vw - 4rem - 2px) / 5.3))); }
.vkziel { margin-left: auto; color: var(--muted); font-size: .875rem; white-space: nowrap; font-variant-numeric: tabular-nums; }
.vklage .vklageliste li.knapp .vkziel { color: var(--crit); font-weight: 400; }
/* Leute probeweise ausblenden: der Knopf steht klein neben dem Namen, die
   ausgeblendete Zeile bleibt lesbar - sie ist nicht geloescht, nur nicht
   mitgerechnet. */
.ausraus, .ausrein { font-size: .75rem; white-space: nowrap; text-decoration: underline; }
.ausraus { color: var(--muted); }
/* 25.10.2026: "ausgetreten" leise per Tinte statt Deckkraft (.45 gab 2,4:1, und "wieder rein" blieb trotz opacity: 1 blass - Deckkraft
   vererbt sich). Durchgestrichen bleibt es. */
tr.istaus td, tr.istaus td * { color: var(--muted); }
tr.istaus td.num, tr.istaus td.name { text-decoration: line-through; }
tr.istaus .ausrein { text-decoration: underline; color: var(--accent); }
.ausbanner a { display: inline-block; margin-top: .25rem; }
.kostendetails > summary { cursor: pointer; font-weight: 600; padding: .5rem 0; }
.kostendetails > summary .hint { font-weight: 400; margin-left: .5rem; }
.tebizeile { display: flex; gap: .5rem; align-items: center; flex-wrap: wrap; padding: .5rem 0; border-top: 1px solid var(--hair); }
.tebizeile:first-child { border-top: 0; }
.tebiname { flex: 1 1 11rem; min-width: 0; font-weight: 600; }
.tebizeile select { flex: 1 1 12rem; min-width: 0; }
.vkletzte { list-style: none; margin: 0; padding: 0; display: grid; gap: .25rem; font-size: 1rem; }
/* Die Zahl, die hinter der Bar zaehlt: wie oft geht das heute noch. */
.rzreich { margin: .75rem 0 0; padding: .5rem .75rem; border-radius: var(--radius-xs); background: var(--fill); font-size: .875rem; }
.rzunten {
  display: flex; flex-wrap: wrap; align-items: center; gap: .5rem;
  margin-top: auto; padding-top: 1rem;
}
.rzunten form { margin: 0; }
.rzbuchen { display: flex; align-items: center; gap: .5rem; margin-right: auto; }
.rzbuchen label { font-size: .875rem; color: var(--muted); }
.rzbuchen input { width: 3.6rem; text-align: center; }
/* Das Formular: drei Felder je Zeile am grossen Bildschirm, untereinander am
   kleinen. Gepflegt wird hier ohnehin am Schreibtisch. */
.rzkopf { display: grid; gap: 1rem; grid-template-columns: repeat(3, 1fr); }
@media (max-width: 52rem) { .rzkopf { grid-template-columns: 1fr; } }
.rztabelle td { padding: .25rem .25rem; }
.rztabelle input, .rztabelle select { width: 100%; }
.rztabelle td:nth-child(3) { width: 7rem; }
.rztabelle td:nth-child(4) { width: 8rem; }
.banner.warn > span { color: var(--warn); font-weight: 700; }
/* Zwei Felder nebeneinander, am Handy untereinander. Beraternummer und
   Mandantennummer gehoeren zusammen und sind beide kurz. */
.feldpaar { display: grid; gap: 1rem; grid-template-columns: 1fr 1fr; }
@media (max-width: 34rem) { .feldpaar { grid-template-columns: 1fr; } }
.banner strong { font-weight: 650; }

label { display: block; font-weight: 600; font-size: .875rem; margin-bottom: .25rem; color: var(--text); }
.field { margin-bottom: 1rem; }
.field .help { color: var(--muted); font-size: .875rem; margin-top: .25rem; }
/* type=tel gehoert dazu (15.10.2026): die Notfall-Nummern standen als
   einziges Feld weiss mit schwarzem Systemrahmen zwischen den anderen. */
input[type=text], input[type=email], input[type=password], input[type=tel], input[type=date], input[type=time], input[type=number], textarea, select {
  width: 100%;
  font: inherit;
  font-size: 1rem;
  color: var(--text);
  background: var(--surface);
  border: 1px solid var(--feldrand);
  border-radius: var(--radius-xs);
  padding: .5rem .75rem;
  min-height: 44px;
  appearance: none;
  -webkit-appearance: none;
}
select {
  /* Der Pfeil selbst gezeichnet, damit das Feld in beiden Themes gleich
     aussieht - der vom System bringt seine eigene Farbe mit. */
  background-image: linear-gradient(45deg, transparent 49%, currentColor 50%), linear-gradient(-45deg, transparent 49%, currentColor 50%);
  background-size: 6px 6px, 6px 6px;
  background-position: calc(100% - 1.05rem) calc(50% + 2px), calc(100% - .7rem) calc(50% + 2px);
  background-repeat: no-repeat;
  padding-right: 2rem;
}
textarea { min-height: 96px; resize: vertical; line-height: 1.5; }
/* Der Vorlagentext im leeren Feld (Mathieu, 07.09.2026: "das feld zum
   schreiben ist leer, aber in grau sieht man den vorlagen text z.b fuer
   ablauf"). Ohne eigene Regel haengt das am Browser-Standard, und der ist
   oft so blass, dass man die Vorlage nicht lesen kann - je nach Browser
   verschieden blass.
   Bei den mehrzeiligen Feldern kursiv: dort steht eine ganze Beispiel-
   Vorlage, und kursiv sagt auf einen Blick "das ist ein Beispiel und nicht
   dein Text". Bei einzeiligen Feldern waere das unruhig. */
::placeholder { color: var(--muted); opacity: .75; }
textarea::placeholder { font-style: italic; opacity: .7; }
input:focus-visible, textarea:focus-visible, select:focus-visible {
  outline: none;
  border-color: var(--accent);
  box-shadow: 0 0 0 4px var(--accent-soft);
}
input[readonly] { background: var(--surface-2); color: var(--text-soft); }

/* Das Datei-Feld kommt vom Browser und sieht ueberall anders aus. Gestrichelter
   Rand, weil hier etwas hereingelegt wird - und der Knopf im selben Ton wie die
   uebrigen Nebenaktionen. */
input[type=file] {
  width: 100%; font: inherit; font-size: .875rem; color: var(--text-soft);
  background: var(--surface); border: 1px dashed var(--border-strong);
  border-radius: var(--radius-xs); padding: .75rem .75rem; min-height: 52px;
}
input[type=file]::file-selector-button {
  font: inherit; font-size: .875rem; font-weight: 600; cursor: pointer;
  background: var(--accent-soft); color: var(--accent);
  border: 0; border-radius: var(--radius-xs); padding: .5rem .75rem; margin-right: .75rem;
  min-height: 34px;
}
input[type=file]::file-selector-button:hover { filter: brightness(.96); }
input[type=file]:focus-visible { outline: none; border-color: var(--accent); box-shadow: 0 0 0 4px var(--accent-soft); }

/* Ein Knopf waechst mit seiner Aufschrift. Feste Hoehen schneiden lange
   Beschriftungen ab - darum min-height und eine eigene, engere Zeilenhoehe. */
.btn {
  display: inline-flex; align-items: center; justify-content: center; gap: .5rem;
  font: inherit; font-weight: 600; font-size: 1rem; letter-spacing: -.006em;
  line-height: 1.25; text-align: center; text-wrap: balance;
  min-height: 44px; padding: .5rem 1.25rem; max-width: 100%;
  border-radius: var(--radius-xs);
  border: 1px solid transparent;
  background: var(--accent); color: var(--accent-ink);
  cursor: pointer; text-decoration: none;
  transition: background-color .15s ease, opacity .15s ease;
}
.btn:hover { background: var(--accent-hover); text-decoration: none; }
.btn:active { opacity: .78; }
/* Der Knopf, mit dem man eine Schicht uebernimmt (Mathieu, 06.09.2026:
   "schicht eintragen so in einem schoenen gruenen ton das es zum eintragen
   motiviert"). Nur dort - sonst waere Gruen wieder eine Farbe, die alles
   Moegliche heisst.

   Der Ton ist bewusst dunkel genug: bei helleren Gruens sank die creme
   Schrift darauf unter 4,5:1 und war bei Sonne auf dem Handy nicht mehr
   sicher zu lesen. #42714A kommt auf 5,4:1.

   Zu wissen: auf derselben Seite heisst eine gruene Zeile "komplett
   besetzt". Die beiden treffen sich nie - bei einer vollen Schicht gibt es
   diesen Knopf gar nicht, dort steht "keine Plaetze mehr frei". */
.btn.gruen { background: var(--gruen); color: var(--gruen-ink); }
.btn.gruen:hover { background: var(--gruen-hover); }
/* Leise: fuer Schichten, die schon gedeckt sind, in die man sich aber noch
   eintragen DARF (Huellen ohne Kapazitaet). Ohne das standen ein gruener
   Status "besetzt - danke!" und ein voller gruener Knopf uebereinander und
   meinten Gegenteiliges. Bleibt gruen und bleibt anklickbar - nur eben
   umrissen statt gefuellt. */
/* Orange: "sieh hier hin" (Mathieu, 17.09.2026: „hebe ihn farblich hervor").
   Bewusst sparsam - die Handlungsfarbe der App bleibt das CI-Marine, und
   eine zweite Knopffarbe ueberall waere wieder eine Ampel ohne Bedeutung.
   Hier traegt sie eine: Orange heisst in dieser App "gerade offen", und was
   der Knopf anlegt, steht eine Zeile spaeter als oranges "Offen" in der
   Liste. Gerechnet: hell 6,2:1, dunkel 10,4:1 fuer die Schrift darauf. */
.btn.wahl { background: var(--wahl); color: var(--wahl-ink); }
.btn.wahl:hover { filter: brightness(1.06); }
.btn.wahl:focus-visible { box-shadow: 0 0 0 4px var(--wahl-soft); }
/* Nur der Melden-Knopf im Hub bekommt die Umriss-Form aus dem Entwurf
   (Mathieu, 17.09.2026: "ich will das es so aussieht") - getoente Flaeche
   statt Vollton, Rand und Schrift in Orange. Der andere .btn.wahl (der
   Kalender-Sammelknopf auf "Mein Plan") bleibt unangetastet, darum haengt
   die Regel an .hubmelden und nicht an .btn.wahl selbst. */
.hubmelden .btn.wahl { background: var(--wahl-soft); color: var(--wahl); border: 1.5px solid var(--wahl); }
.hubmelden .btn.wahl:hover { filter: brightness(1.04); }
.btn.secondary { background: var(--accent-soft); color: var(--accent); border-color: transparent; }
.btn.secondary:hover { filter: brightness(.96); }
.btn.danger { background: var(--crit-soft); color: var(--crit); border-color: transparent; }
.btn.danger:hover { background: var(--crit); color: var(--crit-ink); }
/* 40 px statt 34 (gemessen 08.09.2026). Nicht 44: diese Knoepfe stehen in
   dichten Tabellenzeilen, und 44 wuerde die Zeilen auseinanderziehen. 40 ist
   deutlich ueber den 24 px, die als Untergrenze gelten. */
.btn.small { min-height: 40px; padding: .25rem .75rem; font-size: .875rem; border-radius: var(--radius-xs); }
/* In der Team-App ist auch der kleine Knopf daumengross (15.10.2026, beim
   Durchgehen gemessen: "Jetzt eintragen", "Später", "Übernehmen" je 40 px). */
body[data-app="team"] .btn.small { min-height: 44px; }
/* Auf schmalen Geraeten nimmt die Hauptaktion die ganze Breite - dann steht
   die Aufschrift immer in einer Zeile. */
.btn.wide { width: 100%; }
.btn:focus-visible { outline: none; box-shadow: 0 0 0 4px var(--accent-soft); }
.btn-row { display: flex; flex-wrap: wrap; gap: .5rem; align-items: center; }

/* Eigenes Bestaetigungsfenster statt window.confirm(): natives <dialog>
   (Tastatur/Fokus/Esc kommen kostenlos vom Browser), aber im Look der App
   statt der grauen Betriebssystem-Box. Siehe CONFIRM_SCRIPT weiter unten. */
.confirm-dialog {
  border: none; border-radius: var(--radius); box-shadow: var(--shadow-lift);
  background: var(--surface); color: var(--text); padding: 1.25rem 1.25rem 1rem;
  width: min(360px, calc(100vw - 2.4rem)); margin: auto;
}
.confirm-dialog::backdrop { background: rgba(0, 0, 0, .42); }
.confirm-dialog p { margin: 0 0 1rem; font-size: 1rem; line-height: 1.4; text-wrap: balance; }
.confirm-dialog .btn-row { justify-content: flex-end; }

/* Ein Formular, das nur ein paarmal die Woche gebraucht wird, als FENSTER
   (Mathieu, 17.09.2026). Am Telefon ein Blatt, das von unten hochkommt und
   den vollen Rand nutzt; am Schreibtisch eine Karte in der Mitte. Der
   Absendeknopf sitzt im Fuss, ausserhalb des scrollenden Teils - man muss
   nicht durch sieben Felder wischen, um ihn wiederzufinden.
   "display" steht bewusst NUR am offenen Zustand: den zugeklappten blendet
   der Browser selbst aus, und das <noscript>-Stueck neben dem Fenster kann
   es dann ohne !important wieder in den Fluss stellen. */
.mdialog {
  border: 0; padding: 0; margin: auto;
  /* 580 und nicht 520: bei 520 blieb fuer .grid-2 (zwei Spalten a 240 plus
     1rem Abstand = 496) genau zehn Pixel zu wenig, und Bereich, Dringlichkeit,
     Frist und Notiz standen am Schreibtisch untereinander statt nebeneinander. */
  width: min(580px, calc(100vw - 1.6rem));
  max-height: min(86vh, 900px);
  background: var(--surface); color: var(--text);
  border-radius: var(--radius); box-shadow: var(--shadow-lift);
  overflow: hidden;
}
.mdialog[open] { display: flex; flex-direction: column; }
.mdialog::backdrop { background: rgba(0, 0, 0, .5); }
.mdkopf {
  display: flex; align-items: center; gap: .5rem; flex: none;
  padding: .5rem .5rem .5rem 1rem; border-bottom: 1px solid var(--hair);
}
.mdkopf h2 { margin: 0; font-size: 1rem; letter-spacing: -.02em; }
.mdzu {
  margin-left: auto; flex: none; width: 44px; height: 44px; padding: 0;
  border: 0; border-radius: var(--radius-pille); background: transparent;
  color: var(--muted); font: inherit; font-size: 1rem; cursor: pointer;
}
.mdzu:hover { background: var(--fill); color: var(--text); }
.mdzu:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.mdinhalt { flex: 1 1 auto; overflow-y: auto; padding: 1rem 1rem 1rem; }
.mdfuss {
  flex: none; display: flex; gap: .5rem; justify-content: flex-end;
  padding: .75rem 1rem calc(.75rem + env(safe-area-inset-bottom, 0px));
  border-top: 1px solid var(--hair); background: var(--surface-2);
}
/* Am Telefon ein Blatt von unten: die Finger sind unten, und ein Fenster,
   das in der Mitte schwebt, laesst oben wie unten Rand ungenutzt. */
@media (max-width: 620px) {
  .mdialog {
    width: 100%; max-width: none; max-height: 92vh;
    margin: auto auto 0; border-radius: var(--radius) var(--radius) 0 0;
  }
}

/* Runterziehen zum Neuladen (PULL_REFRESH_SCRIPT) - vor allem fuers
   Homescreen-Icon, wo es keine Browserleiste zum Neuladen mehr gibt. */
#pull-refresh {
  position: fixed; top: 10px; left: 50%; z-index: 200;
  width: 34px; height: 34px; margin: 0; padding: 0;
  border-radius: var(--radius-pille); background: var(--surface); box-shadow: var(--shadow-lift);
  display: flex; align-items: center; justify-content: center; color: var(--accent);
  opacity: 0; transform: translateX(-50%) translateY(-40px);
  transition: opacity .12s ease; pointer-events: none;
}
#pull-refresh svg { width: 18px; height: 18px; }
#pull-refresh.bereit { color: var(--gold); }
#pull-refresh.dreht svg { animation: pull-refresh-spin .6s linear infinite; }
@keyframes pull-refresh-spin { to { transform: rotate(360deg); } }
@media (prefers-reduced-motion: reduce) {
  #pull-refresh.dreht svg { animation: none; }
}

.grid-2 { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 0 1rem; }

/* --- Wochen-Segmentleiste (wochenLeiste, mehrfach genutzt) --- */
/* Segmentleiste: eine Bahn, das gewaehlte Feld liegt darauf. Ein Punkt am
   Feld heisst "diese Woche schon ausgefuellt". */
.seg {
  display: flex; gap: 2px; padding: 2px; border-radius: var(--radius-xs);
  background: var(--fill); margin: 0 0 .5rem;
}
.segitem {
  flex: 1 1 0; min-width: 0; min-height: 44px;
  display: inline-flex; align-items: center; justify-content: center; gap: .25rem;
  border-radius: var(--radius-xs); padding: .25rem .5rem;
  font-size: .875rem; font-weight: 600; letter-spacing: -.006em;
  color: var(--text-soft); white-space: nowrap; text-decoration: none;
}
.segitem:hover { text-decoration: none; color: var(--text); }
.segitem.is-on {
  background: var(--surface); color: var(--text);
  box-shadow: var(--schatten-1);
}
.segitem:focus-visible { outline: none; box-shadow: 0 0 0 3px var(--accent-soft); }
.segdot { width: 6px; height: 6px; border-radius: var(--radius-pille); background: var(--ok); flex: none; }
.segcap {
  font-size: .875rem; color: var(--muted); text-align: center;
  margin: 0 0 1rem; font-variant-numeric: tabular-nums;
}

/* Monatskalender im Dienstplan (Mathieu, 06.09.2026) */
/* --- Monatskalender ---------------------------------------------------
   Nach Mathieus Vorlage (07.09.2026): der Monat gross und typografisch,
   darunter ein echtes Raster aus Haarlinien, die Zahl oben links in der
   Zelle. Uebersetzt in unsere Farben - Creme als Papier, Marine als
   Schrift und Linie, Tuerkis als einzige Signalfarbe.
   Was aus der Vorlage NICHT uebernommen ist: der kleine Folgemonat oben
   rechts. Dort stehen jetzt die Events des Monats - dieselbe Stelle,
   nuetzlicherer Inhalt. */
.plankalender {
  /* Kam aus Mathieus Kalendervorlage (07.09.2026: "maybe noch in den farben
     wie das Bild was ich dir geschickt habe"): ein blaueres Marine, ein
     satteres Signal, ein waermeres Papier - eine eigene kleine Palette,
     weil der Kalender fast ein Plakat ist.
     Am 08.09.2026 zurueckgenommen, in zwei Schritten:
     - Das Signal ist dasselbe Tuerkis wie im Rest der App. Sein Zinnober
       kam als Schrift auf 3,1:1, im Dunkeln auf 4,2:1 - derselbe Fehler,
       den Terrakotta in der App gemacht hat, nur an einer zweiten Stelle.
     - Das Marine ist jetzt das Marine der App. Sein #1F3A66 war ein
       Koenigsblau und die dritte kalte Farbe auf einem Bildschirm. Der
       Styleguide sagt es anders: was traegt, ist Tinte; farbig ist nur die
       Handlung. Der Kalender darf ein Plakat sein - aber nicht mit eigener
       Marke.
     Seit dem Wechsel auf eine Tinte (08.09.2026) sind --kal-marine und
     --kal-signal im Hellen fast derselbe Ton - 1,13:1. Das ist Absicht und
     kein Versehen: getrennt werden sie durch die Form, nicht durch die
     Farbe. Der heutige Tag ist ein GEFUELLTER Kreis, die laufende Woche
     ein Band aus Toenung, ein Stoerer ein umrandetes Kaestchen. Die zwei
     Namen bleiben, weil die Absicht dahinter verschieden ist. */
  --kal-marine: #2C3A47;
  --kal-signal: #283045;
  --kal-papier: #F3EEE3;
  /* Der Ton der Kachel: eine Spur Tinte auf dem Papier, kein eigener Farbwert. */
  --kal-band: rgba(40, 48, 69, .10);
  --kal-tile: rgba(31, 58, 102, .07);
  /* Das Wochenende: dieselbe Tinte, eine Spur dichter als die Kachel - nicht
     die Flaeche von --kal-blass, die als Block gelesen wird. Auf .14
     angehoben auf .19 plus einen Rahmen (Mathieu, 18.09.2026: "bissen
     dunkler" - vorher war "Fr/Sa/So sehen aus wie ein Dienstag" schon einmal
     der Grund fuer diese Regel, siehe unten). */
  --kal-we: rgba(31, 58, 102, .19);
  --kal-linie: rgba(31, 58, 102, .22);
  /* Zwei stille Toene, und der Unterschied ist wichtig: --kal-still ist fuer
     Beiwerk ohne Text-Charakter (bis 15.10.2026 auch die Kalenderwoche am
     Rand - die traegt jetzt --kal-leise, siehe unten), --kal-lesbar
     fuer alles, was man WIRKLICH lesen soll. Mit .32 lag die
     Pfeilbeschriftung bei rund 2,4:1 Kontrast - am Bild gesehen, dort war
     "Aug" kaum zu erkennen, und genau die Beschriftung soll ja sagen, wohin
     der Pfeil fuehrt. .62 bringt rund 4,6:1. */
  --kal-still: rgba(31, 58, 102, .38);
  /* Fest statt .62 (15.10.2026, "2 ja"): rgba lag gemessen bei 3,54:1,
     nicht bei den 4,6:1, die hier stand. #4A5562 hat 6,7:1 auf dem Papier. */
  --kal-lesbar: #4A5562;
  --kal-blass: rgba(31, 58, 102, .28);
  /* Der leise TEXT-Ton: Kalenderwoche am Rand und die Tage aus Vor- und
     Folgemonat (Mathieu, 15.10.2026: "2 ja" - beide lagen bei 2,07:1 und
     1,68:1, im Dunkeln bei 4,44:1 und 2,53:1). Vorher trugen sie
     --kal-still und --kal-blass, und das sind Toene fuer Beiwerk und
     Konturen, nicht fuer Zahlen, die man lesen soll.
     Ein FESTER Farbwert statt einer Deckkraft: rgba haengt am Grund, und
     die Nachbartage liegen mal auf dem Papier, mal im Band der laufenden
     Woche (rgba(40, 48, 69, .10)). #545E66 ist die Tinte zu 80 % auf dem
     Papier - 5,7:1 auf dem Papier, 4,8:1 im Band. Der Monat selbst steht bei
     10,1:1: leiser bleibt erkennbar leiser, nur nicht mehr unleserlich.
     Gerechnet in kalender-leise.test.js, nicht abgeschrieben. */
  --kal-leise: #545E66;
  /* Eine Quelle fuer beide Stellen: der Monatskalender und der Wochenblock
     auf der Startseite toenen einen Tag mit Event gleich. */
  --kal-event: var(--event-ton);
  --kal-event-hover: var(--event-ton-stark);

  border: 1px solid var(--border); border-radius: var(--radius);
  padding: 1rem 1rem 1rem; margin-bottom: 1rem; background: var(--kal-papier);
}

/* Der Kalender hat seine eigene, engere Palette - und sie steht auf
   .plankalender, nicht auf :root. Eine Ueberschreibung in der Nachtpalette
   oben greift darum NICHT (die Klasse ist spezifischer als :root), und der
   Kalender blieb im Dunkeln ein leuchtendes Blatt Papier. Am gemessenen
   Hintergrund gesehen: rgb(247,235,226) mitten auf dunklem Grund.
   Also hier, an derselben Stelle, in der es auch hell definiert ist. */
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .plankalender {
    --kal-marine: #F5F5F7;
    --kal-signal: #F5F5F7;
    --kal-papier: #1C1C1E;
    --kal-tile: rgba(255, 255, 255, .06);
    --kal-we: rgba(255, 255, 255, .18);
    --kal-linie: rgba(255, 255, 255, .16);
    --kal-still: rgba(255, 255, 255, .45);
    --kal-lesbar: rgba(255, 255, 255, .70);
    --kal-blass: rgba(255, 255, 255, .28);
    /* Dunkel: das Weiss zu 56 % auf dem Papier - 5,7:1 wie im Hellen
       (Monat 15,6:1). */
    --kal-leise: #969698;
  }
}
:root[data-theme="dark"] .plankalender {
  --kal-marine: #F5F5F7;
  --kal-signal: #F5F5F7;
  --kal-papier: #1C1C1E;
  --kal-tile: rgba(255, 255, 255, .06);
  --kal-we: rgba(255, 255, 255, .18);
  --kal-linie: rgba(255, 255, 255, .16);
  --kal-still: rgba(255, 255, 255, .45);
  --kal-lesbar: rgba(255, 255, 255, .70);
  --kal-blass: rgba(255, 255, 255, .28);
  --kal-leise: #969698;
}

/* Der Kopf: Monatsname gross links, Nummer im Kreis, Jahr zweizeilig,
   Pfeile und Events rechts. Grid statt flex, damit die Events unter den
   Pfeilen sitzen und nicht daneben. */
.kalkopf {
  display: grid;
  /* minmax(0, 1fr) und NICHT nur "1fr" (Mathieu, 26.09.2026: "die events
     schreiben ueber den rahmen wenn der text zu lange ist"): ein nacktes
     "1fr" traegt als Mindestbreite "auto", und "auto" heisst hier "so breit
     wie der laengste Inhalt" - ein Event-Name ohne Umbruch (.kevname,
     white-space: nowrap) zog die Spalte auf seine volle Textbreite, egal wie
     schmal die Karte war. Gemessen bei 390 px: die Spalte wuchs auf 529 px
     und der Name lief 315 px ueber die Kartenkante hinaus, ganz ohne "…" -
     das text-overflow:ellipsis unten an .kevname kam nie zum Zug, weil die
     Spalte laengst breiter war, als sie sein durfte.
     minmax(0, 1fr) sagt: die Spalte darf auf 0 schrumpfen, bevor sie ueber
     ihren Anteil hinauswaechst - erst DANN greift das Abschneiden, das
     .kevname schon hatte. */
  grid-template-columns: auto 1px minmax(0, 1fr);
  align-items: start;
  gap: 0 1rem;
  margin-bottom: 1rem;
}
/* Links der Monat mit Jahr und Pfeilen darunter (Mathieu, 07.09.2026: "unter
   Sep 2026 nicht rechts daneben"). Die Pfeile stehen bei dem Monat, den sie
   wechseln - und rechts wird dadurch die ganze Hoehe fuer die Events frei.
   Die Monatsnummer im Kreis ist raus, sie kostete genau diesen Platz ("09
   fuer 9ter moant weg dann haben wir mehr platz fuer events"). */
.kalmonatblock { display: flex; flex-direction: column; align-items: flex-start; gap: .125rem; }
.kaltrenner { align-self: stretch; background: var(--kal-linie); }
.kalmonat {
  font-family: "Archivo Black", var(--f-text), sans-serif; font-weight: 400;
  font-size: clamp(2.6rem, 14vw, 3.7rem); line-height: .82;
  letter-spacing: -.035em; color: var(--kal-marine);
}
/* Das Jahr einzeilig unter dem Monat: darunter ist die Breite da, und
   "2026" in einem Stueck liest sich ruhiger als 20 ueber 26. */
.kaljahr {
  font-family: "Source Serif 4", Georgia, serif; font-weight: 600; font-size: 1rem;
  letter-spacing: .02em; color: var(--kal-lesbar);
  font-variant-numeric: tabular-nums; line-height: 1;
}
.kalnav { display: flex; gap: .75rem; align-items: flex-start; margin-top: .5rem; }
.kalnav a {
  display: flex; flex-direction: column; align-items: center; gap: .125rem;
  width: 2.7rem; color: var(--kal-marine); text-decoration: none;
}
.kalnav a:hover { text-decoration: none; }
.kalnav a:hover .kalnavtext { color: var(--kal-signal); }
.kalnav svg { width: 100%; height: auto; display: block; }
/* Der Monatsname steht UEBER dem Pfeil und ganz dezent (Mathieu, 07.09.2026:
   "aug und okt ueber die Pfeile direkt ganz dezent"). Er steht auch im
   Markup vor dem Pfeil, nicht per column-reverse gedreht - dann stimmt die
   Reihenfolge auch fuer den, der sich die Seite vorlesen laesst.
   Dezent heisst hier klein und leicht, NICHT blass: erst gestern lag die
   Beschriftung bei 2,4:1 Kontrast und war nicht zu lesen. Kleine Schrift mit
   Sperrung wirkt zurueckhaltend und bleibt lesbar - der Kontrast bleibt bei
   rund 4,6:1. */
.kalnavtext {
  font-family: "Source Serif 4", Georgia, serif; font-size: .625rem; font-weight: 400;
  letter-spacing: .07em; color: var(--kal-lesbar); line-height: 1;
}
.kalnav a:focus-visible { outline: 2px solid var(--kal-signal); outline-offset: 3px; border-radius: var(--radius-klein); }

/* Die Events an der Stelle, wo die Vorlage den Folgemonat zeigt. */
.kalevents {
  grid-column: 3;
  display: flex; flex-direction: column; gap: .125rem; padding-top: .125rem;
}
.kalevent {
  display: flex; gap: .5rem; align-items: baseline;
  font-size: .75rem; line-height: 1.25; color: var(--text);
  text-decoration: none; padding: .125rem 0;
}
.kalevent:hover { text-decoration: none; }
.kalevent:hover .kevname { color: var(--accent-hover); text-decoration: underline; }
.kevtag {
  font-family: "Source Serif 4", Georgia, serif; font-weight: 700; color: var(--kal-signal);
  white-space: nowrap; font-variant-numeric: tabular-nums; flex: none;
}
.kevname {
  font-family: "Source Serif 4", Georgia, serif; font-weight: 400;
  color: var(--kal-marine);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.kalevent:hover .kevname { color: var(--kal-signal); }

/* Das Raster: echte Haarlinien wie in der Vorlage, nicht schwebende
   Pillen. Die Aussenlinie traegt die Tabelle selbst. */
.plankalender-grid {
  width: 100%; border-collapse: collapse; table-layout: fixed;
  border: 1px solid var(--kal-linie);
}
.plankalender-grid th {
  font-family: "Source Serif 4", Georgia, serif;
  font-size: .75rem; font-weight: 600; color: var(--kal-marine);
  text-transform: none; letter-spacing: .01em; text-align: center;
  padding: .5rem .125rem; border: 1px solid var(--kal-linie);
  background: none;
}
.plankalender-grid th.kw { border: 0; background: none; }
.plankalender-grid td {
  padding: 0; border: 1px solid var(--kal-linie);
  font-variant-numeric: tabular-nums;
}
/* Die Kalenderwoche steht wie eine Randnotiz neben dem Raster, nicht
   darin - die Vorlage hat keine solche Spalte, aber sie ist der Weg zur
   Woche und darf nicht verschwinden. */
.plankalender-grid td.kw { border: 0; width: 2.1rem; }
.plankalender-grid td.kw > span, .plankalender-grid td.kw > a {
  justify-content: flex-end; padding-right: .5rem;
  /* --kal-leise statt --kal-still (15.10.2026, "2 ja"): die Woche ist der
     Weg in die Woche und damit Text, kein Beiwerk. */
  color: var(--kal-leise); font-weight: 400; font-size: .75rem; min-height: 0;
  font-family: "Source Serif 4", Georgia, serif;
}
/* Die Zahlen bewusst NICHT fett, kleiner und schlanker (Mathieu, 07.09.2026:
   "die datum tage muessen nich fett gedruckt sein mach die etwas kleiner und
   schlanker"). Vorher stand jeder Tag in Poppins 700 - ein Kalender mit
   35 fetten Zahlen hat keine Hierarchie mehr, alles schreit gleich laut. */
.plankalender-grid td > a, .plankalender-grid td > span {
  position: relative; display: flex; align-items: flex-start; justify-content: flex-start;
  min-height: 2.9rem; padding: .25rem .5rem; color: var(--kal-marine);
  text-decoration: none; font-family: "Source Serif 4", Georgia, serif;
  font-weight: 400; font-size: .875rem; letter-spacing: 0;
}
.kalzahl { line-height: 1; }
.plankalender-grid td > a:hover { background: var(--fill); }

/* --- Der Monat als Uebersicht: drei Balken und eine Quote je Kachel ------
   Nur im Backend am Desktop (Mathieu, 07.09.2026: "Nur im Backend dekstop
   ansicht"). Die Mitarbeiter-App ruft den Kalender ohne "lage" auf, dort
   greift keine dieser Regeln.

   Alle Regeln sind mit ">" auf das direkte Kind gemuenzt: ".plankalender-grid
   td span" hat schon einmal das Cocktailglas erwischt und die Zeile schief
   gezogen. Vierter Fall derselben Sorte an einem Tag - seither wird hier
   nichts mehr ohne ">" geschrieben. */
.plankalender.mit-diagramm .plankalender-grid td > a,
.plankalender.mit-diagramm .plankalender-grid td > span {
  /* 47 px waren zu wenig: das Diagramm war am Bild ein Fleck. Als eigene
     Uebersicht darf der Monat hoehere Zeilen haben - fuenf Zeilen kosten
     damit 330 statt 235 px. */
  min-height: 4.1rem; padding-bottom: 2rem;
}
/* --- Stunden und Kosten des Monats, ueber dem Kalender ------------------
   Vier Zahlen in einer Reihe: die Summe gross, dann Bar, Kueche und die
   Monatsgehaelter. Nur im Backend, wo der Bildschirm breit ist. */
.monatskosten .mkreihe {
  display: grid; grid-template-columns: 1.5fr repeat(3, 1fr); gap: 1rem;
}
.mkspalte { border-left: 2px solid var(--border); padding-left: .75rem; min-width: 0; }
.mkspalte:first-child { border-left: 0; padding-left: 0; }
.mkspalte.gross { border-left: 0; padding-left: 0; }
.mktitel {
  font-size: .75rem; font-weight: 700; letter-spacing: .09em; text-transform: uppercase;
  color: var(--muted); margin-bottom: .125rem;
}
.mkwert {
  font-size: 1.5rem; font-weight: 700; letter-spacing: -.025em; line-height: 1.1;
  font-variant-numeric: tabular-nums;
}
.mkspalte.gross .mkwert { font-size: 2.1rem; }
.mkneben { font-size: .875rem; font-weight: 600; color: var(--text-soft); font-variant-numeric: tabular-nums; }
.mkfuss { font-size: .75rem; color: var(--muted); margin-top: .125rem; }
/* Am schmalen Bildschirm untereinander statt gequetscht - gefragt war die
   Desktop-Ansicht, kaputt sein darf es hier trotzdem nicht. */
@media (max-width: 900px) {
  .monatskosten .mkreihe { grid-template-columns: 1fr 1fr; }
  .mkspalte:nth-child(3) { border-left: 0; padding-left: 0; }
  .mkspalte.gross .mkwert { font-size: 1.6rem; }
}
/* Die Skyline: ein Strich JE STUNDE, und die HOEHE ist die Menge (Mathieu,
   10.09.2026, aus vier Vorschlaegen gewaehlt). Die Mittellinie heisst
   "passt"; nach unten waechst rot, wie viele Leute fehlen, nach oben gold,
   wie viele zu viel sind. Vorher sagte nur die Farbe die Richtung - eine
   Person zu wenig sah aus wie drei.

   Die Reihe nimmt die VOLLE Kachelbreite: die Zahl sass rechts und liess den
   Strichen nur 36,2 von 81 px, sie wurden dadurch auf 1,19 px gequetscht
   statt der vorgesehenen 2 (nachgerechnet). Oben hat die Zahl Platz, unten
   bleiben 68,2 px und damit 3,07 px je Stunde. */
.kaldiag {
  position: absolute; left: .4rem; right: .4rem; bottom: .3rem;
  display: flex; align-items: center; gap: 1px; height: 20px;
  flex-wrap: nowrap; overflow: hidden;
}
.kaldiag::before {
  content: ""; position: absolute; left: 0; right: 0; top: 50%;
  height: 1px; background: var(--kal-linie);
}
.kstd { display: block; flex: 1 1 0; min-width: 2px; border-radius: var(--radius-klein); position: relative; z-index: 1; }
.kstd.s-passt { height: 3px; background: var(--gruen); }
/* "Fuer diese Stunde ist kein Bedarf hinterlegt" ist KEINE Aussage ueber
   Besetzung - also nur ein blasser Strich auf der Linie, kein Balken. Sonst
   zeichnete der Kalender jede Stunde vor der Oeffnung als Katastrophe. */
.kstd.s-aus { height: 2px; background: var(--strich-aus); opacity: .5; }
/* Zu wenig waechst nach unten, zu viel nach oben - gegen die Mittellinie.
   align-self schiebt den Strich an den Rand, der Abstand haelt ihn auf der
   Linie. */
.kstd.s-wenig { background: var(--crit); align-self: flex-start; margin-top: 10px; }
.kstd.s-viel { background: var(--gold); align-self: flex-end; margin-bottom: 10px; }
.kstd.m1 { height: 4px; }
.kstd.m2 { height: 7px; }
.kstd.m3 { height: 10px; }
/* Zeitmarken bei 12, 18 und 00 Uhr: ohne sie sieht man die Form, kann sie
   aber keiner Uhrzeit zuordnen. */
.kstd.marke::after {
  content: ""; position: absolute; left: 50%; top: -6px; width: 1px; height: 4px;
  background: var(--kal-still); opacity: .55;
}
/* Der Event-Stoerer in der Kachel: oben rechts, die einzige freie Ecke.
   Ein voller Punkt heisst "hier laeuft was", ein Umriss heisst "erst eine
   Idee" - dieselbe Sprache wie am Tageskopf und in der Mitarbeiter-Woche.

   Heisst ".kalstoerer" und NICHT ".kalevent": das gibt es schon, es ist die
   Zeile in der Liste neben dem Monatsnamen. Meine Regel stand spaeter im
   Stylesheet, gleiche Spezifitaet - und hat aus jeder dieser vier Zeilen
   einen roten Punkt gemacht. Am gemessenen Ergebnis gesehen (acht Treffer
   fuer ".kalevent", erwartet waren vier). Sechster Fall derselben
   Fehlerfamilie in dieser Woche, diesmal von mir selbst gebaut. */
/* Die Monatszahl eines Eventtages ist ORANGE (Mathieu, 14.09.2026:
   "vielleicht faerbt man die Monatszahl also 17 in orange ein damit man es
   versteht?"). Das Raster ist voller kleiner Kreise - Dienst, fehlende
   Leute, faellt bald an -, und noch ein Punkt war darin nur noch ein Punkt.
   Die Zahl dagegen gehoert keinem anderen Zeichen: faerbt man sie, sieht man
   den Tag, nicht ein Symbol auf ihm.

   NICHT am heutigen Tag: der ist ein gefuellter Kreis mit heller Zahl darin,
   und orange auf Marine waere weder das eine noch das andere. Heute
   gewinnt - es ist der einzige Tag, der sich selbst erklaert. */
.plankalender-grid td.event:not(.heute) .kalzahl { color: var(--wahl); font-weight: 700; }

/* Die Eventzeilen ueber dem Raster in derselben Farbe (Mathieu: "und oben die
   events auch orange") - aber NUR die Events. Ein Feiertag ist kein Termin
   der Bar, er steht in derselben Liste und bleibt in der Tinte. */
.kalevent:not(.kalfeiertag) .kevtag,
.kalevent:not(.kalfeiertag) .kevname { color: var(--wahl); }
.kalevent:not(.kalfeiertag):hover .kevname { color: var(--wahl); text-decoration: underline; }

/* Der Punkt ist ORANGE (Mathieu, 14.09.2026: "koennen wir events in der
   Monatsansicht den punkt orange machen?"). Er war in der Tinte des
   Kalenders - damit sah ein Eventtag aus wie jeder andere Tag mit einem
   Zeichen drauf.
   Es ist dieselbe Wahlfarbe wie ueberall, wo ein Event auftaucht: der Name
   im Wochenblock der Startseite, das kleine Eventfenster ueber dem Tag. Ein
   Ding, eine Farbe - und keine neue: --wahl gibt es in beiden Modi, samt
   passender Schriftfarbe (--wahl-ink), damit die Zahl im Punkt in beiden
   lesbar bleibt. */
.kalstoerer {
  position: absolute; right: .34rem; top: .3rem;
  min-width: 11px; height: 11px; border-radius: var(--radius-pille);
  background: var(--wahl); color: var(--wahl-ink);
  display: grid; place-items: center; padding: 0 2px;
  font-family: var(--f-text); font-size: .625rem; font-weight: 700; line-height: 1;
}
/* Eine Idee ist noch kein Termin: umrandet statt gefuellt - dieselbe
   Unterscheidung wie ueberall sonst, Form statt zweiter Farbe. */
/* Die Zahl muss mitwandern: ohne Fuellung steht sie sonst in der Schrift-
   farbe FUER die Fuellung - im Dunkeln fast schwarz auf fast schwarz. Faellt
   nur bei zwei Ideen am selben Tag auf, ist aber trotzdem falsch. */
.kalstoerer.idee { background: transparent; border: 1.5px dashed var(--wahl); color: var(--wahl); }
/* Der ganze Tag bekommt einen Hauch Tinte, wenn ein Event darauf liegt
   (Mathieu, 10.09.2026, aus vier Vorschlaegen gewaehlt). Das ist die Antwort
   auf "da ist eventuell mehr los": nicht ein Zeichen AM Tag, sondern ein
   anderer Tag. Bewusst sehr duenn - bei mehreren Events soll der Monat nicht
   fleckig werden, und die Zahl muss lesbar bleiben. */
/* Als inset-Schatten und NICHT als background: die aktive Woche hat schon
   einen Hintergrund auf demselben Element (rgba(40,48,69,.10) in derselben
   Zeile) - eine zweite background-Regel ersetzt ihn, statt sich darauf zu
   legen. Live gesehen: der 8. lag in der aktiven Woche und war von seinen
   Nachbarn nicht zu unterscheiden. Der Schatten liegt DARAUF, also stimmt die
   Toenung in beiden Zeilenzustaenden - und in beiden Modi. */
.plankalender-grid td.event > a,
.plankalender-grid td.event > span { box-shadow: inset 0 0 0 999px var(--kal-event); }
.plankalender-grid td.event > a:hover { box-shadow: inset 0 0 0 999px var(--kal-event-hover); }
/* Die Zahl sitzt OBEN rechts, damit die Stundenreihe die volle Breite
   bekommt. Liegt an dem Tag ein Event, sitzt dort schon der Punkt - dann
   rueckt die Zahl nach links davor, statt sich mit ihm zu ueberlagern. */
.plankalender-grid td.event .kalquote { right: 1.25rem; }
.kalquote {
  position: absolute; right: .4rem; top: .3rem;
  font-family: var(--f-text); font-size: .75rem; font-weight: 700;
  font-variant-numeric: tabular-nums; letter-spacing: -.01em;
}
/* 25.10.2026: --ok statt --gruen - auf der gruenen Toenung der Kachel kam das Haekchen auf 4,3:1, mit --ok auf 6,4:1. */
.kq-gruen { color: var(--ok); }
.kq-gold { color: var(--warn); }
.kq-rot { color: var(--crit); }
/* Ein voll besetzter Tag ist gruen hinterlegt - dieselbe Sprache wie die
   Tagesbalken in der Mitarbeiter-App. */
.plankalender.mit-diagramm .plankalender-grid td:has(.kq-gruen) > a,
.plankalender.mit-diagramm .plankalender-grid td:has(.kq-gruen) > span {
  background: color-mix(in srgb, var(--feier-gruen) 10%, transparent);
}
.plankalender.mit-diagramm .plankalender-grid td:has(.kq-gruen) > a:hover { background: color-mix(in srgb, var(--feier-gruen) 16%, transparent); }
/* Unter ~900 px ist das Raster zu schmal fuer neun Balken je Zeile. Dann
   faellt das Diagramm weg und der Kalender ist wieder, was er vorher war -
   ein Wochenwaehler. Ausdruecklich nur die Desktop-Ansicht war gefragt. */
@media (max-width: 900px) {
  .kaldiag, .kalquote { display: none; }
  .plankalender.mit-diagramm .plankalender-grid td > a,
  .plankalender.mit-diagramm .plankalender-grid td > span { min-height: 2.9rem; padding-bottom: .25rem; }
}
.plankalender-grid td > span { cursor: default; }
/* Tage aus dem Vor- oder Folgemonat: leiser als der Monat, aber lesbar
   (Mathieu, 15.10.2026: "2 ja"). Mit --kal-blass lagen sie bei 1,68:1 - wie
   in der Vorlage, nur dass man dort nichts antippen muss. Team-App und
   Planung teilen diese eine Regel. */
.plankalender-grid td.ausserhalb > a, .plankalender-grid td.ausserhalb > span {
  color: var(--kal-leise);
}

/* Heute: der gefuellte Kreis aus der Vorlage, hinter der Zahl. */
/* Heute: der einzige Tag, der fett sein darf - er ist die Ausnahme, und
   dafuer ist Fettdruck da. */
.plankalender-grid td.heute .kalzahl {
  position: relative; z-index: 1; color: var(--kal-papier); font-weight: 700;
}
.plankalender-grid td.heute .kalzahl::before {
  content: ""; position: absolute; z-index: -1;
  left: 50%; top: 50%; transform: translate(-50%, -50%);
  width: 1.75rem; height: 1.75rem; border-radius: var(--radius-pille);
  background: var(--kal-signal);
}

/* Die angebotene Woche als durchgehende Kapsel - dieselbe Form, die die
   Vorlage ueber die Sonntagsspalte legt, nur waagerecht. */
.plankalender-grid tr.aktiv td:not(.kw) > a,
.plankalender-grid tr.aktiv td:not(.kw) > span { background: var(--kal-band); }
/* Die Kapsel ist EINE Form, keine sieben gefaerbten Zellen: die senkrechten
   Trennlinien laufen deshalb innerhalb der Woche nicht durch. So macht es
   die Vorlage mit ihrer Pille ueber der Sonntagsspalte auch - erst am
   fertigen Bild gesehen, im Code sah es richtig aus. Oben und unten bleibt
   die Linie, sonst verliert die Woche ihre Grenze zu den Nachbarzeilen. */
.plankalender-grid tr.aktiv td:not(.kw) {
  border-top-color: var(--kal-signal);
  border-bottom-color: var(--kal-signal);
  border-left-color: transparent;
  border-right-color: transparent;
}
/* Aussen bleibt die Kante: sonst franst die Woche an den Rand des Rasters aus. */
.plankalender-grid tr.aktiv td:nth-child(2) { border-left-color: var(--kal-signal); }
.plankalender-grid tr.aktiv td:last-child { border-right-color: var(--kal-signal); }
.plankalender-grid tr.aktiv td:nth-child(2) > a,
.plankalender-grid tr.aktiv td:nth-child(2) > span { border-radius: 999px 0 0 999px; }
.plankalender-grid tr.aktiv td:last-child > a,
.plankalender-grid tr.aktiv td:last-child > span { border-radius: 0 999px 999px 0; }
/* In der aktiven Woche bleibt die Zahl marine - der cremefarbene Text der
   alten Fassung war auf der Signalflaeche nicht mehr zu lesen. */
.plankalender-grid tr.aktiv td:not(.kw) > a { color: var(--kal-marine); }
.plankalender-grid tr.aktiv td.heute .kalzahl { color: var(--kal-papier); }

/* Diensttag: das Glas im kleinen Kreis, unten rechts in der Zelle (Mathieu,
   07.09.2026: "und natuerlich da wo sie jeweils arbeiten das cocktail glas
   im kreis"). Dieselbe Marke wie .dwa im Wochenstreifen der Startseite.
   Unten rechts geht jetzt auf, weil die Zahl nach oben links gewandert ist -
   in der alten, zentrierten Fassung lag der Kreis halb auf der Zahl. Und
   weil er absolut sitzt, braucht es keinen unsichtbaren Platzhalter an
   freien Tagen mehr: die Zahlen stehen durch ihre Ausrichtung auf einer
   Linie, nicht durch reservierten Platz darunter. */
.kaldienst {
  position: absolute; right: .22rem; bottom: .22rem; pointer-events: none;
  display: flex; align-items: center; justify-content: center;
  width: .95rem; height: .95rem; border-radius: var(--radius-pille);
  background: var(--kal-marine); color: var(--kal-papier);
}
.kaldienst svg { width: 66%; height: 66%; display: block; }
/* Die eigene Startzeit im Monatsraster (Mathieu, 08.09.2026: "nicht nur das
   glas ... sondern seine zeiten wann man arbeitet").
   Warum die STARTzeit und nicht die Spanne: nachgemessen auf 375 px ist eine
   Zelle 40 x 33 px, innen 39. "16:30-01:00" braucht bei dieser Schriftgroesse
   51 px und passt nicht. "16:30" braucht 22. Das Ende steht im Tag darunter,
   wo Platz dafuer ist. */
/* --- Nachweise der Eigenkontrolle ----------------------------------------
   Temperaturen und Schaedlingscheck (Mathieu, 08.09.2026). Gebaut fuer eine
   Situation: halb eins nachts, eine Hand am Handy. Deshalb eine Zeile je
   Punkt, Name links, Feld rechts, und ein Feld, das gross genug ist, um es
   im Halbdunkeln zu treffen. */
/* Import-Vorschau: alt durchgestrichen, neu fett - bei Loehnen will man
   den Unterschied sehen und nicht nur den neuen Wert. */
.impvor td { vertical-align: top; }
.impvor tr.istneu td { background: var(--fill); }
.impfeld { display: block; margin: .125rem 0; }
.impfeldname {
  display: inline-block; min-width: 8.5rem; font-size: .75rem; font-weight: 650;
  letter-spacing: .04em; text-transform: uppercase; color: var(--muted);
}
.impfeld s { color: var(--muted); }

/* Leiste zum Auszeichnen (Mathieu, 08.09.2026). Klein und ruhig: sie steht
   ueber jedem Inhaltsfeld und soll nicht wichtiger aussehen als der Text. */
.mdleiste {
  display: flex; align-items: center; gap: .25rem; flex-wrap: wrap;
  margin: 0 0 .25rem;
}
.mdknopf {
  font: inherit; font-size: .875rem; line-height: 1;
  min-height: 44px; padding: 0 .75rem;
  border: 1px solid var(--border); border-radius: var(--radius-xs);
  background: var(--surface); color: var(--text); cursor: pointer;
}
.mdknopf:hover { background: var(--fill); border-color: var(--border-strong); }
.mdknopf:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.mdtrenn { width: 1px; height: 24px; background: var(--border); margin: 0 .25rem; }
.mdhinweis { font-size: .75rem; color: var(--muted); margin-left: .25rem; }
/* Die mitlaufende Vorschau. Leer soll sie nicht wie ein Fehler aussehen. */
.mdvorschau:empty::before {
  content: 'Noch nichts geschrieben.';
  color: var(--muted); font-size: .875rem;
}

/* Bruch: die Kategorien als Aufklapper. Die erste steht offen - wer ein Glas
   meldet, tippt nichts auf; wer einen Teller meldet, einmal. */
.brgruppe { border-top: 1px solid var(--border); }
.brgruppe:first-of-type { border-top: 0; }
.brgruppe > summary {
  display: flex; align-items: center; gap: .5rem;
  min-height: 44px; padding: .25rem 0; cursor: pointer; list-style: none;
}
/* Die Anzahl steht direkt hinter dem Namen und nicht in der Mitte der
   Zeile - space-between hatte sie dorthin geschoben. */
.brgruppe > summary .hint { margin-right: auto; }
.brgruppe > summary::-webkit-details-marker { display: none; }
.brgtitel {
  font-size: .75rem; font-weight: 650; letter-spacing: .08em;
  text-transform: uppercase; color: var(--muted);
}
/* Das Zeichen sagt, ob es auf oder zu ist - ohne bleibt eine zugeklappte
   Kategorie eine Zeile, die nach nichts aussieht. */
.brgruppe > summary::after {
  content: '›'; margin-left: auto; font-size: 1.125rem; line-height: 1;
  color: var(--muted); transition: transform .15s ease;
}
.brgruppe[open] > summary::after { transform: rotate(90deg); }
@media (prefers-reduced-motion: reduce) { .brgruppe > summary::after { transition: none; } }

/* Bruchliste: die Summe als Balken. Der Balken traegt die Tinte selbst
   (9,2:1 hell / 7,0:1 dunkel) - ein ruhiger Randton waere auf der Bahn bei
   1,38:1 gelandet und damit unsichtbar. */
.bruchsummen { display: flex; flex-direction: column; gap: .25rem; }
.bruchzeile {
  display: grid; grid-template-columns: minmax(9rem, 14rem) minmax(0, 28rem) auto;
  align-items: center; gap: .75rem;
}
.bruchname { font-weight: 550; }
.bruchname .hint { font-weight: 400; }
.bruchbalken {
  height: 10px; border-radius: var(--radius-klein);
  background: var(--surface-3); overflow: hidden;
}
.bruchbalken > span { display: block; height: 100%; background: var(--accent); }
.bruchzahl { font-variant-numeric: tabular-nums; font-weight: 600; min-width: 2.5rem; text-align: right; }
@media (max-width: 560px) {
  .bruchzeile { grid-template-columns: 1fr auto; }
  .bruchbalken { grid-column: 1 / -1; }
}
.nwliste, .nwfertig { display: flex; flex-direction: column; gap: .125rem; }
/* Ja/Nein als zwei Knoepfe nebeneinander. Das echte Radio liegt darunter und
   bleibt bedienbar (Tastatur, Vorlesen); sichtbar ist das <span>. Ohne diese
   Regel standen die zwei Knoepfe untereinander - gemessen 34 x 97 px statt
   nebeneinander, im Quelltext nicht zu sehen. */
.nwja { flex: 0 0 auto; display: flex; gap: .25rem; }
.nwja label { position: relative; margin: 0; cursor: pointer; }
.nwja input {
  position: absolute; inset: 0; width: 100%; height: 100%;
  margin: 0; opacity: 0; cursor: pointer;
}
.nwja span {
  display: grid; place-items: center;
  min-width: 3.1rem; min-height: 44px; padding: 0 .5rem;
  border: 1.5px solid var(--border-strong); border-radius: var(--radius-xs);
  background: var(--surface); color: var(--text-soft);
  font-size: .875rem; font-weight: 620;
}
/* Gewaehlt wird gefuellt - dieselbe Sprache wie im Rest der App: gefuellt
   heisst "das ist es", umrandet heisst "kannst du waehlen". */
.nwja input:checked + span {
  background: var(--accent); border-color: var(--accent); color: var(--accent-ink);
}
.nwja input:focus-visible + span { outline: 2px solid var(--accent); outline-offset: 2px; }

/* Die Reiter der vier Dokumente. Die Zahl dahinter ist, was dort offen ist. */
.nwtabs { margin: .25rem 0 1rem; }
/* Das Abzeichen braucht Luft (Mathieu, 09.09.2026: "Bei Temperaturen die 15
   noch offen steht super nah an Temperaturen mach da sbissen abstand"). Das
   Leerzeichen im Markup allein reichte nicht - im Reiter steht es dicht am
   letzten Buchstaben und liest sich wie eine Jahreszahl am Wort. */
.nwtabs b { font-weight: 700; opacity: .75; margin-left: .45em; }
/* Ueberfaellig: der Stichtag des Monats ist vorbei und nichts eingetragen.
   Rot, weil es eine Frist ist - "offen" am 2. und "offen" am 27. sind nicht
   dasselbe, und ohne Unterschied sieht ein Monatsblatt jeden Tag gleich aus.
   Am Reiter nur ein Rand, nicht die ganze Flaeche: der aktive Reiter ist
   gefuellt, und zwei gefuellte waeren zwei Hauptsachen. */
.nwtabs a.faellig { border: 1.5px solid var(--crit); color: var(--crit); }
.nwtabs a.faellig[aria-current="page"] { background: var(--crit); border-color: var(--crit); color: var(--crit-ink); }
.hint.nwfaellig { color: var(--crit); font-weight: 700; }

/* Der Bestand in der Uebergabe: Eis und Baguette (Mathieu, 08.09.2026 -
   "hatten wir immer Eis & Baguette bestand mit drin"). Dieselbe Zeilenform
   wie bei den Nachweisen: Name links, Zahl rechts, 44 px hoch. */
/* Die letzte Schichtuebergabe als Karte - auf der Startseite und im Hub
   dieselbe. Vorher war sie ein grauer Fliesstext mit acht Doppelpunkten:
   "Wie voll: rappelvoll · Besetzung: unterbesetzt · Schicht: ..." - zehn
   Zeilen, die man lesen MUSS, statt sie zu ueberfliegen. */
.ubwer { font-size: .75rem; color: var(--muted); margin: 0 0 .5rem; }
/* Die kurzen Antworten als Pillen: "rappelvoll", "unterbesetzt" sind je ein
   Wort und brauchen keine eigene Zeile. */
.ubchips { display: flex; flex-wrap: wrap; gap: .25rem; margin: 0 0 .5rem; }
.ubchip {
  font-size: .75rem; font-weight: 700; padding: .125rem .5rem; border-radius: var(--radius-pille);
  background: var(--fill); color: var(--text-soft);
}
/* Die geschriebenen Saetze mit ihrer Frage davor - die Frage klein und leise,
   die Antwort in Lesegroesse. */
.ubfeld { margin: 0 0 .5rem; font-size: .875rem; line-height: 1.4; }
.ubfeld:last-of-type { margin-bottom: .25rem; }
.ubfrage {
  display: block; font-size: .625rem; font-weight: 800; letter-spacing: .06em;
  text-transform: uppercase; color: var(--muted); margin-bottom: .125rem;
}
.ubgezaehlt { font-size: .75rem; color: var(--muted); margin: .5rem 0 0; }
/* "Gelesen" und "Übergabe schreiben" stehen nebeneinander in einer .btn-row -
   das Formular darf die Zeile dafuer nicht sprengen. */
.ubweg { display: inline-flex; }
/* 44 px, weil beide mit dem Daumen getroffen werden - gemessen waren es 40.
   Dieselbe Zeile steht aus demselben Grund am Gelesen-Knopf der News. */
.ubkarte .btn-row .btn { min-height: 44px; }

/* Der Push-Stand je Person in der Team-Liste: eine eigene Zeile unter dem
   App-Stand, mit dem Testknopf rechts. */
.pushzeile { display: flex; align-items: center; gap: .5rem; flex-wrap: wrap; margin-top: .25rem; }
.pushzeile .meta { flex: 1 1 auto; min-width: 0; }
.pushtest { flex: none; }
/* Eingeklappt ist leiser: die Pillen und die Fragen bleiben, aber die Karte
   traegt keinen Kopf mehr - den macht das summary. */
details.ubkarte .ubwer { margin-top: .125rem; }

.ubbestand { display: flex; flex-direction: column; gap: .125rem; }
.ubzeile {
  display: flex; align-items: center; gap: .75rem;
  padding: .5rem 0; border-bottom: 1px solid var(--hair);
}
.ubzeile:last-child { border-bottom: 0; }
.ubwas { display: flex; flex-direction: column; gap: .125rem; min-width: 0; flex: 1 1 auto; }
.ubname { font-size: 1rem; font-weight: 620; }
.ubjetzt { font-size: .75rem; color: var(--muted); }
.ubzeile input.ubzahl { flex: 0 0 auto; width: 5.2rem; }

/* Der Ort als kleine Kapitelueberschrift. Bei fuenfzehn Geraeten ist das der
   Unterschied zwischen einer Liste und vier Bloecken. */
.nwort {
  margin: 1rem 0 .125rem; font-size: .75rem; font-weight: 700;
  letter-spacing: .08em; text-transform: uppercase; color: var(--muted);
}
.nwort:first-child { margin-top: .25rem; }
.nwzeile {
  display: flex; align-items: center; gap: .75rem; min-width: 0;
  padding: .5rem 0; border-bottom: 1px solid var(--hair);
}
.nwzeile:last-child { border-bottom: 0; }
.nwwas { display: flex; flex-direction: column; gap: .125rem; min-width: 0; flex: 1 1 auto; }
.nwname { font-size: 1rem; font-weight: 620; letter-spacing: -.012em; }
.nwsoll { font-size: .75rem; color: var(--muted); }
/* 44 px hoch und 5,2rem breit: das Feld ist das Bedienelement dieser Seite,
   und es wird mit dem Daumen getroffen, nicht mit der Maus. */
/* Nur die ZAHL ist schmal und zentriert. Vorher galt dieselbe Regel auch
   fuer jedes Textfeld in einer Zeile - damit war "Was wurde geliefert?" ein
   83 px breites, zentriertes Feld, gemessen etwa zehn Zeichen. Mathieu,
   08.09.2026: "bei Wareneingang sind die felder zu schreiben gross genug und
   richtig gesetzt". Waren sie nicht.
   (Kein Backtick in diesem Kommentar: das CSS steht in einem Template-String,
   und ein Backtick beendet ihn mitten im Satz. Fuenfter Fall dieser Sorte in
   einer Sitzung - Kommentare in diesem Stylesheet bleiben ohne Sonderzeichen.) */
/* Der Selektor ist absichtlich so lang. Das Formular-Grundgeruest setzt
   input[type="text"] auf width: 100% - Spezifitaet 0,1,1. Eine Regel mit nur
   einer Klasse (0,1,0) verliert dagegen, und das Zahlenfeld war damit 324
   statt 83 px breit. Genau daran ist die vorherige Fassung gescheitert:
   ich hatte den langen Selektor gekuerzt, weil er ueberfluessig aussah.
   Gemessen, nicht gelesen. */
.nwzeile input.nwzahl, .nwzeile select {
  flex: 0 0 auto; width: 5.2rem; min-height: 44px; text-align: center;
  font-variant-numeric: tabular-nums; font-size: 1rem;
}
.nwzeile select { width: 9.5rem; text-align: left; }
/* Vorzeichen am Temperaturfeld. Der Knopf ist 44 px, weil hier nachts mit
   einer Hand getippt wird, und er sitzt LINKS vom Feld - da, wo das
   Vorzeichen in der Zahl auch steht.
   Der lange Selektor hat denselben Grund wie oben beim Zahlenfeld: das
   Formular-Grundgeruest setzt button-Regeln, und eine Regel mit einer Klasse
   verliert dagegen. */
.nwzeile .nwvz { display: flex; align-items: center; gap: .25rem; flex: 0 0 auto; }
.nwzeile .nwvz .nwminus {
  flex: 0 0 auto; width: 44px; min-height: 44px; padding: 0;
  border-radius: var(--radius-pille); border: 1px solid var(--hair);
  background: var(--card); color: var(--muted);
  font: inherit; font-size: 1rem; font-weight: 700; line-height: 1;
  cursor: pointer; font-variant-numeric: tabular-nums;
}
.nwzeile .nwvz .nwminus:hover { border-color: var(--accent); color: var(--text); }
/* Minus an: gefuellt. Das ist der Zustand, in dem eine Zahl etwas voellig
   anderes bedeutet - der muss man ansehen koennen, ohne ins Feld zu schauen. */
.nwzeile .nwvz .nwminus.an {
  background: var(--accent); border-color: var(--accent); color: var(--accent-ink);
}
/* Ohne Skript waere der Knopf ein Knopf, der nichts tut. Dann weg damit: in
   das Feld laesst sich "-18" tippen, am Rechner ist das der normale Weg. */
.nwzeile .nwvz:not(.js) .nwminus { display: none; }
/* Eine Zeile mit Textfeld steht als Spalte: Beschriftung oben, Feld ueber die
   ganze Breite darunter. Nebeneinander bleibt fuer den Text kein Platz. */
.nwzeile.lang { flex-direction: column; align-items: stretch; gap: .5rem; }
.nwzeile.lang .nwwas { flex: 0 0 auto; }
.nwzeile.lang input.nwtext {
  width: 100%; min-height: 44px; text-align: left;
  font-size: 1rem;
}
.nwwert {
  flex: none; font-variant-numeric: tabular-nums; font-weight: 700;
  font-size: 1rem; color: var(--ok);
}
/* Eine Abweichung ist rot - und nur sie. Der Rest der Liste ist Buchhaltung. */
.nwwert.abweichung, .nwzeile.abweichung .nwwert { color: var(--crit); }

/* Das Protokoll im Backend: nach Tagen, damit man einen Tag als Ganzes
   vorzeigen kann. */
.nwtag { display: flex; gap: .75rem; align-items: baseline; padding: .5rem 0; border-bottom: 1px solid var(--hair); }
.nwtag:last-child { border-bottom: 0; }
.nwtagkopf {
  flex: none; width: 3.2rem; font-weight: 700; font-size: .875rem;
  font-variant-numeric: tabular-nums; color: var(--text-soft);
}
.nwtagliste { display: flex; flex-wrap: wrap; gap: .25rem; min-width: 0; }
.nwchip {
  font-size: .75rem; font-weight: 600; padding: .125rem .5rem;
  border-radius: var(--radius-pille); background: var(--fill); color: var(--text-soft);
  white-space: nowrap;
}
.nwchip.abweichung { background: var(--crit-soft); color: var(--crit); }
.tabelle tr.still td { color: var(--text-aus); }

/* Feiertag: eine neutrale Toenung, kein Signal. Ein Feiertag ist weder eine
   Handlung (gefuellt) noch etwas, was man machen kann (umrandet) noch ein
   Zustand der Besetzung - er ist Information ueber den Tag. Deshalb --fill,
   der neutrale Wisch, und der Name im Kopf des Kalenders, wo Platz dafuer
   ist. In 40 px passt kein Name.
   KEIN Zuschlag daran: Mathieu, 08.09.2026 - "gibt aber keine zuschuesse". */
.plankalender-grid td.feiertag > a,
.plankalender-grid td.feiertag > span { background: var(--fill); }
.plankalender-grid td.feiertag .kalzahl { font-style: italic; }
.kalfeiertag .kevname { color: var(--kal-lesbar); font-style: italic; }

/* Die eigene Anfangszeit - seit dem 13.09.2026 eine gefuellte Pille statt
   einer 9-px-Zeile. Im Halbdunkel hinter der Bar liest 9 px niemand, und
   "wann fange ich an" ist die Frage, mit der man den Monat aufmacht. */
/* Gruen heisst "du" (Mathieu, 13.09.2026: "und wuerde sagen du arbeitest
   gruen") - dieselbe Farbe, in der auch der eigene Name in der Schichtliste
   steht. Die Pille traegt ihr eigenes Paar (--ok/--ok-ink), sie muss also
   auf keinem Untergrund lesbar sein, sondern nur auf sich selbst. */
.kalzeit {
  position: absolute; left: 0; right: 0; bottom: .22rem;
  width: fit-content; margin: 0 auto; padding: 2px 6px; border-radius: var(--radius-pille);
  text-align: center; font-size: .625rem; font-weight: 800; line-height: 1;
  background: var(--ok); color: var(--ok-ink);
  font-family: var(--f-text); font-variant-numeric: tabular-nums;
  letter-spacing: -.01em; pointer-events: none;
}
/* Wie viele an diesem Tag noch fehlen - dieselbe Sprache wie die Pille im
   Wochenstreifen, nur kleiner: der Monat hat 40-px-Kacheln (Mathieu,
   13.09.2026: "sollten maybe auch die kleinen Zahlen sein wie in der
   Wochenansicht das die Leute wissen wo wir noch Leute suchen").
   Sie steht an derselben Stelle wie die eigene Anfangszeit und schliesst
   sich mit ihr aus - an einem eigenen Diensttag traegt man sich nicht noch
   einmal ein. */
.kalluecke {
  position: absolute; left: 0; right: 0; bottom: .22rem; margin: 0 auto;
  width: fit-content; min-width: 17px; height: 17px; padding: 0 4px;
  border-radius: var(--radius-pille); display: grid; place-items: center;
  font-family: var(--f-text); font-size: .625rem; font-weight: 800; line-height: 1;
  font-variant-numeric: tabular-nums; pointer-events: none;
  background: var(--gold); color: var(--deep);
}
.kalluecke.stufe-kritisch { background: var(--crit); color: var(--crit-ink); }
.kalluecke.stufe-voll { background: var(--ok); color: var(--ok-ink); }

/* Ohne hinterlegten Bedarf: keine Ampel (Mathieu, 15.10.2026: "Es sollte nur
   die Ampel beim hinterlegten Bedarf geben"). Die Stufe "neutral" traegt eine
   Zahl ohne Farbe - im Team ist eine leere Schicht weiter eine Einladung
   (Antwort 2: "Ja"), aber keine Warnung. Steht HIER, hinter allen
   stufe-Regeln des Streifens, der Schichtliste und der Zeitleiste, damit sie
   bei gleicher Spezifitaet gewinnt. */
.stufe-neutral > .wszzahl { background: transparent; color: var(--text-soft); font-weight: 600; }
.wochestreifen .wsztag.ist-an.stufe-neutral > .wszzahl { color: inherit; }
.skfehlt.stufe-neutral,
.szliste .skfehlt.stufe-neutral,
.szliste .skleute .skfehlt.stufe-neutral,
.zlbkopf .skfehlt.stufe-neutral { background: var(--fill); color: var(--text-soft); }
.szliste .schichtkarte.offen.stufe-neutral { box-shadow: 0 0 0 1px var(--border), var(--schatten-2); }
.kalluecke.stufe-neutral { background: var(--fill); color: var(--text-soft); }

/* Der eine ruhige Hinweis ohne Bedarf - gestrichelt, keine Signalfarbe. */
.kbhinweis {
  display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between; gap: .25rem .8rem;
  margin: .25rem 0 1rem; padding: .6rem .85rem;
  border: 1px dashed var(--border-strong); border-radius: var(--radius-sm);
  font-size: .875rem; color: var(--text-soft);
}
.kbhinweis a { color: var(--wahl); font-weight: 700; white-space: nowrap; text-decoration: underline; text-underline-offset: 3px; }

/* "Bedarf heute" - die eine Ampel der Tagesseite. Achtzehn Stunden passen am
   390-px-Telefon in eine Reihe (je ~17 px), deshalb Flex statt Tabelle. */
.bedarfheute {
  margin: .25rem 0 1rem; padding: .75rem .9rem;
  border: 1px solid var(--border); border-radius: var(--radius-sm); background: var(--surface);
}
.bhkopf { display: flex; justify-content: space-between; align-items: baseline; gap: .6rem; margin-bottom: .45rem; }
.bhkopf h2 { margin: 0; font-size: .75rem; font-weight: 700; letter-spacing: .06em; text-transform: uppercase; color: var(--text-soft); }
.bhkopf a { font-size: .75rem; color: var(--text-soft); }
.bhreihe { display: flex; gap: 2px; }
.bhreihe + .bhreihe { margin-top: 2px; }
.bhreihe .bhh { flex: 1 1 0; min-width: 0; text-align: center; font-size: .625rem; color: var(--muted); font-variant-numeric: tabular-nums; }
.bhreihe .bhz {
  flex: 1 1 0; min-width: 0; text-align: center; border-radius: 4px; padding: .25rem 0;
  font-weight: 700; font-size: .75rem; font-variant-numeric: tabular-nums;
}
.bhreihe .bhz.stz-leer { background: var(--fill); color: var(--muted); }
.bhreihe .bhz.stz-ohne-bedarf { background: var(--fill); color: var(--text-soft); }
.bhfehlt { margin: .5rem 0 0; font-size: .875rem; font-weight: 600; color: var(--crit); }
.bhpasst { margin: .5rem 0 0; font-size: .875rem; font-weight: 600; color: var(--ok); }
.bhleg { margin: .3rem 0 0; font-size: .75rem; color: var(--text-soft); }
.twumfeld { color: var(--muted); }
/* Der Tageskopf der Planung wiederholt die Wippe (Tag, Datum, Zahl) - seit dem
   15.10.2026 bleibt von ihm nur das Event des Abends sichtbar. */
.tageskarte .dayhead .name, .tageskarte .dayhead .date, .tageskarte .dayhead .weekendtag,
.tageskarte .dayhead .daycount { display: none; }
.tageskarte .dayhead:not(:has(.dayevent)) { display: none; }

/* Woche: je Tag "1 fehlt" / "passt" unter dem Datum, oben "N fehlen ab heute"
   - dieselbe Zahl wie im Tag (15.10.2026). */
.wtfehlt { display: inline-block; margin-top: .3rem; padding: .08rem .45rem; border-radius: var(--radius-pille);
  font-size: .75rem; font-weight: 700; text-transform: none; letter-spacing: 0; }
.wtfehlt.fehlt { background: var(--crit-soft); color: var(--crit); }
.wtfehlt.passt { background: var(--ok-soft); color: var(--ok); }
.wkfehlt.wkab { margin-left: .4rem; }
.woche-fehlt { margin-top: 1rem; }

/* Ufehlt: "Wo noch Leute fehlen" auf der Uebersicht, je Tag eine Zeile. */
.ufehlt { list-style: none; margin: 0; padding: 0; }
.ufehlt li + li { border-top: 1px solid var(--hair); }
.ufehlt a { display: flex; flex-wrap: wrap; gap: .2rem .8rem; align-items: baseline; padding: .55rem 0; color: inherit; text-decoration: none; }
.ufehlt .uftag { font-weight: 600; min-width: 7.5rem; }
.ufehlt .ufzahl { font-weight: 700; color: var(--crit); }
.ufehlt .uffenster { color: var(--text-soft); font-size: .875rem; }

/* Bedarf eintragen: je Tag "offen ab / bis / Leute" und optional eine
   Spitze (15.10.2026). Am Telefon zwei Zeilen je Tag statt acht Spalten. */
.bdschnell { display: grid; gap: .5rem; margin: .4rem 0 .9rem; }
/* Zeitfelder 6,6 rem: darin muss "23:00" plus Uhrsymbol stehen - mit 5,4 rem
   schnitt der Browser die Uhrzeit ab (am Bild gesehen). */
.bdtag { display: grid; grid-template-columns: 6.6rem 6.6rem 6.6rem 5.4rem 3.6rem 6.6rem 6.6rem 5.4rem; gap: .4rem; align-items: center; justify-content: start; }
.bdtag input { width: 100%; min-width: 0; }
.bdkl { font-size: .75rem; color: var(--muted); text-transform: uppercase; letter-spacing: .05em; }
.bdtag.bdkopf { margin-bottom: -.2rem; }
.bdschritte { display: flex; flex-wrap: wrap; gap: .2rem 1.2rem; margin: .2rem 0 .7rem; font-size: .875rem; color: var(--text-soft); }
.bdschritte b { color: var(--text); }
/* Am Rechner zwischen 1000 und 1199 px: Seitenleiste plus die acht Spalten
   (803 px) liefen 52 px seitlich aus (gemessen 15.10.2026). Dort dieselben
   zwei Zeilen je Tag wie am Telefon; ab 1200 px die volle Zeile. */
@media (min-width: 1000px) and (max-width: 1199px) {
  .bdtag { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) 5.4rem; }
  .bdtag > .bdname { grid-column: 1 / -1; margin-top: .3rem; }
  .bdtag > .bdspitze { grid-column: 1 / -1; }
  .bdtag.bdkopf { display: none; }
}
@media (max-width: 640px) {
  .bdtag { grid-template-columns: 1fr 1fr 5.4rem; }
  .bdtag > .bdname { grid-column: 1 / -1; margin-top: .3rem; }
  .bdtag > .bdspitze { grid-column: 1 / -1; }
  .bdtag.bdkopf { display: none; }
}

/* Der Platz dafuer - und zwar NUR unter .mit-zeiten. Die Backend-Uebersicht
   (.mit-diagramm) setzt dieselben zwei Eigenschaften auf denselben Selektor
   fuer ihr Diagramm, und die Medienabfrage fuer schmale Schirme ein drittes
   Mal. Zwei Klassen im Selektor gewinnen gegen beide, unabhaengig von der
   Reihenfolge im Stylesheet - nachgeprueft bei 375 px, nicht gehofft. */
.plankalender.mit-zeiten .plankalender-grid td > a,
.plankalender.mit-zeiten .plankalender-grid td > span {
  /* Groesser seit dem 13.09.2026 (Mathieu: "fuer die Monatsansicht haben wir
     jetzt mehr platz, vielleicht kann man die etwas groesser und schicker
     machen"). Der Platz war gemessen da: die Monatsseite endete bei 769 px
     in einem 812-px-Bild, unten blieben 101 px ungenutzt.
     2,55 -> 3,6 rem sind 43 -> 61 px Kachelhoehe. Die Tagesnummer wird damit
     lesbar, und die eigene Anfangszeit passt als Pille darunter, statt als
     9-px-Zeile am Rand zu kleben. */
  min-height: 3.6rem; padding-bottom: 1.25rem; font-size: 1rem;
}
/* Die KW-Spalte ist eine Sache der PLANUNG. Im Team-Kalender kostet sie in
   jeder Zeile Breite fuer eine Zahl, nach der dort niemand sucht - ein Tipp
   auf den Tag fuehrt ohnehin in die richtige Woche. */
/* Ohne Kacheln (falls die kleinen Zahlen einmal fehlen) bleibt die Spalte
   versteckt statt zu verschwinden - dort ist das Markup unveraendert. */
.plankalender.mit-zeiten .plankalender-grid .kw { display: none; }
/* In der angebotenen Woche liegt die Zelle auf der Signalfarbe - dort
   dreht der Kreis um, genau wie .dwa am heutigen Tag im Streifen. */
.plankalender-grid tr.aktiv td:not(.kw) .kaldienst {
  background: var(--kal-signal); color: var(--kal-papier);
}

/* Was die Farben im Kalender bedeuten. Drei kurze Paare, mittig - ohne sie
   muss man Gold und Rot raten, und Raten ist bei "hier fehlt jemand" teuer. */
.kallegende {
  display: flex; gap: .75rem; flex-wrap: wrap; justify-content: center;
  margin: .75rem 0 0; font-family: var(--f-text); font-size: .75rem;
  font-weight: 600; color: var(--kal-lesbar);
}
.kallegende span { display: inline-flex; align-items: center; gap: .25rem; }
.kallegende i { width: 11px; height: 11px; border-radius: var(--radius-pille); flex: none; }

/* --- Der Monat als KACHELN (Mathieu, 13.09.2026, nach drei Entwuerfen:
   "bau A mit der Wochensumme aus B") ---------------------------------------
   Statt eines Rasters aus Haarlinien bekommt jeder Tag eine eigene
   abgerundete Flaeche. Der Grund ist nicht Geschmack, sondern Lesbarkeit:
   eine Kachel hat einen Rand, an dem der Blick haengenbleibt - eine
   Gitterzelle teilt ihre Linien mit vier Nachbarn.
   Nur im Team-Bereich. Das Backend behaelt das Raster: dort liegt ein
   Diagramm in der Kachel, und zwei Bauformen fuer dieselbe Tabelle waeren
   eine zu viel. */
.plankalender.kacheln { padding-left: .5rem; padding-right: .5rem; }
.plankalender.kacheln .plankalender-grid {
  border-collapse: separate; border-spacing: 3px; border: 0;
  /* Die Randabstaende der Tabelle traegt jetzt der Abstand zwischen den
     Kacheln - ein Rahmen darum waere der zweite. */
  margin: 0 -3px;
}
.plankalender.kacheln .plankalender-grid td,
.plankalender.kacheln .plankalender-grid th { border: 0; }
.plankalender.kacheln .plankalender-grid td > a,
.plankalender.kacheln .plankalender-grid td > span {
  flex-direction: column; align-items: center; justify-content: flex-start; gap: .125rem;
  border-radius: var(--radius-sm); background: var(--kal-tile);
  /* Die .mit-zeiten-Regel reserviert unten 1,3 rem fuer die absolut
     gesetzte Uhrzeit. In der Kachel fließt sie mit, also muss der Platz
     weg - sonst wird die Kachel hoeher als ihre Nachbarn und schiebt sich
     ueber die Summenzeile. */
  min-height: 3.5rem; padding: .25rem .125rem .25rem;
  font-family: var(--f-text); font-weight: 700; font-size: 1rem;
}
.plankalender.kacheln .plankalender-grid td.ausserhalb > a,
.plankalender.kacheln .plankalender-grid td.ausserhalb > span { background: transparent; }
/* Heute ist die ganze Kachel, nicht ein Kreis darin: der Kreis war die
   Loesung fuer eine Zelle ohne eigene Flaeche. */
.plankalender.kacheln .plankalender-grid td.heute > a,
.plankalender.kacheln .plankalender-grid td.heute > span { background: var(--kal-marine); }
.plankalender.kacheln .plankalender-grid td.heute .kalzahl { color: var(--kal-papier); }
.plankalender.kacheln .plankalender-grid td.heute .kalzahl::before { display: none; }
/* Auf der heutigen Kachel bleibt die Pille hell: Gruen auf Marine waeren
   zwei dunkle Toene uebereinander (1,2:1 - nachgerechnet). Dass es der
   eigene Tag ist, sagt dort die gefuellte Kachel. */
.plankalender.kacheln .plankalender-grid td.heute .kalzeit {
  background: var(--kal-papier); color: var(--kal-marine);
}
/* In der Kachel fliessen Zeit und Zahl untereinander - absolut gesetzt
   brauchten sie reservierten Platz, und genau daran klebten sie vorher am
   unteren Rand. */
.plankalender.kacheln .kalzeit,
.plankalender.kacheln .kalluecke { position: static; margin: 0; }
.plankalender.kacheln .kalzeit { bottom: auto; }
/* Die laufende Woche traegt keinen Toenungsbalken mehr: er war die Klammer
   um sieben Gitterzellen, und zwischen Kacheln klammert er nichts. Die Woche
   steht jetzt durch die Summe unter ihr. */
.plankalender.kacheln .plankalender-grid tr.aktiv td:not(.kw) > a,
.plankalender.kacheln .plankalender-grid tr.aktiv td:not(.kw) > span {
  background: var(--kal-tile); box-shadow: none; border-radius: var(--radius-sm);
}
.plankalender.kacheln .plankalender-grid tr.aktiv td { border: 0; }
.plankalender.kacheln .plankalender-grid tr.aktiv td.heute > a,
.plankalender.kacheln .plankalender-grid tr.aktiv td.heute > span { background: var(--kal-marine); }
.plankalender.kacheln .plankalender-grid tr.aktiv td.ausserhalb > a,
.plankalender.kacheln .plankalender-grid tr.aktiv td.ausserhalb > span { background: transparent; }
/* Welche Woche gerade in der Tagesansicht offen ist: eine feine Kontur um
   ihre Kacheln. Das Band davor konnte das nicht mehr - es faerbte die
   Zwischenraeume, die es zwischen Kacheln nicht mehr gibt. */
.plankalender.kacheln .plankalender-grid tr.aktiv td:not(.heute) > a,
.plankalender.kacheln .plankalender-grid tr.aktiv td:not(.heute) > span {
  box-shadow: inset 0 0 0 1.5px var(--kal-blass);
}

/* Der Kopf im Kachel-Kalender: der ganze Monatsname in der Hausschrift,
   einzeilig mit Jahr und Pfeilen. Das grosse "SEP" in Archivo Black war ein
   Plakat - es kostete 100 px, die jetzt die Kacheln haben. */
.plankalender.kacheln .kalmonat {
  font-family: var(--f-text); font-size: 1.3125rem; font-weight: 800;
  letter-spacing: -.01em; line-height: 1.1;
}
.plankalender.kacheln .kaljahr { font-size: .75rem; }

/* Vergangene Tage sind blass (Mathieu, 16.09.2026, nach dem Bildvergleich).
   Am 16. September trugen fuenfzehn von dreissig Kacheln volle Tinte fuer
   Tage, an denen sich niemand mehr eintragen kann - die halbe Kachelwand
   rief genauso laut wie die Haelfte, um die es geht. Blass heisst lesbar:
   nachsehen will man manchmal doch, wie im Wochenstreifen. */
/* Seit dem 15.10.2026 (Mathieu: "1 ja") nicht mehr per Deckkraft .38 -
   damit lagen sie bei 1,93:1 und waren leiser als die Nachbarmonatstage.
   Jetzt wie die Nachbartage: ohne Kachel, im leisen, aber lesbaren Ton. */
.plankalender.kacheln .plankalender-grid td.vorbei > a,
.plankalender.kacheln .plankalender-grid td.vorbei > span {
  opacity: 1; background: transparent !important; box-shadow: none !important; color: var(--kal-leise);
}
.plankalender.kacheln .plankalender-grid td.vorbei .kalzeit { opacity: .7; }
/* Freitag, Samstag, Sonntag: eine Spur mehr Tinte in der Kachel (Mathieu,
   16.09.2026: "den Freitag nimm dazu"). Kein eigener Farbton - der
   Farbkreis dieser App ist voll, und ein Wochentag ist keine Aussage,
   sondern ein Gewicht. Im Raster sahen die drei langen Naechte aus wie ein
   Dienstag.
   Seit dem 18.09.2026 zusaetzlich ein duenner Rahmen (Mathieu: "bissen
   dunkler", nachdem ihm die Flaeche allein zu schwach war) - dieselbe
   Kontur, die schon die aktive Woche traegt (--kal-blass), nicht noch eine
   neue Linienfarbe. Die Kachel wirkt dadurch "umrandet", nicht nur
   "getoent". */
.plankalender.kacheln .plankalender-grid td.we:not(.heute) > a,
.plankalender.kacheln .plankalender-grid td.we:not(.heute) > span {
  background: var(--kal-we); box-shadow: inset 0 0 0 1.5px var(--kal-blass);
}
.plankalender.kacheln .plankalender-grid tr.aktiv td.we:not(.heute) > a,
.plankalender.kacheln .plankalender-grid tr.aktiv td.we:not(.heute) > span {
  background: var(--kal-we); box-shadow: inset 0 0 0 1.5px var(--kal-blass);
}
/* Auch die Ueberschrift: sonst ist die Spalte betont und ihr Kopf nicht. */
.plankalender.kacheln .plankalender-grid th:nth-child(n+5) { color: var(--kal-marine); }

/* Der Kopf einzeilig: Monat, Jahr und die Pfeile in EINER Reihe. Das Jahr
   hatte eine Zeile fuer sich, die Pfeile eine dritte - gemessen 69 px fuer
   drei Angaben, von denen zwei aus vier Zeichen bestehen. Die Events
   behalten ihre Spalte rechts, sie sind der Grund fuer das Raster. */
.plankalender.kacheln .kalmonatblock {
  flex-direction: row; flex-wrap: wrap; align-items: baseline; gap: .125rem .5rem;
}
.plankalender.kacheln .kalnav { margin-top: 0; gap: .5rem; align-items: baseline; }
.plankalender.kacheln .kalnav a { width: 2.3rem; }

/* Eine Zeile statt dreier Punkte, linksbuendig wie alles andere auf der
   Seite - zentriert stand sie als einziges Element quer zum Rest. */
.plankalender.kacheln .kallegende { justify-content: flex-start; gap: .25rem .75rem; margin-top: .5rem; }

/* Nur fuer Screenreader: der volle Monatsname. Sichtbar steht oben "SEP",
   und "SEP" allein vorgelesen ist kein Monat. */
.nurvorlesen {
  position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip-path: inset(50%); white-space: nowrap; border: 0;
}

@media (max-width: 480px) {
  .plankalender { padding: 1rem .75rem .75rem; }
  .plankalender-grid th { font-size: .625rem; padding: .25rem .125rem; }
  .plankalender-grid td > a, .plankalender-grid td > span {
    min-height: 2.5rem; padding: .25rem .25rem; font-size: .875rem;
  }
  .plankalender-grid td.kw { width: 1.6rem; }
  .plankalender-grid td.heute .kalzahl::before { width: 1.6rem; height: 1.6rem; }
  .kaldienst { width: .82rem; height: .82rem; right: .15rem; bottom: .15rem; }
}
@media (max-width: 480px) {
  .plankalender-grid th, .plankalender-grid td { font-size: .75rem; }
  .plankalender-grid td > a, .plankalender-grid td > span { min-height: 2rem; padding: .125rem 0; }
  /* ... aber nicht im Team-Kalender: dort ist die groessere Kachel der ganze
     Punkt. Zwei Klassen im Selektor gewinnen gegen diese Regel hier,
     unabhaengig von der Reihenfolge im Stylesheet. */
  .plankalender.mit-zeiten .plankalender-grid td > a,
  .plankalender.mit-zeiten .plankalender-grid td > span {
    min-height: 3.6rem; padding: .25rem .25rem 1.25rem; font-size: 1rem;
  }
  /* Im Kachel-Kalender fliesst die Uhrzeit mit, statt am unteren Rand zu
     kleben - der reservierte Platz darunter muss also auch hier weg. */
  .plankalender.kacheln .plankalender-grid td > a,
  .plankalender.kacheln .plankalender-grid td > span {
    min-height: 3.5rem; padding: .25rem .125rem .25rem; font-size: 1rem;
  }
}
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .segitem.is-on { box-shadow: var(--schatten-1); }
}
:root[data-theme="dark"] .segitem.is-on { box-shadow: var(--schatten-1); }

tr.rowempty td { background: var(--fill); }
tr.rowempty td.name { color: var(--muted); font-weight: 600; }

.addown { display: flex; flex-wrap: wrap; gap: .5rem; margin-top: .75rem; }
.addown input { flex: 1 1 220px; max-width: 340px; }

.searchbar { margin: 1rem 0 .25rem; }
.searchbar input { max-width: 380px; }
.searchcount { color: var(--muted); font-size: .875rem; margin: .5rem 0 1rem; }

.daycard {
  border: 1px solid var(--hair);
  border-radius: var(--radius-sm);
  padding: 1rem 1rem 1rem;
  margin-bottom: .75rem;
  background: var(--surface);
}
/* Ein gesetzter Tag wird nicht umrandet, sondern bekommt eine Kante links -
   das liest sich als Markierung, nicht als Kasten. */
.daycard.is-off { background: var(--crit-soft); border-color: transparent; box-shadow: inset 3px 0 0 var(--crit); }
.daycard.is-set { border-color: var(--hair); box-shadow: inset 3px 0 0 var(--accent); }
/* Bar/Kueche als zwei Bereiche statt einer langen Liste (Mathieu,
   06.09.2026: "mach beim Dienstplan zwei Bereiche einmal Bar & einmal
   Kueche"). Nur eine kleine Kapitelueberschrift, keine eigene Karte -
   die Schichten darunter bleiben genau die bekannten .slot-Zeilen. */
/* --- Die Woche auf einen Blick (Backend) --------------------------------
   Mathieu, 12.09.2026: "bei der Wochenansicht dann auch deisgn anpassen und
   uebersichtlicher machen und ich wuerde im backend bei der wochenansicht
   sagen alle die eine schicht eingetragen haben rutschen nach oben."
   Vorher: 26 Zeilen, in den meisten sieben Gedankenstriche, die Schichtnamen
   als blosser Text. Jetzt Plaettchen in der Bereichsfarbe, die Eingeteilten
   oben, und je Person steht rechts nichts mehr - die Summe steht unter dem
   Namen, wo sie beim Lesen der Zeile schon beantwortet ist. */
.wochentabelle { width: 100%; border-collapse: collapse; }
.wochentabelle th, .wochentabelle td { vertical-align: top; text-align: left; }
.wochentabelle thead th {
  padding: .5rem .5rem; border-bottom: 1px solid var(--hair); white-space: nowrap;
}
.wtday { display: block; font-size: .75rem; font-weight: 800; letter-spacing: .06em; text-transform: uppercase; }
.wtdate { display: block; font-size: .75rem; font-weight: 500; color: var(--muted); }
.wtcount {
  display: inline-block; margin-top: .25rem; min-width: 20px; padding: .125rem .25rem;
  border-radius: var(--radius-pille); background: var(--fill); color: var(--text-soft);
  font-size: .75rem; font-weight: 700; text-align: center;
}
.wochentabelle thead th.heute .wtday { color: var(--accent); }
.wochentabelle thead th.heute .wtcount { background: var(--accent); color: var(--accent-ink); }
.wochentabelle tbody tr { border-bottom: 1px solid var(--hair); }
.wtperson { padding: .5rem .5rem .5rem 0; min-width: 9rem; }
.wtpname { display: block; font-size: .875rem; font-weight: 650; }
.wtpsumme { display: block; font-size: .75rem; color: var(--muted); font-weight: 500; }
/* 25.10.2026: mit .7 Deckkraft 3,3:1 - die leise Tinte haelt 4,5:1. */
.wtpsumme.frei { color: var(--muted); }
.wtzelle { padding: .5rem .25rem; }
.wtzelle.leer { color: var(--text-aus, var(--muted)); opacity: .45; }
/* 25.10.2026: am Finger steht das "+" einer leeren Zelle immer da (hover: none) - mit .45 Deckkraft kam es auf 1,7:1 (hell) bzw. 2,2:1
   (dunkel); ein Bedienelement braucht 3:1. Am Finger darum ohne Deckkraft, das "+" traegt --plus (4,6:1). */
@media (hover: none) { .wtzelle.leer { opacity: 1; } }
/* Der heutige Tag bekommt eine Spur Grund - dieselbe Markierung wie im
   Kopf, damit die Spalte durchgehend erkennbar bleibt. */
.wtzelle.heute { background: var(--fill); }
/* Ein Plaettchen je Schicht, gefaerbt nach Bereich - dieselben drei Farben
   wie die Bloecke in der Tagesansicht. */
.wtchip {
  display: block; border-radius: var(--radius-xs); padding: .25rem .5rem; margin-bottom: .25rem;
  border-left: 3px solid var(--bar); background: var(--fill);
  font-size: .75rem; line-height: 1.25;
}
.wtchip:last-child { margin-bottom: 0; }
.wtchip.b-bar { border-left-color: var(--bar); background: var(--bar-soft); }
.wtchip.b-kueche { border-left-color: var(--kueche); background: var(--kueche-soft); }
.wtchip.b-office { border-left-color: var(--office); background: var(--office-soft); }
/* Gestrichelt heisst "wartet auf Bestaetigung" - dieselbe Aussage wie das
   gold umrandete Plaettchen im Team-Bereich, nur ohne zweite Farbe in einer
   ohnehin dreifarbigen Tabelle. */
.wtchip.wartet { border-left-style: dashed; }
/* Krank (ersetzt), 04.10.2026: Nachweis-Chip - Fehler-Familie (nicht --news),
   immer mit dem Wort "krank", Name durchgestrichen, gestrichelte Kante. Die
   Flaeche ist nur rot, solange Ersatz fehlt; ersetzt liegt sie leise da. */
.wtchip.krank {
  background: var(--crit-soft); border-left: 3px dashed var(--crit);
}
.wtchip.krank.ersetzt { background: var(--surface-2); }
.wtchip.krank .wtname { text-decoration: line-through; text-decoration-thickness: 1px; color: var(--text-soft); }
.wtkrankwort { display: block; font-size: .75rem; font-weight: 800; color: var(--crit); letter-spacing: .01em; }
.wtchip.krank.ersetzt .wtkrankwort { color: var(--text-soft); }
.wtpkrank { color: var(--crit); }
.wtplus.ersatz {
  width: auto; padding: 0 .5rem; min-height: 44px; font-size: .75rem; font-weight: 700;
  opacity: 1; color: var(--text); border: 1px solid var(--hair); background: var(--surface);
}
/* 25.10.2026: "Ersatz einteilen" ist ein Knopf mit Schrift - die Regel ".nach-schichten .wtplus" (leises Plus) gewann gegen ihn (3,8:1 auf
   der Heute-Spalte). Und --card gab es nie: der Knopf hatte keine Flaeche (halb verdrahtet). */
.nach-schichten .wtplus.ersatz { color: var(--text); }
.wtname { display: block; font-weight: 650; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.wtzeit { display: block; font-size: .75rem; color: var(--muted); font-variant-numeric: tabular-nums; }
.wtweg {
  display: inline-block; font-size: .75rem; font-weight: 700; padding: .125rem .5rem;
  border-radius: var(--radius-pille); background: var(--warn-soft); color: var(--warn);
}

/* --- Nach Schichten (Standard seit 12.09.2026) ---------------------------
   "Bau A als Standard mit Umschalter zu B." Die Zeilen sind die Schichten,
   nicht die Leute: sieben Zeilen statt sechsundzwanzig, und die Ansicht
   waechst nicht mit dem Team. */
.moduswahl { display: flex; gap: .25rem; background: var(--fill); border-radius: var(--radius-pille); padding: .125rem; margin-left: auto; }
.mw {
  padding: .25rem .75rem; border-radius: var(--radius-pille); font-size: .75rem; font-weight: 650;
  color: var(--text-soft); text-decoration: none; white-space: nowrap;
}
.mw:hover { text-decoration: none; }
.mw.ist-an { background: var(--surface); color: var(--text); box-shadow: var(--schatten-1); }
.mw:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }

/* Die Bereichszeile ist eine echte Kante, kein Wort: getoenter Grund ueber
   die ganze Breite, links eine 4-px-Kante in der Bereichsfarbe und der Name
   als umrandetes Register - dieselbe Sprache wie die Bloecke in der
   Tagesansicht (Mathieu, 12.09.2026: "office & Kueche muessen farblich
   klarer abgerenzt sein von Bar"). */
.wtgruppe th {
  padding: 0; text-align: left; border-top: 1px solid var(--hair);
}
.wtbereich > tr:first-child th { border-top: 0; }
.wtgname {
  display: flex; align-items: center; gap: .5rem; padding: .5rem .5rem;
  color: var(--text-soft); text-decoration: none;
  border-left: 4px solid var(--border); background: var(--fill);
}
.wtgname:hover { text-decoration: none; filter: brightness(.98); }
.wtgname:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
.wtgpille {
  font-size: .75rem; font-weight: 800; letter-spacing: .08em; text-transform: uppercase;
  border: 1.5px solid currentColor; border-radius: var(--radius-pille); padding: .125rem .5rem; line-height: 1.3;
}
.wtgzahl { font-size: .75rem; color: var(--muted); }
.wtgpfeil { margin-left: auto; font-size: 1rem; line-height: 1; color: var(--muted); }
.wtgruppe.b-bar .wtgname { border-left-color: var(--bar); background: var(--bar-soft); color: var(--bar); }
.wtgruppe.b-kueche .wtgname { border-left-color: var(--kueche); background: var(--kueche-soft); color: var(--kueche); }
.wtgruppe.b-office .wtgname { border-left-color: var(--office); background: var(--office-soft); color: var(--office); }
/* Die Zeilen eines Bereichs tragen die Kante weiter, damit der Block auch
   beim Scrollen zusammenhaengt. */
.wtbereich > tr > .wthuelle { border-left-width: 4px; }
.wtbereich.zu > tr:not(.wtgruppe) { display: none; }
.wthuelle {
  text-align: left; padding: .5rem .5rem .5rem .5rem; min-width: 10rem;
  border-left: 3px solid transparent;
}
.wthuelle.b-bar { border-left-color: var(--bar); }
.wthuelle.b-kueche { border-left-color: var(--kueche); }
.wthuelle.b-office { border-left-color: var(--office); }
.wthname { display: block; font-size: .875rem; font-weight: 650; }
.wthuelle .wtzeit { display: block; }
/* Schraffiert heisst: diese Schicht gibt es an dem Tag gar nicht. Ein leeres
   Feld waere hier eine Luecke, die keine ist. */
.wtzelle.aus {
  background: repeating-linear-gradient(135deg, transparent 0 5px, var(--hair) 5px 6px);
}
.wtav {
  display: inline-flex; align-items: center; justify-content: center;
  width: 18px; height: 18px; border-radius: var(--radius-pille); flex: none;
  background: var(--surface); color: var(--text-soft);
  font-size: .625rem; font-weight: 800;
}
/* In dieser Ansicht steht in der Zelle ein NAME, kein Schichtname - er darf
   nicht auf null schrumpfen. Die Spalten bekommen dafuer eine Mindestbreite;
   die Tabelle scrollt notfalls waagerecht, das tut sie ohnehin. */
.nach-schichten .wtchip { display: flex; align-items: center; gap: .25rem; }
.nach-schichten .wtzelle { min-width: 7.4rem; }
/* Hier IST das Plus die Arbeit - in dieser Ansicht plant man. Es steht
   deshalb immer da, nur leise; in der Leute-Ansicht bleibt es beim
   Erscheinen auf Zuruf, sonst haette die Tabelle 182 gleich laute Knoepfe. */
.nach-schichten .wtplus { opacity: 1; color: var(--plus); }
.nach-schichten .wtzelle:hover .wtplus { opacity: 1; }
.nach-schichten .wtchip .wtname { overflow: visible; }
.wtplanselect { width: 100%; font-size: .75rem; }
.wtplanwahl.vorschlag { border-left-color: var(--ok); }
.wtwarn { display: block; font-size: .625rem; color: var(--warn); }
.wtleerhint { font-size: .75rem; color: var(--muted); }
/* Die Zeit hinter dem Namen, und ein Klick auf den Namen aendert sie
   (Mathieu, 15.10.2026). Neben den Namen passt sie in einer 124-px-Spalte
   nicht - sie steht deshalb UNTER dem Namen, das Kuerzel links ueber beide
   Zeilen. Die Schichtzeit leise; eine eigene Zeit kursiv, dunkel und mit
   Punkt - drei Merkmale der Form, keines nur Farbe (Eine Tinte). */
.wtchip.wtmitzeit {
  display: grid; grid-template-columns: auto 1fr; column-gap: .25rem; align-items: center; padding-inline: .375rem;
}
.wtchip.wtmitzeit .wtav { grid-row: span 2; }
.wtchip.wtmitzeit .wtname, .wtchip.wtmitzeit .wtzeit { grid-column: 2; }
.wtchip.wtmitzeit .wtzeit { line-height: 1.2; white-space: nowrap; }
.wtzeit.eigen { font-style: italic; font-weight: 650; color: var(--text); }
.wtzeit.eigen::before {
  content: ''; display: inline-block; width: 5px; height: 5px; margin: 0 .25rem .1em 0;
  border-radius: 50%; background: currentColor; vertical-align: middle;
}
/* Der Name ist ein Link: unterstrichen beim Ueberfahren, ein Rahmen beim
   Ansteuern mit der Tastatur. */
a.wtwer { color: var(--text); text-decoration: none; cursor: pointer; }
a.wtwer:hover { box-shadow: inset 0 0 0 1px var(--border); }
a.wtwer:hover .wtname { text-decoration: underline; text-underline-offset: 2px; }
a.wtwer:focus-visible, a.wtzeitlink:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
/* Nach Leuten: die Uhrzeit ist der Link (die Person steht vorn in der Zeile). */
a.wtzeitlink { text-decoration: underline; text-decoration-thickness: 1px; text-underline-offset: 2px; white-space: nowrap; }
a.wtzeitlink:not(.eigen) { color: var(--text-soft); }
/* Das Feld: zu, bis der Name angeklickt ist (:target) - ohne Skript. Hoechstens
   11rem breit: sonst nimmt sich die Tabelle fuer die offene Spalte den Platz
   der anderen, und deren Uhrzeiten brechen um. */
.wtzeitfeld { display: none; }
/* Ohne Skript scrollt ein Sprungziel an den oberen Rand - mit etwas Luft
   bleibt das Plaettchen ueber dem Feld im Bild. */
.wtzeitfeld, a.wtwer, a.wtzeitlink { scroll-margin-top: 6rem; }
.wtzeitfeld:target {
  max-width: 11rem;
  display: flex; flex-direction: column; gap: .375rem;
  margin: .25rem 0 .5rem; padding: .5rem;
  border: 1px solid var(--border); border-radius: var(--radius-xs);
  background: var(--surface); box-shadow: var(--schatten-1);
}
/* Die offene Spalte wird nur so breit wie ein Uhrzeitfeld - breiter, und die
   Woche passt bei 1440 px nicht mehr ohne waagerechtes Scrollen. */
.wtzelle:has(.wtzeitfeld:target) { min-width: 8rem; background: var(--surface-2); }
.wtzeitform { display: flex; flex-direction: column; gap: .375rem; margin: 0; }
.wtzf {
  display: flex; flex-direction: column; gap: .125rem;
  font-size: .75rem; font-weight: 650; color: var(--text-soft);
}
.wtzf input { width: 100%; min-width: 0; min-height: 36px; font-size: .875rem; font-variant-numeric: tabular-nums; }
.wtzhint { font-size: .75rem; line-height: 1.3; color: var(--muted); }
.wtzhint > span { display: block; }
.wtzschicht { white-space: nowrap; }
.wtzeitfeld .btn { width: 100%; }
.wtzeitfeld .wtabbruch { align-self: center; }
/* Die stille Zeile am Ende einer Bereichsgruppe: was zugeklappt liegt, und
   warum. Sie ist ein Angebot, kein Hinweis - deshalb ein Link und kein Satz
   (Mathieu, 12.09.2026: "oder zum ausklappen"). */
.wtstill th { padding: .5rem .25rem .25rem; text-align: left; font-weight: 500; }
.wtstill a { font-size: .75rem; font-weight: 650; }
.wtstillhint { margin-left: .5rem; font-size: .75rem; color: var(--muted); }
/* Die Vorschau vor dem Uebernehmen: erst sehen, was kaeme, dann der Knopf. */
.card.uebernahme { border-color: var(--accent); }
.uebliste { list-style: none; padding: 0; margin: .5rem 0 .25rem; display: grid; grid-template-columns: repeat(auto-fill, minmax(15rem, 1fr)); gap: .25rem 1rem; }
.uebliste li { font-size: .875rem; }
.ubtag { display: inline-block; min-width: 2rem; font-weight: 800; font-size: .75rem; letter-spacing: .04em; text-transform: uppercase; color: var(--muted); }
.ubmehr { color: var(--muted); }
.ubweg { color: var(--muted); margin-top: .5rem; }
/* Halb geplante Woche (16.10.2026): was schon steht, und der andere Weg als
   Link - unterstrichen, die leiseste Handlung. */
.ubschon { margin: 0 0 .6rem; font-size: .875rem; }
.ubschon a { color: var(--accent); text-decoration: underline; text-underline-offset: .2em; white-space: nowrap; }
.card.ubzurueck { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: .5rem 1rem; }

/* Einteilen direkt aus der Woche (Mathieu, 12.09.2026: "durch nen leeren
   button wo ich drauklicken kann und sagen kann hier einteilen und dann kommt
   ne auswahl mit den schichten"). Das Plus ist leise, bis man die Zeile
   ansteuert - sonst hat die Tabelle 182 Knoepfe, die alle gleich laut rufen. */
.wtplus {
  display: inline-flex; align-items: center; justify-content: center;
  width: 26px; height: 26px; border-radius: var(--radius-xs);
  color: var(--muted); text-decoration: none; font-size: 1rem; font-weight: 700;
  opacity: 0; transition: opacity .1s ease;
}
.wtplus.leise { margin-left: .25rem; }
.wtzelle:hover .wtplus, .wtplus:focus-visible { opacity: 1; background: var(--fill); color: var(--accent); }
.wtplus:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
/* Am Touchgeraet gibt es kein Ueberfahren - dort steht das Plus immer da. */
@media (hover: none) {
  .wtplus { opacity: 1; color: var(--plus); }
}
@media (prefers-reduced-motion: reduce) {
  .wtplus { transition: none; }
}
.wtzelle.offen { background: var(--surface-2); min-width: 11rem; }
.wtplanform { display: flex; flex-direction: column; gap: .25rem; }
.wtplantitel { font-size: .75rem; font-weight: 800; letter-spacing: .05em; text-transform: uppercase; color: var(--muted); }
.wtplanwahl {
  display: block; width: 100%; text-align: left; cursor: pointer;
  border: 1px solid var(--hair); border-left: 3px solid var(--bar);
  border-radius: var(--radius-xs); padding: .25rem .5rem; background: var(--surface);
  font: inherit; font-size: .75rem; line-height: 1.25;
}
.wtplanwahl.b-bar { border-left-color: var(--bar); }
.wtplanwahl.b-kueche { border-left-color: var(--kueche); }
.wtplanwahl.b-office { border-left-color: var(--office); }
.wtplanwahl:hover { background: var(--fill); }
.wtplanwahl:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
.wtabbruch { font-size: .75rem; color: var(--muted); }
.wtweg.beantragt { background: transparent; border: 1px dashed var(--warn); font-weight: 600; }
/* Die Trennzeile sagt, warum der Rest anders ist - ohne sie sieht es aus wie
   eine Liste, die einfach aufhoert. */
.wttrenner th {
  padding: .75rem .25rem .25rem; font-size: .75rem; font-weight: 800;
  letter-spacing: .06em; text-transform: uppercase; color: var(--muted);
}
.wochentabelle tbody tr.wttrenner { border-bottom: none; }
@media (max-width: 860px) {
  .wtperson { min-width: 7.5rem; }
  .wtname { max-width: 7rem; }
}

/* Seit dem 12.09.2026 ist ein Bereich ein eigener Block mit Kante, Kopf und
   Tonung (Mathieu: "die unterschiedlichen schichten muessen sich mehr
   voneinader abheben z.b Kueche, Bar & office"). Vorher war es eine
   0,72-rem-Ueberschrift ueber einer Liste - auf 1.085 px Breite lief alles
   zu einer einzigen langen Spalte zusammen. Die Kante links traegt die
   Bereichsfarbe durch alle Schichten hindurch, damit man beim Scrollen
   jederzeit weiss, wo man ist. */
.bereich {
  border: 1px solid var(--hair); border-left: 4px solid var(--border);
  border-radius: var(--radius-sm); overflow: hidden; margin-top: 1rem;
}
.bereich:first-of-type { margin-top: .25rem; }
.bereichkopf {
  display: flex; align-items: baseline; flex-wrap: wrap; gap: .25rem .5rem;
  padding: .5rem .75rem; background: var(--fill); border-bottom: 1px solid var(--hair);
  cursor: pointer; list-style: none;
}
.bereichkopf::-webkit-details-marker { display: none; }
/* Der Pfeil rechts, damit die Zeile sichtbar mehr ist als eine Ueberschrift -
   dieselbe Sprache wie bei den Bereichen in der Mitarbeiter-App. */
.bereichkopf::after {
  content: '›'; margin-left: auto; font-size: 1.125rem; line-height: 1;
  color: var(--muted); transition: transform .12s ease;
}
.bereich[open] > .bereichkopf::after { transform: rotate(90deg); }
.bereich:not([open]) > .bereichkopf { border-bottom: none; }
.bereichkopf:hover { filter: brightness(.98); }
.bereichkopf:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
@media (prefers-reduced-motion: reduce) {
  .bereichkopf::after { transition: none; }
}
/* Der Name als Register, nicht als Zeile: umrandet in der Bereichsfarbe.
   Umrandet statt gefuellt, weil die Farbe dann in beiden Modi mitdreht - ein
   gefuelltes Marine braeuchte im Nachtmodus dunkle Schrift und im Tagmodus
   helle, und genau daran ist die Farbwahl in diesem Projekt schon zweimal
   gescheitert. */
.bereichname {
  font-size: .75rem; font-weight: 800; letter-spacing: .08em; text-transform: uppercase;
  color: var(--muted); border: 1.5px solid currentColor; border-radius: var(--radius-pille);
  padding: .125rem .5rem; line-height: 1.3;
}
.bereichzahl { font-size: .75rem; color: var(--text-soft); }
.bereichzahl strong { color: var(--warn); font-weight: 700; }
.bereichslots { padding: .125rem .75rem .75rem; }

/* Im Backend traegt der Kopf die Bereichsfarbe - dieselbe Sprache wie die
   Bloecke in der Mitarbeiter-App. */
.bereich.b-bar { border-left-color: var(--bar); }
.bereich.b-kueche { border-left-color: var(--kueche); }
.bereich.b-office { border-left-color: var(--office); }
.bereich.b-bar > .bereichkopf { background: var(--bar-soft); }
.bereich.b-kueche > .bereichkopf { background: var(--kueche-soft); }
.bereich.b-office > .bereichkopf { background: var(--office-soft); }
.bereich.b-bar > .bereichkopf > .bereichname { color: var(--bar); }
.bereich.b-kueche > .bereichkopf > .bereichname { color: var(--kueche); }
.bereich.b-office > .bereichkopf > .bereichname { color: var(--office); }

/* Auf dem Schreibtisch stehen die Schichten eines Bereichs NEBENEINANDER.
   Eine Schicht braucht rund 420 px, mehr macht die Zeile nur leer - und
   untereinander war der Samstag 1.352 px lang. Container-Queries gibt es
   hier nicht, also entscheidet die Fensterbreite. Gemessen statt geraten:
   bei 1.150 px Fenster bleiben im Block 841 px, und 2 x 420 + Spalt waeren
   862 - eine Spalte zu viel. Mit 360 px passen zwei ab 1.080 px Fenster. */
@media (min-width: 1080px) {
  /* Spalten, nicht Raster - und das ist der Unterschied, auf den es
     ankommt (Mathieu, 12.09.2026: "man liest ja von links oben nach unten
     und dann rechts oben unten"). Ein Grid fuellt ZEILENWEISE: Frueh links,
     Tagesschicht rechts, Spaet wieder links. Mit columns laeuft die linke
     Spalte erst zu Ende, dann beginnt die rechte - der Abend steht damit
     rechts, so wie man ihn liest.
     break-inside: avoid haelt eine Schicht zusammen; ohne das wandert der
     halbe Aufklapper in die naechste Spalte. */
  .bereichslots { columns: 2; column-gap: 1.5rem; }
  .bereichslots > .slot { break-inside: avoid; }
  /* Die erste Schicht ueberhaupt braucht keine Trennlinie; die erste der
     zweiten Spalte bekommt eine, und das ist richtig so - sie trennt dort
     nach oben gegen den Kopf. */
  .bereichslots > .slot:first-child { border-top: none; }
}
/* Office ist ein Zusatz, keine Besetzung (Mathieu, 07.09.2026: "Managment
   schichten veraendern nichts an der auslasstung sie sind wie ein zusatz zu
   sehen"). Der Hinweis steht an der Ueberschrift, damit niemand die Zahlen
   oben mit dieser Gruppe zusammenrechnet. */
.bereich.b-office .bereichname::after {
  content: ' · zählt nicht zur Auslastung';
  font-weight: 500; letter-spacing: 0; text-transform: none; color: var(--muted);
}
.dayhead { display: flex; align-items: baseline; flex-wrap: wrap; gap: .25rem .5rem; margin-bottom: .75rem; }
/* Das Event am Tag, im Backend beim Einteilen (Mathieu, 07.09.2026: "damit
   wir danach besser planen koennen"). Marine-Chip wie in der
   Mitarbeiter-Woche - dieselbe Sprache auf beiden Seiten. */
/* Der Stoerer sitzt IN der Kopfzeile des Tages (Mathieu, 07.09.2026: "pack
   die events direkt mit in die zeile als button bzw stoerer ... in den Tag
   rein und nicht nur drueber") - vorher stand er als eigene Zeile darunter
   und las sich wie eine Ueberschrift fuer die Schichten. */
.dayevent {
  background: var(--deep); color: var(--deep-ink); border-radius: var(--radius-klein);
  font-size: .625rem; font-weight: 700; letter-spacing: .04em;
  padding: .125rem .5rem; white-space: nowrap;
}
/* Ein Event im Status "Idee" ist noch nichts, um das man planen muss - es
   steht da, aber als Umriss, nicht als Tatsache. */
.dayevent.idee {
  background: transparent; color: var(--muted);
  border: 1px dashed var(--border-strong); font-weight: 600;
}
.dayhead .name { font-family: var(--f-text); font-weight: 650; font-size: 1rem; }
.dayhead .date { color: var(--muted); font-size: .875rem; }
.dayhead .daycount { margin-left: auto; color: var(--muted); font-size: .75rem; font-weight: 700; white-space: nowrap; }
.dayhead .weekendtag {
  margin-left: auto; font-size: .75rem; font-weight: 650; letter-spacing: .04em; text-transform: uppercase;
  color: var(--warn); background: var(--warn-soft); border-radius: var(--radius-pille); padding: .125rem .5rem;
}

.chips { display: flex; flex-wrap: wrap; gap: .5rem; }
.chip { position: relative; }
.chip input { position: absolute; opacity: 0; width: 1px; height: 1px; }
/* Die Chips sind die Hauptbedienung fuers Team. Ungewaehlt eine Flaeche mit
   Haarlinie, gewaehlt eine volle Flaeche - vorher hatte jeder Chip einen
   1,5px-Rahmen, und acht davon nebeneinander sahen aus wie ein Formular von
   1998. */
.chip > span {
  display: inline-flex; align-items: center; gap: .5rem;
  min-height: 44px; padding: .5rem 1rem;
  border: 1px solid var(--hair-strong); border-radius: var(--radius-pille);
  background: var(--surface); color: var(--text);
  font-weight: 600; font-size: .875rem; cursor: pointer; user-select: none;
  transition: background-color .12s ease, border-color .12s ease;
}
.chip > span:hover { background: var(--fill); }
.chip > span::before {
  content: ""; width: 18px; height: 18px; border-radius: var(--radius-pille);
  border: 1.5px solid var(--hair-strong); background: transparent; flex: none;
  display: flex; align-items: center; justify-content: center;
  font-size: .75rem; font-weight: 700; line-height: 1;
}
.chip input:checked + span { background: var(--accent); border-color: var(--accent); color: var(--accent-ink); }
.chip input:checked + span::before {
  content: "✓"; background: var(--accent-ink); border-color: var(--accent-ink); color: var(--accent);
}
.chip input:focus-visible + span { outline: none; box-shadow: 0 0 0 4px var(--accent-soft); }
.chip.off input:checked + span { background: var(--crit); border-color: var(--crit); color: var(--crit-ink); }
.chip.off input:checked + span::before { content: "✓"; background: var(--crit-ink); border-color: var(--crit-ink); color: var(--crit); }
.chip input:disabled + span { opacity: .4; cursor: not-allowed; }
/* Eine Huelle, die ohnehin fuer alle offen ist (Mathieu, 14.09.2026). Der
   Haken dort aendert nichts, solange niemand sonst angehakt ist - also soll
   der Chip auch nicht so aussehen, als tue er etwas. */
.chip.offen > span { border-style: dashed; color: var(--muted); }
/* Gesperrt und blass ist dasselbe Signal, zweimal gesagt: die Schicht ist
   ohnehin fuer alle offen, hier gibt es nichts zu entscheiden. */
.chip.offen input:disabled + span { cursor: default; opacity: .75; }

/* "Wer darf sich eintragen" an der Schichthuelle. Zugeklappt, weil der
   Normalfall "alle" ist: fuenfundzwanzig Namen unter jeder der vierzehn
   Huellen wuerden die Huelle selbst verdecken. Der Zustand steht im Griff,
   damit man ihn auch geschlossen liest. */
.werdarf { margin-top: .25rem; border-top: 1px solid var(--hair); padding-top: .5rem; }
.werdarf > summary {
  display: flex; align-items: center; gap: .5rem; flex-wrap: wrap;
  min-height: 34px; cursor: pointer; list-style: none;
  font-size: .875rem; color: var(--muted);
}
.werdarf > summary::-webkit-details-marker { display: none; }
.werdarf > summary::before {
  content: "›"; display: inline-block; font-weight: 700; font-size: 1rem;
  transition: transform .12s ease;
}
.werdarf[open] > summary::before { transform: rotate(90deg); }
.wdtitel { font-weight: 600; color: var(--text); }
/* "alle" ist der Normalfall und bleibt leise; eine echte Einschraenkung
   traegt Farbe, damit man sie im Vorbeigehen sieht. */
.wdstand { color: var(--muted); }
.wdstand.eng { color: var(--accent); font-weight: 600; }
.wdliste { margin-top: .5rem; }
.wdbereich { display: flex; align-items: center; gap: .5rem; flex-wrap: wrap; margin-top: .5rem; }
.wdbereich label { font-size: .875rem; color: var(--muted); font-weight: 600; }
.wdbereich select { max-width: 15rem; }
/* Eine Regel, in die sich niemand eintragen KANN, sieht sonst genauso aus
   wie eine, in die sich niemand eintragen WILL. */
.wdwarnung { font-size: .875rem; color: var(--warn, var(--crit)); font-weight: 600; flex: 1 1 100%; }

/* Der Heute-Kopf (15.09.2026). Er steht ganz oben und beantwortet die Frage,
   mit der die App geoeffnet wird - deshalb traegt ihn die Typografie und
   nicht die Farbe: Datum klein und ruhig, die Antwort gross, der Knopf
   darunter ueber die volle Breite. Farbe hat nur der Knopf, und die auch nur,
   wenn er etwas zu tun anbietet. */
.card.heutekopf { padding: 1rem 1rem 1rem; }
.hkdatum {
  font-size: .75rem; font-weight: 700; letter-spacing: .09em; text-transform: uppercase;
  color: var(--muted); margin-bottom: .25rem;
}
.hkzeile {
  font-size: 1.5rem; letter-spacing: -.02em; line-height: 1.15;
  /* Dieselbe zweite Schrift wie die Begruessung darueber (Mathieu,
     17.09.2026): der Schichtname ist der zweite Name auf der Karte, nach
     dem der Person selbst. Fraunces statt Poppins-Fett - 500 wiegt sichtbar
     weniger als das vorige 700, das war Absicht in der Vorlage. */
  font-family: 'Fraunces', var(--f-text), serif; font-weight: 500;
}
.hkzeit { font-size: 1rem; font-weight: 600; margin-top: .125rem; font-variant-numeric: tabular-nums; }
.hkmit { margin-top: .5rem; font-size: .875rem; color: var(--muted); line-height: 1.45; }
.hkmit b { color: var(--text); font-weight: 600; }
.hkbtn { margin-top: 1rem; }
.hkbtn .btn, .hkbtn form { width: 100%; }
.hkbtn .btn { justify-content: center; }
/* Zwei Knoepfe nebeneinander - beide erreichbar, ohne zu scrollen. Jeder
   traegt sein eigenes Formular, deshalb sitzt flex auf den Formularen. */
.hkzwei { display: flex; gap: .5rem; margin-top: 1rem; }
.hkzwei form { flex: 1 1 0; }
.hkzwei .btn { width: 100%; justify-content: center; }
.hklauf { display: flex; align-items: baseline; gap: .5rem; flex-wrap: wrap; }
/* Die laufende Zeit traegt weiter .stzahl - Anton, gruen, 2,7rem. Das ist
   die Gestalt, die die Uhr seit dem 08.09. hat, und sie ist im Laden
   wiedererkennbar; mein Entwurf hatte sie nur deshalb anders gezeichnet,
   weil es eine Skizze war. .hkuhr regelt hier also nichts mehr als die
   Ausrichtung in der Zeile. */
.hkuhr { line-height: 1; }
.heutekopf.laeuft { border-color: var(--ok); }
.heutekopf.pausiert { border-color: var(--warn, var(--hair)); }
/* Ein freier Tag ist keine Warnung - die Zeile bleibt ruhig. */
/* "Heute frei" als EINE Zeile statt Kicker+Datumszeile+Ueberschrift
   (Mathieu, 17.09.2026: "das dein Tag feld wenn man frei hat ist sehr
   groß"). Das Wort traegt den Ton (fett, --text), das Datum daneben ist die
   Nebensache - dieselbe Rangfolge wie vorher, nur nebeneinander statt
   untereinander. */
.hkfreikopf { display: flex; align-items: baseline; gap: .5rem; flex-wrap: wrap; font-size: 1.125rem; }
.hkfreikopf b { font-weight: 700; }
.hkfreidatum { font-size: .75rem; color: var(--muted); }
/* Die naechste Schicht ist jetzt eine ruhige Zeile darunter statt ein
   eigener, eingerahmter Unterblock - "Naechste Schicht:" bleibt die
   Erklaerung, steht aber nicht mehr in Versalien als eigene Zeile fuer
   sich. */
.hknaechste { margin-top: .35rem; font-size: .875rem; color: var(--text-soft); }
.hkklein { font-weight: 700; color: var(--muted); }
/* "Trotzdem einstempeln" steht ganz unten und ist eine ZEILE, kein Knopf:
   es ist der seltene Fall, und er fuehrt erst auf die Stempeluhr. Sichtbar
   nur fuer die, die tatsaechlich einspringen (15.09.2026). */
.hkspringen { padding-top: .5rem; border-top: 1px solid var(--hair); }
.hkspringen a { text-decoration: underline; text-underline-offset: 3px; }
.hkfuss { margin: .75rem 0 0; font-size: .875rem; color: var(--muted); }

.hkfuss a { color: inherit; font-weight: 600; }
/* "Ersatz suchen" und "Krank melden" (Bau 6, 05.10.2026): die leiseste
   Handlung - unterstrichen, Eine Tinte, keine neue Farbe -, aber mit 44 px
   Tippflaeche, weil man sie mit dem Daumen trifft. */
.ersatzlink, .kranklink {
  display: inline-flex; align-items: center; min-height: 44px;
  font-size: .875rem; font-weight: 600; color: var(--accent);
  text-decoration: underline; text-underline-offset: 3px;
}
.hkkrankweg { margin: .25rem 0 -.5rem; }
.hkkrankweg .kranklink { color: inherit; }
.szliste .schichtkarte > .ersatzlink { grid-column: 2 / -1; grid-row: 2; justify-self: start; position: relative; z-index: 1; margin: -.375rem 0 -.5rem; }
.zlbaktion .ersatzlink { margin-right: .75rem; }
.sdersatz { margin: .25rem 0 0; }
.ersatzwort { font-weight: 600; color: var(--text); }
/* "Ersatz gesucht" an der Schicht (Runde 2): ein Kicker in der Schrift der
   Karte, kein neues Farbfeld - die Handlung ist der Knopf daneben. */
.skersatz { display: block; margin-bottom: 2px; font-size: .75rem; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; color: var(--text-soft); }
.zlblatt.ersatz > .skersatz { margin-bottom: .25rem; }
.zlbform { display: inline-flex; margin-right: .75rem; }
.zlbform .btn, .schichtkarte.ersatz .szform .btn { min-height: 44px; }
.ersatzstand { color: var(--text-soft); }
.ersatzschicht { margin: 0 0 .25rem; font-size: 1.125rem; }

/* Torten (Mathieu, 14.09.2026: "bau B"). Eine Bestellung ist eine Zeile mit
   drei Ebenen: WANN und WAS oben, die Einzelheiten darunter, die Handlungen
   ganz unten. Die Allergie faellt heraus - sie ist die eine Angabe, bei der
   ein Ueberlesen jemandem wehtut. */
.tortenzeile { padding: .75rem 0; border-top: 1px solid var(--hair); }
.tortenzeile:first-of-type { border-top: 0; }
.tortenzeile.fertig { opacity: .6; }
.tzkopf { display: flex; align-items: baseline; gap: .5rem; flex-wrap: wrap; }
.tzwann { font-weight: 700; font-variant-numeric: tabular-nums; flex: 0 0 auto; }
.tzsorte { font-weight: 600; flex: 1 1 auto; min-width: 8rem; }
.tzdetail { margin-top: .25rem; font-size: .875rem; color: var(--muted); line-height: 1.5; }
.tzhinweis { color: var(--crit); font-weight: 700; }
.backtaggruppe { margin-top: .75rem; }
.backtaggruppe:first-of-type { margin-top: .25rem; }
.btkopf {
  font-size: .875rem; font-weight: 700; text-transform: uppercase; letter-spacing: .05em;
  color: var(--muted); padding-bottom: .25rem; border-bottom: 1px solid var(--hair);
}

/* "Wiederholt sich das?" im Melde-Formular (15.09.2026). Zugeklappt, weil
   der Normalfall die einmalige Sache ist - sieben Haken mehr lassen ein
   Formular laenger aussehen, als es ist. */
/* Zwei Klappen im selben Formular, dieselbe Form: "Für wen?" und "Wiederholt
   sich das?" (15.09.2026). Beide fragen nach etwas, das der Normalfall NICHT
   braucht - deshalb stehen sie zu und nicht als weitere Pflichtfelder in der
   Reihe. Ein gemeinsamer Block und keine Kopie: zwei Klappen, die sich
   auseinanderentwickeln, sehen nach zwei Bedienelementen aus. */
.wiederholklapp, .fuerklapp, .zugangweg { margin-top: .25rem; }
.wiederholklapp > summary, .fuerklapp > summary, .zugangweg > summary {
  display: inline-flex; align-items: center; gap: .5rem; min-height: 44px;
  cursor: pointer; list-style: none; font-weight: 600; font-size: .875rem;
}
/* Unterstrichen wird die FRAGE und nicht die ganze Zeile: die Linie der
   Zusammenfassung wird quer durch ihre Kinder gezogen - auch durch den
   Winkel rechts und durch die Vorgabe dahinter, und ein
   text-decoration:none am Kind hebt sie nicht auf (gemessen am Bild,
   15.09.2026). Also traegt die Linie das Kind, das sie meint. */
.klapptitel { text-decoration: underline; text-underline-offset: 3px; }
.wiederholklapp > summary::-webkit-details-marker,
.fuerklapp > summary::-webkit-details-marker,
.zugangweg > summary::-webkit-details-marker { display: none; }
.wiederholklapp > summary::after, .fuerklapp > summary::after, .zugangweg > summary::after {
  content: ""; width: .45rem; height: .45rem; flex: none;
  border-right: 2px solid currentColor; border-bottom: 2px solid currentColor;
  transform: rotate(45deg) translate(-2px, -2px); transition: transform .12s ease;
}
.wiederholklapp[open] > summary::after,
.fuerklapp[open] > summary::after,
.zugangweg[open] > summary::after { transform: rotate(-135deg) translate(-2px, -2px); }
/* Die Vorgabe steht in der Zusammenfassung selbst: wer nicht aufklappt, soll
   trotzdem wissen, was dann gilt. Nicht unterstrichen - sie ist Auskunft und
   kein zweiter Knopf. */
.fkvorgabe { font-weight: 400; color: var(--muted); }
/* Fuenfundzwanzig Namen sind eine lange Liste: mit den vollen Namen gemessen
   16 Reihen und 877 px, mit "Anna R." zwoelf und 656 px. Der Rest bleibt wie
   bei allen Chips - ein engerer Innenabstand hat nichts eingespart (gemessen:
   dieselben zwoelf Reihen), also steht er hier auch nicht. */
.fuerchips { margin-top: .5rem; }
/* Der Weg hinaus steht zugeklappt und in der Warnfarbe erst, wenn er offen
   ist: die Zusammenfassung ist eine Frage, keine Ansage. */
.zugangweg { margin-top: 1rem; }
.zugangweg > summary .klapptitel { color: var(--crit); }

/* Die Bereichstoene der Startseite (15.09.2026). Eine getoente Flaeche und
   eine kleine Ueberschrift darueber - zusammen sagen sie "hier faengt etwas
   Neues an". Die Ueberschrift traegt oft mehr als die Farbe: wer sie liest,
   weiss, worum es geht, auch wenn er die Toene nicht unterscheidet.

   Der Rand faellt weg, wo der Ton ihn ersetzt - zwei Abgrenzungen
   uebereinander sind eine zu viel. */
.ton-woche,
.ton-hub { border-color: transparent; }
.ton-woche { background: var(--p-woche); box-shadow: inset 4px 0 0 var(--p-woche-ink); }
/* Navy (To-Dos) und Koralle (Events) als Kachelfarben (18.09.2026, aus Mathieus Referenzbild) gibt es seit Welt 1 (23.10.2026, E5) nicht mehr:
   die Kacheln der Startseite sind Zeilen, Hub und Wiki haben ihre eigenen Kacheln (stil-w1-hub.js). .kachel kommt in keinem Markup mehr vor. */
/* Der Name hat ZWEI Anlaeufe gebraucht, und beide Male hat ein Test oder das
   Bild es gefangen:
     .eyebrow      - gab es schon einmal, wurde abgeloest, und ein Test haelt
                     fest, dass er nicht zurueckkommt (totes-css.test.js).
     .bereichname  - gibt es SCHON, fuer Bar/Kueche/Office, mit Rahmen und
                     Pillenform. Mein Text sass ploetzlich in einer Pille.
   Deshalb .tonkicker, und deshalb heissen die Flaechen .ton-* und nicht
   .b-*: .b-bar, .b-kueche und .b-office sind vergeben. Vor einem neuen
   Klassennamen wird gesucht, nicht geraten. */
.tonkicker {
  font-size: .625rem; font-weight: 800; letter-spacing: .1em; text-transform: uppercase;
  margin-bottom: .25rem; color: var(--muted);
}

/* Der Hub ist die breite Kachel an der Spitze des Rasters - er zeigt als
   einziger Bereich Inhalt: drei Aufgabentitel, damit man beim Vorbeiscrollen
   sieht, worum es geht. */
.kachel.breit { grid-column: 1 / -1; }
/* Je Aufgabe EINE Zeile. Was nicht passt, wird abgeschnitten - die Kachel
   ist eine Vorschau, der Hub die Liste. Ohne das lief der lange
   Lieferanten-Titel ueber zwoelf Zeilen und die Kachel war hoeher als der
   Wochenblock (am Bild gesehen). */
.kliste { display: flex; flex-direction: column; gap: .25rem; margin-top: .25rem; min-width: 0; }
.kachel {
  display: flex; flex-direction: column; gap: .25rem; min-height: 104px;
  padding: .75rem .75rem; border-radius: var(--radius);
  color: inherit; text-decoration: none;
  border: 1px solid transparent; background: var(--surface);
}
a.kachel:hover { text-decoration: none; border-color: var(--border-strong); }
a.kachel:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.ton-woche .tonkicker { color: var(--p-woche-ink); }
.ton-hub .tonkicker { color: #F1E7D2; }


/* Wiederkehrende To-Dos (15.09.2026). Die TAGE stehen vorn und tragen die
   Zeile: "Mo" ist die Antwort auf die Frage, mit der man diese Liste liest. */
.serienliste { display: grid; gap: .125rem; margin-top: .5rem; }
.serienzeile {
  display: flex; align-items: baseline; gap: .75rem; flex-wrap: wrap;
  padding: .5rem 0; border-top: 1px solid var(--hair);
}
.serienzeile:first-child { border-top: 0; }
.serienzeile.aus { opacity: .55; }
.sztage { flex: 0 0 auto; font-size: .875rem; letter-spacing: .04em; color: var(--muted); }
.sztage b { color: var(--text); font-weight: 700; }
.sztext { flex: 1 1 12rem; min-width: 0; font-weight: 600; }
.szaktion { flex: 0 0 auto; display: flex; gap: .25rem; flex-wrap: wrap; }

/* "Torte bestellen" ist ein gruener Knopf, der das Formular aufklappt
   (15.09.2026). Ein <summary> traegt von Haus aus ein Dreieck und ist ein
   Listenpunkt - beides muss weg, sonst sieht der Knopf aus wie ein
   verunglueckter Aufzaehlungspunkt. */
.tortenneu { margin-top: .25rem; }
.tortenneu > summary {
  display: flex; justify-content: center; width: 100%;
  list-style: none; cursor: pointer;
}
.tortenneu > summary::-webkit-details-marker { display: none; }
.tortenneu[open] > summary { margin-bottom: .25rem; }
.tortenbacktage { margin: .5rem 0 0; text-align: center; }
.tortenneu .tortenform { margin-top: .5rem; }

/* Die Karte im Hub ist selbst der Weg (15.09.2026: "Wen ich beim Hub auf das
   Torten Feld drücke sollte ich direkt auf die Übersichtsseite kommen") -
   also ein Link, der aussieht wie eine Karte. */
a.card.tortenkarte { display: block; text-decoration: none; color: inherit; }
a.card.tortenkarte:hover { border-color: var(--border-strong); }
a.card.tortenkarte:active { opacity: .85; }
.tortenkurz { display: grid; gap: .25rem; font-size: .875rem; line-height: 1.45; }

/* Was heute an einem Tisch steht. Dieselbe Signalflaeche wie eine offene
   Ansage: es passiert HEUTE und die Schicht ist beteiligt. */
.tortenheute .thzeile { padding: .5rem 0; border-top: 1px solid var(--hair); }
.tortenheute .thzeile:first-of-type { border-top: 0; }
.tortenheute .thkopf { font-size: 1rem; }
.tortenheute .thhinweis { margin-top: .125rem; font-weight: 700; color: var(--crit); }
.tortenform .kvgrid { margin-bottom: .25rem; }

/* "Wer arbeitet wo" - das ganze Team auf einer Seite, ein Knopf. Name links,
   drei Haken rechts; bei fuenfundzwanzig Zeilen traegt die Fluchtlinie.
   Die Karte selbst benutzt details.card.eingeklappt - dieselbe Bauform wie
   News und Schichtuebergabe, keine zweite. */
.bereichsliste { display: grid; gap: .125rem; margin-top: .5rem; }
.brzeile {
  display: flex; align-items: center; gap: .75rem; flex-wrap: wrap;
  padding: .25rem 0; border-top: 1px solid var(--hair);
}
.brzeile:first-child { border-top: 0; }
.brname { flex: 1 1 11rem; min-width: 0; font-weight: 600; font-size: 1rem; }
.brzeile .chips { flex: 0 0 auto; gap: .25rem; }
.brzeile .chip > span { min-height: 38px; padding: .25rem .75rem; font-size: .875rem; }

/* Team Hub */
.dot { display: inline-block; width: 10px; height: 10px; border-radius: 50%; flex: none; }
.dot.rot { background: var(--crit); }
.dot.gelb { background: var(--warn); }
.dot.gruen { background: var(--ok); }
.dot.unbekannt { background: var(--border-strong); }
.stockgrid { display: grid; grid-template-columns: repeat(auto-fill, minmax(230px, 1fr)); gap: .5rem; }
.stockrow {
  display: flex; align-items: center; gap: .5rem; padding: .75rem .75rem;
  border: 1px solid var(--border); border-radius: var(--radius-sm); background: var(--surface-2);
}
.stockrow .nm { font-weight: 600; font-size: .875rem; flex: 1; min-width: 0; line-height: 1.3; }
.stockrow .nm .sub { display: block; font-weight: 500; font-size: .75rem; color: var(--muted); }
.stockrow .amt { font-size: .875rem; color: var(--text); font-weight: 600; white-space: nowrap; font-variant-numeric: tabular-nums; }
/* Die Zeile ist jetzt ein Link auf die Artikelseite. text-decoration und
   color muessen explizit stehen: als <a> braeuchte sie sonst die
   Link-Optik, und mitten in einer Bestandsliste sind unterstrichene
   blaue Namen das Letzte, was man lesen will. */
.stockrow { color: var(--text); text-decoration: none; }
a.stockrow:hover { background: var(--fill); border-color: var(--border-strong); }
.stockpfeil { color: var(--muted); font-size: 1rem; line-height: 1; flex: none; }

/* --- Artikelseite ------------------------------------------------------
   Der Bestand steht gross im Deckblock, damit die erste Frage hinter der
   Bar ("wie viel ist noch da") ohne Suchen beantwortet ist. */
.artstand { display: flex; align-items: baseline; gap: .5rem; flex-wrap: wrap; margin-top: .5rem; }
.artstand .dot { flex: none; }
.artmenge {
  font-size: 1.5rem; font-weight: 700; color: var(--deep-ink);
  font-variant-numeric: tabular-nums; line-height: 1.1;
}
.artneben { font-size: .875rem; color: var(--deep-ink-leise); }

/* Menge + Einheit + Knopf in einer Zeile: der ganze Handgriff bleibt in
   einer Zeile und unter dem Daumen. Bricht auf engen Geraeten um. */
.zaehlzeile { display: flex; align-items: center; gap: .5rem; flex-wrap: wrap; }
.zaehlzeile input[type="text"] {
  flex: 1 1 5.5rem; min-width: 0; margin: 0;
  font-size: 1.125rem; font-variant-numeric: tabular-nums; text-align: right;
}
.zaehleinheit { color: var(--muted); font-size: .875rem; font-weight: 600; flex: none; }

/* Bewegungsarten als Chips statt Dropdown: sie sind zu wenige fuer eine
   Auswahlliste und zu wichtig, um sie zu verstecken - man sieht auf einen
   Blick, was ueberhaupt geht. Radios liegen unsichtbar darunter, damit es
   ohne JavaScript funktioniert (und die CSP unberuehrt bleibt). */
.artchips { display: flex; flex-wrap: wrap; gap: .5rem; margin-bottom: .75rem; }
.artchips.spalte { flex-direction: column; }
.artchip { margin: 0; cursor: pointer; }
.artchip input { position: absolute; opacity: 0; width: 0; height: 0; }
.artchip span {
  display: block; padding: .5rem .75rem; border-radius: var(--radius-pille);
  border: 1px solid var(--border); background: var(--surface-2);
  font-size: .875rem; font-weight: 600; color: var(--text);
}
.artchip input:checked + span {
  background: var(--deep); border-color: var(--deep); color: var(--deep-ink);
}
.artchip input:focus-visible + span { outline: 2px solid var(--accent); outline-offset: 2px; }

.bewunten {
  display: flex; justify-content: space-between; gap: .5rem; flex-wrap: wrap;
  font-size: .75rem; color: var(--muted); margin-top: .125rem;
}
.bewgrund { text-align: right; }
.bewwert { font-variant-numeric: tabular-nums; font-weight: 700; }
.bewwert.minus { color: var(--crit); }
.bewwert.plus { color: var(--gruen); }

/* Erwartet / gezaehlt / Differenz nebeneinander - die Zahl, um die es geht,
   soll man nicht aus einem Satz herauslesen muessen. */
.diffblock { display: flex; gap: 1rem; flex-wrap: wrap; }
.diffblock > div { display: flex; flex-direction: column; gap: .125rem; }
.difflabel { font-size: .75rem; text-transform: uppercase; letter-spacing: .04em; color: var(--muted); font-weight: 700; }
.diffzahl { font-size: 1.125rem; font-weight: 700; font-variant-numeric: tabular-nums; }
.diffzahl.minus { color: var(--crit); }
.diffzahl.plus { color: var(--gruen); }

/* Bestellliste (Team Hub): dieselbe Kartenoptik wie .stockrow, aber mit
   einem echten Zahlenfeld statt einer reinen Anzeige - eine Menge je
   Artikel fuer die naechste Bestellrunde. */
.orderlist { display: grid; grid-template-columns: repeat(auto-fill, minmax(230px, 1fr)); gap: .5rem; }
.orderrow {
  display: flex; align-items: center; gap: .5rem; padding: .5rem .75rem;
  border: 1px solid var(--border); border-radius: var(--radius-sm); background: var(--surface-2);
}
.orderrow .nm { font-weight: 600; font-size: .875rem; flex: 1; min-width: 0; line-height: 1.3; }
.orderrow .nm .sub { display: block; font-weight: 500; font-size: .75rem; color: var(--muted); }
.orderrow input[type="number"] {
  width: 4.2rem; flex: none; text-align: center; font-variant-numeric: tabular-nums;
  padding: .5rem .25rem; border: 1px solid var(--hair-strong); border-radius: var(--radius-xs);
  background: var(--surface); color: var(--text); font: inherit; font-weight: 650;
}
.orderrow input[type="number"]:focus-visible {
  outline: none; border-color: var(--accent); box-shadow: 0 0 0 4px var(--accent-soft);
}
.hubtabs { display: flex; flex-wrap: wrap; gap: .5rem; margin: 0 0 1.25rem; }
.hubtabs a {
  /* 44 px hoch (gemessen 08.09.2026: waren 33). Das ist die Navigation im
     Team Hub - sie wird am Handy mit dem Daumen getroffen, im Gehen. */
  display: inline-flex; align-items: center; min-height: 44px;
  padding: .5rem .75rem; border-radius: var(--radius-pille); font-size: .875rem; font-weight: 600;
  background: var(--surface-2); color: var(--text-soft);
}
/* Der offene Reiter beantwortet genau dieselbe Frage wie die markierte Zeile
   in einer Liste: „was ist gerade offen". Also dieselbe Farbe. Vorher war es
   das blasse Marine, das man auf dem Handy im Halbdunkel kaum vom Rest
   unterschied - dieselbe Beschwerde, andere Stelle.
   Der Rahmen der App (Menueleiste, Kopfleiste) bleibt bewusst wie er ist:
   das ist Struktur, nicht eine Auswahl, die man gerade getroffen hat. */
.hubtabs a[aria-current="page"] { background: var(--wahl); color: var(--wahl-ink); }
/* Zweite Ebene: die Kategorien innerhalb der Bestellung (Getraenke, Kueche,
   Baeckerei, Bar). Muss sich vom Hauptreiter unterscheiden, sonst sind es
   optisch zehn gleichrangige Reiter untereinander - kleiner, umrandet statt
   gefuellt, und mit weniger Abstand nach unten, damit sie sichtbar zu dem
   gehoert, was darunter kommt. Die 44 px Hoehe bleiben: es wird mit dem
   Daumen getroffen. */
/* Welche Familien es sonst noch gibt. Steht unter der Reihe, klein - es ist
   ein Wegweiser, keine zweite Reiterreihe. */
/* Drei beschriftete Reihen statt einer Reihe plus versteckter Rest (Mathieu,
   14.09.2026: "Diese ganzen reiter habe ich garnicht"). Die Beschriftung
   steht LINKS daneben und nicht darueber: so bleiben es drei Zeilen statt
   sechs, und die Augen laufen die Reiter entlang, nicht die Ueberschriften. */
.hubgruppen { display: flex; flex-direction: column; gap: .25rem; margin: 0 0 1.25rem; }
.hubgruppe { display: flex; align-items: baseline; gap: .75rem; flex-wrap: wrap; }
.hubglabel {
  flex: 0 0 5.4rem; font-size: .75rem; font-weight: 800; letter-spacing: .07em;
  text-transform: uppercase; color: var(--muted);
}
/* Die offene Familie in der Tinte - damit man beim Hinsehen weiss, in welchem
   Bereich man gerade ist, auch wenn der Reiter selbst weit rechts steht. */
.hubgruppe.offen .hubglabel { color: var(--text); }
.hubgruppe .hubtabs { flex: 1 1 20rem; margin: 0; }
.hubandere a { font-weight: 600; text-decoration: underline; }
.hubandere .hint { font-size: .875rem; }
.hubtabs.unterreiter { gap: .25rem; margin: -.25rem 0 1rem; }
.hubtabs.unterreiter a {
  font-size: .875rem; padding: .25rem .75rem;
  background: transparent; border: 1px solid var(--hair-strong); color: var(--text-soft);
}
/* --- Einkaufsliste: links die Sache, rechts die Menge --------------------
   Mathieu, 11.09.2026: "Bau die bestellung eher wie eine Apple einkaufsliste
   auf. Also links was gebraucht wird und rechts die Menge." */
.ekmenge {
  flex: none; margin-left: auto; padding-left: .5rem;
  color: var(--muted); font-size: .875rem; font-weight: 600;
  white-space: nowrap; font-variant-numeric: tabular-nums;
}
/* Die Menge sitzt schon am rechten Rand - dann darf der Statusknopf sich den
   Platz nicht noch einmal nehmen, sonst klafft die Zeile auseinander. */
.hubitemrow .ekmenge + .statuspill, .hubitemrow .ekmenge ~ .tag { margin-left: .5rem; }
.hubitemrow:has(.ekmenge) .statuspill { margin-left: .5rem; }

.ekkopf {
  display: flex; gap: .5rem; margin: .25rem 0 .25rem;
  font-size: .75rem; font-weight: 700; letter-spacing: .07em; text-transform: uppercase;
  color: var(--muted);
}
.ekkopf > :first-child { flex: 1 1 auto; }
.ekkopf > :last-child { flex: none; width: 8.5rem; }
.ekzeilen { display: flex; flex-direction: column; gap: .5rem; }
.ekzeile { display: flex; gap: .5rem; }
.ekzeile input { margin: 0; min-height: 46px; }
.ekzeile input:first-child { flex: 1 1 auto; min-width: 0; }
.ekzeile input:last-child { flex: none; width: 8.5rem; }
.ekplus {
  font: inherit; font-size: .875rem; font-weight: 650; cursor: pointer;
  margin-top: .5rem; min-height: 44px; padding: 0 1rem; border-radius: var(--radius-pille);
  background: transparent; border: 1px dashed var(--border-strong); color: var(--text-soft);
}
.ekplus:hover { border-style: solid; border-color: var(--accent); color: var(--accent); }

/* Die Warengruppen einer Bestellliste zum Auf- und Zuklappen (Mathieu,
   11.09.2026: "bei Horst Lehmann will ich die verschiedenen kategorien zum ein
   und ausklappen"). Der Kopf ist der Schalter und 44 px hoch. */
details.warengruppe > summary {
  display: flex; align-items: center; gap: .5rem; min-height: 44px;
  cursor: pointer; list-style: none; margin: 0;
}
details.warengruppe > summary::-webkit-details-marker { display: none; }
details.warengruppe > summary > span:first-child { flex: 1 1 auto; }
details.warengruppe > summary::after {
  content: "›"; flex: none; font-size: 1.125rem; line-height: 1; color: var(--muted);
  transform: rotate(90deg); transition: transform .15s ease;
}
details.warengruppe[open] > summary::after { transform: rotate(-90deg); }
.warengruppe .wgzahl {
  flex: none; font-size: .75rem; font-weight: 600; letter-spacing: 0; text-transform: none;
  color: var(--muted); font-variant-numeric: tabular-nums;
}
@media (prefers-reduced-motion: reduce) {
  details.warengruppe > summary::after { transition: none; }
}

/* --- Suchen im Wissen ----------------------------------------------------
   Mathieu, 11.09.2026: "Natürlich muss es organisiert und findbar sein." Ein
   echtes Formular, kein Filter im Browser - es durchsucht den ganzen Text und
   nicht nur die Titel auf dem Bildschirm. */
.wissensuche { margin-bottom: 1rem; }
.wissensuche > label {
  display: block; font-size: .75rem; font-weight: 700; letter-spacing: .08em;
  text-transform: uppercase; color: var(--muted); margin-bottom: .25rem;
}
.wsreihe { display: flex; gap: .5rem; }
.wsreihe input { flex: 1 1 auto; min-width: 0; margin: 0; min-height: 46px; }
.wsreihe .btn { flex: none; }
.wissensuche .help { display: block; margin-top: .5rem; }

.wstreffer { display: grid; gap: .5rem; }
.wstreff {
  display: block; padding: .75rem .75rem; border-radius: var(--radius-sm);
  border: 1px solid var(--border); background: var(--surface);
  color: inherit; text-decoration: none;
}
.wstreff:hover { border-color: var(--accent); }
/* Die Art steht ueber dem Titel und nicht dahinter: man sucht "wo steht das"
   und will als Erstes wissen, ob es ein Handbuch, eine Checkliste oder das
   Notfall-Protokoll ist. */
.wsart {
  display: block; font-size: .625rem; font-weight: 700; letter-spacing: .09em;
  text-transform: uppercase; color: var(--muted); margin-bottom: .125rem;
}
.wstitel { display: block; font-family: var(--f-text); font-weight: 600; font-size: 1rem; }
/* Der Ausschnitt ist der Grund, warum die Liste brauchbar ist: ohne ihn muss
   man jeden Treffer aufmachen, um zu sehen, ob er der richtige war. */
.wsausschnitt {
  display: block; margin-top: .25rem; font-size: .875rem; color: var(--text-soft); line-height: 1.45;
}

/* --- Notfall-Protokoll ---------------------------------------------------
   Mathieu, 11.09.2026. Alles hier folgt einer Regel: lesbar fuer jemanden, der
   gerade nicht ruhig ist. Grosse Trefferflaechen, kurze Zeilen, und der
   wichtigste Satz steht schon da, bevor man etwas aufklappt. */

/* Die Notrufnummern. Nicht als Liste, sondern als vier Knoepfe - ein Tipp
   waehlt. Zwei Spalten am Handy, vier ab Tablet. */
.nfnotruf { display: grid; grid-template-columns: repeat(2, 1fr); gap: .5rem; margin: 1rem 0 0; }
@media (min-width: 40rem) { .nfnotruf { grid-template-columns: repeat(4, 1fr); } }
.nfnr {
  display: flex; flex-direction: column; gap: .125rem; min-height: 76px;
  padding: .75rem .75rem; border-radius: var(--radius-sm);
  background: var(--crit-soft); border: 1px solid var(--crit);
  color: var(--crit); text-decoration: none;
}
.nfnr:hover { background: var(--crit); color: var(--crit-ink); }
.nfnr:hover span, .nfnr:hover em { color: inherit; }
.nfnr b { font-family: var(--f-text); font-size: 1.5rem; font-weight: 700; line-height: 1; letter-spacing: -.02em; }
.nfnr span { font-size: .875rem; font-weight: 650; color: var(--text); }
.nfnr em { font-style: normal; font-size: .75rem; color: var(--muted); line-height: 1.25; }

.nfgruppe { margin-top: 1.5rem; }
.nfgruppentitel {
  font-size: .75rem; font-weight: 700; letter-spacing: .09em; text-transform: uppercase;
  color: var(--muted); margin: 0 0 .5rem .125rem;
}

/* Eine Lage. Zugeklappt zeigt sie Titel UND den ersten Satz - wer die Seite
   ueberfliegt, hat damit schon die Antwort und muss nicht raten, welche der
   achtzehn Karten die richtige ist. */
/* "Was ist los?" - die zwanzig Lagen als Sprungmarken auf drei Zeilen. Ohne
   sie ist die Seite 54 KB Scrollstrecke, und zwar genau in dem Moment, in dem
   niemand scrollen will. Umrandet statt gefuellt: das ist ein Wegweiser und
   keine Handlung - die einzige gefuellte Flaeche auf dieser Seite bleiben die
   Notrufnummern. */
.nfwahl { margin: 1rem 0 1.5rem; }
/* Die Auskunft unter einer Checkliste im Team-Hub (B2, 18.10.2026: wer sie heute abgegeben hat, wo
   gerade ein Zwischenstand laeuft) steht seit dem 23.10.2026 in der Zeile der Kachel (.w1ks in
   stil-w1-hub.js) - die alten Klassen ckzeile und ckstand sind weg. */
.nfwahltitel {
  display: block; font-size: .625rem; font-weight: 700; letter-spacing: .08em;
  text-transform: uppercase; color: var(--muted); margin-bottom: .5rem;
}
.nfwahlgrid { display: flex; flex-wrap: wrap; gap: .25rem; }
/* 44 px Tippziel (F19, 18.10.2026): die Sprunglinks standen bei 32 px - im
   Ernstfall, mit zitternden Fingern, die Stelle, an der man nicht danebentippen darf. */
.nfwahlgrid a {
  display: inline-flex; align-items: center; min-height: 44px;
  padding: .25rem .5rem; border: 1px solid var(--border); border-radius: var(--radius-pille);
  background: var(--surface); color: var(--text-soft);
  font-size: .875rem; font-weight: 600; line-height: 1.2; text-decoration: none;
}
.nfwahlgrid a:hover { border-color: var(--border-strong); color: var(--text); text-decoration: none; }
.nfwahlgrid a:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }

.nflage {
  background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-sm);
  margin-bottom: .5rem;
}
/* Der Sprung landet auf dem Titel INNERHALB der summary. Ohne Abstand nach
   oben schiebt sich die Zeile unter die Kopfleiste. */
.nftitel[id] { scroll-margin-top: 4.5rem; }
.nflage > summary {
  display: flex; flex-direction: column; gap: .125rem; cursor: pointer;
  padding: .75rem .75rem; min-height: 56px; justify-content: center;
  list-style: none;
}
.nflage > summary::-webkit-details-marker { display: none; }
.nflage > summary:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: var(--radius-sm); }
.nftitel { font-family: var(--f-text); font-weight: 600; font-size: 1rem; letter-spacing: -.01em; }
.nfsofort { font-size: .875rem; font-weight: 600; color: var(--crit); }
.nflage[open] { border-color: var(--border-strong); }
.nfinhalt { padding: 0 .75rem .75rem; }
.nfschritte { margin: .25rem 0 0; padding-left: 1.25rem; display: grid; gap: .5rem; }
.nfschritte li { font-size: .875rem; line-height: 1.45; }
.nfdanach { margin: .75rem 0 0; font-size: .875rem; color: var(--text-soft); }

/* "Anrufen": die Nummern der Lage, wieder als Tipp-Ziele. */
.nfrufe { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem; margin-top: .75rem; }
.nfruflabel {
  font-size: .625rem; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; color: var(--muted);
}
.nfruf {
  display: inline-flex; align-items: center; gap: .25rem; min-height: 38px;
  padding: .25rem .75rem; border-radius: var(--radius-pille); font-size: .875rem;
  border: 1px solid var(--border-strong); color: var(--text); text-decoration: none; background: var(--surface);
}
a.nfruf:hover { border-color: var(--accent); color: var(--accent); }
.nfruf b { font-weight: 700; }
/* Eine Nummer, die noch niemand eingetragen hat, wird NICHT weggelassen -
   sie steht als Luecke da. Sonst sieht die Lage vollstaendig aus und ist es
   nicht, und das merkt man erst im Ernstfall. */
.nfruf.fehlt {
  border-style: dashed; color: var(--muted); background: transparent; font-style: italic;
}

/* "Wer darf was". Eine Zeile je Entscheidung, und die Spalte rechts sagt in
   drei Worten, ob man fragen muss. Bewusst keine Tabelle mit Kopfzeile: am
   Handy wird daraus eine Zeile mit zwei Zeichen je Spalte. */
.nfbefugnis { margin-top: 1.5rem; }
.nfbtabelle { display: grid; gap: .125rem; }
.nfbzeile {
  display: grid; grid-template-columns: 1fr auto; gap: .125rem .75rem;
  padding: .5rem .125rem; border-bottom: 1px solid var(--hair); align-items: baseline;
}
.nfbzeile:last-child { border-bottom: 0; }
.nfbwas { font-weight: 650; font-size: 1rem; }
.nfbwer {
  grid-column: 2; grid-row: 1; text-align: right; font-size: .875rem; font-weight: 650;
  color: var(--gruen); white-space: nowrap;
}
/* Was NICHT frei ist, wird nicht rot - es ist keine Warnung, sondern eine
   Zustaendigkeit. Rot ist in dieser App "fehlt", und das waere hier falsch. */
.nfbzeile.gesperrt .nfbwer { color: var(--muted); white-space: normal; text-align: right; }
.nfbhinweis { grid-column: 1 / -1; font-size: .875rem; color: var(--text-soft); line-height: 1.4; }
/* Die Faelle, bei denen Mathieu sofort angerufen wird - auch nachts. */
.nfbwecken {
  display: inline-block; margin-left: .5rem; vertical-align: 1px;
  font-size: .625rem; font-weight: 700; letter-spacing: .05em; text-transform: uppercase;
  color: var(--wahl); border: 1px solid var(--wahl); border-radius: var(--radius-klein); padding: .125rem .25rem;
  white-space: nowrap;
}
/* Am Handy untereinander. Und das nowrap muss MIT weg - ohne das lief
   "unter 100 € Umsatz je Stunde: selbst entscheiden" aus dem Bild heraus.
   Am Bild gesehen, nicht im Code (11.09.2026). */
@media (max-width: 30rem) {
  .nfbzeile { grid-template-columns: 1fr; }
  .nfbwer { grid-column: 1; grid-row: auto; text-align: left; white-space: normal; }
}

/* Die erste Frage im Meldeformular: Vorfall oder Zeugenbericht. Zwei grosse
   Flaechen statt eines Auswahlfeldes - die Entscheidung traegt eine
   Begruendung, und die muss man lesen koennen, bevor man tippt. */
.vfart { border: 0; padding: 0; margin: 0 0 1rem; display: grid; gap: .5rem; }
.vfart legend {
  padding: 0; margin-bottom: .5rem;
  font-size: .75rem; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; color: var(--muted);
}
.vfartwahl {
  display: flex; align-items: flex-start; gap: .75rem; cursor: pointer;
  padding: .75rem .75rem; border-radius: var(--radius-sm);
  border: 1px solid var(--border); background: var(--surface);
}
.vfartwahl input { flex: none; margin: .25rem 0 0; width: 20px; height: 20px; }
.vfartwahl b { display: block; font-family: var(--f-text); font-weight: 600; font-size: 1rem; }
.vfartwahl em { display: block; font-style: normal; font-size: .875rem; color: var(--text-soft); line-height: 1.45; }
.vfartwahl:has(input:checked) { border-color: var(--accent); background: var(--accent-soft); }
.vfartwahl:has(input:focus-visible) { outline: 2px solid var(--accent); outline-offset: 2px; }

.nfawareness { margin-top: 2rem; }
.nfsec {
  font-size: .75rem; font-weight: 700; letter-spacing: .08em; text-transform: uppercase;
  color: var(--muted); margin: 1.25rem 0 .5rem; padding-top: 1rem; border-top: 1px solid var(--hair);
}
.nfregel { margin-bottom: .75rem; }
.nfregel b { font-family: var(--f-text); font-weight: 600; font-size: 1rem; }
.nfregel p { margin: .125rem 0 0; font-size: .875rem; color: var(--text-soft); line-height: 1.5; }
.nfstufen { margin: 0; padding-left: 1.25rem; display: grid; gap: .75rem; }
.nfstufen b { font-family: var(--f-text); font-weight: 600; font-size: 1rem; }
.nfstufen p { margin: .125rem 0 0; font-size: .875rem; color: var(--text-soft); line-height: 1.5; }
.nfbeispiel { font-style: italic; color: var(--text) !important; }
/* Der eine Satz, der im Moment die Laehmung loest: du darfst das, allein,
   gegen jeden. Mathieu am 11.09.2026: "Hausverbot darf jeder immer aussprechen
   egal ob invesotr, mitarbeiter, Gast, Stammkunde alle sind gleich vor dem
   awarness konzept und hausregeln." Deshalb steht er nicht als vierter Satz
   im Absatz, sondern abgesetzt auf eigener Flaeche. */
.nfbetont {
  margin: .5rem 0 0 !important; padding: .5rem .75rem;
  border-radius: var(--radius-sm); border-left: 4px solid var(--wahl);
  background: var(--wahl-soft); color: var(--text) !important;
  font-size: .875rem !important; line-height: 1.5;
}

/* Die Awareness-Beauftragte: eine eigene Zeile, weil sie die eine Person ist,
   die man auch anonym und auch Tage spaeter noch anrufen kann. */
.nfschoscho {
  display: flex; align-items: center; gap: .75rem; min-height: 60px;
  padding: .75rem .75rem; border-radius: var(--radius-sm); text-decoration: none;
  background: var(--wahl-soft); border-left: 4px solid var(--wahl); color: var(--text);
}
.nfschoschotext { flex: 1 1 auto; min-width: 0; }
.nfschoschotext b { display: block; font-family: var(--f-text); font-weight: 650; color: var(--wahl); }
.nfschoschotext span { display: block; font-size: .875rem; color: var(--text-soft); }
.nfschoschonr { flex: none; font-weight: 700; font-variant-numeric: tabular-nums; white-space: nowrap; }

.nfkontakte { display: grid; gap: .5rem; }
.nfkontakt {
  display: flex; align-items: center; gap: .75rem; min-height: 52px;
  padding: .5rem .75rem; border-radius: var(--radius-sm);
  border: 1px solid var(--border); background: var(--surface);
  color: inherit; text-decoration: none;
}
a.nfkontakt:hover { border-color: var(--accent); }
.nfkontakt.leer { border-style: dashed; background: transparent; }
.nfkname { flex: 1 1 auto; min-width: 0; font-weight: 650; font-size: 1rem; }
.nfkhint { display: block; font-weight: 400; font-size: .75rem; color: var(--muted); }
.nfknr { flex: none; font-weight: 700; font-variant-numeric: tabular-nums; white-space: nowrap; font-size: .875rem; }
.nfkontakt.leer .nfknr { font-weight: 500; font-style: italic; color: var(--muted); font-size: .75rem; }

/* Die Kategorie-Ueberschrift im Backend (Getraenke, Kueche, ...). Im Team Hub
   sind das Reiter, hier steht alles untereinander - am Schreibtisch ist Platz,
   und wer Artikel pflegt, will sie alle sehen. */
.eyebrow2 {
  font-size: .75rem; font-weight: 700; letter-spacing: .08em; text-transform: uppercase;
  color: var(--muted); margin: 2rem 0 -.5rem; padding-top: 1rem;
  border-top: 1px solid var(--hair);
}
.eyebrow2:first-of-type { margin-top: 1.25rem; border-top: 0; padding-top: 0; }
.hubtabs.unterreiter a[aria-current="page"] {
  background: var(--surface-3); border-color: var(--border-strong); color: var(--text);
}
/* 44 px, nicht 43 (gemessen 08.09.2026). Das Ziel ist das ganze Label und
   nicht das 18-px-Kaestchen darin - deshalb hier und nicht am input. */
.checkrow { display: flex; align-items: flex-start; gap: .5rem; min-height: 44px; padding: .5rem 0; border-bottom: 1px solid var(--border); }
.checkrow:last-child { border-bottom: 0; }
.checkrow input { margin-top: .25rem; width: 18px; height: 18px; flex: none; }
.checkarea { font-size: .75rem; font-weight: 700; letter-spacing: .07em; text-transform: uppercase; color: var(--muted); margin: 1rem 0 .25rem; }
.checkarea:first-child { margin-top: .25rem; }
/* Die Mitarbeiterauswahl als Aufklapper. KEIN max-height und kein
   overflow-y: der vorherige Kasten war 220 px hoch und scrollte in sich -
   bei 28 Leuten viereinhalb sichtbare Namen und zwei Scrollbereiche
   uebereinander. Aufgeklappt scrollt jetzt die Seite, wie ueberall sonst. */
.maklapp {
  border: 1px solid var(--border); border-radius: var(--radius-xs);
  background: var(--surface); overflow: hidden;
}
.maklapp > summary {
  list-style: none; cursor: pointer;
  display: flex; align-items: center; gap: .5rem;
  min-height: 46px; padding: .5rem .75rem;
}
.maklapp > summary::-webkit-details-marker { display: none; }
.magewaehlt { flex: 1 1 auto; min-width: 0; font-size: 1rem; font-weight: 600; }
.maandern {
  flex: none; font-size: .75rem; font-weight: 600; color: var(--accent);
  text-decoration: underline; text-underline-offset: .18em;
}
.maklapp[open] > summary { border-bottom: 1px solid var(--hair); }
.maklapp[open] .maandern::after { content: " zu"; }
.maliste { padding: .25rem .75rem .5rem; }
.maliste .checkrow { border-bottom: 1px solid var(--hair); }
.maliste .checkrow:last-child { border-bottom: 0; }
/* Umbruch erlaubt (Mathieu, 14.09.2026: lange To-Dos liefen in einer
   schmalen Spalte). Am Handy blieben dem Text neben Status und Kreuz nur
   166 von 309 px - "Torte bei Fanni bestellen - Sa 20.09., Tisch 4" stand
   dann funfzeilig da. Mit flex-wrap und flex-basis AUTO entscheidet der
   Inhalt: ein kurzes To-Do bleibt einzeilig, ein langes schiebt Status und
   Kreuz in die zweite Zeile und bekommt die volle Breite. Kein Umbruch fuer
   alle, sondern einer fuer die, die ihn brauchen. */
/* Seit dem 15.09.2026 sitzt jede Aufgabe in einem Rahmen: darunter koennen
   Notizen stehen, und die gehoeren sichtbar zu IHR. Die Trennlinie ist damit
   vom Formular an den Rahmen gewandert - sonst laege sie zwischen Aufgabe und
   ihrer eigenen Notiz. */
.hubitem { border-bottom: 1px solid var(--hair); }
.hubitem:last-child { border-bottom: 0; }
.hubitemrow { display: flex; flex-wrap: wrap; align-items: flex-start; gap: .75rem; padding: .75rem 0; margin: 0; }
.hubitemrow:last-child { border-bottom: 0; }

/* Die Notizen. Eingerueckt und in einer eigenen, ruhigeren Schriftgroesse:
   sie gehoeren zur Aufgabe, sind aber nicht die Aufgabe. Der senkrechte
   Strich links macht aus zwei Zeilen eine Gruppe, ohne einen zweiten Kasten
   in den Kasten zu setzen. */
/* Seit dem 17.09.2026 ein eigener Block mit eigenem Grund (Mathieu: „die
   Tasks und kommentare mehr voneinander abheben maybe zum einklappen").
   Vorher trennte nur ein Strich links - drei Notizen sahen aus wie drei
   weitere Zeilen derselben Aufgabe.
   Der Block liegt eine Stufe TIEFER als die Karte (--surface-2), jede Notiz
   darin wieder auf dem Ton der Karte: so liegt der Kommentar sichtbar AUF
   der Aufgabe. In beiden Moden dieselbe Richtung, weil beide Toene aus
   derselben Leiter kommen. */
.notizen {
  margin: .5rem 0 .125rem 1rem; padding: .25rem .5rem .5rem .5rem;
  /* Zwei Stufen von der Karte weg statt einer: --surface-2 lag nur 6,7 L*
     (hell) bzw. 4,2 (dunkel) daneben, --surface-3 sind 11,5 und 8,8 - das
     Doppelte. Dazu die 4-px-Kante in der Hub-Tinte: eine FARBE und nicht
     nur eine Helligkeit, damit der Unterschied auch bei Sonne auf dem
     Handy traegt. Dieselbe Bauart wie die Bereichstoene auf der Startseite
     (.ton-*) - eine Sprache, nicht zwei. */
  background: var(--surface-3); border-radius: var(--radius-xs);
  box-shadow: inset 4px 0 0 var(--p-hub-ink);
}
/* Der Aufklapper steht offen: was jemand um 23 Uhr aufgeschrieben hat, soll
   der Naechste lesen, ohne danach zu suchen. Zu ist er fuer die Aufgabe, an
   der sich fuenf Notizen gesammelt haben. */
.nzsumme {
  position: relative; display: flex; align-items: center; gap: .25rem;
  list-style: none; cursor: pointer; min-height: 32px;
  font-size: .75rem; font-weight: 700; letter-spacing: .04em;
  text-transform: uppercase; color: var(--muted);
}
.nzsumme::-webkit-details-marker { display: none; }
.nzsumme::after {
  content: ""; flex: none; width: .38rem; height: .38rem; margin-left: .125rem;
  border-right: 2px solid var(--muted); border-bottom: 2px solid var(--muted);
  transform: rotate(45deg); transition: transform .12s ease;
}
.nzklapp[open] > .nzsumme::after { transform: rotate(-135deg); }
/* 32 px sind zu wenig fuer etwas, das man antippt - die Flaeche waechst
   unsichtbar auf 44, die Zeile bleibt, wo sie ist. Dieselbe Bauart wie beim
   Aufgabentitel und beim Schichtnamen. */
.nzsumme::before { content: ""; position: absolute; left: 0; right: 0; top: -6px; bottom: -6px; }
.nzsumme:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: var(--radius-klein); }
.nzliste { display: flex; flex-direction: column; gap: .25rem; margin-top: .25rem; }
/* Wer und wann stehen UNTER dem Text, nicht daneben: nebeneinander nahm der
   Name der Notiz die Breite, und "Entkalker steht jetzt im Regal links" brach
   bei 390 px in drei Zeilen um (gemessen am 15.09.2026). Dieselbe Ordnung wie
   bei der Aufgabe darueber - erst die Sache, dann die Herkunft. */
.notizzeile {
  display: flex; align-items: flex-start; gap: .5rem;
  padding: .25rem .125rem .25rem .5rem;
  background: var(--surface); border-radius: var(--radius-klein);
}
.notizzeile .nzinhalt { flex: 1 1 auto; min-width: 0; }
/* Deutlich kleiner und leiser als die Aufgabe darueber (Mathieu,
   17.09.2026: „kommentare und die haupt to do besser voneinander abheben").
   Vorher waren es .9rem gegen .95rem in derselben Staerke und derselben
   Farbe - zwei Groessen, die man nebeneinander nicht unterscheidet. Jetzt
   traegt der Unterschied: 1.05rem/600 in --text oben, .85rem/400 in
   --text-soft hier. */
.notizzeile .nztext { display: block; font-size: .875rem; line-height: 1.45; color: var(--text-soft); }
.notizzeile .nzwer { display: block; margin-top: .125rem; font-size: .75rem; color: var(--muted); }
.notizzeile .nzweg { flex: none; margin: 0; }
.notizzeile .nzweg button {
  width: 32px; height: 32px; padding: 0; border: 0; border-radius: var(--radius-pille);
  background: transparent; color: var(--muted); cursor: pointer; font: inherit; font-size: .75rem;
}
.notizzeile .nzweg button:hover { background: var(--fill); color: var(--crit); }
/* Der Weg zur Notiz ist ein KNOPF (Mathieu, 16.09.2026). Die Klassen stehen
   an der Zusammenfassung selbst - dieselbe Bauart wie "Torte bestellen":
   reines HTML klappt das Feld auf, kein Skript, die CSP bleibt unangetastet.
   Hier steht nur, was ein <summary> von sich aus mitbringt und ein Knopf
   nicht haben soll. */
.nzform { display: flex; gap: .5rem; align-items: center; margin: .25rem 0 .5rem; }
.nzform input[type="text"] { flex: 1 1 auto; min-width: 0; }
/* Das Wegnehmen ist der leiseste Knopf der Zeile: gedeckt, ohne Flaeche, und
   erst beim Ueberfahren rot. Er soll erreichbar sein, aber nicht der erste
   Griff - abgehakt wird oefter als geloescht. 44 px bleibt er trotzdem. */
.hubitemrow .hubweg {
  flex: none; width: 44px; min-height: 44px; padding: 0; border: 0;
  background: transparent; color: var(--muted); cursor: pointer;
  font: inherit; font-size: 1rem; line-height: 1; border-radius: var(--radius-pille);
}
.hubitemrow .hubweg:hover { background: var(--surface); color: var(--crit); }
.hubitemrow .txt { flex: 1 1 auto; min-width: 10rem; font-size: 1rem; line-height: 1.4; }
/* Status und Kreuz bleiben zusammen und rechts. Getrennt brachen sie bei
   kurzen Aufgaben auseinander - der Status blieb oben, das Kreuz rutschte
   allein auf die naechste Zeile nach links (gemessen bei 390 px, 16.09.2026). */
.hubitemrow .hubsteuer { flex: none; margin-left: auto; display: inline-flex; align-items: center; gap: .25rem; }
.hubitemrow.done .txt { text-decoration: line-through; opacity: .5; }
.hubitemrow .meta { font-size: .75rem; color: var(--muted); text-decoration: none; display: inline-block; }
/* Der Status steht rechts (Mathieu, 07.09.2026). Der Text traegt die Zeile,
   der Knopf sitzt am Rand - da, wo am Handy der Daumen ist. */
.hubitemrow .statuspill { margin-left: auto; }

/* --- Die Feier beim Abhaken -------------------------------------------
   Zwei Stufen: die Zeile leuchtet kurz gruen auf, und der Konfettiwurf
   kommt aus dem Skript. Bei "Bewegung reduzieren" bleibt nur das
   Aufleuchten - eine Rueckmeldung braucht es trotzdem. */
.hubitemrow.feiert, .feierzeile.feiert {
  animation: feierleuchten 1.3s ease-out;
  border-radius: var(--radius-xs);
}
@keyframes feierleuchten {
  0% { background: color-mix(in srgb, var(--feier-gruen) 32%, transparent); }
  35% { background: color-mix(in srgb, var(--feier-gruen) 22%, transparent); }
  100% { background: color-mix(in srgb, var(--feier-gruen) 0%, transparent); }
}
/* Die Zeile, die "alles abgehakt" sagt - sie ersetzt das nuechterne
   "Gerade ist nichts offen." genau in dem Moment, in dem man selbst den
   letzten Haken gesetzt hat. */
.feierzeile {
  display: flex; align-items: center; gap: .5rem;
  padding: .75rem .75rem; border-radius: var(--radius-sm);
  background: color-mix(in srgb, var(--feier-gruen) 12%, transparent);
  font-weight: 620; color: var(--gruen); font-size: 1rem;
}
.fzhaken {
  flex: none; display: grid; place-items: center;
  width: 1.4rem; height: 1.4rem; border-radius: 50%;
  background: var(--gruen); color: var(--gruen-ink); font-size: .75rem;
}
/* Die Buehne liegt ueber allem und faengt keine Tipser ab: wer direkt
   weiterarbeiten will, soll nicht auf Konfetti warten muessen. */
.konfettibuehne {
  position: fixed; inset: 0; z-index: 90; pointer-events: none; overflow: hidden;
}
.konfetti {
  position: absolute; width: 8px; height: 8px; border-radius: var(--radius-klein);
  animation: konfettiflug 1.25s cubic-bezier(.2, .6, .35, 1) forwards;
}
/* Die Torte fliegt fast dreimal so gross wie ein Schnipsel. Bei 16 px war
   sie im Flug - sie dreht sich ja - nur noch ein creme-goldener Fleck; erst
   ab rund 22 px bleibt die Kerze erkennbar (am Bild gemessen, zweimal).
   Ohne Ecken: sie bringt ihre eigene Form mit. */
.konfetti.konfettitorte { width: 22px; height: 22px; border-radius: 0; }
@keyframes konfettiflug {
  0% { transform: translate(0, 0) rotate(0deg); opacity: 1; }
  /* Erst der Schwung nach oben, dann fallen lassen - ohne den zweiten Teil
     sieht es aus wie ein Blitz, nicht wie Konfetti. */
  55% { transform: translate(calc(var(--dx) * .9), var(--dy)) rotate(calc(var(--rot) * .6)); opacity: 1; }
  100% { transform: translate(var(--dx), calc(var(--dy) * -.25 + 70px)) rotate(var(--rot)); opacity: 0; }
}
@media (prefers-reduced-motion: reduce) {
  .hubitemrow.feiert, .feierzeile.feiert { animation-duration: .01s; }
  .konfetti { display: none; }
}


/* Zeitblöcke, in denen jemand nicht kann */
.blockzone { margin-top: .75rem; }
.blocklist { display: grid; gap: .5rem; }
.blocklist:not(:empty) { margin-bottom: .5rem; }
.blockrow {
  display: flex; align-items: center; gap: .5rem; flex-wrap: wrap;
  background: var(--crit-soft); border: 0;
  border-radius: var(--radius-sm); padding: .5rem .5rem;
}
.blockrow .pickic { color: var(--crit); }
.blockrow .timepair input { background: var(--surface); border-color: var(--hair-strong); }
.blockrow .timepair input:focus-visible { border-color: var(--crit); box-shadow: 0 0 0 4px var(--fehler-ring); }
.blockrow .timepair .tp-dash { color: var(--crit); opacity: .7; }
.blockrow .blockdel {
  flex: none; font: inherit; font-size: 1rem; line-height: 1;
  color: var(--crit); background: transparent; border: 0;
  border-radius: var(--radius-pille); width: 40px; height: 40px; cursor: pointer;
}
.blockrow .blockdel:hover { background: var(--crit-soft); }

button.qb {
  font: inherit; font-size: .875rem; font-weight: 600; cursor: pointer;
  color: var(--text-soft); background: var(--fill); border: 0;
  border-radius: var(--radius-pille); padding: .25rem .75rem; min-height: 44px;
}
button.qb:hover { background: var(--crit-soft); color: var(--crit); }
button.qb:disabled { opacity: .4; cursor: not-allowed; }

.sticky-save {
  position: sticky; bottom: 0;
  background: var(--surface); border-top: 1.5px solid var(--border);
  padding: .75rem 1rem;
  margin: 1.25rem -1.25rem -1.25rem;
  border-radius: 0 0 var(--radius) var(--radius);
  display: flex; flex-wrap: wrap; gap: .75rem; align-items: center;
  /* Als Name (25.10.2026): vorher stand der Dunkel-Wert NUR in der Medienabfrage - bei "dunkel von Hand" fehlte er (dritter Zustand). */
  box-shadow: var(--schatten-leiste);
}
.sticky-save .note { color: var(--muted); font-size: .875rem; }

/* Deine Woche IM Farbblock (Mathieu, 06.09.2026, mit einer Vorlage: "Ich will
   dass das blaue oben auf der startseite so aussieht wie das orange"). Loest
   den eigenen Kalenderkasten ab, der vorher darunter stand - und davor die
   .weekstrip. Der Kopf traegt jetzt alles zum Heute: wer du bist, welche
   Woche, wann du arbeitest.

   Mathieus Zeichen von vorhin gelten weiter, nur die Untergruende drehen sich
   um: "ein blauer kreis mit A bedeutet man arbeitet an dem Tag und so wie
   jetzt orange hinterlegt heisst das ist der heutige Tag." Auf Blau kann der
   Kreis nicht blau sein - er ist creme. Die tuerkise Pille umschliesst
   Wochentag UND Zahl, wie in der Vorlage.

   Das A-Feld bleibt auch leer stehen (nur unsichtbar), sonst haetten Tage mit
   und ohne Dienst verschiedene Hoehen und der Streifen saesse schief. */
/* Der Streifen, den der Service Worker in eine gespeicherte Seite einsetzt.
   Als echtes Element und nicht als body::before - das traegt schon den
   Streifen fuer die Sicherheitszone am iPhone.

   Gold und nicht rot: eine alte Fassung ist kein Fehler, sie ist nur alt.
   Rot ist in dieser App "hier fehlt jemand". */
.offlinestreifen {
  position: sticky; top: var(--safetop); z-index: 35;
  background: var(--gold); color: #3A2E0E;
  font-size: .75rem; font-weight: 700; text-align: center;
  padding: .5rem .75rem;
}
/* Ohne Netz sind Knoepfe, die etwas aendern, nicht benutzbar - sie sehen
   auch so aus. Ausgenommen ist nichts: das Stempeln geht ohne Verbindung
   ausdruecklich nicht (Mathieu, 08.09.2026), und ein Knopf, der still
   scheitert, ist schlimmer als einer, der grau ist. */
body[data-offline] form button:not(.btn-row a),
body[data-offline] .stknopf {
  opacity: .45; pointer-events: none;
}

/* --- Die feste Leiste unten --------------------------------------------
   Nur in der Mitarbeiter-App. Im Backend nicht: dort ist der Bildschirm
   breit, die Seitenleiste steht links und zeigt alle Ziele auf einmal. */
/* Die Leiste SCHWEBT (Mathieu, 16.09.2026, nach der Task-Planner-Vorlage).
   Vorher klebte sie am Rand; jetzt liegt sie auf der Seite, und der Punkt,
   auf dem man steht, ist eine gefuellte Pille statt nur einer anderen Farbe.
   Die Sicherheitszone unten am iPhone bleibt: sie wandert vom Innenabstand
   in den Aussenabstand, sonst liegt die Leiste unter dem Wisch-Streifen. */
/* Seit dem 05.10.2026 wieder FEST am unteren Rand, randlos und deckend
   (Mathieu: "unten die leiste ... muss ganz unten fest sein sonst scrollt der
   hintergrund hinten drunter durch und man sieht das"). Die schwebende
   Fassung brauchte einen Streifen dahinter, und mit dem Glas des neuen
   Dunkelmodus schien der Inhalt wieder durch - derselbe Fehler wie am
   16.09. Eine Leiste, die bis zur Unterkante reicht, hat keinen Spalt, durch
   den etwas laufen kann. Die Sicherheitszone des iPhones steckt im
   Innenabstand, damit die Ziele ueber dem Wisch-Streifen liegen. */
.unterleiste {
  position: fixed; left: 0; right: 0; bottom: 0; z-index: 40;
  display: grid; grid-template-columns: repeat(4, 1fr);
  background: var(--surface); border: 0; border-top: 1px solid var(--border);
  border-radius: 0;
  /* Nicht die ganze Sicherheitszone unter die Ziele legen (Mathieu,
     05.10.2026, mit Bildschirmfoto: "mach die leiste bissen weiter unten
     sonst ist da drunter so viel platz"). Die volle Zone (34 pt am
     iPhone) liess unter den Beschriftungen einen leeren Balken stehen; wie
     bei der Tab-Leiste von iOS selbst duerfen die Ziele naeher an den
     Wisch-Streifen - 16 px Abstand bleiben, ohne iPhone-Zone .25rem. */
  padding: .25rem .5rem max(.25rem, calc(env(safe-area-inset-bottom, 0px) - 16px));
  box-shadow: 0 -8px 20px -16px rgba(0, 0, 0, .35);
}
/* Der Streifen HINTER der schwebenden Leiste (Mathieu, 16.09.2026: "Die
   Menueleiste unten haengt irgendwie in der luft und der hintergrund laeuft
   hinten durch das ist ein bug").
   Er hatte recht, und es war meiner: seit die Leiste schwebt, steht links,
   rechts und unter ihr ein Spalt offen - und da scrollte der Seiteninhalt
   hindurch. Vorher klebte sie randlos am Rand, da konnte nichts vorbei.
   Der Streifen liegt in der Seitenfarbe darunter, geht bis an die Raender
   und bis zur Unterkante und traegt nach oben einen weichen Verlauf, damit
   der Inhalt nicht an einer harten Kante abgeschnitten wird. Die Leiste
   sieht damit weiter frei stehend aus - nur hinter ihr ist zu. */
.unterleiste::before { content: none; }
.ulziel {
  position: relative; display: flex; flex-direction: column; align-items: center; gap: .125rem;
  padding: .5rem .25rem calc(.5rem);
  font-size: .625rem; font-weight: 700; letter-spacing: .03em; text-transform: uppercase;
  color: var(--muted); text-decoration: none; cursor: pointer;
  min-height: 52px; justify-content: center;
}
.ulziel svg { width: 21px; height: 21px; display: block; }
.ulziel:hover { color: var(--text); text-decoration: none; }
/* Wo man steht, ist eine gefuellte Pille - nicht nur eine andere Farbe.
   In der Vorlage ist genau das der Griff, an dem man sich orientiert.
   Seit dem 17.09.2026 (Mathieu: "ich will das es so aussieht") in Orange
   statt im Marine-Akzent, dieselbe feste Farbe wie die Hero-Karte auf
   Start - kein Hell/Dunkel-Paar, aus demselben Grund wie dort. */
/* Seit dem 14.10.2026 im GRUNDSTIL Marine getoent statt Orange (Mathieu,
   05.10.2026: "nimm im hellen Modus auch das Orange raus", und 14.10.2026
   "B1"): das Orange stand hier noch, nur die Team-Seite hatte es fuer sich
   ueberschrieben. Eine Leiste in der Planung waere ohne Zusatz orange
   gewesen - im ersten Entwurf genau so passiert. Jetzt traegt der Grundstil
   dieselbe Tinte wie die Handlung; der Nachtmodus der Team-Seite hat seine
   eigene Regel und bleibt davon unberuehrt. */
.ulziel.aktiv { color: #283045; background: #DDE0E8; border-radius: var(--radius-sm); }
.ulziel.aktiv .ulwort { color: inherit; opacity: .92; }
.ulziel.aktiv::before { content: none; }
.ulziel:focus-visible { outline: 2px solid var(--accent); outline-offset: -3px; }
.ulpunkt {
  position: absolute; top: .3rem; left: 50%; margin-left: .25rem;
  min-width: 16px; height: 16px; border-radius: var(--radius-pille);
  background: var(--accent); color: var(--accent-ink);
  font-size: .625rem; font-weight: 700; line-height: 1;
  display: grid; place-items: center; padding: 0 3px;
}
/* Das Wort unter der Zahl (15.09.2026). Vorher standen in der Leiste zwei
   nackte Zahlen fuer zwei voellig verschiedene Dinge - "21" waren offene
   Schichten, "5" waren Aufgaben, und nichts sagte welche welche ist.
   Kleiner als das Ziel selbst und nicht in Versalien: es ist eine Erklaerung,
   keine zweite Beschriftung. */
.ulwort {
  font-size: .625rem; font-weight: 600; letter-spacing: .01em; text-transform: none;
  line-height: 1.1; color: var(--muted); margin-top: -.125rem;
}
.ulziel.aktiv .ulwort { color: #283045; }
/* Platz fuer die Leiste, damit sie nichts verdeckt. Die Leiste misst mit dem
   Wort darunter 62 px (am 15.09.2026 im Browser gemessen), das Polster liegt
   vier darueber. */
/* 83 px seit dem 16.09.2026: die Leiste ist 69 px hoch und schwebt 10 px
   ueber dem Rand (im Browser gemessen, nicht geschaetzt) - das Polster liegt
   vier darueber, damit der Fuss der Seite sie nicht beruehrt. Die
   Sicherheitszone des iPhones kommt obendrauf; sie steckt in der Leiste
   selbst im "bottom", nicht mehr im Innenabstand. */
body:has(.unterleiste) { padding-bottom: calc(83px + env(safe-area-inset-bottom, 0px)); }

/* --- Planung am Handy (Mathieu, 14.10.2026: "Ich finde gut A2, B1, und B1
   mehr gut") ---------------------------------------------------------------
   Die Leiste der Planung ist DIESELBE Leiste wie im Team (.unterleiste) -
   fest unten, deckend, mit Sicherheitszone - nur mit den Wegen der Planung.
   Am Rechner steht links die Seitenleiste mit allen Zielen, dort gibt es
   keine zweite Navigation unten. Die Grenze ist dieselbe wie bei der
   Seitenleiste (1000 px), damit nie beide fehlen oder beide da sind. */
@media (min-width: 1000px) {
  .unterleiste.planleiste { display: none; }
  body.mit-seite:has(.planleiste) { padding-bottom: 0; }
}
/* Heute, Wartet, Mehr tragen ihren eigenen Kopf - am Handy ohne die
   Kopfzeile darueber. */
@media (max-width: 999px) {
  body.pahandy > .topbar { display: none; }
}
/* Fuenf Plaetze: Team mit "Planung", Planung mit "Ich". */
.unterleiste.ul5 { grid-template-columns: repeat(5, 1fr); }
/* "Ich" stand bis Stufe 4 (24.10.2026) als sechster Platz in der Leiste; seitdem oben auf Heute und in Mehr (views-handy.js) - die Regeln dafuer sind weg. */

.pamain { max-width: 560px; margin: 0 auto; padding: 0 1rem 1.5rem; }
.pakopf { padding: calc(var(--safetop) + 1.125rem) 0 .375rem; }
.paober { font-size: .75rem; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; color: var(--muted); }
.pakopf h1 { font-size: 2rem; line-height: 1.1; margin: .125rem 0; color: var(--text); font-weight: 700; letter-spacing: -.01em; }
.pasub { color: var(--muted); font-size: 1rem; }
.paschnell {
  display: flex; gap: .5rem; overflow-x: auto; margin: .875rem -1rem 0; padding: 0 1rem .125rem;
  scrollbar-width: none;
}
.paschnell::-webkit-scrollbar { display: none; }
.paschnell .paknopf { white-space: nowrap; border-radius: var(--radius-pille); flex: none; }
.pasek { display: flex; align-items: baseline; justify-content: space-between; gap: .75rem; margin: 1.375rem .125rem .5rem; }
.pasek h2 { font-size: 1.125rem; margin: 0; color: var(--text); font-weight: 700; }
.pazahl { color: var(--muted); font-weight: 600; margin-left: .375rem; }
.palink {
  color: var(--text); font-weight: 600; font-size: .875rem; text-decoration: underline; text-underline-offset: 3px;
  min-height: 44px; display: inline-flex; align-items: center;
}
.pahinweis { font-size: .75rem; color: var(--muted); margin: -.25rem .125rem .5rem; }
.pakarte { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-sm); overflow: hidden; margin-bottom: .75rem; }
.pazeile { display: block; padding: .875rem 1rem; border-top: 1px solid var(--hair); position: relative; color: var(--text); text-decoration: none; }
.pazeile:first-child { border-top: 0; }
/* Dringend: die Kante links in der Fehlt-Farbe, wie auf der Uebersicht. */
.pazeile.dringend { box-shadow: inset 4px 0 0 var(--crit); }
.paart { display: block; font-weight: 700; color: var(--muted); font-size: .75rem; letter-spacing: .06em; text-transform: uppercase; margin-bottom: .125rem; }
.paart.rot { color: var(--crit); }
.pawas { display: block; font-weight: 700; color: var(--text); font-size: 1rem; }
.pawer { display: block; color: var(--text-soft); font-size: .875rem; margin-top: .125rem; }
/* "Neue Version da" nach einem Deploy (Audit 18.10.2026, Nr. 22): fest ueber der
   Unterleiste, wie die Rueckmeldung nach dem Eintragen. */
.banner.neuversion { position: fixed; left: 1rem; right: 1rem; bottom: calc(5.75rem + env(safe-area-inset-bottom, 0px)); z-index: 70; margin: 0; display: flex; align-items: center; justify-content: space-between; gap: .75rem; box-shadow: 0 2px 10px rgba(0,0,0,.18); }
/* Hinweis beim Selbsteintragen (Ruhezeit ...), Audit 18.10.2026 Nr. 2 */
.pawer.rot { color: var(--crit); }
.paknoepfe { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem; margin-top: .625rem; }
.paform { margin: 0; display: inline-flex; }
.paform.breit { display: flex; width: 100%; }
/* Eine Tinte: Handlung ist Marine, und WAS es fuer eine ist, sagt die Form -
   gefuellt (die naheliegende), umrandet (die andere), unterstrichen (leise). */
.paknopf {
  min-height: 44px; padding: 0 1rem; border-radius: var(--radius-xs);
  font-family: inherit; font-weight: 600; font-size: 1rem; line-height: 1.1;
  display: inline-flex; align-items: center; justify-content: center; gap: .375rem;
  border: 1.5px solid var(--accent); background: transparent; color: var(--accent);
  text-decoration: none; cursor: pointer;
}
.paknopf:hover { text-decoration: none; background: var(--accent-soft); }
.paknopf.voll { background: var(--accent); color: var(--accent-ink); }
.paknopf.leise { border-color: transparent; text-decoration: underline; text-underline-offset: 3px; padding: 0 .5rem; }
.paknopf.breit { width: 100%; }
.paok { background: var(--ok-soft); }
.paokzeile { display: flex; align-items: center; gap: .375rem; color: var(--ok); font-weight: 700; }
.paokzeile svg { width: 18px; height: 18px; flex: none; }
.paerr { background: var(--crit-soft); }
.paerr .pawas { color: var(--crit); }
.padienst { display: flex; align-items: center; gap: .75rem; padding: .625rem 1rem; min-height: 64px; border-top: 1px solid var(--hair); }
.padienst:first-child { border-top: 0; }
.paav {
  width: 40px; height: 40px; border-radius: 50%; flex: none; display: grid; place-items: center;
  background: var(--accent-soft); color: var(--text); font-weight: 700; font-size: .75rem;
}
/* "du" in Gruen: Gruen heisst in der Planung "deins" und "gut". */
.paav.ich { background: var(--ok-soft); color: var(--ok); }
.pamitte { flex: 1; min-width: 0; display: flex; flex-direction: column; }
.paname { font-weight: 700; color: var(--text); }
.padu { color: var(--muted); font-weight: 600; }
.pazeit { color: var(--muted); font-size: .875rem; }
.pastatus { font-size: .75rem; font-weight: 700; letter-spacing: .04em; text-transform: uppercase; color: var(--muted); white-space: nowrap; }
.pastatus.laeuft { color: var(--ok); }
.pastatus.krank { color: var(--crit); }
.paluecke { padding: .875rem 1rem; border-top: 1px solid var(--hair); box-shadow: inset 4px 0 0 var(--crit); }
.paluecke:first-child { border-top: 0; }
.pafehlt { color: var(--crit); font-weight: 700; font-size: .75rem; letter-spacing: .06em; text-transform: uppercase; }
.pavor { display: flex; flex-wrap: wrap; gap: .5rem; margin-top: .625rem; }
.pavor .paknopf { padding: 0 .75rem 0 .375rem; border-radius: var(--radius-pille); }
.pamini {
  width: 32px; height: 32px; border-radius: 50%; display: grid; place-items: center;
  background: var(--accent-soft); color: var(--text); font-size: .625rem; font-weight: 700;
}
.pali {
  display: flex; align-items: center; gap: .75rem; min-height: 52px; padding: .5rem 1rem;
  border-top: 1px solid var(--hair); color: var(--text); text-decoration: none; font-weight: 600;
}
.pali:first-child { border-top: 0; }
.pali:hover { text-decoration: none; background: var(--fill); }
.pali > svg { width: 18px; height: 18px; color: var(--muted); flex: none; }
button.pali { width: 100%; border: 0; background: none; font: inherit; text-align: left; cursor: pointer; }
.paicon { width: 32px; height: 32px; flex: none; display: grid; place-items: center; color: var(--text-soft); }
.paicon .ic { width: 20px; height: 20px; }
.pabz {
  background: var(--accent); color: var(--accent-ink); border-radius: var(--radius-pille);
  min-width: 22px; height: 22px; font-size: .75rem; font-weight: 700; display: grid; place-items: center; padding: 0 .375rem;
}
.pagruppe { font-size: .75rem; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; color: var(--muted); margin: 1.125rem .25rem .375rem; }
.pagruppe2 { margin-top: .5rem; }
.paab { margin-top: 1.125rem; }
/* Krank eintragen: zu, bis die Schnelltaste dorthin springt (:target) -
   reines CSS, kein Skript. */
.pakrank:not(:target) { display: none; }
.pakrank { scroll-margin-top: calc(var(--safetop) + .5rem); }
.pakrankform { display: flex; flex-direction: column; gap: .75rem; padding: 1rem; }
.pakrankform .field { margin: 0; }
.pakrankform select, .pakrankform input { min-height: 44px; }
.pazwei { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: .75rem; }
/* Datumsfelder haben eine Mindestbreite vom Browser - ohne das ragte "Bis"
   bei 390 px ueber den Kartenrand. */
.pakrankform input[type=date] { width: 100%; min-width: 0; }
/* Uebersicht am Rechner: die Tasten unter der Zeile, die Kante laeuft mit. */
.uzeilebox + .uzeilebox { border-top: 1px solid var(--hair); }
.uzeilebox .paknoepfe { margin: 0; padding: 0 0 .625rem; }
.uzeilebox .paknoepfe.dringend { padding-left: .75rem; box-shadow: inset 4px 0 0 var(--crit); }
/* Tagesleiste der Planung: ein Punkt fuer "hier wartet eine Eintragung auf
   dich" - die Zahl im Feld bleibt die Luecke (14.10.2026). */
.wsztag:has(.wszwartet) { position: relative; }
.wszwartet { position: absolute; top: 4px; right: 4px; width: 7px; height: 7px; border-radius: 50%; background: var(--accent); }
.wsztag.ist-an .wszwartet { background: var(--accent-ink); }
/* "Das bin ich" auf der Personenseite. */
.pzteil { margin-top: 1rem; padding-top: .75rem; border-top: 1px solid var(--hair); }
.pzteil h3 { font-size: 1rem; margin: 0 0 .25rem; }
.pzform { display: inline-flex; margin: .25rem .5rem 0 0; }
.pzandere { display: flex; flex-wrap: wrap; align-items: flex-end; gap: .5rem; margin-top: .75rem; }
.pzandere .field { margin: 0; flex: 1 1 14rem; }
/* Die Schublade liegt darueber (z-index 60) - sie soll die Leiste verdecken,
   nicht neben ihr stehen. */

/* --- Die Stempelkarte auf der Startseite --------------------------------
   Ganz oben, ueber der Woche: sie sagt, was JETZT gilt, und die Woche sagt,
   was diese Woche gilt. Laeuft eine Schicht, ist die Karte deutlich
   sichtbar - wer das Ausstempeln vergisst, soll es beim Aufmachen merken. */
.stkarte {
  background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius);
  padding: .75rem 1rem 1rem; margin-bottom: 1rem;
  position: relative; isolation: isolate;
}
.stkarte::after {
  content: ""; position: absolute; inset: 0; border-radius: inherit;
  pointer-events: none; z-index: 0;
  background-image: var(--korn); opacity: .1; mix-blend-mode: multiply;
}
.stkarte > * { position: relative; z-index: 1; }
/* Laufende Schicht: gruen umrandet und gruen hinterlegt. In Pause: gold.
   Dieselbe Sprache wie ueberall sonst in der App. */
.stkarte.laeuft { border-color: var(--gruen); box-shadow: inset 0 0 0 1px var(--gruen); background: rgba(66, 113, 74, .07); }
.stkarte.pausiert { border-color: var(--gold); box-shadow: inset 0 0 0 1px var(--gold); background: rgba(201, 169, 110, .1); }
.stkopf { display: flex; align-items: center; gap: .5rem; flex-wrap: wrap; margin-bottom: .25rem; }
.stheute { font-size: .75rem; color: var(--muted); margin-left: auto; }
.stmehr { margin-left: auto; font-size: .75rem; font-weight: 600; color: var(--muted); text-decoration: none; }
.stmehr:hover { color: var(--text); }
.stzahl {
  font-family: Anton, "Archivo Black", sans-serif; font-weight: 400;
  font-size: 2.7rem; line-height: 1; letter-spacing: .005em;
  font-variant-numeric: tabular-nums; color: var(--gruen);
}
.stkarte.pausiert .stzahl,
.heutekopf.pausiert .stzahl { color: var(--warn); }
.stunten { font-size: .75rem; color: var(--muted); margin-top: .125rem; }
.stpause {
  margin: .5rem 0 0; padding: .5rem .75rem; border-radius: var(--radius-xs);
  background: var(--warn-soft); color: #4A3B14; font-size: .875rem; font-weight: 600;
}
@media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) .stpause { color: var(--text); } }
:root[data-theme="dark"] .stpause { color: var(--text); }
.stknoepfe { display: flex; gap: .5rem; margin-top: .75rem; }
/* Die Knoepfe sind das, was man im Vorbeigehen trifft: volle Breite, 48 px
   hoch. Die Hauptsache liegt rechts, wo der Daumen ist. */
.stknoepfe form { flex: 1 1 0; min-width: 0; }
.stkarte .stknopf {
  width: 100%; min-height: 48px; font-size: 1rem; padding: .5rem .5rem;
}
.stkarte > form .stknopf { min-height: 52px; font-size: 1rem; }

/* --- Stempeln gegen Fehltipps (Mathieu, 05.10.2026) ----------------------
   Beginnen fragt IMMER nach (Fenster bzw. eigene Seite), Beenden wird
   gezogen. Der Schieber greift erst mit Skript (.js-ziehen am <html>, gesetzt
   von ZIEHEN_SCRIPT) - ohne Skript ist es der Knopf wie vorher, mit
   Rueckfrage. Das Tablet (/w/kiosk) hat keinen Schieber. */
.ziehknopf {
  position: relative; overflow: hidden;
  -webkit-user-select: none; user-select: none; -webkit-touch-callout: none; touch-action: manipulation;
}
.ziehgriff { display: none; }
.js-ziehen .ziehknopf {
  touch-action: pan-y; min-height: 60px; padding-left: 4rem; padding-right: 1rem; border-radius: var(--radius-pille);
}
.js-ziehen .ziehgriff {
  display: flex; align-items: center; justify-content: center; position: absolute; z-index: 1;
  left: 6px; top: 50%; width: 48px; height: 48px; margin-top: -24px; border-radius: var(--radius-pille);
  background: var(--surface); color: var(--text); box-shadow: var(--schatten-2); transition: transform .2s ease-out;
}
.ziehknopf.zieht .ziehgriff { transition: none; }
.ziehknopf.zieht .ziehwort { opacity: .45; }
.ziehgriff svg { width: 22px; height: 22px; fill: none; stroke: currentColor; stroke-width: 2.4; stroke-linecap: round; stroke-linejoin: round; }
.ziehwort { position: relative; }
/* Nebeneinander waere der Schieber zu kurz: dann untereinander. */
.js-ziehen .hkzwei:has(.ziehknopf), .js-ziehen .stknoepfe:has(.ziehknopf) { flex-direction: column; }
@media (prefers-reduced-motion: reduce) { .js-ziehen .ziehgriff { transition: none; } }
/* Die zweite Zeile im Rueckfrage-Fenster: Uhrzeit und Schicht. */
.confirm-dialog .cdzeile { margin: -.25rem 0 1rem; font-size: 1rem; color: var(--text-soft); font-variant-numeric: tabular-nums; }
.confirm-dialog .btn.beginnja { min-height: 48px; }
/* Dieselbe Frage als Seite (ohne Skript). */
.beginnfrage { text-align: center; }
.beginnfrage h1 { margin: .25rem 0 .5rem; }
.bfzeile { margin: 0 0 .25rem; font-size: 1.125rem; color: var(--text-soft); font-variant-numeric: tabular-nums; }
.bfzeile b { color: var(--text); }
.bfhinweis { margin: 0 0 .25rem; font-size: .875rem; color: var(--text-soft); }
.bfform { margin: 1.25rem 0 .75rem; }
.bfabbrechen { width: 100%; min-height: 48px; }

/* --- Entwurf erkennbar (05.10.2026) ---------------------------------------
   Ruhig, grau mit Kante - keine neue Farbe: ein Entwurf ist kein Fehler. */
.entwurfhinweis {
  margin: 0 0 1rem; padding: .5rem .75rem; border-radius: var(--radius-sm);
  background: var(--fill); box-shadow: inset 3px 0 0 var(--muted);
  color: var(--text-soft); font-size: .875rem; font-weight: 500; line-height: 1.4;
}
.entwurfhinweis b { color: var(--text); font-weight: 600; }
.woffen.entwurfhinweis { margin: .5rem 0 0; color: var(--text-soft); font-size: .875rem; font-weight: 500; }
/* Im Streifen: ein gestrichelter Rahmen je Tag der Entwurfswoche. */
.wszentwurf { display: inline-block; width: 10px; height: 8px; border: 1px dashed var(--muted); border-radius: 2px; vertical-align: 0; }
/* Im Wochenblock der Startseite: dieselbe Markierung an der Tageszahl. */
.wtag.entwurf .wtag-num { outline: 1px dashed var(--border-strong); outline-offset: 2px; border-radius: var(--radius-xs); }

/* --- Deine Woche: der Wochenblock der Startseite -----------------------
   Nach Mathieus Vorlage ("OUR WEEK", 07.09.2026), Fassung "Tinte". Die fuenf
   Variablen sind der ganze Farbentwurf - eine andere Fassung (z. B. der
   dunkle "Nachtblock") stellt nur sie um, keine der Regeln darunter. */
.wblock {
  --ink: var(--marine-ink, #2C3A47);
  /* Hier stand die Variable fuer die Farbe AUF der Tinte, gebraucht von der
     gefuellten Event-Marke. Die Marke ist am 11.09.2026 einer eigenen Zeile gewichen,
     die auf dem Tag steht und nicht auf der Tinte - damit hat die Variable
     keinen Verbraucher mehr. Die Lehre dahinter gilt weiter und steht jetzt
     an der Zeile: Schrift auf einer Flaeche muss MIT dem Modus drehen, sonst
     steht im Nachtmodus creme auf creme. */
  --akzent: var(--accent);
  --heute-ink: var(--accent-ink);
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 1rem .75rem 1rem;
  margin-bottom: 1rem;
  position: relative; isolation: isolate;
}
/* Der Wochenblock setzt seinen Grund selbst (eine Zeile weiter oben) und
   stand damit NACH der Bereichsregel - er hat sie stumm ueberschrieben.
   Zwei Klassen statt einer, dann gewinnt der Ton. Am Bild gemessen:
   alle anderen Karten waren getoent, diese eine nicht. */
.wblock.ton-woche { background: var(--p-woche); border-color: transparent;
  box-shadow: inset 4px 0 0 var(--p-woche-ink); }
.wblock::after {
  content: ""; position: absolute; inset: 0; border-radius: inherit;
  pointer-events: none; z-index: 0;
  background-image: var(--korn); opacity: .1; mix-blend-mode: multiply;
}
.wblock > * { position: relative; z-index: 1; }
/* Der Kopf sagt jetzt, was die Woche BEDEUTET (16.09.2026): "4 Schichten ·
   34 Std" statt nur "DEINE WOCHE". Das ist das Erste, was man wissen will,
   und es stand bis dahin nirgends. Die dicke Linie darunter faellt weg - der
   Block braucht keinen Unterstrich, er hat eine eigene Flaeche. */
.wkopf {
  display: flex; align-items: flex-end; justify-content: space-between; gap: .5rem;
  padding-bottom: .125rem;
}
.wkopftext { display: flex; flex-direction: column; gap: .125rem; min-width: 0; }
.wkicker {
  font-size: .625rem; font-weight: 700; letter-spacing: .13em; text-transform: uppercase;
  color: var(--muted);
}
/* Anton, die vierte Schrift der App - und die einzige Stelle, an der die
   Vorlage wirklich hoerbar wird. Eine echte Rueckfallkette dahinter: laedt
   Google nicht, sieht es anders aus, aber nie kaputt. */
.wsumme {
  font-family: Anton, "Archivo Black", var(--f-text), sans-serif; font-weight: 400;
  font-size: 1.5rem; line-height: 1.05; letter-spacing: .01em;
  color: var(--ink);
}
.wsumme.leer { color: var(--muted); }
.wspanne {
  /* Ein Link von 19 px Hoehe ist kein Ziel (gemessen 08.09.2026). Er steht
     als Bildunterschrift unter der Wochenleiste, darum keine 44 - aber
     mindestens die 24, die als Untergrenze gelten. */
  display: inline-flex; align-items: center; min-height: 24px;
  font-size: .625rem; font-weight: 700; letter-spacing: .08em; text-transform: uppercase;
  color: var(--muted); padding-bottom: .125rem; text-decoration: none; white-space: nowrap;
}
.wspanne:hover { color: var(--ink); }
/* Tippziel 44 px, ohne die Zeile hoeher zu machen (Team-Ansicht, 15.10.2026):
   eine unsichtbare Erweiterung wie beim Schichtnamen (.skname::after). */
.wspanne { position: relative; }
.wspanne::after { content: ''; position: absolute; left: -6px; right: -6px; top: -10px; bottom: -10px; }
.woffen {
  font-size: .75rem; color: var(--warn); font-weight: 600; margin: .5rem 0 0;
}
/* Die Woche war bis zum 16.09.2026 eine TABELLE: ein durchgezogenes Gitter um
   jede Zelle. Das war das Letzte in der App, das nach Tabellenkalkulation
   aussah - Zeilen brauchen keine Kaesten.
   Jetzt der RHYTHMUS (Mathieu, 16.09.2026): ein ARBEITSTAG ist eine eigene
   Karte, ein FREIER TAG nur eine leichte Zeile. Damit sieht man die Woche,
   ohne ein Wort zu lesen - wo etwas steht, wird gearbeitet.
   Das kostet Hoehe, und das ist der Handel: die Arbeitstage bekommen Gewicht,
   dafuer scrollt man die letzten Tage herein. */
.wtage { display: flex; flex-direction: column; gap: .5rem; margin-top: .5rem; }
.wtag {
  display: grid; grid-template-columns: 38px 1fr; align-items: center; gap: .75rem;
  border: 0; border-radius: var(--radius); min-height: 44px;
  padding: .5rem .75rem; color: inherit; text-decoration: none;
  background: var(--surface);
}
.wtag:hover { background: var(--fill); }
/* Heute: die Karte bekommt eine Kante in der Akzentfarbe. Im ganzen Block
   sind nur zwei Dinge farbig - HEUTE und "hier fehlt jemand". Die Kante
   allein war zu leise (Mathieu, 19.09.2026: "bitte 'Heute' schreiben das
   man direkt sieht ahhh das ist heute") - jetzt steht das Wort rechts in
   der Zeile, eine dritte Spalte nur an diesem einen Tag. */
.wtag.heute { box-shadow: inset 3px 0 0 var(--akzent); grid-template-columns: 38px 1fr auto; }
.wheute { font-size: .625rem; font-weight: 800; letter-spacing: .05em; text-transform: uppercase; color: var(--akzent); }
.wtag-num {
  color: var(--ink); display: flex; flex-direction: column-reverse; align-items: center;
  justify-content: center; gap: .125rem;
}
.wtag-num b { font-family: Anton, "Archivo Black", sans-serif; font-weight: 400; font-size: 1.3125rem; line-height: 1; }
.wtag-num span { font-size: .625rem; font-weight: 700; letter-spacing: .07em; color: var(--muted); }
.wtag.heute .wtag-num b { color: var(--ink); }
/* Ein freier Tag ist keine Karte: keine Flaeche, weniger Hoehe, alles
   gedaempft. Genau daran erkennt man ihn, bevor man "frei" gelesen hat. */
.wtag.frei {
  background: color-mix(in srgb, var(--ink) 4%, transparent);
  min-height: 38px; padding: .25rem .75rem;
}
/* Krank gemeldet (04.10.2026): die Schicht steht als Nachweis da. Fehler-
   Familie statt --news (Rot ist dort fuer Neuigkeiten reserviert); das Wort
   "krank" steht immer im Text, die Farbe ist nur Verstaerkung. */
.wtag.krank {
  background: var(--crit-soft); box-shadow: inset 4px 0 0 var(--crit);
}
.wschicht.wkrank { color: var(--text-soft); }
.wschicht.wkrank b { color: var(--crit); font-weight: 800; }
.hkkrank .hkfreikopf b { color: var(--crit); }
.wtag.vergangen { opacity: .5; }
.wtag-inhalt { padding: 0; display: flex; flex-direction: column; justify-content: center; min-width: 0; gap: .125rem; }

/* Der Zeitbalken. EINE Skala in jeder Zeile, 11 bis 3 Uhr (Mathieu,
   16.09.2026) - der Tag, den dieses Haus hat. Zwei Balken sind damit
   vergleichbar, und genau darin liegt der Nutzen.
   Ein Ende, das ABGESCHNITTEN ist (eine Schicht ab 09:00 oder ueber 3 Uhr
   hinaus), bleibt eckig. Ein rundes Ende behauptet "hier faengt es an". */
.wbahn {
  position: relative; display: block; height: 5px; border-radius: var(--radius-pille);
  background: color-mix(in srgb, var(--ink) 12%, transparent); margin: .125rem 0 .125rem;
}
.wbalken {
  position: absolute; top: 0; bottom: 0; border-radius: var(--radius-pille); background: var(--ink);
}
.wbalken.vorher { border-top-left-radius: 1px; border-bottom-left-radius: 1px; }
.wbalken.nachher { border-top-right-radius: 1px; border-bottom-right-radius: 1px; }
.wschicht { font-weight: 650; font-size: .875rem; letter-spacing: -.01em; }
.wzeit { font-weight: 500; white-space: nowrap; }
.wfrei { font-size: .875rem; color: var(--muted); }
.wtag.frei .wtag-inhalt { color: var(--muted); }
.wunten { display: flex; align-items: center; gap: .25rem; flex-wrap: wrap; font-size: .625rem; margin-top: .125rem; }
.wmarke { font-size: .625rem; font-weight: 600; white-space: nowrap; }
.wmarke.ok { color: var(--ok); }
.wmarke.wartet { color: var(--warn); }
/* Ein Event, das FESTSTEHT, ist keine Marke mehr, sondern eine eigene Zeile
   (Mathieu, 11.09.2026: "kommen mir die Events zu wenig raus mach die
   auffaelliger"). Es traegt dieselbe Groesse wie eine Schicht - was am Abend
   im Haus passiert, ist keine Fussnote unter "frei". */
.wevent {
  display: flex; align-items: baseline; gap: .25rem;
  margin-top: .125rem; min-width: 0;
}
/* Punkt und Name in Signalorange (Mathieu, 11.09.2026: "bitte events auch
   orange"). Dieselbe Farbe wie "das hier ist gerade offen" und keine zweite
   erfundene: ein zweites Orange waere schlimmer als ein Orange mit zwei
   Bedeutungen, und die beiden Stellen begegnen sich auf keinem Bildschirm -
   die markierte Zeile lebt in Checklisten und im Hub-Reiter, der Event im
   Wochenblock und im Monatskalender.
   Kontrast auf dem getoenten Tag: hell 5,10, dunkel 7,31 - nachgerechnet. */
.wevpunkt {
  flex: none; width: 6px; height: 6px; border-radius: 50%;
  background: var(--wahl); align-self: center;
}
.wevname {
  font-weight: 700; font-size: .875rem; letter-spacing: -.01em; color: var(--wahl);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0;
}
.wevzeit {
  flex: none; font-size: .75rem; font-weight: 600; color: var(--muted);
  font-variant-numeric: tabular-nums;
}
/* Die Toenung liegt auf dem ganzen Tag, nicht nur auf der Zeile - dieselbe
   Sprache wie im Monatskalender im Backend (getoente Flaeche + Punkt, von
   Mathieu am 10.09.2026 gewaehlt), bis hin zum selben Farbwert.
   Als box-shadow und nicht als background: der Tag hat schon einen
   Hintergrund fuers Ueberfahren, und zwei Regeln um dieselbe Eigenschaft
   heben sich gegenseitig auf - genau dieser Fehler ist mir im Kalender
   schon einmal passiert. */
.wtag.mit-event { box-shadow: inset 0 0 0 999px var(--event-ton); }
.wtag.mit-event:hover { box-shadow: inset 0 0 0 999px var(--event-ton-stark); }
/* Und ein Punkt in der Zahlenspalte, damit man beim Ueberfliegen der linken
   Spalte allein sieht, an welchen Tagen etwas laeuft. */
.wtag.mit-event .wtag-num::after {
  content: ""; width: 5px; height: 5px; border-radius: 50%;
  background: var(--wahl); margin-top: .125rem;
}
/* Auf dem getoenten Tag standen "bestaetigt" und "wartet" knapp unter 4,5:1
   (gemessen 4,41 und 3,93 hell, 3,96 dunkel) - die Toenung frisst genau die
   Luft, die diese beiden Toene ohnehin kaum haben. Sie bekommen die
   Kartenfarbe unter sich zurueck, damit ihr Kontrast der unveraenderte
   gegen die Karte bleibt. Der Fehler kam mit meiner Toenung von vorhin. */
.wtag.mit-event .wmarke.ok, .wtag.mit-event .wmarke.wartet {
  background: var(--surface); border-radius: var(--radius-klein); padding: .125rem .25rem;
}
/* Und "frei" wird eine Stufe kraeftiger: --muted auf der Toenung ist knapp,
   --text-soft hat die Luft (6,07 hell, 7,00 dunkel). */
.wtag.mit-event.frei .wtag-inhalt { color: var(--text-soft); }
/* Deine Schicht, fest oder noch nicht (Mathieu, 06.10.2026: "so einen
   rahmen machen um die bestaetigten schichten auf der startseite", Variante
   C aus nachweise/rahmen-woche/). Bestaetigt: gruener Rahmen, gruen
   getoent, Datum gruen - Gruen heisst in der ganzen App "deins". Wartet:
   gestrichelt, wie die wartende Karte auf der Schichten-Seite. Der Rahmen
   ersetzt an diesem Tag die Heute-Kante; "Heute" steht als Wort daneben.
   Steht hinter .wtag.heute und .wtag.mit-event, damit er beide schlaegt. */
.wtag.bestaetigt { background: var(--ok-soft); box-shadow: inset 0 0 0 2px var(--ok); }
.wtag.bestaetigt:hover { background: color-mix(in srgb, var(--ok) 20%, var(--surface)); }
.wtag.bestaetigt.mit-event { box-shadow: inset 0 0 0 2px var(--ok), inset 0 0 0 999px var(--event-ton); }
.wtag.bestaetigt .wtag-num b, .wtag.bestaetigt .wtag-num span { color: var(--ok); }
.wtag.wartet { outline: 1.5px dashed var(--muted); outline-offset: -1.5px; }

/* Eine IDEE bleibt ein Umriss unter den Marken: sie ist nichts Festes, und
   sie darf nicht so gelesen werden. */
.wmarke.event.idee {
  background: transparent; color: var(--muted);
  border: 1px dashed var(--border-strong); border-radius: var(--radius-klein);
  font-size: .625rem; font-weight: 600; letter-spacing: .05em; text-transform: uppercase;
  padding: .125rem .25rem;
}
/* "3 Schichten offen" war ein gestricheltes Kaestchen in Versalien - in
   JEDER Zeile. Gestrichelt plus Rahmen plus Versalien sind drei Signale fuer
   eine Nebensache, und sie riefen lauter als die eigene Schicht daneben
   (16.09.2026). Jetzt ist es unterstrichener Text in der Akzentfarbe: der Weg
   dorthin bleibt an jedem Tag erhalten, er draengelt nur nicht mehr. */
.wmarke.fehlt {
  color: var(--akzent); font-size: .75rem; font-weight: 600;
  text-decoration: underline; text-underline-offset: 2px;
}
/* Hier standen die Regeln fuer den Block "Was laeuft" (.ublock/.uzeile).
   Sie sind mit dem Block selbst weg - und das war hoechste Zeit: ".uzeile"
   gibt es schon, die Uebersichtsseite baut damit ihre Aktivitaetenliste
   (views-uebersicht.js). Meine Regel stand SPAETER im Stylesheet, gleiche
   Spezifitaet, also hat sie gewonnen und aus der Liste dort still ein
   Drei-Spalten-Raster gemacht. Fuenfter Fall derselben Fehlerfamilie in
   dieser Woche, und wieder nur an einer Messung zu sehen, nicht im Code.

/* Hier stand eine Regel, die die Zeilen ab 720 px in sieben Spalten dreht -
   so wie im Entwurf. Am echten Bildschirm gemessen war das falsch: der
   Hauptteil der Startseite ist auf 720 px begrenzt (main.wrap.narrow), eine
   Spalte waere also HOECHSTENS 102 px breit, und die breiteste Marke
   ("SONY MUSIC · FIRMENFEIER · AB 18:00") braucht 196. Fuenf von sieben
   Spalten liefen ueber.

   Im Entwurf sah die Spaltenfassung gut aus, weil ich ihr dort 900 px
   gegeben habe. Sieben lesbare Spalten gehen auf dieser Seite nie - die
   Zeilen sind das Design, bei jeder Breite. */


/* Aufklappbares Feld fuer eigene Zeiten beim Eintragen. Zugeklappt ist der
   Normalfall - an einem Tag stehen hier mehrere Schichten, und zwei offene
   Zeitfelder je Schicht haetten die Seite zugeschuettet, damit die Ausnahme
   einen Tap spart. */


/* Hier standen die Regeln fuer die Schnellzugriff-Kacheln (.sechead,
   .quick, .qi), fuer die Kacheln (.tile/.tiles), fuer den Kopf der
   Mitarbeiterseite (.hero) und fuer den Wochenstreifen im Deckblock
   (.deckwoche/.dwtag). Alle vier sind im Laufe des Umbaus durch etwas
   anderes ersetzt worden - das Markup war jedes Mal weg, die Regeln blieben
   stehen. Am 11.09.2026 nachgezaehlt: 49 Klassen, die es nur noch hier gab.

   Die Pruefung dazu steht in totes-css.test.js und laeuft bei jedem Testlauf
   mit: was im Stylesheet steht und in keiner Programmdatei vorkommt, faellt
   auf. Tests zaehlen dabei NICHT als Verwendung - eine Behauptung ueber eine
   Regel haelt die Regel nicht am Leben. */


/* --- Team-Hub-Listen -----------------------------------------------------
   Der Status ist der Knopf. In Notion klickt man dieselben drei Werte durch,
   also hier auch: Offen -> Laeuft -> Erledigt. Rand + Schatten + Druck-Effekt
   (Mathieu, 06.09.2026: "mach den Button kenntlicher als Button" - vorher nur
   eine flache Farbflaeche ohne Kontur, sah eher wie ein Etikett als ein
   Knopf aus). */
/* --- EINE Schicht gross (Mathieu, 16.09.2026) ---------------------------
   "wenn man bei eintragen auf eine einzelnen schicht klickt sollte man in
   eine groessere ansicht mit vollen namen und mehr infos kommen." */
.sdzurueck {
  display: inline-flex; align-items: center; gap: .25rem; min-height: 44px;
  font-size: .875rem; font-weight: 600; color: var(--text-soft); text-decoration: none;
}
.sdzurueck:hover { color: var(--text); text-decoration: underline; }
.sdkarte { background: var(--p-tag); box-shadow: inset 4px 0 0 var(--p-tag-ink); border-color: transparent; }
.sdkarte.meine { box-shadow: inset 4px 0 0 var(--ok); }
.sdname {
  font-family: Anton, "Archivo Black", sans-serif; font-weight: 400;
  font-size: 1.7rem; line-height: 1.1; margin: .125rem 0 .125rem;
}
.sdzeit { font-size: 1rem; font-weight: 600; margin: 0; font-variant-numeric: tabular-nums; }
/* Die Spur bekommt hier mehr Luft als in der Liste: sie ist nicht mehr eine
   Zeile unter vielen, sondern die Auskunft der Karte. */
.sdkarte .skspur { margin: 1rem 0 1.25rem; height: 7px; }
.sdstand { margin: 0; font-size: .875rem; }
.sdfehlt { color: var(--crit); font-weight: 700; }
.sdvoll { color: var(--ok); font-weight: 700; }

/* Die vollen Namen - dafuer ist diese Seite da. Ein Kreis, der Name, der
   Zustand: was in der Zeile drei Buchstaben waren, steht hier ausgeschrieben. */
.sdleute { display: flex; flex-direction: column; gap: .5rem; }
.sdperson { display: flex; align-items: center; gap: .5rem; }
.sdperson .skkreis { width: 34px; height: 34px; min-width: 34px; font-size: .75rem; }
.sdwer { display: flex; flex-direction: column; min-width: 0; }
.sdwername { font-size: 1rem; font-weight: 600; }
.sdperson.ich .sdwername { color: var(--ok); }
.sdwerstand { font-size: .75rem; color: var(--muted); }
.sdaktion { margin: 1rem 0 1.25rem; }
.sdaktion .btn { width: 100%; }
.sdgrund {
  margin: 0; padding: .75rem 1rem; border-radius: var(--radius-sm);
  background: var(--fill); color: var(--text-soft); font-size: .875rem;
}


/* --- Die Aufgabe als Karte (Mathieu, 16.09.2026) --------------------------
   Gemessen waren fuenf Aufgaben 1179 px hoch, davon 396 px Text - zwei
   Drittel Drumherum. "Notausgangsschilder pruefen", drei Woerter, kostete
   175 px: 43 px Text, dazu eine Zeile fuer den Status, eine fuer den
   Notiz-Knopf und Polster.
   Jetzt ist die Aufgabe EIN Block statt dreier loser Zeilen zwischen
   Haarlinien - dieselbe Sprache wie Schicht und Wochenblock. */
/* Der Meldeknopf sitzt zwischen Kartenkopf und Liste - mit etwas mehr Luft
   nach unten als nach oben, damit er zur Ueberschrift gehoert und nicht zur
   ersten Aufgabe. */
.hubmelden { margin: .25rem 0 1rem; }
/* "Für dich"/"Für alle" bei den To-Dos und die vier Orte bei "Ordnung" -
   beschriftete Gruppen INNERHALB einer Karte (Mathieu, 18.09.2026: "1 und 2
   zusammen"; 19.09.2026: Ordnung kam dazu). ".hubuntergruppe" und nicht
   ".hubgruppe": die Klasse gibt es schon fuer die Reiter-Familienzeilen
   (siehe .hubgruppen/.hubgruppe/.hubglabel weiter oben) - derselbe Name mit
   anderer Bedeutung waere genau die Verwechslung, vor der der Kommentar bei
   HUB_KATEGORIEN warnt. Dieselbe Kicker-Sprache wie ueberall sonst (siehe
   .kkicker, .tonkicker): klein, fett, Versalien, --muted. */
.hubuntergruppe + .hubuntergruppe { margin-top: .9rem; }
.hubuntergruppenkopf {
  font-size: .625rem; font-weight: 800; letter-spacing: .1em; text-transform: uppercase;
  color: var(--muted); margin-bottom: .5rem;
}
.hublist2 { display: flex; flex-direction: column; gap: .5rem; }
/* Die Karte muss sich von der Seite abheben (Mathieu, 17.09.2026: "aender
   mal die farben. das es sich mehr abhebt"). Im Hellen lagen Seite (94,3 L*)
   und Karte (97,7) nur 3,4 Stufen auseinander, und der Schatten war der
   leiseste der Leiter - die Liste sah aus wie ein Blatt mit Linien statt wie
   Karten. Jetzt zweite Schattenstufe und eine Haarlinie an der Kante: die
   Linie traegt im Hellen, wo Schatten auf hellem Grund kaum sichtbar sind,
   der Schatten im Dunkeln, wo eine Linie verschwindet.
   Das gilt weiter fuer die archivierte Liste (Reiter "Erledigt", steht in
   einem <details class="panel">, ohne eigene Kartenflaeche darunter). */
.hublist2 .hubitem {
  background: var(--surface); border-radius: var(--radius-sm); padding: .75rem .75rem .5rem;
  border: 1px solid var(--border); box-shadow: var(--schatten-2);
}
/* Erst zu EINER Liste mit Haarlinien zusammengelegt (17.09.2026, nach dem
   Entwurf), dann noch am selben Tag zurueck zu eigenen Kaestchen (Mathieu:
   "mach die einzelnen to dos als eigen kästchen oder heb sie irgendwie mehr
   voneinader ab") - mit Haarlinien allein gingen die Aufgaben in der
   Aufzaehlung unter, gerade weil jede jetzt zwei Zeilen (Bereich-Abzeichen,
   Fusszeile mit Pille) mitbringt.
   Diesmal NICHT dieselbe Flaeche wie die Karte drumherum (das war das
   98,3-vs-97,7-Problem von vorhin, nur eine Ebene tiefer): --surface-2 ist
   in beiden Modi eine echte Stufe von --surface entfernt, das Kaestchen
   steht also auch ohne Rand und Schatten sichtbar da. */
.card .hublist2 { gap: .5rem; }
.card .hublist2 .hubitem {
  background: var(--surface-2); border-radius: var(--radius-sm);
  padding: .75rem .75rem .625rem; border: 0; box-shadow: none;
}
/* Spalte OHNE Umbruch: in einer umbrechenden Spalte legt der Browser ein
   Kind, das nicht in die Hoehe passt, in eine ZWEITE SPALTE - und die Karte
   wird breiter als der Bildschirm. Genau das ist hier passiert, am Bild
   gesehen. */
.hublist2 .hubitemrow {
  padding: 0; gap: .25rem; flex-direction: column; align-items: stretch;
  flex-wrap: nowrap; border: 0; min-width: 0;
}
.hublist2 .hubkopf { display: flex; align-items: flex-start; gap: .5rem; min-width: 0; }
.hublist2 .hubitemrow .txt { flex: 1 1 auto; min-width: 0; }
/* Das Bereichs-Abzeichen (18.09.2026, ueberarbeitet - siehe bereichAbzeichen()):
   nur noch das Zeichen selbst, keine Flaeche mehr dahinter (Mathieu: "mach
   die hintergrund farbe der badges mal weg das es nur icons gibt"). Vorher
   war es ein 34-px-Quadrat in voller Farbe mit weissem Symbol; jetzt traegt
   das Symbol die Farbe direkt, kleiner (22 statt 34 px) und "cooler" -
   Kueche und Event sind kuehler gestimmt als die erste Fassung (siehe
   unten). Bewusst DIESELBE Farbe in beiden Modi, wie schon vorher. */
.hubabzeichen {
  flex: none; width: 22px; height: 22px; margin-top: .05rem;
  display: flex; align-items: center; justify-content: center;
}
.hubabzeichen svg { width: 20px; height: 20px; }
/* Ohne die deckende Flaeche ist das Symbol nur noch gegen die Kartenfarbe
   (--surface-2) zu lesen statt gegen sich selbst - ein ganz anderer, viel
   engerer Kontrast-Fall als vorher (5,9-11,7:1 Weiss-auf-Farbe). Deshalb
   heller/weniger gesaettigt als das erste Violett/Smaragd/Himbeer, sonst
   waere der Fliesstext-Kontrast auf hellem UND dunklem Grund nicht zugleich
   zu halten. Nachgerechnet gegen --surface-2, jeweils hell/dunkel:
   Bar 3,85:1 / 3,28:1, Kueche 3,33:1 / 3,79:1, Event 3,15:1 / 4,01:1 - alle
   ueber den 3:1, die fuer ein Icon reichen (kein Fliesstext).
   Kueche und Event zusaetzlich kuehler gedreht (Mathieu: "die farben bissen
   cooler"): Kueche von Smaragd (149°) zu Petrol (166°), Event von Warmrosa
   (335°) zu Magenta (318°) - beides bewusst diesseits der fuer diese App
   gesperrten Blau-Zone. Nebeneffekt: Event lag vorher nur 3° vom
   Office-Bereichston (332°) entfernt, jetzt 14°. Bar blieb, wie es war -
   mit 258° schon der kuehlste der drei Toene. */
/* 05.10.2026: #7E5EC9 -> #866AD2. Auf dem Nacht-Marine-Grund kam das alte
   Violett nur auf 2,87:1 gegen --surface-2; jetzt 3,32:1 dunkel und 3,34:1
   hell - derselbe Farbton, eine Spur heller. */
.hubabzeichen.b-bar { color: var(--abz-bar); }
.hubabzeichen.b-kueche { color: var(--abz-kueche); }
.hubabzeichen.b-event { color: var(--abz-event); }
/* Baeckerei, Allgemein und "kein Bereich" teilen sich dieses eine, leise
   Zeichen (siehe die Begruendung bei BEREICH_NEUTRAL) - dieselbe Tinte, die
   die App ueberall sonst fuer "still" benutzt. */
.hubabzeichen.b-neutral { color: var(--muted); }
/* Die Fusszeile: Angaben links, Bedienung rechts - beides in EINER Zeile,
   wo es passt. Wo nicht, bricht sie um.
   Kurz getestet war sie mit nowrap und Abschneiden: dann ist sie IMMER eine
   Zeile, aber aus "dringend · bis 18.09." wurde "dringend · bis 18.0…".
   Zweiundzwanzig Pixel sind kein Grund, eine Frist halb zu zeigen. */
.hublist2 .hubfuss {
  display: flex; flex-wrap: wrap; align-items: center; gap: .25rem .5rem;
  margin-top: .125rem; min-width: 0;
}
/* Die Angaben nehmen nur, was sie brauchen - nicht die ganze Zeile. Sonst
   steht die Bedienung immer darunter, auch wenn beides nebeneinander passt. */
.hublist2 .hubfuss > .meta { flex: 0 1 auto; min-width: 0; }
.hublist2 .hubitemrow .hubsteuer { margin-left: auto; gap: .5rem; flex: none; }

/* Die Statuspille ruhiger: ohne Versalien und schmaler. Sie steht auf JEDER
   Aufgabe, und in Versalien war der Normalfall das Lauteste auf der Seite -
   fuenf Aufgaben, fuenf Rufe. Die Farbe bleibt, wie sie ist: Gold heisst in
   dieser App "wartet", und genau das tut eine offene Aufgabe.
   Das Schatten-Verbot von hier ist am 17.09.2026 wieder gefallen (Mathieu:
   "ich will das es so aussieht", nach seinem Referenzbild mit den
   gluehenden Pillen) - siehe .statuspill.is-* weiter unten fuer das neue,
   bewusst schwache Gluehen. */
.hublist2 .statuspill {
  text-transform: none; letter-spacing: 0; font-size: .875rem;
  min-width: 3.8rem; border-width: 1.5px;
}

/* Der Titel auf hoechstens zwei Zeilen, antippen zeigt den Rest (Mathieu,
   16.09.2026: "muss immer der ganze text das stehen?"). Dieselbe Geste wie
   beim abgeschnittenen Schichtnamen - eine Bauart, nicht zwei.
   Der Gewinn ist weniger der Platz als der RHYTHMUS: alle Aufgaben fangen
   gleich an, und man ueberfliegt die Liste, statt sie zu lesen. */
.hubtitelbox { min-width: 0; }
.hubtitel {
  display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2;
  overflow: hidden; list-style: none; cursor: pointer;
  /* Die Aufgabe ist die Ueberschrift ihrer Karte und muss auch so aussehen
     (Mathieu, 17.09.2026: „die To-Dos besser lesbar machen"). Vorher .95rem
     in normaler Staerke - eine Spur groesser als die Notiz darunter und
     nicht zu unterscheiden von der Meta-Zeile daneben. */
  font-size: 1.125rem; font-weight: 600; line-height: 1.4;
  letter-spacing: -.012em; color: var(--text);
}
.hubtitel::-webkit-details-marker { display: none; }
.hubtitelbox[open] > .hubtitel { -webkit-line-clamp: unset; overflow: visible; }
.hubtitel:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: var(--radius-klein); }
/* Auch hier: 21 px sind zu wenig fuer etwas, das man antippt. Die Flaeche
   waechst unsichtbar auf 44 - der Titel bleibt, wo er ist. */
.hubtitelbox { position: relative; }
.hubtitel::after {
  content: ''; position: absolute; left: 0; right: 0; top: -11px; bottom: -12px;
}

/* Die Angaben darunter sind Bloecke, keine <br>-Ketten: eine Zeile je Sache,
   und die Dringlichkeit steht IN der Fusszeile statt auf einer eigenen. */
.hublist2 .hubitemrow .meta { display: block; margin-top: .125rem; }
.hublist2 .hubitemrow .fuerzeile { display: flex; flex-wrap: wrap; gap: .25rem; margin-top: .25rem; }
.hubdringend { font-weight: 700; color: var(--warn); }
.hubdringend.is-dringend { color: var(--crit); }

/* Der Notiz-Knopf in der Bedienzeile: still, ohne Flaeche. In derselben
   Zeile steht der Status, und der ist der Knopf, der oefter gedrueckt wird -
   zwei gefuellte Knoepfe nebeneinander streiten nur. */
.nzknopf {
  flex: none; display: inline-flex; align-items: center; justify-content: center;
  min-height: 44px; padding: 0 .5rem; border-radius: var(--radius-pille);
  font-size: .75rem; font-weight: 600; color: var(--text-soft); text-decoration: none;
}
.nzknopf:hover { background: var(--fill); color: var(--text); text-decoration: none; }
.nzknopf.ist-an { background: var(--fill); color: var(--text); }
.nzknopf:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
/* min-height 44: der Statusknopf war 39 px hoch (F19, 18.10.2026) - und er ist
   der haeufigste Tipp der ganzen App. */
.statuspill {
  min-height: 44px;
  flex: none; font: inherit; font-size: .75rem; font-weight: 700;
  letter-spacing: .03em; text-transform: uppercase;
  border: 1.5px solid transparent; border-radius: var(--radius-xs); padding: .5rem .75rem; cursor: pointer;
  min-width: 4.8rem; text-align: center; align-self: flex-start;
  box-shadow: var(--schatten-1);
  transition: transform .1s ease, box-shadow .1s ease, filter .1s ease;
  /* Das runde Abzeichen VOR der Schrift (Mathieu, 17.09.2026, nach seinem
     Referenzbild mit den "In progress/Done/Blocked"-Pillen): dieselbe Zeile,
     Icon und Wort mittig zueinander. */
  display: inline-flex; align-items: center; justify-content: center; gap: .35rem;
}
.statuspill .ic2 {
  width: 16px; height: 16px; border-radius: 999px; flex: none;
  display: flex; align-items: center; justify-content: center;
}
.statuspill .ic2 svg { width: 10px; height: 10px; }
.statuspill.is-offen { background: var(--warn-soft); color: var(--warn); border-color: var(--warn); }
.statuspill.is-laeuft { background: var(--accent-soft); color: var(--accent); border-color: var(--accent); }
.statuspill.is-erledigt { background: var(--ok-soft); color: var(--ok); border-color: var(--ok); }
/* Rund statt eckig, mit einem Icon-Kreis und einem sehr leisen Gluehen in
   der eigenen Statusfarbe (Mathieu, 17.09.2026: "ich will das es so
   aussieht" - nach seinem Referenzbild). Zwei Tage zuvor war Schatten hier
   noch "zu laut" (siehe .hublist2 .statuspill) - jetzt bewusst schwaecher
   als im Referenzbild: eine Pille steht auf JEDER Aufgabe, und fuenf helle
   Ausrufezeichen auf einer Seite waeren wieder das alte Problem. Der
   Icon-Kreis traegt die Statusfarbe SELBST als Flaeche (dieselbe Umkehr wie
   beim Bereichs-Abzeichen: Zeichen in var(--bg), also die Gegenfarbe zur
   satten Flaeche in beiden Modi), das Wort bleibt in der Toenungsfarbe. */
.statuspill { border-radius: var(--radius-pille); }
.statuspill.is-offen .ic2 { background: var(--warn); color: var(--bg); }
.statuspill.is-laeuft .ic2 { background: var(--accent); color: var(--bg); }
.statuspill.is-erledigt .ic2 { background: var(--ok); color: var(--bg); }
.statuspill.is-offen { box-shadow: var(--schatten-1), 0 0 7px -3px var(--warn); }
.statuspill.is-laeuft { box-shadow: var(--schatten-1), 0 0 7px -3px var(--accent); }
.statuspill.is-erledigt { box-shadow: var(--schatten-1), 0 0 7px -3px var(--ok); }
.statuspill:hover { filter: brightness(.96); box-shadow: var(--schatten-3); }
.statuspill:active { transform: translateY(1px); box-shadow: var(--schatten-1); }
.statuspill:focus-visible { outline: none; box-shadow: 0 0 0 3px var(--accent-soft); }

/* Startseiten-Vorschau: To-Dos und Kaufen gerahmt statt in einer
   gemeinsamen, ununterschiedenen Liste (Mathieu, 06.09.2026: "so nen Rahmen
   fuer To-Dos und kaufen und nicht einfach leer drinstehend"). */
.hubsubcard { border: 1px solid var(--hair); border-radius: var(--radius-sm); background: var(--fill); padding: .75rem 1rem; margin-top: .75rem; }
.hubsubcard:first-of-type { margin-top: 0; }
.hubsubcard-head { font-size: .75rem; font-weight: 700; letter-spacing: .06em; text-transform: uppercase; color: var(--muted); margin-bottom: .5rem; }
.hubsubcard .hubitemrow-list .hubitemrow { padding: .5rem 0; }
/* Die Team-Hub-Karte auf der Startseite ist als GANZES der Weg in den Hub
   (Mathieu, 07.09.2026: "sobald man irgendwo auf das Feld klickt sollte man
   auf den Team Hub kommen"). Sie ist darum ein <a> - und ein Link muss
   aussehen und sich anfassen lassen wie einer, sonst ist die Flaeche eine
   versteckte Falle. */
.card.hubkarte {
  display: block; color: inherit; text-decoration: none;
  transition: border-color .12s ease, transform .12s ease;
}
.card.hubkarte:hover { border-color: var(--border-strong); }
.card.hubkarte:active { transform: scale(.995); }
.card.hubkarte:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.card.hubkarte .card-head { margin-bottom: .75rem; }
/* Das Winkelzeichen steht rechts und sagt "hier geht es weiter" - dieselbe
   Rolle wie der Knopf vorher, aber ohne eine zweite Trefferflaeche in einer
   Flaeche, die schon ganz ein Link ist. */
/* Der Pfeil ist ein Hinweis, keine Handlung - die Handlung ist die ganze
   Karte. In einer Tinte muss er deshalb leise sein, sonst sieht jede Karte
   aus wie der Hauptknopf. */
.hubkarte-pfeil { margin-left: auto; color: var(--muted); font-size: 1.3125rem; line-height: 1; font-weight: 700; }
@media (prefers-reduced-motion: reduce) {
  .card.hubkarte { transition: none; }
  .card.hubkarte:active { transform: none; }
}

/* --- Auswahlfeld und Zeitpaar --------------------------------------------
   Nach dem Muster einer iOS-Eingabemaske: Symbol links neben dem Feld, das
   Feld selbst eine Flaeche mit Haarlinie, der Winkel rechts im Feld. Vorher
   standen hier nackte <select>-Elemente in Systemoptik. */

.pickic { flex: none; width: 22px; height: 22px; color: var(--muted); }
.pickic svg { width: 22px; height: 22px; display: block; }

.pickfield { position: relative; flex: 1 1 auto; min-width: 0; margin: 0; display: block; }
.pickfield select, .pickfield input {
  width: 100%; min-height: 46px; padding: .5rem 2.5rem .5rem 1rem;
  font: inherit; font-size: 1rem; font-weight: 500; color: var(--text);
  background: var(--surface); border: 1px solid var(--hair-strong);
  border-radius: var(--radius-xs); appearance: none; -webkit-appearance: none;
  background-image: none; text-overflow: ellipsis;
}
.pickfield::after {
  content: ""; position: absolute; right: 1rem; top: 50%; width: 7px; height: 7px;
  margin-top: -5px; pointer-events: none;
  border-right: 1.8px solid var(--muted); border-bottom: 1.8px solid var(--muted);
  transform: rotate(45deg);
}
.pickfield select:focus-visible, .pickfield input:focus-visible {
  outline: none; border-color: var(--accent); box-shadow: 0 0 0 4px var(--accent-soft);
}

/* Zwei Kaesten mit einem Gedankenstrich dazwischen. Die Zahl steht mittig und
   tabellarisch - so liest man ein Zeitfenster, nicht als Formularzeile. */
.timepair { display: flex; align-items: center; gap: .5rem; flex: 1 1 auto; min-width: 0; }
.timepair input {
  flex: 1 1 0; min-width: 0; width: auto; min-height: 46px;
  padding: .5rem .5rem; text-align: center;
  font: inherit; font-size: 1rem; font-weight: 600;
  font-variant-numeric: tabular-nums; letter-spacing: -.01em;
  color: var(--text); background: var(--surface);
  border: 1px solid var(--hair-strong); border-radius: var(--radius-xs);
  appearance: none; -webkit-appearance: none; background-image: none;
}
.timepair input:focus-visible {
  outline: none; border-color: var(--accent); box-shadow: 0 0 0 4px var(--accent-soft);
}
.timepair input::-webkit-datetime-edit { text-align: center; }
.timepair input::-webkit-inner-spin-button,
.timepair input::-webkit-clear-button { display: none; }
.timepair input::-webkit-calendar-picker-indicator { opacity: 0; cursor: pointer; transition: opacity .12s ease; }
.timepair input:hover::-webkit-calendar-picker-indicator,
.timepair input:focus::-webkit-calendar-picker-indicator { opacity: .4; }
.timepair .tp-dash { flex: none; color: var(--muted); font-size: 1rem; line-height: 1; }

/* --- Hub-Seiten (Handbuch, Rezepte, Guides) ---------------------------
   Vorher: reiner Fliesstext in den ganz normalen h2/h3/p/ul-Groessen, kein
   Rhythmus zwischen Abschnitten - "sieht bisschen gebastelt aus" (Mathieu,
   06.09.2026). Die Struktur (Linie unter jedem Abschnitt, groesserer erster
   Absatz als Klappentext) blieb auf seinen Wunsch, die Farbe ist bewusst
   zurueckhaltend: "nicht so viel Gold, lieber schwarz und einfach" - eine
   schlichte, dunkle Linie statt Marken-Gold, sonst ganz normale Textfarbe. */
.hubpage { line-height: 1.6; }
.hubpage h2 {
  margin: 2rem 0 .75rem; padding-bottom: .5rem; font-size: 1.3125rem;
  border-bottom: 2px solid var(--text);
}
.hubpage h2:first-child { margin-top: 0; }
.hubpage h3 { margin: 1.25rem 0 .5rem; font-size: 1rem; }
.hubpage > :first-child { margin-top: 0; }
.hubpage p { margin: 0 0 1rem; }
/* Der erste Absatz einer Seite ist meist eine kurze Einordnung ("Eine Seite.
   Alles, was im Dienst wirklich zaehlt.") - liest sich als Klappentext, nicht
   als erste Zeile eines Fliesstexts. */
.hubpage > p:first-child { font-size: 1.125rem; color: var(--text-soft); }
.hubpage ul, .hubpage ol { margin: 0 0 1rem; padding-left: 1.25rem; display: grid; gap: .5rem; }
.hubpage li { line-height: 1.55; }
.hubpage blockquote {
  margin: 0 0 1rem; padding: .75rem 1rem;
  background: var(--fill); border-left: 3px solid var(--hair-strong); border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
  color: var(--text-soft); font-style: italic;
}
.hubpage .table-scroll { margin: 0 0 1rem; }
.hubpage table { font-size: .875rem; }
.hubpage th, .hubpage td { vertical-align: top; }
.hubpage strong { font-weight: 650; color: var(--text); }

/* --- Inventur --- */
.invrules, .invsteps { margin: 0; padding-left: 1.25rem; display: grid; gap: .5rem; }
.invrules li, .invsteps li { line-height: 1.5; }
.invsteps { counter-reset: none; }

.invstations { display: grid; gap: .75rem; }
.invstation {
  display: grid; gap: .25rem; text-decoration: none; color: var(--text);
  background: var(--surface-2); border: 1.5px solid var(--border); border-radius: var(--radius-sm);
  padding: .75rem 1rem 1rem; min-height: 44px;
}
.invstation:hover { border-color: var(--accent); background: var(--surface); text-decoration: none; }
.invstation .nm { font-family: var(--f-text); font-weight: 650; font-size: 1rem; }
.invstation .hint { color: var(--muted); font-size: .875rem; line-height: 1.4; }
.invstation .prog { font-size: .875rem; font-weight: 600; color: var(--text); }
.invstation.done { background: var(--ok-soft); border-color: var(--ok); }
.invstation.done .prog { color: var(--ok); }
.invstation .bar, .invstationstat .bar {
  display: block; height: 6px; border-radius: var(--radius-pille); background: var(--surface-3); overflow: hidden;
}
.invstation .bar > span, .invstationstat .bar > span { display: block; height: 6px; background: var(--accent); border-radius: var(--radius-pille); }
.invstation.done .bar > span { background: var(--ok); }

.invstationgrid { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: .75rem; }
.invstationstat { background: var(--surface-2); border: 1px solid var(--border); border-radius: var(--radius-sm); padding: .75rem .75rem; display: grid; gap: .25rem; }
.invstationstat .nm { font-weight: 650; font-size: 1rem; }
.invstationstat .num { font-size: 1.5rem; font-weight: 700; font-variant-numeric: tabular-nums; line-height: 1.1; }
.invstationstat .num span { font-size: 1rem; font-weight: 500; color: var(--muted); }

.invrhythms { display: grid; grid-template-columns: repeat(auto-fit, minmax(230px, 1fr)); gap: .75rem; }
.invrhythm {
  margin: 0; display: grid; gap: .5rem; align-content: start;
  background: var(--surface-2); border: 1.5px solid var(--border); border-radius: var(--radius-sm); padding: 1rem 1rem 1rem;
}
.invrhythm .nm { font-family: var(--f-text); font-weight: 650; font-size: 1rem; }
.invrhythm .cnt { font-size: 1.3125rem; font-weight: 700; font-variant-numeric: tabular-nums; }
.invrhythm .hint { color: var(--muted); font-size: .875rem; line-height: 1.4; }

.invlist { display: grid; gap: .5rem; }
.invrow {
  display: grid; gap: .5rem; padding: .75rem .75rem .75rem;
  border: 1px solid var(--border); border-radius: var(--radius-sm); background: var(--surface);
}
.invrow.done { background: var(--ok-soft); border-color: var(--ok); }
.invrow .who { display: flex; flex-wrap: wrap; align-items: baseline; gap: .25rem .5rem; }
.invrow .who .nm { font-weight: 600; font-size: 1rem; }
.invrow .who .unit {
  font-size: .75rem; font-weight: 700; letter-spacing: .04em; text-transform: uppercase;
  color: var(--warn); background: var(--warn-soft); border-radius: var(--radius-pille); padding: .125rem .5rem;
}
.invrow .who .stamp { font-size: .75rem; color: var(--muted); margin-left: auto; }
.invrow .fields { display: flex; flex-wrap: wrap; gap: .5rem; }
.invfield { display: grid; gap: .25rem; flex: 0 0 110px; margin: 0; }
.invfield.wide { flex: 1 1 180px; }
.invfield > span { font-size: .75rem; font-weight: 650; color: var(--muted); }
.invfield input { min-height: 44px; font-size: 1rem; font-variant-numeric: tabular-nums; }
.invfield.wide input { font-size: 1rem; }

td.invna { color: var(--border-strong); text-align: center; }

/* --- Tabellen (Admin) --- */
/* Tabellen: Haarlinien, keine Rahmen, und alles Numerische rechts. Eine
   Zahlenspalte, die links steht, laesst sich nicht vergleichen. */
.table-scroll { overflow-x: auto; border: 1px solid var(--hair); border-radius: var(--radius-sm); }
table { border-collapse: collapse; width: 100%; font-size: .875rem; background: var(--surface); }
th, td { text-align: left; padding: .5rem .75rem; border-bottom: 1px solid var(--hair); vertical-align: top; }
thead th {
  background: transparent; font-size: .75rem; font-weight: 650; text-transform: uppercase;
  letter-spacing: .055em; color: var(--muted); white-space: nowrap;
  border-bottom: 1px solid var(--hair-strong); padding-top: .75rem; padding-bottom: .5rem;
}
tbody tr:last-child td { border-bottom: none; }
tbody tr:hover td { background: var(--fill); }

/* Die Farben der Bedarfs-Ampel je Stunde. Die Tabelle "Personal-Ampel" ist am
   15.10.2026 entfallen (Mathieu: "nimm die Personal-Ampel raus") - die
   Farben tragen jetzt die Zellen von "Bedarf heute" (.bhz). */
.stz-leer { color: var(--muted); }
.stz-wenig { background: var(--crit-soft); color: var(--crit); }
.stz-passt { background: var(--ok-soft); color: var(--ok); }
.stz-viel { background: var(--warn-soft); color: var(--warn); }
.stz-ohne-bedarf { background: var(--accent-soft); color: var(--text-soft); }

/* Balkendiagramm oben in jeder Tageskarte (Team-Ansicht), eines je Tag,
   nicht je Schicht - immer da, auch an einem ruhigen Tag, damit es sich
   nicht je nach Bedarfslage ein- und ausblendet. Kleine Orientierung,
   nicht die Hauptsache (das ist, wer arbeitet): die Kopfzahl steht
   sichtbar ueber jedem Balken, nicht nur im Tooltip - genau das wollte
   das Team lesen koennen (1, 2, 3 ...), ohne dass die Zeile dominant
   wird. */
/* Die Filterzeile ueber dem Checklisten-Archiv. Eine Zeile, drei Auswahlen,
   ein Knopf - und sie bricht um, statt die Karte zu sprengen. */
.archivfilter { display: flex; flex-wrap: wrap; align-items: flex-end; gap: .5rem .75rem; margin: 0 0 1rem; }
.archivfilter label {
  display: flex; flex-direction: column; gap: .125rem;
  font-size: .75rem; color: var(--muted); min-width: 0;
}
.archivfilter select { min-width: 9rem; max-width: 16rem; }

/* --- Eine Checkliste umbauen (Mathieu, 14.09.2026) -----------------------
   Eine Zeile je Punkt: Griff, Text, Pfeile, "Ändern". Bewusst kompakt - eine
   Closing-Liste hat fuenfundvierzig Punkte, und wer sie umbaut, will sie alle
   auf einmal sehen. */
.clbau { margin-top: .75rem; }
.clabschnitt + .clabschnitt { margin-top: 1rem; }
.clkopf > summary {
  display: flex; align-items: baseline; gap: .5rem; cursor: pointer; list-style: none;
  min-height: 34px; padding: .25rem 0;
}
.clkopf > summary::-webkit-details-marker { display: none; }
.clname {
  font-size: .75rem; font-weight: 800; letter-spacing: .07em; text-transform: uppercase;
  color: var(--text-soft);
}
.clkopf > summary::after {
  content: "umbenennen"; margin-left: auto; font-size: .75rem; color: var(--muted);
  text-decoration: underline;
}
.clliste { list-style: none; margin: 0; padding: 0; border: 1px solid var(--hair); border-radius: var(--radius-sm); }
.clpunkt {
  display: flex; align-items: center; gap: .5rem; flex-wrap: wrap;
  padding: .5rem .5rem; border-top: 1px solid var(--hair); background: var(--surface);
}
.clpunkt:first-child { border-top: 0; }
/* Der Griff ist die Flaeche zum Ziehen - und mit cursor: grab auch das
   einzige Zeichen dafuer, das ohne Text auskommt. */
.clgriff { flex: none; cursor: grab; color: var(--muted); font-size: 1rem; line-height: 1; user-select: none; }
.clpunkt.zieht { opacity: .45; background: var(--fill); }
.cltext { flex: 1 1 12rem; min-width: 0; font-size: .875rem; line-height: 1.35; }
.clpfeile { flex: none; display: flex; gap: .125rem; }
.clpfeile form { display: inline; }
.clpfeil {
  border: 1px solid var(--hair); background: var(--surface); color: var(--text-soft);
  border-radius: var(--radius-klein); width: 30px; height: 30px; font-size: .875rem; line-height: 1; cursor: pointer;
}
.clpfeil:hover { background: var(--fill); }
.clbearbeiten { flex: none; min-width: 0; }
/* Aufgeklappt nimmt der Kasten die ganze Zeile - und zwar HIER, am <details>
   selbst. Am .clformen darin wirkte "flex: 100%" nicht: dessen Elternteil ist
   das <details>, kein Flex-Container. Der Kasten wuchs damit auf seine
   Inhaltsbreite, lief aus der Karte und schob die ganze Seite seitlich weg -
   gemessen: Seite 1279 px breit bei 1024 px Fenster. */
.clpunkt > .clbearbeiten[open] { flex: 1 1 100%; }
.clbearbeiten > summary { list-style: none; cursor: pointer; }
.clbearbeiten > summary::-webkit-details-marker { display: none; }
/* Aufgeklappt nimmt der Kasten die ganze Zeilenbreite - die drei Formulare
   nebeneinander waeren sonst drei Spalten mit je acht Zeichen. */
.clformen {
  /* 1 1 statt 1 0: mit Schrumpffaktor 0 blieb der Kasten auf voller Breite
     stehen UND bekam die Luecke der Zeile obendrauf - das Feld "Neuer Punkt
     darunter" stand dann halb ausserhalb der Karte. Gemessen bei 700 px. */
  width: 100%; min-width: 0; display: flex; flex-wrap: wrap; gap: .5rem 1rem;
  margin: .5rem 0 .25rem; padding: .5rem .125rem 0; border-top: 1px dashed var(--hair);
}
/* Die drei Formulare teilen sich die Breite und brechen um, statt aus der
   Karte zu laufen: bei 700 px stand das Feld "Neuer Punkt darunter" halb
   ausserhalb - gemessen am Bild. min-width: 0 ist dabei die Bedingung, unter
   der ein Feld in einer Flex-Zeile ueberhaupt schrumpfen darf. */
/* Jedes der drei Formulare nimmt eine eigene Zeile: das Textfeld soll so
   breit sein wie der Punkt lang ist (Mathieu, 14.09.2026: "mach die fenster
   für den text größer sonst muss ich so doof scrollen"). Nebeneinander blieben
   je 17 rem, und der laengste Punkt der Closing-Liste hat 150 Zeichen. */
.clform { display: flex; align-items: flex-end; gap: .5rem; flex-wrap: wrap; flex: 1 1 100%; min-width: 0; }
.clbreit { flex: 1 1 22rem; }
.clbau textarea,
.clform textarea {
  width: 100%; min-width: 0; resize: vertical; line-height: 1.4;
  /* Drei Zeilen: der laengste Punkt der Closing-Liste hat 150 Zeichen und
     braucht in dieser Breite genau drei. Wer scrollen muss, um seinen eigenen
     Satz zu lesen, kann ihn nicht vernuenftig aendern. */
  font-size: .875rem; min-height: 4.6rem;
}
.clform label { display: flex; flex-direction: column; gap: .125rem; font-size: .75rem; color: var(--muted); flex: 1 1 9rem; min-width: 0; }
.clform input { width: 100%; min-width: 0; }
.clform button { flex: none; }

/* Aufklappbares Formular in einer Karte - "Hand Out anlegen", "Foto
   hinzufügen". Zugeklappt bleibt die Seite eine Seite und kein Formular. */
.hubneu {
  display: flex; align-items: baseline; flex-wrap: wrap; gap: .25rem .5rem;
  cursor: pointer; list-style: none; min-height: 44px; padding-top: .5rem;
}
.hubneu::-webkit-details-marker { display: none; }
.hubneu::after {
  content: ""; margin-left: auto; flex: none; align-self: center;
  width: .5rem; height: .5rem;
  border-right: 2px solid var(--muted); border-bottom: 2px solid var(--muted);
  transform: rotate(45deg); transition: transform .12s ease;
}
details[open] > .hubneu::after { transform: rotate(-135deg); }
.hubneutitel { font-size: 1rem; font-weight: 700; letter-spacing: -.02em; color: var(--text); }

/* --- Hand Outs: Bilder an einer Wissensseite (Mathieu, 13.09.2026) -------
   Beim Team volle Breite und untereinander: ein Teller in einer Zweierspalte
   waere am Handy 160 px breit und damit kein Vorbild mehr, sondern ein
   Briefmarkenbild. */
.hubfotos { display: flex; flex-direction: column; gap: 1rem; margin-top: 1rem; }
.hubfoto { margin: 0; }
.hubfoto img {
  display: block; width: 100%; height: auto; border-radius: var(--radius-sm);
  background: var(--fill);
}
.hubfoto figcaption {
  margin-top: .25rem; font-size: .875rem; color: var(--text-soft); line-height: 1.4;
}
/* Im Backend dagegen ein Raster: dort geht es ums Verwalten, nicht ums
   Nachmachen - und man will sehen, WAS schon dranhaengt. */
.hbraster {
  display: grid; gap: .75rem; margin: .25rem 0 1rem;
  grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
}
.hbkachel { margin: 0; display: flex; flex-direction: column; gap: .25rem; }
.hbkachel img {
  display: block; width: 100%; aspect-ratio: 4 / 3; object-fit: cover;
  border-radius: var(--radius-sm); background: var(--fill); border: 1px solid var(--hair);
}
.hbkachel figcaption { font-size: .75rem; color: var(--text-soft); line-height: 1.35; }
.hbform { border-top: 1px solid var(--hair); padding-top: .75rem; }

/* Die Hand Outs im eigenen Reiter (Mathieu, 14.09.2026: "Ich wuerde Hand Outs
   also extra Punkt machen zwischen Bestandsabgleich & events"). Kacheln, kein
   Listeneintrag: auf einem Hand Out IST das Bild der Inhalt - der Titel
   "Hummus-Teller anrichten" sagt nur, was man ohnehin schon weiss.
   Zwei Spalten am Handy, mehr, wenn Platz ist. 150 px Mindestbreite wie beim
   Bilderraster im Backend: darunter ist ein Teller kein Vorbild mehr. */
.horaster {
  display: grid; gap: .75rem; margin: .25rem 0 0;
  grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
}
.hokachel {
  display: flex; flex-direction: column; gap: .5rem;
  text-decoration: none; color: var(--text);
}
.hokachel img, .hokachel .hoohne {
  display: block; width: 100%; aspect-ratio: 4 / 3; object-fit: cover;
  border-radius: var(--radius-sm); background: var(--fill); border: 1px solid var(--hair);
}
/* Ein Hand Out ohne Bild sollte es nicht geben - das Foto ist beim Anlegen
   Pflicht. Eine von Hand im Backend angelegte Seite kann trotzdem eines sein;
   dann steht das da, statt dass ein kaputtes Bildsymbol erscheint. */
.hokachel .hoohne {
  display: grid; place-items: center; font-size: .75rem; color: var(--muted);
}
.hokachel .hotitel { font-size: .875rem; font-weight: 600; line-height: 1.3; }
.hokachel:active img { opacity: .85; }

/* Der Einstieg zum Feed steht IN der Kopfzeile, neben "X Stück" (Mathieu,
   19.09.2026: "würde als Feed swipen direkt oben neben hand outs Bar nen
   button machen") - summary.card-head ist schon ein Flex-Streifen
   (siehe dort), der Knopf reiht sich einfach ein und schiebt sich per
   margin-left:auto vor den Aufklapp-Pfeil. Keine eigene Positionierung
   noetig. */
a.hofeedlink {
  display: inline-flex; align-items: center; margin-left: auto;
  padding: .35rem .65rem; border-radius: var(--radius-pille);
  background: var(--accent-soft); color: var(--accent);
  font-size: .75rem; font-weight: 700; text-decoration: none;
}
a.hofeedlink:hover { background: var(--accent); color: var(--accent-ink); text-decoration: none; }

/* Der Hand-Out-Feed (Mathieu, 19.09.2026: "durch die bilder so durch swipen
   wie in einem feed", "senkrecht wie bei TikTok und Instagram"). Senkrechtes
   Wischen laeuft ganz ueber CSS-Scroll-Snap, ohne eigenes Skript fuer die
   Geste - HOFEED_SCRIPT kuemmert sich nur um die Fortschrittspunkte und das
   Kommentar-Blatt.

   Echtes Vollbild (Mathieu, 19.09.2026: "das sollte dann aber vollbildmodus
   sein das nichts angeschnitten ist") - ohne die feste Position waeren Foto,
   Titel und Kommentar-Knopf weiter von Kopfzeile und Unterleiste eingerahmt,
   egal wie gross die Kachel selbst ist. .hofeedvollbild deckt dazu auch die
   helle Sicherheitszonen-Leiste ab (body::before, 25) - das Foto darf bis
   unter die Notch reichen, wie bei Instagram/TikTok; die Zurueck-Taste und
   die Punkte ruecken dafuer mit env(safe-area-inset-top) selbst ab. */
.hofeedvollbild {
  position: fixed; inset: 0; z-index: 26; background: #000;
  /* "inset: 0" allein reicht am iPhone nicht (Mathieu, 19.09.2026: "unten
     immer noch ein weißer rand") - Safaris Werkzeugleiste blendet ein und
     aus, "bottom: 0" bleibt dabei an der Größe haengen, mit der die Seite
     GELADEN wurde, und darunter blitzt kurz body's eigener heller
     Hintergrund durch. 100dvh folgt der WIRKLICH sichtbaren Höhe gerade
     jetzt, nicht der beim Laden gemessenen - deckt also immer bis zum
     echten Rand. Die 100vh-Zeile bleibt als Rückfall für Browser ohne dvh. */
  height: 100vh;
  height: 100dvh;
}
/* Ein einziges Pixel mehr Höhe als der Bildschirm (Mathieu, 19.09.2026:
   "unter dem feed ist immer noch ein weißer balken", auch am iPhone 15
   Pro nach 100dvh) - Safaris eigene Adressleiste zieht sich sonst nie
   zusammen: das passiert nur, wenn die SEITE scrollt, und hier scrollt
   nie die Seite, nur die Kachel. Ohne dieses eine Pixel gibt es fuer den
   Trick in HOFEED_SCRIPT (window.scrollTo(0,1)) nichts zu scrollen. Fuer
   Mathieus eigenes Auge unsichtbar - die Kachel deckt die ganze Seite
   ohnehin ab, es geht nur um Scroll-KAPAZITAET. */
body:has(.hofeedvollbild) { min-height: calc(100dvh + 1px); }
/* Ein gemeinsames "Glas" für alle schwebenden Bedienelemente auf dem Foto
   (Mathieu, 19.09.2026: "probier das design noch bissen fresher zu
   machen") - heller und mit einem feinen Rand statt flachem Schwarz,
   dieselbe Optik wie aktuelle iOS-Oberflächen. EINE Klasse für alle
   Stellen (Zurück, Kommentar-Knopf, "Ganzes Rezept ansehen"), damit sie
   wirklich gleich aussehen statt von Hand nachgezogen zu werden. */
.hofeedglas {
  background: rgba(255,255,255,.14);
  border: 1px solid rgba(255,255,255,.22);
  box-shadow: 0 4px 16px rgba(0,0,0,.28);
  backdrop-filter: blur(16px) saturate(160%);
}
.hofeedzurueck {
  position: absolute; z-index: 7;
  top: calc(env(safe-area-inset-top, 0px) + .8rem); left: .8rem;
  width: 40px; height: 40px; border-radius: 999px; display: flex; align-items: center; justify-content: center;
  color: #fff; font-size: 1.3125rem; text-decoration: none;
}
.hofeedrahmen { position: absolute; inset: 0; overflow: hidden; }

/* Die Unterleiste bleibt (siehe layout()), soll auf dem Feed aber aussehen
   wie der Kommentar-Knopf - durchsichtig mit etwas Grau darunter, nicht die
   helle Karte, die sie auf jeder anderen Seite ist (Mathieu, 19.09.2026:
   "mach das menü einfach wie das kommentar symbol über das bild in
   transparent mit bissen grau hinterlegt wirklich wie bei insta reels").
   Nur auf dieser einen Seite (body:has(.hofeedvollbild)) - ueberall sonst
   bleibt die Leiste unveraendert. Der aktive Reiter behaelt seine eigene,
   deckende Pille (:not(.aktiv)) - die braucht kein Umfaerben, sie liest sich
   so schon auf jedem Grund. */
body:has(.hofeedvollbild) .unterleiste {
  background: rgba(0,0,0,.32); border: 0; box-shadow: none; backdrop-filter: blur(2px);
}
/* Der Farbverlauf hinter der Leiste war fuer die helle Seite gedacht, die
   sonst durch den Spalt schien (siehe .unterleiste::before) - auf dem Feed
   waere das ein cremefarbener Hof um eine durchsichtige Leiste. */
body:has(.hofeedvollbild) .unterleiste::before { content: none; }
body:has(.hofeedvollbild) .ulziel:not(.aktiv) { color: #FBF5EA; }
body:has(.hofeedvollbild) .ulziel:not(.aktiv):hover { color: #FBF5EA; }
body:has(.hofeedvollbild) .ulwort { color: #FBF5EA; opacity: .85; }
.hofeed {
  display: flex; flex-direction: column; height: 100%;
  overflow-y: auto; scroll-snap-type: y mandatory; -webkit-overflow-scrolling: touch;
  scrollbar-width: none;
}
.hofeed::-webkit-scrollbar { display: none; }
.hofeedfolie {
  flex: 0 0 100%; scroll-snap-align: start; scroll-snap-stop: always;
  position: relative; display: flex; flex-direction: column; justify-content: flex-end;
  /* 83px + Sicherheitszone ist dieselbe Reserve wie body:has(.unterleiste) -
     die schwebende Leiste bleibt an, damit Start/Eintragen/Hub erreichbar
     bleiben (siehe die Begruendung bei unterleiste()), und Titel samt
     Kommentar-Link duerfen ihr nicht darunter verschwinden. */
  padding: 1.2rem 3.6rem calc(83px + env(safe-area-inset-bottom, 0px) + 1rem) 1.1rem;
  height: 100%; background: #3D2B1F;
}
.hofeedbild { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; z-index: 0; }
/* Zwei Farbverläufe statt einem (Mathieu, 19.09.2026: "probier das design
   noch bissen fresher zu machen") - oben ein schwacher, nur damit die
   Zurück-Taste auch auf einem hellen Foto lesbar bleibt, unten der
   kräftige für Titel und Text. Dieselbe Doppel-Abdunklung wie bei
   Instagram/TikTok, nicht nur unser bisheriges Einzelverlauf. */
.hofeedschleier {
  position: absolute; inset: 0; z-index: 1;
  background:
    linear-gradient(to top, rgba(0,0,0,.7) 0%, rgba(0,0,0,.22) 38%, transparent 58%),
    linear-gradient(to bottom, rgba(0,0,0,.38) 0%, transparent 22%);
}
.hofeedinhalt { position: relative; z-index: 2; color: #FBF5EA; }
.hofeedbereich {
  font-size: .625rem; font-weight: 800; letter-spacing: .12em; text-transform: uppercase;
  opacity: .85; margin-bottom: .2rem;
}
.hofeedinhalt h2 {
  font-family: Fraunces, Georgia, serif; font-weight: 500; font-size: 1.6rem;
  margin: 0 0 .3rem; letter-spacing: -.01em; line-height: 1.08; color: #FBF5EA;
}
.hofeedkurz { font-size: .875rem; opacity: .92; line-height: 1.4; margin: 0; }
.hofeedvon { margin-top: .5rem; font-size: .75rem; opacity: .7; }
/* Ein echter Knopf statt eines unterstrichenen Links (Mathieu, 19.09.2026:
   "und ganzes rezept ansehen sollte ein button sein") - dieselbe dunkle,
   halbdurchsichtige Fläche wie Zurück-Taste und Kommentar-Knopf auf
   diesem Foto, nicht das CI-Marine der übrigen Knöpfe: das läse sich auf
   einem dunklen Teller kaum. */
.hofeedganz {
  display: inline-flex; align-items: center; gap: .3rem; margin-top: .8rem;
  padding: .5rem .9rem; border-radius: var(--radius-pille);
  font-size: .75rem; font-weight: 700; color: #FBF5EA; text-decoration: none;
}

.hofeedpunkte {
  position: absolute; z-index: 3;
  top: calc(env(safe-area-inset-top, 0px) + .9rem); bottom: calc(83px + env(safe-area-inset-bottom, 0px) + .9rem); left: .6rem;
  display: flex; flex-direction: column; gap: .35rem; width: 4px;
}
.hofeedpunkte i {
  flex: 1; border-radius: 999px; background: rgba(255,255,255,.3);
  transition: background .15s ease, box-shadow .15s ease;
}
.hofeedpunkte i.aktiv { background: #FBF5EA; box-shadow: 0 0 8px rgba(251,245,234,.55); }

/* Der Kommentar-Knopf rechts (Mathieu, 19.09.2026: "rechts auch so nen
   kommentar button haben wo man die handouts kommentieren kann wie bei
   insta") - Handlung bleibt CI-Marine, hier aber hell auf dem Foto, sonst
   verschwindet der Knopf auf dunklem Grund. */
.hofeedaktionen {
  position: absolute; z-index: 4;
  right: .7rem; bottom: calc(83px + env(safe-area-inset-bottom, 0px) + .8rem);
  display: flex; flex-direction: column; align-items: center; gap: .25rem;
}
.hofeedaktion { display: flex; flex-direction: column; align-items: center; gap: .25rem; background: none; border: 0; padding: 0; cursor: pointer; }
.hofeedaktionknopf {
  width: 40px; height: 40px; border-radius: 999px; display: flex; align-items: center; justify-content: center;
  color: #FBF5EA;
}
.hofeedaktionzahl { font-size: .625rem; font-weight: 700; color: #FBF5EA; text-shadow: 0 1px 3px rgba(0,0,0,.5); }

.hofeedkommentare {
  position: absolute; inset: 0; z-index: 6;
  display: flex; flex-direction: column; justify-content: flex-end;
  opacity: 0; pointer-events: none; transition: opacity .2s;
}
.hofeedkommentare.offen { opacity: 1; pointer-events: auto; }
.hofeedhinterlegt { position: absolute; inset: 0; background: rgba(0,0,0,.55); border: 0; padding: 0; backdrop-filter: blur(1px); }
.hofeedblatt {
  position: relative; background: var(--surface); border: 1px solid var(--hair); border-bottom: 0;
  border-radius: 1.3rem 1.3rem 0 0; max-height: 72%; display: flex; flex-direction: column;
  box-shadow: 0 -8px 30px -6px rgba(0,0,0,.35);
  padding: .6rem 1rem calc(83px + env(safe-area-inset-bottom, 0px) + .9rem);
  transform: translateY(100%); transition: transform .25s ease;
}
.hofeedkommentare.offen .hofeedblatt { transform: translateY(0); }
/* Der Griff oben (Mathieu, 19.09.2026: "probier das design noch bissen
   fresher zu machen") - dasselbe stille Zeichen "das laesst sich
   herunterziehen" wie bei jedem nativen Blatt am iPhone. */
.hofeedblatt::before {
  content: ""; align-self: center; width: 34px; height: 4px; border-radius: 999px;
  background: var(--hair); margin-bottom: .5rem;
}
.hofeedblattkopf { display: flex; align-items: center; justify-content: space-between; margin-bottom: .6rem; }
.hofeedblattkopf h3 { margin: 0; font-size: .875rem; color: var(--text); }
.hofeedschliessen { border: 0; background: none; color: var(--muted); font-size: 1.125rem; line-height: 1; cursor: pointer; width: 30px; height: 30px; }
.hofeedliste { overflow-y: auto; display: flex; flex-direction: column; gap: .65rem; padding: .1rem .1rem .7rem; }
.hofeedeingabe { display: flex; gap: .5rem; border-top: 1px solid var(--hair); padding-top: .6rem; }
.hofeedeingabe input { flex: 1; margin: 0; }

/* Die Kommentarliste - auf der Einzelseite genauso wie im Feed-Blatt. */
.hokomliste { display: flex; flex-direction: column; gap: .65rem; margin-top: .5rem; }
.hokomeintrag .hokomwer { display: block; font-size: .75rem; font-weight: 700; color: var(--text); }
.hokomeintrag .hokomtext { display: block; font-size: .875rem; color: var(--text-soft); line-height: 1.4; margin-top: .1rem; }

/* "Verkauft sich, hat kein Rezept" (Mathieu, 14.09.2026). Die ZAHL traegt die
   Zeile - sie ist das Argument: 38x heisst 38 Drinks, die nichts vom Bestand
   abgezogen haben. Sie steht deshalb vorn, in der Warnfarbe, mit festen
   Ziffern, damit die Spalte fluchtet. */
.fehltliste { list-style: none; padding: 0; margin: .25rem 0 0; display: grid; gap: .125rem; }
.fehltliste li {
  display: flex; align-items: baseline; gap: .5rem;
  padding: .5rem 0; border-top: 1px solid var(--hair);
}
.fehltliste li:first-child { border-top: 0; }
.fehltzahl {
  flex: 0 0 3.2rem; text-align: right; font-weight: 700;
  color: var(--warn, var(--crit)); font-variant-numeric: tabular-nums;
}
.fehltname { flex: 1 1 auto; min-width: 0; font-weight: 600; }
.fehltname a { color: inherit; }
.fehltzeit { flex: none; font-size: .75rem; color: var(--muted); }

/* "Rezept da, zieht nichts ab" (14.09.2026): dieselbe Liste, aber vorn steht
   ein WORT statt einer Zahl - "nichts" oder "halb". Und der Grund dahinter
   ist ein Satz und keine Jahreszahl, also darf er umbrechen statt die Zeile
   zu sprengen. */
.fehltzahl.wort {
  flex: 0 0 4.2rem; font-size: .75rem; font-weight: 700;
  text-transform: uppercase; letter-spacing: .06em;
}
/* Halb gebucht ist schlechter als richtig und besser als gar nichts - also
   nicht dieselbe Warnfarbe wie "nichts". */
.fehltzahl.wort.halb { color: var(--muted); }
.fehltliste.warum li { flex-wrap: wrap; }
.fehltliste.warum .fehltzeit { flex: 1 1 100%; margin-left: 4.8rem; }

/* Die beiden Berichtsarten nebeneinander (14.09.2026). Keine Aufzaehlung mit
   Punkten: das sind zwei Wahlmoeglichkeiten, und die liest man als Bloecke. */
.berichtsarten { list-style: none; padding: 0; margin: .25rem 0 1rem; display: grid; gap: .5rem; }
.berichtsarten li {
  padding: .5rem .75rem; border-radius: var(--radius-sm);
  border: 1px solid var(--hair); background: var(--fill); line-height: 1.45; font-size: .875rem;
}

/* Die Backtage in den Einstellungen: sieben Kaestchen nebeneinander
   (Mathieu, 14.09.2026). Eigener Name und nicht .wtag - der gehoert schon
   den Wochentagskarten im Kalender. */
.backtage { display: flex; flex-wrap: wrap; gap: .5rem; margin-top: .25rem; }
.backtag {
  display: inline-flex; align-items: center; gap: .25rem;
  min-height: 44px; padding: 0 .75rem; border-radius: var(--radius-pille);
  border: 1px solid var(--hair); background: var(--surface);
  font-size: .875rem; font-weight: 600; cursor: pointer;
}
.backtag:has(input:checked) { border-color: var(--accent); background: var(--fill); }
.backtag input { margin: 0; }

/* Der Zaehlstreifen: ein Kaestchen je Abend (Mathieu, 14.09.2026). Vier
   Zustaende, und sie unterscheiden sich in der FLAECHE, nicht in der Schrift -
   eine Luecke soll man sehen, ohne zu lesen.
     da     - gezaehlt: gefuellt, Haken-Gruen der App
     fehlt  - vergessen: getoent in der Warnfarbe, Rand dazu
     heute  - laeuft noch: leer mit gestricheltem Rand, das ist kein Versaeumnis
     kommt  - liegt in der Zukunft: fast unsichtbar */
.zstreifenblock { margin: 1rem 0 .25rem; }
.zstreifen {
  display: grid; gap: .25rem;
  grid-template-columns: repeat(auto-fill, minmax(44px, 1fr));
}
.zstag {
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: .125rem; min-height: 44px; padding: .25rem 0;
  border-radius: var(--radius-sm); border: 1px solid var(--hair);
  font-size: .875rem; font-variant-numeric: tabular-nums; line-height: 1.1;
  background: var(--fill); color: var(--text);
}
.zstag b { font-size: .625rem; font-weight: 700; letter-spacing: .04em; color: var(--muted); text-transform: uppercase; }
.zstag.is-da { background: var(--ok-soft, var(--fill)); border-color: var(--ok); color: var(--text); }
.zstag.is-da b { color: var(--ok); }
.zstag.is-fehlt { background: var(--warn-soft, transparent); border-color: var(--warn, var(--crit)); }
.zstag.is-fehlt b { color: var(--warn, var(--crit)); }
.zstag.is-heute { background: transparent; border-style: dashed; }
.zstag.is-kommt { background: transparent; border-color: var(--hair); color: var(--muted); opacity: .5; }
.zstag.is-ruhe { background: transparent; border-color: var(--hair); color: var(--muted); opacity: .5; }
/* In der App ist jedes Kaestchen ein Link auf diesen Abend - es soll trotzdem
   aussehen wie ein Kaestchen und nicht wie ein Link. 44px, weil man mit dem
   Daumen auf eine Luecke tippt. */
a.zstag { text-decoration: none; min-height: 44px; }
a.zstag:active { opacity: .7; }
.zstreifenblock .help a { color: inherit; }

/* Wer zustaendig ist (Mathieu, 14.09.2026). Ein eigenes Zeichen in der Zeile
   und keine Randnotiz unten: wer die Liste ueberfliegt, soll seinen Namen
   finden, ohne zu lesen. Umrandet und nicht gefuellt - eine Zuweisung ist
   eine Angabe, keine Warnung, und die gefuellten Flaechen gehoeren in dieser
   Zeile schon dem Status.

   Seit dem 15.09.2026 koennen es mehrere sein - dann steht je Name eine
   Marke und nicht eine lange. Deshalb der Abstand nach rechts: sie sollen
   umbrechen duerfen, ohne aneinanderzukleben. */
.fuerwen {
  display: inline-block; margin: .25rem .25rem .125rem 0; white-space: nowrap;
  font-size: .75rem; font-weight: 600; line-height: 1;
  padding: .25rem .5rem; border-radius: var(--radius-pille);
  border: 1px solid var(--hair); color: var(--text-soft); background: transparent;
}

/* Die Zubereitung beim Anlegen: eine Zeile je Schritt, die Nummer davor
   (Mathieu, 14.09.2026). Die Nummer ist Anzeige und kein Eingabefeld - sie
   ergibt sich aus der Reihenfolge, und wer Zeile 2 leer laesst, bekommt
   trotzdem 1, 2, 3 auf dem Blatt. */
.hoschritte { display: grid; gap: .5rem; }
.hoschritt { display: flex; align-items: center; gap: .5rem; }
.hoschritt .honr {
  flex: 0 0 1.5rem; text-align: right; font-weight: 700; font-size: .875rem;
  color: var(--muted); font-variant-numeric: tabular-nums;
}
.hoschritt input { flex: 1 1 auto; min-width: 0; }
[data-schrittplus] { margin-top: .5rem; }

/* Wareneinsatz-Kalkulation an einem Hand Out (Mathieu, 21.09.2026: "Bau mir
   bei den Hand Outs eine Option die Kosten für die Gerichte & Getränke zu
   kalkulieren"). Eine Zeile je Zutat, drei Zeilen fuer sich statt einer
   breiten Tabelle - eine Tabelle mit fuenf Spalten passt auf einem Telefon
   nicht (430 px, am Prototyp vom 21.09.2026 gemessen: die Kosten-Spalte fiel
   aus dem Bild). Genau das Muster von .hoschritt daneben, nur mit mehreren
   Feldern je Zeile statt einem. */
.wzzeilen { display: grid; gap: 1rem; }
[data-wz-mehr] { margin-top: 1rem; }
.wzzeile { padding: .75rem 0; border-top: 1px solid var(--hair); }
.wzzeile:first-child { border-top: 0; padding-top: 0; }
.wzzeile select.wzartikel { width: 100%; margin-bottom: .4rem; }
.wzzeile input.wztext { width: 100%; margin-bottom: .5rem; }
.wzzahlen { display: flex; flex-wrap: wrap; align-items: center; gap: .4rem; }
.wzzahlen input, .wzzahlen select { min-width: 0; }
/* Als "input.wzmenge"/"input.wzpreis" statt nur ".wzmenge"/".wzpreis" - sonst
   verliert die Breite gegen die allgemeine Formularregel (input[type=text] ...
   { width: 100% }), die genauso spezifisch ist und im Stylesheet SPAETER
   steht. Gemessen am echten Hand Out (21.09.2026): "Menge" stand als eigene,
   volle Zeile da statt schmal neben der Einheit. */
.wzzahlen input.wzmenge { width: 4.5rem; flex: 0 0 auto; text-align: right; }
.wzzahlen select.wzeinheit { width: 4.5rem; flex: 0 0 auto; }
.wzzahlen input.wzpreis { width: 4.5rem; flex: 0 0 auto; text-align: right; }
.wzzahlen select.wzpreiseinheit { width: 4.5rem; flex: 0 0 auto; }
.wzkosten {
  margin-left: auto; font-weight: 650; font-variant-numeric: tabular-nums;
  white-space: nowrap; padding-left: .5rem;
}
.wzkosten.leer { color: var(--muted); font-weight: 400; font-size: .875rem; }
.wzsumme {
  display: flex; justify-content: space-between; align-items: baseline;
  padding-top: .75rem; margin-top: .25rem; border-top: 1px solid var(--hair-strong); font-weight: 650;
}
.wzsumme .wzsummezahl { font-size: 1.3125rem; font-variant-numeric: tabular-nums; }
.wzverkauf {
  display: flex; flex-wrap: wrap; align-items: center; gap: .5rem .75rem;
  margin-top: 1rem; padding-top: 1rem; border-top: 1px solid var(--hair);
}
.wzverkauf input { width: 6rem; text-align: right; }
.wzquote {
  margin-left: auto; display: flex; align-items: baseline; gap: .4rem;
  padding: .3rem .7rem; border-radius: var(--radius-xs); background: var(--fill);
  font-variant-numeric: tabular-nums;
}
.wzquote .zahl { font-size: 1.3125rem; font-weight: 700; }
/* Drei Stufen, dieselbe Idee wie ueberall in dieser App: nur ein Zustand ist
   ausdruecklich gut, die anderen sind neutral bzw. warnen (Mathieu, 06.09.2026,
   siehe auch die Ampel bei den Besetzungen). */
.wzquote.gut { background: var(--ok-soft); color: var(--ok-ink); }
.wzquote.mittel { background: var(--gold-soft); }
.wzquote.hoch { background: var(--crit-soft); color: var(--crit-ink); }
.wzohnepreis { color: var(--muted); font-size: .875rem; margin: .5rem 0 0; }

/* Und das Ergebnis - das Blatt zur Mixed Plate als Vorbild: die Nummer haengt
   links, zwischen den Schritten eine Haarlinie. Nur auf Hand Outs: im
   Handbuch ist eine nummerierte Liste eine Aufzaehlung, hier ist sie ein
   Ablauf, den jemand am Pass Schritt fuer Schritt abarbeitet. */
.hubpage.schritte ol {
  list-style: none; padding: 0; margin: .25rem 0 1rem;
  display: block; counter-reset: hoschritt;
}
.hubpage.schritte ol > li {
  counter-increment: hoschritt;
  display: flex; gap: .75rem; align-items: baseline;
  padding: .75rem 0; border-top: 1px solid var(--hair);
}
.hubpage.schritte ol > li:first-child { border-top: 0; padding-top: .25rem; }
.hubpage.schritte ol > li::before {
  content: counter(hoschritt) ".";
  flex: 0 0 1.4rem; font-weight: 700; color: var(--text-soft);
  font-variant-numeric: tabular-nums;
}

/* Das kleine Eventfenster ueber dem Tag (Mathieu, 13.09.2026). Orange, weil
   der Eventname im Wochenblock der Startseite schon orange ist - dieselbe
   Sache, dieselbe Farbe. Gebaut wie der Signalkasten der News: getoente
   Flaeche plus Kante links, nur kleiner und als LINK.
   Kontrast nachgerechnet: --wahl auf --wahl-soft sind 5,13:1 hell und
   7,42:1 dunkel - beides ueber den 4,5, die Text braucht. */
.tagevent {
  display: flex; align-items: center; gap: .5rem;
  margin: .5rem 0 0; padding: .5rem .75rem; min-height: 48px; box-sizing: border-box;
  background: var(--wahl-soft); border-left: 4px solid var(--wahl);
  border-radius: var(--radius-sm); text-decoration: none; color: var(--text);
}
.tagevent + .tagevent { margin-top: .25rem; }
.tevpunkt {
  flex: none; width: 8px; height: 8px; border-radius: 50%; background: var(--wahl);
}
.tevwas { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; gap: .125rem; }
.tevname {
  font-weight: 700; font-size: 1rem; letter-spacing: -.01em; color: var(--wahl);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.tevmeta { font-size: .75rem; color: var(--text-soft); }
.tevpfeil { flex: none; color: var(--wahl); font-weight: 700; }
/* Eine Idee ist nichts Festes: Umriss statt Flaeche - dieselbe
   Unterscheidung, die der Wochenblock der Startseite schon trifft. */
.tagevent.idee {
  background: transparent; border: 1px dashed var(--wahl); border-left-width: 4px;
}

td.name { font-weight: 600; white-space: nowrap; letter-spacing: -.006em; }
th.num, td.num { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; }
/* Etiketten sind Flaechen, keine Rahmen. Ein umrandetes Etikett zieht die
   Aufmerksamkeit auf seinen Rand, nicht auf sein Wort. */
/* Studio-Klarheit (Mathieu, 06.09.2026: "bau alles in dem design um", nach
   dem Waldgruen-Karten-Prototyp) - fette farbige Schrift statt Pille mit
   Hintergrundflaeche. Grosszuegigerer rechter Abstand ersetzt die Flaeche
   als Trennung in dichten Listen (Geburtstage, Abwesenheiten). */
/* Der Grundzustand ist ein Name, keine Handlung - also Tinte als Schrift.
   Die Zustaende darunter tragen die Bedeutung: rot fehlt, gruen bestaetigt,
   grau nichts. */
.tag {
  display: inline-block; font-size: .75rem; font-weight: 800; line-height: 1.4;
  letter-spacing: .01em; margin: 0 .5rem .25rem 0; padding: 0; border: 0;
  background: none; color: var(--text);
}
.tag.off { color: var(--crit); }
.tag.none { color: var(--muted); }
.tag.ok { color: var(--ok); }
.tag.warn { color: var(--warn); }
/* „geöffnet" - dieselbe Bauart wie die anderen Marken: nur Schrift, keine
   Flaeche. Eine gefuellte Marke waere in diesem Haus ein Knopf. */
.tag.wahl { color: var(--wahl); }
.notecell { color: var(--text-soft); font-size: .875rem; max-width: 22ch; }
/* --- Bedarfsraster: Kopfzahl je Stunde, anklickbar -------------------
   Mathieu, 07.09.2026: "Bau einfach unten so ne Tabelle nach die man
   anklicken kann +/-".
   Ohne das Skript stehen echte Zahlenfelder da (.brfeld sichtbar, .brz
   verborgen) - sie sind haesslich, aber bedienbar. Erst wenn das Skript
   laeuft, setzt es ".js" und die Rollen tauschen. */
.bedarfsraster { border-collapse: separate; border-spacing: 3px; }
.bedarfsraster th {
  font-size: .625rem; font-weight: 700; color: var(--muted);
  text-transform: none; letter-spacing: .04em; text-align: center;
  padding: 0 0 .25rem; font-variant-numeric: tabular-nums;
}
.bedarfsraster th.brnacht { color: var(--muted); }
.bedarfsraster td { padding: 0; }
.bedarfsraster td.brtag {
  font-weight: 700; font-size: .875rem; padding-right: .5rem;
  white-space: nowrap; text-align: right;
}
.brfeld { width: 3rem; text-align: center; padding: .25rem .125rem; font-size: .875rem; margin: 0; }
/* GETIPPT, nicht geklickt (Mathieu, 09.09.2026: "ich will sowas das ich es
   selbst eintippe"). Vorher war das Zahlenfeld unter .js versteckt und ein
   Klick zaehlte um eins hoch - fuer eine 4 also viermal klicken, und fuer
   eine ganze Woche ein paar hundert Klicks.
   Jetzt IST das Feld die Zelle: reinklicken, Zahl tippen, mit Tab zur
   naechsten Stunde. Pfeil hoch/runter zaehlt weiter wie vorher - das macht
   ein Zahlenfeld von selbst. Das Kaestchen darunter (.brz) wird damit
   ueberfluessig und bleibt in beiden Faellen verborgen. */
.brz { display: none; }
.bedarfsraster.js .brz, .kbedarf.js .brz { display: none; }
.bedarfsraster.js .brfeld, .kbedarf.js .brfeld {
  display: block; box-sizing: border-box;
  width: 2.3rem; height: 2.1rem; padding: 0; margin: 0;
  border-radius: var(--radius-xs); border: 1px solid var(--border);
  background: var(--surface-2); color: var(--muted);
  font-family: var(--f-text); font-size: .875rem; font-weight: 700;
  font-variant-numeric: tabular-nums; text-align: center;
  appearance: textfield; -webkit-appearance: none;
}
/* Die Spinner-Pfeile wuerden in 37 px Breite die Zahl verdraengen. */
.bedarfsraster.js .brfeld::-webkit-outer-spin-button,
.bedarfsraster.js .brfeld::-webkit-inner-spin-button,
.kbedarf.js .brfeld::-webkit-outer-spin-button,
.kbedarf.js .brfeld::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
/* Der Platzhalter ist der Gedankenstrich, den vorher das Kaestchen zeigte:
   ein leeres Feld heisst "kein Bedarf", nicht "noch nicht ausgefuellt". */
.bedarfsraster.js .brfeld::placeholder, .kbedarf.js .brfeld::placeholder { color: var(--muted); opacity: 1; }
/* Sechs Stufen: je mehr Leute, je satter. Darueber sieht man keinen
   Unterschied mehr, deshalb hoert es bei 6 auf.
   EINE Farbe, sechs Stufen. Vorher lief die Rampe Gold - Gold - Tuerkis -
   Pfirsich - Tuerkis - Tuerkis: das Pfirsich (#F2BC97) war ein Rest vom
   Terrakotta, und Gold heisst in dieser App "wartet". Eine Menge braucht
   eine Farbe, sonst liest man Stufen als Zustaende.
   Die Schriftfarbe springt zwischen Stufe 4 und 5 von Tinte auf Creme. Das
   ist kein Zufall: die Mitteltoene dieser Farbe (um #4F9490) kommen mit
   BEIDEN nur auf 3,3:1 - ein totes Band, in dem keine Schrift lesbar ist.
   Die Rampe springt darueber hinweg, jede Stufe hat 4,7:1 oder mehr.
   Die Rampe haengt am data-n der ZELLE (das Skript setzt es), nicht mehr an
   einer Klasse am Kaestchen - gefaerbt wird jetzt das Eingabefeld selbst. */
.bedarfsraster.js .brzelle[data-n="1"] .brfeld,
.kbedarf.js .brzelle[data-n="1"] .brfeld { background: var(--br1); border-color: var(--br2); color: var(--text); }
.bedarfsraster.js .brzelle[data-n="2"] .brfeld,
.kbedarf.js .brzelle[data-n="2"] .brfeld { background: var(--br2); border-color: var(--br3); color: var(--text); }
.bedarfsraster.js .brzelle[data-n="3"] .brfeld,
.kbedarf.js .brzelle[data-n="3"] .brfeld { background: var(--br3); border-color: var(--br4); color: var(--text); }
.bedarfsraster.js .brzelle[data-n="4"] .brfeld,
.kbedarf.js .brzelle[data-n="4"] .brfeld { background: var(--br4); border-color: var(--br5); color: var(--text); }
.bedarfsraster.js .brzelle[data-n="5"] .brfeld,
.kbedarf.js .brzelle[data-n="5"] .brfeld { background: var(--br5); border-color: var(--br5); color: var(--accent-ink); }
.bedarfsraster.js .brzelle[data-n="6"] .brfeld,
.kbedarf.js .brzelle[data-n="6"] .brfeld { background: var(--br6); border-color: var(--br6); color: var(--accent-ink); }
.bedarfsraster.js .brzelle.brviel .brfeld,
.kbedarf.js .brzelle.brviel .brfeld { background: var(--br6); border-color: var(--br6); color: var(--accent-ink); }
.bedarfsraster.js .brfeld:hover, .kbedarf.js .brfeld:hover { border-color: var(--deep); }
/* Das Feld traegt jetzt den Fokus selbst - die Zelle ist kein Knopf mehr. */
.bedarfsraster.js .brfeld:focus, .kbedarf.js .brfeld:focus {
  outline: 2px solid var(--accent); outline-offset: 2px; border-color: var(--accent);
}
/* Das getippte Bedarfsfeld ist beim Personalbedarf 2,3 rem breit; in der
   Kuechentabelle ist die Spalte breiter (halbe Stunden darunter), und ein
   festes Feld sass dann links in der Spalte - die Zahl stand nicht mehr ueber
   ihrer Stunde. Also die Spalte fuellen. */
.kbedarf.js .brfeld { width: 100%; }
/* Ein Feldsatz in den Einstellungen: mehrere Felder, die zusammen EINE Sache
   einstellen (die Arbeitgeberaufschlaege). Ohne eigene Regel malt der Browser
   seinen Standardrahmen - gemessen 2 px #EFEFEF, ein Grau, das in keinem der
   beiden Themen vorkommt und im Dunkeln als heller Kasten aufblitzt. Das war
   meine eigene Luecke: Klasse vergeben, Regel vergessen. */
.feldsatz {
  border: 1px solid var(--border); border-radius: var(--radius-sm);
  padding: 1rem 1rem 1rem; margin: 0 0 1rem; background: var(--surface-2);
}
.feldsatz > legend {
  padding: 0 .5rem; font-size: .875rem; font-weight: 700;
  letter-spacing: .04em; text-transform: uppercase; color: var(--muted);
}
.feldsatz .field:last-child { margin-bottom: 0; }

.brkopiezeile { display: flex; flex-wrap: wrap; gap: .5rem; align-items: center; margin: .75rem 0 .25rem; }
/* Der Fuss des Wochenblocks: Kalender und "alle Einsaetze". */
.wfuss { display: flex; flex-wrap: wrap; gap: .5rem; margin-top: .75rem; }
/* Die Woche in einer Zahl (Mathieu, 09.09.2026: "unten rechnet mir ein tool
   die gesamt und einzeln stunden zusammen"). Die Tagesspalte rechts sagt
   den Tag, hier steht die Woche. */
.brsummeWoche {
  margin: .75rem 0 0; padding-top: .5rem; border-top: 1px solid var(--hair);
  font-variant-numeric: tabular-nums;
}
.brsummeWoche b { font-size: 1.125rem; font-weight: 700; }

/* --- Kueche planen -------------------------------------------------------
   ZWEI Tabellen (Mathieu, 09.09.2026: "ich will eine extra tabelle nur für
   Küche"): oben der Kuechenbedarf, darunter wer ihn abdeckt.
   Der erste Versuch hatte sie mit automatischer Breite untereinander und sie
   liefen um 11 px auseinander - eine Tabelle mit automatischer Breite
   verteilt den uebrigen Platz anders, sobald die Zellen ein Pixel anders
   gebaut sind. Daraufhin hatte ich beides in eine Tabelle gelegt; das war
   eine technische Entscheidung und hat Mathieus Aufteilung aufgeloest.
   Jetzt handeln die Tabellen ihre Breite nicht mehr selbst aus: table-layout
   fixed plus ein colgroup mit denselben Breiten in beiden. Gemessen 0 px
   Versatz. */
/* Was nicht mehr zum Muster passt. Keine eigene Farbe: die Liste ist eine
   Feststellung, keine Warnung - rot heisst in dieser App "fehlt". Der Rahmen
   setzt sie ab, mehr braucht sie nicht. */
.kalt {
  margin-top: 1rem; padding: .75rem 1rem; border: 1px solid var(--hair);
  border-radius: var(--radius-sm); background: var(--fill);
}
.kalt h3 { margin: 0 0 .25rem; font-size: 1rem; }
.kalt .help { margin: 0 0 .5rem; }
.kaltliste { list-style: none; margin: 0; padding: 0; display: grid; gap: .5rem; }
.kaltliste li {
  display: flex; flex-wrap: wrap; align-items: baseline; gap: .5rem;
  font-size: .875rem; line-height: 1.35;
}
.kalttage { color: var(--text-soft); }
/* Das Haekchen und der Text danebem als EIN Ziel - am Handy ist die Zeile
   sonst 20 px hoch und das Kaestchen das einzige, was trifft. */
.kaltwahl { display: flex; align-items: baseline; gap: .5rem; cursor: pointer; min-height: 1.9rem; }
.kaltwahl input { margin: 0; flex: none; width: 1.1rem; height: 1.1rem; }
/* Zeiten brechen nicht mitten in der Uhrzeit um - .mono haette break-all. */
.kaltzeit { font-variant-numeric: tabular-nums; white-space: nowrap; color: var(--text-soft); }
/* In der Tabelle traegt dieselbe Klasse die Zeit einer Zeile - dort in der
   normalen Textfarbe, denn sie ist die Aussage der Zeile und keine Beigabe.
   Umbrechen darf sie auch dort nicht ("11:00-" / "18:00" war am Bild). */
.tabelle td.kaltzeit { color: inherit; }

.kbedarf, .kwer {
  table-layout: fixed; border-collapse: separate; border-spacing: 3px;
}
/* Die Namensspalte traegt den Namen UND die Abwesenheit dieser Woche. Mit
   8,6 rem war "Nicht verfügbar beantragt" um 158 px abgeschnitten - gemessen,
   nicht geschaetzt. Jetzt breiter, und die Marke in der Zeile ist kurz
   ("Nicht da?"); der ganze Satz steht darunter bei der Person. */
.kcol-name { width: 11.8rem; }
/* Breiter als beim Personalbedarf (2,3 rem), weil hier ZWEI Knoepfe in eine
   Stundenspalte muessen (halbe Stunden, Mathieu 09.09.2026). 3,4 rem geteilt
   sind je Haelfte 26 px - kein Daumenziel nach Apples 44 pt, aber dasselbe
   Raster wie vorher, und ein Fehlgriff trifft die Nachbarhaelfte und ist mit
   einem zweiten Tippen weg. Schmaler waere es geraten. */
.kcol-std { width: calc(3.4rem + 2px); }
/* Die letzte Spalte darf in beiden Tabellen VERSCHIEDEN breit sein, ohne die
   Ausrichtung zu stoeren: sie kommt nach den Stundenspalten, und was danach
   liegt, verschiebt nichts davor.
   Im Bedarf steht dort nur "20 h" - dort waeren 7 rem verschenkte Breite und
   die Tabelle muesste unnoetig scrollen. Bei den Personen steht die Uhrzeit
   dabei, die aus dem Klicken wird (11-19 Uhr). */
.kbedarf .kcol-summe { width: 3.6rem; }
/* 7,2 rem waren fuer "11-19 Uhr" gerechnet. Mit halben Stunden heisst es
   "11:30-18:00 Uhr", und GEMESSEN fehlten in JEDER Zeile 23 bis 103 px - die
   Uhrzeit, also genau die Auskunft, um die es in dieser Spalte geht, stand
   ausserhalb. Jetzt breiter UND umbrechend: zwei Bloecke an einem Tag
   ("11:00-14:00, 17:30-19:00") passen in keine Zeile, die noch aufs Handy
   geht - die duerfen zwei Zeilen haben. */
.kwer .kcol-summe { width: 8.6rem; }
.kbedarf th, .kwer th {
  font-size: .625rem; font-weight: 700; color: var(--muted);
  text-align: center; padding: 0 0 .25rem; font-variant-numeric: tabular-nums;
  letter-spacing: .04em;
}
.kbedarf td, .kwer td { padding: 0; }
.kbedarf td.brtag, .kwer td.brtag {
  font-weight: 700; font-size: .875rem; padding-right: .5rem;
  white-space: nowrap; text-align: right; overflow: hidden;
}
/* Die Summenspalte KLEBT rechts. Mit der Uhrzeit darin wurde die Tabelle 61
   px breiter als das Fenster, und damit stand die wichtigste neue Auskunft
   ("11-19 Uhr") ausgerechnet ausserhalb des Sichtfelds - gemessen, nicht
   vermutet. Sticht sie fest, ist sie immer da, egal wie weit man seitlich
   gescrollt hat. Der eigene Hintergrund ist dafuer noetig: sonst scrollen die
   Stundenzellen darunter durch. */
.kbedarf td.ksumme, .kwer td.ksumme {
  padding-left: .5rem; text-align: left; font-variant-numeric: tabular-nums;
  font-weight: 550; color: var(--muted); white-space: nowrap;
  position: sticky; right: 0; background: var(--surface); box-shadow: -6px 0 6px -6px rgba(0,0,0,.18);
}
.kbedarf th:last-child, .kwer th:last-child {
  position: sticky; right: 0; background: var(--surface);
}
/* Und die Tages-/Namensspalte klebt links - beim seitlichen Scrollen weiss man
   sonst nicht mehr, in welcher Zeile man ist. */
.kbedarf td.brtag:first-child, .kwer td.brtag:first-child,
.kbedarf th:first-child, .kwer th:first-child {
  position: sticky; left: 0; background: var(--surface); z-index: 1;
}
.kwer td.ksumme { white-space: normal; }
.kwer td.ksumme b { font-weight: 700; color: var(--text); }
/* Die Uhrzeit steht UNTER der Stundenzahl, nicht daneben: nebeneinander
   braeuchte die Spalte 14 rem, und dann scrollt man auf dem Handy an der
   Zahl vorbei, um die Zeit zu sehen. */
.kwer .kspanne { display: block; margin-left: 0; font-weight: 500; font-size: .75rem; }
.kspanne { display: inline-block; margin-left: .45em; font-weight: 500; font-size: .75rem; }
/* In der Personentabelle beginnt jeder Tag mit einer Linie und dem Kuerzel -
   dann liest man die zwei Zeilen als ein Paar. */
.kwer tr.ktagstart td { border-top: 1px solid var(--hair); padding-top: 5px; }
.kwer tr.ktagstart:first-child td { border-top: 0; padding-top: 0; }
.kwtag { display: inline-block; min-width: 1.9rem; text-align: left; color: var(--muted); }
.kwtag.leer { visibility: hidden; }
.kwer td.kpname { display: flex; align-items: center; gap: .25rem; justify-content: flex-start; }
.kwer td.kpname .wchip { font-size: .75rem; }

/* Eine Stunde einer Person - und zwar in ZWEI Haelften: links :00, rechts
   :30. Geteilt wird die ZELLE, nicht die Tabelle: die Stundenspalten liegen
   weiter genau ueber denen im Kuechenbedarf, und der Bedarf bleibt
   stuendlich. Die 2 px Fuge dazwischen sind die ganze Erklaerung dafuer, dass
   es zwei Knoepfe sind - ohne sie sieht eine besetzte Stunde aus wie vorher
   und niemand kommt auf die Idee, die Haelfte anzutippen. */
.kwer td.kzelle { padding: 3px 0; }
/* 1 px innen gegen 3 px Zellenabstand: die zwei Haelften einer Stunde
   gehoeren enger zusammen als zwei Stunden. Mit 2 px war der Unterschied am
   Bild nicht zu sehen, und eine Stunde las sich nicht mehr als eine Einheit. */
.kzelle .khaelften { display: flex; gap: 1px; }
.kzelle .khalb {
  display: block; box-sizing: border-box; flex: 1 1 0; min-width: 0; height: 1.75rem;
  background: transparent; border: 1px dashed var(--hair-strong); border-radius: var(--radius-klein);
}
/* Aussen rund, innen kantig: die zwei Haelften einer besetzten Stunde lesen
   sich damit als ein Balken mit einer Kerbe, nicht als zwei Kaestchen. */
.kzelle .khalb:first-child { border-radius: 6px 2px 2px 6px; }
.kzelle .khalb:last-child { border-radius: 2px 6px 6px 2px; }
/* Drei Stufen, und die mittlere ist die wichtigste:
     kein Bedarf, niemand da  -> blasse gestrichelte Linie (nur Raster)
     BEDARF, niemand da       -> deutlicher Rahmen: das ist ein Loch
     jemand da                -> gefuellt in seiner Farbe
   Zuerst stand hier --border-strong. Gemessen waren das im Dunkeln 2,05:1
   gegen den Zeilengrund - ein Loch, das man nicht sieht, ist keine Auskunft.
   Mit --muted sind es 7,0:1 im Dunkeln und 6,5:1 im Hellen. */
.kzelle.gebraucht .khalb { border-style: solid; border-color: var(--muted); }
/* Gefuellt kommt NACH dem Loch-Rahmen, sonst gewinnt der graue Rand ueber
   die Farbe (gleiche Spezifitaet, spaetere Regel gewinnt). */
.kzelle .khalb.an { border-style: solid; }
.kzelle .khalb.an.w-0 { background: var(--pf1); border-color: var(--pf1); }
.kzelle .khalb.an.w-1 { background: var(--pf2); border-color: var(--pf2); }
.kzelle .khalb.an.w-2 { background: var(--pf3); border-color: var(--pf3); }
.kzelle .khalb.an.w-3 { background: var(--pf4); border-color: var(--pf4); }
.kwer.js .khalb { cursor: pointer; }
.kwer.js .khalb:hover { border-color: var(--deep); }
.kwer.js .khalb:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }

/* --- Und dasselbe auf dem Handy ------------------------------------------
   GEMESSEN bei 390 px: die Namensspalte (189 px) und die Summenspalte
   (138 px) waren zusammen 327 px breit - bei 322 px Sichtfeld blieben NULL
   Stunden uebrig. Man scrollte also zwischen zwei festgeklebten Spalten hin
   und her und sah das Raster nie. (Schlecht war das schon vorher, mit den
   halben Stunden wurde es unmoeglich.)
   Auf dem Handy also: schmalere Raender, engere Stunden - und die
   Abwesenheitsmarke fliegt aus der ZEILE raus. Sie steht ohnehin zweimal
   dort, wo mehr Platz ist: die Zeile ist blass, und unten bei der Person
   steht der ganze Satz. */
@media (max-width: 700px) {
  /* 6 rem waren am Bild um 2 px zu knapp - der Namensschnipsel wurde rechts
     angeschnitten. Gemessen, nicht geschaetzt. */
  .kcol-name { width: 6.3rem; }
  .kwer .kcol-summe { width: 5.6rem; }
  .kcol-std { width: calc(2.7rem + 2px); }
  /* Eine Haelfte ist am Handy 22 px breit. Das ist unter Apples 44 pt und
     bleibt es auch - die Spalte muss dieselbe sein wie im Bedarf darueber.
     Also mehr Hoehe: 22 x 35 statt 22 x 28. */
  .kzelle .khalb { height: 2.2rem; }
  .kwer td.kpname .tag { display: none; }
  .kwer td.brtag, .kbedarf td.brtag { padding-right: .25rem; font-size: .75rem; }
  .kwer td.ksumme, .kbedarf td.ksumme { padding-left: .25rem; }
  .kwtag { min-width: 1.4rem; }
  .kwer .kspanne { font-size: .75rem; }
}

/* --- Kalender abonnieren (Mitarbeiterseite) ------------------------------
   Die Adresse ist lang und darf niemals aus der Karte laufen: sie ist das,
   was man kopieren muss. Also umbrechen - auch mitten im Wort, ein Schlüssel
   hat keine Silben. */
.abo { display: flex; flex-direction: column; gap: .75rem; margin-top: 1rem; }
.abolink {
  display: flex; flex-wrap: wrap; gap: .5rem; align-items: center;
  padding: .75rem .75rem; border-radius: var(--radius-sm); background: var(--surface-2);
  border: 1px solid var(--hair);
}
.abolink code {
  flex: 1 1 14rem; min-width: 0; font-size: .75rem; line-height: 1.45;
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
  overflow-wrap: anywhere; color: var(--text);
}
.aboschritte { margin: 0; padding-left: 1.25rem; display: flex; flex-direction: column; gap: .5rem; }
.aboschritte li { line-height: 1.5; }

/* Der Stand des Sofort-Speicherns. Gruen nur, wenn es wirklich angekommen
   ist; rot, wenn nicht. Eine Zusage, die nicht stimmt, ist schlimmer als ein
   Knopf - darum bleibt der Speichern-Knopf daneben stehen. */
.kstand { font-size: .875rem; color: var(--muted); font-variant-numeric: tabular-nums; }
.kstand.gut { color: var(--ok); font-weight: 600; }
.kstand.schlecht { color: var(--crit); font-weight: 600; }

/* Der Namensschnipsel. Traegt die Farbe als Flaeche und den Namen darauf -
   creme im Hellen, Tinte im Dunkeln, beides ueber 5:1 nachgerechnet. */
.wchip {
  display: inline-flex; align-items: center; padding: .125rem .5rem;
  border-radius: var(--radius-pille); font-size: .875rem; font-weight: 650; white-space: nowrap;
}
.wchip.w-0 { background: var(--pf1); color: var(--pf-ink); }
.wchip.w-1 { background: var(--pf2); color: var(--pf-ink); }
.wchip.w-2 { background: var(--pf3); color: var(--pf-ink); }
.wchip.w-3 { background: var(--pf4); color: var(--pf-ink); }

/* Und darunter die Zahlen, um die es Mathieu eigentlich geht (09.09.2026:
   "unten drunter soll dann stehen wieviel Stunden victor & vincent laut
   plannung haben mit den überschneidungen etc"). */
.wsummen { display: flex; flex-direction: column; gap: .5rem; margin-top: 1rem; }
.wperson {
  display: flex; flex-wrap: wrap; align-items: center; gap: .25rem .75rem;
  padding: .5rem .75rem; border: 1px solid var(--border); border-radius: var(--radius-sm);
  background: var(--surface-2);
}
.wpzahl { font-variant-numeric: tabular-nums; }
.wpzahl b { font-size: 1.125rem; font-weight: 700; }
.wpoffen, .wpteil { color: var(--muted); font-size: .875rem; font-variant-numeric: tabular-nums; }
/* Was in dieser Woche ausfaellt. Kein Rot: es ist keine Panne, dass jemand
   Urlaub hat - aber es muss auffallen, weil die Zahlen daneben das MUSTER
   sind und nicht diese Woche. */
.wpweg { color: var(--warn); font-size: .875rem; font-weight: 550; flex: 1 1 100%; }
.wpweg b { font-weight: 700; }
/* Eine Zeile, in der die Person abwesend ist: die Balken bleiben stehen (das
   Muster gilt weiter), aber sie treten zurueck. */
.kwer tr.kweg .khalb { opacity: .38; }
.kwer tr.kweg td.kpname .wchip { opacity: .6; }
.wpraus { margin-left: auto; }
.wgesamt {
  display: flex; flex-wrap: wrap; gap: .25rem 1.5rem;
  padding: .75rem .75rem 0; border-top: 1px solid var(--hair);
  font-variant-numeric: tabular-nums;
}
/* Der Weg ohne Skript: die Stunden als Zahlen. Das Skript versteckt diesen
   Block - die Felder bleiben aber das, was abgeschickt wird, damit es nicht
   zwei Wege in die Datenbank gibt. */
.wfeldperson { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem; margin-bottom: .5rem; }
.wfeldreihe { display: flex; flex-wrap: wrap; gap: .5rem; }
.wfeldtag { display: flex; flex-direction: column; gap: .125rem; font-size: .75rem; color: var(--muted); }
.wfeldtag input { width: 7rem; min-height: 44px; font-size: .875rem; }
.kkurz { display: none; }
@media (max-width: 560px) {
  .wpraus { margin-left: 0; }
  /* Am Handy frisst "Donnerstag braucht" eine ganze Stundenspalte. Die
     Kurzform gewinnt sie zurueck - gemessen etwa 50 px, also eine Spalte
     mehr im Blick. */
  .klang { display: none; }
  .kkurz { display: inline; }
  .kbedarf td.kbedarfname { font-size: .75rem; }
}

/* Die Meldungen: ein Satz je Abweichung. Eine Farbe muss man suchen, einen
   Satz liest man - darum stehen sie ueber dem Raster und nicht nur darin. */
.bmliste { list-style: none; margin: .5rem 0 0; padding: 0; display: flex; flex-direction: column; gap: .5rem; }
.bmeldung {
  display: flex; flex-wrap: wrap; align-items: baseline; gap: .25rem .75rem;
  padding: .5rem .75rem; border-radius: var(--radius-xs);
  border: 1px solid var(--border); background: var(--surface-2);
  border-left: 3px solid var(--muted);
}
.bmeldung.fehlt { border-left-color: var(--crit); }
.bmeldung.zuviel { border-left-color: var(--gold); }
.bmwann { font-family: var(--f-text); font-weight: 700; font-size: .875rem; font-variant-numeric: tabular-nums; }
.bmzahl { font-family: var(--f-text); font-weight: 700; font-size: .75rem; }
.bmeldung.fehlt .bmzahl { color: var(--crit); }
.bmeldung.zuviel .bmzahl { color: var(--gold); }
.bmdetail { font-size: .875rem; color: var(--muted); margin-left: auto; font-variant-numeric: tabular-nums; }
.bmdetails > summary {
  cursor: pointer; font-family: var(--f-text); font-weight: 600; font-size: .875rem;
  color: var(--accent); padding: .25rem 0;
  text-decoration: underline; text-underline-offset: .18em;
}
.bmdetails > summary:hover { color: var(--accent-hover); }

/* --- "Wo noch Leute fehlen" auf der Startseite --------------------------
   Eine Zeile je Tag, die ganze Zeile ist der Weg zum Eintragen. */
.luecken { display: flex; flex-direction: column; gap: .5rem; }
.luecke {
  display: grid;
  grid-template-columns: auto 1fr auto auto;
  align-items: center; gap: .25rem .75rem;
  padding: .5rem .75rem; border-radius: var(--radius-sm);
  border: 1px solid var(--border); background: var(--surface-2);
  color: var(--text); text-decoration: none;
}
.luecke:hover { background: var(--fill); border-color: var(--border-strong); }
.lktag { font-family: var(--f-text); font-weight: 700; font-size: .875rem; white-space: nowrap; }
.lkdat { font-weight: 500; font-size: .75rem; color: var(--muted); }
.lkbalken {
  height: .45rem; border-radius: var(--radius-pille); background: var(--hair); overflow: hidden; min-width: 3rem;
}
.lkbalken > span { display: block; height: 100%; background: var(--gruen); border-radius: var(--radius-pille); }
.lkzahl {
  font-family: var(--f-text); font-size: .75rem; font-weight: 600;
  color: var(--muted); white-space: nowrap; font-variant-numeric: tabular-nums;
}
.lkpfeil { color: var(--muted); font-size: 1rem; line-height: 1; }
/* Die Spitze bricht auf eine eigene Zeile um - auf einem Handy ist neben
   Tag, Balken und Bruch kein Platz fuer einen ganzen Satz. */
.lkspitze {
  grid-column: 1 / -1;
  font-size: .75rem; font-weight: 600; color: var(--accent-hover);
  font-family: var(--f-text);
}
.brkopiezeile select { width: auto; padding: .25rem .5rem; font-size: .875rem; }

/* --- Aufklappbare Panels (z.B. "Mitarbeiter hinzufuegen") --- */
details.panel { border: 1px solid var(--hair); border-radius: var(--radius-sm); background: var(--fill); margin-bottom: 1rem; }
details.panel > summary {
  cursor: pointer; list-style: none; padding: .75rem 1rem;
  font-weight: 650; font-size: 1rem; display: flex; align-items: center; gap: .5rem;
  min-height: 48px; border-radius: var(--radius-sm);
}
details.panel > summary::-webkit-details-marker { display: none; }
details.panel > summary::before {
  content: "+"; font-family: var(--f-text); font-size: 1.3125rem; line-height: 1;
  width: 26px; height: 26px; border-radius: var(--radius-xs); flex: none;
  display: inline-flex; align-items: center; justify-content: center;
  background: var(--accent); color: var(--accent-ink);
}
details.panel[open] > summary::before { content: "\2212"; }
details.panel[open] > summary { border-bottom: 1px solid var(--hair); border-radius: var(--radius-sm) var(--radius-sm) 0 0; }
details.panel .panel-body { padding: 1rem 1rem 1.25rem; background: var(--surface); border-radius: 0 0 var(--radius-sm) var(--radius-sm); }
details.panel .panel-body .field:last-of-type { margin-bottom: 1rem; }

/* "Dein Plan" als LISTE, nicht als Karten in einer Karte (Mathieu,
   17.09.2026). Gemessen hatte die alte Zeile exakt denselben Farbton wie die
   Karte, in der sie lag - getrennt nur durch einen Rahmen. Ein Kasten im
   Kasten, der keiner sein wollte. Jetzt trennt eine Haarlinie, und die
   Flaeche der Karte traegt die ganze Liste.

   Die Zahl links ist dieselbe Schiene wie im Wochenblock: wer beide Seiten
   kennt, findet den Tag am selben Ort. */
.planliste { display: flex; flex-direction: column; }
.planzeile {
  display: flex; align-items: center; gap: .75rem;
  padding: .75rem .25rem; border-top: 1px solid var(--hair); min-width: 0;
}
.planzeile:first-child { border-top: 0; }
.planzeile.vorbei { opacity: .78; }
.pztag { flex: none; width: 2.6rem; text-align: center; }
.pztag b {
  display: block; font-size: 1.3125rem; font-weight: 800; line-height: 1;
  letter-spacing: -.02em; font-variant-numeric: tabular-nums;
}
.pztag > span {
  display: block; margin-top: .125rem; font-size: .625rem; font-weight: 700;
  letter-spacing: .06em; text-transform: uppercase; color: var(--muted);
}
.pzinhalt { flex: 1 1 auto; min-width: 0; }
.pzinhalt > b { display: block; font-size: 1.125rem; font-weight: 600; letter-spacing: -.012em; line-height: 1.3; }
.pzinhalt > span { display: block; margin-top: .125rem; font-size: .875rem; color: var(--muted); }
/* Das hochgestellte "+1" bleibt IN der Zeile - als Block saesse es darunter. */
.pzinhalt .nextday { display: inline; }
.pzinhalt .tag { margin-top: .25rem; }
/* Der Weg in den Kalender ist ein Zeichen, kein Knopf: er stand viermal
   untereinander in voller Breite. 44 px bleibt er trotzdem.

   Die FARBE traegt den Zustand (Mathieu, 17.09.2026: "den kalender button
   in einer farbe zum eintragen und dann grau wenn man sie eingetragen
   hat"). Orange, solange die Schicht noch nicht im Kalender liegt - dieselbe
   Tinte wie "To-Do melden": "sieh hier hin, das fehlt noch". Sobald
   PLANKAL_SCRIPT den Klick gemerkt hat, wird das Zeichen grau wie jedes
   erledigte Element in der App. Der Zustand liegt in localStorage und ist
   damit GERAETE-Eigenschaft, nicht Datenbank: die App weiss nicht, ob die
   Datei am Ende wirklich im Kalender landete, nur dass sie heruntergeladen
   wurde. */
.pzkal {
  flex: none; display: flex; align-items: center; justify-content: center;
  width: 44px; height: 44px; border-radius: var(--radius-pille);
  background: var(--wahl-soft); color: var(--wahl); text-decoration: none;
}
.pzkal svg { width: 19px; height: 19px; }
.pzkal:hover { filter: brightness(1.05); text-decoration: none; }
.pzkal:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.pzkal.ist-drin { background: var(--fill); color: var(--muted); }
.pzkal.ist-drin:hover { background: var(--surface-3); color: var(--text); filter: none; }

.emplist { display: grid; gap: .75rem; }
.emprow {
  border: 1.5px solid var(--border); border-radius: var(--radius-sm);
  padding: .75rem 1rem; background: var(--surface);
  display: grid; gap: .5rem;
}
/* Ausgeblendet: die vierte Tinten-Stufe statt Deckkraft auf der ganzen
   Zeile. "opacity" nahm auch dem Rand und den Knoepfen die Deckung - die
   Zeile war dann nicht „leise", sondern unscharf. */
.emprow.inactive .who, .emprow.inactive .meta { color: var(--text-aus); }
/* Die Zeile, die gerade offen ist. Drei Dinge auf einmal, weil im Dunkeln
   keines davon allein reicht:
     die KANTE links (4 px, satt)  - die traegt es, 7,3:1
     die TOENUNG                    - sie macht daraus ein Feld, 1,78:1
     der NAME im Ton                - damit es auch ohne Farbsehen zu lesen
                                      ist, steht daneben noch das Wort
                                      „geöffnet"
   Kein Verlassen auf die Farbe allein: die Marke sagt es in Worten.
   padding-left minus 3 px, damit die Zeile durch die dickere Kante nicht
   um 2,5 px aus der Reihe springt - am Bild gesehen. */
.emprow.gewaehlt {
  border-color: var(--wahl); border-left-width: 4px; padding-left: calc(1rem - 2.5px);
  background: var(--wahl-soft);
}
.emprow.gewaehlt .who { color: var(--wahl); }
/* Vergessen auszustempeln (16.10.2026): die rote Kante wie bei krank - das
   Wort "vergessen?" daneben sagt es auch ohne Farbe. */
.emprow.vergessen { border-left: 4px solid var(--crit); padding-left: calc(1rem - 2.5px); }
/* Dasselbe in einer TABELLE (Kontrolllisten). Eine Tabellenzeile kann keinen
   eigenen Rahmen tragen, ohne das Raster zu verziehen - also traegt die
   erste Zelle die Kante, und die Toenung liegt auf allen Zellen. */
.tabelle tr.gewaehlt > td { background: var(--wahl-soft); }
.tabelle tr.gewaehlt > td:first-child {
  box-shadow: inset 4px 0 0 0 var(--wahl); font-weight: 700; color: var(--wahl);
}

/* Eine Zeile, die zu einer eigenen Seite fuehrt (Events auf der Startseite).
   Der Pfeil ist die einzige Stelle, an der man das sieht - deshalb steht er
   da und nicht nur eine Hand beim Zeigen. */
.emprow-link {
  grid-template-columns: 1fr auto; align-items: center;
  text-decoration: none; color: inherit;
}
.emprow-link:hover { border-color: var(--accent); text-decoration: none; }
.emprow-pfeil { font-size: 1.5rem; line-height: 1; color: var(--muted); }
/* Eine Stammdaten-Zeile, die sich aufklappen laesst: zugeklappt eine Zeile
   der Liste, aufgeklappt das Formular zum Aendern. Sieht aus wie .emprow, ist
   aber ein <details> - deshalb eigene Regeln statt einer geteilten Klasse, die
   in beiden Rollen nie ganz passt. */
.artikelzeile {
  border: 1.5px solid var(--border); border-radius: var(--radius-sm);
  background: var(--surface);
}
.artikelzeile > summary {
  display: flex; flex-wrap: wrap; align-items: baseline; gap: .25rem .75rem;
  padding: .75rem 1rem; min-height: 48px; cursor: pointer; list-style: none;
}
.artikelzeile > summary::-webkit-details-marker { display: none; }
.artikelzeile > summary::after {
  content: '›'; margin-left: auto; font-size: 1.125rem; line-height: 1; color: var(--muted);
  transition: transform .12s ease;
}
.artikelzeile[open] > summary::after { transform: rotate(90deg); }
.artikelzeile > summary .who { font-weight: 650; font-size: 1rem; }
/* Der Name traegt, die Beschreibung steht zurueck. Ohne diese Zeile erbten
   beide dieselbe Tinte - gemessen 14,75:1 fuer beide - und die Zeile war
   eine Wand aus gleich lautem Text statt einer Zeile mit einem Namen. */
.artikelzeile > summary .meta { color: var(--muted); font-size: .875rem; }
.artikelzeile > summary:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: var(--radius-sm); }
.artikelzeile[open] { border-color: var(--border-strong); }
.artikelzeile.still > summary .who, .artikelzeile.still > summary .meta { color: var(--text-aus); }
.artikelzeile > .panel-body { padding-top: 0; }

/* Die Notfallcodes. Sie stehen genau einmal da und werden abgeschrieben oder
   ausgedruckt - also gross, in Zweierspalten und mit genug Luft, dass man
   beim Abtippen nicht in der Zeile verrutscht. */
/* Die Einleitung beim ersten Oeffnen. Sie steht ganz oben und darf das auch
   zeigen: eine getoente Flaeche, damit sie sich vom Rest abhebt, aber ohne
   Ausrufezeichen - es ist ein Angebot und keine Warnung. Die Tinte bleibt
   Marine, wie bei jeder Handlung in dieser App. */
/* Die Karte lag ganzflaechig auf der Handlungsfarbe. Auf dem alten Marine
   fiel das nicht auf; auf dem neuen schwarzen Grund (17.09.2026) war sie der
   eine blaue Block auf der Seite. Jetzt traegt sie den Ton der Karte und
   sagt "Handlung" ueber die KANTE - dieselbe Bauart wie die Bereichstoene
   (.ton-*) und wie der Notiztrog. Eine Sprache, nicht drei. */
.card.appintro {
  border-color: var(--accent);
  background: var(--surface);
  box-shadow: inset 4px 0 0 var(--accent);
}
.card.appintro h2 { margin-bottom: .25rem; }
.card.appintro .applist { margin-top: .75rem; }
.card.appintro .lede { margin-bottom: .75rem; }
.card.appintro #installknopf { margin-bottom: .25rem; }

/* "Wie geht das?" - die Schritte liegen einen Tipp entfernt statt dauernd
   im Weg (14.09.2026). Der Griff sieht aus wie ein Link und faellt trotzdem
   unter den Daumen: 44 Pixel, wie jede andere Handlung in dieser App. */
.appschritte > summary {
  display: inline-flex; align-items: center; gap: .5rem;
  min-height: 44px; cursor: pointer; list-style: none;
  font-weight: 600; font-size: 1rem; color: var(--text);
  text-decoration: underline; text-underline-offset: 3px;
}
.appschritte > summary::-webkit-details-marker { display: none; }
.appschritte > summary::after {
  content: ""; flex: none; width: .45rem; height: .45rem;
  border-right: 2px solid currentColor; border-bottom: 2px solid currentColor;
  transform: rotate(45deg) translate(-2px, -2px); transition: transform .12s ease;
}
.appschritte[open] > summary::after { transform: rotate(-135deg) translate(-2px, -2px); }
.appschritte > summary:focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; border-radius: var(--radius-klein); }

/* Der Hinweis zum Installieren. Schmal und ruhig: wer sich dagegen entschieden
   hat, soll nicht bei jedem Aufruf gegen eine Wand laufen - aber er soll ihn
   wiederfinden, wenn er es sich anders ueberlegt. */
.apphinweis {
  margin: 1.5rem 0 0; text-align: center; font-size: .875rem; line-height: 1.5;
  color: var(--muted); max-width: 34rem; margin-inline: auto;
}
.apphinweis a { font-weight: 600; color: var(--text); }

/* Die Schritte auf der Anleitungsseite. Nummeriert, mit Luft dazwischen -
   das liest jemand mit dem Handy in der einen und der Anleitung in der
   anderen Hand. */
.applist { margin: .25rem 0 0; padding-left: 1.5rem; display: grid; gap: .5rem; }
.applist li { font-size: 1rem; line-height: 1.5; }
.applist strong { font-weight: 650; }

.codeliste {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(9rem, 1fr));
  gap: .5rem; margin: 1rem 0;
}
.codeliste span {
  background: var(--fill); border: 1px solid var(--hair); border-radius: var(--radius-sm);
  padding: .5rem .75rem; font-size: 1rem; letter-spacing: .05em; text-align: center;
}
@media print {
  /* Beim Ausdrucken zaehlt nur diese Liste. */
  .codeliste span { border-color: #000; }
}

/* Der Aenderungsverlauf einer Schicht. Zugeklappt eine Zeile, aufgeklappt die
   Liste - ein Nachweis, den man vorzeigen kann, ohne dass er den Alltag
   zustellt. */
.korrekturen { margin-top: .5rem; }
.korrekturen > summary {
  display: flex; align-items: center; gap: .5rem; cursor: pointer; list-style: none;
  min-height: 32px; font-size: .875rem; font-weight: 600; color: var(--text-soft);
}
.korrekturen > summary::-webkit-details-marker { display: none; }
.korrekturen > summary::before { content: '›'; font-size: 1.125rem; line-height: 1; transition: transform .12s ease; }
.korrekturen[open] > summary::before { transform: rotate(90deg); }
.korrekturen > summary:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: var(--radius-sm); }
.korrliste { margin: .25rem 0 0; padding-left: 1.5rem; display: grid; gap: .25rem; }
.korrliste li { font-size: .875rem; line-height: 1.45; color: var(--text-soft); }
.korrliste b { color: var(--text); font-weight: 650; }

.emprow .top { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem .75rem; }
.emprow .who { font-weight: 650; font-size: 1rem; }
.emprow .meta { color: var(--muted); font-size: .875rem; }
.emprow .actions { margin-left: auto; display: flex; flex-wrap: wrap; gap: .5rem; }
.linkrow { display: flex; gap: .5rem; align-items: stretch; flex-wrap: wrap; }
.linkrow input { flex: 1 1 260px; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: .875rem; }


/* --- Dienstplan --- */
.planstatus {
  display: flex; flex-wrap: wrap; gap: .75rem 1.25rem; align-items: center; justify-content: space-between;
  background: var(--surface-2); border: 1px solid var(--border); border-radius: var(--radius-sm);
  padding: .75rem 1rem; color: var(--text-soft);
}
.planstatus strong { color: var(--text); }
.planstatus > div:first-child { flex: 1 1 15rem; min-width: 0; }
.pubbox { display: flex; flex-wrap: wrap; gap: .5rem .75rem; align-items: center; flex: none; }
.pubbox form { display: contents; }
@media (max-width: 600px) {
  .planstatus { align-items: stretch; }
  .pubbox { flex: 1 1 100%; }
  .pubbox form { display: block; width: 100%; }
  .pubbox .btn { width: 100%; }
}

.planday {
  background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius);
  box-shadow: var(--shadow); padding: 1rem 1rem 1rem;
}
/* Der Schichtblock: Kopfzeile mit Name links und Zeit rechts, darunter die
   Eingeteilten. Der Name schrumpft, die Zeit ist geschuetzt - sie ist die
   Information, die man sucht. */
.slot { padding: .5rem 0 .5rem; border-top: 1px solid var(--hair); }
.slot:first-of-type { border-top: none; padding-top: .25rem; }
.slothead { display: flex; align-items: baseline; gap: .5rem; }
.slotname {
  font-weight: 600; font-size: 1rem; letter-spacing: -.006em;
  min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.slothead .value { font-size: .875rem; }
/* Die Zahl-Plakette neben der Schichtzeit ist seit dem 15.10.2026 weg - man
   sieht die Leute direkt darunter. */
.slotbody { min-width: 0; margin-top: .5rem; }
/* "niemand eingeteilt" ist am 12.09.2026 entfallen: an der Stelle steht jetzt
   die leere Huelle, und die sagt dasselbe - nur kann man sie druecken. */

/* Die leere Huelle: sieht aus wie eine eingeteilte Person, nur gestrichelt
   (Mathieu, 12.09.2026: "so eine Huelle zu haben wie bei einer eingeteilten
   schicht, dort drueckt man drauf und dann kommen direkt vorschlaege").
   Vorher war es ein Textlink unter der Liste - man musste erst lesen, wo man
   klickt. */
/* Spezifisch genug, um die inline-block-Regel der Fusszeile zu schlagen: die
   Huelle ist eine Zeile, kein Knopf neben "Zeiten anpassen". */
.slotbody > details.slotadd.huelle { display: block; margin-top: .5rem; margin-right: 0; }
.huellenzeile {
  display: flex; align-items: center; gap: .5rem; cursor: pointer;
  padding: .25rem .5rem; border-radius: var(--radius-sm);
  border: 1.5px dashed var(--border); background: transparent;
  list-style: none;
}
.huellenzeile::-webkit-details-marker { display: none; }
.huellenzeile:hover { background: var(--fill); border-color: var(--accent); }
.huellenzeile:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
/* .crewav faerbt den Kreis gruen - hier muss er leer bleiben, also eine
   Klasse mehr im Selektor. */
.crewav.huellenav {
  background: transparent; border: 1.5px dashed var(--border);
  color: var(--muted); font-size: 1rem; font-weight: 600;
}
.huellenzeile:hover .crewav.huellenav { border-color: var(--accent); color: var(--accent); }
.huellentext { font-size: .875rem; font-weight: 620; color: var(--text-soft); }
/* Wie viele Namen hinter dem Klick warten - das ist die Auskunft, die
   entscheidet, ob sich das Aufklappen lohnt. */
.huellenhint { margin-left: auto; font-size: .75rem; color: var(--muted); }
details.slotadd.huelle[open] > .huellenzeile {
  border-style: solid; border-color: var(--accent); background: var(--fill);
}

/* Eine eingeteilte Person ist eine Zeile, kein Chip: Kreis mit den Initialen,
   der Name gross, darunter woher die Einteilung kommt, rechts der Hinweis.
   Im Chip stand beides nebeneinander und der Name wurde eng. */
.crewlist { display: flex; flex-direction: column; gap: .25rem; min-width: 0; }
.crew {
  display: flex; align-items: center; gap: .5rem; min-width: 0; flex-wrap: wrap;
  padding: .25rem .5rem; border-radius: var(--radius-sm); background: var(--surface-2);
}
.crew.crew-pending { background: var(--gold-soft); border: 1px dashed var(--gold); }
/* Bestaetigt = Waldgruen, statt optisch gleich mit einer noch
   unbestaetigten Einteilung (Mathieu, 06.09.2026: "Schichten die eingetragen
   und bestaetigt sind waldgruen machen und dadurch hervorheben").
   Das stand hier zweimal falsch. Erst teilten sich beide Zustaende denselben
   Gruenton. Dann stand hier --accent-soft, und es sah nur deshalb gruen aus,
   weil die Aktionsfarbe damals ein Waldgruen war - der Kommentar an dieser
   Stelle hat das selbst zugegeben. Mit dem Wechsel auf Tuerkis (08.09.2026)
   war "bestaetigt" ploetzlich tuerkis, also dieselbe Farbe wie "hier
   tippen". Jetzt stehen die echten Gruen-Variablen da, und die Zustaende
   sind dieselben wie bei den Kreisen in "Schicht eintragen": gruen
   bestaetigt, gold wartet. Ein Status nimmt nie die Aktionsfarbe. */
.crew.crew-confirmed { background: var(--ok-soft); border: 1px solid var(--gruen); }
/* Krank (ersetzt) - Mathieu, 04.10.2026: die Schicht einer kranken Person
   bleibt als Nachweis stehen, "rot hinterlegt". Die Fehler-Familie (--crit),
   nicht --news: Rot ist dort fuer Neuigkeiten reserviert.
   Nie nur Farbe: das Wort "krank" steht immer dabei, der Name ist
   durchgestrichen (er ist kein Kopf mehr), die gestrichelte Kante sagt
   "Nachweis, nichts zum Antreten". Die Flaeche ist nur rot, solange noch
   etwas zu tun ist (Ersatz fehlt) - ist ersetzt, liegt sie leise da. */
.crew.crew-krank {
  background: var(--crit-soft); border: 1px dashed var(--crit); border-left: 4px solid var(--crit);
}
.crew.crew-krank.ersetzt { background: var(--surface-2); }
.crew.crew-krank .crewav { background: var(--crit); color: var(--crit-ink); }
.crew.crew-krank .crewname { text-decoration: line-through; text-decoration-thickness: 1px; color: var(--text-soft); }
.tag.krankwort { color: var(--crit); }
.crew.crew-krank.ersetzt .tag.krankwort { color: var(--text-soft); }
/* Abwesend und eingeteilt (Paket 1, Nr. 4, 25.10.2026): dieselbe Kachel wie
   krank - rot, solange Ersatz fehlt, Name durchgestrichen, das Wort mit dem
   Zeitraum. Darunter, ueber die ganze Breite, die Vorschlaege zum
   Nachbesetzen: dieselben Knoepfe wie "+ Person einteilen". */
.crew.crew-abwesend .suggests.nachbesetzen { flex: 1 1 100%; order: 9; margin-top: .25rem; }
.crew.crew-abwesend > .crewform { margin-left: auto; }
.hbnach { margin: 0 0 .5rem 3.25rem; }
.wtnach { display: flex; flex-wrap: wrap; gap: .25rem; margin: .25rem 0; }
.wtnachtitel { flex: 1 1 100%; font-size: .75rem; font-weight: 700; color: var(--text-soft); }
.krankersatz { flex: none; min-height: 44px; display: inline-flex; align-items: center; }
/* Entfernen liegt hinter einem Aufklappen: einmal sichtbar warnen, ohne das
   Loeschen zu sperren - eine Fehleintragung muss korrigierbar bleiben. */
.krankweg { flex: 0 0 auto; }
.krankweg > summary {
  list-style: none; cursor: pointer; display: inline-flex; align-items: center; min-height: 44px;
  padding: 0 .75rem; border-radius: var(--radius-pille); border: 1px solid var(--hair);
  background: var(--card); font-size: .875rem; font-weight: 600; color: var(--text);
}
.krankweg > summary::-webkit-details-marker { display: none; }
/* "Krank eintragen" an der Einteilung (05.10.2026): dieselbe Klappe wie
   "Entfernen" an der Krank-Zeile; das Formular darin bricht um. */
.krankein .krankform { display: flex; flex-wrap: wrap; gap: .5rem .75rem; align-items: center; }
.krankein .krankbis { display: inline-flex; align-items: center; gap: .375rem; font-size: .875rem; }
.krankein .krankbis input { min-height: 44px; }
.krankweg > summary:hover { border-color: var(--crit); color: var(--crit); }
.krankweg[open] { flex: 1 1 100%; }
.krankweg[open] > summary { margin-bottom: .5rem; }
.krankwarn { margin: 0 0 .5rem; font-size: .875rem; color: var(--text); }
.ersatzhinweis { margin: .5rem 0 .25rem; font-size: .875rem; color: var(--text-soft); }
.crewav {
  flex: none; width: 32px; height: 32px; border-radius: var(--radius-pille);
  display: grid; place-items: center;
  background: var(--gruen); color: var(--gruen-ink);
  font-size: .75rem; font-weight: 700; letter-spacing: .01em; line-height: 1;
}
.crew.crew-pending .crewav { background: var(--gold); color: var(--deep); }
.crewav-mini {
  width: 18px; height: 18px; font-size: .625rem; margin-right: .25rem; vertical-align: -3px;
}
.tag.warn .crewav-mini { background: var(--warn); color: var(--surface); }
.tag.ok .crewav-mini { background: var(--ok); color: var(--ok-ink); }

.crewmain { flex: 1 1 auto; min-width: 0; }
.crewname {
  display: block; font-size: .875rem; font-weight: 620; letter-spacing: -.006em; color: var(--text);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.crewsub {
  display: block; font-size: .75rem; color: var(--muted); line-height: 1.3;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
/* Hinweis beim Selbsteintragen (Audit 18.10.2026 Nr. 2): lang, darf umbrechen. */
.crewsub.rot { color: var(--crit); white-space: normal; overflow: visible; }
.crew .tag { flex: none; margin: 0; }
.crewform { flex: none; display: block; }
.crewform button {
  font: inherit; font-size: 1rem; line-height: 1; cursor: pointer;
  width: 30px; height: 30px; border-radius: var(--radius-pille);
  border: none; background: transparent; color: var(--muted);
}
.crewform button:hover { background: var(--surface); color: var(--crit); }
/* Wortknoepfe statt Zeichen, wo eine Entscheidung faellt (Mathieu,
   08.09.2026: "benutz ausschliesslich woerter die super klar und
   verstaendlich sind"). Ein Haken und ein Kreuz reichen fuer "annehmen" und
   "ablehnen" nicht - dazwischen liegt noch "anpassen", und drei Zeichen
   nebeneinander waeren ein Raetsel. 44 px hoch, weil hier am Handy
   entschieden wird. */
.crewform button.crewwort {
  width: auto; min-height: 44px; padding: 0 .75rem; border-radius: var(--radius-pille);
  font-size: .875rem; font-weight: 600; color: var(--text);
  border: 1px solid var(--hair); background: var(--card);
}
.crewform button.crewwort:hover { background: var(--surface); color: var(--crit); border-color: var(--crit); }
/* Annehmen ist die eine Handlung, die man hier meistens will - gefuellt,
   wie es die Grammatik der App vorsieht (eine Tinte, Form sagt den Rang). */
.crewform button.crewwort.ok {
  background: var(--accent); border-color: var(--accent); color: var(--accent-ink);
}
.crewform button.crewwort.ok:hover { background: var(--accent-hover); border-color: var(--accent-hover); color: var(--accent-ink); }

.suggests { display: flex; flex-wrap: wrap; gap: .25rem; align-items: center; }
.sugtitle { font-size: .75rem; color: var(--muted); text-transform: uppercase; letter-spacing: .04em; font-weight: 650; }
/* Die Zeit, die aus dem Bedarf kommt - als Pille neben dem Wort "Vorschlag",
   damit sie als Aussage lesbar ist und nicht als Teil der Ueberschrift
   (12.09.2026). */
/* Eine Spanne als zwei Felder: "10-15 Std" ist keine Zahl, und ein einzelnes
   Feld haette den Betrieb gezwungen, sich auf eine festzulegen (12.09.2026). */
.spanne { display: flex; align-items: center; gap: .5rem; flex-wrap: wrap; }
.spanne input { width: 4.5rem; flex: none; }
.spannenmass { font-size: .75rem; color: var(--muted); }

.sugzeit {
  display: inline-block; margin-left: .25rem; padding: .125rem .5rem; border-radius: var(--radius-pille);
  background: var(--accent-soft); color: var(--accent);
  font-size: .75rem; font-weight: 700; letter-spacing: 0; text-transform: none;
  font-variant-numeric: tabular-nums;
}
/* Der Vorschlag steht oben in der Einteilen-Klappe, abgesetzt vom Formular
   darunter: erst die drei Knoepfe, dann der Trennstrich, dann die freie
   Auswahl. Die Begruendung bricht auf eine eigene Zeile, damit sie die
   Knopfreihe nicht auseinanderzieht. */
details.slotadd .suggests {
  margin-bottom: .5rem; padding-bottom: .5rem; border-bottom: 1px solid var(--hair);
}

/* Person direkt in eine bestimmte Schicht einteilen - ein Klick auf die
   Schicht statt eines generischen Formulars am Tagesende (Mathieu, 06.09.2026:
   "man muesste auf die Schicht druecken koennen und dann kommt die Auswahl
   fuer Personen"). Bewusst NICHT das grosse .panel-Format (details.panel) -
   das ist fuer einzelne Zeilen in einer schon kompakten Schichtkarte zu
   wuchtig. */
/* Die beiden Aufklapper einer Schicht stehen nebeneinander, nicht
   untereinander: zusammen sind sie eine Fusszeile ("was kann ich hier tun"),
   und zwei eigene Zeilen dafuer waren auf zwei Spalten zu viel. */
.slotbody > details.slotadd { display: inline-block; vertical-align: top; margin-right: 1rem; }
.slotbody > details.slotadd[open] { display: block; margin-right: 0; }
details.slotadd { margin-top: .5rem; }
details.slotadd > summary {
  cursor: pointer; list-style: none; font-size: .875rem; font-weight: 650;
  color: var(--accent); padding: .25rem 0;
  text-decoration: underline; text-underline-offset: .18em;
}
details.slotadd > summary::-webkit-details-marker { display: none; }
details.slotadd[open] > summary { margin-bottom: .5rem; }
.slotaddform { display: flex; align-items: center; gap: .5rem; flex-wrap: wrap; }
.slotaddform .pickfield { flex: 1 1 12rem; min-width: 0; }
.slotaddform button { flex: none; }
/* Abweichende Zeiten beim Einteilen (Mathieu, 08.09.2026). Am Handy bricht
   das Zeitpaar in eine eigene Zeile - zwei Zeitfelder und ein Auswahlfeld
   nebeneinander waeren auf 390 px drei zu schmale Felder. */
.slotzeit { display: flex; align-items: center; gap: .25rem; flex: 0 0 auto; }
.slotzeit input[type=time] {
  /* 7.4rem, nicht 6.2: bei 99 px war die "03:00" hinter dem Uhr-Symbol
     abgeschnitten - im eigenen Screenshot gesehen. */
  width: 7.4rem; min-height: 44px; text-align: center;
  font-variant-numeric: tabular-nums;
}
@media (max-width: 560px) {
  .slotaddform .slotzeit { flex: 1 1 100%; justify-content: flex-start; }
  /* Nur im Einteilen-Formular: dieselbe Regel traf frueher auch das
     Zeiten-Formular (.szzeile) und quetschte dort den Namen auf 0-3 px
     (Audit 18.10.2026, F1). */
  .slotaddform .slotzeit input[type=time] { flex: 1 1 0; width: auto; }
  /* Zeiten-Formular am Handy: der Name hat die ganze erste Zeile, das
     Zeitpaar steht darunter - sonst sieht man nicht, wessen Zeit man aendert. */
  .szzeile { flex-wrap: wrap; }
  .szzeile .szname { flex: 1 1 100%; }
  .szzeile .slotzeit { flex: 1 1 100%; justify-content: flex-start; }
}
/* Die Zeiten der ganzen Besetzung in einem Formular: Name links, Zeitpaar
   rechts. Ein Formular je Schicht statt eines je Person - wer die Besetzung
   umlegt, aendert meist mehrere auf einmal. */
.slotzeitform { display: flex; flex-direction: column; gap: .25rem; }
.szzeile {
  display: flex; align-items: center; justify-content: space-between;
  gap: .5rem; padding: .25rem 0; border-bottom: 1px solid var(--hair);
}
.szzeile:last-of-type { border-bottom: 0; }
.szname { font-weight: 550; min-width: 0; overflow-wrap: anywhere; }
button.suggest {
  font: inherit; font-size: .875rem; font-weight: 600; cursor: pointer;
  border: 1.5px dashed var(--accent); background: var(--surface); color: var(--accent);
  border-radius: var(--radius-pille); padding: .25rem .5rem; min-height: 44px;
}
button.suggest:hover { background: var(--accent-soft); border-style: solid; }
button.suggest .sugnote { font-weight: 500; font-size: .75rem; color: var(--warn); }
/* Der Grund steht auf dem Knopf, nicht nur im title: am Handy gibt es kein
   Ueberfahren mit der Maus. Gedeckt, damit der Name den Knopf traegt. */
button.suggest .sugwhy { font-weight: 500; font-size: .75rem; color: var(--muted); }
/* Nicht rot: das ist keine Warnung ueber den Vorschlag, sondern eine
   Auskunft ueber den Tag. Eigene Zeile, damit sie die Knopfreihe nicht
   auseinanderzieht. */
.suggests .sugwarn { flex: 1 1 100%; font-size: .875rem; color: var(--warn); }

.offline { margin-top: .5rem; font-size: .875rem; color: var(--crit); }

/* Eigene Einteilung auf der persönlichen Seite */
/* Die eigene Schicht: links das Datum, dann die Uhrzeit gross und darunter
   die Schicht. Vorher stand hier nur "Montag Fruehschicht" - also gerade das
   nicht, was man wissen will. */
.myplan { display: flex; flex-direction: column; gap: .5rem; margin-top: .75rem; }
.myplanrow {
  display: flex; align-items: center; gap: .75rem; min-width: 0;
  background: var(--surface-2); border-radius: var(--radius-sm); padding: .5rem .75rem;
}
.myplanrow.is-today { background: var(--accent-soft); }

/* --- Bar und Kueche als eigene Bloecke -------------------------------
   Vorher standen an einem Freitag elf Schichten in einer flachen Liste,
   alle gleich aussehend - man musste jede Zeile lesen, um zu wissen, ob
   sie ueberhaupt den eigenen Bereich betrifft. */
/* Seit dem 16.09.2026 ist der Bereich eine ZEILE, keine getoente Flaeche
   mit Kante: die Schichten darin sind jetzt selbst Karten, und ein Verlauf
   darunter waere eine zweite Karte um die erste. Was bleibt, ist der Name -
   in der Farbe des Bereichs, klein und gesperrt wie eine Marke. */
.bgruppe { margin: 0 0 1rem; padding: 0; }
/* Die Bereichsueberschrift ist seit dem 12.09.2026 eine <summary>: die Kueche
   faengt zugeklappt an. Damit wird aus der Ueberschrift ein TIPPZIEL, und das
   muss sie auch sein - Zeiger, Mindesthoehe, ein Zeichen, dass sich hier
   etwas auf- und zuklappen laesst. */
.bkopf {
  display: flex; align-items: baseline; flex-wrap: wrap; gap: .25rem .5rem;
  padding: 0 .25rem .5rem;
}
.bgruppe > summary {
  cursor: pointer; min-height: 44px; list-style: none;
  align-items: center; padding-top: .5rem;
}
.bgruppe > summary::-webkit-details-marker { display: none; }
/* Der Pfeil rechts, damit die Zeile sichtbar mehr ist als eine Ueberschrift.
   Er dreht sich beim Aufklappen - dieselbe Sprache wie bei den anderen
   Aufklappern in der App. */
.bgruppe > summary::after {
  content: '›'; margin-left: auto; font-size: 1.3125rem; line-height: 1;
  color: var(--muted); transition: transform .12s ease;
}
.bgruppe[open] > summary::after { transform: rotate(90deg); }
.bgruppe > summary:focus-visible {
  outline: 2px solid var(--accent); outline-offset: 2px; border-radius: var(--radius-sm);
}
/* Zugeklappt braucht der Block unten keinen Rest-Abstand. */
.bgruppe:not([open]) { padding-bottom: 0; }
.bname {
  font-family: var(--f-text); font-weight: 800; font-size: .75rem;
  letter-spacing: .12em; text-transform: uppercase; color: var(--bar);
}
.bgruppe.b-kueche .bname { color: var(--kueche); }
.bgruppe.b-office .bname { color: var(--office); }
.bzahl { font-size: .75rem; color: var(--muted); font-weight: 600; }
/* Wie lange es Essen gibt - die einzige Auskunft aus dem alten Zeitstrahl,
   die nicht in den Schichtzeilen steht (Mathieu, 15.09.2026: "Die Küche
   arbeitet von 15-23Uhr aber hat für gäste nur von 16-22uhr"). Sie steht im
   KOPF der Gruppe, also auch dann, wenn die Kueche zugeklappt ist - und das
   ist sie fuer fast alle. */
.bessen { font-size: .75rem; font-weight: 700; color: var(--kueche); white-space: nowrap; }
/* Die Schichten innerhalb einer Gruppe deutlich voneinander abgesetzt:
   vorher lagen sie ohne Abstand aneinander und liefen ineinander. */
.bgruppe .myplanrow {
  background: var(--surface);
  border: 1px solid var(--border);
  margin-bottom: .5rem;
  padding: .75rem .75rem;
}
.bgruppe .myplanrow:last-child { margin-bottom: 0; }
/* Der eigene Bereich faerbt auch die Schichtzeile leicht mit - so bleibt
   beim Scrollen erkennbar, in welchem Block man gerade ist, auch wenn die
   Ueberschrift schon aus dem Bild ist. */
.bgruppe .myplantime { color: var(--bar); }
.bgruppe.b-kueche .myplantime { color: var(--kueche); }
.bgruppe.b-office .myplantime { color: var(--office); }
/* Das Datum links in einer Plan-Zeile. Auf der Startseite ist "Dein Plan"
   seit dem 16.09.2026 eine Kachel; die Seite "Mein Plan" benutzt die Zeile
   weiter, und ein Test misst die Regel. */
.myplandate { flex: none; width: 40px; text-align: center; line-height: 1.06; }
.myplandate .wd {
  display: block; font-size: .625rem; font-weight: 700; letter-spacing: .07em;
  text-transform: uppercase; color: var(--muted);
}
.myplanmain { min-width: 0; flex: 1 1 auto; }
.myplantime {
  display: block; font-size: 1rem; font-weight: 620; letter-spacing: -.01em;
  font-variant-numeric: tabular-nums; white-space: nowrap;
}
.myplantime strong { font-weight: inherit; }
.myplanshift {
  display: block; font-size: .75rem; color: var(--muted);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
/* Einzeilig ist richtig, wo nur "Dienstag · Spaetschicht" steht. Wo Namen
   drinstehen, ist es falsch: die wurden als Erstes abgeschnitten. */

/* Die Ziehharmonika mit Haken ist am 12.09.2026 entfallen - eine Woche in
   sieben aufklappbaren Balken, jede Schicht eine Zeile mit Kaestchen, unten
   ein Summenknopf (Mathieu: "mach Tag ohne Haken mit dem Button"). Was sie
   konnte und was deshalb umziehen musste: der Summenknopf sagte VOR dem
   Abschicken, wie viele Stunden zusammenkommen - die Zahl steht jetzt auf dem
   Knopf jeder Karte. Geblieben ist nur der Hinweis unter der eigenen Schicht. */
.wzhinweis { margin: -.25rem 0 .5rem; white-space: normal; }

.kv { display: grid; grid-template-columns: max-content 1fr; gap: .25rem 1rem; font-size: 1rem; }
.kv dt { color: var(--muted); }
.kv dd { margin: 0; }
.mono { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: .875rem; word-break: break-all; }

/* --- Schnellzugriffe auf der Mitarbeiterseite --- */
/* Schnellzugriffe als eine Gruppe von Zeilen, nicht als vier Kaesten: eine
   Flaeche, Haarlinien dazwischen, die auf Hoehe des Textes beginnen. */
/* Der Winkel am Zeilenende sagt: hier geht es weiter. */

/* --- Team Hub --- */
.hubgroup { margin-top: 1rem; }
.hubgroup:first-of-type { margin-top: .25rem; }
.hubsec { font-size: .75rem; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; color: var(--muted); margin-bottom: .5rem; }
.hublist { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: .5rem; }
.hublink {
  display: flex; flex-direction: column; gap: .125rem; text-decoration: none;
  background: var(--surface-2); border: 1px solid var(--border); border-radius: var(--radius-sm);
  padding: .75rem .75rem; color: var(--text); min-height: 48px; justify-content: center;
}
.hublink:hover { border-color: var(--accent); background: var(--surface); text-decoration: none; }
.hubtitle { font-weight: 600; font-size: 1rem; }
.hubnote { font-size: .875rem; color: var(--muted); line-height: 1.35; }

/* --- Nachrichten --- */
.msglist { display: grid; gap: .75rem; }
.msg { background: var(--gold-soft); border-radius: var(--radius-sm); padding: .75rem 1rem; }
.msg.msg-me { background: var(--accent-soft); }
.msghead { font-size: .75rem; font-weight: 700; letter-spacing: .06em; text-transform: uppercase; color: var(--muted); margin-bottom: .25rem; }
.msgtext { font-size: 1rem; line-height: 1.5; }
.linkbtn { font: inherit; font-size: .75rem; font-weight: 600; text-transform: none; letter-spacing: 0; color: var(--muted); background: none; border: none; cursor: pointer; text-decoration: underline; padding: 0; }
.msgform { display: grid; gap: .5rem; }
.msgform-row { display: flex; flex-wrap: wrap; gap: .5rem; }
.msgform-row select { flex: 1 1 150px; min-height: 44px; }
.msgform-row input[type=text] { flex: 1 1 320px; }

/* --- Grosse Zahl (Stempeluhr, Konten) --- */
.bignum { font-size: 3.4rem; font-weight: 700; letter-spacing: -.03em; line-height: 1.02; font-variant-numeric: tabular-nums; }
/* Die Pause auf der Stempeluhr (16.10.2026): "Pause seit 12 Min" unter der
   stehenden Zahl. Gleiche Ziffernbreite wie die grosse Zahl, damit nichts
   zittert, wenn die Minute umspringt. */
.stpausezeile { font-size: 1.125rem; font-weight: 600; margin-top: .35rem; font-variant-numeric: tabular-nums; }
.stpausezeile b { font-weight: 700; }
.stpausehinweis { font-size: .875rem; color: var(--muted); }
/* Eine Personalkostenquote ueber 35 % ist im Gastgewerbe der Punkt, an dem
   man hinsieht - deshalb rot, aber ohne Ausrufezeichen: es kann einen Grund
   geben (ein schwacher Monat, ein Event mit Vorlauf). */
.bignum.ist-hoch { color: var(--crit); }
/* Eigene Klasse und nicht .kvgrid: das gibt es weiter unten schon fuer die
   Personalseite (260 px Spalten), und meine Regel waere ueberschrieben
   worden, ohne dass es auffaellt. Genau diese Kollision ist in dieser Datei
   die haeufigste Fehlerquelle. */
.zahlenreihe { display: grid; gap: 1rem; grid-template-columns: repeat(auto-fit, minmax(11rem, 1fr)); }
.zahlenreihe .bignum { font-size: 2.2rem; }
.zahlenreihe .hint { display: block; }
.statusdot { display: inline-flex; align-items: center; gap: .5rem; border-radius: var(--radius-pille); padding: .25rem .75rem; font-size: .875rem; font-weight: 700; letter-spacing: .04em; }
.statusdot.on { background: var(--ok-soft); color: var(--ok); }
.statusdot.off { background: var(--surface-2); color: var(--muted); }
.statusdot.pause { background: var(--warn-soft); color: var(--warn); }
.statusdot i { width: 9px; height: 9px; border-radius: var(--radius-pille); background: currentColor; display: inline-block; }
.bigbtn {
  display: block; width: 100%; text-align: center; font: inherit; font-size: 1.125rem; font-weight: 600;
  border-radius: var(--radius-sm); padding: 1rem; cursor: pointer; border: 1.5px solid var(--accent);
  background: var(--accent); color: var(--accent-ink); box-shadow: var(--shadow);
}
/* Gruen ist in dieser App die Farbe der UHR - Schicht beginnen, Pause
   beenden. Auf der Startseite war der Knopf gruen, auf der Stempeluhr
   marine; derselbe Knopf, zwei Farben, je nachdem wo man ihn drueckt
   (15.09.2026). */
.bigbtn.gruen { background: var(--gruen); border-color: var(--gruen); color: var(--gruen-ink); }
.bigbtn.gruen:hover { background: var(--gruen-hover); border-color: var(--gruen-hover); }
.bigbtn.secondary { background: var(--accent-soft); color: var(--accent); border-color: transparent; box-shadow: none; }
.bigbtn.secondary:hover { filter: brightness(.96); }
.bigbtn { border-width: 1px; border-radius: var(--radius-sm); transition: background-color .15s ease, opacity .15s ease; }
.bigbtn:active { opacity: .8; }
.bigbtn:focus-visible { outline: none; box-shadow: 0 0 0 4px var(--accent-soft); }
.timeline { display: grid; }
.timeline .row { display: flex; align-items: center; gap: .75rem; padding: .75rem 0; border-top: 1px solid var(--border); font-size: 1rem; }
.timeline .row:first-child { border-top: none; }
/* Zurueckziehen / Krankmeldung zuruecknehmen (Audit 18.10.2026, Nr. 3/21): der Knopf steht in einer eigenen Zeile unter dem Antrag, nicht quetschend daneben. */
.timeline .row.antragszeile { flex-wrap: wrap; }
.timeline .row .antragform { flex: 1 0 100%; margin: 0; }
.timeline .row .t { font-weight: 600; font-variant-numeric: tabular-nums; min-width: 3.4rem; }
.timeline .row .dot { width: 8px; height: 8px; border-radius: var(--radius-pille); flex: none; }

/* --- Stammdaten / Person --- */
.kvgrid { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: 1.5rem 1.5rem; }
.warnbox { background: var(--warn-soft); color: var(--warn); border: 0; border-radius: var(--radius-sm); padding: .75rem 1rem; font-size: .875rem; line-height: 1.5; }
.critbox { background: var(--crit-soft); color: var(--crit); border: 0; border-radius: var(--radius-sm); padding: .75rem 1rem; font-size: .875rem; line-height: 1.5; }
.bar { height: 10px; border-radius: var(--radius-pille); background: var(--surface-3); overflow: hidden; display: flex; }
.bar span { display: block; height: 100%; }

.footer { color: var(--muted); font-size: .875rem; max-width: 70ch; margin-top: 1.5rem; }
.footer p { margin-bottom: .5rem; }
/* Impressum und Datenschutz waren 20 px hoch (gemessen 08.09.2026). Sie sind
   Fusszeile und brauchen keine 44 - aber die 24 px Untergrenze schon. */
.footer a { display: inline-flex; align-items: center; min-height: 24px; }

/* Tippziele 44 px in der Team-App (Team-App-Audit 18.10.2026, Nr. 14) - OHNE dass
   eine Zeile hoeher wird: eine unsichtbare Erweiterung des Links (::after), so
   wie schon beim Schichtnamen (.skname) und der Wochenspanne (.wspanne). Der
   Link bleibt, wie er aussieht; nur der Treffer wird groesser. Fuer Links in
   Fliesstext und Fusszeilen - wo einzelne Links in eigenen Zeilen stehen, nie
   direkt untereinander (dort wuerden sich die Erweiterungen gegenseitig die
   Flaeche wegnehmen, siehe .kalevent unten: echte Hoehe statt Erweiterung). */
body[data-app="team"] .footer a,
body[data-app="team"] .apphinweis a,
body[data-app="team"] p.help a,
body[data-app="team"] .kiosk-fuss a,
body[data-app="team"] .kalnav a { position: relative; }
body[data-app="team"] .footer a::after,
body[data-app="team"] .apphinweis a::after,
body[data-app="team"] p.help a::after,
body[data-app="team"] .kiosk-fuss a::after,
body[data-app="team"] .kalnav a::after { content: ''; position: absolute; left: -6px; right: -6px; top: -13px; bottom: -13px; }
/* Unter dem Zaehlstreifen (Bestandsabgleich) steht die Liste der fehlenden Abende als Satz.
   Ihre Erweiterung darf nicht in die Kaestchen darueber hineinreichen: sie nahm dem
   Kaestchen "FR 23" unten 13 % der Flaeche (gemessen 23.10.2026) - zwischen Streifen und
   Satz sind nur 8 px Luft. */
body[data-app="team"] .zstreifenblock p.help a::after { content: none; }
/* ... und jetzt gar nicht mehr (24.10.2026): "Offen: So, 11.10. · Mo, 12.10. ..." sind bis zu acht Links in EINEM Satz, die ueber drei
   Zeilen umbrechen, die Zeilen liegen 24 px auseinander. Jede Erweiterung von 13 px nach oben und unten lag also ueber den Links der
   Nachbarzeilen, und ein umbrochener Link bekam eine Erweiterung ueber beide Zeilen: "Sa, 17.10." fing nur 28 % der eigenen Flaeche
   selbst ab, "So, 11.10." 81 % (gemessen mit dem Raster, 24.10.2026). Das sind Links im Fliesstext (WCAG 2.5.8 nimmt sie aus) - und
   jeder dieser Abende hat darueber ein 44-px-Kaestchen mit demselben Ziel (.zstag). Der Satz bleibt Hinweis, das Kaestchen ist das Ziel. */
/* Monat (Schichten): unter "Alle deine Einsaetze in Dein Plan" folgt gleich "Wie funktioniert das?" - die Erweiterung des Links
   (13 px nach unten) nahm dem Aufklapper oben 16 % der Flaeche (gemessen 23.10.2026). Mehr nach oben, weniger nach unten: 46 px
   bleiben. */
body[data-app="team"] .w1schichten .apphinweis a::after { content: none; }
/* Der Link ist hier schon 44 px hoch (stil-w1-schichten.js: min-height) - die Erweiterung darueber hinaus lag mit 16 px nach oben ueber
   "Noch 19 Schichten frei fuer dich" (nahm ihm 13 % der Flaeche) und mit 6 px nach unten ueber "Wie funktioniert das?" (8 %). Gemessen 24.10.2026. */
/* Die Termine neben dem Monatsnamen stehen UNTEREINANDER: hier waechst die Zeile
   selbst auf 44 px, eine Erweiterung wuerde dem Nachbarn die Flaeche nehmen. */
body[data-app="team"] a.kalevent { min-height: 44px; align-items: center; padding: 0; }
/* Kleine Ziele auf 44 px (24.10.2026, gemessen mit dem Raster): jeweils eine unsichtbare Erweiterung (::after) wie oben, ohne dass das Bild
   sich aendert. Wo ein Nachbar ueber oder unter dem Ziel steht, reicht sie nur dorthin, wo Luft ist (Messung: kein Ziel verliert Flaeche).
     - "Als Feed durchswipen" (Hand Outs): 29 -> 45 px, steht im Kopf der Karte, die Erweiterung liegt ueber dem Kopf selbst.
     - Zurueck-Taste, "Ganzes Rezept ansehen" und der Kommentar-Knopf im Feed: 40/36/40 px -> 48/44/48 px.
     - "Weiter mit ..." unter "Speichern" (Inventur): 21 px, der Knopf liegt 9 px darueber - die Erweiterung geht fast nur nach unten.
     - "zurueckziehen" im Zeitkorrektur-Stand (Meine Zeiten): 18 -> 44 px, ein einzelner Knopf mitten im Satz ohne Nachbar. */
body[data-app="team"] a.hofeedlink,
body[data-app="team"] .hofeedganz,
body[data-app="team"] .hofeedaktion,
body[data-app="team"] .hofeedschliessen,
body[data-app="team"] .sticky-save a.note,
body[data-app="team"] .zkzurueck .linkbtn { position: relative; }
body[data-app="team"] a.hofeedlink::after { content: ''; position: absolute; left: -4px; right: -4px; top: -8px; bottom: -8px; }
body[data-app="team"] .hofeedzurueck::after { content: ''; position: absolute; inset: -4px; }
body[data-app="team"] .hofeedganz::after { content: ''; position: absolute; left: 0; right: 0; top: -5px; bottom: -5px; }
body[data-app="team"] .hofeedaktion::after { content: ''; position: absolute; left: -4px; right: -4px; top: 0; bottom: 0; }
body[data-app="team"] .hofeedschliessen::after { content: ''; position: absolute; inset: -7px; }
body[data-app="team"] .sticky-save a.note::after { content: ''; position: absolute; left: -6px; right: -6px; top: -4px; bottom: -19px; }
body[data-app="team"] .zkzurueck .linkbtn::after { content: ''; position: absolute; left: -6px; right: -6px; top: -13px; bottom: -13px; }
/* Notfall: "Was ist los?" und die Rufnummern sind genau die Ziele, die man mit
   zitternden Haenden trifft - echte 44 px (vorher 32 und 38). Das Feld "Wann"
   im Vorfallsbogen ebenso. */
.nfwahlgrid a { min-height: 44px; }
.nfruf { min-height: 44px; }
body[data-app="team"] input[type="datetime-local"] { min-height: 44px; }

/* Die zwei anderen Tueren unter der Team-Anmeldung (14.10.2026): Planung und
   neuer Betrieb. Leiser als das Formular - die Farbe der Fusszeile, aber volle
   44 px Tippflaeche, weil die App hier startet und niemand daneben tippen
   soll. Unterstrichen, weil Handlung hier Form ist, nicht Farbe. */
.andere-tueren { display: flex; flex-direction: column; align-items: center; gap: .1rem; margin-top: 1.25rem; font-size: .875rem; }
.andere-tueren a { color: var(--muted); text-decoration: underline; text-underline-offset: 3px; display: inline-flex; align-items: center; min-height: 44px; padding: 0 .5rem; }

html { scroll-padding-bottom: 5rem; }

@media (max-width: 560px) {
  /* Die Schriftgroesse bleibt: 17px ist die Groesse fuers Handy, nicht die
     fuer den Rechner. Vorher wurde sie hier auf 16,5 zurueckgedreht und die
     ganze Stufenleiter mit. */
  :root { --pad: 1rem; }
  .wrap { padding: 1rem var(--pad) 2.5rem; }
  .card { padding: 1rem 1rem 1rem; border-radius: var(--radius-sm); margin-bottom: .75rem; }
  .topbar { padding: calc(.75rem + var(--safetop)) 1rem .75rem; }
  .emprow .actions { margin-left: 0; width: 100%; }
  /* Deutsche Wortungetuemer wie "Wochenuebersicht" brauchen etwas weniger als
     die volle Grosstitelgroesse, sonst brechen sie mitten im Wort. */
  h1 { font-size: 1.75rem; }

  /* Auf dem Handy soll die erste Tageskarte sofort sichtbar sein:
     Einleitung knapper, Wochen-Kopf im Formular weglassen (die Reiter sagen es schon). */
  .lede { font-size: 1rem; line-height: 1.45; }

  /* Tageskarten kompakter, damit mehr als eine Karte aufs Display passt */
  .daycard { padding: .75rem .75rem .75rem; margin-bottom: .75rem; }
  .dayhead { margin-bottom: .5rem; }
  .dayhead .name { font-size: 1rem; }
  .chips { gap: .5rem; }
  .chip > span { padding: .5rem .75rem; font-size: .875rem; gap: .25rem; }
  .chip > span::before { width: 17px; height: 17px; font-size: .75rem; }
  .blockrow { gap: .5rem; padding: .5rem .5rem; flex-wrap: nowrap; }
  .blockrow .blockdel { width: 38px; height: 38px; }
  .timepair input { font-size: 1rem; min-height: 44px; }
  button.qb { font-size: .875rem; padding: .25rem .5rem; }
  .slot { grid-template-columns: 78px 1fr; }

  /* Speichern-Leiste am unteren Rand, mit Platz für die iPhone-Geste */
  .sticky-save {
    margin: 1rem -.75rem -1rem;
    padding: .75rem .75rem calc(.75rem + env(safe-area-inset-bottom, 0px));
    gap: .5rem;
  }
  .sticky-save .btn { flex: 1 1 auto; }
  .sticky-save .note { flex: 1 0 100%; font-size: .875rem; }

}

/* --- Zeitkorrektur beantragen (Paket 2, 05.10.2026) ----------------------
   Der Antrag haengt als <details> an der Schicht. Die Zusammenfassung ist ein
   Link im Text (unterstrichen, Eine Tinte), kein Knopf - er ist zweiter Rang
   neben der Zeile. Der Stand "wartet/korrigiert/abgelehnt" traegt sein Wort
   und eine Kante, nicht nur eine Farbe. */
.zkantrag { margin-top: .4rem; }
.zkantrag > summary {
  cursor: pointer; list-style: none; font-size: .875rem; font-weight: 600;
  color: var(--accent); text-decoration: underline; text-underline-offset: .18em;
  min-height: 44px; display: inline-flex; align-items: center;
}
.zkantrag > summary::-webkit-details-marker { display: none; }
.zkform { display: flex; flex-direction: column; gap: .6rem; margin-top: .3rem; }
.zkform label { display: flex; flex-direction: column; gap: .2rem; font-size: .875rem; font-weight: 600; }
.zkform input { min-height: 44px; font-size: 1rem; }
.zkzeiten { display: grid; grid-template-columns: 1fr 1fr; gap: .6rem; }
.zkstand {
  margin-top: .4rem; padding: .4rem .6rem; font-size: .875rem; border-radius: var(--radius-xs);
  background: var(--surface-2); box-shadow: inset 3px 0 0 var(--muted);
}
.zkstand.wartet { box-shadow: inset 3px 0 0 var(--warn); }
.zkstand.uebernommen { box-shadow: inset 3px 0 0 var(--ok); }
.zkstand.abgelehnt { box-shadow: inset 3px 0 0 var(--crit); }
.zkzurueck { display: inline; margin-left: .4rem; }
/* Urlaub entscheiden: wer am selben Tag schon frei hat. Der eigene Bereich
   der antragstellenden Person ist fett und unterstrichen - Form, nicht Farbe. */
.ueberschneidung { margin-top: .5rem; font-size: .875rem; }
.ueberschneidung > summary { cursor: pointer; font-weight: 600; text-decoration: underline; text-underline-offset: .18em; min-height: 36px; }
.uekopf { margin: 0 0 .2rem; font-weight: 600; }
.ueliste { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: .2rem; }
.uetag { display: inline-block; min-width: 5.5rem; font-weight: 700; font-variant-numeric: tabular-nums; }
.uegruppe.eigen { font-weight: 700; text-decoration: underline; text-underline-offset: .18em; }
.ueberleer { margin: .4rem 0 0; font-size: .875rem; color: var(--muted); }
/* Paket 3: Verlauf an der Schicht und Begruendung am Arbeitszeit-Hinweis.
   Beides zweiter Rang: ein unterstrichener Link, der aufklappt. */
.slotverlauf, .bgteil { margin-top: .4rem; font-size: .875rem; }
.slotverlauf > summary, .bgteil > summary {
  cursor: pointer; font-weight: 600; text-decoration: underline; text-underline-offset: .18em; min-height: 32px;
}
.vlliste { margin: .3rem 0 0; padding-left: 1.1rem; display: flex; flex-direction: column; gap: .15rem; }
.vlwann { font-variant-numeric: tabular-nums; color: var(--muted); }
.vldetail, .vlwer { color: var(--muted); }
.bmzeile { flex-wrap: wrap; }
.bgteil { flex-basis: 100%; }
.bgtext { margin: .2rem 0; }
.bgwer { color: var(--muted); font-size: .75rem; }
.bgform { display: flex; gap: .4rem; flex-wrap: wrap; align-items: center; }
.bgform input[type=text] { flex: 1 1 16rem; min-height: 36px; }
.evwerkzeug { margin-top: 1.2rem; padding-top: 1rem; border-top: 1px solid var(--hair); }
.evwerkzeug h3 { font-size: 1rem; margin: 0 0 .4rem; }
.evschicht { display: flex; flex-wrap: wrap; gap: .4rem; align-items: center; margin-top: .5rem; }
.evschicht select { min-height: 40px; }
/* Angebote und Unterlagen zu einem Event (17.10.2026). Eine Zeile je Datei:
   oben der Name mit Datum, Groesse und Sichtbarkeit, darunter die Handlungen
   (Herunterladen, fuers Team freigeben, loeschen), darunter - zugeklappt -
   das Umbenennen. Keine eigene Farbe: Handlung sagt die Form, wie ueberall. */
.evdateien { list-style: none; margin: .5rem 0 1rem; padding: 0; display: grid; gap: .5rem; }
.evdatei { border: 1px solid var(--hair); border-radius: var(--radius-sm); background: var(--surface); padding: .75rem 1rem; display: grid; gap: .5rem; }
.evdkopf { display: flex; flex-wrap: wrap; align-items: baseline; gap: .125rem .75rem; min-width: 0; }
.evdkopf .who { font-weight: 650; overflow-wrap: anywhere; }
.evdkopf .meta { color: var(--muted); font-size: .875rem; }
.evdaktionen { display: flex; flex-wrap: wrap; gap: .5rem; align-items: center; }
.evdform { margin: 0; display: inline-block; }
.evdaktionen .btn { display: inline-flex; align-items: center; }
.evumbenennen > summary { display: inline-block; cursor: pointer; font-size: .875rem; color: var(--text-soft); text-decoration: underline; text-underline-offset: 3px; min-height: 36px; line-height: 36px; list-style: none; }
.evumbenennen > summary::-webkit-details-marker { display: none; }
.evumbenennen[open] > summary { margin-bottom: .25rem; }
.evdateizahl { white-space: nowrap; }
/* Fehlt die Datei (Sicherung zurueckgespielt), ist "Herunterladen" zu - sichtbar als blass, nicht nur tot. */
.evdaktionen .btn:disabled { opacity: .45; cursor: not-allowed; }
.evfehlt { white-space: normal; }
@media (max-width: 640px) {
  .evdaktionen .btn { min-height: 44px; }
  .evumbenennen > summary { min-height: 44px; line-height: 44px; }
}
/* Paket 4: Pflichtpapiere, Ordner nach Art, Upload, Auswahl und Foto in
   Checklisten. Tippziele 44 px. */
.pfkasten { margin: .8rem 0 1rem; padding: .8rem; border: 1px solid var(--border); border-radius: var(--radius-sm); background: var(--surface-2); }
.pfkasten h3, .dokart { font-size: 1rem; margin: 0 0 .4rem; }
.pfliste { list-style: none; margin: 0 0 .6rem; padding: 0; display: flex; flex-direction: column; gap: .3rem; }
.pfzeile { display: flex; flex-wrap: wrap; gap: .2rem .6rem; align-items: baseline; }
.pfzeile.offen { box-shadow: inset 3px 0 0 var(--crit); padding-left: .5rem; }
.pftitel { font-weight: 600; }
.pftext { color: var(--muted); font-size: .875rem; }
.dokordner { margin-top: .9rem; }
/* Im Ordner umbrechen die Zeilen: Datum oben, Stand, Datei und Knoepfe
   darunter - in der schmalen Spalte der Personalakte lief die Zeile sonst
   rechts aus der Karte. */
.dokordner .timeline .row { flex-wrap: wrap; gap: .4rem .75rem; }
.dokordner .timeline .row > span:first-child { flex: 1 1 100%; }
.dokordner .timeline .row form { margin: 0; }
.timeline .row.dokwartet { box-shadow: inset 3px 0 0 var(--warn); padding-left: .75rem; }
.pfperson { display: flex; flex-wrap: wrap; gap: .3rem .8rem; align-items: center; color: var(--text); text-decoration: none; min-height: 44px; }
.papierhinweis { display: flex; flex-direction: column; gap: .2rem; text-decoration: none; color: var(--text); box-shadow: inset 4px 0 0 var(--warn); }
.phtitel { font-weight: 700; }
.phtext { text-decoration: underline; text-underline-offset: .18em; }
.checkwahl { border: 0; margin: 0; padding: .5rem 0; border-top: 1px solid var(--hair); }
.checkwahl legend { padding: 0; margin-bottom: .4rem; }
.wahlreihe { display: flex; flex-wrap: wrap; gap: .4rem; }
.wahlknopf { display: inline-flex; align-items: center; gap: .4rem; min-height: 44px; padding: 0 .9rem; border: 1px solid var(--border-strong); border-radius: 999px; cursor: pointer; }
.wahlknopf:has(input:checked) { background: var(--accent); color: var(--surface); border-color: var(--accent); }
.fotohinweis { font-size: .75rem; color: var(--muted); font-weight: 600; }
.fotoform { display: flex; flex-wrap: wrap; gap: .4rem .8rem; align-items: center; }
.fotoform input[type=file] { min-height: 44px; }
.fotoform .btn, #papiere .zkform .btn, .checkwahl + .checkrow { min-height: 44px; }
/* Paket 5: Trinkgeld, Konto, Belehrung fuer mehrere. */
.tgform { display: flex; flex-wrap: wrap; gap: .6rem .9rem; align-items: flex-end; margin-top: .6rem; }
.tgform label { display: flex; flex-direction: column; gap: .2rem; font-size: .875rem; font-weight: 600; }
.tgform input, .tgform select { min-height: 44px; }
.tgtag > summary { cursor: pointer; display: flex; flex-wrap: wrap; gap: .3rem .8rem; align-items: baseline; min-height: 44px; }
.tgtabelle { width: 100%; margin-top: .5rem; }
.kformen { display: flex; flex-direction: column; gap: .8rem; margin-top: 1rem; }
.ktitel { font-size: 1rem; margin: 1rem 0 .3rem; }
.kliste { margin: .3rem 0 0; padding-left: 1.1rem; font-size: .875rem; }
.kstand { font-size: 1.125rem; margin: 0 0 .5rem; }
.belform { display: flex; flex-direction: column; gap: .6rem; }
.belform input[type=date] { min-height: 44px; }
/* Das Stempel-Tablet: Ziffern mindestens 64 px, hier 80 px hoch - nasse
   Finger hinter der Bar. Umrandet, nicht gefuellt: die Ziffer ist Eingabe,
   erst OK ist die Handlung (Eine Tinte, die Form sagt es). */
.kiosk { max-width: 26rem; }
.kiosk-titel { text-align: center; margin: .5rem 0 1rem; }
.kiosk-meldung { font-size: 1.125rem; }
.kiosk-form { display: flex; flex-direction: column; align-items: stretch; gap: .7rem; }
.kiosk-label { font-weight: 600; text-align: center; }
.kiosk-pin { min-height: 64px; font-size: 1.5rem; text-align: center; letter-spacing: .4em; }
.kiosk-feld { display: grid; grid-template-columns: repeat(3, 1fr); gap: .7rem; }
.kiosk-ziffer {
  min-height: 80px; font: inherit; font-size: 1.5rem; font-weight: 600; cursor: pointer;
  border-radius: var(--radius-sm); border: 1.5px solid var(--accent); background: var(--surface); color: var(--accent);
}
.kiosk-ziffer:active { background: var(--accent-soft); }
.kiosk-ok { background: var(--accent); color: var(--accent-ink); }
.kiosk-weg { font-size: 1.3125rem; }
.kiosk-fuss { text-align: center; margin-top: 1.4rem; }
.kiosk-status { margin: 0 0 .5rem; display: flex; flex-wrap: wrap; gap: .4rem .8rem; align-items: center; }
.kiosk-schicht { margin: 0 0 1rem; font-size: 1.125rem; }
/* Heute krank gemeldet (16.10.2026): dieselbe Kante wie die Karte am Handy
   (.hkkrank) - Rot heisst hier "steht so im Plan", nicht "Fehler". */
.kiosk-krank { display: flex; flex-direction: column; gap: .2rem; margin: 0 0 .8rem; padding: .7rem .9rem; border-radius: var(--radius-sm); background: var(--crit-soft); box-shadow: inset 4px 0 0 var(--crit); }
.kiosk-krank b { color: var(--crit); }
.kiosk-knoepfe { display: grid; gap: .7rem; }
.kiosk-knoepfe .bigbtn { min-height: 64px; text-decoration: none; }
/* Fertig ist kein dritter grosser Knopf: neben "Schicht beenden" (umrandet)
   saehe er gleich wichtig aus. Unterstrichen = die leiseste Handlung. */
.kiosk-fertig { display: flex; align-items: center; justify-content: center; min-height: 64px; font-size: 1.125rem; font-weight: 600; color: var(--accent); text-decoration: underline; text-underline-offset: .2em; }
.kioskstart { margin: 0 0 1rem; }
.pinform .btn-row { margin-top: .4rem; }
.pinzeile { display: flex; flex-wrap: wrap; gap: .5rem .8rem; align-items: center; margin-top: .7rem; }
/* Geburtstagsgruss: ein Feld fuer den Satz und der Knopf daneben. */
.grussform { display: flex; flex-wrap: wrap; gap: .4rem .6rem; align-items: center; margin-top: .5rem; }
.grussform input[type=text] { min-height: 40px; flex: 1 1 14rem; }
.grussform .help { flex-basis: 100%; margin: 0; }
.zkablehnen { display: inline-flex; gap: .4rem; align-items: center; flex-wrap: wrap; }
.zkablehnen input[type=text] { min-height: 36px; width: 16rem; max-width: 100%; }

/* Der Aushang (Paket 2): Bildschirm wie Papier. Gedruckt wird quer auf A4,
   ohne alles, was nur auf dem Bildschirm Sinn hat. */
.aushang { background: #fff; color: #111; padding: 16px; }
.aushang h1 { font-size: 1.3125rem; margin: 0 0 .2rem; color: #111; }
.aushang .ahkopf { display: flex; justify-content: space-between; align-items: baseline; gap: 1rem; flex-wrap: wrap; }
.aushang table { width: 100%; border-collapse: collapse; table-layout: fixed; margin-top: .6rem; font-size: .75rem; }
.aushang th, .aushang td { border: 1px solid #999; padding: .25rem .35rem; vertical-align: top; text-align: left; color: #111; background: #fff; }
.aushang thead th { background: #eee; font-weight: 700; }
.aushang th.ahschicht { width: 12.5%; }
/* 12,5 % = ein Achtel: genau so breit wie jede Tagesspalte. Die erste Zeile
   jeder Tabelle ist die Bereichszeile ueber alle Spalten - bei
   table-layout: fixed verteilt sie gleichmaessig, und nur mit derselben
   Breite steht die Zeile "frei" unter den Tagen statt daneben. */
.aushang .ahbereich { font-weight: 800; text-transform: uppercase; letter-spacing: .04em; background: #f4f4f4; }
.aushang .ahname { display: block; font-weight: 600; }
.aushang .ahzeit { font-weight: 400; font-variant-numeric: tabular-nums; }
.aushang .ahfrei td { color: #444; }
.aushang .ahleise { color: #555; font-size: .75rem; }
.aushang .ahknopf { margin-top: .8rem; }
@media print {
  @page { size: A4 landscape; margin: 10mm; }
  body { background: #fff !important; }
  .aushang .ahknopf, .aushang .nodruck { display: none !important; }
  /* Die Kopfleiste der App gehoert nicht aufs Blatt. */
  body:has(.aushang) .topbar { display: none !important; }
  .aushang { padding: 0; }
}
/* --- Start, Mein Plan, Checkliste (Mathieu, 05.10.2026) ------------------
   "Bau 7-9 ein wie du es gezeigt hast" - nach nachweise/vorschau-7-9/.
   Gruen heisst hier dasselbe wie ueberall: deins / erledigt / nehmbar. Der
   Verlauf Gruen -> Mint steht pro Bildschirm an EINER Stelle (Balken der
   Checkliste, heutige Schicht im Plan). Die Toene sind fuer beide Modi
   einzeln gesetzt, hell auf Creme und dunkel auf #1C1C1E; ohne gesetztes
   data-theme entscheidet die Medienabfrage (der dritte Zustand). */
:root {
  --frisch: linear-gradient(135deg, #38754A, #2A7F62);
  --gr-ton: #DDE8D8; --gr-tinte: #35502F; --gr-rand: #42714A; --gr-haken: #FFFFFF;
}
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) {
    --frisch: linear-gradient(135deg, #35CC68, #3EE6B0);
    --gr-ton: #20382A; --gr-tinte: #3AEE85; --gr-rand: #35CC68; --gr-haken: #04140C;
  }
}
:root[data-theme="dark"] {
  --frisch: linear-gradient(135deg, #35CC68, #3EE6B0);
  --gr-ton: #20382A; --gr-tinte: #3AEE85; --gr-rand: #35CC68; --gr-haken: #04140C;
}

/* 7 · "Neu für dich": ein Streifen, jeder Eintrag eine Zeile. Die fertigen
   Karten aus views2 (Abgleich, Uebergabe, Torten, Papiere) kommen
   unveraendert hinein und verlieren hier nur ihren Kartenrahmen. */
.neufuerdich { padding: 0; overflow: hidden; }
.nfkopf { display: flex; align-items: baseline; gap: .5rem; padding: .95rem 1.25rem .55rem; }
.nfkopf h2 { margin: 0; font-size: 1.125rem; }
.nfzahl { font-weight: 600; font-size: 1rem; color: var(--muted); }
.nfz, .neufuerdich > .card, .nfmehr > .card {
  display: flex; align-items: center; gap: .75rem; min-height: 52px; box-sizing: border-box;
  margin: 0; padding: .55rem 1.25rem; border: 0; border-top: 1px solid var(--hair); border-radius: 0;
  background: transparent; box-shadow: none; color: inherit; text-decoration: none;
}
.neufuerdich > .card::after, .nfmehr > .card::after { content: none; }
details.nfz { display: block; padding: 0; }
details.nfz > summary { display: flex; align-items: center; gap: .75rem; min-height: 52px; padding: .55rem 1.25rem; list-style: none; cursor: pointer; }
details.nfz > summary::-webkit-details-marker,
.nfmehr > summary::-webkit-details-marker, .neufuerdich summary::-webkit-details-marker { display: none; }
.nfinhalt { padding: 0 1.25rem .9rem calc(1.25rem + 8px + .75rem); }
.nfinhalt .newsweg { margin-top: .6rem; }
.nfpunkt { flex: none; width: 8px; height: 8px; border-radius: 50%; background: var(--muted); }
.nfpunkt.news { background: var(--news); }
/* Die News-Karte ganz oben (Mathieu, 13.10.2026, Variante 2 aus
   nachweise/news-start/): rotes Band "News · wann", darunter Titel und der
   ganze Text, unten der breite Gelesen-Knopf - nicht mehr rechts daneben. */
.card.newskarte { padding: 0; overflow: hidden; background: var(--surface); box-shadow: 0 0 0 1.5px var(--news-band); }
.nkband { display: flex; align-items: baseline; gap: .5rem; padding: .625rem 1.125rem; background: var(--news-band); color: var(--news-band-ink); }
.nkwort { font-size: .625rem; font-weight: 800; letter-spacing: .08em; text-transform: uppercase; }
.nkwann { font-size: .75rem; font-weight: 600; opacity: .9; }
.nkinhalt { padding: .75rem 1.125rem 1.125rem; }
.nktitel { font-size: 1.3125rem; line-height: 1.25; margin: 0 0 .375rem; text-wrap: balance; }
.nkinhalt .newsbody { margin: 0 0 .875rem; font-size: 1rem; line-height: 1.45; }
.nkgelesen { margin: 0; }
/* Hub -> News (14.10.2026): alle News zum Nachlesen, neueste zuerst. Die
   rote Kante sagt "News", ohne dass jede Karte laut ist; "neu" nur an dem,
   was diese Person noch nicht abgehakt hat. */
.newsarchiv { display: flex; flex-direction: column; gap: .75rem; }
.card.newsarchivstueck { box-shadow: inset 3px 0 0 var(--news); }
.nakopf { display: flex; align-items: center; gap: .5rem; }
.nawann { font-size: .75rem; font-weight: 600; color: var(--muted); }
.naneu { font-size: .625rem; font-weight: 800; letter-spacing: .06em; text-transform: uppercase; color: var(--news-band-ink); background: var(--news-band); border-radius: var(--radius-pille); padding: .125rem .5rem; }
.natitel { font-size: 1.125rem; line-height: 1.3; margin: .25rem 0 .375rem; text-wrap: balance; }
.newsarchivstueck .newsbody { margin: 0; line-height: 1.5; }
.naaktionen { margin-top: .75rem; }
/* "Erinnert um 14:05 Uhr" (16.10.2026) steht dort, wo sonst der Knopf "Erinnern" ist. */
.naerinnert { display: inline-flex; align-items: center; min-height: 44px; font-size: .875rem; color: var(--text-soft); font-variant-numeric: tabular-nums; }
/* "8 von 12 gelesen" im Backend (14.10.2026) - rechts im Kopf der Karte. */
.nazahl { margin-left: auto; font-size: .75rem; font-weight: 700; color: var(--text-soft); font-variant-numeric: tabular-nums; }
.newsarchiv .newsarchivstueck { scroll-margin-top: calc(var(--safetop, 0px) + 5rem); }
/* Der Push springt per #news-ID hierher - nicht unter die feste Kopfzeile. */
.newskarte, .newsstueck { scroll-margin-top: calc(var(--safetop, 0px) + 5rem); }
.nkgelesen .btn { display: block; width: 100%; min-height: 44px; background: var(--news-band); color: var(--news-band-ink); border: 0; font-weight: 700; }
.nkgelesen .btn:hover { filter: brightness(1.08); }
.nkgelesen .btn:focus-visible { outline: 2px solid var(--news-band); outline-offset: 2px; }
.nfpunkt.nachricht { background: var(--wahl); }
.nfpunkt.leer { background: transparent; }
.nfmitte { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: .1rem; }
.nfkick { font-size: .75rem; font-weight: 700; letter-spacing: .07em; text-transform: uppercase; color: var(--muted); }
.nfkick.news { color: var(--news); }
.nftitel { font-weight: 600; font-size: 1rem; line-height: 1.3; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.nfweitere { font-weight: 600; font-size: .875rem; color: var(--text-soft); }
/* Der Pfeil: derselbe wie an jeder anderen Klappe der App (summary.card-head),
   nur fuer "weitere" nachgebaut. Die lesbare News braucht keinen - ihr Text
   endet sichtbar mit "…", und daneben steht der Gelesen-Knopf. */
.nfmehr > summary::after {
  content: ""; margin-left: auto; flex: none; align-self: center;
  width: .5rem; height: .5rem; opacity: .6;
  border-right: 2px solid currentColor; border-bottom: 2px solid currentColor;
  transform: rotate(45deg); transition: transform .12s ease;
}
.nfmehr[open] > summary::after { transform: rotate(-135deg); }
/* Die Karten aus views2 als Zeile: ihr Kopf ist die Zeile, ein Punkt davor. */
.neufuerdich > details.card, .nfmehr > details.card { display: block; padding: 0; }
.neufuerdich > details.card > summary, .nfmehr > details.card > summary {
  display: flex; align-items: center; gap: .75rem; min-height: 52px; margin: 0; padding: .55rem 1.25rem; cursor: pointer; list-style: none;
}
.neufuerdich > details.card > summary::before, .nfmehr > details.card > summary::before,
.neufuerdich > a.papierhinweis::before, .nfmehr > a.papierhinweis::before {
  content: ''; flex: none; width: 8px; height: 8px; border-radius: 50%; background: var(--muted);
}
.neufuerdich > a.papierhinweis::before, .nfmehr > a.papierhinweis::before { background: var(--crit); }
.neufuerdich > details.card > summary h2, .nfmehr > details.card > summary h2 { flex: 1; min-width: 0; margin: 0; font-size: 1rem; color: var(--text); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.neufuerdich > details.card > summary .hint, .nfmehr > details.card > summary .hint { font-size: .875rem; white-space: nowrap; }
.neufuerdich > details.card > :not(summary), .nfmehr > details.card > :not(summary) { margin-left: calc(1.25rem + 8px + .75rem); margin-right: 1.25rem; }
.neufuerdich > details.card > :last-child:not(summary), .nfmehr > details.card > :last-child:not(summary) { margin-bottom: .9rem; }
.neufuerdich > a.papierhinweis, .nfmehr > a.papierhinweis {
  display: grid; grid-template-columns: 8px minmax(0, 1fr); column-gap: .75rem; row-gap: .1rem; align-items: center; text-align: left;
}
.neufuerdich > a.papierhinweis::before, .nfmehr > a.papierhinweis::before { grid-row: 1 / 3; }
.neufuerdich > a.papierhinweis .phtitel, .nfmehr > a.papierhinweis .phtitel {
  grid-column: 2; font-size: .75rem; font-weight: 700; letter-spacing: .07em; text-transform: uppercase; color: var(--crit);
}
.neufuerdich > a.papierhinweis .phtext, .nfmehr > a.papierhinweis .phtext {
  grid-column: 2; min-width: 0; font-weight: 600; font-size: 1rem; text-decoration: none; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.nfmehr > summary { list-style: none; cursor: pointer; }
/* Die Trennlinie zwischen den Zeilen muss auch im Dunkeln stehen: AC nimmt
   Karten den Rand (DUNKEL_AC, ".card ... border-color: transparent") - eine
   Karte als ZEILE in einer Liste braucht ihn aber, wie jede andere Zeile. */
html:root .neufuerdich > .card, html:root .nfmehr > .card, html:root .nsliste > details.card { border-top-color: var(--hair); }
html:root .nsliste > details.card:first-child { border-top-color: transparent; }
.neufuerdich .newsstueck + .newsstueck { padding-top: 0; }



/* 7 · "Nachschlagen": eingeklappte Zeilen, die Karten darin ohne Rahmen. */
.nachschlagen { margin-top: 1.6rem; }
.nskick { font-size: .75rem; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; color: var(--muted); margin: 0 .25rem .55rem; }
.nsliste { padding: 0; overflow: hidden; }
.nsliste > details { border-top: 1px solid var(--hair); }
.nsliste > details:first-child { border-top: 0; }
.nsliste > details[hidden] { display: none; }
.nsliste > details > summary { display: flex; align-items: center; gap: .75rem; min-height: 52px; padding: 0 1.25rem; list-style: none; cursor: pointer; }
.nsliste > details > summary::-webkit-details-marker { display: none; }
.nsliste > details > summary::after { content: '›'; color: var(--muted); font-size: 1.3125rem; }
.nsliste > details[open] > summary::after { transform: rotate(90deg); }
.nsz > summary b { flex: 1; font-weight: 600; font-size: 1rem; }
.nsz > summary span { color: var(--muted); font-size: .875rem; }
.nsliste > details.card { margin: 0; padding: 0; border: 0; border-top: 1px solid var(--hair); border-radius: 0; background: transparent; box-shadow: none; }
.nsliste > details.card:first-child { border-top: 0; }
.nsliste > details.card::after { content: none; }
.nsliste > details.card > summary .klappsum { flex: 1; font-weight: 600; font-size: 1rem; }
.nsliste > details.card > :not(summary) { margin-left: 1.25rem; margin-right: 1.25rem; }
.nsliste > details.card > :last-child:not(summary) { margin-bottom: 1rem; }
.nsinhalt { padding: 0 1.25rem 1rem; }
.nsinhalt > .card { margin: 0; padding: 0; border: 0; border-radius: 0; background: transparent; box-shadow: none; }
.nsinhalt > .card::after { content: none; }
.nsinhalt > .card > .card-head:first-child { display: none; }

/* 8 · Mein Plan nach Wochen. */
.pwkopf { display: flex; align-items: baseline; gap: .6rem; margin: 1.35rem .25rem .5rem; }
.planwoche:first-of-type .pwkopf { margin-top: .4rem; }
.pwkopf b { white-space: nowrap; font-size: .75rem; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; }
.pwkopf i { flex: 1; height: 1px; background: var(--hair); align-self: center; }
.pwkopf span { white-space: nowrap; font-size: .875rem; color: var(--muted); font-variant-numeric: tabular-nums; }
.pwliste { padding: 0; margin-bottom: 0; overflow: hidden; }
.planzeile.pzneu { display: grid; grid-template-columns: 2.5rem minmax(0, 1fr) 44px; column-gap: .8rem; align-items: center; min-height: 64px; padding: .6rem .9rem .6rem 1rem; border-top: 1px solid var(--hair); box-sizing: border-box; }
.planzeile.pzneu:first-child { border-top: 0; }
.pzneu .pztag { width: auto; }
.pzneu .pztag b { font-size: 1.125rem; }
.pzneu.heute .pztag b, .pzneu.heute .pztag > span { color: var(--gr-tinte); }
.pzneu .pzinhalt > .tag { margin-top: .3rem; }
.pzneu .pzinhalt > .pzz1 { display: flex; margin-top: 0; font-size: 1rem; color: var(--text); align-items: baseline; gap: .45rem; min-width: 0; }
.pzz1 b { font-size: 1rem; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pzzeit { flex: none; font-size: .875rem; color: var(--text-soft); font-variant-numeric: tabular-nums; white-space: nowrap; }
.pzzeit sup { font-size: .625rem; }
.pzneu .pzinhalt > .pzspurzeile { display: flex; font-size: 1rem; align-items: center; gap: .6rem; margin-top: .3rem; }
.pzspur { position: relative; flex: 1; height: 4px; border-radius: 2px; background: var(--hair); }
.pzspur i { position: absolute; top: 0; bottom: 0; border-radius: 2px; background: var(--text); }
.pzneu.heute .pzspur i { background: var(--frisch); }
.pzneu.wartet .pzspur i { background: transparent; box-shadow: inset 0 0 0 1.5px var(--muted); }
.pzwartet { flex: none; display: inline-flex; align-items: center; gap: .3rem; font-size: .75rem; font-weight: 600; color: var(--text-soft); }
.pzwartet::before { content: ''; width: 7px; height: 7px; border-radius: 50%; box-shadow: inset 0 0 0 1.5px currentColor; }
.pzheute { flex: none; font-size: .75rem; font-weight: 700; color: var(--gr-tinte); }
.pzneu .pzkal { grid-column: 3; width: 44px; height: 44px; margin: 0; display: grid; place-items: center; border-radius: 50%; background: var(--wahl-soft); color: var(--wahl); }
.pzneu .pzkal.leer { background: transparent; }
.pzneu .ersatzlink { margin-top: .25rem; }
.planfuss { position: relative; display: flex; align-items: center; justify-content: space-between; gap: .75rem; margin: 1rem .25rem 0; }
.planfuss .btn-row { margin: 0; }
.planfuss .btn.pzalle { background: var(--wahl-soft); color: var(--wahl); border-color: transparent; }
.planfuss .infoklapp { flex: none; }
.planfuss .infoklapp > summary { position: relative; width: 44px; height: 44px; }
/* Mathieu, 23.10.2026 (Pruefung): hier stand "position: static" - dann hing die unsichtbare
   Erweiterung (::before, inset -5px) am naechsten positionierten Vorfahren, ".planfuss", und
   deckte die GANZE Zeile ab: "Alle 5 in den Kalender" war nicht antippbar, der Tipp oeffnete
   das "i". Das "i" ist hier schon 44 px gross und braucht keine Erweiterung. */
.planfuss .infoklapp > summary::before { content: none; }
.planfuss .infoklapp[open] { flex-basis: 100%; order: 3; }
.planfuss { flex-wrap: wrap; }
.abokarte { margin-top: 1.25rem; }
.aboerklaert { margin-top: .75rem; border-top: 1px solid var(--hair); padding-top: .2rem; }
.aboerklaert > summary { min-height: 44px; display: flex; align-items: center; font-weight: 600; font-size: 1rem; text-decoration: underline; text-underline-offset: 3px; cursor: pointer; list-style: none; }
.aboerklaert > summary::-webkit-details-marker { display: none; }
.aboerklaert > summary::after { content: '\00a0›'; text-decoration: none; }

/* 9 · Checkliste: mitlaufender Fortschritt, groessere Zeilen. Der Kopf der
   Seite klebt oben (.topbar.emp: 44-px-Knopf + 2 x .25rem) - die Zeile
   klebt direkt darunter. */
.ckfort { position: sticky; top: calc(var(--safetop) + 52px); z-index: 5; margin: -.25rem -1rem 1rem; padding: .7rem 1rem .8rem; background: var(--bg); border-bottom: 1px solid var(--hair); }
.ckfzeile { display: flex; align-items: baseline; justify-content: space-between; gap: .5rem; margin-bottom: .5rem; }
.ckfzeile b { font-size: 1rem; font-variant-numeric: tabular-nums; }
.ckfzeile em { font-style: normal; font-size: 1.3125rem; }
.ckrest { font-size: .875rem; color: var(--muted); }
.ckbalken { height: 8px; border-radius: 4px; background: var(--hair-strong, var(--hair)); overflow: hidden; }
.ckbalken i { display: block; height: 100%; border-radius: 4px; background: var(--frisch); transition: width .2s; }
.ckliste #checkform > .checkarea { display: flex; align-items: baseline; gap: .6rem; margin: 1.4rem 0 .2rem; }
.ckliste #checkform > .checkarea:first-of-type { margin-top: .2rem; }
.cknum { margin-left: auto; font-variant-numeric: tabular-nums; letter-spacing: .02em; }
.cknum.fertig { color: var(--gr-tinte); }
.ckliste #checkform > .checkrow { align-items: center; gap: .85rem; min-height: 56px; padding: .55rem 0; border-bottom: 1px solid var(--hair); font-size: 1rem; line-height: 1.4; }
.ckliste #checkform > .checkrow > span { font-weight: 600; }
.ckliste #checkform > .checkrow > input { -webkit-appearance: none; appearance: none; margin: 0; width: 26px; height: 26px; border-radius: 8px; border: 2px solid var(--muted); background: transparent; flex: none; cursor: pointer; }
.ckliste #checkform > .checkrow > input:checked { border-color: transparent; background: var(--gr-rand) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='3.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 12.5l4.5 4.5L19 7.5'/%3E%3C/svg%3E") center / 17px no-repeat; }
.ckliste #checkform > .checkrow > input:focus-visible { outline: 2px solid var(--wahl); outline-offset: 2px; }
.ckliste #checkform > .checkrow.erledigt > span { color: var(--muted); text-decoration: line-through; text-decoration-thickness: 1.5px; opacity: .75; }
.ckliste #checkform > .checkwahl { padding: .7rem 0 .8rem; border-top: 0; border-bottom: 1px solid var(--hair); font-size: 1rem; }
.ckliste #checkform > .checkwahl > legend { float: left; width: 100%; margin-bottom: .55rem; line-height: 1.4; font-weight: 600; }
.ckliste #checkform > .checkwahl.erledigt > legend { color: var(--muted); }
.ckliste .wahlreihe { clear: both; display: grid; grid-auto-flow: column; grid-auto-columns: 1fr; gap: 0; border-radius: 12px; background: var(--fill); padding: 3px; }
.ckliste .wahlknopf, .ckliste .wahlknopf:has(input:checked) { display: block; min-height: 0; padding: 0; border: 0; border-radius: 10px; background: none; color: inherit; }
.ckliste .wahlknopf input { position: absolute; opacity: 0; width: 1px; height: 1px; }
.ckliste .wahlknopf span { display: flex; align-items: center; justify-content: center; gap: .3rem; min-height: 44px; border-radius: 10px; font-size: 1rem; font-weight: 600; color: var(--text-soft); text-align: center; padding: 0 .3rem; }
.ckliste .wahlknopf input:checked + span { background: var(--surface); color: var(--gr-tinte); box-shadow: inset 0 0 0 1.5px var(--gr-rand); }
.ckliste .wahlknopf input:checked + span::before { content: '✓'; }
.ckliste .wahlknopf input:focus-visible + span { outline: 2px solid var(--wahl); outline-offset: 1px; }
.ckliste .fotohinweis { display: inline-flex; align-items: center; gap: .3rem; margin-left: .35rem; padding: .1rem .55rem; border-radius: 999px; border: 1px solid var(--hair-strong, var(--border)); font-size: .75rem; font-weight: 600; color: var(--muted); vertical-align: .1em; white-space: nowrap; text-decoration: none; }
.ckliste .checkrow.erledigt .fotohinweis { text-decoration: none; }

/* --- Mischung (Mathieu, 15.10.2026: "ja mach alle drei, zeig mir die
   Bilder"). Aus Richtung C und T2 nur die Bausteine, die NICHTS wegnehmen:
   "Wer wann" als dritte Form des Tages, Ausfall und "Abwesend · N" in allen
   Formen. "Ich kann" ist auf Mathieus Wunsch erst einmal draussen ("Bitte
   pass erst mal nur die Schichten-Seite an"). ---------------------------- */

/* ("Wer wann" und "Abwesend · N" sind seit dem 23.10.2026 in der Zeitleiste
   und in "Nicht da" aufgegangen - ihre Regeln .tg* stehen jetzt als .w1zr,
   .w1nichtda und .w1nichtdazeile in stil-w1-schichten.js.) */

/* Ausfall in Liste, Zeitleiste und grosser Ansicht: dieselbe Zeile wie in
   "Wer wann", nur kleiner - rote Kante links, Name durchgestrichen, das Wort
   rechts. */
.abwzeile {
  display: flex; align-items: center; justify-content: space-between; gap: .75rem;
  margin: .375rem 0 0; padding: .375rem .625rem .375rem .875rem; border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
  background: var(--surface-2); box-shadow: inset 4px 0 0 var(--crit);
  font-size: .875rem; line-height: 1.3;
}
.abwname { min-width: 0; color: var(--text-soft); text-decoration: line-through; text-decoration-thickness: 1.5px; }
.abwmarke { flex: none; font-size: .75rem; font-weight: 700; letter-spacing: .06em; text-transform: uppercase; color: var(--crit); }
.sdabw { margin-top: .5rem; }

/* Die Seiten aus "Mehr" am Handy (15.10.2026) - erzeugt aus MEHR_AM_HANDY
   oben. Nur unter 1000 px, nur an body.mehrseite. */

@media (min-width: 1000px) {
  /* Das Tagesblatt ist nur fuer das Handy - am Rechner bleibt die Tabelle.
     Ebenso der Knopf, der dort die Spitze aufklappt. */
  .tblatt, .bdspitzeauf { display: none; }
}
@media (max-width: 999px) {
  /* Seitenrand wie in der Team-App: 16 px. */
  body.mehrseite main.wrap { padding-left: 16px; padding-right: 16px; }
  body.mehrseite main.wrap .card { padding: 16px; }
  /* Tabellen und Klappkaesten in der Karte reichen bis an die Kartenkante -
     kein zweiter Rahmen in der Karte, kein doppeltes Polster. */
  body.mehrseite .card > .table-scroll,
  body.mehrseite .card > form > .table-scroll,
  body.mehrseite .card > details.panel {
    margin-left: -16px; margin-right: -16px;
    border-left-width: 0; border-right-width: 0; border-radius: 0;
  }
  body.mehrseite .card > details.panel > summary,
  body.mehrseite .card > details.panel .panel-body { border-radius: 0; }
  /* Eine Tabelle OHNE Rollkasten (Kontrolllisten) lief 408 px seitlich aus
     dem Bildschirm. Als Block scrollt sie in sich - die Seite steht still. */
  body.mehrseite .card > table.tabelle {
    display: block; overflow-x: auto;
    width: calc(100% + 32px); margin-left: -16px; margin-right: -16px;
  }
  body.mehrseite td.tdknopf form { display: inline; }
  body.mehrseite table.stapel td.stapelfeld input { min-height: 44px; }
  /* Die Schrift in der ersten und letzten Spalte steht dann auf derselben
     Linie wie der Text der Karte. */
  body.mehrseite .card > .table-scroll th:first-child, body.mehrseite .card > .table-scroll td:first-child,
  body.mehrseite .card > form > .table-scroll th:first-child, body.mehrseite .card > form > .table-scroll td:first-child,
  body.mehrseite .card > table.tabelle th:first-child, body.mehrseite .card > table.tabelle td:first-child { padding-left: 16px; }
  body.mehrseite .card > .table-scroll th:last-child, body.mehrseite .card > .table-scroll td:last-child,
  body.mehrseite .card > form > .table-scroll th:last-child, body.mehrseite .card > form > .table-scroll td:last-child,
  body.mehrseite .card > table.tabelle th:last-child, body.mehrseite .card > table.tabelle td:last-child { padding-right: 16px; }
  /* Namen duerfen umbrechen: ein Name in zwei Zeilen ist lesbar, eine
     Zahlenspalte ausserhalb des Bildschirms nicht. */
  body.mehrseite .wrap td.name { white-space: normal; }

  /* Tippziele: 44 px, Mathieus eigene Regel ("KEEP HIT AREA 44PX"). */
  body.mehrseite .btn.small { min-height: 44px; }
  body.mehrseite .card-head a.hint { display: inline-flex; align-items: center; min-height: 44px; }
  body.mehrseite .statuspill { min-height: 44px; }
  body.mehrseite details.werdarf > summary { min-height: 44px; }
  body.mehrseite .kaltwahl { min-height: 44px; align-items: center; }
  /* Namen als Link in einer Zeile (Mitarbeiter, Zeiten, Konto): die Flaeche
     waechst auf 44 px, die Zeile nicht - der Rand wird zurueckgenommen. */
  body.mehrseite .emprow .who > a, body.mehrseite .wrap td.name > a {
    display: inline-flex; align-items: center; min-height: 44px; margin: -10px 0;
  }
  /* Der Monatskalender unter "Zeiten": Tage und Wochen sind Wege zur Woche. */
  body.mehrseite .plankalender-grid td > a, body.mehrseite .plankalender-grid td.kw > a { min-height: 44px; }
  body.mehrseite .kalnav a { min-height: 44px; justify-content: center; }
  /* Eine Zeile Schichtvorlage lief 18 px aus dem Bildschirm: das Gitter der
     Zeile war so breit wie ihr breitester Inhalt. */
  body.mehrseite .emprow { grid-template-columns: minmax(0, 1fr); }

  /* Die Uebersicht lief 63 px seitlich aus dem Bildschirm: 1fr heisst im
     Gitter "mindestens so breit wie der Inhalt", und die Tabelle "Wird
     knapp" war breiter. minmax(0, ...) laesst die Spalte schmaler werden. */
  body.mehrseite .uzwei { grid-template-columns: minmax(0, 1.25fr) minmax(0, 1fr); }

  /* --- Das Tagesblatt (views.js tagesblattBedarf/-Personen) --- */
  body.mehrseite .tbaktiv .tbquelle, body.mehrseite .tbaktiv .tbnurraster { display: none; }
  .tbtage { display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); gap: 4px; margin: .25rem 0 .75rem; }
  .tbtag {
    min-height: 44px; padding: 0; border-radius: var(--radius-xs);
    border: 1.5px solid var(--hair-strong); background: var(--surface); color: var(--text);
    font-family: inherit; font-size: .875rem; font-weight: 650; cursor: pointer;
  }
  /* Gefuellt = gewaehlt. Eine Tinte: Marine, die Form sagt den Zustand. */
  .tbtag[aria-pressed="true"] { background: var(--accent); border-color: var(--accent); color: var(--accent-ink); }
  .tbtag:focus-visible, .tbfeld:focus-visible, .tbhalb:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
  .tbkacheln { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 8px; }
  .tbkachel { display: flex; flex-direction: column; gap: 2px; margin: 0; font-size: .75rem; font-weight: 700; color: var(--muted); }
  .tbuhr { font-variant-numeric: tabular-nums; }
  .tbnacht { font-weight: 500; }
  .tbfeld {
    display: block; box-sizing: border-box; width: 100%; height: 44px; min-height: 44px; padding: 0; margin: 0;
    border-radius: var(--radius-xs); border: 1px solid var(--border); background: var(--surface-2); color: var(--muted);
    font-family: var(--f-text); font-size: 1rem; font-weight: 700; font-variant-numeric: tabular-nums;
    text-align: center; appearance: textfield; -webkit-appearance: none;
  }
  .tbfeld::-webkit-outer-spin-button, .tbfeld::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
  /* Dieselbe Rampe wie im Raster (.brzelle[data-n]) - eine Menge, eine Farbe. */
  .tbkachel[data-n="1"] .tbfeld { background: var(--br1); border-color: var(--br2); color: var(--text); }
  .tbkachel[data-n="2"] .tbfeld { background: var(--br2); border-color: var(--br3); color: var(--text); }
  .tbkachel[data-n="3"] .tbfeld { background: var(--br3); border-color: var(--br4); color: var(--text); }
  .tbkachel[data-n="4"] .tbfeld { background: var(--br4); border-color: var(--br5); color: var(--text); }
  .tbkachel[data-n="5"] .tbfeld { background: var(--br5); border-color: var(--br5); color: var(--accent-ink); }
  .tbkachel[data-n="6"] .tbfeld, .tbkachel.brviel .tbfeld { background: var(--br6); border-color: var(--br6); color: var(--accent-ink); }
  .tbfuss { margin: .75rem 0 0; font-size: .875rem; color: var(--muted); }
  .tbfuss b { color: var(--text); }
  .tbhilfe { margin: 0 0 .5rem; font-size: .875rem; color: var(--muted); }
  /* Wer wann da ist: die Stunden untereinander, je Person zwei Haelften. */
  .tbtab {
    table-layout: fixed; border-collapse: separate; border-spacing: 0 3px;
    width: calc(100% + 24px); margin: 0 -12px; background: transparent;
  }
  .tbtab th, .tbtab td { padding: 0 2px; border: 0; vertical-align: middle; }
  .tbtab thead th {
    font-size: .625rem; font-weight: 700; letter-spacing: .04em; color: var(--muted);
    text-align: center; padding-bottom: .25rem; white-space: nowrap; overflow: hidden;
  }
  .tbtab thead .wchip { font-size: .75rem; max-width: 100%; overflow: hidden; text-overflow: ellipsis; text-transform: none; letter-spacing: 0; }
  .tbtab .tbuhrkopf { width: 2.25rem; }
  .tbtab .tbsollkopf { width: 3.25rem; }
  .tbtab th.tbuhr { font-size: .875rem; font-weight: 700; text-align: center; }
  .tbtab td.tbsoll { text-align: center; font-weight: 700; color: var(--muted); font-variant-numeric: tabular-nums; }
  .tbtab tbody tr:hover td { background: none; }
  .tbhaelften { display: flex; gap: 1px; }
  .tbhalb {
    display: block; flex: 1 1 0; min-width: 0; height: 44px; padding: 0; margin: 0; cursor: pointer;
    background: transparent; border: 1px dashed var(--hair-strong);
  }
  .tbhalb:first-child { border-radius: 8px 2px 2px 8px; }
  .tbhalb:last-child { border-radius: 2px 8px 8px 2px; }
  /* Drei Stufen wie am Rechner: kein Bedarf (blass), Bedarf und niemand da
     (deutlicher Rahmen - das ist ein Loch), jemand da (seine Farbe). */
  .tbperson.gebraucht .tbhalb { border-style: solid; border-color: var(--muted); }
  .tbhalb.an { border-style: solid; }
  .tbhalb.an.w-0 { background: var(--pf1); border-color: var(--pf1); }
  .tbhalb.an.w-1 { background: var(--pf2); border-color: var(--pf2); }
  .tbhalb.an.w-2 { background: var(--pf3); border-color: var(--pf3); }
  .tbhalb.an.w-3 { background: var(--pf4); border-color: var(--pf4); }
  .tbperson.tbweg .tbhalb { opacity: .38; }
  .tbsummen { list-style: none; margin: .75rem 0 0; padding: 0; display: grid; gap: .375rem; font-size: .875rem; font-variant-numeric: tabular-nums; }
  .tbsummen li { display: flex; align-items: center; gap: .5rem; }

  /* Personalbedarf, Grundbesetzung: die acht Spalten (803 px) passen erst ab
     etwa 1100 px - bei 768 px lief die Seite 74 px seitlich aus. Unter
     1000 px also dieselben zwei Zeilen wie am Telefon (Tag, dann ab/bis/Leute). */
  body.mehrseite .bdtag { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) 5.4rem; }
  body.mehrseite .bdtag > .bdname { grid-column: 1 / -1; margin-top: .3rem; }
  body.mehrseite .bdtag > .bdspitze { grid-column: 1 / -1; }
  body.mehrseite .bdtag.bdkopf { display: none; }
  /* Die Spitze, solange sie leer ist, eingeklappt (Skript setzt .bdzu). */
  body.mehrseite .bdschnell.bdzu .bdspitze,
  body.mehrseite .bdschnell.bdzu input[name*="_spitze_"] { display: none; }
  body.mehrseite .bdspitzeauf {
    min-height: 44px; margin: -.25rem 0 .75rem; padding: 0; border: 0; background: none;
    font: inherit; font-size: .875rem; font-weight: 600; color: var(--accent);
    text-decoration: underline; text-underline-offset: 3px; cursor: pointer;
  }
}
@media (max-width: 780px) {
  body.mehrseite .uzwei { grid-template-columns: minmax(0, 1fr); }
}
@media (min-width: 600px) and (max-width: 999px) {
  .tbkacheln { grid-template-columns: repeat(6, minmax(0, 1fr)); }
}
/* Tabellen, die am Handy als Liste stehen (class="stapel"): je Zeile ein
   Block - oben der Name, darunter die Werte mit ihrer Spaltenueberschrift
   (data-label). Kein seitliches Scrollen mehr; ab 700 px passt die Tabelle
   wieder in die Breite und bleibt Tabelle. */
@media (max-width: 699px) {
  body.mehrseite table.stapel, body.mehrseite table.stapel tbody, body.mehrseite table.stapel tfoot { display: block; width: auto; }
  body.mehrseite .card > table.stapel { width: auto; }
  body.mehrseite table.stapel thead { display: none; }
  body.mehrseite table.stapel tr {
    display: flex; flex-wrap: wrap; align-items: flex-end; gap: .375rem 1.25rem;
    padding: .75rem 16px; border-bottom: 1px solid var(--hair);
  }
  body.mehrseite table.stapel tbody tr:last-child { border-bottom: 0; }
  body.mehrseite table.stapel tfoot tr { border-top: 1px solid var(--hair-strong); border-bottom: 0; }
  body.mehrseite table.stapel td, body.mehrseite .card > .table-scroll table.stapel td {
    display: block; padding: 0; border: 0; text-align: left; white-space: normal; min-width: 0;
  }
  /* Die Kante der Kopfzeile (16 px, oben) gilt in der Liste fuer die ganze
     Zeile - nicht noch einmal fuer die erste und letzte Zelle. */
  body.mehrseite .card table.stapel td:first-child, body.mehrseite .card table.stapel td:last-child { padding-left: 0; padding-right: 0; }
  body.mehrseite table.stapel td:empty { display: none; }
  body.mehrseite table.stapel tbody tr:hover td { background: none; }
  body.mehrseite table.stapel td:first-child:not([data-label]), body.mehrseite table.stapel td.stapelkopf {
    flex: 1 0 100%; font-size: 1rem; font-weight: 650;
  }
  body.mehrseite table.stapel td.stapelkopf { order: -1; }
  body.mehrseite table.stapel td .hint { font-weight: 400; }
  body.mehrseite table.stapel td[data-label]::before {
    content: attr(data-label); display: block; margin-bottom: .125rem;
    font-size: .625rem; font-weight: 700; letter-spacing: .05em; text-transform: uppercase; color: var(--muted);
  }
  body.mehrseite table.stapel td.stapelvoll, body.mehrseite table.stapel td.stapelfeld { flex: 1 0 100%; }
  body.mehrseite table.stapel td.stapelfeld input { width: 100%; }
  body.mehrseite table.stapel td.stapelende { margin-left: auto; }
  body.mehrseite table.stapel td.tdknopf { display: flex; flex-wrap: wrap; gap: .5rem; }
}


/* Der Dienstplan am Handy (15.10.2026) - erzeugt aus PLAN_AM_HANDY oben.
   Nur unter 1000 px, nur an main.planseite / main.wochenseite. */

@media (max-width: 999px) {
  /* Eine Spalte, damit "order" greift. Die Karten haben nur einen Abstand
     nach unten - ohne Randverschmelzung aendert sich also nichts. */
  main.planseite { display: flex; flex-direction: column; }
  main.planseite > #tausch { order: 1; }
  main.planseite > .planmehrkopf, main.planseite > .planklappe,
  main.planseite > .tagesgeld, main.planseite > .monatskosten, main.planseite > .abwesendkarte,
  main.planseite > .azkarte, main.planseite > .vertragskarte { order: 2; }

  /* Die Klappen. */
  main.planseite > .planmehrkopf { margin: .75rem .25rem .5rem; }
  main.planseite > .planklappe {
    margin: 0 0 .5rem; border: 1px solid var(--border); border-radius: var(--radius);
    background: var(--surface); overflow: hidden;
  }
  main.planseite > .planklappe > summary {
    display: flex; align-items: center; gap: .75rem; min-height: 52px; padding: 0 1rem;
    list-style: none; cursor: pointer;
  }
  main.planseite > .planklappe > summary::-webkit-details-marker { display: none; }
  main.planseite > .planklappe > summary b { flex: 1 1 auto; min-width: 0; font-weight: 600; font-size: 1rem; }
  main.planseite > .planklappe > summary span {
    flex: 0 1 auto; min-width: 0; max-width: 55%; color: var(--muted); font-size: .875rem;
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font-variant-numeric: tabular-nums;
  }
  main.planseite > .planklappe > summary::after { content: '›'; flex: none; color: var(--muted); font-size: 1.3125rem; }
  main.planseite > .planklappe[open] > summary::after { transform: rotate(90deg); }
  main.planseite > .planklappe > .card {
    margin: 0; border: 0; border-top: 1px solid var(--hair); border-radius: 0;
    background: transparent; box-shadow: none;
  }
  main.planseite > .planklappe > .card::after { content: none; }
  main.planseite > .planklappe > .card > .card-head:first-child { display: none; }

  /* Nur am Rechner: Legende und Erklaerungen, die das Bild schon sagt. */
  main.planseite .bedarfheute .bhleg { display: none; }
  main.planseite > #tausch .lede { display: none; }
  main.planseite > .card > .card-head > a.hint { display: none; }
  main.wochenseite .wtlegende { display: none; }

  /* Tippziele 44 px. Wo das Ziel nur ein Zeichen ist (Pfeil, Kreuz, Plus),
     waechst die Flaeche, nicht der Platz: ein negativer Rand gibt die
     zusaetzlichen Pixel zurueck - sonst wuerde jede Zeile hoeher. */
  main.planseite .wkpfeil, main.wochenseite .wkpfeil { width: 44px; height: 44px; margin: -5px; }
  main.planseite .bhkopf a { display: inline-flex; align-items: center; min-height: 44px; margin: -13px 0; }
  main.planseite .bereichkopf { min-height: 44px; }
  main.planseite .crewform button:not(.crewwort) { width: 44px; height: 44px; margin: -7px; }
  main.planseite details.slotadd > summary:not(.huellenzeile) { display: flex; align-items: center; min-height: 44px; padding: 0; }
  main.planseite .huellenzeile { min-height: 44px; }
  main.planseite .slotverlauf > summary, main.planseite .bgteil > summary { display: flex; align-items: center; min-height: 44px; }
  main.planseite .btn.small, main.wochenseite .btn.small { min-height: 44px; }
  main.planseite .linkbtn, main.wochenseite .linkbtn { min-height: 44px; }
  main.planseite .kostendetails > summary { padding: .75rem 0; }
  main.planseite .ausraus { display: inline-flex; align-items: center; min-height: 44px; }
  main.planseite .bmwann a { display: inline-flex; align-items: center; min-height: 44px; }
  main.planseite .kalnav a { min-height: 44px; justify-content: center; }
  main.wochenseite .mw { display: inline-flex; align-items: center; min-height: 44px; }
  main.wochenseite .wtgname { min-height: 44px; }
  main.wochenseite .wtplus { width: 44px; height: 44px; margin: -9px; }
}
/* Der Schichttausch als Liste (Mathieu, 15.10.2026: "2 ja"). Bei 390 px lief
   die Tabelle rechts aus dem Bildschirm, "bestätigen" und "Ablehnen" waren
   nur mit seitlichem Wischen zu erreichen. Jetzt je Angebot ein Block: oben
   wer abgibt, darunter Tag und Schicht, dann je Bewerbung ein Knopf ueber die
   ganze Breite, zuletzt "Ablehnen" - dieselbe Stapel-Liste wie in "Mehr". */
@media (max-width: 699px) {
  main.planseite table.stapel, main.planseite table.stapel tbody, main.planseite table.stapel tfoot { display: block; width: auto; }
  main.planseite .card > table.stapel { width: auto; }
  main.planseite table.stapel thead { display: none; }
  main.planseite table.stapel tr {
    display: flex; flex-wrap: wrap; align-items: flex-end; gap: .375rem 1.25rem;
    padding: .75rem 16px; border-bottom: 1px solid var(--hair);
  }
  main.planseite table.stapel tbody tr:last-child { border-bottom: 0; }
  main.planseite table.stapel tfoot tr { border-top: 1px solid var(--hair-strong); border-bottom: 0; }
  main.planseite table.stapel td, main.planseite .card > .table-scroll table.stapel td {
    display: block; padding: 0; border: 0; text-align: left; white-space: normal; min-width: 0;
  }
  /* Die Kante der Kopfzeile (16 px, oben) gilt in der Liste fuer die ganze
     Zeile - nicht noch einmal fuer die erste und letzte Zelle. */
  main.planseite .card table.stapel td:first-child, main.planseite .card table.stapel td:last-child { padding-left: 0; padding-right: 0; }
  main.planseite table.stapel td:empty { display: none; }
  main.planseite table.stapel tbody tr:hover td { background: none; }
  main.planseite table.stapel td:first-child:not([data-label]), main.planseite table.stapel td.stapelkopf {
    flex: 1 0 100%; font-size: 1rem; font-weight: 650;
  }
  main.planseite table.stapel td.stapelkopf { order: -1; }
  main.planseite table.stapel td .hint { font-weight: 400; }
  main.planseite table.stapel td[data-label]::before {
    content: attr(data-label); display: block; margin-bottom: .125rem;
    font-size: .625rem; font-weight: 700; letter-spacing: .05em; text-transform: uppercase; color: var(--muted);
  }
  main.planseite table.stapel td.stapelvoll, main.planseite table.stapel td.stapelfeld { flex: 1 0 100%; }
  main.planseite table.stapel td.stapelfeld input { width: 100%; }
  main.planseite table.stapel td.stapelende { margin-left: auto; }
  main.planseite table.stapel td.tdknopf { display: flex; flex-wrap: wrap; gap: .5rem; }
}
@media (max-width: 699px) {
  main.planseite > #tausch > .table-scroll { border-left-width: 0; border-right-width: 0; border-radius: 0; margin: 0 -16px; }
  main.planseite > #tausch table.stapel td.tdknopf { flex-direction: column; flex-wrap: nowrap; }
  main.planseite > #tausch table.stapel td form { width: 100%; }
  main.planseite > #tausch table.stapel td .btn { width: 100%; min-height: 44px; }
}


/* Plan am Handy, Variante B (15.10.2026) - erzeugt aus PLAN_HANDY_B oben.
   Nur Klassen, die allein im Handy-HTML stehen. */

/* Der Kopf: ein grosser Titel, darunter eine Zeile, rechts die Pfeile. */
.hbkopf { display: flex; align-items: center; gap: .375rem; margin: .25rem 0 .375rem; }
.hbkopftext { flex: 1 1 auto; min-width: 0; }
.hbkopf h1 { margin: 0; font-size: 1.75rem; line-height: 1.15; letter-spacing: -.02em; font-weight: 600; color: var(--text); }
.hbkopf p { margin: .25rem 0 0; font-size: .875rem; color: var(--muted); }
.hbkopf .hbevents { display: flex; flex-wrap: wrap; gap: .25rem; }
.hbpfeil {
  flex: none; width: 44px; height: 44px; border-radius: 50%; display: grid; place-items: center;
  background: var(--fill); color: var(--accent); font-size: 1.5rem; line-height: 1; text-decoration: none;
}
.hbpfeil:hover { text-decoration: none; }
.hbpfeil.aus { opacity: .35; }

/* Tag | Woche | Monat - das gewaehlte gefuellt. */
.hbansicht { display: flex; gap: .25rem; margin: .375rem 0 .625rem; }
.hbansicht a {
  min-height: 44px; padding: 0 1rem; display: inline-flex; align-items: center; border-radius: var(--radius-pille);
  font-size: 1rem; font-weight: 600; color: var(--muted); text-decoration: none;
}
.hbansicht a.an { background: var(--accent); color: var(--accent-ink); }

/* Die Tagespunkte. Grau, ausser laut Bedarf fehlt jemand: rot. */
.hbpunkte { display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); gap: .25rem; margin: 0 0 .75rem; }
.hbtagpunkt {
  position: relative; min-height: 52px; border-radius: var(--radius-sm); display: grid; justify-items: center; align-content: center;
  gap: .375rem; font-size: .75rem; font-weight: 600; color: var(--muted); text-decoration: none;
}
.hbtagpunkt:hover { text-decoration: none; }
.hbtagpunkt.heute span { color: var(--text); font-weight: 700; }
/* Lesbar statt durchsichtig (25.10.2026): mit .5 Deckkraft kam "Mo" auf 2,2:1 (hell) bzw. 3,2:1 (dunkel). */
.hbtagpunkt.vorbei:not(.an) span { color: var(--muted); }
.hbtagpunkt.an { background: var(--accent); color: var(--accent-ink); opacity: 1; }
.hbtagpunkt.an span { color: inherit; }
.hbpunkt { width: 8px; height: 8px; border-radius: 50%; background: var(--feldrand); }
.hbpunkt.fehlt { background: var(--crit); }
.hbtagpunkt.an .hbpunkt { background: var(--accent-ink); opacity: .6; }
.hbtagpunkt.an .hbpunkt.fehlt { background: var(--crit-soft); opacity: 1; }
.hbwartet { position: absolute; top: 7px; left: calc(50% + 9px); width: 6px; height: 6px; border-radius: 50%; background: var(--accent); }
.hbtagpunkt.an .hbwartet { background: var(--accent-ink); }

/* EINE Bedarfszeile; Tipp klappt die Stunden auf. */
.hbbedarf { margin: 0 0 1.125rem; background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-sm); }
.hbbedarf > summary {
  display: flex; align-items: center; gap: .625rem; min-height: 48px; padding: 0 .875rem;
  list-style: none; cursor: pointer; font-weight: 600; font-size: 1rem; color: var(--text);
}
.hbbedarf > summary::-webkit-details-marker { display: none; }
.hbbedarf > summary::after { content: '›'; flex: none; margin-left: auto; color: var(--muted); font-size: 1.3125rem; font-weight: 400; }
.hbbedarf[open] > summary::after { transform: rotate(90deg); }
.hbbedarf > summary i { flex: none; width: 10px; height: 10px; border-radius: 50%; background: var(--ok); }
.hbbedarf > summary span { min-width: 0; }
.hbbedarf.fehlt > summary { color: var(--crit); }
.hbbedarf.fehlt > summary i { background: var(--crit); }
.hbbedarf .bedarfheute { margin: 0; border: 0; border-top: 1px solid var(--hair); border-radius: 0; background: transparent; }

/* Bereiche: nur mit mehreren ein Kopf. */
.hbbereich { margin: 0; }
.hbbkopf {
  display: flex; align-items: center; gap: .5rem; min-height: 44px; padding: 0 .25rem; list-style: none; cursor: pointer;
  font-size: .75rem; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; color: var(--muted);
}
.hbbkopf::-webkit-details-marker { display: none; }
.hbbkopf span { font-weight: 500; letter-spacing: 0; text-transform: none; }
.hbbkopf::after { content: '›'; margin-left: auto; font-size: 1.3125rem; font-weight: 400; }
.hbbereich[open] > .hbbkopf::after { transform: rotate(90deg); }

/* Eine Schicht: Kopf mit "+ Person", darunter die Liste. */
.hbschicht { margin: 0 0 1.125rem; }
.hbskopf { display: flex; align-items: center; gap: .5rem; padding: 0 .25rem .375rem; }
.hbskopf h3, .hbskopf h2 { margin: 0; flex: 1 1 auto; min-width: 0; display: flex; align-items: baseline; gap: .5rem; font-size: .875rem; line-height: 1.3; }
.hbskopf h3 b, .hbskopf h2 b { font-weight: 700; letter-spacing: .06em; text-transform: uppercase; color: var(--text); }
.hbskopf h3 span, .hbskopf h2 span { font-weight: 500; color: var(--muted); font-variant-numeric: tabular-nums; white-space: nowrap; }
.hbplus {
  flex: none; min-height: 44px; display: inline-flex; align-items: center; padding: 0 .875rem; margin: -4px 0;
  border-radius: var(--radius-pille); background: var(--wahl-soft); color: var(--accent);
  font-weight: 600; font-size: .875rem; text-decoration: none; white-space: nowrap;
}
.hbplus:hover { text-decoration: none; }
.hbschicht > .stufenhinweis { margin: 0 .25rem .375rem; }
.hbliste { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-sm); overflow: hidden; }
.hbperson { display: flex; align-items: center; gap: .5rem; min-height: 56px; padding: 0 .5rem 0 0; color: var(--text); text-decoration: none; }
.hbperson:hover { text-decoration: none; }
.hbperson + .hbperson { border-top: 1px solid var(--hair); }
.hbwer {
  flex: 1 1 auto; min-width: 0; display: flex; align-items: center; gap: .75rem; min-height: 56px;
  padding: 0 0 0 .75rem; color: var(--text); text-decoration: none;
}
.hbwer:hover { text-decoration: none; }
.hbfrei { padding-left: .75rem; gap: .75rem; color: var(--muted); }
.hbav {
  flex: none; width: 36px; height: 36px; border-radius: 50%; display: grid; place-items: center;
  font-size: .75rem; font-weight: 700; letter-spacing: .02em; background: var(--ok); color: var(--ok-ink);
}
.hbname { min-width: 0; font-weight: 600; font-size: 1rem; line-height: 1.25; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.hbname small { display: block; font-weight: 500; font-size: .75rem; color: var(--muted); overflow: hidden; text-overflow: ellipsis; }
.hbname small.rot { color: var(--crit); font-weight: 600; }
/* Die Uhrzeit IST der Knopf zu "Zeit ändern": 44 px Flaeche, sichtbar die
   Pille. Dunkel gefuellt = eine eigene Zeit, sonst die Zeit der Schicht. */
.hbzeit { flex: none; min-height: 44px; display: inline-flex; align-items: center; text-decoration: none; }
.hbzeit:hover { text-decoration: none; }
.hbzeit span {
  padding: .375rem .75rem; border-radius: var(--radius-pille); background: var(--fill); color: var(--text-soft);
  font-size: 1rem; font-variant-numeric: tabular-nums; white-space: nowrap;
}
.hbzeit.eigen span { background: var(--accent); color: var(--accent-ink); font-weight: 600; }
/* Wartet auf dich: gestrichelt, wie im Rest der Planung "wartet". */
.hbperson.wartet { background: repeating-linear-gradient(135deg, transparent 0 8px, var(--fill) 8px 16px); }
.hbperson.wartet .hbav, .hbfrei .hbav { background: transparent; color: var(--muted); border: 1.5px dashed var(--border-strong); }
.hbfrei .hbav { color: var(--accent); font-size: 1.125rem; font-weight: 500; }
.hbja { flex: none; margin: 0; }
.hbja button {
  min-height: 44px; padding: 0 1rem; border: 0; border-radius: var(--radius-pille);
  background: var(--accent); color: var(--accent-ink); font: inherit; font-weight: 600; font-size: .875rem; cursor: pointer;
}
.hbkrank .hbav { background: var(--crit-soft); color: var(--crit); }
.hbkrank s { text-decoration-thickness: 1.5px; color: var(--text-soft); }
.hbkrank.offen .hbname small { color: var(--crit); font-weight: 600; }
.hbersatz {
  flex: none; min-height: 44px; display: inline-flex; align-items: center; padding: 0 .875rem; border-radius: var(--radius-pille);
  box-shadow: inset 0 0 0 1.5px var(--accent); color: var(--accent); font-weight: 600; font-size: .875rem; text-decoration: none;
}
.hbtag > .hbleer { margin: .5rem .25rem 1rem; }

/* Die feste Freigabe-Leiste ueber der Unterleiste der Planung. Ihr Abstand
   nach unten ist die Hoehe der Unterleiste - mit "N fehlen" unter "Plan" ist
   sie hoeher. Gemessen am 15.10.2026 bei 390 px: 62,7 und 73,7 px, davon
   4 px Innenabstand unten - der steckt im max() unten. Abgerundet, damit
   kein Spalt bleibt: die Unterleiste liegt darueber (z-index 40). */
.hbleiste {
  --hbul: 58px;
  position: fixed; left: 0; right: 0; z-index: 39;
  bottom: calc(var(--hbul) + max(.25rem, calc(env(safe-area-inset-bottom, 0px) - 16px)));
  display: flex; align-items: center; gap: .5rem; padding: .5rem 16px;
  background: var(--bg); box-shadow: 0 -8px 16px -14px rgba(0, 0, 0, .3);
}
body:has(.planleiste .ulwort) .hbleiste { --hbul: 69px; }
body:has(.hbleiste) { padding-bottom: calc(83px + 64px + env(safe-area-inset-bottom, 0px)); }
.hbhaupt { flex: 1 1 auto; min-width: 0; margin: 0; }
.hbhaupt button {
  width: 100%; min-height: 48px; padding: 0 1rem; border: 0; border-radius: var(--radius-pille);
  background: var(--accent); color: var(--accent-ink); font: inherit; font-weight: 600; font-size: 1rem; cursor: pointer;
}
.hbstand {
  min-height: 48px; display: flex; align-items: center; justify-content: center; gap: .375rem; padding: 0 1rem;
  border-radius: var(--radius-pille); background: var(--ok-soft); color: var(--ok); font-weight: 600; font-size: 1rem;
}
.hbmehrknopf {
  flex: none; width: 48px; height: 48px; border-radius: 50%; display: grid; place-items: center;
  background: var(--wahl-soft); color: var(--accent); text-decoration: none; font-size: .75rem; letter-spacing: .08em;
}
.hbmehrknopf:hover { text-decoration: none; }

/* Die Blaetter: zu, bis eine Sprungmarke sie trifft (:target). */
.hbblatt { display: none; }
.hbblatt:target { display: block; position: fixed; inset: 0; z-index: 70; }
body:has(.hbblatt:target) { overflow: hidden; }
.hbschleier { position: absolute; inset: 0; background: var(--schleier-blatt); }
.hbfach {
  position: absolute; left: 0; right: 0; bottom: 0;
  max-height: calc(100% - var(--safetop) - 1.5rem); overflow-y: auto; overscroll-behavior: contain;
  padding: 0 .5rem max(.5rem, env(safe-area-inset-bottom, 0px)); animation: hbhoch .2s ease-out;
}
@keyframes hbhoch { from { transform: translateY(24px); opacity: 0; } }
@media (prefers-reduced-motion: reduce) { .hbfach { animation: none; } }
/* Aktionsblatt wie bei iOS. */
.hbgruppe { background: var(--surface); border-radius: 14px; overflow: hidden; margin-bottom: .5rem; }
.hbtitel { margin: 0; padding: .875rem 1rem .75rem; text-align: center; font-size: .875rem; line-height: 1.4; color: var(--muted); }
.hbtitel b { display: block; color: var(--text); font-size: 1rem; font-weight: 600; }
.hbgruppe > :not(:first-child) { border-top: 1px solid var(--hair); }
.hbgruppe > form { margin: 0; }
.hbgruppe > a, .hbgruppe > form > button {
  display: flex; align-items: center; justify-content: center; gap: .375rem; width: 100%; min-height: 56px; padding: 0 1rem;
  border: 0; background: none; font: inherit; font-size: 1.125rem; font-weight: 500; color: var(--accent);
  text-decoration: none; cursor: pointer;
}
.hbgruppe > a:hover { text-decoration: none; }
.hbgruppe .rot { color: var(--crit); }
.hbgruppe small { color: var(--muted); font-size: .875rem; font-weight: 500; font-variant-numeric: tabular-nums; }
.hbab {
  display: flex; align-items: center; justify-content: center; min-height: 56px; border-radius: 14px;
  background: var(--surface); color: var(--accent); font-weight: 700; font-size: 1.125rem; text-decoration: none;
}
.hbab:hover { text-decoration: none; }
/* Blatt mit Inhalt: Griff, Kopf, Felder. */
.hbformblatt .hbfach { padding: 0; }
.hbkarte {
  background: var(--surface); border-radius: 20px 20px 0 0; padding: .5rem 16px max(1.25rem, env(safe-area-inset-bottom, 0px));
  box-shadow: 0 -10px 30px rgba(0, 0, 0, .18);
}
.hbgriff { display: block; width: 40px; height: 5px; border-radius: 3px; background: var(--border-strong); margin: 0 auto .875rem; }
.hbblattkopf { display: flex; align-items: center; gap: .75rem; margin-bottom: 1rem; }
.hbblattkopf .hbav { width: 40px; height: 40px; }
.hbblattkopf p { flex: 1 1 auto; min-width: 0; margin: 0; }
.hbblattkopf b { display: block; font-size: 1.125rem; font-weight: 600; line-height: 1.25; color: var(--text); }
.hbblattkopf p span { font-size: .875rem; color: var(--muted); }
.hbzu {
  flex: none; width: 44px; height: 44px; margin: -6px -10px -6px 0; display: grid; place-items: center;
  border-radius: 50%; color: var(--muted); text-decoration: none;
}
.hbzu:hover { text-decoration: none; }
/* Zeit ändern: zwei grosse Felder (Entwurf A, Bild 12). */
.hbzeitform { margin: 0; }
.hbzeitfelder { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: .625rem; }
.hbzeitfelder label { display: grid; gap: .375rem; font-size: .75rem; font-weight: 700; letter-spacing: .06em; text-transform: uppercase; color: var(--muted); }
.hbzeitfelder input {
  width: 100%; min-width: 0; min-height: 64px; padding: 0 .5rem; border-radius: 14px; border: 1.5px solid var(--accent);
  background: var(--surface); text-align: center; font: inherit; font-size: 1.75rem; font-weight: 600; color: var(--accent);
  font-variant-numeric: tabular-nums;
}
.hbschnell { margin: .75rem 0 0; }
.hbschnell button {
  min-height: 44px; padding: 0 1rem; border: 0; border-radius: var(--radius-pille); background: var(--fill);
  color: var(--accent); font: inherit; font-weight: 600; font-size: .875rem; cursor: pointer;
}
.hbzwei { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: .625rem; margin-top: 1rem; }
.hbknopf {
  min-height: 52px; display: flex; align-items: center; justify-content: center; border: 0; border-radius: 14px;
  font: inherit; font-weight: 600; font-size: 1rem; text-decoration: none; cursor: pointer;
}
.hbknopf:hover { text-decoration: none; }
.hbknopf.voll { background: var(--accent); color: var(--accent-ink); }
.hbknopf.leise { background: var(--wahl-soft); color: var(--accent); }
.hbkrankform { display: grid; gap: .75rem; margin: 0; }
.hbfeld { display: grid; gap: .375rem; font-size: .875rem; font-weight: 600; color: var(--muted); }
.hbfeld input { width: 100%; min-width: 0; min-height: 48px; }
.hbhinweis { margin: 0 0 .75rem; font-size: .875rem; color: var(--text-soft); }
.hbkrankform .hbhinweis { margin: 0; }
.hbleer { margin: 0; color: var(--muted); font-size: 1rem; }
.hboder { margin: .875rem 0 .5rem; font-size: .75rem; font-weight: 700; letter-spacing: .06em; text-transform: uppercase; color: var(--muted); }
/* Was in die Blaetter kommt, ist das Markup vom Rechner - hier nur
   untereinander und in voller Breite. */
.hbformblatt .suggests { display: grid; gap: .5rem; }
.hbformblatt button.suggest { width: 100%; text-align: left; }
.hbformblatt .slotaddform { display: grid; gap: .625rem; }
.hbformblatt .slotaddform select { width: 100%; min-height: 48px; }
/* Die Auswahl "Person wählen" im Blatt: Rand in --feldrand wie jedes andere
   Eingabefeld (15.10.2026). Mit der Haarlinie (--hair-strong) kam sie auf
   1,38:1 hell und 1,65:1 dunkel - gemessen in nachweise/heute-b/. */
.hbformblatt .pickfield select, .hbformblatt .pickfield input { border-color: var(--feldrand); }
.hbformblatt .slotaddform .slotzeit input[type=time] { flex: 1 1 0; width: auto; min-width: 0; min-height: 48px; }
.hbformblatt .slotaddform .btn { min-height: 48px; }
.hbformblatt .nachrichtkarte { margin: 0; padding: 0; border: 0; background: none; box-shadow: none; }
.hbformblatt .nachrichtkarte::after { content: none; }
.hbformblatt .nachrichtkarte > .card-head { display: none; }
.hbformblatt .msgform-row select, .hbformblatt .msgform-row input[type=text] { flex: 1 1 100%; min-height: 48px; }
.hbformblatt .msgform .btn { min-height: 48px; flex: 1 1 100%; }
.hbformblatt .msglist { max-height: 35vh; overflow-y: auto; }
.hbformblatt .linkbtn { min-height: 44px; }
.hbformblatt .vlliste { font-size: .875rem; }

/* --- Heute nach Entwurf B (Mathieu, 15.10.2026: "B") ---------------------
   Dieselben Bausteine wie der Plan (Kopf in Versalien, Liste, Personenzeile,
   Tagespunkte) - dazu nur die Statuszeile und die zwei Knoepfe unten. */
.hbteil { margin: 1.125rem 0 0; }
.hbteil > .pakarte { margin-bottom: 0; }
/* Die Statuszeile (und "Morgen"): ein Punkt, ein Satz, darunter die Zahlen.
   Der Punkt sagt den Stand nur MIT Bedarf - gruen passt, rot fehlt; ohne
   Bedarf ein gestrichelter Ring, keine Farbe. Das Wort steht immer dabei. */
.hbstatus {
  display: flex; align-items: center; gap: .75rem; min-height: 56px; padding: .5rem .5rem .5rem .875rem;
  background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-sm);
  color: var(--text); text-decoration: none;
}
.hbstatus:hover { text-decoration: none; }
.hbstatus.hbtag { margin-top: .75rem; }
.hbstatus > i { flex: none; width: 10px; height: 10px; border-radius: 50%; background: var(--ok); }
.hbstatus.fehlt > i { background: var(--crit); }
.hbstatus.ohne > i { background: transparent; border: 1.5px dashed var(--feldrand); }
.hbstatustext { flex: 1 1 auto; min-width: 0; display: grid; }
.hbstatustext b { font-weight: 600; font-size: 1rem; line-height: 1.3; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.hbstatus.fehlt .hbstatustext b { color: var(--crit); }
.hbstatustext small { font-size: .875rem; color: var(--muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.hbstatus > svg { flex: none; width: 18px; height: 18px; color: var(--muted); }
/* Plan-Vorlauf (16.10.2026): "KW 46 ist noch Entwurf - Start in 9 Tagen". Dieselbe
   Zeile wie die Statuszeile, nur dass der Satz umbrechen darf - er ist laenger
   als ein Tag-Status und wuerde sonst am Handy mit "..." enden. Gestrichelt =
   noch nicht fest. Zwei Zeilen uebereinander stehen mit Luft. */
.hbvorlauf, .uvorlauf { display: grid; gap: .5rem; margin-top: .75rem; }
.uvorlauf { margin: 0 0 1rem; }
.hbstatus.vorlauf > i { background: transparent; border: 1.5px dashed var(--text-soft); }
.hbstatus.vorlauf .hbstatustext b { white-space: normal; overflow: visible; text-overflow: clip; }
.hbstatus.vorlauf .hbstatustext small { white-space: normal; }
/* Veroeffentlichen in den Einstellungen (18.10.2026): drei Arten, wie der Plan
   zum Team kommt, als Auswahlliste. Die Wahl steht im Rahmen UND im Punkt -
   nie nur in der Farbe. Jede Zeile >= 44 px. */
.veroeff { display: grid; gap: .5rem; margin: .75rem 0 1rem; border: 0; padding: 0; min-width: 0; }
.veroeff legend { padding: 0; margin-bottom: .5rem; font-weight: 650; }
.veroeff .opt {
  display: flex; align-items: flex-start; gap: .75rem; min-height: 44px; padding: .75rem 1rem;
  border: 1px solid var(--hair-strong); border-radius: var(--radius-sm); background: var(--surface); cursor: pointer;
}
.veroeff .opt:has(input:checked) { border-color: var(--accent); box-shadow: inset 0 0 0 1px var(--accent); }
.veroeff .opt input[type="radio"] { flex: none; width: 20px; height: 20px; margin: .125rem 0 0; accent-color: var(--accent); }
.veroeff .opt b { display: block; font-weight: 650; line-height: 1.3; }
.veroeff .opt small { display: block; color: var(--muted); font-size: .875rem; line-height: 1.4; margin-top: .125rem; }
.veroeff .opt select { min-height: 44px; margin: .5rem 0 0; }
/* Veroeffentlichungsstand je Woche (18.10.2026, nur Planung). Drei Formen zugleich,
   damit er ohne Farbe lesbar bleibt: Wort, Zeichen und Kante. Veroeffentlicht =
   ruhiges Gruen mit Haken und fester Flaeche; Entwurf = neutral, gestrichelte
   Kante, gestrichelter Kreis. Keine neue Farbe, Rot bleibt fuer "fehlt". */
.wstand {
  display: inline-flex; align-items: center; gap: .375rem; padding: .125rem .625rem;
  border-radius: var(--radius-pille); font-size: .875rem; font-weight: 650; line-height: 1.5;
  white-space: nowrap; flex: none;
}
.wstand i, .wsm { font-style: normal; font-weight: 700; }
.wstand small { font-size: inherit; font-weight: 600; opacity: .9; }
.wstand.pub { background: var(--ok-soft); color: var(--ok); border: 1.5px solid transparent; }
.wstand.entw { background: transparent; color: var(--text-soft); border: 1.5px dashed var(--muted); }
.wsm { margin-left: .25rem; font-size: .875rem; }
.wsm.pub { color: var(--ok); }
.wsm.entw { color: var(--text-soft); }
.seg .segitem.wsentw { outline: 1.5px dashed var(--muted); outline-offset: -4px; }
.seg .segitem.wspub .wsm { color: var(--ok); }
.seg .segitem.is-on .wsm { color: inherit; }
.segcap .wstand { margin-left: .375rem; vertical-align: middle; }
.wochenkopf .wstand { flex: none; }
.wslegende { display: flex; flex-wrap: wrap; gap: .25rem .875rem; margin: .5rem 0 0; font-size: .875rem; color: var(--muted); }
.wsatz { margin: .375rem 0 0; font-size: .875rem; font-weight: 600; color: var(--text-soft); }
.wsatz.pub { color: var(--ok); }
.autohaken { margin: .5rem 0 0; }
.autohaken label { display: inline-flex; align-items: center; gap: .625rem; min-height: 44px; font-weight: 600; cursor: pointer; }
.autohaken input[type="checkbox"] { width: 22px; height: 22px; flex: none; accent-color: var(--accent); }
.nwochen .nwliste { display: grid; margin-top: .25rem; }
.nwzeile {
  display: flex; align-items: center; gap: .75rem; min-height: 48px; padding: .5rem 0 .5rem .75rem;
  border-top: 1px solid var(--hair); border-left: 4px solid var(--ok); color: inherit; text-decoration: none; flex-wrap: wrap;
}
.nwzeile:first-child { border-top: 0; }
.nwzeile.entw { border-left: 4px dashed var(--muted); }
.nwzeile.is-on { background: var(--fill); }
.nwzeile:hover { text-decoration: none; background: var(--fill); }
/* Eine Zeile ohne Link (Woche jenseits von "Wochen im Voraus") wird beim Drueberfahren nicht hell: nichts zum Anklicken. */
.nwochen div.nwzeile { font-weight: 550; } /* wie die Links (a { font-weight: 550 }), sonst sieht die Zeile ohne Link schmaler aus */
.nwochen div.nwzeile:hover { background: transparent; }
.nwochen div.nwzeile.is-on:hover { background: var(--fill); }
.nwzeile .nwwer { flex: 1 1 7rem; min-width: 0; display: grid; }
.nwzeile .nwwer b { font-weight: 650; }
.nwzeile .nwwer small { color: var(--muted); font-size: .875rem; }
.nwzeile .nwzahl { color: var(--muted); font-size: .875rem; margin-left: auto; }
/* "läuft" in der Personenzeile: gruen mit Punkt, wie die Team-App. */
.hbname small.laeuft { color: var(--ok); font-weight: 600; }
.hbname small.laeuft::before {
  content: ''; display: inline-block; width: 7px; height: 7px; border-radius: 50%; background: currentColor;
  margin-right: .375rem; vertical-align: 1px;
}
/* Gemeldet und News: zwei Knoepfe, die sich die Breite TEILEN. Vorher eine
   Reihe mit overflow-x - 607 px Inhalt in 390 px, "Gemeldet 2" lag ganz
   ausserhalb (Befund 4). Spalten mit minmax(0, 1fr) koennen nicht breiter
   werden als der Platz; ein zu langes Wort wird gekuerzt, nicht geschoben. */
.paunten {
  display: grid; grid-auto-flow: column; grid-auto-columns: minmax(0, 1fr); gap: .5rem; margin: 1.375rem 0 0;
}
.paunten .paknopf { min-width: 0; border-radius: var(--radius-pille); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.paunten .pabz { height: 20px; min-width: 20px; }


/* --- Grosse Schrift, Tippziele (Pruefung 18.10.2026, F13) -------------------
   Wer am Handy "Schrift groesser" eingestellt hat (150 oder 200 %), bekam auf
   /w/notfall, /w/mein-plan und /admin/zeiten/lohn eine Seite, die breiter war
   als das Fenster - die Notrufkacheln ragten 110 bis 275 px heraus, ausgerechnet
   auf der Seite, die im Ernstfall jemand mit zitternden Haenden liest.
   Ursachen, alle dieselbe: ein Gitter mit 1fr (Mindestbreite = Inhalt), ein
   Flex-Kind mit nowrap oder flex: none, ein Fieldset (Mindestbreite = Inhalt).
   Die Regeln hier aendern bei normaler Schrift nichts - sie greifen erst, wenn
   etwas sonst herausragen wuerde. Keine neue Farbe. */
.nfnotruf { grid-template-columns: repeat(auto-fit, minmax(min(100%, 9.5rem), 1fr)); }
@media (min-width: 40rem) { .nfnotruf { grid-template-columns: repeat(4, minmax(0, 1fr)); } }
.nfnr { min-width: 0; overflow-wrap: anywhere; }
.nfkontakt { flex-wrap: wrap; }
.nfkname { flex: 1 1 8rem; overflow-wrap: anywhere; }
.nfschoscho { flex-wrap: wrap; }
.vfart, .vfartwahl, .vfartwahl > span { min-width: 0; }
.vfartwahl b, .vfartwahl em, .nfschritte li, .nfdanach, .nfregel p, .nfstufen p, .nfsofort, .nftitel, .nfbwas, .nfbhinweis { overflow-wrap: anywhere; }
.pwkopf { flex-wrap: wrap; row-gap: .25rem; }
.pwkopf i { flex: 1 1 1.5rem; }
.wmarke { white-space: normal; overflow-wrap: anywhere; }
.wstand { white-space: normal; flex: 0 1 auto; min-width: 0; max-width: 100%; }
code, .mono { overflow-wrap: anywhere; }
main p, main li, main dd, main h1, main h2, main h3, legend, .hint, .banner > div { overflow-wrap: anywhere; }
fieldset { min-width: 0; }
.pwkopf b, .pwkopf span { white-space: normal; }
.nfruf { max-width: 100%; flex-wrap: wrap; overflow-wrap: anywhere; }
.brzeile .chips { flex: 0 1 auto; min-width: 0; }
.moduswahl { flex-wrap: wrap; max-width: 100%; }
.ukgross, .hubtabs a { overflow-wrap: anywhere; }
.hubtabs a { max-width: 100%; }
.pubbox { flex: 0 1 auto; min-width: 0; max-width: 100%; }
.emprow .who, .emprow .meta { overflow-wrap: anywhere; min-width: 0; }

/* Tippziele (44 px): die Notruf-Knoepfe und die Sprungmarken auf der Notfall-
   Seite waren 38 und 32 px hoch. Kleine Links (Impressum, Plus, Pfeile) bleiben
   so klein, wie sie aussehen - ihre Tippflaeche waechst unsichtbar (::after),
   wie es .skname und .wspanne schon tun. */
.nfruf { min-height: 44px; }
.nfwahlgrid a { min-height: 44px; }
.footer a { position: relative; }
.footer a::after { content: ''; position: absolute; left: -8px; right: -8px; top: -10px; bottom: -10px; }
.wtplus { position: relative; }
.wtplus::after { content: ''; position: absolute; left: -9px; right: -9px; top: -9px; bottom: -9px; }
/* Die Planung am iPad quer (1000 px und mehr, Finger statt Maus): was dort 37 bis
   41 px hoch war, bekommt 44. Mit der Maus bleibt alles, wie es ist. */
/* Vergangene Tage (Streifen, Liste): mit .45 Deckkraft hatte der Text 1,9 bis 2,5:1.
   Jetzt .78 und die Tinte statt der leisen Tinte - dunkler Text, nur etwas blasser;
   gemessen >= 4,5:1 (hell wie dunkel). "Vergangen" sagt weiter die blassere Flaeche. */
/* Ohne die Zahl im Kreis (25.10.2026): sie hat ihre eigene Schrift auf ihrer Flaeche - die Tinte darauf kam auf 1,4:1 (hell) / 1,3:1 (dunkel). */
.wsztag.vorbei:not(.ist-an), .wsztag.vorbei:not(.ist-an) *:not(.wszzahl), .planzeile.vorbei * { color: var(--text); }
/* "seit 18.10." im Veroeffentlicht-Stand: die .9 Deckkraft drueckte es auf 4,16:1. */
.wstand small { opacity: 1; }
@media (pointer: coarse) and (min-width: 1000px) {
  .bereichkopf, .huellenzeile, .wtgname { min-height: 44px; }
  .mw { display: inline-flex; align-items: center; min-height: 44px; }
  .navform button, .asform button { min-height: 44px; }
  .aslink { min-height: 44px; }
  .btn.small { min-height: 44px; }
  .wtchip { min-height: 44px; }
  .wkpfeil, .crewform button:not(.crewwort) { position: relative; }
  .wkpfeil::after, .crewform button:not(.crewwort)::after { content: ''; position: absolute; left: -6px; right: -6px; top: -6px; bottom: -6px; }
}

/* Nachtmodus AC - ganz am Ende, damit diese Regeln bei gleicher Spezifitaet
   gewinnen. Erzeugt aus DUNKEL_AC oben. */
@media (prefers-color-scheme: dark) {
:root:not([data-theme="light"]) .card,
:root:not([data-theme="light"]) .stkarte,
:root:not([data-theme="light"]) .wblock,
:root:not([data-theme="light"]) .naechsteluecke,
:root:not([data-theme="light"]) .zeitleiste { border-color: transparent; box-shadow: none; }
:root:not([data-theme="light"]) .ton-woche,
:root:not([data-theme="light"]) .wblock.ton-woche,
:root:not([data-theme="light"]) .sdkarte,
:root:not([data-theme="light"]) .heutekopf,
:root:not([data-theme="light"]) .heutekopf.laeuft,
:root:not([data-theme="light"]) .heutekopf.pausiert { box-shadow: none; border-color: transparent; }
:root:not([data-theme="light"]) .stkarte.laeuft,
:root:not([data-theme="light"]) .stkarte.pausiert { box-shadow: none; border-color: transparent; background: var(--surface); }
:root:not([data-theme="light"]) .deckblock { background-image: none; }
:root:not([data-theme="light"]) .szliste .schichtkarte,
:root:not([data-theme="light"]) .szliste .schichtkarte.offen,
:root:not([data-theme="light"]) .szliste .schichtkarte.offen.stufe-kritisch { box-shadow: none; }
:root:not([data-theme="light"]) .szliste .schichtkarte.gesperrt,
:root:not([data-theme="light"]) .szliste .sperrgruppe { background: var(--surface); box-shadow: none; border: 0; }
:root:not([data-theme="light"]) .szliste .skleute .skfehlt,
:root:not([data-theme="light"]) .zlbkopf .skfehlt { background: none; padding: 0; }
:root:not([data-theme="light"]) .szliste .schichtkarte > .skspur { display: none; }
:root:not([data-theme="light"]) .bkopf .blinie { opacity: 0; }
:root:not([data-theme="light"]) .btn.gruen { background: var(--nacht-gruen-ton); color: var(--nacht-gruen-tinte); border-color: transparent; }
:root:not([data-theme="light"]) .btn.gruen:hover { background: var(--nacht-gruen-ton-hover); }
:root:not([data-theme="light"]) .btn.gruen.sknehmen,
:root:not([data-theme="light"]) form[action="/w/einteilen/nehmen"] .btn.gruen,
:root:not([data-theme="light"]) .hkzwei .btn.gruen,
:root:not([data-theme="light"]) .stknoepfe .btn.gruen,
:root:not([data-theme="light"]) .bigbtn.gruen,
:root:not([data-theme="light"]) .btn.gruen.beginnja { background: var(--frisch); color: var(--gruen-ink); border-color: transparent; box-shadow: var(--nacht-glanz); }
:root:not([data-theme="light"]) .btn.gruen.sknehmen .skstd { color: var(--gruen-ink); }
:root:not([data-theme="light"]) .szliste .schichtkarte.meine { background: linear-gradient(var(--surface), var(--surface)) padding-box, var(--frisch) border-box; border: 1.5px solid transparent; box-shadow: var(--nacht-glanz-leise); outline: 0; }
:root:not([data-theme="light"]) .skdeine { background: var(--frisch); -webkit-background-clip: text; background-clip: text; color: transparent; }
:root:not([data-theme="light"]) .szliste .schichtkarte.meine.wartet { background: var(--surface); border: 0; box-shadow: none; outline: 1.5px dashed var(--nacht-gestrichelt); outline-offset: -1.5px; }
:root:not([data-theme="light"]) .skdeine.wartet { background: none; color: var(--text-soft); }
:root:not([data-theme="light"]) .wmarke.wartet,
:root:not([data-theme="light"]) .heutekopf.pausiert .stzahl,
:root:not([data-theme="light"]) .stkarte.pausiert .stzahl,
:root:not([data-theme="light"]) .tag.warn { color: var(--text-soft); }
:root:not([data-theme="light"]) .zkstand.wartet,
:root:not([data-theme="light"]) .timeline .row.dokwartet { box-shadow: inset 3px 0 0 var(--text-soft); }
:root:not([data-theme="light"]) .wtweg.beantragt { border-color: var(--text-soft); }
:root:not([data-theme="light"]) .warnbox { color: var(--text); }
:root:not([data-theme="light"]) .aw2.ist-an { background: var(--nacht-wahl); color: var(--text); box-shadow: none; }
:root:not([data-theme="light"]) .topbar { background: var(--nacht-kopf); border-bottom: 0; box-shadow: 0 .5px 0 var(--nacht-kante); }
:root:not([data-theme="light"]) body::before { background: var(--nacht-kopf); }
:root:not([data-theme="light"]) .unterleiste { background: var(--nacht-leiste); border: 0; border-radius: 0; box-shadow: 0 -.5px 0 var(--nacht-kante); }
:root:not([data-theme="light"]) .unterleiste::before { content: none; }
:root:not([data-theme="light"]) .ulziel { text-transform: none; letter-spacing: 0; }
:root:not([data-theme="light"]) .ulziel.aktiv { background: var(--nacht-aktiv); color: var(--text); border-radius: 16px; }
:root:not([data-theme="light"]) .ulziel.aktiv::before { display: none; }
:root:not([data-theme="light"]) .ulziel.aktiv .ulwort { color: var(--text); }
:root:not([data-theme="light"]) .ulpunkt { background: var(--nacht-punkt); color: var(--nacht-punkt-ink); }
:root:not([data-theme="light"]) .empmenu.emp a[aria-current="page"] { background: var(--nacht-menue-aktiv); color: var(--text); }
:root:not([data-theme="light"]) .empmenu.emp a[aria-current="page"] .empmenu-icon,
:root:not([data-theme="light"]) .empmenu.emp .empmenu-icon { background: var(--nacht-menue-icon); color: var(--text); }
:root:not([data-theme="light"]) .empmenu.emp a[aria-current="page"] .empmenu-icon .ic,
:root:not([data-theme="light"]) .empmenu.emp .empmenu-icon .ic { --ak: var(--muted); }
:root:not([data-theme="light"]) .empmenu.emp .empmenu-icon:has(.ic-warnung),
:root:not([data-theme="light"]) .empmenu.emp a[aria-current="page"] .empmenu-icon:has(.ic-warnung) { background: var(--crit-soft); color: var(--crit); }
:root:not([data-theme="light"]) .empmenu.emp .empmenu-icon .ic-warnung { --ak: var(--crit); }
:root:not([data-theme="light"]) .pakarte { border-color: transparent; }
:root:not([data-theme="light"]) .pabz { background: var(--nacht-punkt); color: var(--nacht-punkt-ink); }
:root:not([data-theme="light"]) .hbliste,
:root:not([data-theme="light"]) .hbbedarf,
:root:not([data-theme="light"]) .hbstatus,
:root:not([data-theme="light"]) main.planseite > .planklappe { border-color: transparent; }
:root:not([data-theme="light"]) .hbperson:has(.laeuft) .hbav { background: var(--ok-soft); color: var(--ok); }
:root:not([data-theme="light"]) body:not([hidden]) .entwurfhinweis { background: none; }
:root:not([data-theme="light"]) .wtchip.b-bar,
:root:not([data-theme="light"]) .wtchip.b-kueche,
:root:not([data-theme="light"]) .wtchip.b-office { background: var(--surface-2); }
:root:not([data-theme="light"]) .wtchip.krank { background: var(--crit-soft); }
:root:not([data-theme="light"]) .wtchip.krank.ersetzt { background: var(--surface-2); }
:root:not([data-theme="light"]) td.wtzelle.heute { background: var(--nacht-heute); }
:root:not([data-theme="light"]) .hbperson.wartet .hbav,
:root:not([data-theme="light"]) .hbfrei .hbav { background: transparent; color: var(--muted); border-color: var(--plus); }
:root:not([data-theme="light"]) .hbfrei .hbav { color: var(--text); }
:root:not([data-theme="light"]) .hbkrank .hbav { background: var(--crit-soft); color: var(--crit); }
:root:not([data-theme="light"]) .hbzeit span { background: var(--surface-2); color: var(--text-soft); }
:root:not([data-theme="light"]) .hbperson.wartet { background: repeating-linear-gradient(135deg, transparent 0 8px, var(--nacht-streifen) 8px 16px); }
:root:not([data-theme="light"]) .hbzeit.eigen span { background: var(--accent); color: var(--accent-ink); }
:root:not([data-theme="light"]) .hbleiste { background: var(--nacht-kopf); box-shadow: 0 -.5px 0 var(--nacht-kante); }
:root:not([data-theme="light"]) .hbkarte { box-shadow: none; }
:root:not([data-theme="light"]) .hbschleier { background: var(--nacht-schleier); }
:root:not([data-theme="light"]) .tkdatum { font-family: var(--f-text); font-weight: 600; font-size: 1.5rem; letter-spacing: -.025em; }
:root:not([data-theme="light"]) .sdname { font-family: var(--f-text); font-weight: 600; letter-spacing: -.02em; }
:root:not([data-theme="light"]) .stzahl,
:root:not([data-theme="light"]) .hkuhr.stzahl { font-family: var(--f-text); font-weight: 600; letter-spacing: -.04em; }
:root:not([data-theme="light"]) .hkuhr.stzahl { font-size: 3.25rem; }
:root:not([data-theme="light"]) .wsumme { font-family: var(--f-text); font-weight: 600; font-size: 1.3125rem; letter-spacing: -.02em; }
:root:not([data-theme="light"]) .twtag,
:root:not([data-theme="light"]) .tonkicker,
:root:not([data-theme="light"]) .wkicker,
:root:not([data-theme="light"]) .bname,
:root:not([data-theme="light"]) .phtitel,
:root:not([data-theme="light"]) .hkdatum,
:root:not([data-theme="light"]) .skfehlt,
:root:not([data-theme="light"]) .skdeine,
:root:not([data-theme="light"]) .skpille,
:root:not([data-theme="light"]) .ulziel,
:root:not([data-theme="light"]) .wsztag,
:root:not([data-theme="light"]) .wspanne,
:root:not([data-theme="light"]) .bessen,
:root:not([data-theme="light"]) .lzname { font-weight: 600; }
:root:not([data-theme="light"]) .aw2,
:root:not([data-theme="light"]) .wszwinkel,
:root:not([data-theme="light"]) .phtext,
:root:not([data-theme="light"]) .naechsteluecke,
:root:not([data-theme="light"]) .lzfenster,
:root:not([data-theme="light"]) .ulwort,
:root:not([data-theme="light"]) .bzahl { font-weight: 500; }
:root:not([data-theme="light"]) .twtag,
:root:not([data-theme="light"]) .tonkicker,
:root:not([data-theme="light"]) .wkicker,
:root:not([data-theme="light"]) .hkdatum,
:root:not([data-theme="light"]) .lzname,
:root:not([data-theme="light"]) .skdeine { letter-spacing: .04em; }
:root:not([data-theme="light"]) body:not([hidden]) .btn.secondary:not(.newskarte .btn),
:root:not([data-theme="light"]) body:not([hidden]) .hbplus,
:root:not([data-theme="light"]) body:not([hidden]) .bigbtn.secondary { background: transparent; border: 1.5px solid currentColor; }
:root:not([data-theme="light"]) body:not([hidden]) .hbav { background: var(--wahl-soft); color: var(--accent); }
:root:not([data-theme="light"]) body:not([hidden]) .hbstatus.fehlt { background: var(--surface); border-color: transparent; box-shadow: inset 4px 0 0 var(--crit); }
:root:not([data-theme="light"]) body:not([hidden]) .hbstatus.passt { background: var(--surface); border-color: transparent; box-shadow: inset 4px 0 0 var(--ok); }
:root:not([data-theme="light"]) body:not([hidden]) .hbstatus.fehlt .hbstatustext small,
:root:not([data-theme="light"]) body:not([hidden]) .hbstatus.passt .hbstatustext small { color: var(--text-soft); }
:root:not([data-theme="light"]) body:not([hidden]) .hbbedarf.fehlt { background: var(--surface); border-color: transparent; box-shadow: inset 4px 0 0 var(--crit); }
:root:not([data-theme="light"]) body:not([hidden]) .card.news.vkoffen,
:root:not([data-theme="light"]) body:not([hidden]) .card.ubkarte { box-shadow: inset 4px 0 0 var(--g-tun-ink); }
:root:not([data-theme="light"]) body:not([hidden]) .card.news.tortenheute,
:root:not([data-theme="light"]) body:not([hidden]) a.card.tortenkarte { box-shadow: inset 4px 0 0 var(--g-tun-ink); }
}
:root[data-theme="dark"] .card,
:root[data-theme="dark"] .stkarte,
:root[data-theme="dark"] .wblock,
:root[data-theme="dark"] .naechsteluecke,
:root[data-theme="dark"] .zeitleiste { border-color: transparent; box-shadow: none; }
:root[data-theme="dark"] .ton-woche,
:root[data-theme="dark"] .wblock.ton-woche,
:root[data-theme="dark"] .sdkarte,
:root[data-theme="dark"] .heutekopf,
:root[data-theme="dark"] .heutekopf.laeuft,
:root[data-theme="dark"] .heutekopf.pausiert { box-shadow: none; border-color: transparent; }
:root[data-theme="dark"] .stkarte.laeuft,
:root[data-theme="dark"] .stkarte.pausiert { box-shadow: none; border-color: transparent; background: var(--surface); }
:root[data-theme="dark"] .deckblock { background-image: none; }
:root[data-theme="dark"] .szliste .schichtkarte,
:root[data-theme="dark"] .szliste .schichtkarte.offen,
:root[data-theme="dark"] .szliste .schichtkarte.offen.stufe-kritisch { box-shadow: none; }
:root[data-theme="dark"] .szliste .schichtkarte.gesperrt,
:root[data-theme="dark"] .szliste .sperrgruppe { background: var(--surface); box-shadow: none; border: 0; }
:root[data-theme="dark"] .szliste .skleute .skfehlt,
:root[data-theme="dark"] .zlbkopf .skfehlt { background: none; padding: 0; }
:root[data-theme="dark"] .szliste .schichtkarte > .skspur { display: none; }
:root[data-theme="dark"] .bkopf .blinie { opacity: 0; }
:root[data-theme="dark"] .btn.gruen { background: var(--nacht-gruen-ton); color: var(--nacht-gruen-tinte); border-color: transparent; }
:root[data-theme="dark"] .btn.gruen:hover { background: var(--nacht-gruen-ton-hover); }
:root[data-theme="dark"] .btn.gruen.sknehmen,
:root[data-theme="dark"] form[action="/w/einteilen/nehmen"] .btn.gruen,
:root[data-theme="dark"] .hkzwei .btn.gruen,
:root[data-theme="dark"] .stknoepfe .btn.gruen,
:root[data-theme="dark"] .bigbtn.gruen,
:root[data-theme="dark"] .btn.gruen.beginnja { background: var(--frisch); color: var(--gruen-ink); border-color: transparent; box-shadow: var(--nacht-glanz); }
:root[data-theme="dark"] .btn.gruen.sknehmen .skstd { color: var(--gruen-ink); }
:root[data-theme="dark"] .szliste .schichtkarte.meine { background: linear-gradient(var(--surface), var(--surface)) padding-box, var(--frisch) border-box; border: 1.5px solid transparent; box-shadow: var(--nacht-glanz-leise); outline: 0; }
:root[data-theme="dark"] .skdeine { background: var(--frisch); -webkit-background-clip: text; background-clip: text; color: transparent; }
:root[data-theme="dark"] .szliste .schichtkarte.meine.wartet { background: var(--surface); border: 0; box-shadow: none; outline: 1.5px dashed var(--nacht-gestrichelt); outline-offset: -1.5px; }
:root[data-theme="dark"] .skdeine.wartet { background: none; color: var(--text-soft); }
:root[data-theme="dark"] .wmarke.wartet,
:root[data-theme="dark"] .heutekopf.pausiert .stzahl,
:root[data-theme="dark"] .stkarte.pausiert .stzahl,
:root[data-theme="dark"] .tag.warn { color: var(--text-soft); }
:root[data-theme="dark"] .zkstand.wartet,
:root[data-theme="dark"] .timeline .row.dokwartet { box-shadow: inset 3px 0 0 var(--text-soft); }
:root[data-theme="dark"] .wtweg.beantragt { border-color: var(--text-soft); }
:root[data-theme="dark"] .warnbox { color: var(--text); }
:root[data-theme="dark"] .aw2.ist-an { background: var(--nacht-wahl); color: var(--text); box-shadow: none; }
:root[data-theme="dark"] .topbar { background: var(--nacht-kopf); border-bottom: 0; box-shadow: 0 .5px 0 var(--nacht-kante); }
:root[data-theme="dark"] body::before { background: var(--nacht-kopf); }
:root[data-theme="dark"] .unterleiste { background: var(--nacht-leiste); border: 0; border-radius: 0; box-shadow: 0 -.5px 0 var(--nacht-kante); }
:root[data-theme="dark"] .unterleiste::before { content: none; }
:root[data-theme="dark"] .ulziel { text-transform: none; letter-spacing: 0; }
:root[data-theme="dark"] .ulziel.aktiv { background: var(--nacht-aktiv); color: var(--text); border-radius: 16px; }
:root[data-theme="dark"] .ulziel.aktiv::before { display: none; }
:root[data-theme="dark"] .ulziel.aktiv .ulwort { color: var(--text); }
:root[data-theme="dark"] .ulpunkt { background: var(--nacht-punkt); color: var(--nacht-punkt-ink); }
:root[data-theme="dark"] .empmenu.emp a[aria-current="page"] { background: var(--nacht-menue-aktiv); color: var(--text); }
:root[data-theme="dark"] .empmenu.emp a[aria-current="page"] .empmenu-icon,
:root[data-theme="dark"] .empmenu.emp .empmenu-icon { background: var(--nacht-menue-icon); color: var(--text); }
:root[data-theme="dark"] .empmenu.emp a[aria-current="page"] .empmenu-icon .ic,
:root[data-theme="dark"] .empmenu.emp .empmenu-icon .ic { --ak: var(--muted); }
:root[data-theme="dark"] .empmenu.emp .empmenu-icon:has(.ic-warnung),
:root[data-theme="dark"] .empmenu.emp a[aria-current="page"] .empmenu-icon:has(.ic-warnung) { background: var(--crit-soft); color: var(--crit); }
:root[data-theme="dark"] .empmenu.emp .empmenu-icon .ic-warnung { --ak: var(--crit); }
:root[data-theme="dark"] .pakarte { border-color: transparent; }
:root[data-theme="dark"] .pabz { background: var(--nacht-punkt); color: var(--nacht-punkt-ink); }
:root[data-theme="dark"] .hbliste,
:root[data-theme="dark"] .hbbedarf,
:root[data-theme="dark"] .hbstatus,
:root[data-theme="dark"] main.planseite > .planklappe { border-color: transparent; }
:root[data-theme="dark"] .hbperson:has(.laeuft) .hbav { background: var(--ok-soft); color: var(--ok); }
:root[data-theme="dark"] body:not([hidden]) .entwurfhinweis { background: none; }
:root[data-theme="dark"] .wtchip.b-bar,
:root[data-theme="dark"] .wtchip.b-kueche,
:root[data-theme="dark"] .wtchip.b-office { background: var(--surface-2); }
:root[data-theme="dark"] .wtchip.krank { background: var(--crit-soft); }
:root[data-theme="dark"] .wtchip.krank.ersetzt { background: var(--surface-2); }
:root[data-theme="dark"] td.wtzelle.heute { background: var(--nacht-heute); }
:root[data-theme="dark"] .hbperson.wartet .hbav,
:root[data-theme="dark"] .hbfrei .hbav { background: transparent; color: var(--muted); border-color: var(--plus); }
:root[data-theme="dark"] .hbfrei .hbav { color: var(--text); }
:root[data-theme="dark"] .hbkrank .hbav { background: var(--crit-soft); color: var(--crit); }
:root[data-theme="dark"] .hbzeit span { background: var(--surface-2); color: var(--text-soft); }
:root[data-theme="dark"] .hbperson.wartet { background: repeating-linear-gradient(135deg, transparent 0 8px, var(--nacht-streifen) 8px 16px); }
:root[data-theme="dark"] .hbzeit.eigen span { background: var(--accent); color: var(--accent-ink); }
:root[data-theme="dark"] .hbleiste { background: var(--nacht-kopf); box-shadow: 0 -.5px 0 var(--nacht-kante); }
:root[data-theme="dark"] .hbkarte { box-shadow: none; }
:root[data-theme="dark"] .hbschleier { background: var(--nacht-schleier); }
:root[data-theme="dark"] .tkdatum { font-family: var(--f-text); font-weight: 600; font-size: 1.5rem; letter-spacing: -.025em; }
:root[data-theme="dark"] .sdname { font-family: var(--f-text); font-weight: 600; letter-spacing: -.02em; }
:root[data-theme="dark"] .stzahl,
:root[data-theme="dark"] .hkuhr.stzahl { font-family: var(--f-text); font-weight: 600; letter-spacing: -.04em; }
:root[data-theme="dark"] .hkuhr.stzahl { font-size: 3.25rem; }
:root[data-theme="dark"] .wsumme { font-family: var(--f-text); font-weight: 600; font-size: 1.3125rem; letter-spacing: -.02em; }
:root[data-theme="dark"] .twtag,
:root[data-theme="dark"] .tonkicker,
:root[data-theme="dark"] .wkicker,
:root[data-theme="dark"] .bname,
:root[data-theme="dark"] .phtitel,
:root[data-theme="dark"] .hkdatum,
:root[data-theme="dark"] .skfehlt,
:root[data-theme="dark"] .skdeine,
:root[data-theme="dark"] .skpille,
:root[data-theme="dark"] .ulziel,
:root[data-theme="dark"] .wsztag,
:root[data-theme="dark"] .wspanne,
:root[data-theme="dark"] .bessen,
:root[data-theme="dark"] .lzname { font-weight: 600; }
:root[data-theme="dark"] .aw2,
:root[data-theme="dark"] .wszwinkel,
:root[data-theme="dark"] .phtext,
:root[data-theme="dark"] .naechsteluecke,
:root[data-theme="dark"] .lzfenster,
:root[data-theme="dark"] .ulwort,
:root[data-theme="dark"] .bzahl { font-weight: 500; }
:root[data-theme="dark"] .twtag,
:root[data-theme="dark"] .tonkicker,
:root[data-theme="dark"] .wkicker,
:root[data-theme="dark"] .hkdatum,
:root[data-theme="dark"] .lzname,
:root[data-theme="dark"] .skdeine { letter-spacing: .04em; }
:root[data-theme="dark"] body:not([hidden]) .btn.secondary:not(.newskarte .btn),
:root[data-theme="dark"] body:not([hidden]) .hbplus,
:root[data-theme="dark"] body:not([hidden]) .bigbtn.secondary { background: transparent; border: 1.5px solid currentColor; }
:root[data-theme="dark"] body:not([hidden]) .hbav { background: var(--wahl-soft); color: var(--accent); }
:root[data-theme="dark"] body:not([hidden]) .hbstatus.fehlt { background: var(--surface); border-color: transparent; box-shadow: inset 4px 0 0 var(--crit); }
:root[data-theme="dark"] body:not([hidden]) .hbstatus.passt { background: var(--surface); border-color: transparent; box-shadow: inset 4px 0 0 var(--ok); }
:root[data-theme="dark"] body:not([hidden]) .hbstatus.fehlt .hbstatustext small,
:root[data-theme="dark"] body:not([hidden]) .hbstatus.passt .hbstatustext small { color: var(--text-soft); }
:root[data-theme="dark"] body:not([hidden]) .hbbedarf.fehlt { background: var(--surface); border-color: transparent; box-shadow: inset 4px 0 0 var(--crit); }
:root[data-theme="dark"] body:not([hidden]) .card.news.vkoffen,
:root[data-theme="dark"] body:not([hidden]) .card.ubkarte { box-shadow: inset 4px 0 0 var(--g-tun-ink); }
:root[data-theme="dark"] body:not([hidden]) .card.news.tortenheute,
:root[data-theme="dark"] body:not([hidden]) a.card.tortenkarte { box-shadow: inset 4px 0 0 var(--g-tun-ink); }

/* Die Planung im Dunkeln (25.10.2026) - gleich hinter dem Nachtmodus der Team-App, den sie Name fuer Name ueberschreibt (stil-dunkel.js).
   Die Werte haengen an body.ps1 mit staerkerem Praefix, die Reihenfolge entscheidet hier nichts. Dahinter das Papier (Druck immer hell). */

/* --- Die Planung im Dunkeln (Marine-Leitstand, 25.10.2026) - erzeugt aus TOKENS/KALENDER/REGELN in stil-dunkel.js. */
@media (prefers-color-scheme: dark) {
:root:not([data-theme="light"]) body.ps1 { --bg: #0E141D; --surface: #172030; --surface-2: #212C3E; --surface-3: #2B3A52; --border: #263146; --border-strong: #364560; --feldrand: #7385A0; --hair: rgba(174, 190, 216, .13); --hair-strong: rgba(174, 190, 216, .2); --fill: rgba(150, 170, 205, .1); --text: #EAEFF7; --text-soft: #D5DCE8; --muted: #AEB9CD; --text-aus: #8592A8; --plus: #8D9AB0; --accent: #A9B6CC; --accent-hover: #BCC8DD; --accent-soft: #26334A; --accent-ink: #0F1724; --event-ton: rgba(169, 182, 204, .12); --event-ton-stark: rgba(169, 182, 204, .19); --wahl: #A9B6CC; --wahl-soft: #26334A; --wahl-ink: #0F1724; --news: #FF8FA6; --news-soft: #40242E; --news-band: #C8325A; --deep: #212C3E; --deep-hover: #2B3A52; --deep-ink: #EAEFF7; --gruen: #6FD8AE; --gruen-hover: #8EEBC8; --gruen-ink: #06231C; --gold: #AEB9CD; --gold-soft: #212C3E; --bar: #AEB9CD; --kueche: #AEB9CD; --office: #AEB9CD; --bar-soft: rgba(150, 170, 205, .07); --kueche-soft: rgba(150, 170, 205, .07); --office-soft: rgba(150, 170, 205, .07); --ok: #7BE3B9; --ok-soft: #0F3A32; --ok-ink: #06231C; --warn: #FF7F70; --warn-soft: #451E20; --crit: #FF7F70; --crit-ink: #2A0B08; --crit-soft: #451E20; --schatten-1: none; --schatten-2: none; --schatten-3: 0 4px 8px -2px rgba(0, 0, 0, .55), 0 8px 16px -4px rgba(0, 0, 0, .45); --schatten-4: 0 8px 16px -4px rgba(0, 0, 0, .65), 0 4px 4px -3px rgba(0, 0, 0, .55); --shadow: var(--schatten-2); --shadow-lift: var(--schatten-3); --schatten-leiste: 0 -8px 22px rgba(0, 0, 0, .5); --marine-ink: #EAEFF7; --radius: 16px; --radius-sm: 12px; --p-tag: #0C211D; --p-tag-ink: #7BE3B9; --p-woche: #121A26; --p-woche-ink: #AEB9CD; --p-hub: #121A26; --p-hub-ink: #AEB9CD; --p-event: #121A26; --p-event-ink: #AEB9CD; --frisch: linear-gradient(135deg, #5FCFA2, #7BE3B9); --gr-ton: #123528; --gr-tinte: #8EEBC8; --gr-rand: #6FD8AE; --gr-haken: #06231C; --pop: #2A3850; --pop-linie: #7287A8; --schatten-pop: 0 12px 32px rgba(0, 0, 0, .55); --schatten-menue: 0 14px 34px rgba(0, 0, 0, .6); --schleier: rgba(4, 7, 12, .62); --schleier-blatt: rgba(4, 7, 12, .62); --leiste: #0A0F17; --leiste-ink: #E8EDF6; --leiste-hover: rgba(232, 237, 246, .07); --leiste-aktiv: rgba(232, 237, 246, .13); --leiste-ink-leise: #AAB5C9; --balken: #6F7F9A; --strich-aus: #364560; --chip-flaeche: #212C3E; --feier-gruen: #6FD8AE; --fehler-ring: rgba(255, 127, 112, .28); --deep-ink-leise: rgba(234, 239, 247, .72); --abz-bar: #9C86E0; --abz-kueche: #3FB396; --abz-event: #DB72BC; --news-band-ink: #FFFFFF; --nacht-kopf: #0E141D; --nacht-kante: rgba(174, 190, 216, .13); --nacht-leiste: #0A0F17; --nacht-aktiv: #26334A; --nacht-punkt: #364560; --nacht-punkt-ink: #EAEFF7; --nacht-menue-aktiv: #26334A; --nacht-menue-icon: rgba(150, 170, 205, .1); --nacht-heute: #1B2639; --nacht-streifen: rgba(174, 190, 216, .06); --nacht-schleier: rgba(4, 7, 12, .62); --nacht-wahl: #2B3A52; --nacht-gruen-ton: #0F3A32; --nacht-gruen-ton-hover: #144738; --nacht-gruen-tinte: #8EEBC8; --nacht-glanz: 0 8px 22px -10px rgba(123, 227, 185, .45); --nacht-glanz-leise: 0 10px 32px -14px rgba(123, 227, 185, .3); --nacht-gestrichelt: rgba(234, 239, 247, .45); color-scheme: dark; }
:root:not([data-theme="light"]) body.ps1 .plankalender { --kal-marine: #EAEFF7; --kal-signal: #A9B6CC; --kal-papier: #172030; --kal-tile: rgba(150, 170, 205, .07); --kal-we: rgba(150, 170, 205, .2); --kal-linie: rgba(174, 190, 216, .16); --kal-still: rgba(234, 239, 247, .45); --kal-lesbar: rgba(234, 239, 247, .72); --kal-blass: rgba(234, 239, 247, .28); --kal-leise: #9AA6BB; --kal-band: rgba(169, 182, 204, .1); }
:root:not([data-theme="light"]) body.ps1 .stufe-knapp > .wszzahl { background: var(--crit); color: var(--crit-ink); }
:root:not([data-theme="light"]) body.ps1 .kalluecke { background: var(--crit); color: var(--crit-ink); }
:root:not([data-theme="light"]) body.ps1 .tag.warn { color: var(--text-soft); }
:root:not([data-theme="light"]) body.ps1 .tag.warn .crewav-mini { background: var(--gold); color: var(--deep); }
:root:not([data-theme="light"]) body.ps1 .bmeldung.zuviel { border-left-color: var(--text-soft); }
:root:not([data-theme="light"]) body.ps1 .bmeldung.zuviel .bmzahl { color: var(--text-soft); }
:root:not([data-theme="light"]) body.ps1 .stz-viel { background: var(--gold-soft); color: var(--text-soft); }
:root:not([data-theme="light"]) body.ps1 .warnbox { background: var(--gold-soft); color: var(--text); box-shadow: inset 3px 0 0 var(--text-soft); }
:root:not([data-theme="light"]) body.ps1 .banner.warn { background: var(--gold-soft); box-shadow: inset 3px 0 0 var(--text-soft); }
:root:not([data-theme="light"]) body.ps1 .banner.warn > span { color: var(--text); }
:root:not([data-theme="light"]) body.ps1 .statuspill.is-offen { background: var(--gold-soft); color: var(--text-soft); border-color: var(--text-soft); box-shadow: none; }
:root:not([data-theme="light"]) body.ps1 .statuspill.is-offen .ic2 { background: var(--text-soft); color: var(--surface); }
:root:not([data-theme="light"]) body.ps1 .statusdot.pause { background: var(--gold-soft); color: var(--text-soft); }
:root:not([data-theme="light"]) body.ps1 .zkstand.wartet,
:root:not([data-theme="light"]) body.ps1 .timeline .row.dokwartet { box-shadow: inset 3px 0 0 var(--text-soft); }
:root:not([data-theme="light"]) body.ps1 .wmarke.wartet,
:root:not([data-theme="light"]) body.ps1 .woffen,
:root:not([data-theme="light"]) body.ps1 .wpweg,
:root:not([data-theme="light"]) body.ps1 .bereichzahl strong,
:root:not([data-theme="light"]) body.ps1 .invrow .who .unit { color: var(--text-soft); }
:root:not([data-theme="light"]) body.ps1 .invrow .who .unit { background: var(--gold-soft); }
:root:not([data-theme="light"]) body.ps1 .dayhead .weekendtag { background: var(--gold-soft); color: var(--text-soft); }
:root:not([data-theme="light"]) body.ps1 .wtweg.beantragt { border-color: var(--text-soft); }
:root:not([data-theme="light"]) body.ps1 .hubtabs a[aria-current="page"] { background: var(--accent-soft); color: var(--accent); }
:root:not([data-theme="light"]) body.ps1 .crew .crewav { background: transparent; color: var(--ok); box-shadow: inset 0 0 0 1.5px var(--ok); }
:root:not([data-theme="light"]) body.ps1 .crew.crew-krank .crewav { background: transparent; color: var(--crit); box-shadow: inset 0 0 0 1.5px var(--crit); }
:root:not([data-theme="light"]) body.ps1 .crew.crew-pending .crewav { background: transparent; color: var(--muted); box-shadow: inset 0 0 0 1.5px var(--muted); }
}
:root[data-theme="dark"] body.ps1 { --bg: #0E141D; --surface: #172030; --surface-2: #212C3E; --surface-3: #2B3A52; --border: #263146; --border-strong: #364560; --feldrand: #7385A0; --hair: rgba(174, 190, 216, .13); --hair-strong: rgba(174, 190, 216, .2); --fill: rgba(150, 170, 205, .1); --text: #EAEFF7; --text-soft: #D5DCE8; --muted: #AEB9CD; --text-aus: #8592A8; --plus: #8D9AB0; --accent: #A9B6CC; --accent-hover: #BCC8DD; --accent-soft: #26334A; --accent-ink: #0F1724; --event-ton: rgba(169, 182, 204, .12); --event-ton-stark: rgba(169, 182, 204, .19); --wahl: #A9B6CC; --wahl-soft: #26334A; --wahl-ink: #0F1724; --news: #FF8FA6; --news-soft: #40242E; --news-band: #C8325A; --deep: #212C3E; --deep-hover: #2B3A52; --deep-ink: #EAEFF7; --gruen: #6FD8AE; --gruen-hover: #8EEBC8; --gruen-ink: #06231C; --gold: #AEB9CD; --gold-soft: #212C3E; --bar: #AEB9CD; --kueche: #AEB9CD; --office: #AEB9CD; --bar-soft: rgba(150, 170, 205, .07); --kueche-soft: rgba(150, 170, 205, .07); --office-soft: rgba(150, 170, 205, .07); --ok: #7BE3B9; --ok-soft: #0F3A32; --ok-ink: #06231C; --warn: #FF7F70; --warn-soft: #451E20; --crit: #FF7F70; --crit-ink: #2A0B08; --crit-soft: #451E20; --schatten-1: none; --schatten-2: none; --schatten-3: 0 4px 8px -2px rgba(0, 0, 0, .55), 0 8px 16px -4px rgba(0, 0, 0, .45); --schatten-4: 0 8px 16px -4px rgba(0, 0, 0, .65), 0 4px 4px -3px rgba(0, 0, 0, .55); --shadow: var(--schatten-2); --shadow-lift: var(--schatten-3); --schatten-leiste: 0 -8px 22px rgba(0, 0, 0, .5); --marine-ink: #EAEFF7; --radius: 16px; --radius-sm: 12px; --p-tag: #0C211D; --p-tag-ink: #7BE3B9; --p-woche: #121A26; --p-woche-ink: #AEB9CD; --p-hub: #121A26; --p-hub-ink: #AEB9CD; --p-event: #121A26; --p-event-ink: #AEB9CD; --frisch: linear-gradient(135deg, #5FCFA2, #7BE3B9); --gr-ton: #123528; --gr-tinte: #8EEBC8; --gr-rand: #6FD8AE; --gr-haken: #06231C; --pop: #2A3850; --pop-linie: #7287A8; --schatten-pop: 0 12px 32px rgba(0, 0, 0, .55); --schatten-menue: 0 14px 34px rgba(0, 0, 0, .6); --schleier: rgba(4, 7, 12, .62); --schleier-blatt: rgba(4, 7, 12, .62); --leiste: #0A0F17; --leiste-ink: #E8EDF6; --leiste-hover: rgba(232, 237, 246, .07); --leiste-aktiv: rgba(232, 237, 246, .13); --leiste-ink-leise: #AAB5C9; --balken: #6F7F9A; --strich-aus: #364560; --chip-flaeche: #212C3E; --feier-gruen: #6FD8AE; --fehler-ring: rgba(255, 127, 112, .28); --deep-ink-leise: rgba(234, 239, 247, .72); --abz-bar: #9C86E0; --abz-kueche: #3FB396; --abz-event: #DB72BC; --news-band-ink: #FFFFFF; --nacht-kopf: #0E141D; --nacht-kante: rgba(174, 190, 216, .13); --nacht-leiste: #0A0F17; --nacht-aktiv: #26334A; --nacht-punkt: #364560; --nacht-punkt-ink: #EAEFF7; --nacht-menue-aktiv: #26334A; --nacht-menue-icon: rgba(150, 170, 205, .1); --nacht-heute: #1B2639; --nacht-streifen: rgba(174, 190, 216, .06); --nacht-schleier: rgba(4, 7, 12, .62); --nacht-wahl: #2B3A52; --nacht-gruen-ton: #0F3A32; --nacht-gruen-ton-hover: #144738; --nacht-gruen-tinte: #8EEBC8; --nacht-glanz: 0 8px 22px -10px rgba(123, 227, 185, .45); --nacht-glanz-leise: 0 10px 32px -14px rgba(123, 227, 185, .3); --nacht-gestrichelt: rgba(234, 239, 247, .45); color-scheme: dark; }
:root[data-theme="dark"] body.ps1 .plankalender { --kal-marine: #EAEFF7; --kal-signal: #A9B6CC; --kal-papier: #172030; --kal-tile: rgba(150, 170, 205, .07); --kal-we: rgba(150, 170, 205, .2); --kal-linie: rgba(174, 190, 216, .16); --kal-still: rgba(234, 239, 247, .45); --kal-lesbar: rgba(234, 239, 247, .72); --kal-blass: rgba(234, 239, 247, .28); --kal-leise: #9AA6BB; --kal-band: rgba(169, 182, 204, .1); }
:root[data-theme="dark"] body.ps1 .stufe-knapp > .wszzahl { background: var(--crit); color: var(--crit-ink); }
:root[data-theme="dark"] body.ps1 .kalluecke { background: var(--crit); color: var(--crit-ink); }
:root[data-theme="dark"] body.ps1 .tag.warn { color: var(--text-soft); }
:root[data-theme="dark"] body.ps1 .tag.warn .crewav-mini { background: var(--gold); color: var(--deep); }
:root[data-theme="dark"] body.ps1 .bmeldung.zuviel { border-left-color: var(--text-soft); }
:root[data-theme="dark"] body.ps1 .bmeldung.zuviel .bmzahl { color: var(--text-soft); }
:root[data-theme="dark"] body.ps1 .stz-viel { background: var(--gold-soft); color: var(--text-soft); }
:root[data-theme="dark"] body.ps1 .warnbox { background: var(--gold-soft); color: var(--text); box-shadow: inset 3px 0 0 var(--text-soft); }
:root[data-theme="dark"] body.ps1 .banner.warn { background: var(--gold-soft); box-shadow: inset 3px 0 0 var(--text-soft); }
:root[data-theme="dark"] body.ps1 .banner.warn > span { color: var(--text); }
:root[data-theme="dark"] body.ps1 .statuspill.is-offen { background: var(--gold-soft); color: var(--text-soft); border-color: var(--text-soft); box-shadow: none; }
:root[data-theme="dark"] body.ps1 .statuspill.is-offen .ic2 { background: var(--text-soft); color: var(--surface); }
:root[data-theme="dark"] body.ps1 .statusdot.pause { background: var(--gold-soft); color: var(--text-soft); }
:root[data-theme="dark"] body.ps1 .zkstand.wartet,
:root[data-theme="dark"] body.ps1 .timeline .row.dokwartet { box-shadow: inset 3px 0 0 var(--text-soft); }
:root[data-theme="dark"] body.ps1 .wmarke.wartet,
:root[data-theme="dark"] body.ps1 .woffen,
:root[data-theme="dark"] body.ps1 .wpweg,
:root[data-theme="dark"] body.ps1 .bereichzahl strong,
:root[data-theme="dark"] body.ps1 .invrow .who .unit { color: var(--text-soft); }
:root[data-theme="dark"] body.ps1 .invrow .who .unit { background: var(--gold-soft); }
:root[data-theme="dark"] body.ps1 .dayhead .weekendtag { background: var(--gold-soft); color: var(--text-soft); }
:root[data-theme="dark"] body.ps1 .wtweg.beantragt { border-color: var(--text-soft); }
:root[data-theme="dark"] body.ps1 .hubtabs a[aria-current="page"] { background: var(--accent-soft); color: var(--accent); }
:root[data-theme="dark"] body.ps1 .crew .crewav { background: transparent; color: var(--ok); box-shadow: inset 0 0 0 1.5px var(--ok); }
:root[data-theme="dark"] body.ps1 .crew.crew-krank .crewav { background: transparent; color: var(--crit); box-shadow: inset 0 0 0 1.5px var(--crit); }
:root[data-theme="dark"] body.ps1 .crew.crew-pending .crewav { background: transparent; color: var(--muted); box-shadow: inset 0 0 0 1.5px var(--muted); }

body.ps1 .darstwahl { margin: 0 0 .5rem; padding: 0; border: 0; min-width: 0; }
body.ps1 .darstwahl legend { padding: 0; margin: 0 0 .5rem; font-size: .875rem; font-weight: 650; color: var(--text); }
body.ps1 .darstseg { display: flex; gap: 2px; padding: 3px; border-radius: var(--radius-sm); background: var(--fill); max-width: 30rem; }
body.ps1 .darstopt {
  position: relative; flex: 1 1 0; min-width: 0; min-height: 52px; display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: .0625rem; padding: .375rem .5rem; border-radius: calc(var(--radius-sm) - 2px); cursor: pointer; color: var(--text-soft); text-align: center;
}
body.ps1 .darstopt input { position: absolute; inset: 0; width: 100%; height: 100%; margin: 0; opacity: 0; cursor: pointer; }
body.ps1 .darstwort { font-size: 1rem; font-weight: 650; color: var(--text); }
body.ps1 .darstopt small { font-size: .75rem; color: var(--muted); }
body.ps1 .darstopt:hover { background: var(--accent-soft); }
body.ps1 .darstopt:has(input:checked) { background: var(--surface); box-shadow: inset 0 0 0 1.5px var(--accent), var(--schatten-1); }
body.ps1 .darstopt:has(input:checked) .darstwort::before { content: '✓ '; }
body.ps1 .darstopt:has(input:focus-visible) { outline: 3px solid var(--accent); outline-offset: 2px; }
body.ps1 .darstsatz { margin: .25rem 0 .75rem; max-width: 44rem; }

html body.ps1 .lksuche input[type="search"], html body.ps1 .pickfield select, html body.ps1 .pickfield input, html body.ps1 .timepair input,
html body.ps1 .blockrow .timepair input, html body.ps1 input[type=file] { border-color: var(--feldrand); }
/* Suchfelder (type=search) hatten gar keine eigene Gestalt: der Browser malte sie weiss (hell) bzw. grau #3B3B3B (dunkel) - im Marine ein
   fremdes Stueck. Jetzt wie jedes Feld. Ohne :root: die Suche oben (stil-leitstand.js) behaelt ihre Pillenform. */
body.ps1 input[type=search] {
  background: var(--surface); color: var(--text); border: 1px solid var(--feldrand); border-radius: var(--radius-xs);
  min-height: 44px; padding: .5rem .75rem; font: inherit; font-size: 1rem; -webkit-appearance: none; appearance: none;
}


/* --- Papier (25.10.2026): gedruckt wird die Planung immer hell, auch wenn sie am Bildschirm dunkel steht. Werte aus dem Hellen gelesen. */
@media print {
  html:root:root body.ps1 { --bg: #F5EEE1; --surface: #FDF8EF; --surface-2: #EFE4D2; --surface-3: #E4D6BE; --border: #E3D6C0; --border-strong: #C8B698; --feldrand: #8A8F94; --hair: rgba(44, 58, 71, .11); --hair-strong: rgba(44, 58, 71, .18); --fill: rgba(44, 58, 71, .055); --text: #2C3A47; --text-soft: #2C3A47; --muted: #525B64; --text-aus: #666D74; --plus: #6B7279; --accent: #283045; --accent-hover: #1A2031; --accent-soft: #DDE0E8; --accent-ink: #FDF8EF; --event-ton: rgba(40, 48, 69, .11); --event-ton-stark: rgba(40, 48, 69, .17); --wahl: #283045; --wahl-soft: #DDE0E8; --wahl-ink: #FDF8EF; --news: #A61E45; --news-soft: #F7D9DE; --news-band: #A61E45; --deep: #2C3A47; --deep-hover: #223038; --deep-ink: #FBF5EA; --gruen: #42714A; --gruen-hover: #35603D; --gruen-ink: #FFF8EE; --gold: #B8BEC6; --gold-soft: #ECE9E3; --bar: #525B64; --kueche: #525B64; --office: #525B64; --bar-soft: rgba(44, 58, 71, .07); --kueche-soft: rgba(44, 58, 71, .07); --office-soft: rgba(44, 58, 71, .07); --ok: #2F5E34; --ok-soft: #C3D9B8; --ok-ink: #FBF5EA; --warn: #A82B2B; --warn-soft: #F6D0CA; --crit: #A82B2B; --crit-ink: #FDF8EF; --crit-soft: #F6D0CA; --schatten-1: 0 1px 2px -1px rgba(44,58,71,.10), 0 2px 4px -2px rgba(44,58,71,.08); --schatten-2: 0 2px 4px -1px rgba(44,58,71,.11), 0 4px 8px -2px rgba(44,58,71,.08); --schatten-3: 0 4px 8px -2px rgba(44,58,71,.12), 0 8px 16px -4px rgba(44,58,71,.09); --schatten-4: 0 8px 16px -4px rgba(44,58,71,.14), 0 4px 4px -3px rgba(44,58,71,.10); --shadow: var(--schatten-2); --shadow-lift: var(--schatten-3); --schatten-leiste: 0 -8px 22px rgba(16, 24, 32, .1); --marine-ink: #2C3A47; --radius: 16px; --radius-sm: 12px; --p-tag: #E3EEDA; --p-tag-ink: #2F5E34; --p-woche: #F1EDE6; --p-woche-ink: #525B64; --p-hub: #F1EDE6; --p-hub-ink: #525B64; --p-event: #F1EDE6; --p-event-ink: #525B64; --frisch: linear-gradient(135deg, #38754A, #2A7F62); --gr-ton: #DDE8D8; --gr-tinte: #35502F; --gr-rand: #42714A; --gr-haken: #FFFFFF; --pop: #FDF8EF; --pop-linie: #C8B698; --schatten-pop: 0 10px 30px rgba(40, 48, 69, .22); --schatten-menue: 0 8px 24px rgba(40, 48, 69, .2); --schleier: rgba(40, 48, 69, .38); --schleier-blatt: rgba(20, 24, 35, .42); --leiste: #283045; --leiste-ink: #FDF8EF; --leiste-hover: rgba(253, 248, 239, .12); --leiste-aktiv: rgba(253, 248, 239, .2); --leiste-ink-leise: rgba(253, 248, 239, .78); --balken: die neutralen Balken der
     Diagramme (Verlauf auf Heute) - vorher --border-strong mit 1,87:1 gegen die Karte, fuer eine Diagrammmarke gilt 3:1; --strich-aus: #C4B69E; --chip-flaeche: #FFFFFF; --feier-gruen: #42714A; --fehler-ring: rgba(163, 49, 42, .18); --deep-ink-leise: rgba(251, 245, 234, .72); --abz-bar: #866AD2; --abz-kueche: #238B72; --abz-event: #C954A6; --news-band-ink: #FFFFFF; --nacht-kopf: var(--surface); --nacht-kante: var(--hair); --nacht-leiste: var(--surface); --nacht-aktiv: var(--accent-soft); --nacht-punkt: var(--accent); --nacht-punkt-ink: var(--accent-ink); --nacht-menue-aktiv: var(--accent-soft); --nacht-menue-icon: var(--fill); --nacht-heute: var(--fill); --nacht-streifen: transparent; --nacht-schleier: var(--schleier-blatt); --nacht-wahl: var(--surface-3); --nacht-gruen-ton: var(--ok-soft); --nacht-gruen-ton-hover: var(--ok-soft); --nacht-gruen-tinte: var(--ok); --nacht-glanz: none; --nacht-glanz-leise: none; --nacht-gestrichelt: var(--feldrand); color-scheme: light; }
  html:root:root body.ps1 .plankalender { --kal-marine: #2C3A47; --kal-signal: #283045; --kal-papier: #F3EEE3; --kal-band: rgba(40, 48, 69, .10); --kal-tile: rgba(31, 58, 102, .07); --kal-we: rgba(31, 58, 102, .19); --kal-linie: rgba(31, 58, 102, .22); --kal-still: rgba(31, 58, 102, .38); --kal-lesbar: #4A5562; --kal-blass: rgba(31, 58, 102, .28); --kal-leise: #545E66; --kal-event: var(--event-ton); --kal-event-hover: var(--event-ton-stark); }
}
@media print {
:root[data-theme="dark"] body:not([data-app="team"]) .stufe-knapp > .wszzahl { background: var(--crit); color: var(--crit-ink); }
:root[data-theme="dark"] body:not([data-app="team"]) .kalluecke { background: var(--crit); color: var(--crit-ink); }
:root[data-theme="dark"] body:not([data-app="team"]) .tag.warn { color: var(--text-soft); }
:root[data-theme="dark"] body:not([data-app="team"]) .tag.warn .crewav-mini { background: var(--gold); color: var(--deep); }
:root[data-theme="dark"] body:not([data-app="team"]) .bmeldung.zuviel { border-left-color: var(--text-soft); }
:root[data-theme="dark"] body:not([data-app="team"]) .bmeldung.zuviel .bmzahl { color: var(--text-soft); }
:root[data-theme="dark"] body:not([data-app="team"]) .stz-viel { background: var(--gold-soft); color: var(--text-soft); }
:root[data-theme="dark"] body:not([data-app="team"]) .warnbox { background: var(--gold-soft); color: var(--text); box-shadow: inset 3px 0 0 var(--text-soft); }
:root[data-theme="dark"] body:not([data-app="team"]) .banner.warn { background: var(--gold-soft); box-shadow: inset 3px 0 0 var(--text-soft); }
:root[data-theme="dark"] body:not([data-app="team"]) .banner.warn > span { color: var(--text); }
:root[data-theme="dark"] body:not([data-app="team"]) .statuspill.is-offen { background: var(--gold-soft); color: var(--text-soft); border-color: var(--text-soft); box-shadow: none; }
:root[data-theme="dark"] body:not([data-app="team"]) .statuspill.is-offen .ic2 { background: var(--text-soft); color: var(--surface); }
:root[data-theme="dark"] body:not([data-app="team"]) .statusdot.pause { background: var(--gold-soft); color: var(--text-soft); }
:root[data-theme="dark"] body:not([data-app="team"]) .zkstand.wartet,
:root[data-theme="dark"] body:not([data-app="team"]) .timeline .row.dokwartet { box-shadow: inset 3px 0 0 var(--text-soft); }
:root[data-theme="dark"] body:not([data-app="team"]) .wmarke.wartet,
:root[data-theme="dark"] body:not([data-app="team"]) .woffen,
:root[data-theme="dark"] body:not([data-app="team"]) .wpweg,
:root[data-theme="dark"] body:not([data-app="team"]) .bereichzahl strong,
:root[data-theme="dark"] body:not([data-app="team"]) .invrow .who .unit { color: var(--text-soft); }
:root[data-theme="dark"] body:not([data-app="team"]) .invrow .who .unit { background: var(--gold-soft); }
:root[data-theme="dark"] body:not([data-app="team"]) .dayhead .weekendtag { background: var(--gold-soft); color: var(--text-soft); }
:root[data-theme="dark"] body:not([data-app="team"]) .wtweg.beantragt { border-color: var(--text-soft); }
:root[data-theme="dark"] body:not([data-app="team"]) .hubtabs a[aria-current="page"] { background: var(--accent-soft); color: var(--accent); }
:root[data-theme="dark"] body:not([data-app="team"]) .wtchip.b-bar,
:root[data-theme="dark"] body:not([data-app="team"]) .wtchip.b-kueche,
:root[data-theme="dark"] body:not([data-app="team"]) .wtchip.b-office { background: var(--chip-flaeche); }
:root[data-theme="dark"] body:not([data-app="team"]) .wtchip.krank { background: var(--crit-soft); }
:root[data-theme="dark"] body:not([data-app="team"]) .wtchip.krank.ersetzt { background: var(--surface-2); }
:root[data-theme="dark"] body:not([data-app="team"]) td.wtzelle.heute { background: color-mix(in srgb, var(--accent) 9%, transparent); }
:root[data-theme="dark"] body:not([data-app="team"]) .btn.secondary:not(.newskarte .btn),
:root[data-theme="dark"] body:not([data-app="team"]) .hbplus,
:root[data-theme="dark"] body:not([data-app="team"]) .bigbtn.secondary { background: transparent; border: 1.5px solid currentColor; }
:root[data-theme="dark"] body:not([data-app="team"]) .hbav { background: var(--wahl-soft); color: var(--accent); }
:root[data-theme="dark"] body:not([data-app="team"]) .hbstatus.fehlt { background: var(--surface); border-color: transparent; box-shadow: inset 4px 0 0 var(--crit); }
:root[data-theme="dark"] body:not([data-app="team"]) .hbstatus.passt { background: var(--surface); border-color: transparent; box-shadow: inset 4px 0 0 var(--ok); }
:root[data-theme="dark"] body:not([data-app="team"]) .hbstatus.fehlt .hbstatustext small,
:root[data-theme="dark"] body:not([data-app="team"]) .hbstatus.passt .hbstatustext small { color: var(--text-soft); }
:root[data-theme="dark"] body:not([data-app="team"]) .hbbedarf.fehlt { background: var(--surface); border-color: transparent; box-shadow: inset 4px 0 0 var(--crit); }
:root[data-theme="dark"] body:not([data-app="team"]) .hbperson:has(.laeuft) .hbav { background: var(--ok-soft); color: var(--ok); }
:root[data-theme="dark"] body:not([data-app="team"]) .hbperson.wartet .hbav,
:root[data-theme="dark"] body:not([data-app="team"]) .hbfrei .hbav { background: transparent; color: var(--muted); border-color: var(--plus); }
:root[data-theme="dark"] body:not([data-app="team"]) .hbfrei .hbav { color: var(--accent); }
:root[data-theme="dark"] body:not([data-app="team"]) .hbkrank .hbav { background: var(--crit-soft); color: var(--crit); }
}
@media print and (prefers-color-scheme: dark) {
:root:not([data-theme="light"]) body:not([data-app="team"]) .stufe-knapp > .wszzahl { background: var(--crit); color: var(--crit-ink); }
:root:not([data-theme="light"]) body:not([data-app="team"]) .kalluecke { background: var(--crit); color: var(--crit-ink); }
:root:not([data-theme="light"]) body:not([data-app="team"]) .tag.warn { color: var(--text-soft); }
:root:not([data-theme="light"]) body:not([data-app="team"]) .tag.warn .crewav-mini { background: var(--gold); color: var(--deep); }
:root:not([data-theme="light"]) body:not([data-app="team"]) .bmeldung.zuviel { border-left-color: var(--text-soft); }
:root:not([data-theme="light"]) body:not([data-app="team"]) .bmeldung.zuviel .bmzahl { color: var(--text-soft); }
:root:not([data-theme="light"]) body:not([data-app="team"]) .stz-viel { background: var(--gold-soft); color: var(--text-soft); }
:root:not([data-theme="light"]) body:not([data-app="team"]) .warnbox { background: var(--gold-soft); color: var(--text); box-shadow: inset 3px 0 0 var(--text-soft); }
:root:not([data-theme="light"]) body:not([data-app="team"]) .banner.warn { background: var(--gold-soft); box-shadow: inset 3px 0 0 var(--text-soft); }
:root:not([data-theme="light"]) body:not([data-app="team"]) .banner.warn > span { color: var(--text); }
:root:not([data-theme="light"]) body:not([data-app="team"]) .statuspill.is-offen { background: var(--gold-soft); color: var(--text-soft); border-color: var(--text-soft); box-shadow: none; }
:root:not([data-theme="light"]) body:not([data-app="team"]) .statuspill.is-offen .ic2 { background: var(--text-soft); color: var(--surface); }
:root:not([data-theme="light"]) body:not([data-app="team"]) .statusdot.pause { background: var(--gold-soft); color: var(--text-soft); }
:root:not([data-theme="light"]) body:not([data-app="team"]) .zkstand.wartet,
:root:not([data-theme="light"]) body:not([data-app="team"]) .timeline .row.dokwartet { box-shadow: inset 3px 0 0 var(--text-soft); }
:root:not([data-theme="light"]) body:not([data-app="team"]) .wmarke.wartet,
:root:not([data-theme="light"]) body:not([data-app="team"]) .woffen,
:root:not([data-theme="light"]) body:not([data-app="team"]) .wpweg,
:root:not([data-theme="light"]) body:not([data-app="team"]) .bereichzahl strong,
:root:not([data-theme="light"]) body:not([data-app="team"]) .invrow .who .unit { color: var(--text-soft); }
:root:not([data-theme="light"]) body:not([data-app="team"]) .invrow .who .unit { background: var(--gold-soft); }
:root:not([data-theme="light"]) body:not([data-app="team"]) .dayhead .weekendtag { background: var(--gold-soft); color: var(--text-soft); }
:root:not([data-theme="light"]) body:not([data-app="team"]) .wtweg.beantragt { border-color: var(--text-soft); }
:root:not([data-theme="light"]) body:not([data-app="team"]) .hubtabs a[aria-current="page"] { background: var(--accent-soft); color: var(--accent); }
:root:not([data-theme="light"]) body:not([data-app="team"]) .wtchip.b-bar,
:root:not([data-theme="light"]) body:not([data-app="team"]) .wtchip.b-kueche,
:root:not([data-theme="light"]) body:not([data-app="team"]) .wtchip.b-office { background: var(--chip-flaeche); }
:root:not([data-theme="light"]) body:not([data-app="team"]) .wtchip.krank { background: var(--crit-soft); }
:root:not([data-theme="light"]) body:not([data-app="team"]) .wtchip.krank.ersetzt { background: var(--surface-2); }
:root:not([data-theme="light"]) body:not([data-app="team"]) td.wtzelle.heute { background: color-mix(in srgb, var(--accent) 9%, transparent); }
:root:not([data-theme="light"]) body:not([data-app="team"]) .btn.secondary:not(.newskarte .btn),
:root:not([data-theme="light"]) body:not([data-app="team"]) .hbplus,
:root:not([data-theme="light"]) body:not([data-app="team"]) .bigbtn.secondary { background: transparent; border: 1.5px solid currentColor; }
:root:not([data-theme="light"]) body:not([data-app="team"]) .hbav { background: var(--wahl-soft); color: var(--accent); }
:root:not([data-theme="light"]) body:not([data-app="team"]) .hbstatus.fehlt { background: var(--surface); border-color: transparent; box-shadow: inset 4px 0 0 var(--crit); }
:root:not([data-theme="light"]) body:not([data-app="team"]) .hbstatus.passt { background: var(--surface); border-color: transparent; box-shadow: inset 4px 0 0 var(--ok); }
:root:not([data-theme="light"]) body:not([data-app="team"]) .hbstatus.fehlt .hbstatustext small,
:root:not([data-theme="light"]) body:not([data-app="team"]) .hbstatus.passt .hbstatustext small { color: var(--text-soft); }
:root:not([data-theme="light"]) body:not([data-app="team"]) .hbbedarf.fehlt { background: var(--surface); border-color: transparent; box-shadow: inset 4px 0 0 var(--crit); }
:root:not([data-theme="light"]) body:not([data-app="team"]) .hbperson:has(.laeuft) .hbav { background: var(--ok-soft); color: var(--ok); }
:root:not([data-theme="light"]) body:not([data-app="team"]) .hbperson.wartet .hbav,
:root:not([data-theme="light"]) body:not([data-app="team"]) .hbfrei .hbav { background: transparent; color: var(--muted); border-color: var(--plus); }
:root:not([data-theme="light"]) body:not([data-app="team"]) .hbfrei .hbav { color: var(--accent); }
:root:not([data-theme="light"]) body:not([data-app="team"]) .hbkrank .hbav { background: var(--crit-soft); color: var(--crit); }
}


/* Die Mitarbeiter-App im Hellen (05.10.2026) - erzeugt aus HELL_TEAM oben.
   Nur Team-Seiten (body[data-app="team"]) und nur hell: ohne Wahl bei hellem
   Telefon, oder ausdruecklich gewaehlt. */
@media not (prefers-color-scheme: dark) {
:root:not([data-theme="dark"]) body[data-app="team"] { --text-soft: #2C3A47; --wahl: #283045; --wahl-soft: #DDE0E8; --wahl-ink: #FDF8EF; --warn: #A82B2B; --warn-soft: #F6D0CA; --gold: #B8BEC6; --gold-soft: #ECE9E3; --bar: #525B64; --kueche: #525B64; --office: #525B64; --bar-soft: rgba(44, 58, 71, .07); --kueche-soft: rgba(44, 58, 71, .07); --office-soft: rgba(44, 58, 71, .07); --p-tag: #E3EEDA; --p-woche: #F1EDE6; --p-hub: #F1EDE6; --p-event: #F1EDE6; --p-tag-ink: #2F5E34; --p-woche-ink: #525B64; --p-hub-ink: #525B64; --p-event-ink: #525B64; }
:root:not([data-theme="dark"]) body[data-app="team"] .ulziel.aktiv { background: #DDE0E8; color: #283045; }
:root:not([data-theme="dark"]) body[data-app="team"] .ulziel.aktiv::before { display: none; }
:root:not([data-theme="dark"]) body[data-app="team"] .ulziel.aktiv .ulwort { color: #283045; }
:root:not([data-theme="dark"]) body[data-app="team"] .empmenu.emp a[aria-current="page"] { background: #DDE0E8; color: var(--text); }
:root:not([data-theme="dark"]) body[data-app="team"] .empmenu.emp a[aria-current="page"] .empmenu-icon,
:root:not([data-theme="dark"]) body[data-app="team"] .empmenu.emp .empmenu-icon { background: rgba(40, 48, 69, .08); color: #283045; }
:root:not([data-theme="dark"]) body[data-app="team"] .empmenu.emp a[aria-current="page"] .empmenu-icon .ic,
:root:not([data-theme="dark"]) body[data-app="team"] .empmenu.emp .empmenu-icon .ic { --ak: #B8C0CE; }
:root:not([data-theme="dark"]) body[data-app="team"] .empmenu.emp .empmenu-icon:has(.ic-warnung),
:root:not([data-theme="dark"]) body[data-app="team"] .empmenu.emp a[aria-current="page"] .empmenu-icon:has(.ic-warnung) { background: var(--crit-soft); color: var(--crit); }
:root:not([data-theme="dark"]) body[data-app="team"] .empmenu.emp .empmenu-icon .ic-warnung { --ak: var(--crit); }
:root:not([data-theme="dark"]) body[data-app="team"] .btn.gruen.sknehmen,
:root:not([data-theme="dark"]) body[data-app="team"] form[action="/w/einteilen/nehmen"] .btn.gruen,
:root:not([data-theme="dark"]) body[data-app="team"] .hkzwei .btn.gruen,
:root:not([data-theme="dark"]) body[data-app="team"] .hkbtn .btn.gruen,
:root:not([data-theme="dark"]) body[data-app="team"] .stknoepfe .btn.gruen,
:root:not([data-theme="dark"]) body[data-app="team"] .bigbtn.gruen,
:root:not([data-theme="dark"]) body[data-app="team"] .btn.gruen.beginnja { background: linear-gradient(135deg, #38754A, #2A7F62); color: #FFF8EE; border-color: transparent; }
:root:not([data-theme="dark"]) body[data-app="team"] .btn.gruen.sknehmen .skstd { color: #FFF8EE; }
:root:not([data-theme="dark"]) body[data-app="team"] .btn.gruen { background: #DDE8D8; color: #35502F; border-color: transparent; }
:root:not([data-theme="dark"]) body[data-app="team"] .btn.gruen:hover { background: #D0DFCA; }
:root:not([data-theme="dark"]) body[data-app="team"] .szliste .schichtkarte.meine { background: linear-gradient(var(--surface), var(--surface)) padding-box, linear-gradient(135deg, #38754A, #2A7F62) border-box; border: 1.5px solid transparent; box-shadow: var(--schatten-2); }
:root:not([data-theme="dark"]) body[data-app="team"] .skdeine { background: linear-gradient(135deg, #38754A, #2A7F62); -webkit-background-clip: text; background-clip: text; color: transparent; }
:root:not([data-theme="dark"]) body[data-app="team"] .szliste .schichtkarte.meine.wartet { background: var(--surface); border: 0; box-shadow: var(--schatten-2); outline: 1.5px dashed #8A8F94; outline-offset: -1.5px; }
:root:not([data-theme="dark"]) body[data-app="team"] .skdeine.wartet { background: none; color: var(--text-soft); }
:root:not([data-theme="dark"]) body[data-app="team"] .wmarke.wartet,
:root:not([data-theme="dark"]) body[data-app="team"] .heutekopf.pausiert .stzahl,
:root:not([data-theme="dark"]) body[data-app="team"] .stkarte.pausiert .stzahl,
:root:not([data-theme="dark"]) body[data-app="team"] .tag.warn { color: var(--text-soft); }
:root:not([data-theme="dark"]) body[data-app="team"] .zkstand.wartet,
:root:not([data-theme="dark"]) body[data-app="team"] .timeline .row.dokwartet { box-shadow: inset 3px 0 0 var(--text-soft); }
:root:not([data-theme="dark"]) body[data-app="team"] .wtweg.beantragt { border-color: var(--text-soft); }
:root:not([data-theme="dark"]) body[data-app="team"] .stkarte.pausiert { background: rgba(44, 58, 71, .05); }
:root:not([data-theme="dark"]) body[data-app="team"] .stpause,
:root:not([data-theme="dark"]) body[data-app="team"] .warnbox,
:root:not([data-theme="dark"]) body[data-app="team"] .critbox,
:root:not([data-theme="dark"]) body[data-app="team"] .offlinestreifen { color: var(--text); }
:root:not([data-theme="dark"]) body[data-app="team"]:not([hidden]) .btn.secondary:not(.newskarte .btn),
:root:not([data-theme="dark"]) body[data-app="team"]:not([hidden]) .hbplus,
:root:not([data-theme="dark"]) body[data-app="team"]:not([hidden]) .bigbtn.secondary { background: transparent; border: 1.5px solid currentColor; }
:root:not([data-theme="dark"]) body[data-app="team"]:not([hidden]) .hbav { background: var(--wahl-soft); color: var(--accent); }
:root:not([data-theme="dark"]) body[data-app="team"]:not([hidden]) .hbstatus.fehlt { background: var(--surface); border-color: transparent; box-shadow: inset 4px 0 0 var(--crit); }
:root:not([data-theme="dark"]) body[data-app="team"]:not([hidden]) .hbstatus.passt { background: var(--surface); border-color: transparent; box-shadow: inset 4px 0 0 var(--ok); }
:root:not([data-theme="dark"]) body[data-app="team"]:not([hidden]) .hbstatus.fehlt .hbstatustext small,
:root:not([data-theme="dark"]) body[data-app="team"]:not([hidden]) .hbstatus.passt .hbstatustext small { color: var(--text-soft); }
:root:not([data-theme="dark"]) body[data-app="team"]:not([hidden]) .hbbedarf.fehlt { background: var(--surface); border-color: transparent; box-shadow: inset 4px 0 0 var(--crit); }
:root:not([data-theme="dark"]) body[data-app="team"]:not([hidden]) .card.news.vkoffen,
:root:not([data-theme="dark"]) body[data-app="team"]:not([hidden]) .card.ubkarte { box-shadow: inset 4px 0 0 var(--g-tun-ink); }
:root:not([data-theme="dark"]) body[data-app="team"]:not([hidden]) .card.news.tortenheute,
:root:not([data-theme="dark"]) body[data-app="team"]:not([hidden]) a.card.tortenkarte { box-shadow: inset 4px 0 0 var(--g-tun-ink); }
:root:not([data-theme="dark"]) body[data-app="team"]:not([hidden]) .hbperson:has(.laeuft) .hbav { background: var(--ok-soft); color: var(--ok); }
:root:not([data-theme="dark"]) body[data-app="team"]:not([hidden]) .hbperson.wartet .hbav,
:root:not([data-theme="dark"]) body[data-app="team"]:not([hidden]) .hbfrei .hbav { background: transparent; color: var(--muted); border-color: var(--plus); }
:root:not([data-theme="dark"]) body[data-app="team"]:not([hidden]) .hbfrei .hbav { color: var(--accent); }
:root:not([data-theme="dark"]) body[data-app="team"]:not([hidden]) .hbkrank .hbav { background: var(--crit-soft); color: var(--crit); }
}
:root[data-theme="light"] body[data-app="team"] { --text-soft: #2C3A47; --wahl: #283045; --wahl-soft: #DDE0E8; --wahl-ink: #FDF8EF; --warn: #A82B2B; --warn-soft: #F6D0CA; --gold: #B8BEC6; --gold-soft: #ECE9E3; --bar: #525B64; --kueche: #525B64; --office: #525B64; --bar-soft: rgba(44, 58, 71, .07); --kueche-soft: rgba(44, 58, 71, .07); --office-soft: rgba(44, 58, 71, .07); --p-tag: #E3EEDA; --p-woche: #F1EDE6; --p-hub: #F1EDE6; --p-event: #F1EDE6; --p-tag-ink: #2F5E34; --p-woche-ink: #525B64; --p-hub-ink: #525B64; --p-event-ink: #525B64; }
:root[data-theme="light"] body[data-app="team"] .ulziel.aktiv { background: #DDE0E8; color: #283045; }
:root[data-theme="light"] body[data-app="team"] .ulziel.aktiv::before { display: none; }
:root[data-theme="light"] body[data-app="team"] .ulziel.aktiv .ulwort { color: #283045; }
:root[data-theme="light"] body[data-app="team"] .empmenu.emp a[aria-current="page"] { background: #DDE0E8; color: var(--text); }
:root[data-theme="light"] body[data-app="team"] .empmenu.emp a[aria-current="page"] .empmenu-icon,
:root[data-theme="light"] body[data-app="team"] .empmenu.emp .empmenu-icon { background: rgba(40, 48, 69, .08); color: #283045; }
:root[data-theme="light"] body[data-app="team"] .empmenu.emp a[aria-current="page"] .empmenu-icon .ic,
:root[data-theme="light"] body[data-app="team"] .empmenu.emp .empmenu-icon .ic { --ak: #B8C0CE; }
:root[data-theme="light"] body[data-app="team"] .empmenu.emp .empmenu-icon:has(.ic-warnung),
:root[data-theme="light"] body[data-app="team"] .empmenu.emp a[aria-current="page"] .empmenu-icon:has(.ic-warnung) { background: var(--crit-soft); color: var(--crit); }
:root[data-theme="light"] body[data-app="team"] .empmenu.emp .empmenu-icon .ic-warnung { --ak: var(--crit); }
:root[data-theme="light"] body[data-app="team"] .btn.gruen.sknehmen,
:root[data-theme="light"] body[data-app="team"] form[action="/w/einteilen/nehmen"] .btn.gruen,
:root[data-theme="light"] body[data-app="team"] .hkzwei .btn.gruen,
:root[data-theme="light"] body[data-app="team"] .hkbtn .btn.gruen,
:root[data-theme="light"] body[data-app="team"] .stknoepfe .btn.gruen,
:root[data-theme="light"] body[data-app="team"] .bigbtn.gruen,
:root[data-theme="light"] body[data-app="team"] .btn.gruen.beginnja { background: linear-gradient(135deg, #38754A, #2A7F62); color: #FFF8EE; border-color: transparent; }
:root[data-theme="light"] body[data-app="team"] .btn.gruen.sknehmen .skstd { color: #FFF8EE; }
:root[data-theme="light"] body[data-app="team"] .btn.gruen { background: #DDE8D8; color: #35502F; border-color: transparent; }
:root[data-theme="light"] body[data-app="team"] .btn.gruen:hover { background: #D0DFCA; }
:root[data-theme="light"] body[data-app="team"] .szliste .schichtkarte.meine { background: linear-gradient(var(--surface), var(--surface)) padding-box, linear-gradient(135deg, #38754A, #2A7F62) border-box; border: 1.5px solid transparent; box-shadow: var(--schatten-2); }
:root[data-theme="light"] body[data-app="team"] .skdeine { background: linear-gradient(135deg, #38754A, #2A7F62); -webkit-background-clip: text; background-clip: text; color: transparent; }
:root[data-theme="light"] body[data-app="team"] .szliste .schichtkarte.meine.wartet { background: var(--surface); border: 0; box-shadow: var(--schatten-2); outline: 1.5px dashed #8A8F94; outline-offset: -1.5px; }
:root[data-theme="light"] body[data-app="team"] .skdeine.wartet { background: none; color: var(--text-soft); }
:root[data-theme="light"] body[data-app="team"] .wmarke.wartet,
:root[data-theme="light"] body[data-app="team"] .heutekopf.pausiert .stzahl,
:root[data-theme="light"] body[data-app="team"] .stkarte.pausiert .stzahl,
:root[data-theme="light"] body[data-app="team"] .tag.warn { color: var(--text-soft); }
:root[data-theme="light"] body[data-app="team"] .zkstand.wartet,
:root[data-theme="light"] body[data-app="team"] .timeline .row.dokwartet { box-shadow: inset 3px 0 0 var(--text-soft); }
:root[data-theme="light"] body[data-app="team"] .wtweg.beantragt { border-color: var(--text-soft); }
:root[data-theme="light"] body[data-app="team"] .stkarte.pausiert { background: rgba(44, 58, 71, .05); }
:root[data-theme="light"] body[data-app="team"] .stpause,
:root[data-theme="light"] body[data-app="team"] .warnbox,
:root[data-theme="light"] body[data-app="team"] .critbox,
:root[data-theme="light"] body[data-app="team"] .offlinestreifen { color: var(--text); }
:root[data-theme="light"] body[data-app="team"]:not([hidden]) .btn.secondary:not(.newskarte .btn),
:root[data-theme="light"] body[data-app="team"]:not([hidden]) .hbplus,
:root[data-theme="light"] body[data-app="team"]:not([hidden]) .bigbtn.secondary { background: transparent; border: 1.5px solid currentColor; }
:root[data-theme="light"] body[data-app="team"]:not([hidden]) .hbav { background: var(--wahl-soft); color: var(--accent); }
:root[data-theme="light"] body[data-app="team"]:not([hidden]) .hbstatus.fehlt { background: var(--surface); border-color: transparent; box-shadow: inset 4px 0 0 var(--crit); }
:root[data-theme="light"] body[data-app="team"]:not([hidden]) .hbstatus.passt { background: var(--surface); border-color: transparent; box-shadow: inset 4px 0 0 var(--ok); }
:root[data-theme="light"] body[data-app="team"]:not([hidden]) .hbstatus.fehlt .hbstatustext small,
:root[data-theme="light"] body[data-app="team"]:not([hidden]) .hbstatus.passt .hbstatustext small { color: var(--text-soft); }
:root[data-theme="light"] body[data-app="team"]:not([hidden]) .hbbedarf.fehlt { background: var(--surface); border-color: transparent; box-shadow: inset 4px 0 0 var(--crit); }
:root[data-theme="light"] body[data-app="team"]:not([hidden]) .card.news.vkoffen,
:root[data-theme="light"] body[data-app="team"]:not([hidden]) .card.ubkarte { box-shadow: inset 4px 0 0 var(--g-tun-ink); }
:root[data-theme="light"] body[data-app="team"]:not([hidden]) .card.news.tortenheute,
:root[data-theme="light"] body[data-app="team"]:not([hidden]) a.card.tortenkarte { box-shadow: inset 4px 0 0 var(--g-tun-ink); }
:root[data-theme="light"] body[data-app="team"]:not([hidden]) .hbperson:has(.laeuft) .hbav { background: var(--ok-soft); color: var(--ok); }
:root[data-theme="light"] body[data-app="team"]:not([hidden]) .hbperson.wartet .hbav,
:root[data-theme="light"] body[data-app="team"]:not([hidden]) .hbfrei .hbav { background: transparent; color: var(--muted); border-color: var(--plus); }
:root[data-theme="light"] body[data-app="team"]:not([hidden]) .hbfrei .hbav { color: var(--accent); }
:root[data-theme="light"] body[data-app="team"]:not([hidden]) .hbkrank .hbav { background: var(--crit-soft); color: var(--crit); }

/* Planung Stufe 1 (24.10.2026): die Bausteine ⓘ und Gruppe. Vor den Welt-1-Regeln der Team-App (die nichts davon kennen) und hinter dem ganzen Stylesheet der
   Planung davor, damit sie gegen aeltere Regeln gleicher Spezifitaet gewinnen. Die Werte der Farben stehen als Tokens im :root-Block darin. */

body.ps1 {
  --pop: #FDF8EF;
  --pop-linie: #C8B698;
  --schatten-pop: 0 10px 30px rgba(40, 48, 69, .22);
  --schatten-menue: 0 8px 24px rgba(40, 48, 69, .2);
  --schleier: rgba(40, 48, 69, .38);
}
/* --- ⓘ ---------------------------------------------------------------------------------------------------------------------- */
/* Der Knopf ist 32 px gross (Desktop), 44 px am Handy und am Finger (Tippziel). Er steht in einer Zeile, deren Schrift kleiner ist:
   der negative Rand haelt die Zeile so hoch wie vorher - ohne ihn wuerde jede Ueberschrift mit ⓘ um 6 px waechsen. */
.ib { display: inline-block; vertical-align: middle; line-height: 1; white-space: nowrap; }
.ib-knopf {
  appearance: none; -webkit-appearance: none; border: 0; background: transparent; color: var(--accent);
  width: 32px; height: 32px; margin: -8px -4px; padding: 0; border-radius: 50%; cursor: pointer;
  display: inline-flex; align-items: center; justify-content: center; font: inherit;
}
.ib-knopf:hover, .ib-knopf[aria-expanded="true"] { background: var(--accent-soft); }
.ib-knopf:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.ib-ico { width: 20px; height: 20px; display: block; }
.ib-text { display: none; }
/* In einer Kopfzeile steht das ⓘ gleich hinter dem Titel - der Beisatz (.hint) danach, auch wenn er im Quelltext davor steht. Sonst rutscht es am Handy
   in eine eigene Zeile unter einen langen Beisatz. */
.card-head > .ib { order: 1; }
body.ps1 .card-head > .hint, body.ps1 .card-head > a.hint { order: 2; }
.card-head > .kgruppen-alle { order: 3; }
@media (max-width: 999px), (pointer: coarse) {
  .ib-knopf { width: 44px; height: 44px; margin: -12px -8px; }
}
/* In einer Zeile mit Feldname: Name und ⓘ nebeneinander, das Feld (und was sonst noch im Feld steht) darunter. */
.field.mit-info { display: flex; flex-wrap: wrap; align-items: center; column-gap: .25rem; }
.field.mit-info > * { flex: 0 0 100%; min-width: 0; }
.field.mit-info > label, .field.mit-info > .ib { flex: 0 0 auto; }
/* Das Blatt. Am Ende von <body>, fest zur Fensterkante (das Skript setzt left/top); eine Ebene ueber allem, was die Planung sonst
   schiebt (hoechste Ebene sonst 200). */
.ib-blatt {
  position: fixed; z-index: 300; box-sizing: border-box; width: min(25rem, calc(100vw - 24px)); max-height: min(70vh, 30rem);
  overflow: auto; overscroll-behavior: contain; padding: 1rem 1.125rem; background: var(--pop); color: var(--text);
  border: 1px solid var(--pop-linie); border-radius: var(--radius); box-shadow: var(--schatten-pop);
  text-align: left; white-space: normal;
}
.ib-blatt:focus { outline: none; }
.ib-blatt:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.ib-titel { font-size: 1rem; font-weight: 700; letter-spacing: -.01em; margin: 0 0 .5rem; }
.ib-inhalt { font-size: 1rem; line-height: 1.5; color: var(--text); }
.ib-absatz { display: block; margin: 0 0 .6rem; }
.ib-inhalt > :last-child { margin-bottom: 0; }
.ib-inhalt .ib-absatz:last-of-type { margin-bottom: 0; }
.ib-link { display: inline-block; margin-top: .6rem; font-weight: 600; color: var(--accent); text-decoration: underline; text-underline-offset: 2px; }
.ib-fuss { display: flex; align-items: center; justify-content: space-between; gap: .75rem; margin-top: .9rem; }
.ib-esc { font-size: .75rem; color: var(--muted); }
.ib-zu {
  min-height: 36px; padding: 0 1rem; border-radius: var(--radius-pille); border: 1.5px solid var(--accent); background: transparent;
  color: var(--accent); font: inherit; font-weight: 600; font-size: .875rem; cursor: pointer;
}
.ib-zu:hover { background: var(--accent-soft); }
.ib-zu:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.ib-schleier { position: fixed; inset: 0; z-index: 290; background: var(--schleier); }
/* Am Handy: ein Blatt von unten, ueber der Unterleiste (ohne Bewegung: nichts, was man abstellen muesste). */
.ib-blatt.ib-unten {
  left: 0; right: 0; top: auto; bottom: 0; width: auto; max-height: 75vh; border-width: 1px 0 0; border-radius: var(--radius) var(--radius) 0 0;
  padding: 1.125rem 1.25rem calc(1.125rem + env(safe-area-inset-bottom, 0px));
}
.ib-blatt.ib-unten .ib-zu { min-height: 44px; }

/* --- Gruppen ---------------------------------------------------------------------------------------------------------------- */
/* Dieselbe Bauform wie details.card.eingeklappt (Chevron rechts, 44 px hoch); dazu der Inhalt und die Abschnitte darin. */
details.kgruppe > summary .klappsum { font-size: 1rem; }
.kgruppe-inhalt > :last-child { margin-bottom: 0; }
.kgruppe-flach { border: 0; border-top: 1px solid var(--hair); border-radius: 0; margin: 0; padding: .125rem 0; background: transparent; }
.kgruppe-flach:last-child { border-bottom: 1px solid var(--hair); }
.invgruppentab { table-layout: fixed; width: 100%; }
.invgruppentab td, .invgruppentab th { overflow-wrap: anywhere; }
.kgruppe-karten .kgruppe-inhalt > .card { border: 0; background: transparent; padding: 0; margin: 0 0 1rem; }
.kgruppe-karten .kgruppe-inhalt > .card + .card { padding-top: 1rem; border-top: 1px solid var(--hair); }
.hilfezeile { display: flex; align-items: center; gap: .125rem .5rem; margin: 0 0 .75rem; }
.hilfezeile .hint { color: var(--muted); font-size: .875rem; }
.kgruppe-hilfe { display: flex; align-items: center; gap: .125rem .5rem; margin: 0 0 .75rem; }
.kgruppe-hilfe .hint { color: var(--muted); font-size: .875rem; }
.kgruppe-teil + .kgruppe-teil { margin-top: 1.25rem; padding-top: 1.25rem; border-top: 1px solid var(--hair); }
.kgruppe-teilkopf { display: flex; flex-wrap: wrap; align-items: center; gap: .125rem .5rem; margin-bottom: .75rem; }
.kgruppe-teilkopf h3 { margin: 0; font-size: 1rem; font-weight: 700; }
.kgruppe-teilkopf .hint { color: var(--muted); font-size: .875rem; }
.kgruppenleiste { display: flex; align-items: center; justify-content: space-between; gap: .75rem 1rem; flex-wrap: wrap; margin: 0 0 .75rem; }
.kgruppenleiste h1 { margin: 0; }
.kgruppen-alle { min-height: 36px; margin-left: auto; }
.card-head .kgruppen-alle { align-self: center; }
@media (max-width: 999px) { .kgruppenleiste .kgruppen-alle { min-height: 44px; } }

/* --- Team-Seite: eine Zeile je Person (Stufe 1) ------------------------------------------------------------------------------ */
/* Haken fuer den Bereich rechts in der Zeile, dann die Knoepfe "Link kopieren", "Deaktivieren", "Neuen Link erzeugen" - und ein kleines Menue
   "Mehr" nur fuer Seltenes (Link zum Markieren, Loeschen bei Doppelten). Stufe 1b, 24.10.2026: die ersten beiden waren in Stufe 1 hinter "Mehr"
   gewandert und damit einen Klick laenger. Das Menue liegt ueber der Liste und schiebt keine Zeile weg. */
.emprow .bereichschips { flex: 0 0 auto; gap: .25rem; }
.emprow .bereichschips .chip > span { min-height: 34px; padding: .125rem .65rem; font-size: .875rem; }
body.ps1 .emprow .top .tag { font-size: .75rem; }
.hinweiszeile-person { display: flex; flex-wrap: wrap; gap: .375rem; }
.hinweiszeile-person .tag { text-decoration: none; }
.hinweiszeile-person a.tag { display: inline-flex; align-items: center; min-height: 32px; }
body.ps1 .emprow .who > a { display: inline-flex; align-items: center; min-height: 32px; }
.hinweiszeile-person a.tag:hover { text-decoration: underline; }
.zmenue { position: relative; }
.zmenue > summary { list-style: none; cursor: pointer; }
.zmenue > summary::-webkit-details-marker { display: none; }
.zmenue > summary::after { content: ""; width: .4rem; height: .4rem; margin-left: .4rem; border-right: 2px solid currentColor; border-bottom: 2px solid currentColor; transform: rotate(45deg) translateY(-2px); }
.zmenue[open] > summary::after { transform: rotate(-135deg); }
.zmenue-inhalt {
  position: absolute; right: 0; top: calc(100% + 6px); z-index: 40; box-sizing: border-box; width: max-content; min-width: 13rem; max-width: min(22rem, 86vw);
  display: grid; gap: .5rem; padding: .75rem; background: var(--pop); border: 1px solid var(--pop-linie); border-radius: var(--radius-sm);
  box-shadow: var(--schatten-menue);
}
.zmenue-inhalt form { margin: 0; }
.zmenue-inhalt .btn { width: 100%; justify-content: center; }
.zmenue-inhalt .linkrow input { flex: 1 1 100%; min-width: 0; }
body.ps1 .searchbar { display: flex; flex-wrap: wrap; align-items: flex-end; gap: .25rem .75rem; }
body.ps1 .searchbar > label { flex: 0 0 100%; margin-bottom: 0; }
body.ps1 .searchbar > input { flex: 1 1 14rem; }
body.ps1 .searchbar .searchcount { flex: 0 0 100%; }
.bereichskopf { margin: .75rem 0 .5rem; display: flex; flex-wrap: wrap; align-items: center; gap: .125rem .5rem; }
.bereichskopf .hint { color: var(--muted); font-size: .875rem; }
.bereichefuss { margin-top: 1rem; }
.hinweise .hinweiszeile + .hinweiszeile { margin-top: .75rem; padding-top: .75rem; border-top: 1px solid var(--hair); }
.hinweise .card-head { margin-bottom: 0; }
.hinweise .btn-row { margin-top: .75rem; }
@media (max-width: 999px) {
  .hinweiszeile-person a.tag { min-height: 44px; }
  .emprow .bereichschips .chip > span { min-height: 44px; padding: .25rem .8rem; }
}

/* --- Tippziele am Rechner: nichts unter 32 px Hoehe (Stufe 1, 24.10.2026) ------------------------------------------------- */
/* Gemessen waren es 377 Bedienelemente unter 32 px (die Haken in den Chips mitgezaehlt - die sind 1 px gross, getippt wird das Chip).
   Hier die Links und Knoepfe, die wirklich zu klein waren: Namen in Tabellen, Monatspfeile, Wochennummern, "Bedarf aendern", die kleinen
   Schaltflaechen der Einteilung. Die Flaeche waechst, die Zeile bleibt - Zeilenhoehe und Aussehen aendern sich kaum. */
/* Der Punkt "hier nicht gezaehlt" in der Inventur-Tabelle: 1,7:1 gegen die Karte, jetzt die leise Tinte (>= 4,5:1). */
body.ps1 td.invna { color: var(--muted); }
body.ps1 td.name > a, body.ps1 .bhkopf a, body.ps1 .kalnav a, body.ps1 .kw a, body.ps1 .plankalender-grid td.kw > a, body.ps1 .card-head a.hint, body.ps1 .lede > a, body.ps1 .hubtitelbox > summary, body.ps1 .slotadd > summary {
  display: inline-flex; align-items: center; min-height: 32px;
}
body.ps1 .crewform button:not(.crewwort) { min-width: 32px; min-height: 32px; }
/* Am Handy gelten die 44 px der Planung (MEHR_AM_HANDY) - die 32 px oben duerfen sie nicht unterbieten. Steht ZULETZT, damit es bei gleicher Spezifitaet gewinnt. */
@media (max-width: 999px) {
  body.ps1 .emprow .who > a, body.ps1 td.name > a, body.ps1 .bhkopf a, body.ps1 .kalnav a, body.ps1 .kw a, body.ps1 .plankalender-grid td.kw > a,
  body.ps1 .card-head a.hint, body.ps1 .lede > a, body.ps1 .hubtitelbox > summary, body.ps1 .slotadd > summary { min-height: 44px; }
  body.ps1 .crewform button:not(.crewwort) { min-width: 44px; min-height: 44px; }
}


body.ps1 {
  --leiste: #283045;
  --leiste-ink: #FDF8EF;
  --leiste-hover: rgba(253, 248, 239, .12);
  --leiste-aktiv: rgba(253, 248, 239, .2);
  --leiste-ink-leise: rgba(253, 248, 239, .78);
}
/* --- Die schmale Leiste (Rechner) -------------------------------------------------------------------------------------------- */
@media (min-width: 1000px) {
  body.ps1 .adminseite.asrail {
    width: 104px; padding: calc(.75rem + var(--safetop)) .375rem .75rem; gap: .25rem; overflow-y: auto; overflow-x: hidden;
    background: var(--leiste); color: var(--leiste-ink); border-right: 0;
  }
  body.ps1.mit-seite { padding-left: 104px; }
}
body.ps1 .asrail .asmarke {
  display: flex; align-items: center; justify-content: center; width: 44px; height: 44px; margin: 0 auto .75rem; padding: 0;
  border-radius: var(--radius-sm); background: var(--leiste-ink); color: var(--leiste); font-weight: 700; font-size: 1.3125rem; text-decoration: none;
}
body.ps1 .asrail .asbereiche, body.ps1 .asrail .asunten { display: flex; flex-direction: column; gap: .25rem; }
body.ps1 .asrail .asunten { margin-top: auto; padding-top: .75rem; border-top: 1px solid var(--leiste-hover); }
body.ps1 .asrail .aslink, body.ps1 .asrail .asform button {
  position: relative; flex-direction: column; justify-content: center; gap: .25rem; width: 100%; min-height: 56px; padding: .5rem .125rem;
  border-radius: var(--radius-sm); color: var(--leiste-ink-leise); font-size: .75rem; font-weight: 650; line-height: 1.15; text-align: center; text-decoration: none;
}
body.ps1 .asrail .asform { margin: 0; }
body.ps1 .asrail .asform button { display: flex; align-items: center; border: 0; background: none; font-family: inherit; cursor: pointer; }
body.ps1 .asrail .aslink:hover, body.ps1 .asrail .asform button:hover { background: var(--leiste-hover); color: var(--leiste-ink); text-decoration: none; }
body.ps1 .asrail .aslink:focus-visible, body.ps1 .asrail .asform button:focus-visible { outline: 2px solid var(--leiste-ink); outline-offset: -2px; }
body.ps1 .asrail .aslink[aria-current="page"] { background: var(--leiste-aktiv); color: var(--leiste-ink); font-weight: 700; }
body.ps1 .asrail .aslink .ic, body.ps1 .asrail .asform button .ic { width: 22px; height: 22px; opacity: 1; --ak: var(--leiste-ink); }
body.ps1 .asrail .astext { display: block; max-width: 100%; overflow-wrap: anywhere; }
/* Das Abzeichen: umgekehrt wie die Leiste (Papier auf Marine), mit Zahl - die Farbe allein sagt nichts. */
body.ps1 .asrail .navbadge {
  position: absolute; top: 2px; right: 10px; min-width: 20px; height: 20px; margin: 0; padding: 0 .3rem; border-radius: var(--radius-pille);
  background: var(--leiste-ink); color: var(--leiste); font-size: .75rem; font-weight: 700; display: flex; align-items: center; justify-content: center;
}
/* --- Die Zeile mit den Reitern ---------------------------------------------------------------------------------------------- */
body.ps1 .leitkopf { display: none; }
@media (min-width: 1000px) {
  body.ps1 .leitkopf {
    display: flex; align-items: center; flex-wrap: wrap; gap: .5rem 1rem; max-width: 1120px; margin: 0 auto; padding: .75rem var(--pad) 0; box-sizing: border-box;
  }
  body.ps1 .leitkopf + main.wrap { padding-top: 1rem; }
}
body.ps1 .lkbereich { font-size: .75rem; font-weight: 700; letter-spacing: .09em; text-transform: uppercase; color: var(--muted); }
body.ps1 .lkrechts { margin-left: auto; display: flex; align-items: center; gap: .5rem; }
body.ps1 .lkform { margin: 0; }
body.ps1 .bereichsreiter { display: flex; flex-wrap: wrap; gap: .25rem; padding: .25rem; border-radius: var(--radius-pille); background: var(--fill); }
body.ps1 .brlink {
  display: inline-flex; align-items: center; gap: .4rem; min-height: 36px; padding: .25rem 1rem; border-radius: var(--radius-pille);
  color: var(--text); font-size: .875rem; font-weight: 600; text-decoration: none;
}
body.ps1 .brlink:hover { background: var(--accent-soft); text-decoration: none; }
body.ps1 .brlink[aria-current="page"] { background: var(--accent); color: var(--accent-ink); }
body.ps1 .brlink:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
body.ps1 .brlink .navbadge {
  display: inline-flex; align-items: center; justify-content: center; min-width: 20px; height: 20px; padding: 0 .3rem; border-radius: var(--radius-pille);
  background: var(--crit); color: var(--crit-ink); font-size: .75rem; font-weight: 700;
}
/* --- Der Leitstand "Heute" ---------------------------------------------------------------------------------------------------- */
body.ps1 .lshead { gap: .75rem 1rem; flex-wrap: wrap; align-items: center; margin-bottom: 1rem; }
body.ps1 .lshead > div { flex: 1 1 16rem; }
body.ps1 .lsstatus {
  display: inline-flex; align-items: center; gap: .35rem; min-height: 32px; padding: .125rem .75rem; border-radius: var(--radius-pille);
  font-size: .875rem; font-weight: 650; background: var(--fill); color: var(--text);
}
body.ps1 .lsstatus.ok { background: var(--ok-soft); color: var(--ok); }
body.ps1 .lsstatus.warn { background: var(--warn-soft); color: var(--warn); }
body.ps1 .lskacheln { display: grid; gap: .75rem; margin-bottom: 1rem; grid-template-columns: repeat(auto-fit, minmax(210px, 1fr)); }
body.ps1 .lskacheln.gross { grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); }
body.ps1 .lskachel {
  position: relative; display: flex; flex-direction: column; gap: .25rem; padding: .75rem 1rem; border: 1px solid var(--border); border-radius: var(--radius-sm);
  background: var(--surface); color: var(--text);
}
body.ps1 .lskachel:hover { border-color: var(--accent); }
body.ps1 .lskopf { display: flex; align-items: center; justify-content: space-between; gap: .5rem; min-height: 32px; }
/* Der Titel ist der Link; sein ::after legt die Klickflaeche ueber die ganze Kachel. Das ⓘ steht darueber (z-index) und bleibt ein eigener Knopf. */
body.ps1 .lslink { display: inline-flex; align-items: center; min-height: 32px; font-size: .875rem; font-weight: 700; color: var(--text); text-decoration: none; }
body.ps1 .lslink::after { content: ""; position: absolute; inset: 0; border-radius: var(--radius-sm); }
body.ps1 .lslink:hover { text-decoration: underline; }
body.ps1 .lslink:focus-visible { outline: none; }
body.ps1 .lslink:focus-visible::after { outline: 2px solid var(--accent); outline-offset: 2px; }
body.ps1 .lskachel .ib { position: relative; z-index: 1; }
body.ps1 .lszahl { display: flex; align-items: baseline; gap: .375rem; }
body.ps1 .lszahl b { font-family: var(--f-text); font-size: 2rem; font-weight: 700; letter-spacing: -.03em; line-height: 1.05; font-variant-numeric: tabular-nums; }
body.ps1 .lskachel:not(.gross) .lszahl b { font-size: 1.5rem; }
body.ps1 .lszahl span { font-size: .875rem; font-weight: 600; color: var(--muted); }
body.ps1 .lszeile { font-size: .875rem; color: var(--muted); }
body.ps1 .lsbalken { height: 8px; border-radius: var(--radius-pille); background: var(--fill); overflow: hidden; margin-top: .25rem; }
body.ps1 .lsbalken i { display: block; height: 100%; background: var(--accent); }
body.ps1 .lsfuss { display: flex; align-items: flex-end; justify-content: space-between; gap: .5rem; margin-top: auto; padding-top: .5rem; flex-wrap: wrap; }
body.ps1 .lsampel {
  display: inline-flex; align-items: center; gap: .3rem; min-height: 28px; padding: .125rem .625rem; border-radius: var(--radius-pille);
  font-size: .875rem; font-weight: 700; background: var(--fill); color: var(--text);
}
body.ps1 .lsampel.ok { background: var(--ok-soft); color: var(--ok); }
body.ps1 .lsampel.warn { background: var(--warn-soft); color: var(--warn); }
body.ps1 .lsampel.crit { background: var(--crit); color: var(--crit-ink); }
body.ps1 .lsampel.offen { background: var(--accent-soft); color: var(--accent); }
body.ps1 .lsziel { position: relative; z-index: 1; display: inline-flex; align-items: center; min-height: 32px; font-size: .875rem; font-weight: 600; color: var(--accent); text-decoration: underline; }
body.ps1 .lsverlauf { display: inline-flex; align-items: flex-end; gap: 3px; height: 28px; margin-left: auto; }
body.ps1 .lsverlauf i { display: block; width: 6px; border-radius: 2px; background: var(--balken); }
body.ps1 .lsverlauf i.heute { background: var(--accent); }
body.ps1 .lszwei { display: grid; gap: 1rem; grid-template-columns: minmax(0, 1.4fr) minmax(0, 1fr); align-items: start; margin-bottom: 1rem; }
body.ps1 .lszwei > .card { margin-bottom: 0; }
body.ps1 .lsrechts { min-width: 0; }
@media (max-width: 1099px) { body.ps1 .lszwei { grid-template-columns: minmax(0, 1fr); } }
body.ps1 .kwochenzeile { display: flex; flex-wrap: wrap; align-items: baseline; gap: .25rem .5rem; padding: .5rem 0 .75rem; font-size: .875rem; }
body.ps1 .kwochenzeile strong { font-size: 1.125rem; font-variant-numeric: tabular-nums; }
body.ps1 .kwochenzeile a { display: inline-flex; align-items: center; min-height: 32px; font-weight: 600; }
/* --- Suche (Strg K) und "Neu" in der Zeile oben (Stufe 3) ------------------------------------------------------------------------------- */
body.ps1 .lksuche { position: relative; flex: 1 1 14rem; max-width: 26rem; min-width: 0; margin-left: auto; }
body.ps1 .lksuche input[type="search"] {
  width: 100%; box-sizing: border-box; min-height: 40px; padding: .25rem 4.75rem .25rem 1rem; border: 1px solid var(--border-strong); border-radius: var(--radius-pille);
  background: var(--surface); color: var(--text); font: inherit; font-size: .875rem; -webkit-appearance: none; appearance: none;
}
body.ps1 .lksuche input[type="search"]::-webkit-search-cancel-button { display: none; }
body.ps1 .lksuche input[type="search"]:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
body.ps1 .lkkbd {
  position: absolute; right: .75rem; top: 50%; transform: translateY(-50%); padding: .2rem .45rem; border: 1px solid var(--border); border-radius: var(--radius-klein);
  background: var(--fill); color: var(--muted); font: inherit; font-size: .75rem; font-weight: 700; line-height: 1; pointer-events: none;
}
body.ps1 .lksuche-liste {
  position: absolute; left: 0; right: 0; top: calc(100% + 6px); z-index: 45; box-sizing: border-box; margin: 0; padding: .375rem; list-style: none; max-height: 26rem; overflow-y: auto;
  background: var(--pop); border: 1px solid var(--pop-linie); border-radius: var(--radius-sm); box-shadow: var(--schatten-menue);
}
body.ps1 .lksuche-liste[hidden] { display: none; }
body.ps1 .lksuche-liste li a { display: flex; align-items: baseline; gap: .5rem; min-height: 40px; padding: .5rem .625rem; border-radius: var(--radius-xs); color: var(--text); font-size: .875rem; text-decoration: none; }
body.ps1 .lksuche-liste li.aktiv a, body.ps1 .lksuche-liste li a:hover { background: var(--accent); color: var(--accent-ink); }
body.ps1 .lksuche-liste .art { flex: none; width: 4rem; font-size: .75rem; font-weight: 700; letter-spacing: .05em; text-transform: uppercase; opacity: .72; }
body.ps1 .lksuche-liste .titel { font-weight: 650; min-width: 0; overflow-wrap: anywhere; }
body.ps1 .lksuche-liste .wo { margin-left: auto; padding-left: .5rem; font-size: .75rem; opacity: .72; text-align: right; }
body.ps1 .lksuche-liste li.leer { padding: .625rem; color: var(--muted); font-size: .875rem; }
body.ps1 .lkneu > summary { display: inline-flex; align-items: center; min-height: 40px; padding: .25rem 1rem; }
body.ps1 .lkneu > summary::after { display: none; }
body.ps1 .lkneu .zmenue-inhalt { min-width: 16rem; padding: .375rem; gap: 0; }
body.ps1 .lkneulink { display: flex; flex-direction: column; gap: .125rem; min-height: 40px; padding: .5rem .75rem; border-radius: var(--radius-xs); color: var(--text); text-decoration: none; font-size: .875rem; font-weight: 650; }
body.ps1 .lkneulink small { color: var(--muted); font-size: .75rem; font-weight: 500; }
body.ps1 .lkneulink:hover, body.ps1 .lkneulink:focus-visible { background: var(--accent); color: var(--accent-ink); text-decoration: none; }
body.ps1 .lkneulink:hover small, body.ps1 .lkneulink:focus-visible small { color: var(--accent-ink); }
body.ps1 .lkrechts { margin-left: 0; }
body.ps1 .bereichsstart { max-width: 1120px; margin: .75rem auto 0; padding: 0 var(--pad); box-sizing: border-box; }
@media (min-width: 1000px) { body.ps1 .bereichsstart + main.wrap { padding-top: 1rem; } }
/* Am Handy (Stufe 4): Team und Hub sind Plaetze der Leiste unten - ihre Kacheln stehen darum auch dort, zwei nebeneinander, ohne den kleinen Verlauf. */
@media (max-width: 999px) {
  /* minmax(0, 1fr) statt 1fr: sonst setzt das laengste Wort ("Abrechnungsperiode") die Breite der Kachel, die Seite wird breiter als das Handy, und die Leiste
     unten rutscht aus dem Bild (gemessen am 24.10.2026 auf Zeiten: Seite 413 statt 390 px, Leiste 50 px unter dem Rand - mein Fehler aus Stufe 4). */
  body.ps1 .bereichsstart { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: .5rem; margin: .75rem auto 0; }
  body.ps1 .bereichsstart .lskachel { min-width: 0; }
  body.ps1 .bereichsstart .lslink { overflow-wrap: anywhere; hyphens: auto; }
  body.ps1 .bereichsstart .lskachel { padding: .625rem .75rem; }
  body.ps1 .bereichsstart .lszahl b { font-size: 1.5rem; }
  body.ps1 .bereichsstart .lszeile { font-size: .75rem; }
  body.ps1 .bereichsstart .lsverlauf { display: none; }
  body.ps1 .lslink { min-height: 44px; }
}
body.ps1 .lsalle { margin-left: auto; text-decoration: underline; display: inline-flex; align-items: center; min-height: 32px; }
body.ps1 .hbich { margin: 0; }
/* Die Seite hinter der Suche */
body.ps1 .sliste { list-style: none; margin: 0; padding: 0; }
body.ps1 .sliste a { display: flex; align-items: center; justify-content: space-between; gap: 1rem; min-height: 44px; padding: .25rem 0; border-top: 1px solid var(--hair); color: var(--text); text-decoration: none; }
body.ps1 .sliste li:first-child a { border-top: 0; }
body.ps1 .sliste a:hover .titel { text-decoration: underline; }
body.ps1 .sliste .titel { font-weight: 650; }
body.ps1 .sliste .wo { color: var(--muted); font-size: .875rem; text-align: right; }
/* --- Der Planungs-Kopf am Handy (Stufe 4b) ------------------------------------------------------------------------------------------------ */
/* Statt "Adieu Team Hub" mit Menueknopf: "Planung · Betrieb", der Bereich als Titel, rechts Suche und "+ Neu", darunter die Reiter zum Wischen. Ab 1000 px gibt es
   ihn nicht (dort steht die Zeile oben, .leitkopf). Das Menue zum Aufklappen ist am Handy weg - alles steht in "Mehr" (Leiste unten). */
body.ps1 .hkopf { display: none; }
body.ps1 .hkknoepfe { display: flex; gap: .5rem; flex: none; }
body.ps1 .hkknopf {
  display: inline-flex; align-items: center; justify-content: center; width: 44px; height: 44px; box-sizing: border-box; border-radius: 50%;
  border: 1.5px solid var(--border-strong); background: var(--surface); color: var(--text); cursor: pointer; list-style: none; text-decoration: none;
}
body.ps1 .hkknopf svg { width: 22px; height: 22px; display: block; }
body.ps1 .hkknopf:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
body.ps1 .hkneu > summary.hkknopf { background: var(--accent); border-color: var(--accent); color: var(--accent-ink); }
body.ps1 .hkneu > summary::-webkit-details-marker { display: none; }
body.ps1 .hkneu > summary::after { display: none; }
body.ps1 .hkneu[open] > summary::before { content: ""; position: fixed; inset: 0; z-index: 60; background: var(--schleier); }
body.ps1 .hkneu[open] > .hkblatt {
  position: fixed; left: 0; right: 0; bottom: 0; z-index: 61; box-sizing: border-box; max-height: 80vh; overflow-y: auto;
  padding: .5rem 1rem calc(1rem + env(safe-area-inset-bottom)); background: var(--pop); border-radius: var(--radius) var(--radius) 0 0; box-shadow: var(--schatten-pop);
}
body.ps1 .hkgriff { display: block; width: 40px; height: 4px; margin: .25rem auto .75rem; border-radius: 2px; background: var(--border-strong); }
body.ps1 .hkbtitel { margin: 0 0 .25rem; font-size: 1.125rem; font-weight: 700; color: var(--text); }
body.ps1 .hkneulink {
  display: flex; flex-direction: column; justify-content: center; gap: .125rem; min-height: 56px; padding: .375rem .25rem; border-top: 1px solid var(--hair);
  color: var(--text); font-size: 1rem; font-weight: 650; text-decoration: none;
}
body.ps1 .hkneulink small { color: var(--muted); font-size: .875rem; font-weight: 500; }
body.ps1 .hkneulink:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
/* Die Suche als Blatt ueber der ganzen Seite (<dialog>, liegt in der obersten Ebene des Browsers) */
body.ps1 .hkvoll { width: 100%; max-width: none; height: 100%; max-height: none; margin: 0; padding: 0; border: 0; background: var(--bg); color: var(--text); }
body.ps1 .hkvoll::backdrop { background: var(--schleier); }
body.ps1 .hkform.lksuche { display: flex; flex-direction: column; height: 100%; max-width: none; margin: 0; padding: calc(var(--safetop) + .75rem) 1rem 1rem; box-sizing: border-box; }
body.ps1 .hkfeld { display: flex; align-items: center; gap: .5rem; }
body.ps1 .hkform input[type="search"] { flex: 1; min-width: 0; min-height: 48px; padding: 0 1rem; font-size: 1rem; }
body.ps1 .hkzu { min-height: 44px; padding: 0 .5rem; border: 0; background: none; color: var(--accent); font: inherit; font-size: 1rem; font-weight: 650; text-decoration: underline; cursor: pointer; }
body.ps1 .hkform .lksuche-liste { position: static; flex: 1; max-height: none; margin-top: .75rem; padding: 0; border: 0; background: transparent; box-shadow: none; overflow-y: auto; }
body.ps1 .hkform .lksuche-liste li a { min-height: 48px; align-items: center; font-size: 1rem; }
body.ps1 .hkform .lksuche-liste .wo { font-size: .875rem; }
@media (max-width: 999px) {
  body.ps1.mithkopf > .topbar { display: none; }
  body.ps1 .hkopf { display: block; max-width: 560px; margin: 0 auto; padding: calc(var(--safetop) + 1rem) 1rem .25rem; box-sizing: border-box; }
  body.ps1 .hkkopfzeile { display: flex; align-items: flex-start; gap: .75rem; }
  body.ps1 .hktitel { flex: 1; min-width: 0; }
  body.ps1 .hkh { margin: .125rem 0 0; font-size: 2rem; font-weight: 700; line-height: 1.1; letter-spacing: -.01em; color: var(--text); overflow-wrap: anywhere; }
  body.ps1 .hkreiter {
    display: flex; gap: .375rem; margin: .75rem 0 0; padding: 0 0 .25rem; overflow-x: auto; scroll-snap-type: x proximity; scrollbar-width: none;
  }
  body.ps1 .hkreiter::-webkit-scrollbar { display: none; }
  body.ps1 .hkreiterlink {
    flex: none; display: inline-flex; align-items: center; gap: .375rem; min-height: 44px; padding: 0 1rem; scroll-snap-align: start; border-radius: var(--radius-pille);
    background: var(--fill); color: var(--text); font-size: .875rem; font-weight: 650; text-decoration: none; white-space: nowrap;
  }
  body.ps1 .hkreiterlink[aria-current="page"] { background: var(--accent); color: var(--accent-ink); }
  body.ps1 .hkreiterlink .navbadge {
    display: inline-flex; align-items: center; justify-content: center; min-width: 20px; height: 20px; padding: 0 .3rem; border-radius: var(--radius-pille);
    background: var(--crit); color: var(--crit-ink); font-size: .75rem; font-weight: 700;
  }
  /* Heute, Wartet und Mehr: ihr eigener Kopf bekommt die zwei Knoepfe oben rechts */
  body.ps1 .pakopf { position: relative; }
  body.ps1 .pakopf > .hkknoepfe { position: absolute; right: 0; top: calc(var(--safetop) + 1rem); }
  body.ps1 .pakopf > .paober { padding-right: 6.5rem; }
}


/* ===================================================================
   Welt 1 - Papier & Indigo (23.10.2026) - siehe stil-w1.js. Ganz am Ende:
   die Reihenfolge ist bedeutungstragend.
   Hell: ohne data-theme (Telefon hell) und data-theme="light". Dunkel:
   Telefon dunkel ohne Wahl und data-theme="dark" - derselbe Satz Werte, an
   beiden Stellen (ein Wert, der nur in der Medienabfrage stuende, fehlte im
   Weg von Hand, und umgekehrt).
   =================================================================== */
:root:root body.w1 { --w1-bg: #FAF6EE; --w1-card: #FFFFFF; --w1-ink: #1C1B22; --w1-ink2: #55525F; --w1-line: #E4DDD0; --w1-chip: #F0EADF; --w1-chip2: #E6DFD0; --w1-line2: #CFC6B6; --w1-text-soft: #3A3844; --w1-text-aus: #6B6877; --w1-feldrand: #8C8798; --w1-act: #FF7A1A; --w1-on-act: #1C1B22; --w1-act-soft: #FFE6D2; --w1-act-ink: #9A3A00; --w1-act-rand: #B34700; --w1-act-hover: #7A2D00; --w1-zeit: #3B35C8; --w1-on-zeit: #FFFFFF; --w1-zeit-soft: #E4E2FA; --w1-zeit-ink: #2D2896; --w1-ok: #0F766E; --w1-okbg: #D9F2EE; --w1-ok-ink: #FFFFFF; --w1-rot: #B3261E; --w1-rotbg: #FDE8E6; --w1-rot-ink: #FFFFFF; --w1-slab: #3B35C8; --w1-slab-ink: #FFFFFF; --w1-slab-ink2: #DAD8F7; --w1-seg: #1C1B22; --w1-on-seg: #FFFFFF; --w1-disc: #F0EADF; --w1-on-disc: #1C1B22; --w1-heute: #3B35C8; --w1-on-heute: #FFFFFF; --w1-dot: #3B35C8; --w1-cnt-bg: #FFE6D2; --w1-cnt-ink: #9A3A00; --w1-du: #3B35C8; --w1-on-du: #FFFFFF; --w1-bar-n: #E4DDD0; --w1-off: #F0EADF; --w1-off-line: #55525F; --w1-start: #0F766E; --w1-start-ink: #FFFFFF; --w1-ende: #B3261E; --w1-ende-ink: #FFFFFF; --w1-slab-start: #34E0B4; --w1-slab-start-ink: #06251D; --w1-slab-ende: #FF7068; --w1-slab-ende-ink: #1C0A09; --w1-hair: rgba(28, 27, 34, .11); --w1-hair-strong: rgba(28, 27, 34, .18); --w1-fill: rgba(28, 27, 34, .055); 
  --bg: var(--w1-bg); --surface: var(--w1-card); --surface-2: var(--w1-chip); --surface-3: var(--w1-chip2);
  --border: var(--w1-line); --border-strong: var(--w1-line2); --feldrand: var(--w1-feldrand);
  --hair: var(--w1-hair); --hair-strong: var(--w1-hair-strong); --fill: var(--w1-fill);
  --text: var(--w1-ink); --text-soft: var(--w1-text-soft); --muted: var(--w1-ink2); --text-aus: var(--w1-text-aus); --plus: var(--w1-text-aus);
  --accent: var(--w1-act-ink); --accent-hover: var(--w1-act-hover); --accent-soft: var(--w1-act-soft); --accent-ink: var(--w1-card);
  --wahl: var(--w1-seg); --wahl-soft: var(--w1-chip); --wahl-ink: var(--w1-on-seg);
  --deep: var(--w1-slab); --deep-hover: var(--w1-slab); --deep-ink: var(--w1-slab-ink);
  --gruen: var(--w1-ok); --gruen-hover: var(--w1-ok); --gruen-ink: var(--w1-ok-ink);
  --ok: var(--w1-ok); --ok-soft: var(--w1-okbg); --ok-ink: var(--w1-ok-ink);
  --warn: var(--w1-rot); --warn-soft: var(--w1-rotbg);
  --crit: var(--w1-rot); --crit-soft: var(--w1-rotbg); --crit-ink: var(--w1-rot-ink);
  --gold: var(--w1-chip2); --gold-soft: var(--w1-chip);
  --bar: var(--w1-ink2); --kueche: var(--w1-ink2); --office: var(--w1-ink2);
  --bar-soft: var(--w1-fill); --kueche-soft: var(--w1-fill); --office-soft: var(--w1-fill);
  --p-tag: var(--w1-chip); --p-woche: var(--w1-chip); --p-hub: var(--w1-chip); --p-event: var(--w1-chip);
  --p-tag-ink: var(--w1-ink2); --p-woche-ink: var(--w1-ink2); --p-hub-ink: var(--w1-ink2); --p-event-ink: var(--w1-ink2);
  --event-ton: var(--w1-zeit-soft); --event-ton-stark: var(--w1-zeit-soft);
  --marine-ink: var(--w1-ink);
  --radius: 20px; --radius-sm: 14px; --radius-xs: 10px;
  --schatten-1: none; --schatten-2: none; --shadow: none;
  accent-color: var(--w1-act);
 }
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) body.w1 { --w1-bg: #0F0E14; --w1-card: #1A1923; --w1-ink: #F4F1EA; --w1-ink2: #B8B4C4; --w1-line: #2C2A3A; --w1-chip: #25232F; --w1-chip2: #322F42; --w1-line2: #403D52; --w1-text-soft: #D8D4E2; --w1-text-aus: #8F8BA0; --w1-feldrand: #7C7890; --w1-act: #FF9A4D; --w1-on-act: #1C1B22; --w1-act-soft: #3A2314; --w1-act-ink: #FFB98A; --w1-act-rand: #FF9A4D; --w1-act-hover: #FFB27A; --w1-zeit: #9C97FF; --w1-on-zeit: #14123A; --w1-zeit-soft: #25234F; --w1-zeit-ink: #C9C6FF; --w1-ok: #6AD596; --w1-okbg: #14301F; --w1-ok-ink: #0B1F14; --w1-rot: #FF6B63; --w1-rotbg: #3A1A18; --w1-rot-ink: #1C0A09; --w1-slab: #2B2878; --w1-slab-ink: #FFFFFF; --w1-slab-ink2: #D5D3FA; --w1-seg: #F4F1EA; --w1-on-seg: #1C1B22; --w1-disc: #25232F; --w1-on-disc: #F4F1EA; --w1-heute: #9C97FF; --w1-on-heute: #14123A; --w1-dot: #9C97FF; --w1-cnt-bg: #3A2314; --w1-cnt-ink: #FFB98A; --w1-du: #9C97FF; --w1-on-du: #14123A; --w1-bar-n: #2C2A3A; --w1-off: #25232F; --w1-off-line: #B8B4C4; --w1-start: #6AD596; --w1-start-ink: #0B1F14; --w1-ende: #FF6B63; --w1-ende-ink: #1C0A09; --w1-slab-start: #34E0B4; --w1-slab-start-ink: #06251D; --w1-slab-ende: #FF7068; --w1-slab-ende-ink: #1C0A09; --w1-hair: rgba(244, 241, 234, .10); --w1-hair-strong: rgba(244, 241, 234, .16); --w1-fill: rgba(244, 241, 234, .07); }
}
:root[data-theme="dark"] body.w1 { --w1-bg: #0F0E14; --w1-card: #1A1923; --w1-ink: #F4F1EA; --w1-ink2: #B8B4C4; --w1-line: #2C2A3A; --w1-chip: #25232F; --w1-chip2: #322F42; --w1-line2: #403D52; --w1-text-soft: #D8D4E2; --w1-text-aus: #8F8BA0; --w1-feldrand: #7C7890; --w1-act: #FF9A4D; --w1-on-act: #1C1B22; --w1-act-soft: #3A2314; --w1-act-ink: #FFB98A; --w1-act-rand: #FF9A4D; --w1-act-hover: #FFB27A; --w1-zeit: #9C97FF; --w1-on-zeit: #14123A; --w1-zeit-soft: #25234F; --w1-zeit-ink: #C9C6FF; --w1-ok: #6AD596; --w1-okbg: #14301F; --w1-ok-ink: #0B1F14; --w1-rot: #FF6B63; --w1-rotbg: #3A1A18; --w1-rot-ink: #1C0A09; --w1-slab: #2B2878; --w1-slab-ink: #FFFFFF; --w1-slab-ink2: #D5D3FA; --w1-seg: #F4F1EA; --w1-on-seg: #1C1B22; --w1-disc: #25232F; --w1-on-disc: #F4F1EA; --w1-heute: #9C97FF; --w1-on-heute: #14123A; --w1-dot: #9C97FF; --w1-cnt-bg: #3A2314; --w1-cnt-ink: #FFB98A; --w1-du: #9C97FF; --w1-on-du: #14123A; --w1-bar-n: #2C2A3A; --w1-off: #25232F; --w1-off-line: #B8B4C4; --w1-start: #6AD596; --w1-start-ink: #0B1F14; --w1-ende: #FF6B63; --w1-ende-ink: #1C0A09; --w1-slab-start: #34E0B4; --w1-slab-start-ink: #06251D; --w1-slab-ende: #FF7068; --w1-slab-ende-ink: #1C0A09; --w1-hair: rgba(244, 241, 234, .10); --w1-hair-strong: rgba(244, 241, 234, .16); --w1-fill: rgba(244, 241, 234, .07); }
:root:root body.w1 { background: var(--w1-bg); color: var(--w1-ink); }
:root:root body.w1::before { background: var(--w1-bg); }
:root:root body.w1 .card::after,
:root:root body.w1 .deckblock::after,
:root:root body.w1 .stkarte::after,
:root:root body.w1 .wblock::after,
:root:root body.w1 .planday::after { display: none; }
:root:root body.w1 .card,
:root:root body.w1 .stkarte,
:root:root body.w1 .wblock { border-color: transparent; box-shadow: none; border-radius: var(--radius); }
:root:root body.w1 .wrap { padding-top: .5rem; }
:root:root body.w1 .wrap.w1seite { padding-left: 16px; padding-right: 16px; }
:root:root body.w1 .w1kopf { max-width: 720px; margin: 0 auto; padding: calc(var(--safetop) + 16px) 16px 0; }
:root:root body.w1 .w1kz { display: flex; align-items: flex-end; justify-content: space-between; gap: 12px; margin-bottom: 14px; }
:root:root body.w1 .w1text { min-width: 0; flex: 1; }
:root:root body.w1 .w1datum { font: 600 13px/1.2 var(--f-text); letter-spacing: .06em; text-transform: uppercase; color: var(--w1-ink2); margin: 0; }
:root:root body.w1 .w1titel { font: 700 28px/1.15 var(--f-kopf); letter-spacing: -.01em; margin: 0; color: var(--w1-ink); overflow-wrap: anywhere; }
:root:root body.w1 .w1titel.lang { font-size: clamp(22px, calc((100vw - 150px) * .105), 28px); }
:root:root body.w1 .w1sub { font-size: 14px; color: var(--w1-ink2); font-weight: 500; margin: 0; }
:root:root body.w1 .w1rechts { display: flex; gap: 10px; align-items: center; flex: none; }
:root:root body.w1 .w1lupe,
:root:root body.w1 .w1kreis { width: 48px; height: 48px; border-radius: 50%; display: flex; align-items: center; justify-content: center; flex: none; text-decoration: none; }
:root:root body.w1 .w1lupe { background: var(--w1-card); border: 1px solid var(--w1-line); color: var(--w1-ink); }
:root:root body.w1 .w1kreis { background: var(--w1-ink); color: var(--w1-bg); font: 700 15px/1 var(--f-text); }
:root:root body.w1 .w1kreis[aria-current="page"] { box-shadow: 0 0 0 3px var(--w1-bg), 0 0 0 5px var(--w1-act); }
:root:root body.w1 .w1lupe:focus-visible,
:root:root body.w1 .w1kreis:focus-visible,
:root:root body.w1 .w1zurueck:focus-visible { outline: 2px solid var(--w1-act-ink); outline-offset: 2px; }
:root:root body.w1 .w1zurueck { display: inline-flex; align-items: center; gap: 4px; min-height: 44px; font-weight: 600; font-size: 15px; color: var(--w1-ink2); margin: -6px 0 4px -6px; padding: 0 8px 0 0; text-decoration: none; }
:root:root body.w1 .deckblock { background: transparent; color: var(--w1-ink); border-radius: 0; max-width: 720px; margin: 0 auto .5rem; padding: .25rem 16px 0; }
:root:root body.w1 .deckblock h1 { color: var(--w1-ink); font: 700 28px/1.15 var(--f-kopf); letter-spacing: -.01em; margin: 0; }
:root:root body.w1 .deckblock .deckkicker { color: var(--w1-ink2); opacity: 1; font-size: 13px; font-weight: 600; letter-spacing: .06em; }
:root:root body.w1 .deckblock .deckcaption,
:root:root body.w1 .deckblock .artstand { color: var(--w1-ink2); opacity: 1; }
:root:root body.w1 .deckblock .artmenge { color: var(--w1-ink); }
:root:root body.w1 .deckblock .artneben { color: var(--w1-ink2); }
:root:root body.w1 .btn,
:root:root body.w1 .bigbtn,
:root:root body.w1 .btn.gruen,
:root:root body.w1 .bigbtn.gruen,
:root:root body.w1 .btn.wahl,
:root:root body.w1 .btn.gruen.sknehmen,
:root:root body.w1 .hkzwei .btn.gruen { background: var(--w1-act); color: var(--w1-on-act); border: 1.5px solid var(--w1-act-rand); box-shadow: none; background-image: none; }
:root:root body.w1 .btn:hover,
:root:root body.w1 .bigbtn:hover { background: var(--w1-act); filter: brightness(.96); }
:root:root body.w1 .btn.secondary,
:root:root body.w1 .bigbtn.secondary,
:root:root body.w1 .btn.tauschknopf { background: transparent; color: var(--w1-ink); border: 1.5px solid var(--w1-ink); box-shadow: none; background-image: none; }
:root:root body.w1 .btn.danger { background: var(--w1-rotbg); color: var(--w1-rot); border: 1.5px solid transparent; }
:root:root body.w1 .btn:focus-visible,
:root:root body.w1 .bigbtn:focus-visible { box-shadow: 0 0 0 4px var(--w1-act-soft); outline: 2px solid var(--w1-ink); outline-offset: 2px; }
:root:root body.w1 .btn.small { min-height: 44px; }
:root:root body.w1 .st-beginnen,
:root:root body.w1 .btn.gruen.st-beginnen,
:root:root body.w1 .bigbtn.gruen.st-beginnen,
:root:root body.w1 .btn.gruen.beginnja { background: var(--w1-start); color: var(--w1-start-ink); border: 1.5px solid var(--w1-start); background-image: none; gap: 10px; font-weight: 700; }
:root:root body.w1 .st-ende,
:root:root body.w1 .btn.st-ende,
:root:root body.w1 .bigbtn.st-ende { background: var(--w1-ende); color: var(--w1-ende-ink); border: 1.5px solid var(--w1-ende); background-image: none; gap: 10px; font-weight: 700; }
:root:root body.w1 .w1schicht .st-beginnen,
:root:root body.w1 .w1schicht .btn.gruen.st-beginnen { background: var(--w1-slab-start); color: var(--w1-slab-start-ink); border-color: var(--w1-slab-start); }
:root:root body.w1 .w1schicht .st-ende,
:root:root body.w1 .w1schicht .btn.st-ende { background: var(--w1-slab-ende); color: var(--w1-slab-ende-ink); border-color: var(--w1-slab-ende); }
:root:root body.w1 .w1i { display: block; flex: none; }
:root:root body.w1 .st-beginnen,
:root:root body.w1 .st-ende { display: flex; align-items: center; justify-content: center; }
:root:root body.w1 .card:has(> .card-head:only-child > h1.nurvorlesen:only-child),
:root:root body.w1 .card-head:has(> h1.nurvorlesen:only-child) { display: none; }
:root:root body.w1 input[type=text],
:root:root body.w1 input[type=email],
:root:root body.w1 input[type=password],
:root:root body.w1 input[type=tel],
:root:root body.w1 input[type=date],
:root:root body.w1 input[type=time],
:root:root body.w1 input[type=number],
:root:root body.w1 input[type=search],
:root:root body.w1 textarea,
:root:root body.w1 select { background: var(--w1-card); color: var(--w1-ink); border-color: var(--w1-feldrand); }
:root:root body.w1 .banner.ok { background: var(--w1-okbg); color: var(--w1-ink); }
:root:root body.w1 .banner.err { background: var(--w1-rotbg); color: var(--w1-ink); }
:root:root body.w1 .banner.info { background: var(--w1-act-soft); color: var(--w1-ink); }
:root:root body.w1 .lede,
:root:root body.w1 .help,
:root:root body.w1 .hint { color: var(--w1-ink2); }
:root:root body.w1 h2.w1sek { display: flex; align-items: center; gap: 10px; font: 700 19px/1.2 var(--f-kopf); margin: 26px 2px 10px; color: var(--w1-ink); }
:root:root body.w1 h2.w1sek.w1zweit { margin-top: 20px; }
:root:root body.w1 h2.w1klein { display: flex; align-items: center; gap: 8px; font: 700 13px/1.2 var(--f-text); letter-spacing: .07em; text-transform: uppercase; color: var(--w1-ink2); margin: 22px 4px 8px; }
:root:root body.w1 .w1n { background: var(--w1-cnt-bg); color: var(--w1-cnt-ink); font: 700 14px/1 var(--f-text); letter-spacing: 0; text-transform: none; border-radius: 99px; min-width: 26px; height: 26px; display: inline-flex; align-items: center; justify-content: center; padding: 0 8px; }
:root:root body.w1 .w1alle { margin-left: auto; min-width: 44px; min-height: 44px; display: flex; align-items: center; justify-content: flex-end; font: 600 14px var(--f-text); letter-spacing: 0; text-transform: none; color: var(--w1-ink2); text-decoration: none; }
:root:root body.w1 .w1liste { background: var(--w1-card); border-radius: 20px; overflow: hidden; }
:root:root body.w1 .w1liste > * + * { border-top: 1px solid var(--w1-line); }
:root:root body.w1 .w1liste.w1abstand { margin-top: 10px; }
:root:root body.w1 .w1zeile { display: flex; align-items: center; gap: 14px; min-height: 62px; width: 100%; box-sizing: border-box; padding: 10px 16px; color: var(--w1-ink); text-decoration: none; font: inherit; text-align: left; background: transparent; border: 0; cursor: pointer; }
:root:root body.w1 .w1zeile:hover { text-decoration: none; background: var(--w1-fill); }
:root:root body.w1 .w1zeile:focus-visible { outline: 2px solid var(--w1-act-ink); outline-offset: -2px; }
:root:root body.w1 .w1ico { width: 40px; height: 40px; border-radius: 12px; background: var(--w1-chip); color: var(--w1-ink); display: flex; align-items: center; justify-content: center; flex: none; }
:root:root body.w1 .w1zeile.fehlt .w1ico { background: var(--w1-rotbg); color: var(--w1-rot); }
:root:root body.w1 .w1tx { flex: 1; min-width: 0; display: flex; flex-direction: column; }
:root:root body.w1 .w1t { font-weight: 600; font-size: 16px; line-height: 1.3; color: var(--w1-ink); }
:root:root body.w1 .w1zeile[data-menue="notfall"] .w1t { color: var(--w1-rot); }
:root:root body.w1 .w1neu { font: 700 11px/1 var(--f-text); letter-spacing: .06em; border: 1.5px solid var(--w1-ink); border-radius: 6px; padding: 2px 5px; margin-right: 6px; vertical-align: 2px; display: inline-block; }
:root:root body.w1 .w1s { font-size: 14px; color: var(--w1-ink2); line-height: 1.35; font-weight: 400; margin-top: 1px; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
:root:root body.w1 .w1zeile.fehlt .w1s { color: var(--w1-rot); font-weight: 500; }
:root:root body.w1 .w1r { font: 700 17px var(--f-text); color: var(--w1-ink); }
:root:root body.w1 .w1ch { color: var(--w1-ink2); flex: none; display: flex; }
:root:root body.w1 .w1form { margin: 0; }
:root:root body.w1 details.w1d > summary,
:root:root body.w1 details.w1mehr > summary { list-style: none; }
:root:root body.w1 details.w1d > summary::after,
:root:root body.w1 details.w1d > summary::before,
:root:root body.w1 details.w1mehr > summary::after,
:root:root body.w1 details.w1mehr > summary::before { content: none; display: none; }
:root:root body.w1 details.w1d > summary::-webkit-details-marker,
:root:root body.w1 details.w1mehr > summary::-webkit-details-marker { display: none; }
:root:root body.w1 details.w1d[open] > summary .w1ch,
:root:root body.w1 details.w1mehr[open] > summary .w1ch { transform: rotate(90deg); }
:root:root body.w1 .w1inhalt { padding: 0 16px 14px 70px; }
:root:root body.w1 .w1inhalt .newsbody,
:root:root body.w1 .w1inhalt .newstitel { margin: 0 0 .75rem; font-size: 1rem; line-height: 1.45; color: var(--w1-ink); }
:root:root body.w1 .w1inhalt .msghead { font-size: .875rem; font-weight: 600; color: var(--w1-ink2); margin: 0 0 .25rem; }
:root:root body.w1 .w1inhalt .newsweg { margin: .5rem 0 0; }
:root:root body.w1 .w1inhalt .newsweg .btn { width: 100%; min-height: 48px; }
:root:root body.w1 details.w1d.oben > summary .w1t { font-size: 17px; }
:root:root body.w1 .w1wartet .w1liste > details.card,
:root:root body.w1 .w1wartet .w1liste > a.card { display: block; margin: 0; padding: 0; border: 0; border-radius: 0; background: transparent; box-shadow: none; position: static; }
:root:root body.w1 .w1wartet .w1liste > details.card > summary { display: grid; grid-template-columns: 40px minmax(0, 1fr) 18px; column-gap: 14px; align-items: center; min-height: 62px; margin: 0; padding: 10px 16px; list-style: none; cursor: pointer; }
:root:root body.w1 .w1wartet .w1liste > details.card > summary::-webkit-details-marker { display: none; }
:root:root body.w1 .w1wartet .w1liste > details.card > summary::after { content: ""; grid-column: 3; grid-row: 1 / 3; width: 18px; height: 18px; background: var(--w1-ink2); -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M9 5l7 7-7 7'/%3E%3C/svg%3E") center / contain no-repeat; mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M9 5l7 7-7 7'/%3E%3C/svg%3E") center / contain no-repeat; transform: none; border: 0; opacity: 1; position: static; inset: auto; mix-blend-mode: normal; }
:root:root body.w1 .w1wartet .w1liste > details.card[open] > summary::after { transform: rotate(90deg); }
:root:root body.w1 .w1wartet .w1liste > details.card > summary > .w1ico,
:root:root body.w1 .w1wartet .w1liste > a.card > .w1ico { grid-column: 1; grid-row: 1 / 3; }
:root:root body.w1 .w1wartet .w1liste > details.card > summary > h2 { grid-column: 2; grid-row: 1; margin: 0; font: 600 16px/1.3 var(--f-text); color: var(--w1-ink); letter-spacing: 0; }
:root:root body.w1 .w1wartet .w1liste > details.card > summary > .hint { grid-column: 2; grid-row: 2; margin: 0; font-size: 14px; font-weight: 400; color: var(--w1-ink2); }
:root:root body.w1 .w1wartet .w1liste > details.card > :not(summary) { margin: 0 16px 14px 70px; }
:root:root body.w1 .w1wartet .w1liste > details.card > .ubwer { margin-bottom: .5rem; }
:root:root body.w1 .w1wartet .w1liste > a.card { display: grid; grid-template-columns: 40px minmax(0, 1fr); column-gap: 14px; row-gap: 0; align-items: center; min-height: 62px; padding: 10px 16px; text-decoration: none; }
:root:root body.w1 .w1wartet .w1liste > a.card .phtitel { grid-column: 2; font: 600 16px/1.3 var(--f-text); letter-spacing: 0; text-transform: none; color: var(--w1-ink); }
:root:root body.w1 .w1wartet .w1liste > a.card .phtext { grid-column: 2; font: 400 14px/1.35 var(--f-text); color: var(--w1-rot); white-space: normal; text-decoration: none; }
:root:root body.w1 .w1wartet .w1liste > a.card::before,
:root:root body.w1 .w1wartet .w1liste > details.card > summary::before { content: none; }
:root:root body.w1 .card > summary > .w1ico,
:root:root body.w1 a.card > .w1ico { display: none; }
:root:root body.w1 .w1wartet .w1liste > a.card > .w1ico,
:root:root body.w1 .w1wartet .w1liste > details.card > summary > .w1ico { display: flex; }
:root:root body.w1 .w1wartet .w1liste > a.card > .w1ico { background: var(--w1-rotbg); color: var(--w1-rot); }
:root:root body.w1 .w1leer { text-align: center; padding: 36px 16px 8px; }
:root:root body.w1 .w1leer h2 { font: 700 20px var(--f-kopf); margin: 0; }
:root:root body.w1 .w1leer p { font-size: 15px; color: var(--w1-ink2); margin: 6px 0 0; }
:root:root body.w1 .w1leerzeichen { width: 72px; height: 72px; border-radius: 50%; background: var(--w1-chip); display: flex; align-items: center; justify-content: center; margin: 0 auto 14px; }
:root:root body.w1 .w1schicht { background: var(--w1-slab); color: var(--w1-slab-ink); border-radius: 28px; padding: 22px 22px 12px; margin: 0 0 4px; display: flex; flex-direction: column; border: 0; box-shadow: none; }
:root:root body.w1 .w1schicht a { color: var(--w1-slab-ink); }
:root:root body.w1 .w1schicht .hkdatum,
:root:root body.w1 .w1schicht .hkfreikopf b { order: 1; font: 600 13px/1 var(--f-text); letter-spacing: .08em; text-transform: uppercase; color: var(--w1-slab-ink2); margin: 0; }
:root:root body.w1 .w1schicht .hkzeit { order: 2; font: 400 60px/1 "Archivo Black", var(--f-text), sans-serif; letter-spacing: -.02em; margin: 10px 0 2px; color: var(--w1-slab-ink); white-space: nowrap; }
:root:root body.w1 .w1schicht .hkbis { font-size: 30px; opacity: .9; }
:root:root body.w1 .w1schicht .hkzeile { order: 3; font: 600 17px/1.3 var(--f-text); letter-spacing: 0; margin: 0; color: var(--w1-slab-ink); }
:root:root body.w1 .w1schicht .hkmit { order: 4; font-size: 15px; color: var(--w1-slab-ink2); margin: 2px 0 0; }
:root:root body.w1 .w1schicht .hkmit b { color: var(--w1-slab-ink); font-weight: 600; }
:root:root body.w1 .w1schicht .hkbtn { order: 5; margin: 18px 0 0; display: flex; flex-direction: column; gap: 8px; }
:root:root body.w1 .w1schicht .hkbtn form { margin: 0; }
:root:root body.w1 .w1schicht .hkbtn .btn,
:root:root body.w1 .w1schicht .hkzwei .btn,
:root:root body.w1 .w1schicht .hkzwei .bigbtn { width: 100%; min-height: 56px; border-radius: 18px; font: 700 18px var(--f-text); display: flex; align-items: center; justify-content: center; text-wrap: nowrap; }
:root:root body.w1 .w1schicht .hkbtn a.btn { background: var(--w1-act); color: var(--w1-on-act); border-color: var(--w1-act); text-decoration: none; }
:root:root body.w1 .w1schicht .hkfuss { order: 6; font-size: 13px; color: var(--w1-slab-ink2); margin: 8px 0 0; }
:root:root body.w1 .w1schicht .hkfuss a,
:root:root body.w1 .w1schicht .hklink { display: inline-flex; align-items: center; min-height: 48px; font-size: 15px; font-weight: 600; text-decoration: underline; text-underline-offset: 3px; color: var(--w1-slab-ink); }
:root:root body.w1 .w1schicht .hkfuss.hkspringen a,
:root:root body.w1 .w1schicht .hklink.leise { font-weight: 500; opacity: .95; }
:root:root body.w1 .w1schicht .hklinks { display: flex; flex-wrap: wrap; gap: 0 18px; align-items: center; }
:root:root body.w1 .w1schicht .hkkrankweg { margin-top: 2px; }
:root:root body.w1 .w1schicht .hkoffline { display: none; align-items: center; gap: 8px; font-size: 13px; color: var(--w1-slab-ink2); margin: 0; }
:root:root body.w1[data-offline] .w1schicht .hkoffline { display: flex; }
:root:root body.w1[data-offline] .w1schicht .st-beginnen,
:root:root body.w1[data-offline] .w1schicht .st-ende { opacity: 1; background: transparent; color: var(--w1-slab-ink); border: 2px solid var(--w1-slab-ink2); }
:root:root body.w1 .w1schicht .hklauf { order: 2; display: flex; align-items: baseline; gap: 10px; margin: 10px 0 2px; }
:root:root body.w1 .w1schicht .hkuhr,
:root:root body.w1 .w1schicht .stzahl { font: 400 60px/1 "Archivo Black", var(--f-text), sans-serif; letter-spacing: -.02em; color: var(--w1-slab-ink); }
:root:root body.w1 .w1schicht .hklauf .hkzeit { order: 0; font-size: 30px; margin: 0; opacity: .9; }
:root:root body.w1 .w1schicht.pausiert .hkuhr,
:root:root body.w1 .w1schicht.pausiert .stzahl { color: var(--w1-slab-ink); opacity: .85; }
:root:root body.w1 .w1schicht .hkzwei { order: 5; display: flex; flex-direction: column; gap: 8px; margin: 18px 0 0; }
:root:root body.w1 .w1schicht .hkzwei form { margin: 0; flex: none; width: 100%; }
:root:root body.w1 .w1schicht .hkzwei .btn.secondary { background: transparent; color: var(--w1-slab-ink); border: 2px solid var(--w1-slab-ink2); }
:root:root body.w1 .w1schicht .stpausezeile,
:root:root body.w1 .w1schicht .stpausehinweis { order: 5; font-size: 14px; color: var(--w1-slab-ink2); margin: 6px 0 0; }
:root:root body.w1 .w1schicht .stpause { order: 5; background: var(--w1-rotbg); color: var(--w1-ink); border-radius: 12px; }
:root:root body.w1 .w1schicht .hkfreikopf { order: 1; display: flex; justify-content: space-between; align-items: baseline; }
:root:root body.w1 .w1schicht .hkfreidatum { display: none; }
:root:root body.w1 .w1schicht .hkgross { order: 2; font: 400 52px/1 "Archivo Black", var(--f-text), sans-serif; margin: 10px 0 2px; }
:root:root body.w1 .w1schicht .hknaechste { order: 3; font-size: 17px; font-weight: 600; margin: 0 0 4px; color: var(--w1-slab-ink2); }
:root:root body.w1 .w1schicht .hknaechste b { color: var(--w1-slab-ink); font-weight: 700; }
:root:root body.w1 .w1schicht .hknaechste .hkzeit { font: 600 15px var(--f-text); letter-spacing: 0; margin: 0; color: var(--w1-slab-ink); white-space: normal; }
:root:root body.w1 .w1schicht .hknaechste .hkklein { font-size: 17px; font-weight: 600; color: var(--w1-slab-ink2); }
:root:root body.w1 .w1schicht .hknaechste .hkmit { display: block; font-size: 15px; }
:root:root body.w1 .w1schicht.hkkrank .hkzeit { font-size: 17px; }
:root:root body.w1 .stkarte { background: var(--w1-slab); color: var(--w1-slab-ink); border-radius: 28px; padding: 22px 22px 18px; }
:root:root body.w1 .stkarte .stunten,
:root:root body.w1 .stkarte .stheute,
:root:root body.w1 .stkarte .stmehr,
:root:root body.w1 .stkarte a { color: var(--w1-slab-ink2); }
:root:root body.w1 .stkarte .stzahl { color: var(--w1-slab-ink); font: 400 60px/1 "Archivo Black", var(--f-text), sans-serif; }
:root:root body.w1 .stkarte .statusdot { background: transparent; color: var(--w1-slab-ink); padding-left: 0; }
:root:root body.w1 .stkarte .btn,
:root:root body.w1 .stkarte .bigbtn { min-height: 56px; border-radius: 18px; font: 700 18px var(--f-text); }
:root:root body.w1 .stkarte .btn.secondary { color: var(--w1-slab-ink); border-color: var(--w1-slab-ink2); }
:root:root body.w1 .stkarte .st-beginnen { background: var(--w1-slab-start); color: var(--w1-slab-start-ink); border-color: var(--w1-slab-start); }
:root:root body.w1 .stkarte .st-ende { background: var(--w1-slab-ende); color: var(--w1-slab-ende-ink); border-color: var(--w1-slab-ende); }
:root:root body.w1 .js-ziehen .ziehknopf { border-radius: 99px; min-height: 60px; }
:root:root body.w1 .ziehgriff { background: var(--w1-card); color: var(--w1-ink); }
:root:root body.w1 .ziehknopf .ziehwort { font-weight: 700; }
:root:root body.w1 .w1streifen { display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); gap: 6px; }
:root:root body.w1 .w1tag { min-height: 66px; border-radius: 16px; background: var(--w1-card); display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 2px; font-size: 12px; font-weight: 600; color: var(--w1-ink2); text-decoration: none; position: relative; }
:root:root body.w1 .w1tag b { font: 700 18px var(--f-text); color: var(--w1-ink); }
:root:root body.w1 .w1tag.heute { background: var(--w1-heute); color: var(--w1-on-heute); }
:root:root body.w1 .w1tag.heute b { color: var(--w1-on-heute); }
:root:root body.w1 .w1tag.vorbei:not(.heute) { background: transparent; box-shadow: inset 0 0 0 1px var(--w1-line); }
:root:root body.w1 .w1tag.vorbei:not(.heute) b { color: var(--w1-ink2); font-weight: 600; }
:root:root body.w1 .w1tag i { width: 7px; height: 7px; display: block; border-radius: 50%; background: var(--w1-dot); }
:root:root body.w1 .w1tag i.leer { background: transparent; }
:root:root body.w1 .w1tag.heute i { background: var(--w1-on-heute); }
:root:root body.w1 .w1tag em { font-style: normal; font-weight: 700; font-size: 12px; color: var(--w1-cnt-ink); background: var(--w1-cnt-bg); border-radius: 99px; min-width: 20px; text-align: center; line-height: 16px; padding: 0 5px; }
:root:root body.w1 .w1tag.heute em { background: var(--w1-on-heute); color: var(--w1-heute); }
:root:root body.w1 .w1tag:focus-visible { outline: 2px solid var(--w1-act-ink); outline-offset: 2px; }
:root:root body.w1 .w1legende { margin: 8px 2px 0; font-size: 13px; color: var(--w1-ink2); font-weight: 500; }
:root:root body.w1 .w1entwurf { margin: 10px 2px 0; padding: .5rem .75rem; border-radius: 12px; background: var(--w1-chip); box-shadow: inset 3px 0 0 var(--w1-ink2); color: var(--w1-text-soft); font-size: .875rem; line-height: 1.4; }
:root:root body.w1 .w1entwurf b { color: var(--w1-ink); }
:root:root body.w1 .w1abschnitt .card.ersatzgesucht { margin-top: 14px; }
:root:root body.w1 .unterleiste { background: var(--w1-card); border: 0; border-top: 1px solid var(--w1-line); border-radius: 0; box-shadow: none; display: grid; grid-template-columns: repeat(4, 1fr); padding: 6px 8px max(6px, calc(env(safe-area-inset-bottom, 0px) - 4px)); }
:root:root body.w1 .unterleiste.zwei { grid-template-columns: repeat(2, 1fr); }
:root:root body.w1 .w1ziel { position: relative; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 3px; min-height: 56px; font-size: 12px; font-weight: 600; color: var(--w1-ink2); text-decoration: none; text-transform: none; letter-spacing: 0; }
:root:root body.w1 .w1ziel.aktiv { color: var(--w1-ink); }
:root:root body.w1 .w1pille { position: relative; width: 56px; height: 30px; border-radius: 15px; display: flex; align-items: center; justify-content: center; }
:root:root body.w1 .w1ziel.aktiv .w1pille { background: var(--w1-act); color: var(--w1-on-act); }
:root:root body.w1 .w1punkt { position: absolute; top: -5px; left: calc(50% + 8px); background: var(--w1-rot); color: var(--w1-rot-ink); font: 700 11px/1 var(--f-text); min-width: 19px; height: 19px; border-radius: 99px; display: flex; align-items: center; justify-content: center; padding: 0 5px; }
:root:root body.w1 .w1ziel:focus-visible { outline: 2px solid var(--w1-act-ink); outline-offset: -3px; }
:root:root body.w1 .w1suchfeld { display: flex; align-items: center; gap: 8px; margin: 0 0 6px; }
:root:root body.w1 .w1sf { flex: 1; display: flex; align-items: center; gap: 10px; min-height: 52px; background: var(--w1-card); border-radius: 26px; padding: 0 8px 0 16px; border: 2px solid var(--w1-act-rand); margin: 0; font-size: 17px; font-weight: 500; color: var(--w1-ink2); }
:root:root body.w1 .w1sf input { flex: 1; min-width: 0; border: 0; background: transparent; box-shadow: none; font: inherit; color: var(--w1-ink); min-height: 48px; padding: 0; }
:root:root body.w1 .w1sf input:focus { outline: none; box-shadow: none; border: 0; }
:root:root body.w1 .w1start .footer a,
:root:root body.w1 .w1start .help > a:only-child { display: inline-flex; align-items: center; min-height: 44px; padding: 0 10px; }
:root:root body.w1 .w1hilfe { font-size: 13px; color: var(--w1-ink2); font-weight: 500; margin: 10px 4px 0; line-height: 1.45; }
:root:root body.w1 .hublist2 .hubitemrow .hubsteuer,
:root:root body.w1 .hubitemrow .hubsteuer { flex: 0 1 auto; flex-wrap: wrap; justify-content: flex-end; min-width: 0; max-width: 100%; }
:root:root body.w1 .myplantime,
:root:root body.w1 .stschichtzeit { white-space: normal; }
:root:root body.w1 .kvgrid { grid-template-columns: repeat(auto-fit, minmax(min(260px, 100%), 1fr)); }
:root:root body.w1 .grid-2 { grid-template-columns: repeat(auto-fit, minmax(min(240px, 100%), 1fr)); }
:root:root body.w1 .rechtshinweis { margin: 0 0 1rem; padding: .25rem 0 .25rem 1rem; border-left: 4px solid var(--w1-zeit); }
:root:root body.w1 .rechtshinweis p { margin: 0 0 .25rem; }
:root:root body.w1 .w1schicht .hkzeit { white-space: normal; }
:root:root body.w1 .w1schicht .hkbis { display: inline-block; white-space: nowrap; }
:root:root body.w1 .nsz > summary b { min-width: 0; overflow-wrap: anywhere; }
:root:root body.w1 .nsz > summary span { min-width: 0; text-align: right; overflow-wrap: anywhere; }
:root:root body.w1 .nsliste > details > summary { padding-top: .5rem; padding-bottom: .5rem; }
:root:root body.w1 .skkopf { flex-wrap: wrap; row-gap: 0; }
:root:root body.w1 .skdeine,
:root:root body.w1 .skdeine .skbestaetigt,
:root:root body.w1 .skdeine .skwartet { overflow-wrap: anywhere; white-space: normal; }
:root:root body.w1 .abwzeile { flex-wrap: wrap; min-width: 0; max-width: 100%; }
:root:root body.w1 .abwname { overflow-wrap: anywhere; }
:root:root body.w1 .abwmarke { flex: 0 1 auto; max-width: 100%; overflow-wrap: anywhere; }
:root:root body.w1 .nfkontakt.leer .nfknr { flex: 0 1 auto; white-space: normal; text-align: right; }
:root:root body.w1 .nfbzeile { grid-template-columns: minmax(0, 1fr) auto; }
:root:root body.w1 .nfkontakte { grid-template-columns: minmax(0, 1fr); }
:root:root body.w1 .nfkontakt,
:root:root body.w1 .nfkontakt > * { min-width: 0; overflow-wrap: anywhere; }
:root:root body.w1 .nfbwas,
:root:root body.w1 .nfbwer,
:root:root body.w1 .nfbhinweis,
:root:root body.w1 .nfbwecken { min-width: 0; overflow-wrap: anywhere; white-space: normal; }
:root:root body.w1 .zkzeiten { grid-template-columns: repeat(auto-fit, minmax(min(100%, 9.5rem), 1fr)); }
:root:root body.w1 .zkzeiten label,
:root:root body.w1 .zkzeiten input,
:root:root body.w1 .zkform input[type="text"] { min-width: 0; max-width: 100%; }
:root:root body.w1 .emprow { grid-template-columns: minmax(0, 1fr); }
:root:root body.w1 .emprow .who,
:root:root body.w1 .emprow .meta,
:root:root body.w1 .emprow .zkstand { min-width: 0; overflow-wrap: anywhere; }
:root:root body.w1 .offlinestreifen { position: sticky; top: var(--safetop); z-index: 35; display: flex; gap: 10px; align-items: flex-start; background: var(--w1-off); color: var(--w1-ink); padding: 12px 16px; font-size: 14px; font-weight: 600; line-height: 1.35; text-align: left; border-bottom: 2px solid var(--w1-off-line); }
:root:root body.w1 .offlinestreifen svg { flex: none; margin-top: 2px; }
:root:root body.w1 .offlinestreifen span { font-weight: 500; }

:root:root body.w1 :where(a[href], button, summary, [role="button"], [role="tab"], [role="switch"], [tabindex]:not([tabindex="-1"]), input[type="checkbox"], input[type="radio"], label[for]):focus-visible { outline: 2px solid var(--w1-act-ink); outline-offset: 2px; }
:root:root body.w1 :is(.w1schicht, .stkarte) :where(a[href], button, summary, [role="button"], [role="tab"], [role="switch"], [tabindex]:not([tabindex="-1"]), input[type="checkbox"], input[type="radio"], label[for]):focus-visible { outline-color: var(--w1-slab-ink); }

@media (max-width: 340px) {
:root:root body.w1 main.wrap :is(div, span, label, a, p, li, h1, h2, h3, h4, b, strong, summary, form, section) { min-width: 0; overflow-wrap: anywhere; }
:root:root body.w1 .ekkopf > :last-child, :root:root body.w1 .ekzeile input:last-child { width: min(8.5rem, 42%); }
}


/* ===================================================================
   Tempo (23.10.2026) - siehe stil-tempo.js. Nach Welt 1, vor Hub und Wiki (zwei Pruefungen lesen die Abschnitte dahinter und erlauben dort keine eigenen Farbwerte).
   =================================================================== */
body.w1 :is(a, button, summary, label, select, input) { touch-action: manipulation; }
body.w1 :is(.w1ziel, .w1zeile, .w1lupe, .w1kreis, .w1tag, .w1alle, .w1kachel) { -webkit-tap-highlight-color: transparent; }
body.w1 .w1ziel:active .w1pille { transform: scale(.88); }
body.w1 .w1ziel:active { opacity: .7; }
body.w1 .w1zeile:active { background: var(--w1-fill); }
body.w1 :is(.w1lupe, .w1kreis, .w1tag, .w1alle):active { opacity: .6; }
body.w1 :is(.w1lupe, .w1kreis):active { transform: scale(.94); }

html::after {
  content: ''; position: fixed; top: 0; left: 0; right: 0; height: 3px; z-index: 2147483000;
  background: #FF7A1A; transform: scaleX(0); transform-origin: 0 50%; opacity: 0; pointer-events: none;
}
@media (prefers-color-scheme: dark) { :root:not([data-theme="light"])::after { background: #FF9A4D; } }
:root[data-theme="dark"]::after { background: #FF9A4D; }
html.w1laedt::after { opacity: 1; animation: w1laden 8s cubic-bezier(.1, .6, .3, 1) forwards; }
/* "Aktualisiert - Neu laden" (Wiki, Handbuch, Hand Outs, Notfall kommen aus dem Speicher des Geraets; siehe SWR_SCRIPT in views.js).
   Eine Pille, kein Platz in der Seite: der Inhalt unter dem Finger bewegt sich nie. UNTEN, ueber der Unterleiste - wie der Hinweis
   "Neue Version da." -, weil oben die Bedienung liegt (Zurueck, Lupe, Menue; die Pille deckte die Lupe zu). Tippziel 44 px, Farben der
   Welt 1 (dunkle Pille hell / helle Pille dunkel), mit Wort statt nur einer Farbe. */
body.w1 .w1frisch { position: fixed; bottom: calc(5.75rem + env(safe-area-inset-bottom, 0px)); left: 0; right: 0; z-index: 70; display: flex; justify-content: center; pointer-events: none; }
body.w1 .w1frisch button { pointer-events: auto; min-height: 44px; padding: 0 20px; border: 0; border-radius: 22px; background: var(--w1-seg); color: var(--w1-on-seg); font: 600 14px/1.2 var(--f-text); box-shadow: 0 2px 12px rgba(0, 0, 0, .28); cursor: pointer; -webkit-tap-highlight-color: transparent; }
body.w1 .w1frisch button:active { opacity: .75; }
body.w1 .w1frisch button:focus-visible { outline: 2px solid var(--w1-act-ink); outline-offset: 2px; }
@keyframes w1laden { from { transform: scaleX(.04); } to { transform: scaleX(.92); } }
@media (prefers-reduced-motion: reduce) { html.w1laedt::after { animation: none; transform: scaleX(.6); } }


/* ===================================================================
   Stempel-Tablet: Beginnen gruen, Beenden rot (23.10.2026) - siehe stil-kiosk-knoepfe.js.
   =================================================================== */
:root:root:root:root body:has(.kiosk) { --kiosk-start: #0F766E; --kiosk-start-ink: #FFFFFF; --kiosk-ende: #B3261E; --kiosk-ende-ink: #FFFFFF; }
@media (prefers-color-scheme: dark) {
  :root:root:root:root:not([data-theme="light"]) body:has(.kiosk) { --kiosk-start: #6AD596; --kiosk-start-ink: #0B1F14; --kiosk-ende: #FF6B63; --kiosk-ende-ink: #1C0A09; }
}
:root:root:root:root[data-theme="dark"] body:has(.kiosk) { --kiosk-start: #6AD596; --kiosk-start-ink: #0B1F14; --kiosk-ende: #FF6B63; --kiosk-ende-ink: #1C0A09; }

:root:root:root:root body:has(.kiosk) .bigbtn.st-beginnen, :root:root:root:root body:has(.kiosk) .btn.st-beginnen { background: var(--kiosk-start); background-image: none; color: var(--kiosk-start-ink); border: 1.5px solid var(--kiosk-start); box-shadow: none; font-weight: 700; }
:root:root:root:root body:has(.kiosk) .bigbtn.st-ende, :root:root:root:root body:has(.kiosk) .btn.st-ende { background: var(--kiosk-ende); background-image: none; color: var(--kiosk-ende-ink); border: 1.5px solid var(--kiosk-ende); box-shadow: none; font-weight: 700; }
:root:root:root:root body:has(.kiosk) .st-beginnen, :root:root:root:root body:has(.kiosk) .st-ende { display: flex; align-items: center; justify-content: center; gap: 10px; }
:root:root:root:root body:has(.kiosk) .bigbtn.st-beginnen:hover, :root:root:root:root body:has(.kiosk) .bigbtn.st-ende:hover, :root:root:root:root body:has(.kiosk) .btn.st-beginnen:hover, :root:root:root:root body:has(.kiosk) .btn.st-ende:hover { filter: brightness(.96); }
:root:root:root:root body:has(.kiosk) .st-beginnen .w1i, :root:root:root:root body:has(.kiosk) .st-ende .w1i { display: block; flex: none; }
/* Das Tablet wird im Stehen bedient: die Knoepfe der Rueckfrage sind mindestens 56 px hoch und breit (Mathieu, 23.10.2026). */
:root:root:root:root body:has(.kiosk) dialog .btn, :root:root:root:root body:has(.kiosk) dialog button { min-height: 56px; min-width: 96px; }


/* Hub und Wiki in Welt 1 (E3, 23.10.2026) - siehe stil-w1-hub.js */
:root:root body.w1 .w1hubsuche { margin: 0 0 6px; }
:root:root body.w1 .w1hubsuche label { display: flex; align-items: center; gap: 10px; min-height: 52px; box-sizing: border-box; background: var(--w1-card); border: 1px solid var(--w1-line); border-radius: 26px; padding: 0 18px; margin: 0; font: 400 16px/1.3 var(--f-text); color: var(--w1-ink2); cursor: text; }
:root:root body.w1 .w1hubsuche.wissensuche > label { text-transform: none; letter-spacing: 0; font-weight: 400; margin: 0; }
:root:root body.w1 .w1hubsuche.wissensuche { margin-bottom: 14px; }
:root:root body.w1 .w1hubsuche input[type=search] { flex: 1; min-width: 0; width: 100%; min-height: 48px; padding: 0; border: 0; background: transparent; box-shadow: none; font: inherit; color: var(--w1-ink); -webkit-appearance: none; appearance: none; }
:root:root body.w1 .w1hubsuche input[type=search]::placeholder { color: var(--w1-ink2); opacity: 1; }
:root:root body.w1 .w1hubsuche input[type=search]:focus { outline: none; box-shadow: none; border: 0; }
:root:root body.w1 .w1hubsuche label:focus-within { border-color: var(--w1-act-rand); box-shadow: 0 0 0 3px var(--w1-act-soft); }
:root:root body.w1 .w1hubsuche .w1i { flex: none; color: var(--w1-ink2); }
:root:root body.w1 .w1kachelraster { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 10px; }
:root:root body.w1 .w1kachel { position: relative; display: flex; flex-direction: column; justify-content: space-between; gap: 10px; box-sizing: border-box; min-height: 112px; padding: 14px; background: var(--w1-card); color: var(--w1-ink); border-radius: 22px; text-decoration: none; min-width: 0; }
:root:root body.w1 .w1kachel:hover { text-decoration: none; background: var(--w1-card); }
:root:root body.w1 .w1kachel:focus-visible { outline: 2px solid var(--w1-act-ink); outline-offset: 2px; }
:root:root body.w1 .w1kachel:active { filter: brightness(.96); }
:root:root body.w1 .w1disc { width: 44px; height: 44px; border-radius: 14px; background: var(--w1-disc); color: var(--w1-on-disc); display: flex; align-items: center; justify-content: center; flex: none; }
:root:root body.w1 .w1kn { position: absolute; top: 12px; right: 12px; min-width: 32px; height: 32px; box-sizing: border-box; padding: 0 9px; border-radius: 99px; background: var(--w1-cnt-bg); color: var(--w1-cnt-ink); font: 700 17px/1 var(--f-text); display: flex; align-items: center; justify-content: center; }
:root:root body.w1 .w1kx { display: flex; flex-direction: column; gap: 1px; min-width: 0; }
:root:root body.w1 .w1kt { font: 700 15px/1.2 var(--f-kopf); letter-spacing: -.01em; color: var(--w1-ink); overflow-wrap: break-word; hyphens: manual; }
:root:root body.w1 .w1ks { font: 500 13px/1.35 var(--f-text); color: var(--w1-ink2); display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; overflow-wrap: anywhere; }
:root:root body.w1 .w1kachel.breit { grid-column: 1 / 3; min-height: 76px; flex-direction: row; align-items: center; justify-content: flex-start; gap: 14px; }
:root:root body.w1 .w1kachel.breit .w1kx { flex: 1 1 auto; }
:root:root body.w1 .w1kachel.breit .w1ks { -webkit-line-clamp: 3; }
:root:root body.w1 .w1kachel.breit .w1kn { position: static; margin-left: auto; flex: none; order: 3; }
:root:root body.w1 .w1kachelraster.w1kachelliste { margin-bottom: 16px; }
:root:root body.w1 .w1kachel.fertig .w1disc { background: var(--w1-okbg); color: var(--w1-ok); }
:root:root body.w1 .w1kachel.faellig .w1disc { background: var(--w1-act-soft); color: var(--w1-act-ink); }
:root:root body.w1 .w1kachel.faellig .w1ks { color: var(--w1-act-ink); font-weight: 600; }
:root:root body.w1 .w1kachel.rot { grid-column: 1 / 3; min-height: 76px; flex-direction: row; align-items: center; justify-content: flex-start; gap: 14px; background: var(--w1-rotbg); color: var(--w1-rot); }
:root:root body.w1 .w1kachel.rot:hover { background: var(--w1-rotbg); }
:root:root body.w1 .w1kachel.rot .w1disc { background: var(--w1-rot); color: var(--w1-bg); }
:root:root body.w1 .w1kachel.rot .w1kt,
:root:root body.w1 .w1kachel.rot .w1ks { color: var(--w1-rot); }
:root:root body.w1 .w1kachel.rot .w1ks { font-weight: 600; -webkit-line-clamp: 3; }
:root:root body.w1 .w1kachel.rot:focus-visible { outline-color: var(--w1-rot); }
:root:root body.w1 .w1notfall .w1hilfe { margin-top: 10px; }
:root:root body.w1 .w1pillen { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; }
:root:root body.w1 .w1pillen a { display: flex; flex-direction: column; justify-content: space-between; gap: 8px; box-sizing: border-box; min-height: 92px; padding: 12px; background: var(--w1-card); color: var(--w1-ink); border-radius: 18px; font: 600 14px/1.25 var(--f-text); text-decoration: none; overflow-wrap: anywhere; min-width: 0; }
:root:root body.w1 .w1pillen a:hover { text-decoration: none; }
:root:root body.w1 .w1pillen a:focus-visible { outline: 2px solid var(--w1-act-ink); outline-offset: 2px; }
:root:root body.w1 .w1hub .kioskstart { margin: 0 0 12px; }
:root:root body.w1 .w1grosslink { display: inline-flex; align-items: center; min-height: 44px; }
:root:root body.w1 .w1nachrichten .msghead b { color: var(--w1-act-ink); }


/* Status-Knopf ohne Neuladen (23.10.2026) - siehe stil-hub-still.js */
.hublist2 .hubitemrow .statuspill { min-width: 6.5rem; transition: transform .06s ease, box-shadow .17s ease, filter .1s ease, background-color .17s ease, color .17s ease, border-color .17s ease; }
.hublist2 .hubitemrow .statuspill .ic2 { transition: background-color .17s ease, color .17s ease; }
.hublist2 .hubitemrow .statuspill.wird { transform: scale(.95); filter: brightness(.92); }
.hublist2 .hubitemrow .statuspill.pop { animation: statuspop .2s ease-out; }
@keyframes statuspop { 0% { transform: scale(.95); } 60% { transform: scale(1.04); } 100% { transform: scale(1); } }
.hubitemrow[aria-busy="true"] .statuspill { cursor: progress; }
/* Was nach einem Fehlschlag oder einem Konflikt unter der Zeile steht. Eine Zeile Text, kein Dialog. */
.statusmeldung { margin: .35rem .25rem 0; padding: .5rem .75rem; border-radius: var(--radius-xs); background: var(--warn-soft); color: var(--text); font-size: .875rem; line-height: 1.4; border-left: 4px solid var(--warn); }
@media (prefers-reduced-motion: reduce) {
  .hublist2 .hubitemrow .statuspill, .hublist2 .hubitemrow .statuspill .ic2 { transition: none; }
  .hublist2 .hubitemrow .statuspill.wird { transform: none; }
  .hublist2 .hubitemrow .statuspill.pop { animation: none; }
}


/* Seite bleibt stehen (24.10.2026) - siehe stil-stehen.js */
.stehtoast-ort { position: sticky; bottom: 8px; height: 0; z-index: 40; pointer-events: none; }
.stehtoast { position: absolute; left: 0; right: 0; bottom: 0; box-sizing: border-box; width: calc(100% - 24px); max-width: 520px; margin: 0 auto; display: flex; align-items: center; gap: .5rem; min-height: 44px; padding: .15rem .15rem .15rem .9rem; border-radius: var(--radius-xs, 10px); background: var(--surface); color: var(--text); border: 1px solid var(--border-strong, var(--border)); border-left: 4px solid var(--ok); box-shadow: 0 2px 12px rgba(0, 0, 0, .16); font-size: .875rem; line-height: 1.35; pointer-events: auto; animation: stehein .18s ease-out; }
.stehtoast.err { border-left-color: var(--warn); }
.stehtext { flex: 1; min-width: 0; overflow-wrap: anywhere; }
.stehzu { flex: none; width: 44px; height: 44px; padding: 0; border: 0; border-radius: 50%; background: transparent; color: var(--text); font: inherit; font-size: 1rem; line-height: 1; cursor: pointer; }
@keyframes stehein { from { opacity: 0; transform: translateY(6px); } }
.still-wird { opacity: .65; transform: scale(.97); transition: opacity .1s ease, transform .06s ease; cursor: progress; }
[data-still-zeile] { position: relative; }
.still-ok, .still-fehler { position: relative; }
.still-ok::after, .still-fehler::after { position: absolute; top: -.5rem; right: -.4rem; z-index: 2; display: grid; place-items: center; width: 1.35rem; height: 1.35rem; border-radius: 50%; font: 700 .8rem/1 var(--f-text); pointer-events: none; animation: stehhaken .22s ease-out; }
.still-ok::after { content: "\2713"; background: var(--ok); color: var(--ok-ink); }
.still-fehler::after { content: "!"; background: var(--warn); color: var(--crit-ink); }
[data-still-zeile].still-ok { animation: stehzeile 1.4s ease-out; }
[data-still-zeile].still-fehler { box-shadow: inset 0 0 0 2px var(--warn); }
@keyframes stehhaken { from { transform: scale(.4); opacity: 0; } 70% { transform: scale(1.15); } to { transform: scale(1); opacity: 1; } }
@keyframes stehzeile { from { box-shadow: inset 0 0 0 2px var(--ok); } to { box-shadow: inset 0 0 0 2px transparent; } }
.still-neu { animation: stehneu .9s ease-out; }
@keyframes stehneu { from { opacity: .45; } to { opacity: 1; } }
/* Der klebende Speichern-Streifen stand mit bottom: 0 UNTER der festen Unterleiste (gemessen 24.10.2026, Inventur, 390 px: Streifen
   759-803 px, Leiste ab 767 px) - mitten in der Liste war "Speichern" verdeckt und erschien erst am Listenende. Er klebt jetzt
   ueber der Leiste (dieselbe Reserve wie das Polster des Seitenfusses: 83 px plus Sicherheitszone). Am Rechner hat die Planung
   keine Leiste unten. */
body:has(.unterleiste) .sticky-save { bottom: calc(83px + env(safe-area-inset-bottom, 0px)); }
@media (min-width: 1000px) { body.mit-seite:has(.planleiste) .sticky-save { bottom: 0; } }
/* Ein Anker (#zeile) landet nicht am obersten Rand des Fensters, sondern mit etwas Luft darueber. */
main [id] { scroll-margin-top: 1rem; }
@media (prefers-reduced-motion: reduce) {
  .stehtoast, .still-ok::after, .still-fehler::after, [data-still-zeile].still-ok, .still-neu { animation: none; }
  .still-wird { transition: none; transform: none; }
}


/* Fotos an To-Dos (24.10.2026) - siehe stil-todo-bilder.js */
.tbknopf { gap: .25rem; }
.tbknopf[hidden] { display: none; }
.tbknopf .w1i { flex: none; }
.tbblock { margin: 0; }
.tbzeile { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem .75rem; padding: 0 0 .75rem; }
.tbpille { flex: none; display: inline-flex; align-items: center; min-height: 28px; padding: 0 .65rem; border-radius: var(--radius-pille); background: var(--fill); color: var(--text); font-size: .75rem; font-weight: 700; }
.tbliste { display: flex; flex-wrap: wrap; gap: .5rem; margin: 0; padding: 0; list-style: none; }
.tbliste li { margin: 0; padding: 0; }
.tbthumb { display: block; box-sizing: border-box; width: 48px; height: 48px; border-radius: var(--radius-xs); border: 1px solid var(--hair-strong); background: var(--surface-2); overflow: hidden; color: transparent; }
.tbthumb img { display: block; width: 100%; height: 100%; object-fit: cover; color: transparent; font-size: 0; }
.tbthumb:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.tbchips { display: flex; flex-direction: column; gap: .4rem; margin: 0; padding: 0; list-style: none; }
.tbchips:empty { display: none; }
.tbblock > .tbchips:not(:empty) { padding-bottom: .75rem; }
.tbchip { display: flex; align-items: center; gap: .5rem; box-sizing: border-box; min-height: 48px; padding: 0; border-radius: var(--radius-xs); background: var(--surface); box-shadow: inset 0 0 0 1px var(--hair-strong); overflow: hidden; }
.tbchip[data-zustand="fertig"] { box-shadow: inset 4px 0 0 var(--ok), inset 0 0 0 1px var(--hair-strong); }
.tbchip[data-zustand="fehler"] { background: var(--warn-soft); box-shadow: inset 4px 0 0 var(--warn), inset 0 0 0 1px var(--warn); }
.tbvor { flex: none; display: grid; place-items: center; align-self: stretch; width: 48px; min-height: 48px; border-radius: 0; background: var(--fill); color: var(--text-soft); overflow: hidden; }
.tbvor img { display: block; width: 100%; height: 100%; object-fit: cover; }
.tbvor img[hidden] { display: none; }
.tbvor.hat-bild .tbvorzeichen { display: none; }
.tbinfo { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; gap: .3rem; }
.tbtext { font-size: .875rem; line-height: 1.3; color: var(--text); overflow-wrap: anywhere; }
.tbbalken { display: block; height: 4px; border-radius: 2px; background: var(--hair-strong); overflow: hidden; }
.tbbalken[hidden] { display: none; }
.tbbalken i { display: block; width: 0; height: 100%; background: var(--accent); transition: width .15s linear; }
.tbchip[data-zustand="bereit"] .tbbalken i { width: 25%; }
.tbx, .tbnochmal { flex: none; min-height: 44px; font: inherit; cursor: pointer; }
.tbx { display: grid; place-items: center; width: 44px; border: 0; border-radius: 50%; background: transparent; color: var(--text); }
.tbx:hover { background: var(--fill); }
.tbnochmal { padding: 0 .85rem; border: 1px solid var(--text); border-radius: var(--radius-pille); background: transparent; color: var(--text); font-size: .875rem; font-weight: 600; }
.tbnochmal[hidden] { display: none; }
.tbx:focus-visible, .tbnochmal:focus-visible, .tbpfeil:focus-visible, .tbloesch:focus-visible, .tbzu:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.tbform { display: flex; flex-direction: column; align-items: flex-start; gap: .5rem; padding: 0 0 .75rem; }
.tbform label { margin: 0; }
.tbdatei { max-width: 100%; font: inherit; }
.tbdatei-versteckt { position: absolute; left: -9999px; width: 1px; height: 1px; opacity: 0; pointer-events: none; }
/* Das Feld im Fenster "To-Do melden" */
.tbneu[hidden] { display: none; }
.tbneu .tblabel { display: block; margin-bottom: .25rem; font-weight: 600; font-size: .875rem; color: var(--text); }
.tbneuzeile { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem .75rem; }
.tbwahl { display: inline-flex; align-items: center; gap: .4rem; min-height: 44px; }
.tbneu .tbchips { flex: 1 1 100%; }
.tbneu .tbchips:not(:empty) { margin-top: .25rem; }
.tbhinweis-feld { flex: 1 1 12rem; margin: 0; }
.tbfehlhinweis { margin: .5rem 0 0; padding: .5rem .75rem; border-radius: var(--radius-xs); border-left: 4px solid var(--warn); background: var(--warn-soft); color: var(--text); font-size: .875rem; line-height: 1.4; }
/* Das Blatt zum Ansehen: Papier (hell) bzw. Schwarz (dunkel) wie die Seite, das Foto auf dem Ton darunter */
.tbblatt { box-sizing: border-box; width: 100%; max-width: none; height: 100%; max-height: none; margin: 0; padding: 0; border: 0; background: var(--bg); color: var(--text); }
.tbblatt[open] { display: flex; flex-direction: column; }
.tbblatt::backdrop { background: rgba(0, 0, 0, .6); }
.tbkopf { flex: none; display: flex; align-items: center; justify-content: space-between; gap: .5rem; padding: max(.5rem, env(safe-area-inset-top, 0px)) .75rem .5rem 1rem; }
.tbzahl { font-size: 1rem; font-weight: 700; }
.tbzu, .tbpfeil { flex: none; display: grid; place-items: center; box-sizing: border-box; width: 44px; height: 44px; padding: 0; border: 1px solid var(--hair-strong); border-radius: 50%; background: var(--surface); color: var(--text); cursor: pointer; }
.tbpfeil[aria-disabled="true"] { opacity: .35; cursor: default; }
.tbspur { flex: 1 1 auto; min-height: 0; display: flex; overflow-x: auto; overflow-y: hidden; scroll-snap-type: x mandatory; overscroll-behavior: contain; background: var(--surface-2); }
.tbfolie { flex: 0 0 100%; box-sizing: border-box; margin: 0; padding: .5rem; scroll-snap-align: center; scroll-snap-stop: always; }
.tbfolie img { display: block; width: 100%; height: 100%; object-fit: contain; }
.tbfuss { flex: none; display: flex; flex-direction: column; gap: .5rem; padding: .6rem 1rem max(.75rem, env(safe-area-inset-bottom, 0px)); }
.tbunterschrift { margin: 0; min-height: 1.3em; font-size: .875rem; line-height: 1.3; color: var(--text-soft); }
.tbsteuer { display: flex; align-items: center; gap: .5rem; }
.tbloesch { margin-left: auto; min-height: 44px; padding: 0 1rem; border: 1px solid var(--warn); border-radius: var(--radius-pille); background: transparent; color: var(--warn); font: inherit; font-size: .875rem; font-weight: 700; cursor: pointer; }
.tbloesch[hidden] { display: none; }
.tbloesch[data-sicher="1"] { background: var(--warn); color: var(--crit-ink); }
@media (prefers-reduced-motion: reduce) {
  .tbbalken i { transition: none; }
}


/* Namenwahl (24.10.2026) - siehe stil-namenwahl.js */
[data-nw-an][hidden] { display: none !important; }
.nw { position: relative; max-width: 100%; }
.nw-kasten { position: relative; }
.nw-blattkopf { display: none; }
.nw-zeile { position: relative; }
.nw-zeile::before { content: ""; position: absolute; left: .8rem; top: 50%; width: .62rem; height: .62rem; margin-top: -.42rem; border: 2px solid var(--muted); border-radius: 50%; pointer-events: none; }
.nw-zeile::after { content: ""; position: absolute; left: 1.45rem; top: 50%; width: 2px; height: .4rem; margin-top: .1rem; background: var(--muted); transform: rotate(-45deg); pointer-events: none; }
.nw .nw-feld { width: 100%; min-height: 44px; padding-left: 2.2rem; font-size: max(16px, 1rem); text-overflow: ellipsis; }
.nw-eins .nw-feld { padding-right: 2rem; background-image: linear-gradient(45deg, transparent 49%, currentColor 50%), linear-gradient(-45deg, transparent 49%, currentColor 50%); background-size: 6px 6px, 6px 6px; background-position: calc(100% - 1.05rem) calc(50% + 2px), calc(100% - .7rem) calc(50% + 2px); background-repeat: no-repeat; }
.nw-eins.nw-offen .nw-feld { background-image: none; }
.nw .nw-feld:focus { outline: 2px solid var(--accent); outline-offset: 1px; }
.nw .nw-feld::placeholder { color: var(--muted); font-style: normal; opacity: 1; }
/* Die Liste ist mindestens 22rem breit, auch wenn das Feld schmaler ist (Einteilen: 237 px): Name UND Zusatz sollen in eine Zeile passen. */
.nw-liste { position: absolute; left: 0; top: calc(100% + 4px); z-index: 60; width: max(100%, 22rem); max-width: calc(100vw - 32px); max-height: min(380px, 62vh); overflow-y: auto; overscroll-behavior: contain; background: var(--surface); color: var(--text); border: 1px solid var(--border-strong); border-radius: var(--radius-xs, 8px); box-shadow: var(--shadow-lift); padding: .25rem 0; text-align: left; font-weight: 400; }
.nw-liste[hidden] { display: none; }
.nw-gruppe + .nw-gruppe { border-top: 1px solid var(--hair); margin-top: .25rem; padding-top: .1rem; }
.nw-gkopf { padding: .45rem .8rem .2rem; font-size: .75rem; font-weight: 600; letter-spacing: .04em; text-transform: uppercase; color: var(--muted); }
.nw-opt { display: flex; align-items: center; gap: .6rem; min-height: 32px; padding: .3rem .8rem; cursor: pointer; line-height: 1.3; font-size: 1rem; }
.nw-opt:hover { background: var(--fill); }
.nw-opt.nw-aktiv { background: var(--accent-soft); box-shadow: inset 3px 0 0 var(--accent); }
.nw-name { flex: 0 0 auto; max-width: 68%; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 600; color: var(--text); }
.nw-info { flex: 1 1 0; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; text-align: right; font-size: .875rem; color: var(--muted); }
.nw-opt.nw-ged .nw-name { font-weight: 400; color: var(--muted); }
.nw-opt.nw-aus { cursor: not-allowed; }
.nw-opt.nw-aus .nw-name { font-weight: 400; color: var(--text-aus, var(--muted)); text-decoration: line-through; }
.nw-opt.nw-aus:hover { background: transparent; }
.nw-opt.nw-leer .nw-name { font-weight: 600; font-style: italic; }
.nw-opt[aria-selected="true"]:not(.nw-aktiv) .nw-name { text-decoration: underline; text-underline-offset: 3px; }
.nw-haken { flex: none; position: relative; width: 18px; height: 18px; box-sizing: border-box; border: 1.5px solid var(--feldrand); border-radius: 4px; background: var(--surface); }
.nw-opt[aria-selected="true"] .nw-haken { background: var(--accent); border-color: var(--accent); }
.nw-opt[aria-selected="true"] .nw-haken::after { content: ""; position: absolute; left: 4.5px; top: 1px; width: 5px; height: 9px; border: solid var(--accent-ink); border-width: 0 2px 2px 0; transform: rotate(45deg); }
.nw-hinweis { margin: 0; padding: .5rem .8rem; color: var(--muted); font-size: .875rem; }
.nw-allezeigen { display: block; width: 100%; min-height: 36px; margin-top: .25rem; padding: .4rem .8rem; border: 0; border-top: 1px solid var(--hair); background: none; color: var(--accent); font: inherit; font-size: .875rem; font-weight: 600; text-align: left; text-decoration: underline; text-underline-offset: 3px; cursor: pointer; }
.nw-chips { display: flex; flex-wrap: wrap; gap: .4rem; margin-bottom: .45rem; }
.nw-chip { display: inline-flex; align-items: center; max-width: 100%; min-height: 32px; padding-left: .75rem; border: 1px solid var(--accent); border-radius: var(--radius-pille, 999px); color: var(--accent); background: transparent; font-size: .875rem; font-weight: 600; line-height: 1.2; }
.nw-chipname { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.nw-chipweg { flex: none; width: 32px; height: 32px; padding: 0; border: 0; border-radius: 50%; background: none; color: inherit; font: inherit; font-size: .75rem; line-height: 1; cursor: pointer; }
.nw-chipweg:hover, .nw-chipweg:focus-visible { background: var(--accent-soft); }
.nw-alle { min-height: 32px; padding: 0 .85rem; border: 1px solid var(--accent); border-radius: var(--radius-pille, 999px); background: transparent; color: var(--accent); font: inherit; font-size: .875rem; font-weight: 600; cursor: pointer; }
.nw-alle[aria-pressed="true"] { background: var(--accent); color: var(--accent-ink); }
.nw-vh { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }
@media (max-width: 699px), (pointer: coarse) {
  .nw-opt { min-height: 44px; }
  .nw-chip, .nw-alle { min-height: 44px; }
  .nw-chipweg { width: 44px; height: 44px; }
  .nw-allezeigen { min-height: 44px; }
}
.nw-kasten.nw-blatt { position: fixed; left: 0; right: 0; top: 0; height: 100vh; z-index: 310; display: flex; flex-direction: column; box-sizing: border-box; padding: max(.5rem, env(safe-area-inset-top, 0px)) 16px 0; background: var(--bg); color: var(--text); }
.nw-blatt .nw-blattkopf { display: flex; align-items: center; justify-content: space-between; gap: .5rem; min-height: 44px; }
.nw-blatttitel { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 700; font-size: 1rem; }
.nw-fertig { flex: none; min-height: 44px; min-width: 44px; padding: 0 .25rem 0 .9rem; border: 0; background: none; color: var(--accent); font: inherit; font-weight: 700; text-decoration: underline; text-underline-offset: 3px; cursor: pointer; }
.nw-blatt .nw-chips { max-height: 30vh; overflow-y: auto; }
.nw-blatt .nw-liste { position: static; width: auto; max-width: none; flex: 1 1 auto; min-height: 0; max-height: none; margin: .5rem -16px 0; padding-bottom: env(safe-area-inset-bottom, 0px); border: 0; border-top: 1px solid var(--hair); border-radius: 0; box-shadow: none; background: var(--surface); }
html.nw-blatt-offen, html.nw-blatt-offen body { overflow: hidden; }


/* --- Nr. 6: Zusammenhang am Antrag --- */
.zh { list-style: none; margin: .45rem 0 .1rem; padding: 0; display: flex; flex-wrap: wrap; gap: .3rem .35rem; }
.zh li { font-size: .75rem; line-height: 1.3; padding: .2rem .5rem; border-radius: 999px; background: var(--fill); color: var(--text); border: 1px solid var(--hair); }
.zh .zh-ok { background: var(--ok-soft); color: var(--ok); border-color: transparent; }
.zh .zh-warn { background: var(--crit-soft); color: var(--crit); border-color: transparent; font-weight: 600; }
.zh.zh-rechner { margin: 0; padding: 0 0 .5rem .9rem; }
.zh.zh-rechner.dringend { box-shadow: inset 4px 0 0 var(--crit); padding-left: .75rem; margin-left: 0; }
.zh.zh-handy li { font-size: .75rem; }

/* --- Nr. 10: Rueckgaengig (klebt ueber der Leiste unten, Hoehe 0 wie .stehtoast-ort) --- */
.rgort { position: sticky; bottom: 8px; height: 0; z-index: 41; pointer-events: none; }
.rgleiste { position: absolute; left: 0; right: 0; bottom: 0; box-sizing: border-box; width: calc(100% - 24px); max-width: 640px; margin: 0 auto; display: flex; align-items: center; gap: .5rem; min-height: 48px; padding: .25rem .25rem .25rem 1rem; border-radius: var(--radius-xs, 10px); background: var(--accent); color: var(--accent-ink); box-shadow: var(--shadow-lift); font-size: .875rem; line-height: 1.35; pointer-events: auto; animation: rgein .18s ease-out; }
.rgtext { flex: 1; min-width: 0; overflow-wrap: anywhere; }
.rgform { margin: 0; flex: none; }
.rgknopf { min-height: 44px; padding: 0 .9rem; border: 0; border-radius: 8px; background: transparent; color: var(--accent-ink); font: inherit; font-weight: 700; cursor: pointer; white-space: nowrap; }
.rgwort { text-decoration: underline; text-underline-offset: 3px; }
.rgknopf:hover, .rgknopf:focus-visible { background: var(--accent-hover); }
.rgsek { font-weight: 400; font-variant-numeric: tabular-nums; text-decoration: none; display: inline-block; min-width: 2.2em; opacity: .85; }
.rgnach { flex: none; font-size: .75rem; opacity: .85; padding: 0 .5rem; }
.rgzu { flex: none; width: 44px; height: 44px; padding: 0; border: 0; border-radius: 50%; background: transparent; color: var(--accent-ink); font: inherit; cursor: pointer; }
/* Am Handy: der Satz ueber die ganze Breite, darunter Knopf und Schliessen - sonst steht der Satz in einer schmalen Spalte. */
@media (max-width: 600px) { .rgleiste { flex-wrap: wrap; row-gap: 0; padding-top: .55rem; } .rgtext { flex-basis: calc(100% - 52px); } .rgzu { order: 1; align-self: flex-start; margin-top: -.4rem; } .rgform, .rgnach { order: 2; } .rgform { margin-left: -.9rem; flex: 1; } }
@keyframes rgein { from { opacity: 0; transform: translateY(6px); } }
@media (prefers-reduced-motion: reduce) { .rgleiste { animation: none; } }

/* --- Nr. 15: Zeitstrahl --- */
.awzkopfzeile { flex-wrap: wrap; }
.awznav { margin-left: auto; display: flex; gap: .35rem; }
.awzscroll { overflow-x: auto; margin: .5rem -.25rem 0; padding: 0 .25rem .25rem; }
.awzraster { --awz-name: 9.5rem; min-width: calc(var(--awz-name) + var(--awz-tage) * 1.3rem); user-select: none; -webkit-user-select: none; }
.awzzeile { display: grid; grid-template-columns: var(--awz-name) repeat(var(--awz-tage), minmax(1.3rem, 1fr)); align-items: stretch; min-height: 2rem; border-bottom: 1px solid var(--hair); }
.awzzeile > * { grid-row: 1; }
.awzname { grid-column: 1; position: sticky; left: 0; z-index: 3; background: var(--surface); display: flex; align-items: center; padding-right: .4rem; font-size: .875rem; font-weight: 600; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
.awzname a { color: var(--text); text-decoration: none; overflow: hidden; text-overflow: ellipsis; }
.awzname a:hover, .awzname a:focus-visible { text-decoration: underline; }
.awzkopf { min-height: 2.2rem; border-bottom-color: var(--hair-strong); }
.awzkt { display: flex; flex-direction: column; align-items: center; justify-content: center; font-size: .75rem; font-variant-numeric: tabular-nums; color: var(--muted); line-height: 1.1; position: relative; }
.awzkt small { font-size: .625rem; text-transform: uppercase; }
.awzkt b { position: absolute; top: 0; right: 2px; color: var(--crit); font-size: .75rem; }
.awzkt.h { color: var(--accent); font-weight: 700; }
.awztag { display: block; touch-action: pan-y; cursor: crosshair; }
.awztag.we, .awzkt.we { background: var(--fill); }
.awztag.ft { background: var(--crit-soft); opacity: .55; }
.awztag.mo, .awzkt.mo, .awzn.mo { border-left: 1px solid var(--hair); }
.awztag.h, .awzn.h { box-shadow: inset 2px 0 0 var(--accent); }
.awztag.awz-wahl { background: var(--accent-soft); box-shadow: inset 0 0 0 1px var(--accent); }
.awzbalken { z-index: 2; margin: .3rem 1px; border-radius: 6px; display: flex; align-items: center; min-width: 0; padding: 0 .35rem; font-size: .75rem; font-weight: 600; text-decoration: none; overflow: hidden; white-space: nowrap; border: 1px solid transparent; }
.awzbalken span { overflow: hidden; text-overflow: ellipsis; }
.awzbalken.awz-urlaub { background: var(--ok-soft); color: var(--ok); }
.awzbalken.awz-krank { background: var(--crit); color: var(--crit-ink); }
.awzbalken.awz-sonst { background: var(--accent-soft); color: var(--accent); }
.awzbalken.offen { background: var(--surface); border: 1.5px dashed currentColor; }
.awzbalken.ab { border-top-left-radius: 0; border-bottom-left-radius: 0; }
.awzbalken.bis { border-top-right-radius: 0; border-bottom-right-radius: 0; }
.awzbalken:hover, .awzbalken:focus-visible { box-shadow: 0 0 0 2px var(--accent); outline: none; }
.awzfuss { border-bottom: 0; min-height: 1.8rem; }
.awzfuss .awzname { font-weight: 400; color: var(--muted); font-size: .75rem; }
.awzn { display: flex; align-items: center; justify-content: center; font-size: .75rem; font-weight: 700; font-variant-numeric: tabular-nums; color: var(--text); }
.awzn.leer { color: var(--muted); }
.awzlegende { display: flex; flex-wrap: wrap; gap: .4rem .9rem; margin: .6rem 0 0; font-size: .75rem; color: var(--muted); }
.awzl { display: inline-flex; align-items: center; gap: .3rem; }
.awzl::before { content: ""; width: 1.1rem; height: .7rem; border-radius: 3px; background: var(--fill); border: 1px solid transparent; }
.awzl.awz-urlaub::before { background: var(--ok-soft); }
.awzl.awz-krank::before { background: var(--crit); }
.awzl.awz-sonst::before { background: var(--accent-soft); }
.awzl.offen::before { background: var(--surface); border: 1.5px dashed var(--ok); }
.awzl.ft::before { background: var(--crit-soft); }
.awzl.h::before { width: 2px; background: var(--accent); }

/* Eintragen, Details */
.abeneu { margin-left: auto; }
.abeform { display: grid; gap: .6rem; }
.abedaten { display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: .6rem; }
.abdetails { border-left: 4px solid var(--accent); }
.abeloeschen { display: flex; align-items: center; gap: .6rem; margin-top: .6rem; }

/* --- Nr. 12: geplant gegen gestempelt --- */
.pgteil { margin: 1rem 0 1.4rem; padding-top: .4rem; border-top: 1px solid var(--hair); }
.pgnachperson { font-size: 1rem; margin: .4rem 0 .2rem; }
.pgfilterzeile { display: flex; flex-wrap: wrap; gap: .35rem; margin: .3rem 0 .6rem; }
.pgfilter { display: inline-flex; align-items: center; gap: .35rem; min-height: 36px; padding: 0 .8rem; border-radius: 999px; border: 1px solid var(--border-strong); color: var(--text); text-decoration: none; font-size: .875rem; }
.pgfilter b { font-variant-numeric: tabular-nums; }
.pgfilter.aktiv { background: var(--accent); color: var(--accent-ink); border-color: var(--accent); }
.pgtabelle td, .pgtabelle th { vertical-align: top; }
.pgtag th { text-align: left; font-size: .75rem; text-transform: uppercase; letter-spacing: .04em; color: var(--muted); padding-top: .8rem; }
.pgab td:first-child { box-shadow: inset 4px 0 0 var(--crit); }
.pgtabelle td[data-label="Geplant"], .pgtabelle td[data-label="Gestempelt"] { white-space: nowrap; }
.pgdiff { font-variant-numeric: tabular-nums; white-space: nowrap; }
.pgdiff.gross { color: var(--crit); font-weight: 700; }
.pgdiff.gross::before { content: "▲ "; }
.pgbefund { display: inline-block; font-size: .75rem; margin: 0 .25rem .2rem 0; padding: .1rem .45rem; border-radius: 999px; background: var(--fill); }
.pgbefund.pg-warn { background: var(--crit-soft); color: var(--crit); }
.pgbefund.pg-ok { background: var(--ok-soft); color: var(--ok); }
.pgkorr summary { list-style: none; display: inline-flex; }
.pgkorr summary::-webkit-details-marker { display: none; }
.pgkorrform { display: grid; gap: .4rem; margin-top: .4rem; min-width: 15rem; }
.pgsummen { margin-top: .8rem; }
.pgsummen summary { cursor: pointer; font-weight: 600; }

/* --- Nr. 8: Monat abschliessen --- */
.mahakenliste { list-style: none; margin: .4rem 0 .8rem; padding: 0; display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: .5rem; }
.mahaken a { display: flex; gap: .55rem; align-items: flex-start; height: 100%; box-sizing: border-box; padding: .6rem .7rem; border-radius: 10px; border: 1px solid var(--border); background: var(--surface); color: var(--text); text-decoration: none; }
.mahaken a:hover, .mahaken a:focus-visible { border-color: var(--accent); }
.mazeichen { flex: none; display: grid; place-items: center; width: 1.5rem; height: 1.5rem; border-radius: 50%; font-weight: 700; font-size: .875rem; }
.mahaken.ok .mazeichen { background: var(--ok); color: var(--ok-ink); }
.mahaken.offen .mazeichen { background: var(--crit); color: var(--crit-ink); }
.mahaken.offen a { border-color: var(--crit-soft); }
.matext { display: grid; gap: .1rem; min-width: 0; }
.matext b { hyphens: auto; -webkit-hyphens: auto; }
.matext small { color: var(--muted); font-size: .75rem; line-height: 1.3; }
.mastand { display: flex; gap: .7rem; align-items: flex-start; padding: .7rem .9rem; border-radius: 10px; background: var(--ok-soft); color: var(--ok); }
.mastand > div { flex: 1; min-width: 0; }
.mawarn { margin: .3rem 0 0; color: var(--crit); font-weight: 600; }
.maform { margin: 0; display: flex; align-items: center; gap: .6rem; flex-wrap: wrap; }


body.ps1 .visually-hidden { position: absolute !important; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }

/* --- Breite: Team, Personalnummern und Schichtvorlagen nutzen am Rechner mehr als 1120 px (die Tabelle braucht die Spalten) --- */
@media (min-width: 1000px) {
  body.ps1:has(main.teamseite) main.wrap, body.ps1:has(main.teamseite) .leitkopf, body.ps1:has(main.teamseite) .bereichsstart,
  body.ps1:has(.svtab) main.wrap, body.ps1:has(.svtab) .leitkopf,
  body.ps1:has(main.personseite) main.wrap, body.ps1:has(main.personseite) .leitkopf { max-width: 1440px; }
}

/* --- Nr. 11: die Mitarbeiter-Tabelle --------------------------------------------------------------------------------------------- */
body.ps1 .ttkarte .card-head { flex-wrap: wrap; }
body.ps1 .ttkopfknoepfe { margin-left: auto; display: flex; flex-wrap: wrap; align-items: center; gap: .5rem; }
body.ps1 .ttimport .zmenue-inhalt { min-width: 17rem; }
body.ps1 .ttmenuelink { display: grid; gap: .125rem; padding: .5rem .625rem; border-radius: var(--radius-xs); color: var(--text); font-weight: 600; text-decoration: none; }
body.ps1 .ttmenuelink:hover, body.ps1 .ttmenuelink:focus-visible { background: var(--fill); text-decoration: underline; }
body.ps1 .ttmenuelink .help { font-weight: 400; margin: 0; }
body.ps1 .ttknoepfe { margin-left: auto; display: flex; flex-wrap: wrap; align-items: center; gap: .5rem; }
/* "+ Person hinzufügen": ein Knopf, das Formular klappt als Blatt darunter auf (vorher ein grauer Balken ueber die ganze Breite) */
body.ps1 details.panel[data-ttneu] { position: relative; margin: 0; border: 0; background: none; }
body.ps1 details.panel[data-ttneu] > summary { display: inline-flex; align-items: center; min-height: 40px; padding: .25rem .875rem; border: 0; border-radius: var(--radius-xs); background: var(--accent); color: var(--accent-ink); font-size: .875rem; font-weight: 600; }
body.ps1 details.panel[data-ttneu] > summary::before { content: none; }
body.ps1 details.panel[data-ttneu][open] > summary { border-radius: var(--radius-xs); border-bottom: 0; }
body.ps1 details.panel[data-ttneu] > .ttneu-inhalt {
  position: absolute; right: 0; top: calc(100% + 6px); z-index: 30; box-sizing: border-box; width: min(36rem, calc(100vw - 2rem));
  background: var(--pop); border: 1px solid var(--pop-linie); border-radius: var(--radius-sm); box-shadow: var(--schatten-menue);
}
body.ps1 .teamtab-huelle { margin-top: .5rem; }
body.ps1 .ttwerkzeug { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem .75rem; margin: .25rem 0 .75rem; }
body.ps1 .ttsuche { flex: 0 1 16rem; min-width: 12rem; }
body.ps1 .ttsuche input { width: 100%; min-height: 40px; margin: 0; }
body.ps1 .ttfilterzeile { display: flex; flex-wrap: wrap; gap: .375rem; }
body.ps1 .ttfilter {
  display: inline-flex; align-items: center; gap: .375rem; min-height: 36px; padding: .25rem .75rem; border-radius: var(--radius-pille);
  border: 1px solid var(--hair-strong); background: transparent; color: var(--text); font: inherit; font-size: .875rem; font-weight: 600; cursor: pointer;
}
body.ps1 .ttfilter:hover { border-color: var(--accent); }
body.ps1 .ttfilter.an { background: var(--accent); border-color: var(--accent); color: var(--accent-ink); }
body.ps1 .ttfilter:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
body.ps1 .ttfzahl { font-variant-numeric: tabular-nums; font-weight: 700; }
body.ps1 .ttzahl { font-size: .75rem; color: var(--muted); }
body.ps1 .ttsortwahl { display: none; align-items: center; gap: .375rem; font-size: .875rem; font-weight: 600; }
body.ps1 .ttsortwahl select { min-height: 44px; margin: 0; font-size: 1rem; }

/* Die Leiste fuer mehrere: steht erst da, wenn ein Haken gesetzt ist (ohne :has steht sie immer da - dann eben mit "0 ausgewählt"). */
body.ps1 .mfleiste {
  position: sticky; top: 0; z-index: 12; display: flex; flex-wrap: wrap; align-items: center; gap: .5rem; margin: 0 0 .5rem; padding: .5rem .75rem;
  border-radius: var(--radius-sm); background: var(--accent); color: var(--accent-ink); box-shadow: var(--shadow);
}
body.ps1 .teamtab-huelle:not(:has(.ttzeile .tt-wahl:checked)) .mfleiste { display: none; }
/* "▾" steht im Wort - der Winkel des kleinen Menues waere doppelt */
body.ps1 .mfmenue > summary::after, body.ps1 .ttimport > summary::after { content: none !important; }
body.ps1 .mfzahl { font-weight: 700; margin-right: .25rem; font-variant-numeric: tabular-nums; }
/* Auf der Marine-Leiste umgekehrt: umrandet in Papierfarbe (Eine Tinte - die Form sagt "Handlung"). :root:root wie die Formen-Regel in stil.js. */
:root:root body.ps1 .mfleiste .btn.secondary { background: transparent; color: var(--accent-ink); border-color: var(--accent-ink); }
body.ps1 .mfleiste .zmenue-inhalt { color: var(--text); left: 0; right: auto; min-width: 16rem; }
body.ps1 .mfleiste .zmenue-inhalt .btn { width: auto; }
:root:root body.ps1 .mfleiste .zmenue-inhalt .btn.secondary { background: transparent; color: var(--accent); border-color: var(--accent); }
body.ps1 .mfleiste .zmenue-inhalt .help { margin: 0; }
body.ps1 .mfbereich { display: grid; grid-template-columns: 1fr auto auto; align-items: center; gap: .375rem; }
body.ps1 .mfbereich span { font-weight: 600; }
body.ps1 .mfbereich .btn { width: auto; }
body.ps1 .mfdatum { display: grid; gap: .25rem; font-weight: 600; }
body.ps1 .mfaufheben { margin-left: auto; min-height: 36px; padding: 0 .5rem; border: 0; background: transparent; color: var(--accent-ink); font: inherit; font-size: .875rem; text-decoration: underline; text-underline-offset: 3px; cursor: pointer; }

body.ps1 .teamtab { width: 100%; border-collapse: separate; border-spacing: 0; font-size: .875rem; font-variant-numeric: tabular-nums; }
body.ps1 .teamtab thead th {
  position: sticky; top: 0; z-index: 6; padding: .375rem .5rem; background: var(--surface); border-bottom: 1px solid var(--hair-strong);
  text-align: left; font-size: .75rem; font-weight: 700; letter-spacing: .02em; color: var(--muted); white-space: nowrap; vertical-align: bottom;
}
/* Steht die Leiste fuer mehrere oben, rutscht der Kopf unter sie (sonst verdeckt der eine den anderen). */
body.ps1 .teamtab-huelle:has(.ttzeile .tt-wahl:checked) .teamtab thead th { top: 58px; }
body.ps1 .ttsort {
  display: inline-flex; align-items: center; gap: .25rem; min-height: 32px; padding: 0; border: 0; background: none; color: inherit;
  font: inherit; letter-spacing: inherit; text-transform: none; cursor: pointer; text-align: left;
}
body.ps1 .ttsort:hover { color: var(--text); text-decoration: underline; text-underline-offset: 3px; }
body.ps1 .ttsort:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: 4px; }
body.ps1 .ttpfeil::after { content: "↕"; opacity: .35; font-size: .75rem; }
body.ps1 th[aria-sort="ascending"] .ttpfeil::after { content: "↑"; opacity: 1; }
body.ps1 th[aria-sort="descending"] .ttpfeil::after { content: "↓"; opacity: 1; }
body.ps1 th[aria-sort="ascending"], body.ps1 th[aria-sort="descending"] { color: var(--text); }
body.ps1 .teamtab td { padding: .375rem .5rem; border-bottom: 1px solid var(--hair); vertical-align: middle; }
body.ps1 .teamtab .ttzeile:hover td { background: var(--fill); }
body.ps1 .teamtab .ttzeile.gewaehlt td { background: var(--accent-soft); }
body.ps1 .teamtab .ttzeile[hidden] { display: none !important; }
body.ps1 .teamtab:not([data-filter="deaktiviert"]) .ttzeile.inaktiv { display: none; }
body.ps1 .teamtab .ttzeile.inaktiv .ttname { color: var(--muted); }
body.ps1 .tt-wahlzelle { width: 40px; text-align: center; }
body.ps1 .tt-wahl, body.ps1 .tt-wahl.tt-alle { width: 32px; height: 32px; margin: 0; accent-color: var(--accent); cursor: pointer; vertical-align: middle; }
body.ps1 .ttname { display: inline-flex; align-items: center; min-height: 32px; font-weight: 600; color: var(--text); text-decoration: underline; text-decoration-color: var(--hair-strong); text-underline-offset: 3px; }
body.ps1 .ttname:hover { text-decoration-color: currentColor; }
body.ps1 .tt-name { min-width: 9rem; }
body.ps1 .tt-std { white-space: nowrap; }
body.ps1 .ttstd { display: block; }
body.ps1 .ttbalken { display: block; width: 4.5rem; height: 4px; margin-top: .25rem; border-radius: var(--radius-pille); background: var(--fill); overflow: hidden; }
body.ps1 .ttbalken > span { display: block; height: 100%; background: var(--accent); }
body.ps1 .tt-urlaub, body.ps1 .tt-app { text-align: center; }
body.ps1 .tt-hinweise .tag { display: inline-flex; align-items: center; min-height: 28px; margin: .125rem 0; font-size: .75rem; text-decoration: none; white-space: nowrap; }
body.ps1 .tt-hinweise a.tag:hover { text-decoration: underline; }
body.ps1 .tt-naechste { min-width: 6.5rem; max-width: 10rem; }
body.ps1 .teamtab thead th.tt-std, body.ps1 .teamtab thead th.tt-urlaub, body.ps1 .teamtab thead th.tt-naechste { white-space: normal; }
body.ps1 .teamtab thead th.tt-std { min-width: 5rem; }
body.ps1 .tt-bereich .ttbereich > summary { flex-wrap: nowrap; }
body.ps1 .ttmehr { min-width: 32px; justify-content: center; }
body.ps1 .ttmehr::after { content: none !important; }
body.ps1 .tt-aktionen .actions { display: flex; flex-wrap: nowrap; align-items: center; justify-content: flex-end; gap: .25rem; }
body.ps1 .tt-aktionen form { margin: 0; }
body.ps1 .tt-aktionen .btn.small { min-height: 32px; padding: .125rem .5rem; font-size: .75rem; white-space: nowrap; }
body.ps1 .ttzugang { font-size: .75rem; color: var(--muted); white-space: nowrap; padding: 0 .25rem; }
/* Bereich in der Zeile: ein Knopf mit dem, was gilt - dahinter die drei Haken (wie bisher, Formular bereicheForm) */
body.ps1 .ttbereich { position: relative; }
body.ps1 .ttbereich > summary { list-style: none; display: inline-flex; flex-wrap: wrap; align-items: center; gap: .25rem; min-height: 32px; padding: .125rem .25rem; border-radius: var(--radius-xs); cursor: pointer; }
body.ps1 .ttbereich > summary::-webkit-details-marker { display: none; }
body.ps1 .ttbereich > summary:hover, body.ps1 .ttbereich[open] > summary { background: var(--fill); }
body.ps1 .ttbereich > summary:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
body.ps1 .ttbtag { display: inline-block; padding: .0625rem .5rem; border: 1px solid var(--hair-strong); border-radius: var(--radius-pille); font-size: .75rem; font-weight: 600; }
body.ps1 .ttleer { color: var(--muted); }
body.ps1 .ttbereich-wahl {
  position: absolute; left: 0; top: calc(100% + 4px); z-index: 20; display: grid; gap: .5rem; padding: .625rem; width: max-content;
  background: var(--pop); border: 1px solid var(--pop-linie); border-radius: var(--radius-sm); box-shadow: var(--schatten-menue);
}
body.ps1 .ttleerfilter { margin: .75rem 0 0; color: var(--muted); }
body.ps1 .ttgeraete .panel + .panel { margin-top: .75rem; }
@media (min-width: 1000px) and (max-width: 1399px) {
  /* 1280: die Spalten muessen in ~1.150 px passen - Name und naechste Schicht duerfen umbrechen, die Knoepfe werden schmaler */
  body.ps1 .teamtab td, body.ps1 .teamtab thead th { padding-left: .375rem; padding-right: .375rem; }
  body.ps1 .tt-bereich .ttbereich > summary { flex-wrap: wrap; }
  body.ps1 .tt-name { min-width: 8rem; }
  body.ps1 .preiter { gap: 0; }
  body.ps1 .preiter-tab { padding-left: .5rem; padding-right: .5rem; }
  body.ps1 .tt-aktionen .btn.small { padding: .125rem .375rem; }
}

/* --- Nr. 31: Team am Handy - Liste statt breiter Tabelle, Kacheln als eine Zeile zum Wischen ---------------------------------- */
@media (max-width: 999px) {
  body.ps1 .lskacheln.bereichsstart[data-start="team"] { display: flex; flex-wrap: nowrap; overflow-x: auto; gap: .5rem; scroll-snap-type: x mandatory; padding-bottom: .25rem; -webkit-overflow-scrolling: touch; scrollbar-width: none; }
  body.ps1 .lskacheln.bereichsstart[data-start="team"] > * { flex: 0 0 auto; width: 10.5rem; scroll-snap-align: start; }
}
@media (max-width: 999px) {
  body.ps1 .teamtab, body.ps1 .teamtab tbody, body.ps1 .teamtab tr, body.ps1 .teamtab td { display: block; }
  /* Am Handy sortiert eine Auswahl oben (ttsortwahl) - der Kopf der Tabelle ist dort nicht zu sehen und nicht zu erreichen */
  body.ps1 .teamtab thead { display: none; }
  body.ps1 .ttsortwahl { display: flex; }
  body.ps1 .teamtab .ttzeile { position: relative; display: flex; flex-wrap: wrap; align-items: center; column-gap: .625rem; row-gap: .25rem; padding: .625rem 0 .625rem 52px; border-bottom: 1px solid var(--hair); }
  body.ps1 .teamtab td { padding: 0; border: 0; }
  /* Zeile 1: Haken und Name; Zeile 2: Bereich · Vertrag · Std · Urlaub · naechste Schicht · App; Zeile 3: Hinweise; Zeile 4: Knoepfe */
  body.ps1 .teamtab .tt-wahlzelle { position: absolute; left: 0; top: .625rem; width: 44px; }
  body.ps1 .teamtab .tt-name { order: 1; flex: 1 1 100%; min-width: 0; }
  body.ps1 .teamtab .tt-bereich { order: 3; }
  body.ps1 .teamtab .tt-vertrag { order: 4; }
  body.ps1 .teamtab .tt-std { order: 5; }
  body.ps1 .teamtab .tt-urlaub { order: 6; }
  body.ps1 .teamtab .tt-naechste { order: 7; max-width: none; }
  body.ps1 .teamtab .tt-app { order: 8; }
  body.ps1 .teamtab .ttzeile:not([data-app]) .tt-app { display: none; }
  body.ps1 .teamtab .tt-app::before { content: "App "; }
  body.ps1 .teamtab .tt-hinweise { order: 9; flex: 0 1 auto; }
  body.ps1 .teamtab .tt-hinweise .tag { min-height: 44px; }
  body.ps1 .teamtab .tt-aktionen { order: 10; flex: 1 1 100%; margin: .25rem 0 0 -52px; }
  body.ps1 .teamtab .tt-vertrag, body.ps1 .teamtab .tt-std, body.ps1 .teamtab .tt-urlaub, body.ps1 .teamtab .tt-naechste, body.ps1 .teamtab .tt-app { font-size: .875rem; color: var(--muted); }
  body.ps1 .teamtab .tt-std .ttbalken { display: none; }
  body.ps1 .teamtab .tt-std .ttstd { display: inline; }
  body.ps1 .teamtab .tt-naechste[data-leer] { display: none; }
  body.ps1 .teamtab .tt-std::before { content: "Std "; }
  body.ps1 .teamtab .tt-urlaub::before { content: "Urlaub "; }
  body.ps1 .teamtab .tt-naechste::before { content: "→ "; }
  body.ps1 .teamtab .tt-hinweise:empty { display: none; }
  body.ps1 .bereichskopf .hint { display: none; }
  body.ps1 .ttknoepfe { margin-left: 0; width: 100%; flex-wrap: nowrap; overflow-x: auto; scrollbar-width: none; }
  body.ps1 .ttknoepfe > * { flex: 0 0 auto; }
  body.ps1 details.panel[data-ttneu] { position: static; }
  body.ps1 details.panel[data-ttneu] > .ttneu-inhalt { left: 0; right: 0; width: auto; }
  body.ps1 .ttwerkzeug { position: relative; }
  body.ps1 .tt-wahl, body.ps1 .tt-wahl.tt-alle { width: 44px; height: 44px; }
  body.ps1 .ttname { min-height: 44px; }
  body.ps1 .ttbereich > summary { min-height: 44px; }
  body.ps1 .tt-aktionen .actions { justify-content: flex-start; flex-wrap: wrap; gap: .25rem; }
  body.ps1 .tt-aktionen .btn.small { min-height: 44px; padding: .25rem .375rem; font-size: .75rem; }
  body.ps1 .tt-aktionen .ttmehr { min-width: 44px; }
  body.ps1 .ttsuche { flex: 1 1 100%; }
  body.ps1 .ttsuche input { min-height: 44px; font-size: 1rem; }
  body.ps1 .ttfilterzeile { flex-wrap: nowrap; overflow-x: auto; width: 100%; padding-bottom: .125rem; scrollbar-width: none; }
  body.ps1 .ttfilter { min-height: 44px; white-space: nowrap; flex: 0 0 auto; }
  body.ps1 .ttknoepfe .btn.small, body.ps1 details.panel[data-ttneu] > summary { min-height: 44px; }
  body.ps1 .mfleiste .btn.small, body.ps1 .mfleiste summary.btn { min-height: 44px; }
  body.ps1 .teamtab-huelle:has(.ttzeile .tt-wahl:checked) .teamtab thead th { top: 0; }
}

/* --- Nr. 13: die Personenseite - Kopf mit Steckbrief, Reiter ------------------------------------------------------------------ */
body.ps1 .pkopf { padding-bottom: 1rem; }
body.ps1 .pkopfzeile { display: flex; flex-wrap: wrap; align-items: center; gap: .75rem 1rem; }
body.ps1 .pkuerzel {
  flex: 0 0 auto; display: inline-flex; align-items: center; justify-content: center; width: 56px; height: 56px; border-radius: 50%;
  background: var(--accent); color: var(--accent-ink); font-weight: 700; font-size: 1.125rem; letter-spacing: .02em;
}
body.ps1 .pkname { flex: 1 1 16rem; min-width: 0; }
body.ps1 .pkname h1 { margin: 0; }
body.ps1 .pkpfad { margin: 0; font-size: .75rem; color: var(--muted); }
body.ps1 .pkpfad a { color: inherit; }
body.ps1 .pkmeta { margin: .125rem 0 0; font-size: .875rem; color: var(--muted); }
body.ps1 .pkknoepfe { display: flex; flex-wrap: wrap; gap: .5rem; }
body.ps1 .pkopf .warnbox, body.ps1 .pkopf .critbox, body.ps1 .pkopf .banner { margin-top: .75rem; }
body.ps1 .pklink { margin-top: .75rem; }
body.ps1 .steckbrief { display: grid; grid-template-columns: repeat(auto-fit, minmax(9rem, 1fr)); gap: .5rem; margin-top: 1rem; }
body.ps1 .sbk {
  display: grid; align-content: start; gap: .125rem; min-height: 5.25rem; padding: .625rem .75rem; border-radius: var(--radius-sm);
  border: 1px solid var(--hair-strong); background: var(--surface); color: var(--text); text-decoration: none;
}
body.ps1 .sbk:hover { border-color: var(--accent); }
body.ps1 .sbk:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
body.ps1 .sbk-titel { font-size: .625rem; font-weight: 700; letter-spacing: .06em; text-transform: uppercase; color: var(--muted); }
body.ps1 .sbk-wert { font-size: 1.125rem; font-weight: 700; font-variant-numeric: tabular-nums; }
body.ps1 .sbk-zeile { font-size: .75rem; color: var(--muted); line-height: 1.3; }
body.ps1 .sbk-warn { border-color: var(--crit); box-shadow: inset 4px 0 0 var(--crit); }
body.ps1 .sbk-warn .sbk-wert { color: var(--crit); }
body.ps1 .sbk-ok .sbk-wert { color: var(--ok); }
body.ps1 .preiter {
  display: flex; flex-wrap: nowrap; gap: .25rem; margin: 1rem 0 .75rem; padding: 0 .125rem; overflow-x: auto; border-bottom: 1px solid var(--hair-strong);
  scrollbar-width: none;
}
body.ps1 .preiter-tab {
  position: relative; flex: 0 0 auto; display: inline-flex; align-items: center; gap: .375rem; min-height: 44px; padding: .25rem .625rem;
  color: var(--text); font-size: .875rem; font-weight: 600; text-decoration: none; white-space: nowrap; border-bottom: 3px solid transparent; margin-bottom: -1px;
}
body.ps1 .preiter-tab:hover { border-bottom-color: var(--hair-strong); text-decoration: none; }
body.ps1 .preiter-tab.an, body.ps1 .preiter-tab[aria-selected="true"] { border-bottom-color: var(--accent); color: var(--accent); }
body.ps1 .preiter-tab:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
body.ps1 .preiter-marke { color: var(--crit); font-size: .75rem; font-weight: 700; }
body.ps1 .preiter-tab.ungespeichert::after { content: ""; position: absolute; top: 8px; right: 2px; width: 7px; height: 7px; border-radius: 50%; background: var(--accent); }
body.ps1 .reiterflaeche { margin-top: 0; }
body.ps1 .reiterflaeche[hidden] { display: none; }
body.ps1 .reiterzwei { display: grid; grid-template-columns: minmax(0, 2fr) minmax(16rem, 1fr); gap: 1.25rem; align-items: start; }
body.ps1 .nsbox { padding: .75rem 1rem; border: 1px solid var(--hair); border-radius: var(--radius-sm); }
body.ps1 .nsbox h2 { margin: 0 0 .5rem; font-size: 1rem; }
body.ps1 .pseite { display: grid; gap: .75rem; align-content: start; }
body.ps1 .krankbox { padding: .75rem 1rem; border: 1px solid var(--hair); border-radius: var(--radius-sm); }
body.ps1 .krankbox .card-head { margin-bottom: .5rem; }
body.ps1 .krankbox .card-head h2 { font-size: 1rem; margin: 0; }
body.ps1 .krankbox label { display: grid; gap: .25rem; font-weight: 600; font-size: .875rem; }
body.ps1 .krankbox input { margin: 0; }
/* Fehlerfamilie iPhone-Feldbreiten: Safari gibt Datumsfeldern ~193 px Mindestbreite - am Feld abfangen UND im Raster (je Feld eine eigene Zeile, wenn es eng wird) */
body.ps1 .krankdaten { display: grid; grid-template-columns: repeat(auto-fit, minmax(12.5rem, 1fr)); gap: .5rem; }
body.ps1 .krankbox input[type="date"] { width: 100%; min-width: 0; max-width: 100%; box-sizing: border-box; -webkit-appearance: none; appearance: none; }
body.ps1 .krankbox .btn-row { margin-top: .5rem; }
body.ps1 .nsliste { list-style: none; margin: 0; padding: 0; display: grid; gap: .375rem; font-size: .875rem; }
body.ps1 .nstag { display: inline-block; min-width: 5.5rem; font-weight: 700; font-variant-numeric: tabular-nums; }
body.ps1 .speichernzeile { position: sticky; bottom: 0; z-index: 5; margin-top: 1rem; padding: .5rem 0; background: var(--surface); border-top: 1px solid var(--hair); }
body.ps1 .speichernzeile [data-ungespeichert].offen { color: var(--text); font-weight: 600; }
body.ps1 .reiterteil > .help:first-child { margin-top: 0; }
body.ps1 .pzeiten { margin-top: 0; }
@media (max-width: 999px) {
  body.ps1 .reiterzwei { grid-template-columns: 1fr; }
  body.ps1 .steckbrief { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  body.ps1 .pkknoepfe { width: 100%; }
  body.ps1 .pkknoepfe .btn.small { min-height: 44px; flex: 1 1 0; justify-content: center; text-align: center; }
  body.ps1 .pkuerzel { width: 44px; height: 44px; font-size: 1rem; align-self: flex-start; margin-top: 1.125rem; }
  body.ps1 .pkname { flex: 1 1 10rem; }
  /* Tippziel 44 px, ohne die Zeile hoeher zu machen */
  body.ps1 .pkpfad a { display: inline-block; padding: .875rem .25rem; margin: -.875rem -.25rem; }
  /* Am Handy klebt die Speichern-Zeile ueber der Leiste unten */
  body.ps1 .speichernzeile { bottom: calc(var(--hbul, 58px) + env(safe-area-inset-bottom, 0px)); }
}

/* --- Nr. 28: Personalnummern in einer Liste ---------------------------------------------------------------------------------- */
body.ps1 .pntab { width: 100%; border-collapse: collapse; font-size: .875rem; }
body.ps1 .pntab th { text-align: left; font-size: .75rem; color: var(--muted); padding: .375rem .5rem; border-bottom: 1px solid var(--hair-strong); }
body.ps1 .pntab td { padding: .25rem .5rem; border-bottom: 1px solid var(--hair); vertical-align: middle; }
body.ps1 .pntab .pnstd { font-variant-numeric: tabular-nums; }
body.ps1 .pnfeld { width: 9rem; max-width: 100%; min-height: 40px; margin: 0; font-variant-numeric: tabular-nums; }
body.ps1 .pnfehlt td:first-child { box-shadow: inset 4px 0 0 var(--crit); }
@media (max-width: 760px) { body.ps1 .pnfeld { width: 100%; min-height: 44px; font-size: 1rem; } body.ps1 .pntab th:nth-child(2), body.ps1 .pntab td:nth-child(2), body.ps1 .pntab th:nth-child(3), body.ps1 .pntab td:nth-child(3) { display: none; } body.ps1 .pntab td:first-child a { display: inline-flex; align-items: center; min-height: 44px; } }

/* --- Nr. 32: Schichtvorlagen als kompakte Tabelle ---------------------------------------------------------------------------- */
body.ps1 .svtab { margin-top: 1rem; display: grid; }
body.ps1 .svkopf, body.ps1 .svzeile {
  display: grid; grid-template-columns: minmax(8rem, 1fr) 6.5rem 16rem 13rem 11rem 7rem 13.5rem; align-items: center; gap: .375rem .5rem;
}
body.ps1 .svkopf { padding: 0 .25rem .375rem; border-bottom: 1px solid var(--hair-strong); font-size: .75rem; font-weight: 700; color: var(--muted); }
body.ps1 .svzeile { margin: 0; padding: .375rem .25rem; border-bottom: 1px solid var(--hair); }
body.ps1 .svzeile.inactive { opacity: .7; }
body.ps1 .svzelle { min-width: 0; }
body.ps1 .svzeile input[type="text"], body.ps1 .svzeile select { width: 100%; min-width: 0; margin: 0; min-height: 40px; }
body.ps1 .svname { font-weight: 600; }
body.ps1 .svzelle-zeit { display: flex; align-items: center; gap: .25rem; flex-wrap: wrap; }
body.ps1 .svzelle-zeit .tp-dash { margin: 0; }
/* Fehlerfamilie iPhone-Feldbreiten (17.10.2026): Safari gibt Datums- und Zeitfeldern eine eigene Mindestbreite. Feste Breite, kein
   Mindestmass des Browsers, und am Handy eine eigene Zeile fuer die Zeit - so haelt das Raster auch, wenn ein Browser breiter zeichnet. */
body.ps1 .svzeit { width: 7.5rem; min-width: 0; max-width: 100%; box-sizing: border-box; margin: 0; min-height: 40px; padding-left: .5rem; padding-right: .25rem; font-size: .875rem; font-variant-numeric: tabular-nums; }
body.ps1 .svzelle-zeit .duration { flex: 1 0 100%; font-size: .75rem; color: var(--muted); }
body.ps1 .svtage { flex-wrap: nowrap; gap: .125rem; }
body.ps1 .svtage .chip > span { min-height: 32px; min-width: 28px; padding: .125rem .25rem; font-size: .75rem; justify-content: center; gap: 0; }
body.ps1 .svtage .chip > span::before { display: none; }
body.ps1 .svmehr > summary::after { content: none !important; }
body.ps1 .svmehr > summary { min-width: 36px; justify-content: center; }
body.ps1 .svalle { display: block; font-size: .625rem; color: var(--muted); }
body.ps1 .svzelle-werdarf .werdarf > summary { font-size: .875rem; }
body.ps1 .svzelle-werdarf .wdtitel { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); }
body.ps1 .svzelle-werdarf:has(.werdarf[open]) { grid-column: 1 / -1; order: 9; }
body.ps1 .svzelle-akt { display: flex; align-items: center; gap: .25rem; flex-wrap: nowrap; justify-content: flex-end; }
body.ps1 .svzelle-akt .btn.small { min-height: 36px; white-space: nowrap; }
body.ps1 .svpfeil { min-width: 36px; padding: 0 .5rem; }
body.ps1 .svhinweis { margin-top: .5rem; }
@media (min-width: 1000px) and (max-width: 1399px) {
  /* 1280: die Tage bekommen unter dem Namen eine eigene Zeile, damit der Rest nebeneinander passt */
  body.ps1 .svkopf, body.ps1 .svzeile { grid-template-columns: minmax(8rem, 1fr) 6.5rem 16rem 11rem 7rem 13.5rem; }
  body.ps1 .svkopf > :nth-child(4) { display: none; }
  body.ps1 .svzelle-tage { grid-column: 1 / -1; order: 8; display: flex; align-items: center; gap: .5rem; }
  body.ps1 .svalle { display: inline; }
}
@media (max-width: 999px) {
  body.ps1 .svkopf { display: none; }
  body.ps1 .svzeile { display: grid; grid-template-columns: 1fr 1fr; padding: .75rem .25rem; }
  body.ps1 .svzelle-name { grid-column: 1 / -1; order: 1; }
  body.ps1 .svzelle-bereich { order: 2; }
  body.ps1 .svzelle-empf { order: 3; }
  body.ps1 .svzelle-zeit { order: 4; }
  body.ps1 .svzelle-tage { order: 5; }
  body.ps1 .svzelle-werdarf { order: 6; }
  body.ps1 .svzelle-akt { order: 7; }
  /* ohne Spaltenkopf steht das Wort wieder am Knopf */
  body.ps1 .svzelle-werdarf .wdtitel { position: static; width: auto; height: auto; overflow: visible; clip: auto; margin-right: .375rem; }
  body.ps1 .svzelle-zeit { grid-column: 1 / -1; }
  body.ps1 .svzelle-tage { grid-column: 1 / -1; }
  body.ps1 .svtage { flex-wrap: wrap; }
  body.ps1 .svtage .chip > span { min-height: 44px; min-width: 40px; }
  body.ps1 .svzelle-werdarf { grid-column: 1 / -1; }
  body.ps1 .svzelle-akt { grid-column: 1 / -1; justify-content: flex-start; flex-wrap: wrap; }
  body.ps1 .svzelle-akt .btn.small, body.ps1 .svzeile input[type="text"], body.ps1 .svzeile select, body.ps1 .svzeit { min-height: 44px; font-size: 1rem; }
  body.ps1 .svzeit { width: 8rem; }
}


/* ===================================================================
   Gesamtsuche (E4, 23.10.2026) - siehe stil-w1-suche.js
   =================================================================== */
:root:root body.w1 .w1suche { padding-top: calc(var(--safetop) + 12px); }
:root:root body.w1 .w1suche [hidden] { display: none; }
:root:root body.w1 .w1suche .w1suchfeld { margin-bottom: 4px; }
:root:root body.w1 .w1sf { min-width: 0; }
:root:root body.w1 .w1sf svg { color: var(--w1-ink2); }
:root:root body.w1 .w1sf:focus-within { box-shadow: 0 0 0 4px var(--w1-act-soft); }
:root:root body.w1 .w1sf input[type=search] { -webkit-appearance: none; appearance: none; font-size: 17px; }
:root:root body.w1 .w1sf input[type=search]::placeholder { color: var(--w1-text-aus); opacity: 1; }
:root:root body.w1 .w1sf input[type=search]::-webkit-search-cancel-button { -webkit-appearance: none; display: none; }
:root:root body.w1 .w1x { width: 44px; height: 44px; flex: none; border-radius: 50%; display: flex; align-items: center; justify-content: center; color: var(--w1-ink2); text-decoration: none; }
:root:root body.w1 .w1x:hover { background: var(--w1-fill); }
:root:root body.w1 .w1x:focus-visible,
:root:root body.w1 .w1abbruch:focus-visible,
:root:root body.w1 .w1chip:focus-visible,
:root:root body.w1 .w1loeschen:focus-visible,
:root:root body.w1 .w1treff:focus-visible,
:root:root body.w1 .w1allezeile:focus-visible { outline: 2px solid var(--w1-act-ink); outline-offset: 2px; }
:root:root body.w1 .w1abbruch { min-height: 44px; min-width: 44px; display: flex; align-items: center; justify-content: center; padding: 0 6px; font: 600 15px var(--f-text); color: var(--w1-ink); text-decoration: none; flex: none; }
:root:root body.w1 .w1chips { display: flex; flex-wrap: wrap; gap: 8px; margin: 0; }
:root:root body.w1 .w1chip { display: inline-flex; align-items: center; gap: 8px; min-height: 44px; padding: 0 14px; border-radius: 22px; background: var(--w1-card); border: 1.5px solid var(--w1-line); color: var(--w1-ink); font: 600 15px var(--f-text); text-decoration: none; cursor: pointer; box-sizing: border-box; max-width: 100%; }
:root:root body.w1 .w1chip:hover { background: var(--w1-fill); }
:root:root body.w1 .w1chip[aria-current="true"] { background: var(--w1-seg); color: var(--w1-on-seg); border-color: var(--w1-seg); }
:root:root body.w1 .w1chip span { min-width: 0; overflow-wrap: anywhere; }
:root:root body.w1 .w1filter { margin: 8px 0 0; }
:root:root body.w1 .w1kopfzeile { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
:root:root body.w1 .w1loeschen { min-height: 44px; min-width: 44px; padding: 0 4px; background: transparent; border: 0; font: 600 14px var(--f-text); letter-spacing: 0; text-transform: none; color: var(--w1-act-ink); cursor: pointer; display: flex; align-items: center; justify-content: flex-end; }
:root:root body.w1 .w1treff { display: flex; gap: 12px; align-items: flex-start; padding: 12px 16px; min-height: 76px; box-sizing: border-box; width: 100%; color: var(--w1-ink); text-decoration: none; }
:root:root body.w1 .w1treff:hover { background: var(--w1-fill); }
:root:root body.w1 .w1treff .w1ico { margin-top: 0; }
:root:root body.w1 .w1ttx { flex: 1; min-width: 0; display: flex; flex-direction: column; }
:root:root body.w1 .w1tt { font: 700 16px/1.3 var(--f-kopf); color: var(--w1-ink); overflow-wrap: anywhere; }
:root:root body.w1 .w1sn { font-size: 14px; line-height: 1.4; color: var(--w1-ink2); margin-top: 2px; font-weight: 400; overflow-wrap: anywhere; }
:root:root body.w1 .w1treff mark { background: var(--w1-act-soft); color: var(--w1-act-ink); font-weight: 700; border-radius: 4px; padding: 0 3px; text-decoration: underline; text-underline-offset: 2px; }
:root:root body.w1 .w1pf { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 6px; margin-top: 4px; font-size: 13px; font-weight: 600; color: var(--w1-ink2); }
:root:root body.w1 .w1pf svg { flex: none; }
:root:root body.w1 .w1zus { font: 700 11px/1 var(--f-text); letter-spacing: .06em; text-transform: uppercase; border: 1.5px solid var(--w1-ink2); border-radius: 6px; padding: 2px 5px; margin-left: 4px; }
:root:root body.w1 .w1allezeile { display: flex; align-items: center; justify-content: space-between; gap: 12px; min-height: 56px; padding: 0 16px; font: 600 15px var(--f-text); color: var(--w1-act-ink); text-decoration: none; }
:root:root body.w1 .w1allezeile:hover { background: var(--w1-fill); }
:root:root body.w1 .w1hinweis { display: flex; gap: 12px; align-items: flex-start; background: var(--w1-card); border-radius: 18px; padding: 14px 16px; margin-top: 18px; font-size: 14px; line-height: 1.45; color: var(--w1-ink); }
:root:root body.w1 .w1hinweis svg { flex: none; margin-top: 2px; color: var(--w1-ink); }
:root:root body.w1 .w1hinweis p { margin: 0; }
:root:root body.w1 .w1suche .w1hilfe.w1unten { margin-top: 16px; }


/* ===================================================================
   Schichten in Welt 1 (E2, 23.10.2026) - siehe stil-w1-schichten.js.
   =================================================================== */
:root:root body.w1 .w1segzeile { display: flex; gap: 8px; align-items: stretch; margin: 0 0 12px; }
:root:root body.w1 .w1seg { display: flex; flex: 1; min-width: 0; background: var(--w1-card); border-radius: 14px; padding: 4px; gap: 4px; }
:root:root body.w1 .w1seg a { flex: 1; min-width: 0; min-height: 44px; display: flex; align-items: center; justify-content: center; border-radius: 11px; font: 600 14px var(--f-text); color: var(--w1-ink2); white-space: nowrap; padding: 0 2px; text-decoration: none; }
:root:root body.w1 .w1seg a.on { background: var(--w1-seg); color: var(--w1-on-seg); }
:root:root body.w1 .w1monat { display: flex; align-items: center; gap: 6px; padding: 0 14px; border-radius: 14px; background: var(--w1-card); border: 1.5px solid var(--w1-ink); font: 600 14px var(--f-text); min-height: 52px; color: var(--w1-ink); text-decoration: none; }
:root:root body.w1 .w1monat.on { background: var(--w1-seg); color: var(--w1-on-seg); }
:root:root body.w1 .w1seg a:focus-visible,
:root:root body.w1 .w1monat:focus-visible,
:root:root body.w1 .w1wp:focus-visible,
:root:root body.w1 .w1btn:focus-visible,
:root:root body.w1 .w1tmehr:focus-visible,
:root:root body.w1 .w1kachel:focus-visible,
:root:root body.w1 .w1zr:focus-visible { outline: 2px solid var(--w1-act-ink); outline-offset: 2px; }
:root:root body.w1 .w1wpager { display: flex; justify-content: space-between; align-items: center; gap: 8px; margin: 0 0 6px; }
:root:root body.w1 .w1wp { min-height: 44px; display: inline-flex; align-items: center; gap: 6px; padding: 0 10px; border-radius: 12px; font: 600 14px var(--f-text); color: var(--w1-ink2); text-decoration: none; }
:root:root body.w1 .w1wp > span { font-size: 22px; line-height: 1; }
:root:root body.w1 .w1wp.vor { margin-left: auto; }
:root:root body.w1 .w1wp.aus { pointer-events: none; }
:root:root body.w1 .w1schichten .w1tag.sel:not(.heute) { box-shadow: inset 0 0 0 2.5px var(--w1-ink); }
:root:root body.w1 .w1schichten .w1tag i.ring { background: transparent; box-shadow: inset 0 0 0 2px var(--w1-dot); }
:root:root body.w1 .w1schichten .w1tag.heute i.ring { box-shadow: inset 0 0 0 2px var(--w1-on-heute); }
:root:root body.w1 .w1schichten .w1tag i.haken,
:root:root body.w1 .w1schichten .w1tag i.weg { width: auto; height: auto; background: transparent; box-shadow: none; font: 700 13px/7px var(--f-text); font-style: normal; color: var(--w1-ink2); }
:root:root body.w1 .w1schichten .w1tag.heute i.haken,
:root:root body.w1 .w1schichten .w1tag.heute i.weg { color: var(--w1-on-heute); }
:root:root body.w1 .w1schichten .w1tag.stufe-kritisch:not(.heute) em { background: var(--w1-rotbg); color: var(--w1-rot); }
:root:root body.w1 .w1schichten .w1tag.entwurf { outline: 1.5px dashed var(--w1-ink2); outline-offset: -3px; }
:root:root body.w1 .w1schichten .w1tag.heute.entwurf { outline-color: var(--w1-on-heute); }
:root:root body.w1 .w1pkt { display: inline-block; width: 8px; height: 8px; border-radius: 50%; background: var(--w1-dot); vertical-align: 0; }
:root:root body.w1 .w1pkt.ring { background: transparent; box-shadow: inset 0 0 0 2px var(--w1-dot); }
:root:root body.w1 .w1pkt.entwurf { background: transparent; border-radius: 3px; border: 1.5px dashed var(--w1-ink2); }
:root:root body.w1 .w1tkarte { background: var(--w1-card); border-radius: 22px; padding: 18px; margin: 14px 0 0; }
:root:root body.w1 .w1tkarte.meine { padding-bottom: 6px; }
:root:root body.w1 .w1tkarte + .w1tkarte { margin-top: 10px; }
:root:root body.w1 .w1tkopf { display: flex; justify-content: space-between; align-items: flex-start; gap: 10px; }
:root:root body.w1 .w1tlab { font: 700 13px/1.3 var(--f-text); letter-spacing: .08em; text-transform: uppercase; color: var(--w1-ink2); margin: 0; display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
:root:root body.w1 .w1tw { display: inline-flex; align-items: center; gap: 4px; letter-spacing: 0; text-transform: none; font-weight: 600; }
:root:root body.w1 .w1tw svg { width: 16px; height: 16px; fill: none; stroke: currentColor; stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; }
:root:root body.w1 .w1pill { display: inline-flex; align-items: center; gap: 6px; font: 700 13px/1 var(--f-text); border-radius: 99px; padding: 6px 10px; white-space: nowrap; flex: none; }
:root:root body.w1 .w1pill.ok { background: var(--w1-okbg); color: var(--w1-ok); }
:root:root body.w1 .w1pill.wartet { border: 1.5px dashed var(--w1-ink2); color: var(--w1-ink); padding: 4.5px 8.5px; white-space: normal; text-align: right; line-height: 1.2; }
:root:root body.w1 .w1tname { font: 700 20px/1.2 var(--f-text); margin: 6px 0 0; color: var(--w1-ink); letter-spacing: 0; }
:root:root body.w1 .w1tzeit { font: 400 28px/1.2 "Archivo Black", var(--f-text), sans-serif; margin: 4px 0 0; color: var(--w1-zeit-ink); }
:root:root body.w1 .w1tmit { font-size: 14px; color: var(--w1-ink2); margin: 2px 0 0; }
:root:root body.w1 .w1tact { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 8px; margin-top: 14px; }
:root:root body.w1 .w1tact form { margin: 0; display: flex; }
:root:root body.w1 .w1btn,
:root:root body.w1 .w1tform button { display: flex; align-items: center; justify-content: center; gap: 8px; min-height: 48px; width: 100%; box-sizing: border-box; padding: 0 8px; border-radius: 14px; border: 1.5px solid var(--w1-ink); background: transparent; color: var(--w1-ink); font: 600 15px var(--f-text); text-align: center; text-decoration: none; cursor: pointer; }
:root:root body.w1 .w1btn.haupt,
:root:root body.w1 .w1tform button.haupt { background: var(--w1-act); color: var(--w1-on-act); border-color: var(--w1-act-rand); }
:root:root body.w1 .w1tmehr { display: flex; align-items: center; justify-content: flex-end; gap: 6px; min-height: 44px; margin-top: 4px; font: 600 14px var(--f-text); color: var(--w1-ink2); text-decoration: none; }
:root:root body.w1 .w1tmehr.frei { justify-content: space-between; color: var(--w1-ink); margin-top: 8px; }
:root:root body.w1 .w1tkarte.leer .w1tname { font-size: 18px; }
:root:root body.w1 .w1schichten .tagevent { margin-top: 10px; }
:root:root body.w1 .w1kacheln { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 10px; }
:root:root body.w1 .w1kachel { background: var(--w1-card); border-radius: 22px; min-height: 112px; padding: 14px; display: flex; flex-direction: column; justify-content: space-between; gap: 10px; position: relative; text-decoration: none; color: var(--w1-ink); }
:root:root body.w1 .w1kdisc { width: 44px; height: 44px; border-radius: 14px; background: var(--w1-disc); color: var(--w1-on-disc); display: flex; align-items: center; justify-content: center; }
:root:root body.w1 .w1kn { position: absolute; top: 12px; right: 12px; font: 700 17px var(--f-text); min-width: 32px; height: 32px; border-radius: 99px; display: flex; align-items: center; justify-content: center; background: var(--w1-cnt-bg); color: var(--w1-cnt-ink); padding: 0 9px; }
:root:root body.w1 .w1kt b { display: block; font: 700 16px/1.2 var(--f-text); }
:root:root body.w1 .w1kt span { display: block; font-size: 13px; color: var(--w1-ink2); font-weight: 500; margin-top: 1px; }
:root:root body.w1 .w1wochenliste { margin-top: 26px; }
:root:root body.w1 .w1wochenliste .wblock { margin: 0; padding: 0; background: transparent; border: 0; border-radius: 0; }
:root:root body.w1 .w1wochenliste .wblock::after { display: none; }
:root:root body.w1 .w1wochenliste .wkopf { align-items: flex-end; margin: 0 4px 8px; }
:root:root body.w1 .w1wochenliste .wkicker { font: 700 13px/1.2 var(--f-text); letter-spacing: .07em; text-transform: uppercase; color: var(--w1-ink2); }
:root:root body.w1 .w1wochenliste .wsumme { font: 700 19px/1.2 var(--f-text); letter-spacing: 0; color: var(--w1-ink); }
:root:root body.w1 .w1wochenliste .wspanne { min-height: 44px; display: inline-flex; align-items: center; font: 600 14px var(--f-text); color: var(--w1-ink2); text-decoration: none; }
:root:root body.w1 .w1wochenliste .wtage { gap: 8px; margin-top: 0; }
:root:root body.w1 .w1wochenliste .wtag { background: var(--w1-card); border-radius: 18px; box-shadow: none; outline: 0; min-height: 62px; color: var(--w1-ink); }
:root:root body.w1 .w1wochenliste .wtag:hover { background: var(--w1-card); }
:root:root body.w1 .w1wochenliste .wtag.wtag.wtag:focus-visible { outline: 2px solid var(--w1-act-ink); outline-offset: 2px; }
:root:root body.w1 .w1wochenliste .wtag.bestaetigt { background: var(--w1-card); box-shadow: inset 4px 0 0 var(--w1-zeit); }
:root:root body.w1 .w1wochenliste .wtag.wartet { background: var(--w1-card); box-shadow: none; outline: 2px dashed var(--w1-zeit); outline-offset: -2px; }
:root:root body.w1 .w1wochenliste .wtag.frei { background: var(--w1-card); box-shadow: none; }
:root:root body.w1 .w1wochenliste .wtag.frei .wtag-inhalt,
:root:root body.w1 .w1wochenliste .wfrei { color: var(--w1-ink2); }
:root:root body.w1 .w1wochenliste .wtag.krank { background: var(--w1-card); box-shadow: none; }
:root:root body.w1 .w1wochenliste .wtag.mit-event { background: var(--w1-card); box-shadow: inset 0 0 0 2px var(--w1-ink2); }
:root:root body.w1 .w1wochenliste .wtag.bestaetigt.mit-event { box-shadow: inset 4px 0 0 var(--w1-zeit), inset 0 0 0 2px var(--w1-ink2); }
:root:root body.w1 .w1wochenliste .wtag.heute .wtag-num { background: var(--w1-heute); border-radius: 12px; }
:root:root body.w1 .w1wochenliste .wtag.heute .wtag-num b,
:root:root body.w1 .w1wochenliste .wtag.heute .wtag-num span { color: var(--w1-on-heute); }
:root:root body.w1 .w1wochenliste .wtag.bestaetigt .wtag-num b,
:root:root body.w1 .w1wochenliste .wtag.bestaetigt .wtag-num span { color: var(--w1-ink); }
:root:root body.w1 .w1wochenliste .wtag.bestaetigt.heute .wtag-num b,
:root:root body.w1 .w1wochenliste .wtag.bestaetigt.heute .wtag-num span { color: var(--w1-on-heute); }
:root:root body.w1 .w1wochenliste .wtag-num b { font: 400 22px/1 "Archivo Black", var(--f-text), sans-serif; }
:root:root body.w1 .w1wochenliste .wheute { color: var(--w1-zeit-ink); font-size: .75rem; font-weight: 700; }
:root:root body.w1 .w1wochenliste .wschicht { font: 600 15px/1.3 var(--f-text); letter-spacing: 0; color: var(--w1-ink); }
:root:root body.w1 .w1wochenliste .wzeit { color: var(--w1-zeit-ink); font-weight: 700; }
:root:root body.w1 .w1wochenliste .wbalken { background: var(--w1-zeit); }
:root:root body.w1 .w1wochenliste .wbahn { background: var(--w1-bar-n); }
:root:root body.w1 .w1wochenliste .wmarke { font-size: 13px; font-weight: 700; }
:root:root body.w1 .w1wochenliste .wmarke.ok { color: var(--w1-ok); }
:root:root body.w1 .w1wochenliste .wmarke.wartet { color: var(--w1-ink); }
:root:root body.w1 .w1wochenliste .wmarke.fehlt { color: var(--w1-act-ink); text-decoration: underline; text-underline-offset: 3px; background: transparent; border: 0; padding: 0; }
:root:root body.w1 .w1wochenliste .wevent { color: var(--w1-ink); }
:root:root body.w1 .w1wochenliste .wtag.vergangen.vergangen { opacity: 1; background: transparent; box-shadow: inset 0 0 0 1px var(--w1-line); outline: 0; }
:root:root body.w1 .w1wochenliste .wtag.vergangen.vergangen * { color: var(--w1-ink2); }
:root:root body.w1 .w1zl { background: var(--w1-card); border-radius: 20px; padding: 12px 14px 6px; position: relative; }
:root:root body.w1 .w1zachse { position: relative; height: 22px; margin: 0 0 6px; font: 600 12px var(--f-text); color: var(--w1-ink2); }
:root:root body.w1 .w1zachse span { position: absolute; transform: translateX(-50%); }
:root:root body.w1 .w1zzeilen { position: relative; }
:root:root body.w1 .w1gl { position: absolute; top: 0; bottom: 0; width: 1px; background: var(--w1-line); pointer-events: none; }
:root:root body.w1 .w1zr { position: relative; display: block; margin: 0 0 10px; color: var(--w1-ink); text-decoration: none; min-height: 44px; }
:root:root body.w1 .w1zn { display: block; font-size: 13px; line-height: 1.3; margin-bottom: 3px; position: relative; }
:root:root body.w1 .w1zn b { font-weight: 700; }
:root:root body.w1 .w1zn span { font-weight: 400; color: var(--w1-ink2); margin-left: 4px; }
:root:root body.w1 .w1zb { position: relative; display: block; height: 28px; }
:root:root body.w1 .w1zbalken { position: absolute; top: 0; bottom: 0; border-radius: 9px; background: var(--w1-bar-n); color: var(--w1-ink); font: 600 13px/28px var(--f-text); font-style: normal; padding: 0 9px; white-space: nowrap; overflow: hidden; box-sizing: border-box; }
:root:root body.w1 .w1zbalken.vorher { border-top-left-radius: 0; border-bottom-left-radius: 0; }
:root:root body.w1 .w1zbalken.nachher { border-top-right-radius: 0; border-bottom-right-radius: 0; }
:root:root body.w1 .w1zbalken.du { background: var(--w1-du); color: var(--w1-on-du); }
:root:root body.w1 .w1zbalken.frei { background: transparent; border: 1.5px dashed var(--w1-ink2); line-height: 25px; }
:root:root body.w1 .w1zt { position: absolute; top: 0; font: 600 13px/28px var(--f-text); white-space: nowrap; color: var(--w1-ink); }
:root:root body.w1 .w1zt.ohne { left: 0; }
:root:root body.w1 .w1zblatt { display: flex; align-items: center; flex-wrap: wrap; min-height: 44px; color: var(--w1-ink); text-decoration: none; }
:root:root body.w1 .w1zr.an { border-radius: 12px; box-shadow: 0 0 0 2px var(--w1-act-rand); }
:root:root body.w1 .w1zr.du .w1zn b { color: var(--w1-zeit-ink); }
:root:root body.w1 .w1zr.du.wartet .w1zbalken { background: transparent; color: var(--w1-ink); border: 2px dashed var(--w1-du); line-height: 24px; }
:root:root body.w1 .w1zr.frei,
:root:root body.w1 .w1zr.ersatz { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; column-gap: 8px; row-gap: 3px; }
:root:root body.w1 .w1zr.frei .w1zb,
:root:root body.w1 .w1zr.ersatz .w1zb { grid-column: 1 / -1; }
:root:root body.w1 .w1zr.frei .w1zn,
:root:root body.w1 .w1zr.ersatz .w1zn { margin-bottom: 0; }
:root:root body.w1 .w1zr.frei form,
:root:root body.w1 .w1zr.ersatz form { margin: 0; }
:root:root body.w1 .w1znehmen,
:root:root body.w1 .w1zersatz button { min-height: 44px; padding: 0 14px; border-radius: 12px; font: 700 14px var(--f-text); }
:root:root body.w1 .w1znehmen .skstd { font-weight: 500; }
:root:root body.w1 .w1zleer { margin: 4px 0 12px; color: var(--w1-ink2); font-size: 14px; }
:root:root body.w1 .w1zl .zlluecken { margin: 8px 0 8px; }
:root:root body.w1 .szliste .schichtkarte.meine { background: var(--w1-card); border: 0; box-shadow: inset 4px 0 0 var(--w1-zeit); border-radius: 18px; }
:root:root body.w1 .szliste .schichtkarte.meine.wartet { box-shadow: none; outline: 2px dashed var(--w1-zeit); outline-offset: -2px; }
:root:root body.w1 .szliste .schichtkarte.meine.frisch { box-shadow: inset 4px 0 0 var(--w1-zeit), 0 0 0 3px var(--w1-act-soft); }
:root:root body.w1 .skdeine,
:root:root body.w1 .skdeine.wartet { background: none; -webkit-background-clip: border-box; background-clip: border-box; color: var(--w1-zeit-ink); }
:root:root body.w1 .skbestaetigt { color: var(--w1-ok); }
:root:root body.w1 .skwer.ich { color: var(--w1-zeit-ink); font-weight: 700; }
:root:root body.w1 .btn.gruen.sknehmen,
:root:root body.w1 form[action="/w/einteilen/nehmen"] .btn.gruen,
:root:root body.w1 .szliste .schichtkarte > .btn.sknehmen { background: var(--w1-act); background-image: none; color: var(--w1-on-act); border: 1.5px solid var(--w1-act-rand); box-shadow: none; }
:root:root body.w1 .btn.gruen.sknehmen .skstd,
:root:root body.w1 form[action="/w/einteilen/nehmen"] .btn.gruen .skstd { color: var(--w1-on-act); }
:root:root body.w1 .szliste .skname { display: inline-flex; align-items: center; min-height: 44px; min-width: 0; max-width: 100%; overflow-wrap: anywhere; }
:root:root body.w1 .szliste .schichtkarte { border-radius: 18px; }
:root:root body.w1 .sdzurueck { display: inline-flex; align-items: center; min-height: 44px; font: 600 15px var(--f-text); color: var(--w1-ink2); text-decoration: none; margin: -6px 0 4px -2px; }
:root:root body.w1 .sdkarte { background: var(--w1-card); box-shadow: none; border-radius: 22px; }
:root:root body.w1 .sdkarte.meine { box-shadow: inset 4px 0 0 var(--w1-zeit); }
:root:root body.w1 .sdkarte .tonkicker { color: var(--w1-ink2); }
:root:root body.w1 .sdname { font: 700 22px/1.2 var(--f-text); letter-spacing: 0; color: var(--w1-ink); }
:root:root body.w1 .sdzeit { font: 400 24px/1.2 "Archivo Black", var(--f-text), sans-serif; color: var(--w1-zeit-ink); }
:root:root body.w1 .sdperson.ich .sdwername { color: var(--w1-zeit-ink); }
:root:root body.w1 .skkreis.ich { background: var(--w1-du); color: var(--w1-on-du); border-color: var(--w1-du); }
:root:root body.w1 .sdkarte .skspur .skbalken { background: var(--w1-zeit); }
:root:root body.w1 .w1schichten .plankalender { --kal-marine: var(--w1-zeit); --kal-signal: var(--w1-zeit); --kal-papier: var(--w1-on-heute); --kal-tile: transparent; --kal-linie: var(--w1-line); --kal-still: var(--w1-ink2); --kal-lesbar: var(--w1-ink2); --kal-blass: var(--w1-line2); --kal-event: transparent; --kal-event-hover: var(--w1-fill); background: var(--w1-card); border: 0; border-radius: 22px; box-shadow: none; padding: 12px 8px 8px; display: flex; flex-direction: column; }
:root:root body.w1 .w1schichten .plankalender::after,
:root:root body.w1 .w1schichten .plankalender::before { display: none; }
:root:root body.w1 .w1schichten .plankalender .kalkopf { display: contents; }
:root:root body.w1 .w1schichten .plankalender .kalmonatblock { order: 0; display: flex; flex-direction: row; align-items: center; gap: 8px; padding: 0 8px 8px; width: auto; }
:root:root body.w1 .w1schichten .plankalender .kalmonat { font: 700 22px/1.2 var(--f-text); letter-spacing: 0; text-transform: none; color: var(--w1-ink); }
:root:root body.w1 .w1schichten .plankalender .kaljahr { font: 500 14px var(--f-text); color: var(--w1-ink2); }
:root:root body.w1 .w1schichten .plankalender .kalnav { margin: 0 0 0 auto; display: flex; gap: 8px; align-items: center; }
:root:root body.w1 .w1schichten .plankalender .kalnav a { width: 44px; height: 44px; border-radius: 12px; background: var(--w1-chip); color: var(--w1-ink); display: flex; align-items: center; justify-content: center; }
:root:root body.w1 .w1schichten .plankalender .kalnav svg { width: 22px; height: 6px; }
:root:root body.w1 .w1schichten .plankalender .kalnavtext { display: none; }
:root:root body.w1 .w1schichten .plankalender .kaltrenner { display: none; }
:root:root body.w1 .w1schichten .plankalender .plankalender-grid { order: 1; }
:root:root body.w1 .w1schichten .plankalender .kallegende { order: 2; padding: 6px 8px 0; font-size: 13px; color: var(--w1-ink2); font-weight: 500; justify-content: flex-start; gap: 4px 12px; }
:root:root body.w1 .w1schichten .plankalender .kalevents { order: 3; display: flex; flex-direction: column; margin: 6px 0 0; padding: 6px 8px 0; border-top: 1px solid var(--w1-line); border-left: 0; gap: 0; }
:root:root body.w1 .w1schichten .plankalender .kalevent { display: flex; align-items: center; gap: 12px; min-height: 44px; color: var(--w1-ink); text-decoration: none; }
:root:root body.w1 .w1schichten .plankalender .kevtag { font: 700 14px var(--f-text); color: var(--w1-ink); min-width: 44px; }
:root:root body.w1 .w1schichten .plankalender .kevname { font: 500 15px var(--f-text); color: var(--w1-ink); white-space: normal; overflow: visible; text-overflow: clip; }
:root:root body.w1 .w1schichten .plankalender .kalfeiertag .kevname { color: var(--w1-ink2); font-style: normal; }
:root:root body.w1 .w1schichten .plankalender.kacheln .plankalender-grid td > a,
:root:root body.w1 .w1schichten .plankalender.kacheln .plankalender-grid td > span { position: relative; }
:root:root body.w1 .w1schichten .plankalender .kalfahne { position: absolute; top: 4px; left: 2px; width: 10px; height: 10px; color: var(--w1-act-ink); line-height: 0; pointer-events: none; }
:root:root body.w1 .w1schichten .plankalender.kacheln .plankalender-grid td.feiertag:not(.ausserhalb) .kalzahl { font-style: normal; }
:root:root body.w1 .w1schichten .plankalender .kevzeichen { flex: none; display: inline-flex; width: 18px; height: 18px; color: var(--w1-ink); }
:root:root body.w1 .w1schichten .plankalender .kalfeiertag .kevzeichen { color: var(--w1-act-ink); }
:root:root body.w1 .w1schichten .plankalender .kevart { margin-left: auto; flex: none; font: 600 12px var(--f-text); color: var(--w1-ink2); white-space: nowrap; }
:root:root body.w1 .w1schichten .plankalender .kalevent.kalfeiertag { min-height: 36px; }
:root:root body.w1 .w1schichten .plankalender .plankalender-grid th { font: 600 12px var(--f-text); color: var(--w1-ink2); background: none; border: 0; }
:root:root body.w1 .w1schichten .plankalender .plankalender-grid th:nth-child(n+5) { color: var(--w1-ink2); }
:root:root body.w1 .w1schichten .plankalender.kacheln .plankalender-grid td > a,
:root:root body.w1 .w1schichten .plankalender.kacheln .plankalender-grid td > span { background: transparent; border-radius: 12px; min-height: 56px; color: var(--w1-ink); box-shadow: none; font: 600 15px var(--f-text); }
:root:root body.w1 .w1schichten .plankalender.kacheln .plankalender-grid td.we:not(.heute) > a,
:root:root body.w1 .w1schichten .plankalender.kacheln .plankalender-grid td.we:not(.heute) > span,
:root:root body.w1 .w1schichten .plankalender.kacheln .plankalender-grid tr.aktiv td.we:not(.heute) > a,
:root:root body.w1 .w1schichten .plankalender.kacheln .plankalender-grid tr.aktiv td.we:not(.heute) > span { background: transparent; box-shadow: none; }
:root:root body.w1 .w1schichten .plankalender.kacheln .plankalender-grid tr.aktiv td:not(.heute) > a,
:root:root body.w1 .w1schichten .plankalender.kacheln .plankalender-grid tr.aktiv td:not(.heute) > span { background: transparent; box-shadow: none; }
:root:root body.w1 .w1schichten .plankalender.kacheln .plankalender-grid td.heute > a,
:root:root body.w1 .w1schichten .plankalender.kacheln .plankalender-grid td.heute > span,
:root:root body.w1 .w1schichten .plankalender.kacheln .plankalender-grid tr.aktiv td.heute > a,
:root:root body.w1 .w1schichten .plankalender.kacheln .plankalender-grid tr.aktiv td.heute > span { background: var(--w1-heute); }
:root:root body.w1 .w1schichten .plankalender.kacheln .plankalender-grid td.heute .kalzahl { color: var(--w1-on-heute); }
:root:root body.w1 .w1schichten .plankalender.kacheln .plankalender-grid td.event > a,
:root:root body.w1 .w1schichten .plankalender.kacheln .plankalender-grid td.event > span,
:root:root body.w1 .w1schichten .plankalender.kacheln .plankalender-grid td.event.we:not(.heute) > a,
:root:root body.w1 .w1schichten .plankalender.kacheln .plankalender-grid td.event.we:not(.heute) > span,
:root:root body.w1 .w1schichten .plankalender.kacheln .plankalender-grid tr.aktiv td.event:not(.heute) > a,
:root:root body.w1 .w1schichten .plankalender.kacheln .plankalender-grid tr.aktiv td.event:not(.heute) > span { box-shadow: inset 0 0 0 2px var(--w1-ink2); }
:root:root body.w1 .w1schichten .plankalender.kacheln .plankalender-grid td.vorbei > a,
:root:root body.w1 .w1schichten .plankalender.kacheln .plankalender-grid td.vorbei > span { color: var(--w1-text-aus); }
:root:root body.w1 .w1schichten .plankalender.kacheln .plankalender-grid td.ausserhalb:not(.heute) > a,
:root:root body.w1 .w1schichten .plankalender.kacheln .plankalender-grid td.ausserhalb:not(.heute) > span { color: var(--w1-feldrand); font-weight: 400; }
:root:root body.w1 .w1schichten .plankalender.kacheln .plankalender-grid td.vorbei .kalzeit { opacity: 1; background: var(--w1-chip2); color: var(--w1-ink2); }
:root:root body.w1 .w1schichten .plankalender.kacheln .plankalender-grid .kalstoerer { top: -3px; right: -3px; }
:root:root body.w1 .w1schichten .plankalender .kalzeit { background: var(--w1-du); color: var(--w1-on-du); border-radius: 6px; font: 700 11.5px/1 var(--f-text); padding: 3px 4px; }
:root:root body.w1 .w1schichten .plankalender.kacheln .plankalender-grid td.heute .kalzeit { background: var(--w1-on-heute); color: var(--w1-heute); }
:root:root body.w1 .w1schichten .plankalender .kalluecke,
:root:root body.w1 .w1schichten .plankalender .kalluecke.stufe-knapp,
:root:root body.w1 .w1schichten .plankalender .kalluecke.stufe-eilig,
:root:root body.w1 .w1schichten .plankalender .kalluecke.stufe-bald,
:root:root body.w1 .w1schichten .plankalender .kalluecke.stufe-leer { background: var(--w1-chip); color: var(--w1-ink2); border: 0; border-radius: 6px; font: 700 11px/1 var(--f-text); padding: 3px 3px; min-width: 0; height: auto; width: auto; white-space: nowrap; }
:root:root body.w1 .w1schichten .plankalender .kalluecke::after { content: " frei"; }
:root:root body.w1 .w1schichten .plankalender .kallegende i { background: var(--w1-chip) !important; border-radius: 3px; }
:root:root body.w1 .w1schichten .monatssatz { background: var(--w1-card); border-radius: 16px; padding: 14px 16px; margin: 12px 0 0; font-size: 15px; color: var(--w1-ink); text-align: left; }
:root:root body.w1 .w1schichten .monatsfrei { margin: 8px 0 0; text-align: left; }
:root:root body.w1 .w1schichten .monatsfrei a { display: block; box-sizing: border-box; min-height: 56px; background: var(--w1-card); border-radius: 16px; padding: 16px; color: var(--w1-ink); text-decoration: none; font-size: 15px; }
:root:root body.w1 .w1schichten .apphinweis { margin: 8px 0 0; text-align: center; }
:root:root body.w1 .w1schichten .apphinweis a { display: inline-flex; align-items: center; min-height: 44px; color: var(--w1-ink2); font-weight: 600; font-size: 14px; }
:root:root body.w1 h2.w1gruppe { display: flex; align-items: center; gap: 10px; font: 700 13px/1.2 var(--f-text); letter-spacing: .08em; text-transform: uppercase; color: var(--w1-ink2); margin: 20px 4px 8px; }
:root:root body.w1 h2.w1gruppe .blinie { flex: 1; height: 1px; background: var(--w1-line); }
:root:root body.w1 .w1gz { letter-spacing: 0; text-transform: none; font-size: 14px; font-weight: 600; order: 3; }
:root:root body.w1 .w1abw { display: flex; align-items: center; gap: 12px; min-height: 60px; padding: 8px 16px; }
:root:root body.w1 .w1abwtext { min-width: 0; display: flex; flex-direction: column; }
:root:root body.w1 .w1abwtext b { font-weight: 600; font-size: 15px; }
:root:root body.w1 .w1abwtext span { font-size: 13px; color: var(--w1-ink2); font-weight: 400; }
:root:root body.w1 .w1ausfall { margin-left: auto; display: inline-flex; align-items: center; gap: 6px; font: 700 13px/1 var(--f-text); border-radius: 99px; padding: 7px 11px; white-space: nowrap; background: var(--w1-rotbg); color: var(--w1-rot); flex: none; }
:root:root body.w1 .w1nichtdazeile { background: var(--w1-card); border-radius: 14px; padding: 10px 16px; margin: 12px 0 0; min-height: 44px; display: flex; align-items: center; }
:root:root body.w1 .w1nichtdazeile { flex-wrap: wrap; }
:root:root body.w1 .w1nzich { flex-basis: 100%; margin-top: 2px; font-size: 13px; font-weight: 600; color: var(--w1-ink); }
:root:root body.w1 .w1nichtdazeile b { display: block; font-size: 15px; font-weight: 600; }
:root:root body.w1 .w1nichtdazeile .w1tx span { display: block; font-size: 13px; color: var(--w1-ink2); font-weight: 400; }



/* --- Woche in voller Breite (Nr. 9): bis Paket 2 1.041 px, der Sonntag um 14 px abgeschnitten ------------------------------------ */
@media (min-width: 1000px) {
  body.ps1:has([data-plangriff="woche"]) main.wrap, body.ps1:has([data-plangriff="woche"]) .leitkopf { max-width: none; }
  body.ps1 main.wrap.kuecheseite { max-width: none; }
  body.ps1:has(main.kuecheseite) .leitkopf { max-width: none; }
}

/* --- Freigabe-Leiste oben (Nr. 5) ------------------------------------------------------------------------------------------- */
body.ps1 .pfleiste {
  display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: .5rem 1rem;
  margin: 0 0 1rem; padding: .625rem .75rem .625rem 1rem; border-radius: var(--radius-sm);
  background: var(--surface); border: 1px solid var(--hair-strong);
}
body.ps1 .pfstand { display: flex; align-items: center; flex-wrap: wrap; gap: .375rem .75rem; min-width: 0; }
body.ps1 .pfsatz { font-size: .875rem; color: var(--muted); }
body.ps1 .pflive { font-size: .875rem; font-weight: 650; color: var(--ok); }
body.ps1 .pfsatz.geaendert { color: var(--text); font-weight: 650; }
body.ps1 .pfzahl { font-size: .875rem; color: var(--muted); }
body.ps1 .pferfolg { display: inline-flex; align-items: center; gap: .25rem; font-size: .875rem; font-weight: 650; color: var(--ok); }
body.ps1 .pfaktionen { display: flex; align-items: center; flex-wrap: wrap; gap: .5rem; margin-left: auto; }
body.ps1 .pfleiste:not(.amhandy) .pfaktionen .btn.small { padding: .375rem .75rem; min-height: 36px; }
body.ps1 .pfleiste:not(.amhandy) .pfstand { flex: 1 1 360px; }
body.ps1 .pfform { margin: 0; display: inline-flex; }
body.ps1 .pfblass { opacity: .45; cursor: default; pointer-events: none; }
body.ps1 .pfgeprueft { display: inline-flex; align-items: center; gap: .3rem; font-size: .875rem; font-weight: 650; color: var(--ok); }
body.ps1 .pfgeprueft small { font-weight: 500; color: var(--muted); }
body.ps1 .pfseit { font-size: .75rem; color: var(--muted); }
body.ps1 .pfmenue { position: relative; }
body.ps1 .pfmenue > summary { list-style: none; cursor: pointer; }
body.ps1 .pfmenue > summary::-webkit-details-marker { display: none; }
/* Am Handy eine Zeile: Stand, "Geprüft", "⋯ Woche" - die Haupthandlung steht in der festen Leiste unten (15.10.2026). */
body.ps1 .pfleiste.amhandy { flex-wrap: nowrap; padding: .375rem .5rem .375rem .625rem; margin: .25rem 0 .75rem; gap: .5rem; }
body.ps1 .pfleiste.amhandy .pfstand { flex: 1 1 auto; min-width: 0; }
body.ps1 .pfleiste.amhandy .pferfolg, body.ps1 .pfleiste.amhandy .pfseit, body.ps1 .pfleiste.amhandy .pfgeprueft small, body.ps1 .pfleiste.amhandy .wstand small { display: none; }
body.ps1 .pfleiste.amhandy .pfaktionen { margin-left: 0; flex-wrap: nowrap; flex: none; }
body.ps1 .pfleiste.amhandy .btn.small { min-height: 40px; padding-left: .625rem; padding-right: .625rem; }

body.ps1 .wkzahl { font-size: .75rem; font-weight: 700; padding: .125rem .5rem; border-radius: var(--radius-pille); background: var(--fill); color: var(--text); flex: none; }

/* --- Leere Woche (Nr. 7) ------------------------------------------------------------------------------------------------------ */
body.ps1 .pgleer { border-style: dashed; }
body.ps1 .pgleertitel { margin: 0 0 .75rem; }
body.ps1 .pgleer .btn-row { display: flex; align-items: center; flex-wrap: wrap; gap: .5rem; }

/* --- Menue am Namen (Nr. 19) ----------------------------------------------------------------------------------------------------- */
body.ps1 .pgm { position: relative; display: inline-flex; }
body.ps1 .pgm > summary { list-style: none; }
body.ps1 .pgm > summary::-webkit-details-marker { display: none; }
body.ps1 .pgmknopf {
  display: inline-flex; align-items: center; justify-content: center; width: 32px; height: 32px; border-radius: var(--radius-xs);
  color: var(--accent); font-weight: 700; font-size: 1.125rem; line-height: 1; cursor: pointer; user-select: none;
}
body.ps1 .pgmknopf:hover, body.ps1 .pgm[open] > .pgmknopf { background: var(--accent-soft); }
/* Am Rechner steht das ⋯ erst, wenn die Maus auf der Person ist oder sie den Fokus hat - dreizehn ⋯ ueber dem Falz waeren
   wieder die Unruhe, die das Menue wegnehmen soll. Mit dem Finger (kein Hover) steht es immer da. */
@media (hover: hover) {
  body.ps1 [data-pg-zug] .pgmknopf { opacity: 0; }
  body.ps1 [data-pg-zug]:hover .pgmknopf, body.ps1 [data-pg-zug]:focus-within .pgmknopf, body.ps1 .pgm[open] > .pgmknopf { opacity: 1; }
}
body.ps1 .pgmknopf:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
body.ps1 .pgminhalt {
  position: absolute; z-index: 60; top: calc(100% + 4px); left: 0; min-width: 236px; max-width: min(320px, 86vw);
  display: grid; gap: 1px; padding: .375rem; text-align: left; white-space: normal; max-height: calc(100vh - 16px); overflow: auto; overscroll-behavior: contain;
  background: var(--pop); color: var(--text); border: 1px solid var(--pop-linie); border-radius: var(--radius-sm); box-shadow: var(--schatten-menue);
}
body.ps1 .pfmenue .pgminhalt { left: auto; right: 0; }
body.ps1 .pgminhalt.links { left: auto; right: 0; }
body.ps1 .pgminhalt.oben { top: auto; bottom: calc(100% + 4px); }
body.ps1 .pgmkopf { display: flex; flex-direction: column; margin: 0; padding: .25rem .5rem .375rem; border-bottom: 1px solid var(--hair); }
body.ps1 .pgmkopf span { font-size: .75rem; color: var(--muted); }
body.ps1 .pgmzeile {
  display: flex; align-items: center; justify-content: space-between; gap: .75rem; width: 100%; min-height: 36px; padding: .375rem .5rem;
  border: 0; border-radius: var(--radius-xs); background: none; color: var(--text); font: inherit; font-size: .875rem; font-weight: 550;
  text-align: left; text-decoration: none; cursor: pointer; list-style: none; box-sizing: border-box;
}
body.ps1 .pgmzeile::-webkit-details-marker { display: none; }
body.ps1 .pgmzeile:hover, body.ps1 .pgmzeile:focus-visible { background: var(--accent-soft); outline: none; text-decoration: none; }
body.ps1 .pgmzeile.rot { color: var(--crit); }
body.ps1 .pgmzeile kbd, body.ps1 .pgtasten kbd {
  font: inherit; font-size: .75rem; font-weight: 650; color: var(--muted); padding: .0625rem .375rem; border: 1px solid var(--hair-strong); border-radius: var(--radius-klein);
}
body.ps1 .pgmtitel { cursor: default; font-weight: 700; }
body.ps1 .pgmtitel:hover { background: none; }
body.ps1 .pgmteil[open] > .pgmzeile { background: var(--fill); }
body.ps1 .pgmform { display: grid; gap: .375rem; margin: 0; padding: .375rem .5rem .5rem; }
body.ps1 .pgmform.pgmeins { padding: 0; }
body.ps1 .pgmform label { display: grid; gap: .125rem; font-size: .75rem; color: var(--muted); }
body.ps1 .pgmform label.pgmhaken { display: flex; align-items: center; gap: .375rem; color: var(--text); font-size: .875rem; }
body.ps1 .pgmform select, body.ps1 .pgmform input[type="date"], body.ps1 .pgmform input[type="text"] { min-height: 36px; font-size: .875rem; }
body.ps1 .pgmhinweis { margin: 0; padding: 0 .5rem; font-size: .75rem; color: var(--muted); }
body.ps1 .pgmarbzg .bgteil { padding: 0 .5rem .375rem; }

/* --- Arbeitszeit-Hinweis an der Person (Nr. 16): Zeichen + Wort, nie nur Farbe --------------------------------------------------- */
body.ps1 .pgarbzg {
  display: inline-flex; align-items: center; gap: .25rem; padding: .0625rem .4rem; border-radius: var(--radius-pille);
  font-size: .75rem; font-weight: 650; color: var(--text); border: 1px dashed var(--muted); white-space: nowrap;
}
body.ps1 .pgarbzg.grenze { color: var(--crit); border: 1px solid var(--crit); }
body.ps1 .pgarbzg i { font-style: normal; }
body.ps1 small.pgarbzg { white-space: normal; border-radius: var(--radius-xs); }

/* --- Zeit am Namen im Tag (wie die Woche seit 15.10.) ------------------------------------------------------------------------- */
body.ps1 .crewname.pgname { color: inherit; text-decoration: none; }
body.ps1 .crewname.pgname:hover { text-decoration: underline; text-underline-offset: 3px; }
body.ps1 .pgzeit { display: none; }
body.ps1 .pgzeit:target { display: flex; flex-wrap: wrap; align-items: flex-end; gap: .5rem; flex-basis: 100%; padding: .5rem 0 .25rem; }
body.ps1 .pgzeitform { display: flex; flex-wrap: wrap; align-items: flex-end; gap: .5rem; margin: 0; }
body.ps1 .pgzeitform label { display: grid; gap: .125rem; font-size: .75rem; color: var(--muted); }
body.ps1 .pgzeitzu { font-size: .875rem; align-self: center; }
body.ps1 .crew { flex-wrap: wrap; }

/* --- Woche: Stunden und Euro je Tag, Fuss mit Ziel (Nr. 9) --------------------------------------------------------------------- */
body.ps1 .wtgeld span + span::before { content: "·"; margin-right: .375rem; }
body.ps1 .wtgeld { display: flex; flex-wrap: wrap; gap: 0 .375rem; margin-top: .25rem; font-size: .75rem; font-weight: 600; color: var(--muted); letter-spacing: 0; text-transform: none; }
body.ps1 .wtfuss {
  display: flex; align-items: center; flex-wrap: wrap; gap: .375rem 1rem; margin-top: .75rem; padding: .625rem .75rem;
  border-top: 1px solid var(--hair-strong); font-size: .875rem;
}
body.ps1 .wtpers { display: flex; align-items: center; gap: .125rem; flex-wrap: nowrap; position: relative; }
body.ps1 .wtpers .pgarbzg span:not(.nurvorlesen) { display: none; }
body.ps1 .wtpers > .wtchip { flex: 1 1 auto; min-width: 0; }
body.ps1 .wtpers .pgmknopf { width: 24px; height: 20px; font-size: 1rem; background: var(--surface); }
/* In der Woche liegt das ⋯ AUF dem Plaettchen (oben rechts), statt Breite zu kosten: sonst waere der Sonntag bei 1280 px wieder
   abgeschnitten (gemessen: 1.204 px Tabelle in 1.097 px). */
body.ps1 .wtpers > .pgm { position: absolute; top: 2px; right: 2px; }
body.ps1 .wtpers .pgarbzg { font-size: .75rem; }

/* --- Ziehen und Ablegen (Nr. 33) ---------------------------------------------------------------------------------------------- */
/* Die Schichtkarte am Zeiger (Mathieu, 25.10.2026: "ein Bild einer Schicht ..., die am Mauszeiger haengt und die man ziehen kann").
   "Geht, aber mit einem Wort" ist KEIN Gelb, obwohl der Auftrag es so beschrieb: in der Planung gibt es seit Mathieus Entscheidung
   vom 05.10.2026 kein Orange und kein Gold (backend-zwei-farben.test.js) - zwei Signalfarben, Gruen und Rot; ein Hinweis ist Grau
   mit Wort und Kante. Also: Marine = geht (gefuellt, die Handlung), Grau-getoent mit ⚠, Kante und Satz = geht mit einem Wort,
   Rot mit ⛔ = geht nicht. Alles aus Tokens mit Hell- und Dunkelwert (der Plan am Handy folgt dem Telefon). */
body.ps1 [data-pg-zug] { -webkit-touch-callout: none; }
@media (hover: hover) {
  body.ps1 [data-pg-zug] { cursor: grab; }
  body.ps1 [data-pg-zug] a, body.ps1 [data-pg-zug] summary, body.ps1 [data-pg-zug] button { cursor: pointer; }
}
@media (hover: none) {
  body.ps1 [data-pg-zug] { -webkit-user-select: none; user-select: none; }
}
body.ps1.pgzieht, body.ps1.pgzieht * { cursor: grabbing !important; user-select: none; -webkit-user-select: none; }
/* Der Platz, von dem die Karte kommt: blass und gestrichelt, in derselben Groesse - nichts rueckt nach. */
body.ps1 .pgquelle { outline: 2px dashed var(--muted); outline-offset: 1px; border-radius: var(--radius-xs); }
body.ps1 .pgquelle > * { opacity: .35; }
/* Lange gedrueckt (Finger): die Kachel waechst kurz an - der Ersatz fuer das Ruckeln, das Safari nicht kann. */
body.ps1 .pgangehoben { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: var(--radius-xs); animation: pgwachsen .22s ease-out; }
/* Sobald die Karte haengt, ist auch die angehobene Kachel nur noch der Platzhalter. */
body.ps1 .pgangehoben.pgquelle { outline: 2px dashed var(--muted); outline-offset: 1px; }
@keyframes pgwachsen { 0% { transform: scale(1); } 45% { transform: scale(1.05); } 100% { transform: scale(1); } }
body.ps1 .pgziel { outline: 1.5px dashed var(--hair-strong); outline-offset: -3px; transition: background-color .08s; }
body.ps1 .pgziel.pg-ok { outline: 2px solid var(--accent); background: var(--accent-soft); }
body.ps1 .pgziel.pg-warn { outline: 2px dashed var(--text-soft); background: var(--gold-soft); }
body.ps1 .pgziel.pg-nein { outline: 2px solid var(--crit); background: var(--crit-soft); }
body.ps1 .pgablage { outline: 2px solid var(--accent); }

/* Die Ebene: EIN festes Element am Ende von <body>, nur waehrend man zieht. Keine Groesse, kein "bottom", nimmt keine Klicks -
   die feste Leiste unten bleibt die oberste Schicht am Rand (unterleiste-fest.test.js). Unter Dialogen (showModal liegt ohnehin
   in der obersten Ebene) und unter den Hinweisen (300), ueber dem Plan und den Menues (60). */
body.ps1 .pgschwebe { position: fixed; left: 0; top: 0; width: 0; height: 0; z-index: 250; pointer-events: none; }
body.ps1 .pgkarte {
  position: absolute; left: 0; top: 0; width: 280px; will-change: transform; pointer-events: none;
  --pgk-kante: var(--bar);
}
body.ps1 .pgkarte[data-bereich="kueche"] { --pgk-kante: var(--kueche); }
body.ps1 .pgkarte[data-bereich="office"] { --pgk-kante: var(--office); }
body.ps1 .pgkinnen {
  display: grid; gap: .375rem; padding: .5rem .5rem .5rem .625rem; border-radius: var(--radius-sm); opacity: .97;
  background: var(--surface); color: var(--text); border: 1px solid var(--border-strong); border-left: 4px solid var(--pgk-kante);
  box-shadow: var(--schatten-4); transform: rotate(-1.5deg); transform-origin: 0 0;
  font-size: .875rem; line-height: 1.25;
}
body.ps1 .pgkinnen.heben { animation: pgheben .16s ease-out; }
@keyframes pgheben { 0% { transform: rotate(0deg) scale(.94); opacity: .6; } 100% { transform: rotate(-1.5deg) scale(1); opacity: .97; } }
body.ps1 .pgkkopf { display: flex; align-items: center; gap: .5rem; min-width: 0; }
body.ps1 .pgkav {
  flex: none; display: inline-flex; align-items: center; justify-content: center; width: 28px; height: 28px; border-radius: 50%;
  background: var(--fill); color: var(--text); font-size: .625rem; font-weight: 700; letter-spacing: .02em;
}
body.ps1 .pgkwer { display: grid; min-width: 0; flex: 1 1 auto; }
body.ps1 .pgkname { font-weight: 700; font-size: 1rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
body.ps1 .pgkzeile { font-size: .75rem; color: var(--muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
body.ps1 .pgkkopie {
  display: none; flex: none; align-self: flex-start; padding: .125rem .5rem; border-radius: var(--radius-pille);
  background: var(--accent); color: var(--accent-ink); font-size: .75rem; font-weight: 700; white-space: nowrap;
}
body.ps1 .pgkarte.kopie .pgkkopie { display: inline-flex; }
/* Flaeche, Rand und Schatten aus den Wurzel-Tokens (--surface, --border-strong, --schatten-4 "schwebt"), nicht aus --pop: die
   haben hell UND dunkel einen Wert, und der Plan am Handy folgt dem Telefon (im Dunkeln stand der Name sonst weiss auf Creme). */
/* Unten in einer Zeile: was beim Loslassen passiert. Gefuellt in Marine, wenn es geht (die Handlung - eine Tinte). */
body.ps1 .pgkfuss { display: grid; gap: .125rem; margin: 0 -.25rem -.25rem -.375rem; padding: .375rem .5rem; border-radius: var(--radius-xs); background: var(--fill); color: var(--muted); font-size: .875rem; }
body.ps1 .pgktat { font-weight: 650; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* "Hier nicht" braucht den Grund ganz - zwei Zeilen, nicht mehr. */
body.ps1 .pgkfuss.nein .pgktat { white-space: normal; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; }
body.ps1 .pgkgrund { font-size: .75rem; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
body.ps1 .pgkfuss.ok { background: var(--accent); color: var(--accent-ink); }
body.ps1 .pgkfuss.warn { background: var(--gold-soft); color: var(--text); box-shadow: inset 3px 0 0 var(--text-soft); }
body.ps1 .pgkfuss.nein { background: var(--crit-soft); color: var(--crit); }
/* Der Flug ins Ziel bzw. zurueck: 180 ms, dann ist die Ebene weg. Ohne Bewegung (prefers-reduced-motion) springt das Skript. */
body.ps1 .pgkarte.fliegt { transition: transform .18s cubic-bezier(.2, .8, .2, 1); }
body.ps1 .pgkarte.fliegt .pgkinnen { transition: transform .18s ease-out, opacity .18s ease-out; }
body.ps1 .pgkinnen.landet { transform: rotate(0deg) scale(.86); opacity: .55; }
/* Das Schild an der Oberkante des Ziels: "Hierhin: Di 27.10. · Spätschicht". Sitzt ueber dem Rand, nicht auf dem Inhalt. */
body.ps1 .pgschild {
  position: absolute; left: 0; top: 0; display: none; max-width: 296px; padding: .25rem .5rem; border-radius: var(--radius-xs);
  background: var(--accent); color: var(--accent-ink); font-size: .75rem; font-weight: 650; line-height: 1.3; box-shadow: var(--schatten-menue);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; will-change: transform;
}
body.ps1 .pgschild.an { display: block; }
body.ps1 .pgschild.warn { background: var(--gold-soft); color: var(--text); border: 1px solid var(--text-soft); }
body.ps1 .pgschild.nein { background: var(--crit); color: var(--crit-ink); }
@media (prefers-reduced-motion: reduce) {
  body.ps1 .pgkinnen.heben, body.ps1 .pgangehoben { animation: none; }
  body.ps1 .pgkarte.fliegt, body.ps1 .pgkarte.fliegt .pgkinnen { transition: none; }
}

/* --- Der kurze Hinweis beim Ziehen ("geht nicht: ...", "Wird verschoben ...") - "Rückgängig" ist die Leiste aus Paket 3 ------------ */
body.ps1 .pgtoast {
  position: fixed; left: 50%; transform: translateX(-50%); bottom: calc(1rem + env(safe-area-inset-bottom, 0px)); z-index: 300;
  display: flex; align-items: center; gap: .75rem; max-width: min(640px, calc(100vw - 2rem)); padding: .5rem .5rem .5rem 1rem;
  border-radius: var(--radius-sm); background: var(--accent); color: var(--accent-ink); box-shadow: var(--schatten-menue); font-size: .875rem;
}
body.ps1 .pgtoast { display: none; padding: .625rem 1rem; }
body.ps1 .pgtoast.an { display: flex; }
body.ps1 .pgtoast.nein { background: var(--crit); color: var(--crit-ink); }
@media (max-width: 999px) {
  body.ps1 .pgtoast { bottom: calc(var(--hbul, 58px) + 76px + env(safe-area-inset-bottom, 0px)); }
}

/* --- Die Tasten (?) ------------------------------------------------------------------------------------------------------------- */
body.ps1 .pgtasten { border: 1px solid var(--pop-linie); border-radius: var(--radius); background: var(--pop); color: var(--text); box-shadow: var(--schatten-pop); padding: 1.25rem 1.5rem; max-width: 440px; }
body.ps1 .pgtasten::backdrop { background: var(--schleier); }
body.ps1 .pgtasten h2 { margin: 0 0 .75rem; font-size: 1.125rem; }
body.ps1 .pgtasten table { border-collapse: collapse; width: 100%; margin-bottom: 1rem; }
body.ps1 .pgtasten td { padding: .3rem .5rem .3rem 0; font-size: .875rem; vertical-align: top; }
body.ps1 .pgtasten td:first-child { white-space: nowrap; }


/* --- Nr. 24/34: Heute --- */
body.ps1 .lsrechts > .card { margin-bottom: 1rem; }
body.ps1 .lsrechts > .card:last-child { margin-bottom: 0; }
/* In der schmalen rechten Spalte: drei Zeilen statt drei Kacheln nebeneinander (sonst bricht "Veröffentlicht" mitten im Wort). */
body.ps1 .wkarte .wkzahlen { grid-template-columns: minmax(0, 1fr); gap: 0; margin: 0 0 .75rem; border: 1px solid var(--hair); border-radius: 10px; overflow: hidden; }
body.ps1 .wkarte .ukachel { display: grid; grid-template-columns: 7.2rem minmax(0, 1fr); column-gap: .6rem; align-items: baseline; padding: .5rem .7rem; min-width: 0; border: 0; border-radius: 0; border-top: 1px solid var(--hair); }
body.ps1 .wkarte .ukachel:first-child { border-top: 0; }
body.ps1 .wkarte .ukachel .lbl { grid-row: span 2; }
body.ps1 .wkarte .ukgross { font-size: 1rem; }
body.ps1 .wkarte .ukfuss { grid-column: 2; font-size: .75rem; overflow-wrap: anywhere; }
body.ps1 .wkampel { list-style: none; margin: 0 0 .75rem; padding: 0; display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); gap: .3rem; }
body.ps1 .wktag { display: flex; flex-direction: column; align-items: center; gap: .1rem; min-height: 44px; padding: .3rem .1rem; border-radius: 8px; border: 1px solid var(--hair); background: var(--surface); color: var(--text); text-decoration: none; font-size: .75rem; line-height: 1.2; }
body.ps1 .wktag:hover { border-color: var(--accent); }
body.ps1 .wktag .wkname { color: var(--muted); font-size: .75rem; white-space: nowrap; }
body.ps1 .wktag .wkwert { font-weight: 700; }
body.ps1 .wktag.crit { background: var(--crit-soft); color: var(--crit); border-color: transparent; }
body.ps1 .wktag.ok { background: var(--ok-soft); color: var(--ok); border-color: transparent; }
/* Lesbar statt durchsichtig (25.10.2026, Messung aller Planungsseiten hell und dunkel): mit Deckkraft kam der Text auf 2,4:1 (hell) bzw. 3,5:1 (dunkel) - die
   Tinte "leise" (--muted, >= 4,5:1 auf jedem Grund) sagt dasselbe, ohne vom Grund abzuhaengen. */
body.ps1 .wktag.vorbei .wkname, body.ps1 .wktag.vorbei .wkwert { color: var(--muted); }
body.ps1 .wktag.heute { box-shadow: inset 0 0 0 2px var(--accent); }
body.ps1 .wkh3 { font-size: .875rem; margin: 0 0 .4rem; }
body.ps1 .wkarte .ufehlt { margin: 0; }

body.ps1 .imladen .ilzahlen { display: flex; flex-wrap: wrap; gap: .3rem .4rem; margin: 0 0 .6rem; padding: 0; }
body.ps1 .imladen .ilz { font-size: .75rem; font-weight: 700; padding: .2rem .55rem; border-radius: 999px; background: var(--fill); color: var(--text); }
body.ps1 .imladen .ilz.ok { background: var(--ok-soft); color: var(--ok); }
body.ps1 .imladen .ilz.crit { background: var(--crit-soft); color: var(--crit); }
body.ps1 .illiste { list-style: none; margin: 0 0 .5rem; padding: 0; }
body.ps1 .ilzeile { display: flex; flex-wrap: wrap; gap: .1rem .6rem; align-items: baseline; padding: .35rem 0 .35rem .6rem; border-top: 1px solid var(--hair); font-size: .875rem; }
body.ps1 .ilzeile.crit { box-shadow: inset 3px 0 0 var(--crit); }
body.ps1 .ilzeile.crit .ilwas { color: var(--crit); }
body.ps1 .ilname { font-weight: 700; }
body.ps1 .ilwas { color: var(--muted); }
body.ps1 .ilrest { margin: 0 0 .4rem; }

body.ps1 .lsklappe { margin-top: .5rem; border-top: 1px solid var(--hair); padding-top: .35rem; position: relative; z-index: 1; }
body.ps1 .lsklappe > summary { cursor: pointer; font-size: .875rem; font-weight: 600; color: var(--accent); text-decoration: underline; text-underline-offset: 3px; min-height: 32px; display: flex; align-items: center; }
body.ps1 .lskl { list-style: none; margin: .25rem 0 .4rem; padding: 0; }
body.ps1 .lskl li { display: flex; flex-wrap: wrap; gap: .1rem .5rem; align-items: baseline; padding: .3rem 0; border-top: 1px solid var(--hair); font-size: .875rem; }
body.ps1 .lsklname { font-weight: 600; flex: 1 1 8rem; min-width: 0; }
body.ps1 .lsklwert { color: var(--muted); }

/* --- Nr. 26: Hub-Start --- */
body.ps1 .hubstart { margin: 0 0 1rem; }
body.ps1 .hszuletzt { display: flex; flex-wrap: wrap; align-items: center; gap: .35rem .45rem; margin: 0 0 .75rem; }
body.ps1 .hszuletzt-liste { display: contents; }
body.ps1 .hszlink { display: inline-flex; align-items: center; min-height: 32px; padding: 0 .75rem; border: 1.5px solid var(--accent); border-radius: 999px; color: var(--accent); font-size: .875rem; font-weight: 600; text-decoration: none; }
body.ps1 .hszlink:hover { background: var(--accent-soft); }
body.ps1 .hsspalten { display: grid; gap: .75rem; grid-template-columns: repeat(3, minmax(0, 1fr)); align-items: start; }
@media (max-width: 999px) { body.ps1 .hsspalten { grid-template-columns: minmax(0, 1fr); } }
body.ps1 .hsspalte { margin: 0; padding: .75rem .9rem .4rem; }
body.ps1 .hsglabel { font-size: .75rem; letter-spacing: .07em; text-transform: uppercase; color: var(--muted); margin: 0 0 .35rem; }
body.ps1 .hsliste { list-style: none; margin: 0; padding: 0; }
body.ps1 .hsliste li + li { border-top: 1px solid var(--hair); }
body.ps1 .hsort { display: flex; align-items: center; justify-content: space-between; gap: .3rem .75rem; flex-wrap: wrap; min-height: 44px; padding: .3rem .1rem; color: var(--text); text-decoration: none; }
body.ps1 .hsort .hsname { font-weight: 700; text-decoration: underline; text-underline-offset: 3px; text-decoration-color: var(--hair); color: var(--accent); }
body.ps1 .hsort:hover .hsname { text-decoration-color: currentColor; }
body.ps1 .hsort.hier { box-shadow: inset 3px 0 0 var(--accent); padding-left: .55rem; }
body.ps1 .hsstand { font-size: .75rem; color: var(--muted); text-align: right; margin-left: auto; }
body.ps1 .hsstand.crit { color: var(--crit); font-weight: 700; }
body.ps1 .hsstand.warn { color: var(--warn); font-weight: 700; }
body.ps1 .hsstand.offen { color: var(--accent); font-weight: 700; }
body.ps1 .hsstand.ok { color: var(--ok); }
body.ps1 .hszahl { margin-left: .25rem; vertical-align: 1px; }

/* --- Nr. 14: To-Do anlegen, runder Haken --- */
body.ps1 .tdneu { margin: 0 0 1rem; padding: .75rem; border: 1px solid var(--hair); border-radius: 10px; background: var(--bg); }
body.ps1 .tdneu-zeile { display: grid; grid-template-columns: auto minmax(0, 1fr) auto auto; gap: .5rem; align-items: center; }
body.ps1 .tdneu-mehr { display: flex; flex-wrap: wrap; gap: .5rem .9rem; align-items: center; margin-top: .5rem; }
body.ps1 .tdfeld { display: flex; align-items: center; gap: .35rem; margin: 0; }
body.ps1 .tdfeld input, body.ps1 .tdfeld select { min-height: 44px; margin: 0; }
body.ps1 .tdtext input { width: 100%; }
body.ps1 .tdkl { font-size: .75rem; color: var(--muted); font-weight: 600; }
body.ps1 .tdfuer { flex: 1 1 100%; }
body.ps1 .tdfuer > summary { cursor: pointer; min-height: 36px; display: flex; align-items: center; gap: .5rem; }
body.ps1 .tdfuer > summary .klapptitel { font-weight: 700; color: var(--accent); text-decoration: underline; text-underline-offset: 3px; }
body.ps1 .tdfuer-inhalt { padding: .4rem 0 .2rem; }
body.ps1 .tdfoto input[type=file] { min-height: 0; font-size: .875rem; }
@media (max-width: 760px) { body.ps1 .tdneu-zeile { grid-template-columns: minmax(0, 1fr) auto; } body.ps1 .tdtext { grid-column: 1 / -1; grid-row: 1; } }
body.ps1 .tdhaken { flex: none; width: 28px; height: 28px; min-width: 28px; margin: 0 .55rem 0 0; padding: 0; border-radius: 50%; border: 2px solid var(--accent); background: transparent; color: var(--accent-ink); font: inherit; font-size: .875rem; font-weight: 700; line-height: 1; cursor: pointer; display: inline-flex; align-items: center; justify-content: center; position: relative; }
body.ps1 .tdhaken::after { content: ''; position: absolute; inset: -8px; }
body.ps1 .tdhaken:hover { background: var(--accent-soft); }
body.ps1 .tdhaken.an { background: var(--accent); }

/* --- Nr. 27: HACCP-Raster --- */
body.ps1 .hraster .hrnav { align-items: center; margin-bottom: .6rem; }
body.ps1 .hrlegende { display: inline-flex; flex-wrap: wrap; align-items: center; gap: .3rem; margin-left: auto; }
body.ps1 .hrlegende .hr { display: inline-flex; width: 22px; height: 22px; align-items: center; justify-content: center; border-radius: 4px; }
body.ps1 .hrhuelle { overflow-x: auto; }
body.ps1 .hrtabelle { border-collapse: separate; border-spacing: 2px; font-size: .75rem; width: 100%; table-layout: fixed; }
body.ps1 .hrtabelle th.hrpunkt { width: 13.5rem; text-align: left; font-size: .75rem; line-height: 1.2; font-weight: 600; padding: .1rem .5rem .1rem 0; position: sticky; left: 0; background: var(--surface); z-index: 1; }
body.ps1 .hrtabelle th.hrpunkt a { color: var(--accent); text-decoration: underline; text-underline-offset: 2px; text-decoration-color: var(--hair); display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
body.ps1 .hrtabelle th.hrpunkt small { display: block; line-height: 1.1; font-weight: 400; color: var(--muted); font-size: .75rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
body.ps1 .hrtabelle th.hrtag { font-weight: 600; color: var(--muted); padding: 0; text-align: center; line-height: 1.15; }
body.ps1 .hrtabelle th.hrtag span { display: block; font-weight: 400; font-size: .625rem; }
body.ps1 .hrtabelle th.hrtag.we { color: var(--text); }
body.ps1 .hrtabelle td.hr { height: 26px; padding: 0; vertical-align: middle; text-align: center; border-radius: 4px; font-variant-numeric: tabular-nums; white-space: nowrap; overflow: hidden; }
body.ps1 .hr.da { background: var(--ok-soft); color: var(--ok); }
body.ps1 .hr.abw { background: var(--warn-soft); color: var(--warn); font-weight: 700; box-shadow: inset 0 0 0 1.5px var(--warn); }
body.ps1 .hr.fehlt { background: var(--crit-soft); color: var(--crit); font-weight: 700; }
body.ps1 .hr.heute { box-shadow: inset 0 0 0 1.5px var(--accent); color: var(--accent); }
body.ps1 .hr.ruhe { color: var(--muted); }
body.ps1 .hr.woluecke { background: var(--crit-soft); opacity: .55; }
body.ps1 .hr.leer, body.ps1 .hr.kommt { background: var(--fill); }
body.ps1 .hr.kommt { opacity: .45; }
body.ps1 .hrtabelle tr.still th.hrpunkt a { color: var(--muted); }
body.ps1 .hrtabelle .hrluecken { width: 8.5rem; text-align: left; font-size: .75rem; padding-left: .5rem; }
body.ps1 .hrtabelle td.hrluecken { line-height: 1.15; }
body.ps1 .hrtabelle td.hrluecken small { display: block; color: var(--muted); font-size: .75rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
body.ps1 .hrtabelle .crit { color: var(--crit); font-weight: 700; }
body.ps1 .hrtabelle .ok { color: var(--ok); }
body.ps1 .hraster .card-head .crit { color: var(--crit); font-weight: 700; }

/* --- Nr. 22: Betrieb fertig einrichten (Einstellungen) --- */
body.ps1 main.einstmit { max-width: 1120px; }
body.ps1 main.einstmit .einstzwei { display: grid; gap: 1rem; grid-template-columns: minmax(0, 320px) minmax(0, 1fr); align-items: start; }
body.ps1 main.einstmit .einstrechts, body.ps1 main.einstmit .einstgruppen { min-width: 0; }
body.ps1 main.einstmit .einrichten { position: sticky; top: 1rem; margin: 0; }
@media (max-width: 999px) { body.ps1 main.einstmit .einstzwei { grid-template-columns: minmax(0, 1fr); } body.ps1 main.einstmit .einrichten { position: static; } }
body.ps1 .einrichten .lsbalken { margin-bottom: .6rem; }
body.ps1 .ehliste { list-style: none; margin: 0; padding: 0; }
body.ps1 .ehzeile + .ehzeile { border-top: 1px solid var(--hair); }
body.ps1 .ehzeile a { display: flex; gap: .6rem; align-items: center; min-height: 44px; padding: .3rem 0; color: var(--text); text-decoration: none; }
body.ps1 .ehzeichen { flex: none; width: 22px; height: 22px; border-radius: 50%; border: 2px solid var(--accent); display: inline-flex; align-items: center; justify-content: center; font-size: .75rem; font-weight: 700; color: var(--accent-ink); }
body.ps1 .ehzeile.ok .ehzeichen { background: var(--ok); border-color: var(--ok); }
body.ps1 .ehtext { display: flex; flex-direction: column; min-width: 0; font-size: .875rem; }
body.ps1 .ehtext small { color: var(--muted); font-size: .75rem; }
body.ps1 .ehzeile.offen .ehtext b { color: var(--accent); text-decoration: underline; text-underline-offset: 3px; }
body.ps1 .ehzeile.offen .ehtext small { color: var(--crit); }
body.ps1 .ehzeile.ok .ehtext b { font-weight: 600; }

/* --- Nr. 29: Suche mit Inhalten - die Art ist jetzt auch "Nachschlagen", "Checkliste" --- */
body.ps1 .lksuche-liste .art { width: 6rem; font-size: .75rem; letter-spacing: .03em; }

/* --- Küche planen bei 1440 px (Paket 4b): nach Paket 2 waren noch 67 px des Bedarfs und 147 px der Personentabelle versteckt (1.324 / 1.404 px
   Tabelle in 1.257 px - gemessen mit zwei Personen in der Planung). Beide Tabellen behalten identische, feste Spalten (colgroup) - nur etwas
   schmaler: Abstand 2 statt 3 px, Stunde 3,1 statt 3,4 rem (je Haelfte 24 statt 26 px - am Rechner mit der Maus), Name 10,5 statt 11,8 rem,
   Uhrzeit rechts 7,2 statt 8,6 rem (sie darf zweizeilig umbrechen). Gemessen: 0 px versteckt, keine Zelle abgeschnitten (kueche-1440.test.js
   prueft die Rechnung). --- */
@media (min-width: 1000px) {
  body.ps1 .kbedarf, body.ps1 .kwer { border-spacing: 2px; }
  body.ps1 .kcol-name { width: 10.5rem; }
  body.ps1 .kcol-std { width: calc(3.1rem + 2px); }
  body.ps1 .kwer .kcol-summe { width: 7.2rem; }
}

/* --- Nr. 21: Bedarf --- */
body.ps1 .brkopiezeile { display: flex; flex-wrap: wrap; align-items: center; gap: .4rem .6rem; margin: .8rem 0 0; }
body.ps1 .brkopiezeile .brkvon { display: inline-flex; align-items: center; gap: .4rem; font-weight: 600; font-size: .875rem; }
body.ps1 .brkopiezeile .brknach { display: inline-flex; flex-wrap: wrap; gap: .3rem; }
body.ps1 .brkopiezeile .chip input:disabled + span { opacity: .4; }
body.ps1 .bdneu { margin-top: 1.2rem; }
body.ps1 .bdneu > summary .hint { font-weight: 400; margin-left: .4rem; }


/* --- Nr. 35: Monat - was los ist und wer weg ist, in der Zelle; Stunden und Euro je Woche am Rand --- */
/* Die Zelle ist eine Flex-Reihe (Zahl oben links); die Zeile darunter bricht um (flex-wrap) und nimmt die ganze Breite - nur im Monat der Planung. */
.plankalender:not(.kacheln) .plankalender-grid td > a, .plankalender:not(.kacheln) .plankalender-grid td > span { flex-wrap: wrap; align-content: flex-start; }
.plankalender:not(.kacheln) .kalinfo { flex: 0 0 100%; width: 100%; min-width: 0; margin-top: 3px; }
.plankalender:not(.kacheln) .kalevname,
.plankalender:not(.kacheln) .kalweg {
  display: block; max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  font-family: var(--f-text); font-size: .75rem; line-height: 1.3; font-weight: 600; text-align: left;
}
.plankalender:not(.kacheln) .kalevname { color: var(--wahl); }
.plankalender:not(.kacheln) .kalweg { color: var(--muted); }
.plankalender:not(.kacheln) .kalweg.ueber { color: var(--crit); }
/* Lesbar statt durchsichtig (25.10.2026, Messung aller Planungsseiten hell und dunkel): mit Deckkraft kam der Text auf 2,4:1 (hell) bzw. 3,9:1 (dunkel) - die
   Tinte "leise" (--muted, >= 4,5:1 auf jedem Grund) sagt dasselbe, ohne vom Grund abzuhaengen. */
.plankalender:not(.kacheln) td.vorbei .kalinfo { opacity: 1; }
.plankalender:not(.kacheln) td.vorbei .kalweg:not(.ueber) { color: var(--kal-leise); }
.plankalender-grid th.kalrand { text-align: right; padding-right: .5rem; white-space: nowrap; }
.plankalender-grid td.kalrand { vertical-align: top; text-align: right; border: 0; border-left: 1px solid var(--hair); width: 5.5rem; }
.plankalender-grid td.kalrand .kalrandbox { padding: .3rem .5rem; }
.plankalender-grid td.kalrand .kalrandbox span { display: block; font-family: var(--f-text); font-size: .75rem; line-height: 1.35; font-variant-numeric: tabular-nums; }
.plankalender-grid td.kalrand .kalrandstd { color: var(--muted); }
.plankalender-grid td.kalrand .kalrandeur { font-weight: 700; color: var(--text); }

/* --- Nr. 36: Bedarf gegen Plan - "3 / 2" in derselben Zelle, die Ampel mit Wort je Tag --- */
.bedarfsraster[data-mitplan] .brzelle { position: relative; }
.bedarfsraster .brplan {
  position: absolute; right: 2px; bottom: 1px; pointer-events: none;
  font-size: .625rem; line-height: 1; font-weight: 700; font-variant-numeric: tabular-nums; color: var(--muted);
  background: var(--surface); border-radius: 3px; padding: 1px 2px;
}
.bedarfsraster .brplan.bp-fehlt { color: var(--crit); }
.bedarfsraster .brplan.bp-passt { color: var(--ok); }
/* Lesbar statt durchsichtig (25.10.2026, Messung aller Planungsseiten hell und dunkel): mit Deckkraft kam der Text auf 2,4:1 (hell) bzw. 3,5:1 (dunkel) - die
   Tinte "leise" (--muted, >= 4,5:1 auf jedem Grund) sagt dasselbe, ohne vom Grund abzuhaengen. */
.bedarfsraster .brplan.bp-vorbei, .bedarfsraster .brplan.bp-vorbei * { opacity: 1; color: var(--muted); }
.bedarfsraster th.brplanstatus, .bedarfsraster td.brplanstatus { text-align: left; padding-left: .6rem; font-size: .875rem; min-width: 7rem; max-width: 10rem; }
.bedarfsraster th.brplanstatus { white-space: nowrap; }
.bedarfsraster td.brplanstatus b { display: block; }
.bedarfsraster td.brplanstatus small { display: block; color: var(--muted); font-size: .75rem; }
.bedarfsraster td.brplanstatus.bp-fehlt b { color: var(--crit); }
.bedarfsraster td.brplanstatus.bp-passt b { color: var(--ok); }
.bpkopf { display: flex; flex-wrap: wrap; align-items: center; gap: .3rem 1rem; margin: 0 0 .6rem; }
.bpkopf .bpwoche { display: inline-flex; align-items: center; gap: .4rem; }
.bpkopf .bplegende { font-size: .875rem; color: var(--muted); }
.bpkopf .bplegende .bp-fehlt { color: var(--crit); font-weight: 600; }
.bpkopf .bplegende .bp-passt { color: var(--ok); font-weight: 600; }
.bpkopf .bplegende a { color: var(--accent); text-decoration: underline; text-underline-offset: 3px; }
.bpkopf .bpbsp { font-weight: 700; color: var(--text); }
.bpkopf .bpbsp small { font-size: .75rem; color: var(--crit); }
.bphandy { display: none; list-style: none; margin: .2rem 0 0; padding: 0; width: 100%; }
.bphandy li { padding: .3rem 0; border-top: 1px solid var(--hair); font-size: .875rem; }
.bphandy li.bp-fehlt { color: var(--crit); }
.bphandy li.bp-passt { color: var(--ok); }
@media (max-width: 699px) { .bphandy { display: block; } }

/* --- Nr. 37: Papiere nach Ablaufdatum, in Stufen --- */
.papierablauf .pastufe { margin-top: .6rem; }
.papierablauf .pastitel { font-size: .875rem; margin: .4rem 0 .2rem; }
.papierablauf .pastufe-abgelaufen .pastitel { color: var(--crit); }
.papierablauf .pastufe-7 .pastitel { color: var(--crit); }

/* --- Nr. 38: Grenze "hoechstens N gleichzeitig weg" - Warnung, keine Sperre --- */
.awzraster .awzn.ueber { color: var(--crit); font-weight: 700; background: var(--crit-soft); border-radius: 4px; }
.awzname .awzgrenze { font-size: .75rem; color: var(--crit); font-weight: 600; }
.awzgrenzsatz { margin: .5rem 0 0; font-size: .875rem; color: var(--ok); }
.awzgrenzsatz.warn { color: var(--crit); font-weight: 600; }
.awzgrenzsatz a { color: var(--accent); text-decoration: underline; text-underline-offset: 3px; font-weight: 400; margin-left: .4rem; }
.abegrenze { margin: .2rem 0 .4rem; }

/* --- Nr. 39: Tausch vergeben - wer sich sonst gemeldet hatte --- */
.tvliste { margin-top: .8rem; border-top: 1px solid var(--hair); padding-top: .5rem; }
.tvliste .tvtitel { font-size: .875rem; margin: 0 0 .3rem; }
.tvliste ul { list-style: none; margin: 0; padding: 0; }
.tvzeile { display: flex; flex-wrap: wrap; gap: .15rem .8rem; align-items: baseline; padding: .35rem 0 .35rem .6rem; border-top: 1px solid var(--hair); font-size: .875rem; }
.tvzeile:first-child { border-top: 0; }
.tvzeile.tvaus { box-shadow: inset 3px 0 0 var(--crit); }
.tvzeile .tvwas { color: var(--muted); }
.tvzeile .tvandere a { color: var(--accent); text-decoration: underline; text-underline-offset: 3px; }


/* Die Planung im Hellen (05.10.2026) - erzeugt aus PLANUNG_HELL oben. */
@media not (prefers-color-scheme: dark) {
:root:not([data-theme="dark"]) body:not([data-app="team"]) .stufe-knapp > .wszzahl { background: var(--crit); color: var(--crit-ink); }
:root:not([data-theme="dark"]) body:not([data-app="team"]) .kalluecke { background: var(--crit); color: var(--crit-ink); }
:root:not([data-theme="dark"]) body:not([data-app="team"]) .tag.warn { color: var(--text-soft); }
:root:not([data-theme="dark"]) body:not([data-app="team"]) .tag.warn .crewav-mini { background: var(--gold); color: var(--deep); }
:root:not([data-theme="dark"]) body:not([data-app="team"]) .bmeldung.zuviel { border-left-color: var(--text-soft); }
:root:not([data-theme="dark"]) body:not([data-app="team"]) .bmeldung.zuviel .bmzahl { color: var(--text-soft); }
:root:not([data-theme="dark"]) body:not([data-app="team"]) .stz-viel { background: var(--gold-soft); color: var(--text-soft); }
:root:not([data-theme="dark"]) body:not([data-app="team"]) .warnbox { background: var(--gold-soft); color: var(--text); box-shadow: inset 3px 0 0 var(--text-soft); }
:root:not([data-theme="dark"]) body:not([data-app="team"]) .banner.warn { background: var(--gold-soft); box-shadow: inset 3px 0 0 var(--text-soft); }
:root:not([data-theme="dark"]) body:not([data-app="team"]) .banner.warn > span { color: var(--text); }
:root:not([data-theme="dark"]) body:not([data-app="team"]) .statuspill.is-offen { background: var(--gold-soft); color: var(--text-soft); border-color: var(--text-soft); box-shadow: none; }
:root:not([data-theme="dark"]) body:not([data-app="team"]) .statuspill.is-offen .ic2 { background: var(--text-soft); color: var(--surface); }
:root:not([data-theme="dark"]) body:not([data-app="team"]) .statusdot.pause { background: var(--gold-soft); color: var(--text-soft); }
:root:not([data-theme="dark"]) body:not([data-app="team"]) .zkstand.wartet,
:root:not([data-theme="dark"]) body:not([data-app="team"]) .timeline .row.dokwartet { box-shadow: inset 3px 0 0 var(--text-soft); }
:root:not([data-theme="dark"]) body:not([data-app="team"]) .wmarke.wartet,
:root:not([data-theme="dark"]) body:not([data-app="team"]) .woffen,
:root:not([data-theme="dark"]) body:not([data-app="team"]) .wpweg,
:root:not([data-theme="dark"]) body:not([data-app="team"]) .bereichzahl strong,
:root:not([data-theme="dark"]) body:not([data-app="team"]) .invrow .who .unit { color: var(--text-soft); }
:root:not([data-theme="dark"]) body:not([data-app="team"]) .invrow .who .unit { background: var(--gold-soft); }
:root:not([data-theme="dark"]) body:not([data-app="team"]) .dayhead .weekendtag { background: var(--gold-soft); color: var(--text-soft); }
:root:not([data-theme="dark"]) body:not([data-app="team"]) .wtweg.beantragt { border-color: var(--text-soft); }
:root:not([data-theme="dark"]) body:not([data-app="team"]) .hubtabs a[aria-current="page"] { background: var(--accent-soft); color: var(--accent); }
:root:not([data-theme="dark"]) body:not([data-app="team"]) .wtchip.b-bar,
:root:not([data-theme="dark"]) body:not([data-app="team"]) .wtchip.b-kueche,
:root:not([data-theme="dark"]) body:not([data-app="team"]) .wtchip.b-office { background: var(--chip-flaeche); }
:root:not([data-theme="dark"]) body:not([data-app="team"]) .wtchip.krank { background: var(--crit-soft); }
:root:not([data-theme="dark"]) body:not([data-app="team"]) .wtchip.krank.ersetzt { background: var(--surface-2); }
:root:not([data-theme="dark"]) body:not([data-app="team"]) td.wtzelle.heute { background: color-mix(in srgb, var(--accent) 9%, transparent); }
:root:not([data-theme="dark"]) body:not([data-app="team"]) .btn.secondary:not(.newskarte .btn),
:root:not([data-theme="dark"]) body:not([data-app="team"]) .hbplus,
:root:not([data-theme="dark"]) body:not([data-app="team"]) .bigbtn.secondary { background: transparent; border: 1.5px solid currentColor; }
:root:not([data-theme="dark"]) body:not([data-app="team"]) .hbav { background: var(--wahl-soft); color: var(--accent); }
:root:not([data-theme="dark"]) body:not([data-app="team"]) .hbstatus.fehlt { background: var(--surface); border-color: transparent; box-shadow: inset 4px 0 0 var(--crit); }
:root:not([data-theme="dark"]) body:not([data-app="team"]) .hbstatus.passt { background: var(--surface); border-color: transparent; box-shadow: inset 4px 0 0 var(--ok); }
:root:not([data-theme="dark"]) body:not([data-app="team"]) .hbstatus.fehlt .hbstatustext small,
:root:not([data-theme="dark"]) body:not([data-app="team"]) .hbstatus.passt .hbstatustext small { color: var(--text-soft); }
:root:not([data-theme="dark"]) body:not([data-app="team"]) .hbbedarf.fehlt { background: var(--surface); border-color: transparent; box-shadow: inset 4px 0 0 var(--crit); }
:root:not([data-theme="dark"]) body:not([data-app="team"]) .hbperson:has(.laeuft) .hbav { background: var(--ok-soft); color: var(--ok); }
:root:not([data-theme="dark"]) body:not([data-app="team"]) .hbperson.wartet .hbav,
:root:not([data-theme="dark"]) body:not([data-app="team"]) .hbfrei .hbav { background: transparent; color: var(--muted); border-color: var(--plus); }
:root:not([data-theme="dark"]) body:not([data-app="team"]) .hbfrei .hbav { color: var(--accent); }
:root:not([data-theme="dark"]) body:not([data-app="team"]) .hbkrank .hbav { background: var(--crit-soft); color: var(--crit); }
}
:root[data-theme="light"] body:not([data-app="team"]) .stufe-knapp > .wszzahl { background: var(--crit); color: var(--crit-ink); }
:root[data-theme="light"] body:not([data-app="team"]) .kalluecke { background: var(--crit); color: var(--crit-ink); }
:root[data-theme="light"] body:not([data-app="team"]) .tag.warn { color: var(--text-soft); }
:root[data-theme="light"] body:not([data-app="team"]) .tag.warn .crewav-mini { background: var(--gold); color: var(--deep); }
:root[data-theme="light"] body:not([data-app="team"]) .bmeldung.zuviel { border-left-color: var(--text-soft); }
:root[data-theme="light"] body:not([data-app="team"]) .bmeldung.zuviel .bmzahl { color: var(--text-soft); }
:root[data-theme="light"] body:not([data-app="team"]) .stz-viel { background: var(--gold-soft); color: var(--text-soft); }
:root[data-theme="light"] body:not([data-app="team"]) .warnbox { background: var(--gold-soft); color: var(--text); box-shadow: inset 3px 0 0 var(--text-soft); }
:root[data-theme="light"] body:not([data-app="team"]) .banner.warn { background: var(--gold-soft); box-shadow: inset 3px 0 0 var(--text-soft); }
:root[data-theme="light"] body:not([data-app="team"]) .banner.warn > span { color: var(--text); }
:root[data-theme="light"] body:not([data-app="team"]) .statuspill.is-offen { background: var(--gold-soft); color: var(--text-soft); border-color: var(--text-soft); box-shadow: none; }
:root[data-theme="light"] body:not([data-app="team"]) .statuspill.is-offen .ic2 { background: var(--text-soft); color: var(--surface); }
:root[data-theme="light"] body:not([data-app="team"]) .statusdot.pause { background: var(--gold-soft); color: var(--text-soft); }
:root[data-theme="light"] body:not([data-app="team"]) .zkstand.wartet,
:root[data-theme="light"] body:not([data-app="team"]) .timeline .row.dokwartet { box-shadow: inset 3px 0 0 var(--text-soft); }
:root[data-theme="light"] body:not([data-app="team"]) .wmarke.wartet,
:root[data-theme="light"] body:not([data-app="team"]) .woffen,
:root[data-theme="light"] body:not([data-app="team"]) .wpweg,
:root[data-theme="light"] body:not([data-app="team"]) .bereichzahl strong,
:root[data-theme="light"] body:not([data-app="team"]) .invrow .who .unit { color: var(--text-soft); }
:root[data-theme="light"] body:not([data-app="team"]) .invrow .who .unit { background: var(--gold-soft); }
:root[data-theme="light"] body:not([data-app="team"]) .dayhead .weekendtag { background: var(--gold-soft); color: var(--text-soft); }
:root[data-theme="light"] body:not([data-app="team"]) .wtweg.beantragt { border-color: var(--text-soft); }
:root[data-theme="light"] body:not([data-app="team"]) .hubtabs a[aria-current="page"] { background: var(--accent-soft); color: var(--accent); }
:root[data-theme="light"] body:not([data-app="team"]) .wtchip.b-bar,
:root[data-theme="light"] body:not([data-app="team"]) .wtchip.b-kueche,
:root[data-theme="light"] body:not([data-app="team"]) .wtchip.b-office { background: var(--chip-flaeche); }
:root[data-theme="light"] body:not([data-app="team"]) .wtchip.krank { background: var(--crit-soft); }
:root[data-theme="light"] body:not([data-app="team"]) .wtchip.krank.ersetzt { background: var(--surface-2); }
:root[data-theme="light"] body:not([data-app="team"]) td.wtzelle.heute { background: color-mix(in srgb, var(--accent) 9%, transparent); }
:root[data-theme="light"] body:not([data-app="team"]) .btn.secondary:not(.newskarte .btn),
:root[data-theme="light"] body:not([data-app="team"]) .hbplus,
:root[data-theme="light"] body:not([data-app="team"]) .bigbtn.secondary { background: transparent; border: 1.5px solid currentColor; }
:root[data-theme="light"] body:not([data-app="team"]) .hbav { background: var(--wahl-soft); color: var(--accent); }
:root[data-theme="light"] body:not([data-app="team"]) .hbstatus.fehlt { background: var(--surface); border-color: transparent; box-shadow: inset 4px 0 0 var(--crit); }
:root[data-theme="light"] body:not([data-app="team"]) .hbstatus.passt { background: var(--surface); border-color: transparent; box-shadow: inset 4px 0 0 var(--ok); }
:root[data-theme="light"] body:not([data-app="team"]) .hbstatus.fehlt .hbstatustext small,
:root[data-theme="light"] body:not([data-app="team"]) .hbstatus.passt .hbstatustext small { color: var(--text-soft); }
:root[data-theme="light"] body:not([data-app="team"]) .hbbedarf.fehlt { background: var(--surface); border-color: transparent; box-shadow: inset 4px 0 0 var(--crit); }
:root[data-theme="light"] body:not([data-app="team"]) .hbperson:has(.laeuft) .hbav { background: var(--ok-soft); color: var(--ok); }
:root[data-theme="light"] body:not([data-app="team"]) .hbperson.wartet .hbav,
:root[data-theme="light"] body:not([data-app="team"]) .hbfrei .hbav { background: transparent; color: var(--muted); border-color: var(--plus); }
:root[data-theme="light"] body:not([data-app="team"]) .hbfrei .hbav { color: var(--accent); }
:root[data-theme="light"] body:not([data-app="team"]) .hbkrank .hbav { background: var(--crit-soft); color: var(--crit); }
