/* =====================================================================
   MiniERP – Stylesheet (V4: Design-Tokens & Themes, E40)

   Aufbau in Schichten – NUR Optik, keine Logik:
   1. TOKENS      benannte Grundwerte (Farbe, Abstand, Radius, Schrift,
                  Schatten). Alles Weitere greift ausschließlich auf
                  Tokens zu – EINE Stelle für das ganze Gesicht.
   2. THEMES      Hell (Standard) / Dunkel über html[data-theme],
                  Akzent Blau (Standard) / Grün über html[data-akzent].
                  Gesetzt werden die Attribute vom kleinen Umschalter
                  in base.html (localStorage, rein clientseitig).
   3. BASIS       Reset, Grundtypografie.
   4. BAUSTEINE   Layout, Navigation, Topbar, Buttons, Tabellen,
                  Formulare, Kacheln, Badges/Ampeln, Belege, Diagramm.
   5. RESPONSIVE  Verhalten auf schmalen Fenstern.
   ===================================================================== */

/* =====================  1. TOKENS (Hell, Akzent Blau)  ============== */

:root {
  /* Akzent – die EINE Handlungsfarbe (Buttons, Links, aktive Navigation) */
  --akzent:        #1a66c2;
  --akzent-hover:  #124f9e;   /* dunklere Stufe für Hover/Aktiv */
  --akzent-tint:   #e8f0fb;   /* zarte Akzentfläche (aktiver Menüpunkt) */
  --akzent-tint2:  #f3f7fd;   /* noch zarter (Hintergründe) */
  --akzent-text:   #114b93;   /* Akzentfarbe als Text AUF der Tintfläche */

  /* Neutrale Flächen und Linien */
  --bg:        #f4f5f7;       /* Seitenhintergrund */
  --flaeche:   #ffffff;       /* Karten, Tabellen, Formulare, Leisten */
  --flaeche-2: #f8f9fb;       /* Tabellenkopf, Zeilen-Hover, Code */
  --linie:     #e1e4ea;       /* Trennlinien außen */
  --linie-2:   #eceef2;       /* feine Linien innen */

  /* Text in drei Stufen */
  --text:   #1c2333;          /* Fließtext, Zahlen */
  --text-2: #5b6472;          /* Sekundärtext (Untertitel, Labels) */
  --text-3: #8b93a1;          /* Tertiärtext (Quellenangaben, Gruppentitel) */

  /* Semantik: Erfolg / Warnung / Gefahr / Info / Violett / Neutral.
     Jeweils als Paar Fläche+Text (Badges, Ampeln) plus Vollton. */
  --erfolg:      #1a7f37;  --erfolg-bg:  #d9f0dd;  --erfolg-text: #135c28;
  --warn:        #9a6700;  --warn-bg:    #fdf0c7;  --warn-text:   #7a5200;
  --gefahr:      #c0392b;  --gefahr-bg:  #fbe1de;  --gefahr-text: #99301f;
  --gefahr-flaeche: #fdf4f3;                       /* rote KPI-Kachel */
  --info-bg:     #dbe9fb;  --info-text:  #1b4e8a;
  --violett-bg:  #e5e4fb;  --violett-text:#4338ca;
  --neutral-bg:  #eceef2;  --neutral-text:#5b6472;
  /* Ausbau 25 B0 – vier Werte, die die Bereichs-Stile (Abschnitt 6) gebraucht haben und
     die es hier noch nicht gab:
     * --gefahr-linie ist der ZARTE rote Rahmen um eine Gefahrenfläche (der Vollton
       --gefahr wäre dafür zu laut – er umrandete den Kasten wie einen Alarm).
     * --violett und --neutral sind die fehlenden VOLLTÖNE zu den beiden Paaren darüber:
       ein gefülltes Etikett braucht eine Fläche, auf der weiße Schrift steht.
     * Blaugrün ist die dritte Bedeutung neben Erfolg und Warnung: ein TAUSCH (Ausgleich,
       Umbuchung, Antwort) ist weder Ertrag noch Aufwand – und darf deshalb weder grün
       noch rot aussehen. */
  --gefahr-linie: #f3c2bc;
  --violett:      #4338ca;
  --neutral:      #6b7280;
  --blaugruen:    #0f766e;  --blaugruen-bg: #ccfbf1; --blaugruen-text: #0f766e;

  /* Abstände – gerade Treppe, kompakt (ERP-Arbeitsplatz) */
  --ab-1: 4px;  --ab-2: 8px;  --ab-3: 12px;  --ab-4: 16px;
  --ab-5: 24px; --ab-6: 32px;

  /* Radien */
  --radius-s: 6px; --radius: 9px; --radius-rund: 999px;

  /* Typografie */
  --schrift: "Segoe UI", system-ui, -apple-system, Roboto, sans-serif;
  --mono:    ui-monospace, "Cascadia Code", SFMono-Regular, Menlo, monospace;
  --gr-xs: .72rem;  --gr-s: .8rem;  --gr-m: .875rem;  --gr-l: .95rem;
  --gr-h1: 1.3rem;  --gr-zahl: 1.45rem;

  /* Schatten */
  --schatten:   0 1px 2px rgba(16, 24, 40, .05);
  --schatten-2: 0 4px 14px rgba(16, 24, 40, .10);

  /* Fokus-Ring (Tastatur/Barrierefreiheit) */
  --ring: 0 0 0 3px var(--akzent-tint);

  color-scheme: light;
}

/* =====================  2. THEMES  ================================== */

/* Akzent Grün – die Hausfarbe von „Paulsen Grün & Service“ */
html[data-akzent="gruen"] {
  --akzent:       #2f7d32;
  --akzent-hover: #1b5e20;
  --akzent-tint:  #eaf3ea;
  --akzent-tint2: #f2f8f2;
  --akzent-text:  #1b5e20;
}

/* Dunkles Thema – gleiche Tokens, andere Werte */
html[data-theme="dunkel"] {
  --akzent:        #6ea8ee;
  --akzent-hover:  #8dbcf5;
  --akzent-tint:   #1b304e;
  --akzent-tint2:  #142238;
  --akzent-text:   #9cc3f5;

  --bg:        #0f1319;
  --flaeche:   #171c24;
  --flaeche-2: #1d232d;
  --linie:     #2a3240;
  --linie-2:   #232a36;

  --text:   #e6e9ef;
  --text-2: #9aa4b2;
  --text-3: #6e7787;

  --erfolg:      #57ab5a;  --erfolg-bg:  #17301b;  --erfolg-text: #7fc783;
  --warn:        #d4a72c;  --warn-bg:    #332a10;  --warn-text:   #e0b64f;
  --gefahr:      #e5645a;  --gefahr-bg:  #3a1c19;  --gefahr-text: #f08c84;
  --gefahr-flaeche: #251a1c;
  --info-bg:     #17293f;  --info-text:  #82b1e8;
  --violett-bg:  #262346;  --violett-text:#a5a0f0;
  --neutral-bg:  #242b36;  --neutral-text:#9aa4b2;
  --gefahr-linie: #5c2a25;
  --violett:      #6c66e0;
  --neutral:      #4b5563;
  --blaugruen:    #2dd4bf;  --blaugruen-bg: #134e4a; --blaugruen-text: #99f6e4;

  --schatten:   0 1px 2px rgba(0, 0, 0, .35);
  --schatten-2: 0 4px 14px rgba(0, 0, 0, .45);

  color-scheme: dark;
}

/* Dunkel + Akzent Grün */
html[data-theme="dunkel"][data-akzent="gruen"] {
  --akzent:       #66bb6a;
  --akzent-hover: #85cc88;
  --akzent-tint:  #1c3320;
  --akzent-tint2: #16281a;
  --akzent-text:  #93d296;
}

/* =====================  3. BASIS  =================================== */

* { box-sizing: border-box; }

html, body { height: 100%; }

body {
  margin: 0;
  font-family: var(--schrift);
  font-size: var(--gr-l);
  color: var(--text);
  background: var(--bg);
  line-height: 1.5;
  -webkit-font-smoothing: antialiased;
}

::selection { background: var(--akzent-tint); color: var(--akzent-text); }

a { color: var(--akzent); }
a:focus-visible, button:focus-visible,
input:focus-visible, select:focus-visible, textarea:focus-visible {
  outline: none; box-shadow: var(--ring);
}

/* =====================  4. BAUSTEINE  =============================== */

/* ---- Grundgerüst: Seitenleiste + Topbar + Inhalt ------------------- */
.layout { display: flex; align-items: flex-start; min-height: 100vh; }

.sidebar {
  width: 232px;
  flex-shrink: 0;
  align-self: stretch;
  background: var(--flaeche);
  border-right: 1px solid var(--linie);
  position: sticky;
  top: 0;
  height: 100vh;
  overflow-y: auto;
  padding: var(--ab-4) var(--ab-3) var(--ab-5);
}

.inhalt { flex: 1; min-width: 0; }

main { max-width: 1160px; margin: 0 auto; padding: var(--ab-5) var(--ab-6) 72px; }
/* Ausbau 28 B (ORG-409): „breit" hebt die 1160-px-Grenze auf – der Innenabstand bleibt, die
   Seitenleiste bleibt, wo sie ist. Das Attribut setzt das frühe Skript in base.html aus
   localStorage `minierp-breite`; Vorgabe ist schmal. */
html[data-breite="breit"] main { max-width: none; }

/* ---- Topbar: Brotkrumen links, Themenschalter rechts --------------- */
.topbar {
  position: sticky; top: 0; z-index: 20;
  display: flex; align-items: center; justify-content: space-between;
  gap: var(--ab-4);
  min-height: 48px;
  padding: 0 var(--ab-5);
  background: var(--flaeche);
  border-bottom: 1px solid var(--linie);
}
.topbar-schalter { display: flex; align-items: center; gap: var(--ab-2); }
.topbar-titel { font-size: var(--gr-m); font-weight: 600; color: var(--text); padding: 12px 0; }

/* Umschalter Hell/Dunkel + Akzentfarbe (rein clientseitig, base.html) */
.schalter-knopf {
  display: inline-flex; align-items: center; justify-content: center;
  width: 30px; height: 30px;
  border: 1px solid var(--linie); border-radius: var(--radius-s);
  background: none; color: var(--text-2); cursor: pointer; padding: 0;
}
.schalter-knopf:hover { border-color: var(--akzent); color: var(--akzent); }
.schalter-knopf svg { width: 16px; height: 16px; }
/* Der Knopf zeigt das Ziel: im Hellen den Mond, im Dunkeln die Sonne. */
.schalter-knopf .icon-sonne { display: none; }
html[data-theme="dunkel"] .schalter-knopf .icon-sonne { display: block; }
html[data-theme="dunkel"] .schalter-knopf .icon-mond  { display: none; }
/* Der Breite-Schalter (ORG-409) zeigt ebenfalls das Ziel: schmal → Pfeile nach außen. */
.schalter-knopf .icon-schmal { display: none; }
html[data-breite="breit"] .schalter-knopf .icon-schmal { display: block; }
html[data-breite="breit"] .schalter-knopf .icon-breit  { display: none; }

.akzent-knopf {
  width: 22px; height: 22px; border-radius: var(--radius-rund);
  border: 2px solid transparent; cursor: pointer; padding: 2px;
  background: none;
}
.akzent-knopf span {
  display: block; width: 100%; height: 100%;
  border-radius: var(--radius-rund);
}
.akzent-knopf .punkt-blau  { background: #1a66c2; }
.akzent-knopf .punkt-gruen { background: #2f7d32; }
.akzent-knopf.gewaehlt { border-color: var(--akzent); }
.akzent-knopf:hover { border-color: var(--text-3); }
.akzent-knopf.gewaehlt:hover { border-color: var(--akzent); }

/* ---- Marke im Kopf der Seitenleiste ---- */
.brand {
  display: flex; align-items: center; gap: 10px;
  text-decoration: none; color: var(--text);
  padding: var(--ab-1) var(--ab-2) var(--ab-3);
  margin-bottom: var(--ab-2);
  border-bottom: 1px solid var(--linie-2);
}
.brand-logo {
  font-size: 1.15rem; line-height: 1;
  width: 36px; height: 36px; flex-shrink: 0;
  display: grid; place-items: center;
  /* App-Icon-Kachel in der grünen Marken-Identität ("Paulsen Grün"), unabhängig vom
     gewählten Akzent. Weicher Verlauf + Schatten lassen das 🌱 wie ein Programm-Icon wirken. */
  background: linear-gradient(145deg, #3fc281, #12603c);
  border-radius: 10px;
  box-shadow: 0 2px 6px rgba(18, 96, 60, .35), inset 0 1px 0 rgba(255, 255, 255, .28);
}
.brand-text { display: flex; flex-direction: column; font-weight: 700; font-size: .98rem; letter-spacing: -.01em; }
.brand-text small { font-weight: 500; font-size: .7rem; color: var(--text-2); letter-spacing: .01em; }

/* ---- Navigation (Bereichsebene, mit Icons) ---- */
.sidebar nav { display: flex; flex-direction: column; gap: 2px; }
.nav-gruppe {
  color: var(--text-3); font-size: var(--gr-xs); font-weight: 700;
  text-transform: uppercase; letter-spacing: .07em;
  padding: var(--ab-2) var(--ab-2) var(--ab-1); margin-top: var(--ab-2);
}
.nav-link {
  display: flex; align-items: center; gap: 10px;
  padding: 6px 10px; border-radius: var(--radius-s);
  color: var(--text-2); text-decoration: none;
  font-size: var(--gr-m); font-weight: 500;
}
.nav-link svg { width: 17px; height: 17px; flex-shrink: 0; opacity: .85; }
.nav-link:hover { background: var(--flaeche-2); color: var(--text); }
.nav-link.aktiv {
  background: var(--akzent-tint);
  color: var(--akzent-text);
  font-weight: 600;
}
.nav-link.aktiv svg { opacity: 1; }

/* ---- Überschriften & Seitenkopf ---- */
h1 { margin: 0 0 var(--ab-1); font-size: var(--gr-h1); letter-spacing: -.015em; }
h1 small { font-size: .8em; color: var(--text-2); font-weight: 500; }
.unter { color: var(--text-2); margin-top: 0; font-size: var(--gr-m); }
/* ORG-404: Blockkopf über den Leistungen eines Verkaufsfalls (Gruppe am Stammsatz). */
h3.block-kopf { font-size: var(--gr-m); margin: var(--ab-4) 0 var(--ab-2); }
h3.block-kopf small { font-weight: 400; margin-left: 6px; }

h2.abschnitt {
  font-size: var(--gr-s); font-weight: 700; color: var(--text-2);
  text-transform: uppercase; letter-spacing: .06em;
  margin: var(--ab-6) 0 var(--ab-3);
}
h2 { font-size: 1.05rem; }

.kopf { display: flex; align-items: center; justify-content: space-between; gap: var(--ab-4); margin-bottom: var(--ab-4); }

.fussnote { color: var(--text-2); font-size: var(--gr-m); margin-top: var(--ab-5); }

/* ---- Buttons ---- */
.btn {
  display: inline-flex; align-items: center; gap: 6px;
  background: var(--akzent); color: #fff;
  padding: 7px 14px; border: none; border-radius: var(--radius-s);
  font-size: var(--gr-m); font-weight: 600; text-decoration: none; cursor: pointer;
  font-family: inherit;
  transition: background .12s ease;
}
.btn:hover { background: var(--akzent-hover); }
html[data-theme="dunkel"] .btn { color: #0f1319; }

/* DIE DREI STUFEN (Ausbau 28 D, ORG-411): auf einer Seite gibt es EINE Hauptaktion – sie
   trägt `.btn` und ist gefüllt. Alles andere ist entweder UMRISS (`.btn.umriss`: gleiche
   Größe, nur Rand – die zweite Wahl neben der ersten) oder ein TEXTLINK (`<a>` ohne
   Knopfklasse, in `.aktionen` grau). Zwei gefüllte Knöpfe nebeneinander sagen „beides ist
   das Wichtigste" – und das stimmt nie. `.btn-mini` (klein, in Zeilen) und `.btn-export`
   (unter der Filterleiste) sind Umriss-Knöpfe an ihrem festen Platz und bleiben. */
.btn.umriss {
  background: none; color: var(--akzent-text);
  border: 1px solid var(--linie); padding: 6px 13px;
}
.btn.umriss:hover { border-color: var(--akzent); background: var(--akzent-tint); }
html[data-theme="dunkel"] .btn.umriss { color: var(--akzent-text); }
html[data-theme="dunkel"] .btn.umriss:hover { color: var(--akzent-text); }

/* dezenter, textnaher Knopf für „Deaktivieren“ – bewusst zurückhaltend */
.btn-gefahr {
  background: none; border: none; padding: 0; cursor: pointer;
  color: var(--gefahr); font-size: var(--gr-m); font-family: inherit;
}
.btn-gefahr:hover { text-decoration: underline; }

/* dezenter Mini-Knopf (Status-Schnellwechsel, Zurückziehen) */
.btn-mini {
  background: none; border: 1px solid var(--linie); border-radius: var(--radius-s);
  padding: 3px 9px; cursor: pointer; color: var(--akzent-text);
  font-size: var(--gr-s); font-family: inherit; font-weight: 600;
}
.btn-mini:hover { border-color: var(--akzent); background: var(--akzent-tint); }

/* Excel-Export der gefilterten Liste (Ausbau P7, E47): dezenter Umriss-Knopf, rechtsbündig
   direkt unter der Filterleiste – gehört sichtbar zu „diese Ansicht mitnehmen“. */
.export-leiste { display: flex; justify-content: flex-end; margin: calc(-1 * var(--ab-2)) 0 var(--ab-3); }
.btn-export {
  display: inline-flex; align-items: center; gap: 6px;
  background: none; border: 1px solid var(--linie); border-radius: var(--radius-s);
  padding: 5px 12px; cursor: pointer; color: var(--akzent-text); text-decoration: none;
  font-size: var(--gr-s); font-family: inherit; font-weight: 600;
}
.btn-export:hover { border-color: var(--akzent); background: var(--akzent-tint); }

.aktionen { display: flex; align-items: center; gap: var(--ab-4); margin-top: var(--ab-3); }
/* Der stille Text-Link in einer Aktionsleiste („Abbrechen", „Zur Liste") ist zurückhaltend
   – ein KNOPF ist er nicht. `.aktionen a` traf bisher beides und war spezifischer als
   `.btn`: jedes <a class="btn"> in einer Aktionsleiste stand blau auf blau. Die Ausnahme
   steht deshalb hier an der Wurzel und nicht als Notgriff in einzelnen Vorlagen – wer eine
   Knopfklasse trägt, behält die Farbe seiner Knopfklasse (und damit auch die dunkle
   Schrift, die das dunkle Thema dem .btn gibt). */
.aktionen a:not(.btn):not(.btn-mini):not(.btn-gefahr):not(.btn-export) { color: var(--text-2); }
.aktionen form { margin: 0; }

/* Aktionsspalte in Listen: Link + Knopf nebeneinander */
.zeile-aktionen { white-space: nowrap; }
.zeile-aktionen a { color: var(--akzent-text); text-decoration: none; font-size: var(--gr-m); margin-right: var(--ab-3); }
.zeile-aktionen a:hover { text-decoration: underline; }
.zeile-aktionen form { display: inline; margin: 0 0 0 var(--ab-1); }

/* ---- Filterleiste (P3, E43): Freitext-Suche + Statusfilter über einer Liste ---- */
.filterleiste {
  display: flex; flex-wrap: wrap; align-items: center; gap: var(--ab-2);
  margin: 0 0 var(--ab-4);
}
.filterleiste input[type="search"] {
  flex: 1 1 240px; min-width: 180px;
  padding: 7px 10px; border: 1px solid var(--linie); border-radius: var(--radius-s);
  font-size: var(--gr-m); font-family: inherit; color: var(--text); background: var(--flaeche);
  transition: border-color .12s ease, box-shadow .12s ease;
}
.filterleiste select {
  padding: 7px 10px; border: 1px solid var(--linie); border-radius: var(--radius-s);
  font-size: var(--gr-m); font-family: inherit; color: var(--text); background: var(--flaeche);
}
.filterleiste input:focus, .filterleiste select:focus {
  outline: none; border-color: var(--akzent); box-shadow: var(--ring);
}
.btn-filter {
  padding: 7px 14px; border: 1px solid var(--akzent); border-radius: var(--radius-s);
  background: var(--akzent-tint); color: var(--akzent-text);
  font-size: var(--gr-m); font-weight: 600; font-family: inherit; cursor: pointer;
}
.btn-filter:hover { background: var(--akzent); color: #fff; }
html[data-theme="dunkel"] .btn-filter:hover { color: #0f1319; }
.filter-reset { color: var(--text-2); font-size: var(--gr-m); text-decoration: none; }
.filter-reset:hover { text-decoration: underline; color: var(--akzent); }

/* Der FILTERKOPF über einer Auswahl (Ticket ORG-216, Bauteil _leistungswahl.html).
   Bewusst LEISER als die Filterleiste der Listen: dort ist Filtern die Hauptsache, hier ist
   es eine Lesehilfe neben der eigentlichen Arbeit (erfassen). Deshalb ein abgesetzter
   Streifen statt einer Leiste mit vollem Knopf – er soll auffindbar sein, nicht laut. */
.wahl-filter {
  display: flex; flex-wrap: wrap; align-items: flex-end; gap: var(--ab-2);
  margin: 0 0 var(--ab-3); padding: var(--ab-2) var(--ab-3);
  background: var(--flaeche-2); border: 1px solid var(--linie); border-radius: var(--radius-s);
}
.wahl-filter label {
  display: flex; flex-direction: column; gap: 3px;
  font-size: var(--gr-xs); font-weight: 700; text-transform: uppercase;
  letter-spacing: .05em; color: var(--text-2);
}
.wahl-filter input[type="search"], .wahl-filter select {
  padding: 6px 9px; border: 1px solid var(--linie); border-radius: var(--radius-s);
  font-size: var(--gr-m); font-family: inherit; color: var(--text); background: var(--flaeche);
  text-transform: none; letter-spacing: normal; font-weight: normal;
}
.wahl-filter input[type="search"] { min-width: 200px; }
.wahl-filter input:focus, .wahl-filter select:focus {
  outline: none; border-color: var(--akzent); box-shadow: var(--ring);
}
.wahl-filter .btn-mini { padding: 6px 11px; }
.wahl-filter-stand { color: var(--text-2); font-size: var(--gr-s); margin-left: auto; }

/* ---- Tabellen ----
   Ausbau 28 D (ORG-411): EINE Tabellensprache für das ganze Haus. Was früher an `.liste`,
   `.bericht` und einzelnen Bereichs-Tabellen hing, steht jetzt an `table` selbst:
   * Zahlen und Beträge stehen RECHTS und in Tabellenziffern (`.rechts` und das kurze `.r`
     sind DIESELBE Klasse – wer eine schreibt, meint die andere).
   * Der Kopf bleibt beim Scrollen stehen (sticky, unter der Kopfleiste). Dafür darf die
     Tabelle selbst kein `overflow: hidden` mehr tragen – ein Scroll-Container schluckt das
     Kleben. Die runden Ecken machen deshalb die Eckzellen, nicht die Tabelle.
   * Ein Formular in einer Zelle hat keinen Außenabstand.
   `.liste` und `.bericht` bleiben als Namen bestehen (der Bericht bringt Summenzeilen mit),
   tragen aber nichts mehr, was nicht jede Tabelle hätte. */
table {
  width: 100%; border-collapse: separate; border-spacing: 0;
  background: var(--flaeche); border: 1px solid var(--linie);
  border-radius: var(--radius); box-shadow: var(--schatten);
  font-variant-numeric: tabular-nums;
}
th, td { text-align: left; padding: 8px 12px; border-bottom: 1px solid var(--linie-2); vertical-align: top; font-size: var(--gr-m); }
th {
  background: var(--flaeche-2); font-size: var(--gr-xs); font-weight: 700;
  text-transform: uppercase; letter-spacing: .05em; color: var(--text-2);
}
thead th { position: sticky; top: 48px; z-index: 2; }
thead tr:first-child th:first-child { border-top-left-radius: var(--radius); }
thead tr:first-child th:last-child  { border-top-right-radius: var(--radius); }
table > tbody:last-child tr:last-child td:first-child,
table > tfoot tr:last-child td:first-child, table > tfoot tr:last-child th:first-child { border-bottom-left-radius: var(--radius); }
table > tbody:last-child tr:last-child td:last-child,
table > tfoot tr:last-child td:last-child, table > tfoot tr:last-child th:last-child { border-bottom-right-radius: var(--radius); }
tbody tr:last-child td { border-bottom: none; }
tbody tr:hover { background: var(--flaeche-2); }
.rechts, .r, th.rechts, td.rechts, th.r, td.r { text-align: right; font-variant-numeric: tabular-nums; }
td.rechts, td.r { white-space: nowrap; }
table form { margin: 0; }
/* Die Aktionsspalte steht IMMER rechts außen – und die Knöpfe darin brechen nicht um. */
table .zeile-aktionen { text-align: right; }
table .zeile-aktionen a { margin-right: 0; margin-left: var(--ab-3); }
small { color: var(--text-2); font-weight: normal; }
.mono { font-family: var(--mono); font-size: .82rem; }
code { font-family: var(--mono); font-size: .84em; background: var(--flaeche-2); padding: 1px 5px; border-radius: 4px; }
pre code { background: none; padding: 0; }

.leer {
  color: var(--text-2); background: var(--flaeche);
  border: 1px dashed var(--linie); padding: var(--ab-5); border-radius: var(--radius); text-align: center;
  font-size: var(--gr-m);
}
/* ORG-411: der LEERE ZUSTAND sagt, was hier stehen wird, und trägt den Anlege-Knopf – als
   Umriss unter dem Satz, damit er nicht mit der Hauptaktion oben rechts konkurriert. */
.leer .btn { display: block; width: max-content; margin: var(--ab-3) auto 0; }

/* schmales Eingabefeld IN einer Tabellenzelle (z. B. Kennzahl-Werte) */
td input.zelle-eingabe {
  width: 120px; text-align: right; padding: 5px 8px;
  border: 1px solid var(--linie); border-radius: var(--radius-s);
  font-size: var(--gr-m); font-family: inherit; color: var(--text); background: var(--flaeche);
}
td input.zelle-eingabe:focus { outline: none; border-color: var(--akzent); box-shadow: var(--ring); }

/* ---- Verstecktes bleibt versteckt (Ausbau 19 C, ORG-231) ----
   Das HTML-Attribut `hidden` bringt nur ein schwaches `display: none` des Browsers mit –
   JEDE eigene display-Regel schlägt es. Genau daran scheiterte schon `.kal-schnell`
   (ORG-103); mit der Typwahl beträfe es `.formular label { display: flex }`, jedes
   `fieldset` und jede `.zeile`. Deshalb steht die Regel EINMAL hier statt je Baustein
   noch einmal. `!important` ist kein Notnagel, sondern die Aussage: versteckt ist
   versteckt, egal was ein Baustein sonst möchte. */
[hidden] { display: none !important; }

/* ---- Formulare ---- */
.formular {
  background: var(--flaeche); border: 1px solid var(--linie);
  border-radius: var(--radius); padding: var(--ab-5); box-shadow: var(--schatten);
  display: flex; flex-direction: column; gap: var(--ab-3); max-width: 640px;
}
.formular label { display: flex; flex-direction: column; font-size: var(--gr-m); font-weight: 600; gap: 4px; }
.formular input, .formular select, .formular textarea {
  padding: 7px 10px; border: 1px solid var(--linie); border-radius: var(--radius-s);
  font-size: var(--gr-l); font-weight: normal; font-family: inherit; color: var(--text);
  background: var(--flaeche); transition: border-color .12s ease, box-shadow .12s ease;
}
.formular input:focus, .formular select:focus, .formular textarea:focus {
  outline: none; border-color: var(--akzent); box-shadow: var(--ring);
}
.formular .zeile { display: flex; gap: var(--ab-3); }
.formular .zeile label { flex: 1; }
.formular fieldset {
  border: 1px solid var(--linie); border-radius: var(--radius-s);
  padding: var(--ab-3); margin: 0;
  display: flex; flex-direction: column; gap: var(--ab-3);
}
.formular legend { font-size: var(--gr-s); color: var(--text-2); padding: 0 6px; }

/* Checkbox-Reihe (z. B. Empfänger-Kostenstellen) */
.formular .wahl-reihe { display: flex; flex-wrap: wrap; gap: 10px 20px; }
.formular .wahl-reihe label { flex-direction: row; align-items: center; gap: 6px; font-weight: normal; }

.flash {
  background: var(--erfolg-bg); border: 1px solid var(--erfolg);
  color: var(--erfolg-text);
  border-radius: var(--radius-s); padding: 10px 14px; margin-bottom: var(--ab-5);
  font-size: var(--gr-m);
}

/* ORG-402: ein Prüffehler beim Speichern ist ROT und heißt so – nie ein grüner Kasten.
   Dazu der Anker am Feld (Rahmen + Satz darunter), gesetzt vom Skript in base.html. */
.flash.flash-fehler {
  background: var(--gefahr-bg); border-color: var(--gefahr); color: var(--gefahr-text);
}
.flash.flash-fehler strong { display: block; margin-bottom: 2px; }
.feld-fehler, input.feld-fehler, select.feld-fehler, textarea.feld-fehler {
  border-color: var(--gefahr) !important; box-shadow: 0 0 0 2px var(--gefahr-bg);
}
.feldfehler-satz {
  color: var(--gefahr-text); font-size: var(--gr-s); margin: 4px 0 6px;
}

.hinweis { color: var(--text-2); font-size: var(--gr-s); margin: 2px 0; }

/* ---- Abstände und Maße als KLASSEN (Ausbau 28 D, ORG-411) ----
   Bis hierher standen in 24 Vorlagen `style="margin-top:.5rem"`, `style="display:inline"`
   und ähnliche Handgriffe – 33 Stellen, jede ein wenig anders. Sie stehen jetzt hier, in
   Tokens, und die Vorlage sagt nur noch, WAS sie meint. Ein `style=` in einer Vorlage ist
   seither nur noch für DATEN erlaubt (eine Farbe aus der Datenbank, ein Prozentbalken);
   tests/test_org411.py misst es. Kurze Namen mit Vorsilbe `u-` („Umriss/Utility"), damit
   sie im Markup als Maß erkennbar sind und keiner Fachklasse in die Quere kommen. */
.u-inline      { display: inline; }
.u-auto-links  { margin-left: auto; }
.u-oben-2      { margin-top: var(--ab-2); }
.u-oben-3      { margin-top: var(--ab-3); }
.u-unten-2     { margin-bottom: var(--ab-2); }
.u-links-2     { margin-left: var(--ab-2); }
.u-blass       { opacity: .55; }
.u-vorformat   { white-space: pre-wrap; }
.u-schmal      { max-width: 6rem; }
.u-schmal-5    { max-width: 5.5rem; }
.u-breite-6    { width: 6rem; }
.u-breite-8    { width: 8rem; }
.u-breite-9    { width: 9rem; }
/* Spaltenbreiten in Prozent für <colgroup> (Positionstabelle der Bestellung). */
.sp-8  { width: 8%; }  .sp-9  { width: 9%; }  .sp-12 { width: 12%; } .sp-13 { width: 13%; }
.sp-17 { width: 17%; } .sp-20 { width: 20%; }

/* ---- Karten: Hub-Kacheln & freie Info-Karten ---- */
.cards { display: flex; flex-wrap: wrap; gap: var(--ab-3); margin-top: var(--ab-4); }
.card {
  flex: 1; min-width: 150px; background: var(--flaeche);
  border: 1px solid var(--linie); border-radius: var(--radius);
  padding: var(--ab-4) var(--ab-5); text-decoration: none; color: inherit;
  display: flex; flex-direction: column; gap: 3px; box-shadow: var(--schatten);
  transition: border-color .12s ease, transform .12s ease, box-shadow .12s ease;
}
a.card:hover { border-color: var(--akzent); transform: translateY(-2px); box-shadow: var(--schatten-2); }
.card .zahl { font-size: var(--gr-zahl); font-weight: 700; color: var(--text); letter-spacing: -.02em; }
.card span:not(.zahl) { color: var(--text-2); font-size: var(--gr-m); }
.card.karte-warnung { border-color: var(--warn); background: var(--warn-bg); }
.card.karte-warnung .zahl, .card.karte-warnung span:not(.zahl) { color: var(--warn-text); }

/* freie Karte für Text/Inhalt (z. B. API-Schlüssel-Bereich).
   Ausbau 28 D (ORG-411): EINE Kartenregel – Kachel (.card), Karte (.karte), Belegkopf,
   Buchung und Formular teilen sich Ecke (--radius), Schatten (--schatten) und Innenabstand
   (--ab-4 senkrecht, --ab-5 waagerecht). Wer eine neue Fläche baut, nimmt diese drei
   Tokens und keine eigenen Pixel. */
.karte {
  background: var(--flaeche); border: 1px solid var(--linie);
  border-radius: var(--radius); padding: var(--ab-4) var(--ab-5); margin: var(--ab-4) 0;
  box-shadow: var(--schatten);
}
.karte h2 { margin-top: 0; }
.karte-erfolg { border-color: var(--erfolg); }
/* P1 (E41): Gefahrenzone der Verwaltung – rote Karte + voll gefüllter Warnknopf. Reine
   Token-Nutzung (E40), damit sie sich mit Theme/Akzent mitfärbt. */
.karte-gefahr { border-color: var(--gefahr); background: var(--gefahr-flaeche); }
.btn.btn-gefahr-voll { background: var(--gefahr); color: #fff; }
.btn.btn-gefahr-voll:hover { background: var(--gefahr); filter: brightness(1.08); }
html[data-theme="dunkel"] .btn.btn-gefahr-voll { color: #fff; }
.karte pre {
  padding: 10px 12px; background: var(--flaeche-2);
  border-radius: var(--radius-s); overflow: auto;
  font-family: var(--mono); font-size: .85rem;
}
.markierbar { user-select: all; }

/* ---- Status-Badges (ein Vokabular für alle Zustände) ---- */
.badge { display: inline-block; padding: 2px 10px; border-radius: var(--radius-rund); font-size: var(--gr-xs); font-weight: 600; white-space: nowrap; }
.badge-offen      { background: var(--warn-bg); color: var(--warn-text); }
.badge-angenommen { background: var(--info-bg); color: var(--info-text); }
.badge-berechnet  { background: var(--info-bg); color: var(--info-text); }
.badge-geliefert  { background: var(--violett-bg); color: var(--violett-text); }
.badge-bezahlt    { background: var(--erfolg-bg); color: var(--erfolg-text); }
.badge-abgelehnt  { background: var(--gefahr-bg); color: var(--gefahr-text); }
.badge-storniert  { background: var(--neutral-bg); color: var(--neutral-text); text-decoration: line-through; }

/* D5 – Aufgaben: Priorität, Status, Überfällig */
.badge.prio-hoch     { background: var(--gefahr-bg); color: var(--gefahr-text); }
.badge.prio-mittel   { background: var(--warn-bg); color: var(--warn-text); }
.badge.prio-niedrig  { background: var(--neutral-bg); color: var(--neutral-text); }
.badge.status-offen     { background: var(--warn-bg); color: var(--warn-text); }
.badge.status-in_arbeit { background: var(--violett-bg); color: var(--violett-text); }
.badge.status-erledigt  { background: var(--erfolg-bg); color: var(--erfolg-text); }
/* API-Schlüssel (6a) */
.badge.api-aktiv { background: var(--erfolg-bg); color: var(--erfolg-text); }
.badge.api-weg   { background: var(--neutral-bg); color: var(--neutral-text); }
.badge.badge-vorlage { background: var(--violett); color: #fff; }   /* Ticket als Vorlage (ORG-411, vorher inline) */
.ueberfaellig { color: var(--gefahr); font-size: var(--gr-xs); font-weight: 700; }

/* Ausbau 07 / A (E71): Aufwand-Badge (Vorgabezeit·Schwierigkeit) + Countdown + Formzeile. */
.badge.aufwand-badge { background: var(--akzent-tint); color: var(--akzent-text); font-variant-numeric: tabular-nums; }
.countdown { color: var(--text-2); font-size: var(--gr-xs); font-weight: 600; white-space: nowrap; }
.gantt-label .countdown { display: block; }
.feld-paar { display: inline-flex; gap: .4rem; align-items: center; flex-wrap: wrap; }
.feld-hinweis { color: var(--text-2); margin: .1rem 0 .6rem; }

/* ---- Belegfluss-Kette ---- */
.belegfluss { display: flex; align-items: stretch; flex-wrap: wrap; gap: var(--ab-2); margin: 6px 0 var(--ab-5); }
.belegfluss .pfeil { align-self: center; color: var(--text-3); font-size: 1.1rem; }
.fluss-knoten {
  display: flex; flex-direction: column; gap: 3px; text-decoration: none; color: inherit;
  background: var(--flaeche); border: 1px solid var(--linie); border-radius: var(--radius-s);
  padding: 9px 13px; min-width: 120px;
}
.fluss-knoten:hover { border-color: var(--akzent); }
.fluss-knoten.aktuell { border-color: var(--akzent); background: var(--akzent-tint2); box-shadow: 0 0 0 1px var(--akzent) inset; }
.fluss-knoten.erledigt { background: var(--flaeche-2); opacity: .92; }
.fluss-art { font-size: var(--gr-xs); color: var(--text-2); text-transform: uppercase; letter-spacing: .03em; }
.fluss-nr { font-weight: 700; font-size: var(--gr-m); }

/* ---- Belegkopf ---- */
.beleg-kopf {
  display: flex; flex-wrap: wrap; gap: var(--ab-3) var(--ab-6);
  background: var(--flaeche); border: 1px solid var(--linie);
  border-radius: var(--radius); padding: var(--ab-4) var(--ab-5); margin-bottom: var(--ab-4); box-shadow: var(--schatten);
  font-size: var(--gr-m);
}
.beleg-kopf .feld { display: block; font-size: var(--gr-xs); color: var(--text-2); text-transform: uppercase; letter-spacing: .04em; margin-bottom: 2px; }

/* ---- Summenblock ---- */
.summen { margin: var(--ab-4) 0 var(--ab-4) auto; width: 300px; max-width: 100%; font-size: var(--gr-m); }
.summen > div { display: flex; justify-content: space-between; padding: 4px 0; }
.summen .brutto { border-top: 2px solid var(--linie); margin-top: var(--ab-1); padding-top: var(--ab-2); font-size: 1.05rem; font-weight: 700; color: var(--text); }

/* ---- Positions-Eingabe ---- */
table.pos-eingabe { margin-top: 6px; box-shadow: none; }
table.pos-eingabe input, table.pos-eingabe select {
  width: 100%; padding: 6px 8px; border: 1px solid var(--linie); border-radius: var(--radius-s);
  font-size: var(--gr-m); font-family: inherit; color: var(--text); background: var(--flaeche);
}
table.pos-eingabe input:focus, table.pos-eingabe select:focus { outline: none; border-color: var(--akzent); box-shadow: var(--ring); }
table.pos-eingabe td { padding: 5px 8px; }
/* ORG-411: Zahlen stehen auch in Eingabezellen rechts – wie in jeder Liste. */
table input[type="number"], table.pos-eingabe input[type="number"] { text-align: right; font-variant-numeric: tabular-nums; }

tfoot td { border-top: 2px solid var(--linie); font-weight: 600; }

/* ---- Rechnungswesen: Buchungssätze ---- */
.buchung { background: var(--flaeche); border: 1px solid var(--linie); border-radius: var(--radius); padding: var(--ab-4) var(--ab-5); margin: var(--ab-4) 0; box-shadow: var(--schatten); }
.buchung-kopf { display: flex; align-items: center; flex-wrap: wrap; gap: 10px; margin-bottom: 10px; }
.buchung-nr { font-weight: 700; font-family: var(--mono); font-size: .88rem; }
.buchung-text { color: var(--text); font-size: var(--gr-m); }
.buchung-beleg { color: var(--akzent); text-decoration: none; font-size: var(--gr-m); }
.buchung-beleg:hover { text-decoration: underline; }
.buchung-datum { margin-left: auto; color: var(--text-2); font-size: var(--gr-s); }
table.buchungssatz { margin: 0; box-shadow: none; }
table.buchungssatz th { font-size: var(--gr-xs); }
table.buchungssatz td, table.buchungssatz th { padding: 7px 11px; }
.konto-nr { font-family: var(--mono); color: var(--text-2); margin-right: 4px; font-size: .85em; }

/* =====================================================================
   Cockpit (Track D) – Kacheln/Panels des CEO-Arbeitsplatzes
   ===================================================================== */
.cockpit-stand { color: var(--text-2); font-size: var(--gr-s); white-space: nowrap; }

/* KPI-Kacheln */
.kpi-grid {
  display: grid; gap: var(--ab-3); margin: var(--ab-3) 0 var(--ab-2);
  grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
}
.kpi {
  background: var(--flaeche); border: 1px solid var(--linie);
  border-left: 3px solid var(--akzent);
  border-radius: var(--radius); padding: var(--ab-3) var(--ab-4); box-shadow: var(--schatten);
  display: flex; flex-direction: column; gap: 3px; min-width: 0;
}
.kpi-titel { color: var(--text-2); font-size: var(--gr-s); font-weight: 600; }
.kpi-wert {
  font-size: var(--gr-zahl); font-weight: 700; color: var(--text);
  letter-spacing: -.02em; line-height: 1.15; overflow-wrap: anywhere;
}
.kpi.ampel-gruen { border-left-color: var(--erfolg); }
.kpi.ampel-gruen .kpi-wert { color: var(--erfolg); }
.kpi.ampel-rot { border-left-color: var(--gefahr); background: var(--gefahr-flaeche); }
.kpi.ampel-rot .kpi-wert { color: var(--gefahr); }
.kpi-details {
  display: flex; flex-wrap: wrap; gap: 4px 16px; margin-top: 4px;
  padding-top: var(--ab-2); border-top: 1px solid var(--linie-2);
}
.kpi-detail { display: flex; gap: 6px; font-size: var(--gr-s); }
.kpi-detail .d-label { color: var(--text-2); }
.kpi-detail .d-wert { font-weight: 600; }

/* Breitere Panels: Listen, Reihen, Status */
.panel-grid {
  display: grid; gap: var(--ab-3); margin: 6px 0 var(--ab-2);
  grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
}
.panel {
  background: var(--flaeche); border: 1px solid var(--linie);
  border-radius: var(--radius); padding: var(--ab-3) var(--ab-4); box-shadow: var(--schatten);
  display: flex; flex-direction: column; min-width: 0;
}
.panel-titel { font-weight: 700; font-size: var(--gr-m); margin-bottom: var(--ab-2); }
.panel-liste, .panel-reihe { list-style: none; margin: 0; padding: 0; }
.panel-liste li, .panel-reihe li {
  display: flex; justify-content: space-between; gap: var(--ab-3); align-items: baseline;
  padding: 6px 0; border-bottom: 1px solid var(--linie-2);
  font-size: var(--gr-m);
}
.panel-liste li:last-child, .panel-reihe li:last-child { border-bottom: none; }
.panel .z-text { color: var(--text); min-width: 0; overflow-wrap: anywhere; }
.panel .z-text small { color: var(--text-2); }
.panel .z-wert { font-weight: 600; white-space: nowrap; }
.panel-leer { color: var(--text-2); font-size: var(--gr-m); padding: 6px 0 10px; }
.panel-stufen { display: flex; flex-wrap: wrap; gap: var(--ab-2); }
.stufe { padding: 3px 12px; border-radius: var(--radius-rund); font-size: var(--gr-s); font-weight: 600; background: var(--neutral-bg); color: var(--neutral-text); }
.stufe-erledigt { background: var(--erfolg-bg); color: var(--erfolg-text); }
.stufe-aktuell  { background: var(--akzent-tint); color: var(--akzent-text); box-shadow: 0 0 0 1px var(--akzent) inset; }
.stufe-offen    { background: var(--warn-bg); color: var(--warn-text); }
/* D4 – Prozess-Ampeln */
.stufe-gruen    { background: var(--erfolg-bg); color: var(--erfolg-text); }
.stufe-neutral  { background: var(--neutral-bg); color: var(--neutral-text); }

/* Quellenangabe unten in jeder Kachel (Panel-Vertrag: `quelle`) */
.panel-quelle {
  margin-top: auto; padding-top: 10px;
  color: var(--text-3); font-size: var(--gr-xs); letter-spacing: .02em;
}
.kpi .panel-quelle { padding-top: var(--ab-2); }

/* ---- Balkendiagramm (Reihe-Panel, D3) ---- */
.chart { display: flex; flex-direction: column; gap: var(--ab-2); margin: 2px 0 4px; }
.chart-row {
  display: grid;
  grid-template-columns: minmax(72px, 30%) 1fr auto;
  align-items: center; gap: 10px;
}
.chart-label { color: var(--text-2); font-size: var(--gr-s); overflow-wrap: anywhere; }
.chart-track {
  position: relative; height: 12px; border-radius: var(--radius-rund);
  background: var(--linie-2); overflow: hidden;
}
.chart-bar {
  display: block; height: 100%; min-width: 2px; border-radius: var(--radius-rund);
  background: var(--akzent); transition: width .2s ease;
}
.chart-bar.neg { background: var(--gefahr); }
.chart-val { font-weight: 600; font-size: var(--gr-s); white-space: nowrap; }

/* Sprung ins Detail (Panel-Vertrag: optionales `link`) */
.panel-link {
  display: inline-block; margin-top: 10px;
  color: var(--akzent-text); text-decoration: none; font-size: var(--gr-s); font-weight: 600;
}
.panel-link:hover { text-decoration: underline; }

/* ---- Brotkrumen (V3, E38) – seit V4 in der Topbar ---- */
.brotkrumen {
  display: flex; flex-wrap: wrap; align-items: center; gap: 6px;
  font-size: var(--gr-m); color: var(--text-2); min-width: 0;
  padding: 12px 0;
}
.brotkrumen a { color: var(--text-2); text-decoration: none; }
.brotkrumen a:hover { color: var(--akzent-text); text-decoration: underline; }
.brotkrumen .krume-trenner { color: var(--text-3); }
.brotkrumen .krume-aktuell { color: var(--text); font-weight: 600; }

/* =====================  5. RESPONSIVE  ============================== */

@media (max-width: 860px) {
  .layout { flex-direction: column; }
  .sidebar {
    width: 100%; height: auto; position: static;
    border-right: none; border-bottom: 1px solid var(--linie);
    padding-bottom: var(--ab-3);
  }
  .sidebar nav { flex-flow: row wrap; gap: 4px; }
  .nav-gruppe { width: 100%; margin-top: 6px; padding-bottom: 0; }
  .topbar { position: static; padding: 0 var(--ab-4); }
  main { padding: var(--ab-4) var(--ab-4) 56px; }
  .formular .zeile { flex-direction: column; gap: var(--ab-3); }
  .kopf { flex-direction: column; align-items: flex-start; gap: 6px; }
  .kpi-grid { grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); }
  .panel-grid { grid-template-columns: 1fr; }
  /* breite Tabellen werden wischbar statt gequetscht */
  table { display: block; overflow-x: auto; }
}

/* --- Kontierungs-Matrix Geschäfte × Kostenstellen (Ausbau 02 A-4) ----------
   Die Matrix ist breit: sie spannt die ganze Panel-Reihe und wird bei Bedarf
   horizontal wischbar. Reine Darstellung (E25), nutzt die Design-Tokens. */
.panel-matrix { grid-column: 1 / -1; }
.matrix-scroll { overflow-x: auto; }
.matrix-scroll.zieh-rahmen:not(.wischt) { overflow-x: clip; }   /* ORG-411, wie .tabelle-rahmen */
table.matrix {
  border-collapse: collapse; width: 100%; font-size: var(--gr-m); margin: 2px 0 var(--ab-2);
}
table.matrix th, table.matrix td {
  border: 1px solid var(--linie-2); padding: 6px 10px; white-space: nowrap;
}
table.matrix thead th, table.matrix tfoot th {
  background: var(--flaeche-2); font-weight: 700; text-align: left;
}
table.matrix thead th.rechts, table.matrix tfoot th.rechts { text-align: right; }
table.matrix tbody td { color: var(--text); }
table.matrix tbody td .null { color: var(--text-3); }
table.matrix tbody tr.matrix-privat { background: var(--neutral-bg); }
table.matrix .neg { color: var(--gefahr); }
.matrix-hinweis { color: var(--text-2); font-size: var(--gr-s); margin: 2px 0 var(--ab-2); }

/* ============================================================
   Ausbau 03 / C3 – Workflows, Vorlagen, Kanban-Board, Zeitachse.
   Rein Präsentation (E25) – nutzt die Design-Tokens (V4).
   ============================================================ */
.status-schnell, .status-inline { display: inline-flex; gap: var(--ab-2); align-items: center; flex-wrap: wrap; }
.status-schnell select { font-size: var(--gr-s); padding: 2px 4px; }
.status-inline input { font-size: var(--gr-s); }
.inline-check { display: inline-flex; align-items: center; gap: 4px; font-size: var(--gr-s); color: var(--text-2); }
.status-knoepfe { flex-wrap: wrap; gap: var(--ab-2); }
.mono { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; color: var(--text-3); }

.sicht-filter {
  display: flex; flex-wrap: wrap; gap: var(--ab-3); align-items: flex-end;
  background: var(--flaeche); border: 1px solid var(--linie); border-radius: var(--radius);
  padding: var(--ab-3); margin-bottom: var(--ab-4); box-shadow: var(--schatten);
}
.sicht-filter label { display: flex; flex-direction: column; font-size: var(--gr-s); color: var(--text-2); gap: 3px; }

/* Kanban-Board */
.kanban { display: flex; gap: var(--ab-3); align-items: flex-start; overflow-x: auto; padding-bottom: var(--ab-3); }
.kanban-spalte {
  flex: 0 0 17rem; min-width: 17rem;
  background: var(--flaeche-2); border: 1px solid var(--linie); border-radius: var(--radius);
  display: flex; flex-direction: column; max-height: 78vh;
}
.kanban-kopf {
  display: flex; justify-content: space-between; align-items: center;
  padding: var(--ab-2) var(--ab-3); border-top-left-radius: var(--radius); border-top-right-radius: var(--radius);
  background: var(--flaeche);
}
.kanban-titel { font-weight: 700; color: var(--text); }
.kanban-zahl { background: var(--neutral-bg); color: var(--neutral-text); border-radius: var(--radius-rund); padding: 0 .55rem; font-size: var(--gr-s); font-weight: 700; }
.kanban-drop { padding: var(--ab-2); overflow-y: auto; flex: 1; min-height: 3rem; transition: background .12s; }
.kanban-drop.drueber { background: var(--akzent-tint); outline: 2px dashed var(--akzent); outline-offset: -4px; }
.kanban-karte {
  background: var(--flaeche); border: 1px solid var(--linie); border-radius: var(--radius-s);
  padding: var(--ab-2) var(--ab-3); margin-bottom: var(--ab-2); cursor: grab;
  box-shadow: var(--schatten); transition: box-shadow .12s, transform .06s;
}
.kanban-karte:hover { box-shadow: var(--schatten-2); }
.kanban-karte.zieht { opacity: .5; transform: scale(.98); }
.kanban-karte .kk-titel { font-weight: 600; color: var(--text); text-decoration: none; display: block; margin-bottom: 4px; }
.kanban-karte .kk-titel:hover { color: var(--akzent-text); text-decoration: underline; }
.kk-meta { display: flex; gap: var(--ab-2); align-items: center; flex-wrap: wrap; margin-bottom: 4px; }
.kk-kat { font-size: var(--gr-xs); color: var(--text-2); }
.kk-fuss { display: flex; gap: var(--ab-2); flex-wrap: wrap; font-size: var(--gr-xs); color: var(--text-3); }
.kk-tag { background: var(--flaeche-2); border: 1px solid var(--linie); border-radius: var(--radius-s); padding: 0 5px; }
.board-rest { color: var(--text-2); font-size: var(--gr-s); }

/* Zeitachse / Gantt */
.gantt { background: var(--flaeche); border: 1px solid var(--linie); border-radius: var(--radius); padding: var(--ab-3); box-shadow: var(--schatten); }
.gantt-zeile { display: grid; grid-template-columns: 14rem 1fr; align-items: center; gap: var(--ab-3); padding: 5px 0; border-bottom: 1px solid var(--linie-2); }
.gantt-zeile:last-child { border-bottom: 0; }
.gantt-label { font-size: var(--gr-s); overflow: hidden; }
.gantt-label a { color: var(--text); font-weight: 600; text-decoration: none; }
.gantt-label a:hover { color: var(--akzent-text); text-decoration: underline; }
.gantt-label small { display: block; color: var(--text-3); }
.gantt-spur { position: relative; height: 1.6rem; background: var(--flaeche-2); border-radius: var(--radius-s); }
.gantt-balken { position: absolute; top: 3px; bottom: 3px; min-width: 8px; border-radius: var(--radius-s); display: flex; align-items: center; justify-content: flex-end; padding-right: 6px; overflow: hidden; }
.gantt-balken .gantt-datum { font-size: var(--gr-xs); color: #fff; white-space: nowrap; text-shadow: 0 1px 1px rgba(0,0,0,.35); }
.gantt-ueberfaellig { outline: 2px solid var(--gefahr); outline-offset: 1px; }

/* =====================================================================
   Ausbau 07 / Strang C (E73): Orientierung & Navigation
   Sprechendes Ticket-Kürzel (Anzeige, nicht Schlüssel), Pfad/Breadcrumb im
   Detail-Kopf, und die kompakte Kerninfo-Zeile („Wichtiges ohne Scrollen").
   ===================================================================== */

/* C1: sprechendes Kürzel als kleines, monospaces Tag (Liste/Board/Zeitachse/Untertickets) */
.kuerzel-tag {
  font-family: ui-monospace, "SFMono-Regular", Menlo, Consolas, monospace;
  font-size: var(--gr-xs); font-weight: 700; letter-spacing: .02em;
  color: var(--text-2); background: var(--flaeche-2);
  border: 1px solid var(--linie); border-radius: var(--radius-s);
  padding: 0 6px; white-space: nowrap;
}

/* C3: die große Kürzel-ID über dem Titel im Detail-Kopf */
.ticket-kuerzel {
  font-family: ui-monospace, "SFMono-Regular", Menlo, Consolas, monospace;
  font-size: var(--gr-s); font-weight: 700; letter-spacing: .03em;
  color: var(--akzent-text); margin-bottom: 2px;
}

/* C2/C3: Pfad (Breadcrumb) von der Wurzel bis zum aktuellen Ticket */
.ticket-pfad { font-size: var(--gr-s); color: var(--text-3); margin: 2px 0 4px; line-height: 1.5; }
.ticket-pfad a { color: var(--text-2); text-decoration: none; }
.ticket-pfad a:hover { color: var(--akzent-text); text-decoration: underline; }
.ticket-pfad .pfad-trenner { color: var(--text-3); }
.ticket-pfad .pfad-hier { color: var(--text); font-weight: 600; }

/* C3: Kerninfo – alle Kernfakten in einer umbrechenden Zeile, ohne Scrollen */
.kerninfo {
  display: flex; flex-wrap: wrap; gap: var(--ab-2) var(--ab-4, 1.5rem);
  background: var(--flaeche); border: 1px solid var(--linie); border-radius: var(--radius);
  padding: var(--ab-2) var(--ab-3); margin: var(--ab-2) 0 var(--ab-3);
  box-shadow: var(--schatten); font-size: var(--gr-s);
}
.kerninfo > span { color: var(--text); }
.kerninfo b { display: block; font-size: var(--gr-xs); color: var(--text-3); font-weight: 700;
  text-transform: uppercase; letter-spacing: .04em; margin-bottom: 1px; }
.kerninfo a { color: var(--akzent-text); text-decoration: none; }
.kerninfo a:hover { text-decoration: underline; }

/* ============================================================
   Ausbau 08 / Strang I (Ticket ORG-43): VERANTWORTLICHER am Ticket.
   Das „Wer macht es"-Badge in Liste, Board und Unterticket-Tabelle sowie die
   Ein-Klick-Übergabe in der Kerninfo-Zeile. Nur Design-Tokens (E25/E40) – die
   Farbe ist bewusst ruhig-neutral: der Verantwortliche ist Kontext, kein Alarm.
   ============================================================ */
.badge.wer-badge { background: var(--flaeche-2); color: var(--text-2);
  border: 1px solid var(--linie); font-weight: 600; }
.kk-tag.wer-badge { font-weight: 600; }
.kerninfo-wer .wer-schnell { display: flex; gap: .3rem; align-items: center; }
.kerninfo-wer .wer-schnell input { max-width: 9rem; padding: .1rem .35rem; font-size: var(--gr-s); }

/* ============================================================
   Ausbau 07 / Strang B (E72): SCHNELL-ERFASSUNG
   B2 Quick-Capture-Einzeiler (Hub + Liste) und B1 Schnell-Anlage
   der Unter-Tickets im Ticket-Detail. Nutzt nur Design-Tokens (E25/E40).
   ============================================================ */
.quick-capture {
  display: flex; flex-wrap: wrap; align-items: center; gap: .5rem;
  margin: .6rem 0 1rem; padding: .55rem .7rem;
  background: var(--flaeche, #fff); border: 1px solid var(--rand, #e5e7eb);
  border-radius: 10px;
}
.quick-capture .qc-icon { font-size: 1.05rem; line-height: 1; }
.quick-capture .qc-input {
  flex: 1 1 16rem; min-width: 10rem; padding: .45rem .6rem;
  border: 1px solid var(--rand, #d1d5db); border-radius: 7px;
  background: var(--flaeche, #fff); color: inherit; font-size: .95rem;
}
.quick-capture .qc-toggle {
  display: inline-flex; gap: .7rem; font-size: .85rem; color: var(--text-schwach, #6b7280);
}
.quick-capture .qc-toggle label { display: inline-flex; align-items: center; gap: .25rem; cursor: pointer; }

/* B1: Schnell-Anlage mehrerer Unter-Tickets */
.schnell-anlage {
  margin: .9rem 0 0; padding: .75rem .85rem;
  border: 1px dashed var(--rand, #cbd5e1); border-radius: 10px;
}
.schnell-anlage .schnell-label { display: block; font-weight: 600; }
.schnell-anlage textarea { width: 100%; margin-top: .35rem; }
.schnell-details { margin: .55rem 0; }
.schnell-details summary { cursor: pointer; color: var(--akzent, #4C8BF5); font-size: .9rem; }
.schnell-tabelle { width: 100%; margin: .55rem 0; }
.schnell-tabelle th { font-size: .8rem; text-align: left; }
.schnell-tabelle input, .schnell-tabelle select { width: 100%; }
.schnell-tabelle .aufwand-zelle { display: flex; gap: .3rem; }
.schnell-tabelle .aufwand-zelle input { max-width: 5rem; }
.schnell-anlage .aktionen { margin-top: .55rem; }

/* =====================================================================================
   AUSBAU 07 / Strang D (E74): IDEEN-STUDIO – Methoden-Karten, Werkzeug-Kacheln,
   Aufwand/Nutzen-Matrix, Nutzwertanalyse, Brainstorm-Modus. Nur Präsentation (E25),
   alles über die Design-Tokens (Themes Hell/Dunkel × Blau/Grün färben automatisch mit). */

/* Nutzwert-Score-Badge (Studio-Liste, Analyse, Ticket-Detail) */
.badge.score-badge {
  background: var(--warn-bg); color: var(--warn-text);
  font-variant-numeric: tabular-nums; text-decoration: none;
}
a.badge.score-badge:hover { filter: brightness(.96); }
.unbewertet { font-size: var(--gr-s); color: var(--text-3); }

/* Methoden-Karte: jede Methode erklärt sich selbst (Was? Wann? Wie?) */
.methoden-karte {
  margin: var(--ab-3) 0 var(--ab-4); border: 1px solid var(--linie);
  border-left: 4px solid var(--akzent); border-radius: var(--radius);
  background: var(--flaeche); box-shadow: var(--schatten);
}
.methoden-karte summary {
  display: flex; align-items: center; gap: .55rem; flex-wrap: wrap;
  padding: .6rem .8rem; cursor: pointer; list-style: none;
}
.methoden-karte summary::-webkit-details-marker { display: none; }
.methoden-karte .mk-icon { font-size: 1.1rem; }
.methoden-karte .mk-titel { font-weight: 600; }
.methoden-karte .mk-unter { color: var(--text-2); font-size: var(--gr-s); }
.methoden-karte .mk-hinweis {
  margin-left: auto; font-size: var(--gr-xs); color: var(--akzent);
}
.methoden-karte[open] .mk-hinweis { display: none; }
.methoden-karte .mk-inhalt { padding: 0 .9rem .7rem; border-top: 1px solid var(--linie-2); }
.methoden-karte .mk-inhalt p { margin: .55rem 0; font-size: var(--gr-m); }

/* Studio-Startseite: die drei Werkzeug-Kacheln */
.studio-werkzeuge {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr));
  gap: var(--ab-3); margin: var(--ab-3) 0;
}
.studio-werkzeuge .werkzeug {
  display: flex; flex-direction: column; gap: .3rem; padding: .8rem .9rem;
  background: var(--flaeche); border: 1px solid var(--linie); border-radius: var(--radius);
  box-shadow: var(--schatten); text-decoration: none; color: var(--text);
  transition: box-shadow .15s, transform .15s;
}
.studio-werkzeuge .werkzeug:hover { box-shadow: var(--schatten-2); transform: translateY(-1px); }
.studio-werkzeuge .wz-icon { font-size: 1.3rem; }
.studio-werkzeuge .wz-titel { font-weight: 600; }
.studio-werkzeuge .wz-text { font-size: var(--gr-s); color: var(--text-2); }
.studio-sortierung .sortier-label { color: var(--text-3); font-size: var(--gr-s); }

/* Ideen-Liste (D1): Notiz + „→ machen" kompakt in der Tabelle */
.ideen-tabelle .notiz-zelle details summary { cursor: pointer; color: var(--akzent); font-size: var(--gr-s); }
.ideen-tabelle .notiz-zelle textarea { width: 14rem; margin: .3rem 0; }
.ideen-tabelle .notiz-vorschau { display: block; color: var(--text-3); max-width: 16rem; }
.ideen-tabelle .machen-zelle details summary { cursor: pointer; display: inline-block; }
.ideen-tabelle .machen-form { display: flex; flex-direction: column; gap: .4rem; margin-top: .4rem;
  padding: .5rem; border: 1px dashed var(--linie); border-radius: var(--radius-s); min-width: 15rem; }
.ideen-tabelle .machen-form label { font-size: var(--gr-s); display: flex; flex-direction: column; gap: .15rem; }

/* Aufwand/Nutzen-Matrix (D2): 2×2-Fläche mit frei platzierten Karten */
.matrix-umgebung { display: flex; gap: var(--ab-4); align-items: flex-start; flex-wrap: wrap; }
.matrix-links { flex: 1 1 34rem; min-width: 20rem; }
.matrix-y-label, .matrix-x-label { color: var(--text-2); font-size: var(--gr-s); font-weight: 600; }
.matrix-x-label { text-align: right; margin-top: .3rem; }
.matrix-flaeche {
  position: relative; height: 30rem; border: 1px solid var(--linie); border-radius: var(--radius);
  background:
    linear-gradient(to right, transparent calc(50% - 1px), var(--linie) calc(50% - 1px), var(--linie) calc(50% + 1px), transparent calc(50% + 1px)),
    linear-gradient(to bottom, transparent calc(50% - 1px), var(--linie) calc(50% - 1px), var(--linie) calc(50% + 1px), transparent calc(50% + 1px)),
    var(--flaeche);
  box-shadow: var(--schatten); overflow: hidden;
}
.matrix-flaeche.drueber { outline: 2px dashed var(--akzent); outline-offset: -6px; }
.matrix-flaeche .quadrant {
  position: absolute; font-size: var(--gr-s); font-weight: 600; color: var(--text-3);
  pointer-events: none; user-select: none;
}
.q-oben-links   { top: .5rem;   left: .7rem; color: var(--erfolg); }
.q-oben-rechts  { top: .5rem;   right: .7rem; }
.q-unten-links  { bottom: .5rem; left: .7rem; }
.q-unten-rechts { bottom: .5rem; right: .7rem; color: var(--gefahr); }
.matrix-karte {
  position: absolute; transform: translate(-50%, 50%);
  max-width: 11rem; padding: .3rem .5rem; cursor: grab;
  background: var(--flaeche); border: 1px solid var(--linie); border-left: 3px solid var(--akzent);
  border-radius: var(--radius-s); box-shadow: var(--schatten); font-size: var(--gr-s);
}
.matrix-karte:active { cursor: grabbing; }
.matrix-karte.zieht { opacity: .5; }
.matrix-karte a { color: var(--text); text-decoration: none; display: block; }
.matrix-karte .mk-score { color: var(--warn-text); font-size: var(--gr-xs); font-variant-numeric: tabular-nums; }
.matrix-ablage { flex: 0 1 15rem; min-width: 13rem; padding: .7rem .8rem;
  background: var(--flaeche-2); border: 1px dashed var(--linie); border-radius: var(--radius); }
.matrix-ablage h2 { margin: 0 0 .5rem; font-size: var(--gr-l); }
.matrix-ablage .matrix-karte { position: static; transform: none; margin: .35rem 0; }

/* Nutzwertanalyse (D3): große Bewertungs-Tabelle + Kriterien-Pflege */
.kriterien-pflege { margin: var(--ab-3) 0; padding: .5rem .8rem;
  border: 1px dashed var(--linie); border-radius: var(--radius); background: var(--flaeche-2); }
.kriterien-pflege > summary { cursor: pointer; color: var(--akzent); font-size: var(--gr-m); }
.kriterien-tabelle { margin: .6rem 0; }
.kriterien-tabelle tr.inaktiv { color: var(--text-3); }
.analyse-tabelle .krit-kopf { text-align: center; }
.analyse-tabelle .punkte-zelle { text-align: center; }
.analyse-tabelle .punkte-zelle input { width: 3.4rem; text-align: center; }
.analyse-tabelle .rang-zelle { font-size: 1.05rem; text-align: center; white-space: nowrap; }

/* Brainstorm-Modus (D4): Fokus-Bühne */
.brainstorm-buehne { max-width: 44rem; margin: var(--ab-4) auto 0; }
.bs-kopfzeile { display: flex; justify-content: space-between; align-items: center; gap: var(--ab-3);
  margin-bottom: var(--ab-3); flex-wrap: wrap; }
.bs-zaehler { color: var(--text-2); }
.bs-zaehler b { color: var(--akzent); font-size: 1.2rem; }
.bs-timer b { font-variant-numeric: tabular-nums; color: var(--warn-text);
  background: var(--warn-bg); padding: .15rem .5rem; border-radius: var(--radius-s); }
.bs-eingabe {
  width: 100%; padding: .9rem 1rem; font-size: 1.15rem;
  background: var(--flaeche); color: var(--text);
  border: 2px solid var(--akzent); border-radius: var(--radius); box-shadow: var(--schatten-2);
}
.bs-eingabe:focus { outline: none; box-shadow: var(--ring), var(--schatten-2); }
.bs-ernte { list-style: none; padding: 0; margin: var(--ab-3) 0; }
.bs-ernte li { padding: .35rem 0; border-bottom: 1px solid var(--linie-2); animation: bs-rein .25s ease-out; }
@keyframes bs-rein { from { opacity: 0; transform: translateY(-4px); } to { opacity: 1; transform: none; } }
.bs-fertig { padding: .7rem .9rem; background: var(--erfolg-bg); color: var(--erfolg-text);
  border-radius: var(--radius); }

/* =====================================================================
   Ausbau 09 (E78): Ticket-Arbeitsplatz – Sortierköpfe, Erstelldatum-Filter,
   Status-Badge in Workflow-Farbe, Fortschrittsbalken, Arbeitsplatz-Kacheln.
   Nur Optik, ausschließlich über Tokens (V4/E40).
   ===================================================================== */

/* -- Baustein 2: klickbarer Spaltenkopf mit sichtbarem Sortier-Zustand -- */
th .sortier-link { color: inherit; text-decoration: none; display: inline-flex; align-items: center;
  gap: var(--ab-1); white-space: nowrap; }
th .sortier-link:hover { color: var(--akzent); text-decoration: underline; }
th.sortiert { background: var(--akzent-tint); }
th.sortiert .sortier-link { color: var(--akzent-text); font-weight: 700; }
.sortier-pfeil { font-size: var(--gr-xs); line-height: 1; }
.sortier-hinweis { margin: var(--ab-2) 0 var(--ab-3); padding: .45rem .7rem; font-size: var(--gr-s);
  background: var(--akzent-tint2); color: var(--text-2); border-left: 3px solid var(--akzent);
  border-radius: var(--radius-s); }
.sortier-hinweis a { margin-left: var(--ab-2); }

/* -- Baustein 2: die zwei Datumsfelder in der gemeinsamen Filterleiste -- */
.filterleiste .filter-datum { display: inline-flex; align-items: center; gap: var(--ab-1);
  font-size: var(--gr-s); color: var(--text-2); white-space: nowrap; }
.filterleiste .filter-datum input { font-size: var(--gr-s); }

/* -- Baustein 3: Status-Badge, Fläche = Workflow-Farbe (Textfarbe kommt inline) -- */
.badge.status-badge { box-shadow: inset 0 0 0 1px rgba(16, 24, 40, .12); }

/* -- Fortschrittsbalken (Baustein 4 + Ticket-Detailseite) -- */
.fortschritt { display: inline-flex; align-items: center; gap: var(--ab-2); }
.fortschritt-balken { display: inline-block; width: 7rem; height: 8px; border-radius: var(--radius-rund);
  background: var(--neutral-bg); overflow: hidden; }
.fortschritt-fuellung { display: block; height: 100%; background: var(--akzent);
  border-radius: var(--radius-rund); transition: width .3s ease; }
.fortschritt-text { font-size: var(--gr-xs); color: var(--text-2); font-variant-numeric: tabular-nums;
  white-space: nowrap; }

/* -- Baustein 4: Arbeitsplatz-Sicht oben im Organisation-Hub -- */
.arbeitsplatz { margin: var(--ab-4) 0 var(--ab-5); }
.ap-stand { font-weight: 400; color: var(--text-3); font-size: var(--gr-s); }
.ap-kacheln { display: grid; gap: var(--ab-3); margin-bottom: var(--ab-4);
  grid-template-columns: repeat(auto-fill, minmax(9.5rem, 1fr)); }
.ap-kachel { display: flex; flex-direction: column; gap: var(--ab-1); padding: var(--ab-3);
  background: var(--flaeche); border: 1px solid var(--linie); border-radius: var(--radius);
  box-shadow: var(--schatten); text-decoration: none; color: var(--text); }
.ap-kachel:hover { border-color: var(--akzent); box-shadow: var(--schatten-2); }
.ap-zahl { font-size: var(--gr-zahl); font-weight: 700; line-height: 1.1;
  font-variant-numeric: tabular-nums; }
.ap-titel { font-size: var(--gr-s); color: var(--text-2); }
.ap-fuss { font-size: var(--gr-xs); color: var(--text-3); }
.ap-kachel.ap-warnung { background: var(--gefahr-flaeche); border-color: var(--gefahr); }
.ap-kachel.ap-warnung .ap-zahl { color: var(--gefahr); }
.ap-kachel.ap-achtung { border-color: var(--warn); }
.ap-kachel.ap-achtung .ap-zahl { color: var(--warn-text); }
.ap-unterkopf { font-size: var(--gr-l); margin: 0 0 var(--ab-2); }
.ap-unterkopf small { font-weight: 400; color: var(--text-3); }
.fortschritt-liste { list-style: none; padding: 0; margin: 0; background: var(--flaeche);
  border: 1px solid var(--linie); border-radius: var(--radius); box-shadow: var(--schatten); }
.fortschritt-liste li { display: flex; align-items: center; justify-content: space-between;
  gap: var(--ab-3); padding: .5rem .8rem; border-bottom: 1px solid var(--linie-2); flex-wrap: wrap; }
.fortschritt-liste li:last-child { border-bottom: none; }
.fortschritt-liste li.fl-fertig { color: var(--text-3); }
.fortschritt-liste li.fl-fertig .fortschritt-fuellung { background: var(--erfolg); }
.fl-titel { text-decoration: none; color: var(--text); }
.fl-titel:hover { color: var(--akzent); text-decoration: underline; }

/* ORG-105 (Ausbau 13 / Strang D): die nächsten Termine im Arbeitsplatz. Derselbe Rahmen wie
   die Fortschrittsliste darunter – der Arbeitsplatz soll wie EIN Block wirken, nicht wie
   zwei angeklebte Kästen. */
.ap-termine { margin-bottom: var(--ab-4); }
.termin-liste { list-style: none; padding: 0; margin: 0; background: var(--flaeche);
  border: 1px solid var(--linie); border-radius: var(--radius); box-shadow: var(--schatten); }
.termin-liste li { display: flex; align-items: baseline; gap: var(--ab-2);
  padding: .5rem .8rem; border-bottom: 1px solid var(--linie-2); flex-wrap: wrap; }
.termin-liste li:last-child { border-bottom: none; }
.tl-tag { min-width: 4.5rem; font-size: var(--gr-s); font-weight: 600; color: var(--text-2); }
.tl-zeit { min-width: 6.5rem; font-size: var(--gr-s); color: var(--text-3);
  font-variant-numeric: tabular-nums; }
.tl-titel { flex: 1 1 12rem; min-width: 0; text-decoration: none; color: var(--text); }
.tl-titel:hover { color: var(--akzent); text-decoration: underline; }
/* Der Punkt trägt die Geschäftsfarbe des Tickets – dieselbe Rechnung wie im Raster, nur
   klein. `display: inline-block` ist nötig, damit Breite und Höhe überhaupt greifen. */
.tl-punkt { display: inline-block; width: .6rem; height: .6rem; border-radius: 50%;
  margin-right: .35rem; }
.tl-serie { color: var(--text-3); }
.ap-termine-fuss { margin: var(--ab-2) 0 0; }

/* =====================================================================
   ORG-50: Mehrfachauswahl in der Ticket-Liste (Mail-Postfach-Prinzip).
   Auswahlspalte, hervorgehobene Zeile, schwebende Aktionsleiste.
   Nur Optik, ausschließlich über Tokens (V4/E40).
   ===================================================================== */
.sammel-spalte { width: 2.2rem; text-align: center; padding-left: .4rem; padding-right: .2rem; }
.sammel-spalte input { cursor: pointer; }
tbody tr.ausgewaehlt { background: var(--akzent-tint); }

/* Die Leiste erscheint erst, wenn etwas angekreuzt ist (das `hidden`-Attribut setzt das
   Skript in _sammel_leiste.html) – und bleibt beim Scrollen oben stehen, damit die Aktion
   auch bei langen Listen erreichbar ist. */
.sammel-leiste { position: sticky; top: 0; z-index: 5; display: flex; flex-wrap: wrap;
  align-items: center; gap: var(--ab-2); margin: var(--ab-2) 0 var(--ab-3);
  padding: .5rem .7rem; background: var(--akzent-tint2); border: 1px solid var(--akzent);
  border-radius: var(--radius); box-shadow: var(--schatten-2); }
.sammel-leiste[hidden] { display: none; }
.sammel-leiste label { display: inline-flex; align-items: center; gap: var(--ab-1);
  font-size: var(--gr-s); color: var(--text-2); white-space: nowrap; }
.sammel-zahl { font-size: var(--gr-s); color: var(--text-2); }
.sammel-zahl strong { font-variant-numeric: tabular-nums; color: var(--akzent-text); }
.sammel-abwahl { background: none; border: none; padding: 0; font-size: var(--gr-s);
  color: var(--text-2); text-decoration: underline; cursor: pointer; }
.sammel-abwahl:hover { color: var(--akzent); }

/* =====================================================================
   ORG-54 (Ausbau 11.3): die Darstellungen eines Reports.
   Kennzahl-Kachel · Balken je Gruppe · Zeitverlauf als gestapelte Säulen ·
   die Verfeinerungs-Zeile des Drill-downs.
   Kein JavaScript, keine Fremd-Bibliothek – dieselbe Zeichensprache wie die
   Cockpit-Panels (.chart/.kpi, Phase D3). Nur Optik, ausschließlich über
   Tokens (V4/E40), damit alle vier Themes mitkommen.
   ===================================================================== */

/* -- Verfeinerung: die Zeile über der Tabelle, wenn man in ein Diagramm geklickt hat -- */
.verfeinerung { display: flex; flex-wrap: wrap; align-items: center; gap: var(--ab-2);
  margin: var(--ab-3) 0; padding: .45rem .7rem; font-size: var(--gr-s); color: var(--text-2);
  background: var(--akzent-tint2); border: 1px solid var(--akzent-tint);
  border-radius: var(--radius); }
.verfeinerung a { color: var(--akzent-text); font-weight: 600; }

/* -- Die Erklärzeilen unter der Darstellungs-Auswahl im Builder -- */
.hinweis-liste { margin: var(--ab-2) 0 0; padding-left: 1.1rem; list-style: disc;
  font-size: var(--gr-s); color: var(--text-2); }
.hinweis-liste li { margin: 2px 0; }

/* -- Kennzahl-Kachel: die .kpi des Cockpits, nur klickbar -- */
.report-kachel-reihe { display: flex; margin: var(--ab-4) 0; }
.report-kachel { min-width: 16rem; text-decoration: none; color: inherit; }
a.report-kachel:hover { border-color: var(--akzent); box-shadow: var(--schatten-2); }

/* -- Balken je Gruppe: .chart aus dem Cockpit, hier mit Links auf die Zeilen -- */
.report-balken { margin: var(--ab-4) 0 var(--ab-2); }
.report-balken .chart-label a { color: var(--text-2); text-decoration: none; }
.report-balken .chart-label a:hover { color: var(--akzent); text-decoration: underline; }
a.chart-track { display: block; text-decoration: none; }
a.chart-track:hover .chart-bar { filter: brightness(1.12); }

/* -- Zeitverlauf: eine Säule je Zeitraum, von links nach rechts, unten bündig.
      Die Höhe steckt in .saeule-stapel (Prozent der Spur), die Abschnitte teilen
      sich diese Höhe untereinander auf – so stapelt sich ohne eine Zeile Skript. -- */
.saeulen { display: flex; align-items: flex-end; gap: var(--ab-2); overflow-x: auto;
  margin: var(--ab-4) 0 var(--ab-2); padding: var(--ab-3) var(--ab-2) 0;
  background: var(--flaeche); border: 1px solid var(--linie); border-radius: var(--radius); }
.saeule { display: flex; flex-direction: column; align-items: center; gap: 3px;
  min-width: 2.6rem; flex: 1 1 2.6rem; }
.saeule-wert { font-size: var(--gr-xs); color: var(--text-2); white-space: nowrap;
  font-variant-numeric: tabular-nums; }
.saeule-spur { display: flex; align-items: flex-end; width: 100%; height: 9rem;
  background: var(--flaeche-2); border-radius: var(--radius-s); }
.saeule-stapel { display: flex; flex-direction: column-reverse; width: 100%; min-height: 3px;
  border-radius: var(--radius-s); overflow: hidden; }
.saeule-teil { display: block; width: 100%; min-height: 2px; }
a.saeule-teil:hover { filter: brightness(1.15); outline: 2px solid var(--akzent);
  outline-offset: -2px; }
.saeule-label { font-size: var(--gr-xs); color: var(--text-3); white-space: nowrap; }

/* -- Legende der Serien (nur bei gestapelten Säulen) -- */
.serien-legende { display: flex; flex-wrap: wrap; gap: var(--ab-3); margin: var(--ab-3) 0 0;
  font-size: var(--gr-s); color: var(--text-2); }
.serie-eintrag { display: inline-flex; align-items: center; gap: var(--ab-1); }
.serie-punkt { display: inline-block; width: .7rem; height: .7rem; border-radius: 3px; }

/* Acht unterscheidbare Farben (SERIEN_MAX) + Serie 0 = „übrige"/grau. Bewusst feste
   Werte statt Theme-Tokens: eine Serienfarbe muss sich von der NACHBARFARBE abheben,
   nicht vom Akzent des Themes – und sie muss in Hell wie Dunkel tragen. */
.serie-0 { background: #8b93a1; }
.serie-1 { background: #1a66c2; }
.serie-2 { background: #1a7f37; }
.serie-3 { background: #b45309; }
.serie-4 { background: #6741d9; }
.serie-5 { background: #0e7490; }
.serie-6 { background: #be185d; }
.serie-7 { background: #4d7c0f; }
.serie-8 { background: #7c2d12; }

/* =====================================================================
   ORG-55 (Ausbau 11.4): Dashboards – die Zusammenstellung.
   Umschaltleiste · Kachel-Raster · Kachelrahmen.
   Kein JavaScript, keine Fremd-Bibliothek. Die BILDER in den Kacheln
   sind unverändert die aus 11.3 (.kpi/.chart/.saeulen) – hier steht nur
   der Rahmen darum. Ausschließlich Tokens (V4/E40), damit alle vier
   Themes automatisch mitkommen.
   ===================================================================== */

/* -- Umschaltleiste: Reiter statt Auswahlfeld (drei bis fünf Dashboards sieht man) -- */
.board-leiste { display: flex; flex-wrap: wrap; gap: var(--ab-2); margin: var(--ab-3) 0;
  padding-bottom: var(--ab-2); border-bottom: 1px solid var(--linie); }
.board-reiter { padding: .35rem .75rem; border-radius: 999px; text-decoration: none;
  font-size: var(--gr-s); font-weight: 600; color: var(--text-2);
  border: 1px solid var(--linie); background: var(--flaeche); }
.board-reiter:hover { border-color: var(--akzent); color: var(--akzent-text); }
.board-reiter.aktiv { background: var(--akzent-tint2); border-color: var(--akzent-tint);
  color: var(--akzent-text); }
.board-reiter .board-start { color: var(--akzent); }
.board-reiter.board-verwalten { margin-left: auto; font-weight: 500; }

/* -- Das Raster. Zwölf Spalten, weil sich Halb/Drittel/Viertel darin glatt ausgehen;
      welche Kachel wie viele belegt, sagt app/dashboard.BREITEN. Unter 900 px wird
      jede Kachel voll breit – ein Balkenbild in einem Viertel Handy ist keins. -- */
.board-raster { display: grid; grid-template-columns: repeat(12, 1fr); gap: var(--ab-3);
  margin: var(--ab-4) 0; align-items: start; }
.board-kachel { grid-column: span 6; display: flex; flex-direction: column;
  padding: var(--ab-3); background: var(--flaeche); border: 1px solid var(--linie);
  border-radius: var(--radius); min-width: 0; }
.board-kachel.spalten-3  { grid-column: span 3; }
.board-kachel.spalten-4  { grid-column: span 4; }
.board-kachel.spalten-6  { grid-column: span 6; }
.board-kachel.spalten-8  { grid-column: span 8; }
.board-kachel.spalten-12 { grid-column: span 12; }
@media (max-width: 900px) {
  .board-raster { grid-template-columns: 1fr; }
  .board-kachel, .board-kachel[class*="spalten-"] { grid-column: 1 / -1; }
}

.board-kachel-kopf { display: flex; align-items: flex-start; gap: var(--ab-2); }
.board-kachel-kopf h2 { margin: 0; font-size: var(--gr-m); font-weight: 600; flex: 1;
  overflow-wrap: anywhere; }
.board-kachel-kopf h2 a { color: inherit; text-decoration: none; }
.board-kachel-kopf h2 a:hover { color: var(--akzent-text); text-decoration: underline; }
/* Die Werkzeuge halten sich zurück, bis man die Kachel berührt – sonst konkurrieren vier
   kleine Knöpfe je Kachel mit dem, worum es geht: der Zahl. */
.board-kachel-werkzeug { display: flex; gap: 2px; opacity: .25; transition: opacity .12s; }
.board-kachel:hover .board-kachel-werkzeug,
.board-kachel:focus-within .board-kachel-werkzeug { opacity: 1; }
.board-kachel-werkzeug form { display: inline; margin: 0; }

.board-kachel-filter { margin: var(--ab-1) 0 0; font-size: var(--gr-xs); color: var(--text-3); }
.board-kachel-fuss { margin: auto 0 0; padding-top: var(--ab-2); font-size: var(--gr-xs);
  color: var(--text-3); border-top: 1px solid var(--linie); }
.board-kachel-fuss a { color: var(--akzent-text); }

/* In einer Kachel steht die Kennzahl allein – der Außenabstand der Report-Seite wäre hier
   zu viel, und die Mindestbreite würde ein Viertel-Raster sprengen. */
.board-kachel .report-kachel-reihe { margin: var(--ab-2) 0 0; }
.board-kachel .report-kachel { min-width: 0; width: 100%; }
.board-kachel .report-balken, .board-kachel .saeulen { margin: var(--ab-2) 0; }
.board-kachel .saeule-spur { height: 6rem; }
.board-kachel .unter { margin-bottom: 0; }

.board-kachel-tabelle { width: 100%; margin: var(--ab-2) 0; font-size: var(--gr-s); }
.board-kachel-tabelle td { padding: .2rem .3rem; border-bottom: 1px solid var(--linie); }
.board-kachel-tabelle .zahl-zelle { text-align: right; font-weight: 600;
  font-variant-numeric: tabular-nums; white-space: nowrap; }

/* ======================================================================
   Ticket ORG-94: die Ticketliste bändigen (Punkt 4 + 5) und der
   Zurücksetzen-Knopf des Filter-Gedächtnisses (Punkt 2).
   Reine Darstellung (E25) – gerechnet wird in app/, hier wird nur gemalt.
   ====================================================================== */

/* -- Punkt 5: die Tabelle bleibt im Bildschirm --------------------------
   Die Ticketliste hat elf Spalten und lief nach rechts aus der Seite. Sie
   wohnt jetzt in einem eigenen Rahmen: braucht sie mehr Platz, als da ist,
   wird DIESER Rahmen wischbar – nicht die ganze Seite. Der Rahmen erbt die
   Optik der Tabelle (Rand/Radius/Schatten), damit man ihn nicht sieht. */
.tabelle-rahmen {
  max-width: 100%; overflow-x: auto;
  border: 1px solid var(--linie); border-radius: var(--radius);
  background: var(--flaeche); box-shadow: var(--schatten);
}
/* ORG-411: sobald groesse.js den Rahmen kennt (Klasse zieh-rahmen), wischt er nur noch, wenn
   die Tabelle wirklich breiter ist (.wischt) – sonst klebt der Kopf. Ohne Javascript wie immer. */
.tabelle-rahmen.zieh-rahmen:not(.wischt) { overflow-x: clip; }
.tabelle-rahmen > table {
  margin: 0; border: none; border-radius: 0; box-shadow: none;
}
.tabelle-rahmen > table thead th:first-child { border-top-left-radius: var(--radius); }
.tabelle-rahmen > table thead th:last-child { border-top-right-radius: var(--radius); }

/* Feste Spaltenbreiten: nur der TITEL ist flexibel, die anderen zehn sind so
   breit, wie ihr Inhalt sein darf. Ohne `table-layout: fixed` verteilt der
   Browser die Breite nach dem längsten Text – eine einzige lange
   Beschreibung hat dann die ganze Tabelle auseinandergezogen.

   ACHTUNG beim Ändern: unter `table-layout: fixed` bestimmt die KOPFZEILE alle
   Breiten (die Regeln greifen deshalb an `thead th`), und die flexible Spalte
   bekommt nur, was nach den festen übrig bleibt. Die festen summieren sich auf
   rund 54rem – `min-width` MUSS spürbar darüber liegen, sonst fällt die
   Titel-Spalte auf wenige Pixel zusammen (genau so ist es beim Bauen passiert). */
table.ticket-tabelle { table-layout: fixed; min-width: 64rem; }
table.ticket-tabelle th, table.ticket-tabelle td { padding: 8px 7px; }
/* Nur der Titel darf notfalls MITTEN im Wort umbrechen – er ist die einzige
   Spalte mit Fließtext. Täte das jede Spalte, zerfiele auch ein Datum in zwei
   Zeilen („2026-07-“ / „29“), und die Zeilenhöhe wäre wieder das Problem. */
table.ticket-tabelle .ticket-titel { overflow-wrap: anywhere; }
/* Die Kopf-Beschriftungen brechen hier an Leerzeichen um, aber nie im Wort;
   ohne Sperrschrift passt auch „Verantwortlich" in seine Spalte. */
table.ticket-tabelle th { letter-spacing: normal; }
table.ticket-tabelle th .sortier-link { white-space: normal; overflow-wrap: normal; }
table.ticket-tabelle .sammel-spalte { width: 2.2rem; }
/* Spalte 2 (Ticket) bleibt bewusst OHNE Breite – sie ist die flexible.
   3 Kategorie · 4 Priorität · 5 Status · 6 Fällig · 7 Erstellt ·
   8 Verantwortlich · 9 Geschäft · 10 Abteilung · 11 Aktionen */
table.ticket-tabelle thead th:nth-child(3) { width: 5.5rem; }
table.ticket-tabelle thead th:nth-child(4) { width: 5.5rem; }
table.ticket-tabelle thead th:nth-child(5) { width: 5.5rem; }
table.ticket-tabelle thead th:nth-child(6) { width: 5.5rem; }
table.ticket-tabelle thead th:nth-child(7) { width: 5.5rem; }
table.ticket-tabelle thead th:nth-child(8) { width: 5.5rem; }
table.ticket-tabelle thead th:nth-child(9) { width: 5.5rem; }
table.ticket-tabelle thead th:nth-child(10) { width: 6rem; }
table.ticket-tabelle thead th:last-child { width: 8rem; }
/* Ein langer Kategorie-Name („Entscheidung") darf umbrechen statt abgeschnitten
   zu werden – in einer schmalen Spalte sind zwei Zeilen besser als ein Rest.
   NUR die Kategorie-Spalte: das Status-Badge ist ein Zustand und soll als EIN
   Stück lesbar bleiben (seine Spalte ist dafür breit genug). */
table.ticket-tabelle td:nth-child(3) .badge { white-space: normal; }
/* Der Status-Schnellwechsel darf seine Spalte nicht sprengen: eigene Zeile
   unter „Bearbeiten", und das Auswahlfeld bleibt in der Spaltenbreite. */
table.ticket-tabelle .status-schnell { display: block; margin: 4px 0 0; }
table.ticket-tabelle .status-schnell select { max-width: 100%; font-size: var(--gr-s); }

/* -- Punkt 4: die Beschreibung ist eine VORSCHAU, kein Aufsatz ----------
   Gekappt wird schon in app/aufgabe.py (`vorschau`); diese Regel ist die
   zweite Sicherung fürs Auge: höchstens zwei Zeilen, dann Ellipse. So kann
   auch ein Text ohne Leerzeichen die Zeilenhöhe nicht mehr sprengen. */
.ticket-vorschau {
  display: -webkit-box; -webkit-line-clamp: 2; line-clamp: 2;
  -webkit-box-orient: vertical; overflow: hidden;
  color: var(--text-2); line-height: 1.35;
}

/* -- Punkt 2: „Filter zurücksetzen" als sichtbarer Knopf ----------------
   Solange gefiltert ist, soll man das SEHEN und mit einem Klick heraus-
   kommen. Deshalb hier ein echter Knopf in Warnfarbe statt des leisen
   Links (`.filter-reset`), den es für ungefilterte Sichten weiter gibt. */
.btn-reset {
  display: inline-flex; align-items: center; gap: var(--ab-1);
  padding: 7px 12px; border: 1px solid var(--linie);
  border-radius: var(--radius-s); background: var(--flaeche-2);
  color: var(--text-2); font-size: var(--gr-m); font-weight: 600;
  text-decoration: none; white-space: nowrap;
}
.btn-reset:hover { border-color: var(--akzent); color: var(--akzent-text);
  background: var(--akzent-tint); text-decoration: none; }
.sicht-filter .btn-reset { margin-left: var(--ab-1); }

/* =====================  TICKET ORG-95: Oberflächen-Fixes  ============= */

/* -- Punkt 1: DIE FARBWAHL (Baustein web/templates/_farbwahl.html) ------
   Fünf Masken lassen eine Farbe eingeben (Rollen-Liste/-Maske, Kategorie-
   Liste/-Maske, Workflow-Status). Sie alle zeichnen dieselbe Palette aus
   app/farbe.py – hier steht ihr Aussehen genau EINMAL.
   Merksatz: die Palette ist ein Vorschlag, das Feld hat das letzte Wort –
   deshalb steht das Textfeld gleichberechtigt daneben und wird nicht
   versteckt. */
.farbwahl { display: flex; flex-direction: column; gap: 6px; }
.farbwahl-titel { font-size: var(--gr-m); font-weight: 600; }
.farbwahl-titel small { font-weight: normal; color: var(--text-2); }
.farbwahl-felder { display: flex; flex-wrap: wrap; gap: 6px; }
.farbwahl-feld {
  width: 1.55rem; height: 1.55rem; padding: 0; cursor: pointer;
  border: 2px solid var(--linie); border-radius: var(--radius-s);
  background: var(--farbe, var(--flaeche-2));
  transition: transform .1s ease, border-color .1s ease, box-shadow .1s ease;
}
.farbwahl-feld:hover { transform: translateY(-1px); border-color: var(--text-2); }
/* Das gewählte Feld trägt einen Ring in Textfarbe – auf hellen wie auf dunklen
   Farbfeldern sichtbar, ohne die Farbe selbst zu verfälschen. */
.farbwahl-feld.ist-gewaehlt {
  border-color: var(--text); box-shadow: 0 0 0 2px var(--flaeche), 0 0 0 4px var(--text);
}
.farbwahl-leer {
  background: var(--flaeche-2); color: var(--text-2);
  font-size: var(--gr-s); line-height: 1; font-weight: 700;
}
/* Kompakt = in einer Tabellenzeile (Workflow-Status): kleinere Felder, alles
   in einer Reihe, keine Überschrift. */
.farbwahl-kompakt { flex-direction: row; align-items: center; gap: 6px; }
.farbwahl-kompakt .farbwahl-felder { gap: 3px; max-width: 13rem; }
.farbwahl-kompakt .farbwahl-feld { width: 1.05rem; height: 1.05rem; border-width: 1px; }
.farbwahl-kompakt .farbwahl-feld.ist-gewaehlt { box-shadow: 0 0 0 1px var(--flaeche), 0 0 0 3px var(--text); }

/* -- Punkt 2: kein Formular darf aus dem Bildschirm laufen --------------
   `.formular .zeile` war eine Flex-Reihe OHNE Umbruch: zwei Felder passen,
   acht Filterfelder schieben sich nach rechts aus dem Viewport (Befund am
   Report-Builder). Jetzt bricht jede Formularzeile um, und ein Feld hat eine
   Mindestbreite, statt auf wenige Pixel zusammenzufallen.
   (Dieselbe Lehre wie der table-layout-Fallstrick aus ORG-94: eine Reihe
   fester Breiten in einem begrenzten Kasten geht immer zu Lasten des Rests.) */
.formular .zeile { flex-wrap: wrap; }
.formular .zeile > label { flex: 1 1 12rem; min-width: 0; }

/* Der Report-Builder ist die BREITESTE Maske des ERP (Quelle + beliebig viele
   Filterfelder + sechs Darstellungs-Felder). Er darf die 640-px-Grenze der
   Standardmaske überschreiten – aber nie den Bildschirm. */
.formular-weit { max-width: min(100%, 62rem); }
/* Ausbau 28 D (ORG-411): eine Maske, die eine TABELLE trägt (Positionen, Primärbedarf,
   Plandaten, Stückliste …), ist von Natur aus eine weite Maske – in 640 px wurde ihre
   Tabelle abgeschnitten und musste gewischt werden. Die Regel gilt automatisch, ohne dass
   jede Vorlage `formular-weit` schreiben muss. */
.formular:has(table) { max-width: min(100%, 76rem); }
/* Die Filterfelder kommen aus der Registry der QUELLE: mal zwei, mal zwölf.
   Ein Raster mit `auto-fit` verteilt sie von selbst auf so viele Spalten, wie
   hineinpassen – ohne dass die Vorlage die Anzahl kennen müsste. */
.report-filterfelder {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(13rem, 1fr));
  gap: var(--ab-3);
}
.report-filterfelder > label { min-width: 0; }
.report-filterfelder input, .report-filterfelder select { max-width: 100%; }

/* -- Punkt 4: der Querverweis auf einer Hub-Seite ----------------------
   Eine leise Zeile unter den Kacheln: „das, was du hier suchst, wohnt dort".
   Bewusst kein Kasten in Warnfarbe – es ist ein Wegweiser, kein Problem. */
.hub-querverweis {
  margin-top: var(--ab-5); padding: 10px 14px;
  border-left: 3px solid var(--linie); border-radius: var(--radius-s);
  background: var(--flaeche-2); color: var(--text-2); font-size: var(--gr-m);
}
.hub-querverweis a { font-weight: 600; }

/* =====================================================================
   6. BEREICHS-STILE (Ausbau 25 B0)

   Hier wohnt jetzt die Optik, die früher als <style>-Block in den Vorlagen stand –
   fünf gemeinsame Stil-Vorlagen (Kalender, Postfach, Wissen, Berichte, Bank) und die
   Handvoll Einzelseiten mit eigenem Kleinkram. Zwei Gründe für den Umzug:

   * EINE Datei kennt die Themen. Ein Hex-Wert in einer Vorlage kann das nicht: er steht
     im hellen Thema richtig und im dunklen falsch. Alles unten färbt deshalb über die
     Tokens aus Abschnitt 1/2 – auch dort, wo vorher `#b91c1c` oder `var(--rand, #e5e7eb)`
     stand. `--rand`, `--rahmen`, `--text-schwach` und `--akzent-schwach` hat es NIE
     gegeben; die Vorlagen fielen still auf ihren Ersatzwert zurück (und wo keiner
     danebenstand, malte der Browser gar nichts). Übersetzt ist das jetzt so:
     --rand/--rahmen → --linie · --rahmen-leise → --linie-2 · --text-schwach → --text-2
     --akzent-schwach → --akzent-tint · --flaeche/--flaeche-2/--akzent → gleichnamiger Token.
   * Eine Regel, die zweimal existierte, ist jetzt EINE Regel. Wo zwei Vorlagen denselben
     Selektor verschieden gefüllt hatten, steht darüber ein Kommentar; wo die beiden
     Bedeutungen sich nicht vertragen, ist der engere Selektor genauer angeschrieben
     (z. B. `div.merk` gegen `label.merk`).

   Reihenfolge: Kalender · Postfach · Wissen · Berichte · Bank · Einzelseiten.
   ===================================================================== */

/* ---------------------------------------------------------------------
   6.1  KALENDER   (aus kalender/_stil.html)

   Die Blockfarbe kommt NICHT von hier, sondern je Block als style="" aus
   app/termin.block() (sie hängt am Geschäft des Tickets). CSS malt nur das Raster.
   --------------------------------------------------------------------- */

/* -------- Kopfleiste: wo bin ich, und wohin führen vor/zurück/heute -------- */
.kal-leiste { display: flex; align-items: center; gap: var(--ab-3); flex-wrap: wrap;
              margin-bottom: var(--ab-3); }
/* Die Beschriftung sitzt ZWISCHEN den Pfeilen (dort sieht man beim Blättern hin),
   die Lücke danach schiebt Sichten/Serien/„+ Termin" wie bisher nach rechts. */
.kal-leiste .kal-titel { font-size: var(--gr-m); font-weight: 700; padding: 5px 10px;
                         min-width: 12rem; text-align: center; }
.kal-leiste .kal-titel.ist-heute { color: var(--akzent); }
.kal-luecke { margin-right: auto; }
.kal-heute-knopf {
  display: inline-flex; align-items: center; padding: 5px 10px; border-radius: var(--radius);
  border: 1px solid var(--akzent); background: var(--flaeche); color: var(--akzent);
  text-decoration: none; font-size: var(--gr-m); font-weight: 600;
}
.kal-nav { display: inline-flex; gap: 4px; align-items: center; }
.kal-nav a, .kal-sichten a {
  display: inline-flex; align-items: center; justify-content: center; min-width: 2rem;
  padding: 5px 10px; border: 1px solid var(--linie); border-radius: var(--radius);
  background: var(--flaeche); color: var(--text-2); text-decoration: none;
  font-size: var(--gr-m); font-weight: 600;
}
.kal-nav a:hover, .kal-sichten a:hover { border-color: var(--akzent); color: var(--akzent); }
.kal-sichten { display: inline-flex; gap: 4px; }
.kal-sichten a.aktiv { background: var(--akzent); border-color: var(--akzent); color: #fff; }

/* -------- Das Wochen-/Tagesraster -------- */
.kal-raster { border: 1px solid var(--linie); border-radius: var(--radius);
              overflow: hidden; background: var(--flaeche); }
.kal-zeile { display: grid; grid-template-columns: 4.2rem repeat(var(--kal-spalten), 1fr); }
.kal-kopf { border-bottom: 1px solid var(--linie); background: var(--flaeche-2); }
.kal-kopf > div { padding: 6px 8px; font-size: var(--gr-m); text-align: center;
                  border-left: 1px solid var(--linie); }
.kal-kopf > div:first-child { border-left: 0; }
.kal-kopf .kal-wt { color: var(--text-2); font-size: var(--gr-xs); text-transform: uppercase;
                    letter-spacing: .04em; }
.kal-kopf .kal-tag { font-weight: 700; font-size: var(--gr-m); }
.kal-kopf .heute .kal-tag { color: var(--akzent); }
.kal-kopf .wochenende { background: var(--flaeche-2); }

/* Die Zeile der GANZTÄGIGEN Termine – sie hat keine Uhrzeit und deshalb keinen Platz im
   Stundenraster; wie in Outlook steht sie als eigener Streifen unter den Wochentagen. */
.kal-ganztags { border-bottom: 1px solid var(--linie); min-height: 1.6rem; }
.kal-ganztags > div { border-left: 1px solid var(--linie); padding: 3px; display: flex;
                      flex-direction: column; gap: 3px; }
.kal-ganztags > div:first-child { border-left: 0; color: var(--text-3);
                                  font-size: var(--gr-xs); align-items: flex-end;
                                  justify-content: center; padding-right: 6px; }

/* Die Stundenspalte links und die Tagesspalten rechts.
   Die halbstündigen Linien sind ein Hintergrund-Verlauf statt 32 leerer <div> – das Raster
   bleibt damit ein Element und rutscht beim Zoomen nicht auseinander. */
.kal-koerper { position: relative; }
.kal-stunden > div { border-left: 1px solid var(--linie); position: relative; }
.kal-stunden > div:first-child { border-left: 0; }
.kal-uhr { display: flex; flex-direction: column; }
.kal-uhr span { flex: 1; font-size: var(--gr-xs); color: var(--text-3); text-align: right;
                padding: 2px 6px 0 0; border-top: 1px solid var(--linie-2); }
.kal-uhr span:first-child { border-top: 0; }
.kal-spalte {
  position: relative; height: var(--kal-hoehe);
  background-image:
    repeating-linear-gradient(to bottom, var(--linie) 0 1px,
                              transparent 1px calc(var(--kal-stunde) / 2)),
    repeating-linear-gradient(to bottom, var(--linie) 0 1px,
                              transparent 1px var(--kal-stunde));
  background-size: 100% calc(var(--kal-stunde) / 2), 100% var(--kal-stunde);
}
.kal-spalte.wochenende { background-color: var(--flaeche-2); }
.kal-spalte.heute { background-color: var(--akzent-tint2); }

/* -------- Der Block selbst -------- */
/* Der Block ist ein Behälter (<div>) mit einem Link darin – ein <a>, das man zieht,
   startet sonst das eingebaute Ziehen des Browsers. Der Link füllt die Fläche aus,
   damit sich der ganze Block anfühlt wie ein Link (was er für den Klick auch ist). */
.kal-block {
  position: absolute; overflow: hidden;
  border-radius: var(--radius); font-size: var(--gr-xs);
  line-height: 1.25; box-shadow: 0 1px 2px rgba(0,0,0,.14);
  touch-action: none;                 /* interact.js: Ziehen statt Scrollen auf dem Block */
}
.kal-block:hover { filter: brightness(1.08); }
.kal-block .kal-block-link {
  position: absolute; inset: 0; display: block; padding: 2px 6px; overflow: hidden;
  color: inherit; text-decoration: none;
}
.kal-block .kal-block-zeit { display: block; opacity: .85; font-size: .68rem; }
.kal-block .kal-block-titel { font-weight: 600; }
/* Ehrliche Fähnchen, wenn ein Termin oben/unten aus dem Fenster 06–22 Uhr läuft.
   Weiß ist hier ABSICHT und kein vergessener Token: der Strich liegt auf der Blockfarbe,
   die aus den Daten kommt – er muss auf ihr sitzen, nicht auf dem Seitenhintergrund. */
.kal-block.angeschnitten-oben { border-top: 2px dashed rgba(255,255,255,.75); }
.kal-block.angeschnitten-unten { border-bottom: 2px dashed rgba(255,255,255,.75); }

.kal-chip {
  display: block; border-radius: var(--radius); font-size: var(--gr-xs);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  touch-action: none;
}
.kal-chip:hover { filter: brightness(1.08); }
.kal-chip .kal-chip-link {
  display: block; padding: 1px 6px; color: inherit; text-decoration: none;
  overflow: hidden; text-overflow: ellipsis;
}

/* -------- Monatsansicht -------- */
.kal-monat-kopf { display: grid; grid-template-columns: repeat(7, 1fr); }
.kal-monat { display: grid; grid-template-columns: repeat(7, 1fr); }
/* `min-width: 0` ist hier PFLICHT: eine Grid-Spalte wächst sonst mit ihrem breitesten
   Kind, und ein Termin-Chip mit `nowrap` schob damit das ganze Raster auseinander (die
   Kopfzeile stand dann nicht mehr über ihren Tagen). */
.kal-monat > div { border-left: 1px solid var(--linie); border-top: 1px solid var(--linie);
                   min-height: 6.5rem; min-width: 0; padding: 4px; display: flex;
                   flex-direction: column; gap: 2px; }
.kal-monat .kal-chip { max-width: 100%; }
.kal-monat-kopf > div { min-width: 0; }
.kal-monat > div:nth-child(7n+1) { border-left: 0; }
.kal-monat .kal-mtag { font-size: var(--gr-xs); color: var(--text-2); font-weight: 700; }
.kal-monat .fremd { background: var(--flaeche-2); }
.kal-monat .fremd .kal-mtag { color: var(--text-3); font-weight: 500; }
.kal-monat .heute .kal-mtag { color: var(--akzent); }
.kal-monat .wochenende { background: var(--flaeche-2); }

.kal-hinweis { color: var(--text-2); font-size: var(--gr-s); margin-top: var(--ab-2); }
/* Der Maus-Satz erscheint erst, wenn Javascript ihn freischaltet – sonst verspräche der
   Hinweis eine Bedienung, die es auf dieser Seite gerade nicht gibt. */
.kal-maus { display: none; }
.kal-maus-da .kal-maus { display: inline; }

/* -------- Bühne, Seitenleiste, Griffe, Schnell-Zettel -------- */

/* Raster und Seitenleiste stehen nebeneinander; wird es eng, rutscht die Leiste darunter.
   `min-width: 0` am Raster ist WIEDER Pflicht (dieselbe Falle wie im Monatsraster): ein
   Flex-Kind schrumpft sonst nicht unter seine Inhaltsbreite und drückt die Leiste weg. */
.kal-buehne { display: flex; align-items: flex-start; gap: var(--ab-3); flex-wrap: wrap;
              position: relative; }
.kal-buehne > .kal-raster { flex: 1 1 32rem; min-width: 0; }

.kal-ungeplant {
  flex: 0 1 17rem; min-width: 14rem; border: 1px solid var(--linie);
  border-radius: var(--radius); background: var(--flaeche); padding: var(--ab-2);
  display: flex; flex-direction: column; gap: var(--ab-2);
}
.kal-ungeplant-kopf { display: flex; align-items: center; gap: var(--ab-2); }
.kal-ungeplant-titel { font-weight: 700; font-size: var(--gr-m); }
.kal-ungeplant-zahl {
  margin-left: auto; min-width: 1.4rem; padding: 0 .4rem; border-radius: var(--radius-rund);
  background: var(--flaeche-2); color: var(--text-2); font-size: var(--gr-xs);
  font-weight: 600; text-align: center;
}
.kal-ungeplant-filter select { width: 100%; }
.kal-ungeplant-mehr, .kal-ungeplant-fuss {
  color: var(--text-3); font-size: var(--gr-xs); margin: 0; line-height: 1.4;
}
.kal-stapel { display: flex; flex-direction: column; gap: 4px;
              max-height: 30rem; overflow-y: auto; }

/* Ein Zettel ist bewusst KEIN Block: er hat keine Zeitachse, nur einen Farbstreifen des
   Geschäfts – dieselbe Farbe, die er als Block bekommen wird. */
.kal-zettel {
  position: relative; border: 1px solid var(--linie); border-radius: var(--radius);
  background: var(--flaeche); padding: 4px 6px 4px 12px; font-size: var(--gr-xs);
  cursor: grab; touch-action: none;
}
.kal-zettel:hover { border-color: var(--akzent); }
.kal-zettel.ueberfaellig { border-left-color: transparent; }
.kal-zettel-farbe { position: absolute; left: 0; top: 0; bottom: 0; width: 5px;
                    border-radius: var(--radius) 0 0 var(--radius); }
.kal-zettel-link { display: block; color: inherit; text-decoration: none; }
.kal-zettel-kuerzel { color: var(--text-3); font-size: .68rem; font-weight: 700;
                      letter-spacing: .03em; }
.kal-zettel-titel { display: block; font-weight: 600; }
.kal-zettel-fuss { display: flex; gap: 6px; flex-wrap: wrap; color: var(--text-3);
                   font-size: .68rem; margin-top: 2px; }
.kal-zettel.ueberfaellig .kal-zettel-frist { color: var(--gefahr); font-weight: 700; }

/* Das Stift-Symbol erscheint erst beim Überfahren – ein Block, an dem dauerhaft ein Symbol
   klebt, wird unruhig; auf Zeigergeräten ohne Hover bleibt es sichtbar. */
.kal-stift {
  position: absolute; top: 1px; right: 2px; z-index: 2; opacity: 0;
  padding: 0 3px; border-radius: 4px; font-size: .7rem; line-height: 1.2;
  color: inherit; text-decoration: none; background: rgba(0,0,0,.18);
}
.kal-block:hover .kal-stift, .kal-stift:focus { opacity: 1; }
@media (hover: none) { .kal-stift { opacity: .8; } }

/* Die Kante zum Fassen. Sie liegt IM Block, ist zwei Pixel hoch und wird beim Überfahren
   sichtbar – Outlook macht es genauso, und ein unsichtbarer Griff ist kein Griff. */
.kal-griff {
  position: absolute; left: 0; right: 0; bottom: 0; height: 7px; z-index: 2;
  cursor: ns-resize;
}
.kal-block:hover .kal-griff { background: rgba(255,255,255,.35); }

.kal-beweglich { cursor: grab; }
.kal-zieht { cursor: grabbing; opacity: .85; z-index: 5;
             box-shadow: 0 6px 14px rgba(0,0,0,.28); }
/* Die Spalte, über der gerade etwas schwebt. */
.kal-spalte.kal-ziel, .kal-ganztags-feld.kal-ziel {
  outline: 2px dashed var(--akzent); outline-offset: -2px;
}
/* Schwebt ein Zettel über einem BESTEHENDEN Termin, wird DIESER markiert. Der durchgezogene
   Rahmen unterscheidet ihn von der gestrichelten Fläche – „hier wird verknüpft" sieht
   anders aus als „hier entsteht ein neuer Block". */
.kal-block.kal-ziel, .kal-chip.kal-ziel {
  outline: 3px solid var(--akzent); outline-offset: 1px; z-index: 4;
}
/* Das Zeichen für einen Termin, den ein AGENT angelegt hat. Es steht bewusst nur an
   DIESEN Blöcken: der Normalfall („von Erik") braucht keine Verzierung. */
.kal-agent-zeichen { font-size: var(--gr-xs); opacity: .85; }
/* Der Schatten, den das Ziehen im leeren Raster zeichnet (reine Vorschau, kein Datensatz). */
.kal-schatten {
  position: absolute; left: 2px; right: 2px; z-index: 1; pointer-events: none;
  border-radius: var(--radius); background: var(--akzent);
  opacity: .35; border: 1px solid var(--akzent);
}

/* Der Schnell-Zettel: ein normales Formular, nur klein und dort, wo gezogen wurde. */
.kal-schnell {
  position: absolute; z-index: 10; width: 15rem; padding: var(--ab-2);
  border: 1px solid var(--akzent); border-radius: var(--radius);
  background: var(--flaeche); box-shadow: 0 8px 20px rgba(0,0,0,.25);
  display: flex; flex-direction: column; gap: 6px;
}
/* WICHTIG: `display: flex` schlägt das eingebaute `[hidden] { display: none }` – ohne diese
   Zeile stünde der Schnell-Zettel dauerhaft offen im Bild. */
.kal-schnell[hidden] { display: none; }
.kal-schnell input[type=text] { width: 100%; }
.kal-schnell-zeit { color: var(--text-2); font-size: var(--gr-xs); font-weight: 600; }
.kal-schnell-fuss { display: flex; align-items: center; gap: 6px; }
.kal-schnell-mehr { margin-left: auto; font-size: var(--gr-xs); }

.kal-haken { display: flex; align-items: center; gap: 8px; }
.kal-haken input { width: auto; }
/* `.formular label` stellt alle Felder untereinander (Beschriftung über Eingabe) und
   schlägt `.kal-haken` in der Spezifität – ein Häkchen stand dadurch ÜBER seinem Text
   statt daneben. Diese Zeile stellt es zurück in die Reihe. */
.formular label.kal-haken { flex-direction: row; align-items: center; }
.formular label.kal-haken > small { font-weight: normal; }

.kal-neu-knopf {
  display: inline-flex; align-items: center; padding: 5px 10px;
  border: 1px solid var(--akzent); border-radius: var(--radius);
  background: var(--akzent); color: #fff; text-decoration: none;
  font-size: var(--gr-m); font-weight: 600;
}
.kal-neu-knopf:hover { filter: brightness(1.08); }

.kal-serien-link {
  display: inline-flex; align-items: center; padding: 5px 10px;
  border: 1px solid var(--linie); border-radius: var(--radius);
  background: var(--flaeche); color: var(--text-2); text-decoration: none;
  font-size: var(--gr-m); font-weight: 600;
}
.kal-serien-link:hover { border-color: var(--akzent); color: var(--akzent); }

/* -------- Serien --------
   Eine Serie bekommt KEINE eigene Farbe: die Blockfarbe hängt weiter am Geschäft des
   Tickets. Sichtbar ist sie als ZEICHEN (↻) – so bleibt die eine Farbregel unangetastet,
   und ein Serientermin sieht aus wie das, was er ist: ein Termin. */
.kal-serie-zeichen { opacity: .8; font-weight: 700; }
.kal-block .kal-serie-zeichen, .kal-chip .kal-serie-zeichen { font-size: var(--gr-xs); }

/* Der Hinweis über der Maske eines Serientermins: „was du hier änderst, gilt nur für ihn". */
.kal-serie-hinweis {
  display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap;
  padding: var(--ab-2) var(--ab-3); margin-bottom: var(--ab-3);
  border: 1px solid var(--linie); border-left: 4px solid var(--akzent);
  border-radius: var(--radius); background: var(--flaeche); color: var(--text-2);
  font-size: var(--gr-m);
}

.kal-serie-feld {
  border: 1px solid var(--linie); border-radius: var(--radius);
  padding: var(--ab-3); margin: var(--ab-3) 0;
}
.kal-serie-feld legend { padding: 0 6px; font-weight: 700; }
.kal-feldname { display: block; font-size: var(--gr-xs); color: var(--text-2);
                text-transform: uppercase; letter-spacing: .04em; margin-bottom: 4px; }
/* Der Regel-Teil einer Serie (Wochentage + Serienende + Fußnote) hängt am Takt und wird
   als GANZES ein- und ausgeblendet. Er braucht dafür eine gemeinsame Hülle – und die muss
   die Spalten-Anordnung des fieldsets fortsetzen, die sie sonst unterbräche
   (`.formular fieldset` ist flex-column mit Abstand). */
.kal-serie-regel { display: flex; flex-direction: column; gap: var(--ab-3); }
.kal-wochentage { display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
                  margin: var(--ab-2) 0; }
/* Die Beschriftung nimmt eine ganze Zeile – sonst rutscht der erste Wochentag neben sie
   und die sieben Häkchen stehen nicht mehr in einer Reihe. */
.kal-wochentage .kal-feldname { flex-basis: 100%; margin-bottom: 0; }
.kal-wochentage .kal-haken { gap: 4px; }
.kal-warnung { color: var(--text-2); }

/* Die Termin- und Absage-Listen auf der Serien-Seite. */
.kal-serie-liste { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }
.kal-serie-eintrag {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 3px 9px; border: 1px solid var(--linie); border-radius: var(--radius);
  background: var(--flaeche); color: var(--text); text-decoration: none;
  font-size: var(--gr-s); font-weight: 600; white-space: nowrap;
}
.kal-serie-eintrag:hover { border-color: var(--akzent); color: var(--akzent); }
.kal-serie-eintrag.abweichend { border-color: var(--akzent); }
.kal-serie-eintrag.vergangen { opacity: .55; }
.kal-serie-punkt { width: 9px; height: 9px; border-radius: 50%; display: inline-block; }
.kal-abweichend { font-weight: 700; color: var(--akzent); }
.kal-ausnahme {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 3px 8px; border: 1px dashed var(--linie); border-radius: var(--radius);
  color: var(--text-2); font-size: var(--gr-s);
}

/* ---------------------------------------------------------------------
   6.2  POSTFACH   (aus schleuse/_stil.html)

   Der Mail-Look: Liste, geöffnete Mail, Quittung, Ticket-Vorschau, Antworten.
   Die Kategoriefarbe einer Mail kommt als style="" aus der Datenbank – hier steht
   nur, wie ein Etikett GEBAUT ist, nicht welche Farbe es trägt.
   --------------------------------------------------------------------- */

/* -------- die Mail-Liste -------- */
/* `table-layout: fixed` ist hier nicht Kosmetik, sondern Voraussetzung: nur damit hält
   sich die Betreff-Spalte an ihre Breite und schneidet ab, statt die Tabelle über den
   Rand zu schieben und die Öffnen-Spalte aus dem Bild zu drängen. */
.mailtabelle { width: 100%; border-collapse: collapse; table-layout: fixed; }
.mailtabelle td { padding: .6rem .7rem; border-top: 1px solid var(--linie);
                  vertical-align: top; }
.mailtabelle tr:first-child td { border-top: 0; }
.mailtabelle tr:hover td { background: var(--flaeche-2); }
.spalte-absender { width: 12rem; white-space: nowrap; overflow: hidden; }
.spalte-betreff { overflow: hidden; }
.spalte-rechts { width: 11rem; text-align: right; }
/* Der Absender-Punkt trägt seine Farbe als style="" aus den Daten (app/farbe.stabil);
   deshalb bleibt die Schrift darauf fest weiß – sie sitzt nicht auf einer Themenfläche. */
.absender-punkt { display: inline-flex; align-items: center; justify-content: center;
                  width: 1.7rem; height: 1.7rem; border-radius: var(--radius-rund);
                  color: #fff; font-size: .68rem; font-weight: 700; letter-spacing: .02em;
                  margin-right: .45rem; vertical-align: middle; }
.absender-name { vertical-align: middle; font-size: .88rem; }
/* Betreff + Vorschauzeile bleiben EINE Zeile und werden hart abgeschnitten – sonst
   werden die Zeilen verschieden hoch und die Liste lässt sich nicht mehr überfliegen. */
.betreff-zeile { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.betreff { font-size: .98rem; text-decoration: none; }
.vorschauzeile { opacity: .7; font-size: .88rem; }
/* Ungelesen = fett. Die einzige Auszeichnung, die ein Mailprogramm dafür braucht. */
.mailzeile.ungelesen .betreff { font-weight: 700; }
.mailzeile.ungelesen .absender-name { font-weight: 600; }
.mailzeile.ungelesen td:first-child { box-shadow: inset 3px 0 0 var(--akzent); }
/* Der Lesepunkt macht den Stempel SICHTBAR – gefüllt = nie geöffnet, offen = schon
   gelesen (der Titel nennt wann). Feste Breite, sonst rutscht der Betreff je Zeile um ein
   Stück und die Liste flimmert beim Überfliegen. */
.lesepunkt { display: inline-block; width: 1rem; text-align: center; font-size: .72rem;
             vertical-align: middle; cursor: help; }
.lesepunkt-neu { color: var(--akzent); }
.lesepunkt-gelesen { opacity: .38; }
.zeile-fuss { margin-top: .3rem; display: flex; flex-wrap: wrap; gap: .35rem;
              align-items: center; }
.zeile-fuss .datei { opacity: .55; font-family: var(--mono); font-size: .7rem; }
.marke { display: inline-block; padding: .05rem .4rem; border-radius: var(--radius-rund);
         font-size: .7rem; background: var(--flaeche-2);
         border: 1px solid var(--linie); }
.marke-anhang { opacity: .85; }
/* Die drei Zustandsmarken tragen jetzt die Bedeutungsfarben des Hauses: eine Antwort ist
   ein TAUSCH von Nachrichten (blaugrün), bestätigt ist Erfolg, abgelehnt ist neutral –
   keine Gefahr, es war eine Entscheidung. */
.marke-antwort { background: var(--blaugruen-bg); color: var(--blaugruen-text); }
.marke-alt { opacity: .75; font-style: italic; }
.marke-fehler { background: var(--gefahr-bg); color: var(--gefahr-text);
                border-color: var(--gefahr-linie); }
.marke-bestaetigt { background: var(--erfolg-bg); color: var(--erfolg-text); }
.marke-abgelehnt { background: var(--neutral-bg); color: var(--neutral-text); }
/* Die frühere `html[data-theme="dunkel"]`-Sonderregel für .marke-fehler ist weg: die
   Gefahren-Tokens tragen das dunkle Thema schon. Genau dafür gibt es sie. */
/* Kategorie und Ordner in der Fußzeile. Die Kategorie bekommt ihre Farbe inline (sie steht
   je Zeile in der Datenbank), der Ordner bleibt bewusst neutral – er ist ein ORT, kein
   Etikett. */
.marke-ordner { opacity: .9; }

/* -------- die Ordnerleiste über dem Archiv -------- */
/* Sie ist keine Zierde, sondern die Gegenprobe zum Wegräumen: was aus der Hauptliste
   verschwindet, muss hier mit Zähler sichtbar bleiben. */
.ordnerleiste { display: flex; flex-wrap: wrap; gap: .4rem; margin: .8rem 0 .6rem; }
.ordnerleiste .fach { display: inline-flex; align-items: center; gap: .35rem;
                      padding: .25rem .6rem; border-radius: var(--radius-rund);
                      font-size: .82rem; text-decoration: none;
                      border: 1px solid var(--linie); background: var(--flaeche-2); }
.ordnerleiste .fach:hover { border-color: var(--akzent); }
.ordnerleiste .fach.ist-gewaehlt { border-color: var(--akzent);
                                   background: var(--akzent-tint);
                                   font-weight: 600; }
.ordnerleiste .fach-inaktiv { opacity: .6; font-style: italic; }
.ordnerleiste .fach-zahl { font-size: .72rem; opacity: .75;
                           font-variant-numeric: tabular-nums; }

/* -------- Ablegen: die Zeile in der geöffneten Mail -------- */
.ablagezeile { display: flex; flex-wrap: wrap; gap: .5rem; align-items: center;
               margin: .2rem 0 1rem; padding: .45rem .7rem; border-radius: var(--radius);
               border: 1px solid var(--linie); background: var(--flaeche-2); }
.ablagezeile .ablage-titel { font-weight: 600; font-size: .85rem; }
.ablagezeile label { display: inline-flex; align-items: center; gap: .3rem;
                     font-size: .82rem; margin: 0; }
.ablagezeile select { max-width: 15rem; }

/* -------- die Pflegeseite „Ordner & Kategorien" -------- */
/* Die beiden Abschnitte stehen UNTEREINANDER, jeder über die volle Breite – wie jede
   andere Stammdatenliste im ERP. Zwei Spalten nebeneinander waren der erste Versuch und
   der falsche: eine Tabelle mit vier Spalten und einem Formular je Zeile passt in eine
   halbe Bildschirmbreite nicht, sie schob die Aktions-Knöpfe aus dem Bild. Nebeneinander
   hätte auch nichts gespart – gelesen wird immer nur eine der beiden Listen. */
.ablage-abschnitte { display: grid; gap: 2rem; grid-template-columns: minmax(0, 1fr); }
.ablage-abschnitte table { width: 100%; }
.ablage-abschnitte .inline-form { display: flex; gap: .35rem; align-items: center; }
/* Das Namensfeld nimmt den Rest, das Hex-Feld bleibt schmal und fest. */
.ablage-abschnitte .inline-form input { min-width: 0; flex: 1 1 8rem; max-width: 22rem; }
.ablage-abschnitte .inline-form input[name="farbe"] {
    flex: 0 0 6.5rem; font-family: var(--mono); }

/* -------- die geöffnete Mail -------- */
/* Das Anschreiben ist das Wichtigste auf der Seite – also groß, ruhig und ohne
   Kasten-Gewitter drumherum. Zeilenumbrüche des Agenten bleiben erhalten. */
.anschreiben { white-space: pre-line; font-size: 1.02rem; line-height: 1.6;
               max-width: 62ch; margin: .8rem 0 1.3rem; }
.anhang { border: 1px solid var(--linie); border-radius: var(--radius);
          padding: .6rem .8rem; margin: .8rem 0; background: var(--flaeche-2); }
.anhang > summary { cursor: pointer; font-weight: 600; }
.anhang-zaehler { font-weight: 400; opacity: .85; margin-left: .3rem; }
.anhang .roh-titel { font-size: .86rem; opacity: .75; margin: 1rem 0 .3rem; }
.entscheidung-haupt { align-items: center; }

/* -------- die Quittung (Archiv-Mail) -------- */
.quittung { border: 1px solid var(--linie); border-left-width: 4px;
            border-radius: var(--radius); padding: .8rem 1rem; margin: .8rem 0 1.3rem;
            background: var(--flaeche-2); }
.quittung-bestaetigt { border-left-color: var(--erfolg); }
.quittung-abgelehnt { border-left-color: var(--neutral); }
.quittung-kopf { font-weight: 700; }
.quittung-kopf small { font-weight: 400; opacity: .7; margin-left: .4rem; }
.quittung-wirkung { margin: .45rem 0 0; }
.quittung-tickets { margin: .6rem 0 0; }
.quittung-vorschau { margin-top: .6rem; }

/* -------- die Ticket-Vorschau -------- */
/* Eine Karte je Ticket, aufklappbar. Optisch bewusst NAH am Anhang darüber (gleicher
   Rahmen, gleiche Rundung): Erik soll nicht zwei Sprachen lesen lernen, sondern eine
   wiedererkennen. */
.ticketvorschau { margin: .8rem 0 1.3rem; }
.tv-kopf { font-size: 1rem; margin: 0 0 .2rem; }
.tv-kopf small { font-weight: 400; opacity: .65; }
.tv-hinweis { margin: 0 0 .5rem; }
.tv-karte { border: 1px solid var(--linie); border-radius: var(--radius);
            padding: .5rem .8rem; margin: .4rem 0; background: var(--flaeche-2); }
.tv-karte > summary { cursor: pointer; display: flex; align-items: center; gap: .5rem;
                      flex-wrap: wrap; }
.tv-kuerzel { font-family: var(--mono); font-size: .82rem; font-weight: 700;
              padding: .1rem .4rem; border-radius: var(--radius-s);
              background: var(--flaeche); border: 1px solid var(--linie); }
.tv-titel { font-weight: 600; }
.tv-status { font-size: .74rem; padding: .1rem .45rem; border-radius: var(--radius-rund);
             background: var(--flaeche); border: 1px solid var(--linie); }
/* Dieselbe Bauform wie .vorschau im Anhang – nur eine Spur schmaler, weil eine Vorschau
   kein Formular ist. */
.tv-zeilen { border: 1px solid var(--linie); border-radius: var(--radius); overflow: hidden;
             margin: .55rem 0 .2rem; background: var(--flaeche); }
.tv-zeilen div { display: grid; grid-template-columns: 9rem 1fr; gap: .6rem;
                 padding: .4rem .7rem; border-top: 1px solid var(--linie);
                 font-size: .88rem; }
.tv-zeilen div:first-child { border-top: 0; }
.tv-zeilen .label { opacity: .7; font-size: .82rem; }
.tv-uber { margin: .7rem 0 .2rem; font-size: .82rem; opacity: .7; }
.tv-verlauf { list-style: none; padding: 0; margin: 0; display: grid; gap: .35rem; }
.tv-verlauf > li { border-left: 3px solid var(--linie); padding: .1rem .6rem;
                   font-size: .86rem; }
.tv-verlauf small { opacity: .6; }
.tv-fuss { margin: .6rem 0 .1rem; font-size: .86rem; }
.ticket-link { font-family: var(--mono); font-size: .82rem;
               padding: .1rem .4rem; border-radius: var(--radius-s);
               background: var(--flaeche); border: 1px solid var(--linie);
               text-decoration: none; }

/* -------- die Antworten (der Rückkanal) -------- */
.antwortliste { list-style: none; padding: 0; margin: .5rem 0; display: grid; gap: .5rem; }
.antwortliste > li { border: 1px solid var(--linie); border-radius: var(--radius);
                     padding: .5rem .8rem; background: var(--flaeche-2); }
.antwort-kopf small { opacity: .65; margin-left: .4rem; }
.antwort-text { white-space: pre-line; margin-top: .25rem; }
.antwort-form { display: flex; flex-direction: column; align-items: start; gap: .5rem;
                max-width: 62ch; margin: .6rem 0 1rem; }
.antwort-form textarea { width: 100%; }

/* -------- Vorschau, Sammel-Häkchen, Teil-Protokoll -------- */
.vorschlag-tabelle .datei { opacity: .65; font-family: var(--mono); font-size: .72rem; }
.vorschlag-tabelle .zweck { opacity: .8; }
.vorschlag-tabelle .nowrap, .mailtabelle .nowrap { white-space: nowrap; }
.art { display: inline-block; padding: .1rem .45rem; border-radius: var(--radius-rund);
       font-size: .74rem; background: var(--flaeche-2);
       border: 1px solid var(--linie); }
.art-fehler { background: var(--gefahr-bg); color: var(--gefahr-text);
              border-color: var(--gefahr-linie); }
tr.zeile-fehler > td { background: var(--gefahr-flaeche); }
.roh { padding: .7rem .8rem; border: 1px solid var(--linie); border-radius: var(--radius);
       background: var(--flaeche); overflow-x: auto; font-size: .8rem;
       white-space: pre-wrap; word-break: break-word; }
.format-hilfe { margin-top: 1.4rem; }
.format-hilfe summary { cursor: pointer; font-weight: 600; }
.vorschau { border: 1px solid var(--linie); border-radius: var(--radius); overflow: hidden;
            margin: .6rem 0 1rem; background: var(--flaeche); }
.vorschau div { display: grid; grid-template-columns: 11rem 1fr; gap: .6rem;
                padding: .5rem .8rem; border-top: 1px solid var(--linie); }
.vorschau div:first-child { border-top: 0; }
.vorschau .label { opacity: .7; font-size: .82rem; }
/* Vorschauen können mehrzeilig sein (Liste der Unter-Tickets, Beschreibung) –
   Zeilenumbrüche aus der Vorschau müssen sichtbar bleiben, sonst klebt der PSP zusammen. */
.vorschau div > span:last-child { white-space: pre-line; }
.entscheidung { display: flex; flex-wrap: wrap; align-items: end; gap: .8rem;
                padding: .8rem; margin: 1rem 0; border: 1px solid var(--linie);
                border-radius: var(--radius); background: var(--flaeche-2); }
.entscheidung form { display: flex; align-items: end; gap: .5rem; }
.entscheidung label { display: flex; flex-direction: column; font-size: .8rem; gap: .15rem; }
/* Die Häkchenliste eines Sammel-Vorschlags (eine Karte je Aktion). */
.aktionsliste { list-style: none; padding: 0; margin: .6rem 0 0; display: grid; gap: .6rem; }
.aktionsliste > li { border: 1px solid var(--linie); border-radius: var(--radius);
                     padding: .6rem .8rem; background: var(--flaeche); }
.aktionsliste .aktion-kopf { display: flex; align-items: center; gap: .5rem;
                             cursor: pointer; flex-wrap: wrap; }
.aktionsliste .vorschau-klein { margin: .5rem 0 0; background: var(--flaeche-2); }
.aktionsliste .vorschau-klein div { grid-template-columns: 9rem 1fr; padding: .35rem .7rem;
                                    font-size: .86rem; }
.aktionsliste li.aktion-fehler { background: var(--gefahr-flaeche);
                                 border-color: var(--gefahr-linie); }
.aktionsliste li.aktion-fehler .aktion-kopf { cursor: not-allowed; opacity: .8; }
.aktion-meldung { margin: .4rem 0 0; font-size: .84rem; color: var(--gefahr-text); }
/* Das Teil-Protokoll einer angenommenen Sammel-Mail – zugleich die Zeilen der Quittung. */
.teil-liste { list-style: none; padding: 0; margin: .5rem 0 0; font-size: .84rem; }
.teil-liste li::before { content: "• "; opacity: .5; }
.teil-gescheitert { color: var(--gefahr-text); }
.teil-uebersprungen { opacity: .65; }

/* KOLLISION `.warnkasten`: das Postfach malte einen ROTEN Kasten („diese Mail ist nicht
   annehmbar"), die Belegpositionen-Maske einen leisen Merkkasten mit Strich links
   („zwei Dinge passieren beim Speichern"). Zusammengeführt zu EINEM Kasten in der
   Gefahrenfarbe: beide sagen „lies das, bevor du klickst", und ein Kasten, der Warnkasten
   heißt, darf auch aussehen wie einer. Die Listen-Regeln der Belegmaske ziehen mit. */
.warnkasten { padding: .55rem .8rem; border-radius: var(--radius); margin: .5rem 0 1rem;
              border: 1px solid var(--gefahr-linie); border-left: 4px solid var(--gefahr);
              background: var(--gefahr-bg); color: var(--gefahr-text); font-size: .88rem; }
.warnkasten ul { margin: .3rem 0 0; padding-left: 1.1rem; }
.warnkasten li { margin: .15rem 0; }

/* ---------------------------------------------------------------------
   6.3  WISSEN   (aus wissen/_lesestil.html)

   Das LESEDESIGN der Bibliothek. Es war schon vor dem Umzug vollständig aus Tokens
   gebaut – deshalb steht hier keine einzige Farbe, nur Bezüge. Benutzt von der
   Detailseite UND der Vorschau in der Maske: eine Optik, damit die Vorschau nicht
   hübscher aussieht als die Seite danach.
   --------------------------------------------------------------------- */

/* --- Die Lesespalte ---
   Begrenzte LESEBREITE: rund 70 Zeichen je Zeile. Volle Fensterbreite liest sich schlecht,
   weil das Auge am Zeilenende die nächste Zeile nicht mehr findet. Die Breite steht in
   `ch` (Zeichenbreite), nicht in Pixeln – sie wandert damit mit der Schriftgröße mit. */
.artikel-text { max-width: 72ch; font-size: var(--gr-l); line-height: 1.65;
                color: var(--text); }
.artikel-text > *:first-child { margin-top: 0; }
.artikel-text p { margin: 0 0 var(--ab-3); }

/* --- Überschriften: eine klare Leiter ---
   Der Artikeltitel ist das <h1> der SEITE. Im Text fängt die Hierarchie deshalb bei <h2>
   an; eine zweite Seitenüberschrift im Fließtext wäre eine zweite Wahrheit darüber, wie
   der Artikel heißt. Die Größen fallen sichtbar ab, damit man die Ebene am Bild erkennt
   und nicht am Zählen. */
.artikel-text h1, .artikel-text h2, .artikel-text h3,
.artikel-text h4, .artikel-text h5, .artikel-text h6 {
  line-height: 1.25; margin: var(--ab-5) 0 var(--ab-2); color: var(--text); }
.artikel-text h1 { font-size: 1.45rem; }
.artikel-text h2 { font-size: 1.2rem; padding-bottom: 4px;
                   border-bottom: 1px solid var(--linie); }
.artikel-text h3 { font-size: 1.03rem; }
.artikel-text h4, .artikel-text h5, .artikel-text h6 {
  font-size: var(--gr-m); text-transform: uppercase; letter-spacing: .04em;
  color: var(--text-2); }

.artikel-text ul, .artikel-text ol { margin: 0 0 var(--ab-3); padding-left: 1.35rem; }
.artikel-text li { margin: 3px 0; }
.artikel-text a { color: var(--akzent-text); }
.artikel-text hr { border: 0; border-top: 1px solid var(--linie); margin: var(--ab-5) 0; }

/* --- Tabellen im Text ---
   Sie sollen wie die Tabellen des Hauses aussehen, dürfen die Lesespalte aber überragen:
   eine dreispaltige Gegenüberstellung in 72 Zeichen zu quetschen macht sie unlesbar.
   `overflow-x` an der Hülle, damit eine breite Tabelle die Seite nicht auseinanderschiebt
   (dieselbe Falle wie im Monatsraster: eine Grid-Spalte wächst mit ihrem breitesten Kind). */
.artikel-text table { width: 100%; border-collapse: collapse; margin: 0 0 var(--ab-4);
                      font-size: var(--gr-m); background: var(--flaeche); }
.artikel-text th, .artikel-text td {
  border: 1px solid var(--linie); padding: 6px 10px; text-align: left; vertical-align: top; }
.artikel-text thead th { background: var(--neutral-bg); color: var(--neutral-text);
                         font-weight: 600; }
.artikel-text tbody tr:nth-child(even) td { background: var(--bg); }

.artikel-text code { font-family: var(--mono); font-size: .86em;
                     background: var(--neutral-bg); color: var(--neutral-text);
                     padding: 1px 5px; border-radius: var(--radius-s); }
.artikel-text pre { background: var(--neutral-bg); color: var(--neutral-text);
                    padding: var(--ab-3); border-radius: var(--radius);
                    overflow-x: auto; margin: 0 0 var(--ab-4); }
.artikel-text pre code { background: none; padding: 0; }

/* --- Zitat und KÄSTEN ---
   Der Kasten ist ein Zitat mit Farbe und Kopfzeile. Die Farben kommen aus den drei
   Bedeutungspaaren der Tokens (Info · Warn · Neutral) – dieselben, die Badges und
   Befund-Kästen im ganzen Haus benutzen. Ein Merksatz sieht deshalb aus wie ein Hinweis
   und nicht wie eine Erfindung dieser Seite. */
.artikel-text blockquote {
  margin: 0 0 var(--ab-4); padding: var(--ab-2) var(--ab-3);
  border-left: 3px solid var(--linie); color: var(--text-2); }
.artikel-text blockquote p:last-child { margin-bottom: 0; }

.artikel-text .kasten {
  margin: 0 0 var(--ab-4); padding: var(--ab-3);
  border-radius: var(--radius); border-left: 4px solid currentColor; }
.artikel-text .kasten > p:last-child, .artikel-text .kasten > ul:last-child,
.artikel-text .kasten > ol:last-child { margin-bottom: 0; }
.artikel-text .kasten-kopf {
  font-weight: 700; font-size: var(--gr-s); text-transform: uppercase;
  letter-spacing: .05em; margin: 0 0 4px; display: flex; align-items: center; gap: 7px; }
.artikel-text .kasten-zeichen { font-size: 1rem; line-height: 1; }

/* Die drei Marken aus der Registry `artikeltext.KASTEN_ARTEN`. Eine VIERTE Marke braucht
   genau eine Zeile hier – und wird bis dahin als normales Zitat gezeigt, nicht verschluckt. */
.artikel-text .kasten-merksatz { background: var(--info-bg);    color: var(--info-text); }
.artikel-text .kasten-achtung  { background: var(--warn-bg);    color: var(--warn-text); }
.artikel-text .kasten-beispiel { background: var(--neutral-bg); color: var(--neutral-text); }
/* Der Fließtext IM Kasten bleibt Fließtextfarbe – nur Rahmen, Fläche und Kopfzeile tragen
   die Bedeutungsfarbe. Sonst läse sich ein dreizeiliger Merksatz wie eine Warnmeldung. */
.artikel-text .kasten > p:not(.kasten-kopf),
.artikel-text .kasten li, .artikel-text .kasten td { color: var(--text); }

/* --- Bilder IM TEXTFLUSS --- */
.artikel-text .artikel-bild {
  max-width: 100%; height: auto; display: block; margin: var(--ab-2) 0 var(--ab-4);
  border: 1px solid var(--linie); border-radius: var(--radius);
  background: var(--flaeche); }

/* --- Verweise ---
   Ein lebender Verweis sieht aus wie ein Link mit zartem Unterstrich; ein TOTER wird
   sichtbar markiert (gestrichelt, in Gefahrenfarbe) statt weggelassen oder ins Leere
   verlinkt. Er ist eine Information: „hier fehlt noch ein Artikel". */
.artikel-text a.verweis {
  color: var(--akzent-text); text-decoration: underline;
  text-decoration-color: var(--akzent); text-underline-offset: 2px; }
.artikel-text .verweis-tot {
  color: var(--gefahr-text); border-bottom: 1px dashed var(--gefahr);
  cursor: help; }

/* --- Der Fuß der Seite: Rückverweise und Anhänge --- */
.verweis-fuss { margin-top: var(--ab-5); }
.verweis-fuss ul { margin: 4px 0 0; padding-left: 1.2rem; }
.anhang-liste { list-style: none; margin: var(--ab-2) 0 var(--ab-4); padding: 0;
                display: flex; flex-direction: column; gap: 6px; }
.anhang-liste li { display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
                   font-size: var(--gr-m); }
.anhang-marke { font-family: var(--mono); font-size: var(--gr-xs);
                background: var(--neutral-bg); color: var(--neutral-text);
                padding: 2px 6px; border-radius: var(--radius-s); }

/* Der ehrliche Hinweis `.befund` stand hier UND bei den Berichten. Er wohnt jetzt einmal,
   in Abschnitt 6.4 – gebaut aus denselben Warn-Tokens, die diese Seite schon benutzte. */

/* --- Die Vorschau ---
   Sie trägt eine eigene Umrandung mit Beschriftung, damit auf keinen Blick der Eindruck
   entsteht, hier stünde schon etwas Gespeichertes. */
.vorschau-kasten { border: 1px dashed var(--akzent); border-radius: var(--radius);
                   padding: var(--ab-4); margin-bottom: var(--ab-4);
                   background: var(--flaeche); }
.vorschau-kasten > h2 { margin-top: 0; }

/* Der Quelltext-Kasten unter dem Artikel (aus wissen/artikel_detail.html). */
.quelltext { font-family: var(--mono); font-size: var(--gr-xs); white-space: pre-wrap;
             background: var(--bg); border: 1px solid var(--linie);
             border-radius: var(--radius-s); padding: var(--ab-2); margin: 6px 0 0;
             max-height: 22rem; overflow: auto; }

/* ---------------------------------------------------------------------
   6.4  BERICHTE   (aus rechnungswesen/_bericht_stil.html, dazu nebenbuch.html
        und buchungsbeleg.html)

   Zwei Dinge, die hier durchgehend gelten:
   * Zahlen stehen rechts und in `tabular-nums` – sonst tanzen die Kommastellen.
   * Eine verlinkte Zahl sieht aus wie eine Zahl, nicht wie ein Link. Der Audit Trail soll
     überall gehen; wären alle Zahlen blau unterstrichen, läse man den Bericht nicht mehr.
   --------------------------------------------------------------------- */

.bericht { font-variant-numeric: tabular-nums; }
.bericht .r { text-align: right; white-space: nowrap; font-variant-numeric: tabular-nums; }
.bericht .konto-nr { font-family: var(--mono);
  font-size: .85em; color: var(--text-2); margin-right: .35rem; }
.bericht td, .bericht th { vertical-align: top; }
.bericht tr.leer-konto { opacity: .45; }
.bericht tr.summe td { border-top: 2px solid var(--linie); font-weight: 600; }
.bericht tr.zwischensumme td { border-top: 1px solid var(--linie); font-weight: 600; }

/* Eine Zahl, die nach unten führt (Audit Trail). Unauffällig, bis man hinzeigt. */
a.zahl { color: inherit; text-decoration: none; border-bottom: 1px dotted var(--linie); }
a.zahl:hover, a.zahl:focus { color: var(--akzent); border-bottom-style: solid; }

/* Die zwei Seiten der Bilanz nebeneinander – auf schmalem Schirm untereinander. */
.zwei-seiten { display: grid; grid-template-columns: var(--zs-links, 1fr) 1fr; gap: 1.2rem; align-items: start; }
/* ORG-409: --zs-links setzt groesse.js, wenn Erik den Trenner zieht; ohne Token bleibt es 1fr 1fr. */
@media (max-width: 900px) { .zwei-seiten { grid-template-columns: 1fr; } }
.zwei-seiten > section { min-width: 0; }   /* Dieselbe Falle wie im Monatsraster: eine
                                              Grid-Spalte wächst sonst mit ihrem breitesten
                                              Kind. */
.zwei-seiten h2 { margin: 0 0 .4rem; font-size: 1rem; }

/* Die Urteilszeile über jedem Bericht: geht die Rechnung auf? */
.urteil { display: flex; flex-wrap: wrap; gap: .8rem 1.4rem; align-items: baseline;
  border: 1px solid var(--linie); border-left-width: 4px; border-radius: var(--radius);
  padding: .55rem .8rem; margin: .6rem 0 1rem; background: var(--flaeche-2);
  font-variant-numeric: tabular-nums; }
.urteil.gut { border-left-color: var(--blaugruen); }
.urteil.schief { border-left-color: var(--warn); }
.urteil .lbl { display: block; font-size: .7rem; text-transform: uppercase;
  letter-spacing: .03em; color: var(--text-2); }
.urteil .satz { margin-left: auto; font-size: .85rem; max-width: 46ch; }

/* Der Satz über einer eingeschränkten Sicht. Bewusst auffällig, aber kein Befund –
   ein Ausschnitt ist kein Fehler, er muss nur dastehen. */
.sicht-satz { margin: .1rem 0 .8rem; padding: .45rem .7rem; border-radius: var(--radius-s);
              background: var(--flaeche-2); border-left: 4px solid var(--akzent);
              font-size: .92rem; }

/* KOLLISION `.befund`: die Berichtsseiten hatten einen Kasten mit gelbem Strich links
   (ohne Fläche), die Wissensbibliothek denselben Kasten MIT Warnfläche und begrenzter
   Lesebreite. Zusammengeführt: Fläche und Textfarbe aus dem Wissen (sie machen den
   Hinweis auch im dunklen Thema lesbar), der Strich links aus den Berichten. Ein Befund
   sagt überall dasselbe – „hier fehlt etwas, und das wird nicht verschwiegen". */
.befund { border: 1px solid var(--linie); border-left: 4px solid var(--warn);
  background: var(--warn-bg); color: var(--warn-text);
  border-radius: var(--radius); padding: .55rem .8rem; margin: .5rem 0 var(--ab-4);
  font-size: var(--gr-m); max-width: 72ch; }
.befund .kopfzeile { font-weight: 600; margin-bottom: .15rem; }
.befund a { color: inherit; }

/* Die „noch nicht zugeordnet"-Zeile: sichtbar unangenehm, absichtlich. */
tr.rest td { background: var(--warn-bg); font-weight: 600; }

.ergebniszeile td { border-top: 1px dashed var(--linie); font-style: italic; }

/* Kapitalfluss: Zufluss grün, Abfluss rot – dieselben Töne wie im Bank-Eingangskorb.
   Über die Tokens brauchen sie keine eigene Dunkel-Regel mehr. */
.bericht .ein { color: var(--erfolg); font-weight: 600; }
.bericht .aus { color: var(--gefahr); font-weight: 600; }

/* Der Weg nach oben („diese Zahl steht in …") und nach unten. */
.trail { display: flex; flex-wrap: wrap; gap: .4rem .8rem; align-items: center;
  font-size: .85rem; margin: .3rem 0 .9rem; color: var(--text-2); }
.trail .pfeil { opacity: .5; }
.trail strong { color: var(--text); }

/* Der Buchungssatz auf dem Beleg. */
.satzblock { border: 1px solid var(--linie); border-radius: var(--radius); overflow: hidden; }
.satzblock table { margin: 0; }

/* Der Rückweg über dem Buchungsbeleg (aus rechnungswesen/buchungsbeleg.html). */
.ruckweg { display: flex; flex-wrap: wrap; gap: .6rem 1rem; align-items: center;
           margin: .4rem 0 1rem; }
.ruckweg form { margin: 0; }

/* Das Nebenbuch (aus rechnungswesen/nebenbuch.html). `.abstimmung` ist die Schwester der
   `.urteil`-Zeile oben – gleiche Bauform, eigener Name, weil sie eine andere Frage
   beantwortet (stimmt Nebenbuch mit Hauptbuch überein?). */
.nb { margin: 1.2rem 0 1.8rem; }
.nb h2 { margin-bottom: .3rem; }
.nb h2 small { font-weight: 400; color: var(--text-2); }
.abstimmung { display: flex; flex-wrap: wrap; gap: 1.2rem; align-items: baseline;
  border: 1px solid var(--linie); border-left-width: 4px; border-radius: var(--radius);
  padding: .55rem .8rem; margin: .4rem 0 .8rem; background: var(--flaeche-2);
  font-variant-numeric: tabular-nums; }
.abstimmung.gut { border-left-color: var(--blaugruen); }
.abstimmung.schief { border-left-color: var(--warn); }
.abstimmung .lbl { display: block; font-size: .7rem; text-transform: uppercase;
  letter-spacing: .03em; color: var(--text-2); }
/* KOLLISION `.urteil`: bei den Berichtsseiten ist das der KASTEN, im Nebenbuch das WORT
   darin („geht auf"). Bisher trugen die beiden Seiten verschiedene Stil-Vorlagen und
   wussten nichts voneinander; jetzt liegt beides in EINER Datei, also muss der innere
   ausdrücklich schmucklos bleiben – sonst steckte im Abstimmungs-Kasten ein zweiter. */
.abstimmung .urteil { display: inline; border: 0; padding: 0; background: none;
                      border-radius: 0; margin: 0 0 0 auto; font-size: .85rem; }
.nb-tabelle { margin: .4rem 0 .8rem; }
.nb-tabelle .r { text-align: right; font-variant-numeric: tabular-nums; }
.nb-tabelle .summe td { border-top: 1px solid var(--linie); font-size: .85rem;
  color: var(--text-2); }

/* ---------------------------------------------------------------------
   6.5  BANK   (aus bank/_umsatz_stil.html und den sechs Bank-Seiten)

   Umsatzlisten, Töpfe, Import, Eröffnung, Salden. Die fünf Töpfe tragen jetzt die
   Bedeutungsfarben des Hauses statt eigener Hex-Werte – damit fällt auch jede der
   früheren `html[data-theme="dunkel"]`-Sonderregeln weg: das ist genau die Arbeit, die
   ein Token abnimmt.
   --------------------------------------------------------------------- */

.umsatz-tabelle td { vertical-align: top; }
.umsatz-tabelle .zweck { color: var(--text-2); }
.umsatz-tabelle .nowrap { white-space: nowrap; }
.umsatz-tabelle .mitte { text-align: center; }

/* KOLLISION `.betrag`: dreimal notiert (Umsatzlisten, Salden-Seite, Umsatz-Karte), zweimal
   Wort für Wort gleich, einmal ohne `white-space`. Zusammengeführt zur strengeren Fassung –
   ein Betrag, der umbricht, ist in keiner der drei Listen erwünscht. */
.betrag { white-space: nowrap; font-variant-numeric: tabular-nums; font-weight: 600; }
.betrag.ein { color: var(--erfolg); }
.betrag.aus { color: var(--gefahr); }

.topf {
  display: inline-block; padding: .12rem .5rem; border-radius: var(--radius-rund);
  font-size: .78rem; font-weight: 600; border: 1px solid transparent; white-space: nowrap;
}
.topf-kosten    { background: var(--gefahr-bg);    color: var(--gefahr-text); }
.topf-einnahme  { background: var(--erfolg-bg);    color: var(--erfolg-text); }
.topf-umbuchung { background: var(--violett-bg);   color: var(--violett-text); }
/* Fünfter Topf: Blaugrün, bewusst NICHT grün/rot – ein Ausgleich ist weder Ertrag noch
   Aufwand, sondern ein Tausch. Genau dafür gibt es den Token. */
.topf-ausgleich { background: var(--blaugruen-bg); color: var(--blaugruen-text); }
.topf-ignoriert,
.topf-ignorieren{ background: var(--neutral-bg);   color: var(--neutral-text); }
.topf-offen     { background: transparent; color: var(--text-2); border-color: var(--linie); }
.topf-link { margin-left: .2rem; }
/* Das Abo-Zeichen am wiederkehrenden Umsatz (aus bank/eingangskorb.html). */
.topf-abo { margin-left: .25rem; font-size: .72rem; padding: .05rem .35rem;
            border-radius: var(--radius-rund);
            background: var(--warn-bg); color: var(--warn-text); }

/* Die Sammel-Leiste über dem Eingangskorb. */
.sammelbar { display: flex; flex-wrap: wrap; align-items: end; gap: .6rem;
  padding: .7rem .8rem; margin: .4rem 0 .8rem; border: 1px solid var(--linie);
  border-radius: var(--radius); background: var(--flaeche-2); }
.sammelbar label { display: flex; flex-direction: column; font-size: .8rem; gap: .15rem; }
.sammelbar select { min-width: 9rem; }
.sammelbar .sb-info { align-self: center; }
.sammelbar .sb-check { flex-direction: row; align-items: center; gap: .3rem; }
.mini-btn { font-size: .8rem; white-space: nowrap; }

/* Die Eröffnungsbuchungen (aus bank/eroeffnung.html). */
.liste .r { text-align: right; font-variant-numeric: tabular-nums; }
.liste form { margin: 0; }

/* Der Import (aus bank/import.html) und die Import-Liste. */
.import-form { display: flex; flex-direction: column; gap: 1rem; max-width: 34rem;
               margin-top: 1rem; }
.import-form label { display: flex; flex-direction: column; gap: .3rem; font-weight: 600; }
.import-form label small { font-weight: 400; color: var(--text-2); }
.import-form input[type=file], .import-form select {
  padding: .5rem; border: 1px solid var(--linie); border-radius: var(--radius-s);
  background: var(--flaeche); color: inherit; font: inherit; }
.import-form .btn { align-self: flex-start; }
table .nowrap { white-space: nowrap; }

/* Salden & Abstimmung (aus bank/salden.html). */
.altlast { margin: .4rem 0 0; padding-left: 1.1rem; }
.altlast li { margin: .1rem 0; font-variant-numeric: tabular-nums; }
.salden-tabelle td { vertical-align: top; }
.salden-tabelle .zweck { color: var(--text-2); }
.salden-tabelle .errechnet { font-variant-numeric: tabular-nums; }
.abgleich-form { display: flex; align-items: center; gap: .5rem; flex-wrap: wrap; }
.abgleich-form .ist-feld { width: 8.5rem; text-align: right;
                           font-variant-numeric: tabular-nums; }
.abgleich-form .diff { min-width: 6.5rem; font-size: .85rem; font-weight: 600; }
.abgleich-form .diff.ok  { color: var(--erfolg); }
.abgleich-form .diff.weg { color: var(--gefahr); }

/* Der EINE Umsatz (aus bank/umsatz.html) – drei Blöcke auf einer Seite. */
/* „Wo diese Bankzeile im Abschluss landet": der Weg nach oben. Er steht im Zweig
   „bereits gebucht" und hat mit dem Formular des offenen Umsatzes nichts zu tun. */
.spur-hoch { border: 1px solid var(--linie); border-left: 4px solid var(--blaugruen);
  border-radius: var(--radius); padding: .6rem .9rem; margin: .6rem 0 1rem;
  font-size: .9rem; }
.spur-hoch .spur-kopf { font-weight: 600; margin-bottom: .25rem; }
.spur-hoch ul { margin: .3rem 0 0; padding-left: 1.1rem; }
.spur-hoch li { margin: .15rem 0; }
.spur-hoch .konto-nr { font-family: var(--mono); font-size: .85em; color: var(--text-2); }

.topf-wahl { display: flex; flex-wrap: wrap; gap: .5rem; margin: .4rem 0 .8rem; }
.topf-radio { border: 1px solid var(--linie); border-radius: var(--radius-rund);
              padding: .3rem .8rem; cursor: pointer; }
.topf-radio:has(input:checked) { border-color: var(--akzent);
                                 background: var(--akzent-tint); font-weight: 600; }
.topf-block { border: 1px solid var(--linie); border-radius: var(--radius);
              padding: .6rem .9rem; margin: .5rem 0; }
.topf-block legend { font-size: .82rem; font-weight: 600; padding: 0 .35rem; }
.posten-wahl { width: 100%; border-collapse: collapse; font-size: .86rem; margin: .4rem 0; }
.posten-wahl th, .posten-wahl td { padding: .25rem .4rem;
                                   border-bottom: 1px solid var(--linie); text-align: left; }
.posten-wahl th { font-size: .72rem; text-transform: uppercase; letter-spacing: .03em;
                  color: var(--text-2); }
.posten-wahl .r { text-align: right; font-variant-numeric: tabular-nums;
                  white-space: nowrap; }
.teil { display: block; margin: .5rem 0 .2rem; }
.teil input { width: 10rem; }

.umsatz-karte { border: 1px solid var(--linie); border-radius: var(--radius);
                padding: .8rem 1rem; margin: .6rem 0 1rem; background: var(--flaeche-2); }
.uk-zeile { display: grid; grid-template-columns: auto 1fr auto 1fr auto 1fr;
            gap: .35rem 1rem; align-items: baseline; }
.uk-label { font-size: .72rem; text-transform: uppercase; letter-spacing: .03em;
            color: var(--text-2); }
.uk-zweck { margin-top: .5rem; font-size: .85rem; color: var(--text-2); }
@media (max-width: 720px) { .uk-zeile { grid-template-columns: auto 1fr; } }

/* ---------------------------------------------------------------------
   6.6  EINZELSEITEN

   Der Kleinkram, der vorher als <style>-Block mitten in EINER Vorlage stand: Tickets,
   Controlling, Beschaffung, Vertrieb, Stammdaten. Zusammengelegt ist, was doppelt
   dastand; getrennt geblieben ist, was nur denselben Namen trug.
   --------------------------------------------------------------------- */

/* -------- Ticket-Detail, CO-Beleg, Kostenerfassung (Anhänge, Verlauf, Suche) --------
   `.c2-*` (Ticket) und `.a05-*` (CO-Beleg) sind dieselbe Bauform in zwei Bereichen; die
   Namen bleiben, wie sie sind – ein Klassenname im Markup ist kein Stil, und Umbenennen
   zerreißt nur Wege. Die drei wortgleichen Regeln (`.c2-abschnitt` stand zusätzlich im
   Kalender, `.c2-dropzone` in zwei Masken) stehen jetzt einmal. */
.c2-abschnitt, .a05-abschnitt { margin-top: 1.6rem; }
.a05b-abschnitt { margin-top: 2rem; }
/* ORG-406: die Anhänge am Beleg – Vorschaubild links, Schild (Bezeichnung/Untertitel) rechts. */
.anhang-liste li.anhang-zeile { align-items: flex-start; }
.anhang-vorschau { width: 96px; height: 72px; object-fit: cover; border-radius: var(--radius-s);
  border: 1px solid var(--linie); flex: none; display: flex; align-items: center;
  justify-content: center; font-size: 1.6rem; background: var(--flaeche-2, transparent); }
.anhang-schild { display: flex; flex-direction: column; gap: 4px; flex: 1; min-width: 0; }
.anhang-schild input { width: 100%; box-sizing: border-box; }
.anhang-schild button { align-self: flex-start; }

.c2-liste, .a05-liste { list-style: none; padding: 0; margin: .4rem 0; }
.c2-liste li, .a05-liste li { display: flex; align-items: center; gap: .5rem;
                              padding: .35rem 0; border-bottom: 1px solid var(--linie); }
.c2-bez, .a05-bez { color: var(--text-2); font-size: .85rem; }
.c2-form-inline { display: flex; flex-wrap: wrap; gap: .5rem; align-items: flex-end;
                  margin-top: .5rem; }
.c2-suchfeld { position: relative; }
.c2-treffer { position: absolute; z-index: 20; left: 0; right: 0; background: var(--flaeche);
              border: 1px solid var(--linie); border-radius: var(--radius-s);
              margin-top: 2px; max-height: 240px; overflow-y: auto;
              box-shadow: var(--schatten-2); }
.c2-treffer button { display: block; width: 100%; text-align: left; border: 0;
                     background: none; padding: .4rem .6rem; cursor: pointer;
                     color: inherit; }
.c2-treffer button:hover { background: var(--akzent-tint); }
.c2-gewaehlt { font-weight: 600; }
.c2-dropzone, .a05-dropzone { border: 2px dashed var(--linie); border-radius: var(--radius);
              padding: 1rem; text-align: center; color: var(--text-2); cursor: pointer;
              transition: background .15s, border-color .15s; }
.c2-dropzone.hover, .a05-dropzone.hover { border-color: var(--akzent);
                                          background: var(--akzent-tint); }
.c2-verlauf { list-style: none; padding: 0; margin: .4rem 0; }
.c2-verlauf li { padding: .45rem 0; border-bottom: 1px solid var(--linie-2); }
.c2-verlauf .meta { font-size: .78rem; color: var(--text-2); }
/* Das Art-Zeichen am Verlaufseintrag: ein gefülltes Etikett mit weißer Schrift. Die fünf
   Arten tragen die Volltöne des Hauses – Status = Akzent, Anhang = Erfolg, Verknüpfung =
   Violett, System = Neutral, Kommentar = Blaugrün. */
.c2-typ { font-size: .75rem; color: #fff; background: var(--neutral);
          border-radius: 4px; padding: .05rem .4rem; white-space: nowrap; }
.c2-verlauf .art-status .c2-typ { background: var(--akzent); }
.c2-verlauf .art-anhang .c2-typ { background: var(--erfolg); }
.c2-verlauf .art-verknuepfung .c2-typ { background: var(--violett); }
.c2-verlauf .art-system .c2-typ { background: var(--neutral); }
.c2-verlauf .art-kommentar .c2-typ { background: var(--blaugruen); }

/* -------- Dauerkosten-Liste: die Filter-Chips -------- */
.filter-chips { display: flex; gap: .4rem; flex-wrap: wrap; margin: .4rem 0 1rem; }
.chip { padding: .25rem .7rem; border-radius: var(--radius-rund);
        border: 1px solid var(--linie); font-size: .85rem; color: var(--text-2);
        text-decoration: none; }
.chip-aktiv { background: var(--akzent); border-color: var(--akzent); color: #fff; }
.a05b-ausblick { max-width: 22rem; }

/* -------- Beschaffung: Bestellung, Direktkauf, Verbindlichkeiten -------- */
/* KOLLISION `.zahlblock`: stand wortgleich in der Bestell-Detailseite und auf der
   Belegseite im Vertrieb – dieselbe Zahlungszeile, zweimal notiert. Jetzt einmal. */
.zahlblock { display: flex; flex-wrap: wrap; gap: .6rem; align-items: end; }
.zahlblock label { display: flex; flex-direction: column; font-size: .8rem; gap: .15rem; }
.zahlblock input { width: 9rem; }
.schritt { margin: .4rem 0 .8rem; }
.schritt .hinweis { display: block; max-width: 62rem; margin-top: .35rem; }
.we-eingabe { width: auto; margin: .2rem 0 .5rem; }
.we-eingabe input { width: 7rem; }
.we-eingabe tr.fertig { color: var(--text-2); }
.werekarte { display: flex; flex-wrap: wrap; gap: 1.2rem; align-items: baseline;
  border: 1px solid var(--linie); border-radius: var(--radius); padding: .55rem .8rem;
  margin: .3rem 0 .7rem; background: var(--flaeche-2); font-variant-numeric: tabular-nums; }
.werekarte .wk-lbl { display: block; font-size: .7rem; text-transform: uppercase;
  letter-spacing: .03em; color: var(--text-2); }
.werekarte .wk-urteil { flex: 1 1 16rem; font-size: .85rem; color: var(--text-2); }
.faellig-warn { color: var(--warn); }
.haken-inline { flex-direction: row !important; align-items: center; gap: .35rem; }
.haken-inline input { width: auto; }

/* KOLLISION `.haken`: der Direktkauf beschrieb die Reihe (Kästchen neben Text), die
   Betriebsdaten-Maske nur die Ausnahme gegen `.formular label`. Beides gehört zusammen und
   gilt ab jetzt für jedes `<label class="haken">` im Haus – ein Häkchen sieht überall
   gleich aus, und genau dafür ist eine gemeinsame Datei da.
   ⚠ Die zweite Zeile braucht `.formular label.haken`: `.formular label` stapelt
   Beschriftung über Feld und schlägt `.haken` in der Spezifität – ohne die höhere
   Angabe stünde das Kästchen ÜBER seinem Text. */
.haken { display: flex; align-items: center; justify-content: flex-start;
         align-self: flex-start; gap: .45rem; margin: .6rem 0; font-size: .9rem;
         text-align: left; }
.haken input { width: auto; }
.formular label.haken { flex-direction: row; align-items: center;
                        justify-content: flex-start; gap: .5rem; }
.formular label.haken input { width: auto; margin: 0; }

/* KOLLISION `.ueberfaellig`: die Klasse gehört dem Haus (Abschnitt 4, Gefahrenfarbe). Die
   Verbindlichkeitenliste färbte sie gelb – dort steht sie neben einem FÄLLIGKEITSDATUM und
   ist eine Frist-Warnung, kein Alarm. Sie bleibt deshalb, aber element-genau angeschrieben:
   `<strong class="ueberfaellig">` gibt es nur dort, die Ticket-Seiten benutzen <span> und
   <small> und behalten die Hausfarbe. */
strong.ueberfaellig { color: var(--warn); }
.befund-zeile { border-left: 4px solid var(--warn); background: var(--flaeche-2);
  border-radius: var(--radius-s); padding: .45rem .7rem; margin: .5rem 0; font-size: .9rem; }

/* -------- Vertrieb: Belegseite, Positionen, Lieferung -------- */
.kopf .druckknopf { margin-left: auto; text-decoration: none; }
.belegtexte { margin: .2rem 0 .8rem; }
.belegtexte dt { font-size: .7rem; text-transform: uppercase; letter-spacing: .03em;
  color: var(--text-2); margin-top: .5rem; }
.belegtexte dd { margin: .1rem 0 0; }
.belegtexte dd.absatz { white-space: pre-wrap; }
.texte-bearbeiten { margin: .2rem 0 1rem; }
.texte-bearbeiten summary { cursor: pointer; font-size: .85rem; color: var(--text-2); }
.intern { border-left: 3px dashed var(--linie); padding: .35rem 0 .35rem .8rem;
  margin: .2rem 0 .9rem; }
.intern-marke { font-size: .7rem; text-transform: uppercase; letter-spacing: .03em;
  color: var(--text-2); }
.intern p { margin: .15rem 0 0; white-space: pre-wrap; }
.gruppe-kopf th { background: var(--flaeche-2); border-top: 2px solid var(--linie);
  font-size: .85rem; letter-spacing: .02em; }
.pos-gruppe + .pos-gruppe .gruppe-kopf th { padding-top: .5rem; }
.bestandsnote { display: block; font-size: .72rem; color: var(--text-2); }
.bestandsnote.knapp { font-weight: 600; }
.bestandshinweis { border-left: 3px solid var(--linie); padding: .35rem 0 .35rem .8rem;
  margin: .3rem 0 .8rem; font-size: .85rem; color: var(--text-2); }
.bestandshinweis p { margin: .2rem 0; }
.p19 { border-left: 3px solid var(--linie); padding: .35rem 0 .35rem .8rem;
  margin: .2rem 0 .8rem; font-size: .85rem; color: var(--text-2); }
.entwurf-aus { border-left: 3px solid var(--linie); padding: .35rem 0 .35rem .8rem;
  margin: .2rem 0 .8rem; font-size: .85rem; color: var(--text-2); }
/* Die drei Notgriffe der Belegseite (Druckknopf, Liefernknopf, Entwurfsleiste) haben genau
   das repariert, was oben an der Wurzel behoben ist: sie schrieben einzelnen Knöpfen
   `color:#fff` vor, weil `.aktionen a` den `.btn` überstimmte. Die Farbe ziehen sie NICHT
   mit um – im dunklen Thema wäre sie falsch, dort trägt der .btn dunkle Schrift. */
.entwurf-an a.btn { text-decoration: none; }
.entwurf-an .btn-still { background: none; border: 1px solid var(--linie);
  color: var(--text-2); }
.posten-karte { display: flex; flex-wrap: wrap; gap: 1.2rem; align-items: baseline;
  border: 1px solid var(--linie); border-radius: var(--radius); padding: .55rem .8rem;
  margin: .3rem 0 .7rem; background: var(--flaeche-2); font-variant-numeric: tabular-nums; }
.pk-lbl { display: block; font-size: .7rem; text-transform: uppercase; letter-spacing: .03em;
  color: var(--text-2); }
.pk-urteil { margin-left: auto; font-size: .85rem; color: var(--text-2); }
/* KOLLISION `.knapp`: die Lieferungsmaske meint den KASTEN „diese Menge reicht nicht",
   die Belegseite das Wort `.bestandsnote.knapp` in einer Tabellenzelle. Der Kasten ist
   element-genau angeschrieben – ein <div class="knapp"> gibt es nur in der Lieferung. */
div.knapp { border-left: 3px solid var(--linie); padding: .35rem 0 .35rem .8rem;
  margin: .4rem 0 .8rem; font-size: .85rem; color: var(--text-2); }
div.knapp p { margin: .2rem 0; }

/* -------- Stammdaten: Preisvorschlag, Merkkästen -------- */
.preisvorschlag { margin: .15rem 0 .3rem; font-size: .85rem;
  color: var(--text-2); font-variant-numeric: tabular-nums; }
/* KOLLISION `.merk`: in den Stammdaten ist das ein Merkkasten (<div> mit Strich links,
   Betriebsdaten und Textvorlagen – dort stand er zweimal, nur mit anderem Außenabstand
   unten; genommen ist der größere), im Bank-Umsatz das Häkchen „Regel merken" (<label>).
   Zwei Bedeutungen, ein Name – deshalb je Element angeschrieben statt zusammengeführt. */
div.merk { border-left: 3px solid var(--linie); padding: .2rem 0 .2rem .8rem;
  margin: .6rem 0 .8rem; font-size: .85rem; color: var(--text-2); }
div.merk p { margin: .35rem 0; }
label.merk { display: block; margin: .6rem 0; }


/* ---------------------------------------------------------------------
   6.7 KOPFLEISTE UND SEITENLEISTE (Ausbau 25 B0)
   Zog aus base.html hierher. Bis dahin stand die Optik dieser drei
   Bauteile als <style>-Block in der Vorlage – aus der Zeit, in der jedes
   Bauteil sein Stück Optik mitbrachte. Seit Ausbau 25 gilt: das Gesicht
   des Hauses wohnt an EINER Stelle.
   --------------------------------------------------------------------- */

/* Zähler-Pille am Menüpunkt (Eingangskörbe). Färbt über den Akzent-Token
   mit Thema und Akzent mit. */
.nav-link .nav-zaehler {
  margin-left: auto; min-width: 1.25rem; height: 1.25rem; padding: 0 .35rem;
  border-radius: var(--radius-rund); background: var(--akzent); color: #fff;
  font-size: var(--gr-xs); font-weight: 600; line-height: 1;
  display: inline-flex; align-items: center; justify-content: center;
}

/* Das SUCHFELD in der Kopfleiste – ausschließlich über Tokens gefärbt. */
.topbar-suche { display: flex; align-items: center; margin-left: auto; }
.topbar-suche input {
  width: 15rem; max-width: 34vw; padding: 5px 10px;
  border: 1px solid var(--linie); border-radius: var(--radius-s);
  background: var(--flaeche-2); color: var(--text);
  font-size: var(--gr-m); font-family: inherit;
}
.topbar-suche input:focus {
  outline: none; border-color: var(--akzent); box-shadow: var(--ring);
  background: var(--flaeche);
}
.topbar-suche input::placeholder { color: var(--text-2); }

/* ZULETZT GEÖFFNET (Ausbau 28 C, ORG-410): die Leiste links neben der Suche.
   Kommt leer und `hidden` vom Server; handgriffe.js füllt sie. Sitzt sie da,
   rückt sie an die Suche heran (die verliert dann ihren Auto-Rand). Jeder
   Eintrag ist ein Link mit Kürzel (fett) und Titel; der aktuelle ist markiert.
   Unter 900 px fällt sie weg – dort ist kein Platz für fünf Titel. */
.topbar-zuletzt {
  display: flex; align-items: center; gap: var(--ab-1);
  margin-left: auto; min-width: 0; overflow: hidden; flex: 0 1 auto;
  font-size: var(--gr-s);
}
.topbar-zuletzt:not([hidden]) ~ .topbar-suche { margin-left: 0; }
/* Die Brotkrumen geben der Leiste keinen Platz ab: sie bleiben in einer Zeile,
   die Leiste schrumpft (ihre Eintraege werden mit … gekuerzt). */
.topbar-zuletzt:not([hidden]) ~ * { flex-shrink: 0; }
.topbar:has(.topbar-zuletzt:not([hidden])) > .brotkrumen { flex: none; flex-wrap: nowrap; white-space: nowrap; }
.topbar-zuletzt .zuletzt-titel {
  color: var(--text-3); text-transform: uppercase; letter-spacing: .04em;
  font-size: var(--gr-xs); margin-right: var(--ab-1); flex: none;
}
.topbar-zuletzt .zuletzt-eintrag {
  display: inline-flex; align-items: baseline; gap: .3em;
  max-width: 13rem; padding: 3px 8px;
  border: 1px solid var(--linie); border-radius: var(--radius-s);
  background: var(--flaeche-2); color: var(--text-2);
  text-decoration: none; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.topbar-zuletzt .zuletzt-eintrag strong { color: var(--text); font-weight: 600; flex: none; max-width: 100%; overflow: hidden; text-overflow: ellipsis; }
.topbar-zuletzt .zuletzt-eintrag span { overflow: hidden; text-overflow: ellipsis; }
.topbar-zuletzt .zuletzt-eintrag:hover { border-color: var(--akzent); color: var(--akzent); }
.topbar-zuletzt .zuletzt-eintrag:hover strong { color: var(--akzent); }
.topbar-zuletzt .zuletzt-eintrag.aktuell {
  border-color: var(--akzent); background: var(--akzent-tint); color: var(--akzent-text);
}
.topbar-zuletzt .zuletzt-eintrag.aktuell strong { color: var(--akzent-text); }
@media (max-width: 900px) { .topbar-zuletzt { display: none; } }
@media print { .topbar-zuletzt { display: none; } }

/* DAS „?“ – ein Geschwister des Themenschalters: gleiche Höhe, gleiche
   Rundung. Der LEERE Zustand ist blasser und gestrichelt umrandet: er
   lädt ein, ohne sich als fertige Hilfe auszugeben. */
.topbar-hilfe {
  display: inline-flex; align-items: center; justify-content: center;
  width: 1.9rem; height: 1.9rem; margin-left: 8px; flex: none;
  border: 1px solid var(--linie); border-radius: var(--radius-s);
  background: var(--flaeche-2); color: var(--text);
  font-size: var(--gr-m); font-weight: 700; line-height: 1; text-decoration: none;
}
.topbar-hilfe:hover { border-color: var(--akzent); color: var(--akzent); }
.topbar-hilfe.leer { border-style: dashed; color: var(--text-2); font-weight: 500; }


/* ---------------------------------------------------------------------
   6.8 DER SEITENKOPF (Ausbau 25 B0)
   Das gemeinsame Bauteil `_seitenkopf.html`: Überschrift, EIN Satz
   darunter, Knöpfe rechts. Es baut auf `.kopf` auf, das es längst gab –
   neu ist nur, dass der eine Satz einen festen Platz hat, statt als
   Absatz irgendwo unter der Überschrift zu stehen.
   --------------------------------------------------------------------- */

.seitenkopf { align-items: flex-start; }
.seitenkopf h1 { margin: 0; }
.seitenkopf .seitenkopf-text { min-width: 0; }
.seitenkopf .seitenkopf-satz {
  margin: var(--ab-1) 0 0; color: var(--text-2); font-size: var(--gr-m);
  max-width: 68ch;
}
.seitenkopf .seitenkopf-knoepfe {
  display: flex; align-items: center; gap: var(--ab-2); flex: none; flex-wrap: wrap;
}

/* Der HINWEISKASTEN am Feld (`_hinweiskasten.html`): kurz, im Moment des
   Handelns, direkt neben der Eingabe. Nicht zu verwechseln mit `.befund`
   (ein Befund der Daten) oder `.hinweis` (eine Zeile Beiwerk). */
.feldkasten {
  display: flex; gap: var(--ab-2); align-items: flex-start;
  margin: var(--ab-2) 0; padding: var(--ab-2) var(--ab-3);
  border-left: 3px solid var(--warn); border-radius: var(--radius-s);
  background: var(--warn-bg); color: var(--warn-text);
  font-size: var(--gr-s); max-width: 60ch;
}
.feldkasten.merken { border-left-color: var(--akzent); background: var(--akzent-tint);
  color: var(--akzent-text); }
.feldkasten.gefahr { border-left-color: var(--gefahr); background: var(--gefahr-bg);
  color: var(--gefahr-text); }
.feldkasten .feldkasten-zeichen { flex: none; font-weight: 700; }


/* ---------------------------------------------------------------------
   6.9 FILTERPILLEN (Ausbau 25 B0)
   Was gerade gefiltert ist, steht SICHTBAR über der Liste – je Filter
   eine Pille mit ✕. Der Grund ist ein echter Fund: die Ticketliste
   filtert per Vorgabe auf „Offen & in Arbeit" und merkt sich Filter über
   die Sitzung. Beides ist richtiges Verhalten, aber es stand nur in
   einem Absatz – und deshalb „verschwanden" Tickets. Eine Pille erklärt
   sich ohne Satz und hat den Rückweg gleich dabei.
   --------------------------------------------------------------------- */

.filterpillen {
  display: flex; flex-wrap: wrap; align-items: center; gap: var(--ab-2);
  margin: var(--ab-2) 0 var(--ab-3);
}
.filterpillen .filterpillen-titel { color: var(--text-3); font-size: var(--gr-s); }
.filterpille {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 3px 6px 3px 10px; border-radius: var(--radius-rund);
  background: var(--akzent-tint); color: var(--akzent-text);
  border: 1px solid transparent;
  font-size: var(--gr-s); text-decoration: none; line-height: 1.4;
}
.filterpille:hover { border-color: var(--akzent); color: var(--akzent-text); }
.filterpille .pille-feld { color: var(--text-2); }
.filterpille .pille-weg {
  display: inline-flex; align-items: center; justify-content: center;
  width: 1.1rem; height: 1.1rem; border-radius: var(--radius-rund);
  background: var(--flaeche); color: var(--text-2); font-size: var(--gr-xs);
}
.filterpille:hover .pille-weg { background: var(--akzent); color: #fff; }
/* Die Pille, die eine VORGABE sichtbar macht (niemand hat sie gesetzt –
   sie gilt einfach). Leiser gezeichnet, damit die selbst gewählten
   Filter vorn stehen. */
.filterpille.vorgabe { background: var(--neutral-bg); color: var(--neutral-text); }
.filterpille.vorgabe:hover { border-color: var(--text-3); }


/* ---------------------------------------------------------------------
   6.10 EINZELSEITEN, die in B0 neu entworfen wurden (Ausbau 25)
   --------------------------------------------------------------------- */

/* Bedarfsplanung: die Ergebnistabelle hat seit dem mehrstufigen Lauf mehr
   Spalten als die Karte breit ist. Statt Spalten wegzulassen, darf sie
   waagerecht rollen – eine Zahl abschneiden hieße, die Rechnung zu
   verstecken, um die es hier geht. Nur dieser Block rollt. */
.breit { overflow-x: auto; }
.breit > table { min-width: 100%; }

/* Die DISPOSITIONSSTUFE als kleine Marke vor dem Material. */
.stufe-marke {
  display: inline-block; min-width: 1.6em; text-align: center;
  border-radius: .5em; padding: 0 .35em; font-size: .8em;
  background: var(--neutral-bg); color: var(--neutral-text);
}

/* Ticketliste: die Zeile über der Tabelle, die den Zustand der Sicht in
   Zahlen sagt (wie viele gezeigt, wonach sortiert, ob der Baum steht).
   Sie ersetzt einen Absatz Fließtext – gemessen statt behauptet. */
.listenstand {
  display: flex; flex-wrap: wrap; align-items: center; gap: var(--ab-3);
  color: var(--text-2); font-size: var(--gr-s); margin: 0 0 var(--ab-3);
}
.listenstand .stand-zahl { color: var(--text); font-weight: 600; }

/* Schrift AUF einer FARBE AUS DEN DATEN (Kategorie, Rolle, Workflow-Status).
   Die Fläche kommt zur Laufzeit aus der Datenbank, die Schrift darauf ist eine
   Design-Entscheidung – und die gehört hierher, nicht sieben Mal als `color:#fff`
   ins Markup. Wo die Datenfarbe hell sein kann, rechnet `farbe.textfarbe()` in
   app/ Schwarz oder Weiß aus; diese Klasse ist der einfache Fall. */
.auf-datenfarbe { color: #fff; }


/* ---------------------------------------------------------------------
   6.11 KLEINE BAUTEILE, die aus den Bereichsdurchgängen gemeldet wurden
   (Ausbau 25 B1–B6). Sie standen bis dahin als Inline-Styles im Markup
   oder als Klasse ohne Regel – gemeldet statt selbst gebaut, damit nicht
   sechs Agenten sechs Fassungen derselben Sache anlegen.
   --------------------------------------------------------------------- */

/* Der FARBPUNKT vor einem Namen (Kategorie, Rolle, Postfach-Kategorie).
   Die Fläche kommt aus den Daten, die Form von hier – vorher stand sie
   dreimal als sechs Inline-Deklarationen im Markup. */
.farb-punkt {
  display: inline-block; width: 1rem; height: 1rem; flex: none;
  border-radius: var(--radius-rund); border: 1px solid var(--linie);
  vertical-align: -.15rem;
}

/* Die SPRUNGLEISTE über der Wissensbibliothek: ein Link je Regal mit
   seiner Zahl. Sie wird gebraucht, sobald die Bibliothek von 28 auf gut
   130 Artikel wächst – eine Liste, durch die man scrollt, hat keine
   Ordnung mehr, auch wenn sie gegliedert ist. */
.regal-sprung {
  display: flex; flex-wrap: wrap; gap: var(--ab-2);
  margin: 0 0 var(--ab-4);
}
.regal-sprung a {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 3px 10px; border-radius: var(--radius-rund);
  background: var(--flaeche-2); border: 1px solid var(--linie);
  color: var(--text-2); font-size: var(--gr-s); text-decoration: none;
}
.regal-sprung a:hover { border-color: var(--akzent); color: var(--akzent); }
.regal-sprung a small { color: var(--text-3); }

/* Die Marke „Seite" an einem Artikel mit Seiten-Bezug. Sie muss sich vom
   Status-Badge unterscheiden – der sagt, wie WEIT der Artikel ist, diese
   sagt, WOZU er gehört. */
.badge.seiten-marke {
  background: var(--akzent-tint); color: var(--akzent-text);
  border: 1px solid transparent;
}

/* Eine schmale Tabellenspalte (Häkchen, Position, Zahl). Ersetzt
   `style="width:6rem"` im `<th>`. */
.spalte-schmal { width: 6rem; }

/* Die Logo-Vorschau in den Betriebsdaten (ORG-367). Sie steht hier und
   nicht als `style="…"` am Bild: eine neue Oberfläche bekommt ihre Maße
   im Stylesheet, sonst hat das Haus zwei Orte für dieselbe Frage.
   Begrenzt wird beides, damit ein hohes und ein breites Logo gleich
   ordentlich in die Maske passen. */
.logo-vorschau { max-height: 90px; max-width: 260px; }

/* ------------------------------------------------------------------------
   6.x Belegvorlagen (ORG-368) – die Feldtabelle der Bearbeiten-Maske.
   Der vorbelegte Text ist das, worauf es dort ankommt: er bekommt die breiteste
   Spalte, und Eingabefeld wie Textbereich fuellen sie ganz aus. Ohne das quetscht
   die Tabelle den Hausstil auf zwei Woerter je Zeile zusammen.
   ------------------------------------------------------------------------ */
.vorlagen-felder td:nth-child(2) { width: 22%; }
.vorlagen-felder td:last-child { width: 40%; }
.vorlagen-felder textarea,
.vorlagen-felder input,
.vorlagen-felder select { width: 100%; }
.vorlagen-felder textarea { min-height: 7.5rem; }

/* ------------------------------------------------------------------------
   6.x CRM – die Verbindungen der Opportunity (ORG-396, Ausbau 27 / Strang D).
   Zwei Listen, mehr braucht Strang D nicht: die faelligen WIEDERVORLAGEN auf
   dem Arbeitsplatz und die schlichten Verbindungslisten (Tickets, Termine)
   auf der Opportunity-Seite. Die Belege stehen in einer normalen Tabelle –
   dort gibt es Spalten mit Bedeutung, hier nicht.
   ------------------------------------------------------------------------ */
.wv-liste { list-style: none; margin: 0; padding: 0; }
.wv-liste li {
  display: flex; align-items: baseline; gap: .5rem; flex-wrap: wrap;
  padding: .35rem 0; border-bottom: 1px solid var(--linie);
}
.wv-liste li:last-child { border-bottom: 0; }

/* Der Tag links sagt in EINEM Wort, wie dringend die Zeile ist. Feste Breite,
   damit die Titel darunter auf einer Kante stehen – eine Liste, deren zweite
   Spalte springt, liest sich schlechter, als sie ist. */
.wv-tag {
  flex: 0 0 5.5rem; font-size: .8rem; color: var(--text-2);
  text-transform: lowercase;
}
.wv-ueberfaellig .wv-tag { color: var(--gefahr); font-weight: 600; }

.wv-titel { flex: 1 1 18rem; min-width: 0; }
.wv-kunde { color: var(--text-2); }

/* Der naechste Schritt ist der eigentliche Inhalt der Zeile und bekommt
   deshalb die ganze Restbreite – gekuerzt statt umgebrochen, damit die Liste
   auch bei zwanzig Faellen ueberschaubar bleibt. */
.wv-schritt {
  flex: 1 1 100%; color: var(--text-2); font-size: .9rem;
  padding-left: 5.5rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}

.verbindungsliste { list-style: none; margin: .25rem 0 0; padding: 0; }
.verbindungsliste li {
  display: flex; align-items: baseline; gap: .5rem; flex-wrap: wrap;
  padding: .3rem 0; border-bottom: 1px solid var(--linie);
}
.verbindungsliste li:last-child { border-bottom: 0; }

/* =====================================================================
   Ausbau 28 B (ORG-409): DIE GRÖSSE – in die Ecke greifen und ziehen.
   Gemalt wird nur der GRIFF und der Rahmen, den groesse.js um Tabellen
   und Textfelder legt. Die Werte selbst setzt das Skript inline; ohne
   Javascript steht hier nichts, was man sieht (Linie ORG-103).
   ===================================================================== */

/* Der Wirt trägt den Griff – dafür braucht er einen Bezugspunkt. */
.ziehbar { position: relative; }

/* Der Rahmen um eine Tabelle: wird er schmaler als die Tabelle, WISCHT er, nicht die
   Seite (dasselbe Rezept wie .tabelle-rahmen, ORG-94). Die Optik der Tabelle bleibt an
   der Tabelle – der Rahmen selbst ist unsichtbar. */
.zieh-rahmen { max-width: 100%; overflow-x: clip; }
/* Ausbau 28 D (ORG-411): der Rahmen wischt nur, wenn die Tabelle wirklich breiter ist als er
   (Klasse `wischt`, gesetzt und nachgemessen von groesse.js). Grund: ein Rahmen mit
   `overflow: auto` ist ein Scroll-Container – und in einem Scroll-Container klebt der
   Tabellenkopf am Rahmen statt unter der Kopfleiste. Passt die Tabelle, bleibt der Kopf
   beim Scrollen stehen; passt sie nicht, wischt sie wie in Strang B. */
.zieh-rahmen.wischt { overflow-x: auto; }
.zieh-rahmen.wischt thead th { position: static; }
.zieh-rahmen > table { margin-top: 0; margin-bottom: 0; }
.zieh-huelle { display: block; position: relative; }
.zieh-huelle > textarea { display: block; width: 100%; resize: none; }

/* DER GRIFF: unten rechts, zwei feine Diagonalen in der Tertiärfarbe – sichtbar erst
   beim Überfahren des Wirts, damit die Seite nicht voller Ecken ist. Der Zeiger sagt,
   in welche Richtung es geht. */
.zieh-griff {
  position: absolute; right: 2px; bottom: 2px; width: 14px; height: 14px; z-index: 3;
  cursor: nwse-resize; opacity: 0; transition: opacity .12s ease;
  background:
    linear-gradient(135deg, transparent 0 55%, var(--text-3) 55% 62%, transparent 62% 75%,
                    var(--text-3) 75% 82%, transparent 82%);
  border-bottom-right-radius: var(--radius-s);
}
.ziehbar:hover > .zieh-griff, .ziehbar.zieht > .zieh-griff { opacity: .9; }
.zieh-griff:hover { background-image:
    linear-gradient(135deg, transparent 0 55%, var(--akzent) 55% 62%, transparent 62% 75%,
                    var(--akzent) 75% 82%, transparent 82%); }
.ziehbar-breite > .zieh-griff { cursor: ew-resize; }
.ziehbar-hoehe  > .zieh-griff { cursor: ns-resize; }
.ziehbar.zieht { outline: 1px dashed var(--akzent); outline-offset: 2px; user-select: none; }

/* Die zwei Spalten: die linke Spalte ist eine Rasterspalte, ihre Breite steht als Token am
   Kasten (--zs-links, gesetzt von groesse.js). Unter 900 px greift die Regel aus
   Abschnitt 6 – eine Spalte – und das Token läuft ins Leere: genau richtig. Der Griff ist
   hier ein senkrechter TRENNER am rechten Rand der linken Spalte. */
.zwei-seiten > section.ziehbar > .zieh-griff {
  top: 0; bottom: 0; right: -.7rem; width: .5rem; height: auto;
  background: none; border-radius: var(--radius-rund); cursor: col-resize;
}
.zwei-seiten > section.ziehbar:hover > .zieh-griff,
.zwei-seiten > section.ziehbar.zieht > .zieh-griff { background: var(--linie); opacity: 1; }
.zwei-seiten > section.ziehbar > .zieh-griff:hover { background: var(--akzent); }

/* Auf Papier gibt es keine Ecke zum Anfassen. */
@media print { .zieh-griff { display: none !important; } }
@media (max-width: 900px) { .zieh-griff { display: none; } }

/* ---- ORG-427: die Blöcke in der Erfassungsmaske (Angebot neu / Entwurf ändern) ----
   Die Block-Spalte trägt die Gruppe der gewählten Leistung und zwei Pfeile; darunter die
   Vorschau im Stil der Detailseite (`.pos-gruppe` / `.gruppe-kopf` gelten mit). */
td.block-zelle { white-space: nowrap; }
.block-marke {
  display: inline-block; margin-right: 6px; padding: 1px 8px; border-radius: 999px;
  background: var(--akzent-tint); color: var(--akzent-text); font-size: var(--gr-s);
}
.block-marke.ohne, .block-marke.offen { background: var(--flaeche-2); color: var(--text-2); }
table.block-vorschau { margin-top: 6px; }
table.block-vorschau td { padding: 5px 8px; }

/* ---- Anmeldung & Konto (Ausbau 29 B2, ORG-431) ----
   Die Anmeldeseite steht allein (ohne Seitenleiste): eine schmale Karte in der Mitte. Alle
   Farben kommen aus den Themenvariablen – hell, dunkel und Akzent folgen von selbst. */
.anmeldung-seite { background: var(--bg); color: var(--text); margin: 0;
  min-height: 100vh; display: flex; align-items: center; justify-content: center; }
.anmeldung-karte { width: 100%; max-width: 380px; padding: var(--ab-5); }
.anmeldung-karte h1 { font-size: var(--gr-h1); margin: 0 0 var(--ab-1); }
.anmeldung-karte .formular { max-width: none; margin-top: var(--ab-3); }
.anmeldung-karte code { font-size: var(--gr-s); }
/* Der Knopf „Abmelden" in der Kopfzeile (neben Hell/Dunkel) */
.konto-block { display: flex; align-items: center; gap: var(--ab-2); }
.konto-block form { margin: 0; }
.konto-name { font-size: var(--gr-s); color: var(--text-2); text-decoration: none; }
.konto-name:hover { color: var(--akzent); }
.konto-block .btn-mini { white-space: nowrap; }
/* Zugriffsstufe als Abzeichen in der Benutzerliste */
.stufe-lesen, .stufe-bearbeiten, .stufe-admin { font-weight: 600; }
.stufe-admin { color: var(--akzent-text); }
