:root {
  --ink: #f0f0ef;
  --paper: #0a0b0c;
  --card: #26282c;
  --line: #3a3c40;
  /* NAME-1b (16.09.2026): KUPFER STATT GOLD. Vom Betreiber verlangt:
     "alles was jetzt gold ist in kupfer". Die Toene sind aus dem Logo
     gemessen (assets/veluzis-logo-original.png, System.Drawing):
     Schriftzug im Mittel #d68958, Schattenkupfer #9a4720.
     GERECHNET (WCAG), nicht geschaetzt:
       --accent dunkel #d68958: 7,11:1 auf --paper, 5,33:1 auf --card,
         6,29:1 mit --auf-akzent (#1c1a10)   (Gold vorher 7,38 / 5,53 / 6,53)
       --accent-dark / --accent hell #9a4a22: 5,56:1 auf hellem --paper,
         6,22:1 auf Weiss und mit weisser Schrift (vorher 5,35 / 5,99)
       --knopf-primaer #9f5328: 5,61:1 mit weisser Schrift, darueber --knopf-verlauf (jeder Halt ueber 4,5:1)
     Die Kommentare darunter nennen die alten Goldwerte als Geschichte. */
  --accent: #d68958;
  --accent-dark: #9a4a22;
  --warn: #e07452;
  --warn-bg: #2a1710;
  /* Gegenstueck zu --warn. Stand bisher 27x hart als #3f9e5c im
     Frontend - meist direkt neben var(--warn) im selben Ausdruck.
     NACHGEMESSEN am 27.08.2026: #3f9e5c kam auf einer Karte
     (--card #26282c) auf 4,40:1 und lag damit knapp unter den 4,5:1
     der WCAG - auf der Seite selbst (5,87:1) war es in Ordnung, nur
     in einer Karte nicht, und dort steht der meiste Text. Fuenf
     Prozent aufgehellt sind es 4,77:1 auf der Karte und 6,36:1 auf
     der Seite. Dieselbe Ueberlegung wie am 20.08.2026 fuer das helle
     Design, nur andersherum. */
  --gut: #42a560;
  --pause-start: #5a5d61;
  --pause-ende: #c98a1f;
  --belege-farbe: #7a3b3b;
  --muted: #9a9d9f;
  /* S2-14c (30.08.2026): Die ZWEITE Datenreihe im DB1-Diagramm.
     Sie folgt bewusst NICHT dem Akzent - der traegt die erste Reihe
     (Umsatz), und zwei Reihen in derselben Farbe waeren keine zwei
     Reihen mehr. Das ist dieselbe Ueberlegung wie bei Rot und Gruen
     fuer einen Status: eine Aussage, keine Marke.
     GEMESSEN auf --card: dunkel 5,84:1, hell 4,62:1 - beide ueber den
     3:1, die die WCAG fuer ein grafisches Objekt verlangt, und sogar
     ueber den 4,5:1 fuer Text. */
  --diagramm-reihe-2: #6fa8dc;
  --radius: 10px;
  /* AB-F1659 (20.10.2026, Wunsch des Betreibers): die Kopfleiste traegt
     das Schwarz hinter den Kacheln (--paper) statt des Graus der Karten.
     Bis dahin #26282c (AB-F1653: folgt der Kachelfarbe nicht - bleibt so). */
  --topbar-bg: #0a0b0c;
  /* S2-14/F-5b (26.08.2026): Text auf dunklem Grund - Kopfleiste,
     Zaehlerblasen, farbige Tabellenzellen, Kamerasucher. Diese
     Flaechen sind in BEIDEN Themes dunkel, deshalb steht der Ton
     nur hier und wird im hellen Design nicht ueberschrieben.
     Er stand vorher an 60 Stellen hart als #fff. */
  --auf-dunkel: #fff;
  /* Die rote Zaehlerblase an den Kacheln. Stand dreimal hart. */
  --blase-bg: #c0392b;
  /* S2-14 (27.08.2026): Text auf der AKZENTFLAECHE - aktiver Reiter,
     Zaehlerpille, Sprunglink. Nicht dasselbe wie --auf-dunkel: --accent
     ist im dunklen Design ein HELLES Gold (#b89a6a) und im hellen ein
     DUNKLES Braun (#7a5f2e). Der Text muss also mitkippen.
     GEMESSEN: dunkler Text auf hellem Gold 6,53:1, weisser Text auf
     dunklem Braun 5,99:1 - beide ueber den 4,5:1 der WCAG. Vorher stand
     an zehn Stellen ein fester Wert, und JEDE fiel in einem der beiden
     Designs durch: #1c1a10 kam hell auf 2,91:1, Weiss kam dunkel auf
     2,67:1. Betroffen war auch .zum-inhalt - der Sprunglink, der die
     Bedienung ohne Maus ueberhaupt erst moeglich macht. */
  --auf-akzent: #1c1a10;
  /* Dieselbe Bauart wie --auf-akzent, fuer die Warnflaeche.
     GEMESSEN: --warn ist dunkel ein helles Lachs (#e07452) und
     hell ein dunkles Rotbraun (#914b35). Das Abzeichen
     "N ueberfaellig" stand mit weisser Schrift darauf und kam im
     dunklen Design auf 3,09:1. Dunkler Text erreicht dort 5,64:1,
     Weiss im hellen Design 6,44:1. */
  --auf-warn: #1c1a10;
  /* Der Hauptknopf. GEMESSEN am 27.08.2026: #96763c kam mit weisser
     Schrift auf 4,24:1 und lag damit unter den 4,5:1 der WCAG - und
     zwar am meistgeklickten Element der Anwendung. Vier Prozent
     abgedunkelt ergibt 4,56:1; der Unterschied ist mit blossem Auge
     nicht zu sehen, die Zahl schon. */
  --knopf-primaer: #9f5328;   /* NAME-1b: Kupfer, 5,61:1 mit Weiss - Grundfarbe unter dem Verlauf */
  /* NAME-1b (16.09.2026): Metall-Verlauf wie im Logo, vom Betreiber
     gewaehlt ("das kupfer ist nicht kupferartig genug"). JEDER Halt
     traegt weisse Schrift ueber 4,5:1: #ae5c2c 4,81, #8a4522 7,11,
     #a9582a 5,10. Ein hellerer Ton (#c26a36, 3,88) wurde verworfen.
     Ein Whitelabel-Kunde bekommt den Verlauf NICHT - setzeAkzent()
     setzt ihn dort auf none, sonst laege Kupfer ueber seiner Farbe. */
  --knopf-verlauf: linear-gradient(135deg, #ae5c2c 0%, #8a4522 55%, #a9582a 100%);

  /* ------------------------------------------------------------
     Schleier: eine Flaeche leicht abheben
     ------------------------------------------------------------
     GEMESSEN am 27.08.2026: Drei Flaechen standen auf
     rgba(255,255,255,0.03) - im dunklen Design hebt das die Flaeche
     leicht an, im hellen ist Weiss auf #f4f2ec SCHLICHT UNSICHTBAR.
     Die Kachel war dort einfach nicht da. Deshalb kippt der Schleier
     jetzt mit: hell wird abgedunkelt statt aufgehellt.

     Dasselbe beim Akzentschleier: Er war als rgba(184,154,106,...)
     hingeschrieben - das ist der Goldton des DUNKLEN Designs. Im
     hellen ist --accent ein dunkles Braun, der Schleier zeigte also
     die falsche Farbe. */
  --flaeche-leicht: rgba(255, 255, 255, 0.03);
  /* NAME-1b: derselbe Ton wie --accent dunkel (#d68958). */
  --akzent-schleier: rgba(214, 137, 88, 0.12);
  --akzent-schleier-stark: rgba(214, 137, 88, 0.18);
  --akzent-schleier-zart: rgba(214, 137, 88, 0.06);
  --akzent-schleier-kachel: rgba(214, 137, 88, 0.16);

  /* ------------------------------------------------------------
     Statusabzeichen und Meldungen
     ------------------------------------------------------------
     Sie standen als Zahlenpaare in style.css und waren damit fuer
     einen Whitelabel-Kunden unerreichbar - S2-14 verlangt aber, dass
     er ALLES anpassen kann, wenn er es bucht.

     ACHTUNG, hier ist eine Entscheidung offen: Diese Werte sind fuer
     das DUNKLE Design gebaut. Im hellen stehen sie deshalb als
     dunkle Chips auf hellem Grund. Lesbar sind sie (Pruefung 37
     rechnet jede einzeln nach), aber sie sehen fremd aus. Eine helle
     Fassung ist eine Gestaltungsfrage und keine Rechnung - sie
     gehoert zum Whitelabel-Paket und wird mit dem Betreiber
     entschieden. Bis dahin stehen die Werte NUR hier in :root und
     gelten in beiden Designs, so wie bisher. Es aendert sich also
     nichts am Aussehen; es ist nur benennbar geworden. */
  --marke-offen-grund: #3a2a1c;
  --marke-offen-schrift: #e8a978;
  --marke-angebot-grund: #1f2a3a;
  --marke-angebot-schrift: #8ab4d9;
  --marke-gut-grund: #22301f;
  --marke-gut-schrift: #9bcf8a;
  --marke-abgelehnt-grund: #33201f;
  --marke-abgelehnt-schrift: #d98a80;
  --meldung-fehler-grund: #3a1f18;
  --meldung-fehler-schrift: #f0937a;
  --meldung-fehler-rand: #6b3226;
  --meldung-gut-rand: #3d5c34;
  --meldung-info-grund: #1f2733;
  --meldung-info-schrift: #8ab0e0;
  --meldung-info-rand: #2f4968;
  /* Weitere Statusfarben, die auf einzelnen Seiten standen. Sie
     gehoeren in dieselbe Reihe wie die Marken darueber - und
     dieselbe offene Entscheidung gilt fuer sie: die helle Fassung
     ist Gestaltung, keine Rechnung. */
  --marke-faellig-grund: #3a1f1f;
  --marke-faellig-schrift: #e79a9a;
  --marke-gwg-grund: #2a2a1a;
  --marke-gwg-schrift: #cfc48a;
  --marke-hinweis-grund: rgba(214, 166, 44, 0.18);
  --marke-hinweis-schrift: #d6a62c;
  --marke-fehler-grund: rgba(200, 64, 64, 0.18);
  --marke-fehler-schrift: #c84040;
  --marke-technik-grund: rgba(120, 120, 200, 0.18);
  --marke-technik-schrift: #8a8ad0;
  --marke-neu-grund: rgba(63, 158, 92, 0.18);
  --marke-zelle-grund: rgba(90, 120, 160, 0.18);
  /* Kopfzeile einer Aktionsspalte (stile/geraetemanager.css:26).
     S2-14c, 02.09.2026: Das war ein HANDGESETZTER heller Goldton
     (#caa06b) mit dunkler Schrift (#2a1a08), in beiden Designs
     gleich. Damit war es die einzige Akzentflaeche der Anwendung,
     die setzeAkzent() NICHT erreicht - der Anwender in
     quelle/app/06-datum-feiertage.js setzt genau neun
     Eigenschaften, und diese beiden standen nicht darunter. Ein
     Mandant mit blauer Marke bekam eine goldene Spaltenkopfzeile,
     und zwar ohne jede Meldung.
     Jetzt aus dem Akzent abgeleitet - dieselbe Bauart, die der
     Betreiber am 30.08.2026 fuer die Schriftvariante festgelegt
     hat: Flaeche var(--accent), Schrift var(--auf-akzent). Beide
     werden vom Anwender gesetzt, also folgt die Kopfzeile jetzt
     mit.
     SICHTBARE FOLGE, damit sie niemand fuer einen Fehler haelt:
     Im dunklen Design bleibt es praktisch gleich (#caa06b ->
     #b89a6a). Im HELLEN Design kippt die Kopfzeile von hellem Gold
     mit dunkler Schrift auf dunkles Braun (#7a5f2e) mit weisser
     Schrift. NACHGERECHNET, nicht geschaetzt: alt 7,00:1, neu
     dunkel 6,53:1, neu hell 5,99:1 - alle drei weit ueber den
     4,5:1 der WCAG. */
  --marke-aktion-grund: var(--accent);
  --marke-aktion-schrift: var(--auf-akzent);
  /* Ampel der Vergleichsansicht. Reine Signalfarben - sie sollen in
     beiden Designs dasselbe bedeuten. */
  --signal-gut: #30a46c;
  --signal-warnung: #f5a524;
  --signal-schlecht: #e5484d;
  /* Das Band oben auf der Seite, wenn die Anwendung auf einer
     fremden Datenbank laeuft. GEMESSEN am 27.08.2026: Beide Baender
     trugen weisse Schrift - auf dem roten sind das 4,93:1, auf dem
     GOLDENEN nur 2,25:1. Das Hinweisband war also nicht zu lesen,
     ausgerechnet der Hinweis, der sagt, wo man gerade arbeitet.
     Dunkle Schrift erreicht dort 7,76:1. Die Schriftfarbe haengt
     deshalb am Band, nicht am Design. */
  --band-gefahr-grund: #c84040;
  --band-gefahr-schrift: #ffffff;
  --band-hinweis-grund: #d6a62c;
  --band-hinweis-schrift: #1c1a10;

  /* ------------------------------------------------------------
     Schatten, Fokusring, Ueberlagerung, eingelassene Flaeche
     ------------------------------------------------------------
     Alles vier stand als Zahl in den Regeln. Drei davon haben
     dasselbe Problem wie die Schleier: Ein Schatten mit 40 %
     Schwarz liegt im dunklen Design richtig, auf hellem Papier ist
     er ein schwarzer Balken. Sie kippen deshalb mit.

     Die Ueberlagerung hinter einem Fenster bleibt gleich - Abdunkeln
     ist Abdunkeln, in jedem Design.

     GEFUNDEN am 27.08.2026: .ak-umschalter stand auf
     var(--surface-0, rgba(0,0,0,0.15)). --surface-0 ist NIRGENDS
     definiert, der Ersatzwert hat also immer gegolten - dieselbe
     Bauart wie var(--gruen,#1e7a45) auf der Mitarbeiterseite.
     Die Flaeche heisst jetzt --flaeche-eingelassen und gibt es
     wirklich. */
  --schatten: 0 3px 12px rgba(0, 0, 0, 0.4);
  --schatten-hoch: 0 4px 16px rgba(0, 0, 0, 0.35);
  --schatten-schwebend: 0 2px 12px rgba(0, 0, 0, 0.4);
  --ueberlagerung: rgba(0, 0, 0, 0.6);
  --flaeche-eingelassen: rgba(0, 0, 0, 0.15);
  /* Der Ring um ein Feld mit Tastaturfokus. Stand zweimal in leicht
     verschiedenen Werten - einmal allgemein, einmal in der
     Anmeldemaske. Derselbe Zweck, also derselbe Wert. */
  --fokus-ring: 0 0 0 3px rgba(214, 137, 88, 0.28);   /* NAME-1b: --accent dunkel */
  /* Kopfzeile des gedruckten Stundenzettels. GEMESSEN am 27.08.2026:
     #8a8676 kam auf weissem Papier auf 3,65:1. Jetzt 4,97:1. */
  --papier-tinte-kopf: #737063;
  --papier-beruehrt: rgba(28, 26, 16, 0.04);

  /* ------------------------------------------------------------
     Anmeldemaske und Kopfleiste
     ------------------------------------------------------------
     Beide sind in BEIDEN Designs dunkel - das ist Absicht und im
     hellen Design gut zu sehen: Der Anmeldekasten steht als dunkle
     Karte auf hellem Grund. Deshalb stehen die Werte nur hier. */
  --dunkelflaeche: #16181b;
  --dunkelflaeche-rand: #2a2d30;
  --auf-dunkelflaeche: #f4f4f3;
  --auf-dunkelflaeche-gedaempft: #c7c8c9;
  /* GEMESSEN: #75787a kam auf der Anmeldebox auf 4,00:1. Es traegt
     den Satz, der erklaert, wie man ohne Zugang an einen kommt -
     also genau das, was ein neuer Benutzer sucht. Jetzt 4,85:1. */
  --auf-dunkelflaeche-leise: #838688;
  /* Rand und Schleier auf einer dunklen Flaeche - die Kopfleiste
     ist in beiden Designs dunkel, deshalb Weiss mit wenig Deckung. */
  --auf-dunkelflaeche-rand: rgba(255, 255, 255, 0.4);
  --auf-dunkelflaeche-schleier: rgba(255, 255, 255, 0.12);

  /* ------------------------------------------------------------
     S2-14 (27.08.2026): zwei Paletten, die KEIN Theme haben
     ------------------------------------------------------------
     Sie stehen bewusst nur hier in :root und werden im hellen
     Design NICHT ueberschrieben - genau wie --auf-dunkel. Der
     Grund ist aber ein anderer als dort: Diese Flaechen sollen
     in beiden Designs gleich aussehen, weil sie etwas Gedrucktes
     nachbilden.

     Sie tragen trotzdem einen Namen, weil sie vorher an 60
     Stellen in fuenf Dateien als Zahl standen. Wer den Cremeton
     aendern wollte, musste ihn suchen - und uebersah dabei, dass
     dieselbe Zahl an zwei voellig verschiedenen Dingen hing.

     WER SIE ANFASST, aendert das Aussehen von Papier. Ein Kunde
     mit eigenen Farben (Whitelabel) darf hier NICHT durchgreifen:
     Ein Stundenzettel geht an den Steuerberater und in die Akte. */

  /* Eingabefelder. Creme auf dunklem wie auf hellem Grund - das
     ist eine Gestaltungsentscheidung, kein vergessener Wert. */
  --feld-grund: #fdf6d8;
  --feld-schrift: #1c1a10;
  /* GEMESSEN am 27.08.2026: #8a8365 kam auf dem Cremefeld auf
     3,51:1. Ein Platzhalter ist Text und faellt nicht unter eine
     WCAG-Ausnahme - er sagt oft, WAS in das Feld gehoert. 16 %
     abgedunkelt sind es 4,73:1. */
  --feld-platzhalter: #736e54;
  --feld-grund-gesperrt: #eee5c0;
  --feld-schrift-gesperrt: #4a4530;

  /* Papier-Nachbildung: Stundenzettel, Jahresplan, Monatstabelle.
     Ein DIN-A4-Blatt ist weiss, seine Tinte dunkel - auch auf einem
     Bildschirm im Nachtmodus. */
  --papier-tinte: #1c1a10;
  --papier-tinte-gedaempft: #5a5750;
  --papier-tinte-blass: #9a958a;
  --papier-tinte-sehr-blass: #b3b0a3;
  --papier-tinte-kaum: #cfcabf;
  --papier-linie: #e4e0d0;
  --papier-creme: #fdf6d8;
  --papier-creme-kopf: #f3ecc8;
  --papier-creme-betont: #f0e2ae;
  --papier-creme-summe: #efe6c8;
  --papier-creme-gewaehlt: #d9c26e;
  --papier-grau: #ece8db;
  --papier-grau-betont: #e9e6dc;
  --papier-leer: #f3f2ee;
  --papier-wochenende-grund: #f7ece6;
  --papier-wochenende-schrift: #b5482a;
  /* Tag ausserhalb der Beschaeftigung im Jahresplan. NACHGEMESSEN am
     27.08.2026: Der vorherige Ton #2e7d4f kam auf dem hellgruenen Grund
     nur auf 4,38:1 und lag damit knapp unter den 4,5:1 der WCAG - bei
     11,5 Pixel fetter Schrift gilt die Ausnahme fuer grosse Schrift
     nicht. Der Wert hier ist KEIN neuer Farbton: Es ist derselbe, den
     --gut im hellen Design schon traegt, und er kommt auf 4,93:1. */
  --papier-gut: #2e7444;
  --papier-gut-grund: #e3f3e6;

  /* Die sechs Abwesenheits-Zustaende im Stundenzettel und im
     Jahresplan. Sie standen bis zum 27.08.2026 in DREI Dateien
     nebeneinander - mitarbeiter.css, personal-arbeitszeiten.css und
     personal-jahresplan.css -, und dabei war "Urlaub offen" viermal
     mit DREI verschiedenen Blautoenen hinterlegt: Der Beschaeftigte
     sah in seinem Jahresplan eine andere Farbe als der Objektleiter
     im selben Plan. Vereinheitlicht auf #2c5c85 auf #eef3f8 - das
     war die Mehrheit (zwei von vier) UND mit 6,32:1 der beste
     Kontrast; die abgeloeste Fassung kam auf 4,66:1. */
  --papier-krank-gemeldet-grund: #fbdcdc;
  --papier-krank-gemeldet-schrift: #a33;
  /* GEMESSEN: weisse Schrift auf #e0435a ergab 4,10:1. Neun Prozent
     abgedunkelt sind es 4,88:1 - dieselbe Groessenordnung wie die
     beiden anderen bestaetigten Zustaende (5,95:1 und 8,85:1). */
  --papier-krank-bestaetigt-grund: #cb3c51;
  --papier-fehlzeit-gemeldet-grund: #dcb3f7;
  --papier-fehlzeit-gemeldet-schrift: #5a1e96;
  --papier-fehlzeit-bestaetigt-grund: #8e2fd6;
  --papier-urlaub-offen-grund: #eef3f8;
  --papier-urlaub-offen-schrift: #2c5c85;
  --papier-urlaub-genehmigt-grund: #1c4c7c;
  /* Zeile mit Stunden, wenn die Maus darauf steht. */
  --papier-creme-beruehrt: #f5ecc0;
  /* Vertraglich geplante, noch nicht gearbeitete Stunden. Sie sollen
     zuruecktreten - aber lesbar bleiben. GEMESSEN: der vorherige Ton
     #9a958a kam auf 2,66:1. Dieser erreicht 4,55:1 und steht immer
     noch deutlich blasser als die normale Tinte (#1c1a10). */
  --papier-tinte-geplant: #716e66;
  --kalender-tag-bg: #0f1113;
  --kalender-tag-auftrag-bg: #241a12;
  --kalender-tag-feiertag-bg: #2a1710;
  --readout-bg: #1f1a16;
  font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
}

[data-theme="light"] {
  --ink: #1c2125;
  --paper: #f4f2ec;
  --card: #ffffff;
  --line: #ddd9cd;
  --muted: #6b6f72;
  /* Das helle Gegenstueck. GEMESSEN: Der dunkle Wert #6fa8dc kam auf
     weissem --card auf 2,53:1 und lag damit UNTER den 3:1 fuer ein
     grafisches Objekt - die DB1-Linien waren im hellen Design
     blass. Aufgefallen ist das nie, weil ein blasses Blau nicht nach
     einem Fehler aussieht. */
  --diagramm-reihe-2: #3d78b4;
  /* G-5: eigener --accent fuers helle Design noetig - der dunkle Goldton
     war fuer dunklen Hintergrund kalibriert (Kontrast dort 7.4:1), auf
     hellem Hintergrund nur 2.4:1 (unter dem WCAG-AA-Minimum von 3:1 fuer
     grosse/UI-Elemente, erst recht unter 4.5:1 fuer normalen Text - und
     --accent wird an 48+ Stellen als Textfarbe verwendet). Wiederverwendet
     den bereits vorhandenen --accent-dark-Ton (5.35:1 auf hellem
     Hintergrund), kein neuer Farbton im System noetig. */
  /* NAME-1b (16.09.2026): Kupfer #9a4a22, gleich --accent-dark - siehe :root. */
  --accent: #9a4a22;
  /* G-5: dieselbe Kontrast-Ueberlegung wie bei --accent - --warn (2.76:1)
     und --pause-ende (2.63:1) waren auf hellem Hintergrund ebenfalls unter
     dem WCAG-AA-Minimum. Dunklere Varianten derselben Farbfamilie. */
  --warn: #914b35;
  --warn-bg: #f7d9cc;
  /* #3f9e5c erreicht auf hellem Papier nur 3.00:1 und faellt damit
     unter die 4.5:1 der WCAG. #2e7444 erreicht 5.07:1 - dieselbe
     Groessenordnung wie --warn hell (5.75:1). */
  --gut: #2e7444;
  --pause-ende: #825914;
  --kalender-tag-bg: #eeece4;
  --kalender-tag-auftrag-bg: #f0dcc4;
  --kalender-tag-feiertag-bg: #f7d9cc;
  --readout-bg: #f2ead9;
  /* Hier ist --accent das dunkle Braun - der Text kippt auf Weiss. */
  --auf-akzent: #ffffff;
  /* Hier ist --warn das dunkle Rotbraun - der Text kippt auf Weiss. */
  --auf-warn: #ffffff;
  /* Auf hellem Papier wird abgedunkelt statt aufgehellt. */
  --flaeche-leicht: rgba(0, 0, 0, 0.03);
  /* --accent ist hier #9a4a22 - der Schleier traegt denselben Ton. */
  --akzent-schleier: rgba(154, 74, 34, 0.12);
  --akzent-schleier-stark: rgba(154, 74, 34, 0.18);
  --akzent-schleier-zart: rgba(154, 74, 34, 0.06);
  --akzent-schleier-kachel: rgba(154, 74, 34, 0.16);
  /* Auf hellem Papier duerfen Schatten nicht so schwer sein. */
  --schatten: 0 3px 12px rgba(0, 0, 0, 0.14);
  --schatten-hoch: 0 4px 16px rgba(0, 0, 0, 0.16);
  --schatten-schwebend: 0 2px 12px rgba(0, 0, 0, 0.18);
  --flaeche-eingelassen: rgba(0, 0, 0, 0.06);
  --fokus-ring: 0 0 0 3px rgba(154, 74, 34, 0.30);
}

/* KACHELFARBE (18.10.2026, vom Betreiber festgelegt, in Mensura am Handy
   ausprobiert): Im DUNKLEN Design ist die Farbe der Kacheln und Karten
   waehlbar - Grau (bisher, Vorgabe, steht oben in :root), Nachtblau oder
   Moosgruen. Geaendert werden nur --card und --line; Grund, Schrift,
   Kupfer und das ganze helle Design bleiben. Gesetzt wird das Attribut
   data-kachel von theme-fruh.js aus localStorage "kachel", gewaehlt im
   Benutzermenue (quelle/app/05-zugriff-oberflaeche.js).
   Das :not(light) ist Pflicht: Diese Regel ist spezifischer als
   [data-theme="light"] und wuerde sonst die weissen Karten des hellen
   Designs ueberschreiben.
   GERECHNET (WCAG) auf --card: --ink 15,31 / 13,36; --muted 6,40 / 5,58;
   --accent 6,30 / 5,50; --warn und --gut 5,64 / 4,92 (Nachtblau /
   Moosgruen) - alles ueber 4,5:1 und ueber dem bisherigen Grau.
   Pruefung 37 (kontrast-pruefen.py) rechnet beide Saetze als eigenes
   Design mit; wer hier einen Satz anlegt, muss NUR diesen Block ergaenzen.
   Grenze: Die Karte hebt sich weniger vom Grund ab als das Grau
   (1,13:1 / 1,29:1 statt 1,33:1) - so ausprobiert und gewollt. */
/* AB-F1660 (20.10.2026, Wunsch des Betreibers): Nachtblau ist durch
   SAPHIR PERLEFFEKT ersetzt (Fassung "Saphir tief", gleiche Helligkeit wie
   das Tannengruen; Wert "blau" bleibt). Schimmer auf den Startkacheln wie
   beim Gruen (Regel .dashboard-tile weiter unten). */
/* AB-F1661 (20.10.2026, Optik wie Mensura, vom Betreiber beauftragt): In
   Saphir und Tannengruen ist der Akzent das Logo-Kupfer #de7440 statt
   #d68958 - Symbole, Anfangsbuchstaben, Kupferschrift, Werte, Fokusring.
   Grau und das helle Design behalten #d68958 bzw. #9a4a22.
   GERECHNET (WCAG, werkzeuge/kontrast-pruefen.py rechnet --card mit):
     #de7440 auf --card Saphir #11264a 4,77:1, Tannengruen #162d1c 4,68:1;
     am hellsten Glanzpunkt (#203a66 / #25402a) 3,59:1 / 3,62:1 - unter
     4,5 fuer kleine Schrift, ueber 3:1 fuer Symbole; dieselbe Grenze wie
     AB-F1660 (dort 4,07 / 4,10 mit dem alten Kupfer), so in Mensura
     abgenommen (4,7 / 3,6).
     --auf-akzent #1c1a10 auf #de7440 5,54:1 - bleibt fuer die FLACHEN
     Akzentflaechen (Zaehlerpille, Sprunglink, Spaltenkopf, Testband).
     Weiss auf #de7440 kaeme nur auf 3,14:1 und faellt durch.
   Ein Whitelabel-Akzent (setzeAkzent() setzt --accent am Element) gewinnt
   weiter, weil der Stil am Element staerker ist als diese Regel. */
:root:not([data-theme="light"])[data-kachel="blau"] {
  --card: #11264a;
  --line: #284676;
  --accent: #de7440;
  --akzent-schleier: rgba(222, 116, 64, 0.12);
  --akzent-schleier-stark: rgba(222, 116, 64, 0.18);
  --akzent-schleier-zart: rgba(222, 116, 64, 0.06);
  --akzent-schleier-kachel: rgba(222, 116, 64, 0.16);
  --fokus-ring: 0 0 0 3px rgba(222, 116, 64, 0.28);
}
/* AB-F1660 (20.10.2026, Wunsch des Betreibers): Moosgruen ist durch
   TANNENGRUEN PERLEFFEKT ersetzt (Wert "gruen" bleibt, wer Moosgruen
   gewaehlt hatte, sieht sofort Tannengruen). --card ist der mittlere Ton
   des Lacks; die Startkacheln bekommen zusaetzlich den Schimmer (Regel
   .dashboard-tile weiter unten). Pruefung 37 rechnet gegen --card. */
:root:not([data-theme="light"])[data-kachel="gruen"] {
  --card: #162d1c;
  --line: #2e4a33;
  /* AB-F1661: Akzent und Schleier wie Saphir - Begruendung dort. */
  --accent: #de7440;
  --akzent-schleier: rgba(222, 116, 64, 0.12);
  --akzent-schleier-stark: rgba(222, 116, 64, 0.18);
  --akzent-schleier-zart: rgba(222, 116, 64, 0.06);
  --akzent-schleier-kachel: rgba(222, 116, 64, 0.16);
  --fokus-ring: 0 0 0 3px rgba(222, 116, 64, 0.28);
}

* { box-sizing: border-box; }

/* AB-F826 (23.09.2026): min-height 100vh war der Grund, warum sich die
   Kacheluebersicht der Mitarbeiter-App auf dem Handy trotz gerechneter
   Kachelhoehe noch scrollen liess. 100vh ist auf Android die Hoehe OHNE
   die Systemleisten - also MEHR als der sichtbare Bereich. Der Koerper
   war damit immer ein Stueck hoeher als das Fenster, und die Schleife in
   passeStundenHubAn() konnte den Ueberstand nie wegrechnen: sie verkleinert
   die Kacheln, aber min-height haelt den Koerper auf seinem Mass.

   100dvh folgt der WIRKLICH sichtbaren Hoehe. Die Zeile mit 100vh bleibt
   als Rueckfall fuer Browser ohne dvh davor stehen - sie wird von der
   folgenden ueberschrieben, wo dvh bekannt ist. */
body {
  margin: 0;
  background: var(--paper);
  color: var(--ink);
  min-height: 100vh;
  min-height: 100dvh;
  scrollbar-gutter: stable;
}

.topbar {
  display: flex;
  justify-content: space-between;
  align-items: flex-end;
  flex-wrap: wrap;
  gap: 10px 20px;
  padding: 16px 24px;
  background: var(--topbar-bg);
  /* AB-F1659 (20.10.2026, Wunsch des Betreibers): durchgezogener
     Kupferstrich ueber die ganze Breite statt der grauen Trennlinie. */
  border-bottom: 2px solid var(--accent);
  color: var(--auf-dunkel);
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  z-index: 100;
}

@media (max-width: 640px) {
  .topbar {
    padding: 8px 14px;
    gap: 0px 20px;
  }
  .topbar .who {
    justify-content: flex-end;
  }
  .topbar .logo-mark { font-size: 1.3rem; }
  .topbar .brand .topbar-sub { font-size: 0.9rem; margin-left: 10px; }
}

.topbar .brand {
  font-weight: 700;
  letter-spacing: 0.02em;
  font-size: 1.3rem;
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 10px;
}

.topbar-logo { height: 100px; width: auto; display: block; }

@media (max-width: 640px) {
  .topbar-logo { height: 70px; }
}

.topbar .logo-mark { display: flex; align-items: baseline; gap: 2px; font-size: 1.55rem; line-height: 1; }
.topbar .logo-mark .bold { font-weight: 800; color: var(--auf-dunkelflaeche); }
.topbar .logo-mark .slash { color: var(--accent); font-weight: 400; margin: 0 2px; transform: skewX(-15deg); display: inline-block; }
.topbar .logo-mark .thin { font-weight: 300; color: var(--muted); }
.topbar .brand .topbar-sub {
  display: none;
}

.topbar .brand .dot {
  width: 10px; height: 10px; border-radius: 50%;
  background: var(--accent);
  display: inline-block;
}

.topbar .who {
  font-size: 0.85rem;
  opacity: 0.9;
  display: flex;
  gap: 14px;
  align-items: flex-end;
}

/* OF-1 (30.08.2026): In der Kopfleiste steht nur noch das
   Abmeldesymbol. Der Knopf trug bis dahin das Wort "Abmelden" mit
   Rahmen; setupTopbar() hat den Text im Betrieb durch ein Symbol
   ersetzt und den Rahmen ueber style.cssText wieder abgeraeumt.

   Das Symbol steht jetzt schon im HTML. Zwei Gruende, beide gemessen:
   Erstens sah man bis dahin fuer den Bruchteil einer Sekunde den Text,
   bis app.js geladen war. Zweitens rufen protokoll.html und
   fehlerprotokoll.html setupTopbar() gar nicht auf - dort BLIEB der
   Text stehen, und der Knopf hatte nicht einmal einen Lauscher.

   min-height/min-width 44: dieselbe Groesse wie .seiten-nav-knopf.
   Ein Symbol allein ist ein kleines Ziel; auf dem Telefon wird es mit
   dem Daumen getroffen. */
.topbar button.logout {
  background: transparent;
  border: none;
  color: var(--auf-dunkel);
  padding: 6px;
  min-width: 44px;
  min-height: 44px;
  border-radius: 6px;
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  justify-content: center;
}
.topbar button.logout:hover { background: var(--auf-dunkelflaeche-schleier); }

/* setupTopbar() haengt die Pille unter das Logo (AB-F1684) und benennt sie
   dabei in topbar-user-unter-titel um. Bis das Skript geladen ist, stand die
   leere Huelle aber noch hier und nahm Breite ein. Sobald sie umzieht,
   trifft diese Regel nicht mehr, denn beides aendert sich: die Kennung
   UND der Elternknoten. */
.topbar #topbar-user { display: none; }

/* OF-4 (25.08.2026): Der Abstand zur festen Kopfleiste war ein
   AUSSENabstand. Ein Aussenabstand am ersten Kind faellt aus dem
   Koerper heraus und schiebt ihn nach unten - zusammen mit
   "body { min-height: 100vh }" war jede Seite dadurch genau 140 Pixel
   hoeher als das Fenster.

   GEMESSEN am 25.08.2026: Bei 1280x800, 1366x768, 1440x900 und
   1920x1080 war der Ueberhang jedes Mal exakt 140 - unabhaengig vom
   Inhalt. Das waren nie die Kacheln, das war diese eine Zeile.

   Als INNENabstand liegt derselbe Raum innerhalb des Kastens und
   zaehlt zur Hoehe. Sichtbar aendert sich nichts, aber eine kurze
   Seite scrollt nicht mehr. */
/* AB-F273 (03.09.2026): WAS EINE SEITENSTILDATEI HIER AENDERN DARF.
   14 Dateien unter stile/ definieren .wrap um. Das ist erlaubt -
   eine Auswertung braucht mehr Breite als 960px. Der obere und
   untere Abstand gehoert aber DIESER Regel, und zwar aus einem
   Grund, der sich nicht meldet:

   Ein 'margin-top' in einer Seitendatei ERSETZT das padding hier
   nicht, es kommt HINZU. Bis OF-4b (25.08.2026) stand der Abstand
   als 'margin-top: 140px' neben 'padding: 28px'; eine Seitendatei
   mit 'margin: 130px ...' ersetzte ihn also. Seit OF-4b steckt er
   im padding - dieselbe Zeile addiert seither 130 zu 168 und
   ergibt 298. Fuenf Seiten standen so ein Vierteljahr lang mit
   rund 300 statt 168 Pixeln Leerraum oben da, ohne Fehler und
   ohne Meldung (Regel 10).

   Zweitens toetet ein 'padding'-Kurzwort in einer Seitendatei die
   Mobilfassung darunter mit, weil es spaeter geladen wird.

   Also: max-width nach Bedarf, Seitenraender ueber padding-left /
   padding-right oder margin links/rechts - Oberkante und
   Unterkante bleiben hier. Pruefung 81 haelt das fest. */
.wrap {
  max-width: 960px;
  margin: 0 auto;
  padding: 168px 20px 60px;
}

@media (max-width: 640px) {
  /* 95 + 14 = 109, dieselbe Rechnung wie oben. */
  .wrap { padding: 109px 16px 40px; }
  .tabs { margin-bottom: 14px; }
  .card { margin-bottom: 12px; }
}

h1 { font-size: 1.5rem; margin: 0 0 4px; }
h2 { font-size: 1.15rem; margin: 28px 0 12px; }
p.lead { color: var(--muted); margin-top: 0; }

.card {
  background: var(--card);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  padding: 20px;
  margin-bottom: 18px;
}

#stunden-monatsplan-view:not(.hidden) {
  position: fixed;
  inset: 0;
  z-index: 200;
  background: var(--paper);
  overflow-y: auto;
  padding: 16px;
}

#tag-details.popup-modus:not(.hidden) {
  position: fixed;
  inset: 0;
  z-index: 200;
  background: var(--paper);
  overflow-y: auto;
  padding: 16px;
}

.grid-2 {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 14px;
}
@media (max-width: 640px) { .grid-2 { grid-template-columns: 1fr; } }

/* BE-4 (26.08.2026): Drei Felder in einer Zeile - Lieferant,
   Belegdatum, Faellig am. Gebaut wie .grid-2, damit sich beide gleich
   verhalten: Auf dem Telefon untereinander, dazwischen zweispaltig,
   damit ein Datumsfeld nicht auf 200 px zusammenschrumpft. */
.grid-3 {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  gap: 14px;
}
@media (max-width: 900px) { .grid-3 { grid-template-columns: 1fr 1fr; } }
@media (max-width: 640px) { .grid-3 { grid-template-columns: 1fr; } }

label {
  display: block;
  font-size: 0.82rem;
  font-weight: 600;
  margin-bottom: 5px;
  color: var(--ink);
}

input, select, textarea {
  width: 100%;
  padding: 10px 11px;
  border: 1px solid var(--line);
  border-radius: 7px;
  font-size: 1rem;
  margin-bottom: 14px;
  background: var(--feld-grund);
  color: var(--feld-schrift);
  font-family: inherit;
}
input:focus, select:focus, textarea:focus {
  outline: none;
  border-color: var(--accent);
  box-shadow: var(--fokus-ring);
}
input::placeholder, textarea::placeholder { color: var(--feld-platzhalter); }
select option { background: var(--feld-grund); color: var(--feld-schrift); }
input[readonly] { background: var(--feld-grund-gesperrt); color: var(--feld-schrift-gesperrt); cursor: default; }
/* AB-F1577 Nr. 50.36 (14.10.2026): ein GESPERRTES Feld sieht aus wie ein
   schreibgeschuetztes - dieselben zwei Werte, keine neue Farbe. Vorher blieb
   es hell wie ein freies (im Browser gesehen an der Positionsmaske, Lauf 56),
   nur die Knoepfe wurden grau. */
input:disabled, select:disabled, textarea:disabled { background: var(--feld-grund-gesperrt); color: var(--feld-schrift-gesperrt); cursor: default; }

/* Verhindert, dass der Browser seine eigene Autofill-Farbe reindrückt */
input:-webkit-autofill,
input:-webkit-autofill:hover,
input:-webkit-autofill:focus {
  -webkit-box-shadow: 0 0 0 1000px var(--feld-grund) inset;
  -webkit-text-fill-color: var(--feld-schrift);
}

button.primary {
  background: var(--knopf-primaer);
  background-image: var(--knopf-verlauf);
  color: var(--auf-dunkel);
  border: none;
  padding: 13px 20px;
  border-radius: 7px;
  font-size: 1rem;
  font-weight: 600;
  cursor: pointer;
}
button.primary:hover { background: var(--accent-dark); }
button.primary:disabled { opacity: 0.5; cursor: default; }

button.secondary {
  background: transparent;
  border: 1px solid var(--line);
  padding: 11px 16px;
  border-radius: 7px;
  cursor: pointer;
  font-size: 0.95rem;
  color: var(--ink);
}

.readout {
  background: var(--readout-bg);
  border: 1px dashed var(--accent);
  border-radius: 8px;
  padding: 12px 14px;
  font-size: 0.9rem;
  margin-bottom: 14px;
  color: var(--ink);
}
.readout b { color: var(--accent); }

table { width: 100%; border-collapse: collapse; font-size: 0.9rem; }
@media (max-width: 700px) {
  table { display: block; width: auto; max-width: 100%; overflow-x: auto; white-space: nowrap; -webkit-overflow-scrolling: touch; }
}
th, td { text-align: left; padding: 10px 8px; border-bottom: 1px solid var(--line); }
th { color: var(--muted); font-weight: 600; font-size: 0.78rem; text-transform: uppercase; letter-spacing: 0.03em; }

.badge {
  display: inline-block;
  padding: 3px 9px;
  border-radius: 999px;
  font-size: 0.72rem;
  font-weight: 700;
  letter-spacing: 0.02em;
}
.badge.offen { background: var(--marke-offen-grund); color: var(--marke-offen-schrift); }
.badge.angebot { background: var(--marke-angebot-grund); color: var(--marke-angebot-schrift); }
.badge.erledigt { background: var(--marke-gut-grund); color: var(--marke-gut-schrift); }
.badge.storniert { background: var(--marke-abgelehnt-grund); color: var(--marke-abgelehnt-schrift); text-decoration: line-through; }
.badge.genehmigt { background: var(--marke-gut-grund); color: var(--marke-gut-schrift); }
.badge.abgelehnt { background: var(--marke-abgelehnt-grund); color: var(--marke-abgelehnt-schrift); }

.checkbox-list {
  border: 1px solid var(--line);
  border-radius: 7px;
  padding: 10px 12px;
  margin-bottom: 14px;
  max-height: 160px;
  overflow-y: auto;
  /* --paper statt #0f1113: im Dunkeln ein Unterschied von 1.04:1 und
     damit unsichtbar, im Hellen der Unterschied zwischen lesbar und
     schwarzem Kasten. Der Rahmen var(--line) grenzt die Liste ab. */
  background: var(--paper);
}
.checkbox-item {
  display: flex;
  align-items: center;
  gap: 8px;
  font-size: 0.9rem;
  font-weight: 400;
  padding: 5px 0;
  margin-bottom: 0;
  color: var(--ink);
  cursor: pointer;
}
.checkbox-item input { width: auto; margin: 0; }

.auftrag-item {
  border: 1px solid var(--line);
  border-radius: var(--radius);
  padding: 16px;
  margin-bottom: 12px;
  cursor: pointer;
  background: var(--card);
  transition: box-shadow 0.15s, border-color 0.15s;
}
.auftrag-item:hover { border-color: var(--accent); box-shadow: var(--schatten); }
.auftrag-item h3 { margin: 0 0 6px; font-size: 1rem; }
.auftrag-item .meta { color: var(--muted); font-size: 0.85rem; }

canvas.sigpad {
  border: 1px dashed var(--accent);
  border-radius: 8px;
  width: 100%;
  height: 160px;
  touch-action: none;
  /* feste Farbe: Unterschrift wird als Bild gespeichert und gedruckt */ background: #fff;
}

.msg { padding: 10px 14px; border-radius: 7px; font-size: 0.88rem; margin-bottom: 14px; }
.msg.error { background: var(--meldung-fehler-grund); color: var(--meldung-fehler-schrift); }
.msg.success { background: var(--marke-gut-grund); color: var(--marke-gut-schrift); }
/* AB-F46 (02.09.2026): Ein Hinweis, der weder Fehler noch Erfolg ist -
   "so wurde gerechnet". Es gab .msg.error und .msg.success, aber kein
   .msg.info; ein <div class="msg info"> haette ohne Hintergrund
   dagestanden und waere kaum aufgefallen. Dieselben Farbvariablen wie
   .toast.info, damit derselbe Sachverhalt gleich aussieht. */
.msg.info { background: var(--meldung-info-grund); color: var(--meldung-info-schrift); border: 1px solid var(--meldung-info-rand); }
/* AB-F1577 Nr. 43.31 V3: die wartenden Stempel auf der Sperrkarte
   (sperrkarteStempelZeigen in quelle/app/05-zugriff-oberflaeche.js) -
   zum Abschreiben oder Abfotografieren. Keine eigene Farbe: die Liste
   steht in der .msg.error-Karte und erbt deren Schrift. */
.sperrkarte-stempel { margin: 10px 0; }
.sperrkarte-stempel p { margin: 0 0 6px; }
.sperrkarte-stempel ul { margin: 0; padding-left: 1.2em; }
.sperrkarte-stempel li { margin: 3px 0; font-weight: 600; }

/* G-2: einheitlicher Ersatz fuer alert() - siehe zeigeToast() in app.js */
#toast-container { position: fixed; bottom: 20px; left: 50%; transform: translateX(-50%); z-index: 9999; display: flex; flex-direction: column; gap: 8px; align-items: center; pointer-events: none; }
.toast { padding: 12px 20px; border-radius: 8px; font-size: 0.9rem; box-shadow: var(--schatten-hoch); max-width: min(90vw, 420px); text-align: center; pointer-events: auto; animation: toast-ein 0.2s ease-out; cursor: pointer; }
.toast.error { background: var(--meldung-fehler-grund); color: var(--meldung-fehler-schrift); border: 1px solid var(--meldung-fehler-rand); }
.toast.success { background: var(--marke-gut-grund); color: var(--marke-gut-schrift); border: 1px solid var(--meldung-gut-rand); }
.toast.info { background: var(--meldung-info-grund); color: var(--meldung-info-schrift); border: 1px solid var(--meldung-info-rand); }
@keyframes toast-ein { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: translateY(0); } }

.login-shell {
  /* AB-F826: derselbe Grund wie beim Koerper oben - 100vh ist auf dem Handy
     groesser als der sichtbare Bereich. 100dvh folgt ihm. */
  min-height: 100vh;
  min-height: 100dvh;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 20px;
  background: var(--paper);
}
.login-box {
  width: 100%;
  max-width: 400px;
  background: var(--dunkelflaeche);
  border: 1px solid var(--dunkelflaeche-rand);
  border-radius: var(--radius);
  padding: 40px 34px;
}
.login-logo {
  display: flex;
  align-items: baseline;
  gap: 2px;
  font-size: 1.7rem;
  margin-bottom: 6px;
  line-height: 1;
}
.login-logo-img {
  height: 78px;
  width: auto;
  margin-bottom: 10px;
  display: block;
}
.login-logo .bold { font-weight: 800; color: var(--auf-dunkelflaeche); letter-spacing: -0.01em; }
.login-logo .slash { color: var(--accent); font-weight: 400; margin: 0 1px; transform: skewX(-15deg); display: inline-block; }
.login-logo .thin { font-weight: 300; color: var(--muted); }
.login-box .eyebrow {
  color: var(--accent);
  font-size: 0.72rem;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  margin-bottom: 18px;
}
.login-box p.lead { margin-bottom: 22px; color: var(--muted); }
.login-box label { color: var(--auf-dunkelflaeche-gedaempft); }
.login-box input {
  background: var(--feld-grund);
  border: 1px solid var(--dunkelflaeche-rand);
  color: var(--feld-schrift);
}
.login-box input:focus {
  border-color: var(--accent);
  box-shadow: var(--fokus-ring);
}
.login-box input::placeholder { color: var(--feld-platzhalter); }
.login-box .small { color: var(--auf-dunkelflaeche-leise); }
.login-box .small a.link { color: var(--auf-dunkelflaeche-gedaempft); }

.hidden { display: none !important; }

.tabs {
  display: flex;
  /* F-E (25.08.2026): Ohne flex-wrap schob die Reiterleiste die Seite auf
     408 Pixel auseinander - gemessen auf auftrag-verwaltung.html bei 375
     Pixel Breite. Ein Reiter mehr, und es waere jede Seite gewesen. */
  flex-wrap: wrap;
  gap: 8px;
  margin-bottom: 20px;
  border-bottom: 1px solid var(--line);
}
.tab-btn {
  background: transparent;
  border: none;
  color: var(--muted);
  padding: 10px 4px;
  margin-right: 20px;
  font-size: 0.95rem;
  font-weight: 600;
  cursor: pointer;
  border-bottom: 2px solid transparent;
}
.tab-btn.active {
  color: var(--ink);
  border-bottom-color: var(--accent);
}

.kalender-grid {
  display: grid;
  grid-template-columns: repeat(7, 1fr);
  gap: 4px;
}
.kalender-wochentag {
  text-align: center;
  font-size: 0.75rem;
  font-weight: 700;
  color: var(--muted);
  text-transform: uppercase;
  padding-bottom: 6px;
}
.kalender-tag {
  aspect-ratio: 1;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 3px;
  border-radius: 8px;
  cursor: pointer;
  font-size: 0.9rem;
  background: var(--kalender-tag-bg);
  border: 1px solid transparent;
  color: var(--ink);
}
.kalender-tag:hover { border-color: var(--accent); }
.kalender-tag.ist-heute { border-color: var(--gut); border-width: 2px; font-weight: 700; }
.kalender-tag.hat-auftrag { background: var(--kalender-tag-auftrag-bg); color: var(--ink); }
.kalender-tag.feiertag { background: var(--kalender-tag-feiertag-bg); border-color: var(--warn); }
.kalender-tag.feiertag span:first-child { color: var(--warn); font-weight: 700; }
.kalender-feiertag-label {
  font-size: 0.5rem;
  font-weight: 700;
  color: var(--warn);
  text-transform: uppercase;
  white-space: nowrap;
  overflow: hidden;
  max-width: 100%;
}
.kalender-punkt {
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--accent);
  display: block;
}
.kalender-punkt.erledigt { background: var(--muted); }

.stats-row {
  display: grid;
  /* F-E (25.08.2026): minmax(0, 1fr) statt 1fr.
     "1fr" heisst in Wahrheit minmax(auto, 1fr) - die Spalte wird also
     NIE schmaler als ihr breitester unteilbarer Inhalt. Bei 375 Pixeln
     blieb die Kachelspalte deshalb 390 Pixel breit und schob die ganze
     Seite hinaus, obwohl die Media Query laengst auf eine Spalte
     umgestellt hatte. Mit minmax(0, ...) darf sie schrumpfen. */
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 14px;
  margin-bottom: 18px;
}
@media (max-width: 960px) { .stats-row { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 560px) { .stats-row { grid-template-columns: minmax(0, 1fr); } }

/* F-E (25.08.2026): Zwei Kachelreihen standen als style="grid-template-
   columns:1fr 1fr" IM HTML. Eine Angabe im style-Attribut schlaegt jede
   Media Query - die Regeln darueber liefen also ins Leere, und die
   Seite war auf dem Telefon 547 Pixel breit. Deshalb als Klasse:
   so greift der Umbruch wieder. */
.stats-row.zwei { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.dashboard-grid.zwei-kacheln { grid-template-columns: repeat(2, minmax(0, 1fr)); }
@media (max-width: 560px) { .dashboard-grid.zwei-kacheln { grid-template-columns: minmax(0, 1fr); } }
/* F-R4b (08.09.2026): drei Kacheln nebeneinander, gleiche Bauart wie
   zwei-kacheln. Die Zwischenstufe bei 760 px ist noetig, weil drei
   Kacheln auf einem Tablet sonst so schmal werden, dass die
   Ueberschrift umbricht - dann lieber zwei und eine. */
.dashboard-grid.drei-kacheln { grid-template-columns: repeat(3, minmax(0, 1fr)); }
@media (max-width: 760px) { .dashboard-grid.drei-kacheln { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 560px) { .dashboard-grid.drei-kacheln { grid-template-columns: minmax(0, 1fr); } }
@media (max-width: 560px) { .stats-row.zwei { grid-template-columns: minmax(0, 1fr); } }

/* Dasselbe fuer das Raster aus Stundenzettel (210 mm, A4-Breite) und
   Seitenspalte. Auf dem Telefon kann eine A4-Seite nicht neben etwas
   anderem stehen - untereinander ist die einzige Moeglichkeit. */
.zettel-raster {
  display: grid;
  grid-template-columns: 210mm 1fr;
  gap: 14px;
  align-items: start;
}
@media (max-width: 1000px) {
  .zettel-raster { grid-template-columns: 1fr; }
}
.stat-box {
  background: var(--card);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  padding: 16px 18px;
  /* Gehoert zum minmax(0, 1fr) oben dazu: ohne min-width bringt ein
     Rasterfeld seine eigene Mindestbreite mit und macht die Regel
     wirkungslos. Lange Zahlen brechen notfalls um, statt die Seite
     breiter zu machen. */
  min-width: 0;
  overflow-wrap: anywhere;
}
.stat-label {
  font-size: 0.78rem;
  text-transform: uppercase;
  letter-spacing: 0.03em;
  color: var(--muted);
  font-weight: 600;
  margin-bottom: 6px;
}
.stat-value {
  font-size: 1.6rem;
  font-weight: 700;
  color: var(--ink);
  line-height: 1.1;
}
.stat-sub {
  font-size: 0.82rem;
  color: var(--accent);
  margin-top: 2px;
}

.dashboard-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
  /* AB-F1123: jede Zeile so hoch wie die hoechste Kachel der Seite - alle
     Kacheln gleich gross. Die Kacheln sind Rasterelemente und strecken sich. */
  grid-auto-rows: 1fr;
  gap: 18px;
  margin-top: 28px;
}
@media (min-width: 1100px) {
  .dashboard-grid { grid-template-columns: repeat(5, 1fr); }
}

/* OF-4 (25.08.2026): Die Startseite soll ohne Scrollen dastehen.
   GEMESSEN, nicht geschaetzt: Bei 1280x800 war die Seite 951 Pixel hoch -
   151 zu viel. Bei 1920x1080 fehlten 140.

   Die Straffung haengt an .startseite und wirkt NUR dort. Global waere
   sie falsch: Eine Liste mit vierzig Zeilen braucht ihren Fussabstand,
   damit die letzte Zeile nicht am Fensterrand klebt.

   AUF DEM TELEFON GILT SIE NICHT, und das ist kein Versaeumnis: Bei
   375 Pixeln Breite steht EINE Kachel je Zeile, sechzehn Kacheln
   ergeben 3.274 Pixel. Fest stehen kann das nur, wenn die Startseite
   dort anders aufgebaut wird - das ist OF-5, nicht OF-4.

   RICHTIGSTELLUNG 30.08.2026: Zwei der fuenf Zeilen dieses Blocks waren
   seit dem 25.08.2026 WIRKUNGSLOS, ohne dass etwas gemeldet haette -
   .startseite .dashboard-tile { padding } und
   .startseite .dashboard-tile-icon { margin-bottom }.
   stile/dashboard.css:14-15 setzt dieselben Eigenschaften mit
   .dashboard-grid .dashboard-tile bzw. .dashboard-grid .dashboard-tile-icon.
   Beide Auswahlketten haben die Staerke (0,2,0); dashboard.html laedt
   style.css (Zeile 16) VOR stile/dashboard.css (Zeile 17), also gewinnt
   die spaetere - und das ist die aus dashboard.css. Eine Medienabfrage
   erhoeht die Staerke nicht.

   Folge fuer den Befund vom 25.08.2026: Der Satz "Ursache ist nicht der
   Abstand" ist an einer Kachel gemessen worden, deren Abstand nie
   verkleinert war. Die beiden toten Zeilen stehen deshalb nicht mehr
   hier, sondern die Kachelgroesse der Startseite steht jetzt an EINER
   Stelle - in stile/dashboard.css. Zwei Stellen, von denen eine still
   verliert, sind genau die leise Sorte Fehler aus Regel 10. */
@media (min-width: 900px) {
  .wrap.startseite { padding-bottom: 16px; }
  .startseite .dashboard-grid { margin-top: 12px; gap: 12px; }
}

.dashboard-tile {
  display: block;
  background: var(--card);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  padding: 28px 24px;
  text-decoration: none;
  color: var(--ink);
  transition: border-color 0.15s, transform 0.15s;
}
.dashboard-tile:hover {
  border-color: var(--accent);
  transform: translateY(-2px);
}
/* AB-F1660 (20.10.2026): PERLEFFEKT wie ein Autolack - Glanzpunkt oben
   rechts, ins Dunkle verlaufend, darueber ein schwacher Lichtstreifen.
   Nur dunkles Design, nur die Wahlen "gruen" (Tannengruen) und "blau"
   (Saphir); Grau und das helle Design bleiben einfarbig.
   ZUERST nur Startkacheln; am selben Tag vom Betreiber erweitert (Wunsch
   ueber Mensura aktuell weitergegeben und hier per Auswahl bestaetigt):
   AUF JEDER SEITE GLEICH - alles, was wie eine Kachel oder Karte aussieht
   (Karten, Listenkarten, Kennzahlkarten, Seitenleisten, Startkacheln samt
   Meine Todos). OHNE Glanz: aufgehende Fenster (.app-dialog), Menues
   (#einstellungen-menu), Eingabefelder, Reiterknoepfe, Tabellenzellen,
   Beleg-Platzhalter, die Papierkarte im Tagesnachweis
   (.auftrag-item.gedruckt-karte, wird gedruckt) und die markierte
   Aktenkachel (.akte-kachel.active, eigener Akzentschleier).
   Die Todo-Spalte der Startseite (.startseite .todo-spalte, sonst
   durchsichtig) bekommt den Glanz absichtlich mit.
   GERECHNET (WCAG) am hellsten Punkt: Tannengruen #25402a Schrift 9,98:1,
   Kupfer 4,10:1; Saphir #203a66 Schrift 9,9:1, Kupfer 4,07:1 (Symbole
   brauchen 3:1). Auf --card Kupfer 5,3:1 bzw. 5,4:1. Pruefung 37 rechnet
   gegen --card, nicht gegen den Verlauf. Kein style-Attribut (CSP).
   AB-F1661 (20.10.2026) AENDERT DIE ABGRENZUNG: Die aufgehenden Fenster
   (.app-dialog) bekommen den Glanz jetzt doch (Nachtrag 2 (C)(2) der
   Sitzung mensura aktuell) - Regel im Block AB-F1661 am Dateiende. Mit
   dem Kupfer #de7440 (AB-F1661) sind es am hellsten Punkt 3,59:1 /
   3,62:1, auf --card 4,77:1 / 4,68:1. */
:root:not([data-theme="light"])[data-kachel="gruen"] {
  --glanz:
    linear-gradient(115deg, rgba(255, 255, 255, 0) 35%, rgba(255, 255, 255, 0.07) 48%, rgba(255, 255, 255, 0) 60%),
    radial-gradient(120% 90% at 85% 0%, #25402a 0%, #162d1c 45%, #0d1d12 100%);
}
:root:not([data-theme="light"])[data-kachel="blau"] {
  --glanz:
    linear-gradient(115deg, rgba(255, 255, 255, 0) 35%, rgba(255, 255, 255, 0.07) 48%, rgba(255, 255, 255, 0) 60%),
    radial-gradient(120% 90% at 85% 0%, #203a66 0%, #11264a 45%, #08162e 100%);
}
:root:not([data-theme="light"])[data-kachel="gruen"] :is(.card, .auftrag-item:not(.gedruckt-karte), .stat-box, .dashboard-tile, .akte-kachel:not(.active), .ak-sidebar, .db1-sidebar, .db1-kpi-card, .lu-kpi-karte, .pb-eintrag, .rg-kpi-card, .kunden-zeile),
:root:not([data-theme="light"])[data-kachel="blau"] :is(.card, .auftrag-item:not(.gedruckt-karte), .stat-box, .dashboard-tile, .akte-kachel:not(.active), .ak-sidebar, .db1-sidebar, .db1-kpi-card, .lu-kpi-karte, .pb-eintrag, .rg-kpi-card, .kunden-zeile) {
  background: var(--glanz);
}
.dashboard-tile-icon {
  font-size: 2rem;
  margin-bottom: 12px;
}
.dashboard-tile-icon svg { width: 34px; height: 34px; display: block; }
.dashboard-tile h3 {
  margin: 0 0 8px;
  font-size: 1.1rem;
}
.dashboard-tile p {
  margin: 0;
  color: var(--muted);
  font-size: 0.88rem;
  line-height: 1.4;
}

/* AB-F1123 (30.09.2026, Betreiber per Auswahl im Probelauf): Das Kachelfeld
   fuellt die Seite bis zum unteren Rand - "am unteren Rand des Bildschirms
   weniger freie Flaeche". Nur wo das Raster direkt in .wrap steht
   (Startseite, Dispo, Faktura, Personal); der Stundenhub im
   Mitarbeiterbereich liegt verschachtelt in einer Registerkarte.
   - .wrap wird eine Spalte mindestens so hoch wie das Fenster, das Raster
     nimmt den Rest (flex 1). Oberkante und Unterkante (padding) bleiben,
     wie sie sind (Pruefung 81).
   - Reihen: mindestens so hoch wie der Inhalt, sonst gleiche Teile. Im zu
     kleinen Fenster scrollt die Seite also weiter, statt Text abzuschneiden.
   - Eine Kachel wird hoechstens 260 px hoch; Rest verteilt sich zwischen
     die Reihen (align-items center). Sonst waere die eine Dispo-Kachel so
     hoch wie der Bildschirm.
   - Schrift und Symbol wachsen mit der Fensterhoehe (vh), nach unten
     begrenzt auf die bisherigen Werte - im kleinen Fenster aendert sich
     nichts. Auf Wunsch des Betreibers im selben Probelauf.
   - Alles erst ab 900 px Breite ("zumindest auf dem Desktop"); das
     Telefon bleibt, wie es war. Die Startseite setzt Schrift und Symbol in
     stile/dashboard.css (Block Weg D) mit denselben Werten. */
@media (min-width: 900px) {
  .wrap:has(> .dashboard-grid) {
    min-height: 100vh;
    min-height: 100dvh;
    box-sizing: border-box;
    display: flex;
    flex-direction: column;
  }
  .wrap > .dashboard-grid {
    flex: 1 1 auto;
    grid-auto-rows: minmax(min-content, 1fr);
    align-items: center;
  }
  .wrap > .dashboard-grid > .dashboard-tile {
    display: flex;
    flex-direction: column;
    justify-content: center;
    box-sizing: border-box;
    height: 100%;
    max-height: 260px;
    /* Ohne min-width 0 zaehlt die Mindestbreite des Inhalts als Spalten-
       minimum (1fr = minmax(auto, 1fr)): im Probelauf wurden die sechs
       Spalten ungleich und ragten 254 px rechts aus dem Bild. */
    min-width: 0;
  }
  .wrap > .dashboard-grid > .dashboard-tile .dashboard-tile-icon svg {
    width: clamp(34px, min(4.5vh, 2.8vw), 56px);
    height: clamp(34px, min(4.5vh, 2.8vw), 56px);
  }
  /* Schrift waechst mit Hoehe UND Breite (min) - ein hohes, schmales
     Fenster bekaeme sonst grosse Schrift in schmalen Kacheln. Lange Woerter
     (Qualitaetssicherung) werden getrennt statt abgeschnitten. */
  .wrap > .dashboard-grid > .dashboard-tile h3 {
    font-size: clamp(1.1rem, min(2.2vh, 1.3vw), 1.5rem);
    hyphens: auto;
    overflow-wrap: break-word;
  }
  .wrap > .dashboard-grid > .dashboard-tile p { font-size: clamp(0.88rem, min(1.4vh, 0.85vw), 1.05rem); }
  /* Unterseiten (Personal, Dispo, Faktura): Kachelfeld so breit wie auf
     der Startseite (stile/dashboard.css, 1400 px) - im 960er Feld wurde
     der Beschreibungstext der Kacheln sechs Zeilen hoch. */
  .wrap:has(> .dashboard-grid):not(.startseite) { max-width: 1400px; }
}

/* AB-F1123, Unterseiten im NIEDRIGEN Fenster (Betreiber per Auswahl: "wie
   Startseite umbauen"). Gemessen bei 1366x633 vorher: Personal scrollte
   354 px, Faktura 113, Dispo 50 - Seitennavigation, Ueberschrift, Chip und
   Beschreibungszeile brauchten 389 px bis zum Kachelfeld.
   - Querkachel als Raster: Symbol links ueber zwei Zeilen, rechts Titel
     und Beschreibung untereinander.
   - Anmeldechip rechts neben der Ueberschrift. top 226 px = Oberkante
     .wrap 168 + Seitennavigation 44 + 14 Abstand (gemessen auf Personal,
     Dispo, Faktura). Das Menue haengt an der Huelle dahinter und wandert
     mit (Begruendung wie in stile/dashboard.css).
   - Abstand ueber dem Kachelfeld 12 statt 28 px und unter der Seite 16
     statt 60 px, wie auf der Startseite (.wrap.startseite oben, OF-4).
     Mit Querkacheln allein scrollte Personal bei 1366x633 noch 74 px.
   - Kachelabstand 12 statt 18 px, Beschreibung mit Zeilenhoehe 1.35. */
@media (min-width: 900px) and (max-height: 860px) {
  .wrap:has(> .dashboard-grid):not(.startseite) { position: relative; padding-bottom: 16px; }
  .wrap:has(> .dashboard-grid):not(.startseite) > p.lead { margin-bottom: 8px; }
  .wrap:not(.startseite) > .dashboard-grid { gap: 12px; }
  .wrap:not(.startseite) > .dashboard-grid > .dashboard-tile p { line-height: 1.35; }
  .wrap:not(.startseite) > .dashboard-grid { margin-top: 12px; }
  .wrap:not(.startseite) > .dashboard-grid > .dashboard-tile {
    display: grid;
    grid-template-columns: auto minmax(0, 1fr);
    column-gap: 12px;
    align-content: center;
    /* 14/8 statt 16/10: Personal scrollte bei 1366x633 sonst um 2 px. */
    padding: 14px 16px 8px;
  }
  .wrap:not(.startseite) > .dashboard-grid > .dashboard-tile .dashboard-tile-icon { grid-row: 1 / span 2; align-self: center; margin-bottom: 0; }
  .wrap:not(.startseite) > .dashboard-grid > .dashboard-tile h3 { margin: 0 0 2px; }
}
.small { font-size: 0.8rem; color: var(--muted); }

.akte-kacheln {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
  gap: 10px;
  margin: 22px 0;
}
.akte-kachel {
  background: var(--card);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  padding: 14px 16px;
  text-align: left;
  cursor: pointer;
  color: var(--ink);
  font-family: inherit;
  transition: border-color 0.15s;
}
.akte-kachel:hover { border-color: var(--accent); }
.akte-kachel.active { border-color: var(--accent); background: var(--akzent-schleier-kachel); }
.akte-kachel .akte-kachel-icon { font-size: 1.3rem; margin-bottom: 4px; }
.akte-kachel .akte-kachel-icon svg { width: 24px; height: 24px; display: block; }
.akte-kachel h3 { margin: 0; font-size: 0.92rem; }
.akte-kachel:disabled { opacity: 0.4; cursor: default; }
.akte-kachel:disabled:hover { border-color: var(--line); }
a.link { color: var(--ink); text-decoration: underline; cursor: pointer; }

/* OF-1 (30.08.2026): Hier stand ".topbar a.link" - die Farbe fuer die
   Verweise in der Kopfleiste. Es gibt dort keine mehr: die elf
   Rueckwege sind in die Navigationsleiste ueber der Ueberschrift
   gewandert, die drei Querverweise von uebersicht.html in die Seite
   selbst. Eine Regel ohne Ziel bleibt nicht stehen - sie sieht beim
   naechsten Lesen wie eine gebrauchte aus. */

/* ============================================================
   Seitennavigation: Zurueck und Startseite (30.08.2026)
   ============================================================
   Gebaut von setupSeitennavigation() in app.js, ueber der
   Ueberschrift jeder geschuetzten Seite. Vorher trugen 16 Seiten
   ein fest auf dashboard.html verdrahtetes "Start" in der
   Kopfleiste, zwei ein "Zurueck", und 21 Seiten gar nichts.

   Die Knoepfe sind Verweise (<a>), keine <button>: Sie fuehren zu
   einer anderen Adresse, und ein Verweis laesst sich in einem neuen
   Reiter oeffnen. min-height 44px, weil sie auf dem Handy mit dem
   Daumen getroffen werden muessen. */
.seiten-nav { display: flex; gap: 10px; flex-wrap: wrap; margin: 0 0 14px; }
.seiten-nav-knopf {
  display: inline-flex; align-items: center; min-height: 44px;
  padding: 8px 16px; border-radius: 20px;
  border: 1px solid var(--line); background: var(--flaeche-leicht);
  color: var(--ink); text-decoration: none; font-size: 0.88rem; font-weight: 600;
}
.seiten-nav-knopf:hover { border-color: var(--accent); color: var(--accent); }

/* Zurueck und Startseite als Symbol wie in Veluzis Mensura (17.10.2026):
   Pfeil und Haus 28 px in Kupfer, kein Rahmen, kein Grund; runde
   Klickflaeche 44 px (wie .topbar button.logout), beim Darueberfahren
   und Druecken ein leichter Akzentkreis. Pfeil und Haus stehen dicht
   nebeneinander (sichtbarer Abstand der Symbole rund 16 px, wie Mensura). */
.seiten-nav-symbol {
  justify-content: center;
  min-width: 44px;
  padding: 0;
  border: none;
  border-radius: 50%;
  background: transparent;
  color: var(--accent);
}
.seiten-nav-symbol:hover,
.seiten-nav-symbol:active { background: var(--akzent-schleier-stark); color: var(--accent); }
.seiten-nav-symbol svg { display: block; }
/* Symbol als Block in einem Symbolknopf (AB-F1649: Mitarbeiter-App, Passwortseite). */
.symbol-block { display: block; }
.seiten-nav:has(.seiten-nav-symbol) { gap: 0; margin-left: -10px; }

/* Zeile [Pfeil][Haus][Titel] fuer Seiten, deren h1 allein steht. */
.seiten-kopf { display: flex; align-items: center; flex-wrap: wrap; gap: 4px; margin: 0 0 4px; }
.seiten-kopf > .seiten-nav { margin-bottom: 0; }
.seiten-kopf > h1 { margin: 0; }

/* OF-1 (30.08.2026): Eine zweite Reihe im selben Stil, aber mit einer
   anderen Aufgabe - sie fuehrt nicht zurueck, sondern quer in den
   Nachbarschritt (uebersicht.html: Auftraege, Belege, Nachrichten).
   Sie steht unter dem Einleitungssatz und braucht deshalb Luft nach
   oben; die Leiste von setupSeitennavigation() steht direkt unter der
   Kopfleiste und braucht sie nicht. */
.seiten-nav-quer { margin-top: 10px; }

/* ============================================================
   Sichtbarer Fokus (G-5)
   ============================================================
   Bis 05.08.2026 gab es keinen eigenen Fokus-Rahmen - es galt der
   Browser-Standard, der auf dunklem Grund kaum zu sehen ist. Wer die
   Anwendung mit der Tastatur bedient, konnte nicht erkennen, wo er
   gerade steht.

   :focus-visible statt :focus - so erscheint der Rahmen bei
   Tastaturbedienung, aber nicht bei jedem Mausklick.

   outline statt border: veraendert das Layout nicht, kann also keine
   Sprünge verursachen. outline-offset haelt Abstand, damit der Rahmen
   auch bei randlosen Schaltflaechen sichtbar bleibt. */
:focus-visible {
  outline: 3px solid var(--accent);
  outline-offset: 2px;
  border-radius: 4px;
}

/* Innerhalb der Kopfleiste ist der Akzentton zu dunkel - dort weiss. */
.topbar :focus-visible {
  outline-color: var(--auf-dunkel);
}

/* Ueberspringen-Link: nur sichtbar, wenn er den Fokus hat. Damit
   koennen Tastaturnutzer die Kopfleiste ueberspringen, statt sich auf
   jeder Seite erneut durchzuklicken. */
.zum-inhalt {
  position: absolute;
  left: -9999px;
  top: 0;
  z-index: 999;
  background: var(--accent);
  color: var(--auf-akzent);
  padding: 10px 16px;
  border-radius: 0 0 6px 0;
  font-weight: 600;
}
.zum-inhalt:focus {
  left: 0;
}

/* Gesperrte Kacheln (K-18, sperreKacheln()).
   F-B (20.08.2026): Diese drei Regeln standen wortgleich inline in
   dashboard.html, personal.html und leistungsscheine-rechnungen.html.
   Der Kommentar in leistungsscheine-rechnungen.html hat das selbst
   vermerkt und auf F-B verwiesen - eine Kachel sah je nach Seite
   anders gesperrt aus, sobald jemand eine der drei Stellen anfasste. */
.dashboard-tile.kachel-gesperrt { cursor: not-allowed; position: relative; }
.dashboard-tile.kachel-gesperrt h3 { color: var(--muted); }
.kachel-schloss { position: absolute; top: 8px; right: 10px; font-size: 15px; opacity: .85; }
/* AB-F1684: Zahl offener Belege, auf der Startseite und in der Faktura */
#belege-badge { position:absolute; top:14px; right:14px; background:var(--blase-bg); color:var(--auf-dunkel); border-radius:999px; min-width:24px; height:24px; display:flex; align-items:center; justify-content:center; font-size:0.8rem; font-weight:700; padding:0 6px; }

/* Kachel, hinter der noch nichts liegt (AB-F848, AB-F850, 23.09.2026).
   Vom Betreiber bestellt: "Digitales Fahrtenbuch" und
   "Qualitaetssicherung" sollen schon dastehen, "ohne inhalte".

   WARUM SIE ANDERS AUSSEHEN MUSS ALS EINE GESPERRTE KACHEL, und das
   ist der ganze Zweck dieser Regeln: Eine gesperrte Kachel sagt "du
   darfst nicht". Diese hier sagt "es gibt noch nichts". Wer beides
   gleich zeichnet, schickt jeden Objektleiter, der das Fahrtenbuch
   sucht, zum Administrator - und der findet nichts, weil es nichts zu
   finden gibt.

   KEIN SCHLOSS, deshalb, sondern ein Baendchen mit Worten. Und
   cursor: default statt not-allowed: Es ist nichts verboten.

   Im Markup steht ein <div>, kein <a> - ohne Ziel gibt es nichts
   anzuklicken. Sobald die Seite da ist, wird daraus ein <a href>,
   diese Klasse faellt weg, und die Kachel gehoert in die Sperrliste
   KACHELN in seiten/dashboard.js. */
.dashboard-tile.dashboard-tile-vorbereitung {
  cursor: default;
  position: relative;
  border-style: dashed;
}
.dashboard-tile.dashboard-tile-vorbereitung:hover {
  transform: none;
  border-color: var(--line);
}
.dashboard-tile.dashboard-tile-vorbereitung h3 { color: var(--muted); }
.dashboard-tile.dashboard-tile-vorbereitung .dashboard-tile-icon svg { opacity: .55; }
/* AB-F1123 (30.09.2026, Betreiber per Auswahl): Das Band steht klein in der
   oberen rechten Ecke statt unter dem Titel. Unter dem Titel machte es die
   Kachel hoeher (148 statt 126 px bei zweizeiligem Titel), und mit gleich
   hohen Zeilen (.dashboard-grid grid-auto-rows) waere jede Kachel der Seite
   so hoch geworden - die Startseite bei 1280x800 um 65 px laenger (OF-4).
   top: 6px haelt es ueber dem Symbol: der kleinste Kopfabstand einer Kachel
   ist 18 px (Startseite ab 900 px, stile/dashboard.css). */
.dashboard-tile.dashboard-tile-vorbereitung { position: relative; }
.kachel-vorbereitung-band {
  position: absolute;
  top: 6px;
  right: 10px;
  line-height: 1;
  font-size: 0.66rem;
  font-weight: 600;
  letter-spacing: 0.03em;
  text-transform: uppercase;
  color: var(--muted);
}


/* ============================================================
   HILFSKLASSEN STATT style-ATTRIBUTEN  -  F-5b (26.08.2026)
   ============================================================

   WARUM ES SIE GIBT
   ------------------------------------------------------------
   script-src steht seit F-5 ohne 'unsafe-inline'. style-src
   nicht - dahinter standen am 26.08.2026 noch 993 Attribute
   style="..." und 26 <style>-Bloecke. Faellt 'unsafe-inline'
   dort weg, IGNORIERT der Browser jedes dieser Attribute: Die
   Seite laedt, nichts ist kaputt im Sinne eines Fehlers, sie
   sieht nur falsch aus - Abstaende weg, Verborgenes sichtbar.

   WARUM MIT !important
   ------------------------------------------------------------
   Ein style-Attribut schlaegt jede Regel aus der Datei. Eine
   Klasse tut das nicht: ".karte p { margin: 0 }" waere
   staerker als ".ma-oben-8" und der Abstand verschwaende
   still. Mit !important verhaelt sich die Klasse genau wie das
   Attribut, das sie ersetzt. Das ist hier kein Notnagel,
   sondern der Grund, warum die Umstellung das Aussehen nicht
   veraendert.

   AUSNAHME .verborgen: bewusst OHNE !important. Sie ist der
   ANFANGSZUSTAND, und JavaScript schaltet mit
   classList.add/remove um - nicht mit el.style.display. Waere
   sie !important, koennte kein Skript sie mehr uebersteuern.

   Die Namen sind deutsch wie der uebrige Code. ma = Marge.
   ============================================================ */

/* Abstand nach oben */
.ma-oben-0        { margin-top: 0 !important; }
.ma-oben-4        { margin-top: 4px !important; }
.ma-oben-6        { margin-top: 6px !important; }
.ma-oben-8        { margin-top: 8px !important; }
.ma-oben-10       { margin-top: 10px !important; }
.ma-oben-12       { margin-top: 12px !important; }
.ma-oben-14       { margin-top: 14px !important; }
.ma-oben-16       { margin-top: 16px !important; }
.ma-oben-20       { margin-top: 20px !important; }
.ma-oben-minus-8  { margin-top: -8px !important; }
.ma-oben-minus-4  { margin-top: -4px !important; }

/* Abstand nach unten */
.ma-unten-0       { margin-bottom: 0 !important; }
.ma-unten-8       { margin-bottom: 8px !important; }
.ma-unten-10      { margin-bottom: 10px !important; }
.ma-unten-14      { margin-bottom: 14px !important; }

/* Alle vier Seiten auf einmal - NICHT dasselbe wie die Klassen
   oben: "margin: 10px 0 0" setzt auch rechts, unten und links
   auf 0. Bei einem <p> mit eigenem Abstand ist das ein
   Unterschied, den man sieht. */
.ohne-ma          { margin: 0 !important; }
.ma-nur-oben-2    { margin: 2px 0 0 !important; }
.ma-nur-oben-4    { margin: 4px 0 0 !important; }
.ma-nur-oben-10   { margin: 10px 0 0 !important; }
.ma-nur-unten-4   { margin: 0 0 4px !important; }
.ma-nur-unten-10  { margin: 0 0 10px !important; }

/* Toene - die Werte stehen schon als Variablen bereit (S2-14) */
.ton-gedaempft    { color: var(--muted) !important; }
.ton-warnung      { color: var(--warn) !important; }
.ton-akzent       { color: var(--accent) !important; }

/* Fluss und Ausrichtung */
.dehnen           { flex: 1 !important; }
.volle-breite     { width: 100% !important; }
.nicht-umbrechen  { white-space: nowrap !important; }
.mittig           { text-align: center !important; }

/* Anfangszustand verborgen - siehe Hinweis oben, ohne !important */
.verborgen        { display: none; }

/* ------------------------------------------------------------
   F-5b, zweiter Abschnitt (26.08.2026)
   ------------------------------------------------------------
   Drei Stellen, die sich benennen lassen und deshalb KEINE
   Hilfsklasse brauchen, sondern eine eigene Regel. */

/* Verweis mit Symbol davor (uebersicht.html). Farbe und Abstand kommen
   seit OF-1 von .seiten-nav-knopf - die Verweise stehen nicht mehr in
   der Kopfleiste, sondern in der Querverweisreihe der Seite. */
.mit-symbol { display: inline-flex; align-items: center; gap: 4px; }
.stelle-fuer-blase { position: relative; }

/* Symbol in einer Kachel auf dunklem Grund. fill laesst sich als
   Praesentationsattribut nicht ueber var() setzen - deshalb eine
   Klasse statt fill="#fff". */
.fuell-hell { fill: var(--auf-dunkel); }

/* Das Unterschriftenfeld. Stand neunmal wortgleich als Attribut,
   in zwei Hoehen. */
.unterschriftfeld {
  border: 1px solid var(--line);
  border-radius: 7px;
  width: 100%;
  max-width: 400px;
  height: 130px;
  touch-action: none;
  /* feste Farbe: Unterschrift wird als Bild gespeichert und gedruckt */ background: #fff;
}
.unterschriftfeld.gross { height: 150px; }

/* Rahmen um die hinterlegte Unterschrift (einstellungen.html). */
.unterschrift-vorschau {
  /* feste Farbe: Unterschrift wird als Bild gespeichert und gedruckt */ background: #fff;
  border-radius: 8px;
  padding: 16px;
  display: inline-block;
  margin-bottom: 16px;
}

/* ------------------------------------------------------------
   F-5b, vierter Abschnitt (26.08.2026): die wiederkehrenden
   zusammengesetzten Werte
   ------------------------------------------------------------
   Bewusst EXAKTE Entsprechungen statt frei kombinierbarer
   Bausteine. Eine Reihe ohne Umbruch ist etwas anderes als eine
   mit; wer beides in dieselbe Klasse steckt, aendert das
   Verhalten an Stellen, an denen niemand hinsieht. Deshalb
   traegt jede Klasse genau die Erklaerungen, die vorher im
   Attribut standen. */

/* Reihen */
.kopf-reihe { display: flex !important; justify-content: space-between !important;
              align-items: center !important; flex-wrap: wrap !important; gap: 10px !important; }
.reihe-6 { display: flex !important; gap: 6px !important; }
/* Beschriftung eines Kaestchens - sie soll nicht fett sein wie ein Feldname. */
.gewicht-normal { font-weight: normal !important; }
.reihe-6-mittig { display: flex !important; gap: 6px !important;
                  align-items: center !important; justify-content: center !important; }
.reihe-8 { display: flex !important; gap: 8px !important; align-items: center !important; }
.reihe-10 { display: flex !important; gap: 10px !important;
            align-items: center !important; flex-wrap: wrap !important; }
.reihe-10-umbruch { display: flex !important; gap: 10px !important; flex-wrap: wrap !important; }
.reihe-14 { display: flex !important; gap: 14px !important;
            align-items: center !important; flex-wrap: wrap !important; }

/* Knopf, der nur ein Symbol traegt */
.knopf-symbolfeld { padding: 6px 10px !important; flex-shrink: 0 !important;
                    display: flex !important; align-items: center !important;
                    justify-content: center !important; }
/* Reiter, die sich die Breite teilen */
.reiter-knopf { flex: 1 !important; padding: 8px 4px !important; font-size: 0.85rem !important; }
/* Zahlenzelle, rechtsbuendig */
.zelle-rechts { padding: 0 8px !important; text-align: right !important;
                display: flex !important; align-items: center !important;
                justify-content: flex-end !important; }

/* Schrift */
.schrift-08 { font-size: 0.8rem !important; }
.schrift-085 { font-size: 0.85rem !important; }

/* Polster */
.polster-14 { padding: 14px !important; }

/* Breiten - fast immer an einem Eingabefeld in einer Reihe */
.breite-auto { width: auto !important; }
.feld-80 { margin-bottom: 0 !important; width: 80px !important; }
.feld-90 { margin-bottom: 0 !important; width: 90px !important; }
.feld-220 { margin-bottom: 0 !important; min-width: 220px !important; }
.hoechstbreite-320 { max-width: 320px !important; }
.spalte-8 { width: 8% !important; }

/* Fluss */
.nicht-schrumpfen { flex-shrink: 0 !important; }
.dehnen-auto { flex: 1 1 auto !important; }
.position-relativ { position: relative !important; }

/* Abstaende, zweite Runde */
.ma-links-8 { margin-left: 8px !important; }
.ma-oben-minus-6 { margin-top: -6px !important; }
.ma-unten-2 { margin-bottom: 2px !important; }
.ma-unten-4 { margin-bottom: 4px !important; }
.ma-nur-oben-6 { margin: 6px 0 0 !important; }

/* Toene am Rand */
.rand-warnung { border-color: var(--warn) !important; color: var(--warn) !important; }
.rand-akzent { border-color: var(--accent) !important; }

/* F-5b (26.08.2026): stand als style-Attribut in quelle/app/05-zugriff-oberflaeche.js */
#einstellungen-theme-btn { display:block; width:100%; text-align:left; background:none; border:none; color:var(--ink); padding:10px 14px; cursor:pointer; font-size:0.9rem; }
#testsitzung-zurueck { background:var(--dunkelflaeche); color:var(--auf-dunkelflaeche); border:none; border-radius:6px; padding:6px 12px; cursor:pointer; font-size:0.82rem; font-weight:600; }

/* F-5b (26.08.2026): stand als style-Attribut in quelle/app/12-krankmeldung-dialog.js */
#urlaub-zusatz-bereich { margin-top:10px; border-top:1px solid var(--line); padding-top:10px; }

/* F-5b, fuenfter Abschnitt (27.08.2026): drei Werte, die auf
   mehreren Seiten vorkommen. */
.ma-nur-unten-8 { margin: 0 0 8px; }
.reihe-verteilt { display: flex; justify-content: space-between; align-items: center; }
.symbol-tief { vertical-align: -3px; margin-right: 4px; }

/* ------------------------------------------------------------
   F-5b, sechster Abschnitt (27.08.2026)
   ------------------------------------------------------------
   Werte, die nach dem Auslagern von mitarbeiter.html noch
   MEHRFACH im Bestand standen. Was nur einmal vorkommt, bekommt
   eine benannte Regel in stile/<seite>.css statt einer
   Hilfsklasse hier - ein Name ohne zweiten Traeger ist nur ein
   zweiter Ort zum Nachschlagen. */

/* Vervollstaendigt den Toene-Block oben: --gut gab es als Variable
   schon, nur die Klasse dazu fehlte. */
.ton-gut          { color: var(--gut) !important; }

/* Karte, die wie ein Listeneintrag aussieht, aber nicht anklickbar
   ist. Ohne das erbt sie den Zeiger von .auftrag-item und sieht
   klickbar aus, obwohl nichts passiert. */
.zeiger-normal    { cursor: default !important; }

/* Passt in die Reihe feld-80/feld-90 darueber: Eingabefeld in einer
   Zeile, ohne den Abstand nach unten, den ein Feld sonst traegt. */
.feld-70          { margin-bottom: 0 !important; width: 70px !important; }

.rechtsbuendig    { text-align: right !important; }
.ma-links-6       { margin-left: 6px !important; }

/* Reihe mit Umbruch - bewusst getrennt von .reihe-8 ohne Umbruch;
   siehe die Begruendung im vierten Abschnitt. */
.reihe-8-umbruch  { display: flex !important; gap: 8px !important;
                    align-items: center !important; flex-wrap: wrap !important; }

/* Verteilte Reihe MIT Abstand und mittiger Ausrichtung. Bewusst
   nicht .reihe-verteilt (ohne gap) und nicht .kopf-reihe (mit
   Umbruch) - siehe die Begruendung im vierten Abschnitt. */
.reihe-verteilt-mittig-10 { display: flex !important; justify-content: space-between !important;
                            align-items: center !important; gap: 10px !important; }

/* Tabelle, die auf schmalen Geraeten seitlich gerollt wird. Steht
   am Rahmen um die Tabelle, nicht an ihr - eine <table> mit
   overflow rollt nicht. */
.waagerecht-rollen { overflow-x: auto !important; }

/* Der Bereich unter einer langen Tabelle. Die 40px unten sind
   Luft, damit die letzte Zeile nicht am Bildschirmrand klebt. */
.tabellenfuss { margin: 14px 0 40px !important; }

/* Passt in die Reihe .spalte-8 / .polster-14 darueber. */
.spalte-45 { width: 45% !important; }
.polster-14-16 { padding: 14px 16px !important; }

.ma-unten-6 { margin-bottom: 6px !important; }

/* Erklaerender Satz unter einem Auswahlfeld. Steht zweimal
   wortgleich; die Abstaende sind eng nach oben zum Feld und
   weiter nach unten zum naechsten. */
.hinweistext { color: var(--muted) !important; margin: 4px 0 12px !important; }

.ma-oben-2 { margin-top: 2px !important; }

/* Eingabefeld in einer Tabellenzelle. Anders als .feld-80 setzt es
   den Abstand auf ALLEN Seiten auf 0 - in einer Zelle traegt schon
   das <td> das Polster. */
.zellenfeld-70 { margin: 0 !important; width: 70px !important; }
.zellenfeld-80 { margin: 0 !important; width: 80px !important; }

/* Abschnitt innerhalb einer Karte, oben mit einer Linie abgesetzt. */
.abschnitt-getrennt { margin-top: 14px !important; border-top: 1px solid var(--line) !important;
                      padding-top: 12px !important; }

/* Reihe mit 6px Abstand, mittig ausgerichtet, OHNE zentrierte
   Verteilung - anders als .reihe-6-mittig darueber. */
.reihe-6-ausgerichtet { display: flex !important; gap: 6px !important; align-items: center !important; }

/* Knopfreihe ohne senkrechte Ausrichtung: die Knoepfe sind gleich
   hoch, deshalb braucht es kein align-items - und mit einem
   waere ein spaeter dazukommender hoeherer Knopf mittig statt
   oben. */
.knopfreihe-8 { display: flex !important; gap: 8px !important; flex-wrap: wrap !important; }

/* Wie .abschnitt-getrennt, nur 12px oben statt 14. */
.abschnitt-getrennt-12 { margin-top: 12px !important; border-top: 1px solid var(--line) !important;
                         padding-top: 12px !important; }

/* Knopf, der nur eine Flagge traegt (Rueckmeldung senden). */
.polster-6-8 { padding: 6px 8px !important; }

/* Kaestchen mit Beschriftung daneben. Die Beschriftung ist
   bewusst nicht fett - sie ist kein Feldname, sondern die
   Beschriftung des Kaestchens selbst. */
.kaestchen-zeile { display: flex !important; align-items: center !important; gap: 6px !important;
                   cursor: pointer !important; font-weight: 400 !important; }
/* Das Kaestchen darin. Zwei Groessen, weil zwei Listen es
   unterschiedlich gross brauchen. background:transparent, weil das
   allgemeine Eingabefeld einen Grund setzt, den ein Haken nicht
   haben soll. */
.kaestchen-16 { width: 16px !important; height: 16px !important; padding: 0 !important;
                margin: 0 !important; background: transparent !important; }
.kaestchen-18 { width: 18px !important; height: 18px !important; padding: 0 !important;
                margin: 0 !important; background: transparent !important; flex-shrink: 0 !important; }

/* Weitere Felder in Tabellenzellen */
.zellenfeld-100 { width: 100px !important; margin: 0 !important; }
.zellenfeld-150 { width: 150px !important; margin: 0 !important; }
.feld-dehnen { margin-bottom: 0 !important; flex: 1 !important; }
.feld-120 { margin-bottom: 0 !important; width: 120px !important; }

.ma-unten-16 { margin-bottom: 16px !important; }
.ma-nur-unten-6 { margin: 0 0 6px !important; }

/* Waagerechte Trennlinie zwischen zwei Abschnitten einer Karte.
   Ein <hr> bringt einen eigenen Rahmen mit - der wird abgeschaltet
   und durch eine einzelne Linie oben ersetzt. */
.trennlinie { border: none !important; border-top: 1px solid var(--line) !important;
              margin: 22px 0 !important; }

/* Nur der Rahmen in Warnfarbe - anders als .rand-warnung, das auch
   die Schrift einfaerbt. */
.rand-warnfarbe { border-color: var(--warn) !important; }

/* Feldname direkt neben seinem Feld, in einer Reihe. Ohne Abstand
   und ohne Umbruch, damit die Reihe nicht auseinanderfaellt. */
.feldname-eng { margin: 0 !important; white-space: nowrap !important; font-weight: 700 !important; }

/* Kaestchenzeile mit 8px Abstand. Zwei Ausrichtungen: mittig fuer
   einzeilige Beschriftungen, oben fuer mehrzeilige - dort soll das
   Kaestchen bei der ERSTEN Zeile stehen. */
.kaestchen-zeile-8 { display: flex !important; align-items: center !important;
                     gap: 8px !important; font-weight: normal !important; }
.kaestchen-zeile-oben { display: flex !important; align-items: flex-start !important;
                        gap: 8px !important; cursor: pointer !important; font-weight: 400 !important; }

/* Reihe, die sich mittig in den verfuegbaren Platz dehnt (Monats-
   auswahl zwischen zwei Pfeilknoepfen). */
.reihe-8-mittig-dehnen { display: flex !important; gap: 8px !important; align-items: center !important;
                         flex: 1 !important; justify-content: center !important; }

/* Reiter, der nur ein Symbol traegt und es mittig setzt. */
.tab-mittig { display: flex !important; align-items: center !important; justify-content: center !important; }

/* Breitere Seiten. Der Standard in .wrap reicht fuer eine
   Auswertung mit vielen Spalten nicht. */
.wrap-1100 { max-width: 1100px !important; }
.wrap-1500 { max-width: 1500px !important; }
/* Tabelle, die breiter werden darf als ihre Regel erlaubt. */
.ohne-hoechstbreite { max-width: none !important; }

/* Der gewaehlte Reiter in einer Reihe von Filterknoepfen. Dieselbe
   Klasse wie bei den Nachrichten-Kategorien der Mitarbeiterseite. */
.beleg-status-btn.ausgewaehlt { border-color: var(--accent) !important; color: var(--accent) !important; }

.ma-nur-unten-2 { margin: 0 0 2px !important; }
.ma-12-0 { margin: 12px 0 !important; }
.schrift-072 { font-size: 0.72rem !important; }

/* Text, der lieber abgeschnitten wird als umbricht. Alle drei
   Eigenschaften gehoeren zusammen - ohne overflow:hidden greift
   text-overflow nicht. */
.text-abschneiden { overflow: hidden !important; text-overflow: ellipsis !important;
                    white-space: nowrap !important; }

/* Eine Zeile in einer schlichten Aufzaehlung ohne Punkte. Nur
   Luft nach oben und unten, damit die Zeilen nicht kleben. */
.listenzeile { padding: 3px 0 !important; }

/* Verteilte Reihe, bei der der linke Block mehrzeilig ist und der
   rechte an seiner ersten Zeile stehen soll. */
.reihe-verteilt-oben-10 { display: flex !important; justify-content: space-between !important;
                          align-items: flex-start !important; gap: 10px !important; }
/* Weite Reihe fuer zwei Kennzahlenbloecke nebeneinander. */
.reihe-16-umbruch { display: flex !important; gap: 16px !important; flex-wrap: wrap !important; }

/* Kasten, der bei langem Inhalt selbst rollt statt die Seite zu
   verlaengern. */
.rollkasten-300 { max-height: 300px !important; overflow: auto !important; }

/* F-5b (27.08.2026): stand als style-Attribut in quelle/app/05-zugriff-oberflaeche.js.
   Eintrag im Benutzermenue, gebaut als <a> statt als Knopf - er
   fuehrt auf eine Seite. Sieht deshalb aus wie der Knopf daneben
   (#einstellungen-theme-btn), nur mit Trennlinie darueber. */
.benutzermenue-link { display: block; width: 100%; text-align: left; color: var(--ink);
                      padding: 10px 14px; text-decoration: none; font-size: 0.9rem;
                      border-top: 1px solid var(--line); }
/* KACHELFARBE (18.10.2026): die Wahl im Benutzermenue, unter dem
   Designknopf. Nur im dunklen Design sichtbar (05-zugriff-oberflaeche.js). */
.kachelwahl { border-top: 1px solid var(--line); padding: 8px 14px 10px; }
.kachelwahl-titel { display: block; color: var(--muted); font-size: 0.78rem; margin-bottom: 6px; }
.kachelwahl-knopf { display: flex; align-items: center; gap: 8px; width: 100%; text-align: left;
                    background: none; border: 1px solid transparent; border-radius: 6px;
                    color: var(--ink); padding: 6px 8px; cursor: pointer; font-size: 0.9rem; }
.kachelwahl-knopf[aria-pressed="true"] { border-color: var(--accent); }
.kachelwahl-muster { width: 16px; height: 16px; border-radius: 4px; border: 1px solid var(--muted); flex-shrink: 0; }
.kachelwahl-muster-grau  { /* feste Farbe: Farbmuster zeigt jede Kachelfarbe unabhaengig von der aktuellen Wahl */ background: #26282c; }
.kachelwahl-muster-blau  { /* feste Farbe: Farbmuster zeigt jede Kachelfarbe unabhaengig von der aktuellen Wahl (AB-F1660 Saphir) */ background: #11264a; }
.kachelwahl-muster-gruen { /* feste Farbe: Farbmuster zeigt jede Kachelfarbe unabhaengig von der aktuellen Wahl (AB-F1660 Tannengruen) */ background: #162d1c; }
/* Das Zahnrad neben dem Benutzernamen. */
.benutzermenue-zahnrad { font-size: 1.1em; flex-shrink: 0; }

.ma-links-10 { margin-left: 10px !important; }
.ma-nur-oben-14 { margin: 14px 0 0 !important; }

/* Hoechstbreiten. Wie .hoechstbreite-320 oben nach dem Wert
   benannt - sie sitzen an ganz verschiedenen Dingen (Seitenrahmen,
   Karte, Kachelraster), ein Zweckname waere auf jedem zweiten
   falsch. */
.hoechstbreite-420 { max-width: 420px !important; }
.hoechstbreite-520 { max-width: 520px !important; }
.hoechstbreite-600 { max-width: 600px !important; }
.hoechstbreite-640 { max-width: 640px !important; }
.hoechstbreite-900 { max-width: 900px !important; }

.polster-16 { padding: 16px !important; }
.ma-16-0 { margin: 16px 0 !important; }
.ma-oben-18 { margin-top: 18px !important; }
.ma-unten-20 { margin-bottom: 20px !important; }

/* Reihe, deren Inhalte an ihrer UNTERKANTE ausgerichtet sind -
   Felder mit Beschriftung darueber stehen sonst versetzt zu einem
   Knopf daneben. */
.reihe-10-unten { display: flex !important; gap: 10px !important;
                  align-items: flex-end !important; flex-wrap: wrap !important; }
/* Inhalt an den rechten Rand. */
.reihe-nach-rechts { display: flex !important; justify-content: flex-end !important; }
/* Block, der den Rest der Reihe fuellt, aber nicht unter 220px faellt. */
.dehnen-min-220 { flex: 1 !important; min-width: 220px !important; }

/* Zwei weitere Kaestchenzeilen. .kaestchen-zeile-6 ist die ohne
   Zeiger (das Kaestchen selbst ist der Klickbereich),
   .kaestchen-zeile-gross die hervorgehobene Einzelfrage. */
.kaestchen-zeile-6 { display: flex !important; align-items: center !important;
                     gap: 6px !important; font-weight: 400 !important; }
.kaestchen-zeile-gross { display: flex !important; align-items: center !important;
                         gap: 10px !important; cursor: pointer !important;
                         font-weight: 600 !important; font-size: 1rem !important; }

/* ------------------------------------------------------------
   F-5b (27.08.2026): der Beleg-Platzhalter
   ------------------------------------------------------------
   Stand auf VIER Seiten wortgleich als style-Attribut (belege,
   belege-verwaltung, belege-kostenstelle, eingangsrechnungen).
   Ein PDF hat keine Vorschau, deshalb steht an seiner Stelle ein
   gleich grosses Quadrat mit Symbol - sonst springt die Liste, je
   nachdem ob ein Foto oder ein PDF hinterlegt ist. */
.beleg-platzhalter { width: 90px; height: 90px; flex-shrink: 0; border-radius: 8px;
                     background: var(--card); display: flex;
                     align-items: center; justify-content: center; }
/* Kleinere Fassung in der eigenen Belegliste des Mitarbeiters. */
.beleg-platzhalter-klein { width: 52px; height: 52px; flex-shrink: 0; border-radius: 6px;
                           background: var(--card); display: flex;
                           align-items: center; justify-content: center; }
/* object-fit:cover statt contain: ein hochkant fotografierter Beleg
   soll das Quadrat fuellen, nicht mit Balken darin stehen. */
.beleg-vorschaubild { width: 90px; height: 90px; object-fit: cover; border-radius: 8px; }

/* Vorschau des hinterlegten Firmenlogos in den Einstellungen. */
.logo-vorschau { max-width: 100px; max-height: 40px;
                 /* feste Farbe: Logos sind meist fuer weissen Grund gemacht */ background: #fff;
                 border-radius: 4px; padding: 4px; }
/* Auswahlfeld in einer Tabellenzelle. */
.zellenfeld-auswahl { margin: 0 !important; padding: 4px 8px !important; }
/* Technische Kennung in einer Tabellenzelle: Schreibmaschinenschrift,
   klein, und sie darf mitten im Wort umbrechen - eine UUID hat kein
   Leerzeichen und wuerde die Tabelle sonst ueber den Rand schieben. */
.kennungsspalte { font-family: ui-monospace, monospace; font-size: 0.72rem; word-break: break-all; }

.listenzeile-4 { padding: 4px 0 !important; }
.gewicht-halbfett { font-weight: 600 !important; }

/* ============================================================
   V-22 (30.08.2026): Meldungsfelder im Design der Software
   ============================================================
   Gebaut von frageNach() und frageNachText() in app.js. Ersetzt die
   42 Browserdialoge, die mit eigener Schrift, eigenen Farben und der
   Seitenadresse im Kopf sichtbar aus der Anwendung herausfielen.

   Es ist ein eingebautes <dialog> mit showModal(). Fokusfalle,
   Escape und die Inertheit des Hintergrunds kommen damit vom
   Browser - genau das, was ein Browserdialog vorher von selbst
   konnte und was ein Nachbau aus <div> einzeln erledigen muesste. */
.app-dialog {
  border: 1px solid var(--line);
  border-radius: var(--radius);
  background: var(--card);
  color: var(--ink);
  padding: 22px;
  max-width: 460px;
  width: calc(100% - 32px);
  box-shadow: var(--schatten-hoch);
}

/* Der Ersatzwert ist hier AUSNAHMSWEISE richtig und kein
   vergessener Wert: Ob eine eigene Eigenschaft in ::backdrop
   ueberhaupt vererbt wird, hat sich in den Browsern erst 2023/24
   geaendert. Faellt sie aus, ist der Hintergrund DURCHSICHTIG - der
   Dialog schwebte dann ohne Abdunklung ueber der Seite, und nichts
   wuerde sich melden. Genau die Bauart aus Regel 10, deshalb der
   zweite Wert. */
.app-dialog::backdrop { background: var(--ueberlagerung, rgba(0, 0, 0, 0.6)); }

.app-dialog-text p { margin: 0 0 10px; line-height: 1.5; }
.app-dialog-text p:last-child { margin-bottom: 0; }
/* Die Texte trennen ihre Absaetze mit einer Leerzeile. Ein leerer
   Absatz waere 0 Pixel hoch und der Abstand ginge verloren. */
.app-dialog-leerzeile { height: 6px; margin: 0; }

.app-dialog-eingabe { width: 100%; margin-top: 14px; margin-bottom: 0; }

.app-dialog-knoepfe {
  display: flex;
  gap: 10px;
  justify-content: flex-end;
  flex-wrap: wrap;
  margin-top: 20px;
}
/* 44 Pixel wie ueberall - auch dieser Dialog wird auf dem Telefon
   mit dem Daumen bedient. */
.app-dialog-knoepfe button { min-height: 44px; }

/* Fuer Loeschen, Verschrotten, Stornieren. Der Knopf sagt dann schon
   durch seine Farbe, dass es kein gewoehnliches Weiter ist. */
button.knopf-gefahr { background: var(--blase-bg); color: var(--auf-dunkel); }
button.knopf-gefahr:hover { background: var(--marke-fehler-schrift); }

/* ------------------------------------------------------------
   Die Datenauskunft nach Art. 15/20 DSGVO - AB-F208 (03.09.2026)
   ------------------------------------------------------------
   Diese vier Regeln standen bis heute in stile/datenauskunft.css und
   galten damit nur fuer die Verwaltungsseite. Seit AB-F208 gibt der
   MITARBEITERBEREICH dieselbe Auskunft aus - die betroffene Person
   hatte fuer ihr eigenes Recht nach Art. 15 keinen Knopf. Sie ein
   zweites Mal unter einem zweiten Namen zu schreiben waere zwei
   Darstellungen desselben Dokuments gewesen, die auseinanderlaufen,
   ohne dass es auffiele.

   Sie sind ABSICHTLICH keine Tabelle: Auf einem Telefon mit 375
   Pixeln wuerde eine dreispaltige Tabelle seitlich rollen. Ein
   umbrechendes Flex-Paar aus Name und Wert tut das nicht. */
.da-kopfzeile { display: flex; gap: 10px; flex-wrap: wrap; font-size: 0.88rem; padding: 3px 0; }
.da-kopfzeile-name { font-weight: 600; min-width: 170px; color: var(--muted); }

.da-grenzen { margin: 6px 0 0; padding-left: 20px; }
.da-grenzen li { font-size: 0.82rem; color: var(--muted); margin-bottom: 6px; }

/* ------------------------------------------------------------
   Die Sperrmeldung aus config.js - AB-F543 (10.09.2026)
   ------------------------------------------------------------
   config.js ersetzt den ganzen Seitenrumpf, wenn die Adresse nicht
   freigeschaltet ist (S2-2) oder mandanten.js fehlt (S2-1). Bis heute
   trug diese Meldung zwei style-Attribute; unter style-src 'self'
   (F-5b) ignoriert der Browser sie still - die Meldung stand als
   nackter Text am linken Rand.

   Diese Datei ist dort sicher da: Alle 46 Seiten, die config.js laden,
   laden style.css davor im Kopf, und der Kopf bleibt beim Ersetzen
   des Rumpfs stehen.

   FARBE: --warn statt des alten festen #b00. #b00 kam auf dem dunklen
   Papier nur auf 2,92:1 - unter 3:1 selbst fuer grossen Text. --warn
   hat fuer beide Designs einen eigenen Wert: dunkel 6,37:1, hell
   5,75:1 auf --paper. Kein neuer Farbwert (S2-14-1). */
.sperrmeldung {
  max-width: 40em;
  margin: 4em auto;
  padding: 2em;
  border: 2px solid var(--warn);
  border-radius: 8px;
}
.sperrmeldung h1 { margin-top: 0; color: var(--warn); }

/* ------------------------------------------------------------
   AB-F631 (16.09.2026): stand als el.style.cssText in quelle/app/
   ------------------------------------------------------------
   Die Werte sind woertlich uebernommen; sichtbar aendert sich
   nichts. Kennungen statt Hilfsklassen, weil jedes Element genau
   einmal je Seite vorkommt und seinen Namen schon traegt. Eine
   Kennung schlaegt jede Klassenregel - so wie vorher der
   Inline-Stil; nur ein fremdes !important gewaenne (.hidden am
   Menue ist gewollt). */

/* M-11: Band in der Testumgebung (01-profil-rollen-rechte.js).
   Fixed, nicht sticky - Begruendung dort (OF-4 / N1). */
#umgebungsband {
  position: fixed; top: 0; left: 0; z-index: 9999; width: 100%;
  box-sizing: border-box; padding: 6px 12px; text-align: center;
  font-weight: 700; font-size: 0.82rem; letter-spacing: 0.02em;
  color: var(--band-hinweis-schrift); background: var(--band-hinweis-grund);
}
/* Testadresse zeigt auf die ECHTE Datenbank - der gefaehrliche Fall. */
#umgebungsband.umgebungsband-gefahr {
  color: var(--band-gefahr-schrift); background: var(--band-gefahr-grund);
}

/* Name und Rolle unter der Seitenueberschrift (05-zugriff-oberflaeche.js,
   setupTopbar benennt #topbar-user dafuer um). */
/* AB-F1684: direkt unter dem Strich der Kopfleiste, links unter dem Logo, auf allen Seiten. */
.topbar-pillenzeile { position: absolute; top: calc(100% + 8px); left: 24px; }
@media (max-width: 640px) { .topbar-pillenzeile { left: 14px; } }
#topbar-user-unter-titel {
  font-size: 0.85rem; font-weight: 600; color: var(--auf-dunkel); letter-spacing: 0;
  cursor: pointer; display: inline-flex; align-items: center; gap: 8px;
  background: var(--akzent-schleier-kachel); border: 1px solid var(--accent);
  border-radius: 20px; padding: 7px 20px 7px 16px; width: fit-content;
  box-sizing: border-box; margin: 0;
}
#einstellungen-menu-wrapper { position: relative; width: fit-content; }
#einstellungen-menu {
  position: absolute; left: 0; top: calc(100% + 6px);
  background: var(--card); border: 1px solid var(--line); border-radius: 8px;
  box-shadow: 0 6px 18px rgba(0,0,0,0.3); min-width: 180px; z-index: 50;
  overflow: hidden;
}

/* Hinweisband einer Testmitarbeiter-Sitzung. Die Hoehe misst
   setupTopbar() nach dem Einhaengen und schiebt Kopfleiste und
   Inhalt per el.style nach - das ist gerechnet und bleibt dort.
   AB-F1552: "top: 0" gilt, wenn es kein Umgebungsband gibt (beim
   Kunden). In der Testumgebung setzt setupTopbar() "top" auf die
   gemessene Hoehe von #umgebungsband - sonst laege dessen Band ueber
   der ersten Zeile. */
#testsitzung-band {
  position: fixed; top: 0; left: 0; right: 0; z-index: 300;
  background: var(--accent); color: var(--auf-akzent); padding: 8px 14px;
  font-size: 0.85rem; font-weight: 600; display: flex; align-items: center;
  justify-content: space-between; gap: 12px; flex-wrap: wrap;
}

/* STARTLOGO (22.09.2026) - gesetzt von theme-fruh.js, nur beim Start der
   abgelegten App. Grund und Bild wie der Android-Startbildschirm
   (manifest.json background_color #0a0b0c), damit der Wechsel nicht
   sichtbar ist. Bewusst fest #0a0b0c und nicht var(--bg): auch im hellen
   Farbschema kommt das Handy aus dem dunklen Startbildschirm.
   icon-512.png ist seit AB-F825 FREIGESTELLT (Alpha 0 aussen) - der
   Grund kommt aus dieser Regel, nicht mehr aus dem Bild.

   AB-F825 (23.09.2026), GROESSE: Hier stand min(48vmin, 240px). Das ist
   bildschirmabhaengig, der Android-Startbildschirm zeichnet aber in
   einer FESTEN dp-Groesse. GEMESSEN, was das ausmacht: bei 360 px
   Breite ergab 48vmin 172,8 px, bei 430 px 206,4 px - eine Spanne von
   20 Prozent allein durch das Geraet. Genau das sieht der Betreiber als
   Groessensprung, wenn die Seite den Startbildschirm abloest.

   DIE ZAHL 187px, offen gerechnet:
     Android 12+ zeichnet das Symbol MIT Grund (das ist ein maskable-
     Symbol) in einem Feld von 240 dp, davon sind 160 dp Durchmesser
     sichtbar. 1 dp = 1 CSS-Pixel.
     assets/icon-maskable-512.png traegt das Zeichen auf 64,5 Prozent
     der Bildbreite (gemessen: 330 von 512 px) -> auf dem
     Startbildschirm ist das Zeichen 0,645 * 240 = 154,7 px breit.
     Diese Flaeche malt icon-512.png, dort nimmt das Zeichen 82,6
     Prozent ein (423 von 512 px) -> 154,7 / 0,826 = 187,3 -> 187px.
   EHRLICHE GRENZE: Die beiden dp-Werte (240/160) stammen aus der
   Android-Dokumentation und sind hier NICHT nachgeschlagen worden.
   Stimmt die Groesse auf dem Geraet nicht, ist es genau diese eine
   Zahl - sie steht deshalb nur hier.

   GEMESSEN AM 04.10.2026 (AB-F825) - DIE 187 WAREN ZU KLEIN, JETZT 201px:
     Bildschirmaufnahme des Betreibers vom 03.10.2026 (1080 x 2340
     Geraetepixel), in Einzelbilder zerlegt. Auf dem Android-Startschirm
     ist das Zeichen 459 Geraetepixel breit, in der Seite danach mit
     187px nur 427 - sieben Prozent schmaler, das war das Zucken.
     187 * 459 / 427 = 201,0 -> 201px. Das wirksame Android-Feld ist
     damit 258 dp, nicht 240 (240 * 459 / 427).
   GRENZE: eine Messung von EINEM Geraet.

   NACHGEMESSEN AM 04.10.2026 ABENDS (AB-F825) - 204px UND 6px TIEFER:
     Zweite Bildschirmaufnahme des Betreibers (Stand mit 201px), Bild
     fuer Bild: Startschirm Zeichen 491 Geraetepixel breit, Mitte bei
     y 1168,5; erstes ruhiges Bild der Seite 483,5 breit, Mitte bei
     y 1150,5. Also noch 1,6 Prozent zu schmal (201 * 491 / 483,5 =
     204) und 18 Geraetepixel zu HOCH - das war der Rest des Zuckens.
     Ursache des Versatzes: Android mittelt im ganzen Bildschirm, die
     Seite (inset 0) nur im Fenster zwischen Statusleiste (rund 96
     Geraetepixel) und Tastenleiste (rund 135); (135 - 96) / 2 = 19,5.
     18 Geraetepixel sind bei Verhaeltnis 3 genau 6 CSS-Pixel.
     Der Versatz gilt nur fuer den ERSTEN Anstrich: Beim Wachsen
     schiebt sich das Zeichen in 1,2 s in die Fenstermitte zurueck
     (background-position unten) - die Gleitrechnung in theme-fruh.js
     rechnet weiter ab der Mitte und bleibt unveraendert.
   GRENZE: Der Versatz haengt an Status- und Navigationsleiste des
   Geraets (drei Tasten oder Wischgesten) - die Seite kann die Hoehe der
   Statusleiste nicht abfragen. 6px ist die Messung von EINEM Geraet;
   mit Wischgesten bleibt ein kleiner Rest in die andere Richtung. Das
   Verhaeltnis 3 ist hergeleitet, nicht abgelesen. */
html.startlogo::after {
  content: "";
  position: fixed;
  inset: 0;
  z-index: 2147483647;
  background: #0a0b0c url("assets/icon-512.png?v=202609230602590244cbd59ce1") center / 204px no-repeat; /* feste Farbe: = manifest.json background_color, der Android-Startbildschirm ist immer dunkel (AB-F811 Startlogo, NAME-1b) */
  background-position: center calc(50% + 6px); /* AB-F825: Startlage wie der Android-Startschirm, Messung im Kommentar oben */
  opacity: 1;
  transition: opacity 0.3s ease;
  pointer-events: auto;
}
html.startlogo.startlogo-aus::after { opacity: 0; }
/* AB-F890 (24.09.2026): Auf der Anmeldeseite blendet das Startzeichen
   nicht aus, es GLEITET an den Platz von img#login-logo (theme-fruh.js,
   gleiten()). Dafuer uebernimmt ein echtes <img> das Zeichen; der Grund
   hier verliert im selben Bild sein Zeichen und liegt eine Ebene tiefer,
   damit das gleitende Bild darueber bleibt. Solange das Startlogo steht,
   ist das Anmeldelogo unsichtbar - sonst stuenden wieder zwei Logos
   uebereinander, genau der Befund aus AB-F847. */
html.startlogo .login-logo-img { visibility: hidden; }
/* AB-F890: erst wachsen (1,2 s), dann gleiten. 204 px (bis 04.10.2026
   abends: 201, davor 187) bleibt der Start, weil dort der Android-Startschirm
   aufhoert; 280 px ist das Ziel des Wachsens und passt auch auf 360 px Breite.
   AB-F825: mit dem Wachsen wandert das Zeichen aus der Startlage (6px tiefer)
   in die Fenstermitte - dieselbe Dauer, damit es EINE Bewegung ist. */
html.startlogo.startlogo-wachsen::after { background-size: 280px; background-position: center; transition: opacity 0.3s ease, background-size 1.2s ease-in-out, background-position 1.2s ease-in-out; }
html.startlogo.startlogo-gross::after { background-size: 280px; background-position: center; }
@media (prefers-reduced-motion: reduce) {
  html.startlogo.startlogo-wachsen::after { transition: none; }
}
html.startlogo.startlogo-gleiten::after { background-image: none; z-index: 2147483646; transition: opacity 0.45s ease; }
@media (prefers-reduced-motion: reduce) {
  html.startlogo::after { transition: none; }
}

/* AB-F855 (04.10.2026): Ansicht "Keine Verbindung" auf Verwaltungsseiten
   (quelle/app/05-zugriff-oberflaeche.js, zeigeKeineVerbindung). Die Karte
   selbst ist .card - hier steht nur, was sie davon unterscheidet. Keine
   Farbwerte: alles kommt aus .card und den Knopfregeln. */
.keine-verbindung { text-align: center; padding: 32px 20px; }
.keine-verbindung h2 { margin: 0 0 10px; }
.keine-verbindung p { margin: 0 0 18px; }

/* ------------------------------------------------------------
   AB-F1577 Nr. 48.54 (23.10.2026): Grundschrift Inter
   ------------------------------------------------------------
   :root nennt seit jeher "Inter" als Schrift - bis hierher gab es aber
   weder Datei noch @font-face, jedes Geraet zeigte seine Systemschrift.
   Inter ist seit dem 13.10.2026 die gemeinsame Schrift mit Veluzis
   Mensura (vom Betreiber entschieden). Bauart wie Cormorant Garamond
   unten (AB-F1661): Datei oertlich (CSP font-src 'self'), Herkunft und
   Pruefsumme in bibliotheken/HERKUNFT.json, Pruefung 6 rechnet nach.
   InterVariable aus Inter 4.1, unveraendert: Achse wght 100-900 deckt
   jede Staerke in style.css und stile/ ab (300 bis 800), die Achse opsz
   (14-32) stellt der Browser selbst nach der Schriftgroesse ein. Kein
   size-adjust - Inter ist das Mass, an dem Cormorant (115 %) haengt. */
@font-face {
  font-family: "Inter";
  src: url("bibliotheken/inter-variabel-4.1.ttf?v=20260907g") format("truetype");
  font-weight: 100 900;
  font-style: normal;
  font-display: swap;
}

/* ============================================================
   AB-F1661 (20.10.2026): OPTIK WIE MENSURA
   ============================================================
   Vom Betreiber beauftragt (Uebergabe der Sitzung mensura aktuell vom
   20.10.2026 samt Nachtrag 2 und der Korrektur vom 21.10.2026). Vorlage
   ist Veluzis-Mensura, android/.../ui/Gestaltung.kt (kupferRahmenZeichnen,
   RahmenFeld, KupferDialog, KupferFeld) - die Werte unten sind von dort
   uebernommen, nicht geschaetzt.

   ZWEI GELTUNGSBEREICHE, und genau das haelt der Test
   werkzeuge/tests/test-abf1661-optik-wie-mensura.js fest:
   1. SCHRIFT (Teil A unten) gilt UEBERALL - jedes Design, jede Kachelfarbe.
   2. METALL, FELDER, FENSTER (Teil B) gilt NUR im dunklen Design bei
      Saphir und Tannengruen. Jede Regel dort beginnt mit
      :root:not([data-theme="light"]):is([data-kachel="blau"], [data-kachel="gruen"]).
      Bei Grau und im hellen Design bleibt alles wie es war. */

/* ------------------------------------------------------------
   Teil A: Zierschrift Cormorant Garamond (ueberall)
   ------------------------------------------------------------
   Die Datei liegt oertlich (CSP font-src 'self'), Herkunft und
   Pruefsumme in bibliotheken/HERKUNFT.json, Pruefung 6 rechnet nach.
   size-adjust 115 %: die Vorgabe "Groesse mal 1,15 gegenueber Inter"
   steht damit an EINER Stelle und gilt fuer jede Regel, die die Schrift
   setzt - auch fuer Seitenregeln in stile/, die eine eigene Groesse fuer
   eine Ueberschrift setzen. Ein Browser ohne size-adjust (Safari vor 17)
   zeigt die Schrift ungestreckt; ein Fehler entsteht dabei nicht.
   Variable Achse wght 300-700 (Version 4.001). lnum stellt die
   Mediaevalziffern der Schrift auf Versalziffern um, tnum macht sie
   gleich breit (Betraege stehen dann buendig untereinander). */
@font-face {
  font-family: "Cormorant Garamond";
  src: url("bibliotheken/cormorant-garamond-variabel-4.001.ttf?v=20260907g") format("truetype");
  font-weight: 300 700;
  font-style: normal;
  font-display: swap;
  size-adjust: 115%;
}
:root { --schrift-zier: "Cormorant Garamond", Georgia, "Times New Roman", serif; }

/* Ueberschriften, Seitentitel (h1), Kachelbeschriftungen (.dashboard-tile
   h3, .akte-kachel h3), Kundennamen in Karten (.kunden-zeile > b auf
   uebersicht.html und rechnungen.html) und die Beschriftung der
   Kupferknoepfe. Staerke 600; wo eine Seitenregel 700 setzt, bleibt es
   bei 700 (fett).
   AUSGENOMMEN ist das Angebotsblatt (.ae-blatt): es bildet das gedruckte
   Angebot nach - ob das Dokument die Zierschrift bekommt, ist eine
   offene Frage an den Betreiber (Bericht AB-F1661). */
:is(h1, h2, h3):not(.ae-blatt *),
.kunden-zeile > b,
button.primary:not(.knopf-gefahr):not([id="zeit-ende-btn"], [id="pause-start-btn"], [id="pause-ende-btn"], [id="neuer-urlaubsantrag-btn"]):not(.ae-blatt *),
#arbeitstag-zum-auftrag,
#arbeitstag-erster-auftrag-btn,
.kamera-leiste .kamera-ausloesen {
  font-family: var(--schrift-zier);
  font-weight: 600;
  font-feature-settings: "lnum";
}
:is(h1, h2, h3):not(.ae-blatt *) :is(b, strong) { font-weight: 700; }
/* Preise und Summenzeilen stehen in stile/<seite>.css (Name des Zwecks):
   stile/db1-auswertung.css und stile/rechnungen.css. */

/* ------------------------------------------------------------
   Teil B: Metall nur in Saphir und Tannengruen (dunkel)
   ------------------------------------------------------------
   KUPFERKNOPF F1, als Hintergrund in Schichten (erste Schicht oben).
   Alle Schichten haben border-box als Ursprung, damit der Knopf seine
   GROESSE BEHAELT: Rahmen und Fuge werden gemalt, nicht als border
   gesetzt. Ein 3-px-Rand haette jeden Knopf um 6 px wachsen lassen.
     1 Lichtkante oben  1 px rgba(255,242,224,.78), 1 px unter der Kante
     2 Glanz            obere Haelfte, .25 Weiss bis 0, innen ab 4 px
     3 Leuchten         Ellipse 40 % x 65 % am unteren Rand
     4 Innen            #6a2c0f -> #a9521f (leuchtend) / #1a0c06 -> #2e140a (dunkel)
     5 Fuge             1 px #2a1206 (Rahmen 3 px + Fuge = innen ab 4 px)
     6 Rahmen           3 px Kupferverlauf ueber die ganze Hoehe
   GERECHNET (WCAG): Schrift #fff4ea auf innen 9,79:1 (oben) bis 4,95:1
   (unten), in der Textmitte (innen Mitte plus 23 % Leuchten, #9d4b20)
   5,60:1. Am Leuchtkern selbst (#de7440, unterer Rand, dort steht keine
   Schrift) 2,90:1 - dafuer der Schatten unter der Schrift, wie Mensura.
   Dunkle Fassung: #de7440 auf innen 6,08:1 bis 5,47:1, Textmitte 5,31:1. */
:root:not([data-theme="light"]):is([data-kachel="blau"], [data-kachel="gruen"]) {
  --metall-rahmen: linear-gradient(180deg, #ffe6cc 0%, #f3a06a 18%, #d9682a 45%, #6e2e10 55%, #f3a06a 80%, #a14c22 100%);
  --metall-fuge: linear-gradient(#2a1206, #2a1206);
  --metall-kante: linear-gradient(rgba(255, 242, 224, 0.78), rgba(255, 242, 224, 0.78));
  --metall-glanz: linear-gradient(180deg, rgba(255, 255, 255, 0.25), rgba(255, 255, 255, 0));
  --metall-innen-an: linear-gradient(180deg, #6a2c0f, #a9521f);
  --metall-innen-aus: linear-gradient(180deg, #1a0c06, #2e140a);
  --metall-leuchten-an: radial-gradient(40% 65% at 50% 100%, rgba(222, 116, 64, 1) 0%, rgba(222, 116, 64, 0) 100%);
  --metall-leuchten-aus: radial-gradient(40% 65% at 50% 100%, rgba(222, 116, 64, 0.3) 0%, rgba(222, 116, 64, 0) 100%);
  --metall-schrift: #fff4ea;
  --metall-schrift-schatten: 0 2px 6px rgba(0, 0, 0, 0.7);
  --metall-an:
    var(--metall-kante) center 1px / 100% 1px no-repeat border-box,
    var(--metall-glanz) center 4px / calc(100% - 8px) calc(50% - 4px) no-repeat border-box,
    var(--metall-leuchten-an) center / calc(100% - 8px) calc(100% - 8px) no-repeat border-box,
    var(--metall-innen-an) center / calc(100% - 8px) calc(100% - 8px) no-repeat border-box,
    var(--metall-fuge) center / calc(100% - 6px) calc(100% - 6px) no-repeat border-box,
    var(--metall-rahmen) border-box;
  --metall-aus:
    var(--metall-kante) center 1px / 100% 1px no-repeat border-box,
    var(--metall-glanz) center 4px / calc(100% - 8px) calc(50% - 4px) no-repeat border-box,
    var(--metall-leuchten-aus) center / calc(100% - 8px) calc(100% - 8px) no-repeat border-box,
    var(--metall-innen-aus) center / calc(100% - 8px) calc(100% - 8px) no-repeat border-box,
    var(--metall-fuge) center / calc(100% - 6px) calc(100% - 6px) no-repeat border-box,
    var(--metall-rahmen) border-box;
  /* KLEINES FELD 38 x 38 mittig in der 44-px-Klickflaeche (Zurueck,
     Startseite). Die Klickflaeche bleibt 44 px (Daumen); gemalt werden
     38 px wie das RahmenFeld in Mensura. Die Lagen rechnen von der
     Mitte aus, damit es bei jeder Kastengroesse ab 38 px passt:
     Feldoberkante (B-38)/2, Lichtkante 1 px tiefer -> calc(50% - 17.5px),
     Glanz ab 4 px, 15 px hoch -> calc(50% - 7.5px). */
  --metall-feld-aus:
    var(--metall-kante) center calc(50% - 17.5px) / 38px 1px no-repeat border-box,
    var(--metall-glanz) center calc(50% - 7.5px) / 30px 15px no-repeat border-box,
    var(--metall-leuchten-aus) center / 30px 30px no-repeat border-box,
    var(--metall-innen-aus) center / 30px 30px no-repeat border-box,
    var(--metall-fuge) center / 32px 32px no-repeat border-box,
    var(--metall-rahmen) center / 38px 38px no-repeat border-box;
}

/* Leuchtend (F1): ausgefuellte Kupferknoepfe und die GEWAEHLTE Auswahl -
   aktiver Reiter, gewaehlter Filterknopf, gewaehlter Umschalter.
   Nicht: .knopf-gefahr (Loeschen bleibt rot), das Angebotsblatt (Papier)
   und die vier Knoepfe der Mitarbeiter-App, die ihre Farbe aus einem
   ZUSTAND haben (stile/mitarbeiter.css:137, 161-163: Arbeitszeit beenden
   in Warnfarbe, Pause starten/beenden, Neuer Urlaubsantrag in Blau) - sie
   sind keine Kupferknoepfe. Als [id=...] statt #..., damit die Ausnahme
   der ganzen Liste keine Kennungsstaerke gibt. */
/* Die beiden Kennungen stehen AUSSERHALB von :is() - darin gaebe eine
   Kennung jedem Treffer der Liste ihre Staerke mit. */
:root:not([data-theme="light"]):is([data-kachel="blau"], [data-kachel="gruen"]) :is(
  button.primary:not(.knopf-gefahr):not([id="zeit-ende-btn"], [id="pause-start-btn"], [id="pause-ende-btn"], [id="neuer-urlaubsantrag-btn"]):not(.ae-blatt *),
  .kamera-leiste .kamera-ausloesen,
  .tab-btn.active,
  .ak-umschalter-btn.aktiv,
  :is(.bv-reiter, .er-reiter, .rg-reiter) button.aktiv,
  :is(.beleg-status-btn, .nachricht-kategorie-btn, .kalender-modus-btn).ausgewaehlt
),
:root:not([data-theme="light"]):is([data-kachel="blau"], [data-kachel="gruen"]) #arbeitstag-zum-auftrag,
:root:not([data-theme="light"]):is([data-kachel="blau"], [data-kachel="gruen"]) #arbeitstag-erster-auftrag-btn {
  background: var(--metall-an);
  border-color: transparent;
  border-radius: 0;
  color: var(--metall-schrift);
  text-shadow: var(--metall-schrift-schatten);
}
/* style.css .beleg-status-btn.ausgewaehlt setzt Rand und Schrift mit
   !important - ohne diese Zeile stuende Kupferschrift auf Kupfer. */
:root:not([data-theme="light"]):is([data-kachel="blau"], [data-kachel="gruen"]) .beleg-status-btn.ausgewaehlt {
  border-color: transparent !important;
  color: var(--metall-schrift) !important;
}

/* Dunkel: Neben- und Abbrechen-Knoepfe (button.secondary, "Navigation
   starten") und die NICHT gewaehlten Moeglichkeiten derselben Reihen.
   Nicht: der Zurueck-Pfeil der Mitarbeiter-App (kleines Feld, unten),
   .rand-warnung ("Auftrag absagen" bleibt in Warnfarbe umrandet) und
   das Angebotsblatt. KORREKTUR vom 21.10.2026 zu (C)(4): kleine
   Textknoepfe in Leisten bleiben schlicht - in Veluzis sind das die
   Querverweise .seiten-nav-knopf (uebersicht.html), die hier NICHT
   stehen. Eine Ja/Nein-Leiste gibt es in Veluzis nicht. */
:root:not([data-theme="light"]):is([data-kachel="blau"], [data-kachel="gruen"]) :is(
  button.secondary:not(.knopf-zurueck-symbol):not(.rand-warnung):not(.ausgewaehlt):not(.ae-blatt *),
  .tab-btn:not(.active),
  .ak-umschalter-btn:not(.aktiv),
  :is(.bv-reiter, .er-reiter, .rg-reiter) button:not(.aktiv)
),
:root:not([data-theme="light"]):is([data-kachel="blau"], [data-kachel="gruen"]) #detail-nav-link {
  background: var(--metall-aus);
  border-color: transparent;
  border-radius: 0;
  color: var(--accent);
  text-shadow: none;
}

/* Gesperrt: wie Mensura 45 % Deckkraft (vorher .5). */
:root:not([data-theme="light"]):is([data-kachel="blau"], [data-kachel="gruen"]) :is(
  button.primary:not(.knopf-gefahr):not([id="zeit-ende-btn"], [id="pause-start-btn"], [id="pause-ende-btn"], [id="neuer-urlaubsantrag-btn"]):not(.ae-blatt *),
  button.secondary:not(.knopf-zurueck-symbol):not(.rand-warnung):not(.ae-blatt *),
  .tab-btn,
  .ak-umschalter-btn,
  :is(.bv-reiter, .er-reiter, .rg-reiter) button
):disabled { opacity: 0.45; }

/* Reiter: bisher Text mit Unterstrich und 4 px seitlich. Im Metallrahmen
   (innen ab 4 px) stuende die Schrift am Rahmen - deshalb 14 px wie die
   Chips in Mensura, und der Abstand kommt aus gap der Reihe (.tabs). */
:root:not([data-theme="light"]):is([data-kachel="blau"], [data-kachel="gruen"]) .tab-btn {
  padding: 8px 14px;
  margin-right: 0;
}

/* Kleine Felder im Seitenkopf (Zurueck, Startseite) und der Zurueck-Pfeil
   der Mitarbeiter-App: DUNKLE Fassung, Symbol im Akzent - Nachtrag 2 (B)
   "Kopf ruhiger". Eckig, also auch keine runde Klickflaeche mehr. Symbol
   22 px wie in Mensura (vorher 28). Darueberfahren aendert den Grund
   nicht mehr (der Akzentkreis war rund). */
:root:not([data-theme="light"]):is([data-kachel="blau"], [data-kachel="gruen"]) :is(.seiten-nav-symbol, button.knopf-zurueck-symbol) {
  background: var(--metall-feld-aus);
  border-radius: 0;
  color: var(--accent);
}
:root:not([data-theme="light"]):is([data-kachel="blau"], [data-kachel="gruen"]) :is(.seiten-nav-symbol, button.knopf-zurueck-symbol) svg {
  width: 22px;
  height: 22px;
}

/* Fenster (Nachtrag 2 (C)(2)): Kartengrund mit Perlglanz, Rand und Ecken
   hat .app-dialog schon. Knoepfe darin 14/6 Innenabstand, mindestens 44
   hoch (steht schon in .app-dialog-knoepfe button). */
:root:not([data-theme="light"]):is([data-kachel="blau"], [data-kachel="gruen"]) .app-dialog {
  background: var(--glanz);
}
:root:not([data-theme="light"]):is([data-kachel="blau"], [data-kachel="gruen"]) .app-dialog-knoepfe button {
  padding: 6px 14px;
}

/* Eingabefelder (Nachtrag 2 (C)(1)): Kartengrund statt Creme, Schrift
   --ink, Ecken wie die Karten, Schreibmarke im Akzent. Der Rand bleibt
   aus der Grundregel (1 px --line, im Fokus --accent) - so behalten
   Seitenregeln ihre Randfarbe (Warnrand). color-scheme dark, weil sonst
   Kalender- und Pfeilsymbol der Felder dunkel auf dunklem Grund stuenden.
   :where() haelt die Staerke niedrig, damit gesperrte Felder darunter
   gewinnen. Nicht: Haekchen, Optionsknopf, Schieber, Farbwahl, Blatt.
   GERECHNET: --ink auf --card 13,15:1 / 12,91:1, --muted 5,50:1 / 5,40:1. */
:root:not([data-theme="light"]):is([data-kachel="blau"], [data-kachel="gruen"]) :where(input:not([type="checkbox"], [type="radio"], [type="range"], [type="color"]), select, textarea):not(.ae-blatt *) {
  background: var(--card);
  color: var(--ink);
  border-radius: var(--radius);
  caret-color: var(--accent);
  color-scheme: dark;
}
:root:not([data-theme="light"]):is([data-kachel="blau"], [data-kachel="gruen"]) :where(input, select, textarea):is([readonly], :disabled):not(.ae-blatt *) {
  background: var(--card);
  color: var(--muted);
}
:root:not([data-theme="light"]):is([data-kachel="blau"], [data-kachel="gruen"]) :where(input, textarea):not(.ae-blatt *)::placeholder { color: var(--muted); }
:root:not([data-theme="light"]):is([data-kachel="blau"], [data-kachel="gruen"]) select:not(.ae-blatt *) option { background: var(--card); color: var(--ink); }
:root:not([data-theme="light"]):is([data-kachel="blau"], [data-kachel="gruen"]) :is(input:-webkit-autofill, input:-webkit-autofill:hover, input:-webkit-autofill:focus) {
  -webkit-box-shadow: 0 0 0 1000px var(--card) inset;
  -webkit-text-fill-color: var(--ink);
}
/* Beschriftung ueber dem Feld: --muted, im Fokus Akzent (wie die
   schwebende Beschriftung in Mensura). Nur wo das Feld DIREKT folgt. */
:root:not([data-theme="light"]):is([data-kachel="blau"], [data-kachel="gruen"]) label:not(.ae-blatt *):has(+ :is(input:not([type="checkbox"], [type="radio"]), select, textarea)) { color: var(--muted); }
:root:not([data-theme="light"]):is([data-kachel="blau"], [data-kachel="gruen"]) label:not(.ae-blatt *):has(+ :is(input, select, textarea):focus) { color: var(--accent); }
