@font-face {
  font-family: 'Inter';
  src: local('Inter'), local('Inter Variable'), url('/inter.woff2') format('woff2');
  font-weight: 100 900;
  font-display: swap;
}

/* UX-8 (K-1) — `size-adjust` GEGEN DIE ERSATZSCHRIFT, wie R15 es verlangt.
   ==========================================================================
   Der Plan fordert `size-adjust` an der Schrift (plan_ux_final.md:1004) und
   begründet es in R15 (:1174): `font-display: swap` ohne `size-adjust` heißt
   ein kurzer Layoutsprung beim ersten Laden. Der Zusatz steht bewusst NICHT
   an der Inter-Regel darüber, und das ist der ganze Punkt:

   `size-adjust` skaliert die Glyphen DER Schrift, an der es steht. An Inter
   gesetzt, würde es Inter selbst kleiner (oder größer) zeichnen — bei den
   veröffentlichten Inter-Werten rund 7 % — und damit die gesamte Oberfläche
   verändern. UX-1 hat als Abnahmekriterium „Die Oberfläche sieht identisch
   aus" (:1004). Eine Zeile, die den Sprung beseitigt, indem sie das Ziel
   verschiebt, löst nichts.

   Die wirksame Form ist eine EIGENE Ersatzschrift-Regel: Sie lädt nichts
   nach, sondern nimmt eine lokal vorhandene Grotesk und rechnet sie auf
   Inters Maße um. Solange Inter noch nicht da ist, steht der Text damit
   bereits in Inters Zeilenhöhe und Breite; ist Inter da, greift diese Regel
   gar nicht mehr. Inter selbst bleibt unangetastet.

   ⚠ DIE VIER WERTE SIND ÜBERNOMMEN, NICHT HIER GEMESSEN: Es sind die
   veröffentlichten Inter-gegen-Arial/Helvetica-Überschreibungen. R15 sagt
   „gegen die Ersatzschrift gemessen", und eine echte Messung braucht einen
   Browser — sie steht als offener Punkt im Bau-Bericht. Falsch liegen kann
   dabei nur die GRÖSSE des verbleibenden Sprungs, nicht seine Richtung: Ohne
   diese Regel ist der Unterschied größer, mit ihr kleiner. */
@font-face {
  font-family: 'Inter Ersatz';
  src: local('Helvetica Neue'), local('Helvetica'), local('Arial'), local('Liberation Sans');
  size-adjust: 107.12%;
  ascent-override: 90.24%;
  descent-override: 22.48%;
  line-gap-override: 0%;
}

/* ==========================================================================
   TOKEN-SCHICHT (UX-1, plan_ux_final.md §2.2–2.5)
   ==========================================================================
   Drei Ebenen, eine Stelle. Farbliterale stehen AUSSCHLIESSLICH in Ebene 1
   dieses Blocks — der Riegel dafür ist eine grep-Zeile (§2.2). Jeder Wert
   stammt aus dem Bestand (design/F1_ABNAHME.md §2, TE-12); die neutrale
   Palette ist der Vorgabe-Zustand und wird über `data-thema="neutral"` am
   Wurzelelement gewählt. Ein zweites Thema liefert seine eigene Ebene 1 und
   bindet Ebene 2 neu — Beweis: theme-toctv.css (mitgeliefert, nicht
   eingebunden). Termin-Grün #16a34a nach Timms TE-12-Entscheid vom
   31.08.2026 (Kontrast 3,30:1 gegen weiße Schrift statt 2,09:1 beim
   Marken-Grün #2ecb8a). Schrift Inter (§7-1). Aktionsknöpfe und
   Auswahl-Chips ≥ 64 px (§7-2, inklusive Nachtrag für M15/M12). */

:root,
[data-thema="neutral"] {
  /* ---- Ebene 1 · PALETTE — nur hier stehen Farbliterale ------------------ */
  --ton-weiss:      #ffffff;
  --ton-grau-25:    #f7f8fa;
  --ton-grau-50:    #f3f4f6;
  --ton-grau-75:    #f2f3f6;
  --ton-grau-100:   #eceef2;
  --ton-grau-150:   #e9ebef;
  --ton-grau-200:   #d9dbe0;
  --ton-grau-300:   #c3c7ce;
  --ton-grau-400:   #9ca3af;
  --ton-grau-500:   #6b7280;
  --ton-grau-700:   #374151;
  --ton-grau-900:   #111827;
  --ton-schwarz:    #000000;
  --ton-gruen-100:  #dbf2e3;
  --ton-gruen-600:  #16a34a;
  --ton-gruen-700:  #15803d;
  --ton-gruen-900:  #0d662e;
  --ton-gelb-100:   #fef3c7;
  --ton-gelb-500:   #f59e0b;
  --ton-gelb-800:   #92610a;
  --ton-gelb-900:   #7c4a03;
  --ton-rot-100:    #fbe3e3;
  --ton-rot-600:    #dc2626;
  --ton-rot-900:    #8c1c1c;
  --ton-blau-100:   #eef2ff;
  --ton-blau-900:   #1e3a8a;
  --ton-schatten-rgb: 18 23 38;
  --ton-weiss-leise: rgba(255, 255, 255, 0.8);
  --ton-sales-tanne: #132e28;
  --ton-sales-aktion: #245b45;
  --ton-sales-akzent: #cbf06c;
  --ton-sales-grund: #f5f7f2;
  --ton-sales-linie: #dce4d9;

  /* ---- Ebene 2 · BEDEUTUNG — was ein Wert bedeutet; ein Thema setzt das neu */
  /* Flächen */
  --flaeche-grund:  var(--ton-grau-50);
  --flaeche-karte:  var(--ton-weiss);
  --flaeche-leise:  var(--ton-grau-25);
  --flaeche-feld:   var(--ton-weiss);
  --flaeche-kopf:   var(--ton-weiss);
  /* Text */
  --text-stark:     var(--ton-grau-900);
  --text-mittel:    var(--ton-grau-700);
  --text-leise:     var(--ton-grau-500);
  --text-warnung:   var(--ton-gelb-800);
  --text-auf-dunkel:       var(--ton-weiss);
  --text-auf-dunkel-leise: var(--ton-weiss-leise);
  /* Linien */
  --linie:          var(--ton-grau-200);
  --linie-stark:    var(--ton-grau-400);
  --linie-fokus:    var(--ton-grau-900);
  --linie-fokus-innen: var(--ton-weiss);
  /* NA2/3 — DER UMRISS DES SPRUNGS, und er muss sich vom Fokusring
     UNTERSCHEIDEN. NA1 hatte dafür `--aktion-flaeche` genommen; beide Tokens
     lösen aber auf `--ton-grau-900` (#111827) auf — die Unterscheidung war
     nominell, im Browser lag derselbe schwarze 2-px-Strich da. Dieser Token
     trägt das Bernstein von `.knopf.folge` (`--ton-gelb-500`, #f59e0b): der
     Ton, den dieses Haus für „hier geht es weiter" führt, und mit Abstand
     verschieden von #111827. */
  --hervor-linie:   var(--ton-gelb-500);
  /* Aktionen — drei Lautstärken plus Gefahr (Kontur, keine Fläche, K-7) */
  --aktion-flaeche: var(--ton-grau-900);
  --aktion-schrift: var(--ton-weiss);
  --aktion-tipp:    var(--ton-grau-700);
  --aktion-druck:   var(--ton-schwarz);
  --aktion-hell-flaeche: var(--ton-weiss);
  --aktion-hell-schrift: var(--ton-grau-700);
  --aktion-hell-rand:    var(--ton-grau-400);
  --aktion-leise-schrift: var(--ton-grau-500);
  --aktion-leise-rand:    var(--ton-grau-200);
  --aktion-gefahr-schrift: var(--ton-rot-900);
  --aktion-gefahr-rand:    var(--ton-rot-600);
  --aktion-gefahr-tipp:    var(--ton-rot-100);
  /* Status — Aktionsfarbe (kräftige Fläche) ≠ Statuschip (getönte Fläche), K-3 */
  --status-offen-flaeche:   var(--ton-weiss);
  --status-offen-schrift:   var(--ton-grau-700);
  --status-offen-rand:      var(--ton-grau-400);
  --status-offen-punkt:     var(--ton-grau-300);
  --status-kontaktiert-flaeche: var(--ton-gelb-500);
  --status-kontaktiert-schrift: var(--ton-grau-900);
  --status-termin-flaeche:  var(--ton-gruen-600);
  --status-termin-schrift:  var(--ton-weiss);
  --status-termin-chip:     var(--ton-gruen-100);
  --status-termin-chip-schrift: var(--ton-gruen-900);
  --status-absage-flaeche:  var(--ton-rot-600);
  --status-absage-schrift:  var(--ton-weiss);
  --status-absage-chip:     var(--ton-rot-100);
  --status-absage-chip-schrift: var(--ton-rot-900);
  /* Rückmeldung — getönte Fläche + dunkle Schrift, nie Aktionsfarbe */
  --meldung-fehler-flaeche:  var(--ton-rot-100);
  --meldung-fehler-schrift:  var(--ton-rot-900);
  --meldung-warnung-flaeche: var(--ton-gelb-100);
  --meldung-warnung-schrift: var(--ton-gelb-900);
  --meldung-erfolg-flaeche:  var(--ton-gruen-100);
  --meldung-erfolg-schrift:  var(--ton-gruen-900);
  --meldung-info-flaeche:    var(--ton-blau-100);
  --meldung-info-schrift:    var(--ton-blau-900);
  --meldung-neutral-flaeche: var(--ton-grau-100);
  --meldung-neutral-schrift: var(--ton-grau-700);
  /* Erhebung und Ladezustand */
  --schatten-karte:     0 2px 12px rgb(var(--ton-schatten-rgb) / 0.08);
  --schatten-schwebend: 0 8px 28px rgb(var(--ton-schatten-rgb) / 0.18);
  --schatten-kante:     rgb(var(--ton-schatten-rgb) / 0.18);
  --skelett-grund:  var(--ton-grau-150);
  --skelett-glanz:  var(--ton-grau-75);

  /* ---- Ebene 3 · MASS — Abstand, Größe, Radius, Trefferfläche, Takt, Breite */
  --a-1: 4px;  --a-2: 8px;  --a-3: 12px; --a-4: 16px; --a-5: 20px;
  --a-6: 24px; --a-8: 32px; --a-10: 40px; --a-12: 48px;
  --gr-xs: 12px; --gr-s: 13px; --gr-m: 14px; --gr-basis: 16px;
  --gr-l: 19px;  --gr-xl: 24px; --gr-xxl: 30px;
  --zeile-eng: 1.25; --zeile: 1.45; --zeile-weit: 1.6;
  --stark: 600; --sehr-stark: 700;
  --r-klein: 8px; --r-chip: 12px; --r-knopf: 16px; --r-karte: 24px; --r-pille: 999px;
  --griff-gross: 64px; --griff-mittel: 48px; --griff-klein: 40px;
  --takt-schnell: 120ms; --takt: 180ms; --kurve: cubic-bezier(.2, .6, .2, 1);
  --e-kopf: 10; --e-band: 15; --e-toast: 20;
  --kopf-hoehe: 56px;                       /* App-Kopf: 56 mobil, 64 ab 900 px (§2.6) */
  --spalte-arbeit: 480px; --spalte-arbeit-weit: 640px;
  --spalte-verwaltung: 1280px; --spalte-lesen: 72ch;

  /* ---- Rückwärts-Brücke — die heutigen Namen bleiben als Aliase bestehen -- */
  --grund:     var(--flaeche-grund);
  --karte:     var(--flaeche-karte);
  --schatten:  var(--schatten-karte);
  --text:      var(--text-stark);
  --sekundaer: var(--text-leise);
  --rand:      var(--linie);
  --dunkel:    var(--aktion-flaeche);
  --offen-flaeche: var(--status-offen-flaeche);
  --offen-rand:    var(--status-offen-rand);
  --offen-schrift: var(--status-offen-schrift);
  --offen-punkt:   var(--status-offen-punkt);
  --kontaktiert:         var(--status-kontaktiert-flaeche);
  --kontaktiert-schrift: var(--status-kontaktiert-schrift);
  --termin:              var(--status-termin-flaeche);
  --termin-chip:         var(--status-termin-chip);
  --termin-chip-schrift: var(--status-termin-chip-schrift);
  --absage:              var(--status-absage-flaeche);
  --absage-chip:         var(--status-absage-chip);
  --absage-chip-schrift: var(--status-absage-chip-schrift);
  --pille: var(--r-pille);
}
/* ===================== Ende des Token-Blocks ============================= */

/* ==========================================================================
   GRUNDGERÜST (UX-2, plan_ux_final.md §4) — mobil zuerst, Haltepunkte in
   min-width. Der Seitenrand ist ein Wert je Haltepunkt, das Band und der Fuß
   rechnen damit statt mit festen Pixeln.
   ========================================================================== */
html { overflow-x: hidden; }

body {
  margin: 0;
  min-height: 100vh;
  min-height: 100dvh;
  display: flex; flex-direction: column;
  /* UX-8 (K-1): „Inter Ersatz" steht GENAU EINE Stufe hinter Inter — sie ist
     die auf Inters Maße umgerechnete lokale Grotesk (siehe @font-face oben).
     Alle bisherigen Glieder bleiben in derselben Reihenfolge dahinter stehen:
     Findet ein Gerät keine der dort genannten Schriften, greift wie bisher
     -apple-system, dann Segoe UI, dann system-ui, dann sans-serif. */
  font-family: Inter, 'Inter Ersatz', -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;
  background: var(--grund);
  color: var(--text);
  font-size: var(--gr-basis);
  line-height: var(--zeile);
  --rand-seite: var(--a-3);
}

* { box-sizing: border-box; -webkit-tap-highlight-color: transparent; }

#buehne {
  /* Die beiden Seitenränder als Werte, damit Kopfleiste und Reiterband bis an
     die Kante reichen können (negativer Rand = derselbe Wert, nicht geraten). */
  --buehne-links:  calc(var(--rand-seite) + env(safe-area-inset-left));
  --buehne-rechts: calc(var(--rand-seite) + env(safe-area-inset-right));
  flex: 1 0 auto; width: 100%;
  max-width: calc(var(--spalte-arbeit) + 2 * var(--rand-seite));
  margin: 0 auto;
  /* Unten steht die Wanze („Fehler melden"): 12 px Rand plus 44 px Grifffläche
     = 56 px, die dauerhaft belegt sind. Reserviert werden 64 px — die 56 plus
     eine Fuge von 8 px. Ohne diesen Freiraum liegt der letzte Knopf der Bühne
     bei vollem Bildlauf unter ihr, und die Wanze liegt eine Ebene darüber:
     Der Tipp träfe dann sie und nicht den Knopf. */
  padding: var(--a-4) var(--buehne-rechts)
           calc(var(--griff-gross) + env(safe-area-inset-bottom))
           var(--buehne-links);
}
#buehne:focus { outline: none; }   /* Ziel des Sprunglinks, kein Ring um die ganze Bühne */
body.breit #buehne { max-width: calc(var(--spalte-verwaltung) + 2 * var(--rand-seite)); }
body.breit { --r-karte: 16px; }   /* Verwaltungsspalte: dichte Listen (K-4) */

/* ==========================================================================
   RAHMEN (UX-3, plan_ux_final.md §2.6, §2.8, §4.2) — Sprunglink, klebende
   Kopfleiste, unsichtbar-lesbare Beschriftungen.
   ========================================================================== */
/* Sprunglink (K-14): außerhalb des Bildes, bis ihn die Tastatur fokussiert. */
.skip { position: absolute; left: var(--a-3); top: -200px; z-index: calc(var(--e-toast) + 1);
        padding: var(--a-2) var(--a-4); border-radius: var(--r-chip);
        background: var(--aktion-flaeche); color: var(--aktion-schrift);
        font-weight: var(--stark); text-decoration: none; }
.skip:focus-visible { top: calc(var(--a-2) + env(safe-area-inset-top)); }

/* Nur für Vorleser: `<caption>` der Tabellen (§2.8). Bleibt im Baum, nimmt
   keinen Platz — `display: none` würde es aus dem Zugänglichkeitsbaum werfen. */
.nur-lesen { position: absolute !important; width: 1px; height: 1px; margin: -1px; padding: 0;
             border: 0; overflow: hidden; clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap; }

/* App-Kopf: klebt oben, reicht bis an die Kante, safe-area-sicher. Eine
   Zeile Produkt + Rolle, darunter Hauptzeile links und Nebenzeile rechts;
   beide dürfen kürzen, nie umbrechen — sonst stimmt der Versatz des
   Reiterbands darunter nicht mehr. `.kopf` ohne `.app` bleibt der schlichte
   Zwischenkopf im Inhalt (Prüfsicht, Klärliste). */
.kopf.app {
  position: sticky; top: 0; z-index: var(--e-kopf);
  display: grid; grid-template-columns: minmax(0, 1fr) fit-content(55%);
  grid-template-areas: 'marke marke' 'haupt neben';
  column-gap: var(--a-3); row-gap: 0; align-items: baseline;
  min-height: var(--kopf-hoehe); line-height: var(--zeile-eng);   /* eng: das Reiterband rechnet mit --kopf-hoehe */
  margin: calc(-1 * var(--a-4)) calc(-1 * var(--buehne-rechts)) var(--a-4) calc(-1 * var(--buehne-links));
  padding: calc(var(--a-2) + env(safe-area-inset-top)) var(--buehne-rechts) var(--a-2) var(--buehne-links);
  background: var(--flaeche-kopf); border-bottom: 1px solid var(--linie);
  box-shadow: var(--schatten-karte);
}
.kopf.app .kopf__marke { grid-area: marke; font-size: var(--gr-xs); line-height: 1.35;
  font-weight: var(--stark); letter-spacing: .02em; text-transform: uppercase;
  color: var(--text-leise); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
/* UX-8 (M-2): Die Hauptzeile ist seit UX-8 ein `<h1>` statt eines `<b>` — der
   Screen-Titel war unsemantisches Markup, während eine nachgeordnete Karte zum
   h1 hochgestuft war (QA-Audit UX-8, M-2). Der `<b>`-Wähler ist seit NA1/B3
   wieder in Gebrauch: Auf der Anruf-Karte trägt die FIRMA das Screen-h1, und
   die Kopfzeile („Noch N offen", ein Zähler) steht dort als `<b>`. Beide
   teilen sich dieselbe Zelle und dieselbe Kürzung — die Leiste sieht in
   beiden Fällen gleich aus.
   Die zweite Regel nimmt dem h1 seine EIGENEN Werte wieder ab (Größe kommt aus
   der Zeile darüber, Gewicht aus `.kopf b`, das für das h1 nicht greift): So
   sieht die Kopfleiste aus wie vorher — sie darf nicht springen, denn
   `--kopf-hoehe` ist der Wert, mit dem das Reiterband darunter rechnet. */
.kopf.app > b, .kopf.app > h1 { grid-area: haupt; font-size: var(--gr-basis); white-space: nowrap;
  overflow: hidden; text-overflow: ellipsis; }
.kopf.app > h1 { font-weight: var(--stark); letter-spacing: normal;
  line-height: inherit; margin: 0; hyphens: manual; }
.kopf.app > span:not(.kopf__marke) { grid-area: neben; justify-self: end; text-align: right;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
/* Zeigt das Band (offline / Fehler), ist ES die klebende Leiste — Kopf und
   Reiter laufen dann normal mit, statt sich unter das Band zu schieben. */
body:has(#band:not(.verborgen)) .kopf.app,
body:has(#band:not(.verborgen)) .reiter { position: static; }

/* Regel 2 (§4.2): Jedes Grid- und Flex-Kind darf schrumpfen. Ohne diese Zeile
   hält ein Flex-Kind sein längstes Wort fest und ragt aus seinem Elternteil —
   das war Timms Hauptbefund („Betroffenenrechte“, 13 px über den Chip). */
#buehne > *, .karte > *, .kopf > *, .chips > *, .zahlen > *, .zahl > *,
.gate > *, .knopf > *, .chip > *, .haken > *, .fuss > *, .suchzeile > * { min-width: 0; }

/* Regel 3 und 4: Freitext, Namen, Nachweise und Links brechen überall um;
   `hyphens` nutzt das `lang="de"` aus index.html erstmals. */
h1, h2, h3, p, li, dt, dd, small, label, summary, code,
.knopf, .chip, .marke, .aufhaenger, .hinweis, .sperrhinweis,
.klein, .sekundaer, .kopf b, .kopf span, .leer, .zahl span {
  overflow-wrap: anywhere;
}
/* In echten Tabellen (ab 900 px und in Scroll-Rahmen) bricht nur an Wortgrenzen —
   `anywhere` ließe die automatische Spaltenbreite bis auf ein Zeichen schrumpfen
   („Widerspruc/h“). Unter 900 px sind die Kartenzellen Blöcke, dort gilt `anywhere`. */
td, th { overflow-wrap: break-word; }
th { hyphens: manual; }
h1, h2, p, .knopf, .chip, .aufhaenger { hyphens: auto; }
td.zahlwert, th.zahlwert, .zahl b, time { white-space: nowrap; }

.kopf { display: flex; flex-wrap: wrap; justify-content: space-between; align-items: baseline;
        gap: var(--a-1) var(--a-3); margin: var(--a-1) 2px var(--a-4); }
.kopf b { font-weight: var(--stark); }
.kopf span { color: var(--sekundaer); font-size: var(--gr-m); }

.karte { background: var(--karte); border: 1px solid var(--linie); border-radius: var(--r-karte);
         padding: var(--a-4); margin-bottom: var(--a-4); }
.karte.leise { background: var(--flaeche-leise); box-shadow: none; }

h1 { font-size: var(--gr-xl); font-weight: var(--sehr-stark); margin: 0 0 6px;
     letter-spacing: -0.01em; line-height: var(--zeile-eng); }
h2 { font-size: var(--gr-l); font-weight: var(--stark); margin: 0 0 4px; line-height: 1.3; }
/* UX-7 (Bauteil 3): Ein Karten-/Abschnittstitel, der aus Gründen der
   Überschriften-Hierarchie (ein h1 je Screen) als h2 ausgezeichnet ist, aber
   die bisherige h1-in-Karte-Optik behält — sonst spränge die Oberfläche. Werte
   exakt aus der h1-Regel darüber; nur `margin-bottom` (nicht die Kurzform
   `margin`), damit ein etwaiges `.oben-N` (`margin-top`) unberührt bleibt. Der
   Mobil-Override (28px) steht im 900px-Media-Block wie bei h1. */
h2.karten-titel { font-size: var(--gr-xl); font-weight: var(--sehr-stark);
                  letter-spacing: -0.01em; line-height: var(--zeile-eng); margin-bottom: 6px; }
p  { margin: 0 0 10px; }
.sekundaer { color: var(--sekundaer); font-size: var(--gr-m); }
.klein { font-size: var(--gr-s); color: var(--sekundaer); }
a.farbe-erben { color: inherit; }

/* Abstands-Klassen (4er-Raster) — sie lösen die `margin-top`-Inline-Stile ab. */
.oben-1 { margin-top: var(--a-1); } .oben-2 { margin-top: var(--a-2); }
.oben-3 { margin-top: var(--a-3); } .oben-4 { margin-top: var(--a-4); }
.oben-5 { margin-top: var(--a-5); } .oben-6 { margin-top: var(--a-6); }
.unten-0 { margin-bottom: 0; }
.zeile { display: block; }   /* ein Zusatzsatz unter einem Reihen-Knopf */

/* --- Knöpfe: Setter-Strecke hält >= 64 px (Plan 5.5, F1 §7-2) ------------ */
.knopf {
  display: flex; flex-direction: column; justify-content: center;
  width: 100%; min-height: var(--griff-gross); padding: 10px 18px; margin-bottom: 10px;
  border: none; border-radius: var(--r-knopf); background: var(--dunkel); color: var(--aktion-schrift);
  font: inherit; font-weight: var(--stark); text-align: left; cursor: pointer;
  text-decoration: none;
  transition: transform var(--takt-schnell) var(--kurve), background-color var(--takt-schnell);
}
a.knopf { text-decoration: none; }
.knopf small { display: block; font-weight: 400; font-size: var(--gr-s); opacity: .82; margin-top: 2px; }
.knopf:disabled { opacity: .45; cursor: not-allowed; }
.knopf.hell { background: var(--aktion-hell-flaeche); color: var(--offen-schrift); border: 1.5px solid var(--offen-rand); }
.knopf.termin { background: var(--termin); color: var(--status-termin-schrift); }
.knopf.kontaktiert { background: var(--kontaktiert); color: var(--kontaktiert-schrift); }
.knopf.absage { background: var(--absage); color: var(--status-absage-schrift); }
/* T-23 — DER ORANGE KNOPF („Folgetermin vereinbaren"), neben dem grünen
   „Abschluss erfassen" (.knopf.termin). Timm hat die beiden Farben benannt.

   ER FÜHRT KEINEN ZEHNTEN TON EIN: Die Fläche ist die Amber-Fläche, die dieses
   Haus schon hat (--kontaktiert, #f59e0b auf --ton-grau-900 — 8,6:1, weit über
   AA). Eine eigene Klasse statt `.knopf.kontaktiert` bekommt er trotzdem, weil
   der Name eines Knopfes sagen soll, was er tut: „kontaktiert" ist ein
   LEAD-STATUS der Setter-Strecke, und ein Closer, der einen Folgetermin
   vereinbart, setzt keinen Lead-Status. Ein Ton, zwei Namen, kein zweiter
   Farbwert. */
.knopf.folge { background: var(--kontaktiert); color: var(--kontaktiert-schrift); }
/* NA1/P1N-10: 52 px waren eine stille Ausnahme von PLAN 5.5 ("Buttons >= 64 px",
   ohne Ausnahme) — betraf "Später nochmal" und "Ist schon gespeichert". */
.knopf.leise { background: transparent; color: var(--sekundaer); border: 1px solid var(--rand);
               min-height: var(--griff-gross); font-weight: 500; }
/* Gefahr = rote Kontur, keine Fläche (K-7, Timm-Entscheid #12): Verwerfen,
   Widerspruch, Widerruf, Rücknahme. Neben dem gefüllten Primärknopf schreien
   sonst zwei Flächen gleich laut. */
.knopf.gefahr { background: transparent; color: var(--aktion-gefahr-schrift);
                border: 1.5px solid var(--aktion-gefahr-rand); }
.knopf.mitte { text-align: center; align-items: center; }
/* Größen: 48 px für Verwaltungsformulare, 40 px für die Zeilenaktion in einer
   Tabelle am Schreibtisch (§2.5) — statt neun Inline-Stilen. */
.knopf.mittel { min-height: var(--griff-mittel); padding: 8px 16px; }
.knopf.klein  { min-height: var(--griff-klein); padding: 6px 12px; margin-bottom: 0;
                font-size: var(--gr-m); }
/* Form: Breite nach Inhalt, für Tabellenzellen. Ein `<br>` dahinter stammt aus
   der Zeit der Blockknöpfe und würde jetzt eine Leerzeile erzeugen. */
.knopf.reihe  { display: inline-flex; width: auto; vertical-align: middle; margin: 2px 6px 2px 0; }
.knopf.reihe + br { display: none; }

/* --- Auswahl-Chips: nach TE-12-Nachtrag ebenfalls >= 64 px ---------------- */
/* Raster-Mindestbreite 140 px, gedeckelt auf die Spaltenbreite (§1.2) — bei
   318 px Inhaltsbreite zwei Spalten statt drei, und jeder Chip darf umbrechen. */
.chips { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(140px, 100%), 1fr));
         gap: var(--a-2); margin-bottom: var(--a-3); }
.chips.eng { grid-template-columns: repeat(auto-fit, minmax(min(96px, 100%), 1fr)); }
.chip {
  min-height: var(--griff-gross); display: flex; flex-direction: column; align-items: center;
  justify-content: center; gap: 2px; padding: var(--a-2) 6px;
  border: 1.5px solid var(--rand); border-radius: var(--r-chip); background: var(--flaeche-feld);
  font: inherit; font-weight: var(--stark); cursor: pointer; color: var(--text);
  text-align: center;
  transition: transform var(--takt-schnell) var(--kurve), border-color var(--takt-schnell);
}
.chip > * { max-width: 100%; }
.chip small { font-weight: 400; font-size: var(--gr-xs); color: var(--sekundaer); }
.chip[aria-pressed="true"] { border-color: var(--dunkel); background: var(--dunkel); color: var(--text-auf-dunkel); }
.chip[aria-pressed="true"] small { color: var(--text-auf-dunkel-leise); }
.chip:disabled { opacity: .35; cursor: not-allowed; }

/* --- Reiterband (UX-3, §2.6): Chef und Betrieb --------------------------
   `.chips.reiter` löst das Chip-Raster ab — die Klasse `chip` bleibt am Knopf
   (Namens-Riegel), `.reiter .chip` setzt darauf auf. Klebt unter dem Kopf,
   scrollt waagerecht mit Randhinweis, Unterstrich statt dunkler Fläche,
   Zählabzeichen als Pille. `role="tablist"` / `role="tab"` / `aria-selected`
   kommen aus app.js (reiterBand). */
.reiter {
  /* Unter 600 px bricht das Band um — vier Reiter passen bei 320 px nicht in
     eine Zeile, und ein halb sichtbares „Betroffenenrechte“ war Timms Befund.
     Ab 600 px eine Zeile, waagerecht scrollbar mit Randhinweis (§4.1). */
  display: flex; flex-wrap: wrap; gap: 0 var(--a-1); align-items: stretch;
  overflow-x: auto; overflow-y: hidden; scrollbar-width: none; -webkit-overflow-scrolling: touch;
  scroll-behavior: smooth; scroll-padding: 0 var(--a-4);
  /* Klebt erst ab 600 px (eine Zeile). Zwei umgebrochene Reihen plus Kopf
     wären auf einem 320er-Handy ein Viertel des Bildes — dort läuft es mit. */
  position: static; top: calc(var(--kopf-hoehe) + env(safe-area-inset-top));
  z-index: calc(var(--e-kopf) - 1);
  margin: calc(-1 * var(--a-4)) calc(-1 * var(--buehne-rechts)) var(--a-4) calc(-1 * var(--buehne-links));
  padding: 0 var(--buehne-rechts) 0 var(--buehne-links);
  border-bottom: 1px solid var(--linie);
  /* Randhinweis beim Überlauf — dieselbe Technik wie beim Tabellen-Rahmen. */
  background:
    linear-gradient(90deg, var(--flaeche-kopf) 30%, transparent),
    linear-gradient(90deg, transparent, var(--flaeche-kopf) 70%) 100% 0,
    radial-gradient(farthest-side at 0 50%, var(--schatten-kante), transparent),
    radial-gradient(farthest-side at 100% 50%, var(--schatten-kante), transparent) 100% 0,
    var(--flaeche-kopf);
  background-repeat: no-repeat;
  background-size: 40px 100%, 40px 100%, 14px 100%, 14px 100%, auto;
  background-attachment: local, local, scroll, scroll, scroll;
}
.reiter::-webkit-scrollbar { display: none; }
.reiter .chip {
  flex: 0 0 auto; flex-direction: row; align-items: center; gap: var(--a-2);
  min-height: var(--griff-mittel); padding: var(--a-2) var(--a-3);
  border: 0; border-bottom: 2px solid transparent; border-radius: 0; margin-bottom: -1px;
  background: transparent; color: var(--text-mittel); white-space: nowrap;
  transition: color var(--takt-schnell), border-color var(--takt-schnell);
}
.reiter .chip > * { max-width: none; }
.reiter .chip small { display: inline-block; padding: 1px 8px; border-radius: var(--r-pille);
  background: var(--meldung-neutral-flaeche); color: var(--meldung-neutral-schrift);
  font-size: var(--gr-xs); font-weight: var(--stark); line-height: 1.4;
  font-variant-numeric: tabular-nums; }
.reiter .chip[aria-selected="true"] { color: var(--text-stark); border-bottom-color: var(--aktion-flaeche); }
.reiter .chip[aria-selected="true"] small { background: var(--aktion-flaeche); color: var(--aktion-schrift); }
.reiter .chip:focus-visible { outline-offset: -2px; }

/* --- Eingaben (P2-A) ------------------------------------------------------
   F1 zeichnet genau ZWEI Eingaben — das Notizfeld und die Datumswahl auf M15
   — und beide als Inline-Stil. Der Import-Assistent hat rund fünfzehn; ein
   Stil-Attribut je Feld wäre eine Zweitschrift, die beim ersten Umbau
   auseinanderläuft. Werte aus M15: Rand `--rand` 1,5 px, Radius `--r-chip`,
   `font: inherit`. Standardhöhe ist seit UX-2 die mittlere Trefferfläche
   (48 px, Verwaltungsformulare); `.eingabe.gross` hält die 64 px der
   Setter-Strecke (Plan 5.5 / F1 §7-2). */
.eingabe {
  width: 100%; max-width: 100%; min-width: 0; min-height: var(--griff-mittel);
  padding: 10px 12px; margin-bottom: 10px;
  border: 1.5px solid var(--rand); border-radius: var(--r-chip);
  font: inherit; color: var(--text); background: var(--flaeche-feld);
}
.eingabe.gross { min-height: var(--griff-gross); padding: 12px; }
.eingabe.schmal { min-height: var(--griff-mittel); margin-bottom: 0; }
textarea.eingabe { min-height: 96px; }
.eingabe:disabled { opacity: .55; }

/* UX-5: Der Platzhalter ist ein BEISPIEL, kein Etikett — er steht leiser als
   die Beschriftung, damit „(Pflicht)" nie mehr allein in ihm lebt (§2.6). */
.eingabe::placeholder { color: var(--text-leise); opacity: 1; }

/* UX-5: Auswahllisten tragen denselben Rahmen wie ein Textfeld und einen
   eigenen Pfeil (Inline-SVG, damit kein Aufruf nach draußen geht). `appearance`
   nimmt den Systempfeil weg; der SVG-Pfeil steht rechts, der Text bekommt
   davor Platz. Auf `.schmal` (Tabellenzelle) rückt er enger.

   NA1/A4 — BEWUSSTE AUSNAHME: Die Pfeilfarbe im SVG unten (%236b7280 =
   #6b7280) ist als Hexwert in der data-URI hartkodiert. Ein `var(--…)`-Token
   greift innerhalb einer als `background-image` eingebetteten data-URI nicht
   (die URI ist ein opaker String, kein CSS-Kontext). Der Wert entspricht dem
   Grauton der Linien-/Sekundärebene und ist bewusst inline gehalten. */
select.eingabe {
  appearance: none; -webkit-appearance: none; -moz-appearance: none;
  padding-right: calc(var(--a-4) + 14px);
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1l5 5 5-5' fill='none' stroke='%236b7280' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right var(--a-3) center;
}
select.eingabe.schmal { padding-right: calc(var(--a-3) + 12px);
  background-position: right var(--a-2) center; }
select.eingabe:disabled { opacity: .55; }

/* UX-5: Ein Feld, das der Server (oder die Maske) beanstandet, trägt einen
   roten Rahmen. Die Verkabelung von `aria-invalid` und der Fehlerzeile ist
   UX-7 — hier steht nur die Fähigkeit, damit die Form schon feststeht. */
.eingabe[aria-invalid="true"] { border-color: var(--aktion-gefahr-rand); }

/* Haken: EIN Kontrollkästchen-Stil in Fließtextgröße (§2.6). */
.haken { display: flex; gap: var(--a-3); align-items: flex-start; margin: var(--a-3) 0;
         font-size: var(--gr-basis); line-height: var(--zeile); cursor: pointer; }
.haken input { flex: none; width: 24px; height: 24px; min-height: 24px; margin: 0; accent-color: var(--aktion-flaeche); }

/* --- Statuspunkte, Pillen und Marken -------------------------------------- */
/* Regel 7 (§4.2): Kein langer Status verbreitert eine Tabellenspalte — die
   Pille darf umbrechen; lange Zustandstexte tragen die `.marke`. */
.pille { display: inline-block; max-width: 100%; padding: 5px 12px; border-radius: var(--pille);
         font-size: var(--gr-s); font-weight: var(--stark); line-height: 1.3; white-space: nowrap; }
@media (max-width: 899px) { .pille { white-space: normal; overflow-wrap: anywhere; } }
/* EINE PILLE, DIE FREI GETIPPTEN TEXT TRÄGT, MUSS AUCH AUF DESKTOP UMBRECHEN.
   Die Regel darüber hält jede Pille einzeilig — richtig, solange in ihr ein
   Zustandswort steht („Folgetermin", „Kein Abschluss"). Die Storno-Pille trägt
   dagegen einen bis zu 200 Zeichen langen Grund aus der Tastatur des Closers.
   Bis 899 px schaltete die Media-Regel das Umbrechen ein, ab 900 px nicht mehr:
   Ein langer Grund brauchte 770 px in einer Karte mit 558 px Innenmaß, lief in
   die Nachbarspalte und wurde am Seitenrand abgeschnitten — ausgerechnet die
   Auskunft, WARUM ein Umsatz nicht mehr zählt (Codex-Befund R1, 12.09.2026).
   Additiv als eigener Name, damit die übrigen Pillen einzeilig bleiben:
   `max-width` und `line-height` stehen hier noch einmal, weil eine mehrzeilige
   Pille anders atmet als eine einzeilige (1.3 klebt über zwei Zeilen). */
.pille.mehrzeilig { white-space: normal; overflow-wrap: anywhere; max-width: 100%;
         padding: 6px 12px; line-height: var(--zeile); }
.pille.gruen { background: var(--termin-chip); color: var(--termin-chip-schrift); }
.pille.rot   { background: var(--absage-chip); color: var(--absage-chip-schrift); }
.pille.grau  { background: var(--meldung-neutral-flaeche); color: var(--offen-schrift); }
.pille.gelb  { background: var(--meldung-warnung-flaeche); color: var(--meldung-warnung-schrift); }
.marke { display: inline-flex; gap: 6px; align-items: flex-start; max-width: 100%;
         font-size: var(--gr-s); font-weight: var(--stark); line-height: 1.3; color: var(--text-mittel); }
.marke::before { content: ''; flex: none; width: 8px; height: 8px; margin-top: .4em;
                 border-radius: 50%; background: currentColor; }
.marke.gruen { color: var(--meldung-erfolg-schrift); }
.marke.rot   { color: var(--meldung-fehler-schrift); }
.marke.gelb  { color: var(--text-warnung); }
.marke.grau  { color: var(--text-leise); }

/* --- Hinweis: EINE Bauform für Rückmeldungen im Fluss (§2.6) -------------- */
.hinweis { padding: var(--a-3) var(--a-4); border-radius: var(--r-chip); margin: 0 0 var(--a-3);
           font-size: var(--gr-m); line-height: var(--zeile); }
.hinweis--info    { background: var(--meldung-info-flaeche);    color: var(--meldung-info-schrift); }
.hinweis--warnung { background: var(--meldung-warnung-flaeche); color: var(--meldung-warnung-schrift); }
.hinweis--fehler  { background: var(--meldung-fehler-flaeche);  color: var(--meldung-fehler-schrift); }
.hinweis--erfolg  { background: var(--meldung-erfolg-flaeche);  color: var(--meldung-erfolg-schrift); }

/* --- Leerzustand: eine Form statt sechs (§5) ------------------------------ */
.leer { padding: var(--a-4); border: 1px dashed var(--linie-stark); border-radius: var(--r-chip);
        color: var(--text-leise); font-size: var(--gr-m); margin: 0 0 var(--a-3); }
/* UX-8 (M-1): „Diese Woche ist voll" ist ein endgültiger Zustand OHNE
   Kopfleiste und stand deshalb ohne Überschrift da. Der Zustands-Satz selbst
   ist jetzt das h1; diese Regel gibt ihm exakt die Inline-Optik des `<b>`
   zurück, das dort stand — dasselbe Muster wie `.aufklapp summary h2`. */
h1.leer__titel { display: inline; font-size: inherit; font-weight: bold;
                 letter-spacing: normal; line-height: inherit; margin: 0; hyphens: inherit; }

/* --- Aufklapp: Träger für die muss-bleiben-Rechtstexte (§6) --------------- */
.aufklapp { border-top: 1px solid var(--linie); margin-top: var(--a-3); padding-top: var(--a-1); }
.aufklapp summary { cursor: pointer; padding: var(--a-2) 0; font-size: var(--gr-m);
                    font-weight: var(--stark); color: var(--text-mittel); }
.aufklapp summary h2 { display: inline; font-size: var(--gr-m); font-weight: var(--stark); margin: 0; }
.aufklapp[open] summary { margin-bottom: var(--a-1); }
.aufklapp .klein, .aufklapp p { line-height: var(--zeile-weit); }

/* --- Gate-Nachweis (T3/T10) ---------------------------------------------- */
.gate { display: flex; gap: var(--a-2) 10px; flex-wrap: wrap; font-size: var(--gr-s); font-weight: var(--stark);
        margin: 14px 0 var(--a-2); }
.gate .ok  { color: var(--termin-chip-schrift); }
.gate .offen { color: var(--text-warnung); }

/* T-26: Hier stand die Regel für den R-1-Sprechzettel der Setter-Karte
   (12 px grau) und ein zweites Mal weiter unten dieselbe Klasse in
   Fließtextgröße. Beide sind mit dem Sprechzettel entfallen — es gibt kein
   Element mehr, das diese Klasse trägt. test/39 hält das fest. */
.aufhaenger { background: var(--flaeche-leise); border-left: 3px solid var(--termin);
              border-radius: 0 10px 10px 0; padding: 10px 12px; margin: var(--a-3) 0;
              font-size: 15px; }

/* --- Zahlen (T11, Chef) --------------------------------------------------- */
/* Drei Kacheln, solange drei Platz haben; darunter 2 + 1 statt gequetschter
   Wörter (§2.6). Die Kennzahl schrumpft mit der Breite, „33,3 %“ bleibt drin. */
.zahlen { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(96px, 100%), 1fr)); gap: var(--a-2); }
.zahl { background: var(--flaeche-karte); border-radius: var(--r-chip); border: 1px solid var(--rand);
        padding: var(--a-3) var(--a-1); text-align: center; }
.zahl b { display: block; font-size: clamp(20px, 6.4vw, var(--gr-xxl)); font-weight: var(--sehr-stark);
          line-height: 1.1; font-variant-numeric: tabular-nums; }
.zahl span { display: block; font-size: var(--gr-xs); color: var(--sekundaer); margin-top: 2px; }

/* --- Closer: Terminkarten (UX-3, §4.1) — eine Spalte, ab 900 px zwei -------- */
.termine { display: grid; grid-template-columns: minmax(0, 1fr); column-gap: var(--a-4); }
.termine > * { min-width: 0; }

.sperrhinweis { margin-top: var(--a-3); font-size: var(--gr-s); color: var(--sekundaer);
                border-top: 1px solid var(--rand); padding-top: 10px; line-height: var(--zeile-weit); }

/* --- Tabellen (§4.3) ------------------------------------------------------
   Stufe 1: `.tabelle-rahmen` als Scroll-Umschlag mit Schattenkante — das
   Scrollen bleibt in der Karte statt die Seite zu verschieben.
   Stufe 2: `.tabelle--karten` wird unter 900 px zur Kartenliste; jedes `td`
   trägt sein Etikett in `data-spalte`. Ein DOM je Datensatz, kein zweiter
   Zeichenweg. Stufe 3: `.tabelle--vergleich` scrollt bewusst waagerecht mit
   klebender erster Spalte (Import-Beispieldaten, K-11). */
table { width: 100%; border-collapse: collapse; font-size: var(--gr-m); }
th, td { text-align: left; padding: 10px 8px; border-bottom: 1px solid var(--rand); vertical-align: top; }
th { color: var(--sekundaer); font-weight: var(--stark); font-size: var(--gr-xs);
     text-transform: uppercase; letter-spacing: .03em; }
td.zahlwert, th.zahlwert { text-align: right; font-variant-numeric: tabular-nums; }
td .eingabe.schmal { margin-bottom: 0; }

.tabelle-rahmen {
  overflow-x: auto; max-width: 100%; -webkit-overflow-scrolling: touch; margin-bottom: var(--a-2);
  background:
    linear-gradient(90deg, var(--flaeche-karte) 30%, transparent),
    linear-gradient(90deg, transparent, var(--flaeche-karte) 70%) 100% 0,
    radial-gradient(farthest-side at 0 50%, var(--schatten-kante), transparent),
    radial-gradient(farthest-side at 100% 50%, var(--schatten-kante), transparent) 100% 0;
  background-repeat: no-repeat;
  background-size: 40px 100%, 40px 100%, 14px 100%, 14px 100%;
  background-attachment: local, local, scroll, scroll;
}
.tabelle--vergleich td, .tabelle--vergleich th { white-space: nowrap; }
.tabelle--vergleich td:first-child, .tabelle--vergleich th:first-child {
  position: sticky; left: 0; background: var(--flaeche-karte); z-index: 1; }
.tabelle--paare td { overflow-wrap: anywhere; }   /* Schlüssel/Wert: der Wert darf umbrechen */
.tabelle--paare td:first-child { width: 38%; overflow-wrap: break-word; }

/* Definitionslisten (§4.3 #11 Rohzeile, #15 Fristen) — die ehrlichere Form für
   zwei Spalten Schlüssel/Wert (U-B9). Gestapelt auf dem Handy (kein 38-%-Quetsch
   mehr), zweispaltig ab 600 px. Das `dt`-Etikett trägt den Feld-Zellen-Stil
   (uppercase, --gr-xs, --text-leise), damit man auch zweispaltig erkennt, was
   Schlüssel und was Wert ist.
   NA1/A1: EIGENER Klassenname `paarliste` (nicht `paare`) — die Alt-Regel
   `dl.paare` (Termin-steht-Schirm, UX-4, weiter unten) hat mit ihrem Tag höhere
   Spezifität (0-1-1) und zwang der `.paar`-DIV-Struktur ein `max-content`-Grid
   auf, das das Layout auf jeder Breite zerlegte. `.paar` bleibt als inneres
   Element, aber eindeutig unter `.paarliste` gescoped. */
.paarliste-kopf { font-size: var(--gr-xs); font-weight: var(--stark); text-transform: uppercase;
              letter-spacing: .03em; color: var(--text-leise); margin: 0 0 var(--a-2); }
.paarliste { margin: 0 0 var(--a-2); }
.paarliste .paar { padding: var(--a-1) 0; border-bottom: 1px solid var(--rand); }
.paarliste .paar:last-child { border-bottom: none; }
.paarliste .paar dt { font-size: var(--gr-xs); font-weight: var(--stark); text-transform: uppercase;
           letter-spacing: .03em; color: var(--text-leise); margin-bottom: 2px; overflow-wrap: break-word; }
.paarliste .paar dd { margin: 0; overflow-wrap: anywhere; }
@media (min-width: 600px) {
  .paarliste .paar { display: grid; grid-template-columns: 38% 1fr; column-gap: var(--a-3); align-items: baseline; }
  .paarliste .paar dt { margin-bottom: 0; }
}

@media (max-width: 899px) {
  .tabelle--karten, .tabelle--karten tbody, .tabelle--karten tr, .tabelle--karten td { display: block; }
  .tabelle--karten thead { display: none; }
  .tabelle--karten tr { border: 1px solid var(--linie); border-radius: var(--r-chip);
                        padding: var(--a-3); margin-bottom: var(--a-3); background: var(--flaeche-karte); }
  .tabelle--karten td { border: none; padding: var(--a-1) 0; text-align: left; overflow-wrap: anywhere; }
  .tabelle--karten td:empty { display: none; }
  .tabelle--karten td[data-spalte]::before {
    content: attr(data-spalte); display: block; font-size: var(--gr-xs); font-weight: var(--stark);
    text-transform: uppercase; letter-spacing: .03em; color: var(--text-leise); margin-bottom: 2px; }
  /* NA1/A2: Zellen mit einer eigenen `.feld-zelle` (Etikett + Feld) tragen den
     Spaltennamen schon als sichtbaren <span> — die generierte ::before-Marke
     wäre eine fast wortgleiche Doppel-Beschriftung. Sie wird hier unterdrückt
     (:has wird in diesem Paket bereits verwendet). */
  .tabelle--karten td[data-spalte]:has(.feld-zelle)::before { content: none; }
  .tabelle--karten .knopf.reihe { display: flex; width: 100%; margin: var(--a-1) 0 0; }
  .tabelle--karten .knopf.klein { min-height: var(--griff-mittel); }
  /* NA1/A3: Nach dem Wrapper-Umbau steckt die Eingabe im `.feld-zelle`-Label,
     der alte `.eingabe.schmal + .knopf`-Selektor greift dann nicht mehr (die
     Eingabe ist kein direkter Nachbar des Knopfes mehr). `.feld-zelle + .knopf`
     stellt den Abstand wieder her; der alte Selektor bleibt für ungewrappte
     Fälle stehen. */
  .tabelle--karten .knopf.klein + .knopf.klein, .tabelle--karten .eingabe.schmal + .knopf { margin-top: var(--a-2); }
  .tabelle--karten .feld-zelle + .knopf { margin-top: var(--a-2); }
  .tabelle--karten td .eingabe.schmal { margin-bottom: var(--a-2); }
}

/* --- Fuß: Impressum · Datenschutz · Nutzungsbedingungen (§6, R-11) -------- */
.fuss { width: 100%; max-width: calc(var(--spalte-arbeit) + 2 * var(--rand-seite)); margin: 0 auto;
        /* Derselbe Freiraum wie unter der Bühne: Die Wanze belegt unten rechts
           56 px, und die drei Verweise stehen zentriert in EINER Reihe — auf
           390 px reicht „Nutzungsbedingungen" bis in ihr Feld. Ohne die 64 px
           öffnete ein Tipp auf den letzten Verweis den Melde-Dialog. */
        padding: var(--a-4) var(--rand-seite) calc(var(--griff-gross) + env(safe-area-inset-bottom));
        display: flex; flex-wrap: wrap; justify-content: center; gap: var(--a-2) var(--a-4);
        font-size: var(--gr-s); color: var(--text-leise); text-align: center; }
body.breit .fuss { max-width: calc(var(--spalte-verwaltung) + 2 * var(--rand-seite)); }
.fuss a { color: inherit; }

/* --- Rückmeldung: Tipp, Druck, Fokus (§2.7, §2.8) ------------------------- */
@media (hover: hover) and (pointer: fine) {
  .knopf:not(:disabled):not(.hell):not(.leise):not(.gefahr):not(.termin):not(.absage):not(.kontaktiert):hover {
    background: var(--aktion-tipp); }
  .knopf.hell:not(:disabled):hover, .knopf.leise:not(:disabled):hover { background: var(--flaeche-leise); }
  .knopf.gefahr:not(:disabled):hover { background: var(--aktion-gefahr-tipp); }
  .knopf.termin:not(:disabled):hover, .knopf.absage:not(:disabled):hover,
  .knopf.kontaktiert:not(:disabled):hover { filter: brightness(.94); }
  .chip:not(:disabled):hover { border-color: var(--linie-stark); }
  .reiter .chip:not(:disabled):hover { border-color: transparent; border-bottom-color: var(--linie-stark);
                                       color: var(--text-stark); }
  .reiter .chip[aria-selected="true"]:hover { border-bottom-color: var(--aktion-flaeche); }
  .fuss a:hover, .kopf a:hover { color: var(--text-stark); }
}

/* Zeilen-Hover für Tabellen (§7.2) — eine leise Ebene-2-Fläche unter der Zeile,
   auf die der Zeiger zeigt. Nur auf hover-fähigen Geräten; unter 900 px sind
   `.tabelle--karten` KEINE Tabellen mehr, sondern Karten, deshalb greift der
   Karten-Hover erst ab 900 px. Die Rahmen-Tabellen ohne `--karten` bleiben auf
   jeder Breite Tabellen und tragen den Hover durchgehend.
   Die Vergleichshülle ist bewusst AUSGENOMMEN: ihre erste Spalte klebt mit
   eigenem, opakem Hintergrund (sonst scrollt Text durch) — ein Zeilen-Hover
   würde genau diese Spalte nicht mitfärben und die Zeile zweifarbig zerreißen.
   Dort will man ohnehin vergleichen, nicht eine Zeile verfolgen. */
@media (hover: hover) and (pointer: fine) {
  .tabelle-rahmen table:not(.tabelle--karten):not(.tabelle--vergleich) tbody tr:hover td {
    background: var(--flaeche-leise); }
}
@media (hover: hover) and (pointer: fine) and (min-width: 900px) {
  .tabelle-rahmen table.tabelle--karten tbody tr:hover td { background: var(--flaeche-leise); }
}
.knopf:not(:disabled):active, .chip:not(:disabled):active { transform: scale(.985); }
.knopf:not(:disabled):not(.hell):not(.leise):not(.gefahr):not(.termin):not(.absage):not(.kontaktiert):active {
  background: var(--aktion-druck); }
.knopf:focus-visible, .chip:focus-visible, .eingabe:focus-visible, a:focus-visible,
summary:focus-visible, .haken input:focus-visible {
  outline: 2px solid var(--linie-fokus); outline-offset: 2px; }

/* --- Toast (T10) — Rechteck statt Pille (K-17), safe-area-sicher ---------- */
#toast { position: fixed; left: 50%; bottom: calc(var(--a-6) + env(safe-area-inset-bottom));
         transform: translateX(-50%) translateY(8px);
         background: var(--dunkel); color: var(--text-auf-dunkel); padding: 12px 18px; border-radius: var(--r-chip);
         font-size: var(--gr-m); font-weight: 500; line-height: 1.35; opacity: 0; pointer-events: none;
         transition: opacity var(--takt) var(--kurve), transform var(--takt) var(--kurve);
         z-index: var(--e-toast); max-width: min(90vw, 480px); text-align: center; }
#toast.sichtbar { opacity: 1; transform: translateX(-50%) translateY(0); }

/* --- Ladezustand M17: Skelett statt Spinner ------------------------------- */
.skelett { background: linear-gradient(90deg, var(--skelett-grund) 25%, var(--skelett-glanz) 37%, var(--skelett-grund) 63%);
           background-size: 400% 100%; animation: wandern 1.3s linear infinite;
           border-radius: var(--r-klein); height: 16px; margin-bottom: 10px; }
.skelett.gross { height: 28px; width: 70%; }
.skelett.kurz { width: 60%; }
.skelett.knopf { height: var(--griff-gross); border-radius: var(--r-knopf); }
@keyframes wandern { 0% { background-position: 100% 50% } 100% { background-position: 0 50% } }

.verborgen { display: none !important; }

/* Offline- und Fehlerband (M7 / M18) — klebende Leiste in voller Breite,
   ohne den alten Negativ-Rand (der hing an der festen Bühnen-Polsterung
   und ragte auf jedem Handy 16 px über den rechten Rand). */
#band { position: sticky; top: 0; z-index: var(--e-band); margin: 0;
        padding: calc(10px + env(safe-area-inset-top)) var(--a-4) 10px;
        font-size: var(--gr-s); font-weight: var(--stark); text-align: center; line-height: 1.35; }
#band.offline { background: var(--meldung-warnung-flaeche); color: var(--meldung-warnung-schrift); }
#band.fehler  { background: var(--absage-chip); color: var(--absage-chip-schrift); }

/* --- Haltepunkte (§4.1) --------------------------------------------------- */
@media (min-width: 375px)  { body { --rand-seite: var(--a-4); } }
@media (min-width: 600px)  {
  body { --rand-seite: var(--a-6); }
  .karte { padding: var(--a-5); }
  .reiter { flex-wrap: nowrap; position: sticky; }
}
@media (min-width: 900px)  {
  body { --kopf-hoehe: 64px; }
  h1, h2.karten-titel { font-size: 28px; }
  .zahl b { font-size: 32px; }
  /* Arbeitsspalte am Schreibtisch: Setter auf 640 px (§4.1); Verwaltung
     (body.breit — Chef, Betrieb, Closer) bleibt auf --spalte-verwaltung. */
  body:not(.breit) #buehne, body:not(.breit) .fuss {
    max-width: calc(var(--spalte-arbeit-weit) + 2 * var(--rand-seite)); }
  .kopf.app { padding-top: calc(10px + env(safe-area-inset-top)); padding-bottom: 10px; }
  /* UX-8 (M-2): dieselbe Zeile für das umgetaggte h1 — sonst zöge hier die
     allgemeine Regel `h1 { font-size: 28px }` und die Kopfleiste spränge. */
  .kopf.app > b, .kopf.app > h1 { font-size: var(--gr-l); }
  .termine { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (min-width: 1200px) { body { --rand-seite: var(--a-8); } }

@media (prefers-reduced-motion: reduce) {
  .skelett { animation: none; }
  #toast, .knopf, .chip { transition: none; }
  .knopf:not(:disabled):active, .chip:not(:disabled):active { transform: none; }
  .reiter { scroll-behavior: auto; }
}

/* ==========================================================================
   UX-4 — SETTER-STRECKE (plan_ux_final.md §3.2, §5, §6): Karte „Wer",
   Vorbereitung, „Wie erreichen", „Wie gelaufen" je Kanal, Nachfrage-Schirme,
   Tagesgruppierung der Slots, Wiedervorlage mit Feldern, Bilanz-Fuß.
   Alle bisherigen Kennungen und Klassen bleiben — hier kommt nur dazu.
   ========================================================================== */
/* Etiketten in Versalien: Aufhänger, Sprechzettel, Kanalgruppe, Vorbereitung.
   NA1/C-5: `.vorbereitung__label` stand bis hierher als zeichengleiche KOPIE
   dieser Deklarationen weiter unten. Zwei Stellen für ein Aussehen driften
   auseinander, sobald jemand nur eine anfasst — der Selektor tritt der Gruppe
   bei, die Deklarationen bleiben unverändert. Kein anderer Satz greift
   zwischen der alten und der neuen Position auf dieses Etikett zu, die
   Spezifität ist dieselbe (0,1,0): sichtbar ändert sich nichts. */
/* T-26: Das Etikett des R-1-Sprechzettels ist aus dieser Gruppe genommen —
   Sprechzettel und Etikett stehen nicht mehr auf der Karte. Die drei übrigen
   Etiketten behalten Wert für Wert dieselben Deklarationen. */
.aufhaenger__label, .kanalgruppe__titel, .vorbereitung__label {
  display: block; font-size: var(--gr-xs); font-weight: var(--stark); letter-spacing: .03em;
  text-transform: uppercase; color: var(--text-leise); margin-bottom: var(--a-1); }
.aufhaenger { font-size: var(--gr-basis); line-height: var(--zeile-weit); }

/* Der WhatsApp-Weg: zentriert wie der Wählknopf, aber ohne dessen Klasse
   `mitte` — `a.knopf.mitte` bleibt der EINE Wählknopf (test/11, Namens-Riegel). */
.knopf.wa-weg { text-align: center; align-items: center; }

/* Die Telefonnummer bricht nicht (U-S13). */
.nummer { white-space: nowrap; font-variant-numeric: tabular-nums; }

/* Vorbereitung: die Checkliste steht in ihrer eigenen Karte; erfüllt wird
   sie zur grünen Zeile (§3.2 Punkt 3). */
#vorbereitung .gate { margin-top: 0; }
p#vorbereitung { margin-bottom: var(--a-4); font-weight: var(--stark); }

/* ==========================================================================
   SETTER-KARTE (Timms Punkte T-1 bis T-3, 07.09.2026): Kontaktdaten in einer
   eigenen Karte, die vCard-Abfrage darin, die beiden Wege direkt untereinander.
   Rein additiv — keine bestehende Regel wird umgeschrieben.
   ========================================================================== */
/* Die Kontaktdaten selbst: die vorhandene `paarliste` (U-B9) trägt sie schon;
   hier nur der Abstand zum Block darunter und der Umbruch langer Adressen. */
.karte--kontakt .paarliste { margin-bottom: var(--a-2); }
.karte--kontakt #kontakt-quelle { margin: 0 0 var(--a-2); }

/* NA1/C-2 — HAUSREGEL FÜR DIE VERWEISE IN DIESER KARTE.
   Website und Herkunft sind die einzigen echten `<a>` im Inhalt dieses
   Hauses; überall sonst erben Verweise ihre Farbe (`a.farbe-erben`, `.fuss a`)
   oder tragen die Knopf-Optik. Ohne eine Regel blieben genau diese zwei im
   Browser-Vorgabeblau #0000EE stehen — die einzige Farbe des Schirms, die in
   keinem Token steht und die kein Thema mitbewegt. Erkennbar bleiben sie über
   die UNTERSTREICHUNG, nicht über die Farbe; das trägt auch bei
   Farbfehlsichtigkeit.
   `:not(.knopf)` ist Pflicht und kein Feinschliff: Der vCard-Knopf ist ein
   `<a class="knopf">` IN dieser Karte — ohne den Ausschluss bekäme er graue
   Schrift auf dunkler Fläche und eine Unterstreichung. */
.karte--kontakt a:not(.knopf) {
  color: var(--text-mittel); text-decoration: underline; text-underline-offset: 2px; }

/* Die Vorbereitung sitzt jetzt am Fuß der Kontaktdaten-Karte statt in einer
   eigenen. Abgesetzt wie `.nebenweg`/`.verwaltung`, damit sie als eigener
   Abschnitt lesbar bleibt; das Etikett ersetzt das frühere Karten-h2 und
   trägt denselben Wortlaut. */
.vorbereitung { margin-top: var(--a-3); padding-top: var(--a-3);
                border-top: 1px dashed var(--linie); }
/* NA1/C-4 — DAS ETIKETT IST EINE ÜBERSCHRIFT (h3), UND SIE SIEHT GLEICH AUS.
   Größe, Gewicht, Laufweite, Versalien, Farbe und Unterrand kommen aus der
   Etikett-Gruppe oben (Autorenregeln schlagen die Browser-Vorgaben). Was von
   den h3-Vorgaben übrig bliebe, ist der `margin-top` von rund einer Zeile —
   und der würde die Karte auseinanderziehen. Genau der fällt hier weg. */
h3.vorbereitung__label { margin-top: 0; }
.vorbereitung .gate { margin-bottom: var(--a-3); }
.vorbereitung .knopf:last-child { margin-bottom: 0; }
.karte--kontakt p#vorbereitung { margin-bottom: 0; }

/* T-1: WhatsApp klebt am Anruf-Knopf — der halbe Knopf-Abstand statt des
   vollen macht aus zwei Knöpfen ein Knopfpaar.
   NA1/C-3: auch im gesperrten Fall. Dort ist `#anrufen` ausgeblendet und den
   Platz nimmt der gesperrte Ersatzknopf ein — der hat keine `id` und fiel aus
   dieser Regel heraus. Ergebnis war ein Paar, das gesperrt weiter auseinander
   stand als offen. */
.karte--weg #anrufen, .karte--weg .knopf--anruf-gesperrt { margin-bottom: var(--a-1); }

/* Kanalgruppen in „Wie gelaufen": ein Rahmen je Kanal, die gebuchte Gruppe
   ist hervorgehoben — der Setter sieht nach der Rückkehr aus Telefon oder
   WhatsApp, wohin sein Ergebnis geht. */
.kanalgruppe { padding: var(--a-3); border: 1px solid var(--linie); border-radius: var(--r-chip);
               margin-bottom: var(--a-3); }
.kanalgruppe.aktiv { border-color: var(--linie-stark); background: var(--flaeche-leise); }
.kanalgruppe > .knopf:last-child { margin-bottom: 0; }

/* Die Ergebnis-Knöpfe: eine Spalte mobil, ab 600 px 2×2 (entschieden, §3.2);
   jeder weiterhin ≥ 64 px, Reihenfolge und Farben unverändert. */
.ergebnisse { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--a-2);
              margin-bottom: var(--a-2); }
.ergebnisse > * { min-width: 0; }
.ergebnisse .knopf { margin-bottom: 0; }
@media (min-width: 600px) { .ergebnisse { grid-template-columns: repeat(2, minmax(0, 1fr)); } }

/* Nebenweg (Wiedervorlage) und Freigabe-Verwaltung: räumlich abgesetzt,
   nie wie eine zweite Hauptaktion. */
.nebenweg, .verwaltung { margin-top: var(--a-4); padding-top: var(--a-3);
                         border-top: 1px dashed var(--linie); }
.nebenweg .knopf, .verwaltung .knopf { margin-bottom: 0; }
/* T-26: Der Abstandssatz zwischen dem Knopf dieser Gruppe und einem Aufklapp
   dahinter ist entfallen — der einzige Aufklapp in einer Freigabe-Verwaltung
   war der R-2-Volltext der Setter-Karte. Der Aufklapp-Stil selbst bleibt
   (Betriebs-Sicht, „Worauf sich die Auskunft stützt"). */

/* Die Karte, auf die der Schirm gerade geführt hat (frisch vereinbarter
   Folgetermin). Sie bleibt sechs Sekunden markiert und wird dann von selbst
   wieder still — eine dauerhafte Markierung wäre nach dem dritten Termin eine
   Liste voller Markierungen. Kein Blinken: ein ruhiger Rahmen, den auch
   jemand mit reduzierter Bewegung sieht. */
.karte.hervorgehoben { border-color: var(--aktion-flaeche);
                       box-shadow: 0 0 0 2px var(--aktion-flaeche); }

/* Produktfamilien der Abschluss-Maske: die Hülle um mehrere Varianten.
   Weiterhin KEINE `.karte`-Klasse — der Rahmen käme sonst aus zwei Regeln und
   jede Änderung an `.karte` zöge hier mit. Was sie AUSSIEHT, steht seit dem
   Feinschliff trotzdem hier: eine eigene Fläche mit Rand und Radius, damit
   eine Familie als Block erkennbar ist und nicht als weitere Zeile in einer
   langen Liste (Timm, 12.09.2026: „grafisch aufgewertet und übersichtlicher").
   Die Trennlinie von vorher entfällt dafür — Fläche UND Linie wären zweimal
   dieselbe Grenze. */
.produktkarte { background: var(--flaeche-leise); border: 1px solid var(--linie);
                border-radius: var(--r-chip); padding: var(--a-3);
                margin-top: var(--a-3); }
.produktkarte:first-of-type { margin-top: 0; }
/* Titel links, die Pille „gewählt" rechts daneben — sie darf den Titel nicht
   vor sich herschieben, deshalb `gap` statt `space-between` mit Umbruch. */
.produktkarte__kopf { display: flex; flex-wrap: wrap; align-items: baseline;
                      gap: var(--a-2); margin-bottom: var(--a-2); }
.produktkarte__titel { font-size: var(--gr-l); font-weight: var(--sehr-stark);
                       line-height: var(--zeile-eng); margin: 0; }
/* Der Aufklapp-Knopf steht unter dem Titel und trägt nur noch die Auskunft,
   wie viele Varianten dahinterstehen. Er ist bewusst leise: Der Titel ist die
   Überschrift, nicht er. */
.produktkarte > [data-familieauf] { margin-bottom: 0; }
.produktkarte > [data-familieauf] + div { margin-top: var(--a-3); }

/* Eine Variantenzeile. Die letzte Zeile einer Familie hat keinen Abstand nach
   unten — die Karte bringt ihren eigenen mit. */
.produktzeile { margin-bottom: var(--a-4); }
.produktzeile:last-child { margin-bottom: 0; }
/* DER PRODUKTNAME STEHT IN DER HAUPTFARBE — AUCH UNGEWÄHLT.
   Timms Einwand war „bei den Abschluss angeboten die Schrift so grau", und der
   Name ist die Schrift, die er dabei liest. Er hing an `.knopf.leise`, und die
   setzt `--sekundaer` (= `--text-leise`): Beim Öffnen der Maske ist nichts
   gewählt, also standen ALLE Angebotsnamen genau in dem Grau, das er
   beanstandet hat. Die Regel trägt `.knopf` mit, damit sie dieselbe
   Spezifität hat wie `.knopf.leise` und als spätere Zeile gewinnt. */
.knopf.produktwahl { color: var(--text-stark); }
/* HOVER MUSS MAN SEHEN. `.knopf.leise:hover` legt `--flaeche-leise` unter den
   Knopf — genau die Farbe, die die Produktkarte seit dem Feinschliff selbst
   trägt. Am Schreibtisch war das Überfahren einer Variante damit unsichtbar.
   Auf der Karte ist die Kartenfläche der Gegensatz. */
@media (hover: hover) and (pointer: fine) {
  .produktkarte .knopf.leise:not(:disabled):hover { background: var(--flaeche-karte); }
}
/* DIE GEWÄHLTE VARIANTE IST UNÜBERSEHBAR: Rahmen in der Aktionsfarbe UND ein
   Haken vor dem Namen. Zwei Merkmale, weil eines allein zu wenig ist — der
   Rahmen fällt bei hellem Licht auf dem Handy weg, der Haken ist auch dann
   noch da (und für eine Vorlesehilfe steht ohnehin `aria-pressed`). */
.produktwahl[aria-pressed="true"] { border-color: var(--aktion-flaeche);
  box-shadow: inset 0 0 0 1px var(--aktion-flaeche); color: var(--text-stark);
  background: var(--flaeche-karte); font-weight: var(--stark); }
.produktwahl[aria-pressed="true"] > span::before { content: "✓ "; font-weight: var(--sehr-stark); }
/* Preis und Laufzeit: die Angabe, wegen der jemand hersieht. Hauptfarbe,
   Grundgröße, kein Grau. */
.produktzeile__preis { font-size: var(--gr-basis); color: var(--text-stark);
                       line-height: var(--zeile); margin: var(--a-2) 0 var(--a-3); }
/* Der Zeilenbetrag — LAUT ERST, WENN DIE VARIANTE GEWÄHLT IST.
   Der Befund: Er stand für JEDE Variante in der lautesten Stufe, und bei
   Anzahl 1 (dem Regelfall) stand damit dieselbe Zahl zweimal untereinander —
   oben der Preis, darunter derselbe Betrag, größer und fetter. Beim Aufklappen
   einer Familie schrien drei ungewählte Beträge lauter als die Summe. Das
   arbeitet gegen „übersichtlicher".
   Ungewählt ist er deshalb eine ruhige Nebenangabe; gewählt bekommt er die
   laute Stufe. Der Nachbarschafts-Wähler geht, weil Knopf und Betrag in
   derselben Zeile Geschwister sind. Tabellenziffern in beiden Stufen, damit
   die Beträge untereinander stehen. */
.produktzeile__betrag { font-size: var(--gr-basis); font-weight: 500;
                        color: var(--text-mittel); font-variant-numeric: tabular-nums;
                        margin: var(--a-2) 0 0; }
.produktwahl[aria-pressed="true"] ~ .produktzeile__betrag {
                        font-size: var(--gr-l); font-weight: var(--sehr-stark);
                        color: var(--text-stark); }

/* Die Summe der Abschluss-Maske als eine breite, hervorgehobene Zeile statt
   als eine Kachel unter mehreren: Sie ist die Zahl, die bestätigt wird. */
.summe-zeile { grid-template-columns: minmax(0, 1fr); }
.summe-zeile .zahl { background: var(--meldung-erfolg-flaeche); border-color: transparent;
                     padding: var(--a-4) var(--a-3); }
.summe-zeile .zahl b { color: var(--meldung-erfolg-schrift); }
.summe-zeile .zahl span { color: var(--meldung-erfolg-schrift); opacity: .85; }

/* Der Stepper neben dem Zahlenfeld: zwei schmale Knöpfe links und rechts, das
   Feld dazwischen. Das Feld BLEIBT sichtbar — zwölf Monate Laufzeit wären
   sonst elf Tipps.
   Die Trefferfläche ist `--griff-mittel` (48 px) und damit über den 44 px, die
   der Feinschliff verlangt; sie steht hier ausdrücklich als Mindestmaß, damit
   ein späterer schmalerer Wert an dieser Zeile auffällt. */
.stepper { display: flex; align-items: stretch; gap: var(--a-2); }
.stepper .eingabe { flex: 1 1 auto; text-align: center; font-size: var(--gr-l);
                    font-weight: var(--stark); }
.stepper .knopf { width: var(--griff-mittel); flex: 0 0 var(--griff-mittel);
                  min-width: 44px; min-height: 44px;
                  align-items: center; text-align: center; margin-bottom: 0; padding: 0;
                  font-size: var(--gr-xl); }

/* PUNKT 4 — der Deckel über „Abgesagt und verschoben". Er steht mittig unter
   der Arbeitsliste und sieht aus wie ein Abschnitt, nicht wie eine Aktion. */
#closer-abgesagt-auf { margin-bottom: var(--a-3); }

/* Ein Feld mit Beschriftung (§2.6) — Termin-Vorschlag, Datum, Notiz. */
.feld { margin-bottom: var(--a-3); }
.feld label { display: block; font-size: var(--gr-s); font-weight: var(--stark);
              color: var(--text-mittel); margin-bottom: var(--a-1); }
.feld .eingabe { margin-bottom: 0; }

/* UX-5: Zwei Zeilen unter einem Feld. `.hilfe` ist eine leise Erläuterung
   (das Beispiel, der Ländercode), `.fehler` die Beanstandung in Meldungsrot.
   Beide sitzen UNTER der Eingabe, deshalb ein kleiner Abstand nach oben; die
   Eingabe darüber verliert ihren eigenen unteren Rand. */
.feld:has(.hilfe) .eingabe, .feld:has(.fehler) .eingabe { margin-bottom: var(--a-1); }
.feld .hilfe  { font-size: var(--gr-s); color: var(--text-mittel); line-height: var(--zeile); margin: 0; }
.feld .fehler { font-size: var(--gr-s); color: var(--meldung-fehler-schrift); line-height: var(--zeile); margin: 0; }

/* UX-5: Kompakte Beschriftung in einer Tabellenzelle — ein `<label>`, das
   sein Feld umschließt. Sichtbar, aber leise (§2.6, U-CH-Zellen). */
label.feld-zelle { display: block; }
label.feld-zelle > span { display: block; font-size: var(--gr-xs); font-weight: var(--stark);
  letter-spacing: .03em; text-transform: uppercase; color: var(--text-leise); margin-bottom: 2px; }

/* UX-5 (U-CH5): Die Suchzeile — mobil gestapelt, ab 600 px Feld und Knopf
   nebeneinander. Das Feld wächst, der Knopf behält seine Griffhöhe und wächst
   nicht in die Breite. Der Riegel `min-width: 0` steht schon oben (Regel 2). */
.suchzeile { display: flex; flex-direction: column; gap: var(--a-2); margin-bottom: var(--a-2); }
.suchzeile .feld { margin-bottom: 0; }
.suchzeile .knopf { margin-bottom: 0; }
@media (min-width: 600px) {
  .suchzeile { flex-direction: row; align-items: flex-end; }
  .suchzeile .feld { flex: 1 1 auto; }
  .suchzeile .knopf { flex: 0 0 auto; width: auto; }
}

/* UX-5 (§3.5): Das Import-Formular in zwei Feldgruppen — untereinander mobil,
   ab 900 px nebeneinander (Liste/Batch · Anruf-Freigabe). */
.feldgruppen { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--a-4); margin-bottom: var(--a-4); }
.feldgruppen > * { min-width: 0; }
.feldgruppe > h2:first-child { margin-top: 0; }
@media (min-width: 900px) {
  .feldgruppen { grid-template-columns: 1fr 1fr; align-items: start; }
}

/* UX-5 (§2.6, behebt U-B3): darstellende Stufenleiste. Die Nummern stehen als
   ECHTER Text im Markup (der Prüfstand kann kein CSS-counter auswerten), die
   aktuelle Stufe ist hervorgehoben. Rein Anzeige — sie schaltet nichts. */
.schritte { display: flex; flex-wrap: wrap; gap: var(--a-1) var(--a-2); align-items: center;
  margin: 0 0 var(--a-4); padding: 0; list-style: none; font-size: var(--gr-s); color: var(--text-leise); }
.schritte .schritt { display: inline-flex; align-items: center; gap: var(--a-2);
  padding: var(--a-1) var(--a-3); border-radius: var(--r-pille);
  background: var(--flaeche-leise); color: var(--text-leise); font-weight: var(--stark); }
.schritte .schritt .nr { display: inline-flex; align-items: center; justify-content: center;
  width: 20px; height: 20px; border-radius: 50%; background: var(--linie);
  color: var(--text-mittel); font-size: var(--gr-xs); line-height: 1; }
.schritte .schritt[data-schritt-aktiv="true"] { background: var(--aktion-flaeche); color: var(--aktion-schrift); }
.schritte .schritt[data-schritt-aktiv="true"] .nr { background: var(--aktion-schrift); color: var(--aktion-flaeche); }

/* Kontextkopf der Nachfrage-Schirme („Firma · Kanal") und der Kartenfuß. */
.karte__kontext { font-size: var(--gr-s); color: var(--text-leise); margin: 0 0 var(--a-2); }
.karte__fuss { margin-top: var(--a-3); padding-top: 10px; border-top: 1px solid var(--rand);
               font-size: var(--gr-s); color: var(--sekundaer); line-height: var(--zeile-weit); }
.hinweis .zeile { display: block; }
.hinweis b + .zeile { margin-top: 2px; }

/* Definitionsliste (S6): Firma und Closer als Paare. */
dl.paare { display: grid; grid-template-columns: max-content minmax(0, 1fr); gap: var(--a-1) var(--a-3);
           margin: 0 0 var(--a-4); }
dl.paare dt { color: var(--text-leise); font-size: var(--gr-s); }
dl.paare dd { margin: 0; }

/* S2: fünf Stufen in EINER Reihe; unter 340 px leichtes waagerechtes Scrollen. */
.chips.stufen { grid-template-columns: repeat(5, minmax(0, 1fr)); }
@media (max-width: 339px) {
  .chips.stufen { display: flex; overflow-x: auto; scrollbar-width: none; }
  .chips.stufen .chip { flex: 0 0 72px; }
}

/* S5: die weiteren Slots nach Tag — 2 Spalten mobil, 3 ab 600, 4 ab 900.
   Die Tagesüberschrift IN `.slots__tag` hatte hier eine eigene Regel für ein
   `h3`; seit der Picker genau einen Tag zeigt, trägt sie `h2.karten-titel` und
   holt ihre Optik von dort. Eine Regel, die auf nichts mehr zeigt, ist eine
   Falle für den Nächsten, der sie für benutzt hält. */
.chips.slots { grid-template-columns: repeat(2, minmax(0, 1fr)); }
@media (min-width: 600px) { .chips.slots { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
@media (min-width: 900px) { .chips.slots { grid-template-columns: repeat(4, minmax(0, 1fr)); } }

/* Eine geöffnete Woche zeigt alle Tage im umbrochenen Raster.
   Kein horizontaler Slider; Datum und Trefferfläche bleiben vollständig sichtbar. */
.chips.tagreihe {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(96px, 1fr));
  max-width: 100%; padding-bottom: 2px;
}
.chips.tagreihe::-webkit-scrollbar { display: none; }
.chips.tagreihe .chip { min-width: 0; min-height: 48px; }
.slots .chip[hidden] { display: none; }
.slot-woche { min-width: 0; margin-block: 8px; }
.slot-woche > summary { min-height: 44px; padding-block: 12px; cursor: pointer; font-weight: 600; }
.slot-woche .tagreihe { margin-block: 4px 12px; }
.chip[aria-busy="true"] { opacity: .7; }

/* S7: die vordefinierten Zeiten als 2-Spalten-Raster, „Anderer Tag" über die
   volle Breite. */
.chips.zeiten { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.chips.zeiten .chip:last-child { grid-column: 1 / -1; }

/* Kopfleiste: „Tagesbilanz" als kleiner Knopf statt Pseudo-Link (U-S6). */
.kopf.app .knopf.klein { display: inline-flex; width: auto; }

/* T-9 (Timm, 08.09.2026): Der WhatsApp-Weg traegt die Farbe, die jeder kennt
   (Brand-Gruen #25D366), dunkle Schrift fuers Kontrastmass. Nur der AKTIVE
   Weg (der <a>) — der gesperrte Knopf (#whatsapp-aus, ein <button>) behaelt
   die gedaempfte leise-Optik: Grau sagt "kein Weg", Gruen sagt "geh".
   Eigene Hover-Stufe, damit die allgemeine leise-Hover-Regel das Gruen
   nicht ueberdeckt (gleiche Spezifitaet, spaeter im Blatt = diese hier). */
a.knopf.wa-weg { background: #25d366; color: #08331f; border: none; }
a.knopf.wa-weg small { opacity: .9; }
@media (hover: hover) {
  a.knopf.wa-weg:not(:disabled):hover { background: #1fbf5b; }
}

/* T-19 (Timm, 08.09.2026) — DIE NOTIZEN. Eine Liste, die man lesen kann, ohne
   sie zu suchen: jede Notiz eine eigene Zeile, die Kopfzeile (Autor · Zeit ·
   Bezug) klein darueber, der Text in normaler Groesse darunter. Kein Rahmen je
   Eintrag — die Karte ist schon einer; eine Trennlinie reicht.
   `overflow-wrap` wie bei `.paarliste dd`: Eine lange Zeichenkette ohne
   Leerzeichen (eine Adresse, eine Kennung) darf die Karte nicht sprengen. */
.notizen { list-style: none; margin: 0; padding: 0; }
.notizen .notiz { padding: var(--a-2) 0; border-bottom: 1px solid var(--rand);
                  line-height: var(--zeile-weit); overflow-wrap: anywhere; }
.notizen .notiz:first-child { padding-top: 0; }
.notizen .notiz:last-child { border-bottom: none; padding-bottom: 0; }
.notizen .notiz .zeile { margin-top: 2px; }
/* Der Notiz-Abschnitt der Closer-Terminkarte steht unter dem uebrigen Inhalt
   und ist deshalb abgesetzt — dieselbe Trennung wie `.karte__fuss`. */
.notizen-block { margin-top: var(--a-3); padding-top: var(--a-3);
                 border-top: 1px solid var(--rand); }
.notizen-block h2 { font-size: var(--gr-m); margin: 0 0 var(--a-2); }
/* T-19 NA1: der Hinweis unter einer abgeschnittenen Liste („N weitere
   aeltere Notizen") samt Knopf. Er steht abgesetzt, weil er eine AUSKUNFT
   ueber die Liste ist und kein Eintrag darin. */
.notizen-mehr { margin: var(--a-2) 0 0; }
/* T-26 (Timm, 10.09.2026): die Kopfzeile der kleinen Fassung auf der
   Setter-Karte — Ueberschrift links, Stift rechts, auf einer Zeile. Ohne
   Bestand ist das der GANZE Abschnitt; deshalb darf die Ueberschrift hier
   ihren unteren Abstand nicht behalten, sonst stuende unter einer Zeile eine
   Luecke ohne Inhalt. Der Stift selbst bringt seine Groesse aus den
   bestehenden Knopf-Klassen mit (`leise mittel reihe`, 48 px Griff); nur das
   Zeichen darin ist groesser als Fliesstext, damit es als Symbol lesbar
   bleibt. */
.notiz-kopf { display: flex; align-items: center; justify-content: space-between;
              gap: var(--a-3); }
.notiz-kopf h2 { margin: 0; }
/* Der rechte Aussenabstand von `.knopf.reihe` (2px 6px 2px 0) stammt aus den
   Tabellenzeilen, wo mehrere Knoepfe nebeneinander Luft brauchen. Hier ist der
   Stift der letzte Knoten einer `space-between`-Zeile — die 6 px haetten ihn
   gegenueber der linksbuendigen Ueberschrift eingerueckt. */
.notiz-kopf .knopf { font-size: var(--gr-l); line-height: 1; margin-right: 0; }

/* ==========================================================================
   KARTEN-KONTEXT (Timms T-11/T-17, 08.09.2026): der Block zwischen Kopf und
   Wer-Karte — „warum liegt diese Karte gerade vor mir, und was war beim
   letzten Mal?". Rein additiv; keine bestehende Regel wird umgeschrieben.
   ========================================================================== */
/* Er ist LEISER als die Karten darunter: Kontext, keine Handlung. Deshalb die
   ruhige Fläche statt der Kartenfläche — dieselbe Bewegung wie bei
   `.karte.leise`, dazu eine Kante links, die den Block als Rückblick lesbar
   macht. */
.karte--kontext { background: var(--flaeche-leise); box-shadow: none;
                  border-left: 3px solid var(--linie-stark); }
.karte--kontext > *:last-child { margin-bottom: 0; }
/* Pille und „fällig seit" in einer Zeile, mit Umbruch auf schmalen Geräten. */
.kontext-kopf { display: flex; flex-wrap: wrap; align-items: center;
                gap: var(--a-2); margin: 0 0 var(--a-2); }
.kontext-seit { font-size: var(--gr-s); color: var(--text-mittel); }
/* Die Pille der Rückkehr. Sie ist KEINE Warnung und kein Fehler — ein Lead,
   der zur verabredeten Zeit zurückkommt, ist der Normalfall. Deshalb der
   Info-Ton, nicht Gelb oder Rot. */
.pille--wiedervorlage { background: var(--meldung-info-flaeche);
                        color: var(--meldung-info-schrift); }
/* T-28: die Erinnerung an einen gehaltenen Slot. Sie ist DRINGENDER als eine
   gewöhnliche Rückkehr — beim Closer steht eine Zeit, die verfällt, wenn
   niemand sie bestätigt —, aber immer noch kein Fehler. Deshalb der
   Warnton (gelb), nicht Rot und nicht der ruhige Info-Ton. */
.pille--erinnerung { background: var(--meldung-warnung-flaeche);
                     color: var(--meldung-warnung-schrift); }
/* Die Notiz von damals ist der Grund, aus dem T-11 gestellt wurde: Sie steht
   in Lesegröße, nicht im Kleingedruckten. */
.kontext-notiz { margin: 0 0 var(--a-2); line-height: var(--zeile);
                 overflow-wrap: anywhere; }
.karte--kontext #kontext-grund, .karte--kontext #kontext-zuletzt {
  margin: 0; overflow-wrap: anywhere; }

/* ==========================================================================
   SPERRZEITEN UND ARBEITSZEIT AM HANDY (Timms T-33, 10.09.2026)
   ==========================================================================
   Timms Befund: „Die Felder laufen rechts über die Karte." Gemessen wird das
   bei 390 px Gerätebreite (iPhone-Klasse) — der Prüfstand kennt kein Layout,
   diese Regeln stehen deshalb auf CSS-Wissen und nicht auf einer grünen Zelle.

   URSACHE, in drei Sätzen: Ein `input[type="time"]`, `date` oder
   `datetime-local` ist kein gewöhnliches Textfeld. WebKit gibt ihm eine
   INTRINSISCHE Mindestbreite aus seinen Innenteilen (Stunden-, Minuten-,
   Datumsfelder plus Uhr- oder Kalendersymbol) und behandelt es wie ein
   ersetztes Element; `min-width: auto` fällt bei einem Flex- oder Grid-Kind
   auf genau diese Breite zurück, und dagegen gewinnt das `width: 100%` aus
   `.eingabe` nicht zuverlässig. Das Feld bleibt so breit, wie sein Inhalt es
   verlangt, und schiebt die Karte auf.

   Deshalb hier: die Systemdarstellung abschalten (`appearance: none`), die
   Breite ausdrücklich festnageln und `min-width: 0` setzen, damit das Feld in
   einem Grid oder Flex wirklich schrumpfen darf.

   Der Block hängt bewusst AM ENDE und schreibt keine bestehende `.eingabe`-
   Zeile um — sonst wäre er beim Zusammenführen mit den anderen Masken-Paketen
   eine Kollision an genau der Stelle, die alle anfassen. */
input[type="time"].eingabe,
input[type="date"].eingabe,
input[type="datetime-local"].eingabe {
  width: 100%; max-width: 100%; min-width: 0;
  -webkit-appearance: none; appearance: none;
}

/* Zwei Zeitfelder nebeneinander (Von/Bis, Pause von/bis). Dieselbe Bauform wie
   `.feldgruppen`: ein Grid mit `minmax(0, 1fr)` und `min-width: 0` auf den
   Kindern — ohne diese beiden schiebt ein Kind mit intrinsischer Mindestbreite
   die Spalte über die Karte hinaus, statt zu schrumpfen. */
.zeitpaar { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
            gap: var(--a-3); }
.zeitpaar > * { min-width: 0; }
.zeitpaar .feld { margin-bottom: var(--a-2); }

/* Ein Wochentag der Arbeitszeit-Karte. Sieben Blöcke in einer Karte brauchen
   eine Trennung, die nicht selbst wie eine Karte aussieht — eine Linie genügt.
   Die Felder darin tragen `.eingabe` (48 px) und NICHT `.eingabe.gross`
   (64 px): Sieben Zeilen à vier Feldern sind auf 390 px sonst eine Wand. */
.arbeitstag { padding-top: var(--a-3); border-top: 1px solid var(--linie); }
.arbeitstag:first-of-type { padding-top: 0; border-top: 0; }
.arbeitstag-titel { margin: 0 0 var(--a-2); font-size: var(--gr-basis);
                    font-weight: var(--stark); color: var(--text); }
.arbeitstag .knopf { width: 100%; }

/* Eine Zeile der Sperrliste als LESBARER Satz („Mo 14.09. – So 27.09. ·
   ganzer Tag · Urlaub") statt als Reihe von Marken. Sie darf umbrechen; auf
   390 px ist das der Normalfall. */
.sperre-zeile { margin: 0 0 var(--a-2); line-height: var(--zeile);
                overflow-wrap: anywhere; }

/* ==========================================================================
   T-29a — DER KONTAKT-BLOCK DER CLOSER-TERMINKARTE (Timm, 10.09.2026)
   Rein additiv: kein bestehender Satz wird umgeschrieben. Der Block sitzt IN
   einer Terminkarte (`.karte`), nicht in einer eigenen — er gehört zu diesem
   einen Termin und darf nicht wie ein zweiter Vorgang daneben stehen.
   ========================================================================== */
.kontakt-closer { margin: var(--a-3) 0; padding-top: var(--a-3);
                  border-top: 1px dashed var(--linie); }
/* Das Etikett tritt der Versalien-Gruppe bei (§ „Etiketten in Versalien"),
   ohne deren Deklarationen zu wiederholen — dieselbe Entscheidung wie bei
   `.vorbereitung__label` (NA1/C-5). Der h3-Vorgabe-`margin-top` fällt weg, er
   zöge den Block auseinander. */
.kontakt-closer__label { display: block; font-size: var(--gr-xs);
  font-weight: var(--stark); letter-spacing: .03em; text-transform: uppercase;
  color: var(--text-leise); margin: 0 0 var(--a-1); }
.kontakt-closer .paarliste { margin-bottom: var(--a-2); }
/* Dieselbe Hausregel wie in der Setter-Kontaktkarte (NA1/C-2): Verweise im
   Inhalt tragen die Textfarbe und sind an der UNTERSTREICHUNG erkennbar, nicht
   am Browser-Vorgabeblau. `:not(.knopf)` ist Pflicht — Anrufen und WhatsApp
   sind `<a class="knopf">` in genau diesem Block. */
.kontakt-closer a:not(.knopf) {
  color: var(--text-mittel); text-decoration: underline; text-underline-offset: 2px; }
/* Anrufen und WhatsApp sind ein Knopfpaar: der halbe Abstand statt des vollen
   (dieselbe Setzung wie auf der Setter-Karte, T-1). */
.kontakt-closer .closer-anrufen, .kontakt-closer .closer-anrufen-aus {
  text-align: center; align-items: center; margin-bottom: var(--a-1); }
.kontakt-closer .closer-whatsapp { margin-bottom: var(--a-2); }
.kontakt-closer > *:last-child { margin-bottom: 0; }

/* ==========================================================================
   FEHLER MELDEN — DIE WANZE UND IHR FORMULAR (Timms Wunsch)
   Rein additiv: kein bestehender Satz wird umgeschrieben. Beide Bausteine
   stehen AUSSERHALB der Bühne (index.html, neben #band und #toast) und
   überleben deshalb jeden Schirmwechsel.
   ========================================================================== */

/* UNTEN RECHTS — Timms Entscheid vom 12.09.2026, und er korrigiert diese
   Datei an genau der Stelle, an der sie vorher das Gegenteil begründet hat.
   Gemessen wurde: Oben rechts legte sich die Wanze auf 390 px über das rechte
   Ende der klebenden Kopfleiste. Auf der Anruf-Karte sitzt dort der
   Tagesbilanz-Knopf — sie verdeckte sein Ende UND fing seine Tipps ab, weil
   sie eine Ebene darüber lag. Auf den übrigen Schirmen deckte sie das Ende der
   Nebenzeile ab, die dort mit Auslassungspunkten endet.

   Die zweite Sache, die mit dem Umzug fällt: Vorher wich die Wanze einem
   stehenden Band aus, indem sie aus der festen Lage rutschte — und war dann
   entweder hinter dem Band oder aus dem Bild gescrollt. Genau im Funkloch, wo
   das Offline-Band steht und jemand melden will, war der Meldeweg zu. Unten
   rechts gibt es diesen Konflikt nicht: Das Band klebt oben, die Wanze steht
   unten, keine Regel muss die andere ausweichen lassen.

   Die Ebene liegt jetzt ÜBER Band und Toast: Die Wanze darf von keinem
   verdeckt oder unerreichbar gemacht werden — der Weg, einen Fehler zu melden,
   ist genau dann wichtig, wenn etwas anderes schon schiefgegangen ist.
   Umgekehrt kostet das etwas, und das steht hier statt einer Beschönigung:
   Das Band klebt oben, es gibt keinen Konflikt. Der Toast aber steht unten
   (24 px über der Kante, zentriert bis 480 px) und überschneidet sich auf
   390 px mit dem Feld der Wanze. Ein langer Toast bekommt dort seine untere
   rechte Ecke verdeckt. Bewusst hingenommen: Er trägt `pointer-events: none`,
   verliert also keinen Tipp, und er bricht um, statt zu verschwinden.

   44 px statt der 40 px von `--griff-klein`: Das ist die kleinste Fläche, die
   die Griffregel dieses Hauses für einen frei stehenden Knopf zulässt, und
   sie steht hier als Zahl, weil kein Abstands-Wort dieses Hauses 44 heißt. */
.wanze {
  position: fixed; z-index: calc(var(--e-toast) + 1);
  bottom: calc(env(safe-area-inset-bottom) + 12px);
  right: calc(env(safe-area-inset-right) + 12px);
  width: 44px; height: 44px;
  display: flex; align-items: center; justify-content: center;
  padding: 0; font: inherit; font-size: var(--gr-basis); line-height: 1;
  background: var(--flaeche-kopf); color: var(--text);
  border: 1px solid var(--linie); border-radius: var(--r-pille); cursor: pointer;
}
.wanze:focus-visible { outline: 2px solid var(--linie-fokus); outline-offset: 2px; }

/* Das Formular ist eine kleine Karte — kein Vollbild-Dialog. Es verdeckt den
   Schirm nicht, über den gerade gemeldet wird: Wer schreibt „auf diesem Knopf
   passiert nichts", soll den Knopf noch sehen.

   DER DIALOG STEHT OBEN, die Wanze unten rechts — und das ist kein Versehen,
   sondern der Grund, warum er überhaupt benutzbar ist: Beim Aufklappen bekommt
   das Textfeld sofort den Fokus, die Bildschirmtastatur fährt also hoch. Sie
   ist auf einem Handy 300 bis 340 px hoch, und `position: fixed` misst auf iOS
   Safari gegen das Layout-Viewport, nicht gegen das sichtbare — ein Dialog am
   unteren Rand läge samt Textfeld und Absenden-Knopf hinter der Tastatur. Oben
   bleibt er stehen. Der Abstand nach oben lässt die klebende Kopfleiste frei
   (Rand + Griffhöhe + Fuge).

   Die Breite ist auf dem schmalsten Gerät `92vw`: Auf 390 px sind das
   359 px, bei 12 px Rand rechts bleiben links 19 px stehen — kein Überlauf. */
.meldeform {
  position: fixed; z-index: calc(var(--e-toast) + 1);
  top: calc(var(--a-2) + var(--griff-klein) + var(--a-1) + env(safe-area-inset-top));
  right: calc(env(safe-area-inset-right) + 12px);
  bottom: auto; left: auto; width: min(92vw, 380px); max-height: 70vh; overflow-y: auto;
  background: var(--flaeche-karte); color: var(--text);
  border: 1px solid var(--linie); border-radius: var(--r-klein);
  box-shadow: 0 8px 24px rgb(0 0 0 / 18%);
  padding: var(--a-3);
}
.meldeform h2 { margin: 0 0 var(--a-2); font-size: var(--gr-basis); }
.meldeform .feld { margin-bottom: var(--a-2); }
.meldeform .knopf { width: 100%; }
/* Der Hinweissatz steht KLEIN, aber er steht — er ist die einzige Bremse
   zwischen einem Hergang und dem Namen eines Interessenten in einer Tabelle,
   die keine Art.-17-Löschung erreicht. */
.meldeform__hinweis { margin: 0 0 var(--a-2); font-size: var(--gr-xs);
  line-height: var(--zeile); color: var(--text-leise); }

/* Die Meldungsliste der Leitung: eine erledigte Zeile tritt zurück, ohne zu
   verschwinden — sie bleibt lesbar, sagt aber, dass sie keine Arbeit mehr ist.
   Der graue Ton allein trägt die Aussage NICHT: In der Zeile steht daneben das
   Wort „erledigt" samt Zeitpunkt (app.js, `meldungZeile`). */
.meldung-erledigt { color: var(--text-leise); }

/* ==========================================================================
   025 — DER SPRUNG ZUM ANDEREN ENDE EINER VERSCHIEBUNG
   ========================================================================== */
/* NA1/3 — DER SPRUNGKNOPF IST EIN VERWEIS UND KEIN KNOPF-KLOTZ.
   (Lenses R1, fachlich #4.)

   Er steht mitten im Fließtext einer `p.klein.sekundaer`: „Dieser Termin ist
   verschoben auf [Do 10.09. 14:00 Uhr]." Mit `.knopf.klein.reihe` war er
   GRÖSSER als der Satz, in dem er steht (eigene `font-size`), riss die
   Zeilenhöhe auf Knopfhöhe auf und schob durch seine 6 px Rechts-Marge den
   Punkt dahinter sichtbar ab. Im ganzen Haus steht sonst kein `.knopf`
   innerhalb eines `<p>`.

   Diese Bauform erbt deshalb ALLES vom Satz — Schriftfamilie, Größe, Gewicht,
   Zeilenhöhe und Farbe — und markiert sich allein durch die Unterstreichung.
   Keine Fläche, kein Rand, keine Marge: Der Punkt sitzt direkt dahinter, wie
   hinter einem Wort.

   NA2/2 — DIE TIPPFLÄCHE LIEGT IN EINEM PSEUDO-ELEMENT, NICHT IM INNENABSTAND.
   (Lenses R2, technik: „display: inline auf ein <button>".)

   Hier stand `padding: 8px 0` mit der Begründung, der Innenabstand rechne bei
   `display: inline` nicht in die Zeilenbox. Das gilt für ein echtes
   Inline-Element (span, a) — NICHT für ein Formularelement: Ein `<button>` ist
   eine ATOMARE Inline-Box, Blink und WebKit heben `display: inline` daran auf
   `inline-block`, und damit geht die Randbox samt Innenabstand sehr wohl in
   die Zeilenbox ein. Gemessen in headless Chrome bei 390 px (Werte im
   Bericht, Abschnitt NA2): `display` löst an diesem Knopf wirklich auf
   `inline-block` auf, und mit dem alten `padding: 8px 0` stand der Absatz mit
   Sprungknopf 16 px höher als derselbe Absatz ohne.

   Jetzt trägt der Knopf `padding: 0` und ein `::before`, das 11 px nach oben
   und unten über ihn hinausragt. Ein absolut positioniertes Pseudo-Element
   liegt außerhalb des Zeilenfluss-Modells: Es vergrößert die Trefferfläche auf
   40,84 px (18,84 px Knopfhöhe plus 2 × 11 px), ohne die Zeilenbox
   anzufassen. Gemessen in derselben Sitzung: Der Absatz mit Sprungknopf ist
   exakt so hoch wie derselbe Absatz ohne — 56,53 px gegen 56,53 px.

   `transform` beim Tippen wird abgeschaltet: `.knopf:not(:disabled):active`
   (oben) setzt `scale(.985)`, und auf einer atomaren Inline-Box wirkt das —
   der Verweis zuckte mitten im Satz. */
.knopf.verweis {
  display: inline; position: relative; width: auto; min-height: 0;
  background: none; border: none; border-radius: 0; box-shadow: none;
  font: inherit; color: inherit; line-height: inherit; text-align: inherit;
  letter-spacing: inherit;
  text-decoration: underline; text-underline-offset: 2px;
  margin: 0; padding: 0; cursor: pointer;
}
.knopf.verweis::before { content: ''; position: absolute; inset: -11px 0; }
.knopf.verweis:not(:disabled):active { transform: none; }
.knopf.verweis:disabled { opacity: .45; cursor: not-allowed; text-decoration: none; }

/* Die Karte, auf die der Sprung geführt hat, hebt sich kurz hervor — 1,5
   Sekunden, dieselbe Zahl wie `HERVOR_MS` in app.js. Sie ist eine
   ORIENTIERUNGSHILFE und kein Zustand: Danach sieht die Karte wieder aus wie
   jede andere, und nichts an ihr hat sich geändert.

   DER UMRISS UND NICHT DIE FLÄCHE: Eine eingefärbte Karte läse sich wie eine
   Warnung, und der Text darin verlöre seinen Kontrast. Der Umriss sagt „hier",
   ohne etwas zu behaupten.

   `outline` UND NICHT `border`: Ein Rahmen verschöbe das Innere der Karte um
   zwei Pixel, und beim Ausblenden ruckte die ganze Liste zurück. Ein Umriss
   liegt außerhalb des Kastenmodells und bewegt nichts.

   NA1/10 UND NA2/3 — ER TRÄGT EINEN EIGENEN TON, UND DIESMAL WIRKLICH.
   (Lenses R1 technik #3, Lenses R2 technik.) Zuerst stand hier
   `2px solid var(--linie-fokus)` — Deklaration für Deklaration dieselbe Regel
   wie der globale `:focus-visible`-Ring. NA1 hat daraus `--aktion-flaeche`
   gemacht; beide Tokens lösen aber auf `--ton-grau-900` (#111827) auf, es gab
   keinen zweiten `:root`-Block und keinen Dark-Zweig, der einen von beiden
   umdefiniert. Der Unterschied war ein Pixel Abstand, und der Kommentar
   behauptete trotzdem einen eigenen Ton — dieselbe Sorte Dokumentation, die
   NA1 im 025-Kopfblock gerade beseitigt hatte.

   `--hervor-linie` (oben im Tokenblock) ist deshalb ein eigener Token mit
   einem eigenen WERT: #f59e0b, das Bernstein von `.knopf.folge`. Wer nach dem
   Sprung mit Tab weitergeht, sieht auf derselben Karte zwei verschiedene
   Umrisse — bernsteinfarben heißt „hierhin bin ich gesprungen", schwarz heißt
   „das hat gerade den Fokus". Die 3 px Abstand setzen sie zusätzlich räumlich
   auseinander, falls beide gleichzeitig liegen.

   UNGEMESSEN IM PRÜFSTAND: Die DOM-Nachbildung rechnet keine Kaskade an.
   Gemessen wird in `test/62`, DASS die Klasse gesetzt und ihre Uhr bestellt
   wird; dass die beiden Töne wirklich verschieden sind, ist in NA2 einmal in
   headless Chrome nachgerechnet (Werte im Bericht). */
.karte.hervor {
  outline: 2px solid var(--hervor-linie);
  outline-offset: 3px;
  transition: outline-color .2s ease-out;
}
@media (prefers-reduced-motion: reduce) {
  .karte.hervor { transition: none; }
}

/* ===========================================================================
   T (15.09.2026) — DER HINWEIS-KASTEN DES CHECK-INS IST EIN VERWEIS
   ===========================================================================

   Timm: „den YouTube-Link auf der ‚Wie geht es dir?'-Seite anklickbar machen."
   Aus `<div class="karte leise">` ist `<a class="karte leise">` geworden. Am
   Aussehen soll sich dadurch NICHTS ändern — sonst stünde plötzlich ein
   blauer, unterstrichener Absatz mitten im Check-in, und der Kasten sähe aus
   wie ein Fehler statt wie das Angebot, das er ist.

   Drei Regeln, mehr braucht es nicht:

     * `display: block` — ein `<a>` ist von Haus aus inline. Ohne diese Zeile
       griffen `padding`, `margin-bottom` und die Rundung der `.karte` gar
       nicht, und der Kasten fiele in sich zusammen.
     * `color: inherit` und `text-decoration: none` — die Schriftfarbe und der
       fehlende Unterstrich der Karte, nicht die Linkfarbe des Browsers. Der
       Text darin ist unverändert der von vorher.
     * `b::after { content: ' ↗' }` — der Pfeil sagt, dass der Tipp den Schirm
       verlässt. Er steht in der CSS und nicht im Text, weil er reine Optik
       ist: Ein Vorleser soll den Titel des Videos hören und nicht „Pfeil nach
       oben rechts", und der Prüfstand (der kein CSS rechnet) misst deshalb
       genau den Wortlaut und nichts daneben.

   Die Regel ist bewusst auf `a.karte.leise` verschraubt und nicht auf
   `a.karte`: Der leise Kasten ist heute der einzige Karten-Verweis dieses
   Hauses. Kommt einmal ein farbiger dazu, soll er seine eigene Zeile
   bekommen und nicht stillschweigend diese erben.

   UNGEMESSEN IM PRÜFSTAND: Die DOM-Nachbildung kennt keine Kaskade und kein
   `::after`. Gemessen wird in `test/66` die STRUKTUR (Marke `a`, Klassen,
   `href`, `target`, `rel`); dass der Kasten danach aussieht wie vorher, ist
   eine Aussage über die Optik und steht hier ehrlich als N/A. */
a.karte.leise { display: block; color: inherit; text-decoration: none; }
a.karte.leise b::after { content: ' ↗'; }

/* Mobile Kundenarbeit. Die Navigationshöhe reserviert ihren Platz auch für
   Toast, Fehlerknopf und Rechtsfuß; kein Bedienelement liegt dahinter. */
body[data-rolle="setter"] {
  --flaeche-grund: var(--ton-sales-grund);
  --grund: var(--ton-sales-grund);
  --text-stark: var(--ton-sales-tanne);
  --text: var(--ton-sales-tanne);
  --aktion-flaeche: var(--ton-sales-aktion);
  --aktion-tipp: var(--ton-sales-tanne);
  --aktion-druck: var(--ton-sales-tanne);
  --dunkel: var(--ton-sales-aktion);
  --linie: var(--ton-sales-linie);
  --rand: var(--ton-sales-linie);
  --griff-klein: 44px;
  --setter-navi-hoehe: 76px;
}
body[data-rolle="setter"] #buehne {
  /* Der Rechtsfuß reserviert den Navigationsraum bereits. Kein zweiter
     halber Bildschirm Leerraum zwischen letzter Karte und Footer. */
  padding-bottom: 24px;
}
body[data-rolle="setter"] .fuss {
  padding-bottom: calc(var(--setter-navi-hoehe) + 20px + env(safe-area-inset-bottom));
}
body[data-rolle="setter"] .fuss a { display: inline-flex; align-items: center; min-height: 44px; }
body[data-rolle="setter"] .wanze {
  bottom: calc(var(--setter-navi-hoehe) + 12px + env(safe-area-inset-bottom));
}
body[data-rolle="setter"] #toast {
  bottom: calc(var(--setter-navi-hoehe) + 16px + env(safe-area-inset-bottom));
  max-width: min(calc(100vw - 124px), 480px);
}
.setter-navi-shell {
  /* Oberkante als Anker, CSS bestimmt die dynamische Höhe. Kein innerer
     Scroller und keine nachlaufende JS-Korrektur. Physische Safari-Abnahme
     steht noch aus; diese Variante ist kein belegter Fix des iPhone-Befunds. */
  position: fixed; z-index: var(--e-band); top: 0; left: 0; right: 0;
  height: 100vh; height: 100dvh;
  display: flex; flex-direction: column; justify-content: flex-end; align-items: center;
  pointer-events: none;
}
.setter-navi-shell:empty { display: none; }
.setter-navi {
  flex: none; width: 100%; max-width: 720px; pointer-events: auto;
  display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 6px;
  padding: 6px max(12px, env(safe-area-inset-right)) calc(6px + env(safe-area-inset-bottom)) max(12px, env(safe-area-inset-left));
  background: var(--ton-sales-tanne); border-radius: 20px 20px 0 0;
  box-shadow: var(--schatten-schwebend);
}
.setter-navi button {
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: 3px; min-height: 64px; min-width: 44px; padding: 6px;
  border: 0; border-radius: 14px; font: inherit; font-size: var(--gr-s);
  font-weight: var(--stark); color: var(--ton-weiss); background: transparent; cursor: pointer;
}
.setter-navi button > span:first-child { font-size: 23px; line-height: 1; }
.setter-navi button[aria-current="page"] { background: var(--ton-sales-akzent); color: var(--ton-sales-tanne); }
.setter-navi button:focus-visible { outline: 2px solid var(--ton-sales-akzent); outline-offset: 1px; }
.kunden-filter { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; margin-bottom: 20px; }
.kunden-filter .chip { min-height: 48px; border-radius: var(--r-pille); }
.mobile-suche .knopf { min-height: 48px; }
.kunden-suchfeld { position: relative; min-width: 0; }
.kunden-suchfeld .eingabe { padding-right: 50px; }
.kunden-suchfeld input::-webkit-search-cancel-button { -webkit-appearance: none; }
.kunden-suche-leeren {
  position: absolute; right: 2px; top: 50%; transform: translateY(-50%);
  display: grid; place-items: center; width: 44px; height: 44px; padding: 0;
  border: 0; border-radius: 50%; background: transparent; color: var(--meldung-neutral-schrift);
  font: inherit; font-size: 24px; line-height: 1; cursor: pointer;
}
.kunden-suche-leeren[hidden] { display: none; }
.kunden-suche-leeren:active { background: var(--meldung-neutral-flaeche); }
.kunden-suche-leeren:focus-visible { outline: 2px solid var(--linie-fokus); outline-offset: -3px; }
.kunden-zeile { padding: 16px; border-radius: 20px; }
.kunden-oeffnen {
  display: flex; flex-direction: column; align-items: flex-start; gap: 10px;
  width: 100%; min-height: 100px; border: 0; padding: 0 0 14px; text-align: left;
  font: inherit; color: inherit; background: transparent; cursor: pointer;
}
.kunden-oeffnen:focus-visible { outline: 2px solid var(--linie-fokus); outline-offset: 4px; }
.kunden-oeffnen > * { max-width: 100%; overflow-wrap: anywhere; }
.kunden-zeile__kopf { display: flex; align-items: baseline; justify-content: space-between; gap: 16px; width: 100%; }
.kunden-zeile__kopf b { font-size: 19px; line-height: 1.3; }
.kunden-zeile__kopf > span { font-size: 28px; }
.kunden-zeile > .knopf { margin-bottom: 0; }
.kunden-status {
  display: inline-flex; align-items: center; padding: 6px 12px; border-radius: var(--r-pille);
  font-size: var(--gr-s); font-weight: var(--stark); color: var(--meldung-neutral-schrift);
  background: var(--meldung-neutral-flaeche); line-height: 1.35; max-width: 100%; overflow-wrap: anywhere;
}
.kunden-status.kunden-status--beendet { color: var(--absage-chip-schrift); background: var(--absage-chip); }
.kunden-status.kunden-status--termin { color: var(--termin-chip-schrift); background: var(--termin-chip); }
.kunde-kopf > .kunden-status { margin-bottom: 14px; }
.kunde-kopf > h1 { margin-bottom: 10px; }
.kunde-kopf > #kunde-naechster-schritt { margin: 16px 0; font-weight: 500; }
#kunde-aktionen, #slot-tag-titel {
  scroll-margin-top: calc(16px + env(safe-area-inset-top));
  scroll-margin-bottom: calc(var(--setter-navi-hoehe) + 16px + env(safe-area-inset-bottom));
}
#kunde-aktionen:focus-visible { outline: 2px solid var(--linie-fokus); outline-offset: 3px; }
.buchungsmitteilung {
  margin-top: 10px; padding: 14px; border: 1px solid var(--linie);
  border-radius: 14px; background: var(--flaeche-leise);
}
.buchungsmitteilung .knopf { margin-bottom: 8px; }
.buchungsmitteilung > :last-child { margin-bottom: 0; }
.bearbeitung-bestaetigt > .pille { margin-bottom: 12px; }
.bearbeitung-bestaetigt #kunde-naechster-hinweis { margin-top: 12px; }
#kopf #kunde-bilanz {
  width: auto; min-height: 44px; margin: 0; padding: 8px 12px;
  font-size: var(--gr-s); border-radius: 12px;
}
.kunde-aktionsgruppe { border-top: 1px solid var(--linie); margin-top: 16px; padding-top: 4px; }
.kunde-aktionsgruppe > summary { min-height: 48px; padding: 14px 0; font-weight: var(--stark); cursor: pointer; }
.kunde-aktionsgruppe > summary:focus-visible { outline: 2px solid var(--linie-fokus); outline-offset: 2px; border-radius: 6px; }
.kunde-aktionsgruppe > :last-child { margin-bottom: 4px; }
.kunde-verlauf > summary { min-height: 48px; padding: 8px 0; font-weight: var(--stark); cursor: pointer; }
.kunde-verlauf > summary:focus-visible { outline: 2px solid var(--linie-fokus); outline-offset: 2px; border-radius: 6px; }
.verlauf-inhalt { margin-top: 12px; }
.verlauf-liste { display: grid; gap: 12px; margin: 0; padding-left: 22px; }
.verlauf-liste li { padding-left: 4px; }
.verlauf-liste li > b, .verlauf-liste li > span, .verlauf-liste li > small { display: block; }
.verlauf-liste li > span, .verlauf-liste li > small { margin-top: 3px; color: var(--text-mittel); }
.kunde-website a { display: inline-flex; align-items: center; min-height: 44px; max-width: 100%; overflow-wrap: anywhere; }
.kunde-planung-zeile + .kunde-planung-zeile { border-top: 1px solid var(--linie); padding-top: 12px; }
.kunde-kontaktwege { display: grid; gap: 8px; grid-template-columns: repeat(2, minmax(0, 1fr)); }
.kunde-kontaktwege .knopf { text-align: center; align-items: center; padding-inline: 8px; }
.nummer-vorbereitung {
  margin-block: 16px; padding: 16px; background: var(--flaeche-leise);
  border: 1px solid var(--linie); border-radius: 14px;
}
.nummer-vorbereitung > h3 { margin-top: 0; }
.nummer-vorbereitung > :last-child { margin-bottom: 0; }
body[data-schirm="setter/kunde"] .paarliste a {
  display: inline-flex; align-items: center; min-height: 44px; min-width: 44px;
  max-width: 100%; overflow-wrap: anywhere; color: var(--text-mittel);
  text-decoration: underline; text-underline-offset: 2px;
}
.knopf[data-abschlussgrund][aria-pressed="true"], .knopf[data-buchungskanal][aria-pressed="true"] {
  background: var(--ton-sales-akzent); color: var(--ton-sales-tanne); border-color: var(--ton-sales-aktion);
}
.buchung-zeit { display: grid; gap: 8px; padding: 16px; margin-block: 16px 24px; background: var(--flaeche-leise); border: 1px solid var(--linie); border-radius: 14px; }
.buchung-zeit > b { font-size: var(--gr-l); }
.buchung-zeit > p { margin: 0; font-size: var(--gr-m); }
.buchung-kanaele { display: grid; gap: 8px; }
.buchung-kanaele .knopf { min-height: 48px; margin: 0; }
#kalender-auswahl:not(:empty), #closer-slot-auswahl:not(:empty) { padding: 12px 0; font-weight: var(--stark); }
.kalender-konflikt:not(:empty), #kunde-fehler:not(:empty) {
  background: var(--meldung-warnung-flaeche); color: var(--meldung-warnung-schrift);
  padding: 12px; border-radius: 12px; margin: 12px 0;
}
@media (min-width: 900px) {
  body[data-schirm="setter/kunden"] #buehne { max-width: 1000px; }
  #kunden-liste { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; align-items: start; }
  #kunden-liste > .kunden-zeile { margin-bottom: 0; }
  .setter-navi { max-width: 640px; }
}

/* Closer: Terminübersicht, Kundendetail und Planung teilen denselben Rahmen. */
body[data-rolle="closer"] {
  --flaeche-grund: var(--ton-sales-grund); --grund: var(--ton-sales-grund);
  --text-stark: var(--ton-sales-tanne); --text: var(--ton-sales-tanne);
  --aktion-flaeche: var(--ton-sales-aktion); --dunkel: var(--ton-sales-aktion);
  --aktion-tipp: var(--ton-sales-tanne); --aktion-druck: var(--ton-sales-tanne);
  --linie: var(--ton-sales-linie); --rand: var(--ton-sales-linie);
  --griff-klein: 44px; --closer-navi-hoehe: 76px;
}
body[data-rolle="closer"] #buehne { max-width: 840px; padding-bottom: 24px; }
body[data-rolle="closer"] .kopf.app { position: static; margin-bottom: 24px; background: transparent; border: 0; padding-inline: 0; }
body[data-rolle="closer"] .kopf.app h1 { font-size: 22px; white-space: normal; }
body[data-rolle="closer"] .karte { border-radius: 22px; padding: 22px; box-shadow: none; }
body[data-rolle="closer"] .knopf { min-height: 48px; border-radius: 14px; }
body[data-rolle="closer"] .chip { min-height: 44px; }
body[data-rolle="closer"] .eingabe { min-height: 48px; border-radius: 12px; font-size: 16px; }
body[data-rolle="closer"] .fuss { padding-bottom: calc(var(--closer-navi-hoehe) + 24px + env(safe-area-inset-bottom)); }
body[data-rolle="closer"] .fuss a { display: inline-flex; align-items: center; min-height: 44px; }
body[data-rolle="closer"] .wanze { bottom: calc(var(--closer-navi-hoehe) + 12px + env(safe-area-inset-bottom)); }
body[data-rolle="closer"] #toast { bottom: calc(var(--closer-navi-hoehe) + 16px + env(safe-area-inset-bottom)); max-width: min(calc(100vw - 124px), 520px); }
.closer-navi {
  flex: none; width: 100%; max-width: 620px; pointer-events: auto;
  display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 6px;
  padding: 6px max(12px, env(safe-area-inset-right)) calc(6px + env(safe-area-inset-bottom)) max(12px, env(safe-area-inset-left));
  background: var(--ton-sales-tanne); border-radius: 20px 20px 0 0; box-shadow: var(--schatten-schwebend);
}
.closer-navi button {
  display: flex; align-items: center; justify-content: center; gap: 10px;
  min-height: 64px; border: 0; border-radius: 14px; padding: 10px;
  color: var(--ton-weiss); background: transparent; font: inherit; font-weight: 600; font-size: 14px; cursor: pointer;
}
.closer-navi button > span:first-child { font-size: 24px; }
.closer-navi button[aria-current="page"] { background: var(--ton-sales-akzent); color: var(--ton-sales-tanne); }
.closer-navi button:focus-visible { outline: 2px solid var(--ton-sales-akzent); outline-offset: 1px; }
.closer-oberzeile { display: block; font-size: 13px; font-weight: 600; color: var(--text-mittel); line-height: 1.5; }
.closer-uebersicht-kopf { margin: 12px 0 26px; }
.closer-uebersicht-kopf h2 { font-size: clamp(28px, 5vw, 38px); line-height: 1.15; letter-spacing: -.04em; margin: 12px 0; }
.closer-uebersicht-kopf p:last-child { margin: 0; font-size: 14px; color: var(--text-mittel); }
body[data-rolle="closer"] #closerreiter {
  position: static; display: grid; grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 5px; padding: 5px; border: 1px solid var(--linie); border-radius: 18px; background: var(--flaeche-karte); margin-bottom: 20px;
}
body[data-rolle="closer"] #closerreiter .chip { min-width: 0; min-height: 58px; padding: 8px 5px; border: 0; border-radius: 13px; font-size: 12px; line-height: 1.4; white-space: normal; }
body[data-rolle="closer"] #closerreiter .chip[aria-selected="true"] { color: var(--ton-weiss); background: var(--ton-sales-aktion); }
body[data-rolle="closer"] #closerfilter { gap: 6px; margin-bottom: 12px; }
body[data-rolle="closer"] #closerfilter .chip { flex: 1 0 auto; padding: 8px 12px; border-radius: 12px; font-size: 12px; }
.closer-tage { display: grid; gap: 22px; }
.closer-tag { min-width: 0; }
.closer-tag > h3 { display: flex; justify-content: space-between; align-items: baseline; gap: 12px; margin: 0 2px 10px; font-size: 15px; }
.closer-tag > h3 > span { font-size: 12px; font-weight: 400; color: var(--text-mittel); }
.closer-terminzeile { margin-bottom: 8px; border: 1px solid var(--linie); border-radius: 18px; background: var(--flaeche-karte); overflow: hidden; }
.closer-termin-oeffnen { display: grid; grid-template-columns: 57px minmax(0, 1fr) 16px; align-items: center; gap: 12px; width: 100%; min-height: 102px; padding: 17px 15px; border: 0; background: transparent; color: inherit; font: inherit; text-align: left; cursor: pointer; }
.closer-termin-oeffnen:focus-visible { outline: 2px solid var(--linie-fokus); outline-offset: -4px; }
.closer-termin-oeffnen:active { background: var(--flaeche-leise); }
.closer-terminzeit, .closer-termininhalt { display: flex; flex-direction: column; min-width: 0; gap: 5px; }
.closer-terminzeit b { font-size: 18px; letter-spacing: -.03em; font-variant-numeric: tabular-nums; }
.closer-terminzeit small { font-size: 11px; color: var(--text-mittel); }
.closer-termininhalt b { font-size: 16px; line-height: 1.3; overflow-wrap: anywhere; }
.closer-termininhalt > span { font-size: 12px; color: var(--text-mittel); overflow-wrap: anywhere; }
.closer-termininhalt .closer-terminstatus { color: var(--ton-sales-aktion); font-weight: 500; }
.closer-termininhalt .closer-abschluss-tag { width: max-content; font-size: 11px; line-height: 1.35; }
.closer-terminpfeil { font-size: 25px; color: var(--text-mittel); }
.closer-quicklinks { display: grid; gap: 8px; margin-top: 24px; }
.closer-quicklinks .knopf { margin: 0; }
body[data-rolle="closer"] .closer-zurueck { margin: -8px 0 18px; min-height: 44px; padding: 8px 0; width: auto; border: 0; text-align: left; }
.closer-detail-kopf h2 { font-size: 28px; line-height: 1.18; letter-spacing: -.035em; overflow-wrap: anywhere; }
.closer-detail-kopf .pille { margin-top: 10px; }
.closer-detail-kopf .aufhaenger { margin-block: 16px; }
body[data-rolle="closer"] .kontakt-closer { border: 0; padding: 0; margin: 0; }
body[data-rolle="closer"] .kontakt-closer__label { font-size: 18px; }
.closer-detail-kontakt:empty { display: none; }
.closer-detail-kontakt .paarliste a { display: inline-flex; align-items: center; min-height: 44px; overflow-wrap: anywhere; }
.closer-detail-ergebnis > h2, .closer-detail .notizen-block > h2 { font-size: 18px; margin-top: 0; }
.closer-detail-ergebnis .knopf { width: 100%; margin-top: 8px; }
.closer-detail-ergebnis .knopf.verweis { width: auto; }
.closer-detail-ergebnis > p:empty { display: none; }
.closer-detail details > summary {
  cursor: pointer; min-height: 44px; padding-block: 12px; font-weight: var(--stark);
}
.closer-detail details > summary:focus-visible { outline: 2px solid var(--linie-fokus); outline-offset: 3px; border-radius: 6px; }
.closer-verlauf { margin-top: 12px; border-top: 1px solid var(--linie); }
.closer-form-zurueck { width: auto; min-height: 44px; margin: 0 0 12px; }
.closer-form-kontext { margin-bottom: 20px; }
.closer-form-kontext h2 { font-size: 23px; line-height: 1.2; margin: 0 0 6px; }
.closer-form-kontext p { font-size: var(--gr-s); color: var(--text-mittel); margin: 0; }
.closer-auswahl { display: grid; gap: 10px; margin-block: 16px; }
.closer-auswahl .knopf { margin: 0; min-height: 52px; }
.closer-auswahl .knopf[aria-pressed="true"] { background: var(--ton-sales-akzent); border-color: var(--ton-sales-aktion); color: var(--ton-sales-tanne); }
#closer-entscheidung-fehler:not(:empty) { margin-block: 14px; padding: 12px; border-radius: 12px; background: var(--meldung-warnung-flaeche); color: var(--meldung-warnung-schrift); }
body[data-schirm="closer/abschluss"] .produktkarte { padding: 12px; margin-top: 10px; border-radius: 14px; }
body[data-schirm="closer/abschluss"] .produktkarte__titel { font-size: 17px; }
body[data-schirm="closer/abschluss"] .produktzeile__preis { font-size: var(--gr-s); margin-bottom: 8px; }
body[data-schirm="closer/abschluss"] .produktwahl { min-height: 44px; margin-bottom: 4px; }
.closer-summe { display: flex; justify-content: space-between; gap: 16px; align-items: baseline; }
.closer-summe b { font-size: 25px; }
/* Gemeinsame Verwaltung: Navigation vor den unveränderten Fachmodulen. */
#verwaltung-shell { min-width: 0; }
#verwaltung-shell #verwaltung-navigation {
  display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 7px;
  padding: 8px; margin: 0 0 18px; border: 1px solid var(--linie);
  border-radius: 18px; background: var(--flaeche-karte);
}
#verwaltung-shell .verwaltung-gruppe {
  min-height: 48px; padding: 10px 12px; border: 0; border-radius: 11px;
  background: transparent; color: var(--text-mittel); font: inherit;
  font-size: 14px; font-weight: 600; text-align: left; cursor: pointer;
}
#verwaltung-shell .verwaltung-gruppe[aria-current="page"] {
  color: var(--ton-weiss); background: var(--ton-sales-aktion);
}
#verwaltung-shell .verwaltung-gruppe:active { opacity: .82; }
#verwaltung-shell .verwaltung-gruppe:focus-visible {
  outline: 2px solid var(--linie-fokus); outline-offset: 2px;
}
#verwaltung-shell #verwaltung-module .reiter {
  position: static; margin: 0 0 20px; padding: 0 0 6px; border: 0;
  background: transparent; gap: 8px;
}
#verwaltung-shell #verwaltung-module .reiter__knopf {
  min-height: 44px; border-radius: 12px; padding: 10px 14px;
}
#verwaltung-shell [data-verwaltung-badge]:empty { display: none; }
#verwaltung-shell #bereich { min-width: 0; }
@media (min-width: 760px) {
  #verwaltung-shell #verwaltung-navigation { display: flex; flex-wrap: wrap; }
  #verwaltung-shell .verwaltung-gruppe { flex: 1 1 auto; text-align: center; }
}
body[data-rolle="closer"] .arbeitstag { border: 1px solid var(--linie); border-radius: 16px; padding: 16px; margin-top: 12px; }
.closer-faltbereich > summary { display: flex; justify-content: space-between; gap: 16px; align-items: center; min-height: 48px; cursor: pointer; font-size: 18px; font-weight: 600; list-style: none; }
.closer-faltbereich > summary::-webkit-details-marker { display: none; }
.closer-faltbereich > summary::after { content: '+'; font-size: 24px; font-weight: 400; }
.closer-faltbereich[open] > summary::after { content: '−'; }
.closer-faltbereich > summary:focus-visible { outline: 2px solid var(--linie-fokus); outline-offset: 4px; }
.closer-verfuegbarkeit-kopf h2 { font-size: 28px; letter-spacing: -.035em; }
.verfuegbarkeit-kalender { overflow: hidden; }
.verfuegbarkeit-kalender__kopf { display: flex; align-items: end; justify-content: space-between; gap: 18px; }
.verfuegbarkeit-kalender__kopf h2, .verfuegbarkeit-plan h2 { margin: 2px 0 4px; }
.verfuegbarkeit-kalender__kopf p { margin-bottom: 0; }
.verfuegbarkeit-kalender__nav { display: flex; gap: 8px; flex: 0 0 auto; }
.verfuegbarkeit-kalender__nav .knopf { margin: 0; }
.verfuegbarkeit-wochentage, .verfuegbarkeit-tage {
  display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); gap: 6px;
}
.verfuegbarkeit-wochentage { margin-top: 22px; color: var(--text-leise); font-size: 12px; font-weight: 700; text-align: center; }
.verfuegbarkeit-tage { margin-top: 7px; }
.verfuegbarkeit-tag {
  position: relative; display: grid; place-items: center; align-content: center; gap: 1px;
  min-width: 0; min-height: 64px; padding: 7px 3px; border: 1px solid var(--linie);
  border-radius: 12px; background: var(--flaeche-karte); color: var(--text-stark);
  font: inherit; cursor: pointer;
}
.verfuegbarkeit-tag > span { font-weight: 700; line-height: 1; }
.verfuegbarkeit-tag > small { max-width: 100%; color: var(--text-leise); font-size: 10px; overflow: hidden; }
.verfuegbarkeit-tag > i { width: 18px; height: 4px; margin-top: 4px; border-radius: 999px; background: var(--ton-grau-200); }
.verfuegbarkeit-tag[data-hat-angebot="ja"] > i { background: var(--ton-gruen-600); }
.verfuegbarkeit-tag[data-hat-belegung="ja"] { box-shadow: inset 0 -3px 0 var(--ton-gelb-500); }
.verfuegbarkeit-tag[data-hat-ausnahme="ja"] { border-style: dashed; }
.verfuegbarkeit-tag[aria-pressed="true"] {
  color: var(--ton-weiss); background: var(--ton-sales-aktion); border-color: var(--ton-sales-aktion);
  box-shadow: none;
}
.verfuegbarkeit-tag[aria-pressed="true"] small { color: var(--ton-weiss-leise); }
.verfuegbarkeit-tag:focus-visible { outline: 3px solid var(--linie-fokus); outline-offset: 2px; }
.verfuegbarkeit-legende { display: flex; flex-wrap: wrap; gap: 8px 16px; margin-top: 12px; color: var(--text-mittel); font-size: 13px; }
.verfuegbarkeit-legende span { display: inline-flex; gap: 6px; align-items: center; }
.verfuegbarkeit-legende i { width: 10px; height: 10px; border-radius: 50%; background: var(--ton-grau-300); }
.verfuegbarkeit-legende i.frei { background: var(--ton-gruen-600); }
.verfuegbarkeit-legende i.belegt { background: var(--ton-gelb-500); }
.verfuegbarkeit-legende i.ausgelassen { background: var(--ton-grau-400); border: 2px dashed var(--ton-grau-700); }
.verfuegbarkeit-tagdetail { margin-top: 20px; padding-top: 18px; border-top: 1px solid var(--linie); }
.verfuegbarkeit-tagdetail:focus-visible { outline: 2px solid var(--linie-fokus); outline-offset: 4px; border-radius: 8px; }
.verfuegbarkeit-tagdetail > h3 { margin: 0 0 12px; font-size: 19px; }
.verfuegbarkeit-zeiten { display: grid; gap: 9px; }
.verfuegbarkeit-zeit { padding: 13px; border: 1px solid var(--linie); border-radius: 13px; background: var(--flaeche-leise); }
.verfuegbarkeit-zeit__kopf { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
.verfuegbarkeit-zeit p { margin: 7px 0 0; }
.verfuegbarkeit-zeit .knopf { width: 100%; margin: 11px 0 0; }
.verfuegbarkeit-quellen { display: flex; flex-wrap: wrap; gap: 7px; margin: 14px 0 18px; }
.verfuegbarkeit-quellen span { padding: 5px 9px; border-radius: 999px; background: var(--meldung-neutral-flaeche); color: var(--meldung-neutral-schrift); font-size: 12px; font-weight: 650; }
.verfuegbarkeit-regel { display: flex; justify-content: space-between; align-items: center; gap: 14px; padding: 12px 0; border-top: 1px solid var(--linie); }
.verfuegbarkeit-regel p { display: grid; gap: 2px; margin: 0; }
.verfuegbarkeit-regel p span { color: var(--text-mittel); font-size: 13px; }
.verfuegbarkeit-regel > div { display: flex; gap: 7px; flex: 0 0 auto; }
.verfuegbarkeit-regel .knopf { margin: 0; }
.verfuegbarkeit-start-art { display: grid; gap: 7px; margin: 16px 0; padding: 0; border: 0; }
.verfuegbarkeit-start-art legend { margin-bottom: 7px; font-weight: 700; }
#verfuegbarkeit-start-hinweis:not(:empty), #verfuegbarkeit-plan-hinweis:not(.verborgen),
#verfuegbarkeit-tag-hinweis:not(.verborgen) { margin: 12px 0; padding: 11px 12px; border-radius: 10px; }
#verfuegbarkeit-start-hinweis:not(:empty):not(.hinweis--warnung) { background: var(--meldung-info-flaeche); color: var(--meldung-info-schrift); }
@media (max-width: 640px) {
  .verfuegbarkeit-kalender__kopf { align-items: stretch; flex-direction: column; }
  .verfuegbarkeit-kalender__nav { display: grid; grid-template-columns: 1fr 1fr; }
  .verfuegbarkeit-kalender__nav .knopf { width: 100%; }
  .verfuegbarkeit-wochentage, .verfuegbarkeit-tage { gap: 4px; }
  .verfuegbarkeit-tag { min-height: 58px; border-radius: 10px; }
  .verfuegbarkeit-regel { align-items: stretch; flex-direction: column; }
  .verfuegbarkeit-regel > div { display: grid; grid-template-columns: 1fr 1fr; }
  .verfuegbarkeit-zeit__kopf { align-items: flex-start; flex-direction: column; gap: 7px; }
}
@media (min-width: 900px) {
  body[data-rolle="closer"] #buehne { padding-inline: 32px; }
  .closer-detail { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 16px; align-items: start; }
  .closer-detail > .karte { margin: 0; }
  .closer-detail-kopf { grid-column: 1 / -1; }
  .closer-detail-kontakt { grid-column: 1; grid-row: 2; }
  .closer-detail-ergebnis { grid-column: 2; grid-row: 2 / 4; }
  .closer-detail .notizen-block { grid-column: 1; }
  .closer-quicklinks { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
