/* Simulation = Mechanik-/Vorbereitungsmaterial, KEIN Nutzer-/Marktbeleg.
 *
 * Einrichtungsfrontend — Gestaltung (Großlauf GL-08: Design B „Morgenlicht", eine Schrift, nur Hell).
 *
 * REFERENZ (Runbook app-design-prinzipien §9.1, Referenz-Pflicht):
 *   Anker ist customer-cockpit/styles.css aus diesem Repo (die abgenommene Kunden-Oberfläche).
 *   ÜBERNOMMEN: die Rollennamen der Tokenpalette (Werte stehen nur in `marke.css`), die Abstands-/Text-/Radius-Skala, die
 *     Schaltflächen-Grammatik (primary/secondary/quiet), `status-chip[data-tone]`, die ruhige
 *     Kontextzeile über der Überschrift (in der einen Schrift), 44px Mindest-Trefferfläche, `:focus-visible` mit 3px
 *     Aussenring, die `prefers-reduced-motion`-Klausel und der Sprunglink.
 *   GEÄNDERT: kein Shell-Raster mit Seitennavigation — das ist ein Cockpit-Muster und hier falsch.
 *     Ein Einrichtungsweg ist linear, deshalb eine einspaltige, zentrierte Bahn mit fester Satzbreite
 *     und einer nummerierten Schrittleiste. Der Sektionsrhythmus wechselt bewusst (Einstieg
 *     grosszügig, Formularschritte kompakt) statt überall dasselbe Polster zu setzen.
 *   NICHT übernommen: Verlaufsflächen, Drei-Karten-Reihen, Milchglaseffekte, eine einzige
 *     Einheitsschrift über alles — die dokumentierten Slop-Tells.
 *
 * Keine Fremdschrift, kein externes Asset: die Auslieferung läuft unter einer strengen CSP
 * (`default-src 'self'`), und eine Lizenzfrage für eine gekaufte Schrift entsteht gar nicht erst.
 *
 * TOKEN STEHEN NICHT MEHR HIER (Welle 12 / W2b, D25 §4.1). Der vollständige `:root`-Block ist
 * nach `public/basis.css` umgezogen — Farbe, Schrift, Abstand, Text, Radius, Maße, dazu die vier
 * dort neuen Gruppen (Höhenordnung, Bewegung, fluide Stufen, dunkler Zwilling). Diese Datei
 * behält ihre Komponentenregeln und setzt die Token nur ein. `basis.css` wird als eigene
 * `<link>`-Zeile VOR dieser Datei geladen (`index.html:8`, EA-D25-01).
 *
 * WARUM STATT DESSEN EINE `<link>`-ZEILE: Der kürzere Weg wäre die Einbinde-Regel am Kopf dieser
 * Datei gewesen — eine Zeile, die alle drei Seiten ohne fremde Änderung erreicht hätte. Probe 35
 * in `produkt-sim/einrichtung/selftest.mjs:906-907` liest genau diese Datei und verlangt, dass
 * diese Regel hier NICHT vorkommt (Schutzriegel gegen externe Quellen). Der Riegel wird nicht
 * gelockert; drei `<link>`-Zeilen sind der billigere Preis.
 * BEACHTEN: die Probe liest die Rohbytes, Kommentare eingeschlossen. Der Name der Regel darf
 * deshalb auch in diesem Text nicht stehen — sonst meldet der Riegel die Erklärung als Verstoß.
 */

* { box-sizing: border-box; }
[hidden] { display: none !important; }

body {
  margin: 0;
  padding-right: env(safe-area-inset-right);
  padding-bottom: env(safe-area-inset-bottom);
  padding-left: env(safe-area-inset-left);
  background: var(--canvas);
  color: var(--ink);
  font-family: var(--sans);
  font-size: var(--text-body);
  line-height: 1.55;
  /* 281b (B-35, Fundament §3): dieselbe Schriftglättung wie auf der Website — die Systemschrift
     zeichnet dann so ruhig wie in einer nativen App. */
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

button, input, textarea, select { font: inherit; color: inherit; }
a { color: var(--action); }
h1, h2, h3, p, ul, ol, dl { margin-top: 0; }
/* Politur-Stufe 1 (P-04, Bericht 166): die bare-`h1`-Regel (36px, per `@media(min-width:48rem)`
   sogar 56px) entfällt ersatzlos — dieselbe Rolle trägt jetzt `.seitentitel h1` (`basis.css`,
   24px/`--tenant-titel`), die eine K-04-Stufe über alle drei Flächen. Jedes `<h1>` dieser Datei
   steht seither in einem `.seitentitel`-Wrapper (index.html). */
h2 { margin-bottom: var(--space-2); font-size: var(--t-lauftext); line-height: 1.4; letter-spacing: -.012em; }
/* 281b (B-35, Fundament §3: „keine Versal-Kicker über Abschnitten“): h3 ist eine Zwischenüberschrift in
   Satzschreibung, nicht mehr ein gedämpftes Versal-Etikett. Datenlabels bleiben bei `.etikett` (basis.css). */
h3 { margin-bottom: var(--space-2); font-size: var(--text-body); font-weight: 650; letter-spacing: -.005em; color: var(--ink); }
p { max-width: 68ch; text-wrap: pretty; }

.skip-link {
  position: fixed; z-index: 30;
  top: max(var(--space-2), env(safe-area-inset-top)); left: max(var(--space-2), env(safe-area-inset-left));
  padding: var(--space-3) var(--space-4);
  background: var(--ink); color: var(--knopf-auf-akzent); border-radius: var(--r-1);
  transform: translateY(-160%);
}
.skip-link:focus { transform: none; }
/* Der Fokusring steht seit W2b GENAU EINMAL, in `basis.css` (D25 §7 Punkt 5, LE-294). Hier stand
   er als zweite von fünf Fassungen; die Regel dort ist wortgleich (3px, Versatz 3px) und liest
   `--fokusring`, damit eine getönte Fläche nur noch den WERT umschreibt. */

/* Ehrlichkeits-Grammatik (Runbook §5): die Grenze steht oben, nicht im Kleingedruckten. */
.grenzleiste {
  margin: 0;
  /* Die Leiste ist ein Band über die volle Breite, kein Fliesstext: sie muss sich dem globalen
     Lesemass `p { max-width: 68ch }` (oben) ausdrücklich entziehen. Ohne diese Zeile endet der
     graue Grund bei 571 von 1280 px und die Ehrlichkeits-Leiste sieht aus wie ein verrutschter
     Kasten (gemessen im Browser, nicht geschätzt). */
  max-width: none;
  padding: calc(var(--space-2) + env(safe-area-inset-top)) var(--space-4) var(--space-2);
  background: var(--surface-strong);
  border-bottom: 1px solid var(--border);
  color: var(--muted);
  text-align: start; /* Nachlauf C (A11 A-3, Punkt 6): mehrzeiliger Text steht linksbündig, nie zentriert */
  font-size: var(--text-caption);
  font-weight: 500; /* 281b: Ruhe statt Fettdruck — die Grenze steht oben, sie muss nicht rufen. */
}

.kopfleiste {
  /* K-01: dieselbe Kopfzeilen-Grammatik wie der Verwaltungsrahmen (`.topbar` in
     `verwaltung.css`). Beide Werte stehen als `--kopf-hoehe` und `--kopf-polster` in `basis.css`;
     aus drei verschiedenen Kopfzeilen wird damit eine (D25 §7 Punkt 4). */
  min-height: var(--kopf-hoehe);
  padding: var(--kopf-polster);
  border-bottom: 1px solid var(--border);
  display: flex; align-items: center; justify-content: space-between; gap: var(--space-4);
}
/* GL-08 (N-02): der Kopf ist nur die Wortmarke des Logos (Morgenzeile), kein Zusatztext. */
.wortmarke { display: inline-flex; align-items: center; flex: 0 0 auto; }
/* Nachlauf C (A11 A-9): bei 375 px schrumpfte die Wortmarke auf „TMA“ und der Kontostatus brach Wort für Wort um. Die Marke behält ihre Breite;
   was nicht daneben passt, rutscht unter sie (die Kopfzeile darf umbrechen, die Chips füllen dann die Zeile). */
.kopfleiste { flex-wrap: wrap; row-gap: var(--space-2); }
.kopf-chips { flex: 1 1 auto; min-width: 0; }
@media (max-width: 30rem) { .kopf-chips .status-chip { flex: 1 1 15rem; } }   /* Handy: der Kontostatus steht in einer Zeile über dem Knopf, nicht zu dritt neben ihm */
.wortmarke-bild { display: block; width: auto; height: 1.5rem; }
/* Politur-Stufe 1 (P-24): zwei Chips rechts in der Kopfzeile (Betriebs-Hinweis + Kontostatus),
   ohne die bestehende `.kopfleiste`-Grammatik (`space-between`, zwei Kinder) zu ändern. */
.kopf-chips { display: flex; align-items: center; gap: var(--space-2); flex-wrap: wrap; justify-content: flex-end; }

main { min-width: 0; }
.bahn { width: min(100%, var(--bahn)); margin: 0 auto; padding-inline: clamp(var(--space-4), 5vw, var(--space-8)); }

/* --- Fortschritt (D24 §5, F-07) -----------------------------------------------------------------
   Die frühere Chip-Reihe ist WEG, samt ihrer Farbregeln. Sie hatte zwei Fehler auf einmal: sie war
   die zweite Fortschrittswahrheit neben „Schritt N von 6" im Fliesstext, und sie unterschied ihre
   Zustände über die Füllung einer Nummernscheibe — also über Farbe. Die Zustände tragen jetzt
   Wörter, und die Anzeige steht in der schwebenden Bodenleiste.

   Die Liste `#schrittleiste` bleibt als Vorlesetext im Dokument (`.nur-vorlesen`, basis.css) und
   braucht deshalb hier KEINE eigene Regel mehr. Leiste, Strich und Zustandswort kommen aus
   `basis.css` (K-11) — diese Datei setzt für den Fortschritt keine einzige Farbe.

   Die Knopfreihe der Leiste ist mit Absicht NICHT `.knopfreihe`: die trägt unter 34rem
   `width: 100%` je Knopf und einen Aussenabstand nach oben. Beides zusammen verdoppelte die Höhe
   der Leiste auf einem Telefon — genau die Stelle, an der sie am wenigsten Platz hat. */
.leiste-knoepfe { display: flex; align-items: center; gap: var(--space-2); flex: 0 0 auto; }
.leiste-knoepfe .knopf { min-height: var(--treffer); padding-block: var(--space-2); white-space: nowrap; }

/* Raum-Regel, präzisiert: `basis.css` rechnet mit der Sollhöhe der Leiste (`--boden-hoehe`). Auf
   320 und 360 px bricht sie aber in zwei Zeilen um, und dann reicht dieser Abstand nicht — gemessen
   als Überlappung mit der Fusszeile (P-D24-11). `--leisten-hoehe` meldet `app.js` aus der
   tatsächlichen Höhe; ohne `ResizeObserver` gilt weiterhin der Sollwert aus dem Fundament. Damit
   gibt es KEINE zweite Höhenzahl, die auseinanderlaufen könnte. */
main.hat-bodenleiste {
  padding-bottom: calc(
    var(--leisten-hoehe, calc(var(--boden-hoehe) + env(safe-area-inset-bottom, 0px))) + var(--space-8)
  );
}

/* 17.10.2026 (Welle 3q, F-076/Wiederkehr F-022): Scrollt der Browser ein Feld in Sicht (Klick, Tab, Autofill-Fokus,
   Playwright), landete es unter der festen Bodenleiste; die Checkbox „#dok-impressum“ blieb unklickbar.
   `scroll-padding-bottom` hält jedes Ziel ÜBER der Leiste; die Scrollposition ändert sich nicht, solange nichts scrollt. */
html:has(main.hat-bodenleiste) {
  scroll-padding-bottom: calc(
    var(--leisten-hoehe, calc(var(--boden-hoehe) + env(safe-area-inset-bottom, 0px))) + var(--space-4)
  );
}

/* Die Anleitung (K-12, basis.css) behält die Schrittnummern ihrer Quelle: WEB.DE und GMX verweisen
   im Text auf „den Schalter aus Schritt 2", und Schritt 2 steht in der Füllung darüber. Ein
   fortlaufend neu nummerierter Block machte aus einer richtigen Anleitung eine falsche. */
.anleitung-koerper ol { list-style: decimal; }

/* --- Abschnitte: bewusst unterschiedlicher Rhythmus ------------------------------------------- */
/* DASHBOARD-NEUBAU-SPEC §1 Punkt 2/§2.1 NEU `--trennlinie-fein`: Premium entsteht über feine
   Flächen-/Linienabstufung statt harter Kontrastsprünge. Der Rhythmus der neun Einrichtungsschritte
   ist der dichteste Wiederholungsfall dieser Regel auf der Seite; die gedämpfte Trennlinie
   (`--border` bei 70% Deckkraft, `basis.css`) ersetzt hier die volle Randfarbe. Panelränder mit
   eigener Fläche (`.vorschlag`, `.platzhalter`, `details.rohfelder`, `.dokumentliste`) bleiben
   bewusst auf `--border`: sie grenzen eine Fläche ab, keinen bloßen Fließtext-Absatz. */
.abschnitt { padding-block: var(--space-8); border-top: 1px solid var(--trennlinie-fein); }
.abschnitt:first-of-type { border-top: 0; }
.abschnitt.einstieg { padding-block: clamp(var(--space-8), 7vw, var(--space-12)); }
.abschnitt.schmal { padding-block: var(--space-6); }
/* GL-08 (F-001, 200 % Zoom bei 320 px = 160 CSS-px): ein langes Wort in der Überschrift bricht um, statt die Seite zu verbreitern. */
.bahn :is(h1, h2, h3) { overflow-wrap: anywhere; hyphens: auto; }
.kontext { margin-bottom: var(--space-1); color: var(--muted); font-size: var(--text-prose); line-height: 1.6; }
.einstieg .kontext { font-size: var(--text-lead); }
.fuehrung { color: var(--muted); }

/* R-001 (25.09.2026): die Abschlussseite nach der Kontoanlage, im Stil der Website
   (`website-v1/DESIGN-FUNDAMENT.md` §1 „Ruhe durch Entzug", §3 „Serif ist die Stimme der
   Korrespondenz", §11 Produkt-Register): ein Titel, ein Satz in Tinte, viel Luft, keine Karte,
   kein gefüllter Knopf. Nur Token aus `basis.css` — keine eigene Farbe, keine eigene Schrift. */
/* Keine Haarlinie oben: die Abschlussseite ist der einzige sichtbare Abschnitt, die Linie stand
   sonst doppelt unter der Kopfzeile (`.abschnitt:first-of-type` greift nicht, weil die verborgenen
   Abschnitte davor mitzählen). */
.abschnitt.ende { padding-block: clamp(var(--space-10), 8vw, var(--space-12)); border-top: 0; }
.ende .seitentitel h1 {
  font-size: var(--text-title); font-weight: 650;
  line-height: 1.12; letter-spacing: -0.018em;
}
.ende .seitentitel .fuehrung { color: var(--ink); }
.ende .seitentitel .fuehrung strong { font-weight: 650; overflow-wrap: anywhere; }
.ende-zusatz { margin: var(--space-3) 0 0; max-width: var(--satz); color: var(--muted); text-wrap: pretty; }
.ende-zusatz:empty { margin: 0; }
.ende .platzhalter { max-width: var(--satz); }
.ende-erneut {
  max-width: var(--satz); margin-top: var(--space-10); padding-top: var(--space-6);
  border-top: 1px solid var(--trennlinie-fein);
}
.ende-erneut-titel { margin: 0; font-size: var(--text-body); font-weight: 650; color: var(--ink); }
.ende-erneut .feld { margin-top: var(--space-5); }

/* --- Statuszeichen ---------------------------------------------------------------------------- */
.status-chip {
  min-height: 30px; padding: var(--space-1) var(--space-3); border-radius: var(--r-pille);
  display: inline-flex; align-items: center; gap: var(--space-2);
  background: var(--surface-strong); color: var(--muted);
  font-size: var(--text-caption); font-weight: 600; white-space: nowrap;
}
.status-chip[data-tone="success"] { background: var(--success-soft); color: var(--success); }
.status-chip[data-tone="warning"] { background: var(--warning-soft); color: var(--warning); }
.status-chip[data-tone="danger"]  { background: var(--danger-soft);  color: var(--danger); }
/* POLITUR WELLE 12 / W6 (Befund E-6): ein Chip in der Kopfleiste darf umbrechen und schrumpfen.
   GEMESSEN, nicht am Bild geschaetzt (`80-bau-w6-werkzeug/w6-bilder.mjs breiten`): bei 320 px —
   der Referenzbreite aus WCAG 1.4.10, also 400 % Zoom auf 1280 px — schob `#kopf-status` die
   EINRICHTUNGSSEITE um 39 px waagerecht auf. Der Chip ist dort 230 px breit und `nowrap`, die
   Seite hat 320. Alle 72 uebrigen Messpunkte der Breitenmatrix waren sauber; dieser eine nicht,
   in beiden Modi.
   Der Befund ist NICHT aus dieser Welle: an `.status-chip` hat W6 nichts geaendert, und der
   Chip traegt seinen langen Text („… · Kennwort bestaetigt") seit dem Step-up-Bau.
   Die Regel stand bis hierher NUR in `kunde.css` und galt damit nur fuer das Cockpit; ihr
   Kommentar dort begruendete das mit „was fuer den Einrichtungsweg richtig ist". Gemessen ist es
   das nicht — dieselbe Kopfleiste hat dieselbe Falle. Sie zieht deshalb hierher, wo alle drei
   Seiten sie lesen, und die Dublette in `kunde.css` entfaellt ersatzlos (eine Wahrheit pro Sache).
   `white-space: normal` ERLAUBT den Umbruch, es erzwingt ihn nicht: solange der Chip passt,
   bleibt er einzeilig, und am Rechner aendert sich nichts.

   NACHTRAG AUS DEMSELBEN ZUG (EA-D25-06): `.leiste-konto` ist der zweite Ort, an dem ein
   `status-chip` in einem SCHMALEN Behaelter steht — der Fuss der Seitenleiste des Cockpits, 15,5rem
   breit. Die Chips sind mit EA-D25-06 aus der Kopfzeile dorthin gezogen und standen damit ploetzlich
   wieder ohne diese Regel. GEMESSEN von `_qa/d20-marke-ux.mjs` (Nachzug B-W9B-UI-06): die
   Seitenleiste lief bei 1280 px um **70 px** ueber ihre Rasterspalte hinaus, weil
   `Musterbau GmbH · Kennwort bestaetigt` als `nowrap` breiter ist als die Spalte.
   Die Regel bekommt deshalb den zweiten Ort statt einer zweiten Fassung; welcher Behaelter schmal
   ist, entscheidet der Selektor, nicht eine Kopie in `kunde.css`.
   Dritter Ort (Integration d, Review 306 Befund 2): die Gründe-Chips im Mailverständnis ragten bei
   360/375 px über den Rand und erzwangen bei 320 px waagerechtes Scrollen.
   Vierter Ort (Welle E, Paket 501, Review R1-b K-1): die Grundwort-Chips einer Karte unter „Braucht
   Sie“ — bei WebKit 375 px war „Text nicht gespeichert — bitte im Postfach beant…“ abgeschnitten. */
.kopfleiste .status-chip,
.leiste-konto .status-chip,
.verstaendnis-gruende .status-chip,
.brauchtdichliste .kopf .status-chip {
  max-width: 100%; min-width: 0;
  overflow-wrap: anywhere; white-space: normal; text-align: left;
}

/* Slop-Kante 1 von 8 (D25 §7 Punkt 3): hier stand eine 4 px starke linke Kante in `--control`.
   Ersatz genau wie in der Spec beschrieben — getönte Fläche, Haarlinie rundum in der
   Zustandsfarbe und eine fette erste Zeile. Die Fläche und das Wort tragen den Zustand jetzt
   gemeinsam; die Farbe steht nie allein.
   Die Haarlinie bleibt bewusst auf `--haarlinie`: eine Trennung ist eine Trennung, ein
   Zustandsträger ist sie nicht. Das führende Zeichen, das D25 zusätzlich nennt, braucht ein
   eigenes Markup-Element (die Verwaltung führt es als `<svg class="zeichen">`); für die
   Einrichtung ist es als Fremdbedarf an G-E gemeldet und gehört zu EA-D25-05.

   POLITUR WELLE 12 / W6 (Befund E-3), Groesse und Rahmen: AM BILD GESEHEN. Auf
   `20-bilder/w6/verwaltung-partner-390-hell-vorher.png` nimmt EIN Hinweiskasten 40 % der
   Bildschirmhoehe — sieben Zeilen in Fliesstextgroesse, in einem Kasten mit vollem Innenabstand,
   VOR der Tabelle, um die es geht. Auf `einrichtung-postfach-1280-hell-vorher.png` steht derselbe
   Kastentyp ueber dem Seitentitel.
   Zwei Zuege, beide ohne Farbaenderung:
     1. Die Meldung ist ein Hinweis, kein Fliesstext. `app-design-prinzipien.md` §2 Regel 3:
        Hinweistexte stehen in der gedaempftesten Textrolle, nie in einer, die mit echten Labels
        konkurriert. Sie bekommt deshalb `--text-control` und eine engere Zeile; der Innenabstand
        faellt von `--space-4` auf `--space-3`/`--space-4`.
     2. Die Zustandstoene verlieren ihre Haarlinie in der Zustandsfarbe. Fläche UND Rahmen in
        derselben Farbfamilie ist dieselbe Aussage zweimal — D25 K-10 nennt fuer den Zustandston
        genau drei Traeger: getoente Flaeche, fuehrendes Zeichen, fette erste Zeile. Der NEUTRALE
        Ton behaelt seine Haarlinie: er steht in der Verwaltung auf `--surface-strong`, also auf
        seiner eigenen Flaechenfarbe, und waere ohne Rahmen unsichtbar.
   Die Ortsfrage (`index.html:52`, `:54` stehen vor jedem Seitentitel) ist damit NICHT geloest.
   Sie ist Markup und gehoert als EA-D25-05 der Gruppe G-E in W4; siehe Bericht §6. */
.meldung {
  max-width: none; margin: var(--space-4) 0 0;
  padding: var(--space-3) var(--space-4); border-radius: var(--r-1);
  background: var(--surface-strong);
  border: 1px solid var(--border);
  font-size: var(--text-control); line-height: 1.5;
}
.meldung[data-tone="danger"]  { background: var(--danger-soft);  border-color: transparent; }
.meldung[data-tone="success"] { background: var(--success-soft); border-color: transparent; }
.meldung[data-tone="warning"] { background: var(--warning-soft); border-color: transparent; }
/* Das Zeichen, wo es im Markup steht, trägt die Zustandsfarbe der Fläche mit. */
.meldung[data-tone="danger"] .zeichen  { color: var(--danger); }
.meldung[data-tone="success"] .zeichen { color: var(--success); }
.meldung[data-tone="warning"] .zeichen { color: var(--warning); }
.meldung strong { display: block; }
.meldung .remediation { margin: var(--space-2) 0 0; font-size: var(--text-control); }
.meldung code { font-size: var(--text-caption); }

/* --- Formulare -------------------------------------------------------------------------------- */
.feld { margin-bottom: var(--space-4); }
.feld label { display: block; margin-bottom: var(--space-1); font-size: var(--text-control); font-weight: 600; }
.feld .hilfe { margin: var(--space-1) 0 0; color: var(--muted); font-size: var(--text-caption); }
/* LE-92: Feldbezogene Ablehnung — dieselbe Geometrie wie `.hilfe`, damit sich beim Ein- und
   Ausblenden nichts verschiebt; nur Farbe und Gewicht trennen sie. Die Fläche bleibt bewusst
   ungerahmt: `.meldung` gehört dem Formular als Ganzem, diese Zeile genau einem Feld. */
.feld .feldfehler { margin: var(--space-1) 0 0; color: var(--danger); font-size: var(--text-caption); font-weight: 700; }
/* F-009-Altprobe `kunde-screenshots` (Bericht 801; wieder eingesetzt 17.10.2026, Paket fb-regressionen — der Stand lag auf dem
   Zweig `wh/regression-alt` und kam nie nach main): die Zeile unter „Kennwort bestätigen“ erschien beim Verlassen des Feldes
   (`focusout`, D13b §3.4) und schob die Vertragsunterlagen darunter nach unten, WÄHREND die Maustaste gedrückt war — das
   Loslassen traf dann die Zeile statt des Kästchens, und der erste Klick auf das Kästchen ging verloren. Die Zeile behält ihren
   Platz (`hidden` bleibt das Zeichen für Skripte und Probe; nur die Höhe wird gehalten, Vorleser überspringen `visibility:
   hidden`), damit sich beim Ein- und Ausblenden nichts verschiebt, wie der Kommentar oben es verlangt.
   BEWUSSTER DAUER-PLATZHALTER (Review R44, 17.10.2026): eine Zeile (~22 px) bleibt unter dem Feld frei. Nur-solange-fokussiert würde
   die Zeile beim Verlassen des Feldes wieder einziehen, wenn kein Fehler da ist — dieselbe Verschiebung unter der Maustaste. */
#signup-passwort2-fehler[hidden] { display: block !important; visibility: hidden; }
/* `input[type="search"]` kommt mit der Filterzeile des Tenant-Rahmens dazu (D18, KONZEPT §10.1
   Schritt 7). Ohne den Selektor rendert das Suchfeld im Browsergrundstil und fällt aus dem
   Hausstil — dieselbe Geometrie, ein Eintrag mehr in der Liste. */
input[type="email"], input[type="text"], input[type="password"], input[type="number"], input[type="search"], select {
  width: 100%; min-height: var(--treffer); padding: var(--space-3);
  border: 1px solid var(--control); border-radius: var(--r-2);
  background: var(--canvas);
}
input:focus, select:focus { border-color: var(--focus); }
input[aria-invalid="true"] { border-color: var(--danger); }

.zustimmung { display: flex; gap: var(--space-3); align-items: flex-start; padding: var(--space-4) 0; border-top: 1px solid var(--trennlinie-fein); }
/* NZ-02: das Kästchen (22 px) bringt eine unsichtbare Tippfläche von 44 px mit; 11 px Einzug links halten sie und den Fokusring innerhalb der Spalte (Detailspalte beschneidet). */
.zustimmung > input[type="checkbox"] { margin-inline-start: 11px; }
.zustimmung label { font-weight: 650; }
.zustimmung .hilfe { margin: var(--space-1) 0 0; color: var(--muted); font-size: var(--text-caption); }

.dokumentliste { list-style: none; margin: var(--space-2) 0 0; padding: 0; border: 1px solid var(--border); border-radius: var(--r-2); }
.dokumentliste li { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-3); padding: var(--space-3) var(--space-4); border-top: 1px solid var(--border); }
.dokumentliste li:first-child { border-top: 0; }
.dokumentliste .titel { flex: 1 1 14rem; font-weight: 650; }
.dokumentliste .fassung { color: var(--muted); font-size: var(--text-caption); font-variant-numeric: tabular-nums; }

.knopfreihe { display: flex; flex-wrap: wrap; gap: var(--space-3); margin-top: var(--space-5); }
/* NS-16c: EIN Knopfsystem — die Klasse heißt überall `.knopf` (vorher `.button`). Auf den App-Seiten gelten diese Regeln; die Varianten aus marke.css
   (`.knopf-primaer`, `-sekundaer`, `-leise`, `-klein`; PIN-Tür, Sitzungssperre, Mitteilungen) und der Microsoft-Knopf (`.oauth-knopf`, oauth.css) behalten ihre Form, darum die Ausnahme per :where (Spezifität bleibt 0,1,0). */
.knopf:where(:not(.knopf-primaer, .knopf-sekundaer, .knopf-leise, .knopf-klein, .oauth-knopf)) {
  min-height: var(--treffer); padding: var(--space-3) var(--space-5);
  /* 281b (Fundament §5/§11 „Pillenknöpfe“), NZ-01: Knöpfe sind Pillen (--r-pille = 999 px), das Gewicht ist das halbfette 600
     der Systemschrift statt 750 — so ruhig wie ein Knopf in einer Apple-App. */
  border: 1px solid transparent; border-radius: var(--r-pille);
  white-space: normal;   /* NS-16c: wie bisher umbrechen (marke.css setzt für die Lock-Knöpfe nowrap) */
  display: inline-flex; align-items: center; justify-content: center; gap: var(--space-2);
  font-size: var(--text-control); font-weight: 600; line-height: 1.4;
  text-decoration: none; cursor: pointer;
  /* Der Übergang stand hier als Standard und wurde unten unter `reduce` weggeschaltet. Seit W2b
     ist es umgekehrt: Bewegung wird ausschließlich unter `no-preference` HINZUGEFÜGT (D25 §4.3),
     mit `--dauer-schnell` und `--kurve` statt zweier ad-hoc-Zahlen. Wer sie als Standard baut,
     zeigt sie einem empfindlichen Menschen kurz, bevor die Abfrage greift. */
}
/* NS-16c: marke.css färbt `.knopf[disabled]`, Links und den Fokusring für die Lock-Knöpfe fest; die App-Knöpfe behalten ihre bisherige Farbe (Varianten unten übersteuern). */
.knopf:where(:not(.knopf-primaer, .knopf-sekundaer, .knopf-leise, .knopf-klein, .oauth-knopf))[disabled] { color: inherit; }
:is(a, summary).knopf:where(:not(.knopf-primaer, .knopf-sekundaer, .knopf-leise, .knopf-klein, .oauth-knopf)) { text-align: start; }
a.knopf:where(:not(.knopf-primaer, .knopf-sekundaer, .knopf-leise, .knopf-klein, .oauth-knopf)) { color: var(--action); }
.knopf:where(:not(.knopf-primaer, .knopf-sekundaer, .knopf-leise, .knopf-klein, .oauth-knopf)):focus-visible { outline: var(--fokus-ring); outline-color: var(--fokusring); outline-offset: var(--fokus-abstand); }   /* die EINE Fokusregel aus basis.css, nicht der feste Ring der Lock-Knöpfe */
.knopf.primary { background: var(--action); color: var(--knopf-auf-akzent); }
.knopf.primary:hover:not(:disabled) { background: var(--action-hover); }
.knopf.secondary { background: var(--canvas); border-color: var(--control); }
.knopf.secondary:hover:not(:disabled) { background: var(--surface-strong); }
/* Nachlauf C (A11 A-2, Muster-Checkliste Punkt 7, E19 GL-04): der leise Knopf war nur ein blasser Rand (1,7:1), blieb beim Überfahren und Drücken gleich und stand mit 36 bis 41 px unter dem Klickziel.
   Jetzt: Rand in `--control` (>= 3:1 gegen den Grund, wie `.knopf.secondary`), Hover tönt die Fläche und dunkelt den Text, 44 px überall (keine dichte Ausnahme mehr). Probe: `_qa/nc2-leise-knopf.mjs`. */
.knopf.leise { min-height: var(--treffer); padding: var(--space-2) var(--space-3); background: transparent; border-color: var(--control); color: var(--muted); font-size: var(--text-caption); }
.knopf.leise:hover:not(:disabled) { background: var(--surface-strong); color: var(--ink); }
/* GL-21 (A11 G2): das Schließen-Zeichen der Pop-ups ist ein SVG wie in der Verwaltung (`verwaltung.css`), kein Textzeichen. */
.popup-x-zeichen { width: 14px; height: 14px; fill: currentColor; pointer-events: none; }
.knopf:where(:not(.knopf-primaer, .knopf-sekundaer, .knopf-leise, .knopf-klein, .oauth-knopf)):active:not(:disabled) { transform: translateY(1px); }
.knopf:where(:not(.knopf-primaer, .knopf-sekundaer, .knopf-leise, .knopf-klein, .oauth-knopf)):disabled { opacity: .5; cursor: not-allowed; }
/* POLITUR WELLE 12 / W6 (Befund F-3): der GEFUELLTE Knopf braucht eine eigene Sperrfassung.
   AM BILD GESEHEN auf `20-bilder/w6/einrichtung-postfach-1280-hell-vorher.png`: „Verbindung
   pruefen" ist gesperrt und traegt trotzdem die Akzentflaeche, nur halb durchsichtig. Zwei Fehler
   in einem:
     * Gerechnet: `--knopf-auf-akzent` auf `--action` bei 50 % Deckkraft liegt bei rund 2,4:1. Der
       Text auf dem Knopf sagt, WARUM man nicht weiterkommt — er ist die Information, nicht Zierat.
     * D25 §5.2.3 zaehlt EINEN Akzent je Sichtfenster. Ein gesperrter Knopf traegt hier den einen
       Akzent, ohne eine Aktion anzubieten; der Blick geht an die Stelle, an der nichts passiert.
   Ersatz: die ruhige getoente Flaeche, die der Bestand ohnehin fuehrt, mit `--muted` als Text und
   `--control` als Grenze. GERECHNET (`80-bau-w6-werkzeug/kontrast-w6.mjs`): 6,87:1 hell und
   6,85:1 dunkel fuer den Text, 3,08:1 hell und 3,13:1 dunkel fuer die Grenze — die Sperrfassung
   ist damit LESBARER als der Bestand, nicht nur ruhiger. `opacity` wird zurueckgenommen, weil
   sonst beide Daempfungen uebereinanderliegen.
   Die Regel gilt nur fuer `.primary`: ein Umrissknopf bei halber Deckkraft ist bereits ruhig, und
   `app-design-prinzipien.md` §4 verbietet ausdruecklich das Grau-Umfaerben als Regelfall. Hier ist
   die Ausnahme benannt und gerechnet, nicht stillschweigend. */
.knopf.primary:disabled {
  opacity: 1;
  background: var(--surface-strong);
  border-color: var(--control);
  color: var(--muted);
}
.knopf:where(:not(.knopf-primaer, .knopf-sekundaer, .knopf-leise, .knopf-klein, .oauth-knopf))[aria-busy="true"] { cursor: progress; }
/* F-036 R3 (B2-N1): in einer überholten Zeile sehen alle gesperrten Knöpfe gleich gedämpft aus, auch „Antworten“. */
li[data-neu-beantwortet] .knopf:disabled { opacity: .5; }

/* --- Progressive Disclosure (T-UX-1): natives details statt JS-Akkordeon --------------------- */
/* NACHZUG URTEIL 81, BEFUND B-W6-02: dieselbe Klasse wie bei der Bodenleiste. Der Block steht auf
   `--surface`, also auf getöntem Grund, und trug trotzdem den ungedämpften Ring — GEMESSEN
   **2,92:1** beim Tabdurchlauf, knapp unter der 3:1-Grenze aus WCAG 1.4.11. Der Wert steht am
   Baustein, nicht als Attribut im Markup: die Tönung gehört zu dieser Fläche, nicht zu der Seite,
   die sie einbaut. Keine zweite Fokusregel, nur der Wert, den die eine Regel in `basis.css` liest
   (LE-294). */
details.rohfelder { --fokusring: var(--focus-gedaempft); margin-top: var(--space-5); border: 1px solid var(--border); border-radius: var(--r-2); background: var(--surface); }
details.rohfelder > summary { min-height: var(--treffer); padding: var(--space-3) var(--space-4); display: flex; align-items: center; gap: var(--space-3); font-size: var(--text-control); font-weight: 750; cursor: pointer; }
/* POLITUR WELLE 12 / W6 (Befund E-5): dieses `::marker` war WIRKUNGSLOS. `display: flex` auf einem
   `<summary>` entfernt in Blink und WebKit die Aufklappmarke ganz — die Zeile faerbte ein Zeichen,
   das es nicht gab. AM BILD GESEHEN auf
   `20-bilder/w6/einrichtung-postfach-390-hell-vorher.png`: „Erweiterte Einstellungen (Server von
   Hand eintragen)" steht dort als graue Flaeche ohne jedes Zeichen und liest sich wie ein
   gesperrter Knopf, nicht wie etwas, das sich oeffnen laesst. `app-design-prinzipien.md` §11.1
   Regel 1 verlangt ein wahrnehmbares Feedback am Ausloeseort; hier fehlt schon die Ankuendigung,
   dass es einen gibt.
   Ersatz aus dem eigenen Haus statt einer neuen Erfindung (ponytail Sprosse 2): dieselbe Marke,
   die `basis.css` fuer `.anleitung > summary` fuehrt — ein Chevron, das sich beim Oeffnen dreht.
   Damit gibt es EIN Aufklappzeichen im Produkt, nicht zwei. Die Drehung laeuft nur unter
   `no-preference` (Uebergang am Ende dieser Datei); ohne Bewegung springt sie, die Information
   bleibt. */
details.rohfelder > summary::marker, details.rohfelder > summary::-webkit-details-marker { content: ""; display: none; }
details.rohfelder > summary::before {
  content: "\203A"; display: inline-block; flex: 0 0 auto;
  font-size: 1.2em; line-height: 1; color: var(--muted);
}
details.rohfelder[open] > summary::before { transform: rotate(90deg); }
.rohfelder-inhalt { padding: 0 var(--space-4) var(--space-4); }
.serverpaar { display: grid; grid-template-columns: minmax(0, 2fr) minmax(0, 1fr) minmax(0, 1fr); gap: var(--space-3); }

/* --- Vorschlagskarte -------------------------------------------------------------------------- */
.vorschlag { margin-top: var(--space-4); padding: var(--space-4) var(--space-5); border: 1px solid var(--border); border-radius: var(--r-2); background: var(--surface); }
/* Kopfzeile des Vorschlags: Überschrift links, Herkunfts-Chip rechts. Bewusst hier und NICHT als
   style-Attribut im HTML — die CSP der Seite (default-src 'self', ohne 'unsafe-inline') blockt
   Inline-Stile, das Attribut hätte also gar nicht gewirkt (belegt über die Konsolenausgabe in
   _qa/screenshots.mjs). */
.vorschlag-kopf { display: flex; align-items: center; justify-content: space-between; gap: var(--space-3); flex-wrap: wrap; }
.vorschlag dl { margin: var(--space-3) 0 0; display: grid; grid-template-columns: max-content minmax(0, 1fr); gap: var(--space-1) var(--space-4); }
.vorschlag dt { color: var(--muted); font-size: var(--text-caption); font-weight: 700; }
.vorschlag dd { margin: 0; font-variant-numeric: tabular-nums; }
.hinweisliste { margin: var(--space-3) 0 0; padding-left: 1.1rem; color: var(--muted); font-size: var(--text-control); }
.hinweisliste li + li { margin-top: var(--space-1); }

/* --- Boden (T-UX-7): reine Anzeige, kein Schalter --------------------------------------------- */
.bodenliste { list-style: none; margin: var(--space-3) 0 0; padding: 0; }
.bodenliste li { display: flex; gap: var(--space-3); padding: var(--space-3) 0; border-top: 1px solid var(--trennlinie-fein); }
.bodenliste li:first-child { border-top: 0; }
.bodenliste .zeichen { width: 1.5rem; height: 1.5rem; flex: 0 0 auto; border-radius: 50%; background: var(--success-soft); color: var(--success); display: grid; place-items: center; font-weight: 850; font-size: var(--text-caption); }
.bodenliste .titel { font-weight: 700; }
.bodenliste p { margin: var(--space-1) 0 0; color: var(--muted); font-size: var(--text-control); }

/* --- Platzhalter-Schritt ---------------------------------------------------------------------- */
.platzhalter { padding: var(--space-5); border: var(--haarlinie) dashed var(--control); border-radius: var(--r-2); background: var(--surface); }
.platzhalter .marke { display: inline-block; margin-bottom: var(--space-2); padding: var(--space-1) var(--space-3); border-radius: var(--r-pille); background: var(--warning-soft); color: var(--warning); font-size: var(--text-caption); font-weight: 800; }

/* --- Dokumentdialog --------------------------------------------------------------------------- */
/* Höhenordnung (D25 §4.2): der Dialog ist die einzige Fläche dieser Datei, die wirklich über
   allem liegt — `--hoehe-2`. Alles Ruhende (Vorschlag, Dokumentliste, Rohfelder) bleibt auf
   `--hoehe-0`, also ohne Schatten. */
/* NZ-01 (N2): Dialoge sind Glas (84 % Leinen, Weichzeichner, Lichtkante), der Hintergrund ein leichter Schleier; Rückfälle in marke.css. */
dialog { width: min(46rem, calc(100% - var(--space-8))); max-height: calc(100dvh - var(--space-8)); padding: 0; border: 0; border-radius: var(--r-3); background: var(--glas); -webkit-backdrop-filter: var(--glas-filter); backdrop-filter: var(--glas-filter); color: var(--ink); box-shadow: var(--glas-kante), var(--hoehe-2); }
dialog::backdrop { background: var(--schleier); -webkit-backdrop-filter: var(--schleier-filter); backdrop-filter: var(--schleier-filter); }
.dialog-kopf { position: sticky; top: 0; display: flex; align-items: center; justify-content: space-between; gap: var(--space-4); padding: var(--space-4) var(--space-5); background: transparent; border-bottom: 1px solid var(--border); }
.dialog-inhalt { padding: var(--space-5); overflow-y: auto; max-height: calc(100dvh - 10rem); }
.dialog-inhalt pre { margin: 0; white-space: pre-wrap; word-break: break-word; font-size: var(--text-prose); line-height: 1.6; }

.fusszeile { padding: var(--space-8) 0 var(--space-12); color: var(--muted); font-size: var(--text-caption); }
/* P1a-2 (Messung design-audit G8, Einstieg/Einrichtung 744 px: CLS 0,89/0,97, Ursache gemessen mit Layout-Shift-Quellen): beim ersten Bild stand die
   Fußzeile unter dem noch kurzen Inhalt (Bild-Höhe 679 px) und sprang aus dem Bild, sobald der Status da war (0,89); danach schob die Kopfzeile den
   Inhalt um 17 bis 36 px nach unten (Kontaktzeile, Betriebshinweis, Knopf „Rückmeldung“ kommen erst mit dem Status). Bis `ladeStatus` alles
   gezeichnet hat (`aria-busy="false"` an `#inhalt`), ist der Inhalt unsichtbar und behält seinen Platz — Unsichtbares verschiebt nichts. Fällt das
   Ende je aus, gibt die Animation den Inhalt nach 4 s frei: es bleibt nie etwas verborgen. */
#inhalt[aria-busy="true"] { visibility: hidden; animation: inhalt-frei 1ms 4s forwards; }
@keyframes inhalt-frei { to { visibility: visible; } }

@media (max-width: 34rem) {
  .serverpaar { grid-template-columns: 1fr; }
  .vorschlag dl { grid-template-columns: 1fr; }
  .knopfreihe .knopf { width: 100%; }
}

/* --- Bewegung (D25 §4.3) -----------------------------------------------------------------------
   HINZUGEFÜGT, nie weggeschaltet: ausserhalb dieses Blocks steht in dieser Datei kein einziger
   `transition`. Die Maße kommen aus `basis.css` (`--dauer-schnell` 120 ms für hochfrequente
   Bedienung, `--kurve` exponentiell auslaufend, kein Bounce). */
@media (prefers-reduced-motion: no-preference) {
  /* Politur-Stufe 1 (P-26, Bericht 166, DP-19): `transform` stand hier NEBEN drei Farbeigenschaften
     — genau die verbotene Kombination ("keine Kombination aus Farb-, Skalierungs- und
     Positionsübergang gleichzeitig"). Dieselben drei Werte, dieselben Zeitmaße wie das Fundament
     nennt sie für `.uebergang-farbe` (`basis.css`) — hier über den bestehenden Typselektor
     `.knopf` statt einer Klasse im Markup, weil sie ausnahmslos JEDEN Knopf betrifft (kein
     zweiter Zeitwert, keine zweite Kurve, nur derselbe Satz an derselben Stelle). Der Tastendruck
     (`.knopf:active`, unten) bleibt bestehen, springt jetzt aber ungeanimiert — ein 1px-Versatz
     braucht keine eigene Bewegungsphase, und Höchstens-eine-Übergangsklasse-je-Element ist damit
     eingehalten. */
  .knopf:where(:not(.knopf-primaer, .knopf-sekundaer, .knopf-leise, .knopf-klein, .oauth-knopf)) {
    transition: background-color var(--dauer-schnell) var(--kurve),
                border-color var(--dauer-schnell) var(--kurve),
                color var(--dauer-schnell) var(--kurve);
  }
  /* W6, Befund E-5: dieselbe Dauer und dieselbe Kurve wie die Aufklappmarke in `basis.css` — eine
     Drehung, nicht zwei verschiedene. Aufklappen ist keine hochfrequente Bedienung, aber die Marke
     ist winzig; `--dauer-schnell` haelt sie unter den 150 ms aus §11.1 Regel 9. */
  details.rohfelder > summary::before {
    transition: transform var(--dauer-schnell) var(--kurve);
  }
}

/* Zweites Netz, nicht der Hauptweg: es fängt Bewegung ab, die ein Browser oder eine fremde Regel
   mitbringt. Der Hauptweg ist der Block darüber. */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after { transition-duration: .01ms !important; animation-duration: .01ms !important; animation-iteration-count: 1 !important; }
}

/* Welle D, Paket „Einrichtung Klarheit" (Bericht 402) ------------------------------------------------
   Timon: „Bei der Postfach Einrichtung muss noch fetter und klarer stehen, dass hier das PW vom Email
   Postfach gefragt ist." Die Beschriftung des Postfach-Kennworts ist eine Überschrift in
   Abschnittsgröße, fett; der Satz darunter trägt einen getönten Rand in der Akzentfarbe. Nur Tokens
   aus `basis.css`, dunkler Zwilling kommt von dort mit. */
.feld.postfach-kennwort-feld {
  margin-top: var(--space-4);
  padding: var(--space-4);
  border: 1px solid var(--border);
  box-shadow: inset 4px 0 0 var(--action);
  border-radius: var(--r-1);
  background: var(--akzent-getoent);
}
.feld label.postfach-kennwort-titel {
  margin-bottom: var(--space-2);
  font-size: var(--text-section); font-weight: 800; line-height: 1.25; color: var(--ink);
}
.postfach-kennwort-satz { margin: 0 0 var(--space-3); font-size: var(--text-body); color: var(--ink); }
.postfach-kennwort-satz strong { font-weight: 800; }

/* Das Mailassist-Login-Popup (`#stepup-schicht`): Titel, Satz, Anlass und Fehlerzeile. */
#stepup-block h2 { margin: 0 var(--space-6) var(--space-2) 0; font-size: var(--text-section); }
#stepup-block .stepup-grund { margin: var(--space-2) 0 var(--space-4); color: var(--ink); font-weight: 600; }
#stepup-block .meldung { margin: 0 0 var(--space-3); }

/* Bericht 411: Warnung „gleiches Kennwort" (`#gleiches-kennwort-dialog`, K0-Muster (b)). */
/* Nachbesserung 411 r1 (K-4): die Breite gilt erst oberhalb der Telefonregel (`basis.css`, max-width
   34rem: Blatt von unten, volle Breite) — sonst überstimmt die ID-Regel das Blatt. */
@media (min-width: 34.0625rem) {
  #gleiches-kennwort-dialog { width: min(34rem, calc(100vw - 2 * var(--space-4))); }
}
#gleiches-kennwort-dialog h2 { margin: 0; font-size: var(--text-section); }
.gleiches-kennwort-warnung {
  margin: 0 0 var(--space-3); padding: var(--space-3) var(--space-4);
  border: 1px solid var(--warning); border-inline-start-width: 4px; border-radius: var(--r-1);
  background: var(--warning-soft); color: var(--ink); font-weight: 600;
}
#gleiches-kennwort-dialog .knopfreihe { margin-top: var(--space-4); }

/* Welle E (Bericht 504, I-20): die schwebende Meldung der Einrichtung steht ÜBER der Fortschritts-
   leiste unten, nicht dahinter (`--leisten-hoehe` meldet `app.js`). */
body:has(#fortschrittsleiste:not([hidden])) main #meldung[data-schwebt] {
  bottom: calc(var(--leisten-hoehe, 4.5rem) + var(--space-3));
  max-height: calc(100dvh - var(--leisten-hoehe, 4.5rem) - 2 * var(--space-4));
}
/* Eine Fehlermeldung bleibt hier stehen, bis die nächste Handlung sie ersetzt. Damit sie dabei nie
   den Knopf verdeckt, der die nächste Handlung ist („Verbindung prüfen“ direkt darunter), gehen
   Klicks durch den Kasten hindurch; nur seine Links, Knöpfe und Aufklappzeilen nehmen sie an. */
body:has(#abschnitt-einstieg) main #meldung[data-schwebt] { pointer-events: none; }
body:has(#abschnitt-einstieg) main #meldung[data-schwebt] :is(a, button, summary) { pointer-events: auto; }
/* Review r1-B N-1: der Knopf „Schließen“ nimmt die schwebende Meldung weg (`app.js` `meldung`). */
#meldung .meldung-zu { display: block; margin-top: var(--space-2); }

/* Plansystem P5: Assistent „Ihr Plan“ (Schritt ABO_PLATZHALTER). Nur Raster und Abstaende; Farben und Knoepfe kommen aus basis.css. */
.plan-assistent { margin-block: var(--space-5); min-width: 0; }
.plan-assistent[hidden] { display: none; }
.plan-menge { display: grid; gap: var(--space-3); margin-block: var(--space-4); max-width: 36rem; }
.plan-menge .knopf, .plan-karte .knopf { width: 100%; min-height: var(--treffer); }
.plan-karten { display: grid; gap: var(--space-4); grid-template-columns: 1fr; margin-block: var(--space-4); }
@media (min-width: 900px) { .plan-karten { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
.plan-karte { border: 1px solid var(--marke-linie); border-radius: var(--r-2); padding: var(--space-4); min-width: 0; display: flex; flex-direction: column; gap: var(--space-2); }
.plan-karte[data-empfohlen="ja"] { border-width: 2px; }
.plan-marke { margin: 0; font-size: var(--text-caption); font-weight: 650; }
.plan-gross { margin: 0; font-size: var(--t-24); font-weight: 650; line-height: 1.2; }
.plan-preis { margin: 0; font-weight: 650; }
.plan-liste { margin: 0; padding-inline-start: 1.1rem; }
.plan-token, .plan-frage { margin-block: var(--space-2); }
.plan-token > summary, .plan-frage > summary { cursor: pointer; min-height: var(--treffer); display: flex; align-items: center; }
.plan-zusaetze { display: grid; gap: var(--space-2); margin-block: var(--space-4); max-width: 40rem; }
.plan-zusatz { display: flex; gap: var(--space-3); align-items: flex-start; border: 1px solid var(--marke-linie); border-radius: var(--r-2); padding: var(--space-3); min-height: var(--treffer); }
.plan-zusatz-text { display: flex; flex-direction: column; gap: .15rem; min-width: 0; overflow-wrap: anywhere; }
.plan-summe { margin: var(--space-3) 0; padding-inline-start: 1.1rem; }
.plan-summe-gesamt { font-size: var(--t-20); font-weight: 650; margin-block: var(--space-2) var(--space-4); }
.plan-assistent .knopfreihe .knopf { min-height: var(--treffer); }
.plan-assistent .knopfreihe .knopf.primary, .plan-assistent .knopfreihe .knopf.secondary { flex: 1 1 10rem; }
