/* ============================================================================
   MERCOFINA — Design-System v2
   Farbwelt: Waffenwelt Walch (Markengrün #22c55e = theme-color des Shops)
   auf dunklem Graphit, abgestimmt auf den Sachkundetrainer.
   Legacy-Klassen (.topbar, .list, .detail, .card, .tbl, .badge, …) bleiben
   vollständig kompatibel — alle bestehenden Seiten profitieren ohne Umbau.
   ========================================================================== */

:root{
  /* Flächen */
  --bg:#0c0e13;
  --bg-elevated:#12151d;
  --card:#171b25;
  --card-2:#1e2330;
  --card-3:#262c3c;
  --line:rgba(255,255,255,0.07);
  --line-2:rgba(255,255,255,0.14);

  /* Text */
  --fg:#e9ecf2;
  --muted:#98a0b3;
  --subtle:#5d6478;

  /* Marke (Waffenwelt Walch Grün) */
  --accent:#22c55e;
  --accent-hover:#34d873;
  --accent-dark:#16a34a;
  --accent-dim:rgba(34,197,94,0.12);
  --accent-border:rgba(34,197,94,0.35);

  /* Semantik */
  --ok:#22c55e;        --ok-bg:rgba(34,197,94,0.10);   --ok-bdr:rgba(34,197,94,0.30);
  --warn:#fbbf24;      --warn-bg:rgba(251,191,36,0.10);--warn-bdr:rgba(251,191,36,0.30);
  --bad:#f87171;       --bad-bg:rgba(248,113,113,0.10);--bad-bdr:rgba(248,113,113,0.30);
  --pflicht-bg:rgba(248,113,113,0.045);--pflicht-linie:rgba(248,113,113,0.45);
  --info:#60a5fa;      --info-bg:rgba(96,165,250,0.10);--info-bdr:rgba(96,165,250,0.30);

  --shadow-sm:0 1px 3px rgba(0,0,0,0.35);
  --shadow-md:0 6px 24px rgba(0,0,0,0.45);
  /* Die Umrandung eines BEDIENELEMENTS — nicht zu verwechseln mit --line,
     der Zierlinie. WCAG 1.4.11 verlangt 3:1 gegen die Nachbarfarbe, damit
     man sieht, WO ein Feld anfaengt. `--line` erreicht dort 1,23:1.
     Gemessen auf --card-2: 0.35 Weiss ergibt 3,17:1.
     NUR FUER BEDIENELEMENTE. Zierlinien (Tabellenzeilen, Kartenkanten,
     Trenner) fallen nicht unter 1.4.11 — sie machen kein Bedienelement
     erkennbar. `--line` und `--line-2` bleiben deshalb, wie sie sind. */
  --feld-rand:rgba(255,255,255,0.35);
  /* Der Fokusring faellt unter dieselbe Regel (und unter 2.4.7). Mit 0.35
     Deckkraft erreichte er 1,99:1 — man sah kaum, wo man steht. 0.65
     ergibt 3,68:1. */
  --focus:0 0 0 3px rgba(34,197,94,0.65);
  /* ---- SKALEN (01.09.2026) ------------------------------------------
     Michael: „Ein Button mit einem leicht unterschiedlichen Innenabstand
     oder sonstigen leichten Unterschieden ist ein FEHLER. Das war der
     Ausgangspunkt des Audits, das Ziel identische Bausteine, nicht 50
     kopierte."

     Gemessen am 31.08.2026 (scripts/audit/bausteine.js): 138 verschiedene
     Innenabstaende, 29 Schriftgroessen, 25 Radien. Darunter 14.5px und
     15.5px Schrift und Radien von 3, 5, 7, 9, 10, 11, 14 px — Werte, die
     niemand entscheidet. Sie entstehen, wenn eine Regel kopiert und
     einmal nachjustiert wird.

     FARBEN waren seit Durchgang 11 tokenisiert, MASSE nie. Genau dort sass
     deshalb die ganze Kopiererei — und genau deshalb konnten die
     Durchgaenge 1 und 11 gruen sein, waehrend jede zweite Werkzeugleiste
     ihren Knopf von Hand nachbaut: Ein nachgebauter Knopf ist weder tot
     noch falsch gefaerbt und faellt durch beide Raster.

     DIE SKALEN SIND NICHT SCHMUECKEND, SIE SIND DIE AUSWAHL. Wer einen
     neuen Wert braucht, nimmt die naechste Stufe — oder begruendet eine
     neue. Ein roher Pixelwert in einer Komponentenregel ist ab jetzt ein
     Befund; `scripts/audit/bausteine.js` zaehlt sie. */

  /* Abstand: 4-px-Raster. Ein 2-px-Raster waere billiger zu erreichen
     gewesen, ist aber keine Skala — es ist dasselbe Problem mit besseren
     Namen. */
  --s-1:4px;
  --s-2:8px;
  --s-3:12px;
  --s-4:16px;
  --s-5:24px;
  --s-6:32px;

  /* Schrift. Die Drift sass zwischen 10 und 16 px: dreizehn Werte,
     darunter 10.5, 11.5, 12.5, 13.5, 14.5, 15.5.

     ES WIRD AUFGERUNDET, NIE AB. Der erste Anlauf rundete kaufmaennisch
     und machte die Listenschrift 4 % KLEINER (12.5 -> 12 an 47 Stellen) —
     bei einem Audit, das an der Lesbarkeit arbeitet, die falsche Richtung.
     Wer den ganzen Tag Listen liest, soll eher mehr sehen als weniger. */
  --t-0:9px;      /* Marken, die keine Saetze sind: Aufklapp-, Sortierpfeil */
  --t-1:11px;
  --t-2:12px;
  --t-3:13px;
  --t-4:14px;
  --t-5:16px;
  --t-6:20px;     /* Ueberschriften: hier standen 17, 19, 20, 22 px */
  --t-7:26px;     /*                 und hier 24, 25, 26, 28 px */

  --r-klein:4px;   /* war 3, 4, 5 px */
  --r-mittel:6px;  /* war 6, 7 px */
  --r-gross:20px;  /* grosse Flaechen */
  --r-pille:999px; /* voll gerundet — Absicht, kein Rastfall */
  --r-inner:8px;
  --r-card:12px;
  --topbar-h:52px;
  --subbar-h:37px; /* Unterleiste der Bereichs-Navigation (nav.js) */

  /* ---- SCHRIFT AUF DER AKZENTFLAECHE (10.09.2026) --------------------
     Stand als #04170b fest in der Grundregel des Knopfes. Auf dem hellen
     Tannengruen waere dieses Fast-Schwarz zwar lesbar, aber der Knopf
     saehe aus wie deaktiviert; umgekehrt ist Weiss auf dem hellen
     Signalgruen der dunklen Erscheinung unlesbar. Die Schrift auf einer
     Akzentflaeche ist damit KEIN fester Wert, sondern haengt an der
     Erscheinung — also ein Token. */
  --auf-akzent:#04170b;

  /* ---- ELF TOKEN, DIE GEFEHLT HABEN (10.09.2026) ---------------------
     Gefunden beim Auflösen der 112 harten Farben in dieser Datei. Diese
     Dinge kamen mehrfach vor, hatten aber keinen Namen — also hat sich
     jede Stelle ihren eigenen Wert ausgedacht. Der SCHLEIER stand in fünf
     Fassungen da (rgba(5,7,10,.65), rgba(6,10,8,.62), rgba(0,0,0,.55) …),
     obwohl jedes Mal dasselbe gemeint war: „was dahinter liegt, ist
     gerade nicht dran". Der grosse SCHATTEN in drei Grössen. */

  /* Der Schleier hinter einem Fenster. */
  --schleier:rgba(6,10,8,0.62);
  /* Der Bildbetrachter verdunkelt fast ganz — ein Foto wird auf Schwarz
     beurteilt, in beiden Erscheinungen. Bewusst gleich, kein Vergessen. */
  --schleier-stark:rgba(0,0,0,0.92);

  /* Zeile unter dem Zeiger, gewählte Zeile. */
  --zeile-hover:rgba(255,255,255,0.03);
  --zeile-aktiv:rgba(255,255,255,0.05);

  /* Der grosse Schatten (Fenster, schwebende Listen). --shadow-md ist für
     Karten, dies für Dinge, die WIRKLICH über allem liegen. */
  --shadow-lg:0 14px 40px rgba(0,0,0,0.5);

  /* Schrift auf einer SEMANTISCHEN Fläche (roter Ablehnen-Knopf, gefüllte
     Warnpille, grüne Master-Marke). Der Bruder von --auf-akzent, und er
     KIPPT genauso: In der dunklen Erscheinung sind --ok/--warn/--bad HELLE
     Farben, in der hellen sind sie DUNKEL — die Schrift darauf muss also
     mitkippen, nicht feststehen.

     DAS HAT EINEN ECHTEN FEHLER AUFGEDECKT: `.actions .reject` setzte
     weisse Schrift auf --bad. Auf dem hellen Rot der dunklen Erscheinung
     (#f87171) sind das 2,8:1 — durchgefallen (WCAG 1.4.3). Mit diesem
     Token sind es 7,2:1. Der Umschalter hat die Stelle sichtbar gemacht;
     falsch war sie schon vorher. */
  --auf-signal:#0d0705;

  /* ---- PAPIERFARBEN: in BEIDEN Erscheinungen gleich -------------------
     Diese Werte bilden GEGENSTÄNDE ab, nicht Mercofina. Eine PDF-Seite und ein
     Produktfoto liegen auf Weiss, ein Kassenbon ist Thermopapier, eine
     Kameravorschau ist schwarz. Nichts davon ändert sich, wenn jemand die
     Ansicht umschaltet. Sie stehen als Token da, damit klar ist: nicht
     vergessen, sondern entschieden. */
  --blatt:#ffffff;
  /* Klickflächen AUF dem Blatt (das-papier-ist-die-maske): Das Blatt ist in
     beiden Erscheinungen weiss, also auch das Grün darauf gleich. */
  --blatt-feld:#15803d;
  --blatt-feld-hell:rgba(21,128,61,.10);
  /* Pflichtangabe, die fehlt (Kunde, Position, Lieferung): dezent rot
     (Michael, 25.09.2026: „Nimm bitte ein dezenteres Rot“). */
  --blatt-pflicht:#c25450;
  --blatt-pflicht-hell:rgba(194,84,80,.045);
  --blatt-grau:#595959;   /* die graue Hinweisschrift des PDFs */
  --papier:#f6f4ee;
  --papier-schrift:#1b1b1b;
  --papier-leise:#444444;
  --papier-linie:#999999;
  --kamera:#000000;

  /* Womit der Browser seine eigenen Bedienelemente zeichnet (Datumswaehler,
     Rollbalken, Ankreuzfelder). Stand als `color-scheme:dark` einzeln an
     `input[type="date"]`; damit waeren in der hellen Erscheinung genau die
     Datumsfelder dunkel geblieben. */
  --browser-schema:dark;
}

/* ======================================================================
   DIE HELLE ERSCHEINUNG — Regelwerk `mercofina-hat-zwei-erscheinungen`

   Michael, 09.09.2026: „Und ist es moeglich, Mercofina sowohl in einem hellen
   als auch unserem Dark Design darzustellen? Umschaltbar?" — und zur
   Farbe: „Das Helle Mercofina kann gerne auch weg vom Gruen. Gruen weiss ist
   wahrscheinlich nicht so prickelnd."

   HIER STEHEN NUR WERTE. Keine Regel, kein Mass, kein Aufbau. Das ist die
   ganze Zusage: Wer eine Komponente baut, muss von dieser Erscheinung
   nichts wissen — er nimmt Token, und beide Welten stimmen.

   UMGEKEHRT IST DAS DER PRUEFSTEIN. `selftest-bausteine` ZAEHLT Regeln und
   hat beim Umbau am 01.09.2026 dreimal gruen gemeldet, waehrend etwas
   kaputt war. Beim Umschalten dagegen wird jede hart geschriebene Farbe
   SICHTBAR falsch. Deshalb ist die zweite Erscheinung nicht Beiwerk des
   Umbaus, sondern sein Messgeraet.

   DAS GRUEN IST GERECHNET, NICHT GEWAEHLT. #22c55e steht auf dem dunklen
   Grund bei rund 8:1, auf Weiss nur bei rund 2:1 — als Schrift oder duenne
   Linie dort unlesbar (WCAG 1.4.3, 4.5:1). Nachgedunkelt auf #15803d
   erreicht es 4,5:1 gegen den Papiergrund und 5,0:1 gegen Weiss auf der
   Knopffl aeche. Dieselbe Marke, dieselbe Bedeutung, lesbar.

   DUNKEL BLEIBT DER STANDARD. Hell ist ein Angebot, keine Umstellung.
   ====================================================================== */
:root[data-erscheinung="hell"]{
  /* Flaechen — warmes Papier, kein reines Weiss. Reines #ffffff unter einer
     Liste, die den ganzen Tag gelesen wird, blendet; der leichte Gruenstich
     haelt die Flaeche mit der Marke zusammen. */
  --bg:#f2f4f1;
  --bg-elevated:#f8faf7;
  --card:#ffffff;
  --card-2:#eef1ec;
  --card-3:#e3e7df;
  --line:rgba(16,24,20,0.10);
  --line-2:rgba(16,24,20,0.20);

  /* Text */
  --fg:#161a17;        /* 15,8:1 auf --bg */
  --muted:#5a6360;     /*  5,5:1 auf --bg */
  --subtle:#8a9490;    /* nur fuer Zierschrift, nie fuer Saetze */

  /* Marke */
  --accent:#15803d;
  --accent-hover:#166534;
  --accent-dark:#14532d;
  --accent-dim:rgba(21,128,61,0.10);
  --accent-border:rgba(21,128,61,0.35);
  --auf-akzent:#ffffff;

  /* Semantik — dieselben Bedeutungen, andere Werte. Das Ocker musste
     dunkler als das dunkle Pendant: #fbbf24 erreicht auf Papier nur
     4,4:1 und faellt damit knapp durch. */
  --ok:#15803d;   --ok-bg:rgba(21,128,61,0.10);   --ok-bdr:rgba(21,128,61,0.30);
  --warn:#8a5200; --warn-bg:rgba(138,82,0,0.10);  --warn-bdr:rgba(138,82,0,0.30);
  --bad:#b91c1c;  --bad-bg:rgba(185,28,28,0.09);  --bad-bdr:rgba(185,28,28,0.30);
  --pflicht-bg:rgba(185,28,28,0.035);--pflicht-linie:rgba(185,28,28,0.40);
  --info:#1d4ed8; --info-bg:rgba(29,78,216,0.09); --info-bdr:rgba(29,78,216,0.30);

  /* Schatten sind auf Dunkel gerechnet: rgba(0,0,0,.45) wirkt auf Papier
     wie ein Fleck. Auf Hell traegt die Kante, nicht der Schlagschatten. */
  --shadow-sm:0 1px 2px rgba(16,24,20,0.08);
  --shadow-md:0 6px 20px rgba(16,24,20,0.12);

  /* Bedienelement-Rand und Fokusring: dieselbe Zusage wie im Dunkeln
     (WCAG 1.4.11, 3:1 gegen die Nachbarfarbe), andere Richtung. */
  --feld-rand:rgba(16,24,20,0.28);
  --focus:0 0 0 3px rgba(21,128,61,0.35);

  /* Der Schleier verdunkelt auch auf Papier — er soll ja zeigen, dass das
     Dahinterliegende nicht dran ist. Nur schwächer: Auf hellem Grund
     genügt weniger für denselben Abstand. */
  --schleier:rgba(16,24,20,0.42);
  /* --schleier-stark bleibt schwarz: das Foto wird auf Schwarz beurteilt. */
  --schleier-stark:rgba(0,0,0,0.92);

  --zeile-hover:rgba(16,24,20,0.04);
  --zeile-aktiv:rgba(16,24,20,0.07);

  --shadow-lg:0 14px 40px rgba(16,24,20,0.18);

  /* Hier kippt die Signalschrift auf Weiss: --ok/--warn/--bad sind in
     dieser Erscheinung dunkel (5,0 / 5,7 / 5,8 : 1 gegen Weiss). */
  --auf-signal:#ffffff;

  /* Papierfarben bleiben, wie sie sind. Papier ist Papier. */
  --blatt:#ffffff;
  /* Klickflächen AUF dem Blatt (das-papier-ist-die-maske): Das Blatt ist in
     beiden Erscheinungen weiss, also auch das Grün darauf gleich. */
  --blatt-feld:#15803d;
  --blatt-feld-hell:rgba(21,128,61,.10);
  /* Pflichtangabe, die fehlt (Kunde, Position, Lieferung): dezent rot
     (Michael, 25.09.2026: „Nimm bitte ein dezenteres Rot“). */
  --blatt-pflicht:#c25450;
  --blatt-pflicht-hell:rgba(194,84,80,.045);
  --blatt-grau:#595959;   /* die graue Hinweisschrift des PDFs */
  --papier:#f6f4ee;
  --papier-schrift:#1b1b1b;
  --papier-leise:#444444;
  --papier-linie:#999999;
  --kamera:#000000;

  --browser-schema:light;
}

*{box-sizing:border-box}
html{
  height:100%;
  /* KEINE Text-Aufblähung am Handy (Befund Michael, 02.09.2026, Screenshots
     vom Telefon): Chrome/Android vergrößert bei Inhalten, die breiter als
     der Bildschirm sind, NUR Fließtext-Blöcke (Absätze, Überschriften,
     Aufklapp-Titel) und lässt Felder/Tabellen klein — das ergibt genau die
     ungleich großen Texte im Konto-Fenster und über den Zuordnungen.
     100% = Schrift bleibt überall so groß, wie sie gesetzt ist. */
  -webkit-text-size-adjust:100%;
  text-size-adjust:100%;
}
body{
  margin:0;
  font:14px/1.55 -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
  background:var(--bg);
  color:var(--fg);
  -webkit-font-smoothing:antialiased;
}
::selection{background:var(--accent-border)}

/* Dezente Scrollbars */
*{scrollbar-width:thin;scrollbar-color:var(--card-3) transparent}
*::-webkit-scrollbar{width:10px;height:10px}
*::-webkit-scrollbar-thumb{background:var(--card-3);border-radius:var(--r-inner);border:2px solid var(--bg)}
*::-webkit-scrollbar-track{background:transparent}

.muted{color:var(--muted)}
a{color:var(--accent)}
a:hover{color:var(--accent-hover)}
code{background:var(--card-2);padding:1px var(--s-2);border-radius:var(--r-mittel);border:1px solid var(--line);font-size:var(--t-3)}

h1,h2,h3,h4{letter-spacing:-0.01em}

/* ============================== Formulare ============================== */
label{display:block;margin:var(--s-4) 0 var(--s-2);font-size:var(--t-3);color:var(--muted)}
input,select,textarea{
  width:100%;padding:var(--s-2) var(--s-3);
  border:1px solid var(--feld-rand);border-radius:var(--r-inner);
  background:var(--card-2);color:var(--fg);outline:none;
  font:inherit;font-size:var(--t-4);
  transition:border-color 130ms,box-shadow 130ms,background 130ms;
}
/* DER PLATZHALTER IST TEXT — und Text hat 4,5:1 (WCAG 1.4.3, keine Ausnahme
   fuer Platzhalter). `--subtle` erreicht auf dem Feldgrund `--card-2` nur
   2,66:1; `--muted` erreicht 5,99:1 und bleibt trotzdem deutlich leiser als
   der eingegebene Text (`--fg`, 13,26:1). Der Unterschied zwischen „hier
   steht ein Beispiel" und „hier steht meine Eingabe" bleibt also erhalten.

   Gemessen, nicht geschaetzt — und lange uebersehen: Ein Platzhalter ist kein
   TEXTKNOTEN, deshalb kam er in der Kontrastmessung von Paket 5 (359 Stellen)
   gar nicht vor. Er stand seitdem als offener Punkt im STATUS.

   Die frueher eigene Regel fuer `.sicht-suche` ist damit ueberfluessig — sie
   sagte hier schon das Richtige, aber nur an einer Stelle. */
input::placeholder,textarea::placeholder{color:var(--muted)}
/* Filter-/Suchfelder (type="search"): eingebautes ✕ zum Leeren, auf dunklem
   Grund sichtbar gemacht. Live-Filter reagieren aufs input-Event, Reload-
   Filter (Journal/Belege) zusätzlich aufs search-Event. */
input[type="search"]::-webkit-search-cancel-button{
  -webkit-appearance:none;appearance:none;
  height:14px;width:14px;margin-left:6px;cursor:pointer;flex:none;
  background:var(--muted);
  -webkit-mask:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 14 14"><path d="M2 2l10 10M12 2L2 12" stroke="black" stroke-width="2.4" stroke-linecap="round"/></svg>') center/contain no-repeat;
          mask:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 14 14"><path d="M2 2l10 10M12 2L2 12" stroke="black" stroke-width="2.4" stroke-linecap="round"/></svg>') center/contain no-repeat;
}
input[type="search"]::-webkit-search-cancel-button:hover{background:var(--fg)}
input:hover,select:hover,textarea:hover{border-color:var(--line-2)}
input:focus,select:focus,textarea:focus{border-color:var(--accent-border);box-shadow:var(--focus);background:var(--card)}
/* GEAENDERT gegenueber dem vorbelegten Ist-Stand (04.09.2026, Umbau-Dialog:
   Michael „das geaenderte Feld hervorheben, dann sieht man sofort, was
   geaendert wurde"). Bewusst am Feld selbst und nicht als Zusatzzeile — die
   Markierung soll dort sein, wo die Aenderung steht. */
input.geaendert,select.geaendert,textarea.geaendert{border-color:var(--warn-bdr);background:var(--warn-bg)}
/* Ein Kaestchen hat keinen Rand zum Faerben — die Umrandung liegt aussen.
   Kein Wort daneben (Michael, 05.09.2026: „ein geaendert an der Stelle ist
   nicht sehr sinnvoll"). */
input[type=checkbox].geaendert{outline:2px solid var(--warn-bdr);outline-offset:2px}
select{cursor:pointer;appearance:none;-webkit-appearance:none;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%2398a0b3' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 10px center;padding-right:32px}
select[multiple]{background-image:none;padding-right:11px}
input[type="checkbox"]{width:16px;height:16px;accent-color:var(--accent);cursor:pointer}
input[type="radio"]{width:15px;height:15px;accent-color:var(--accent);cursor:pointer}
/* Der Browser zeichnet Datumswaehler, Rollbalken und Ankreuzfelder selbst.
   Das stand hier als `color-scheme:dark` an genau EINER Feldart — in der
   hellen Erscheinung waeren damit die Datumsfelder dunkel geblieben, und
   die Rollbalken auch. Jetzt sagt es die Wurzel fuer alles auf einmal. */
:root{color-scheme:var(--browser-schema)}

/* File-Input im Dark Theme */
input[type="file"]{padding:0;background:none;border:0}
input[type="file"]::file-selector-button{
  padding:var(--s-2) var(--s-4);border:1px solid var(--line);border-radius:var(--r-inner);
  background:var(--card-3);color:var(--fg);font-size:var(--t-3);font-family:inherit;
  cursor:pointer;margin-right:10px;transition:background 130ms,border-color 130ms;
}
input[type="file"]::file-selector-button:hover{background:var(--card-2);border-color:var(--line-2)}

/* ============================== Buttons ================================ */
/*
 * SCHALENMODUS — dieselbe Seite, am Handy schmaler.
 *
 * Michael, 28.08.2026: „Bei Inventur und Stempeluhr fällt man irgendwie aus der
 * App raus, also die Oberfläche ändert sich."
 *
 * Inventur und Stempeluhr sind bewusst keine zweite Fassung in der Schale
 * (`mercofinago-ist-eine-schale`): Zwei Fassungen derselben Sache driften
 * auseinander, und die zweite ist immer die ältere. Stattdessen trägt, was nur
 * am Schreibtisch Sinn hat, ein `data-nur-mercofina` — und verschwindet, wenn
 * nav.js die Seite als Geräte-Sitzung erkennt.
 */
body[data-schale="mercofinago"] [data-nur-mercofina]{display:none !important}
/* Und die Gegenrichtung: ein kurzer Satz, der nur am Handy steht — dort, wo
   die lange Erklärung Knöpfe beschreibt, die es in der Schale gar nicht gibt. */
[data-nur-schale]{display:none !important}
body[data-schale="mercofinago"] [data-nur-schale]{display:revert !important}
body[data-schale="mercofinago"] .seite{height:auto}
body[data-schale="mercofinago"] .pane-body{padding:var(--s-4)}
/* Die Reiterleiste kommt aus `mercofinago.css` und ist dort ein Flex-Kind des
   Schalenrahmens. Hier gibt es diesen Rahmen nicht — also steht sie fest am
   unteren Rand, und der Seiteninhalt bekommt Platz darunter. */
body[data-schale="mercofinago"]{padding-bottom:74px}
/* Die kleine Zahl am Reiter. Sie sitzt am Symbol, nicht neben dem Wort: Ein
   Reiter ist ein Fuenftel Handybreite, und eine Zahl in der Zeile schoebe die
   Beschriftung ab. */
.go-reiter > * { position:relative; }
.go-zahl{
  position:absolute; top:2px; left:50%; margin-left:5px;
  min-width:15px; height:15px; padding:0 var(--s-1); box-sizing:border-box;
  border-radius:var(--r-inner); background:var(--accent); color:var(--auf-akzent);
  font:700 9.5px/15px ui-sans-serif,system-ui,sans-serif; font-style:normal;
  text-align:center; letter-spacing:0;
}
body[data-schale="mercofinago"] .go-reiter{
  position:fixed;left:0;right:0;bottom:0;z-index:40;
  max-width:640px;margin:0 auto;
}

/* Ein LINK, der wie ein Knopf aussieht — fuer Wege, die eine SEITE oeffnen
   statt eine Aktion auszuloesen („Mercofina GO oeffnen“). Ein <button>, der nur
   navigiert, nimmt dem Browser das Oeffnen im neuen Tab weg. */
a.btn{text-decoration:none;display:inline-block}
a.btn:hover{text-decoration:none}/* `.nav-btn` und `.btn-vorschau` sitzen an einem <a>, `.split-btn-item` an
   einem <div> - `button` allein erreicht sie nicht. GENAU DESHALB haben sie
   frueher alles selbst deklariert. Der Selektor wandert also an die
   Definition, nicht die Definition ins Markup. */
button, a.btn, a.btn-vorschau{
  padding:var(--s-2) var(--s-4);border:0;border-radius:var(--r-inner);
  background:var(--accent);color:var(--auf-akzent);
  font-weight:600;font-size:var(--t-3);font-family:inherit;line-height:1.4;
  cursor:pointer;white-space:nowrap;
  transition:background 130ms,border-color 130ms,transform 60ms;
}
/* ======================================================================
   EIN KNOPF — Michael, 01.09.2026:

     "Es soll 1 Button Design geben. Gleiche Groesse, Abstaende,
      Schriftgroesse, Mouse over Reaktionen usw. ... Einen definieren,
      ueberall einsetzen. ... Ausnahmen da, wo auch was anders ist,
      z.B. auf der Kasse oder Mercofina GO."

   Vorher setzten VIERZEHN Regeln ihre eigene Groesse, ihren eigenen
   Innenabstand und ihre eigene Schrift — 15 Innenabstaende, 6
   Schriftgroessen, 5 Radien fuer eine Sache. Das entsteht nicht durch
   Entwerfen, sondern durch Kopieren und einmaliges Nachjustieren.

   Der Weg hier ist EINE REGEL MIT VIELEN SELEKTOREN, nicht eine Klasse je
   Stelle: Die Definition steht genau einmal, und kein Markup muss dafuer
   angefasst werden. Wer eine Stelle aendern will, aendert sie hier — und
   damit ueberall.

   WAS EINE EINZELREGEL DANACH NOCH DARF: nur, was sie STRUKTURELL
   unterscheidet. Ein Reiter hat eine Unterkante, ein Segment keinen
   Radius, ein geteilter Knopf eine halbe Rundung. Groesse, Abstand und
   Schrift kommen ohne Ausnahme von hier.
   ====================================================================== */

/* --- KNOPF OHNE FLAECHE ------------------------------------------------
   Zehn Regeln meinten dasselbe und sagten es zehnmal verschieden:
   `background:transparent` bzw. `none`, `border:0`, gedaempfte Schrift.
   Eine Variante, die es als Modifikator nicht gab — deshalb hat sich jede
   ihren eigenen Innenabstand erfunden. */
/* `a.nav-btn` statt `.nav-btn`: gleiche Spezifitaet wie die Grundregel,
   die es ebenfalls mit `a.` erreichen muss. Mit `.nav-btn` gewaenne dort
   der Grundknopf, und die ganze Navigationsleiste waere gruen. */
button.flach,
.mtabs button,
.er-btn,
.segment button,
.klapp-btn,
.html-editor-leiste button,
.split-btn-item,
.hilfe-nav .kapitel > button,
.nav-konto-item .nav-menu button,
button.sicht-titel.klappbar{
  background:transparent;border:0;color:var(--muted);font-weight:500;
}
/* Und EINE Mouseover-Reaktion, nicht neun. Vorher: mal nur die Farbe, mal
   `--card-2`, mal `--accent`, mal gar nichts. */
button.flach:hover,
.mtabs button:hover,
.er-btn:hover,
.segment button:hover,
.klapp-btn:hover,
.html-editor-leiste button:hover,
.split-btn-item:hover,
.hilfe-nav .kapitel > button:hover,
button.sicht-titel.klappbar:hover{
  background:var(--card-2);color:var(--fg);
}

/* --- DICHTE REIHEN -----------------------------------------------------
   Die EINE erlaubte Groessenabweichung, und sie ist Michaels eigene
   Entscheidung vom 28.08.2026: "Die Liste ist leider total unleserlich."
   Zwei volle Knoepfe je Tabellenzeile brechen um und machen aus einer
   Liste eine Wand. Wer eng bauen muss, nimmt DIESE Groesse — keine neue. */
button.btn-sm,
.er-btn,
.hilfe-nav .kapitel > button,
.html-editor-leiste button,
.pdf-btn{
  padding:var(--s-1) var(--s-2);font-size:var(--t-2);line-height:1.3;min-height:0;
}

button:hover{background:var(--accent-hover)}
/* GEDRÜCKT = DUNKLER, NICHT VERSCHOBEN (Befund 036, 29.09.2026). Hier stand
   `transform:translateY(1px)`. In Edge mit echten Bildlaufleisten löste der
   eine Pixel bei einem Fenster, das gerade eben ins Bild passt, eine
   Neuberechnung aus: Der Speichern-Knopf der Fahrt sprang beim Drücken 73 px
   nach unten, das Loslassen traf ihn nicht mehr — und ein Klick braucht
   beides auf demselben Element. Zwei Wochen lang kam so keine Fahrt beim
   Server an. Ein Druck-Effekt darf das Layout nicht anfassen. Wächter:
   selftest-bausteine.js. */
button:active{filter:brightness(.9)}
/* AUCH AM <a> (Durchgang 22, Paket 5, Sorte 3). Vier Stellen schreiben
   `<a class="btn ghost">` — die Regel griff dort nicht, der Link behielt
   also die gruene Vollflaeche des Grundknopfes und bekam helle Schrift
   darauf: 1,93:1, der schlechteste Kontrastwert im ganzen Durchgang. Und
   zugleich das falsche Aussehen: ein Geist-Knopf, der wie der Hauptknopf
   aussieht. Dasselbe Muster wie bei `.nav-btn` — der Selektor wandert an
   die Definition. */
button.ghost,
a.btn.ghost{background:transparent;border:1px solid var(--line-2);color:var(--fg);font-weight:500}
button.ghost:hover,
a.btn.ghost:hover{background:var(--card-2);border-color:var(--accent-border)}

/* Kleiner Knopf fuer Zeilenaktionen (Aendern/Loeschen in langen Listen).
   Michael, 28.08.2026: "Die Liste ist leider total unleserlich." - zwei
   normalgrosse Knoepfe je Zeile brechen um und machen aus einer Liste eine
   Wand. Diese Klasse wurde vorher benutzt, ohne dass es sie gab. */
button.btn-sm + button.btn-sm{margin-left:4px}
/* Michael, 28.08.2026: "Eingeruecktes Buttons sieht nicht gut aus." Die beiden
   Zeilenknoepfe brachen untereinander um, weil die Spalte zu schmal war - und
   umgebrochen wirkten sie eingerueckt. Sie gehoeren nebeneinander, also darf
   ihre Zelle nicht umbrechen. */
td.zeilen-knoepfe{white-space:nowrap;text-align:right}

/* Tages-Trennzeile in der Zeitenliste: ein Kopf fuer die ganze Tabelle, der
   Tag als Zwischenzeile. */
tr.tag-trenner td{background:var(--card-2);border-top:1px solid var(--line-2);
  padding-top:9px;padding-bottom:9px;font-size:var(--t-3)}
tr.tag-trenner:first-child td{border-top:0}
button.danger,
a.btn.danger{background:transparent;border:1px solid var(--bad-bdr);color:var(--bad);font-weight:500}
button.danger:hover{background:var(--bad-bg)}
button:disabled{opacity:.55;cursor:not-allowed;transform:none}
.card>button,label+button{margin-top:14px}
.row button,.row-between button,.tbl-actions button,.btn-group button,.ident-row button,.actions button,.tbl td button{margin:0}

a.ghost{
  display:inline-block;padding:var(--s-2) var(--s-3);border:1px solid var(--line-2);
  border-radius:var(--r-inner);color:var(--fg);text-decoration:none;font-size:var(--t-3);
  transition:background 130ms,border-color 130ms;
}
a.ghost:hover{background:var(--card-2);border-color:var(--accent-border);color:var(--fg)}

/* IN NEUEM TAB ÖFFNEN (01.10.2026, Baustein `neuerTabHtml` in wawi.js) — das
   Symbol EINMAL, als Maske: es nimmt die Schriftfarbe an (Link grün, Knopf
   hell, Hover wie der Knopf). Ersetzt das nackte „↗" an allen Links. */
:root{--symbol-neuer-tab:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M14 4h6v6'/%3E%3Cpath d='M20 4 10 14'/%3E%3Cpath d='M19 13v6a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V6a1 1 0 0 1 1-1h6'/%3E%3C/svg%3E")}
/* Knopf (`neuerTabHtml`) und Link im Satz (`class="neuer-tab-link"`) — dasselbe Symbol. */
.neuer-tab-symbol,
a.neuer-tab-link::after{
  display:inline-block;width:.95em;height:.95em;margin-left:.3em;vertical-align:-.12em;background:currentColor;
  -webkit-mask:var(--symbol-neuer-tab) center/contain no-repeat;mask:var(--symbol-neuer-tab) center/contain no-repeat;
}
a.neuer-tab-link::after{content:""}
a.ghost.neuer-tab{display:inline-flex;align-items:center;gap:var(--s-1);padding:var(--s-1) var(--s-2);font-size:var(--t-2);white-space:nowrap;line-height:1.2}
a.ghost.neuer-tab .neuer-tab-symbol{margin-left:0}
a.ghost.neuer-tab.nur-symbol{padding:var(--s-1) var(--s-1)}

.msg{margin-top:12px;color:var(--muted);font-size:var(--t-3)}
.msg.ok{color:var(--ok)}
.msg.error{color:var(--bad)}

/* ============================== Topbar ================================= */
.topbar{
  /* --s-3, nicht --s-4: Die Kopfzeile ist eine DICHTE REIHE. Mit 16 px
     Luecke (7 Stueck = +14 px gegenueber den fruheren 14 px) plus etwas
     breiterem Such- und Namensblock fehlten rund 23 px, und `Verwaltung`
     fiel ins „Mehr"-Menue. `navigation.spec.js` besteht zu Recht darauf,
     dass bei 1638 px ALLES offen steht. */
  display:flex;align-items:center;gap:var(--s-3);
  height:var(--topbar-h);padding:0 var(--s-4);
  border-bottom:1px solid var(--line);
  background:linear-gradient(180deg,var(--bg-elevated),var(--card));
  position:sticky;top:0;z-index:30;
}
.topbar>strong{
  display:flex;align-items:center;gap:var(--s-2);
  font-size:var(--t-5);font-weight:700;letter-spacing:0.02em;
}
/* Brand-Mark: grünes Quadrat mit Fadenkreuz-Punkt */
.topbar>strong::before{
  content:"";width:22px;height:22px;border-radius:var(--r-mittel);flex:0 0 auto;
  background:
    radial-gradient(circle at center,var(--auf-akzent) 0 2.5px,transparent 3px),
    linear-gradient(135deg,var(--accent),var(--accent-dark));
  box-shadow:0 0 12px var(--accent-border);
}
.spacer{flex:1}
#who{font-size:var(--t-3);white-space:nowrap}

.tabs{display:flex;gap:var(--s-1);margin-left:6px;overflow-x:auto}
.tabs a{
  padding:var(--s-2) var(--s-3);border-radius:var(--r-inner);color:var(--muted);
  text-decoration:none;font-size:var(--t-4);font-weight:500;white-space:nowrap;
  transition:background 130ms,color 130ms;
}
.tabs a:hover{background:var(--card-2);color:var(--fg)}
.tabs a.active{background:var(--accent-dim);color:var(--accent);box-shadow:inset 0 0 0 1px var(--accent-border)}

/* Bereichs-Navigation mit Dropdowns (nav.js) */
/* `gap:2px` ist eine HAARLINIE, keine Abstandsstufe — wie die 1-px-Polster
   in den Chips. Die Skala hatte daraus 4 px gemacht; bei zehn Luecken sind
   das 20 px, und ein Bereich fiel ins „Mehr"-Menue. */
.nav-bereiche{display:flex;gap:2px;margin-left:6px}
.nav-item{position:relative;display:flex;align-items:stretch}/* --- NAVIGATIONSPUNKT --------------------------------------------------
   EINE eigene Komponente, kein Knopf — und das ist keine Ausrede, sondern
   eine Messung: Mit der Knopfgroesse (8/16 statt 8/12) passte die Leiste
   nicht mehr in 1440 px. „Waffenbuch" verschwand hinter „Mehr", der
   Benutzername brach um. Eine Leiste mit zehn Punkten ist eine dichte
   Reihe, so wie eine Tabellenzeile eine ist.

   Was hier ZAEHLT, ist dasselbe wie beim Knopf: Es gibt sie EINMAL.
   Punkt und Pfeilchen teilen sie sich, und der Zustand aendert nur die
   Farbe. */
a.nav-btn,
.nav-caret{
  display:inline-flex;align-items:center;gap:var(--s-2);
  padding:var(--s-2) var(--s-3);border-radius:var(--r-inner);
  background:transparent;border:0;color:var(--muted);
  /* --t-3, nicht --t-4: Die Leiste ist eine DICHTE REIHE, und dort ist die
     kleinere Stufe die richtige — wie bei `btn-sm`. Mit 14 px fiel bei
     1638 px ein Bereich ins „Mehr"-Menue, und `navigation.spec.js` besteht
     zu Recht darauf, dass auf einem breiten Schirm ALLES offen steht:
     Wegklappen ist der Engpassfall, nicht der Normalfall. */
  font-size:var(--t-3);font-weight:500;font-family:inherit;line-height:1.4;
  white-space:nowrap;text-decoration:none;cursor:pointer;
  transition:background 130ms,color 130ms;
}
a.nav-btn:hover,
.nav-caret:hover,
.nav-item:hover a.nav-btn,
.nav-item:hover .nav-caret,
.nav-item.open a.nav-btn,
.nav-item.open .nav-caret{
  background:var(--card-2);color:var(--fg);
}
a.nav-btn.active,
.nav-caret.active{
  background:var(--accent-dim);color:var(--accent);
}
/* Das Pfeilchen klebt am Text, es darf links nicht polstern — sonst waechst
   die Leiste um acht Pixel JE BEREICH. Beim Zusammenlegen war mir diese
   Asymmetrie entgangen; `navigation.spec.js` hat sie zurueckgefordert:
   Bei 1638 px fielen drei Bereiche ins Menue. Rundung entsprechend nur
   rechts, weil links der Knopf anschliesst. */
.nav-caret{padding-left:var(--s-1);border-radius:0 var(--r-inner) var(--r-inner) 0}.nav-btn.active{box-shadow:inset 0 0 0 1px var(--accent-border)}
/* Split-Button (nav.js): Label = Link zur ersten Bereichsseite, das
   Pfeilchen daneben klappt das Menü auf. Beide Hälften wirken als EIN
   Button (gemeinsamer Hover, kein Ring-Stoß in der Mitte). */
.nav-item .nav-btn{padding-right:6px;border-radius:var(--r-inner) 0 0 var(--r-inner)}
.nav-item .nav-btn.active,.nav-caret.active{box-shadow:none}
.caret{font-size:var(--t-0);opacity:.65;transition:transform 130ms}
.nav-item.open .caret{transform:rotate(180deg)}
.nav-menu{position:absolute;left:0;top:calc(100% + 6px);z-index:60;min-width:220px;padding:var(--s-2);
  background:var(--card);border:1px solid var(--line-2);border-radius:var(--r-inner);box-shadow:var(--shadow-lg)}
.nav-menu a{display:block;padding:var(--s-2) var(--s-3);border-radius:var(--r-mittel);font-size:var(--t-4);color:var(--fg);
  text-decoration:none;white-space:nowrap}
.nav-menu a:hover{background:var(--card-3);color:var(--fg)}
.nav-menu a.aktiv{color:var(--accent);font-weight:600}
/* Split-Button am RECHTEN Rand (Hilfe): Das Menü öffnet nach links, sonst
   läuft es aus dem Fenster. */
.nav-item-rechts{margin-right:8px}
.nav-item-rechts .nav-menu{left:auto;right:0}

/* Unterleiste: Seiten des aktiven Bereichs (nav.js, immer sichtbar) */
/* T-03: Hilfe-Knopf in der Topbar — springt ins Kapitel des aktuellen
   Bereichs. Seit 21.08.2026 der EINZIGE Hilfe-Zugang: Der gleichnamige
   Nav-Eintrag stand direkt daneben und fuehrte an dieselbe Stelle.

   Vorher war das ein 28-px-Kreis mit einem „?" darin (Michael: „passt gar
   nicht zu Mercofina … sitzt rechts unten in einem Minikaestchen"). Die Ursache
   der schiefen Optik war die feste Hoehe: Sie machte den Knopf kleiner als
   alles andere in der Zeile. Jetzt dieselbe Form wie `a.ghost`/`Abmelden` —
   Polsterung statt fester Hoehe, damit er auf einer Linie sitzt. */
/* Seit dem 21.08.2026 ist das ein SPLIT-Button (Michael: „den Hilfe-Button
   auch als Dropdown auslegen"): Label = Sprung ins Kapitel des aktuellen
   Bereichs, Pfeilchen = Auswahl Handbuch/Einrichtungsassistent. Der Rahmen
   liegt deshalb um BEIDE Hälften — läge er nur ums Label, säße das Pfeilchen
   sichtbar daneben statt im selben Knopf. */
/* KEIN `overflow:hidden` am Rahmen, so verlockend es fuer die runden Ecken
   waere: Es schneidet das aufgeklappte Menue ab (absolut positioniert, es
   ragt aus dem Knopf heraus). Deshalb bekommen die beiden Haelften ihre
   Rundung selbst. */
.nav-hilfe-item{border:1px solid var(--line-2);border-radius:var(--r-inner);
  transition:border-color 130ms}
.nav-hilfe-item:hover{border-color:var(--accent-border)}
.nav-hilfe{display:inline-flex;align-items:center;gap:var(--s-2);
  padding:var(--s-2) var(--s-2) var(--s-2) var(--s-3);border:0;
  border-radius:calc(var(--r-inner) - 1px) 0 0 calc(var(--r-inner) - 1px);
  color:var(--fg);text-decoration:none;font-size:var(--t-3);line-height:1.4;
  white-space:nowrap;transition:background 130ms}
.nav-hilfe:hover{background:var(--card-2);color:var(--fg)}
.nav-hilfe-item .nav-caret{padding:var(--s-2) var(--s-2) var(--s-2) var(--s-1);
  border-radius:0 calc(var(--r-inner) - 1px) calc(var(--r-inner) - 1px) 0}
.nav-hilfe-icon{font-size:var(--t-4);line-height:1}

/* flex-wrap: Mit den zwölf Verwaltungs-Gruppen (01.09.2026) passt die Zeile
   unter ~1200 px nicht mehr — ohne Umbruch wäre der letzte Eintrag
   ABGESCHNITTEN und unerreichbar (kein Scroll). Zweizeilig ist der ehrliche
   Zustand des Engpasses; min-height bleibt die Ein-Zeilen-Höhe. */
.topbar-sub{display:flex;flex-wrap:wrap;align-items:center;gap:var(--s-1);padding:var(--s-1) var(--s-4);min-height:var(--subbar-h);
  border-bottom:1px solid var(--line);background:var(--bg-elevated);
  position:sticky;top:var(--topbar-h);z-index:29;overflow-x:auto}
.topbar-sub a{padding:var(--s-1) var(--s-3);border-radius:var(--r-mittel);color:var(--muted);text-decoration:none;
  font-size:var(--t-3);font-weight:500;white-space:nowrap;transition:background 130ms,color 130ms}
.topbar-sub a:hover{background:var(--card-2);color:var(--fg)}
.topbar-sub a.active{background:var(--accent-dim);color:var(--accent);box-shadow:inset 0 0 0 1px var(--accent-border)}
/* --subtle (3,09:1) reicht für die 10,5px-Labels nicht — WCAG braucht 4,5:1.
   #8b93a3 hält den gedämpften Look und schafft ~5,9:1 (UX-Audit S78/6). */
.topbar-sub .sub-label{font-size:var(--t-1);text-transform:uppercase;letter-spacing:.07em;
  color:var(--muted);font-weight:700;margin-right:8px;white-space:nowrap}
/* Label als "Alle anzeigen"-Link (nur Bereiche mit alleHref, z. B. Verkauf) */
.topbar-sub a.sub-label{text-decoration:none;color:var(--muted);
  padding:var(--s-1) var(--s-3);border-radius:var(--r-mittel);margin-right:2px}
.topbar-sub a.sub-label:hover{background:var(--card-2);color:var(--fg)}
.topbar-sub .sub-label.active{background:var(--accent-dim);color:var(--accent);
  box-shadow:inset 0 0 0 1px var(--accent-border)}

/* ============================== Layouts ================================ */
/* ======================================================================
   DAS SEITENGERUEST — Regelwerk `die-maskenordnung`, Regel R2.

   EINE Klasse fuer alle Gattungen. Bis zum 10.09.2026 standen hier DREI:

     .layout        {display:flex;height:calc(100vh - …)}   2 Seiten
     .layout3       {display:flex;height:calc(100vh - …)}  14 Seiten
     .seiten-layout {display:flex;height:calc(100vh - …)}   2 Seiten

   Byte-fuer-Byte dieselbe Deklaration, drei Namen. Der Baustein-Waechter
   konnte das nicht sehen — er prueft die Familien Knopf, Karte und Feld,
   und ein Geruest ist keines davon.

   WAS DIE GATTUNGEN UNTERSCHEIDET, steht INNEN, nicht hier: .pane-tree /
   .pane-list / .pane-main fuer die Arbeitsliste, .seiten-inhalt fuer die
   Einstellungsseite, .list / .detail fuer den schlichten Zweispalter. Das
   Geruest selbst ist bei allen dasselbe — deshalb gibt es dafuer auch nur
   einen Namen.

   UND EINEN UMBRUCHPUNKT. Vorher brach `.layout` bei 720 px um,
   `.seiten-layout` bei 900 und `.layout3` bei 960 — drei Werte, die
   niemand entschieden hat, fuer dieselbe Frage („ab wann untereinander
   statt nebeneinander?"). Es gilt 960: der frueheste der drei, damit
   keine Maske je gequetscht dasteht.
   ====================================================================== */
/* Höhe: Topbar + Unterleiste (nav.js) abziehen */
.seite{display:flex;height:calc(100vh - var(--topbar-h) - var(--subbar-h))}

/* Zweispalter (Bestand: Liste + Detail) */
.list{width:330px;flex:0 0 auto;border-right:1px solid var(--line);overflow:auto;background:var(--bg-elevated)}
.list-head{padding:var(--s-3) var(--s-4);border-bottom:1px solid var(--line);position:sticky;top:0;background:var(--bg-elevated);z-index:5}
.list-head input,.list-head select{margin-top:8px}
.list-head input:first-child,.list-head select:first-child{margin-top:0}
.list ul{list-style:none;margin:0;padding:var(--s-2)}
.list li{
  padding:var(--s-3) var(--s-3);border-radius:var(--r-inner);cursor:pointer;margin-bottom:2px;
  border:1px solid transparent;
  transition:background 120ms,border-color 120ms;
}
.list li:hover{background:var(--card-2)}
.list li.active{background:var(--accent-dim);border-color:var(--accent-border)}
.list li.muted{cursor:default;padding:var(--s-4)}
.list li.muted:hover{background:transparent}

.detail{flex:1;overflow:auto;padding:var(--s-5)}

/* Dreispalter (Artikel: Baum + Liste + Detail) — Innenleben zum Gerüst oben */
.pane-tree{width:280px;flex:0 0 auto;border-right:1px solid var(--line);overflow:auto;background:var(--bg-elevated);display:flex;flex-direction:column}
.pane-list{width:360px;flex:0 0 auto;border-right:1px solid var(--line);overflow:auto;background:var(--bg-elevated);display:flex;flex-direction:column}
.pane-detail{flex:1;overflow:auto;padding:var(--s-5);min-width:0}
.pane-head{
  padding:var(--s-3) var(--s-4);border-bottom:1px solid var(--line);
  position:sticky;top:0;background:var(--bg-elevated);z-index:5;flex:0 0 auto;
}
.pane-head h2{margin:0 0 var(--s-1);font-size:var(--t-3);text-transform:uppercase;letter-spacing:0.07em;color:var(--muted);font-weight:700}
.pane-body{flex:1;padding:var(--s-2)}
.pane-foot{padding:var(--s-3) var(--s-4);border-top:1px solid var(--line);flex:0 0 auto;position:sticky;bottom:0;background:var(--bg-elevated)}

/* ============================== Kategoriebaum ========================== */
.tree{list-style:none;margin:0;padding:0}
.tree ul{list-style:none;margin:0;padding-left:16px}
.tree-node{
  display:flex;align-items:center;gap:var(--s-2);
  padding:var(--s-2) var(--s-2);margin:1px 0;border-radius:var(--r-inner);cursor:pointer;
  border:1px solid transparent;min-height:30px;
  transition:background 110ms,border-color 110ms;
}
.tree-node:hover{background:var(--card-2)}
.tree-node.active{background:var(--accent-dim);border-color:var(--accent-border)}
.tree-node.active .tree-name{color:var(--accent);font-weight:600}
.tree-toggle{
  flex:0 0 18px;width:18px;height:18px;padding:0;margin:0;
  background:transparent;border:0;color:var(--subtle);
  display:flex;align-items:center;justify-content:center;
  font-size:var(--t-1);border-radius:var(--r-klein);transition:transform 130ms,color 130ms;
}
.tree-toggle:hover{background:var(--card-3);color:var(--fg)}
.tree-toggle.open{transform:rotate(90deg)}
.tree-toggle.leaf{visibility:hidden}
.tree-name{flex:1;font-size:var(--t-4);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.tree-count{
  flex:0 0 auto;font-size:var(--t-1);color:var(--muted);
  background:var(--card-3);border-radius:var(--r-pille);padding:1px var(--s-2);min-width:20px;text-align:center;
}
/* --accent-hover statt --accent (Durchgang 22, Paket 5): Gruen auf der
   gruenen Pille erreichte 4,35 zu 1, noetig sind 4,5. Der hellere Ton
   bringt 5,30 - dieselbe Farbe, eine Stufe heller, kein neuer Wert. */
.tree-node.active .tree-count{background:var(--accent-dim);color:var(--accent-hover)}
.tree-shop{
  flex:0 0 auto;width:7px;height:7px;border-radius:50%;
  background:var(--accent);box-shadow:0 0 6px var(--accent-border);
}
.tree-sep{margin:var(--s-2) var(--s-2);border:0;border-top:1px solid var(--line)}

/* ============================== Artikelliste =========================== */
.art-item{
  display:flex;gap:var(--s-3);align-items:center;
  padding:var(--s-2) var(--s-3);margin:var(--s-1) var(--s-2);border-radius:var(--r-inner);cursor:pointer;
  border:1px solid transparent;transition:background 120ms,border-color 120ms;
}
.art-item:hover{background:var(--card-2)}
.art-item.active{background:var(--accent-dim);border-color:var(--accent-border)}
.art-thumb{
  flex:0 0 44px;width:44px;height:44px;border-radius:var(--r-inner);
  background:var(--card-3);border:1px solid var(--line);
  display:flex;align-items:center;justify-content:center;
  overflow:hidden;color:var(--subtle);font-size:var(--t-5);
}
.art-thumb img{width:100%;height:100%;object-fit:cover;display:block}
.art-main{flex:1;min-width:0}
.art-name{font-size:var(--t-4);font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.art-meta{font-size:var(--t-2);color:var(--muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-top:1px}
.art-side{flex:0 0 auto;text-align:right}
.art-preis{font-size:var(--t-3);font-weight:600;color:var(--fg)}

/* Status-Punkt (kompakter als Badge, für Listen) */
.dot{display:inline-block;width:8px;height:8px;border-radius:50%;flex:0 0 auto}
/* Der Punkt traegt die STUFE des Zustandsregisters, nicht den Statuswert
   (09.09.2026) -- sonst braucht jeder neue Status eine eigene CSS-Regel. */
.dot.ok{background:var(--ok)}
.dot.warn{background:var(--warn)}
.dot.info{background:var(--info)}
.dot.fehler{background:var(--bad)}
.dot.neutral{background:var(--subtle)}

/* ============================== Badges ================================= */
.badge{
  display:inline-flex;align-items:center;gap:var(--s-1);
  font-size:var(--t-2);font-weight:600;letter-spacing:0.02em;
  padding:var(--s-1) var(--s-2);border-radius:var(--r-pille);
  border:1px solid var(--line);background:var(--card-2);color:var(--muted);
  vertical-align:middle;
  /* Ein Abzeichen ist EIN Wort-Block — zweizeilig („Microsoft | 365" in der
     Kontenliste, 02.09.2026) ist es keine Pille mehr. Wird es zu eng, muss
     die SPALTE weichen, nicht die Pille brechen. */
  white-space:nowrap;
}
.badge.offen,.badge.entwurf,.badge.in_pruefung,.badge.warn{color:var(--warn);border-color:var(--warn-bdr);background:var(--warn-bg)}
/* EIN ABZEICHEN, DAS MAN WEGKLICKEN KANN (09.09.2026). Michael: „Ich kann das
   Flag ‚altes Etikett‘ nicht selbst weg machen … Ein Klick auf das Flag mit
   Abfragedialog?“ Als <button> gebaut, damit Tastatur und Vorlesehilfen es als
   Bedienelement kennen — die Pille bleibt eine Pille. */
.badge.etikett-weg{cursor:pointer;font-family:inherit;line-height:inherit}
.badge.etikett-weg:hover{border-color:var(--warn);filter:brightness(1.06)}
.badge.freigegeben,.badge.aktiv,.badge.bezahlt,.badge.abgeschlossen,.badge.ok{color:var(--ok);border-color:var(--ok-bdr);background:var(--ok-bg)}
.badge.abgelehnt,.badge.storniert,.badge.archiviert,.badge.fehler{color:var(--bad);border-color:var(--bad-bdr);background:var(--bad-bg)}
/* STORNIERT IST ROT — ABER EIN LEISES (Michael, 11.09.2026: „Mach den Storno
   bitte doch wieder rot, jedoch ein leichtes Rot. Sowas hatten wir schonmal
   verwendet, ich glaube im Shop."). Vorbild ist `.lager-badge.aus` in
   shop.css: „helles Rot statt Alarm" (08.09.2026). Gleiche Farbe wie
   „Abgelehnt", aber ohne Farbflaeche — in einer Liste mit 200 stornierten
   Zeilen ist der Unterschied der zwischen Hinweis und Alarm.

   ZWEI SELEKTOREN, EIN AUSSEHEN: Listen setzen den Zustandswert selbst als
   Klasse (`badge storniert`), `zustandBadge` setzt Stufe + `zustand-<wert>`.
   Beide Wege muessen hier landen, sonst sieht dasselbe Wort an zwei Orten
   verschieden aus. */
.badge.storniert,.badge.zustand-storniert{background:transparent;opacity:.85}
.badge.intern,/* DIE FUENFTE STUFE (31.08.2026, Durchgang 18). Es gab kein graues Abzeichen —
   deshalb fiel das `muted` des Waffen-Registers in waffenbuchMotor.js auf
   "offen" (gelb) zurueck, und "Vernichtet" sah aus wie eine Warnung. Ein
   abgeschlossener, wertungsfreier Zustand braucht seinen eigenen Ton. */
.badge.neutral{color:var(--muted);border-color:var(--line);background:transparent}
.badge.info{color:var(--info);border-color:var(--info-bdr);background:var(--info-bg)}
.badge.gegenstandslos,.badge.rueckabgewickelt{color:var(--muted);border-color:var(--muted);background:transparent;opacity:.75}

.chip{
  display:inline-flex;align-items:center;gap:var(--s-1);
  font-size:var(--t-2);padding:var(--s-1) var(--s-3);border-radius:var(--r-pille);
  background:var(--card-3);border:1px solid var(--line);color:var(--fg);
}

/* Die Ampel-Leiste der Kopfzeile — das „Langloch" N/B/T/S/M (Michael,
   01.09.2026: „mit Trennlinien und nur den ersten Buchstaben"). Reihenfolge
   und Zustand kommen aus /api/system/ampeln; hier steht nur die Form.
   Ein Segment ist ein <a>: Farbe = Zustand, Klartext im title, Klick führt
   zur Quelle. Bricht nie um — feste Ein-Buchstaben-Inhalte. */
.ampel-loch{display:inline-flex;align-items:stretch;margin-right:var(--s-2);flex:none;
  border:1px solid var(--line);border-radius:var(--r-pille);overflow:hidden;background:var(--card-2)}
.ampel-loch .al-seg{display:inline-flex;align-items:center;padding:var(--s-1);
  font-size:var(--t-1);font-weight:700;letter-spacing:.05em;line-height:1;text-decoration:none;white-space:nowrap}
.ampel-loch .al-seg+.al-seg{border-left:1px solid var(--line)}
.ampel-loch .al-seg:hover{filter:brightness(1.25)}
/* Eine Sektion, deren MODUL aus ist, existiert für die Oberfläche nicht —
   getrennt von [hidden], das dem Sektionen-Motor (Gruppe/Suche) gehört.
   Dasselbe für das, was nur der BETREIBER einrichtet (13.10.2026,
   `der-betreiber-steht-in-der-server-umgebung`): ein Kunde sieht es nicht. */
.modul-aus,.nicht-fuer-kunden{display:none !important}
.al-gruen{color:var(--ok);background:var(--ok-bg)}
.al-gelb{color:var(--warn);background:var(--warn-bg)}
.al-rot{color:var(--bad);background:var(--bad-bg)}
.al-grau{color:var(--muted);background:transparent}

/* ============================== Karten ================================= *//* ======================================================================
   EINE KARTE — Michael, 01.09.2026: „Dasselbe fuer alle anderen
   Komponenten."

   Vorher: ELF Namen fuer „eine Flaeche mit Innenabstand und Rahmen",
   mit sechs verschiedenen Innenabstaenden. `.dash-kachel` und
   `.dash-panel` waren sogar zeichengleich — zwei Namen, eine Regel.

   Wieder EINE Regel mit vielen Selektoren: die Definition steht einmal,
   kein Markup muss angefasst werden.
   ====================================================================== */
/* `.card` traegt ZUSAETZLICH eine Breitenbegrenzung — siehe unten. Sie ist
   die ALLEINSTEHENDE Karte (Anmeldung, Erststart), nicht die allgemeine
   Flaeche. Beim Zusammenlegen ist mir das entgangen: Mein Messwerkzeug
   zaehlte `max-width` und `margin` nicht zur Identitaet, deshalb sah
   `.card` neben `.section-card` wie eine Dublette aus. Der Bildvergleich
   hat es gefunden — der Inventur-Hinweis wurde ploetzlich seitenbreit. */
/* DREI DINGE, NICHT EINS (nachgezogen 01.09.2026):
     `.card`         — die ALLEINSTEHENDE Karte: Anmeldung, Erststart.
                       Traegt zusaetzlich `max-width` und Einrueckung.
     `.section-card` — die ABSCHNITTSKARTE. Sie hat einen Titel, und
                       `selftest-kartentitel.js` besteht darauf.
     `.flaeche`      — die schlichte Flaeche: ein Hinweiskasten, ein
                       Rahmen um etwas. Kein Titel, keine Begrenzung.
   Sie TEILEN SICH das Aussehen und unterscheiden sich nur in dem einen
   Punkt, der sie ausmacht. Aufgefallen ist die Luecke, als der
   Inventur-Hinweis von `.card` auf `.section-card` sollte und der
   Titelpruefer zu Recht anschlug: Er ist weder das eine noch das andere. */
.card,
.section-card,
.flaeche,
.dash-kachel,
.dash-panel,
.im-karte,
.kasse-karte,
.ks-kachel,
.upload-card,
.erl-card,
.kachel{
  background:var(--card);border:1px solid var(--line);border-radius:var(--r-card);
  padding:var(--s-5);box-shadow:var(--shadow-sm);
}
/* Dichte Karten — dieselbe Karte, weniger Luft. Die EINE erlaubte
   Abweichung, aus demselben Grund wie `btn-sm`: Ein Dashboard aus
   Kacheln mit 24 px Rand zeigt halb so viel. */
/* --- DIE ALLEINSTEHENDE KARTE -------------------------------------------
   Anmeldung, Erststart, Notfallcode: EINE Karte auf sonst leerer Seite.
   Schmal und senkrecht eingerueckt — deshalb `.detail .card` das gleich
   wieder aufhebt, wo sie doch als Flaeche benutzt wird. */
.card{max-width:420px;margin:8vh auto}

.karte-eng,
.dash-kachel,
.dash-panel,
.im-karte,
.kasse-karte,
.ks-kachel,
.kachel{
  padding:var(--s-4);
}
.card h1{margin:0 0 var(--s-2);font-size:var(--t-6)}
.card h3{margin:0 0 var(--s-1);font-size:var(--t-5)}
.card h4{margin:var(--s-5) 0 var(--s-1);font-size:var(--t-3);font-weight:600;color:var(--fg);
  padding-top:14px;border-top:1px solid var(--line)}
.card h4:first-of-type{border-top:0;padding-top:0}

/* Als Flaeche benutzt: die Begrenzung der alleinstehenden Karte faellt weg.
   Der Radius stand hier doppelt - er kommt aus der Kartendefinition. */
.detail .card,.pane-detail .card{max-width:none;margin:0}
.detail-grid{
  display:grid;grid-template-columns:repeat(auto-fit,minmax(380px,1fr));
  gap:var(--s-4);align-items:start;
}
.section-card h2{margin-top:0;border:0;padding-bottom:0}
.section-card h3{margin-top:0}
.section-card h4{margin:var(--s-4) 0 var(--s-2);font-size:var(--t-4);font-weight:500;color:var(--fg)}

/* Detail-Kopfzeile (Titel + Badges + Aktionen) */
.detail-head{display:flex;align-items:flex-start;gap:var(--s-3);flex-wrap:wrap;margin-bottom:16px}
.detail-head h2{margin:0;font-size:var(--t-6);flex:1;min-width:200px}
.detail-head .badge{margin-top:4px}

/* Schlüssel-Wert-Zeilen */
.kv{display:grid;grid-template-columns:max-content 1fr;gap:var(--s-1) var(--s-4);font-size:var(--t-4);margin:var(--s-3) 0}
.kv dt{color:var(--muted)}
.kv dd{margin:0}

/* ============================== Tabellen =============================== */
.tbl{width:100%;border-collapse:collapse;margin:var(--s-3) 0}

/* --- EINE BREITE TABELLE SCROLLT, SIE RAGT NICHT HERAUS ------------------
   Befund Michael, 01.09.2026 (Bild der E-Mail-Konten): Die Knopfzeile stand
   rechts UEBER dem Rand ihrer Karte. Der Ueberlauf wurde vom Fenster
   abgeschnitten und nicht weitergereicht — deshalb sah `zweite-bildschirm-
   groesse.spec.js` nichts: die SEITE scrollte ja nicht quer.

   `.tbl{display:block;overflow-x:auto}` gab es bisher nur unter 720 px.
   Genau daneben liegt der Fall: 1148 px sind zu breit fuer die Handy-Regel
   und zu schmal fuer sechs Spalten plus fuenf Knoepfe.

   Deshalb scrollt hier der KASTEN, nicht die Tabelle: `:has(> .tbl)` trifft
   nur den unmittelbaren Behaelter einer Tabelle. Die Tabelle selbst behaelt
   `display:table` und damit ihre Spaltenberechnung — `display:block` haette
   jede Tabelle im Haus neu ausgerechnet.

   Dass ein Kontextmenue dabei abgeschnitten wuerde, ist geprueft und nicht
   der Fall: `zeigeKontextMenue` haengt es an den `body`, nicht in die Zeile.

   Gehalten von `scripts/audit/ueberlauf.js` und
   `scripts/test-e2e/ueberlauf.spec.js`. */
*:has(> .tbl){overflow-x:auto}
/* Der Kassen-Korb ist dieselbe Sorte Tabelle (E2E 07.09.2026: auf dem Handy
   30 px breiter als das Fenster — es scrollte die ganze Seite). */
*:has(> table.korb){overflow-x:auto}

/* --- UMBRECHEN KOMMT VOR SCROLLEN ---------------------------------------
   Michael, 01.09.2026: „Dann sollten die Zeilen eher umgebrochen sein, als
   seitwaerts zu scrollen." Die Regel darueber ist das NETZ — sie verhindert,
   dass etwas aus seinem Kasten faellt. Sie ist aber nicht die erste Wahl:
   Wer eine Zeile lesen will, soll nicht schieben muessen.

   Eine Zelle mit Knoepfen ist der haeufigste Grund fuer eine zu breite
   Tabelle. Sie bekommt deshalb einen Namen und darf umbrechen — die Knoepfe
   ruecken dann untereinander statt die Tabelle zu sprengen. `.tbl-aktionen`
   ersetzt die frueheren `style="white-space:nowrap"` an genau diesen
   Zellen. */
.tbl td.tbl-aktionen{white-space:normal;text-align:right}
/* KEIN `display:flex` AUF DER ZELLE. Der erste Anlauf tat das — und nahm ihr
   damit die Tabellenbreite: die Zelle war ploetzlich so schmal wie ein Knopf,
   und jeder stand auf einer eigenen Zeile. Knoepfe sind `inline-flex` und
   brechen von selbst um, sobald `white-space` es zulaesst. Der Abstand
   zwischen ihnen kommt aus dem Rand, nicht aus `gap`. */
.tbl td.tbl-aktionen > button,
.tbl td.tbl-aktionen > a.btn{margin:var(--s-1) 0 var(--s-1) var(--s-1)}
.tbl th,.tbl td{text-align:left;padding:var(--s-2) var(--s-3);border-bottom:1px solid var(--line);font-size:var(--t-4);vertical-align:middle}
.tbl th{color:var(--muted);font-weight:600;font-size:var(--t-2);text-transform:uppercase;letter-spacing:0.06em}
.tbl tbody tr{transition:background 100ms}
.tbl tbody tr:hover{background:var(--card-2)}
.tbl input[type=file]{max-width:200px}
/* Listen sind linksbündig (Michael 08.09.2026: „Die Tabellen sollen alle linksbündig sein“) — tabular-nums bleibt, damit Zahlen untereinander stehen. */
.tbl td.num,.tbl th.num{text-align:left;font-variant-numeric:tabular-nums}

/* ============================== Boxen ================================== */
.warnbox{border:1px solid var(--warn-bdr);color:var(--warn);border-radius:var(--r-inner);padding:var(--s-3) var(--s-3);margin:var(--s-3) 0;background:var(--warn-bg);font-size:var(--t-4)}
.okbox{border:1px solid var(--ok-bdr);color:var(--ok);border-radius:var(--r-inner);padding:var(--s-3) var(--s-3);margin:var(--s-3) 0;background:var(--ok-bg);font-size:var(--t-4)}
.badbox{border:1px solid var(--bad-bdr);color:var(--bad);border-radius:var(--r-inner);padding:var(--s-3) var(--s-3);margin:var(--s-3) 0;background:var(--bad-bg);font-size:var(--t-4)}
.infobox{border:1px solid var(--info-bdr);color:var(--info);border-radius:var(--r-inner);padding:var(--s-3) var(--s-3);margin:var(--s-3) 0;background:var(--info-bg);font-size:var(--t-4)}
.checkbox-box{border:1px solid var(--line);border-radius:var(--r-inner);padding:var(--s-3) var(--s-3);margin:var(--s-3) 0;background:var(--card-2)}
.checkbox-box .row{display:flex;gap:var(--s-4);align-items:center}

.actions{margin-top:18px;display:flex;gap:var(--s-3);align-items:center;flex-wrap:wrap}
/* In der zentrierten Actions-Zeile macht das gap den Abstand — die eigenen
   margins der Meldung (auch der error-/warn-Kästchen) schoben ihre Mitte
   4 px aus der Zeile (Sichtprüfungs-Befund 02.09.2026, settings#versand). */
.actions .msg,.actions .msg.error,.actions .msg.warn{margin:0}
.actions .approve{background:var(--ok)}
.actions .reject{background:var(--bad);color:var(--auf-signal)}

/* Leerer Zustand */
/* ---------------------------------------------------------------------------
 * DIE EINE LEERE STELLE (10.09.2026)
 *
 * **Michael:** *„Ich brauche keine 6 Sachen die dasselbe anzeigen. Immer nur
 * eines, das am besten zentral verwaltet ist. Einmal tauschen, alle sind
 * direkt gut. […] Ein Durchmesser-Zeichen für Leer gefällt mir definitiv
 * nicht."*
 *
 * Vorher gab es sechs: `.empty` (mit dem Zeichen ∅), `td.tbl-leer`,
 * `.sub-tabelle-leer` (gestrichelter Kasten), `.combo-empty`, `.such-leer`
 * und `.kasse-leer` — dazu `.go-leer` in mercofinago.css. Sieben Arten, dasselbe
 * zu sagen, mit vier verschiedenen Polsterungen.
 *
 * SIE MEINT DIE STELLE, NICHT DEN GRUND. Dieselben Klassen trugen auch „wird
 * geladen …" und „Die Liste ließ sich nicht laden" — deshalb heisst der
 * Baustein nach dem ORT, an dem nichts steht, und nicht nach dem Fehlen.
 * Damit passt er für alle drei Fälle.
 *
 * WARUM AUCH `td.leer`: `.tbl th,.tbl td` setzt `padding:9px 10px` und wiegt
 * (0,1,1). Eine blosse Klasse wiegt (0,1,0) und haette verloren — der Abstand
 * waere stillschweigend der alte geblieben. Mit dem Elementnamen wiegt sie
 * gleich und gewinnt durch die spaetere Position. Das ist EIN Baustein,
 * zweifach geschrieben, keine zweite Gestalt.
 *
 * KEIN ZEICHEN. Das ∅ stand für „leer" und sah aus wie ein Durchmesser.
 * Der Satz sagt es besser als ein Symbol.
 * ------------------------------------------------------------------------- */
.leer,
td.leer{
  text-align:center;padding:var(--s-5) var(--s-4);
  color:var(--muted);font-size:var(--t-3);margin:0;
  /* Ein langer Satz soll nicht ueber die ganze Breite laufen - das kam aus
     `.ks-leer` (Kassen-Anmeldung, `max-width:38em`) und gilt jetzt fuer alle.
     In einer Tabellenzelle wirkt es nicht, dort bestimmt die Spalte. */
  max-width:38em;margin-inline:auto;
}

/* ============================== Dokumente ============================== */
.docs{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:var(--s-3);margin:var(--s-3) 0}
.doc{border:1px solid var(--line);border-radius:var(--r-card);padding:var(--s-3);background:var(--card-2)}
.doc a{color:var(--accent)}
.doc img{border-radius:var(--r-inner)}
/* Kachel mit offenem "In Erlaubnis umwandeln"-Formular über die volle Breite
   des Doc-Grids -- sonst quetscht sich das Formular in die ~200px-Spalte. */
.doc.doc-offen{grid-column:1 / -1}
.doc .erlForm input,.doc .erlForm select{min-width:0}

/* ============================== Einstellungen ========================== */
/* ======================================================================
   DIE BAHN — das zweite Hausgeruest: eine Spalte, zentriert.

   Fuer Seiten OHNE Sichtenleiste. Bis zum 10.09.2026 gab es sie fuenfmal
   unter fuenf Namen und mit fuenf Breiten:

     .settings     1000px      .inv-wrap      980px
     .im-wrap        64em      .dash-wrap    1180px
     .upload-wrap   560px

   Niemand hat 980 gegen 1000 entschieden. EINE REGEL MIT VIELEN
   SELEKTOREN, genau wie beim Knopf weiter oben — so muss kein Markup
   angefasst werden, und wer die Bahn aendert, aendert sie ueberall.

   Zwei Ausnahmen bleiben, beide begruendet: Das Dashboard ist ein Raster
   aus Kacheln und braucht Breite; das Kunden-Hochladen ist EIN Formular
   und wirkt auf voller Breite verloren.
   ====================================================================== */
.bahn,.settings,.inv-wrap,.im-wrap,.dash-wrap,.upload-wrap{
  max-width:1000px;margin:0 auto;padding:var(--s-5);
}
/* Ausnahme 1: Kachelraster. */
.bahn.breit,.dash-wrap{max-width:1180px;display:grid;gap:var(--s-3);align-content:start}
/* Ausnahme 2: ein einzelnes Formular. */
.bahn.schmal,.upload-wrap{max-width:560px;margin:6vh auto;padding:0 var(--s-4)}
/* Wo eine Leiste am unteren Rand klebt, braucht die Bahn Platz darunter —
   sonst verdeckt die Leiste die letzte Zeile. */
.inv-wrap{padding-bottom:80px}
.im-wrap{padding-bottom:70px}
.settings h2{margin-top:30px;border-bottom:1px solid var(--line);padding-bottom:8px;font-size:var(--t-6)}
.settings h3{margin-top:18px;font-size:var(--t-4);color:var(--muted)}

/* Seitenleisten-Layout für Sektions-Seiten (settings/nwr, sektionen.js):
   links Sichten-Leiste, rechts scrollender Inhalt — nur die gewählte
   Sektion ist sichtbar. */
.seiten-inhalt{flex:1;overflow:auto;min-width:0}

/* ============================== Waffenbuch/Grids ======================= */
.grid2{display:grid;grid-template-columns:1fr 1fr;gap:0 var(--s-4)}
.grid2 label{margin:var(--s-3) 0 0}
.grid{display:grid;grid-template-columns:1fr 1fr;gap:0 var(--s-4)}
.grid label{margin:var(--s-3) 0 0}
.grid3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:0 var(--s-4)}
.grid3 label{margin:var(--s-3) 0 0}
.hits{display:flex;flex-direction:column;gap:var(--s-1);margin-top:4px}
.hit{background:var(--card-2);border:1px solid var(--line);color:var(--fg);text-align:left;padding:var(--s-2) var(--s-2);border-radius:var(--r-mittel);margin:0;cursor:pointer;font-size:var(--t-3);font-weight:400}
.hit:hover{background:var(--card-3)}

/* ============================== Combobox =============================== */
.combo{position:relative}
.combo input{width:100%}/* --- AUFKLAPPFLAECHE ---------------------------------------------------
   Schwebt ueber dem Inhalt, deshalb staerkerer Rahmen und tieferer
   Schatten als eine Karte. Vorher dreimal einzeln definiert. */
.combo-panel,
.such-panel,
.split-btn-menu{
  background:var(--card);border:1px solid var(--line-2);border-radius:var(--r-inner);
  box-shadow:var(--shadow-md);
}
/* Die Trefferliste SCHWEBT ueber den Feldern darunter, statt sie
   wegzuschieben (Michael, 05.09.2026, am 1721-Dialog: „dass das Fenster
   nicht verspringt, wenn was gewaehlt wird"). Das Panel ist ein Span im
   Fluss; erst die absolute Lage nimmt es aus dem Layout heraus. */
.combo-panel{position:absolute;left:0;right:0;top:calc(100% + 4px);z-index:60;display:block;max-height:280px;overflow:auto}
.combo-item{padding:var(--s-2) var(--s-3);cursor:pointer;white-space:normal;word-break:break-word;border-bottom:1px solid var(--line);font-size:var(--t-3);line-height:1.4}
.combo-item small{color:var(--muted)}
.combo-item:last-child{border-bottom:0}
.combo-item:hover,.combo-item.active{background:var(--accent-dim)}
/* Die letzte Zeile einer Suche, die anlegt statt wählt (verdrahteCombo `anlegen`, 03.10.2026) */
.combo-item.combo-anlegen{color:var(--accent);font-weight:600}
/* Dieselbe Zeile in einer Such-LISTE (Positionen der Beleg-Maske, Z22, 03.10.2026) */
.asp-anlegen .combo-anlegen{color:var(--accent);font-weight:600;cursor:pointer}

/* ============================== Zeilen-Layouts ========================= */
.row{display:flex;gap:var(--s-3);align-items:center;flex-wrap:wrap}
.row-between{display:flex;gap:var(--s-3);align-items:center;flex-wrap:wrap;justify-content:space-between}
.erl-row{display:flex;justify-content:space-between;gap:var(--s-2);align-items:flex-start;padding:var(--s-2) 0;border-bottom:1px solid var(--line)}
.erl-row.inactive{opacity:.55}
.doc-row{display:flex;justify-content:space-between;gap:var(--s-2);align-items:center;padding:var(--s-2) 0;border-bottom:1px solid var(--line)}
.btn-group{display:flex;gap:var(--s-2);flex-shrink:0;align-items:center}
.ident-row{display:flex;gap:var(--s-2);align-items:flex-end}
.checkbox-inline{display:flex;gap:var(--s-2);align-items:center;margin-top:6px;color:var(--fg);font-size:var(--t-4)}
.checkbox-inline label{margin:0}
/* Stammdaten-Zeile aus dem Beleg (Baustein belegStammZeile in wawi.js):
   Haken · Gruppe · Wert · Kennzeichen auf EINER Zeile. Vorher standen die
   Stile inline am <label>, und die Formularregel der Beleg-Maske
   (`.bla-form label` = Spalte) stapelte alles untereinander — die 9em der
   Namensspalte wurden dabei zur Höhe (Befund 28.09.2026). */
.stamm-zeile{display:flex;flex-direction:row;gap:var(--s-2);align-items:baseline;margin:0;font-size:var(--t-3);font-weight:400;color:var(--fg)}
.stamm-zeile>input{flex:none;width:auto;margin:0}
/* 13em: die längste Gruppe („Unsere Kundennummer dort") auf EINER Zeile —
   bei 9em brach sie dreimal um (Befund 28.09.2026). Feste Breite statt
   „auto", damit die Werte aller Zeilen untereinander stehen. */
.stamm-zeile-name{flex:0 0 13em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.stamm-zeile-wert{flex:1;min-width:0;overflow-wrap:anywhere}
.stamm-zeile-alt{color:var(--muted);font-size:var(--t-2)}
/* Abgleich mit einem bekannten Lieferanten: farbig abgesetzt, damit man sieht,
   dass hier Beleg und gespeicherte Daten verglichen werden (Michael 28.09.2026).
   Gelb = mindestens eine Abweichung, blau = nur Ergänzungen. Der Kasten ist
   die `.flaeche` — bis 28.09. stand dort `karte`, eine Klasse ohne Regel,
   und die Rahmenfarben unten fielen ins Leere. Ohne Zusatz (Vorschlag für
   einen NEUEN Lieferanten) bleibt er neutral. */
.stamm-abgleich{padding:var(--s-2) var(--s-3)}
.stamm-abgleich.abweichung{border-color:var(--warn-bdr);background:var(--warn-bg)}
.stamm-abgleich.ergaenzung{border-color:var(--info-bdr);background:var(--info-bg)}
.stamm-abgleich>summary{cursor:pointer}
.stamm-abgleich>summary>.muted{margin-left:var(--s-2)}
.stamm-abgleich.abweichung>summary b{color:var(--warn)}
.stamm-abgleich-inhalt{margin-top:var(--s-2);display:flex;flex-direction:column;gap:var(--s-2)}
.stamm-zeile.abweicht .stamm-zeile-alt{color:var(--warn)}
/* Unbekannter Lieferant: der GANZE Anlegebereich (Hinweis, Vorschlag aus dem
   Beleg, Land, Knopf) in EINER Fläche — Beleg-Maske und Wareneingang aus
   Beleg (Michael 28.09.2026). Zusammen mit `.flaeche.stamm-abgleich`, damit
   er denselben Innenabstand hat wie der Abgleich-Kasten derselben Maske. */
.lieferant-neu{display:flex;flex-direction:column;gap:var(--s-2)}
.tbl-actions{display:flex;flex-wrap:wrap;gap:var(--s-2);align-items:center}
.tbl-actions a{
  padding:var(--s-2) var(--s-3);border:1px solid var(--line-2);border-radius:var(--r-inner);
  color:var(--fg);text-decoration:none;font-size:var(--t-3);white-space:nowrap;
  transition:background 130ms,border-color 130ms;
}
.tbl-actions a:hover{background:var(--card-2);border-color:var(--accent-border)}

/* Parteien-Listeneinträge */
.list li .party-name{font-weight:500;font-size:var(--t-4);color:var(--fg)}
.list li .party-meta{font-size:var(--t-2);color:var(--muted);line-height:1.4}
.list li .party-badge{margin-bottom:3px}

/* Kategorie-Check-Farben (Waffenbuch) */
.kat-ok{color:var(--ok)}
.kat-mismatch{color:var(--bad)}
.kat-check{color:var(--warn)}
.doc-line{margin-top:4px}
.doc-row select,.erl-row select{width:auto;display:inline-block}
.actions.mt-xs{margin-top:4px}

/* === Erlaubnis-Kacheln (Legitimationen, 24.07.2026) ===================== */
/* Eine Kachel = Erlaubnis + ihre Scans. Farbe/E-ID gehören zur Erlaubnis; */
/* fehlt bei einer E-ID-Art die NWR-ID, warnt die Kachel sichtbar.         */
.erl-card.inactive{opacity:.62}
.erl-card.warn{border-left:3px solid var(--warn)}
.erl-top{display:flex;justify-content:space-between;gap:var(--s-3);align-items:flex-start;padding:var(--s-3) var(--s-4)}
.erl-main{min-width:0}
.erl-title{display:flex;align-items:center;gap:var(--s-2);flex-wrap:wrap}
.erl-title .t{font-size:var(--t-5);font-weight:600}
.badge.farbe.farbe-gruen{color:var(--ok);border-color:var(--ok-bdr);background:var(--ok-bg)}
.badge.farbe.farbe-gelb{color:var(--warn);border-color:var(--warn-bdr);background:var(--warn-bg)}
.badge.farbe.farbe-rot{color:var(--bad);border-color:var(--bad-bdr);background:var(--bad-bg)}
.badge.nwr-fehlt{color:var(--warn);border-color:var(--warn-bdr);background:var(--warn-bg)}
.eid-row{display:flex;align-items:center;gap:var(--s-2);margin-top:8px}
.eid-row .eid-lab{font-size:var(--t-1);text-transform:uppercase;letter-spacing:.6px;color:var(--muted)}
.eid-row .eid-val{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:var(--t-4);font-weight:600;color:var(--fg)}
.nwr-warn{display:flex;gap:var(--s-2);align-items:flex-start;background:var(--warn-bg);border:1px solid var(--warn-bdr);border-radius:var(--r-inner);padding:var(--s-2) var(--s-3);margin-top:9px;max-width:64ch;font-size:var(--t-3)}
.nwr-warn .ic{color:var(--warn);flex-shrink:0}
.nwr-warn b{color:var(--warn)}
.erl-meta{display:flex;flex-wrap:wrap;column-gap:var(--s-4);row-gap:var(--s-1);margin-top:9px;color:var(--muted);font-size:var(--t-3)}
.erl-meta b{color:var(--fg);font-weight:500}
/* Scans-Streifen an der Kachel */
.scans{border-top:1px solid var(--line);background:var(--card-2);padding:var(--s-3) var(--s-4)}
.scans-h{font-size:var(--t-1);text-transform:uppercase;letter-spacing:.6px;color:var(--muted);margin-bottom:9px;display:flex;align-items:center;gap:var(--s-2)}
.scans-h .n{background:var(--card-3);color:var(--fg);border-radius:var(--r-gross);padding:1px var(--s-2);font-size:var(--t-1);font-weight:600}
.scan-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(120px,1fr));gap:var(--s-3)}
/* Verantwortliche Personen einer Vereins-WBK (12.09.2026). Derselbe Rahmen
   wie der Scan-Block darueber -- die Liste gehoert zur Karte, nicht daneben. */
.verantwortliche{border-top:1px solid var(--line);background:var(--card-2);padding:var(--s-3) var(--s-4)}
.vp-zeile{display:flex;align-items:center;gap:var(--s-2);flex-wrap:wrap;padding:var(--s-2) 0;border-bottom:1px solid var(--line)}
.vp-zeile:last-of-type{border-bottom:0}
.vp-zeile .vp-name{font-weight:600}
.vp-zeile .vp-meta{color:var(--muted);font-size:var(--t-3)}
.vp-zeile .btn-group{margin-left:auto}
.vp-zeile.gestrichen .vp-name{text-decoration:line-through;color:var(--muted)}

.scan{position:relative;background:var(--card);border:1px solid var(--line-2);border-radius:var(--r-inner);padding:var(--s-3);display:flex;flex-direction:column;gap:var(--s-2);min-height:80px}
.scan .scan-open{display:flex;flex-direction:column;gap:var(--s-2);text-decoration:none;color:var(--fg)}
.scan .thumb{font-size:var(--t-6)}
.scan .fn{font-size:var(--t-2);color:var(--fg);word-break:break-word;line-height:1.35}
.scan .scan-meta{font-size:var(--t-1);color:var(--muted);margin-top:auto}
.scan .scanDel,.scan .scanPendingDel{position:absolute;top:5px;right:5px;width:20px;height:20px;padding:0;border-radius:var(--r-mittel);border:1px solid var(--line-2);background:var(--card-3);color:var(--muted);font-size:var(--t-2);line-height:1;cursor:pointer;opacity:0;transition:opacity .12s;z-index:1}
.scan:hover .scanDel,.scan:hover .scanPendingDel{opacity:1}
.scan.pending .scanPendingDel{opacity:1}
.scan-preview{margin:var(--s-2) 0 var(--s-1)}
.scan .thumb-img{width:100%;height:46px;object-fit:cover;border-radius:var(--r-klein);border:1px solid var(--line-2)}
.scan.add{border-style:dashed;align-items:center;justify-content:center;text-align:center;color:var(--muted);cursor:pointer}
.scan.add:hover{color:var(--fg);border-color:var(--accent-border);background:var(--accent-dim)}
.scan.add .plus{font-size:var(--t-6)}
.scan.add.busy{opacity:.55;pointer-events:none}
/* Add-/Edit-Formular */
.erl-add-toggle{width:100%;background:var(--card-2);border:1px dashed var(--line-2);color:var(--fg);border-radius:var(--r-inner);padding:var(--s-3);font-size:var(--t-4);font-weight:500;cursor:pointer;margin-top:4px}
.erl-add-toggle:hover{border-color:var(--accent-border);background:var(--accent-dim)}
.erl-add-form{margin-top:12px;background:var(--card);border:1px solid var(--line-2);border-radius:var(--r-card,12px);padding:var(--s-4) var(--s-4)}
.erl-add-form .e-eidhint{font-size:var(--t-2);margin:-2px 0 var(--s-2)}
.erl-add-form .e-autodoc{font-size:var(--t-2);margin:var(--s-2) 0 var(--s-1)}
.erl-add-form .e-autodoc b{color:var(--accent)}
.farbe-chips{display:flex;gap:var(--s-2)}
.farbe-chip{flex:1;padding:var(--s-2);border-radius:var(--r-inner);border:1px solid var(--line-2);background:var(--card-2);color:var(--muted);cursor:pointer;font-size:var(--t-3);font-weight:600;text-align:center}
.farbe-chip.farbe-gruen.on{color:var(--ok);border-color:var(--ok-bdr);background:var(--ok-bg)}
.farbe-chip.farbe-gelb.on{color:var(--warn);border-color:var(--warn-bdr);background:var(--warn-bg)}
.farbe-chip.farbe-rot.on{color:var(--bad);border-color:var(--bad-bdr);background:var(--bad-bg)}
.erl-form-foot{display:flex;align-items:center;justify-content:space-between;gap:var(--s-3);margin-top:12px}
.erl-form-foot .muted{font-size:var(--t-2)}

/* ============================== Kategorien-Checkbox-Baum =============== */
.katcheck{border:1px solid var(--line);border-radius:var(--r-inner);background:var(--card-2);max-height:260px;overflow:auto;padding:var(--s-2);margin-top:6px}
.katcheck-row{display:flex;align-items:center;gap:var(--s-2);padding:var(--s-1) var(--s-1);border-radius:var(--r-mittel);font-size:var(--t-4);color:var(--fg)}
.katcheck-row:hover{background:var(--card-3)}
.katcheck-row input[type=radio]{margin-left:auto}
.katcheck-hint{display:flex;justify-content:space-between;gap:var(--s-2);font-size:var(--t-2);color:var(--muted);padding:var(--s-1) var(--s-1) var(--s-2)}

/* ============================== Toast ================================== */
.toast{
  position:fixed;bottom:20px;left:50%;transform:translateX(-50%) translateY(8px);
  background:var(--card-3);border:1px solid var(--line-2);color:var(--fg);
  border-radius:var(--r-inner);padding:var(--s-3) var(--s-4);font-size:var(--t-4);box-shadow:var(--shadow-md);
  /* über ALLEN Overlays (confirmDialog = 10000, Artikel-Suche = 9500) --
     sonst liegt der Toast hinter deren backdrop-blur und ist unlesbar */
  z-index:10500;opacity:0;pointer-events:none;transition:opacity 180ms,transform 180ms;
  /* Mehrzeilig lesbar (14.09.2026): `meldeErgebnis` fasst Bestätigung und
     Auffälligkeiten in EINEN Toast — ohne pre-line liefe alles in eine Zeile
     und riebe sich am Rand des Schirms. */
  white-space:pre-line;max-width:min(680px,92vw);text-align:left;
}

/* Kleiner Lade-Spinner für laufende Hintergrund-Aktionen (z. B.
   Lieferantenlisten-Upload) -- inline neben Statustext verwendbar. */
.spinner{
  display:inline-block;width:14px;height:14px;flex:0 0 auto;
  border:2px solid var(--line-2);border-top-color:var(--fg);
  border-radius:50%;animation:spinner-drehen .8s linear infinite;
}
@keyframes spinner-drehen{to{transform:rotate(360deg)}}
/* [hidden]-Elemente MÜSSEN verborgen bleiben -- sonst überschreiben
   Das Seitengeruest .seite (display:flex) das Attribut und
   Bereichs-Umschalter zeigen keine Wirkung. */
[hidden]{display:none !important}
.toast.show{opacity:1;transform:translateX(-50%) translateY(0)}
.toast.ok{border-color:var(--ok-bdr)}
.toast.error{border-color:var(--bad-bdr);color:var(--bad)}
/* „Geschafft, aber noch nicht fertig" — z. B. nach der Admin-Zustimmung, wenn
   die Zugriffsrichtlinie noch fehlt (T-12 § 2.8). Weder grün noch rot. */
.toast.warn{border-color:var(--warn-bdr);color:var(--warn)}

/* ============================== Utilities =============================== */
.mt-xs{margin-top:4px}.mt-sm{margin-top:8px}.mt-md{margin-top:10px}.mt-lg{margin-top:16px}
.mb-sm{margin-bottom:6px}.mb-md{margin-bottom:10px}.mb-lg{margin-bottom:16px}
.ml-xs{margin-left:4px}
.flex-1{flex:1}
.input-sm{max-width:160px}.input-md{max-width:260px}.input-lg{max-width:320px}
.num{font-variant-numeric:tabular-nums}
.nowrap{white-space:nowrap}

/* Preiszelle: Brutto führend, Netto klein darunter (Michael 19.08.2026 —
   Brutto ist die Zahl, über die man mit dem Kunden spricht). Gleiche
   Hierarchie wie auf dem Preis-Etikett. */
.preis-brutto{display:block;font-variant-numeric:tabular-nums;white-space:nowrap}
.preis-netto{display:block;font-size:var(--t-1);color:var(--muted);font-variant-numeric:tabular-nums;white-space:nowrap;margin-top:1px}

/* ============================== Wawi-Tabelle (Artikel) ================= */
.pane-main{flex:1;display:flex;flex-direction:column;min-width:0;background:var(--bg)}
.pane-main .pane-head{padding:var(--s-3) var(--s-4);border-bottom:1px solid var(--line)}
.pane-main .pane-body{flex:1;overflow:auto}
.pane-main .pane-foot{border-top:1px solid var(--line);padding:var(--s-2) var(--s-4)}
.toolbar{display:flex;align-items:center;gap:var(--s-3);flex-wrap:wrap}
/* Sichtprüfung 03.09.2026 (17× „zeilen-versatz"): das globale label trägt
   oben 16 px / unten 8 px Rand — in einer zentrierten Zeile rückt das seine
   Mitte 4 px nach unten. In Zeilen-Bausteinen ist das Label ein Nachbar,
   kein Absatz: Rand weg. Ebenso die Ankreuz-Zeile (margin-top 6 px). */
.toolbar>label,.actions>label,.row>label,.topbar-sub>label,
.toolbar>.checkbox-inline,.actions>.checkbox-inline,.row>.checkbox-inline{margin:0}
/* `label+button{margin-top:14px}` (Formular-Absatz) rückte in Zeilen den
   Knopf 7 px unter seine Nachbarn — in einer Zeile ist der Knopf kein Absatz. */
.toolbar>label+button,.actions>label+button,.row>label+button,.toolbar>label+a.ghost{margin-top:0}
/* Der Name der Liste — ÜBER der Werkzeugleiste, nicht darin (Maskenordnung,
   Zone Z4). `.toolbar-titel` stand bis zum 10.09.2026 als erstes Element in
   der Leiste und half ihr beim Umbrechen; der Name bleibt, der Ort ist neu. */
.listen-titel{margin:0 0 var(--s-2);font-size:var(--t-5);line-height:1.2}
.toolbar-titel{margin:0;font-size:var(--t-5);white-space:nowrap;line-height:1}
.toolbar-search{max-width:340px;flex:1;min-width:180px}
/* Ein Eingabefeld ist im Stylesheet von Hause aus 100 % breit — in einer
   WERKZEUGLEISTE sprengt das die Zeile: Jedes Datumsfeld nimmt sich eine
   eigene, und die Leiste wird dreimal so hoch wie die Liste darunter.
   Die Suche behaelt ihre Regel oben (flex:1 mit Deckel). */
.toolbar input{width:auto}
.toolbar input[type="date"]{min-width:140px}
/* Zahlenfeld in der Leiste (Motor `werkzeugleiste.js`): schmal, sonst
   frisst es die Breite, die die Filter daneben brauchen. */
.toolbar .wl-zahl{max-width:110px}
.toolbar .wl-monat{max-width:170px}
/* Textfilter in der Leiste; `wl-breit` fuer Felder, in die Pfade passen
   muessen (Kategoriesuche des Lieferantenkatalogs). */
.toolbar .wl-text{max-width:220px}
.toolbar .wl-breit{min-width:180px}
/* Stiller Text in der Leiste (Motor: `info`) — Kontostand, Legende. Er darf
   die Filter nicht wegdruecken, deshalb schrumpft er zuerst. */
.toolbar .wl-info{font-size:var(--t-2);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* WARNENDER KNOPF — der eine Weg, der Daten wegnimmt. Vorher trug der
   Loeschknopf der Akte seine Farben im style-Attribut mit sich herum; ein
   zweiter solcher Knopf haette sie abgeschrieben. */
button.warnend{border-color:var(--bad-bdr);color:var(--bad)}
.toolbar select{width:auto;max-width:230px}
/* FELD-ZEILE — DER Baustein fuer „beschriftetes Feld neben Knopf"
   (Regelwerk `erst-der-baustein-dann-die-stelle`, Michael 01.09.2026).
   Vorher 16-mal inline als align-items:flex-end nachgebaut — und der Nachbau
   trug einen Baufehler, den jede Kopie erbte: Ein INLINE-Feld sitzt auf der
   Text-Grundlinie, unter der die Zeilenbox Unterlaengen-Platz reserviert;
   der Knopf schloss deshalb ein paar Pixel tiefer ab als das Feld
   (Befund Michael, Stornogrund-Zeile). display:block nimmt die Grundlinie
   aus dem Spiel — Feld und Knopf schliessen buendig.
   Waechter: selftest-eine-quelle.js (Inline-Zahl darf sinken, nie steigen). */
.feld-zeile{display:flex;align-items:flex-end;gap:var(--s-3);flex-wrap:wrap}
/* Breiten steuert die STELLE (inline flex:1 / flex:0 0 150px) — der Baustein
   liefert Ausrichtung, Abstand und den Grundlinien-Fix. Checkboxen bleiben
   inline: ein 16-px-Haken auf 100 % Breite wäre der neue Baufehler. */
.feld-zeile>label{margin:0;min-width:0}
.feld-zeile label>input:not([type="checkbox"]):not([type="radio"]),
.feld-zeile label>select{display:block;width:100%;margin-top:4px}
.feld-zeile button{white-space:nowrap}
.statusbar{display:flex;align-items:center;gap:var(--s-3);font-size:var(--t-3)}

.table-wrap{position:relative}
.art-tbl{width:100%;border-collapse:collapse;font-size:var(--t-3)}
.art-tbl thead th{
  position:sticky;top:0;z-index:2;background:var(--bg-elevated);
  text-align:left;padding:var(--s-2) var(--s-3);border-bottom:1px solid var(--line-2);
  font-weight:600;color:var(--muted);white-space:nowrap;cursor:pointer;
  user-select:none;font-size:var(--t-2);
}
.art-tbl thead th:hover{color:var(--fg)}
.art-tbl thead th.sortiert{color:var(--accent)}
.art-tbl thead th .sort-pfeil{font-size:var(--t-1);margin-left:4px}
/* P3-004: Griff zum Ziehen der Spaltenbreite (rechter Spaltenrand). */
.col-resizer{
  position:absolute;top:0;right:-3px;width:8px;height:100%;z-index:3;
  cursor:col-resize;user-select:none;
}
/* Der Griff der LETZTEN Spalte bleibt drin (31.08.2026, Durchgang 22).
   `right:-3px` laesst ihn ueber die Spaltenkante ragen — das ist bei jeder
   anderen Spalte richtig, weil man dort die Grenze ZWISCHEN zwei Spalten
   fasst. Bei der letzten gibt es keine naechste, und die drei Pixel standen
   ueber der Tabelle hinaus: zeiten.html musste bei 1280 Pixeln Breite QUER
   gescrollt werden (1283 > 1280, WCAG 1.4.10 Reflow). Gemessen an 28 Seiten
   und drei Bildschirmgroessen war das der einzige Fall. */
/* DER GRIFF BRAUCHT EINEN BEZUGSPUNKT (31.08.2026, Durchgang 22).
 *
 * `.col-resizer` ist `position:absolute` und richtet sich am naechsten
 * POSITIONIERTEN Vorfahren aus. Bei `.art-tbl` ist das die Kopfzelle selbst,
 * weil sie `position:sticky` traegt (Zeile 714) — dort sitzt der Griff genau
 * an seiner Spaltenkante. Der Kommentar in `wawi.js` sagt das auch so:
 * „KEIN position:relative auf dem th setzen — die Kopfzellen sind sticky".
 *
 * NUR GILT DAS NICHT FUER ALLE TABELLEN. Eine schlichte `.tbl` (Zeiten,
 * Fahrten, Projekte) hat keinen klebenden Kopf, ihre `th` sind `static` —
 * und dann richten sich ALLE Griffe am naechsten positionierten Vorfahren
 * aus, also uebereinander am rechten Rand der Seite. Gemessen auf
 * zeiten.html: acht Griffe, alle bei x=1283, waehrend ihre Spalten bei 294,
 * 346, 405 … enden. Die Spaltenbreite liess sich dort also nicht ziehen, und
 * die drei Pixel Ueberstand machten die Seite quer scrollbar (WCAG 1.4.10).
 *
 * Die Regel greift deshalb NUR, wo kein Sticky ist — `:not(.art-tbl)` haelt
 * sie von den klebenden Koepfen fern, statt sie zu ueberschreiben. */
.tbl:not(.art-tbl) thead th{position:relative}
.tbl th:last-child .col-resizer,.art-tbl th:last-child .col-resizer{right:0}
.col-resizer:hover::after,body.spalten-resize .col-resizer::after{
  content:"";position:absolute;top:0;right:3px;width:2px;height:100%;
  background:var(--accent);
}
body.spalten-resize{cursor:col-resize;user-select:none}
.art-tbl tbody td{padding:var(--s-2) var(--s-3);border-bottom:1px solid var(--line);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.art-tbl tbody tr{cursor:default}
.art-tbl tbody tr:hover{background:var(--zeile-hover)}
.art-tbl tbody tr.sel{background:var(--accent-dim)}
.art-tbl tbody tr.sel td{border-bottom-color:var(--accent-border)}
.art-tbl .td-thumb{width:34px;padding:var(--s-1) var(--s-2) var(--s-1) var(--s-3)}
.art-tbl .td-thumb .mini{
  width:28px;height:28px;border-radius:var(--r-klein);object-fit:contain;background:var(--blatt);
  border:1px solid var(--line);display:block;
}
.art-tbl .td-thumb .mini-leer{
  width:28px;height:28px;border-radius:var(--r-klein);background:var(--card-2);
  display:flex;align-items:center;justify-content:center;color:var(--subtle);font-size:var(--t-2);
}
.art-tbl .td-num{text-align:left;font-variant-numeric:tabular-nums}
.art-tbl .td-name{max-width:340px}
/* Beleg-Spalte (FiBu-Belegliste): Original-Belegnummern aus dem PDF können
   sehr lang sein — begrenzen + Ellipsis, sonst schieben sie Betrag/Status
   aus dem sichtbaren Bereich (voller Text im Tooltip). */
/* NAME PLUS KENNZEICHEN IN EINER ABSCHNEIDENDEN ZELLE (11.09.2026).
   `.art-tbl tbody td` kappt die ganze Zelle mit Ellipsis — ein Abzeichen HINTER
   dem Text verschwindet damit genau bei den langen Namen, also dort, wo man es
   am ehesten braucht (Michael: „Das gebraucht ist nicht sauber sichtbar",
   gesehen an „Smith & Wesson … - GEBRAUCHT …").
   Der Name schrumpft, das Abzeichen bleibt.

   NACHTRAG 11.09.2026: Das Abzeichen steht RECHTS an der Spaltenkante, nicht
   direkt hinter dem Text. Michael: „Das Tag sollte am selben Ort sein, so
   wirkt das total unruhig." — Direkt hinter dem Namen wandert es mit dessen
   Länge, und untereinander steht es dann in jeder Zeile woanders. An der
   Kante bilden die Abzeichen eine Spalte, die das Auge in einem Blick liest. */
.zelle-mit-tag{display:flex;gap:var(--s-2);align-items:center;min-width:0}
.zelle-mit-tag > .zmt-text{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
.zelle-mit-tag > .badge{flex:0 0 auto;margin-left:auto}
.art-tbl .td-beleg{max-width:200px}
.art-tbl .td-beleg .beleg-ref{display:block;overflow:hidden;text-overflow:ellipsis;font-size:var(--t-2)}

/* ============== Buchhaltung: Einheitsmuster (28.07.2026, Mockup-Freigabe
   Michael) — EIN Seitenmuster für alle FiBu-Sichten: Kontextzeile IMMER
   38px, Werkzeugleiste Suche→Zeitraum→Filter→Standardansicht→⚙→Aktion,
   feste Zeilenhöhe 42px. Kein Versprung beim Reiterwechsel. ============== */
.bh-ktx{display:flex;gap:var(--s-3);align-items:center;height:38px;padding:0 var(--s-4);font-size:var(--t-3);
  border-bottom:1px solid var(--line);background:var(--zeile-hover);
  overflow:hidden;white-space:nowrap}
.bh-ktx b{font-size:var(--t-4)}
/* Suche darf bei Platznot schrumpfen (Michael 30.07.2026: Belege-Toolbar
   ist die vollste — der Hochladen-Knopf brach in die zweite Zeile), bleibt
   sonst bei den gewohnten 250px. */
/* `.bh-tb .such` stand hier bis zum 30.08.2026 und gab den Suchfeldern der
   Buchhaltung eine eigene Breite (250 statt 340 Pixel). Es war die zweite von
   vier Schreibweisen fuer dasselbe Feld; alle laufen jetzt ueber
   `.toolbar-search` (Audit-Durchgang 11, F3-3/F8-2). */
.bh-tb input[type=date]{width:128px;flex:none}
/* ✕ neben dem Zeitraum: Filter aufheben (FiBu: Zeitraum aufs Wirtschaftsjahr;
   Verkauf: Suche/Status/Zeitraum) — Selektor bewusst unscoped, der Knopf
   sieht in jeder Werkzeugleiste gleich aus. */
.bh-dreset{padding:0 var(--s-2);height:34px;flex:none}
/* Aktive Filter leuchten (Michael 28.07.): Feld weicht vom Standard ab */
/* AKTIVE FILTER LEUCHTEN (Motor `werkzeugleiste.js`, Michael 28.07.2026).
   Bis zum 10.09.2026 gab es das nur in der Buchhaltung (`.bh-tb`) — jetzt in
   jeder Leiste, weil der Motor den Standard jedes Filters kennt. */
.toolbar .filter-aktiv{border-color:var(--accent-border);background:var(--accent-dim)}
/* DIE AUFKLAPPLISTE BLEIBT LESBAR (Befund 038, 01.10.2026: „Beim zweiten Mal
   Klicken in den Filter wird die ganze Anzeige weiß" — bei allen Listen).
   Chrome zeichnet die native Liste eines <select> mit dem Hintergrund des
   Feldes. Ein GESETZTER Filter trägt `.filter-aktiv`, also den durchscheinenden
   Akzent (12 % Grün) — den legt Chrome über Weiß, und die hellen Einträge
   verschwinden. Der erste Klick trifft das Feld noch ohne Filter, deshalb fiel
   es erst beim zweiten auf. Die Einträge bekommen deshalb eine DECKENDE Farbe,
   unabhängig vom Feld. */
option{background:var(--card);color:var(--fg)}
/* Ansprechpartner anlegen im Empfänger-Reiter (Befund 040): eine Zeile aus Feldern,
   die Felder selbst sind der Baustein. */
.empf-neu-form{display:grid;grid-template-columns:1fr 1fr;gap:var(--s-2);margin-top:var(--s-2)}
.empf-neu-form .voll{grid-column:1/-1}
.empf-neu-knoepfe{display:flex;gap:var(--s-2);justify-content:flex-end}
/* Amber-Punkt „hier liegt Offenes" (wie am Geldkonto in der Seitenleiste) */
.punkt-offen{color:var(--warn)}
.tbl.zeilen-fix td{height:42px;padding-top:0;padding-bottom:0;vertical-align:middle}
.tbl.zeilen-fix .td-beleg .beleg-ref{display:inline;margin-left:6px}
/* Manuelle Buchung: Felder im Raster (Label über dem Feld), volle Breite */
.bh-form{display:grid;grid-template-columns:220px 220px 260px 1fr;gap:var(--s-3);align-items:end}
.bh-form label{display:flex;flex-direction:column;gap:var(--s-1);margin:0;font-size:var(--t-3);color:var(--muted)}
.bh-form input{width:100%;height:34px;padding:var(--s-1) var(--s-3);box-sizing:border-box;margin:0}
.bh-form .voll{grid-column:1/-1}
@media (max-width:1100px){.bh-form{grid-template-columns:1fr 1fr}}
/* Status-Spalte: mehrere Badges (Bezahlt + OP ausgeglichen) dürfen
   umbrechen/stapeln statt die Tabelle zu verbreitern. */
.art-tbl .td-status{white-space:normal;max-width:130px}
.art-tbl .td-status .badge{margin:1px 0;display:inline-block}
/* In der Belege-Sicht (Liste + Vorschau) Spalten enger, damit alles neben
   die Vorschau passt. */
.beleg-split .art-tbl .td-name{max-width:280px}
.beleg-split .art-tbl .td-beleg{max-width:170px}
.art-tbl tr.dragging{opacity:.45}

/* Spalten-Konfigurationsmenü (⚙) */
.spalten-menue{
  position:absolute;right:0;top:calc(100% + 6px);z-index:60;
  background:var(--card);border:1px solid var(--line-2);border-radius:var(--r-inner);
  padding:var(--s-2);min-width:220px;box-shadow:var(--shadow-lg);
}
.spalten-menue-titel{font-size:var(--t-2);color:var(--muted);padding:var(--s-1) var(--s-2) var(--s-2);border-bottom:1px solid var(--line);margin-bottom:4px}
.spalten-menue-zeile{display:flex;align-items:center;gap:var(--s-2);padding:var(--s-1) var(--s-2);border-radius:var(--r-mittel);font-size:var(--t-3);cursor:pointer}
.spalten-menue-zeile:hover{background:var(--card-3)}
.spalten-menue-aktion{
  display:block;width:100%;text-align:left;margin-top:2px;padding:var(--s-2) var(--s-2);
  border-radius:var(--r-mittel);font-size:var(--t-3);cursor:pointer;background:transparent;
  border:1px solid var(--line-2);color:var(--fg)}
.spalten-menue-aktion:hover:not(:disabled){background:var(--card-3)}
.spalten-menue-aktion:disabled{opacity:.45;cursor:default}

/* Angebot-Maske (neu): klar getrennte Abschnitte statt einer langen Liste */
.beleg-abschnitt{border:1px solid var(--line);border-radius:var(--r-inner);padding:var(--s-3) var(--s-4);margin-top:12px}
.beleg-abschnitt h4{margin:0 0 var(--s-3)}
.beleg-positionen-flaeche{min-height:120px}
.pos-tbl td{padding:var(--s-1) var(--s-2)}
.pos-tbl input,.pos-tbl select{width:100%;box-sizing:border-box}

/* ============================== Split-Button ============================= */
/* EINE Definition, seit 01.09.2026. Vorher zwei: dieser Baustein
   (`.split-btn-main` / `.split-btn-arrow`) und die zwei handgebauten der
   Belegmaske (`.sb-main` / `.sb-caret`). Zusammengefuehrt wurde
   auf die GEOMETRIE der handgebauten — sie war die vollstaendigere: die linke
   Haelfte fuellt und bricht um, die rechte hat eine feste Breite. Der
   Baustein hatte nur die Rundungen gesetzt und liess den Rest offen.
   Hier stand ausserdem bis zum 30.08.2026 ein zweites
   `.split-btn{display:inline-flex}`, das wirkungslos war, seit die untere
   Regel dazukam (gleiche Spezifitaet, spaetere Position) — der Baustein
   rendert seit jeher `display:flex`, im Browser nachgemessen. Das ist jetzt
   die einzige Angabe. (Audit-Durchgang 11, F1-Rest; Durchgang 22, Paket 8.) */
.split-btn{display:flex;position:relative;align-items:stretch}
.split-btn-main{
  /* Die linke Haelfte: nur links gerundet, fuellt den Rest und darf
     umbrechen — lange Beschriftungen („Erstellen & senden") passen sonst
     nicht in die schmale Aktionsspalte. `min-width:0` erlaubt Flex das
     Schrumpfen, ohne das bleibt der Text in einer Zeile. */
  flex:1;min-width:0;border-radius:var(--r-inner) 0 0 var(--r-inner);
  white-space:normal;text-align:center;
}
/* Ohne Pfeil (der Baustein rendert bei leerem `weitere` nur die linke
   Haelfte) ist die linke Haelfte der ganze Knopf — dann bekommt sie alle
   vier Ecken. Bis 03.09.2026 standen die rechten Ecken eckig da (Michael,
   Zahlungstermine-Liste: „Jetzt haben wir ein fehlerhaftes CSS"). */
.split-btn-main:last-child{border-radius:var(--r-inner)}
.split-btn-arrow{
  /* Die rechte Haelfte: feste Breite, nur rechts gerundet, eine Trennlinie
     zur linken. */
  width:38px;flex:0 0 38px;border-radius:0 var(--r-inner) var(--r-inner) 0;
  border-left:1px solid var(--line-2);padding:0;
}.split-btn-menu{
  /* Die Flaeche, auf der die Eintraege liegen. Sie traegt „btn" nur im
     Namen — mit dem Knopf hat sie nichts zu tun.
     GRUND, RAHMEN UND SCHATTEN stehen NICHT hier, sondern EINMAL bei der
     Aufklappflaeche (`.combo-panel, .such-panel, .split-btn-menu`) weiter
     oben. Hier nur, was diese Flaeche von den anderen unterscheidet: wo sie
     liegt und wie schmal sie hoechstens wird. Bis zum 01.09.2026 standen
     Grund, Rahmen und Schatten hier ein zweites Mal — mit einem anderen
     Schatten als oben, so dass die spaetere Angabe still gewann. */
  position:absolute;right:0;top:calc(100% + 6px);z-index:60;min-width:240px;
  padding:var(--s-2);
}
.mtabs{display:flex;gap:var(--s-1);border-bottom:1px solid var(--line-2);margin:var(--s-4) 0 0;flex-wrap:wrap}.mtabs button{
  /* Ein Reiter ist keine Pille: keine Rundung, dafuer eine Unterkante,
     die im aktiven Zustand die Akzentfarbe traegt. Das ist der einzige
     Unterschied zum Knopf - alles andere kommt von dort. */
  border-bottom:2px solid transparent;border-radius:0;
}
.mtabs button.active{color:var(--accent);border-bottom-color:var(--accent);font-weight:600}
.mtabs button:disabled{opacity:.4;cursor:not-allowed}
.mtab-panel{display:none;padding:var(--s-4) var(--s-1) var(--s-1);max-height:min(62vh,640px);overflow-y:auto}
.mtab-panel.active{display:block}
.modal-actions{
  display:flex;gap:var(--s-3);align-items:center;flex-wrap:wrap;border-top:1px solid var(--line);
  padding-top:14px;margin-top:10px;
}
/* Wenn die Knöpfe nicht mehr nebeneinander passen, sauber untereinander
   anordnen (statt aus dem Popup zu laufen). Auf schmalen Fenstern volle
   Breite je Knopf, damit nichts abgeschnitten wird. */
.beleg-aktionen{flex-wrap:wrap}
.beleg-aktionen-box{margin-top:10px;padding-top:10px;border-top:1px dashed var(--line)}
.beleg-aktionen .ba-email-label{display:flex;align-items:center;gap:var(--s-2);flex:1;min-width:240px;color:var(--muted);font-size:var(--t-3)}
.beleg-aktionen .ba-email-label input{flex:1;min-width:180px}
.ba-status{margin-top:8px;padding:var(--s-2) var(--s-3);border-radius:var(--r-inner);font-size:var(--t-3);border:1px solid var(--line-2);background:var(--card-3)}
/* Auffälliger "Bereits gesendet"-Hinweis im Versand-Block (Michael 22.07.2026:
   vorher winzige muted-Zeile — Doppelversand-Gefahr). */
.ba-versand-hinweis{margin:0 0 var(--s-2);padding:var(--s-2) var(--s-3);border-radius:var(--r-inner);font-size:var(--t-3);border:1px solid var(--warn-bdr);background:var(--warn-bg);color:var(--warn)}
.ba-status.ok{border-color:var(--ok-bdr);color:var(--ok)}
.ba-status.error{border-color:var(--bad-bdr);color:var(--bad)}

/* Belegart-Vorauswahl-Chips (Ansprechpartner) + Empfänger-Auswahl (21.07.2026).
   Gemeinsam genutzt: Kunden-Editor (Ansprechpartner-Tab) und Belegfenster. */
.chip{display:inline-flex;align-items:center;gap:var(--s-1);font:inherit;font-size:var(--t-2);
  padding:var(--s-1) var(--s-2);border-radius:var(--r-gross);border:1px solid var(--line-2);background:transparent;
  color:var(--muted);cursor:pointer;font-weight:500}
.chip:hover{border-color:var(--line-2);color:var(--fg)}
.chip.on{border-color:var(--ok-bdr);background:var(--ok-bg);color:var(--ok);font-weight:600}
.chip.alle.on{border-color:var(--warn-bdr);background:var(--warn-bg);color:var(--warn)}
.kontakt-row{border:1px solid var(--line);border-radius:var(--r-inner);padding:var(--s-3) var(--s-3);margin-bottom:8px;background:var(--card-2)}
.kontakt-vorwahl{margin-top:8px;display:flex;gap:var(--s-2);flex-wrap:wrap;align-items:center}
.kontakt-vorwahl .vw-lbl{font-size:var(--t-1);color:var(--muted);text-transform:uppercase;letter-spacing:.05em}
/* Empfänger-Auswahl im Belegfenster */
.empf-box{border:1px solid var(--line-2);border-radius:var(--r-inner);background:var(--card-3);padding:var(--s-3);margin:var(--s-1) 0 var(--s-2)}
.empf-box .empf-title{display:flex;align-items:center;gap:var(--s-2);font-size:var(--t-2);color:var(--muted);margin-bottom:7px}
.empf-box .empf-title b{color:var(--fg)}
.empf-check{display:flex;align-items:flex-start;gap:var(--s-2);padding:var(--s-2) var(--s-2);border-radius:var(--r-mittel);cursor:pointer}
.empf-check:hover{background:var(--card-2)}
.empf-check input{width:auto;margin:var(--s-1) 0 0}
.empf-check .ec-name{font-size:var(--t-3)}
.empf-check .ec-mail{font-size:var(--t-2);color:var(--muted);font-family:ui-monospace,Consolas,monospace}
.empf-check .ec-tag{font-size:var(--t-1);color:var(--ok);border:1px solid var(--ok-bdr);border-radius:var(--r-gross);padding:0 var(--s-2);margin-left:5px}
.empf-check .ec-star{color:var(--warn);font-size:var(--t-1)}
/* Empfänger-Rollen (Anrede-Feature 21.07.2026): Master/Haupt/CC je Kontakt */
.empf-rolle{display:flex;align-items:center;gap:var(--s-2);flex-wrap:wrap;padding:var(--s-2) var(--s-1);border-top:1px dashed var(--line)}
.empf-rolle:first-of-type{border-top:0}
.empf-rolle .er-info{flex:1;min-width:120px}
.empf-rolle .ec-name{font-size:var(--t-3)}
.empf-rolle .ec-mail{font-size:var(--t-2);color:var(--muted);font-family:ui-monospace,Consolas,monospace}
.empf-rolle .ec-tag{font-size:var(--t-1);color:var(--muted);border:1px solid var(--line-2);border-radius:var(--r-gross);padding:0 var(--s-2);margin-left:5px}
.er-seg{display:inline-flex;border:1px solid var(--line-2);border-radius:var(--r-mittel);overflow:hidden;flex-shrink:0}.er-btn{
  /* Trennlinie zum Nachbarn im segmentierten Schalter. Sonst nichts. */
  border-left:1px solid var(--line-2);
}
.er-btn:first-child{border-left:0}.er-btn[aria-pressed="true"][data-r="master"]{background:var(--ok);color:var(--auf-signal)}.er-btn[aria-pressed="true"][data-r="haupt"]{background:var(--info);color:var(--auf-signal)}.er-btn[aria-pressed="true"][data-r="cc"]{background:var(--line-2);color:var(--fg)}.er-btn[aria-pressed="true"][data-r="aus"]{background:var(--card);color:var(--fg)}
/* Ansprache-Dropdown im Empfängerblock: klein/inline neben dem Namen (statt
   volle Breite durch die globale select-Regel) -- öffnet beim Klick normal. */
.er-ansprache{width:auto;display:inline-block;vertical-align:middle;font-size:var(--t-1);
  padding:1px var(--s-4) 1px var(--s-2);margin-left:6px;border:1px solid var(--line-2);border-radius:var(--r-gross);
  background-color:var(--card-2);background-position:right 4px center;color:var(--muted);cursor:pointer}
.er-legende{font-size:var(--t-1);margin:var(--s-2) 0 0;line-height:1.4}
/* `.empf-leer` ist am 10.09.2026 entfallen: Sie war eine Kopie von
   `.sub-tabelle-leer` — dieselbe Farbe, Flaeche, Rundung, Schriftgroesse und
   derselbe gestrichelte Rahmen, nur ein anderer Name und ein anderer
   Rahmenton. Die eine Stelle (Ansprechpartner) benutzt jetzt den Baustein. */
.empf-warn{margin:var(--s-2) 0 0;font-size:var(--t-3);color:var(--bad);background:var(--bad-bg);border:1px solid var(--bad-bdr);border-radius:var(--r-mittel);padding:var(--s-2) var(--s-3)}
.auto-mail-info{margin-top:8px;font-size:var(--t-2);color:var(--muted);display:flex;gap:var(--s-2);align-items:baseline}
/* Der Split-Button steht ganz oben, EINMAL. Hier stand bis zum 01.09.2026
   der zweite Satz fuer die handgebauten der Belegmaske; die sind auf den
   Baustein umgezogen. *//* --- MENUEEINTRAG ------------------------------------------------------
   Eigene Komponente, nicht der Knopf: volle Breite, linksbuendig, ohne
   Flaeche. Vorher dreimal definiert — als <button>, als <div> und im
   Hilfe-Kapitelbaum, jedes Mal mit eigenem Innenabstand. */
.split-btn-item,
.hilfe-nav .kapitel > button{
  display:block;width:100%;text-align:left;
  padding:var(--s-2) var(--s-3);border-radius:var(--r-mittel);
  white-space:nowrap;cursor:pointer;
}
.split-btn-item:hover{background:var(--card-2)}.split-btn-item small{
  /* Zweite Zeile im Eintrag: leiser und kleiner. */
  display:block;color:var(--muted);font-size:var(--t-2);font-weight:400;margin-top:1px;
}

/* VORSCHAU-Block (rechte Spalte): PDF + E-Mail-Vorschau nebeneinander */
.vorschau-row{display:flex;gap:var(--s-2);align-items:stretch}
/* `a.btn-vorschau` UND `button.btn-vorschau` — mit voller Spezifitaet, denn
   die EIN-KNOPF-Grundregel oben adressiert `a.btn-vorschau` direkt: Eine
   blosse Klassenregel verlor gegen sie, und nur der PDF-LINK blieb akzentgruen
   mit nowrap-Stauchung, waehrend die Buttons daneben grau umbrachen
   (Michaels Bild vom 02.09.2026 — drei Kacheln, drei Gesichter). */
a.btn-vorschau,button.btn-vorschau{
  /* Eine breite Kachel, die umbrechen darf - deshalb die Flaechenangaben.
     Aussehen und Groesse kommen aus dem Knopf-Baustein. */
  flex:1 1 0;min-width:0;display:inline-flex;align-items:center;justify-content:center;
  gap:var(--s-2);text-align:center;white-space:normal;overflow:hidden;
  border:1px solid var(--line-2);background:var(--card-2);color:var(--fg);text-decoration:none;
}
a.btn-vorschau:hover,button.btn-vorschau:hover{background:var(--card-3)}

/* E-Mail-Vorschau-Overlay (über dem Belegfenster) */
.ev-overlay{position:fixed;inset:0;background:var(--schleier);backdrop-filter:blur(2px);
  display:flex;align-items:flex-start;justify-content:center;z-index:120;overflow-y:auto;padding:5vh 16px}
.ev-dialog{background:var(--card);border:1px solid var(--line);border-radius:var(--r-card);width:100%;max-width:680px;
  padding:var(--s-4) var(--s-4) var(--s-4);box-shadow:var(--shadow-lg)}
.ev-head{display:flex;align-items:center;justify-content:space-between;gap:var(--s-3);margin-bottom:10px}
.ev-head b{font-size:var(--t-5)}
.ev-meta{display:flex;flex-direction:column;gap:var(--s-2);background:var(--card-2);border:1px solid var(--line);
  border-radius:var(--r-inner);padding:var(--s-3) var(--s-3);margin-bottom:12px}
.ev-row{display:flex;flex-wrap:wrap;gap:var(--s-2) var(--s-3);align-items:baseline}
.ev-k{flex:0 0 58px;font-size:var(--t-1);text-transform:uppercase;letter-spacing:.5px;color:var(--muted)}
.ev-v{font-size:var(--t-4);color:var(--fg)}
.ev-v.mono{font-family:ui-monospace,Menlo,Consolas,monospace;font-size:var(--t-3)}
.ev-quelle{font-size:var(--t-1);padding:var(--s-1) var(--s-2);border-radius:var(--r-gross);background:var(--ok-bg);color:var(--ok)}
.ev-frame{width:100%;height:56vh;min-height:340px;border:1px solid var(--line);border-radius:var(--r-inner);background:var(--blatt)}
@media (max-width:640px){
  .modal-actions{flex-direction:column;align-items:stretch}
  .modal-actions button,.modal-actions .ghost{width:100%}
  .modal-actions .msg{width:100%}
}
/* ======================================================================
   DER FENSTERKOPF, ZWEI REIHEN (10.09.2026).

     Titel .......................... [Zustaende] [X]
     [Geaendert] ......... [Etiketten] [Sichern & Zu] [Sichern]

   Michael: "der Titel oben, der Status rechts davon, darunter die Buttons
   und der geaendert Status links, das ist der Way to go."

   PLATZ FUER ALLE ZUSTAENDE: Die Marken stehen in einer eigenen Gruppe, die
   umbrechen darf; der Titel schrumpft dafuer (min-width:0) und bricht
   notfalls selbst um. Ein Artikel kann gleichzeitig Shop, Status, Verknuepft,
   Unbestellbar, Etikett und Defekt tragen - sechs Marken, und keine darf
   herausfallen. Deshalb `align-items:start`: bei mehrzeiligen Marken bleibt
   der Titel oben und rutscht nicht in die Mitte.
   ====================================================================== */
/* EINE EBENE DES FENSTERSTAPELS (10.09.2026). Sie ist nur eine Hülle ohne
   eigenes Aussehen — aber `position:relative` macht sie zum Stapelkontext,
   und erst dadurch wirkt das `z-index`, das der Motor je Tiefe setzt. Ohne
   das Relative wäre der z-Wert an einem statischen Element wirkungslos, und
   die zweite Ebene läge unsichtbar HINTER der ersten. */
/* DAS KONTO-MENÜ in der Kopfzeile (10.09.2026). Es ersetzt drei Elemente
   nebeneinander (Name, Ansicht, Abmelden) durch eines — die Leiste wird
   schmaler, obwohl sie mehr kann. Der Name darf schrumpfen und notfalls
   kürzen: Er ist die Beschriftung, nicht der Inhalt. */
.nav-konto-item .konto-icon{margin-right:6px;opacity:.7}
.nav-konto-item .konto-name{max-width:14ch;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* Die zwei Einträge im Menü, die keine Links sind, sollen sich wie Links
   VERHALTEN — volle Breite, linksbündig. Aussehen und Mouseover kommen aus
   der Knopf-Familie weiter oben (`button.flach, …`); hier steht nur, was sie
   STRUKTURELL unterscheidet. Genau diese Grenze zieht der Baustein-Wächter. */
.nav-konto-item .nav-menu button{display:block;width:100%;text-align:left}

.modal-ebene{position:relative}

.modal-kopf{display:flex;align-items:start;gap:var(--s-3)}
/* Der Fenstertitel traegt die KENNUNG mit: 'Artikel 10130098: Name'.
   Feste Ziffernbreite, damit sich Nummern vergleichen lassen. */
/* Der Titel behaelt eine Mindestbreite. Ohne sie quetschten sieben
   Zustandsmarken ihn auf gut 200 px, und ein langer Artikelname stand auf
   fuenf Zeilen. Jetzt brechen die MARKEN um, nicht der Titel — sie sind
   kurz, er ist es nicht. `min()` faengt schmale Fenster ab: Dort darf er
   die volle Breite nehmen, statt hinauszuragen. */
.modal-kopf h2{
  margin:0;flex:1 1 auto;min-width:min(360px,100%);
  font-variant-numeric:tabular-nums;
}
.modal-kopf-marken{
  display:flex;align-items:center;gap:var(--s-2);
  /* NIE SCHRUMPFEN (Michael, 10.09.2026: "Bei langem Titel brechen die
     Status Knoepfe mit um. Das soll so nicht sein."). Mit `flex:0 1 auto`
     gab die Gruppe nach, sobald der Titel Platz brauchte — und weil sie
     umbrechen darf, rutschten die Marken in eine zweite Zeile, obwohl
     eigentlich der TITEL zu lang war. Jetzt behaelt die Gruppe ihre
     Breite; der Titel bricht um, er ist der lange von beiden.
     Umbrechen duerfen die Marken weiterhin — aber nur, wenn SIE selbst
     zu breit werden (sieben Zustaende an einem Artikel), nicht wegen
     des Titels. */
  flex:0 0 auto;flex-wrap:wrap;justify-content:flex-end;
  /* Damit sie bei sehr vielen Marken nicht das ganze Fenster nehmen. */
  max-width:60%;
}
/* Die zweite Reihe. Sie erscheint nur, wenn ein Fenster wirklich Aktionen
   hat - sonst zieht "Geaendert" nach oben zu den Zustaenden. */
.modal-kopf-leiste{
  display:flex;align-items:center;gap:var(--s-2);flex-wrap:wrap;
  margin-top:var(--s-3);padding-bottom:var(--s-3);
  border-bottom:1px solid var(--line);
}
/* Die hochgeholte Aktionsleiste verliert im Kopf ihre Fussleisten-Zierde:
   keine Trennlinie (die traegt jetzt die Reihe), kein Abstand nach oben. */
.modal-kopf-leiste .modal-actions{
  border-top:0;padding-top:0;margin-top:0;margin-left:auto;
  flex:0 1 auto;justify-content:flex-end;
}
/* Das Kreuz ist ein Zeichen, kein Satz: quadratisch statt breit. */
.modal-schliessen{padding:var(--s-2);line-height:1;min-width:34px;justify-content:center}
/* „Geändert" steht IMMER unmittelbar vor dem Schließen-Knopf — in jedem
   Fenster an derselben Stelle (Maskenordnung, Detailmaske). `margin-left:auto`
   schiebt sie dorthin, auch wenn eine Maske gar keine Kopf-Marken hat.
   Vor dem 10.09.2026 war der Dirty-Zustand nur beim Schließen zu SPÜREN,
   nämlich als Rückfrage — sehen konnte man ihn nirgends. */
/* "Geaendert" steht LINKS in der Aktionsreihe — der Zustand eroeffnet die
   Zeile, gehandelt wird rechts. Die Regel von vorher schob die Marke mit
   margin-left:auto nach rechts; das stimmte, solange sie in der Titelzeile
   stand, und liess sie danach mitten in der Aktionsreihe schweben.
   In den Fenstern OHNE Aktionsreihe zieht sie zu den Zustaenden nach oben
   (siehe wawi.js) — dort bleibt der Schub richtig. */
.modal-kopf .modal-geaendert{margin-left:auto}
.modal-kopf-leiste .modal-geaendert{margin-left:0}
/* DIE STATIONSLEISTE EINER KETTE (18.09.2026): unter dem Kopf, eine Zeile,
   erledigt gruen, hier blau, offen grau, uebersprungen blass. Anzeige, kein
   Navigator (Konzept docs/KONZEPT-LISTEN-UND-FENSTER.md). */
.modal-kette{
  display:flex;align-items:center;gap:var(--s-2);flex-wrap:wrap;
  margin-top:var(--s-3);padding:var(--s-2) 0;border-bottom:1px solid var(--line);
  font-size:var(--t-3);color:var(--muted);
}
.modal-kette-station{display:inline-flex;align-items:center;gap:var(--s-2);padding:var(--s-1) var(--s-2);border-radius:var(--r-pille)}
.modal-kette-station i{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border-radius:var(--r-pille);font-style:normal;font-weight:700;font-size:var(--t-2);background:var(--bg-elevated);color:var(--muted)}
.modal-kette-station.aktiv{color:var(--fg);font-weight:600;background:var(--bg-elevated)}
.modal-kette-station.aktiv i{background:var(--info);color:var(--auf-akzent)}
.modal-kette-station.erledigt i{background:var(--ok);color:var(--auf-akzent)}
.modal-kette-station.uebersprungen{opacity:.6;text-decoration:line-through}
.modal-kette-pfeil{color:var(--line)}
/* Der Knopf der aktiven Station (kette.js hebeStationHervor, 18.09.2026):
   ein Rahmen in der Ok-Farbe, der dreimal pulst und dann steht. */
.kette-fokus{outline:2px solid var(--ok);outline-offset:2px;box-shadow:0 0 0 4px color-mix(in srgb, var(--ok) 25%, transparent);animation:kette-puls 1.2s ease-in-out 3}
@keyframes kette-puls{50%{box-shadow:0 0 0 9px color-mix(in srgb, var(--ok) 8%, transparent)}}
/* Die Nummer im Fensterkopf ist eine KENNUNG, kein Zustand: Ziffernbreite
   fest, damit sie sich gegen Lieferschein und Etikett vergleichen lässt, und
   ruhig gesetzt — sie soll die farbigen Zustandsmarken daneben nicht
   überstimmen. */
/* Die Überschrift einer FELDGRUPPE in einer Detailmaske (Maskenordnung).
   Sie ordnet, sie ruft nicht: klein, gesperrt, gedämpft — dieselbe Sprache
   wie die Gruppentitel der Sichtenleiste und die Kartentitel. Die erste
   Gruppe eines Reiters braucht keinen Abstand nach oben, jede weitere schon;
   das erledigt `:first-child`, damit keine Stelle es von Hand setzt. */
.feldgruppe{
  margin:var(--s-5) 0 var(--s-2);
  font-size:var(--t-1);letter-spacing:0.1em;text-transform:uppercase;
  color:var(--muted);font-weight:600;
}
.mtab-panel > .feldgruppe:first-child{margin-top:0}

/* Handy (Sichtprüfung 390 px, 07.09.2026): Badges und der Schließen-Knopf
   ragten aus dem Fensterkopf, weil die Zeile nicht umbrechen durfte. Auf
   schmalen Fenstern bricht der Kopf um; der Titel behält seine Zeile. */
@media (max-width:640px){
  .modal-kopf{flex-wrap:wrap;row-gap:var(--s-2)}
  .modal-kopf h2{flex:1 1 100%}
  /* Aktionsknöpfe im Fenster: lange Beschriftungen („Verleihen (Ausgabe an
     WBK-Inhaber, max. 1 Monat)“) brechen um statt aus dem Kasten zu laufen;
     ein Split-Button im Kopf nimmt die ganze Zeile, damit er einzeilig bleibt. */
  .modal .row>button,.modal .modal-actions button{white-space:normal;max-width:100%;flex:1 1 100%}
  .modal .split-btn{flex:1 1 100%}
  /* Rollen-Zeile im Partei-Fenster (Debitor/Kreditor mit „+ als … führen“):
     je Rolle eine Zeile, der Split-Knopf bekommt die volle Breite. */
  .modal .rollen-konten>span{flex:1 1 100%;flex-wrap:wrap}
  .modal .rollen-konten .split-btn{flex:1 1 100%}
  /* Lange unbrechbare Werte (E-Mail-Adressen, Kennungen) in Karten brechen an
     jeder Stelle statt aus dem Kasten zu laufen. */
  .section-card strong,.section-card code{overflow-wrap:anywhere}
}
/* Pflichten-Radar der Akte: der Klick-Text ist ein Knopf im Fließtext und muss
   umbrechen wie Text (bei 390 px lief er 30 px über den Rand). */
.radar-link{white-space:normal;text-align:left;max-width:100%}

/* ============================== Dropzone — EINE Fassung ================ */
/* GEFALTET am 22.09.2026. `.dropzone` stand hier ZWEIMAL: einmal als Baustein
   und 500 Zeilen weiter unten noch einmal für das Beleg-Hochladen-Fenster.
   Der zweite Block gewann und gab damit JEDER Zone im Programm das Aussehen
   des Beleg-Fensters — kräftigerer Rand, größeres Symbol, mehr Polsterung.
   Gefaltet wird auf die WIRKSAMEN Werte, damit sich sichtbar nichts ändert;
   nur das Layout der zwei nebeneinander stehenden Beleg-Kacheln bleibt beim
   Container (`.dropzonen`), wo es hingehört. */
.dropzone{
  position:relative;
  border:2px dashed var(--line-2);border-radius:var(--r-inner);
  padding:var(--s-5) var(--s-4);text-align:center;cursor:pointer;
  color:var(--muted);font-size:var(--t-3);line-height:1.5;
  transition:border-color .15s,background .15s,color .15s;
  background:transparent;
}
.dropzone:hover{border-color:var(--accent-border);background:var(--accent-dim);color:var(--fg)}
.dropzone strong{color:var(--fg)}
/* Ein bestehendes Dateifeld mit Zone dazu (Dokumente an der Waffe, Nachweis):
   die Zeile selbst leuchtet beim Ziehen, ohne zur Kachel zu werden. */
.drop-ziel{border-radius:var(--r-inner)}
.drop-ziel.drag-over{outline:2px dashed var(--accent);outline-offset:var(--s-1);background:var(--accent-dim)}
.dropzone.drag-over{
  border-color:var(--accent);background:var(--accent-dim);color:var(--fg);
}
/* BEIM ZIEHEN STIMMT „ODER KLICKEN“ NICHT (Michael, 22.09.2026: „Wenn man
   schon eine Datei gerade reinzieht, kann man gar nicht klicken.“). Die Kachel
   traegt im Ruhezustand beides zu Recht — waehrend ein Zug laeuft, ist nur
   noch eines davon wahr. Statt den Text in zwanzig Masken zu zerlegen, legt
   die leuchtende Kachel EINEN Satz darueber. Deckend (--card-2), damit der
   Ruhetext nicht durchscheint; der Zeiger geht hindurch, sonst verlöre die
   Kachel unter ihm ihr eigenes Ereignis.
   NUR bei `dz-zug` (der Datei-Vermittler setzt sie): `drag-over` allein tragen
   auch dateilose Zuege wie der Lagerplatz-Baum, dessen eigener Text erklaert,
   was das Loslassen dort bedeutet — den darf nichts ueberdecken. */
.dropzone.dz-zug::after{
  content:"Jetzt loslassen";
  position:absolute;inset:0;pointer-events:none;
  display:flex;align-items:center;justify-content:center;
  border-radius:var(--r-inner);
  background:var(--card-2);color:var(--accent);
  font-size:var(--t-4);font-weight:600;
}
.dropzone.busy{opacity:.55;pointer-events:none}
.dropzone .dz-icon{font-size:var(--t-7);display:block;margin-bottom:6px;opacity:.8}
/* Gesammelte Dateien im Ablage-Dialog (Michael, 18.09.2026: „längere
   Dokumentnamen stehen über"): die Marke darf umbrechen statt aus der Spalte
   zu laufen. */
.datei-marken .badge{max-width:100%;white-space:normal;overflow-wrap:anywhere;text-align:left}

/* Dateien fallen in jedes Fenster (Regelwerk `dateien-fallen-in-jedes-fenster`,
   18.09.2026): Beim Ziehen liegt der Schleier über der ganzen Seite und nennt
   das Ziel. Er nimmt selbst KEINE Zeigerereignisse — der Drop erreicht darunter
   die Kachel oder das document, das ihn weiterleitet. */
.ablage-schleier{position:fixed;inset:0;z-index:20000;display:none;align-items:center;justify-content:center;
  pointer-events:none;background:var(--schleier)}
.ablage-schleier.aktiv{display:flex}
/* Der Hinweis darin ist eine KARTE (Baustein `.flaeche`) mit dem gestrichelten
   Rand der Dropzone — wie `.dropzone.drag-over`, nur seitenweit. */
.ablage-schleier-hinweis{border:2px dashed var(--accent);font-size:var(--t-5);max-width:min(90vw,640px);text-align:center}
.ablage-schleier-nein{border-color:var(--warn-bdr);color:var(--muted)}

/* Kategoriebild-Vorschau im Kategorie-Formular */
.katbild-preview{display:flex;align-items:center;gap:var(--s-3)}
.katbild-preview img{
  width:96px;height:96px;object-fit:contain;border-radius:var(--r-inner);
  background:var(--blatt);border:1px solid var(--line);
}

/* ============================== Drag & Drop Artikel -> Kategorie ======== */
.art-item[draggable="true"]{cursor:grab}
.art-item.dragging{opacity:.45}
.tree-node.drop-target{
  outline:2px dashed var(--accent);outline-offset:-2px;
  background:var(--ok-bg);
}
.tree-thumb{
  width:20px;height:20px;border-radius:var(--r-klein);object-fit:contain;
  background:var(--blatt);border:1px solid var(--line);flex:none;
}

/* ============================== Modal ==================================== */
.modal-overlay{
  position:fixed;inset:0;background:var(--schleier);backdrop-filter:blur(2px);
  display:flex;align-items:flex-start;justify-content:center;z-index:90;
  /* 28.07.2026 (Michael): oben nur minimaler Abstand, damit hohe Fenster
     (Beleg-&-Zahlung-Maske) komplett ins Bild passen statt unten abzuschneiden. */
  overflow-y:auto;padding:var(--s-4) var(--s-4) var(--s-5);
}
.modal{
  background:var(--card);border:1px solid var(--line);border-radius:var(--r-card);
  width:100%;max-width:720px;padding:var(--s-4) var(--s-5) var(--s-4);box-shadow:var(--shadow-lg);
}
.modal h2{margin:0 0 var(--s-1);font-size:var(--t-6)}
.modal .modal-close{float:right;margin:-4px -4px 0 0}

/* Editor-Modal mit Reitern: muss NACH .modal stehen, sonst gewinnt dessen
   max-width:720px bei gleicher Spezifität (spätere Regel im Quelltext) */
.modal-lg{max-width:1040px}
.modal-xl{max-width:1400px;width:95vw}

/* Waffe erwerben (P3-045, 06.09.2026): der Beleg des Überlassers LINKS im
   Beleg-Viewer, das Erfassungsformular rechts — dasselbe Muster wie im
   Zahlungstermine-Fenster (Bescheid links, Felder rechts). Ohne Beleg ist die
   linke Spalte versteckt und der Körper ein normaler Block. */
.form-koerper{display:flex;gap:var(--s-4);align-items:flex-start;min-width:0}
.form-koerper>#form,.form-koerper>.form-rechts{flex:1;min-width:0}
.form-beleg{flex:1.1;min-width:22rem;display:flex;flex-direction:column;position:sticky;top:0;height:min(82vh,62rem)}
.form-beleg .beleg-xml{flex:1;min-height:0;overflow:auto;margin:0;padding:var(--s-2);font-size:var(--t-2);line-height:1.35;background:var(--card-2);border:1px solid var(--line);border-radius:var(--r-card)}

/* Artikelsuche-Popup (Positionen-Tab Angebot/Auftrag): eigener Overlay über
   der bereits offenen Beleg-Maske, siehe openArtikelSuchePopup in
   belegMaske.js -- z-index muss über dem regulären .modal-overlay (90)
   liegen. */
.artikel-suche-overlay{z-index:9500}
.artikel-suche-popup{display:flex;flex-direction:column;max-height:82vh}
.artikel-suche-layout{
  display:flex;flex:1;min-height:0;margin-top:8px;
  border:1px solid var(--line);border-radius:var(--r-inner);overflow:hidden;
}
.artikel-suche-baum{width:220px;flex:0 0 auto;border-right:1px solid var(--line);overflow:auto;background:var(--bg-elevated);padding:var(--s-2)}
.artikel-suche-liste{flex:1;min-width:0;display:flex;flex-direction:column;padding:var(--s-3);gap:var(--s-2);overflow:hidden}
.artikel-suche-liste #aspSuche{width:100%}
.artikel-suche-tbl-wrap{flex:1;overflow:auto;border:1px solid var(--line);border-radius:var(--r-inner)}
.artikel-suche-tbl-wrap table{width:100%;border-collapse:collapse}
.artikel-suche-tbl-wrap th{
  position:sticky;top:0;background:var(--bg-elevated);text-align:left;
  padding:var(--s-2) var(--s-2);border-bottom:1px solid var(--line);font-size:var(--t-2);color:var(--muted);
}
.artikel-suche-tbl-wrap td{padding:var(--s-1) var(--s-2);border-bottom:1px solid var(--line-2);font-size:var(--t-3)}
.asp-zeile{cursor:pointer}
.asp-zeile:hover td{background:var(--card-3)}
.asp-zeile.active td{background:var(--accent-dim)}

/* Hersteller-Verwaltung im Modal */
.hst-row{
  display:grid;grid-template-columns:1fr 1fr 90px auto;gap:var(--s-2);align-items:center;
  padding:var(--s-2) 0;border-bottom:1px solid var(--line);
}
.hst-row:last-child{border-bottom:0}
.hst-row .muted{font-size:var(--t-2)}
.hst-head{font-size:var(--t-2);color:var(--muted);border-bottom:1px solid var(--line);padding-bottom:4px}

/* ============================== Responsive ============================= */
@media (max-width:1100px){
  .pane-list{width:320px}
  .pane-tree{width:240px}
}
@media (max-width:960px){
  .seite{flex-direction:column;height:auto}
  .pane-tree,.pane-list{width:100%;border-right:0;border-bottom:1px solid var(--line);max-height:36vh}
  .pane-detail{padding:var(--s-4)}
}
@media (max-width:720px){
  .topbar{flex-wrap:wrap;gap:var(--s-2);height:auto;min-height:var(--topbar-h);padding:var(--s-2) var(--s-3);position:static}
  .topbar-sub{position:static}
  .tabs{margin-left:0;order:3;width:100%}
  /* Umbrechen statt scrollen: overflow-x:auto würde die aufklappenden
     .nav-menu-Dropdowns wegclippen (Menü unsichtbar, Klick wirkt "tot"). */
  .nav-bereiche{margin-left:0;order:3;width:100%;flex-wrap:wrap}
  .list{width:100%;border-right:0;border-bottom:1px solid var(--line);max-height:40vh}
  .detail{padding:var(--s-4)}
  .settings{padding:var(--s-4)}
  .tbl{display:block;overflow-x:auto;white-space:nowrap}
  .card{margin:6vh 16px;padding:var(--s-5)}
  input,select,textarea{max-width:100%!important}
  .grid,.grid2,.grid3{grid-template-columns:1fr}
  .detail-grid{grid-template-columns:1fr}
}
@media (min-width:721px) and (max-width:900px){
  .grid2{grid-template-columns:1fr}
}

/* Segment-Umschalter (Kunden | Lieferanten) */
.segment{display:inline-flex;border:1px solid var(--line-2);border-radius:var(--r-inner);overflow:hidden}.segment button{
  /* Segmente sitzen aneinander - deshalb keine Rundung. Sonst nichts. */
  border-radius:0;
}.segment button.active{background:var(--accent-dim);color:var(--accent)}
/* Segmentwahl in einer Tabellenzelle (Verwaltung -> Automatische Mails):
   dieselbe Komponente, nur enger gepolstert. */
/* Zeilen, die keine Wahl haben, sondern eine Auskunft geben (die Mail loest
   ein Knopfdruck aus). Gestrichelt, damit sie sichtbar NICHT klickbar ist. */
.mv-fest{display:inline-block;padding:var(--s-1) var(--s-3);font-size:var(--t-2);color:var(--muted);
  border:1px dashed var(--line-2);border-radius:var(--r-mittel);cursor:help}

/* Wawi-Tabellen außerhalb des pane-Layouts (z. B. Waffenbuch in .section-card):
   horizontal scrollen statt über den Rand hinauszulaufen */
.section-card .table-wrap{overflow-x:auto;max-width:100%}
.section-card .table-wrap .art-tbl{min-width:max-content}

/* Rechtsklick-Kontextmenü */
.kontext-menue{
  position:fixed;z-index:200;min-width:220px;padding:var(--s-2);
  /* Ein langes ⋯-Menü (Auftrag) bleibt im Bild und rollt selbst. */
  max-height:calc(100vh - var(--s-4));overflow-y:auto;
  background:var(--card);border:1px solid var(--line-2);border-radius:var(--r-inner);
  box-shadow:var(--shadow-lg);
}
.km-zeile{display:block;width:100%;text-align:left;background:transparent;border:0;
  color:var(--fg);padding:var(--s-2) var(--s-3);border-radius:var(--r-mittel);font-size:var(--t-3);cursor:pointer}
.km-zeile:hover:not(:disabled){background:var(--card-3)}
.km-zeile:disabled{color:var(--muted);cursor:default}
/* Der Grund-Knopf färbt beim Überfahren grün (button:hover schlägt .km-zeile) —
   ein ausgegrauter Eintrag darf nicht aussehen, als ginge er (Fenster-Umbau). */
.km-zeile:disabled:hover{background:transparent}
.km-zeile small{display:block;color:var(--muted);font-size:var(--t-1);font-weight:400}
.km-zeile.km-gefahr{color:var(--bad)}
.km-trenner{height:1px;background:var(--line);margin:var(--s-1) var(--s-1)}
.km-titel{font-size:var(--t-1);color:var(--muted);padding:var(--s-1) var(--s-3) var(--s-1);text-transform:uppercase;letter-spacing:.04em}

/* Webhook-/Zweitdialoge liegen über dem Editor-Modal — das macht seit dem
   19.09.2026 der Fenster-Motor selbst (`openModal({ ueberlagern: true })`,
   z-Achse nach Stapeltiefe). Die beiden Klassen `.overlay-bg`/`.overlay-card`
   sind damit weg: Die Karte war nie positioniert, ihr z-index also
   wirkungslos, und der fixe Schleier fing jeden Klick ab. */
.doc.inaktiv{opacity:.55}

/* Beleg-Statuskette (Angebot/Auftrag/Rechnung/Versand) */
.status-kette{display:flex;flex-wrap:wrap;gap:var(--s-2);margin:var(--s-1) 0 var(--s-3)}
.kette-chip{display:inline-flex;align-items:center;gap:var(--s-1);padding:var(--s-1) var(--s-2);border-radius:var(--r-gross);
  font-size:var(--t-2);border:1px solid var(--line-2);background:var(--card-3);color:var(--fg)}
.kette-chip .kette-zeichen{font-weight:700}
.kette-chip.ok{border-color:var(--accent-border);color:var(--accent-hover)}
.kette-chip.offen{border-color:var(--warn-bdr);color:var(--warn)}
.kette-chip.fehler{border-color:var(--bad-bdr);color:var(--bad)}
.kette-chip.aus{opacity:.45}
/* Klickbare Chips (führen zum Detail/PDF) */
a.kette-chip.kette-link{cursor:pointer;text-decoration:none;transition:filter .12s,transform .06s}
a.kette-chip.kette-link:hover{filter:brightness(1.25);transform:translateY(-1px)}
a.kette-chip.kette-link::after{content:"↗";font-size:var(--t-0);opacity:.6;margin-left:2px}
/* Aktuell geöffnetes Objekt im Verkaufs-Lebenslauf */
.kette-chip.aktuell{box-shadow:inset 0 0 0 1.5px currentColor;font-weight:700}
/* Klickbare Beleg-Referenzen (Referenzen-Block, Historie) */
.ref-link{cursor:pointer;color:var(--accent);text-decoration:underline dotted;text-underline-offset:2px}
.ref-link:hover{text-decoration:underline}
/* Historie-Tab (JTL "Historie/Notizen") */
.historie-liste{display:flex;flex-direction:column;gap:var(--s-2);padding:var(--s-1) 0}
.historie-eintrag{display:flex;gap:var(--s-3);align-items:baseline;font-size:var(--t-3);
  border-bottom:1px solid var(--line-2);padding-bottom:8px}
.historie-zeit{flex:0 0 120px;font-size:var(--t-2)}
/* Sichten-Leiste (JTL-artige Arbeitslisten, linke Spalte) */
.sichten-leiste{width:230px;flex:0 0 auto;border-right:1px solid var(--line);
  overflow:auto;background:var(--bg-elevated);padding:var(--s-3) var(--s-2);display:flex;
  flex-direction:column;gap:var(--s-1)}
.sicht-titel{font-size:var(--t-1);text-transform:uppercase;letter-spacing:.4px;
  color:var(--muted);margin:var(--s-3) var(--s-2) var(--s-1)}
.sicht-titel:first-child{margin-top:0}
/* Klappbare Gruppen (sichtenLeiste): Titel ist ein Button, Pfeil zeigt den
   Zustand; Optik bleibt die der bisherigen Titelzeile. */button.sicht-titel.klappbar{
  /* Eine Ueberschrift, die man anklicken kann - sie darf nicht wie ein
     Knopf aussehen, also ohne dessen Innenabstand. */
  display:flex;align-items:center;gap:var(--s-1);width:calc(100% - 12px);
  text-align:left;padding:0;
}
.klapp-pfeil{font-size:var(--t-0);opacity:.7;width:10px;flex:0 0 auto}
.sicht-eintrag{display:flex;justify-content:space-between;align-items:center;
  gap:var(--s-2);width:100%;text-align:left;background:none;border:0;color:var(--fg);
  padding:var(--s-1) var(--s-2);border-radius:var(--r-mittel);cursor:pointer;font-size:var(--t-3)}
.sicht-eintrag:hover{background:var(--card-2)}
/* Suchfeld der Sektions-Leiste (20.08.2026, Michael): filtert die Eintraege
   live. Sitzt oben in der Leiste, nutzt dieselben Farbtoken wie der Rest --
   es soll wie ein Teil der Leiste aussehen, nicht wie ein Fremdkoerper. */
.sicht-suche{width:calc(100% - 12px);margin:0 var(--s-2) var(--s-2);padding:var(--s-1) var(--s-2);
  background:var(--card-2);border:1px solid var(--line);border-radius:var(--r-mittel);
  color:var(--fg);font-size:var(--t-3);font-family:inherit}

/* Querverweis in der Leiste (z. B. "Meldungs-Monitor ->"): fuehrt auf eine
   ANDERE Seite, waehrend alle anderen Eintraege nur die Karte daneben
   umschalten. Michael 20.08.2026: "Ein Link sollte evtl gar nicht im Menue
   sein." Er bleibt -- er ist die Bruecke zwischen Einstellen und Betreiben --
   sieht aber nicht mehr aus wie ein Geschwister-Eintrag, sondern wie ein
   Ausgang: abgesetzt und leiser. */
a.sicht-eintrag{color:var(--muted);margin-top:4px;
  border-top:1px solid var(--line);border-radius:0 0 var(--r-mittel) var(--r-mittel);
  padding-top:8px;text-decoration:none}
a.sicht-eintrag:hover{color:var(--fg)}
.sicht-suche:focus{outline:2px solid var(--accent);outline-offset:1px}
.sichten-leiste.ohne-treffer::after{content:"Nichts gefunden";display:block;
  padding:var(--s-2) var(--s-2);color:var(--muted);font-size:var(--t-2);font-style:italic}
.sicht-eintrag.aktiv{background:var(--card-3);font-weight:600}
.sicht-zaehler{font-size:var(--t-1);color:var(--muted);background:var(--card-2);
  border-radius:var(--r-inner);padding:1px var(--s-2);min-width:22px;text-align:center}
.sicht-eintrag.aktiv .sicht-zaehler{color:var(--fg)}
/* Archiv-Sicht + Ablageziel für Drag&Drop (Vorgänge ins Archiv ziehen) */
.sicht-eintrag.sicht-archiv{margin-top:8px;border-top:1px dashed var(--line);
  border-radius:0 0 var(--r-mittel) var(--r-mittel);padding-top:9px;color:var(--muted)}
.sicht-eintrag.drop-aktiv{background:var(--accent-dim);outline:1px dashed var(--accent);
  outline-offset:-1px;color:var(--fg)}
tr.dragging{opacity:.5}
@media (max-width: 900px){
  .sichten-leiste{width:auto;flex-direction:row;flex-wrap:wrap;border-right:0;
    border-bottom:1px solid var(--line)}
  .sicht-titel{width:100%;margin:var(--s-2) var(--s-2) var(--s-1)}
}
/* Klickbarer Modal-Titel -> PDF */
.modal-titel-link{margin:0;flex:1;font-size:var(--t-6);font-weight:700;color:var(--fg);text-decoration:none;border-bottom:1px dashed var(--line-2)}
.modal-titel-link:hover{color:var(--accent);border-bottom-color:var(--accent)}
.modal-titel-link::after{content:" 📄";font-size:var(--t-2);opacity:.8}

/* Fehler-/Warnmeldungen als auffälliges Kästchen statt unscheinbarem Text */
.msg.error{display:block;background:var(--bad-bg);border:1px solid var(--bad-bdr);
  color:var(--bad);border-radius:var(--r-inner);padding:var(--s-2) var(--s-3);margin-top:8px;font-size:var(--t-3)}
.msg.error::before{content:"⚠ ";font-weight:700}
/* Warnung ohne Fehler: etwas ist noch nicht eingerichtet (T-11). */
.msg.warn{display:block;background:var(--warn-bg);border:1px solid var(--warn-bdr);
  color:var(--warn);border-radius:var(--r-inner);padding:var(--s-2) var(--s-3);margin:0 0 var(--s-3);font-size:var(--t-3)}
.msg.warn::before{content:"⚠ ";font-weight:700}
/* Ein Pflichtfeld, das beim Speichern leer war (Baustein pruefePflicht,
   Befund 036). Rot umrandet, bis man hineintippt. */
.feld-fehlt,.feld-fehlt:focus{border-color:var(--bad-bdr);background:var(--pflicht-bg);
  box-shadow:0 0 0 1px var(--bad-bdr)}
.kette-detail{display:block;font-size:var(--t-1);color:var(--muted);margin-top:1px}

/* ========== JTL-ähnliche Beleg-Detailansicht ========== */
/* Kompakte Felder: Label klein darüber, Wert darunter. */
.jtl-bereich-titel{display:flex;align-items:center;gap:var(--s-2);margin:var(--s-4) 0 var(--s-2);font-size:var(--t-2);color:var(--muted);text-transform:uppercase;letter-spacing:.06em;font-weight:700;border-top:1px dashed var(--line);padding-top:12px}
.jtl-bereich-titel:first-child{margin-top:0;border-top:0;padding-top:0}
.jtl-adressen{display:grid;grid-template-columns:1fr 1fr;gap:var(--s-4)}
.jtl-adresse-box{background:var(--card-2);border:1px solid var(--line);border-radius:var(--r-inner);padding:var(--s-3) var(--s-3)}
.jtl-adresse-box h4{margin:0 0 var(--s-1);font-size:var(--t-1);text-transform:uppercase;color:var(--muted);letter-spacing:.05em;font-weight:700}
.jtl-adresse-box .jtl-adresse-name{font-weight:600;font-size:var(--t-4);margin-bottom:3px}
.jtl-adresse-box .jtl-adresse-str{color:var(--fg);font-size:var(--t-3);white-space:pre-line}
.jtl-adresse-box .jtl-adresse-meta{color:var(--muted);font-size:var(--t-2);margin-top:4px}

/* JTL-kompakte Positionen-Tabelle */
.jtl-pos-tbl{width:100%;border-collapse:collapse;font-size:var(--t-3)}
.jtl-pos-tbl thead th{
  background:var(--card-2);border-bottom:1px solid var(--line);
  text-align:left;padding:var(--s-2) var(--s-3);font-weight:600;color:var(--muted);
  font-size:var(--t-1);text-transform:uppercase;letter-spacing:.04em
}
.jtl-pos-tbl tbody td{padding:var(--s-2) var(--s-3);border-bottom:1px solid var(--line-2);vertical-align:top}
.jtl-pos-tbl tbody tr:last-child td{border-bottom:0}
.jtl-pos-tbl tbody tr:hover td{background:var(--card-3)}
.jtl-pos-tbl td.num{text-align:right;font-variant-numeric:tabular-nums}
.jtl-pos-tbl td.mono{font-family:ui-monospace,Menlo,Consolas,monospace;font-size:var(--t-2)}
.jtl-pos-tbl td.muted{color:var(--muted);font-size:var(--t-2)}
.jtl-pos-tbl td.menge{text-align:right;font-weight:600;font-variant-numeric:tabular-nums}
.jtl-pos-tbl th.num{text-align:right}

/* Summenblock rechts */
.jtl-sum-wrap{display:flex;justify-content:flex-end;margin-top:14px}
.jtl-sum{background:var(--card-2);border:1px solid var(--line);border-radius:var(--r-inner);padding:var(--s-3) var(--s-4);min-width:260px}
.jtl-sum-row{display:flex;justify-content:space-between;gap:var(--s-5);font-size:var(--t-3);padding:var(--s-1) 0}
.jtl-sum-row .lbl{color:var(--muted)}
.jtl-sum-row .v{font-variant-numeric:tabular-nums}
.jtl-sum-row.gross{font-weight:700;font-size:var(--t-4);border-top:1px solid var(--line);padding-top:8px;margin-top:6px}
.jtl-sum-row.gross .lbl{color:var(--fg)}

/* Anmerkungs-/Zusatz-Block */
.jtl-anmerkung{
  margin:var(--s-3) 0;padding:var(--s-2) var(--s-3);border-left:3px solid var(--accent);
  background:var(--card-2);border-radius:0 var(--r-inner) var(--r-inner) 0;font-size:var(--t-3);white-space:pre-line
}

/* Aktionen-Streifen unter dem Beleg */
.jtl-aktionen{display:flex;gap:var(--s-2);flex-wrap:wrap;align-items:center;border-top:1px solid var(--line);padding-top:12px;margin-top:14px}
.jtl-aktionen .spacer{flex:1}

/* Auftrags-Grid rechts neben Adressen */
.jtl-kv{display:grid;grid-template-columns:auto 1fr;gap:var(--s-1) var(--s-3);font-size:var(--t-3)}
.jtl-kv dt{color:var(--muted);font-size:var(--t-2)}
.jtl-kv dd{margin:0}

@media (max-width:960px){
  .jtl-adressen{grid-template-columns:1fr}
}

/* ========== Masken-Layout (zwei-/dreispaltig) ========== */
/* Vorbild JTL-Wawi: links Hauptbereich mit Tabs + Inhalt, rechts sticky
   Statuskette/Aktionen. Stammdaten landen im ersten Tab "Daten" (statt
   einer eigenen dritten Spalte -- auf modal-xl wäre das zu eng). */

/* JTL-Cell colspan-Unterstützung für gridFelder (Helfer in wawi.js) */

/* ========== Schnell-Aktionen-Leiste (unter Tabellen) ========== */
.schnell-aktionen{display:flex;gap:var(--s-2);flex-wrap:wrap;margin-top:8px}

/* ========== Sub-Tabelle (Master+Detail im Modal) ========== */
.sub-tabelle{width:100%;border-collapse:collapse;font-size:var(--t-3)}
.sub-tabelle thead th{
  background:var(--card-2);border-bottom:1px solid var(--line);
  text-align:left;padding:var(--s-2) var(--s-3);font-weight:600;color:var(--muted);
  font-size:var(--t-1);text-transform:uppercase;letter-spacing:.04em
}
.sub-tabelle tbody td{padding:var(--s-2) var(--s-3);border-bottom:1px solid var(--line-2);vertical-align:top}
.sub-tabelle tbody tr:last-child td{border-bottom:0}
.sub-tabelle tbody tr{cursor:pointer}
.sub-tabelle tbody tr:hover td{background:var(--card-3)}
.sub-tabelle .num{text-align:right;font-variant-numeric:tabular-nums}
.sub-tabelle .mono{font-family:ui-monospace,Menlo,Consolas,monospace;font-size:var(--t-2)}
.sub-tabelle .muted{color:var(--muted);font-size:var(--t-2)}
.sub-tabelle-detail{background:var(--card-2)}
.sub-tabelle-aktionen{margin-top:6px}

/* Responsive: unter 960px fällt das Spalten-Layout auf 1 Spalte zurück,
   unter 640px werden Tab-Panels nicht mehr in der Höhe beschränkt. */
@media (max-width:640px){
  .mtab-panel{max-height:none}
}

/* ============================ FiBu: Belege =============================== */

/* PDF-Knopf in der Beleg-Spalte des Journals — nur gerendert, wenn ein
   Archiv-PDF zur Buchung existiert. */.pdf-btn{
  /* Kein zweiter Knopf, sondern eine Marke mit Aktion: Akzentflaeche,
     Akzentrahmen, Akzentschrift. Groesse kommt aus der dichten Reihe. */
  display:inline-flex;align-items:center;gap:var(--s-1);
  background:var(--accent-dim);border:1px solid var(--accent-border);color:var(--accent);
  vertical-align:1px;
}
.pdf-btn:hover{background:var(--accent-dim)}

/* Hinweiszeile über einer Liste: "N Treffer sind hier ausgeblendet — …".
   Klickbar (führt in die Sicht, die sie zeigt), deshalb ein <button>. */
.listen-hinweis{
  display:block;width:100%;text-align:left;margin:0;flex:0 0 auto;
  padding:var(--s-2) var(--s-4);font-size:var(--t-3);
  background:var(--accent-dim);border:0;border-bottom:1px solid var(--accent-border);
  color:var(--accent);cursor:pointer
}
.listen-hinweis[hidden]{display:none}
.listen-hinweis:hover{text-decoration:underline}

/* Eingang/Ausgang-Umschalter der Beleg-Sicht */
.beleg-tab{
  border-radius:var(--r-pille);padding:var(--s-1) var(--s-4);font-size:var(--t-3);
  background:var(--card);border:1px solid var(--line-2);color:var(--fg)
}
.beleg-tab.aktiv{
  background:var(--accent-dim);border-color:var(--accent-border);
  color:var(--accent);font-weight:600
}

/* Liste + Vorschau nebeneinander */
.beleg-split{display:flex;gap:var(--s-4);align-items:stretch;overflow:hidden}
.beleg-split .table-wrap{flex:1.4;min-width:0;overflow:auto}
.beleg-vorschau{
  flex:1;min-width:280px;display:flex;flex-direction:column;
  background:var(--card);border:1px solid var(--line);border-radius:var(--r-inner)
}
.beleg-vorschau-kopf{
  display:flex;align-items:center;gap:var(--s-3);justify-content:space-between;
  padding:var(--s-2) var(--s-3);border-bottom:1px solid var(--line);font-size:var(--t-3)
}
.beleg-vorschau-body{
  flex:1;display:flex;align-items:stretch;justify-content:center;
  padding:var(--s-2);min-height:380px
}
.beleg-vorschau-body .muted{align-self:center}

/* Eingebetteter PDF-Viewer (Vorschau + Buchungs-Detail) */
.beleg-frame{
  width:100%;min-height:380px;height:100%;border:1px solid var(--line);
  border-radius:var(--r-mittel);background:var(--blatt)
}
/* Beleg-Viewer (P3-032): eigener pdf.js-Viewer mit Rahmen-Übernahme.
   EIN Baustein (belegViewer.js) für alle Beleg-Vorschauen der Buchen-Maske.
   KEINE nachgebauten Knöpfe: die Werkzeugleiste nutzt `ghost btn-sm`, das
   Übernahme-Menü die Aufklappfläche `.split-btn-menu` mit `.split-btn-item`
   — hier stehen nur Layout und Viewer-Eigenes. */
.bviewer{display:flex;flex-direction:column;min-height:0;flex:1}
.bviewer-bar{
  display:flex;align-items:center;gap:var(--s-1);padding:var(--s-1) var(--s-2);
  border-bottom:1px solid var(--line);font-size:var(--t-2);flex:0 0 auto
}
.bviewer-info{color:var(--muted)}
/* Warum das Live-Papier gerade nicht nachrechnet — das letzte Blatt bleibt stehen. */
.bviewer-hinweis{color:var(--warn);font-size:var(--t-2)}
/* Strg + Mausrad zoomt IM Papier — daneben zoomt es die ganze Seite. Leise,
   rechts in der Leiste (Michael, 24.09.2026). */
.bviewer-zoomtipp{margin-left:auto;color:var(--muted);font-size:var(--t-1)}
.bviewer-zoomtipp + .bviewer-tipp{margin-left:var(--s-3)}
/* Statt des Papiers: was noch fehlt — schlichter Text, bewusst OHNE Rahmen,
   damit es nicht wie ein Upload-Feld aussieht (Michael, 24.09.2026). */
.papier-fehlt{margin:var(--s-6, 48px) auto 0;max-width:420px;text-align:center;font-size:var(--t-4)}
.papier-fehlt p{margin:0 0 var(--s-2);color:var(--muted)}
.papier-fehlt ul{margin:0;padding:0;list-style:none;display:flex;flex-direction:column;gap:var(--s-1)}
.papier-fehlt li{color:var(--fg);font-weight:600}
.papier-fehlt-symbol{display:inline-block;width:1.6em;text-align:center}
.bviewer-tipp{margin-left:auto;color:var(--muted);cursor:help}
.bviewer-scroll{flex:1;min-height:0;overflow:auto;background:var(--card-2);padding:var(--s-2)}
.bviewer-status{padding:var(--s-4);text-align:center}
.bviewer-seite{position:relative;margin:0 auto var(--s-2);width:fit-content;box-shadow:var(--shadow-md)}
/* KEIN max-width auf dem Canvas: Beim Hineinzoomen staucht max-width die
   Breite auf den Container, die Höhe bleibt riesig — der Beleg wird zum
   unlesbaren Streifen (Kassenbon-Befund Michael 02.09.2026). Überbreite
   scrollt stattdessen in .bviewer-scroll. */
.bviewer-seite canvas,.bviewer-seite img{display:block;background:var(--blatt)}
.bviewer-overlay{position:absolute;inset:0;cursor:crosshair;touch-action:none}
.bviewer-box{
  position:absolute;border:1.5px solid var(--accent);background:var(--accent-dim);
  pointer-events:none
}
.bviewer-box.wartet{border-style:dashed;animation:bviewerPuls 1s ease-in-out infinite}
@keyframes bviewerPuls{50%{background:var(--accent-dim)}}
.bviewer-menu{position:fixed;z-index:1200;min-width:230px;max-width:340px;padding:var(--s-1)}
.bviewer-menu-wert{
  padding:var(--s-1) var(--s-2);font-size:var(--t-2);color:var(--muted);
  border-bottom:1px solid var(--line);margin-bottom:var(--s-1);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap
}
.bviewer-ocr-chip{
  display:inline-block;padding:0 var(--s-1);border-radius:var(--r-inner);font-size:var(--t-2);
  background:var(--warn-bg);color:var(--warn);border:1px solid var(--warn-bdr);cursor:help
}

/* Belege-SEITE (nicht die Modals): Sicht als Vollhöhen-Spalte — die LISTE
   scrollt intern (.table-wrap overflow:auto), Filter oben und Vorschau
   rechts bleiben immer sichtbar. Ohne das scrollt die ganze Seite und die
   auf Tabellenhöhe gestreckte Vorschau wandert mit aus dem Bild. */
[data-sicht-inhalt="belege"]:not([hidden]){display:flex;flex-direction:column;flex:1;min-height:0}
.pane-main .pane-body.beleg-split{flex:1;min-height:0;overflow:hidden}

@media (max-width:960px){
  .beleg-split{flex-direction:column}
  .beleg-vorschau{min-height:420px}
  [data-sicht-inhalt="belege"]:not([hidden]){display:block;flex:none}
  .pane-main .pane-body.beleg-split{overflow:visible}
}

/* Beleg-Hochladen: Ergebnisliste. Das AUSSEHEN der Zone steht EINMAL oben
   beim Baustein (22.09.2026 gefaltet) — hier bleibt nur, was wirklich dieses
   Fenster angeht: zwei Kacheln nebeneinander, die sich den Platz teilen. */
.dropzonen{display:flex;gap:var(--s-4);flex-wrap:wrap;margin-bottom:8px}
.dropzonen .dropzone{flex:1;min-width:200px}
.upload-eintrag{
  display:flex;align-items:center;gap:var(--s-3);background:var(--card-2);
  border:1px solid var(--line);border-radius:var(--r-inner);padding:var(--s-2) var(--s-3);
  cursor:pointer;font-size:var(--t-3)
}
.upload-eintrag:hover{border-color:var(--accent-border)}

/* Beleg-Status-Flags (BB-Vorbild) + weitere FiBu-Badges */
.badge.ueberfaellig,.badge.abgang,.badge.gesperrt{color:var(--bad);border-color:var(--bad-bdr);background:var(--bad-bg)}
.badge.unbezahlt,.badge.faellig,.badge.duplikat,.badge.nicht_gebucht,.badge.teilweise{color:var(--warn);border-color:var(--warn-bdr);background:var(--warn-bg)}
.mini-tab{width:100%;border-collapse:collapse;margin:var(--s-1) 0 var(--s-2);font-size:var(--t-3)}
.mini-tab th{text-align:left;font-weight:600;color:var(--muted);border-bottom:1px solid var(--line-2);padding:var(--s-1) var(--s-2)}
.mini-tab td{padding:var(--s-1) var(--s-2);border-bottom:1px solid var(--line))}
.badge.ausgeglichen,.badge.op_ausgeglichen{color:var(--ok);border-color:var(--ok-bdr);background:var(--ok-bg)}

/* Aufklappbare Unterzeilen (erstelleTabelle cfg.unterZeilen) */.klapp-btn{
  /* Sitzt IM Text, richtet sich deshalb an dessen Mittellinie aus. */
  vertical-align:middle;
}
tr.unter-zeile{background:var(--card-2)}
tr.unter-zeile td:first-child{padding-left:34px}
tr.unter-zeile:hover{background:var(--card-3)}

/* Beleg-Fenster im Assistenten-Layout (Schritte rechts, PDF links) */
.bs-spalte{flex:1;min-width:300px;display:flex;flex-direction:column;gap:var(--s-2)}
.bs-schritt{border:1px solid var(--line-2);border-radius:var(--r-inner);background:var(--card-2)}
.bs-kopf{display:flex;align-items:center;gap:var(--s-3);padding:var(--s-2) var(--s-3);font-weight:600;font-size:var(--t-4)}
.bs-kopf .badge{margin-left:auto}
.bs-inhalt{padding:var(--s-1) var(--s-3) var(--s-3);display:flex;flex-direction:column;gap:var(--s-2);font-size:var(--t-3)}
.bs-feld{display:flex;gap:var(--s-3);justify-content:space-between;align-items:baseline}
.bs-feld > span:first-child{color:var(--muted);flex:0 0 auto}
.bs-feld > strong{text-align:right;font-weight:600}
/* ZAHLANGABEN (Bezahlen-Fenster, 11.09.2026, Regelwerk
   `das-bezahlen-fenster-zeigt-und-aendert-nicht`). Michael zum ersten Bau:
   „Der Überweisungs Bau sieht leider nicht so schick aus wie im Mockup."
   Und er hatte recht: `.bs-feld` schiebt Beschriftung und Wert per
   space-between an die Ränder — bei kurzen Werten reisst dazwischen ein Loch
   auf, und ein langer Verwendungszweck franst rechtsbündig aus. Hier stehen
   die Werte auf EINER Kante: feste Spalte für die Beschriftung, Wert linksbündig
   direkt daneben. Kein zweiter Feld-Baustein fürs ganze Haus, sondern die
   Form für genau diese Sicht. */
.zahlfelder{display:grid;grid-template-columns:auto minmax(0,1fr);gap:var(--s-2) var(--s-3);align-items:baseline}
.zahlfelder > span{color:var(--muted);white-space:nowrap}
.zahlfelder > strong{font-weight:600;min-width:0;overflow-wrap:anywhere}
.zahlfelder .zahl{font-variant-numeric:tabular-nums}
/* Der Verwendungszweck ist ein Satz, kein Wert — er darf umbrechen und bleibt
   dabei mager, damit die Zahlen darüber führen. */
.zahlfelder .satz{font-weight:normal;line-height:1.45}
.bs-ausgleich{cursor:pointer;border:1px solid var(--line);border-radius:var(--r-mittel);padding:var(--s-1) var(--s-2);background:var(--bg)}
.bs-ausgleich:hover{border-color:var(--accent-border)}
details.bs-schritt > summary.bs-kopf{list-style:none}
details.bs-schritt > summary.bs-kopf::before{content:"▸ ";color:var(--muted)}
details.bs-schritt[open] > summary.bs-kopf::before{content:"▾ "}

/* ---------- P3-017 Arbeitsabläufe: Aktiv-Schalter (wie Mockup) ---------- */
.schalter{position:relative;display:inline-block;width:34px;height:19px;border-radius:var(--r-inner);background:var(--card-3);
  border:1px solid var(--line-2);padding:0;cursor:pointer;vertical-align:middle;flex:0 0 auto}
.schalter::after{content:"";position:absolute;top:2px;left:2px;width:13px;height:13px;
  border-radius:50%;background:var(--muted);transition:left .15s,background .15s}
.schalter.an{background:var(--accent-dim);border-color:var(--accent-border)}
.schalter.an::after{left:17px;background:var(--accent)}

/* ======================= HTML-Editor (wawi.js) =======================
   Kleiner WYSIWYG-Aufsatz auf Textareas (schmueckeHtmlEditor). */
.html-editor{border:1px solid var(--line);border-radius:var(--r-inner);background:var(--card-2);margin-top:2px}
.html-editor-leiste{display:flex;flex-wrap:wrap;gap:var(--s-1);padding:var(--s-1) var(--s-2);border-bottom:1px solid var(--line)}
.html-editor-leiste button:disabled{opacity:0.35;cursor:default}
.html-editor-feld:focus{box-shadow:inset 0 0 0 1px var(--accent-border)}
.html-editor-feld h2,.html-editor-feld h3{color:var(--accent);font-size:var(--t-5);margin:var(--s-4) 0 var(--s-1)}
.html-editor-feld p{margin:var(--s-2) 0}
.html-editor-feld ul,.html-editor-feld ol{margin:var(--s-2) 0;padding-left:22px}
.html-editor-feld a{color:var(--accent);text-decoration:underline}
.html-editor-feld hr{border:0;border-top:1px solid var(--line-2);margin:var(--s-3) 0}

/* ======================= Dashboard (P3-020) ======================= */
/* KOMPAKT (01.09.2026): Der Rahmen verteilt die Abstände — EIN gap statt
   je-Element-Margins (die Sichtprüfung fand 12/14/0-px-Mischmasch zwischen
   den Reihen; Regel „Let layout do the spacing"). Titel und Systemzeile
   zentriert (Michaels Freigabe-Wunsch). */
.dash-kopf{display:flex;align-items:baseline;justify-content:center;gap:var(--s-4)}
.dash-kopf h1{font-size:var(--t-6);margin:0}
.dash-system-zeile{display:flex;flex-wrap:wrap;justify-content:center;gap:var(--s-2)}
.dash-system-zeile:empty{display:none}
.dash-system-zeile .chip{text-decoration:none;white-space:nowrap}
.p-grau{background:var(--muted)}
/* `.kacheln`: dieselbe Reihe für die Kacheln der Legitimationen (Fenster-Umbau 2.2). */
.dash-kacheln,.kacheln{display:grid;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));gap:var(--s-3)}
.kacheln{margin-bottom:var(--s-4)}
/* EINE REIHE, AUCH MIT SIEBEN (Michael, 08.10.2026: „Die Kästchen oben
   zweireihig ist auch nicht wirklich sinnvoll."). Die Mindestbreite von 170 px
   trug sechs Kacheln in die 1180 px des Dashboards; seit der Papier-Kachel
   (10.09.2026) sind es sieben, und die siebte rutschte allein in Reihe zwei.
   140 px tragen sieben — mehr nicht, das hält selftest-fristen-im-kopf.js.
   Der Wert schrumpft dafür mit der Kachel (cqi = Prozent ihrer Breite), statt
   über den Rand zu laufen: „13.475,28 €" braucht bei 26 px rund 140 px, die
   Kachel hat innen knapp 120. Breite Kacheln (Handy: zwei je Reihe) behalten
   die volle Größe. */
.dash-kacheln{grid-template-columns:repeat(auto-fit,minmax(140px,1fr))}
.dash-kacheln .dash-kachel{container-type:inline-size}
.dash-kacheln .dk-wert{font-size:min(var(--t-7),17cqi);overflow-wrap:break-word}
.kachel-unter details summary{cursor:pointer}
.dash-kachel:hover{border-color:var(--line-2);transform:translateY(-1px);color:var(--fg)}
/* RUHE IN DER REIHE (Michael, 01.09.2026: „die Kacheln scheinen alle etwas
   unruhig"): Der Titel reserviert IMMER zwei Zeilen — damit stehen alle
   Werte auf EINER Flucht, egal ob der Titel umbricht; die Untertexte
   schließen unten bündig ab. Und keine Unterstreichung: Eine Kachel ist ein
   Knopf, kein Fließtext-Link. */
.dash-kachel{display:flex;flex-direction:column;text-decoration:none}
.dash-kachel *{text-decoration:none}
.dk-sub{margin-top:auto}
.dk-titel{font-size:var(--t-2);color:var(--muted);text-transform:uppercase;letter-spacing:.05em;display:flex;justify-content:space-between;min-height:3em;line-height:1.45}
.dk-wert{font-size:var(--t-7);font-weight:700;margin:var(--s-2) 0 var(--s-1);font-variant-numeric:tabular-nums}
.dk-klein{font-size:var(--t-4);color:var(--muted);font-weight:400}
.dk-sub{font-size:var(--t-3);color:var(--muted)}
.dk-ok .dk-wert{color:var(--accent)} .dk-warn .dk-wert{color:var(--warn)} .dk-bad .dk-wert{color:var(--bad)}
/* Ein Alarmwort neben der Zahl bleibt rot (NWR: „13 Erwerb(e) UNGEMELDET"). */
.dk-bad .dk-klein{color:var(--bad)}
.dash-grid2{display:grid;grid-template-columns:1fr 1fr;gap:var(--s-3)}
.dash-grid3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:var(--s-3)}
@media (max-width:1100px){ .dash-grid3{grid-template-columns:1fr 1fr} }
@media (max-width:840px){ .dash-grid2,.dash-grid3{grid-template-columns:1fr} }
.dash-panel h2{font-size:var(--t-3);color:var(--muted);text-transform:uppercase;letter-spacing:.05em;margin:0 0 var(--s-3);display:flex;justify-content:space-between}
.dash-panel h2 a{font-size:var(--t-2);text-transform:none;letter-spacing:0}
.dash-tbl{width:100%;border-collapse:collapse;font-size:var(--t-3)}
/* AM HANDY PASST DAS DASHBOARD IN DIE BREITE (31.08.2026, Durchgang 22).
   Gemessen bei 390 Pixeln: die Seite war 475 breit, man musste in ZWEI
   Richtungen schieben (WCAG 1.4.10 Reflow). Ursache ist die uebliche: Ein
   Rasterkind hat die Vorgabe min-width:auto und kann deshalb nicht schmaler
   werden als sein laengster Inhalt — hier eine Belegzeile wie
   AU-2026-0176 — Muster, Max.
   Beides greift NUR unter 520 Pixeln; am Arbeitsplatz und an der Kasse
   aendert sich nichts (pixelgleich nachgemessen). */
@media (max-width:520px){
  .dash-panel,.dash-grid2>*{min-width:0}
  .dash-tbl td{overflow-wrap:anywhere}
}
.dash-tbl td{padding:var(--s-2) var(--s-2);border-bottom:1px solid var(--line)}
.dash-tbl tr:last-child td{border-bottom:none}
.dash-tbl td.r{text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap}
.dash-klick{cursor:pointer} .dash-klick:hover td{background:var(--card-2)}
.dash-status{display:flex;gap:var(--s-4);flex-wrap:wrap;font-size:var(--t-3);color:var(--muted)}
.dash-status b{color:var(--fg)}
.dash-punkt{display:inline-block;width:8px;height:8px;border-radius:50%;margin-right:5px;vertical-align:1px}
.p-ok{background:var(--ok)} .p-warn{background:var(--warn)} .p-bad{background:var(--bad)}

/* Touch: Doppeltipp auf Tabellenzeilen soll öffnen, nicht zoomen */
.tbl{touch-action:manipulation}

/* ==========================================================================
   RAHMENMODUS (T-17) — dieselbe Seite, eingebettet im Einrichtungs-Wizard.

   Der Wizard zeigt die ECHTE Einstellungs-Sektion in einem <iframe>, statt
   eigene Formulare zu bauen (Regelwerk `wizard-rahmen-zeigt-die-echte-
   sektion`). Hier wird nur ausgeblendet, was im Rahmen doppelt wäre:
   Kopfzeile und Sektions-/Sichtenleiste. Kein Verhalten ändert sich —
   was im Rahmen nicht geht, geht daneben auch nicht.

   Die Klasse setzt `js/rahmen.js` am <html>-Element, noch bevor der Körper
   gezeichnet wird; deshalb blitzt nichts auf.
   ========================================================================== */
.im-rahmen .topbar,
.im-rahmen .topbar-sub,
.im-rahmen [data-sektionsnav],
.im-rahmen .sichten-leiste { display:none !important; }
/* Die Seitenaufteilung rechnet mit Kopfzeile und fester Bildschirmhöhe. Im
   Rahmen gibt es beides nicht: Der Rahmen ist so hoch wie sein Inhalt, sonst
   entstünde eine zweite Bildlaufleiste in der Seite. */
.im-rahmen .seite { display:block; height:auto; }
.im-rahmen .seiten-inhalt { overflow:visible; height:auto; padding:0; }
.im-rahmen body { background:transparent; }
.im-rahmen .settings { padding-top:0; }
/* Eine im Rahmen gezeigte Karte braucht ihren eigenen Rand nicht mehr — der
   Wizard rahmt bereits. */
.im-rahmen .section-card { border:0; padding-left:0; padding-right:0; margin-top:0; }

/* Ganztaegige Abwesenheit (krank/Urlaub/Feiertag) in der Zeitenliste.
   Michael, 28.08.2026: "Nur muss die Krankheits Info anders dargestellt
   werden. Ist ja ganztaegig." Kein Zeitraum, keine Stundenzahl - deshalb
   ruhiger gesetzt als eine Arbeitszeile, damit man beim Ueberfliegen sieht:
   hier wurde nichts gemessen. */
tr.abwesenheit-zeile td{background:var(--card-2);font-style:italic}
tr.abwesenheit-zeile .badge{font-style:normal}


/* ===================== Die Lupe und ihr Suchfenster =====================
   Michael, 28.08.2026: "Zwei Suchfelder auf jeder Seite ist absolut nicht
   akzeptabel. [...] So eine Suche koennte ueber eine Lupe neben der Hilfe
   integriert werden." Ein Zugang statt zwei - und er sitzt dort, wo die
   anderen globalen Knoepfe sitzen. */
button.nav-lupe{
  padding:var(--s-2) var(--s-3);font-size:var(--t-5);line-height:1;margin-left:6px;
  border:1px solid var(--line-2);background:transparent
}
button.nav-lupe:hover{background:var(--card-2);border-color:var(--accent-border)}

.such-overlay{
  position:fixed;inset:0;z-index:900;background:var(--schleier);
  display:flex;align-items:flex-start;justify-content:center;padding-top:9vh
}
.such-panel input[type=search]{
  width:100%;padding:var(--s-4) var(--s-4);font-size:var(--t-5);border:0;border-bottom:1px solid var(--line);
  background:transparent;color:var(--fg);outline:none
}
.such-liste{overflow-y:auto;padding:var(--s-2) 0}
.such-kopf{
  display:flex;justify-content:space-between;align-items:baseline;
  padding:var(--s-2) var(--s-4) var(--s-1);font-size:var(--t-1);text-transform:uppercase;
  letter-spacing:.07em;color:var(--muted);font-weight:600
}
.such-kopf .such-zahl{font-weight:400;letter-spacing:0;text-transform:none;font-size:var(--t-2)}
.such-zeile{
  display:block;padding:var(--s-2) var(--s-4);text-decoration:none;color:var(--fg);border-left:2px solid transparent
}
.such-zeile:hover,.such-zeile.aktiv{background:var(--card-2);border-left-color:var(--accent)}
.such-zeile .such-titel{display:block;font-size:var(--t-4);font-weight:600}
.such-zeile .such-unter{display:block;font-size:var(--t-2);color:var(--muted);margin-top:1px}
.such-fuss{
  display:flex;justify-content:space-between;align-items:center;gap:var(--s-3);
  padding:var(--s-2) var(--s-4);border-top:1px solid var(--line);font-size:var(--t-2);color:var(--muted)
}
.such-fuss a{color:var(--accent);text-decoration:none}
.such-fuss a[hidden]{display:none}

/* Trefferliste der globalen Suche */
.such-gruppe{margin-bottom:22px}
.such-gruppe h3{display:flex;align-items:baseline;gap:var(--s-2);margin:0 0 var(--s-2)}
.such-gruppe h3 .anzahl{font-size:var(--t-2);color:var(--muted);font-weight:400}
.such-treffer{display:block;padding:var(--s-2) var(--s-3);border:1px solid var(--line);border-radius:var(--r-inner);
  margin-bottom:6px;text-decoration:none;color:var(--fg);background:var(--card)}
.such-treffer:hover{border-color:var(--accent-border);background:var(--card-2)}
.such-treffer .titel{font-weight:600;font-size:var(--t-4)}
.such-treffer .unter{font-size:var(--t-3);color:var(--muted);margin-top:2px}
.such-treffer .datum{float:right;font-size:var(--t-2);color:var(--muted);font-variant-numeric:tabular-nums}
.such-mehr{font-size:var(--t-3);color:var(--muted);margin:var(--s-1) 0 0}

/* Mitarbeiter-Auswertung: Tage mit einem ArbZG-Hinweis fallen auf.
   Ein System, das 13-Stunden-Tage kommentarlos summiert, sieht aus wie ein
   Nachweis und ist in Wahrheit die Dokumentation eines Verstosses. */
tr.warn-zeile td{background:var(--warn-bg)}
tr.warn-zeile td:first-child{box-shadow:inset 2px 0 0 var(--warn)}
/* Dasselbe eine Stufe schaerfer: die Zeile ist nicht auffaellig, sondern
   ueberfaellig. Als BAUSTEIN neben warn-zeile angelegt (03.09.2026,
   Zahlungstermine) — eine ueberfaellige Zeile gibt es auch anderswo, und
   die naechste Stelle soll sie nicht erneut erfinden. */
tr.bad-zeile td{background:var(--bad-bg)}
tr.bad-zeile td:first-child{box-shadow:inset 2px 0 0 var(--bad)}

/* Filterraster (28.08.2026).
   Michael: "Das ganze Raster ist irgendwie nicht stimmig. Ich habe mal ein
   paar Linien reingelegt, um das aufzuzeigen." Er hatte recht - der Block war
   eine Flex-Zeile, in der jedes Feld seine eigene min-width trug. Wo ein Feld
   landete, hing damit von der Fensterbreite ab, und zwei Zeilen untereinander
   hatten nie dieselben Spalten.
   Jetzt: EIN Raster fuer alle Felder, feste Spaltenbreite, Rest verteilt. */
.filter-raster{
  display:grid;grid-template-columns:repeat(auto-fill,minmax(175px,1fr));
  gap:var(--s-3) var(--s-3);align-items:end;margin-bottom:4px
}
.filter-raster label{margin:0;display:block;min-width:0}
.filter-raster input,.filter-raster select{width:100%}

/* Die Aktionszeile sitzt auf demselben linken Rand wie das Raster, die Bilanz
   rechtsbuendig - vorher schob ein `flex:1`-Platzhalter sie irgendwohin. */
.filter-aktionen{
  display:flex;gap:var(--s-3);flex-wrap:wrap;align-items:center;
  justify-content:space-between;margin-top:14px
}
.filter-aktionen .knopfgruppe{display:flex;gap:var(--s-3);flex-wrap:wrap}


/*
 * EIN WERKTAG OHNE JEDE ANGABE. Michael, 27.08.2026: „Einfach fehlend ohne
 * Grund wäre auch nicht gut. Das müsste sogar hervorgehoben werden."
 *
 * Kräftiger als `warn-zeile`: Ein ArbZG-Hinweis beschreibt einen Tag, der
 * erfasst wurde; hier fehlt der Tag. Der linke Balken macht ihn auch dann
 * auffindbar, wenn die Tabelle lang ist und niemand die Hinweisspalte liest.
 */
tr.fehl-zeile > td {
  background: color-mix(in srgb, var(--bad) 12%, transparent);
}
tr.fehl-zeile > td:first-child {
  box-shadow: inset 3px 0 0 var(--bad);
  font-weight: 600;
}

/* ===================== Stempeluhr als eigene Seite (28.08.2026) ===========
 *
 * Michael: „Einfach eine Seite, wo man stempelt ohne die ganzen Listen."
 * Deshalb mittig und großzügig statt in einer Karte: Die Seite hat genau eine
 * Aufgabe, und die Uhr ist das, was man im Vorbeigehen liest.
 */
/*
 * DIE ERFASSUNGSZEILE — eine Maske, die in eine Kopfzeile passt.
 *
 * Michael, 28.08.2026: „Wieso ist der Tagesrapport unter heute? Und warum
 * ueberhaupt vorhanden? Ich kann das doch in der Liste nachtragen."
 *
 * Damit das geht, muss die Eingabe DAUERHAFT sichtbar sein, ohne die Liste
 * darunter zu erdruecken. Deshalb sitzen die Beschriftungen als kleine
 * Grossbuchstaben UEBER den Feldern statt daneben: Eine Zeile mit neun Feldern
 * und neun danebenstehenden Woertern liest niemand mehr, und ohne Beschriftung
 * raet man beim dritten Datumsfeld.
 */
.erfass-zeile{
  display:flex; align-items:flex-end; gap:var(--s-3); flex-wrap:wrap;
  margin-top:10px; padding:var(--s-3) var(--s-3);
  background:var(--card-2); border:1px solid var(--line); border-radius:var(--r-card);
}
.erfass-zeile label{
  display:flex; flex-direction:column; gap:var(--s-1); margin:0;
  font-size:var(--t-1); text-transform:uppercase; letter-spacing:.4px; color:var(--muted);
  font-weight:600;
}
.erfass-zeile input, .erfass-zeile select{ margin:0; }
/*
 * DECKEL FUER DIE AUSWAHLFELDER. Michael, 28.08.2026: „Je nachdem was gewaehlt
 * wird, wird die Zeile umgebrochen und die Buttons erscheinen darunter."
 *
 * Ein <select> ist von sich aus so breit wie seine LAENGSTE Option — und eine
 * Auftragsposition heisst „AU-2026-10276 · Konstruktion Hebegeraet (12,50 /
 * 40,00)". Damit sprengt ein einziger Eintrag die Zeile, und die Knoepfe
 * rutschen darunter. `min-width:0` am Label erlaubt das Schrumpfen (Flex-Kinder
 * schrumpfen sonst nicht unter ihre Inhaltsbreite), der Deckel begrenzt nach
 * oben. Aufgeklappt zeigt das Feld weiterhin den ganzen Text.
 */
.erfass-zeile label{ min-width:0; }
.erfass-zeile select{ width:100%; text-overflow:ellipsis; }
/* Die Knoepfe bleiben zusammen und am Ende — nie einer oben, einer unten. */
.erfass-zeile .knopfgruppe{ margin-left:auto; align-self:flex-end; }
.erfass-zeile button{ align-self:flex-end; white-space:nowrap; }

/* Die Erklaerung UNTER der Zeile, nicht in einem Tooltip: Was man raten muss,
   wird falsch bedient. Klein, aber lesbar — sie steht nur einmal da. */
.erfass-hinweis{
  margin:var(--s-2) var(--s-1) 0; font-size:var(--t-2); line-height:1.55; color:var(--muted);
}
.erfass-hinweis b{color:var(--fg);font-weight:600}

/* Eine Knopfgruppe gibt es jetzt auch in der Werkzeugleiste, nicht nur unter
   den Filtern — dieselbe Optik an beiden Orten. */
.knopfgruppe{display:flex;gap:var(--s-2);flex-wrap:wrap}

/* Ein zweiter Block IM Koerper (z. B. „Abrechnen" unter den Fahrten): abgesetzt
   durch eine Linie, nicht durch eine zweite Karte. */
.unterblock{margin-top:26px;padding-top:18px;border-top:1px solid var(--line)}
.unterblock h3{margin:0 0 var(--s-3)}

/* Der Verweis auf die Stempeluhr steht als LINK in der Sichten-Leiste — er
   soll aussehen wie ein Eintrag, aber nie als „aktiv" leuchten. */
a.sicht-eintrag{text-decoration:none}

#stempelSeite { padding:34px var(--s-5) 40px; display:flex; flex-direction:column; align-items:center; gap:var(--s-5); }
/* DER KOPF DER STEMPELUHR. Michael, 28.08.2026: „Im Moment wird riesig
   angezeigt, wie lange schon gearbeitet wird, das ist aber unwichtig."
   Gross steht deshalb, WAS gilt (Projekt · Tätigkeit); die Uhrzeit steht
   daneben, weil sie Orientierung ist und nicht der Inhalt der Seite; und
   „seit 07:15 · 3:42 h" steht klein darunter.

   Frühere Fassung: eine 62-px-Dauer als beherrschendes Element. Sie machte die
   unwichtigste Zahl zur grössten. */
.stempel-stand {
  /* DIESELBE BREITE wie die Karte darunter (`.stempel-feld`). Ohne sie zieht
     der Seitenbereich den Block auf seine Inhaltsbreite zusammen und zentriert
     ihn — Status und Formular standen dann auf verschiedenen Kanten.
     (Befund Michael, 28.08.2026: „Die Formatierung ist nicht sehr schön.") */
  width:min(620px,100%);
  display:flex; align-items:baseline; justify-content:space-between;
  gap:var(--s-4); flex-wrap:nowrap; text-align:left;
}
.stempel-was { min-width:0; flex:1 1 auto; overflow-wrap:anywhere; }
.stempel-uhr { flex:none; }
.stempel-was b { display:block; font-size:var(--t-6); line-height:1.3; }
/* DER STATUS TRAEGT FARBE. Michael, 28.08.2026: „Und ich würde allenfalls das
   eingestempelt in Farbe machen und ausgestempelt auch?"

   Zwei Zustände, zwei Farben — grün heisst „läuft", gelb heisst „läuft nicht".
   Das ist die Frage, die man am Handy im Vorbeigehen stellt, und sie soll ohne
   Lesen beantwortet sein. Gelb und nicht rot: Nicht gestempelt zu sein ist kein
   Fehler, nur ein anderer Zustand. */
.stempel-was b{color:var(--fg)}
/* Nur der ZUSTAND traegt die Farbe, nicht jedes Etikett: „TAETIGKEIT" bleibt
   grau, sonst wird das Gruen zur Dekoration und sagt nichts mehr. */
.stempel-stand.laeuft #stempelMarke{color:var(--accent)}
.stempel-stand.aus .stempel-was b{color:var(--warn)}
.stempel-marke{display:block;font-size:var(--t-1);font-weight:600;letter-spacing:.09em;
  text-transform:uppercase;color:var(--muted);margin-top:8px}
.stempel-marke:first-child{margin-top:0}
.stempel-was #stempelTun { display:block; font-size:var(--t-5); font-weight:500; }
.stempel-was #stempelTun:empty { display:none; }
.stempel-was span { font-size:var(--t-3); }
.stempel-uhr {
  font:650 30px/1 ui-monospace,SFMono-Regular,Menlo,monospace;
  font-variant-numeric:tabular-nums; color:var(--accent); letter-spacing:-.01em;
}
/* `--muted` statt `--subtle` (05.10.2026, Klicktest Ablauf 45, Bild 16-04): Die stehende Uhr („--:--“) in der
   Kopfleiste von Mercofina GO lag bei 3,27 : 1 (WCAG 1.4.3 verlangt 4,5 : 1) — wie die Kopfzeilen der Bankverbuchung
   (Ablauf 40). Die Regel stand zweimal da; die zweite Zeile ist weg. */
.stempel-uhr.still { color:var(--muted); }
/* In der Kopfleiste ist die Uhr Beiwerk, nicht Hauptsache: kleiner, und ohne
   den Statusblock zu verlassen, in dem sie am Schreibtisch steht. */
.stempel-uhr.stempel-uhr-oben{font-size:var(--t-6);margin-left:14px}
/* Und dann gehoert die ganze Zeile dem Status. */
body[data-schale="mercofinago"] .stempel-stand{display:block}
.stempel-was b { display:block; font-size:var(--t-5); }
.stempel-was span { font-size:var(--t-3); }
.stempel-feld {
  width:min(620px,100%); background:var(--card); border:1px solid var(--line);
  border-radius:var(--r-card); padding:var(--s-4);
}
.stempel-feld label { margin-top:0; }
.stempel-vorschlaege { width:min(620px,100%); }
.stempel-vorschlaege-titel {
  font-size:var(--t-1); font-weight:600; letter-spacing:.1em; text-transform:uppercase;
  color:var(--muted); margin-bottom:9px;
}
/* Michael, 28.08.2026: „Ich glaube der Überstand kommt aus der Projektauswahl
   Kurzwahl und nicht wegen der Uhr selbst." Er hatte recht, und die Ursache
   stand hier: Eine Kachel ist Flex-Element in einer umbrechenden Zeile und
   damit von sich aus so breit wie ihr längster Inhalt. Ihr Text ist die
   Tätigkeit plus die Projektbezeichnung — bei echten Projektnamen reicht EINE
   Kachel, um die ganze Seite aufzuschieben. Mit Testdaten fällt das nicht auf,
   weil dort die Namen kurz sind; gefunden hat es Michael am Telefon.
   `max-width` deckelt die Kachel, `min-width:0` hebt die Flex-Mindestbreite
   auf (sonst bleibt sie so breit wie ihr längstes WORT), und
   `overflow-wrap:anywhere` bricht auch eine Projektnummer ohne Leerzeichen. */
.stempel-kachel {
  display:flex; flex-direction:column; gap:var(--s-1); text-align:left;
  background:var(--card-2); border:1px solid var(--line); border-radius:var(--r-inner);
  padding:var(--s-2) var(--s-3); cursor:pointer; color:var(--fg); font:inherit; font-weight:400;
  max-width:100%; min-width:0; overflow-wrap:anywhere;
  /* GLEICH BREIT, eine je Zeile. Michael, 28.08.2026: „Die Formatierung ist
     nicht sehr schön, weil die Projekt Kürzel unterschiedlich breit sind."
     Die Kacheln waren Flex-Elemente nach Inhaltsbreite — bei Projektnamen von
     fünf bis fünfzig Zeichen ergab das eine ausgefranste Kante. Am Schreibtisch
     (ab 620 px) dürfen wieder mehrere nebeneinander stehen, dort ist Platz. */
  flex:1 1 100%;
  /* DIE EIGENTLICHE URSACHE: Die globale Knopf-Regel (`button, a.btn`)
     setzt `white-space:nowrap`. Eine Kachel IST ein Knopf und konnte
     deshalb gar nicht umbrechen — `overflow-wrap` allein blieb wirkungslos.
     Gemessen: das <b> mit dem Projektnamen 378 px in einer 318-px-Kachel. */
  white-space:normal;
}
/* Und die Kinder ebenso: Ein Flex-Element ist von sich aus mindestens so
   breit wie sein Inhalt, und `overflow-wrap` greift erst, wenn die Box
   ueberhaupt schmaler werden DARF. Ohne diese Zeile bleibt das <b> mit dem
   langen Projektnamen 365 px breit — gemessen. */
.stempel-kachel > * { min-width:0; }
@media (min-width:620px){
  .stempel-kachel{flex:0 1 calc(50% - 4px);}
}
/* Was heute gebucht ist — eine Zeile je Buchung, Zeitspanne links, Dauer
   rechts. Bewusst schlichter als die Kurzwahl darunter: Das hier ist eine
   Auskunft, kein Knopf. */
.stempel-zeile{
  display:flex; align-items:baseline; gap:var(--s-3); padding:var(--s-2) var(--s-1);
  border-bottom:1px solid var(--line); font-size:var(--t-3);
}
.stempel-zeile:last-child{border-bottom:0}
/* Die Tagesueberschrift traegt den Tag EINMAL — in jeder Zeile frass er die
   Breite, die der Projektname braucht. */
.stempel-tag{
  font-size:var(--t-1); font-weight:600; letter-spacing:.06em; text-transform:uppercase;
  color:var(--muted); margin:var(--s-3) 0 var(--s-1);
}
.stempel-tag:first-child{margin-top:0}
/* FESTE BREITE, damit der Text ueberall an derselben Stelle beginnt. Michael,
   29.08.2026: „die erste Zeit ist versetzt, weil sie noch kein Ende hat. Das
   gehoert ausgerichtet." Eine laufende Zeile heisst „19:17–…" und ist damit
   kuerzer als „13:17–19:17" — ohne feste Breite ruecken beide Nachbarn mit. */
.stempel-zeile .z-zeit{
  font-variant-numeric:tabular-nums; color:var(--muted);
  flex:none; width:7.4em; white-space:nowrap;
}
/* EINE Zeile je Buchung. Projekt und Taetigkeit zusammen brechen sonst auf drei
   Zeilen um, und aus „den letzten paar Stempelungen" wird eine Wand. Wer den
   vollen Text braucht, findet ihn am Schreibtisch in der Zeiten-Liste. */
.stempel-zeile .z-was{
  flex:1; min-width:0;
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}
/* FESTE BREITE auch rechts, aus demselben Grund. Michael, 29.08.2026:
   Rechts ist jetzt noch dasselbe, wenn dort laeuft steht, ist der Projekt
   Text verschoben.

   Das Wort laeuft ist schmaler als 01:30, und weil die mittlere Spalte den
   Rest fuellt, wandert mit der Dauer auch die Stelle, an der der Projektname
   gekappt wird. Rechtsbuendig, damit die Ziffern untereinander stehen. */
.stempel-zeile .z-dauer{
  font-variant-numeric:tabular-nums; color:var(--muted);
  flex:none; width:3.4em; text-align:right;
}
.stempel-zeile.laeuft .z-zeit,
.stempel-zeile.laeuft .z-dauer{color:var(--accent)}
.stempel-kachel:hover { border-color:var(--accent-border); background:var(--card-3); }
.stempel-kachel b { font-size:var(--t-4); font-weight:600; }
.stempel-kachel span { font-size:var(--t-2); }
#stempelSeite #vergessen { width:min(620px,100%); }

/* ============================================================================
   SCANNEN — Kamerabild und Rueckmeldung (`frontend/js/scannen.js`).
   Regelwerk `scannen-ist-ein-baustein`, Michael 29.08.2026.

   Steht hier und nicht in mercofinago.css, weil beide Seiten scannen: die
   Inventur am Schreibtisch wie im Lager, und die Handy-Schale beim Picken.
   Zwei Fassungen desselben Overlays waeren genau die Doppelung, die der
   Baustein vermeidet.
   ========================================================================== */
.scan-overlay{
  position:fixed; inset:0; z-index:300;
  display:flex; flex-direction:column; align-items:center; justify-content:center; gap:var(--s-4);
  background:var(--schleier-stark);
  padding:var(--s-4); padding-bottom:max(16px,env(safe-area-inset-bottom));
}
.scan-bild{position:relative; width:min(96vw,640px); line-height:0}
.scan-bild video{width:100%; border-radius:var(--r-card); background:var(--kamera)}
/* Das Fenster ist eine Zielhilfe, kein Ausschnitt: gelesen wird das ganze
   Bild. Wer den Code hineinhaelt, haelt ihn mittig und nah genug. */
.scan-fenster{
  position:absolute; left:8%; right:8%; top:32%; bottom:32%;
  border:2px solid var(--accent); border-radius:var(--r-inner);
  box-shadow:0 0 0 100vmax var(--schleier);
}
.scan-zeile{
  font-size:var(--t-4); line-height:1.45; text-align:center; color:var(--fg);
  max-width:min(96vw,640px); min-height:2.6em;
}
.scan-zeile.ok{color:var(--ok)}
.scan-zeile.warn{color:var(--warn)}
.scan-zeile.bad{color:var(--bad)}
.scan-knoepfe{display:flex; gap:var(--s-3)}
.scan-overlay .scan-zu,
.scan-overlay .scan-lampe{
  padding:var(--s-3) var(--s-5); min-height:46px; border-radius:var(--r-card);
  font:600 15px/1 inherit; cursor:pointer; white-space:nowrap;
}
.scan-overlay .scan-lampe{background:transparent; border:1px solid var(--line-2); color:var(--fg)}
.scan-overlay .scan-zu{background:var(--accent); border:0; color:var(--auf-akzent)}

/* Die Rueckmeldeleiste: sie erscheint auch OHNE Kamerabild — der Handscanner
   hat keines. Oben, nicht unten: unten steht am Handy die Reiterleiste, und
   die Hand haelt das Geraet dort.

   UNTERHALB DER KOPFZEILE, nicht darueber: Sie stand zuerst ganz oben und hat
   die Auftragsnummer verdeckt — beim Picken ist das genau die Zeile, an der
   man sich vergewissert, im richtigen Auftrag zu sein.
   DECKEND, nicht getoent: Der Zustand kommt ueber Rand und Schriftfarbe. Eine
   10-%-Flaeche laesst den Text darunter durchscheinen, und die Antwort auf
   einen Scan liest man im Vorbeigehen oder gar nicht. */
.scan-echo{
  position:fixed; left:50%; transform:translateX(-50%) translateY(-8px);
  top:calc(58px + env(safe-area-inset-top)); z-index:320;
  max-width:min(92vw,560px);
  padding:var(--s-3) var(--s-4); border-radius:var(--r-card);
  font-size:var(--t-4); line-height:1.4; text-align:center;
  background:var(--card-2); color:var(--fg);
  border:1px solid var(--line-2); box-shadow:var(--shadow-md);
  opacity:0; pointer-events:none;
  transition:opacity .16s ease, transform .16s ease;
}
.scan-echo.sichtbar{opacity:1; transform:translateX(-50%) translateY(0)}
.scan-echo.ok{border-color:var(--ok-bdr); color:var(--ok)}
.scan-echo.warn{border-color:var(--warn-bdr); color:var(--warn)}
.scan-echo.bad{border-color:var(--bad-bdr); color:var(--bad)}
/* Liegt das Kamerabild darueber, gehoert die Leiste ueber das Bild — sonst
   liest man die Antwort nicht, waehrend man den naechsten Code sucht. */
.scan-overlay ~ .scan-echo{z-index:330}

/* GRUPPENKOEPFE IN TABELLEN (29.08.2026). Michael: „Ich will Einheitlichkeit
   ueber alles. Die gleiche Quelle fuer das gleiche." Die nach Tagen gruppierte
   Zeitenliste war von Hand gebaut, weil der Tabellenmotor nur flache Listen
   kannte — jetzt kann er beides, und das Aussehen steht an EINER Stelle. */
tr.tbl-gruppe > td{
  background:var(--card-2); font-weight:600; font-size:var(--t-2);
  letter-spacing:.04em; color:var(--muted);
  padding:var(--s-2) var(--s-3); border-top:1px solid var(--line);
}
tr.tbl-gruppe:first-child > td{border-top:0}
tr.tbl-gruppe .g-summe{float:right; font-variant-numeric:tabular-nums; color:var(--fg)}

/* ============================================================================
   ÜBERGABE AM TRESEN (`abholware-traegt-ihr-etikett`, 29.08.2026).
   Die Liste, an der Kunde und Verkaeufer gemeinsam durchgehen, was in der
   Kiste liegt — grosse Zeilen, weil zu zweit auf einen Schirm geschaut wird.
   ========================================================================== */
.uebergabe-liste{display:flex;flex-direction:column;gap:var(--s-1);max-height:52vh;overflow-y:auto}
.uebergabe-zeile{
  display:flex;align-items:center;gap:var(--s-3);
  padding:var(--s-2) var(--s-3);border:1px solid var(--line);border-radius:var(--r-inner);background:var(--card);
  cursor:pointer;
}
.uebergabe-zeile:hover{border-color:var(--accent-border)}
.uebergabe-zeile input{width:19px;height:19px;flex:none;accent-color:var(--accent)}
.uebergabe-zeile .menge{font-variant-numeric:tabular-nums;font-weight:600;min-width:2.6em}
.uebergabe-zeile .txt{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px;font-size:var(--t-4)}
.uebergabe-zeile .txt .muted{font-size:var(--t-2)}
/* Gesperrt heisst: liegt NICHT in der Kiste und geht nicht mit. Das muss man
   sehen, bevor man den Karton ueber den Tresen schiebt. */
.uebergabe-zeile.gesperrt{border-color:var(--bad-bdr);background:var(--bad-bg);cursor:not-allowed}
.uebergabe-zeile:has(input:checked){border-color:var(--ok-bdr);background:var(--ok-bg)}

/* Der PLATZ-CODE (`der-pickcode-verbindet-ware-und-auftrag`, 29.08.2026).
   Michaels Frage war „wo finde ich, welchen Code seine Ware hat?" — die
   Antwort steht in der Abholliste, und sie muss quer ueber den Tresen
   vorlesbar sein. Deshalb monospace mit Sperrung: P-007 und P-OO7
   verwechselt man sonst genau dann, wenn es eilig ist. */
.platz-code{
  font-family:ui-monospace,"Cascadia Mono","SF Mono",Consolas,monospace;
  font-size:var(--t-4); font-weight:700; letter-spacing:.06em;
  color:var(--accent); white-space:nowrap;
}

/* DAS MOEBELBILD (`ein-lagerplatz-sagt-wo-die-ware-liegt`, 11.09.2026).
   Michael: „Was wir auch brauchen ist eine Verwaltung, wo wir Schraenke und
   Regale anlegen koennen und am besten auch grafisch darstellen."

   Ein Regal wird als STAPEL seiner Faecher gezeichnet, das oberste zuerst —
   so wie man davorsteht. Kein Massstab: Die Anordnung muss wiedererkennbar
   sein, nicht vermessen. Die seitlichen Streben machen aus der Liste ein
   Moebel; ohne sie sieht ein Regal aus wie eine Aufzaehlung.

   Der Kasten selbst benutzt den Karten-Baustein (Rahmen, Radius, Farbe) und
   setzt nur, was ein Fach von einer Karte unterscheidet: die Hoehe und die
   dreispaltige Aufteilung Name / Code / Erlaubnisse. */
.moebel-bild{
  display:flex; flex-direction:column; gap:2px;
  border-left:3px solid var(--line); border-right:3px solid var(--line);
  padding:var(--s-2); border-radius:var(--r-card); background:var(--card-2);
}
.moebel-bild.leer{
  align-items:center; text-align:center; padding:var(--s-5); font-size:var(--t-2);
}
/* Ein Fach ist ein <button>, aber es soll nicht wie einer AUSSEHEN — es ist
   eine Flaeche im Regal. Deshalb bekommt es die Textfarbe der Seite: Ohne sie
   erbt es die gedaempfte Schrift des Nebenknopfes, und der Fachname stand im
   ersten Bildlauf (12.09.2026) fast unsichtbar auf dunklem Grund. */
.moebel-fach{
  display:grid; grid-template-columns:1fr auto auto; align-items:center; gap:var(--s-3);
  width:100%; min-height:44px; text-align:left; color:var(--fg);
  background:var(--card); border:1px solid var(--line); border-radius:var(--r-inner);
  padding:var(--s-2) var(--s-3); cursor:pointer;
}
.moebel-fach:hover{border-color:var(--accent)}
.moebel-fach.aktiv{border-color:var(--accent); box-shadow:inset 0 0 0 1px var(--accent)}
.moebel-fach-name{font-weight:600; overflow:hidden; text-overflow:ellipsis; white-space:nowrap}
.moebel-fach-inhalt{display:flex; gap:var(--s-1); flex-wrap:wrap; justify-content:flex-end}
/* FAECHER IM FACH (13.09.2026): „Regal › Boden 3 › Kiste 2" — jede Ebene rueckt
   ein Stueck ein, damit man sieht, was worin steckt. Vier Stufen aus der Skala
   statt einer im JavaScript ausgerechneten Zahl; tiefer wird nicht mehr
   eingerueckt, sonst steht das Fach am rechten Rand. */
.mf-t0{margin-left:0}
.mf-t1{margin-left:var(--s-4)}
.mf-t2{margin-left:var(--s-5)}
.mf-t3{margin-left:var(--s-6)}

/* DER RAUMPLAN (`der-raumplan-sortiert-den-laufweg`, 12.09.2026).
   Michael: „Was wirklich richtig toll waere, waere der Raumplan."

   KEIN MASSSTAB und kein 3D: Rechtecke auf einem Raster, gedreht in
   90-Grad-Schritten. Der Zweck ist der LAUFWEG — aus der Anordnung ergibt
   sich die Reihenfolge, in der die Pickliste sortiert. */
.raumplan{border:1px solid var(--line); border-radius:var(--r-card); background:var(--card-2)}
.plan-boden{fill:var(--card)}
.plan-raster{stroke:var(--line-2); stroke-width:.5}
/* Die Tuer ist der Anfang des Laufwegs, deshalb traegt sie die Akzentfarbe —
   sie ist kein Moebel, sondern der Nullpunkt der Rechnung. */
.plan-tuer{fill:var(--accent)}
.plan-tuer-text{fill:var(--muted); font-size:9px}
.plan-moebel{cursor:grab}
/* Zwei Bildpunkte Kontur, nicht einer: Ein Raum im Gebaeudeplan ist eine
   grosse, fast farblose Flaeche — mit haarfeiner Linie verschwamm er mit dem
   Boden (gefunden im eigenen Bildlauf am 13.09.2026). */
.plan-moebel rect{stroke:var(--line-2); stroke-width:2}
.plan-moebel.aktiv rect{stroke:var(--accent); stroke-width:3}
.plan-name{fill:var(--fg); font-size:10px; font-weight:700; text-anchor:middle}
/* Die Nummer sagt, das WIEVIELTE Moebel auf dem Weg es ist — dieselbe
   Reihenfolge wie in der Liste daneben und auf dem Pickzettel. */
.plan-nr{fill:var(--muted); font-size:9px; text-anchor:middle}

/* EINE ARBEITSLISTE MIT INHALT sieht man, ohne zu suchen
   (`entnahme-wird-gescannt-oder-gemeldet`, 12.09.2026). Nur der Zaehler wird
   betont, nicht die ganze Zeile: Ein rot leuchtender Eintrag neben vier ruhigen
   liest sich als Fehler, dabei ist es Arbeit. */
.sicht-eintrag.hat-arbeit .sicht-zaehler{background:var(--info-bg); color:var(--info); font-weight:700}

/* Die drei Ebenen des Platzbaums: Raum, Moebel, Fach. Genau drei Klassen
   statt einer im JavaScript ausgerechneten Pixelzahl — die Kette ist nicht
   beliebig tief, also braucht sie auch keine Formel. */
.lp-tiefe-0{padding-left:var(--s-3); text-align:left; width:100%}
.lp-tiefe-1{padding-left:var(--s-5); text-align:left; width:100%}
.lp-tiefe-2{padding-left:var(--s-6); text-align:left; width:100%}

/* ===================== Untertitel innerhalb einer Karte ==================
 * "Gefahrenhinweis anlegen", "Eigene Artikelart anlegen", "Begriffsgruppen":
 * derselbe Baustein, fuenfmal — und fuenfmal derselbe Inline-Stil
 * `margin:18px 0 6px` (Audit-Durchgang 14, 30.08.2026). Der Abstand gehoert
 * zur ROLLE, nicht zur Ebene: er stand woertlich gleich an einem h3 wie an
 * vier h4.
 *
 * ZWEI DINGE AN DIESER REGEL SIND ABSICHT:
 *
 *   1. Sie steht am ENDE der Datei, und der Elementname steht mit im
 *      Selektor. Der Inline-Stil vorher schlug jede Regel; eine blosse Klasse
 *      tut das nicht. `.section-card h4` (Zeile 463) und `.settings h3`
 *      (Zeile 517) sind spezifischer als `.abschnitt-titel` allein und haetten
 *      gewonnen — die Abstaende waeren stillschweigend andere geworden.
 *      `h4.abschnitt-titel` wiegt gleich schwer und gewinnt durch die
 *      spaetere Position.
 *   2. Die Ebene bleibt vorerst, wie sie ist. Dass sie nach der gewuenschten
 *      GROESSE gewaehlt wurde statt nach der Gliederung, ist ein eigener
 *      Befund (F4-2) und wird in Durchgang 11 aufgeloest. Diese Klasse ist die
 *      Stelle, an der das dann EINMAL passieren kann.
 */
/* Das Aussehen ist NICHT frei gewaehlt: Es ist genau das, was `.settings h3`
   (Zeile 517) den 28 anderen Untertiteln der Einstellungsseite gibt. Vor dem
   30.08.2026 standen dort 37 Untertitel in ZWEI Aussehen — 28 gedaempft ueber
   jene Regel, 9 hell ueber `.section-card h4`. Beide Male dieselbe Rolle.
   Die Minderheit schliesst zur Mehrheit auf, nicht umgekehrt: So aendern sich
   neun Ueberschriften statt achtundzwanzig. */
h2.abschnitt-titel,h3.abschnitt-titel,h4.abschnitt-titel{margin:var(--s-4) 0 var(--s-2);font-size:var(--t-4);color:var(--muted)}


/* ===========================================================================
 * SEITENSTILE — bis zum 30.08.2026 in <style>-Bloecken der einzelnen Seiten
 * ===========================================================================
 *
 * Michael, 30.08.2026: „Styles an 3 verschiedenen Orten ist auch unschoen und
 * als Befund zu werten, oder etwa nicht? … Waere es nicht moeglich, alle
 * sonstigen ueber eine Klasse zu steuern? Also Mercofina ueber ein Stylesheet zu
 * verwalten?"
 *
 * Neun Seiten hielten zusammen 252 Regeln in eigenen <style>-Bloecken. Zweimal
 * hat mich diese Verstreuung an einem einzigen Tag zu einem falschen Urteil
 * verleitet (`.weich`, `.bvm-weg` sahen wie tote Klassen aus, weil ihre Regel
 * woanders stand). Sie stehen jetzt hier.
 *
 * WARUM AM ENDE DER DATEI: Ein <style>-Block stand im HTML NACH dem <link> auf
 * diese Datei und gewann deshalb bei gleicher Spezifitaet. Vorne eingefuegt
 * haette der Umzug diese Rangfolge stillschweigend umgedreht.
 *
 * WAS NICHT MITGEZOGEN IST: `shop/assets/shop.css` (eigener Server, eigene
 * Auslieferung) und `frontend/css/mercofinago.css` (eigene Schale fuers Handy —
 * Michael: „Mercofina GO anders macht Sinn").
 */

/* ---------------------------------------------------------------------------
 * Einrichtungs-Assistent — aus einrichtung.html
 * ------------------------------------------------------------------------- */
/* T-17 · Der Einrichtungs-Wizard.

   Michael, 22.08.2026: „Ich möchte einen echten Wizard für die Einrichtung
   haben. Der alle nötigen Bereiche durchgeht." Vorher war das hier eine
   Liste mit Links nach /settings.html#anker — danach war der Faden ab.

   Jetzt: links die Schritte in vier Phasen, rechts die ECHTE Sektion in
   einem Rahmen (Regelwerk `wizard-rahmen-zeigt-die-echte-sektion`). Es gibt
   keine zweiten Formulare; jedes Feld existiert genau einmal. */
  /* Wie .seite: unter der Kopfzeile liegt noch die Bereichszeile.
   Ohne sie in der Rechnung ragt der Fuss mit Weiter/Spaeter aus dem Bild —
   ausgerechnet die Knoepfe, um die es geht. */
.wz{display:flex;gap:0;height:calc(100vh - var(--topbar-h) - var(--subbar-h))}
.wz-liste{width:290px;flex:0 0 auto;border-right:1px solid var(--line);overflow-y:auto;
  padding:var(--s-4) 0 40px;background:var(--bg-elevated)}
.wz-kopf{padding:0 var(--s-4) var(--s-3);border-bottom:1px solid var(--line);margin-bottom:10px}
.wz-kopf h1{margin:0 0 var(--s-2);font-size:var(--t-6)}
.wz-balken{height:6px;border-radius:var(--r-pille);background:var(--card-2);overflow:hidden;margin:0 0 var(--s-2)}
.wz-balken i{display:block;height:100%;background:var(--ok);transition:width .3s}
.wz-zaehler{font-size:var(--t-2);color:var(--muted)}
.wz-phase{padding:var(--s-3) var(--s-4) var(--s-1);font-size:var(--t-1);text-transform:uppercase;letter-spacing:.07em;
  color:var(--muted);font-weight:700}
.wz-schritt{display:flex;gap:var(--s-2);align-items:flex-start;width:100%;text-align:left;
  padding:var(--s-2) var(--s-4);background:none;border:0;color:var(--fg);font-size:var(--t-4);cursor:pointer;
  border-left:3px solid transparent}
.wz-schritt:hover{background:var(--card-2)}
.wz-schritt.aktiv{background:var(--accent-dim);border-left-color:var(--accent);color:var(--accent)}
.wz-schritt .wz-haken{flex:0 0 auto;width:1.2em;text-align:center;font-size:var(--t-3)}
.wz-schritt.fertig .wz-haken{color:var(--ok)}
.wz-schritt.pflicht:not(.fertig) .wz-haken{color:var(--bad)}
.wz-schritt.spaeter{opacity:.6}

.wz-buehne{flex:1;min-width:0;display:flex;flex-direction:column}
.wz-erklaerung{padding:var(--s-4) var(--s-5) var(--s-3);border-bottom:1px solid var(--line)}
.wz-erklaerung h2{margin:0 0 var(--s-1);font-size:var(--t-6);display:flex;align-items:center;gap:var(--s-2);flex-wrap:wrap}
.wz-warum{margin:0;font-size:var(--t-4);color:var(--muted);line-height:1.6;max-width:70ch}
.wz-offen{margin:var(--s-2) 0 0;font-size:var(--t-3)}
.wz-rahmen{flex:1;min-height:0;overflow-y:auto;padding:0 var(--s-5)}
.wz-rahmen iframe{width:100%;border:0;display:block;min-height:420px}
/* Der Fuß klebt unten (Michael, 04.09.2026: „Ein Zurück Button wäre auch
   praktisch" — er war da, nur unter einer langen Sektion aus dem Bild). */
.wz-fuss{display:flex;gap:var(--s-3);align-items:center;padding:var(--s-3) var(--s-5);border-top:1px solid var(--line);
  background:var(--bg-elevated);position:sticky;bottom:0;z-index:2}
.wz-fuss .wz-luecke{flex:1}
/* Handy (Sichtprüfung 390 px, 08.09.2026): vier Elemente in einer Zeile
   machten die Seite 89 px breiter als das Fenster — die Leiste bricht um. */
@media (max-width:640px){
  .wz-fuss{flex-wrap:wrap;padding:var(--s-3) var(--s-4)}
  .wz-fuss .wz-luecke{flex:1 1 100%;display:none}
  .wz-fuss button{flex:1 1 auto}
}
/* Michael, 04.09.2026: „Das Abschluss Fenster ist nicht lesbar" — die
   Ableitungs-Tabelle quetschte sich in die 60ch-Textbreite und lief seitlich
   weg. Der Lesetext bleibt schmal, die Tabelle darf breit. */
.wz-fertig{padding:var(--s-6) var(--s-5);max-width:110ch}
.wz-fertig>p{max-width:60ch}
.wz-fertig .tbl{width:100%;margin-top:var(--s-2)}
.wz-fertig .tbl td{vertical-align:top}
.wz-fertig .tbl td:first-child{white-space:nowrap;font-weight:600}
.wz-fertig .tbl td:last-child{white-space:nowrap}

/* Frage-Schicht (Regelwerk `einrichtung-fragt-statt-zu-zeigen`): schlanke
   Frage-Karte statt der Sektion — Alltagssprache, Karten-Wahl, ein Weiter. */
.wz-frage{padding:var(--s-4) 0 var(--s-5);max-width:640px}
.wz-frage-felder{display:flex;flex-wrap:wrap;gap:var(--s-3)}
.wz-frage-label{display:block;flex:1 1 100%;font-size:var(--t-2);color:var(--muted)}
.wz-frage-label.wz-halb{flex:1 1 calc(50% - var(--s-3));min-width:220px}
.wz-frage-label input[type=text]{width:100%;box-sizing:border-box;margin-top:2px}
.wz-wahl{flex:1 1 100%;display:grid;gap:var(--s-2);min-width:0}
/* Die Wahl-Karten sind Knöpfe mit Fließtext: Sie dürfen umbrechen (globales
   button-nowrap aufgehoben) — bei 390 px machten sie die Seite 89 px breiter. */
.wz-wahl>button{white-space:normal;min-width:0;max-width:100%;text-align:left}
/* Die Wahl-Karte SITZT AUF dem ghost-Knopf-Baustein (Markup: <button
   class="ghost">) — hier stehen nur die Karten-Zutaten, keine zweite
   Knopf-Identität. */
.wz-wahl button.ghost{display:block;width:100%;text-align:left;padding:var(--s-3) var(--s-4)}
.wz-wahl button.ghost.an{border-color:var(--accent);background:var(--accent-dim)}
.wz-wahl button b{display:block;margin-bottom:2px}
.wz-wahl .wz-unter{color:var(--muted);line-height:1.35;display:block;font-weight:400}
.wz-wahl .wz-hak{float:right;color:var(--accent);font-weight:700;visibility:hidden}
.wz-wahl button.an .wz-hak{visibility:visible}
.wz-haken-zeile{display:flex;gap:var(--s-2);align-items:center;flex:1 1 100%;cursor:pointer;
  color:var(--muted);font-size:var(--t-3)}
.wz-mehr{margin:var(--s-4) 0 0;font-size:var(--t-2)}
.wz-vorschau{flex:1 1 100%;background:var(--card-2);border:1px dashed var(--line);white-space:pre-line;
  border-radius:var(--r-mittel);padding:var(--s-3) var(--s-4);
  font-family:ui-monospace,Consolas,monospace;font-size:var(--t-5)}
@media (max-width:900px){
  .wz{flex-direction:column;height:auto}
  .wz-liste{width:auto;border-right:0;border-bottom:1px solid var(--line)}
  .wz-rahmen{overflow:visible}
}

/* ---------------------------------------------------------------------------
 * Erststart — aus erststart.html
 * ------------------------------------------------------------------------- */
/* T-17 Teil 1: Die erste Seite, die ein gekauftes Mercofina zeigt. Bewusst
   karg — zwei Fragen, ein Knopf. Alles Weitere macht der Wizard, der
   direkt danach kommt. */
.es-karte{max-width:34em}
.es-schritte{display:flex;gap:var(--s-2);margin:var(--s-1) 0 var(--s-5);font-size:var(--t-3);color:var(--muted)}
.es-schritte b{color:var(--fg)}
.es-feld{margin:0 0 var(--s-4)}
.es-hinweis{font-size:var(--t-3);color:var(--muted);margin:var(--s-1) 0 0;line-height:1.5}
.es-fehler{color:var(--bad);margin:var(--s-3) 0 0;font-size:var(--t-4)}

/* ---------------------------------------------------------------------------
 * Buchhaltung — aus fibu.html
 * ------------------------------------------------------------------------- */
.bv-body{display:grid;grid-template-columns:minmax(330px,1fr) minmax(430px,1.15fr);gap:0;align-items:stretch;padding:0;overflow:hidden}
      @media(max-width:900px){.bv-body{grid-template-columns:1fr}}
      .bv-liste{overflow:auto;border-right:1px solid var(--line-2);min-height:200px}
      .bv-panel{overflow:auto;padding:var(--s-4) var(--s-4)}
      .bv-row{display:grid;grid-template-columns:52px 1fr auto;gap:var(--s-3);align-items:center;width:100%;text-align:left;border:0;border-top:1px solid var(--line-2);border-left:3px solid transparent;background:transparent;color:inherit;font:inherit;padding:var(--s-3) var(--s-4);cursor:pointer}
      .bv-row:hover{background:var(--zeile-hover)}
      .bv-row.aktiv{background:var(--zeile-aktiv);border-left-color:var(--accent)}
      .bv-row .d{color:var(--muted);font-size:var(--t-2);font-variant-numeric:tabular-nums}
      .bv-row .w{font-weight:600}
      .bv-row .z{color:var(--muted);font-size:var(--t-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;max-width:100%}
      .bv-row .a{text-align:right;font-weight:700;font-variant-numeric:tabular-nums;white-space:nowrap}
      .bv-row .a.in{color:var(--accent)}
      .bv-chip{display:inline-block;font-size:var(--t-1);font-weight:600;padding:1px var(--s-2);border-radius:var(--r-pille);border:1px solid;margin-top:3px}
      .bv-chip.rot{color:var(--bad);border-color:var(--bad-bdr);background:var(--bad-bg)}
      .bv-chip.gruen{color:var(--accent);border-color:var(--accent-border);background:var(--accent-dim)}
      .bv-ph{display:flex;justify-content:space-between;align-items:flex-start;gap:var(--s-4);margin-bottom:16px}
      .bv-ph .big{font-size:var(--t-6);font-weight:800}
      .bv-ph .sub{color:var(--muted);font-size:var(--t-3);margin-top:2px}
      .bv-ph .amt{font-size:var(--t-6);font-weight:800;font-variant-numeric:tabular-nums;text-align:right;white-space:nowrap}
      .bv-ph .amt.in{color:var(--accent)}
      .bv-zeilen{width:100%;border-collapse:collapse}
      /* Spaltenköpfe sind Text: --subtle schafft hier nur 3,09:1 (WCAG 1.4.3 verlangt 4,5:1) — gemessen am
         Handbuchbild 29-01 (Klicktest Ablauf 40, 05.10.2026). --muted hält den leisen Look (wie .sub-label). */
      .bv-zeilen th{font-size:var(--t-1);text-transform:uppercase;letter-spacing:.04em;color:var(--muted);text-align:left;padding:0 var(--s-1) var(--s-2);font-weight:600}
      .bv-zeilen td{padding:var(--s-1) var(--s-1);vertical-align:top}
      .bv-zeilen input,.bv-zeilen select{width:100%;box-sizing:border-box}
      .bv-zeilen td.betr input{text-align:right}
      .bv-addline{margin-top:6px}
      .bv-rest{display:flex;justify-content:space-between;align-items:center;margin-top:12px;padding:var(--s-2) var(--s-3);border-radius:var(--r-inner);font-weight:600}
      .bv-rest.zero{color:var(--accent);background:var(--accent-dim)}
      .bv-rest.open{color:var(--warn);background:var(--warn-bg)}
      .bv-vorschau{margin-top:14px;border:1px solid var(--line-2);border-radius:var(--r-inner);overflow:hidden}
      .bv-vorschau table{width:100%;border-collapse:collapse;font-size:var(--t-3)}
      .bv-vorschau th,.bv-vorschau td{padding:var(--s-2) var(--s-3);text-align:left}
      .bv-vorschau th{font-size:var(--t-1);text-transform:uppercase;color:var(--muted);border-bottom:1px solid var(--line-2)}
      .bv-vorschau td.n{text-align:right;font-variant-numeric:tabular-nums}
      .bv-vorschau td.k small{color:var(--muted)}
      .bv-vorschau tfoot td{border-top:1px solid var(--line-2);font-weight:700}
      /* Kontostand vorher/danach (Befund 035) — leiser als die Buchung selbst. */
      .bv-vorschau th.s,.bv-vorschau td.s{text-align:right;white-space:nowrap;font-variant-numeric:tabular-nums}
      .bv-vorschau td.s{color:var(--muted)}
      .bv-vorschau .bv-ausgeglichen{color:var(--ok);font-weight:600}
      .bv-actions{display:flex;gap:var(--s-3);align-items:center;margin-top:16px;flex-wrap:wrap}

/* ---------------------------------------------------------------------------
 * Hilfe und Handbuch — aus hilfe.html
 * ------------------------------------------------------------------------- */
/* T-03: Handbuch IN Mercofina. Die Typografie folgt bewusst der HTML-Fassung
   des Handbuchs (scripts/handbuch-seite.js) — wer beides kennt, soll nicht
   zweimal lesen lernen. */
.hilfe-layout{display:grid;grid-template-columns:270px 1fr;gap:0;height:calc(100vh - var(--topbar-h, 96px))}
.hilfe-nav{border-right:1px solid var(--line);overflow:auto;padding:var(--s-4) var(--s-3)}
.hilfe-nav .kapitel{margin-bottom:14px}
.hilfe-nav .kapitel > button:hover{background:var(--card-2)}
.hilfe-nav .kapitel > button.aktiv{background:var(--accent-dim);color:var(--accent)}
.hilfe-nav ol{list-style:none;margin:var(--s-1) 0 0;padding:0 0 0 var(--s-2)}
.hilfe-nav ol a{display:flex;gap:var(--s-2);padding:var(--s-1) var(--s-2);border-radius:var(--r-inner);font-size:var(--t-3);color:var(--muted);text-decoration:none}
.hilfe-nav ol a:hover{background:var(--card-2);color:var(--fg)}
.hilfe-nav .nr{color:var(--muted);min-width:2.6em;font-variant-numeric:tabular-nums}
.hilfe-inhalt{overflow:auto;padding:var(--s-5) var(--s-6) 60px}
/* Bedingte Bausteine: In der Hilfe IN Mercofina wird IMMER gefiltert (auf das
   Steuerbild dieser Installation) — der Rahmen taucht deshalb hier gar
   nicht auf. Die Regel steht trotzdem da, damit eine Referenzfassung, die
   jemand versehentlich hier rendert, nicht ohne Form dasteht. */
.baustein{border:1px dashed var(--line);border-radius:var(--r-inner);padding:var(--s-4) var(--s-4) var(--s-1);margin:var(--s-3) 0}
.baustein-marke{display:flex;gap:var(--s-2);align-items:center;font-size:var(--t-1);font-weight:700;
  letter-spacing:.12em;text-transform:uppercase;opacity:.65;margin-bottom:8px}
.baustein-marke code{font-size:var(--t-1);letter-spacing:0;text-transform:none;padding:1px var(--s-2);border-radius:var(--r-klein)}
.hilfe-text{max-width:52em;line-height:1.62;font-size:var(--t-5)}
.hilfe-text h1{font-size:var(--t-7);margin:0 0 var(--s-4)}
.hilfe-text h2{font-size:var(--t-6);margin:var(--s-6) 0 var(--s-3);padding-top:12px;border-top:1px solid var(--line)}
.hilfe-text h3{font-size:var(--t-5);margin:var(--s-5) 0 var(--s-2)}
.hilfe-text h1 .nr,.hilfe-text h2 .nr,.hilfe-text h3 .nr{color:var(--muted);margin-right:.5em;font-variant-numeric:tabular-nums}
.hilfe-text table{border-collapse:collapse;margin:var(--s-3) 0;font-size:var(--t-4);width:100%}
.hilfe-text th,.hilfe-text td{border:1px solid var(--line);padding:var(--s-2) var(--s-2);text-align:left;vertical-align:top}
.hilfe-text th{background:var(--card-2);font-weight:600}
.hilfe-text blockquote{margin:var(--s-4) 0;padding:var(--s-3) var(--s-4);border-left:3px solid var(--info-bdr);background:var(--info-bg);border-radius:0 var(--r-inner) var(--r-inner) 0}
.hilfe-text blockquote p:last-child{margin-bottom:0}
.hilfe-text img{max-width:100%;border:1px solid var(--line);border-radius:var(--r-inner);margin:var(--s-3) 0}
.hilfe-text code{background:var(--card-2);padding:1px var(--s-1);border-radius:var(--r-klein);font-size:.92em}
.hilfe-text hr{border:0;border-top:1px solid var(--line);margin:var(--s-5) 0}
.hilfe-treffer{display:block;padding:var(--s-2) var(--s-3);border:1px solid var(--line);border-radius:var(--r-inner);margin-bottom:7px;text-decoration:none;color:var(--fg)}
.hilfe-treffer:hover{background:var(--card-2)}
.hilfe-treffer b{display:block;font-size:var(--t-3);color:var(--muted);font-weight:600;margin-bottom:2px}
.hilfe-treffer mark{background:var(--warn-bg);color:inherit;padding:0 var(--s-1);border-radius:var(--r-klein)}
@media (max-width:900px){.hilfe-layout{grid-template-columns:1fr;height:auto}.hilfe-nav{border-right:0;border-bottom:1px solid var(--line)}}

/* ---------------------------------------------------------------------------
 * Datenuebernahme — aus import.html
 * ------------------------------------------------------------------------- */
/* T-16 · Datenübernahme. Vier Schritte, immer dieselben, für jede Quelle:
   wählen → hochladen → zuordnen → prüfen → übernehmen. Die Seite kennt
   keine einzige Quelle namentlich; alles kommt aus /api/import/quellen. */
.im-schritte{display:flex;gap:var(--s-2);margin:var(--s-4) 0 var(--s-5);font-size:var(--t-3);color:var(--muted);flex-wrap:wrap}
.im-schritte b{color:var(--fg)}
.im-quellen{display:grid;grid-template-columns:repeat(auto-fill,minmax(19em,1fr));gap:var(--s-3)}
/* `white-space:normal` und `display:block` sind hier nicht Zierde: Ein
   <button> bricht Text von sich aus nicht um, und ein <span> darin ist
   inline — ohne beides standen die drei Beschreibungen uebereinander im
   Bild. Gefunden beim Hinsehen, nicht vom Test (der klickt und liest, er
   schaut nicht). */
.im-quelle{display:block;text-align:left;white-space:normal;background:var(--card);
  border:1px solid var(--line);border-radius:var(--r-inner);padding:var(--s-4) var(--s-4);
  cursor:pointer;color:var(--fg);font:inherit}
.im-quelle:hover{border-color:var(--accent-border)}
.im-quelle.aktiv{border-color:var(--accent);background:var(--accent-dim)}
.im-quelle strong{display:block;margin-bottom:4px}
.im-quelle span{display:block;font-size:var(--t-3);color:var(--muted);line-height:1.5}
.im-karte h2{margin:0 0 var(--s-2);font-size:var(--t-5)}
.im-zuordnung{display:grid;grid-template-columns:1fr 1fr;gap:var(--s-3) var(--s-4);margin-top:10px}
@media (max-width:760px){ .im-zuordnung{grid-template-columns:1fr} }
.im-zuordnung label{display:block;font-size:var(--t-3)}
.im-zuordnung .im-feldhinweis{display:block;font-size:var(--t-2);color:var(--muted);margin-top:2px;line-height:1.45}
.im-tabelle{width:100%;border-collapse:collapse;font-size:var(--t-3);margin-top:8px;display:block;overflow-x:auto}
.im-tabelle th,.im-tabelle td{padding:var(--s-1) var(--s-2);border-bottom:1px solid var(--line);text-align:left;white-space:nowrap}
.im-fehler{max-height:22em;overflow:auto;margin-top:8px}
.im-fehler table{width:100%;border-collapse:collapse;font-size:var(--t-3)}
.im-fehler td{padding:var(--s-1) var(--s-2);border-bottom:1px solid var(--line)}
.im-fehler td:first-child{width:5em;color:var(--muted);font-variant-numeric:tabular-nums}
.im-aktionen{display:flex;gap:var(--s-3);align-items:center;margin-top:14px;flex-wrap:wrap}

/* ---------------------------------------------------------------------------
 * Inventur — aus inventur.html
 * ------------------------------------------------------------------------- */
/* Mobil-tauglich: eine Spalte, großes Scan-Feld, große Touch-Ziele. */
.inv-kopf{display:flex;gap:var(--s-3);align-items:center;flex-wrap:wrap;margin-bottom:10px}
.inv-kopf h1{margin:0;font-size:var(--t-6)}
.inv-scanzeile{display:flex;gap:var(--s-2);margin:var(--s-3) 0}
.inv-scanzeile input{flex:1;font-size:var(--t-6);padding:var(--s-3)}
.inv-chips{display:flex;gap:var(--s-2);flex-wrap:wrap;margin:var(--s-2) 0}
.inv-chip{padding:var(--s-2) var(--s-3);border-radius:var(--r-pille);border:1px solid var(--line-2);background:transparent;color:var(--muted);font-size:var(--t-3);cursor:pointer}
.inv-chip.aktiv{border-color:var(--accent-border);background:var(--accent-dim);color:var(--accent);font-weight:600}
.inv-liste{display:flex;flex-direction:column;gap:var(--s-2)}
.inv-zeile{display:flex;gap:var(--s-3);align-items:center;background:var(--card);border:1px solid var(--line);border-radius:var(--r-inner);padding:var(--s-2) var(--s-3)}
.inv-zeile.diff{border-color:var(--warn-bdr);background:var(--warn-bg)}
.inv-zeile.fehlt{border-color:var(--bad-bdr);background:var(--bad-bg)}
/* SCHRANKWEISE ZAEHLEN (`der-platzbestand-ist-eine-echte-menge`, Nachtrag
   13.09.2026): Die Plaetze stehen EINGERUECKT unter ihrem Artikel — sie sind
   seine Teile, keine eigenen Zeilen der Liste. Die Artikelzeile zeigt dann
   nur noch die Summe, damit es nicht zwei Felder fuer dieselbe Zahl gibt. */
.inv-zeile.platzzeile{margin-left:var(--s-5);background:var(--card-2)}
.inv-zeile .menge.summe{
  min-width:5.5em; text-align:right; font-variant-numeric:tabular-nums; color:var(--muted);
}
.inv-zeile .txt{flex:1;min-width:0}
.inv-zeile .txt .t{font-weight:600;font-size:var(--t-4);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.inv-zeile .txt .s{font-size:var(--t-2);color:var(--muted)}
.inv-zeile input.menge{width:74px;text-align:right;font-variant-numeric:tabular-nums;padding:var(--s-2)}
.inv-zeile .soll{font-size:var(--t-3);color:var(--muted);white-space:nowrap;font-variant-numeric:tabular-nums}
/* Das Kamerabild steht seit 29.08.2026 in `js/scannen.js` und `style.css`
   (Regelwerk `scannen-ist-ein-baustein`) — es wird auch beim Picken am Handy
   gebraucht, und zwei Fassungen desselben Overlays laufen auseinander. */
.statuszeile{font-size:var(--t-3);color:var(--muted)}
.fortschritt{display:flex;gap:var(--s-2);flex-wrap:wrap;font-size:var(--t-3)}
.fortschritt .badge{font-size:var(--t-3)}

/* ---------------------------------------------------------------------------
 * Papier — was noch liegen bleiben muss (10.09.2026)
 *
 * Die Sicht hat EINEN Satz, der alles trägt („Was hier nicht steht, kann
 * weg"), darunter die Tage. Der Satz ist deshalb gross gesetzt und nicht als
 * Hinweis versteckt: Er ist die Entscheidungsregel, nicht die Fussnote.
 * ------------------------------------------------------------------------- */
.papier-satz{font-size:var(--t-5);margin:var(--s-4) 0 var(--s-2)}
.papier-tag{margin:var(--s-5) 0 0}
.papier-tag-kopf{
  font-size:var(--t-4);margin:0 0 var(--s-2);
  display:flex;align-items:baseline;gap:var(--s-3);
  padding-bottom:var(--s-2);border-bottom:1px solid var(--line);
}
.papier-liste{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:var(--s-1)}
/* Die ganze Zeile fuehrt zum Erledigen — nicht nur ein kleiner Link am Rand
   (Regel: die Liste soll hinfuehren, nicht nur anzeigen). */
.papier-zeile{
  display:flex;align-items:center;gap:var(--s-3);
  padding:var(--s-2) var(--s-3);border-radius:var(--r-inner);
  color:var(--fg);text-decoration:none;
}
.papier-zeile:hover{background:var(--zeile-hover)}
.papier-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* ---------------------------------------------------------------------------
 * Kasse und Kiosk — aus kasse.html
 * ------------------------------------------------------------------------- */
/* P3-027 Kassen-spezifisch: große Touch-Ziele, POS-Layout, Bon-Optik. */
.kasse-haupt{display:grid;grid-template-columns:1fr 380px;gap:var(--s-4);padding:var(--s-4) var(--s-4) var(--s-5);max-width:1400px;margin:0 auto}
@media (max-width:900px){
  /* Dieselbe Ursache wie beim Dashboard (31.08.2026): Ein Rasterkind kann
     ohne min-width:0 nicht schmaler werden als sein laengster Inhalt. Bei 390
     Pixeln war die Kassenkarte 376 statt 358 breit — zwei Pixel Querscrollen
     fuer die ganze Seite. */
  .kasse-haupt{grid-template-columns:1fr}
  .kasse-haupt>*{min-width:0}
}
.scanzeile{display:flex;gap:var(--s-3);flex-wrap:wrap}
.scanzeile input{flex:1;min-width:200px;font-size:var(--t-6);padding:var(--s-3) var(--s-4)}
table.korb{width:100%;border-collapse:collapse;margin-top:12px}
table.korb th{font-size:var(--t-2);letter-spacing:.07em;text-transform:uppercase;color:var(--muted);text-align:left;padding:var(--s-2) var(--s-2);border-bottom:1px solid var(--line-2)}
table.korb td{padding:var(--s-2) var(--s-2);border-bottom:1px solid var(--line);vertical-align:middle}
table.korb td.r,table.korb th.r{text-align:right}
.mengenknopf{width:36px;height:36px;padding:0;font-size:var(--t-6);line-height:1}
.kasse-gesamt{font-size:44px;font-weight:700;text-align:right;font-variant-numeric:tabular-nums}
.steuerzeile{display:flex;justify-content:space-between;font-size:var(--t-3);color:var(--muted);padding:var(--s-1) 0}
/* Zaehlprotokoll im Z-Dialog (C-08/Kassenpaket): zwei Spalten, damit
   Scheine und Muenzen so nebeneinander stehen wie beim Zaehlen. */
.zaehl-spalten{display:grid;grid-template-columns:1fr 1fr;gap:var(--s-4)}
.zaehl-zeile{display:flex;align-items:center;justify-content:space-between;gap:var(--s-2);margin:0 0 var(--s-1)}
.zaehl-zeile span{font-size:var(--t-3);color:var(--muted);min-width:5.5em}
.zaehl-zeile input{width:4.5em;text-align:right}
@media (max-width:520px){.zaehl-spalten{grid-template-columns:1fr}}
/* `minmax(0,1fr)` statt `1fr` ist VORSORGE, kein Fehlerfix — und das ist
   wichtig festzuhalten, weil ich es am 26.08.2026 zuerst falsch herum
   erzaehlt habe: Grid-Spalten haben `min-width:auto`, eine lange
   Beschriftung koennte die Spalte also ueber die Karte hinaus aufdruecken.
   NACHGEMESSEN im Browser ist das hier nie passiert — Knoepfe haben von
   Haus aus `white-space:normal` und brechen einfach um. Der gemeldete
   Befund war ein anderer (acht gleichrangige Knoepfe, s. u.). Die Grenze
   bleibt trotzdem stehen: Sie kostet nichts und faengt den Tag ab, an dem
   jemand `nowrap` setzt. */
.zahlknoepfe{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:var(--s-3);margin-top:14px}
.zahlknoepfe button{font-size:var(--t-6);padding:var(--s-4) var(--s-3);min-width:0}
/* Sichtprüfung 03.09.2026 („umbruch": „💶 Offene Forderung…" brach auf zwei
   Zeilen): die Spalten passen sich der Beschriftung an, statt die
   Beschriftung der Spalte — ein Knopf bleibt eine Zeile. */
.kassen-aktionen{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:var(--s-2);margin-top:10px}
.kassen-aktionen button{min-width:0;white-space:nowrap;line-height:1.25}
/* Das Kassenfunktionen-Menue nutzt `zeigeKontextMenue` aus wawi.js (kein
   zweites Menue-Muster). Nur die Groesse passt hier nicht: 13px/7px sind
   Maus-Ziele, an der Theke wird mit dem Finger getippt. */
.kontext-menue{min-width:min(280px,92vw)}
.kontext-menue .km-zeile{font-size:var(--t-5);padding:var(--s-3) var(--s-3)}
.kundenzeile{display:flex;align-items:center;gap:var(--s-2);justify-content:space-between;margin-bottom:10px;padding-bottom:10px;border-bottom:1px solid var(--line);flex-wrap:wrap}
.kasse-badge{display:inline-flex;align-items:center;gap:var(--s-2);padding:var(--s-1) var(--s-3);border-radius:var(--r-pille);font-size:var(--t-3);font-weight:600;border:1px solid}
/* Die KLEINE Marke — in der Artikelzeile und in der Bonliste, wo mehrere
   nebeneinander stehen und die volle Marke die Zeile sprengen wuerde. Sie
   stand bis zum 10.09.2026 achtmal als Inline-Stil in kasse.js (erst
   `padding:1px 7px`, dann als Token) — also achtmal dieselbe Entscheidung,
   nirgends benannt. Jetzt hat sie einen Namen. */
.kasse-badge.klein{padding:var(--s-1) var(--s-2);font-size:var(--t-1)}
.kasse-badge.ok{background:var(--ok-bg);border-color:var(--ok-bdr);color:var(--ok)}
.kasse-badge.warn{background:var(--warn-bg);border-color:var(--warn-bdr);color:var(--warn)}
.kasse-badge.bad{background:var(--bad-bg);border-color:var(--bad-bdr);color:var(--bad)}
.kasse-badge.info{background:var(--info-bg);border-color:var(--info-bdr);color:var(--info)}
/* Bon (Thermo-Optik) */
.bonwrap{display:flex;flex-direction:column;align-items:center;gap:var(--s-4);padding:var(--s-5) var(--s-4) var(--s-6)}
.bon{background:var(--papier);color:var(--papier-schrift);width:min(340px,100%);padding:var(--s-4) var(--s-4);border-radius:var(--r-klein);font:13px/1.45 ui-monospace,Consolas,Menlo,monospace;box-shadow:var(--shadow-md)}
.bon .mitte{text-align:center}
.bon hr{border:none;border-top:1px dashed var(--papier-linie);margin:var(--s-2) 0}
.bon table{width:100%;border-collapse:collapse}
.bon td{padding:1px 0;vertical-align:top}
.bon td.r{text-align:right;white-space:nowrap}
.bon .gross{font-size:var(--t-5);font-weight:700}
.bon img.qr{width:120px;height:120px;display:block;margin:8px auto;image-rendering:pixelated}
.bon .tse{font-size:var(--t-1);word-break:break-all;color:var(--papier-leise)}
.bon .warnung{background:var(--warn);color:var(--auf-signal);padding:var(--s-1) var(--s-2);font-size:var(--t-1);border-radius:var(--r-klein);margin-top:6px;text-align:center}
/* DIE BON-KNOEPFE MUESSEN ERREICHBAR BLEIBEN (31.08.2026, Realfall an der
 * Kasse). Michael: „Der Bon steht auf dem Bildschirm, wird aber nicht
 * gedruckt, kann auch nicht gewaehlt werden, dass er gedruckt oder auch
 * geschlossen wird. Ich kann nur Bediener wechseln waehlen."
 *
 * Die Aktionsleiste steht UNTER dem Beleg. Ein vollstaendiger Bon (Kunde,
 * Ab-18-Zeile, TSE-QR, TSE-Block) ist rund 830 px hoch — im Querformat des
 * Kassengeraets liegt die Leiste damit bei y=745 und das Fenster ist 720 px
 * hoch. Gemessen: 1280x720 und 1024x600 ausserhalb, 720x1280 und 1440x900
 * innerhalb. Die Seite laesst sich zwar scrollen, aber auf einem Touchgeraet
 * ohne sichtbaren Balken sieht niemand, dass da noch etwas ist — und der
 * einzige Knopf, der immer im Blick bleibt, ist „Bediener wechseln" im
 * Kiosk-Kopf. Genau so kam es an.
 *
 * `sticky` statt `fixed`: Die Leiste klebt am unteren Rand, SOLANGE der Bon
 * angezeigt wird — sie gehoert weiter in den Fluss und verschwindet mit ihm.
 * Der undurchsichtige Hintergrund ist noetig, weil der Beleg sonst
 * dahinterdurch scrollt. */
.bonaktionen{display:flex;gap:var(--s-3);flex-wrap:wrap;justify-content:center;
  position:sticky;bottom:0;width:100%;padding:var(--s-3) 0 var(--s-1);background:var(--bg);z-index:2}
.schnellgeld{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--s-2);margin-top:10px}
.rueckgeldbox{margin-top:14px;padding:var(--s-3);border-radius:var(--r-inner);background:var(--accent-dim);border:1px solid var(--accent-border);text-align:center}
.rueckgeldbox .betrag{font-size:34px;font-weight:700;color:var(--accent)}
.srs-hinweisbox{background:var(--bg-elevated);border:1px solid var(--line-2);border-radius:var(--r-inner);padding:var(--s-3) var(--s-3);max-height:180px;overflow:auto;font-size:var(--t-3);white-space:pre-line}
#srsPad{width:100%;background:var(--blatt);border-radius:var(--r-inner);touch-action:none;cursor:crosshair}
.archivzeile{display:flex;justify-content:space-between;gap:var(--s-3);text-align:left;width:100%}
/* ---- Kiosk-Sperrbildschirm (26.08.2026) --------------------------------
   Deckend, nicht durchscheinend: Was hinter einer Sperre steht, geht
   niemanden etwas an — auch nicht als Umriss. Deshalb `--bg` und kein
   halbtransparentes Overlay. */
/* `overflow-y:auto` + `justify-content:safe center`: Ein Betrieb mit zehn
   Mitarbeitern hat zehn Kacheln, und die passen nicht mehr auf einen
   Kassenbildschirm. Ohne das Scrollen waren die unteren schlicht nicht
   erreichbar — gefunden bei der Sichtprüfung am 26.08.2026. Das schlichte
   `center` ist dabei die Falle: Läuft der Inhalt über, schiebt es ihn oben
   AUS dem Kasten heraus, und dorthin scrollt kein Browser zurück. */
#kioskSperre{display:none;position:fixed;inset:0;z-index:150;background:var(--bg);
  flex-direction:column;align-items:center;justify-content:safe center;gap:var(--s-5);
  padding:var(--s-6) var(--s-5);text-align:center;overflow-y:auto}
#kioskSperre.an{display:flex}
.ks-marke{font-size:var(--t-6);font-weight:700;letter-spacing:-.01em}
.ks-ort{color:var(--muted);font-size:var(--t-3);margin-top:3px}
.ks-frage{font-size:var(--t-5)}
.ks-unterzeile{color:var(--muted);font-size:var(--t-3);margin-top:2px}
/* Die Breite muss an den BLOCK, nicht an die Kachelwand: `#kioskSperre` ist
   ein Spalten-Flex mit `align-items:center`, seine Kinder schrumpfen also
   auf Inhaltsbreite. Ein `width:min(620px,100%)` weiter innen bezöge die
   100 % dann auf einen bereits geschrumpften Kasten — die Kacheln standen
   untereinander statt nebeneinander (Sichtprüfung 26.08.2026). */
#ksWahl,#ksPin{width:min(620px,100%)}
#ksPin{display:flex;flex-direction:column;gap:var(--s-4)}
.ks-kacheln{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:var(--s-3);
  width:100%;margin-top:16px}
.ks-kachel:hover{background:var(--card-2);border-color:var(--accent-border)}
.ks-avatar{width:46px;height:46px;border-radius:50%;display:grid;place-items:center;
  background:var(--accent-dim);color:var(--accent);font-weight:700;font-size:var(--t-5);
  border:1px solid var(--accent-border);flex:0 0 auto}
.ks-kachel .ks-name{font-weight:600;font-size:var(--t-4);word-break:break-word}
.ks-kachel .ks-rolle{font-size:var(--t-2);color:var(--muted)}
.ks-person{display:flex;align-items:center;justify-content:center;gap:var(--s-3);text-align:left}
.ks-punkte{display:flex;gap:var(--s-3);justify-content:center}
.ks-punkt{width:15px;height:15px;border-radius:50%;border:1.5px solid var(--line-2)}
.ks-punkt.voll{background:var(--accent);border-color:var(--accent)}
.ks-punkt.falsch{background:var(--bad);border-color:var(--bad)}
.ks-fehler{color:var(--bad);font-size:var(--t-3);min-height:19px}
/* 92 px: „Löschen" passt bei 13 px sonst nicht in die Taste und ragt heraus
   (Sichtprüfung 26.08.2026) — und ein Ziffernblock, den man mit dem Finger
   trifft, will ohnehin keine kleineren Tasten. */
.ks-block{display:grid;grid-template-columns:repeat(3,92px);gap:var(--s-3);justify-content:center}
.ks-block button{background:var(--card-2);border:1px solid var(--line);color:var(--fg);
  font:600 21px/1 ui-monospace,Consolas,monospace;padding:var(--s-4) 0;border-radius:var(--r-inner);cursor:pointer}
.ks-block button:hover{background:var(--card-3)}
.ks-block button.weich{font:500 13px/1 inherit;color:var(--muted)}
/* Die Bedienerzeile in der Kopfleiste des Kiosks. */
.kiosk-kopf{display:none;align-items:center;gap:var(--s-3);padding:var(--s-2) var(--s-4);
  background:var(--card);border-bottom:1px solid var(--line)}
.kiosk-kopf.an{display:flex}
.kiosk-kopf .kk-marke{font-weight:700;font-size:var(--t-4)}
/* Marke mit Icon als Link zur Kassenfläche (Michael, 07.10.2026) — in Kiosk-Kopf und Sperrbildschirm. */
.kk-marke,.ks-marke{color:inherit;text-decoration:none;display:inline-flex;align-items:center;gap:var(--s-2)}
.kk-icon{height:var(--t-5);width:auto}
.kiosk-kopf .kk-trenn{width:1px;height:17px;background:var(--line-2)}
.kiosk-kopf .kk-bediener{display:flex;align-items:center;gap:var(--s-2);font-size:var(--t-3)}
.kiosk-kopf .ks-avatar{width:26px;height:26px;font-size:var(--t-1)}
.kiosk-kopf .kk-rechts{margin-left:auto;display:flex;align-items:center;gap:var(--s-2)}
/* DIESER BLOCK IST AUF DIE KASSE BESCHRAENKT, und das ist keine
   Kosmetik: `body>*{display:none}` blendet beim Drucken ALLES aus und
   laesst nur den Bon stehen. Global gestellt wuerde jede Mercofina-Seite leer
   aus dem Drucker kommen — ohne Fehlermeldung, ohne roten Test. Der
   Riegel ist die Klasse am <body> der Kassenseite. */
@media print{
  .seite-kasse>*{display:none !important}
  .seite-kasse #bonDruck{display:block !important;position:static}
  .seite-kasse #bonDruck .bon{box-shadow:none;width:72mm;font-size:var(--t-1)}
  .seite-kasse .bonaktionen{display:none !important}
}

/* ---------------------------------------------------------------------------
 * Kunden-Upload (oeffentlich, ohne Anmeldung) — aus kunde-upload.html
 * ------------------------------------------------------------------------- */
.dz{border:2px dashed var(--line);border-radius:var(--r-inner);padding:var(--s-6) var(--s-4);text-align:center;cursor:pointer;color:var(--muted);margin:var(--s-4) 0}
.dz:hover{border-color:var(--accent);color:var(--fg)}
.dz.drag-over{border-color:var(--accent);background:var(--accent-dim);color:var(--fg)}
.fileliste{font-size:var(--t-3);color:var(--muted);margin:var(--s-2) 0}

/* ---------------------------------------------------------------------------
 * Kundendisplay (10-Zoll-Zweitschirm der Kasse) — aus kundendisplay.html
 * ------------------------------------------------------------------------- */
/* P3-027 Stufe 3: läuft auf dem 10″-Kundendisplay des iMin (Presentation-
   WebView der Kassen-App, gleiche Session). Groß, ruhig, kundentauglich. */
/* Nur auf dem Zweitschirm: dort gibt es nichts zu scrollen. Global
   gestellt naehme es jeder Mercofina-Seite den Bildlauf. */
.seite-kundendisplay{overflow:hidden}
.kd{display:flex;flex-direction:column;height:100vh;padding:var(--s-5) var(--s-5);gap:var(--s-3)}
.kd-kopf{display:flex;align-items:center;justify-content:space-between}
.kd-marke{font-size:var(--t-7);font-weight:700;letter-spacing:.03em}
.kd-liste{flex:1;overflow:hidden;display:flex;flex-direction:column;justify-content:flex-end}
.kd-zeile{display:flex;justify-content:space-between;gap:var(--s-4);font-size:var(--t-7);padding:var(--s-2) 0;border-bottom:1px solid var(--line)}
.kd-zeile .muted{font-size:var(--t-6)}
.kd-summe{display:flex;justify-content:space-between;align-items:baseline;border-top:2px solid var(--accent-border);padding-top:12px}
.kd-summe .label{font-size:var(--t-7);color:var(--muted)}
.kd-summe .wert{font-size:64px;font-weight:800;font-variant-numeric:tabular-nums}
.kd-idle{flex:1;display:flex;flex-direction:row;align-items:center;justify-content:center;gap:var(--s-6);text-align:center;min-height:0}
.kd-gruss-block{display:flex;flex-direction:column;gap:var(--s-3)}
.kd-idle .gruss{font-size:40px;font-weight:700}
/* Das EU-Gewaehrleistungslabel im Ruhezustand: volle Hoehe, nie beschnitten
   und nie verzerrt (Anhang I, Erlaeuterung 1 — keines der Elemente ist
   editierbar). Auf einem hochkant stehenden Kundendisplay stapelt es unter
   den Gruss statt daneben. */
.kd-label{max-height:100%;max-width:46%;object-fit:contain;border-radius:8px}
@media (max-aspect-ratio:1/1){.kd-idle{flex-direction:column}.kd-label{max-width:82%;max-height:62%}}


/* ---------------------------------------------------------------------------
 * Buchungsfenster der Buchhaltung — bis zum 30.08.2026 aus fibu.js eingespritzt
 * ---------------------------------------------------------------------------
 * Diese Regeln standen als `const BVM_CSS` in `frontend/js/fibu.js` und
 * wurden bei JEDEM Oeffnen des Fensters als eigenes <style> in die Seite
 * geschrieben. Das war der dritte Ort, an dem Mercofina-CSS lag — und der
 * unsichtbarste: Wer `.bvm-weg` in den Stylesheets suchte, fand nichts und
 * hielt die Klasse fuer tot. Genau das ist mir am 30.08.2026 passiert.
 *
 * FUSSNOTE FUER SPAETER: Die Farben hier sind fest verdrahtet (#26344a,
 * #0f1725, #3fb950) statt ueber `var(--…)`. Solange Mercofina nur dunkel laeuft,
 * faellt das nicht auf; bei einem hellen Erscheinungsbild waere dieses Fenster
 * die eine Stelle, die nicht mitzieht. Nicht hier geaendert — das ist eine
 * Gestaltungsfrage und keine Aufraeumarbeit.
 * ------------------------------------------------------------------------- */
.bvm-ctx{display:flex;gap:var(--s-3);align-items:center;padding:var(--s-2) var(--s-3);border:1px solid var(--card-3);border-radius:var(--r-inner);background:var(--bg-elevated);margin-bottom:8px}
.bvm-ctx .bvm-ic{width:28px;height:28px;border-radius:var(--r-inner);display:grid;place-items:center;font-size:var(--t-5);background:var(--info-bg);border:1px solid var(--info-bdr);flex:none}
.bvm-ctx.aus .bvm-ic{background:var(--bad-bg);border-color:var(--bad-bdr)}
.bvm-ctx .bvm-meta{flex:1;min-width:0;display:flex;gap:var(--s-2);align-items:baseline}
.bvm-ctx .t1{font-weight:600;font-size:var(--t-3);white-space:nowrap}
.bvm-ctx .t2{font-size:var(--t-2);color:var(--muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
.bvm-ctx .bvm-amt{font-size:var(--t-5);font-weight:700;flex:none}.bvm-ctx .bvm-amt.neg{color:var(--bad)}.bvm-ctx .bvm-amt.pos{color:var(--accent)}
.bvm-zrow{display:flex;gap:var(--s-3);align-items:center;margin:0 0 var(--s-2)}
.bvm-zrow>span{white-space:nowrap;font-size:var(--t-3);color:var(--muted)}
.bvm-zrow select{flex:1;margin:0}
.bvm-sech{font-size:var(--t-1);text-transform:uppercase;letter-spacing:.11em;color:var(--muted);font-weight:700;margin:0 0 var(--s-2)}
/* Flex statt festem 4er-Raster (Michael 01.09.: „Die Buttons sollten alle 5
   auf eine Zeile") — die Leiste trägt je nach Einstieg 4 ODER 5 Wege
   (Ⓔ Buchungssatz nur beleg-first); alle teilen sich EINE Zeile. */
.bvm-wege{display:flex;gap:var(--s-2);margin-bottom:8px}
.bvm-wege .bvm-weg{flex:1 1 0}
.bvm-weg{all:unset;cursor:pointer;border:1px solid var(--card-3);border-radius:var(--r-inner);padding:var(--s-2) var(--s-3);background:var(--card-2);display:flex;align-items:center;min-width:0}
.bvm-weg b{font-size:var(--t-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.bvm-weg[aria-selected=true]{border-color:var(--ok);background:var(--ok-bg);box-shadow:0 0 0 1px var(--ok-bdr) inset}
.bvm-weg[aria-selected=true] b{color:var(--ok)}
.bvm-panel{border:1px solid var(--card-3);border-radius:var(--r-card);background:var(--bg-elevated);padding:var(--s-3);margin-bottom:8px}
.bvm-warn{display:flex;gap:var(--s-2);align-items:center;padding:var(--s-1) var(--s-3);border-radius:var(--r-inner);border:1px solid var(--warn-bdr);background:var(--warn-bg);font-size:var(--t-2);color:var(--warn);margin-bottom:6px;min-width:0}
.bvm-warn span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
.bvm-warn b{color:var(--warn)}
.bvm-foot{display:flex;justify-content:space-between;align-items:center;gap:var(--s-3);margin-top:2px}
/* Weg-Ⓑ-Formular: kompaktes Raster — Label IMMER über dem Feld, keine
   globalen 14px-Label-Margins, EINE Feldhöhe (34px) für Input/Select/
   Datum (Michael 28.07.: "unterschiedliche Höhen, brauchen zu viel Platz"). */
.bla-form{display:flex;flex-direction:column;gap:var(--s-2)}
.bla-form label:not(.checkbox-inline):not(.stamm-zeile){display:flex;flex-direction:column;gap:var(--s-1);margin:0;font-size:var(--t-3)}
.bla-form input:not([type=checkbox]):not([type=radio]),.bla-form select{width:100%;height:34px;padding:var(--s-1) var(--s-3);font-size:var(--t-4);margin:0;box-sizing:border-box}
.bla-row{display:flex;gap:var(--s-3)}
.bla-row>label{flex:1;min-width:0}

/* ==================== Eine Tabelle ohne Zeilen ==========================
 * „Keine Positionen.", „lädt …", „nicht abrufbar" — drei Anlässe, eine Rolle:
 * In dieser Tabelle steht gerade nichts. Bis zum 30.08.2026 trugen die 21
 * Stellen dafür `class="muted"` und sahen dadurch aus wie eine Datenzeile:
 * links, klein, grau. Dann bekamen sie `td.tbl-leer`.
 *
 * SEIT DEM 10.09.2026 GIBT ES DAFUER NUR NOCH `.leer` (oben, bei der einen
 * leeren Stelle) — Michaels Vorgabe: „Immer nur eines, das am besten zentral
 * verwaltet ist. Einmal tauschen, alle sind direkt gut." Der Riegel gegen die
 * Zellen-Polsterung steht dort als `td.leer` weiter drin; ohne den
 * Elementnamen haette `.tbl th,.tbl td` gewonnen und der Abstand waere
 * stillschweigend der alte geblieben.
 */

/* ==================== Nur fuer die Vorlesestimme =======================
 * Durchgang 22 (Barrierefreiheit), F22-1.
 *
 * 25 von 32 Seiten hatten keine erste Ueberschrift. Sichtbar traegt den
 * Seitennamen die Kopfzeile — fuer einen Screenreader beginnt die Gliederung
 * dadurch im Nichts, und der schnellste Weg durch eine Seite (von
 * Ueberschrift zu Ueberschrift) faengt bei h2 an.
 *
 * Diese Klasse nimmt das Element aus dem BILD, nicht aus dem BAUM: Es bleibt
 * lesbar fuer Vorlesestimmen und erreichbar fuer die Tastatur.
 *
 * WARUM NICHT `display:none` ODER `visibility:hidden`: Beide nehmen das
 * Element auch dem Screenreader weg — dann waere die Ueberschrift zwar im
 * Quelltext, aber fuer niemanden da. Und WARUM NICHT `width:0`: Ein Element
 * ohne Breite bricht den Text auf ein Zeichen je Zeile um, manche Stimmen
 * lesen ihn dann buchstabierend vor. Ein Pixel plus `clip-path` ist der
 * Weg, der sich seit Jahren haelt.
 */
.nur-vorlesen{
  position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;
  clip-path:inset(50%);white-space:nowrap;border:0;
}

/* ── NUTZUNGSRECHTE-MATRIX ────────────────────────────────────────────────
 * Regelwerk `nutzungsrechte-haengen-am-geber-nicht-am-weg` (08.09.2026).
 *
 * Vier Zustaende, und der WICHTIGSTE ist "ungeklaert": Er ist kein leeres
 * Feld, sondern eine offene Frage an einen Lieferanten. Deshalb bekommt er
 * eine eigene sichtbare Farbe (--info) statt der grauen Nichtfarbe, die man
 * beim Ueberfliegen fuer "erledigt" haelt. "verboten" und "ungeklaert"
 * sperren beide -- sie sehen trotzdem unterschiedlich aus, weil nur das eine
 * noch Arbeit ist.
 *
 * Die Zellen sind `button.flach` (Regelwerk `erst-der-baustein-dann-die-stelle`):
 * Gestalt, Innenabstand und Zeigerform kommen vom Grundknopf, hier stehen NUR
 * die Farben des Zustands und die Breite in der Tabelle.
 */
.nr-matrix td.nr-geber{font-weight:600;white-space:nowrap;padding-right:var(--s-3)}
.nr-matrix button.flach{width:100%;text-align:left}
.nr-matrix .nr-zeichen{margin-right:var(--s-1)}
.nr-erlaubt{color:var(--ok);background:var(--ok-bg)}
.nr-marken{color:var(--warn);background:var(--warn-bg)}
.nr-verboten{color:var(--bad);background:var(--bad-bg)}
.nr-ungeklaert{color:var(--info);background:var(--info-bg)}

/* ── FELD-HINWEIS ─────────────────────────────────────────────────────────
 * Der erklärende Satz unter einem Eingabefeld — „Ohne Beleg ist eine Freigabe
 * eine Behauptung", „Eine Auskunft von 2022 ist keine von heute".
 *
 * Michael, 09.09.2026: *„Die Beschreibungen stehen deutlich über, ist etwas
 * unschön."* Der Grund war nicht der Text, sondern das fehlende Element:
 * `class="muted" style="font-size:12px"` stand 84-mal INLINE im Frontend, und
 * ein Inline-Span richtet sich nach der Breite seines Nachbarn — hinter einem
 * schmalen Datumsfeld rutscht er DANEBEN, hinter einem breiten Select
 * DARUNTER. Dieselbe Absicht, zwei Bilder.
 *
 * Hier steht sie einmal: eigene Zeile, gleicher Abstand, gleiche Größe.
 */
.feld-hinweis{
  display:block;margin-top:var(--s-1);
  color:var(--muted);font-size:var(--t-2);line-height:1.45;
}

/* ============================== FENSTER IN VIER ZONEN =====================
 * Regelwerk `fenster-in-vier-zonen` (Michael, 23.09.2026), Motor
 * `openFenster` in frontend/js/fenster.js, Vorlage
 * docs/umbau-fenster/mockup-neu.html.
 *
 *   Kopf · Leiste · Arbeitsfläche (Bühne | Eigenschaften) · Fußleiste
 *
 * NUR TOKENS: Hell und Dunkel tragen ohne eigenen Wert. Die Bühne liegt auf
 * `--bg` (der Gegenstand hebt sich als Karte davon ab), die Eigenschaften
 * auf `--card` — dieselbe Ordnung in beiden Erscheinungen.
 * ========================================================================== */
.modal-fenster{
  max-width:1440px;width:96vw;height:min(920px,calc(100vh - 48px));
  padding:0;display:flex;flex-direction:column;overflow:hidden;
}
.modal-fenster>#mInhalt{flex:1;min-height:0;display:flex;flex-direction:column}
/* Eine Flex-Spalte, KEIN Grid: Eine versteckte Leiste fällt aus dem Grid
   heraus, die Zeilen rutschen nach — dann bekam der Fuß die freie Höhe statt
   der Arbeitsfläche (gesehen am Prüfblatt, das keine Leiste hat). */
.fenster{flex:1;min-height:0;display:flex;flex-direction:column}
.fenster>.fenster-arbeit{flex:1;min-height:0}

.fenster-kopf{display:flex;align-items:center;gap:var(--s-3);padding:var(--s-4) var(--s-5) var(--s-3)}
.fenster-symbol{
  width:36px;height:36px;flex:none;display:grid;place-items:center;
  border-radius:var(--r-inner);background:var(--card-2);border:1px solid var(--line);font-size:var(--t-5);
}
.fenster-titelblock{flex:1;min-width:0}
.fenster-titelzeile{display:flex;align-items:center;gap:var(--s-2);flex-wrap:wrap}
.fenster-titel{margin:0;flex:0 1 auto;font-size:var(--t-6);font-variant-numeric:tabular-nums}
.fenster-zustand{display:inline-flex;gap:var(--s-1);flex-wrap:wrap}
.fenster-unter{font-size:var(--t-3);color:var(--muted);margin-top:var(--s-1)}
.fenster-unter a{color:inherit}
.fenster-kopf-knoepfe{display:flex;gap:var(--s-2);flex:none;align-items:center}

.fenster-leiste{padding:0 var(--s-5) var(--s-3);border-bottom:1px solid var(--line)}

.fenster-arbeit{display:grid;grid-template-columns:minmax(0,1fr) 380px;min-height:0}
.fenster-arbeit.ohne-eigenschaften{grid-template-columns:minmax(0,1fr)}
.fenster-buehne{background:var(--bg);overflow:auto;min-height:0;padding:var(--s-4) var(--s-5) var(--s-5)}
.fenster-ansichten{margin-bottom:var(--s-4)}
.fenster-eigen{border-left:1px solid var(--line);display:flex;flex-direction:column;min-height:0;background:var(--card)}
.fenster-reiter.mtabs{margin:0;padding:0 var(--s-4)}
.fenster-eigen-inhalt{flex:1;min-height:0;overflow:auto;padding:var(--s-3) var(--s-4) var(--s-4)}
.fenster-zahl{font-size:var(--t-1);color:var(--muted);margin-left:var(--s-1)}

.fenster-fuss{
  display:flex;align-items:center;gap:var(--s-3);
  padding:var(--s-3) var(--s-5);border-top:1px solid var(--line);background:var(--card);
}
.fenster-stand{flex:1;min-width:0;display:flex;align-items:center;gap:var(--s-2);font-size:var(--t-3);color:var(--muted)}
.fenster-geaendert{color:var(--warn);font-weight:600}
.fenster-geaendert::before{content:"● "}
.fenster-geaendert:not([hidden])+.fenster-stand-text{display:none}
.fenster-fuss-knoepfe{display:flex;gap:var(--s-2);align-items:center;flex-wrap:wrap;justify-content:flex-end}

@media (max-width:900px){
  .modal-fenster{height:auto;width:100%}
  .fenster-arbeit{grid-template-columns:minmax(0,1fr)}
  .fenster-eigen{border-left:0;border-top:1px solid var(--line)}
}

/* --- Vorgangs-Leiste: sieben feste Stationen ------------------------------
   Die Linie zwischen zwei Punkten ist grün, sobald die Station erreicht ist.
   Der Zustand steht zusätzlich als Wort im aria-label (R6). */
/* ACHT Stationen seit 29.09.2026 (NWR, `der-ablauf-wird-auf-dem-server-gerechnet`) — vorher sieben. */
.vorgang-leiste{list-style:none;margin:0;padding:0;display:grid;grid-template-columns:repeat(8,minmax(0,1fr))}
/* DIE KOMPAKTE LEISTE in der Liste „Verkäufe“ (Umbau Verkäufe 4.2): derselbe
   Baustein, nur Punkte und Linie — der Name steht im Tooltip (aria-label). */
.vorgang-leiste.kompakt{width:152px;grid-template-columns:repeat(8,1fr)}
.vorgang-leiste.kompakt .vorgang-station{padding:0;gap:0}
.vorgang-leiste.kompakt .vorgang-name,.vorgang-leiste.kompakt .vorgang-info{display:none}
.vorgang-leiste.kompakt .vorgang-station::before{top:6px}
.vorgang-leiste.kompakt .vorgang-punkt{width:12px;height:12px;font-size:8px}
.vorgang-station{position:relative;display:flex;flex-direction:column;align-items:center;gap:var(--s-1);text-align:center;padding:0 var(--s-1)}
.vorgang-station::before{content:"";position:absolute;top:9px;left:-50%;right:50%;height:2px;background:var(--line-2)}
.vorgang-station:first-child::before{display:none}
.vorgang-station.st-ok::before,.vorgang-station.st-aus::before,.vorgang-station.st-teils::before,.vorgang-station.st-fehler::before{background:var(--accent)}
.vorgang-station[role="button"]{cursor:pointer}
.vorgang-station[role="button"]:hover .vorgang-name{text-decoration:underline}
.vorgang-station[role="button"]:focus-visible{outline:none;box-shadow:var(--focus);border-radius:var(--r-mittel)}
.vorgang-punkt{
  position:relative;z-index:1;width:20px;height:20px;border-radius:var(--r-pille);display:grid;place-items:center;
  border:2px solid var(--line-2);background:var(--card);font-size:var(--t-1);font-weight:700;color:var(--auf-akzent);
}
.st-ok .vorgang-punkt{background:var(--accent);border-color:var(--accent)}
.st-teils .vorgang-punkt{border-color:var(--warn);background:var(--warn-bg)}
.st-offen .vorgang-punkt{border-color:var(--line-2)}
.st-fehler .vorgang-punkt{background:var(--bad);border-color:var(--bad);color:var(--auf-signal)}
/* Was entfällt, ist grün (01.10.2026): derselbe Punkt wie „erledigt". */
.st-aus .vorgang-punkt{background:var(--accent);border-color:var(--accent)}
.vorgang-station.hier .vorgang-punkt{box-shadow:0 0 0 4px var(--accent-dim)}
.vorgang-name{font-size:var(--t-3);font-weight:600}
.vorgang-station.hier .vorgang-name{color:var(--accent)}
.vorgang-info{font-size:var(--t-2);color:var(--muted);max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* --- Kennzahlen-Leiste (Partei) --- */
.kennzahlen-leiste{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:var(--s-3)}
.kennzahl span{display:block;font-size:var(--t-2);color:var(--muted)}
.kennzahl b{font-size:var(--t-5);font-weight:600}
/* Abzeichen NEBEN dem Wert (12.10.2026): „span{display:block}“ oben gilt der Beschriftung — ein Abzeichen im Wert
   („unter Mindest“, „von Hand“, „ungespeichert“) wurde damit zur zeilenbreiten Pille und verdoppelte die Leiste. */
.kennzahl .badge{display:inline-block;margin:var(--s-1) var(--s-1) 0 0;vertical-align:middle;font-weight:500}

/* --- Eigenschaften: Bezeichnung links, Wert rechts --- */
.eig-gruppe{margin-bottom:var(--s-4)}
.eig-gruppe-titel{display:flex;justify-content:space-between;align-items:center;gap:var(--s-2);font-size:var(--t-2);font-weight:600;color:var(--muted);margin-bottom:var(--s-1)}
.eig-liste{margin:0}
.eig{display:grid;grid-template-columns:130px minmax(0,1fr);gap:var(--s-2);align-items:center;min-height:32px}
.eig dt{color:var(--muted);font-size:var(--t-3)}
.eig dd{margin:0;font-size:var(--t-3);min-width:0;overflow-wrap:anywhere}
.eig.hoch{align-items:start}
.eig.hoch dt{padding-top:var(--s-1)}
/* DER WERT PASST IN SEINE ZEILE (29.09.2026, Regelwerk `der-wert-passt-in-seine-zeile`,
   gemessen mit scripts/messe-textlaengen.js): Ein Wert, der üblich länger ist als die
   ~30 Zeichen neben der Beschriftung (Hinweis, Erlöskonto, Mahn-Pille, E-Mail, Bon,
   Buchung), steht auf voller Zeile UNTER seiner Beschriftung — und sieht so, wozu er
   gehört. Eine Pille bleibt EIN Block (s. .badge) — zu eng wird ihr die Zeile, nicht
   die Pille: die Mahnzeile ist deshalb `lang`, und mehrere Pillen brechen ZWISCHEN sich. */
.eig.lang{grid-template-columns:minmax(0,1fr);gap:2px;align-items:start}
.eig.lang dt{font-size:var(--t-2)}
.eig dd .badge{max-width:100%;overflow:hidden;text-overflow:ellipsis}
.eig dd input,.eig dd select,.eig dd textarea{width:100%}
.eig dd .checkbox-inline{margin-top:0;white-space:nowrap}
.eig dd .checkbox-inline input{width:auto}

/* --- Kachel (Legitimationen) --- */
.kachel{display:flex;flex-direction:column;gap:var(--s-1);min-height:92px}
.kachel-titel{font-size:var(--t-2);color:var(--muted)}
.kachel-wert{display:flex;align-items:center;gap:var(--s-2);font-size:var(--t-4);font-weight:600;overflow-wrap:anywhere}
.kachel-zeichen{display:inline-grid;place-items:center;width:18px;height:18px;border-radius:var(--r-pille);font-size:var(--t-1);background:var(--ok-bg);color:var(--ok);flex:none}
.kachel-unter{font-size:var(--t-2);color:var(--muted)}
.kachel-aktionen{display:flex;gap:var(--s-3);margin-top:auto;flex-wrap:wrap}
.kachel-aktionen button.flach{padding:0;color:var(--accent)}
.kachel-warn{background:var(--warn-bg);border-color:var(--warn-bdr)}
.kachel-warn .kachel-titel,.kachel-warn .kachel-wert,.kachel-warn .kachel-unter,.kachel-warn .kachel-aktionen button.flach{color:var(--warn)}
.kachel-warn .kachel-zeichen{background:var(--warn-bg);color:var(--warn)}

/* --- Empfänger kompakt: nur wer eine Rolle hat, steht offen da --- */
.empf-box.kompakt{background:transparent;padding:0;border:0;margin:0}
.empf-box.kompakt .empf-title{justify-content:flex-start}
.empf-box.kompakt .empf-info{margin-left:auto;cursor:help}
.empf-box.kompakt:not(.alle) .empf-rolle.empf-ohne{display:none}
.empf-box.kompakt .empf-mehr{padding:var(--s-2) 0;color:var(--accent)}

/* --- Papier: das echte PDF auf der Bühne --- */
.papier-halter{display:flex;flex-direction:column;height:100%;min-height:480px}
.papier-halter.papier-laedt{opacity:.55}
/* Das Papier nimmt die Höhe UNTER den Ansichts-Reitern — mit height:100%
   ragte es um deren Höhe unter den sichtbaren Rand, und „ganzes Blatt"
   (Michael, 24.09.2026) schnitt unten ab. Nur solange das Papier zu sehen
   ist; die übrigen Ansichten bleiben, wie sie sind. */
/* Dasselbe für die BELEG-VORSCHAU (Buchungsfenster, Kassenbeleg — Michael,
   01.10.2026: „Das Fenster sieht auch nicht mehr richtig aus. Das Dokument soll
   den ganzen Platz einnehmen."). Sie stand bei ihrer Mindesthöhe von 380 px,
   darunter die halbe Bühne leer — die Regel kannte nur das Papier. */
.fenster-buehne:has(> .fenster-panel:not([hidden]) > :is(.papier-halter,.beleg-vorschau)){display:flex;flex-direction:column}
.fenster-buehne:has(> .fenster-panel:not([hidden]) > :is(.papier-halter,.beleg-vorschau)) > .fenster-ansichten{align-self:flex-start}
.fenster-buehne > .fenster-panel:has(> :is(.papier-halter,.beleg-vorschau)){flex:1;min-height:0;display:flex;flex-direction:column}
.fenster-panel:has(> .papier-halter) > .papier-halter{height:100%;min-height:360px}
.fenster-panel:has(> .beleg-vorschau) > .beleg-vorschau{flex:1;min-height:360px}

/* --- Das Papier ist die Maske (Regelwerk `das-papier-ist-die-maske`) ------
   Über dem Blatt das Scanfeld; auf dem Blatt die Klickflächen der Feldkarte;
   daneben das Feldblatt. Grün gestrichelt = fehlt noch, steht nicht im PDF. */
.bviewer-bar .papier-modus{margin-left:var(--s-3)}
/* Vorn in der Leiste des Blatts: Scanfeld und „Positionen…“; Zoom und
   Ansicht rücken nach rechts. */
.bviewer-vorn{display:flex;align-items:center;gap:var(--s-2);margin-right:auto}
.bviewer-vorn ~ .bviewer-zoomtipp{margin-left:var(--s-3)}
.bviewer-vorn .papier-scan{width:13rem;max-width:28vw}
/* Der Zoom-Tipp steht im Papier-Fenster in den Knöpfen (Titel) — die Leiste
   trägt dort Scanfeld, Zoom und Ansicht. */
.fenster-papier .bviewer-zoomtipp{display:none}
.bviewer-vorn ~ .bviewer-info,.bviewer-vorn ~ .bviewer-zoomtipp{white-space:nowrap}
.bviewer-vorn .papier-scan input{width:100%}

/* DAS PAPIER ÜBER DAS GANZE FENSTER (Michael, 24.09.2026): zwei feste
   Spalten — links das Papier in voller Höhe, rechts Kopf und Eigenschaften;
   die Vorgangsleiste als schmale Zeile darüber. Das Markup des Fensters
   bleibt, wie es ist; nur die Flächen des Rasters werden anders belegt. Der
   Zoom scrollt im Papier — keine Spalte ändert dabei ihre Breite („Das
   mittlere Feld springt mit dem Zoom […] Das darf definitiv nicht sein"). */
.fenster.fenster-papier{
  display:grid;grid-template-columns:minmax(0,1fr) 460px;grid-template-rows:auto auto minmax(0,1fr) auto;
  grid-template-areas:"leiste leiste" "buehne kopf" "buehne eigen" "fuss fuss";
}
.fenster-papier > .fenster-arbeit{display:contents}
.fenster-papier > .fenster-leiste{grid-area:leiste;padding:var(--s-2) var(--s-4)}
.fenster-papier > .fenster-kopf{grid-area:kopf;border-left:1px solid var(--line);background:var(--card);padding:var(--s-3) var(--s-4) var(--s-2);align-items:flex-start}
.fenster-papier .fenster-buehne{grid-area:buehne;min-height:0;padding:var(--s-2) var(--s-3) var(--s-3)}
.fenster-papier .fenster-eigen{grid-area:eigen;min-height:0}
.fenster-papier > .fenster-fuss{grid-area:fuss}
.fenster-papier .vorgang-station{flex-direction:row;justify-content:center;gap:var(--s-2)}
.fenster-papier .vorgang-station::before{top:50%}
.fenster-papier .vorgang-info{display:none}
.fenster-papier .vorgang-name{position:relative;z-index:1;background:var(--card);padding-right:var(--s-1)}
/* OHNE EIGENSCHAFTEN KEINE RECHTE SPALTE (Michael, 01.10.2026: „Wozu ist das
   rechte Seitenfenster bei den Belegen? Das ist leer und nimmt Platz weg.").
   „Beleg & Zahlung buchen" nutzt das Papier-Raster für die volle Breite, hat
   aber keine Eigenschaften — rechts stand nur der Titel über 460 px Leere, die
   Maske war links eingeengt. Ohne `.fenster-eigen` gilt eine Spalte, der Kopf
   oben, wie im schmalen Fenster. */
.fenster.fenster-papier:not(:has(.fenster-eigen)){
  grid-template-columns:minmax(0,1fr);grid-template-rows:auto auto minmax(0,1fr) auto;
  grid-template-areas:"kopf" "leiste" "buehne" "fuss";
}
.fenster-papier:not(:has(.fenster-eigen)) > .fenster-kopf{border-left:0;border-bottom:1px solid var(--line)}
@media (max-width:900px){
  .fenster.fenster-papier{grid-template-columns:minmax(0,1fr);grid-template-rows:none;grid-template-areas:"kopf" "leiste" "buehne" "eigen" "fuss"}
  .fenster-papier > .fenster-kopf{border-left:0}
  .fenster-papier .fenster-buehne{height:75vh}
}

/* DAS GETEILTE POSITIONEN-FENSTER: oben die Artikelsuche (derselbe Baustein
   wie überall), unten „Ins Angebot übernommen“. */
.positionen-popup{display:flex;flex-direction:column;height:min(56rem,92vh)}
.positionen-popup .artikel-suche-layout{flex:1.2 1 0}
.pf-trenner{display:flex;align-items:center;gap:var(--s-3);margin-top:var(--s-3);padding-block:var(--s-2);border-bottom:1px solid var(--line)}
.pf-trenner .platz{flex:1}
.pf-liste{flex:1 1 0;min-height:0;overflow:auto}
.pf-liste table{width:100%}
.pf-liste th{position:sticky;top:0;z-index:1;background:var(--card)}
.pf-liste td{vertical-align:top}
.pf-liste .pos-menge,.pf-liste .pos-rabatt{width:4.5em;text-align:right}
.pf-liste .pos-brutto,.pf-liste .pos-netto{width:7em;text-align:right}
.pf-liste .pos-bezeichnung{width:100%;min-width:14em}
.pf-liste .pos-hinweis{width:100%;min-width:8em}
.pf-stepper{display:inline-flex;gap:var(--s-1);align-items:center}
.pf-liste tr.pf-frisch td{background:var(--ok-bg)}
.pf-weg{color:var(--bad)}
.bviewer-overlay.ohne-rahmen{cursor:default;pointer-events:none}
/* Eine Klickfläche ist unsichtbar, bis man darauf zeigt — KEIN Knopf-Aussehen,
   deshalb `all:unset` statt den Knopf-Baustein Eigenschaft für Eigenschaft
   zurückzunehmen. */
.papier-feld{
  all:unset;position:absolute;pointer-events:auto;box-sizing:border-box;border-radius:var(--r-klein);
  outline:1px dashed transparent;outline-offset:1px;cursor:pointer;
  transition:outline-color .12s,background-color .12s;
}
.papier-feld:hover,.papier-feld:focus-visible{outline-color:var(--blatt-feld);background:var(--blatt-feld-hell)}
.papier-feld.aktiv{outline:2px solid var(--blatt-feld);background:var(--blatt-feld-hell)}
.papier-feld.geist{
  outline:1.5px dashed var(--blatt-feld);background:var(--blatt-feld-hell);color:var(--blatt-feld);
  display:flex;align-items:center;white-space:nowrap;overflow:hidden;opacity:.85;
}
.papier-feld.geist > span{padding:0 .5em;font-weight:600}
/* Ein Platzhalter bleibt auch AKTIV gestrichelt und transparent — nur die
   Linie wird kräftiger (Michael, 25.09.2026, am Kundenfeld: „selbe Darstellung
   wie unten. Gestrichelt und transparent."). */
.papier-feld.geist:hover,.papier-feld.geist.aktiv{opacity:1}
.papier-feld.geist.aktiv{outline:1.5px dashed var(--blatt-feld);background:var(--blatt-feld-hell)}
.papier-feld.geist.pflicht{outline:1px dashed var(--blatt-pflicht);background:var(--blatt-pflicht-hell);color:var(--blatt-pflicht)}
.papier-feld.geist.pflicht.aktiv{outline:1.5px dashed var(--blatt-pflicht);background:var(--blatt-pflicht-hell)}
/* Direkt ins Blatt schreiben (Anmerkung): das Feld liegt genau auf seiner
   Stelle im PDF, in dessen Schrift — Größe und Innenabstand setzt fenster.js
   aus dem Maßstab. Weiß wie das Blatt, in beiden Erscheinungen. */
.papier-schreibfeld{
  position:absolute;z-index:2;pointer-events:auto;box-sizing:border-box;resize:none;overflow:hidden;margin:0;
  background:var(--blatt);color:var(--blatt-grau);font-family:Helvetica,Arial,sans-serif;
  border:0;border-radius:var(--r-klein);outline:1.5px solid var(--blatt-feld);box-shadow:var(--shadow-sm);
}
.papier-schreibfeld::placeholder{color:var(--blatt-feld);opacity:.8}
.papier-fehlt-knopf{padding:0;color:var(--accent);display:inline-flex;gap:var(--s-2);align-items:center}
.papier-fehlt-knopf:hover{text-decoration:underline}

/* Das Aussehen kommt vom Aufklapp-Baustein `.split-btn-menu` (wie das
   Rahmen-Menü des Viewers); hier nur Lage und Innenabstand. */
.feld-blatt{position:fixed;z-index:10500;max-width:calc(100vw - var(--s-4));overflow:auto;padding:var(--s-3) var(--s-4)}
.feld-blatt-kopf{display:flex;flex-direction:column;gap:var(--s-1);margin-bottom:var(--s-3)}
.feld-blatt-kopf b{font-size:var(--t-4)}
.feld-blatt-unter{font-size:var(--t-2);color:var(--muted)}
.feld-blatt-inhalt p{margin:0 0 var(--s-2)}
.feld-blatt-inhalt input:not([type="checkbox"]),.feld-blatt-inhalt select,.feld-blatt-inhalt textarea{width:100%}
.feld-blatt-chips{margin-bottom:var(--s-3)}
.feld-blatt-raster{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:var(--s-2) var(--s-3)}
.feld-blatt-feld{display:flex;flex-direction:column;gap:var(--s-1);font-size:var(--t-2);color:var(--muted);margin-bottom:var(--s-2)}
.feld-blatt-raster .feld-blatt-feld{margin-bottom:0}
.feld-blatt-feld.breit,.feld-blatt-summe.breit{grid-column:1/-1}
.feld-blatt-stepper{display:flex;gap:var(--s-1)}
.feld-blatt-stepper input{text-align:center;min-width:0}
.feld-blatt-summe{display:flex;justify-content:space-between;gap:var(--s-2);border-top:1px solid var(--line);padding-top:var(--s-2);font-size:var(--t-3)}
.feld-blatt-reihe{display:grid;grid-template-columns:minmax(0,1.6fr) minmax(0,1fr);gap:var(--s-2)}
.feld-blatt-warn{color:var(--warn)}
.feld-blatt-knoepfe{display:flex;gap:var(--s-2);align-items:center;flex-wrap:wrap;margin-top:var(--s-3)}
.feld-blatt-knoepfe .platz{flex:1}
.feld-blatt-weg{color:var(--bad)}

/* DIE ANGABEN RECHTS (Michael, 24.09.2026: „Details wie Lieferdatum, externe
   Auftragsnummer usw. auch rechts anzeigen, da es ansonsten evtl. übersehen
   wird"): jede Angabe des Kopfes als Abschnitt, Datumsfelder nebeneinander.
   Ein Klick aufs Papier springt hierher und lässt die Angabe kurz aufleuchten. */
.angaben{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:0 var(--s-3);margin-bottom:var(--s-3)}
.angabe{grid-column:1/-1;padding-block:var(--s-2);border-bottom:1px solid var(--line);scroll-margin:var(--s-3)}
.angabe.schmal{grid-column:auto}
.angabe input:not([type="checkbox"]),.angabe textarea{width:100%}
.angabe .eig-gruppe-titel{flex-wrap:wrap}
.angabe-unter{font-weight:400;font-size:var(--t-1)}
.angabe-wert{margin:0 0 var(--s-1)}
.angabe-chips{margin-top:var(--s-1)}
.angabe-knoepfe{display:flex;gap:var(--s-2);margin-top:var(--s-1)}
/* Pflicht und noch leer: leicht rot hinterlegt statt des Worts „Pflicht“
   (Michael, 25.09.2026) — dieselbe Sprache wie der Platzhalter auf dem Papier. */
.angabe-pflicht{color:var(--muted);font-size:var(--t-2);margin:0}
.angabe.angabe-offen{box-shadow:inset 2px 0 0 var(--pflicht-linie);background:var(--pflicht-bg);padding-left:var(--s-2)}
.feld-blatt.angabe-offen{border-color:var(--pflicht-linie)}
.angabe.angabe-hier{animation:angabe-hier 1.6s ease-out}
@keyframes angabe-hier{from{background:var(--ok-bg)}to{background:transparent}}
@media (prefers-reduced-motion:reduce){.angabe.angabe-hier{animation:none;outline:2px solid var(--ok)}}
.vor-dem-senden{list-style:none;margin:0;padding:0;display:grid;gap:var(--s-2);font-size:var(--t-3)}
.vor-dem-senden li{display:flex;gap:var(--s-2);align-items:baseline}
.vds-zeichen{flex:none;width:1em;text-align:center}
.vds-ok .vds-zeichen{color:var(--ok)}
.vds-warn .vds-zeichen{color:var(--warn)}
.vds-offen{color:var(--muted)}
.vor-dem-senden button.flach{padding:0;color:var(--accent)}
.vor-dem-senden button.flach:hover{text-decoration:underline}

/* --- Prüfblatt: die Mail groß auf der Bühne, rechts was rausgeht. Das PDF
   steht seit dem Live-Papier nicht mehr darin (Michael, 24.09.2026). --- */
.fenster.pruefblatt .fenster-arbeit{grid-template-columns:minmax(0,1fr) minmax(320px,400px)}
.pruefblatt-abweichung{margin-bottom:var(--s-2)}
.pruefblatt-mail .ev-frame{width:100%;min-height:min(60vh,560px)}
/* Ohne Mail: eine kleine Rückfrage statt des großen Blatts. */
.modal-fenster:has(> #mInhalt > .fenster.pruefblatt-kompakt){width:min(560px,94vw);height:auto;max-height:calc(100vh - 48px)}
/* Einstellungs-Datensätze (einstellungsFenster.js, 30.09.2026): das Formular
   ist der ganze Inhalt — kein rechter Rand, klein ohne feste Höhe. */
.modal-fenster:has(> #mInhalt > .fenster.fenster-klein){width:min(760px,94vw);height:auto;max-height:calc(100vh - 48px)}
.fenster.fenster-einstellung .fenster-arbeit{grid-template-columns:minmax(0,1fr)}
.fenster.fenster-einstellung .fenster-leiste:empty{display:none}
.fenster.pruefblatt-kompakt .fenster-buehne{display:none}
.fenster.pruefblatt-kompakt .fenster-arbeit{grid-template-columns:minmax(0,1fr)}
.fenster.pruefblatt-kompakt .fenster-eigen{border-left:0}
.fenster-buehne .summen-tabelle{margin:var(--s-3) 0 0 auto;max-width:520px}
/* Das Papier zeigt den gespeicherten Stand — ist etwas ungespeichert, sagt
   es diese Leiste darüber (Rechnung: die Beträge rechnet nur der Server). */
.papier-stand{margin-bottom:var(--s-2);padding:var(--s-2) var(--s-3);border-radius:var(--r-inner);background:var(--warn-bg);color:var(--warn);font-size:var(--t-3)}
/* Eine Position, die beim Speichern herausgenommen wird. */
#re_positionen tr.entfernt td:not(:last-child){text-decoration:line-through;color:var(--muted)}

/* --- Formulare und Kopfwerte in der rechten Spalte ------------------------
   Die Stammtabellen (Angebot/Auftrag) sind für die ganze Breite gebaut; in
   den Eigenschaften stehen sie zweispaltig, Adressen und Zusatzangaben
   untereinander. Die Bearbeiten-Maske bekommt dafür etwas mehr Breite. */
.fenster.beleg-bearbeiten .fenster-arbeit{grid-template-columns:minmax(0,1fr) 420px}
/* Die Abschluss-Mappe (Fenster-Umbau 2.6): die Dokumente als Liste rechts,
   der gewählte Eintrag hervorgehoben, sein Papier links. */
.dok-mappe{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:var(--s-1)}
.dok-eintrag{display:flex;align-items:center;gap:var(--s-2);padding:var(--s-1) var(--s-2);border-radius:var(--r-mittel)}
.dok-eintrag.aktiv{background:var(--accent-dim)}
.dok-eintrag .dok-zeigen{flex:1;min-width:0;display:flex;gap:var(--s-2);align-items:center;text-align:left;color:var(--fg)}
.dok-eintrag .dok-titel{overflow-wrap:anywhere}
/* Erlaubnis: rechts Felder, Eintragungen und Personen — etwas breiter. */
.fenster.erlaubnis-fenster .fenster-arbeit{grid-template-columns:minmax(0,1fr) 500px}
/* Unter 900 px ist die Arbeitsfläche einspaltig — AUCH bei den breiteren
   Varianten oben. Deren Regeln stehen später und wiegen gleich viel; die
   allgemeine Regel im Block „Fenster in vier Zonen" verlor deshalb gegen sie
   (Befund beim Umbau 2.3: Beleg-Maske und Prüfblatt blieben am Handy zweispaltig). */
@media (max-width:900px){
  .fenster.beleg-bearbeiten .fenster-arbeit,.fenster.erlaubnis-fenster .fenster-arbeit,.fenster.pruefblatt .fenster-arbeit{grid-template-columns:minmax(0,1fr)}
}
.fenster-eigen .jtl-adressen,.fenster-eigen .grid{grid-template-columns:minmax(0,1fr)}
/* Die Hüllen der alten Maske (.mtab-panel) begrenzen Höhe und scrollen
   selbst — im Fenster scrollt die Zone, nicht ein Kasten darin. */
.fenster .mtab-panel{max-height:none;overflow:visible;padding:0}

/* --- Das Formular der Umsatzsteuer-Meldung (Umbau 08.10.2026) ------------
   Michael: „Die Werte fürs Formular sollen auch direkt im Formular angezeigt
   werden, und nicht in einer durchmischten Liste.“ Aufbau wie der Vordruck:
   Abschnitt als Überschrift, je Zeile Zeilennummer · Text · Kennzahl im
   Kästchen · Wert im Feld; KZ 83 abgesetzt. Leere Felder bleiben leer. */
.ust-formular{display:grid;gap:var(--s-4)}
.ust-abschnitt h4{margin:0 0 var(--s-2);font-size:var(--t-4)}
.ust-gruppe{margin:var(--s-2) 0 var(--s-1);font-weight:600;font-size:var(--t-3)}
.ust-zeile{display:grid;grid-template-columns:2.2em minmax(0,1fr) 3.2em 10em;gap:var(--s-2);align-items:center;padding:var(--s-1) 0;border-bottom:1px solid var(--line)}
.ust-nr{color:var(--muted);font-size:var(--t-2);text-align:right;font-variant-numeric:tabular-nums}
.ust-kz{text-align:center;border:1px solid var(--line-2);border-radius:var(--r-inner);font-weight:600;font-variant-numeric:tabular-nums}
/* Der Wert steht AUF der Linie wie im gedruckten Vordruck — kein Kasten: ein Kasten sähe aus wie ein Eingabefeld
   (und baute den Feld-Baustein nach, selftest-bausteine), hier wird aber nichts eingegeben. */
.ust-feld{text-align:right;font-variant-numeric:tabular-nums;border-bottom:1px solid var(--line-2);padding-right:var(--s-2)}
.ust-saldo{border-top:2px solid var(--line-2);border-bottom:none;font-size:var(--t-4);font-weight:700}
.ust-schritte{padding-left:1.2em;display:grid;gap:var(--s-3)}
.ust-schritt-stand{margin:var(--s-1) 0}
.ust-diff-block{margin:var(--s-3) 0;padding:var(--s-3) var(--s-4);border:1px solid var(--warn-bdr);border-radius:var(--r-inner)}
.ust-diff-block.ok{border-color:var(--ok)}
@media (max-width:560px){ .ust-zeile{grid-template-columns:minmax(0,1fr) 3em 7.5em} .ust-nr{display:none} }
