/* ---- Phase 7: Schriften (selbst gehostet, OFL, Latin-Subset; Spec § 3.2) ----------
   Preload-href in App.razor ≡ diese url() (Ruling R3). Nie von einer fremden
   Schrift-CDN laden — die CSP (font-src 'self') verbietet es; siehe tools/fonts/README.md. */
@font-face {
    font-family: "Source Serif 4";
    font-style: normal;
    font-weight: 600;
    font-display: swap;
    src: url("fonts/source-serif-4-600-latin-v1.woff2") format("woff2");
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
    font-family: "IBM Plex Sans";
    font-style: normal;
    font-weight: 100 700;
    font-display: swap;
    src: url("fonts/ibm-plex-sans-var-latin-v1.woff2") format("woff2");
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* Metrik-angepasste lokale Fallbacks (tools/fonts/metrics.py, Ruling R5): */
@font-face { font-family: "Konformo Serif Fallback"; src: local("Georgia"); size-adjust: 119.11%; ascent-override: 86.98%; descent-override: 28.13%; line-gap-override: 0%; }
@font-face { font-family: "Konformo Sans Fallback"; src: local("Arial"); size-adjust: 120.75%; ascent-override: 84.89%; descent-override: 22.77%; line-gap-override: 0%; }

/* ---- Phase 7: Design-Tokens (Spec § 3.1) — EIN :root-Block, hell-only (D4) -------- */
:root {
    --papier: #fbfaf7;
    --flaeche: #ffffff;
    --tinte: #1f2a24;
    --tinte-2: #4b5563;
    --marke: #1f4d3a;
    --marke-dunkel: #173d2e;
    --marke-hell: #edf3ef;
    --akzent: #b5552d;
    --akzent-hell: #fff7f2;
    --akzent-dunkel: #7a3a1c;
    --rand: #e6e2d8;
    /* Trennlinien-Pass 2026-09-26 (Stefan: „make the line beyond the header menu and the line above the
       footer and the line above the zurück/weiter in the check a little bit more visible"): die Linie der
       Kopfzeile, des Fußes, der Menütafel und des Wizard-Streifens — eine Stufe dunkler als --rand
       (1,55:1 statt 1,24:1 auf Papier); seit der zweiten Runde (Stefan: „make the line also a little bit
       thicker") 2 px — ein ganzer CSS-Pixel (KP1; Ränder rasten auf Gerätepixel, 1,5 px wären bei 100 %
       unverändert), die Deckel --kopf-hoehe sind um 1 px angehoben. Jede andere Linie behält --rand, 1 px. */
    --rand-stark: #d2cbbd;
    /* Scroll-Schatten (2026-09-26, Stefan: „when scrolled down sometimes i dont know that there is content
       behind/above the header"): der Schatten der haftenden Leisten ist die Tinte (#1f2a24) mit Alpha; er liegt
       nur, während Inhalt hinter der Leiste ist (Scroll-Timeline, Block hinter der Wizard-Leiste). */
    --schatten: rgba(31, 42, 36, 0.12);
    --fehler: #8a1c1c;
    --fehler-hell: #fbecec;
    --schrift-serif: "Source Serif 4", "Konformo Serif Fallback", Georgia, "Times New Roman", serif;
    --schrift-sans: "IBM Plex Sans", "Konformo Sans Fallback", system-ui, "Segoe UI", Roboto, sans-serif;
    --raum-1: 0.5rem;
    --raum-2: 1rem;
    --raum-3: 1.5rem;
    --raum-4: 2rem;
    --raum-5: 3rem;
    --raum-6: 4rem;
    /* Spaltenabstand der Kopfleiste (Stefan 2026-09-22: „a little bit more space … on bigger
       resolutions"): Untergrenze die früheren 1.5rem, bei 1920 px rund 31 px, bei 2560 px rund 37 px.
       Als Token, weil die Fußleiste drei davon in ihre Breite rechnet. */
    --kopf-abstand: clamp(1.5rem, 0.75rem + 1vw, 3rem);
    --radius-s: 4px;
    --radius-m: 8px;
    color-scheme: only light;
}

* { box-sizing: border-box; }

/* Die Rinne der Bildlaufleiste ist auf JEDER Seite reserviert: sonst wechselt die Layoutbreite
   zwischen langen und kurzen Seiten, und alles Zentrierte (Kopfnavigation, Spalte) springt um
   die halbe Leistenbreite. */
/* Jedes Sprungziel landet UNTER der haftenden Kopfzeile (2026-09-23): Ankerlinks der Inhaltsseiten,
   der Skip-Link, der Fokus auf „Schritt n" — scroll-padding gilt jedem Scrollen-ins-Bild.
   --kopf-hoehe ist der Deckel der Kopfhöhe: in CSS nicht ausdrückbar (drei Schriftgrößen an EINER
   Grundlinie); 86,8 px bei 1920 × 1080 sind ihr Maximum (seit der 2-px-Linie 2026-09-26, davor 85,8) — Polster und Schriften deckeln bei
   1800 / 1200 px (gemessen, Chromium, gebündelte Schriften). Auf /check misst check-boot.js sie und
   überschreibt das Token auf <html>. Das Token steht auf html, NICHT in :root: der ≤-768-px-Wert
   (unten; seit 2026-09-29, LE6) steht ebenfalls auf html — gleiche Spezifität, die Media Query gewinnt nach Reihenfolge;
   in :root (0,1,0) schlug der Deckel den html-Wert (0,0,1) auf jeder skriptfreien Seite
   (Hugo-Review 2026-09-23, I-1: Sprungziele am Handy 35 statt 16 px unter der Kopfzeile). */
html { font-size: 100%; -webkit-text-size-adjust: 100%; scrollbar-gutter: stable; --kopf-hoehe: 5.4375rem; scroll-padding-top: calc(var(--kopf-hoehe) + var(--raum-2)); }

/* Auf /check, solange die Wizard-Leiste steht: jedes Scrollen-ins-Bild endet ÜBER ihrem Streifen (2026-09-25,
   Spec wizard-leiste WL4/WL5) — sonst parkt ein Tab-Stopp unter dem haftenden Streifen (Sonde: Fokus-Unterkante
   1 076 px bei Streifenoberkante 996 px). Deckel 6,5 rem seit dem Wizard-Kasten (2026-09-26, WK5; davor 5,5 rem):
   der Kasten misst 103 px bei 1920 × 1080 (Knopfzeile 51 + 2 × --raum-2 + 2 × Rand 2) und schwebt --raum-2 über der
   Kante — 104 px Deckel; NICHT gemessen wie --kopf-hoehe — nichts muss die Leiste exakt treffen. :has() wie beim
   Spaltenmaß von /check; ohne Leiste (Ergebnisseite, andere Seiten) kein Polster. */
html:has(.wizard-nav-sticky) { --wizard-leiste-hoehe: 6.5rem; scroll-padding-bottom: calc(var(--wizard-leiste-hoehe) + var(--raum-2)); }

body {
    margin: 0;
    font-family: var(--schrift-sans);
    font-size: 1.0625rem;
    line-height: 1.6;
    color: var(--tinte);
    background: var(--papier);
    display: flex;
    min-height: 100vh;
    flex-direction: column;
}

@media (max-width: 40rem) { body { font-size: 1rem; } }

h1, h2, h3 {
    font-family: var(--schrift-serif);
    font-weight: 600;
    line-height: 1.15;
    letter-spacing: -0.012em;
    color: var(--tinte);
}

h1 { font-size: clamp(2rem, 1.4rem + 2.2vw, 2.75rem); margin: 0 0 var(--raum-2); }
h2 { font-size: clamp(1.5rem, 1.25rem + 0.9vw, 1.75rem); margin: var(--raum-5) 0 var(--raum-2); }
h3 { font-size: 1.2rem; margin: var(--raum-4) 0 var(--raum-1); }
a { color: var(--marke); text-decoration-thickness: 1px; text-underline-offset: 0.15em; }
a:hover { color: var(--marke-dunkel); }
small { font-size: 0.875rem; }

/* 2026-09-22 (Stefan): EINE Eyebrow-Größe — Hero, „Schritt n" und „Ihr Ergebnis" wachsen mit dem
   Viewport (12 → 14 px), ≤ 600 px bleibt die Basisgröße; keine Regel darf sie überschreiben. */
.eyebrow {
    font-family: var(--schrift-sans);
    font-size: clamp(0.75rem, 0.65rem + 0.35vw, 0.875rem);
    font-weight: 600;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    color: var(--akzent);
    margin: 0 0 var(--raum-1);
}

:focus-visible { outline: 2px solid var(--marke); outline-offset: 2px; }

/* ---- Shell: Kopf, Hauptspalte, Fuß (Spec § 4.1) ----------------------------------- */

.skip-link {
    position: absolute;
    left: -9999px;
    top: 0;
    background: var(--marke);
    color: #fff;
    padding: var(--raum-1) var(--raum-2);
    border-radius: 0 0 var(--radius-s) 0;
}
.skip-link:focus { left: 0; z-index: 10; }

/* Senkrechtes Polster um GENAU 0.25rem kleiner als zuvor (0.9rem … 1.15rem → 0.65rem … 0.9rem,
   gleiche Steigung; Stefan 2026-09-22: „shrink the header height a little" — die Kopfzeile fällt
   bei 1920 × 1080 von 93 auf 85 px). Der Check-Button behält die Höhe der Seiten-Buttons, deshalb
   schrumpft das Polster, nicht der Inhalt. WARUM ein ganzer Viertel-rem: das Polster verschiebt
   die gemeinsame Grundlinie der Kopfzeile; die Unterstreichung der Links (text-decoration) und
   der gezeichnete Strich der Wortmarke (Hintergrundlinie) rasten verschieden auf das Pixelraster,
   ein Bruchteil von 4,8 px (Deckel 0.85rem) setzte den Wortmarkenstrich eine Gerätezeile über die
   Unterstreichung — WortmarkeStrichE2ETests.Strich_DerWortmarke_LiegtAufDerHoeheDerUnterstreichung
   fiel bei Pixeldichte 1, 1,5 und 2. Ganze CSS-Pixel (4 = 6 = 8 Gerätepixel) lassen beide Zeilen,
   wie sie waren. Senkrechte Geometrie der Kopfzeile nur in ganzen CSS-Pixeln verschieben. */
/* Die Kopfzeile HAFTET am oberen Rand (Stefan 2026-09-23: „the menu header in the top should be
   always visible (when scrolling)"): über der Ankerleiste des Ergebnisses (4) und der Wizard-Leiste
   unten (5), unter dem Skip-Link (10, beim Fokus). Im Druck wieder static (Druckblock). Als
   positionierter Kasten ist sie zugleich der Bezug der Menütafel ≤ 768 px (top: 100 %; seit 2026-09-29, LE6). */
.site-header {
    position: sticky;
    top: 0;
    z-index: 6;
    background: var(--papier);
    border-bottom: 2px solid var(--rand-stark);
    padding: clamp(0.65rem, 0.45rem + 0.4vw, 0.9rem) clamp(1rem, 4vw, 3rem);
}
/* Die Kopfnavigation kommt aus dem SeitenRegister und kann wachsen: sie umbricht,
   statt den Kopf horizontal zu sprengen. Der Spaltenabstand ist das Token --kopf-abstand (:root)
   und wächst mit dem Viewport (Stefan 2026-09-22). */
.site-header nav {
    --kopf-schrift: clamp(1.0625rem, 0.95rem + 0.3vw, 1.175rem);
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    justify-content: center;
    gap: 0.5rem var(--kopf-abstand);
    max-width: 72rem;
    margin: 0 auto;
}
/* Nur die Langform text-decoration-line: die Kurzform setzt text-decoration-thickness auf auto
   zurück (engine-eigen, WebKit 2 px) — die 1 px der Basisregel a gelten auch hier (2026-09-22).
   Die Schriftgröße der Links ist --kopf-schrift, weil der Strich der Wortmarke sie mitliest.
   Die Link-Regeln des Kopfes gelten den TEXTLINKS (:not(.cta)): der Menüpunkt des Checks ist seit
   2026-09-22 (Stefan) ein Button der Klasse cta wie der Check-CTA der Seiten und sieht GENAU so aus
   — Farbe, Polster, Schriftgröße, Schweben allein aus .cta, keine eigene Kopfregel; als aktuelle
   Seite trägt er weder Unterstreichung noch eine andere Füllung („no darker hover on selection and
   also no underline when at betroffenheitscheck"). Schlügen die Kopfregeln (0,1,2) das .cta (0,1,0),
   stünde er in Tinte statt Weiß, mit Polster 0.25rem 0 und Unterstreichung beim Schweben. */
.site-header nav a:not(.cta) { text-decoration-line: none; color: var(--tinte); font-weight: 500; font-size: var(--kopf-schrift); padding: 0.25rem 0; }
.site-header nav a:not(.cta):hover,
.site-header nav a:not(.cta):focus-visible { color: var(--marke); text-decoration-line: underline; text-underline-offset: 0.25em; }
/* Am Attribut, nicht am Wert: die aktuelle Seite trägt aria-current="page", ihr Abschnitt
   (der Hub auf einem Spoke) aria-current="true" — beide werden gleich hervorgehoben (2026-09-22). */
.site-header nav a:not(.cta)[aria-current] { color: var(--marke); text-decoration-line: underline; text-underline-offset: 0.25em; }
/* Das Kopfmenü (2026-09-23, Stefan: „make it a sandwich menu then for the three points"): die
   Registerlinks (seit 2026-09-29 vier, LE2) stehen in EINEM details.kopfmenue hinter der
   Wortmarke — eine Quelle, kein Skript.
   Über 768 px ist es als Kasten unsichtbar: ein Flex-Kasten mit dem Kopfabstand (die Grundlinie des
   Kastens ist die seines ersten Links, also die der Zeile), die summary versteckt, der Inhalt des
   GESCHLOSSENEN details über ::details-content { display: contents } Teil der Zeile — Chromium 131,
   Firefox 138, WebKit 18.4; in drei Engines geprobt. Kennt eine Engine den Selektor nicht, wäre das
   Menü ein Loch: dort bleibt die summary sichtbar (@supports not), ein Schalter statt eines Lochs. */
.kopfmenue { display: flex; flex-wrap: wrap; align-items: baseline; gap: 0.5rem var(--kopf-abstand); border-top: 0; padding: 0; }
/* Die generische details-Regel (unten: Rahmen oben, Polster --raum-1, Pfeil vor der summary) gilt dem
   Exakt-Rechner — hier machte sie die Kopfzeile 17 px höher (85 → 99,6 px bei 1920, gemessen). */
.kopfmenue summary { display: none; list-style: none; }
.kopfmenue > summary::before { content: none; }
.kopfmenue summary::-webkit-details-marker { display: none; }
.kopfmenue::details-content { display: contents; }
.kopfmenue-zeichen { width: 1.5rem; height: 1.5rem; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; }
.kopfmenue[open] .linien, .kopfmenue:not([open]) .kreuz { display: none; }
@supports not selector(::details-content) {
    .kopfmenue summary { display: flex; align-items: center; }
}

.site-header nav a.brand {
    font-family: var(--schrift-serif);
    font-weight: 600;
    font-size: clamp(1.45rem, 1.2rem + 0.7vw, 1.7rem);
    letter-spacing: -0.01em;
    color: var(--tinte);
    margin-right: var(--raum-2);
}
/* Das Ring-o-Zeichen der Wortmarke (docs/brand/README-logo.md: bei 100 px Schrift 68 × 68,
   Lücke 7 px nach dem m) — in em, damit es mit der Schrift skaliert. Die -0.1em sind gegen
   die gelieferte Reinzeichnung gemessen (Ringunterkante 0.08em unter der Grundlinie, plus
   die 2/84 Innenrand der viewBox). Der Ring folgt currentColor, der Haken trägt den Akzent. */
.site-header nav a.brand .brand-zeichen {
    width: 0.68em;
    height: 0.68em;
    margin-left: 0.07em;
    vertical-align: -0.1em;
}
.brand-zeichen path { stroke: var(--akzent); }
/* Der Strich unter der Wortmarke ist GEZEICHNET, nicht text-decoration: die zieht kein Browser
   unter ein Inline-SVG, das Zeichen bliebe ohne Strich. ::after ist ein leerer inline-block —
   seine Grundlinie ist die eigene Unterkante, vertical-align hängt ihn also unabhängig von den
   Schriftmetriken unter die Grundlinie des Textes: um 0,25 × die Schriftgröße der NACHBARLINKS
   (--kopf-schrift), nicht die eigene — die Kopfzeile richtet alle Links an EINER Grundlinie aus,
   und die Unterstreichung der Links liegt 0,25 ihres em darunter (text-underline-offset); mit dem
   eigenen em (27 px) läge der Wortmarkenstrich 2 px tiefer (2026-09-22, Stefan). 100 % Breite und
   -100 % Rand legen ihn ohne Vorschub unter das ganze Lockup.
   Die Tinte ist eine Hintergrundlinie von 1,5 px im 2-px-Kasten (2026-09-22, Stefan: Chrome, 4K
   bei 150 %): 1 px las er unter der 27-px-Serif als dünner, 2 px als dicker als die 1 px der
   Kopflinks; 1,5 px = das Verhältnis der Schriftgrößen (27,2 / 18,8). Ein Rahmen kann das nicht
   (Chrome rundet Rahmenbreiten auf ganze CSS-Pixel), eine Hintergrundgröße rundet er nicht — bei
   jeder Pixeldichte anderthalbmal die Tinte der Unterstreichung, gleich weich gerastert. Im Modus
   für erzwungene Farben fällt der Hintergrund weg, dort trägt ein Rahmen den Strich. Der Kasten
   ist in Ruhe und hervorgehoben gleich hoch — kein Layoutsprung. */
.brand-lockup { display: inline-block; white-space: nowrap; }
.brand-lockup::after {
    content: "";
    display: inline-block;
    width: 100%;
    margin-left: -100%;
    height: 2px;
    vertical-align: calc(-0.25 * var(--kopf-schrift) - 2px);
}
.site-header nav a.brand:hover,
.site-header nav a.brand:focus-visible { text-decoration-line: none; }
.site-header nav a.brand:hover .brand-lockup::after,
.site-header nav a.brand:focus-visible .brand-lockup::after { background: linear-gradient(currentColor, currentColor) 0 0 / 100% 1.5px no-repeat; }
@media (forced-colors: active) {
    .site-header nav a.brand:hover .brand-lockup::after,
    .site-header nav a.brand:focus-visible .brand-lockup::after { height: 0; border-top: 2px solid currentColor; }
}
/* ≤ 768 px (2026-09-23, Stefan; bis 2026-09-29 ≤ 600 px — mit dem vierten Kopfpunkt passt die
   Zeile erst ab ~725 px, LE6): EINE Zeile statt des Tab-Streifens — die Wortmarke füllt sie
   (flex: 1; der Link bleibt breit, der Strich gehört dem Lockup), der Hamburger steht rechts (44 px
   Zielfläche, mittig in der Zeile, deshalb align-items: center statt baseline). Das OFFENE Menü
   hängt als Tafel unter der haftenden Kopfzeile: top: 100 % der positionierten Kopfzeile, keine
   Höhenkonstante. Nur das offene Menü trägt die Tafel — geschlossen bliebe vom leeren Polster
   sonst ein Streifen unter der Kopfzeile (geprobt). Inhaltsseiten bleiben skriptfrei: <details>
   schaltet nativ, die Enhanced Navigation räumt das open-Attribut beim Seitenwechsel ab. */
@media (max-width: 48rem) {
    html { --kopf-hoehe: 4.25rem; } /* gemessen 67,9 px: Wortmarke 45 px + Polster 2 × 10,4 + Rand 2 (seit 2026-09-26, davor 66,9 mit Rand 1) — auf html wie der Deckel oben, gewinnt nach Reihenfolge — bei 390 UND 768 px (LE9) */
    .site-header nav { align-items: center; }
    .site-header nav .brand { flex: 1; margin-right: 0; }
    /* LE9 (2026-09-29): bis 768 px bleibt die Wortmarke auf dem Boden ihres clamp() (23,2 px) — sonst wüchse die
       Kopfzeile auf 70,09 px über den Deckel von 68 px. a.brand, nicht .brand: nur gleiche Spezifität wie die
       Grundregel (0,2,2) schlägt sie (die margin-right: 0 der Zeile davor verliert aus demselben Grund, § 6). */
    .site-header nav a.brand { font-size: 1.45rem; }
    /* Die Wortmarke steht ohne Nachbarlinks in der Zeile — der Strich hängt wieder 0,25 des
       eigenen em unter der Grundlinie. */
    .site-header nav .brand .brand-lockup::after { vertical-align: calc(-0.25em - 2px); }
    .kopfmenue { display: block; }
    .kopfmenue summary { display: flex; align-items: center; justify-content: center; width: 2.75rem; height: 2.75rem; margin-left: auto; border-radius: var(--radius-s); color: var(--tinte); cursor: pointer; }
    .kopfmenue summary:hover, .kopfmenue summary:focus-visible, .kopfmenue[open] summary { color: var(--marke); }
    .kopfmenue::details-content { display: block; }
    .kopfmenue[open]::details-content { position: absolute; top: 100%; left: 0; right: 0; display: flex; flex-direction: column; align-items: flex-start; gap: 0.25rem; padding: var(--raum-1) clamp(1rem, 4vw, 3rem) var(--raum-2); background: var(--papier); border-bottom: 2px solid var(--rand-stark); box-shadow: 0 2px 12px var(--schatten); }
    .kopfmenue a:not(.cta) { display: block; padding: 0.5rem 0; }
    .kopfmenue a.cta { margin-top: var(--raum-1); }
}

main {
    flex: 1;
    width: 100%;
    max-width: 72rem;
    margin: 0 auto;
    padding: var(--raum-4) clamp(1rem, 4vw, 3rem) var(--raum-6);
}
/* Die Check-Seiten tragen die Breite von vor dem Breiten-Pass (Stefan 2026-09-24). main darf kein
   class-Attribut tragen — erkannt wird /check am statischen .check-laden, das bis zum nächsten
   Seitenwechsel im DOM bleibt. Die ERGEBNISSEITE trägt seit 2026-09-30 wieder die 72rem jeder anderen
   Seite (Stefan: „increase the ergebnis page width to the width of the other pages" — Ruling PK4):
   erkannt am .wizard-ergebnis der Wizard-Sektion, die Regel steht HINTER der Check-Regel und gewinnt
   bei gleicher Spezifität als spätere; die Fragebildschirme bleiben bei 52rem (unten der Wizard 44rem).
   Im Druck fällt beides mit dem main-Deckel (der Druckblock ist der letzte). */
main:has(> .check-laden) { max-width: 52rem; }
main:has(> .wizard > .wizard-ergebnis) { max-width: 72rem; }

details { border-top: 1px solid var(--rand); padding: var(--raum-1) 0; }
details > summary { cursor: pointer; font-weight: 600; color: var(--marke); list-style: none; }
details > summary::-webkit-details-marker { display: none; }
details > summary::before { content: "▸ "; display: inline-block; transition: transform .15s; }
details[open] > summary::before { transform: rotate(90deg); }

/* Niedriger Fuß (Stefan 2026-09-22: „reduce the height of the footer"): --raum-2 oben und unten,
   bis dahin --raum-3 / --raum-4 (80 → 56 px bei 1920 × 1080). Das Seitenpolster bleibt das von
   main — im Tab-Streifen begrenzt es die Fußleiste auf die Spalte. */
.site-footer {
    border-top: 2px solid var(--rand-stark);
    padding: var(--raum-2) clamp(1rem, 4vw, 3rem) var(--raum-2);
    font-size: 0.9rem;
    color: var(--tinte-2);
}
/* Die Fußnavigation trägt seit 2026-09-22 (Stefan: „on the footer remove everything except
   Impressum and Datenschutz, where one is left and one right") genau die zwei Rechtstexte aus dem
   SeitenRegister: Impressum am linken, Datenschutz am rechten Rand der Spalte (space-between), auf
   jeder Breite — der Cluster steht in den Kacheln der Landing und im Hub. Bis dahin: der ganze
   Cluster plus Rechtstexte, zentriert, im Tab-Streifen linksbündig. Die Leiste spannt die Breite
   des KOPFCLUSTERS (Stefan, zweite Runde: „closer together like the distance of konformo to
   betroffenheitscheck in the header"): Impressum beginnt an der linken Kante der Wortmarke,
   Datenschutz endet an der rechten Kante des Check-Buttons. Der Kopf zentriert seine Elemente in
   Inhaltsbreite; ab rund 1216 px stehen alle Kopfschriften an ihren clamp()-Deckeln, dann ist der
   Cluster 584,54 px breit (Summe der Kopfelemente, gerundet Wortmarke 136 + margin-right 16 + „NISG 2026" 95 +
   „Leistungen" 94 + „FAQ" 35 + Button 208, bei 1920 in Chromium gemessen, 2026-09-29, Spec § 2) — die
   Konstante 36,53rem = 584,48 px; dazu VIER Kopfabstände
   (zwei Flex-Kinder der nav + drei Lücken zwischen den vier Menüpunkten) — FussleisteE2ETests
   misst die Kanten bei 1920 und 2560 px; ändert sich ein Kopftext, ändert sich hier die Konstante.
   Unter 1216 px ist die Leiste um wenige Pixel breiter als der Cluster, im Tab-Streifen begrenzt
   sie das Polster des Fußes auf die Spalte. */
.site-footer-nav { display: flex; flex-wrap: wrap; justify-content: space-between; gap: 0.5rem 1.5rem; max-width: calc(36.53rem + 4 * var(--kopf-abstand)); margin: 0 auto; }
.site-footer-nav a { color: var(--tinte-2); }
.site-footer-nav a[aria-current="page"] { color: var(--tinte); }

/* ---- Landing (Spec § 4.2, L2) ---------------------------------------------------- */

.hero-split {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: var(--raum-3) clamp(1.5rem, 4vw, 3.5rem);
    align-items: center;
    padding: var(--raum-3) 0 var(--raum-4);
}
@media (max-width: 56rem) { .hero-split { grid-template-columns: 1fr; } }
/* Hero-Pass 2026-09-17: Eyebrow + H1 über beiden Spalten; den Abstand zum Lead trägt der
   Zeilenabstand des Rasters, nicht der H1-Rand. */
.hero-kopf {
    grid-column: 1 / -1;
}
.hero h1 { font-size: clamp(2rem, 1.3rem + 2.8vw, 3rem); margin-bottom: 0; }
.hero-lead { font-size: 1.1rem; color: var(--tinte); }

.check-cta { margin: var(--raum-3) 0 0; }
.check-cta p { margin: 0; }

.cta {
    display: inline-block;
    background: var(--marke);
    color: #fff;
    text-decoration: none;
    font-weight: 600;
    padding: 0.8rem 1.5rem;
    border-radius: var(--radius-s);
}
.cta:hover, .cta:focus-visible { background: var(--marke-dunkel); color: #fff; }

.ergebnis-vorschau {
    background: var(--flaeche);
    border: 1px solid var(--rand);
    border-left: 4px solid var(--marke);
    border-radius: var(--radius-m);
    padding: var(--raum-3) var(--raum-3) var(--raum-2);
    box-shadow: 0 10px 30px rgba(31, 42, 36, 0.06);
}
.vorschau-etikett { margin: 0; font-size: 0.75rem; letter-spacing: 0.1em; text-transform: uppercase; font-weight: 600; color: var(--marke); }
.vorschau-verdikt { font-family: var(--schrift-serif); font-weight: 600; font-size: 1.6rem; line-height: 1.15; margin: 0.25rem 0 0; }
.vorschau-einzeiler { font-size: 0.95rem; margin: 0.4rem 0 0; }
/* Die zwei Fristen-Spalten stehen 2.5rem = 40 px auseinander (Stefan 2026-09-22: „a little bit
   more space between inkraftreten and registrierung", dann „increase the distance further to
   40px"; bis dahin --raum-3, dann --raum-4 — kein --raum-*-Token trägt 2.5rem). */
.vorschau-zahlen { display: flex; gap: 2.5rem; margin: var(--raum-2) 0 0; }
.vorschau-zahlen div { margin: 0; }
.vorschau-zahlen dt { font-size: clamp(0.8rem, 0.7rem + 0.3vw, 0.9rem); color: var(--tinte-2); }
.vorschau-zahlen dd { margin: 0; font-family: var(--schrift-serif); font-weight: 600; font-size: clamp(1.25rem, 1rem + 0.6vw, 1.4rem); color: var(--akzent); }
.vorschau-spur { font-size: 0.8rem; color: var(--tinte-2); margin: var(--raum-2) 0 0; }

.landing-block { margin-top: var(--raum-5); }
.landing-hinweis { font-size: 0.9rem; color: var(--tinte-2); }

.schritt-karten { list-style: none; padding: 0; margin: 0; display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--raum-2); }
@media (max-width: 48rem) { .schritt-karten { grid-template-columns: 1fr; } }
.schritt-karten li { background: var(--flaeche); border: 1px solid var(--rand); border-radius: var(--radius-m); padding: var(--raum-2) var(--raum-3); }
.schritt-nr { font-family: var(--schrift-serif); font-weight: 600; font-size: 1.6rem; color: var(--akzent); line-height: 1; margin-right: var(--raum-1); }
.schritt-nr + div { display: inline; }

.kacheln { list-style: none; padding: 0; margin: 0; display: grid; grid-template-columns: repeat(2, 1fr); grid-auto-rows: 1fr; gap: var(--raum-2); }
@media (max-width: 40rem) { .kacheln { grid-template-columns: 1fr; } }
.kachel { display: block; height: 100%; background: var(--flaeche); border: 1px solid var(--rand); border-radius: var(--radius-m); padding: var(--raum-2) var(--raum-3); text-decoration: none; color: var(--tinte); }
.kachel:hover, .kachel:focus-visible { border-color: var(--marke); }
.kachel strong { display: block; font-family: var(--schrift-serif); font-weight: 600; font-size: 1.1rem; color: var(--marke); margin-bottom: 0.25rem; }
.kachel span { font-size: 0.92rem; color: var(--tinte-2); }

.vertrauen-zeile { list-style: none; padding: 0; margin: 0; display: flex; flex-wrap: wrap; gap: var(--raum-1) var(--raum-2); }
.vertrauen { border: 1px solid var(--rand); background: var(--flaeche); border-radius: 999px; padding: 0.2rem 0.8rem; font-size: 0.85rem; color: var(--tinte-2); }

/* ---- Inhaltsseiten (Spec § 4.3) ---------------------------------------------------- */

.inhalt h1, .rechtstext h1 { font-size: clamp(1.9rem, 1.3rem + 2vw, 2.5rem); }
.inhalt-kopf { margin-bottom: var(--raum-3); }
.inhalt-lead { font-size: 1.1rem; }
/* Die Haarlinie über jeder h2 gliedert die langen Cluster-Seiten in sichtbare Abschnitte —
   dieselbe Trennung, die „Auf dieser Seite" verlinkt. */
.inhalt h2 { padding-top: var(--raum-1); border-top: 1px solid var(--rand); }
.inhalt h3 { font-family: var(--schrift-sans); font-weight: 600; font-size: 1.05rem; letter-spacing: 0; }
.inhalt li { margin-bottom: 0.4rem; }
.rechtstext h2 { font-size: 1.3rem; }

/* 2026-09-23 (Stefan): „Auf dieser Seite" liest sich in der Schriftgröße des Fließtexts — keine
   eigene font-size (bis dahin 0.92rem), Etikett und Links erben vom Körper (Ruling AS1). */
.auf-dieser-seite { margin: var(--raum-2) 0 var(--raum-3); padding: var(--raum-2) var(--raum-3); background: var(--flaeche); border: 1px solid var(--rand); border-radius: var(--radius-m); }
.auf-dieser-seite ul { margin: 0.25rem 0 0; padding-left: 1.1rem; }

.gesetzeszitat {
    margin: var(--raum-3) 0;
    padding: var(--raum-2) var(--raum-3);
    border-left: 4px solid var(--marke);
    background: var(--flaeche);
    border-radius: 0 var(--radius-m) var(--radius-m) 0;
}
.gesetzeszitat .zitat-quelle { display: block; font-style: normal; font-size: 0.8rem; letter-spacing: 0.08em; font-weight: 600; color: var(--marke); margin-bottom: 0.35rem; }
.gesetzeszitat .zitat-text { margin: 0; font-family: var(--schrift-serif); font-weight: 600; font-size: 1.02rem; line-height: 1.55; }
/* Die Serif hat nur das Gewicht 600 (Ruling R1) — hier bewusst als „gesetzter" Text. */

/* Die Fristentabelle ist breiter als ein Telefondisplay: sie scrollt in ihrem eigenen
   Container, nicht im Seitenkörper. */
.tabelle-scroll { overflow-x: auto; margin: var(--raum-3) 0; border: 1px solid var(--rand); border-radius: var(--radius-m); background: var(--flaeche); }
.fristen-tabelle, .ops-tabelle { border-collapse: collapse; width: 100%; min-width: 38rem; font-size: 0.95rem; }
.ops-tabelle caption { text-align: left; font-size: 0.9rem; color: var(--tinte-2); padding: var(--raum-1) var(--raum-2); }
.fristen-tabelle th, .fristen-tabelle td, .ops-tabelle th, .ops-tabelle td { border-bottom: 1px solid var(--rand); padding: 0.6rem 0.9rem; text-align: left; vertical-align: top; }
.fristen-tabelle thead th, .ops-tabelle thead th { background: var(--marke-hell); border-bottom: 2px solid var(--marke); }
.fristen-tabelle tbody tr:nth-child(even) td, .ops-tabelle tbody tr:nth-child(even) td { background: var(--papier); }
.fristen-tabelle tbody th { font-family: var(--schrift-serif); font-weight: 600; color: var(--marke); white-space: nowrap; }
.ops-tabelle td:first-child { font-weight: 600; }

/* ---- Hinweis-Familie (eine Optik für Tipps, Boot-/Fehler-UI, Resume-Banner) ------ */
/* Tipp, noscript-Hinweis, Ladefehler und Resume-Banner sahen bis Phase 6 verschieden aus,
   obwohl sie dasselbe sagen: „lies das, bevor du weiterklickst". Ein Rahmen, ein grüner
   Balken links — die Farbe wechselt NUR beim Fehler. */
.hinweis-box, .wizard-hinweis {
    border: 1px solid var(--rand);
    border-left: 4px solid var(--marke);
    background: var(--flaeche);
    padding: var(--raum-2) var(--raum-3);
    border-radius: 0 var(--radius-m) var(--radius-m) 0;
    margin: var(--raum-2) 0;
}
.hinweis-box p, .wizard-hinweis p { margin: 0.4rem 0; }
.hinweis-box.fehler, .wizard-hinweis.fehler { border-left-color: var(--fehler); background: var(--fehler-hell); }
.hinweis-box button, .resume-banner button { font: inherit; padding: 0.45rem 0.9rem; border-radius: var(--radius-s); border: 1px solid var(--marke); background: var(--flaeche); color: var(--marke); cursor: pointer; margin: 0.25rem 0.5rem 0 0; }
.hinweis-box button:hover, .resume-banner button:hover { background: var(--marke-hell); }

/* ---- /check: Insel-Gerüst ---------------------------------------------------------- */
.check-laden { padding: var(--raum-4) 0; color: var(--tinte-2); }

/* ---- Wizard (Spec § 5.1) ------------------------------------------------------------ */
.wizard { max-width: 44rem; }
/* PK4 (2026-09-30): mit dem Ergebnis füllt die Sektion das 72rem-main — die Fragebildschirme bleiben 44rem. */
.wizard:has(> .wizard-ergebnis) { max-width: none; }
.wizard-fortschritt { margin-bottom: 0.25rem; }
#wizard-titel:focus { outline: none; }
.wizard-screen { margin-top: var(--raum-3); }

.radio-cards { border: 0; padding: 0; margin: var(--raum-3) 0; }
.radio-cards legend { font-weight: 600; margin-bottom: var(--raum-1); }
/* Die ganze Karte ist das Label — sie ist damit auch die Trefferfläche (≥ 44 px),
   und das native Radio/Checkbox bleibt im DOM: sichtbar, fokussierbar, vorlesbar. */
.radio-card {
    display: flex;
    gap: 0.75rem;
    align-items: baseline;
    min-height: 44px;
    border: 1px solid var(--rand);
    background: var(--flaeche);
    border-radius: var(--radius-m);
    padding: 0.75rem 1rem;
    margin-bottom: 0.5rem;
    cursor: pointer;
}
.radio-card:hover { border-color: var(--marke); }
.radio-card:has(input:checked) { border-color: var(--marke); background: var(--marke-hell); box-shadow: inset 0 0 0 1px var(--marke); }
.radio-card:focus-within { outline: 2px solid var(--marke); outline-offset: 2px; }
.radio-card input { accent-color: var(--marke); }

/* `> label` grenzt die Auswahl der Karte selbst von den Ausnahme-Radios in ihrem
   Inneren ab: nur der eigene Schalter färbt die Karte. */
.entity-card { border: 1px solid var(--rand); background: var(--flaeche); border-radius: var(--radius-m); padding: 0.75rem 1rem; margin-bottom: 0.5rem; }
.entity-card:has(> label input:checked) { border-color: var(--marke); background: var(--marke-hell); }
.entity-card > label { display: flex; gap: 0.75rem; cursor: pointer; min-height: 28px; align-items: baseline; }
.entity-card input { accent-color: var(--marke); }
.entity-details { border-top: 0; padding: 0.25rem 0 0; }
.entity-details summary { font-size: 0.92rem; font-weight: 500; }
.ausnahme-frage { margin: 0.75rem 0 0 1.5rem; }
.ausnahme-umleitung { margin: 0.5rem 0 0; font-size: 0.95rem; }

.wizard-nav { display: flex; justify-content: space-between; gap: var(--raum-2); margin-top: var(--raum-4); }
.wizard-nav button { font: inherit; font-weight: 600; padding: 0.7rem 1.5rem; border-radius: var(--radius-s); border: 1px solid var(--marke); background: var(--flaeche); color: var(--marke); cursor: pointer; }
.wizard-nav button.wizard-weiter, .wizard-nav button.s2-gate-ja { background: var(--marke); color: #fff; margin-left: auto; }
.wizard-nav button.wizard-weiter:hover:not([disabled]) { background: var(--marke-dunkel); }
.wizard-nav button[disabled] { opacity: 0.5; cursor: not-allowed; }
/* Die eigene Wizard-Leiste haftet unten — seit 2026-09-25 auf JEDER Breite (Stefans Befund: auf S2 mit
   offenem Gate und auf S3 mit 67 Karten lagen die Knöpfe bei 1920 × 1080 551 bzw. 5 529 px unter dem
   Falz; bis dahin nur ≤ 600 px, Phase 7 § 5.1). Spec 2026-09-25-wizard-leiste-design, WL1–WL3′.
   Der Kasten behält die Grundgeometrie von .wizard-nav und haftet --raum-2 über der Fensterkante; den
   Streifen — Papier und Trennlinie, je --raum-2 über und unter den Knöpfen, in der Wizard-Spalte — malt
   ::before AUSSERHALB des Kastens (absolut, z-index -1 im eigenen Stapel): so wird kein Schritt höher.
   S1 ist bei 1920 × 1080 1 081 px hoch — die Regel im Fluss (Polster + Rand, +25 px) hätte ihm eine
   Bildlaufleiste gegeben (KopfnavigationRuhtE2ETests). In Ruhe liegt die Linie eine Einheit über den
   Knöpfen, wie am Handy. NUR die eigene Leiste (`wizard-nav-sticky`): das S2-Dienste-Gate rendert eine
   zweite `.wizard-nav` für dieselbe Knopfoptik — klebten beide, lägen sie übereinander. Das Polster
   unten für den Tastaturfokus steht in der Regel html:has(.wizard-nav-sticky) hinter der html-Regel
   (scroll-padding-bottom).
   Wizard-Kasten (2026-09-26, Stefan: „can we make the border fully around zurück/weiter - so also
   left/right/bottom"): das ::before ist ein VOLLER Kasten — Rand 2 px --rand-stark auf allen vier Seiten, Radius
   --radius-m wie die Karten, Papier (WK1/WK3) — und liegt auf dem Spaltenraster: die Knöpfe rücken per WAAGRECHTEM
   Polster der Leiste (padding: 0 --raum-2) in den Kasten; senkrecht trägt die Leiste weiter kein Polster, kein
   Schritt wird höher (WL3′ bleibt, S1 weiter ohne Bildlaufleiste). Die Leiste haftet 2 × --raum-2 über der
   Fensterkante, der Kasten endet also --raum-2 darüber und der Inhalt läuft in der Lücke sichtbar durch (WK2,
   überstimmt WL2 „Streifen bis zur Fensterkante"); in Ruhe steht der Kasten im Fluss unter der letzten Karte. */
.wizard-nav-sticky { position: sticky; bottom: calc(2 * var(--raum-2)); z-index: 5; padding: 0 var(--raum-2); }
.wizard-nav-sticky::before { content: ""; position: absolute; inset: calc(-1 * var(--raum-2)) 0; z-index: -1; background: var(--papier); border: 2px solid var(--rand-stark); border-radius: var(--radius-m); }
/* Scroll-Schatten (2026-09-26, Stefan: „when scrolled down sometimes i dont know that there is content behind/above
   the header. at the check the same problem exist (down/beyond the zurück/weiter buttons)"). Kopfzeile und
   Wizard-Leiste sind dasselbe Papier wie die Seite; steht unter der Linie gerade eine Absatzlücke, sieht nichts
   abgeschnitten aus. Der Hinweis ist deshalb ein Zustand der LEISTE, nicht des Inhalts: ein Schatten, den eine
   Scroll-Timeline führt — Kopfzeile: keiner am Seitenanfang, voll nach 3 rem Scrollweg; Streifen der Wizard-Leiste:
   nach oben geworfen vom Anfang bis 3 rem vor dem Ende, keiner am Ende (der Bereich ist am Ende des Scrollwegs
   verankert). Kein Skript (die Inhaltsseiten bleiben skriptfrei), keine Geometrie (KP1, --kopf-hoehe, WL3′
   unberührt). Scrollt eine Seite gar nicht (S1 bei 1920 × 1080), ist die Timeline inaktiv und die Grundregel gilt:
   kein Schatten — nichts liegt dahinter. Der @supports-Wächter ist PFLICHT: ohne Scroll-Timelines liefe dieselbe
   Animation als Zeitanimation von 0 s und stünde sofort auf dem Endbild (Schatten immer, auch am Anfang); mit ihm
   rendert ein älterer Browser die Seite von heute. Chromium 115, Safari 26, Firefox 159 (caniuse 2026-09-26;
   animation-range in denselben Versionen). Reihenfolge: das Kurzformat `animation` setzt animation-timeline und
   animation-range zurück — beide stehen DAHINTER. Der Wizard-Kasten wirft einen Umgebungsschatten (0 0 12px, WK4)
   nach allen Seiten — bis zum Kasten (2026-09-26) war es ein Schatten nach oben (0 -2px 12px) mit clip-path auf die
   Oberkante, weil der randlose Streifen seitlich zwei Schleier aufs Papier gemalt hätte. Im Druck löst der
   Druckblock die Animation der Kopfzeile (Papier scrollt nicht; die
   Wizard-Leiste druckt nicht); unter forced-colors setzt der Browser box-shadow selbst auf none. Die Menütafel
   ≤ 768 px (seit 2026-09-29, LE6) trägt ihren Schatten offen immer (Kopfblock): offen liegt sie immer über Inhalt. */
@supports (animation-timeline: scroll()) {
    .site-header { animation: kopf-schatten linear both; animation-timeline: scroll(root); animation-range: 0 3rem; }
    .wizard-nav-sticky::before { animation: leiste-schatten linear both; animation-timeline: scroll(root); animation-range: calc(100% - 3rem) 100%; }
    @keyframes kopf-schatten { from { box-shadow: none; } to { box-shadow: 0 2px 12px var(--schatten); } }
    @keyframes leiste-schatten { from { box-shadow: 0 0 12px var(--schatten); } to { box-shadow: none; } }
}

.s3-suche { display: block; width: 100%; font: inherit; padding: 0.7rem 0.9rem; border: 1px solid var(--rand); border-radius: var(--radius-s); margin-top: 0.5rem; background: var(--flaeche); }
.s3-suche:focus { border-color: var(--marke); }
.s3-suche-label > span { font-weight: 600; }
.s3-abschnitt { font-family: var(--schrift-sans); font-size: 1rem; margin: var(--raum-3) 0 var(--raum-1); }
.s3-disambiguator { margin: -0.25rem 0 0.75rem 1rem; font-size: 0.95rem; color: var(--tinte-2); }
.s3-nichts-davon-card { margin-top: var(--raum-2); }

.s4-definition, .s5b-beispiele, .s5-gesetzestext, .exakt-schwellen { font-size: 0.95rem; color: var(--tinte-2); }
.s4-exakt { margin-top: var(--raum-2); }
.s4-exakt label, .s5-jae-exakt label, .exakt-rechner label { display: block; margin: 0.5rem 0; }
.s4-exakt input, .s5-quote input, .s5-jae-exakt input, .exakt-rechner input, .share-zeile input, .pdf-cta input.pdf-email {
    font: inherit; padding: 0.5rem 0.7rem; border: 1px solid var(--rand); border-radius: var(--radius-s); background: var(--flaeche); }
.s4-exakt input, .s5-quote input, .s5-jae-exakt input, .exakt-rechner input { margin-left: 0.5rem; }
.s5b-kriterien li { margin-bottom: 0.5rem; }
.s5-zeile { border: 1px solid var(--rand); background: var(--flaeche); border-radius: var(--radius-m); padding: var(--raum-2); margin-bottom: var(--raum-2); }
.s5-baender { display: flex; flex-wrap: wrap; gap: 1rem; margin: 0.75rem 0; }
.s5-baender select { font: inherit; padding: 0.4rem 0.6rem; border: 1px solid var(--rand); border-radius: var(--radius-s); background: var(--flaeche); }
.s5-stiftung { display: flex; gap: 0.5rem; margin: 0.5rem 0; }
.s5-jae-exakt { margin: 0.75rem 0; }
.s5-oeffentliche-karte { margin-top: var(--raum-2); }
.s5-gabelung { border-top: 1px solid var(--rand); margin-top: var(--raum-3); padding-top: var(--raum-2); }
.s5-gabelung button, .exakt-rechner button.exakt-berechnen, .share-zeile button, .antworten-aendern button {
    font: inherit; padding: 0.5rem 1rem; border-radius: var(--radius-s); border: 1px solid var(--marke); background: var(--flaeche); color: var(--marke); cursor: pointer; }
.s5-gabelung button:hover, .exakt-rechner button.exakt-berechnen:hover:not([disabled]), .share-zeile button:hover, .antworten-aendern button:hover { background: var(--marke-hell); }
.exakt-rechner button.exakt-berechnen[disabled] { opacity: 0.5; cursor: not-allowed; }

/* Fix-Welle (Ruling E16): die S5-Zeilenknöpfe sind die letzten ungestylten UA-Knöpfe im
   Wizard — `.s5-zeile-neu` (neue Zeile) und der Zeilen-Entfernen-Knopf (Klasse dynamisch
   `s5-entfernen-{i}`, daher strukturell über `.s5-zeile button`; im Markup ist der
   Entfernen-Knopf der einzige `<button>` innerhalb von `.s5-zeile`) tragen jetzt dieselbe
   Sekundär-Optik. Nur `.s5-zeile-neu` kennt `disabled` (Zeilenlimit) — Hover-Sperre und
   Opazität spiegeln `.exakt-berechnen`. */
.s5-zeile button, .s5-zeile-neu {
    font: inherit; padding: 0.5rem 1rem; border-radius: var(--radius-s); border: 1px solid var(--marke); background: var(--flaeche); color: var(--marke); cursor: pointer; }
.s5-zeile button:hover, .s5-zeile-neu:hover:not([disabled]) { background: var(--marke-hell); }
.s5-zeile-neu[disabled] { opacity: 0.5; cursor: not-allowed; }

/* ---- Ergebnisseite (Spec § 5.2, R1) ------------------------------------------------
   Der Kopf ist die Zusammenfassungs-Karte: Eyebrow, Verdikt, Kennzeichen und die
   Kennzahlenreihe des Countdowns in EINEM Block. Darunter die Abschnitte: Fristen, Kaufauslöser, CTAs,
   Rechtsgrundlage, Antworten ändern (Stefan 2026-09-26 „konformo übernimmt das box beyond the fristen, then the
   ergebnis link and report box"; bis dahin die Spec-Reihenfolge mit der Rechtsgrundlage vor den CTAs und dem
   Kaufauslöser dahinter, bis 2026-09-26 zudem die Ankerleiste). */

.ergebnis-kopf { background: var(--flaeche); border: 1px solid var(--rand); border-left: 4px solid var(--marke); border-radius: var(--radius-m); padding: var(--raum-3) var(--raum-3) var(--raum-2); }
.ergebnis-kopf.warn { border-left-color: var(--akzent); }
.ergebnis-kopf h1 { margin-bottom: 0.35rem; }
.ergebnis-kopf > p { margin: 0 0 var(--raum-1); }
.ergebnis-badges { list-style: none; display: flex; flex-wrap: wrap; gap: 0.5rem; padding: 0; margin: var(--raum-1) 0; }
.ergebnis-badges .badge { border: 1px solid var(--rand); border-radius: 999px; padding: 0.15rem 0.75rem; font-size: 0.85rem; background: var(--papier); }
.countdown { margin: var(--raum-2) 0 0; }
/* Stefan 2026-09-26 („more spacing between inkraftreten and registrierung on ergebnis (like on landing page)"):
   der Abstand der zwei Kennzahlen ist der der Landing-Vorschau (.vorschau-zahlen, 2.5rem = 40 px) — dieselbe
   Zahl, kein --raum-*-Token trägt sie; bis dahin --raum-3. */
.kennzahlen { display: flex; flex-wrap: wrap; gap: 2.5rem; margin: 0; }
.kennzahlen div { margin: 0; }
.kennzahlen dt { font-size: 0.85rem; color: var(--tinte-2); }
.kennzahlen dd { margin: 0; font-family: var(--schrift-serif); font-weight: 600; font-size: 1.5rem; color: var(--akzent); line-height: 1.1; }

/* Bis 2026-09-26 stand hier die Ankerleiste des Ergebnisses (haftend unter der Kopfzeile, z-index 4,
   dazu ein Scrollrand der Abschnitte um ihre Höhe) — auf Stefans Order entfernt (Ruling EF2);
   das Fokusziel des Exakt-Rechners (.ergebnis-ctas) landet über das scroll-padding-top von html. */

/* Fristen (D10): jede Zeile trägt ihren VOLLEN Text — Datum in der linken Spalte,
   Text in der rechten, nichts abgeschnitten, nichts eingeklappt. */
.fristen-liste { list-style: none; padding: 0; margin: 0; }
.frist { display: grid; grid-template-columns: 9rem 1fr; gap: var(--raum-2); padding: var(--raum-2) 0; border-bottom: 1px solid var(--rand); }
@media (max-width: 40rem) { .frist { grid-template-columns: 1fr; gap: 0.25rem; } }
.timeline-datum { font-family: var(--schrift-serif); font-weight: 600; color: var(--marke); }
/* Der Marker der Fristzeilen (seit den Leistungs-Rollen 2026-09-30 mehrere je Zeile, RS7 — seit Stefans Kurzform am selben
   Tag nur mit dem Verb, „Konformo bereitet vor" / „Bei Ihnen: Übermittlung", PK1–PK3;
   davor „Konformo unterstützt dabei" / „… bereitet das vor" seit dem Leistungs-Pass 2026-09-29, am selben Tag davor
   mit „… übernimmt das", bis dahin „Konformo erledigt das") — seit 2026-09-27
   wieder eine Pille weiß auf Marke (Stefan:
   „green background (like before) - keep the rest of the style (font size etc)"), in der Zeilenform vom
   2026-09-26 (Stefan: „in a new line with a check icon and a little bit bigger font"): das letzte Kind der
   Textzelle als Flex-Kasten — eine
   eigene Zeile unter dem Text, in der Textspalte —, dessen Fläche sich um den Inhalt schließt (fit-content, nicht
   um die Spalte), 1.1em der Zeile (etwas größer als der Text), halbfett, der Haken der Wortmarke davor in
   currentColor, also weiß. Bis 2026-09-26 eine kleine Pille (0.78rem, nowrap) mitten im Text, an diesem Tag eine
   flächenlose Zeile in Markenfarbe. Weiß auf Marke braucht den Druck-Reset am Ende der Datei. */
.timeline-marker { display: flex; width: fit-content; align-items: center; gap: 0.4em; padding: 0.15em 0.75em; border-radius: 999px; background: var(--marke); color: #fff; font-family: var(--schrift-sans); font-weight: 600; font-size: 1.1em; }
.timeline-marker svg { width: 1em; height: 1em; flex: none; }
/* Leistungs-Rollen 2026-09-30 (RS7, RB7; Rulings RL7/RL10): eine Zeile trägt so viele Pillen, wie sie Rollen hat —
   untereinander mit 0.35rem Luft im Behälter .frist-pillen, dem letzten Kind der Textzelle (der Abstand zum Text hängt am
   Behälter, die Pille trägt keinen mehr); jede Pille mit dem Zeichen ihrer Rolle statt immer dem Haken. Die Sie-Pille ist
   ein Umriss in Marke (1.5 px als inset-Schatten, keine Randlinie — derselbe Kasten wie die Konformo-Pille), Text in Marke,
   Stärke 500 (IBM Plex Sans variabel). Kein nowrap — bis zur Kurzform (PK1, 2026-09-30) brach die längste Pille am Telefon
   auf zwei Zeilen um (gewollt); seit ihr (33 Zeichen) bricht keine mehr, die Regel bleibt. */
.frist-pillen { display: flex; flex-direction: column; align-items: flex-start; gap: 0.35rem; margin-top: 0.45rem; }
.timeline-marker.sie { background: transparent; color: var(--marke); box-shadow: inset 0 0 0 1.5px var(--marke); font-weight: 500; }

.fakten-chips { list-style: none; padding: 0; margin: 0 0 var(--raum-2); display: flex; flex-wrap: wrap; gap: 0.5rem; }
.fakten-chips li { border: 1px solid var(--rand); background: var(--flaeche); border-radius: var(--radius-s); padding: 0.25rem 0.7rem; font-size: 0.92rem; }
.trace-pinned { border: 1px solid var(--rand); border-left: 4px solid var(--marke); background: var(--flaeche); border-radius: 0 var(--radius-m) var(--radius-m) 0; margin: var(--raum-2) 0; padding: var(--raum-2) var(--raum-3); }
.trace-pinned p { margin: 0.25rem 0; }
.pflichten-block { border: 1px solid var(--rand); background: var(--flaeche); border-radius: var(--radius-m); padding: var(--raum-2) var(--raum-3); margin: var(--raum-2) 0; }
.info-note { margin: var(--raum-2) 0; }

/* Exakt-Rechner der Ergebnisseite (D13) — Feld, Knopf und Kleinschrift kommen seit
   Aufgabe 5 aus den geteilten Wizard-Regeln oben, damit dieselbe Eingabe an beiden
   Stellen gleich aussieht. Hier bleibt nur, was die Ergebnisseite an Lage beisteuert. */
.exakt-rechner { margin-top: var(--raum-2); }
.exakt-rechner button.exakt-berechnen { margin-top: 0.5rem; }
.exakt-ergebnis { font-weight: 600; margin-top: 0.75rem; }
.exakt-schwellen { margin-top: 0.25rem; }

/* ---- Ergebnis-CTAs: Ergebnis-Link und PDF-Report als Karten ------------------------ */

.ergebnis-ctas { margin-top: var(--raum-4); }
.share-links { background: var(--flaeche); border: 1px solid var(--rand); border-radius: var(--radius-m); padding: var(--raum-2) var(--raum-3); margin-bottom: var(--raum-3); }
.share-links h2 { margin-top: 0; font-size: 1.25rem; }
.share-zeile { display: flex; gap: 0.5rem; align-items: flex-end; flex-wrap: wrap; }
.share-feld { flex: 1 1 20rem; }
.share-feld-label { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
.share-zeile input { display: block; width: 100%; }

/* Honeypot (Phase 4, spec § 5): für Menschen unsichtbar und unfokussierbar,
   für Formular-Bots ein ausfüllbares Feld. Bewusst offscreen statt display:none. */
.hp-feld { position: absolute; left: -9999px; top: auto; }

.pdf-cta { border: 1px solid var(--rand); border-top: 4px solid var(--marke); background: var(--flaeche); border-radius: var(--radius-m); padding: var(--raum-3); margin-top: var(--raum-2); }
.pdf-cta h2 { margin-top: 0; }
.pdf-cta label { display: block; margin: 0.75rem 0; }
/* Rahmen/Polsterung des Feldes: geteilte Eingabe-Regel oben. */
.pdf-cta input.pdf-email { display: block; width: 100%; margin-top: 0.25rem; }
/* Spezifität statt Reihenfolge (phase4-flags): `.pdf-cta label` ist (0,1,1) und schlug die
   Einwilligungszeile als (0,1,0) — die Flex-Ausrichtung war dadurch inert. */
.pdf-cta .pdf-einwilligung-zeile { display: flex; align-items: flex-start; gap: 0.5rem; }
.pdf-cta input[type="checkbox"] { accent-color: var(--marke); margin-top: 0.3rem; }
.pdf-cta-erfolg { color: var(--marke); font-weight: 600; }
.pdf-cta-fehler { color: var(--fehler); font-weight: 600; }
.pdf-cta button.pdf-cta-submit { font: inherit; font-weight: 600; padding: 0.7rem 1.5rem; border-radius: var(--radius-s); border: 1px solid var(--marke); background: var(--marke); color: #fff; cursor: pointer; }
.pdf-cta button.pdf-cta-submit:hover:not([disabled]) { background: var(--marke-dunkel); }
.pdf-cta button.pdf-cta-submit[disabled] { opacity: 0.5; cursor: not-allowed; }

/* Das Angebot steht seit 2026-09-26 direkt unter den Fristen, vor den CTAs (Stefan: „konformo übernimmt das
   box beyond the fristen"; bis dahin NACH den CTAs, Spec-Reihenfolge 7), und trägt als einziger Block der
   Seite die volle Markenfläche — es ist die eine laute Stelle. */
.kaufausloeser { background: var(--marke); color: #fff; border-radius: var(--radius-m); padding: var(--raum-3); margin-top: var(--raum-3); container-type: inline-size; }
.kaufausloeser h2 { color: #fff; margin-top: 0; }
.kaufausloeser a { color: #fff; }
/* LE12 (2026-09-29): der globale Fokusring ist --marke — auf der grünen Box unsichtbar; dort weiß. */
.kaufausloeser a:focus-visible { outline-color: #fff; }
.kaufausloeser ul { margin: 0; padding-left: 1.1rem; }
.kaufausloeser li { margin-bottom: 0.35rem; }
/* Die Schlusszeilen der Box (Gruppe, Kontakt) als p. Die Zwischenüberschrift „Was bei Ihnen bleibt:" (KB4, 2026-09-28) ist
   seit den Leistungs-Rollen 2026-09-30 weg — die h3 der Box sind die Gruppenköpfe (.rolle h3). */
.kaufausloeser p { margin: var(--raum-2) 0 0; }
/* Die Kontaktzeile „Interesse? …" — seit Stefans Order 2026-09-30 die LETZTE Zeile jeder Box (die Betreiberzeile RB10 und ihre
   Regel .rollen-betreiber, 0.9rem, sind weg — BZ1) — ist größer als der Fließtext (1.0625rem) und bleibt unter dem
   Gruppenkopf (.rolle h3, 1.2rem): BZ2; das PDF setzt sie 10,5 gegen 9,5 pt. Stefan „also the font a little bit thicker for
   Interesse line": Medium 500 der variablen IBM Plex Sans — über dem Fließtext (400), unter Pillen und Gruppenköpfen (600);
   das PDF hat nur Regular und SemiBold und setzt SemiBold (BZ5). */
.kaufausloeser .rollen-kontakt { font-size: 1.15rem; font-weight: 500; }
/* Leistungs-Rollen (2026-09-30, Hugos Brief docs/leistungen-rollen-brief.md RS2, Stefans RB6/RB7; Rulings RL4/RL5/RL9):
   der Block in der Box — drei Konformo-Gruppen weiß auf Marke (h3 mit Zeichen, EINE Linie unter dem Gruppenkopf aus
   durchscheinendem Weiß, die Punkte ohne Linien — RB6 überschreibt LL3), die Tafel „Bleibt bei Ihnen" hell (--marke-hell,
   Tinte, Gruppenkopf in Marke, ihre Linie --rand). Breite per Container-Abfrage der Box (container-type oben), mobile-first:
   eine Spalte von Haus aus, ab 52rem Box-Breite drei Spalten und die Tafel über die volle Breite mit zwei Spalten —
   Landing, /leistungen und seit der Hero-Breite der Ergebnisseite (PK4/PK5, 2026-09-30) auch die Ergebnis-Box werden am
   Desktop dreispaltig (bis dahin maß die Ergebnis-Box höchstens 44rem und blieb einspaltig); ein Browser ohne
   Container-Abfragen zeigt eine Spalte. Farbregel überall: Grün gefüllt = Konformo, hell oder Umriss = Sie.
   Der Druckblock (bleibt der letzte) setzt Linie und Tafel schwarz auf weiß. Gepinnt in RollenBlockTests. .rolle h3
   (ER10, 2026-09-30: die Schrift setzt der Block selbst — auf /leistungen griff sonst .inhalt h3 mit der Sans). */
.rollen { display: grid; grid-template-columns: 1fr; gap: var(--raum-3); margin-top: var(--raum-2); }
.rolle h3 { display: flex; align-items: center; gap: 0.55rem; margin: 0 0 0.6rem; padding-bottom: 0.5rem; border-bottom: 1px solid rgba(255, 255, 255, 0.5); color: #fff; font-family: var(--schrift-serif); font-size: 1.2rem; letter-spacing: -0.012em; }
.rollen-zeichen { width: 1.45em; height: 1.45em; flex: none; }
.rolle ul { margin: 0; padding-left: 1.1rem; }
.rolle li { margin: 0 0 0.45rem; }
.rolle small { font-size: 0.85em; opacity: 0.85; white-space: nowrap; }
.rolle-sie { background: var(--marke-hell); color: var(--tinte); border-radius: var(--radius-m); padding: var(--raum-2) var(--raum-3) var(--raum-1); }
.rolle-sie h3 { color: var(--marke); border-bottom-color: var(--rand); }
.rolle-sie small { opacity: 1; color: var(--tinte-2); }
.kaufausloeser .rollen-link { margin-top: var(--raum-3); }
/* Leistungs-Rollen 2026-09-30, Ruling ER8: die Nummer ist EIN Wort — in drei Engines brach sie vor „229“ */
.rollen-kontakt a[href^="tel:"] { white-space: nowrap; }
@container (min-width: 52rem) {
    .rollen { grid-template-columns: repeat(3, 1fr); gap: var(--raum-3) var(--raum-4); }
    .rolle-sie { grid-column: 1 / -1; }
}
/* /leistungen (Leistungs-Rollen 2026-09-30, RS5): der Überblick ist der Block in der Box — ohne die Haarlinie von .inhalt h2 —,
   die vier Abschnitte tragen das Zeichen ihrer Rolle im h2 (in Marke), je Leistung eine weiße Karte mit Randlinie und den
   Etiketten „Konformo" (weiß auf Marke) und „Sie" (Umriss in Marke, inset-Schatten statt Randlinie — derselbe Kasten, RL7),
   ≤ 40rem die Etiketten über ihrem Absatz; „Was bei Ihnen bleibt" als helle Tafel. Druck: unten. */
.inhalt .kaufausloeser h2 { border-top: 0; padding-top: 0; }
.rollen-h2 { display: flex; align-items: center; gap: 0.6rem; }
.rollen-h2 .rollen-zeichen { width: 1.3em; height: 1.3em; color: var(--marke); }
.leistung { background: var(--flaeche); border: 1px solid var(--rand); border-radius: var(--radius-m); padding: var(--raum-2) var(--raum-3); margin-top: var(--raum-2); }
.inhalt .leistung h3 { margin: 0 0 0.6rem; font-size: 1.12rem; }
/* BZ8 (Stefan 2026-09-30 „increase the two Konformo/Sie fields before the points a little bit"): die Etiketten 0.95rem statt
   0.85rem, die Spalte 6.6rem statt 6.2rem — „Konformo" halbfett misst bei 0.95rem rund 5.9rem samt Polster. */
.leistung dl { display: grid; grid-template-columns: 6.6rem 1fr; gap: 0.6rem var(--raum-2); margin: 0; }
.leistung dt { justify-self: start; align-self: start; border-radius: 999px; padding: 0.05em 0.7em; font-weight: 600; font-size: 0.95rem; margin-top: 0.15rem; }
.leistung dt.k { background: var(--marke); color: #fff; }
.leistung dt.s { color: var(--marke); box-shadow: inset 0 0 0 1.5px var(--marke); }
.leistung dd { margin: 0; }
.leistung .mehr { margin: 0.7rem 0 0; font-size: 0.95rem; }
@media (max-width: 40rem) { .leistung dl { grid-template-columns: 1fr; gap: 0.2rem; } .leistung dd { margin-bottom: 0.5rem; } }
.bleibt-tafel { background: var(--marke-hell); border-radius: var(--radius-m); padding: var(--raum-2) var(--raum-3); }
.bleibt-tafel ul { margin: 0; padding-left: 1.1rem; }
/* Leistungen auf der Landing (2026-09-30, LL2): die Landing-Luft --raum-5 statt der --raum-3 der Box; der Block selbst: .rollen (Leistungs-Rollen). */
.leistungen-block { margin-top: var(--raum-5); }

.antworten-aendern { margin-top: var(--raum-4); }
.antworten-aendern button { margin: 0 0.5rem 0.5rem 0; }
.ergebnis-fuss { color: var(--tinte-2); font-size: 0.9rem; border-top: 1px solid var(--rand); margin-top: var(--raum-4); padding-top: var(--raum-2); }
.ergebnis-fuss p { margin: 0.35rem 0; }

/* ---- Karten-Seiten: Report-Dialoge, Fehler, 404 (Spec § 4.3) ------------------------ */
.karte { background: var(--flaeche); border: 1px solid var(--rand); border-radius: var(--radius-m); padding: var(--raum-4) clamp(1rem, 4vw, 2.5rem); margin: var(--raum-4) auto; max-width: 40rem; }
.karte h1 { font-size: clamp(1.6rem, 1.2rem + 1.4vw, 2rem); }
.karte.fehler { text-align: center; }
.karte .aktion, .karte button.aktion { display: inline-block; font: inherit; font-weight: 600; background: var(--marke); color: #fff; text-decoration: none; padding: 0.7rem 1.4rem; border-radius: var(--radius-s); border: 1px solid var(--marke); cursor: pointer; }
.karte .aktion:hover { background: var(--marke-dunkel); color: #fff; }

/* ---- Druck (Spec § 4.1, L11): Navigation und Aktionen weg, Schwarz auf Weiß -------- */
@media print {
    /* Die Papiertöne werden auf <body> zurückgesetzt und NICHT in einem zweiten
       :root-Block: DesignTokenTests pinnt genau EINEN :root-Block (Aufgabe 1, D4
       „hell-only"). Custom Properties vererben — die Überschreibung auf body erreicht
       denselben Teilbaum, denn ausserhalb von <body> malt keine Regel. */
    body { --papier: #fff; --flaeche: #fff; background: #fff; color: #000; font-size: 11pt; }
    /* L24-Pass 2026-09-02: `.kaufausloeser` und `.beratungs-cta` drucken absichtlich — ohne Preis
       sind Umfang und Kontakt auf Papier so nützlich wie der Beratungs-CTA; das mailto wird unter
       `a { color:#000 }` zu Klartext. Den Farbreset des Blocks trägt die Regel am
       Ende des Druckblocks (C8). */
    .site-header nav a:not(.brand), .kopfmenue summary, .site-footer, .check-cta, .pdf-cta, .wizard-nav, .skip-link,
    .share-links, .antworten-aendern, .resume-banner,
    /* „Auf dieser Seite" verlinkt Sprungziele — auf Papier ist das eine tote Liste. */
    .auf-dieser-seite,
    /* Fix-Welle: `.karte .aktion` ist wie `.check-cta`/`.pdf-cta` Navigation — auf Papier tot
       (sonst weiß auf nichts, denn Browser drucken Hintergrundgrafiken standardmäßig nicht,
       die Füllfarbe fällt weg, `color:#fff` bleibt). `.exakt-rechner` ist ein totes
       <details>-Bedienelement, dieselbe Kategorie wie das bereits versteckte `.pdf-cta`. */
    .karte .aktion, .exakt-rechner { display: none !important; }
    a { color: #000; text-decoration: none; }
    /* Der Ring der Wortmarke folgt currentColor und wird damit schwarz; der Haken trägt
       seinen Akzent als eigene stroke-Regel und braucht deshalb eine eigene Druckregel. */
    .brand-zeichen path { stroke: #000; }
    main, main:has(> .check-laden) { max-width: none; padding: 0; }
    /* Auf Papier gibt es kein Scrollen: die Kopfzeile wieder im Fluss, sonst setzt ein Browser sie
       an der Scrollposition des Ausdrucks ein. */
    .site-header { position: static; animation: none; }
    /* Der Marker ist weiß auf Marke — Browser drucken Hintergrundgrafiken standardmäßig NICHT, die Füllfarbe
       fällt weg, color:#fff bliebe: deshalb Fläche weg, Schwarz, Rahmen (der Haken folgt currentColor). Ohne
       !important — der Druckblock steht als letzter und gewinnt durch die Reihenfolge (gepinnt). */
    .timeline-marker { background: none; color: #000; border: 1px solid #000; }
    /* (Leistungs-Rollen 2026-09-30) der Umriss-Schatten der Sie-Pille fällt, der Rahmen der Regel darüber bleibt, die
       Schrift schwarz wie jede Pille (ER5). */
    .timeline-marker.sie { box-shadow: none; color: #000; }
    /* L24-Pass 2026-09-02, Fix-Welle (C8): `.kaufausloeser` druckt seit Brief § 3 — aber
       `background: var(--marke); color: #fff` wäre auf Papier weiß auf nichts (dieselbe Falle wie
       `.timeline-marker`). Schwarz mit Rahmen, Überschrift schwarz. Links im Block weiß auf Marke
       (C9), im Druck schwarz — `.kaufausloeser a` (0,1,1) schlüge sonst das `a { color:#000 }` des
       Druckblocks. */
    .kaufausloeser { background: none !important; color: #000; border: 1px solid #000; }
    .kaufausloeser h2 { color: #000; }
    .kaufausloeser a { color: #000; }
    /* Leistungs-Rollen (2026-09-30): die Linie unter dem Gruppenkopf schwarz, die Tafel ohne Fläche, die Zeichen folgen
       currentColor. Ohne !important — der Druckblock steht als letzter. */
    .rolle h3 { color: #000; border-bottom-color: #000; }
    .rolle-sie { background: none; color: #000; }
    .rolle-sie h3 { color: #000; }
    .rolle small { opacity: 1; color: #000; }
    /* /leistungen (2026-09-30): die Etiketten der Karten und die Tafel schwarz auf weiß. */
    .leistung dt.k { background: none; color: #000; border: 1px solid #000; }
    .leistung dt.s { box-shadow: none; color: #000; border: 1px solid #000; }
    .bleibt-tafel { background: none; }
}
