/* ══════════════════════════════════════════════════════════════════
   GENERIERT — nicht von Hand editieren. Neu bauen mit:
       node tools/build-css.mjs
   Quell-Wahrheit bleiben die Einzeldateien (Liste im <!-- CSS-Bundle -->-
   Kommentar von index.html). @layer-Reihenfolge wird beibehalten.
   Quellen: 26 Dateien.
   ══════════════════════════════════════════════════════════════════ */

/* ═══ css/variables.css ═══ */
/* CivicNova Variable System — Translation-Layer (seit 2026-06-30)
   Source-of-Truth: E:\Claude\Design Systems\CivicLab\tokens\ (via Junction css/tokens/)
   Diese Datei mapped --cl-*-Tokens (Design-System) auf semantic Aliase (--color-*)
   damit bestehender CSS-Code unverändert funktioniert. */

/* Layer-Order (Welle 4.3 + Followup 2026-07-01):
   Declaration MUST happen before any component CSS registers its own layer,
   otherwise browser locks the first-seen layer as position 1 (wahlprogramme
   loads SubSektionHeader.css BEFORE base.css → without this declaration here,
   `components` gets registered before `base` and beats the universal reset,
   which stripped .topic-tabs padding to 0 (rendered 27px instead of ~44px). */
@layer reset, tokens, base, components, pages, utilities;

/* ↳ inlined @import: css/tokens/colors.css → @layer tokens */
@layer tokens {
/* ============================================================
   COLORS — CivicLab
   Gedämpfte Plakat-Palette, dark-first. Lila lebt als dunkle
   Aubergine-Basis, Grün als ruhiges Salbei, Creme als Papier.
   Grelles Gelb existiert NUR als seltenes Live-/Aktuell-Signal.
   ============================================================ */
:root {
  /* --- base ramp --- */
  --cl-ink:        #171019;  /* primary background, dark-first      */
  --cl-surface:    #221A2B;  /* cards, sections                     */
  --cl-surface-2:  #2A2236;  /* hairlines, subtle fills             */
  --cl-border:     #3A2E47;  /* default border on dark              */

  /* --- brand hues --- */
  --cl-aubergine:  #574A7C;  /* structure / depth — NEVER an accent fill */
  --cl-sage:       #8E9A6C;  /* LANE NEUTRAL · Aufklärung · Beleg    */
  --cl-olive:      #6E7A4E;  /* sage-deep · borders · graphics       */
  --cl-terracotta: #C66B45;  /* LANE MEINUNG · Einordnung            */
  --cl-cream:      #F1E8CE;  /* paper · primary text on dark (kanonisch, DESIGN §2 — v2-Drift-Fix) */
  --cl-signal:     #E0A93B;  /* live / aktuell ONLY — never a surface */

  /* --- light-mode ink variants (v2 · Ä1 — WCAG ≥4,5:1 auf Creme, verifiziert) --- */
  --cl-sage-ink:       #5A6540;  /* 5,10:1 */
  --cl-terracotta-ink: #9C4F2E;  /* 4,81:1 */
  --cl-olive-ink:      #55603A;  /* 5,50:1 */
  --cl-signal-ink:     #7A5A12;  /* 5,21:1 */

  /* warm meinung surface (terracotta-tinted dark) */
  --cl-meinung-bg: #2A1D18;
  --cl-neutral-bg: #1C2417;  /* sage-tinted dark for neutral CTA     */

  /* --- text --- */
  --cl-text:        var(--cl-cream);
  --cl-text-muted:  #B6ABC4;
  --cl-text-faint:  #9A8FAB;
  --cl-text-on-light: #2C2238;

  /* --- semantic aliases --- */
  --cl-bg:            var(--cl-ink);
  --cl-bg-elevated:   var(--cl-surface);
  --cl-lane-neutral:  var(--cl-sage);
  --cl-lane-meinung:  var(--cl-terracotta);
  --cl-accent:        var(--cl-sage);
  --cl-link:          var(--cl-sage);
  --cl-focus-ring:    var(--cl-sage);
}

/* Light mode — Phase-1 warmth for long explainers.
   Creme paper, aubergine ink, sage-INK leads text accents (v2 · Ä1).
   v2: `.light-mode` ergänzt — der Selektor, den die App tatsächlich toggelt
   (store.js) — damit ist der kanonische Light-Block kein toter Code mehr. */
:root[data-theme="light"],
:root.light-mode,
.light-mode,
.cl-light {
  --cl-ink:        #F1E8CE;
  --cl-surface:    #FBF6E6;
  --cl-surface-2:  #ECE3CC;
  --cl-border:     #DAD0B4;
  --cl-cream:      #2C2238;            /* "cream" alias now = ink-on-paper */
  --cl-text:        #2C2238;
  --cl-text-muted:  #5A5364;
  --cl-text-faint:  #7A7384;
  --cl-meinung-bg: #F3E6DC;
  --cl-neutral-bg: #E9EBDB;

  /* v2 · Ä1: Lane-/Akzentfarben als TEXT im Light nur in der -ink-Variante */
  --cl-lane-neutral:  var(--cl-sage-ink);
  --cl-lane-meinung:  var(--cl-terracotta-ink);
  --cl-accent:        var(--cl-sage-ink);
  --cl-link:          var(--cl-sage-ink);
  --cl-focus-ring:    var(--cl-sage-ink);
  --cl-signal-text:   var(--cl-signal-ink);
}

/* Signal als Text: dark = Original, light = -ink (immer via diesem Alias nutzen) */
:root { --cl-signal-text: var(--cl-signal); }

}
/* ↳ inlined @import: css/tokens/typography.css → @layer tokens */
@layer tokens {
/* ============================================================
   TYPOGRAPHY — Archivo (Display/Text) + Newsreader (Meinung/Zitat, serif) + Space Mono (Belege/Labels).
   Three voices: DISPLAY (statement), TEXT (body), MONO (belege/labels).
   Meinung kippt in italic; Bericht bleibt aufrecht.
   ============================================================ */
:root {
  --cl-font-display: "Archivo", system-ui, sans-serif;
  --cl-font-text:    "Archivo", system-ui, sans-serif;
  --cl-font-serif:   "Newsreader", Georgia, serif;
  --cl-font-mono:    "Space Mono", ui-monospace, monospace;

  /* weights */
  --cl-fw-regular: 400;
  --cl-fw-medium:  500;
  --cl-fw-bold:    700;

  /* type scale (px) — v2 · Ä2: Meta-Ebene ≥14px (Zielgruppe 60+),
     h2 bleibt echte Display-Größe (Sektionstitel SIND h2, nie h1→h3) */
  --cl-fs-hero:    72px;
  --cl-fs-h1:      38px;
  --cl-fs-h2:      30px;
  --cl-fs-h3:      23px;
  --cl-fs-lead:    18px;
  --cl-fs-body:    16px;
  --cl-fs-small:   14px;
  --cl-fs-mono:    14px;
  --cl-fs-kicker:  14px;

  /* line-height */
  --cl-lh-tight:   0.95;
  --cl-lh-snug:    1.12;
  --cl-lh-body:    1.55;

  /* tracking */
  --cl-ls-display: -0.01em;
  --cl-ls-kicker:  0.14em;
  --cl-ls-label:   0.12em;
  --cl-ls-name:    0.13em;

  /* semantic */
  --cl-kicker-transform: uppercase;
}

}
/* ↳ inlined @import: css/tokens/spacing.css → @layer tokens */
@layer tokens {
/* ============================================================
   SPACING & RADIUS — tight, kantig. Radius stays 0–2px.
   ============================================================ */
:root {
  --cl-space-1: 4px;
  --cl-space-2: 8px;
  --cl-space-3: 12px;
  --cl-space-4: 16px;
  --cl-space-5: 22px;
  --cl-space-6: 30px;
  --cl-space-7: 46px;
  --cl-space-8: 64px;

  --cl-pad-card:    24px;
  --cl-pad-section: 46px;

  /* radius — deliberately near-zero; CivicLab is blueprint-square */
  --cl-radius-0: 0px;
  --cl-radius-1: 2px;     /* default for chips, buttons, cards */
  --cl-radius-pill: 999px; /* only for status dots, never buttons */

  /* borders */
  --cl-border-w: 1px;
  --cl-lane-bar: 5px;     /* top bar thickness on lane cards */

  /* layout */
  --cl-maxw-content: 720px;
  --cl-maxw-page:    1180px;
}

}
/* ↳ inlined @import: css/tokens/effects.css → @layer tokens */
@layer tokens {
/* ============================================================
   EFFECTS — focus, halftone, blueprint texture. Minimal shadow.
   CivicLab uses borders + flat fills, not drop shadows.
   ============================================================ */
:root {
  /* focus ring — visible, sage, offset (a11y requirement) */
  --cl-focus: 2px solid var(--cl-focus-ring);
  --cl-focus-offset: 2px;

  /* the one allowed elevation — used very sparingly */
  --cl-shadow-card: 0 1px 3px rgba(0,0,0,.35);

  /* meinung emphasis glow (subtle terracotta halo) */
  --cl-ring-meinung: 0 0 0 3px rgba(198,107,69,.12);
  --cl-ring-neutral: 0 0 0 3px rgba(142,154,108,.10);

  /* signature foto textures — apply over imagery */
  --cl-halftone-lines: repeating-linear-gradient(to bottom, transparent 0 2px, rgba(0,0,0,.30) 2px 3px);
  --cl-halftone-dots:  radial-gradient(rgba(44,34,56,.55) 1px, transparent 1.6px);

  --cl-transition: .15s ease; /* legacy — neue Nutzung: Motion-Tokens unten */

  /* --- motion tokens (v2 · Ä3) — NUR diese verwenden, keine Freihand-Dauern.
     Reduced-Motion ist die Baseline; Motion ist additiv. --- */
  --cl-motion-fast: 150ms;   /* hover, focus, kleine Zustandswechsel */
  --cl-motion-base: 300ms;   /* karten, akkordeons, übergänge (default) */
  --cl-motion-slow: 500ms;   /* seiten-transitions, reveals */
  --cl-ease-out:    cubic-bezier(.2, .8, .2, 1);
  --cl-ease-in-out: cubic-bezier(.45, 0, .25, 1);
}

@media (prefers-reduced-motion: reduce) {
  :root {
    --cl-motion-fast: 0.01ms;
    --cl-motion-base: 0.01ms;
    --cl-motion-slow: 0.01ms;
  }
}

}
/* ↳ inlined @import: css/tokens/fonts.css → @layer tokens */
@layer tokens {
/* Webfonts — Archivo (Display/Text) + Newsreader (Meinung/Zitat, serif) + Space Mono (Labels/Belege).
   Schrift-Entscheid 2026 (DESIGN.md Sektion 3): ersetzt das frühere Ubuntu.

   KEIN Font-Load hier mehr (DSGVO-01/FONT-02, 2026-07-04):
   Die @font-face-Regeln liegen self-hosted in  assets/fonts/fonts-local.css
   und werden als EINZIGER Font-Load-Weg per <link> in index.html eingebunden
   (display=swap, lokale woff2 — kein Google-Fonts-CDN mehr).
   Diese Datei bleibt nur als Layer-Platzhalter (via @import layer(tokens) in
   variables.css) bestehen, damit die Kaskaden-/Layer-Struktur unverändert ist.
   NICHT wieder einen Google-Fonts-CDN-@import einsetzen — das war der
   DSGVO-Blocker. */

}

:root {
  /* ─── Brand Aliase (alte --color-* zeigen auf neue --cl-*) ─── */
  --color-primary:   var(--cl-sage);   /* ERKL-02/DESIGN: Akzent = Salbei; Signal NUR live/heute (6,21:1 auf Ink) */
  --color-secondary: var(--cl-sage);
  --color-accent:    var(--cl-aubergine);

  /* ─── Backgrounds ─── */
  --color-bg-primary:   var(--cl-ink);
  --color-bg-secondary: var(--cl-surface);
  --color-bg-tertiary:  var(--cl-surface-2);
  --color-bg-card:      var(--cl-surface);
  --color-bg-navbar:    rgba(23, 16, 25, 0.92);

  /* ─── Borders ─── */
  --color-border-subtle: var(--cl-aubergine);
  --color-border-focus:  var(--cl-sage);

  /* ─── Text ─── */
  --color-text-primary:    var(--cl-cream);
  --color-text-muted:      var(--cl-text-muted);
  --color-text-body:       var(--cl-cream);
  --color-text-light:      var(--cl-cream);   /* v2: kein hartes #FFFFFF — Marke nutzt Creme auf Dunkel */
  --color-text-link:       var(--cl-sage);
  --color-text-link-hover: var(--cl-signal);

  /* ─── Status (CivicNova-spezifisch, nicht im Design-System) ─── */
  --color-status-draft: #8B8690;
  --color-status-submitted: #3182CE;
  --color-status-committee: #D69E2E;
  --color-status-plenum: #14B8A6;
  --color-status-approved: #1BBE6F;
  --color-status-rejected: #E53E3E;

  /* ─── Lane-/Strang-Farben (Aliase auf Design-System) ─── */
  --ink:        var(--cl-ink);
  --surface:    var(--cl-surface);
  --aubergine:  var(--cl-aubergine);
  --sage:       var(--cl-sage);
  --olive:      var(--cl-olive);
  --terracotta: var(--cl-terracotta);
  --cream:      var(--cl-cream);
  --signal:     var(--cl-signal);

  /* Teal (CivicNova-spezifisch, nicht im Design-System).
     --stadt-blue/--landkreis-green wurden 2026-07-04 entfernt (DESIGN v2 §2 Ä6):
     Level-Badges laufen jetzt über Violett-Outline (Stadt) / Olive-Outline (Landkreis),
     Lane-Farben bleiben den Lanes vorbehalten. */
  --teal:       #7AA5A6;

  /* ─── Typography (Aliase) ─── */
  --font-primary: var(--cl-font-display, 'Archivo', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif);
  --font-mono:    var(--cl-font-mono, 'Space Mono', 'Courier New', monospace);

  --font-size-h1: 64px;
  --font-size-h2: clamp(24px, 3vw, 32px);   /* v2 · Ä2/DS-04: Sektionstitel SIND h2 (nie 16px-Sonderfall) */
  --font-size-body: 18px;
  --font-size-h1-mobile: 40px;
  --font-size-h2-large: 32px;
  --font-size-h3: 20px;
  --font-size-small: 14px;
  --font-size-tiny: 12px;

  --lh-h1: 1.1;
  --lh-h2: 1.3;
  --lh-body: 1.6;

  /* ─── Spacing (Aliase) ─── */
  --space-1: 4px;
  --space-2: 8px;
  --space-3: 12px;
  --space-4: 16px;
  --space-6: 24px;
  --space-8: 32px;
  --space-12: 48px;
  --space-16: 64px;
  --space-24: 96px;

  /* ─── Components — kantig ─── */
  --input-bg: #171020;
  --input-text: #ECE8F0;
  --input-border-radius: 0px;

  /* Primär-CTA = Terrakotta-Fläche + Ink-Text (DESIGN v2 §2 Ä14).
     --btn-primary-text ist bewusst der feste dunkle Ink #171019 (nicht var(--cl-ink),
     das im Light-Mode zu Creme kippt) — nur so hält die Terrakotta-Fläche in BEIDEN
     Modi 4,97:1 (ink auf terracotta). Signal bleibt Live-Punkten vorbehalten. */
  --btn-primary-bg: var(--cl-terracotta);
  --btn-primary-text: #171019;
  --btn-primary-radius: 0px;

  --btn-secondary-bg: transparent;
  --btn-secondary-text: var(--cl-cream);
  --btn-secondary-border: var(--cl-sage);
  --btn-secondary-radius: 0px;

  /* ─── Shadows ─── */
  --shadow-none: none;
  --shadow-sm: 0 0 0 1px rgba(142, 154, 108, 0.18);
  --shadow-md: 0 8px 24px -6px rgba(0, 0, 0, 0.6);
  --shadow-lg: 0 14px 40px -8px rgba(0, 0, 0, 0.7);
  --shadow-glass: 0 8px 32px 0 rgba(0, 0, 0, 0.5);

  /* ─── Transitions — v2 · DS-09: bauen auf die Motion-Tokens (effects.css) auf.
     Freihand-Dauern sind abgeschafft; jeder var(--transition-*)-Consumer bekommt
     damit automatisch die kanonische Dauer + Easing UND das Reduced-Motion-Verhalten
     (Motion-Tokens fallen unter prefers-reduced-motion auf 0.01ms). ─── */
  --transition-fast:   var(--cl-motion-fast) var(--cl-ease-out);
  --transition-normal: var(--cl-motion-base) var(--cl-ease-out);
  --transition-slow:   var(--cl-motion-slow) var(--cl-ease-out);

  /* ─── Layout ─── */
  --nav-height: 80px;
  --max-width-content: 1280px;
}

/* Light-Mode — dünner Kompat-Layer (v2 · DS-01/DS-02):
   Wo der kanonische Light-Block in tokens/colors.css den Wert schon liefert
   (--cl-ink/-surface/-surface-2 flippen dort), wird hier NICHT mehr doppelt
   definiert. Nur echte Semantik-Umlenkungen bleiben. Salbei/Signal, die im
   Light als Text/Akzent erscheinen, laufen auf die WCAG-verifizierten -ink-Töne. */
.light-mode {
  --color-primary:   var(--cl-sage-ink);   /* DS-01: Salbei-als-Text 5,10:1 statt Salbei 2,46:1 */
  --color-secondary: var(--cl-sage-ink);   /* DS-02: Akzent-Balken sichtbar (Signal war fast unsichtbar auf Creme) */
  --color-accent:    var(--cl-aubergine);

  --color-bg-navbar:    rgba(241, 232, 206, 0.92);

  --color-border-subtle: rgba(87, 74, 124, 0.25);
  --color-border-focus:  var(--cl-aubergine);

  --color-text-primary:    var(--cl-aubergine);
  --color-text-muted:      #5C5464;
  --color-text-body:       #2D2734;
  --color-text-light:      var(--cl-cream);
  --color-text-link:       var(--cl-aubergine);
  --color-text-link-hover: var(--cl-olive-ink);   /* DS-02: Olive-als-Text 5,50:1 statt Olive 3,77:1 */

  --input-bg:   var(--cl-surface);   /* MS-06: kein hartes #FFFFFF — Creme-Papier #FBF6E6 */
  --input-text: #2D2734;

  /* --btn-primary-* NICHT überschrieben: Terrakotta-Fläche + fester Ink-Text gelten
     modus-unabhängig (siehe :root). */

  --btn-secondary-bg:     transparent;
  --btn-secondary-text:   var(--cl-aubergine);
  --btn-secondary-border: var(--cl-aubergine);

  --shadow-sm:    0 1px 3px rgba(87, 74, 124, 0.10);
  --shadow-md:    0 4px 20px -2px rgba(87, 74, 124, 0.14);
  --shadow-lg:    0 10px 30px -5px rgba(87, 74, 124, 0.18);
  --shadow-glass: 0 8px 32px 0 rgba(87, 74, 124, 0.10);
}

/* ═══ css/base.css ═══ */
@layer reset, tokens, base, components, pages, utilities;

/* CSS Base Styles & Reset */

@layer base {

*, *::before, *::after {
    box-sizing: border-box;
    margin: 0;
    padding: 0;
}

/* ── A11Y: Skip-Link ────────────────────────────────────────────── */

.skip-link {
    position: absolute;
    left: -9999px;
    top: 0;
    background: var(--signal);
    color: var(--ink);
    padding: var(--space-3) var(--space-4);
    font-family: var(--font-mono);
    font-weight: 700;
    z-index: 9999;
    text-decoration: none;
}

.skip-link:focus {
    left: var(--space-4);
    top: var(--space-4);
    outline: 2px solid var(--sage);
    outline-offset: 2px;
}

/* ── A11Y: Sichtbarer Focus auf allen interaktiven Elementen ───── */

:focus { outline: none; }

:focus-visible {
    outline: 2px solid var(--sage);
    outline-offset: 2px;
}

button:focus-visible,
a:focus-visible,
input:focus-visible,
textarea:focus-visible,
select:focus-visible,
[role="button"]:focus-visible,
[tabindex]:focus-visible {
    outline: 2px solid var(--sage);
    outline-offset: 2px;
}

.light-mode :focus-visible {
    outline-color: var(--aubergine);
}

html {
    scroll-behavior: smooth;
    font-size: 16px;
    -webkit-text-size-adjust: 100%;
    /* v2 · ERKL-08/NEWS-08: klippt die horizontale ICB-Overflow, die das
       off-canvas (translateX(100%)) Mobile-Menü sonst erzeugt. `clip` (nicht
       hidden) ist position:sticky-sicher und zwingt overflow-y nicht auf auto —
       body{overflow-x:hidden} allein fängt fixed-Descendants NICHT. */
    overflow-x: clip;
}

body {
    font-family: var(--font-primary);
    font-size: var(--font-size-body);
    line-height: var(--lh-body);
    background-color: var(--color-bg-primary);
    color: var(--color-text-body);
    transition: background-color var(--transition-normal), color var(--transition-normal);
    overflow-x: hidden;
}

/* Headings */
h1 {
    font-family: var(--font-primary);
    font-size: var(--font-size-h1);
    line-height: var(--lh-h1);
    font-weight: 700;
    color: var(--color-primary);
    margin-bottom: var(--space-4);
    letter-spacing: -0.02em;
}

/* v2 · DS-04: Sektionstitel SIND h2 (Archivo 800, kantig getrackt) — die alte
   uppercase-16px-muted-Sonderbehandlung ist abgeschafft (heilte den heading-order-
   Systemfehler: nie mehr h1 → h3-Sprung). Markup nutzt <h2 class="section-title">. */
h2 {
    font-family: var(--font-primary);
    font-size: var(--font-size-h2);
    line-height: var(--lh-h2);
    font-weight: 800;
    letter-spacing: -0.01em;
    color: var(--color-primary);
    margin-bottom: var(--space-3);
}

/* .section-title bleibt als Klasse erhalten: erbt die h2-Optik und ergänzt die
   dekorative Akzent-Kante darunter (Sektions-Label mit Unterstrich). */
.section-title {
    color: var(--color-primary);
    position: relative;
    display: inline-block;
}

.section-title::after {
    content: '';
    position: absolute;
    bottom: -8px;
    left: 0;
    width: 60px;
    height: 4px;
    background-color: var(--color-secondary);
}

/* v2 · ERKL-02: h3 läuft auf Text-/Creme-Farbe, NICHT auf Signal — Signal (Amber)
   bleibt echten Live-/„heute"-Elementen vorbehalten (dot-signal, HEUTE-Marker). */
h3 {
    font-size: var(--font-size-h3);
    color: var(--color-text-primary);
    margin-bottom: var(--space-3);
    font-weight: 500;
}

/* Paragraphs & Text */
p {
    margin-bottom: var(--space-4);
}

p:last-child {
    margin-bottom: 0;
}

/* Links */
a {
    color: var(--color-text-link);
    text-decoration: none;
    font-weight: 500;
    transition: color var(--transition-fast);
}

a:hover {
    color: var(--color-text-link-hover);
}

/* Lists */
ul, ol {
    list-style: none;
}

/* Images & Media */
img, svg {
    display: block;
    max-width: 100%;
    height: auto;
}

/* Selection */
::selection {
    background-color: var(--color-primary);
    color: var(--ink);
}

/* Custom Scrollbar for Modern Aesthetics */
::-webkit-scrollbar {
    width: 8px;
    height: 8px;
}

::-webkit-scrollbar-track {
    background: var(--color-bg-secondary);
}

::-webkit-scrollbar-thumb {
    background: var(--color-border-subtle);
    border-radius: 2px;
}

::-webkit-scrollbar-thumb:hover {
    background: var(--color-primary);
}

/* Utilities */
.container {
    width: 100%;
    max-width: var(--max-width-content);
    margin-left: auto;
    margin-right: auto;
    padding-left: var(--space-6);
    padding-right: var(--space-6);
}

.text-center { text-align: center; }
.text-right { text-align: right; }
.font-bold { font-weight: 700; }
.font-medium { font-weight: 500; }
.text-muted { color: var(--color-text-muted); }

/* Responsive adjustments */
@media (max-width: 768px) {
    h1 {
        font-size: var(--font-size-h1-mobile);
    }
    body {
        font-size: 16px;
    }
}

} /* end @layer base */

/* ═══ css/layout.css ═══ */
/* Main Application Layout Styles */

@layer base {

#app-shell {
    display: flex;
    flex-direction: column;
    min-height: 100vh;
}

#app-mount {
    flex-grow: 1;
    display: flex;
    flex-direction: column;
    /* v2 · CLS-Fix: robuste Inhalts-Reserve, damit der Footer beim Route-Wechsel
       (kurz leerer Mount / View-Transition) nicht nach oben springt und zurück. */
    min-height: 100vh;
    min-height: 100svh; /* CLS-Fix: Footer startet unter dem Fold, springt nicht mehr (Audit CLS-Root-Cause) */
}

/* Sticky Header & Navbar */
#site-header {
    position: sticky;
    top: 0;
    left: 0;
    width: 100%;
    height: var(--nav-height);
    background-color: var(--color-bg-navbar);
    backdrop-filter: blur(12px);
    -webkit-backdrop-filter: blur(12px);
    border-bottom: 1px solid var(--color-border-subtle);
    z-index: 100;
    transition: background-color var(--transition-normal), border-color var(--transition-normal);
}

.navbar-container {
    display: flex;
    justify-content: space-between;
    align-items: center;
    height: 100%;
}

.brand-logo-link {
    display: flex;
    align-items: center;
    height: 100%;
}

.brand-logo-svg {
    height: 38px;
    width: auto;
    transition: transform var(--transition-fast);
}

.brand-logo-svg:hover {
    transform: scale(1.03);
}

/* Navigation Links */
.nav-menu {
    display: flex;
    align-items: center;
    gap: var(--space-6);
}

.nav-briefing-btn {
    white-space: nowrap;
    margin-left: var(--space-1);
}

.nav-link {
    color: var(--color-text-body);
    font-weight: 500;
    font-size: 16px;
    padding: 0 var(--space-2);       /* v2 · DS-11: horizontales Padding fürs Hit-Target */
    min-height: 44px;                /* Hit-Target ≥ 44px */
    display: inline-flex;
    align-items: center;
    position: relative;
    transition: color var(--transition-fast);
}

.nav-link::after {
    content: '';
    position: absolute;
    bottom: 0;
    left: 0;
    width: 0;
    height: 2px;
    background-color: var(--color-secondary);
    transition: width var(--transition-fast);
}

.nav-link:hover {
    color: var(--color-primary);
}

.nav-link:hover::after,
.nav-link.active::after {
    width: 100%;
}

.nav-link.active {
    color: var(--color-primary);
}

/* Right Header actions (Theme switcher & CTA) */
.header-actions {
    display: flex;
    align-items: center;
    gap: var(--space-4);
}

/* Theme Switcher Toggle Button */
.theme-toggle-btn {
    background: transparent;
    border: 1px solid var(--color-border-subtle);
    border-radius: 50%;
    width: 44px;                     /* v2 · DS-11: Hit-Target 44×44 */
    height: 44px;
    display: flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
    color: var(--color-text-body);
    transition: background-color var(--transition-fast), border-color var(--transition-fast);
}

.theme-toggle-btn:hover {
    background-color: var(--color-bg-secondary);
    border-color: var(--color-primary);
    color: var(--color-primary);
}

/* Mobile Menu Button */
.mobile-menu-btn {
    display: none;
    background: transparent;
    border: none;
    cursor: pointer;
    padding: var(--space-2);
    z-index: 102;
}

.mobile-menu-btn span {
    display: block;
    width: 24px;
    height: 2px;
    background-color: var(--color-primary);
    margin-bottom: 5px;
    transition: transform var(--transition-normal), opacity var(--transition-normal);
}

.mobile-menu-btn span:last-child {
    margin-bottom: 0;
}

/* Footer styling — surface statt signal (kein Amber-Block) */
#site-footer {
    background-color: var(--surface);
    color: var(--cream);
    padding-top: var(--space-12);
    padding-bottom: var(--space-6);
    border-top: 5px solid var(--sage);
}

.footer-untertitel {
    font-family: var(--font-mono);
    font-size: 12px;
    color: var(--color-text-muted);
    margin-top: var(--space-2);
    letter-spacing: 0.08em;
}

.footer-ki-hinweis {
    font-family: var(--font-mono);
    font-size: 12px;
    color: var(--sage);
    margin-top: var(--space-4);
    padding-top: var(--space-3);
    border-top: 1px dashed var(--aubergine);
}

.footer-grid {
    display: grid;
    grid-template-columns: 2fr 1fr 1fr 2fr;
    gap: var(--space-8);
    margin-bottom: var(--space-12);
}

.footer-col-logo {
    display: flex;
    flex-direction: column;
    gap: var(--space-4);
}

.footer-logo-img {
    height: 48px;
    width: auto;
    align-self: flex-start;
    filter: brightness(0) invert(1);
}

.footer-title {
    font-family: var(--font-mono);
    font-size: 13px;
    color: var(--sage);
    text-transform: uppercase;
    letter-spacing: 0.08em;
    font-weight: 700;
    margin-bottom: var(--space-4);
}

.footer-links {
    display: flex;
    flex-direction: column;
    gap: var(--space-2);
}

.footer-links a {
    color: rgba(236, 227, 204, 0.8);
    font-size: 15px;
    transition: color var(--transition-fast), padding-left var(--transition-fast);
}

.footer-links a:hover {
    color: var(--signal);
    padding-left: var(--space-1);
}

.footer-newsletter-text {
    color: var(--color-text-muted);
    font-size: 15px;
    margin-bottom: var(--space-3);
}

.footer-newsletter-form {
    display: flex;
    gap: var(--space-2);
}

.footer-newsletter-form input {
    flex-grow: 1;
}

.footer-bottom {
    display: flex;
    justify-content: space-between;
    align-items: center;
    border-top: 1px solid var(--aubergine);
    padding-top: var(--space-6);
    font-size: var(--font-size-small);
    color: rgba(236, 227, 204, 0.55);
    font-family: var(--font-mono);
}

.footer-socials {
    display: flex;
    gap: var(--space-4);
}

.footer-social-link {
    color: var(--cream);
    font-size: 20px;
    transition: color var(--transition-fast), transform var(--transition-fast);
}

.footer-social-link:hover {
    color: var(--color-secondary);
    transform: translateY(-2px);
}

/* Loader styling */
.loader-container {
    display: flex;
    justify-content: center;
    align-items: center;
    min-height: 400px;
    width: 100%;
}

.loader {
    width: 48px;
    height: 48px;
    border: 4px solid var(--color-border-subtle);
    border-bottom-color: var(--color-primary);
    border-radius: 50%;
    display: inline-block;
    animation: rotation 1s linear infinite;
}

@keyframes rotation {
    0% { transform: rotate(0deg); }
    100% { transform: rotate(360deg); }
}

/* Responsive Breakpoints */
@media (max-width: 992px) {
    .footer-grid {
        grid-template-columns: 1fr 1fr;
        gap: var(--space-6);
    }
}

@media (max-width: 768px) {
    .mobile-menu-btn {
        display: block;
    }
    
    /* Hamburger toggle transforms */
    .mobile-menu-btn.active span:first-child {
        transform: translateY(7px) rotate(45deg);
    }
    .mobile-menu-btn.active span:nth-child(2) {
        opacity: 0;
    }
    .mobile-menu-btn.active span:last-child {
        transform: translateY(-7px) rotate(-45deg);
    }
    
    /* v2 · ERKL-08/NEWS-08: Off-Canvas via transform statt right:-100% —
       kein Dokument-Overflow mehr. visibility hält das geschlossene Menü aus
       dem Tab-Fokus. */
    .nav-menu {
        position: fixed;
        top: var(--nav-height);
        right: 0;
        width: 80%;
        max-width: 320px;
        height: calc(100vh - var(--nav-height));
        background-color: var(--color-bg-primary);
        border-left: 1px solid var(--color-border-subtle);
        flex-direction: column;
        align-items: flex-start;
        padding: var(--space-8) var(--space-6);
        gap: var(--space-4);
        z-index: 101;
        transform: translateX(100%);
        visibility: hidden;
        transition: transform var(--transition-normal),
                    visibility 0s linear var(--cl-motion-base);
        box-shadow: var(--shadow-lg);
    }

    .nav-menu.active {
        transform: translateX(0);
        visibility: visible;
        transition: transform var(--transition-normal), visibility 0s;
    }

    /* Backdrop/Scrim hinter dem offenen Menü — reine CSS-Lösung via :has() am
       (nicht transformierten) Header, damit position:fixed viewport-relativ bleibt.
       z-index -1 im Header-Stacking-Context: unter dem Panel (101) + Hamburger (102),
       über dem Seiteninhalt. pointer-events:none = rein visuell (kein Klick-Trap);
       Schließen läuft über den Hamburger. */
    #site-header::after {
        content: "";
        position: fixed;
        inset: var(--nav-height) 0 0 0;
        background: rgba(23, 16, 25, 0.55);
        z-index: -1;
        opacity: 0;
        visibility: hidden;
        pointer-events: none;
        transition: opacity var(--transition-normal),
                    visibility 0s linear var(--cl-motion-base);
    }

    #site-header:has(.nav-menu.active)::after {
        opacity: 1;
        visibility: visible;
        transition: opacity var(--transition-normal);
    }
    
    .nav-link {
        width: 100%;
        font-size: 18px;
        padding: var(--space-3) 0;
    }
    
    .footer-grid {
        grid-template-columns: 1fr;
        gap: var(--space-6);
    }
    
    .footer-bottom {
        flex-direction: column;
        gap: var(--space-4);
        text-align: center;
    }
}

/* CivicNova Wortmarke — Gitter-Glyph + CIVICNOVA + Mono-Untertitel */

.brand-logo-link {
    gap: var(--space-3);
}

.brand-glyph {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 32px;
    height: 32px;
    border: 1px solid var(--sage);
    font-family: var(--font-mono);
    font-size: 11px;
    font-weight: 700;
    color: var(--sage);
    background:
        linear-gradient(var(--aubergine) 1px, transparent 1px) 0 0 / 8px 8px,
        linear-gradient(90deg, var(--aubergine) 1px, transparent 1px) 0 0 / 8px 8px,
        var(--ink);
    letter-spacing: 0;
    flex-shrink: 0;
}

.brand-logo-video {
    width: 32px;
    height: 32px;
    border: 1px solid var(--sage);
    object-fit: cover;
    flex-shrink: 0;
    border-radius: 0;
}

.brand-wordmark-block {
    display: flex;
    flex-direction: column;
    line-height: 1;
}

.brand-wordmark {
    font-weight: 700;
    font-size: 20px;
    letter-spacing: 0.04em;
    color: var(--cream);
}

.brand-untertitel {
    font-family: var(--font-mono);
    font-size: 10px;
    color: var(--color-text-muted);
    letter-spacing: 0.05em;
    margin-top: 2px;
}

.brand-wordmark-accent {
    /* Backward-compat: bleibt für eventuelle alte Referenzen */
    color: var(--sage);
}

/* Strang-D Nav-Link (Meinung) bekommt eigene Färbung */
.nav-link--meinung {
    font-style: italic;
}
.nav-link--meinung::after {
    background-color: var(--terracotta);
}
.nav-link--meinung:hover,
.nav-link--meinung.active {
    color: var(--terracotta);
}

/* Strang-B Nav-Link (Anleitungen) nutzt jetzt default sage-Hover — keine eigene Klasse */

@media (max-width: 768px) {
    .brand-untertitel { display: none; }
    .brand-wordmark { font-size: 18px; }
    .brand-glyph, .brand-logo-video { width: 28px; height: 28px; }
}

.light-mode .brand-wordmark { color: var(--aubergine); }
.light-mode .brand-glyph { color: var(--aubergine); border-color: var(--aubergine); }

} /* end @layer base */

/* ═══ css/animations.css ═══ */
/* ── View Transitions API ─ Cross-Route Page-Transitions (Chrome 111+, Safari 18+, FF 128+) ──
   Router ruft document.startViewTransition() bei Hash-Wechsel. Browser interpoliert
   automatisch zwischen old-snapshot und new-snapshot. Named Elements (z.B. hero-map)
   bleiben über Routen-Wechsel persistent. */

@layer base {

::view-transition-old(root) {
    animation: vt-page-out 220ms cubic-bezier(0.4, 0, 1, 1) forwards;
}
::view-transition-new(root) {
    animation: vt-page-in 320ms cubic-bezier(0, 0, 0.2, 1) forwards;
}

@keyframes vt-page-out {
    from { opacity: 1; transform: translateY(0); }
    to   { opacity: 0; transform: translateY(-10px); }
}
@keyframes vt-page-in {
    from { opacity: 0; transform: translateY(12px); }
    to   { opacity: 1; transform: translateY(0); }
}

/* Persistent Hero-Map über Routen-Wechsel — Map bleibt während des Transitions stehen,
   Content drumherum wechselt. Wirkung: CivicNova fühlt sich wie eine App an, nicht
   wie 9 separate Seiten. */
.hero-map-canvas {
    view-transition-name: hero-map;
}

@media (prefers-reduced-motion: reduce) {
    ::view-transition-group(*),
    ::view-transition-old(*),
    ::view-transition-new(*) {
        animation: none !important;
    }
}

/* ── Shared-Element-Morph: Tile → stueck-Detail-Header (Animation 03) ────────
   Quelle/Ziel teilen sich view-transition-name "stueck-hero" (Tile via JS vor
   der Navigation, stueck-Header statisch). Browser interpoliert Bounds + Größe.
   Custom Easing für smooth deceleration (kein Spring). reduced-motion ist über
   den ::view-transition-group(*)-Block oben (Z. 29-35) schon deaktiviert. */
/* Dauern = Motion-Tokens (DESIGN §2, keine Freihand-Dauern). Der Morph läuft auf
   --cl-motion-slow (Reveal), der alte Snapshot fadet auf --cl-motion-base aus. */
::view-transition-group(stueck-hero) {
    animation-duration: var(--cl-motion-slow);
    animation-timing-function: cubic-bezier(0.16, 1, 0.3, 1);
}
::view-transition-old(stueck-hero) {
    animation: vt-morph-fade-out var(--cl-motion-base) ease-out forwards;
}
::view-transition-new(stueck-hero) {
    animation: vt-morph-fade-in var(--cl-motion-slow) cubic-bezier(0.16, 1, 0.3, 1) forwards;
}
@keyframes vt-morph-fade-out { to { opacity: 0; } }
@keyframes vt-morph-fade-in  { from { opacity: 0; } to { opacity: 1; } }

/* Modern Transitions and Micro-Animations */

/* ── A11Y: prefers-reduced-motion ───────────────────────────────────
   Springt sofort auf Endzustand, deaktiviert Pulse-/Float-/Gradient-Animationen. */

@media (prefers-reduced-motion: reduce) {
    *,
    *::before,
    *::after {
        animation-duration: 0.001ms !important;
        animation-iteration-count: 1 !important;
        transition-duration: 0.001ms !important;
        scroll-behavior: auto !important;
    }

    .anim-fade-in,
    .anim-slide-up,
    .anim-slide-up-delay-1,
    .anim-slide-up-delay-2,
    .page-view {
        opacity: 1 !important;
        transform: none !important;
    }

    .dot-signal,
    .anim-pulse-yellow,
    .anim-float,
    .animated-gradient-bg {
        animation: none !important;
    }
}

/* Page View Transition Animations */
.page-view {
    animation: pageFadeIn var(--transition-normal) forwards;
}

@keyframes pageFadeIn {
    from {
        opacity: 0;
        transform: translateY(12px);
    }
    to {
        opacity: 1;
        transform: translateY(0);
    }
}

/* Micro-interaction Keyframes */
@keyframes pulseSecondary {
    0% {
        box-shadow: 0 0 0 0 rgba(253, 194, 32, 0.4);
    }
    70% {
        box-shadow: 0 0 0 8px rgba(253, 194, 32, 0);
    }
    100% {
        box-shadow: 0 0 0 0 rgba(253, 194, 32, 0);
    }
}

@keyframes floatElement {
    0% { transform: translateY(0px); }
    50% { transform: translateY(-6px); }
    100% { transform: translateY(0px); }
}

@keyframes drawBorder {
    to { width: 100%; }
}

/* Application Animation Utilities */
.anim-fade-in {
    opacity: 0;
    animation: fadeIn var(--transition-slow) forwards;
}

.anim-slide-up {
    opacity: 0;
    transform: translateY(24px);
    animation: slideUp var(--transition-slow) forwards;
}

.anim-slide-up-delay-1 {
    opacity: 0;
    transform: translateY(24px);
    animation: slideUp var(--transition-slow) 0.15s forwards;
}

.anim-slide-up-delay-2 {
    opacity: 0;
    transform: translateY(24px);
    animation: slideUp var(--transition-slow) 0.3s forwards;
}

.anim-float {
    animation: floatElement 4s ease-in-out infinite;
}

.anim-pulse-yellow {
    animation: pulseSecondary 2s infinite;
}

/* Animation Keyframes */
@keyframes fadeIn {
    to { opacity: 1; }
}

@keyframes slideUp {
    to {
        opacity: 1;
        transform: translateY(0);
    }
}

/* Hover Micro-interactions */
.interactive-hover-grow {
    transition: transform var(--transition-fast), box-shadow var(--transition-fast), border-color var(--transition-fast);
}

.interactive-hover-grow:hover {
    transform: translateY(-4px);
    box-shadow: var(--shadow-lg);
}

/* ── @starting-style: deklarative Entry-Animations für Drawer + Modal-Inhalte ──
   Browser kennt den Initial-State, animiert beim Erscheinen. Kein JS-Trick mit
   add-Class+removeClass mehr nötig. Browser-Support: Chrome 117+, Safari 17.5+, FF 129+. */

@supports (transition-behavior: allow-discrete) {
    .strang-drawer.open {
        opacity: 1;
        transform: translateY(0);
        transition:
            opacity var(--cl-motion-base) var(--cl-ease-out),
            transform var(--cl-motion-base) var(--cl-ease-out);

        @starting-style {
            opacity: 0;
            transform: translateY(16px);
        }
    }

    /* Toast-Notification (Map-Erkunden-Button) bekommt sanften Auftritt */
    .map-erkunden-toast {
        opacity: 1;
        transform: translateY(0);
        transition:
            opacity var(--cl-motion-base) var(--cl-ease-out),
            transform var(--cl-motion-base) var(--cl-ease-out);

        @starting-style {
            opacity: 0;
            transform: translateY(20px);
        }
    }
}

/* Diagonal stripe gradient animation background */
.animated-gradient-bg {
    background: linear-gradient(-45deg, #502379, #6a349c, #1BBE6F, #502379);
    background-size: 400% 400%;
    animation: gradientMove 15s ease infinite;
}

@keyframes gradientMove {
    0% { background-position: 0% 50%; }
    50% { background-position: 100% 50%; }
    100% { background-position: 0% 50%; }
}

} /* end @layer base */

/* ═══ css/components/buttons.css ═══ */
@layer components {
/* Buttons — CivicNova. Keine hartkodierten Farben mehr; alles via Tokens. */

.btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    font-family: var(--font-primary);
    font-size: 16px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    padding: var(--space-3) var(--space-6);
    border: 2px solid transparent;
    cursor: pointer;
    transition: background-color var(--transition-fast),
                color var(--transition-fast),
                border-color var(--transition-fast),
                transform var(--transition-fast),
                box-shadow var(--transition-fast);
    text-decoration: none;
    outline: none;
}

.btn:active {
    transform: scale(0.98);
}

/* ── Primary — Terrakotta-Fläche + Ink-Text (v2 · Ä14/HOME-03/MS-02) ───────
   Die dokumentierte „Funke"-Rolle (Links, Calls). Signal (Amber) ist KEINE
   Fläche mehr — nur noch Live-Punkte. Werte kommen aus variables.css
   (--btn-primary-bg = Terrakotta, --btn-primary-text = fester Ink #171019,
   modus-unabhängig für 4,97:1). */

.btn-primary {
    background-color: var(--btn-primary-bg);
    color: var(--btn-primary-text);
    border-radius: var(--btn-primary-radius);
    border-color: var(--btn-primary-bg);
}

.btn-primary:hover {
    /* Leicht abgedunkelte Terrakotta via color-mix — bleibt in der Familie */
    background-color: color-mix(in srgb, var(--btn-primary-bg) 88%, #000);
    border-color: color-mix(in srgb, var(--btn-primary-bg) 88%, #000);
    box-shadow: 0 4px 12px rgba(198, 107, 69, 0.22);
    color: var(--btn-primary-text);
}

.btn-primary:focus-visible {
    box-shadow: 0 0 0 3px rgba(142, 154, 108, 0.45); /* sage focus */
}

/* ── Secondary — Sage-Outline ──────────────────────────────────── */

.btn-secondary {
    background-color: transparent;
    color: var(--cream);
    border-radius: var(--btn-secondary-radius);
    border-color: var(--sage);
}

.btn-secondary:hover {
    background-color: var(--sage);
    color: var(--ink);
    border-color: var(--sage);
    box-shadow: 0 4px 12px rgba(142, 154, 108, 0.20);
}

.btn-secondary:focus-visible {
    box-shadow: 0 0 0 3px rgba(142, 154, 108, 0.30);
}

/* ── Accent — Aubergine (selten, für Struktur-CTAs) ───────────── */

.btn-accent {
    background-color: var(--aubergine);
    color: var(--cream);
    border-radius: 0;
    border-color: var(--aubergine);
}

.btn-accent:hover {
    /* Dunklere Aubergine — bleibt in der Familie, kein Volt-Knall-Lila */
    background-color: #3F345A;
    border-color: #3F345A;
    box-shadow: 0 4px 12px rgba(87, 74, 124, 0.25);
}

.btn-accent:focus-visible {
    box-shadow: 0 0 0 3px rgba(87, 74, 124, 0.35);
}

/* ── Outline — dezent, sage-Border ─────────────────────────────── */

.btn-outline {
    background-color: transparent;
    color: var(--cream);
    border-color: var(--aubergine);
    border-radius: 0;
}

.btn-outline:hover {
    background-color: var(--surface);
    border-color: var(--sage);
    color: var(--sage);
}

.btn-outline:focus-visible {
    box-shadow: 0 0 0 3px rgba(142, 154, 108, 0.30);
}

/* ── Größen-Varianten ──────────────────────────────────────────── */

.btn-lg {
    padding: var(--space-4) var(--space-8);
    font-size: 18px;
}

.btn-sm {
    padding: var(--space-2) var(--space-4);
    font-size: 14px;
}

/* ── Disabled ──────────────────────────────────────────────────── */

.btn:disabled {
    opacity: 0.6;
    cursor: not-allowed;
    pointer-events: none;
}

/* ── Light-Mode ───────────────────────────────────────────────── */
/* .btn-primary braucht keinen Light-Override mehr: Terrakotta-Fläche +
   fester Ink-Text gelten modus-unabhängig (siehe variables.css). */

.light-mode .btn-secondary {
    color: var(--aubergine);
    border-color: var(--aubergine);
}
.light-mode .btn-secondary:hover {
    background-color: var(--aubergine);
    color: var(--cream);
    border-color: var(--aubergine);
}
.light-mode .btn-outline {
    color: var(--aubergine);
    border-color: var(--aubergine);
}
.light-mode .btn-outline:hover {
    background-color: rgba(87, 74, 124, 0.08);
    color: var(--aubergine);
}
} /* end @layer components */

/* ═══ css/components/inputs.css ═══ */
@layer components {
/* Inputs and Form Control Styles */

.form-group {
    display: flex;
    flex-direction: column;
    gap: var(--space-2);
    margin-bottom: var(--space-4);
}

.form-label {
    font-family: var(--font-primary);
    font-size: 15px;
    font-weight: 700;
    color: var(--color-primary);
    text-transform: uppercase;
    letter-spacing: 0.05em;
}

/* Base input element */
.form-input, 
.form-textarea,
.form-select {
    width: 100%;
    font-family: var(--font-primary);
    font-size: 16px;
    padding: var(--space-3) var(--space-4);
    background-color: var(--input-bg);
    color: var(--input-text);
    border: 1px solid var(--color-border-subtle);
    border-radius: var(--input-border-radius); /* 0px */
    outline: none;
    box-shadow: var(--shadow-none); /* shadow: none */
    transition: border-color var(--transition-fast), box-shadow var(--transition-fast);
}

/* Hover State */
.form-input:hover,
.form-textarea:hover,
.form-select:hover {
    border-color: var(--color-primary);
}

/* Focus State */
.form-input:focus,
.form-textarea:focus,
.form-select:focus {
    border-color: var(--color-border-focus);
    background-color: var(--input-bg);
    box-shadow: 0 0 0 3px rgba(80, 35, 121, 0.15); /* Light focus glow, keeping input border radius 0 */
}

/* Textarea specific sizing */
.form-textarea {
    resize: vertical;
    min-height: 120px;
}

/* Error validation states */
.form-group.has-error .form-input,
.form-group.has-error .form-textarea {
    border-color: var(--color-status-rejected);
}

.form-group.has-error .form-label {
    color: var(--color-status-rejected);
}

.form-error-msg {
    font-size: var(--font-size-small);
    color: var(--color-status-rejected);
    margin-top: var(--space-1);
    font-weight: 500;
}

/* Checkbox & Radio layouts */
.form-check {
    display: flex;
    align-items: flex-start;
    gap: var(--space-3);
    margin-bottom: var(--space-4);
    cursor: pointer;
}

.form-check-input {
    margin-top: 5px;
    width: 18px;
    height: 18px;
    border: 1px solid var(--color-border-subtle);
    border-radius: 0px; /* Force 0px for checklist checkbox as well */
    accent-color: var(--color-primary);
    cursor: pointer;
}

.form-check-label {
    font-size: var(--font-size-small);
    color: var(--color-text-body);
    user-select: none;
}
} /* end @layer components */

/* ═══ css/components/cards.css ═══ */
@layer components {
/* Card Components & Grids */

.grid-cols-1 {
    display: grid;
    grid-template-columns: 1fr;
    gap: var(--space-6);
}

.grid-cols-2 {
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    gap: var(--space-8);
}

.grid-cols-3 {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: var(--space-8);
}

/* Base Card structure */
.card {
    background-color: var(--color-bg-card);
    border: 1px solid var(--color-border-subtle);
    border-radius: 2px;
    padding: var(--space-6);
    box-shadow: var(--shadow-sm);
    transition: transform var(--transition-normal), 
                box-shadow var(--transition-normal), 
                border-color var(--transition-normal);
    position: relative;
    overflow: hidden;
}

.card::before {
    content: '';
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 4px;
    background-color: var(--color-primary);
    transform: scaleX(0);
    transform-origin: left;
    transition: transform var(--transition-normal);
}

.card:hover {
    transform: translateY(-4px);
    box-shadow: var(--shadow-md);
    border-color: var(--color-primary);
}

.card:hover::before {
    transform: scaleX(1);
}

/* Glassmorphic Panel Variant */
.card-glass {
    background: rgba(241, 232, 206, 0.03);
    backdrop-filter: blur(16px);
    -webkit-backdrop-filter: blur(16px);
    border: 1px solid rgba(241, 232, 206, 0.1);
    color: var(--color-text-light);
    box-shadow: var(--shadow-glass);
}

/* Councilor (Fraktion) profile Card */
.profile-card {
    display: flex;
    flex-direction: column;
    height: 100%;
    padding: 0;
    overflow: hidden;
}

.profile-card-image-wrapper {
    position: relative;
    width: 100%;
    height: 320px;
    background-color: var(--color-bg-tertiary);
    overflow: hidden;
}

/* If no photo is loaded, show a styled fallback silhouette */
.profile-card-fallback-avatar {
    display: flex;
    justify-content: center;
    align-items: center;
    width: 100%;
    height: 100%;
    background: linear-gradient(135deg, var(--color-primary), var(--color-bg-tertiary));
    color: rgba(241, 232, 206, 0.6);
}

.profile-card-img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    transition: transform var(--transition-slow);
}

.profile-card:hover .profile-card-img {
    transform: scale(1.05);
}

.profile-card-content {
    padding: var(--space-6);
    flex-grow: 1;
    display: flex;
    flex-direction: column;
}

.profile-card-role {
    font-size: var(--font-size-small);
    text-transform: uppercase;
    font-weight: 700;
    color: var(--color-accent);
    margin-bottom: var(--space-1);
    letter-spacing: 0.05em;
}

.profile-card-name {
    font-size: var(--font-size-h3);
    color: var(--color-primary);
    font-weight: 700;
    margin-bottom: var(--space-2);
}

.profile-card-committees {
    font-size: 14px;
    color: var(--color-text-muted);
    margin-bottom: var(--space-4);
    flex-grow: 1;
}

.profile-card-contact {
    display: flex;
    gap: var(--space-3);
    border-top: 1px solid var(--color-border-subtle);
    padding-top: var(--space-4);
    margin-top: auto;
}

.profile-contact-link {
    color: var(--color-text-muted);
    font-size: 14px;
    display: flex;
    align-items: center;
    gap: var(--space-1);
}

.profile-contact-link:hover {
    color: var(--color-primary);
}

/* Badge component */
.badge {
    display: inline-flex;
    align-items: center;
    padding: var(--space-1) var(--space-3);
    font-size: var(--font-size-tiny);
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    border-radius: 2px;
}

.badge-yellow {
    background-color: rgba(253, 194, 32, 0.15);
    color: #b78703;
}

.badge-purple {
    background-color: rgba(80, 35, 121, 0.1);
    color: var(--color-primary);
}

.badge-green {
    background-color: rgba(27, 190, 111, 0.1);
    color: #12804b;
}

/* Responsiveness */
@media (max-width: 992px) {
    .grid-cols-3 {
        grid-template-columns: repeat(2, 1fr);
    }
}

@media (max-width: 576px) {
    .grid-cols-2, .grid-cols-3 {
        grid-template-columns: 1fr;
    }
}
} /* end @layer components */

/* ═══ css/components/modal.css ═══ */
@layer components {
/* Modal Dialogue Component Styles */

.modal-overlay {
    position: fixed;
    top: 0;
    left: 0;
    width: 100vw;
    height: 100vh;
    background-color: rgba(26, 10, 42, 0.6); /* Translucent Volt Dark */
    backdrop-filter: blur(8px);
    -webkit-backdrop-filter: blur(8px);
    display: flex;
    justify-content: center;
    align-items: center;
    z-index: 1000;
    opacity: 0;
    visibility: hidden;
    transition: opacity var(--transition-normal), visibility var(--transition-normal);
}

.modal-overlay.active {
    opacity: 1;
    visibility: visible;
}

.modal-container {
    background-color: var(--color-bg-primary);
    border: 1px solid var(--color-border-subtle);
    border-top: 6px solid var(--color-primary);
    border-radius: 2px;
    width: 90%;
    max-width: 750px;
    max-height: 85vh;
    overflow-y: auto;
    box-shadow: var(--shadow-lg);
    transform: translateY(24px) scale(0.98);
    transition: transform var(--transition-normal);
}

.modal-overlay.active .modal-container {
    transform: translateY(0) scale(1);
}

.modal-header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: var(--space-6);
    border-bottom: 1px solid var(--color-border-subtle);
}

.modal-title {
    font-size: var(--font-size-h3);
    font-weight: 700;
    color: var(--color-primary);
}

.modal-close-btn {
    background: transparent;
    border: none;
    cursor: pointer;
    font-size: 24px;
    color: var(--color-text-muted);
    transition: color var(--transition-fast);
    padding: var(--space-1);
    display: flex;
    align-items: center;
    justify-content: center;
}

.modal-close-btn:hover {
    color: var(--color-primary);
}

.modal-body {
    padding: var(--space-6);
}

.modal-footer {
    display: flex;
    justify-content: flex-end;
    gap: var(--space-3);
    padding: var(--space-4) var(--space-6);
    border-top: 1px solid var(--color-border-subtle);
    background-color: var(--color-bg-secondary);
}

/* Modal sizing variations */
.modal-lg {
    max-width: 950px;
}

.modal-sm {
    max-width: 450px;
}
} /* end @layer components */

/* ═══ css/components/lanes.css ═══ */
@layer components {
/* Lane-System — Aufklärung (neutral) vs. Einordnung (meinung)
   Drei gleichzeitige Hebel: Farbe + Typo + Label.
   Hard rule: meinung in <2s erkennbar.

   v2 · Ä1: Farbige Kanten + Lane-Labels laufen über die flippenden Tokens
   --cl-lane-neutral / --cl-lane-meinung. Im Dark sind das exakt Salbei/Terrakotta
   (0 Änderung), im Light die WCAG-verifizierten -ink-Töne — damit ist der 5px-Balken
   und das Mono-Label auf Creme sichtbar statt zu verschwinden. */

/* ── Lane neutral (Strang A / B / C — Bericht) ──────────────────── */

[data-lane="neutral"] {
    border-left: 5px solid var(--cl-lane-neutral);
    padding-left: var(--space-6);
    background: transparent;
}

[data-lane="neutral"] .lane-label {
    font-family: var(--font-mono);
    font-size: 12px;
    letter-spacing: 0.08em;
    color: var(--cl-lane-neutral);
    text-transform: uppercase;
    display: inline-block;
    margin-bottom: var(--space-3);
}

/* ── Lane Meinung (Strang D — Einordnung) ──────────────────────── */

[data-lane="meinung"] {
    border: 2px solid var(--cl-lane-meinung);
    border-top: 5px solid var(--cl-lane-meinung);
    padding: var(--space-6);
    background: rgba(198, 107, 69, 0.05);
}

[data-lane="meinung"] .lane-label {
    font-family: var(--font-mono);
    font-size: 12px;
    letter-spacing: 0.08em;
    color: var(--cl-lane-meinung);
    background: rgba(198, 107, 69, 0.10);
    padding: var(--space-2) var(--space-4);
    display: inline-block;
    text-transform: uppercase;
    margin-bottom: var(--space-4);
}

[data-lane="meinung"] h1,
[data-lane="meinung"] h2,
[data-lane="meinung"] h3 {
    font-style: italic;
    color: var(--cream);
}

[data-lane="meinung"] .author-signature {
    display: flex;
    gap: var(--space-3);
    align-items: center;
    color: var(--aubergine);
    font-size: var(--font-size-small);
    font-family: var(--font-mono);
    margin-top: var(--space-6);
    padding-top: var(--space-4);
    border-top: 1px solid rgba(198, 107, 69, 0.25);
}

[data-lane="meinung"] .author-signature::before {
    content: "";
    width: 12px;
    height: 12px;
    background: var(--aubergine);
    border-radius: 50%;
    display: inline-block;
}

/* Hinweis: Strang B (Anleitungen) nutzt data-lane="neutral" (sage-Ton) —
   eigene Lane "anleitung" wurde 2026-06-22 entfernt (Slava-Iteration:
   4 Stränge mit klarer Sage/Terrakotta-Logik). */

/* ── Lane-Banner (zusätzlich über Meinung-Stücken) ─────────────── */

.lane-banner {
    background: var(--terracotta);
    color: #171019;   /* fester Ink — Terrakotta-Fläche bleibt lesbar in beiden Modi (var(--ink) kippt im Light zu Creme) */
    font-family: var(--font-mono);
    font-size: 12px;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    padding: var(--space-2) var(--space-4);
    margin-bottom: 0;
    border-bottom: 4px solid var(--terracotta);
}

.lane-banner::before {
    content: "● ";
}

/* ── Mobile: sticky Band oben + 4 px Fußleiste in Lane-Farbe ────── */

@media (max-width: 768px) {
    [data-lane="neutral"] {
        border-bottom: 4px solid var(--cl-lane-neutral);
    }

    [data-lane="meinung"] {
        border-bottom: 4px solid var(--cl-lane-meinung);   /* v2 · MS-01: -style/-color komplettiert */
        padding: var(--space-4);
    }

    [data-lane="meinung"] .lane-label {
        position: sticky;
        top: var(--nav-height);
        z-index: 5;
        width: 100%;
        margin: calc(-1 * var(--space-4)) calc(-1 * var(--space-4)) var(--space-4);
        border-bottom: 4px solid var(--cl-lane-meinung);
    }
}

/* ── Light-Mode Anpassungen ────────────────────────────────────── */

.light-mode [data-lane="meinung"] {
    background: rgba(198, 107, 69, 0.08);
}

.light-mode [data-lane="meinung"] h1,
.light-mode [data-lane="meinung"] h2,
.light-mode [data-lane="meinung"] h3 {
    color: var(--aubergine);
}
} /* end @layer components */

/* ═══ shared/components/Belege.css ═══ */
@layer components {
/* ──────────────────────────────────────────────────────────────────────
   Belege — Beleg-Badge + Q¹-Marke + Quellen-Card + Quellenverzeichnis
   Migriert nach shared/ in Task 2.3 (Shared-Architecture-Refactor 2026-06-30).
   Quelle: civiclab/css/components/belege.css (Hauptseite, einzige Variante).
   Token-only — alle Farb-Aliase als var(--cl-*) referenziert.
   Drei Patterns: Badge (Stück-Anfang) · Inline-Marke (Hover-Card) · Verzeichnis (Stück-Ende).
   ────────────────────────────────────────────────────────────────────── */

/* ── Stück-Anfang: Belegt-Badge ────────────────────────────────── */

.beleg-badge {
    font-family: var(--cl-font-mono, 'Space Mono', 'Courier New', monospace);
    font-size: 12px;
    color: var(--cl-sage);
    border: 1px solid var(--cl-sage);
    padding: var(--space-1) var(--space-3);
    display: inline-block;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    background: rgba(142, 154, 108, 0.06); /* sage @6 % — kein Token-Pendant */
}

.beleg-badge::before {
    content: "◆ ";
}

/* ── Inline-Marke (Q¹, Q², …) ─────────────────────────────────── */

.beleg-marke {
    font-family: var(--cl-font-mono, 'Space Mono', 'Courier New', monospace);
    font-size: 0.75em;
    vertical-align: super;
    color: var(--cl-signal);
    cursor: pointer;
    background: rgba(224, 169, 59, 0.12); /* signal @12 % — kein Token-Pendant */
    padding: 1px 5px;
    margin: 0 1px;
    text-decoration: none;
    border: 0;
    font-weight: 700;
    transition: background var(--transition-fast);
}

.beleg-marke:hover,
.beleg-marke:focus-visible {
    background: var(--cl-signal);
    color: var(--cl-ink);
    outline: 2px solid var(--cl-sage);
    outline-offset: 2px;
}

/* ── Quellen-Card (Hover/Tap) ─────────────────────────────────── */

.quellen-card {
    position: absolute;
    background: var(--cl-surface);
    border: 1px solid var(--cl-sage);
    border-left: 3px solid var(--cl-sage);
    padding: var(--space-4);
    max-width: 360px;
    box-shadow: var(--shadow-md);
    z-index: 100;
    font-family: var(--cl-font-display, 'Archivo', sans-serif);
    font-size: 14px;
    color: var(--cl-cream);
}

.quellen-card .titel {
    font-weight: 700;
    color: var(--cl-cream);
    margin-bottom: var(--space-1);
}

.quellen-card .meta {
    color: var(--cl-text-muted);
    font-size: 13px;
    font-family: var(--cl-font-mono, 'Space Mono', 'Courier New', monospace);
    margin-bottom: var(--space-3);
}

.quellen-card .link {
    color: var(--cl-sage);
    font-family: var(--cl-font-mono, 'Space Mono', 'Courier New', monospace);
    font-size: 13px;
    text-decoration: none;
    display: inline-flex;
    align-items: center;
    gap: var(--space-1);
}

.quellen-card .link:hover {
    color: var(--cl-signal);
}

.quellen-card-id {
    font-family: var(--cl-font-mono, 'Space Mono', 'Courier New', monospace);
    font-size: 11px;
    color: var(--cl-sage);
    text-transform: uppercase;
    letter-spacing: 0.08em;
    margin-bottom: var(--space-2);
}

/* ── Quellen-Popover v2 (Popover API + <dialog>) — Animations-Welle 04–08 ──
   Browser-native Light-Dismiss + ESC + Backdrop. Zentriert im Viewport. */

.quellen-popover {
    position: fixed;
    inset: auto;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    max-width: 360px;
    margin: 0; /* default popover/dialog margin override */
    background: var(--cl-surface);
    border: 1px solid var(--cl-sage);
    border-left: 3px solid var(--cl-sage);
    color: var(--cl-cream);
    padding: var(--space-6);
    font-family: var(--cl-font-display, 'Archivo', sans-serif);
    font-size: 14px;
    box-shadow: var(--shadow-md, 0 8px 24px rgba(0, 0, 0, 0.4));
}

.quellen-popover::backdrop {
    background: rgba(23, 16, 25, 0.6); /* ink @60 % */
    backdrop-filter: blur(2px);
}

.quellen-popover .titel {
    font-weight: 700;
    color: var(--cl-cream);
    margin-bottom: var(--space-1);
}

.quellen-popover .meta {
    color: var(--cl-text-muted);
    font-size: 13px;
    font-family: var(--cl-font-mono, 'Space Mono', 'Courier New', monospace);
    margin-bottom: var(--space-3);
}

.quellen-popover .link {
    color: var(--cl-sage);
    font-family: var(--cl-font-mono, 'Space Mono', 'Courier New', monospace);
    font-size: 13px;
    text-decoration: none;
    display: inline-flex;
    align-items: center;
    gap: var(--space-1);
}

.quellen-popover .link:hover {
    color: var(--cl-signal);
}

.quellen-popover .quellen-close {
    display: block;
    margin-top: var(--space-4);
    background: transparent;
    border: 1px solid var(--cl-sage);
    color: var(--cl-sage);
    padding: var(--space-2) var(--space-4);
    font-family: var(--cl-font-mono, 'Space Mono', 'Courier New', monospace);
    font-size: 13px;
    cursor: pointer;
}

.quellen-popover .quellen-close:hover {
    background: var(--cl-sage);
    color: var(--cl-ink);
}

/* Sanfter Auftritt via @starting-style (graceful — ohne Support einfach instant) */
@supports (transition-behavior: allow-discrete) {
    .quellen-popover {
        opacity: 1;
        transition: opacity 200ms ease-out, transform 200ms ease-out, overlay 200ms allow-discrete, display 200ms allow-discrete;
    }
    @starting-style {
        .quellen-popover:popover-open {
            opacity: 0;
            transform: translate(-50%, calc(-50% + 12px));
        }
    }
}

/* ── Stück-Ende: Quellenverzeichnis ───────────────────────────── */

.quellenverzeichnis {
    border-top: 1px solid var(--cl-aubergine);
    margin-top: var(--space-12);
    padding-top: var(--space-6);
}

.quellenverzeichnis-title {
    font-family: var(--cl-font-mono, 'Space Mono', 'Courier New', monospace);
    font-size: 12px;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: var(--cl-text-muted);
    margin-bottom: var(--space-4);
}

.quellenverzeichnis .qref {
    display: grid;
    grid-template-columns: 40px 1fr;
    gap: var(--space-3);
    font-family: var(--cl-font-mono, 'Space Mono', 'Courier New', monospace);
    font-size: 14px;
    margin-bottom: var(--space-3);
    line-height: 1.4;
}

.quellenverzeichnis .qref-id {
    color: var(--cl-sage);
    font-weight: 700;
}

.quellenverzeichnis .qref-text {
    color: var(--cl-cream);
}

.quellenverzeichnis .qref a {
    color: var(--cl-sage);
    text-decoration: underline;
    text-decoration-color: var(--cl-aubergine);
    text-underline-offset: 2px;
}

/* ── Mobile: Quellen-Card als Modal ───────────────────────────── */

@media (max-width: 768px) {
    .quellen-card {
        position: fixed;
        left: var(--space-4);
        right: var(--space-4);
        bottom: var(--space-4);
        max-width: none;
    }
}

/* ── Light-Mode Overrides (legacy .light-mode-Klasse, parallel zu
      [data-theme="light"]-Token-Remap in colors.css) ──────────────── */
.light-mode .beleg-badge { background: rgba(142, 154, 108, 0.12); /* sage @12 % */ }
.light-mode .quellen-card { background: var(--color-bg-card); color: var(--cl-aubergine); }
.light-mode .quellen-card .titel { color: var(--cl-aubergine); }
.light-mode .quellen-popover { background: var(--color-bg-card); color: var(--cl-aubergine); }
.light-mode .quellen-popover .titel { color: var(--cl-aubergine); }
.light-mode .quellenverzeichnis .qref-text { color: var(--cl-aubergine); }
} /* end @layer components */

/* ═══ shared/components/NextStep.css ═══ */
@layer components {
/* ──────────────────────────────────────────────────────────────────────
   NextStep — "Nächster Schritt"-Komponente (Funnel-CTA)
   Migriert nach shared/ in Task 2.2 (Shared-Architecture-Refactor 2026-06-30).
   Quelle: civiclab/css/components/next-step.css (Hauptseite, einzige Variante).
   Token-only — alle Farb-Aliase als var(--cl-*) referenziert.
   Genau EIN Schritt pro Seite, nie ein Menü.
   PFLICHT: Kapazitäts-Hinweis statt offenem "Schreib mir!".
   ────────────────────────────────────────────────────────────────────── */

/* ── Base (Phase 1 warm — Salbei-Rahmen) ─────────────────────────────── */
.next-step {
    border: 2px solid var(--cl-sage);
    padding: var(--space-6);
    margin: var(--space-12) 0;
    background: rgba(142, 154, 108, 0.05); /* sage @5 % — kein Token-Pendant */
}

.next-step-kicker {
    font-family: var(--cl-font-mono, 'Space Mono', 'Courier New', monospace);
    font-size: 12px;
    color: var(--cl-sage);
    text-transform: uppercase;
    letter-spacing: 0.08em;
    display: block;
    margin-bottom: var(--space-3);
}

.next-step-kicker::before {
    content: "→ ";
}

.next-step h3 {
    margin: var(--space-2) 0 var(--space-3);
    color: var(--cl-cream);
    font-weight: 700;
}

.next-step-text {
    color: var(--cl-cream);
    font-size: 16px;
    margin-bottom: var(--space-4);
    line-height: 1.5;
}

.next-step-row {
    display: flex;
    align-items: center;
    gap: var(--space-4);
    flex-wrap: wrap;
}

.next-step .kapazitaet {
    font-family: var(--cl-font-mono, 'Space Mono', 'Courier New', monospace);
    color: var(--cl-signal);
    font-size: 14px;
}

.next-step .kapazitaet--missing {
    color: var(--cl-terracotta);
    text-decoration: line-through;
}

/* ── Phase 2 (kalt — Ein-Klick-Voting, Aubergine-Rahmen) ──────────────── */
.next-step--phase-2 {
    background: rgba(87, 74, 124, 0.08); /* aubergine @8 % — kein Token-Pendant */
    border-color: var(--cl-aubergine);
}

.next-step--phase-2 .next-step-kicker {
    color: var(--cl-aubergine);
}

.next-step--phase-2 .next-step-kicker::before {
    content: "→ ";
}

.vote-buttons {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: var(--space-3);
    margin-top: var(--space-2);
}

.vote-button {
    padding: var(--space-3) var(--space-6);
    background: transparent;
    border: 1px solid var(--cl-cream);
    color: var(--cl-cream);
    font-family: var(--cl-font-display, 'Archivo', sans-serif);
    font-weight: 700;
    font-size: 16px;
    cursor: pointer;
    transition: background var(--transition-fast), border-color var(--transition-fast);
}

.vote-button:hover,
.vote-button:focus-visible {
    background: var(--cl-cream);
    color: var(--cl-ink);
}

.vote-button[aria-pressed="true"] {
    background: var(--cl-sage);
    border-color: var(--cl-sage);
    color: var(--cl-ink);
}

.vote-result {
    margin-top: var(--space-4);
    font-family: var(--cl-font-mono, 'Space Mono', 'Courier New', monospace);
    font-size: 13px;
    color: var(--cl-text-muted);
}

/* ── Mobile ──────────────────────────────────────────────────────────── */
@media (max-width: 576px) {
    .next-step { padding: var(--space-4); }
    .next-step-row { flex-direction: column; align-items: flex-start; }
    .vote-buttons { grid-template-columns: 1fr; }
    .vote-button { width: 100%; min-height: 48px; }
}

/* ── Light-Mode Overrides (legacy .light-mode-Klasse, parallel zu
      [data-theme="light"]-Token-Remap in colors.css) ──────────────────── */
.light-mode .next-step {
    background: rgba(142, 154, 108, 0.10); /* sage @10 % — kein Token-Pendant */
}
.light-mode .next-step h3,
.light-mode .next-step-text { color: var(--cl-aubergine); }
.light-mode .vote-button { color: var(--cl-aubergine); border-color: var(--cl-aubergine); }
.light-mode .vote-button:hover { background: var(--cl-aubergine); color: var(--cl-cream); }
} /* end @layer components */

/* ═══ shared/components/MandateStrip.css ═══ */
@layer components {
/* ──────────────────────────────────────────────────────────────────────
   MandateStrip — Disclosure-Strip für Transparenz-Hinweis
   Vereinte Version aus civiclab/css/components/mandate-strip.css
   + civiclab/wissenswertes-wahlprogramme/css/components/mandate-strip.css.
   Migriert nach shared/ in Task 2.1 (Shared-Architecture-Refactor 2026-06-30).
   Token-only — alle Hex-Werte als var(--cl-*) referenziert.
   ────────────────────────────────────────────────────────────────────── */

/* CLS-Fix (Welle 4 carry-forward #1, 2026-07-01):
   Reserve the rendered footer-strip height on the empty #mandate-strip-slot.
   Wahlprogramme-variant is mounted after hub.js boots → without reservation
   the footer slot grows from 0 → ~44px (desktop) / ~105px (mobile). Although
   the slot lives below the initial fold and doesn't dominate the CLS-score
   on wahlprogramme, reserving avoids visible scroll-shift on mobile + makes
   the contract explicit. Heights match observed render at default viewport. */
#mandate-strip-slot {
  min-height: 44px;
}
@media (max-width: 768px) {
  #mandate-strip-slot { min-height: 105px; }
}

/* ── Base (civic-variant, sticky unter Navbar) ───────────────────────── */
.mandate-strip {
  position: sticky;
  top: var(--nav-height, 64px);
  z-index: 90;
  background: var(--cl-surface);
  border-bottom: 1px solid var(--cl-aubergine);
  padding: var(--space-2, 8px) var(--space-6, 24px);
  font-family: var(--cl-font-mono, 'Space Mono', 'Courier New', monospace);
  font-size: 13px;
  color: var(--cl-cream);
  display: flex;
  align-items: center;
  gap: var(--space-3, 12px);
}

.mandate-strip::before {
  content: "";
  width: 8px;
  height: 8px;
  background: var(--cl-sage);
  border-radius: 50%;
  flex-shrink: 0;
}

.mandate-strip .mandate-text {
  flex: 1;
  min-width: 0;
}

.mandate-strip a {
  color: var(--cl-sage);
  font-family: var(--cl-font-mono, 'Space Mono', 'Courier New', monospace);
  text-decoration: none;
  white-space: nowrap;
  margin-left: auto;
  flex-shrink: 0;
}

.mandate-strip a:hover,
.mandate-strip a:focus-visible {
  color: var(--cl-signal);
  text-decoration: underline;
}

/* ── Variant: civic-inline — über einem Stück bei Strang C/D ─────────── */
.mandate-strip--inline {
  position: static;
  margin: 0 0 var(--space-6, 24px) 0;
  background: rgba(87, 74, 124, 0.12); /* aubergine @12 % — kein Token-Pendant */
}

/* ── Variant: wahlprogramme — diskreter Footer-Disclosure ────────────────
   Slava-Feedback 2026-06-30: Strip vom prominenten Top-Block zum dezenten
   Footer. Kleinere Schrift, gedämpfte Farbe, dünner Top-Border statt Box,
   kein Background-Fill, mehr Whitespace zwischen Text und Link.
   Slot wird in den wahlprogramme-HTMLs nach `</main>` gemounted. */
.mandate-strip--wahlprogramme {
  /* Reset civic-Defaults: nicht sticky, kein Dot-::before, kein Flex-Row.
     Stattdessen Footer-Look mit Top-Border + transparentem Hintergrund. */
  position: static;
  top: auto;
  z-index: auto;
  display: block;
  margin-top: var(--space-8, 32px);
  padding: var(--space-4, 16px) var(--space-6, 24px);
  font-family: var(--cl-font-mono, 'Space Mono', 'Courier New', monospace);
  font-size: 11px;
  line-height: 1.6;
  letter-spacing: 0.02em;
  background: transparent;
  border-top: 1px solid var(--cl-border);
  border-bottom: none;
  color: var(--cl-text-muted, rgba(245, 240, 232, 0.55));
}

.mandate-strip--wahlprogramme::before {
  /* kein Dot-Indikator in dieser Variante */
  content: none;
}

.mandate-strip__inner {
  max-width: var(--max-width-content, 1200px);
  margin: 0 auto;
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-2, 8px) var(--space-6, 24px);
  align-items: baseline;
  justify-content: space-between;
}

.mandate-strip--wahlprogramme strong {
  color: var(--cl-text, var(--cl-cream));
  font-weight: 600;
}

.mandate-strip--wahlprogramme a {
  color: var(--cl-sage);
  border-bottom: 1px dotted currentColor;
  margin-left: 0; /* reset civic-margin */
  white-space: normal;
  opacity: 0.85;
  transition: opacity 0.15s ease;
}

.mandate-strip--wahlprogramme a:hover,
.mandate-strip--wahlprogramme a:focus-visible {
  opacity: 1;
}

/* ── Footer-Disclosure (prominenter, aber unten) ─────────────────────── */
.footer-disclosure {
  display: flex;
  gap: var(--space-3, 12px);
  padding: var(--space-4, 16px) var(--space-4, 16px);
  margin-bottom: var(--space-8, 32px);
  background: rgba(87, 74, 124, 0.15); /* aubergine @15 % */
  border-left: 4px solid var(--cl-sage);
  align-items: flex-start;
}

.footer-disclosure-dot {
  width: 10px;
  height: 10px;
  background: var(--cl-sage);
  border-radius: 50%;
  flex-shrink: 0;
  margin-top: 6px;
}

.footer-disclosure-text {
  color: var(--cl-cream);
  font-size: 14px;
  line-height: 1.5;
  font-family: var(--cl-font-display, 'Archivo', sans-serif);
}

.footer-disclosure-text a {
  color: var(--cl-sage);
  font-family: var(--cl-font-mono, 'Space Mono', 'Courier New', monospace);
  margin-left: var(--space-2, 8px);
  white-space: nowrap;
}

.footer-disclosure-text a:hover {
  color: var(--cl-signal);
}

/* ── Responsive ──────────────────────────────────────────────────────── */
@media (max-width: 768px) {
  .mandate-strip {
    padding: var(--space-2, 8px) var(--space-4, 16px);
    font-size: 12px;
  }
  .mandate-strip .mandate-text {
    font-size: 11px;
  }
}

/* ── Light-Mode Overrides (legacy .light-mode-Klasse, parallel zu
      [data-theme="light"]-Token-Remap in colors.css) ──────────────────── */
.light-mode .mandate-strip {
  background: rgba(87, 74, 124, 0.08);
  color: var(--cl-aubergine);
}
.light-mode .mandate-strip::before {
  background: var(--cl-sage);
}
.light-mode .mandate-strip a {
  color: var(--cl-aubergine);
}

.light-mode .footer-disclosure {
  background: rgba(87, 74, 124, 0.10);
}
.light-mode .footer-disclosure-text {
  color: var(--cl-aubergine);
}

/* Hinweis: .mandate-strip--wahlprogramme braucht KEIN light-mode-Override,
   da es bereits --cl-text-muted und --cl-border verwendet, die in
   tokens/colors.css für beide Themes definiert sind. */
} /* end @layer components */

/* ═══ css/components/page-head.css ═══ */
@layer components {
/* Page-Head — gemeinsamer Kopf für alle Strang-Listenseiten.
   Aus Slavas Drop-in-Spec 2026-06-22 (NACHHER-Variante):
     · Kicker eigene Zeile oben (Space Mono, sage / d: terracotta)
     · Title in --cream (NIE --signal — das bleibt Live-Punkten vorbehalten)
     · Links­bündig, nicht zentriert
     · 56×3 px Rule unter dem Title (sage / d: terracotta)
     · Bei Meinung-Strang: Title kursiv + Akzent in Terracotta */

.page-head {
    text-align: left;
    margin-bottom: var(--space-12);
    max-width: 760px;
}

/* Kicker — eigene Zeile, oben, Mono */
.page-head__kicker {
    display: block;
    font-family: var(--font-mono);
    font-size: 13px;
    letter-spacing: 0.14em;
    text-transform: uppercase;
    color: var(--sage);
    margin-bottom: var(--space-3);
}

/* Title — Cream, kräftig, schmal getrackt */
.page-head__title {
    color: var(--cream);
    font-family: var(--font-primary);
    font-weight: 700;
    font-size: 40px;
    line-height: 1.1;
    letter-spacing: -0.01em;
    margin: 0;
}

/* Rule — kurze farbige Linie unter dem Titel */
.page-head__rule {
    width: 56px;
    height: 3px;
    background: var(--sage);
    margin-top: 14px;
    margin-bottom: var(--space-4);
}

/* Optionaler Lead-Absatz unter der Rule */
.page-head__lead {
    color: var(--cream);
    opacity: 0.82;
    font-size: 17px;
    line-height: 1.5;
    margin: 0;
}

/* ── Variante: Strang D (Meinung) ──────────────────────────────── */

.page-head--meinung .page-head__kicker {
    color: var(--terracotta);
}

.page-head--meinung .page-head__title {
    font-style: italic;
}

.page-head--meinung .page-head__rule {
    background: var(--terracotta);
}

/* ── Mobile ─────────────────────────────────────────────────────── */

@media (max-width: 768px) {
    .page-head__title { font-size: 28px; }
    .page-head__lead  { font-size: 16px; }
    .page-head        { margin-bottom: var(--space-8); }
}

/* ── Light-Mode ────────────────────────────────────────────────── */

.light-mode .page-head__title { color: var(--aubergine); }
.light-mode .page-head__lead  { color: #2D2734; }
} /* end @layer components */

/* ═══ css/components/sitzung-accordion.css ═══ */
@layer components {
/* Sitzungs-Akkordeon — verschachtelte <details>/<summary>-Struktur
   für Strang C (Aktuell). Sitzung → TOPs als Drop-down. Style-Guide-treu.
   Keine JS-Library: nutzt HTML5-native Akkordeon-Semantik (A11Y-konform). */

.sitzungen-block {
    margin-top: var(--space-12);
}

.sitzungen-block__head {
    font-family: var(--font-mono);
    font-size: 13px;
    letter-spacing: 0.14em;
    text-transform: uppercase;
    color: var(--sage);
    margin-bottom: var(--space-4);
    padding-bottom: var(--space-2);
    border-bottom: 1px solid var(--aubergine);
}

.sitzungen-block__head--anstehend {
    color: var(--signal);
}

.sitzungen-list {
    list-style: none;
    padding: 0;
    margin: 0;
    display: flex;
    flex-direction: column;
    gap: var(--space-2);
}

/* ── Sitzungs-Akkordeon (Level 1) ──────────────────────────────── */

.sitzung {
    border-left: 3px solid var(--aubergine);
    background: var(--surface);
    padding: 0;
    transition: border-color var(--transition-fast);

    /* Stagger-Entry — jede Sitzungs-Card 70 ms später, sanftes Easing.
       backwards = startet im "from"-Zustand vor der Verzögerung. */
    animation: sitzung-card-in 540ms cubic-bezier(0.16, 1, 0.3, 1) backwards;
    animation-delay: calc(var(--i, 0) * 70ms + 120ms);
}

@keyframes sitzung-card-in {
    from {
        opacity: 0;
        transform: translateY(16px);
    }
    to {
        opacity: 1;
        transform: translateY(0);
    }
}

@media (prefers-reduced-motion: reduce) {
    .sitzung {
        animation: none;
    }
}

.sitzung[open] {
    border-left-color: var(--sage);
}

.sitzung[data-status="anstehend"] {
    border-left-color: var(--signal);
}

/* ── v2 · NEWS-03/D1-11: Gremium-Farbcodierung entfernt ─────────────
   Datumsbalken (linke Border) läuft einheitlich über --aubergine (Violett),
   Zustands-Marker bleiben: [open] = Salbei, anstehend = Signal.
   Das Gremium ist weiterhin über den Mono-Text (.sitzung__gremium) erkennbar —
   Farbe ist keine Kategorie-Codierung mehr (DESIGN v2 §2: Lane-Farben bleiben
   den Lanes vorbehalten, --stadt-blue/--landkreis-green sind abgeschafft). */

.sitzung > summary {
    list-style: none;
    cursor: pointer;
    padding: var(--space-4) var(--space-6);
    display: grid;
    grid-template-columns: 92px 1fr auto;
    gap: var(--space-4);
    align-items: center;
    font-family: var(--font-primary);
}

.sitzung > summary::-webkit-details-marker { display: none; }
.sitzung > summary::marker { content: ""; }

.sitzung > summary:hover { background: rgba(142, 154, 108, 0.05); }

.sitzung > summary:focus-visible {
    outline: 2px solid var(--sage);
    outline-offset: -2px;
}

.sitzung__datum {
    font-family: var(--font-mono);
    font-size: 13px;
    letter-spacing: 0.08em;
    color: var(--sage);
    text-transform: uppercase;
    display: inline-flex;
    align-items: center;
    gap: var(--space-2);
}

/* Light-Mode Contrast-Fix: --sage/--signal Text-Farben sind auf Cream-BG kaum lesbar.
   Für Chips/Datum-Marker im Light-Mode dunklere Tokens erzwingen. */
/* Light-Mode: Datum-Marker auf Olive-Ink (5,50:1) statt Olive (3,77:1, fail als Text) */
.light-mode .sitzung__datum,
:root[data-theme="light"] .sitzung__datum {
    color: var(--cl-olive-ink);
}

/* Aktualitäts-Marker — Signal-Punkt nur bei Sitzungen ≤ 48 h */
.sitzung__datum--aktuell {
    color: var(--signal);
    font-weight: 700;
}
/* Light-Mode: Signal-Gelb auf Cream miserabler Kontrast → dunkleres Amber */
.light-mode .sitzung__datum--aktuell,
:root[data-theme="light"] .sitzung__datum--aktuell {
    color: #8A6B12;   /* Signal 2 Stops dunkler */
}

.sitzung__datum--aktuell .dot-signal {
    /* erbt Animation aus globalem .dot-signal */
}

.sitzung__titel {
    color: var(--cream);
    font-size: 16px;
    font-weight: 700;
    line-height: 1.3;
    display: flex;
    flex-direction: column;
    gap: 2px;
}

.sitzung__gremium {
    font-family: var(--font-mono);
    font-size: 11px;
    letter-spacing: 0.1em;
    color: var(--color-text-muted);
    text-transform: uppercase;
    font-weight: 400;
}

.sitzung__meta {
    font-family: var(--font-mono);
    font-size: 12px;
    color: var(--color-text-muted);
    text-align: right;
    display: flex;
    flex-direction: column;
    gap: 2px;
    align-items: flex-end;
}

.sitzung__meta-chev {
    color: var(--sage);
    transition: transform var(--transition-fast);
    display: inline-block;
}

.sitzung[open] .sitzung__meta-chev { transform: rotate(90deg); }

.sitzung__body {
    padding: 0 var(--space-6) var(--space-6) var(--space-6);
    border-top: 1px dashed var(--aubergine);
    margin-top: 0;
}

.sitzung__body-intro {
    /* 85 % Creme als Alpha statt opacity — ein opacity-Stacking-Context würde
       die Kind-Links (→ Sitzung im RIS / → Permalink) unter 4,5:1 dimmen (axe). */
    color: color-mix(in srgb, var(--cream) 85%, transparent);
    font-size: 14px;
    line-height: 1.5;
    margin: var(--space-4) 0 var(--space-4) 0;
}

.sitzung__body-intro a {
    color: var(--sage);
    font-family: var(--font-mono);
    font-size: 13px;
    margin-left: var(--space-2);
}

/* ── TOP-Akkordeon (Level 2) ──────────────────────────────────── */

.tops-list {
    list-style: none;
    padding: 0;
    margin: 0;
    display: flex;
    flex-direction: column;
}

.top {
    border-bottom: 1px solid rgba(87, 74, 124, 0.4);
}

.top:last-child { border-bottom: 0; }

.top > summary {
    list-style: none;
    cursor: pointer;
    padding: var(--space-3) var(--space-2);
    display: grid;
    grid-template-columns: 50px 1fr auto;
    gap: var(--space-3);
    align-items: center;
    font-family: var(--font-primary);
}

.top > summary::-webkit-details-marker { display: none; }
.top > summary::marker { content: ""; }

.top > summary:hover { background: rgba(142, 154, 108, 0.04); }

.top > summary:focus-visible {
    outline: 2px solid var(--sage);
    outline-offset: -2px;
}

.top__nr {
    font-family: var(--font-mono);
    font-size: 12px;
    color: var(--sage);
    letter-spacing: 0.08em;
    text-transform: uppercase;
}

.top__titel {
    color: var(--cream);
    font-size: 14.5px;
    line-height: 1.4;
    font-weight: 500;
}

.top__status {
    font-family: var(--font-mono);
    font-size: 10px;
    letter-spacing: 0.1em;
    text-transform: uppercase;
    padding: 2px 8px;
    border: 1px solid currentColor;
    white-space: nowrap;
}

.top__status--beschlossen                { color: var(--sage); }
.top__status--vertagt                    { color: var(--signal); }
.top__status--abgelehnt                  { color: var(--terracotta); }
.top__status--beratung                   { color: var(--color-text-muted); }
.top__status--vorlaeufig                 { border-style: dashed; color: var(--cream); opacity: 0.7; }
.top__status--empfohlen                  { color: var(--sage); }
.top__status--empfohlen-mehrheitlich     { color: var(--signal); }
.top__status--empfohlen-mit-aenderung    { color: var(--teal); }
.top__status--empfohlen-ablehnung        { color: var(--terracotta); }
.top__status--aussprache                 { color: var(--color-text-muted); border-style: dashed; }

.top__body {
    padding: 0 var(--space-2) var(--space-4) calc(50px + var(--space-3) + var(--space-2));
    color: var(--cream);
    font-size: 14px;
    line-height: 1.6;
    display: flex;
    flex-direction: column;
    gap: var(--space-3);
}

.top__body p { margin: 0; opacity: 0.9; }

/* Meta-Zeile: Einbringer + Vorlage als Mono-Chips */
.top__meta {
    display: flex;
    flex-wrap: wrap;
    gap: var(--space-2) var(--space-4);
    font-family: var(--font-mono);
    font-size: 11px;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: var(--color-text-muted);
    margin-bottom: var(--space-1);
}

.top__meta-item {
    display: inline-flex;
    align-items: center;
    gap: 4px;
}

.top__meta-key {
    color: var(--sage);
}

.top__meta-value {
    color: var(--cream);
}

/* Sachstand (Haupttext) */
.top__sachstand {
    color: var(--cream);
    opacity: 0.92;
}

/* Hintergrund/Vorberatung — dezenter */
.top__details {
    color: var(--cream);
    opacity: 0.75;
    font-size: 13.5px;
    border-left: 2px solid var(--aubergine);
    padding-left: var(--space-3);
}

/* Beschluss-Box — bei status=beschlossen oder abgelehnt */
.top__beschluss {
    background: rgba(142, 154, 108, 0.08);
    border-left: 3px solid var(--sage);
    padding: var(--space-3) var(--space-4);
    margin: var(--space-1) 0;
}

.top__beschluss[data-status="abgelehnt"] {
    background: rgba(198, 107, 69, 0.08);
    border-left-color: var(--terracotta);
}

.top__beschluss-label {
    display: block;
    font-family: var(--font-mono);
    font-size: 11px;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: var(--sage);
    margin-bottom: 4px;
}

.top__beschluss[data-status="abgelehnt"] .top__beschluss-label {
    color: var(--terracotta);
}

.top__beschluss-text {
    color: var(--cream);
    font-style: italic;
    font-size: 14px;
    line-height: 1.5;
}

/* Abstimmungs-Zahlen — kompakte Inline-Anzeige */
.top__abstimmung {
    display: flex;
    flex-wrap: wrap;
    gap: var(--space-4);
    font-family: var(--font-mono);
    font-size: 12px;
    color: var(--color-text-muted);
    margin-top: var(--space-2);
}

.top__abstimmung-item strong {
    color: var(--cream);
    font-weight: 700;
    margin-left: 4px;
}

.top__abstimmung-item--ja strong   { color: var(--sage); }
.top__abstimmung-item--nein strong { color: var(--terracotta); }

/* Quellen-Liste — Mono-Block-Liste */
.top__quellen {
    margin-top: var(--space-1);
    padding-top: var(--space-2);
    border-top: 1px dashed rgba(87, 74, 124, 0.4);
    display: flex;
    flex-direction: column;
    gap: 4px;
    font-family: var(--font-mono);
    font-size: 12px;
}

.top__quellen-label {
    color: var(--sage);
    text-transform: uppercase;
    letter-spacing: 0.08em;
    font-size: 11px;
    margin-bottom: 2px;
}

.top__quellen a {
    color: var(--sage);
    text-decoration: none;
    display: inline-block;
}

.top__quellen a:hover,
.top__quellen a:focus-visible { color: var(--signal); }

/* Light-Mode für erweiterte Felder */
.light-mode .top__meta-value,
.light-mode .top__sachstand,
.light-mode .top__details,
.light-mode .top__beschluss-text { color: var(--aubergine); }
.light-mode .top__abstimmung-item strong { color: var(--aubergine); }

/* ── Mobile ─────────────────────────────────────────────────────── */

@media (max-width: 768px) {
    .sitzung > summary {
        grid-template-columns: 80px 1fr;
        gap: var(--space-3);
        padding: var(--space-3) var(--space-4);
    }

    .sitzung__meta {
        grid-column: 1 / -1;
        text-align: left;
        align-items: flex-start;
        flex-direction: row;
        gap: var(--space-3);
    }

    .sitzung__body {
        padding: 0 var(--space-4) var(--space-4) var(--space-4);
    }

    .top > summary {
        grid-template-columns: 40px 1fr;
        gap: var(--space-2);
    }

    .top__status {
        grid-column: 2 / -1;
        justify-self: start;
        margin-top: 4px;
    }

    .top__body {
        padding: 0 var(--space-2) var(--space-3) calc(40px + var(--space-2));
    }
}

/* ── Rechtsgrundlage-Chips (dezent, klickbar zu rechtsbestand-UI) ── */

.top__recht {
    display: flex;
    flex-wrap: wrap;
    gap: var(--space-2);
    margin-top: -4px;
}

.top__recht-chip {
    font-family: var(--font-mono);
    font-size: 10px;
    letter-spacing: 0.05em;
    color: var(--sage);
    background: rgba(142, 154, 108, 0.08);
    border: 1px solid rgba(142, 154, 108, 0.3);
    padding: 2px 8px;
    text-decoration: none;
    transition: background var(--transition-fast), color var(--transition-fast), border-color var(--transition-fast);
}

.top__recht-chip::before {
    content: "§ ";
    opacity: 0.5;
    margin-right: -2px;
}

.top__recht-chip:hover,
.top__recht-chip:focus-visible {
    background: rgba(142, 154, 108, 0.18);
    color: var(--cream);
    border-color: var(--sage);
}

/* ── Vorberatungs-Block (für StVV-TOPs mit Ausschuss-Empfehlung) ── */

.top__vorberatung {
    display: flex;
    flex-direction: column;
    gap: var(--space-2);
    padding: var(--space-3);
    background: rgba(87, 74, 124, 0.08);
    border-left: 2px solid var(--aubergine);
}

.top__vorberatung-label {
    font-family: var(--font-mono);
    font-size: 10px;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    color: var(--aubergine);
    font-weight: 700;
}

.top__vorberatung-item {
    display: flex;
    flex-direction: column;
    gap: var(--space-1);
}

.top__vorberatung-gremium {
    font-family: var(--font-mono);
    font-size: 11px;
    letter-spacing: 0.06em;
    color: var(--cream);
    text-transform: uppercase;
}

.top__vorberatung-ergebnis {
    font-size: 12px;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.05em;
}

.top__vorberatung-ergebnis--einstimmig    { color: var(--sage); }
.top__vorberatung-ergebnis--mehrheitlich  { color: var(--signal); }
.top__vorberatung-ergebnis--abgelehnt     { color: var(--terracotta); }

.top__vorberatung-note {
    font-size: 13px;
    font-style: italic;
    color: var(--color-text-muted);
    margin-top: var(--space-1) !important;
}

/* ── Abstimmungs-Block (Ausschuss-Beschluss mit Fraktions-Listen) ── */

.top__abstimmung-block {
    display: flex;
    flex-direction: column;
    gap: var(--space-2);
}

.top__abstimmung-text {
    font-weight: 600;
    color: var(--cream);
    opacity: 1 !important;
}

.top__stimmen {
    display: flex;
    flex-direction: column;
    gap: 4px;
    font-size: 12px;
    line-height: 1.5;
}

.top__stimm-row {
    color: var(--cream);
    opacity: 0.85;
}

.top__stimm-row em {
    font-style: normal;
    font-family: var(--font-mono);
    font-size: 10px;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: var(--sage);
    margin-right: var(--space-2);
}

/* ── Light-Mode ────────────────────────────────────────────────── */

.light-mode .sitzung { background: var(--surface); }
.light-mode .sitzung > summary:hover { background: rgba(142, 154, 108, 0.10); }
.light-mode .sitzung__titel,
.light-mode .top__titel,
.light-mode .top__body { color: var(--aubergine); }
.light-mode .sitzung__body-intro { color: #2D2734; }

.light-mode .top__recht-chip {
    background: rgba(142, 154, 108, 0.12);
    color: var(--olive);
}
.light-mode .top__vorberatung {
    background: rgba(87, 74, 124, 0.06);
}
.light-mode .top__abstimmung-text,
.light-mode .top__stimm-row {
    color: var(--aubergine);
}

/* ══════════════════════════════════════════════════════════════════
   W4b · Chronik-UI — Suche / Facetten-Filter / Sortierung / Permalink /
   Row-Level „→ Quelle" (D1-10, DESIGN §6.6) / Accountability-Verlauf.
   ══════════════════════════════════════════════════════════════════ */

/* ── Toolbar ───────────────────────────────────────────────────── */

.chronik-toolbar {
    margin-top: var(--space-8);
    display: flex;
    flex-direction: column;
    gap: var(--space-4);
    padding: var(--space-4);
    background: rgba(87, 74, 124, 0.06);
    border: 1px solid var(--aubergine);
}

.chronik-search {
    display: flex;
    flex-direction: column;
    gap: var(--space-2);
}

.chronik-search__label {
    font-family: var(--font-mono);
    font-size: 11px;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    color: var(--sage);
}

.chronik-search__input {
    width: 100%;
    min-height: 44px;
    font-family: var(--font-primary);
    font-size: 16px;
    padding: var(--space-3) var(--space-4);
    background: var(--input-bg);
    color: var(--input-text);
    border: 1px solid var(--color-border-subtle);
    border-radius: 0;
    outline: none;
    transition: border-color var(--transition-fast), box-shadow var(--transition-fast);
}

.chronik-search__input::placeholder { color: var(--color-text-muted); opacity: 0.85; }
.chronik-search__input:hover { border-color: var(--sage); }
.chronik-search__input:focus-visible {
    border-color: var(--sage);
    box-shadow: 0 0 0 3px rgba(142, 154, 108, 0.20);
}

/* ── Facetten (Pills) ──────────────────────────────────────────── */

.chronik-facets {
    display: flex;
    flex-direction: column;
    gap: var(--space-3);
}

.chronik-facet-group {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--space-2);
}

.chronik-facet-label {
    font-family: var(--font-mono);
    font-size: 11px;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    color: var(--color-text-muted);
    margin-right: var(--space-1);
    min-width: 80px;
}

.chronik-pill,
.chronik-sort__btn,
.chronik-reset {
    font-family: var(--font-mono);
    font-size: 12px;
    letter-spacing: 0.04em;
    min-height: 44px;
    padding: var(--space-2) var(--space-4);
    background: transparent;
    color: var(--cream);
    border: 1px solid var(--aubergine);
    border-radius: 0;
    cursor: pointer;
    transition: border-color var(--transition-fast), background var(--transition-fast), color var(--transition-fast);
}

.chronik-pill:hover,
.chronik-sort__btn:hover:not(:disabled) { border-color: var(--sage); }

.chronik-pill:focus-visible,
.chronik-sort__btn:focus-visible,
.chronik-reset:focus-visible {
    outline: 2px solid var(--sage);
    outline-offset: 2px;
}

.chronik-pill[aria-pressed="true"],
.chronik-sort__btn[aria-pressed="true"] {
    background: var(--sage);
    color: var(--ink);
    border-color: var(--sage);
    font-weight: 700;
}

/* ── Steuerzeile: Sortierung + Trefferzähler + Reset ──────────────── */

.chronik-controls {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--space-3) var(--space-4);
}

.chronik-sort {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--space-2);
}

.chronik-sort__btn {
    display: inline-flex;
    align-items: center;
    gap: 6px;
}

.chronik-sort__btn:disabled { opacity: 0.4; cursor: not-allowed; }
.chronik-sort__dir { font-size: 13px; }

.chronik-count {
    font-family: var(--font-mono);
    font-size: 12px;
    letter-spacing: 0.04em;
    color: var(--sage);
    margin: 0 0 0 auto;   /* rechts andocken, wrappt sonst auf eigene Zeile */
}

.chronik-reset {
    font-size: 11px;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: var(--terracotta);
    border-color: var(--terracotta);
}

.chronik-reset:hover { background: rgba(198, 107, 69, 0.10); border-color: var(--terracotta); }

.chronik-noresults {
    font-family: var(--font-mono);
    font-size: 13px;
    color: var(--color-text-muted);
    text-align: center;
    padding: var(--space-8) 0;
}

/* ── Row-Level „→ Quelle" im Summary (D1-10) ──────────────────────── */

.sitzung__meta-line {
    display: flex;
    align-items: center;
    gap: var(--space-2);
    justify-content: flex-end;
}

.sitzung__quelle {
    font-family: var(--font-mono);
    font-size: 12px;
    color: var(--sage);
    text-decoration: none;
    white-space: nowrap;
    margin-top: 2px;
    transition: color var(--transition-fast);
}

.sitzung__quelle:hover,
.sitzung__quelle:focus-visible { color: var(--signal); }

/* ── Permalink-Button im Body-Intro ──────────────────────────────── */

.sitzung__permalink {
    font-family: var(--font-mono);
    font-size: 13px;
    color: var(--sage);
    background: none;
    border: none;
    padding: 0;
    margin-left: var(--space-2);
    cursor: pointer;
}

.sitzung__permalink:hover,
.sitzung__permalink:focus-visible { color: var(--signal); text-decoration: underline; }

/* ── Permalink-Ziel-Highlight (?sitzung=…) ────────────────────────── */

.sitzung--target { border-left-color: var(--signal); }
.sitzung--target { animation: sitzung-target-pulse 2.2s var(--cl-ease-out, ease-out) 1; }

@keyframes sitzung-target-pulse {
    0%, 100% { background: var(--surface); }
    15%      { background: rgba(230, 184, 0, 0.14); }
}

@media (prefers-reduced-motion: reduce) {
    .sitzung--target { animation: none; }
}

/* ── Accountability-Verlaufs-Kette (Decidim-light) ────────────────── */

.top__verlauf {
    display: flex;
    flex-direction: column;
    gap: var(--space-2);
    padding: var(--space-3);
    background: rgba(142, 154, 108, 0.06);
    border-left: 2px solid var(--sage);
}

.top__verlauf-label {
    font-family: var(--font-mono);
    font-size: 10px;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    color: var(--sage);
    font-weight: 700;
}

.top__verlauf-chain {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-wrap: wrap;
    align-items: stretch;
    row-gap: var(--space-2);
}

.top__verlauf-node {
    display: inline-flex;
    flex-direction: column;
    gap: 1px;
    padding: var(--space-2) var(--space-3);
    background: rgba(87, 74, 124, 0.12);
    border: 1px solid var(--aubergine);
    position: relative;
}

.top__verlauf-node:not(:last-child) { margin-right: 24px; }

.top__verlauf-node:not(:last-child)::after {
    content: "→";
    position: absolute;
    right: -19px;
    top: 50%;
    transform: translateY(-50%);
    color: var(--sage);
    font-family: var(--font-mono);
    font-size: 13px;
}

.top__verlauf-node--current {
    background: rgba(142, 154, 108, 0.14);
    border-color: var(--sage);
}

.top__verlauf-gremium {
    font-family: var(--font-mono);
    font-size: 11px;
    letter-spacing: 0.05em;
    text-transform: uppercase;
    color: var(--cream);
}

.top__verlauf-datum {
    font-family: var(--font-mono);
    font-size: 10px;
    color: var(--color-text-muted);
}

.top__verlauf-ergebnis {
    font-size: 12px;
    font-weight: 600;
    color: var(--cream);
}

.top__verlauf-node--einstimmig   .top__verlauf-ergebnis { color: var(--sage); }
.top__verlauf-node--mehrheitlich .top__verlauf-ergebnis { color: var(--signal); }
.top__verlauf-node--abgelehnt    .top__verlauf-ergebnis { color: var(--terracotta); }

/* ── Chronik: Mobile ──────────────────────────────────────────────── */

@media (max-width: 768px) {
    .chronik-facet-label { min-width: 100%; margin-bottom: 2px; }
    .chronik-count { margin-left: 0; }
}

@media (max-width: 560px) {
    .top__verlauf-chain { flex-direction: column; align-items: flex-start; }
    .top__verlauf-node:not(:last-child) { margin-right: 0; margin-bottom: 22px; }
    .top__verlauf-node:not(:last-child)::after {
        right: auto;
        left: var(--space-4);
        top: auto;
        bottom: -18px;
        transform: none;
    }
}

/* ── Chronik: Light-Mode ──────────────────────────────────────────── */

.light-mode .chronik-toolbar,
:root[data-theme="light"] .chronik-toolbar {
    background: rgba(87, 74, 124, 0.05);
    border-color: rgba(87, 74, 124, 0.25);
}

.light-mode .chronik-search__label,
.light-mode .chronik-count {
    color: var(--cl-olive-ink);
}

.light-mode .chronik-pill,
.light-mode .chronik-sort__btn {
    color: var(--aubergine);
    border-color: rgba(87, 74, 124, 0.35);
}

.light-mode .chronik-pill[aria-pressed="true"],
.light-mode .chronik-sort__btn[aria-pressed="true"] {
    background: var(--cl-sage-ink);
    /* --cl-cream ist im Light-Mode DUNKEL (#2C2238) → hier --cl-ink nutzen,
       das im Light-Mode zum hellen Papier-Ton (#F1E8CE) kippt (5,3:1 auf sage-ink). */
    color: var(--cl-ink);
    border-color: var(--cl-sage-ink);
}

.light-mode .sitzung__quelle,
.light-mode .sitzung__permalink,
.light-mode .sitzung__body-intro a { color: var(--cl-olive-ink); }

.light-mode .top__verlauf-gremium,
.light-mode .top__verlauf-ergebnis { color: var(--aubergine); }
.light-mode .top__verlauf-node--einstimmig .top__verlauf-ergebnis { color: var(--olive); }
} /* end @layer components */

/* ═══ css/components/tile-dropdown.css ═══ */
@layer components {
/* Strang Tile Accordion/Dropdown Component Styles */

.strang-tile-expand-bar {
    display: flex;
    justify-content: center;
    align-items: center;
    gap: var(--space-2);
    padding: var(--space-3) var(--space-4);
    margin-top: var(--space-3);
    border-top: 1px solid rgba(87, 74, 124, 0.15);
    color: var(--color-text-muted);
    font-family: var(--font-mono);
    font-size: 12px;
    text-transform: uppercase;
    cursor: pointer;
    user-select: none;
    transition: var(--transition-fast);
    background: transparent;
}

.strang-tile-expand-bar:hover {
    color: var(--color-text-link-hover);
    background: rgba(142, 154, 108, 0.05);
}

.strang-tile.expanded .strang-tile-expand-bar {
    border-top: 1px solid transparent;
    background: rgba(142, 154, 108, 0.03);
    color: var(--color-text-primary);
}

.expand-icon {
    width: 14px;
    height: 14px;
    transition: transform var(--transition-normal);
}

.strang-tile.expanded .expand-icon {
    transform: rotate(180deg);
}

/* ── Dropdown Panel Drawer ────────────────────────────────────── */
.strang-tile-panel {
    max-height: 0;
    overflow: hidden;
    opacity: 0;
    transition: max-height var(--cl-motion-base) var(--cl-ease-out),
                opacity var(--cl-motion-base) var(--cl-ease-out),
                margin-top var(--cl-motion-base) var(--cl-ease-out);
    border-top: 1px dashed transparent;
    margin-top: 0;
    padding-top: 0;
}

.strang-tile.expanded .strang-tile-panel {
    max-height: 1200px; /* High enough to fit the text + sources */
    opacity: 1;
    margin-top: var(--space-4);
    padding-top: var(--space-4);
    border-top: 1px dashed var(--color-border-subtle);
}

/* ── Panel Content & Sources ──────────────────────────────────── */
.strang-tile-panel-content {
    font-size: 15px;
    line-height: var(--lh-body);
    color: var(--color-text-body);
}

.strang-tile-panel-content p {
    margin-bottom: var(--space-3);
}

.strang-tile-panel-content ol,
.strang-tile-panel-content ul {
    margin-bottom: var(--space-4);
    padding-left: var(--space-6);
}

.strang-tile-panel-content li {
    margin-bottom: var(--space-2);
}

.strang-tile-panel-sources {
    margin-top: var(--space-6);
    background: rgba(23, 16, 25, 0.4);
    padding: var(--space-4);
    border-left: 3px solid var(--color-border-subtle);
}

.light-mode .strang-tile-panel-sources {
    background: var(--surface);
}

.strang-tile-panel-sources h4 {
    font-family: var(--font-mono);
    font-size: 12px;
    text-transform: uppercase;
    margin-top: 0;
    margin-bottom: var(--space-2);
    color: var(--color-text-muted);
}

.strang-tile-panel-sources ul {
    list-style: none;
    padding-left: 0;
    margin: 0;
}

.strang-tile-panel-sources li {
    font-size: 13px;
    margin-bottom: var(--space-2);
    color: var(--color-text-muted);
    line-height: 1.4;
}

.strang-tile-panel-sources li:last-child {
    margin-bottom: 0;
}

.strang-tile-panel-sources .q-ref-num {
    display: inline-block;
    font-family: var(--font-mono);
    font-size: 10px;
    font-weight: bold;
    background: var(--color-border-subtle);
    color: var(--color-text-primary);
    padding: 1px 4px;
    margin-right: 6px;
}

.strang-tile-panel-sources a {
    color: var(--color-text-link);
    text-decoration: none;
    font-family: var(--font-mono);
    font-size: 12px;
    margin-left: 4px;
}

.strang-tile-panel-sources a:hover {
    color: var(--color-text-link-hover);
    text-decoration: underline;
}

/* ── Kurzversion Notice & CTA ─────────────────────────────────── */
.strang-tile-panel-notice {
    display: flex;
    align-items: center;
    gap: var(--space-2);
    background: rgba(87, 74, 124, 0.08);
    border: 1px solid rgba(87, 74, 124, 0.2);
    padding: var(--space-2) var(--space-4);
    font-size: 13px;
    margin-bottom: var(--space-4);
    color: var(--color-text-body);
    font-family: var(--font-primary);
}

.light-mode .strang-tile-panel-notice {
    background: rgba(87, 74, 124, 0.06);
    border-color: rgba(87, 74, 124, 0.18);
}

.notice-icon {
    font-size: 14px;
}

.notice-text {
    font-weight: 500;
}

.strang-tile-panel-notice .notice-link {
    margin-left: auto;
    color: var(--color-text-link);
    text-decoration: underline;
    font-weight: 500;
    font-family: var(--font-mono);
    text-transform: uppercase;
    font-size: 11px;
}

.strang-tile-panel-notice .notice-link:hover {
    color: var(--color-text-link-hover);
}

.strang-tile-action-bar {
    display: flex;
    justify-content: flex-end;
    margin-top: var(--space-4);
    margin-bottom: var(--space-2);
}

.tile-full-btn {
    font-family: var(--font-mono);
    text-transform: uppercase;
    font-size: 11px;
    font-weight: bold;
    border: 1px solid var(--color-border-subtle);
    padding: var(--space-2) var(--space-4);
    background: rgba(142, 154, 108, 0.04);
    color: var(--color-text-primary);
    text-decoration: none;
    transition: var(--transition-fast);
    display: inline-flex;
    align-items: center;
    gap: 4px;
}

.tile-full-btn:hover {
    background: var(--color-border-subtle);
    border-color: var(--color-text-link-hover);
    color: var(--color-text-link-hover);
}

@media (max-width: 576px) {
    .strang-tile-panel-notice {
        flex-direction: column;
        align-items: flex-start;
        gap: var(--space-1);
    }
    
    .strang-tile-panel-notice .notice-link {
        margin-left: 0;
        margin-top: 2px;
    }
}
} /* end @layer components */

/* ═══ css/components/bildsprache.css ═══ */
/* CivicNova — Marken-Bildsprache (Duoton / Halbton / Schraffur) + Ironie-Marginalie
   ────────────────────────────────────────────────────────────────────────────
   Quelle: DESIGN.md v2 §4 (Bildsprache-Rezepte) + §6.8 (Ironie-Slot).
   Reusable, dekorative Marken-Texturen. Bewusst dosiert („erwachsen, nicht
   knallig", DNA §1.5) und 3-Farben-treu.

   VERBOT (§4): Duoton/Halbton/Schraffur NIE auf Fließtext oder kontrastkritischen
   UI-Elementen — Kontrast (§7) hat immer Vorrang. Darum liegen diese Klassen in
   @layer utilities: sie werden gezielt auf Dekor-Elemente gelegt, nicht global.

   Reduced-Motion: rein statische Texturen, keine Animation — Baseline-safe. */

@layer utilities {

/* ── 1 · Duoton violett ──────────────────────────────────────────────────────
   Braucht den versteckten Inline-SVG-Filter #duotone-violett in index.html.
   Rampe ink → creme, entsättigt: der legitime Lila-Moment der Marke (§4 Ä9).
   Anwendung auf ein <img>/<picture> mit echtem Foto — bis dahin reserviert
   (DESIGN §9 offener Punkt: echtes Slava-Foto). */
.duotone {
    filter: url(#duotone-violett);
}

/* ── 2 · Halbton-Punkte ──────────────────────────────────────────────────────
   Raster-Overlay über entsättigtem Bild/Dekor (§4-Rezept). Der Parent muss
   position:relative + overflow:hidden tragen. */
.halftone {
    position: relative;
}

.halftone::after {
    content: "";
    position: absolute;
    inset: 0;
    pointer-events: none;
    background: radial-gradient(circle, var(--ink) 1px, transparent 1.5px);
    background-size: 6px 6px;
    mix-blend-mode: multiply;
    opacity: 0.35;
}

/* ── 3 · Schraffur ───────────────────────────────────────────────────────────
   45°-Linienraster, entsättigt-transparent (§4-Rezept). Als Flächen-Textur
   oder — via mask — als Ecke/Kante einsetzbar. */
.schraffur {
    background-image: repeating-linear-gradient(
        45deg,
        transparent 0 3px,
        color-mix(in srgb, var(--ink) 18%, transparent) 3px 4px);
}

/* ── 4 · Sektions-Trenner (Schraffur-Band) ───────────────────────────────────
   Schmaler Marken-Trenner zwischen Sektionen. Salbei = neutrale
   Aufklärungs-Lane, zu den Rändern ausgefadet, damit keine harte Kante
   entsteht. Als <hr class="divider-schraffur"> einsetzen. */
.divider-schraffur {
    height: 10px;
    border: 0;
    margin: var(--space-12) 0;
    background-image: repeating-linear-gradient(
        -45deg,
        transparent 0 5px,
        color-mix(in srgb, var(--sage) 32%, transparent) 5px 6px);
    -webkit-mask-image: linear-gradient(to right, transparent, #000 14%, #000 86%, transparent);
    mask-image: linear-gradient(to right, transparent, #000 14%, #000 86%, transparent);
}

.light-mode .divider-schraffur {
    background-image: repeating-linear-gradient(
        -45deg,
        transparent 0 5px,
        color-mix(in srgb, var(--cl-sage-ink) 34%, transparent) 5px 6px);
}

/* ── 5 · Ironie-Marginalie (§6.8 — Register 2 der Hybrid-Voice) ───────────────
   Space Mono, klein, beiläufig, „// "-Präfix (im Markup). Semantisch „Meta" —
   der offizielle Ort für Slavas Augenzwinkern. NIE in Bericht-Fließtext,
   Zahlen, Quellenangaben oder Lane-Labels (dort bleibt „Monospace = Beleg").
   Dosis: 1 Marginalie pro Screen. */
.marginalie {
    display: block;
    font-family: var(--font-mono);
    font-size: 14px;               /* ≥14px, Zielgruppe 60+ (§2 Type-Scale) */
    line-height: 1.5;
    letter-spacing: 0.02em;
    color: var(--color-text-muted);
    margin-top: var(--space-6);
    opacity: 0.9;
}

/* Marginalie, die eine volle Grid-Zeile überspannt (z. B. unter einer Karte
   in einem Karten-Grid — Erklärt-Übersicht). */
.marginalie--span {
    grid-column: 1 / -1;
}

} /* end @layer utilities */

/* ═══ css/pages/home.css ═══ */
/* Unlayered — MUST beat maplibre-gl-CDN Defaults (`.maplibregl-map { position: relative }`).
   Ohne Unlayered würde MapLibre den Container zu 0×0 kollabieren, weil unlayered CSS
   IMMER gegen layered CSS gewinnt (unabhängig von Specificity/Source-Order). */
.hero-map-canvas {
    position: absolute;
    inset: 0;
    z-index: 0;
}

@layer pages {
/* Home Page Specific Styles */

/* ---- Hero Section --------------------------------------------------------- */

.hero-section {
    position: relative;
    background-color: var(--color-bg-primary);
    padding: var(--space-24) 0;
    min-height: 560px;
    display: flex;
    align-items: center;
    color: var(--cream);
    overflow: hidden;
}

/* Left-heavy gradient — text bleibt lesbar, Karte rechts sichtbar.
   Reduziert vs. v1: linke Seite 0.85 statt 0.94, rechte Seite komplett klar. */
.hero-section::before {
    content: '';
    position: absolute;
    inset: 0;
    z-index: 1;
    pointer-events: none;
    background: linear-gradient(
        to right,
        rgba(23, 16, 25, 0.85) 0%,
        rgba(23, 16, 25, 0.62) 35%,
        rgba(23, 16, 25, 0.18) 62%,
        rgba(23, 16, 25, 0.00) 100%
    );
}

/* Bottom accent stripe — sage statt yellow */
.hero-section::after {
    content: '';
    position: absolute;
    bottom: 0;
    left: 0;
    width: 100%;
    height: 3px;
    background: linear-gradient(90deg, var(--sage), var(--olive));
    z-index: 4;
}

.hero-content {
    max-width: 650px;
    position: relative;
    z-index: 2;
}

.hero-kicker.mono {
    font-family: var(--font-mono);
    font-size: 14px;
    color: var(--sage);
    letter-spacing: 0.1em;
    text-transform: uppercase;
    display: inline-block;
    margin-bottom: var(--space-4);
}

.hero-title {
    font-size: var(--font-size-h1);
    color: var(--cream);
    margin-bottom: var(--space-6);
    line-height: 1.05;
    font-weight: 700;
    letter-spacing: -0.02em;
}

.hero-lead {
    font-size: 20px;
    line-height: 1.5;
    color: rgba(236, 227, 204, 0.88);
    margin-bottom: var(--space-8);
}

.hero-buttons {
    display: flex;
    flex-direction: column;
    gap: var(--space-4);
    align-items: flex-start;
}

.hero-buttons-primary {
    display: flex;
    flex-wrap: wrap;
    gap: var(--space-4);
    align-items: center;
}

/* "Gießen erkunden →" — eigene Zeile unter den Haupt-CTAs.
   Dezenter Mono-Stil, sage-Glow, signalisiert: externes Projekt. */
.btn-map-cta {
    display: inline-flex;
    flex-direction: column;
    align-items: flex-start;
    gap: 2px;
    padding: var(--space-2) var(--space-4);
    font-size: 13px;
    font-weight: 600;
    letter-spacing: 0.05em;
    color: var(--sage);
    border: 1px dashed rgba(142, 154, 108, 0.45);
    background: rgba(142, 154, 108, 0.04);
    text-decoration: none;
    transition: background var(--transition-fast), border-color var(--transition-fast), color var(--transition-fast);
    font-family: var(--font-mono);
    text-transform: uppercase;
}

.btn-map-cta:hover,
.btn-map-cta:focus-visible {
    background: rgba(142, 154, 108, 0.15);
    border-color: var(--sage);
    border-style: solid;
    color: var(--cream);
}

.btn-map-cta__hint {
    font-size: 10px;
    letter-spacing: 0.1em;
    color: var(--color-text-muted);
    text-transform: lowercase;
}

/* Dezenter Mono-Textlink unter dem Karten-CTA — der Wissenswertes-Einstieg
   geht nicht verloren (bleibt zusätzlich über die Strang-Karten erreichbar). */
.btn-map-cta__secondary {
    display: inline-block;
    font-family: var(--font-mono);
    font-size: 12px;
    letter-spacing: 0.06em;
    color: rgba(236, 227, 204, 0.62);
    text-decoration: none;
    border-bottom: 1px dashed rgba(142, 154, 108, 0.4);
    padding-bottom: 1px;
    transition: color var(--transition-fast), border-color var(--transition-fast);
}
.btn-map-cta__secondary:hover,
.btn-map-cta__secondary:focus-visible {
    color: var(--sage);
    border-color: var(--sage);
}
.light-mode .btn-map-cta__secondary { color: #4A4458; }
.light-mode .btn-map-cta__secondary:hover,
.light-mode .btn-map-cta__secondary:focus-visible { color: var(--cl-sage-ink); border-color: var(--cl-sage-ink); }

/* Diskretes Map-Label rechts unten — signalisiert "da ist eine Karte" */
.hero-map-hint {
    position: absolute;
    bottom: var(--space-4);
    right: var(--space-6);
    z-index: 3;
    color: rgba(236, 227, 204, 0.55);
    font-family: var(--font-mono);
    font-size: 11px;
    letter-spacing: 0.1em;
    text-transform: uppercase;
    pointer-events: none;
}

@media (max-width: 768px) {
    .hero-map-hint { display: none; }
}

/* ── Light-Mode Hero (v2 · HOME-01/D1-09) ──────────────────────────────────
   Creme-Grund links (Text wieder lesbar), Karte rechts. Overlay + Textfarben
   auf helle Basis / Aubergine-Text; Map-Chrome (hint, POI-Labels) bleibt hell
   auf der Karte. Ersetzt die hartcodierten rgba(23,16,25,…)-Dark-Overlays. */
.light-mode .hero-section { color: var(--aubergine); }

/* Weicher, markenkonformer Übergang zur Karte: die Creme-Fläche läuft in einer
   sanften Rampe aus und behält rechts einen dünnen Rest-Schleier (12 %), statt
   hart auf die dunkle Karten-Fläche zu treffen (Ä-Fix: „harter Dunkel-Verlauf
   rechts"). Text links bleibt bei 0,86–0,95 voll lesbar. */
.light-mode .hero-section::before {
    background: linear-gradient(
        to right,
        rgba(241, 232, 206, 0.95) 0%,
        rgba(241, 232, 206, 0.86) 28%,
        rgba(241, 232, 206, 0.58) 50%,
        rgba(241, 232, 206, 0.28) 72%,
        rgba(241, 232, 206, 0.12) 100%
    );
}

.light-mode .hero-kicker.mono { color: var(--cl-sage-ink); }
.light-mode .hero-lead { color: #3A3247; }

.light-mode .btn-map-cta {
    color: var(--cl-sage-ink);
    border-color: rgba(90, 101, 64, 0.45);
    background: rgba(90, 101, 64, 0.05);
}
.light-mode .btn-map-cta:hover,
.light-mode .btn-map-cta:focus-visible {
    color: var(--aubergine);
    border-color: var(--cl-sage-ink);
    background: rgba(90, 101, 64, 0.12);
}

/* ---- POI Markers (MapLibre custom elements in hero) ----------------------- */

.poi {
    --poi: #1BBE6F;
    position: relative;
    width: 0;
    height: 0;
    transition: opacity var(--cl-motion-slow) var(--cl-ease-out);
}

/* !important nötig — MapLibre setzt inline opacity:1 auf Marker-Element */
.poi:not(.is-on) { opacity: 0 !important; }
.poi.is-on        { opacity: 1 !important; }

/* Direct-child only: halo/pulse/ring/dot/label sit absolutely on marker center,
   but the label's own children (.poi-name / .poi-sub) keep their flex flow.
   (Original `.poi span` greedy selector collapsed labels to 0×0 → text rendered on top of dot.) */
.poi > span {
    position: absolute;
    left: 0;
    top: 0;
    transform: translate(-50%, -50%);
}

.poi { --poi-offset: 14px; }
.poi-halo  { width: 28px; height: 28px; border-radius: 50%; background: var(--poi); opacity: 0.10; }
.poi-pulse { width: 18px; height: 18px; border-radius: 50%; border: 1.4px solid var(--poi); opacity: 0.5; animation: poipulse 2.6s ease-out infinite; }
.poi-ring  { width: 13px; height: 13px; border-radius: 50%; border: 2px solid var(--poi); box-shadow: 0 0 6px var(--poi); }
.poi-dot   { width: 6px;  height: 6px;  border-radius: 50%; background: var(--poi); }

/* Label NEBEN/UNTER den Punkt versetzt (nie drüber). Schärfe-Fix: translate3d +
   backface-visibility promoten das Label auf eine eigene GPU-Ebene → MapLibre rundet
   die Marker-Pixelposition, das Label snappt sauber statt auf Halb-Pixeln zu verwaschen. */
.poi-label {
    display: flex;
    flex-direction: column;
    line-height: 1.2;
    white-space: nowrap;
    pointer-events: none;
    backface-visibility: hidden;
    -webkit-font-smoothing: antialiased;
}
.poi-label--left   { transform: translate3d(var(--poi-offset), -50%, 0); align-items: flex-start; text-align: left; }
.poi-label--right  { transform: translate3d(calc(-100% - var(--poi-offset)), -50%, 0); align-items: flex-end; text-align: right; }
.poi-label--top    { transform: translate3d(-50%, calc(-100% - var(--poi-offset)), 0); align-items: center; text-align: center; }
.poi-label--bottom { transform: translate3d(-50%, var(--poi-offset), 0); align-items: center; text-align: center; }

/* Slava-Wunsch 2026-06-22: einheitlich creme Labels — Kategorie-Farbe nur
   noch in den Marker-Elementen (Halo/Pulse/Ring/Dot), nicht im Text.
   2026-07-05: Name auf 13px Space Mono (war 12px Archivo → unscharf) + mehrschichtiger
   Ink-Halo für Kontrast/Schärfe gegen die dunkle Karte. */
.poi-name {
    font-family: var(--font-mono);
    font-weight: 700;
    font-size: 13px;
    letter-spacing: 0.01em;
    color: var(--cream);
    text-shadow:
        0 0 2px var(--ink),
        0 0 3px var(--ink),
        0 1px 2px var(--ink),
        1px 0 2px var(--ink),
        -1px 0 2px var(--ink),
        0 -1px 2px var(--ink);
}
/* Sub-Zeile default AUS (Deko-Hero soll nur den Namen lesbar zeigen). Kontexte
   blenden sie gezielt ein: Hero bei :hover, Vollbild-Karte ab Zoom ≥ 15 (karte.css). */
.poi-sub {
    display: none;
    font-size: 11px;
    font-family: var(--font-mono);
    color: rgba(236, 227, 204, 0.72);
    text-shadow: 0 0 2px var(--ink), 0 1px 2px var(--ink), 0 0 3px var(--ink);
}

/* Hero (aria-hidden Deko): Sub nur bei Hover auf den Marker — sonst überladen. */
.hero-map-canvas .poi:hover .poi-sub { display: block; }

@keyframes poipulse {
    0%         { transform: translate(-50%, -50%) scale(0.55); opacity: 0.55; }
    80%, 100%  { transform: translate(-50%, -50%) scale(1.55); opacity: 0; }
}

/* MapLibre attribution (minimal styling) */
.maplibregl-ctrl-attrib {
    background: rgba(10, 8, 20, 0.55) !important;
    font-size: 9px !important;
}

/* ---- Statischer Hero (hero-static/blueprint) 2026-07-04 ENTFERNT ----
   Toter Code: die Live-Home nutzt .hero-section + MapLibre-Karte (home.js),
   nicht .hero-static. Kein JS/Markup referenzierte hero-static/.blueprint-img/
   .btn-mono-outline (grep-verifiziert). ~215 Zeilen entfernt. */


/* ---- Strang-Einstiegskarten (unter Hero, kein Menü) ----------------------- */

.strang-einstiegskarten {
    padding: var(--space-12) 0 var(--space-16);
    background: var(--ink);
}

.strang-grid-kicker {
    font-family: var(--font-mono);
    font-size: 12px;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: var(--color-text-muted);
    margin-bottom: var(--space-6);
}

.strang-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
    gap: var(--space-4);
}

.strang-card {
    padding: var(--space-6);
    background: var(--surface);
    text-decoration: none;
    display: block;
    position: relative;
    overflow: hidden;               /* clippt die Marken-Textur-Ecke */
    --card-textur: var(--sage);     /* neutrale Aufklärungs-Lane als Default */
    transition: transform var(--transition-fast), background var(--transition-fast);
    color: var(--cream);

    /* Stagger-Entry: jede Karte 90ms später, sanftes Über-Schwingen via cubic-bezier.
       Dauer = Motion-Token --cl-motion-slow (DESIGN §2, keine Freihand-Dauern). */
    animation: strang-card-in var(--cl-motion-slow) cubic-bezier(0.16, 1, 0.3, 1) backwards;
    animation-delay: calc(var(--i, 0) * 90ms + 180ms);
}

/* Marken-Textur: dezente Schraffur-Ecke oben rechts (§4-Bildsprache, 3-Farben-treu,
   subtil). Salbei für die Bericht-Stränge, Terrakotta für die Meinungs-Karte —
   die Textur trägt die Lane-Farbe, ohne laut zu werden. */
.strang-card::after {
    content: "";
    position: absolute;
    top: 0;
    right: 0;
    width: 84px;
    height: 84px;
    pointer-events: none;
    background-image: repeating-linear-gradient(
        45deg,
        transparent 0 4px,
        color-mix(in srgb, var(--card-textur) 24%, transparent) 4px 5px);
    -webkit-mask-image: linear-gradient(225deg, #000 0%, transparent 62%);
    mask-image: linear-gradient(225deg, #000 0%, transparent 62%);
    opacity: 0.55;
    transition: opacity var(--transition-fast);
}

.strang-card[data-lane="meinung"] {
    --card-textur: var(--terracotta);
}

.strang-card:hover::after {
    opacity: 0.85;
}

.light-mode .strang-card { --card-textur: var(--cl-sage-ink); }
.light-mode .strang-card[data-lane="meinung"] { --card-textur: var(--cl-terracotta-ink); }

@keyframes strang-card-in {
    from {
        opacity: 0;
        transform: translateY(28px) scale(0.96);
    }
    to {
        opacity: 1;
        transform: translateY(0) scale(1);
    }
}

@media (prefers-reduced-motion: reduce) {
    .strang-card {
        animation: none;
    }
}

.strang-card:hover {
    transform: translateY(-2px);
    background: #2A2238;
}

.strang-card h3 {
    color: var(--cream);
    margin-top: var(--space-2);
    margin-bottom: var(--space-3);
    font-size: 22px;
}

.strang-card p {
    color: var(--cream);
    opacity: 0.8;
    font-size: 15px;
    line-height: 1.5;
    margin-bottom: 0;
}

/* Strang D: data-lane="meinung" liefert Terrakotta-Rahmen via lanes.css.
   Hier nur Layout-Anpassung, keine Farb-Overrides. */
.strang-card--meinung {
    background: rgba(198, 107, 69, 0.04);
}


.dot-signal {
    display: inline-block;
    width: 8px;
    height: 8px;
    background: var(--signal);
    border-radius: 50%;
    margin-left: 6px;
    vertical-align: middle;
    animation: signal-pulse 2.4s ease-in-out infinite;
}

@keyframes signal-pulse {
    0%, 100% { opacity: 1; transform: scale(1); }
    50%      { opacity: 0.55; transform: scale(0.85); }
}

/* ---- Home Sections -------------------------------------------------------- */

.home-section {
    padding: var(--space-16) 0;
}

.home-section-alt {
    padding: var(--space-16) 0;
    background-color: var(--color-bg-secondary);
}

.section-header-block {
    text-align: center;
    max-width: 700px;
    margin: 0 auto var(--space-12) auto;
}

.section-header-block .section-title::after {
    left: 50%;
    margin-left: -30px;
}

/* ---- Responsiveness ------------------------------------------------------- */

@media (max-width: 992px) {
    .hero-section::before {
        background: linear-gradient(
            to bottom,
            rgba(14, 10, 20, 0.90) 0%,
            rgba(14, 10, 20, 0.75) 60%,
            rgba(14, 10, 20, 0.55) 100%
        );
    }
    .light-mode .hero-section::before {
        background: linear-gradient(
            to bottom,
            rgba(241, 232, 206, 0.95) 0%,
            rgba(241, 232, 206, 0.82) 60%,
            rgba(241, 232, 206, 0.60) 100%
        );
    }
}

@media (max-width: 576px) {
    .hero-section {
        padding: var(--space-12) 0;
        min-height: auto;
    }

    .hero-title {
        font-size: var(--font-size-h1-mobile);
    }

    .btn-map-cta {
        width: 100%;
        justify-content: center;
    }
}

/* ---- Strang-Drawer (Homepage interactive dropdowns) ----------------------- */

.strang-drawer {
    max-height: 0;
    overflow: hidden;
    opacity: 0;
    transition: max-height var(--transition-slow), opacity var(--transition-slow), margin-top var(--transition-slow), padding var(--transition-slow);
    padding: 0;
    margin-top: 0;
    background: var(--surface);
    border-radius: 2px;
    position: relative;
    z-index: 10;
    scroll-margin-top: 100px; /* Offset for sticky nav + gap */
}

.strang-drawer.open {
    max-height: 4000px; /* High enough to contain all lists */
    opacity: 1;
    margin-top: var(--space-6);
    padding: var(--space-6) var(--space-4);
    border: 1px solid var(--aubergine);
    overflow: visible;
}

.strang-drawer .home-section {
    padding: 0;
    background: transparent;
}

.strang-drawer .page-head {
    display: none; /* Hide duplicate page headers inside drawer */
}

.strang-drawer .mandate-strip-wrapper {
    display: none; /* Hide duplicate mandate strip inside drawer */
}

/* Active states for card indicators.
   v2 · MS-01: Meinung-Karten ausgenommen — sonst überschreibt diese Page-Layer-
   Reserve (transparent) den Terrakotta-Rahmen aus lanes.css (components-Layer).
   So bleibt der 3-seitige Rahmen der Meinungs-Lane sichtbar. */
.strang-card:not([data-lane="meinung"]) {
    border-bottom: 2px solid transparent;
    border-right: 2px solid transparent;
    border-top: 2px solid transparent;
}

.strang-card[data-lane="neutral"].active {
    background: rgba(142, 154, 108, 0.08);
    box-shadow: 0 0 12px rgba(142, 154, 108, 0.35);
    border-top-color: var(--sage);
    border-right-color: var(--sage);
    border-bottom-color: var(--sage);
}

.strang-card[data-lane="meinung"].active {
    background: rgba(198, 107, 69, 0.12);
    box-shadow: 0 0 12px rgba(198, 107, 69, 0.35);
    border-color: var(--terracotta);
}

.light-mode .strang-drawer.open {
    background: var(--surface);
    border-color: rgba(87, 74, 124, 0.25);
}

.light-mode .strang-card[data-lane="neutral"].active {
    background: rgba(142, 154, 108, 0.12);
    box-shadow: 0 0 12px rgba(142, 154, 108, 0.2);
}

.light-mode .strang-card[data-lane="meinung"].active {
    background: rgba(198, 107, 69, 0.15);
    box-shadow: 0 0 12px rgba(198, 107, 69, 0.2);
}
} /* end @layer pages */

/* ═══ css/pages/karte.css ═══ */
/* ── /karte · Interaktive Vollbild-Stadtkarte ───────────────────────────────
   Volle Viewport-Höhe minus Header. Kompakter Seitenkopf oben, Karte füllt den
   Rest (flex:1). POI-Marker-Styles (.poi/.poi-name/.poi-sub) kommen aus
   css/pages/home.css — hier nur Karten-Layout, Zoom-abhängige Sub-Zeilen,
   Popup-Chrome und der Seitenkopf. */

/* Unlayered — MUST beat maplibre-gl-CDN-Defaults (analog .hero-map-canvas). */
.karte-map {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
}

@layer pages {

.karte-page {
    display: flex;
    flex-direction: column;
    height: calc(100vh - var(--nav-height));
    height: calc(100svh - var(--nav-height));
    background-color: var(--color-bg-primary);
    color: var(--cream);
    overflow: hidden;
}

.karte-head-wrap {
    padding-top: var(--space-6);
    padding-bottom: var(--space-4);
    flex: 0 0 auto;
}

.karte-back {
    display: inline-block;
    font-family: var(--font-mono);
    font-size: 12px;
    letter-spacing: 0.06em;
    color: rgba(236, 227, 204, 0.66);
    text-decoration: none;
    margin-bottom: var(--space-3);
    transition: color var(--transition-fast);
}
.karte-back:hover,
.karte-back:focus-visible { color: var(--sage); }

.karte-head { margin-bottom: 0; }

.karte-marginalie {
    font-family: var(--font-mono);
    font-size: 12px;
    letter-spacing: 0.04em;
    color: rgba(142, 154, 108, 0.85);
    margin: var(--space-2) 0 0;
}

/* Karten-Fläche füllt den Rest der Viewport-Höhe. */
.karte-map-shell {
    position: relative;
    flex: 1 1 auto;
    min-height: 0;
    border-top: 1px solid var(--color-border-subtle);
}

.karte-hint {
    position: absolute;
    left: 50%;
    bottom: var(--space-3);
    transform: translateX(-50%);
    z-index: 2;
    padding: 5px 12px;
    background: rgba(23, 16, 25, 0.72);
    border: 1px solid rgba(142, 154, 108, 0.35);
    color: rgba(236, 227, 204, 0.72);
    font-family: var(--font-mono);
    font-size: 11px;
    letter-spacing: 0.03em;
    white-space: nowrap;
    pointer-events: none;
}

.karte-error {
    position: absolute;
    inset: 0;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: var(--space-8);
    text-align: center;
    color: var(--cream);
}

/* POI-Sub-Zeilen: default aus (siehe home.css), auf der Karte erst ab Zoom ≥ 15
   (JS toggelt .is-zoomed am #karte-map-Container). */
.karte-map.is-zoomed .poi-sub { display: block; }

/* Interaktive Marker: Klick-Affordance. */
.karte-map .poi--interactive { cursor: pointer; }
.karte-map .poi--interactive:focus-visible {
    outline: 2px solid var(--sage);
    outline-offset: 4px;
    border-radius: 2px;
}

/* ── Popup (kantig, Mono, markenkonform — überschreibt MapLibre-Default-Weiß) ── */
.karte-popup .maplibregl-popup-content {
    background: var(--ink);
    border: 1px solid var(--poi, #8E9A6C);
    border-radius: 0;
    padding: 0;
    box-shadow: 0 6px 24px rgba(0, 0, 0, 0.45);
}
.karte-popup .maplibregl-popup-tip {
    border-top-color: var(--ink);
    border-bottom-color: var(--ink);
}
.karte-popup .maplibregl-popup-close-button {
    color: rgba(236, 227, 204, 0.7);
    font-size: 18px;
    padding: 0 6px;
}
.karte-popup .maplibregl-popup-close-button:hover {
    background: transparent;
    color: var(--cream);
}

.karte-popup__card {
    display: flex;
    flex-direction: column;
    gap: 3px;
    padding: 12px 16px 13px;
    border-left: 3px solid var(--poi, #8E9A6C);
}
.karte-popup__year {
    font-family: var(--font-mono);
    font-size: 11px;
    letter-spacing: 0.12em;
    color: var(--sage);
}
.karte-popup__name {
    font-family: var(--font-primary);
    font-weight: 700;
    font-size: 16px;
    line-height: 1.15;
    color: var(--cream);
}
.karte-popup__sub {
    font-family: var(--font-mono);
    font-size: 12px;
    color: rgba(236, 227, 204, 0.66);
}

/* ── Light-Mode ─────────────────────────────────────────────────────────── */
.light-mode .karte-page { color: var(--aubergine); }
.light-mode .karte-back { color: #4A4458; }
.light-mode .karte-back:hover { color: var(--cl-sage-ink); }
.light-mode .karte-marginalie { color: var(--cl-sage-ink); }
.light-mode .karte-hint {
    background: rgba(241, 232, 206, 0.82);
    border-color: rgba(90, 101, 64, 0.35);
    color: #3A3247;
}

/* ── Mobile ─────────────────────────────────────────────────────────────── */
@media (max-width: 768px) {
    .karte-head-wrap { padding-top: var(--space-4); }
    .karte-head .page-head__title { font-size: 26px; }
    .karte-hint { display: none; }
}

/* A11Y: POI-Puls stilllegen bei reduzierter Bewegung (die Karte selbst ist statisch). */
@media (prefers-reduced-motion: reduce) {
    .poi-pulse { animation: none !important; }
}

} /* end @layer pages */

/* Zeitreise-Ansicht (Default): animierte Karte als Vollflächen-iframe */
.karte-zeitreise-frame {
    display: block; width: 100%; height: 100%; min-height: 70vh;
    border: 0; background: var(--ink);
}
.karte-toggle {
    display: inline-block; margin-top: 6px; font-size: 13px;
    letter-spacing: .08em; color: var(--color-primary);
    border-bottom: 1px dashed currentColor; text-decoration: none;
    min-height: 44px; display: inline-flex; align-items: center;
}
.karte-toggle:hover, .karte-toggle:focus-visible { color: var(--terracotta); }
.light-mode .karte-toggle:hover { color: var(--cl-terracotta-ink, #9C4F2E); }

/* Klickbarkeit: .poi-Wurzel ist 0x0 (nur Kinder sichtbar) — unsichtbare 44px-Hit-Area
   + pointer-events sicherstellen (Hero setzt .poi teils auf none) */
.karte-map .poi--interactive { pointer-events: auto; }
.karte-map .poi--interactive::after {
    content: ""; position: absolute; left: 50%; top: 50%;
    width: 44px; height: 44px; transform: translate(-50%, -50%);
}

/* ═══ css/pages/erklaert.css ═══ */
@layer pages {
/* Erklärt Page (Strang A) Specific Styles */

/* ── Filter Bar and Search ────────────────────────────────────── */
.filter-bar {
    display: flex;
    justify-content: space-between;
    align-items: center;
    gap: var(--space-4);
    margin-bottom: var(--space-8);
    flex-wrap: wrap;
}

.filter-buttons {
    display: flex;
    gap: var(--space-3);
    flex-wrap: wrap;
}

.search-wrapper {
    position: relative;
    min-width: 280px;
    flex-grow: 0;
}

.search-input {
    width: 100%;
    background: var(--input-bg);
    border: 1px solid var(--color-border-subtle);
    color: var(--input-text);
    padding: var(--space-2) var(--space-4) var(--space-2) 36px;
    font-size: 15px;
    font-family: var(--font-primary);
    border-radius: 0px; /* Kantig */
    transition: var(--transition-fast);
}

.search-input::placeholder {
    color: var(--color-text-muted);
    opacity: 0.7;
}

.search-input:focus {
    outline: none;
    border-color: var(--color-border-focus);
    box-shadow: 0 0 0 1px var(--color-border-focus);
}

.search-icon {
    position: absolute;
    left: 12px;
    top: 50%;
    transform: translateY(-50%);
    color: var(--color-text-muted);
    pointer-events: none;
    width: 16px;
    height: 16px;
}

@media (max-width: 768px) {
    .search-wrapper {
        width: 100%;
        min-width: 100%;
    }
}

.filter-btn {
    font-family: var(--font-mono);
    font-size: var(--font-size-small);
    text-transform: uppercase;
    background: transparent;
    border: 1px solid var(--color-border-subtle);
    color: var(--color-text-muted);
    padding: var(--space-2) var(--space-4);
    min-height: 44px;               /* v2 · DS-11: Hit-Target ≥ 44px */
    display: inline-flex;
    align-items: center;
    cursor: pointer;
    transition: var(--transition-fast);
}

.filter-btn:hover {
    border-color: var(--color-text-primary);
    color: var(--color-text-primary);
}

.filter-btn.active {
    background: var(--color-border-subtle);
    border-color: var(--color-text-primary);
    color: var(--color-text-primary);
}

/* v2 · ERKL-05: Ebene = Outline-Farbe (Stadt = Violett, Landkreis = Olive),
   Text bleibt neutral (Creme im Dark / Aubergine im Light) — DESIGN §2 Ä6. */
.filter-btn.active[data-filter="stadt"] {
    background: rgba(87, 74, 124, 0.12);
    border-color: var(--aubergine);
    color: var(--color-text-primary);
}

.filter-btn.active[data-filter="landkreis"] {
    background: rgba(110, 122, 78, 0.12);
    border-color: var(--olive);
    color: var(--color-text-primary);
}

/* ── Category Groups ──────────────────────────────────────────── */
.category-group {
    margin-bottom: var(--space-12);
}

.category-header {
    margin-bottom: var(--space-6);
    position: relative;
    padding-bottom: var(--space-2);
}

.category-title {
    font-family: var(--font-primary);
    font-size: var(--font-size-h3);
    font-weight: 700;
    color: var(--color-text-primary);
    letter-spacing: -0.01em;
}

.category-rule {
    height: 1px;
    background: linear-gradient(to right, var(--color-border-subtle) 30%, transparent 100%);
    margin-top: var(--space-2);
}

/* ── Strang List & Cards ───────────────────────────────────────── */
.strang-liste {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(350px, 1fr));
    gap: var(--space-4);
}

.strang-tile {
    display: flex;
    flex-direction: column;
    padding: var(--space-6);
    background: var(--color-bg-card);
    border: 1px solid var(--color-border-subtle);
    transition: var(--transition-normal);
    position: relative;
    height: 100%;
    scroll-margin-top: 100px; /* Offset for sticky nav + gap */
}

.strang-tile:hover {
    transform: translateY(-2px);
    border-color: var(--color-text-link);
    box-shadow: var(--shadow-md);
}

.strang-tile-header {
    display: flex;
    justify-content: space-between;
    align-items: flex-start;
    margin-bottom: var(--space-3);
    gap: var(--space-2);
}

.strang-tile h3 {
    font-size: var(--font-size-h3);
    font-weight: 500;
    margin-top: 0;
    margin-bottom: var(--space-3);
    line-height: var(--lh-h2);
}

.strang-tile h3 a {
    color: var(--color-text-primary);
    text-decoration: none;
    transition: var(--transition-fast);
}

.strang-tile h3 a:hover {
    color: var(--color-text-link-hover);
}

.strang-tile-teaser {
    color: var(--color-text-muted);
    font-size: 15px;
    line-height: 1.5;
    margin-bottom: var(--space-6);
    flex-grow: 1;
}

.strang-tile-meta {
    display: flex;
    justify-content: space-between;
    align-items: center;
    border-top: 1px solid rgba(87, 74, 124, 0.15);
    padding-top: var(--space-3);
    margin-top: auto;
    font-size: var(--font-size-tiny);
}

/* ── Badges ───────────────────────────────────────────────────── */
.badge-level {
    font-family: var(--font-mono);
    font-size: 10px;
    font-weight: bold;
    letter-spacing: 0.05em;
    padding: var(--space-1) var(--space-2);
    text-transform: uppercase;
    border-radius: 0px; /* Kantig */
    white-space: nowrap;
}

.badge-level--stadt {
    background: rgba(87, 74, 124, 0.12);
    border: 1px solid var(--aubergine);
    color: var(--color-text-primary);
}

.badge-level--landkreis {
    background: rgba(110, 122, 78, 0.12);
    border: 1px solid var(--olive);
    color: var(--color-text-primary);
}

.badge-level--kooperation {
    background: rgba(224, 169, 59, 0.1);
    border: 1px solid var(--signal);
    color: var(--signal);
}

/* Inline Badges in stueck.js */
.badge-stadt-inline,
.badge-landkreis-inline {
    display: inline-block;
    padding: 2px 6px;
    font-size: 13px;
    font-family: var(--font-mono);
    font-weight: bold;
    border-radius: 0px;
    text-transform: uppercase;
}

.badge-stadt-inline {
    background: rgba(87, 74, 124, 0.15);
    color: var(--color-text-primary);
    border: 1px solid var(--aubergine);
}

.badge-landkreis-inline {
    background: rgba(110, 122, 78, 0.15);
    color: var(--color-text-primary);
    border: 1px solid var(--olive);
}

/* ── Responsiveness ───────────────────────────────────────────── */
@media (max-width: 768px) {
    .strang-liste {
        grid-template-columns: 1fr;
    }
}

/* ── Overview-Card: Diagramm + Rollen im expanded Panel ─────────── */
/* Ersetzt die alte pin-story (sticky scroll-timeline), ist visuell mit den
   anderen .strang-tile-Cards kohärent und im collapsed State kompakt. */
.strang-tile--overview .overview-grid {
    display: grid;
    grid-template-columns: minmax(240px, 340px) 1fr;
    gap: var(--space-6, 24px);
    align-items: start;
    margin-top: var(--space-4, 16px);
}

.strang-tile--overview .overview-diagram {
    width: 100%;
    height: auto;
    max-height: 460px;
    display: block;
    border: 1px solid var(--cl-border, #3A2E47);
    border-radius: 0;
    padding: var(--space-2, 8px);
    background: var(--cl-surface, #221A2B);
}

.strang-tile--overview .overview-roles {
    display: flex;
    flex-direction: column;
    gap: var(--space-3, 12px);
}

.strang-tile--overview .role-block {
    padding: var(--space-3, 12px) var(--space-4, 16px);
    border-left: 2px solid var(--cl-sage, #8E9A6C);
    background: rgba(142, 154, 108, 0.04);
}

.strang-tile--overview .role-block h4 {
    margin: 0 0 var(--space-1, 4px) 0;
    font-family: var(--cl-font-mono, 'Space Mono', monospace);
    font-size: 12px;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: var(--cl-cream, #ECE3CC);
}

.strang-tile--overview .role-block p {
    margin: 0;
    font-size: 14px;
    line-height: 1.5;
    color: var(--cl-text-muted, #B6ABC4);
}

/* Mobile: single column */
@media (max-width: 720px) {
    .strang-tile--overview .overview-grid {
        grid-template-columns: 1fr;
    }
    .strang-tile--overview .overview-diagram {
        max-height: 360px;
    }
}

/* TODO cleanup after 2026-07-08 confirmation:
   The pin-story CSS lives in css/animations/02-sticky-section-pin.css, not in this file.
   If Slava confirms the new overview-card works, that file can be deleted from the
   Precache-Liste in sw.js + physically removed. Left in place for safe rollback. */

/* ─── Card-Affordance-Signals (2026-07-01) ────────────────────────────
   Zwei Click-Bereiche pro strang-tile:
   1. h3 a.tile-link-external → navigiert zur Detail-Seite (Sage-Underline + ↗)
   2. .strang-tile-expand-bar → togglet Panel (Chevron ▾/▴)
   Klarer Kontrast via Farbe (Sage=Navigate, Chevron-Bar=Toggle) + Position
   (oben=Nav, unten=Toggle). Design-System: Sage=Aufklärung, Signal=Funke. */

.strang-tile h3 a.tile-link-external {
    text-decoration: underline;
    text-decoration-color: var(--cl-sage, #8E9A6C);
    text-decoration-thickness: 1px;
    text-underline-offset: 4px;
    transition: text-decoration-thickness var(--cl-motion-fast) var(--cl-ease-out), color var(--cl-motion-fast) var(--cl-ease-out);
    display: inline-flex;
    align-items: baseline;
    gap: 0.35em;
}

.strang-tile h3 a.tile-link-external::after {
    content: "↗";
    display: inline-block;
    font-size: 0.75em;
    color: var(--cl-sage, #8E9A6C);
    transition: transform var(--cl-motion-fast) var(--cl-ease-out), color var(--cl-motion-fast) var(--cl-ease-out);
    transform: translate(0, 0);
}

.strang-tile h3 a.tile-link-external:hover,
.strang-tile h3 a.tile-link-external:focus-visible {
    text-decoration-thickness: 2px;
    color: var(--cl-signal, #E0A93B);
}
.strang-tile h3 a.tile-link-external:hover::after,
.strang-tile h3 a.tile-link-external:focus-visible::after {
    transform: translate(2px, -1px);
    color: var(--cl-signal, #E0A93B);
}

/* Card-body hover: sage-tint hint that everything else = toggle */
.strang-tile {
    transition: border-color var(--cl-motion-fast) var(--cl-ease-out), box-shadow var(--cl-motion-fast) var(--cl-ease-out), transform var(--transition-normal);
}
.strang-tile:hover:not(.expanded) {
    border-color: var(--cl-sage, #8E9A6C);
}

/* Expand-bar as clear button — sage-hover to signal toggle-Action */
.strang-tile-expand-bar {
    transition: background var(--cl-motion-fast) var(--cl-ease-out), color var(--cl-motion-fast) var(--cl-ease-out);
    cursor: pointer;
    user-select: none;
}
.strang-tile-expand-bar:hover {
    background: rgba(142, 154, 108, 0.08);   /* sage @8% */
    color: var(--cl-sage, #8E9A6C);
}
.strang-tile.expanded .strang-tile-expand-bar {
    background: rgba(142, 154, 108, 0.05);
}

/* Overview-Card has NO title-link — no arrow, no underline */
.strang-tile--overview h3 a.tile-link-external {
    display: none;   /* fallback if template ever adds one */
}

} /* end @layer pages */

/* ═══ css/pages/ueber.css ═══ */
@layer pages {
/* Über-mich-Seite */

.ueber-grid {
    display: grid;
    grid-template-columns: 260px 1fr;
    gap: var(--space-12);
    align-items: start;
}

.ueber-portrait {
    position: sticky;
    top: calc(var(--nav-height) + var(--space-12));
}

/* Abstrakter Marken-„Porträt"-Kachel (DESIGN §4): kein Foto-folgt-Loch — die
   Grafik trägt allein. Duoton-Basis (Aubergine→Tiefe, der Lila-Moment der Marke)
   + Schraffur-Linien; die .halftone-Utility legt zusätzlich das Punkt-Raster
   darüber. Ghost-Monogramm „SY" ist eingedruckt, nicht plakativ. */
.portrait-placeholder {
    width: 240px;
    height: 320px;
    position: relative;
    overflow: hidden;
    border: 1px solid var(--aubergine);
    display: flex;
    align-items: center;
    justify-content: center;
    background:
        repeating-linear-gradient(
            45deg,
            transparent 0 4px,
            color-mix(in srgb, var(--ink) 30%, transparent) 4px 5px),
        linear-gradient(155deg, var(--aubergine) 0%, var(--surface) 72%);
}

.portrait-monogram {
    font-family: var(--font-primary);
    font-weight: 900;
    font-size: 104px;
    line-height: 1;
    letter-spacing: -0.05em;
    color: color-mix(in srgb, var(--cream) 15%, transparent);
    mix-blend-mode: overlay;
    user-select: none;
}

.ueber-text h1 {
    color: var(--cream);
    margin-bottom: var(--space-4);
}

.ueber-roles {
    margin-top: var(--space-8);
    border: 1px solid var(--aubergine);
    padding: var(--space-4);
    background: rgba(87, 74, 124, 0.08);
}

.role-row {
    display: grid;
    grid-template-columns: 90px 1fr;
    gap: var(--space-4);
    padding: var(--space-2) 0;
    align-items: center;
    border-bottom: 1px dashed rgba(87, 74, 124, 0.4);
}

.role-row:last-child { border-bottom: 0; }

.role-label {
    font-family: var(--font-mono);
    font-size: 12px;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: var(--sage);
}

.role-value {
    color: var(--cream);
    font-family: var(--font-primary);
}

@media (max-width: 768px) {
    .ueber-grid { grid-template-columns: 1fr; gap: var(--space-6); }
    .ueber-portrait { position: static; }
    .portrait-placeholder { width: 100%; max-width: 240px; margin: 0 auto; }
}

.light-mode .portrait-placeholder { color: var(--aubergine); }
.light-mode .ueber-text h1 { color: var(--aubergine); }
.light-mode .role-value { color: var(--aubergine); }
} /* end @layer pages */

/* ═══ css/pages/stueck.css ═══ */
@layer pages {
/* Single-Stück-Template — Bauplan für A/B/C/D */

.stueck {
    padding: var(--space-12) 0;
    max-width: 760px;
    margin: 0 auto;
}

.stueck .container {
    max-width: 760px;
}

.stueck-meta {
    display: flex;
    flex-wrap: wrap;
    gap: var(--space-3);
    align-items: center;
    margin-bottom: var(--space-6);
}

.stueck-meta .meta-time {
    font-family: var(--font-mono);
    font-size: 12px;
    color: var(--color-text-muted);
    text-transform: uppercase;
    letter-spacing: 0.08em;
    margin-left: auto;
}

.stueck h1 {
    color: var(--cream);
    font-size: 40px;
    line-height: 1.15;
    margin-bottom: var(--space-6);
    letter-spacing: -0.01em;
}

.stueck[data-lane="meinung"] h1 {
    font-style: italic;
}

.hook-slot {
    border-left: 4px solid var(--sage);
    padding: var(--space-3) var(--space-4);
    margin: var(--space-6) 0 var(--space-8);
    font-size: 18px;
    font-style: italic;
    color: var(--cream);
    background: rgba(142, 154, 108, 0.06);
}

[data-lane="meinung"] .hook-slot {
    border-left-color: var(--terracotta);
    background: rgba(198, 107, 69, 0.08);
}

.stueck-content {
    font-size: 17px;
    line-height: 1.65;
    color: var(--cream);
}

.stueck-content p {
    margin-bottom: var(--space-4);
}

.stueck-content p:last-child {
    margin-bottom: 0;
}

/* Andere-sehen-das-so + Offene-Frage (nur Strang D) */

.andere-sehen-das-so,
.offene-frage {
    margin-top: var(--space-8);
    padding: var(--space-4);
    border-left: 3px solid var(--aubergine);
    background: rgba(87, 74, 124, 0.08);
}

.andere-sehen-das-so h3,
.offene-frage h3 {
    color: var(--sage);
    font-size: 15px;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    margin-bottom: var(--space-3);
    font-family: var(--font-mono);
    font-weight: 400;
}

.andere-sehen-das-so ul {
    padding-left: 0;
    list-style: none;
}

.andere-sehen-das-so li {
    padding: var(--space-2) 0;
    color: var(--cream);
    border-bottom: 1px dashed rgba(87, 74, 124, 0.4);
}

.andere-sehen-das-so li:last-child { border-bottom: 0; }

.offene-frage p { color: var(--cream); margin-bottom: 0; }

/* Strang-Listen (verwendet von erklaert.js, meinung.js, themen.js) */

.strang-liste {
    display: grid;
    grid-template-columns: 1fr;
    gap: var(--space-6);
}

.strang-tile {
    padding: var(--space-6);
    background: var(--surface);
    transition: transform var(--transition-fast);
}

.strang-tile:hover {
    transform: translateY(-2px);
}

/* v2 · MS-01: Meinung-Rahmen im pages-Layer re-assertieren, damit er den
   generischen `.strang-tile { border: 1px }` aus erklaert.css (gleicher Layer,
   niedrigere Spezifität) schlägt — sonst ginge der Terrakotta-Rahmen der
   /meinung-Karten verloren. Werte = lanes.css (flippende Lane-Tokens). */
.strang-tile[data-lane="meinung"] {
    border: 2px solid var(--cl-lane-meinung);
    border-top: 5px solid var(--cl-lane-meinung);
    background: var(--cl-meinung-bg);
}

.strang-tile h3 {
    margin: var(--space-2) 0 var(--space-3);
}

.strang-tile h3 a {
    color: var(--cream);
    text-decoration: none;
}

.strang-tile h3 a:hover {
    color: var(--signal);
}

.strang-tile-teaser {
    color: var(--cream);
    opacity: 0.85;
    margin-bottom: var(--space-4);
    font-size: 16px;
    line-height: 1.5;
}

.strang-tile-meta {
    display: flex;
    flex-wrap: wrap;
    gap: var(--space-3);
    align-items: center;
}

.strang-tile-meta .meta-time {
    font-family: var(--font-mono);
    font-size: 12px;
    color: var(--color-text-muted);
}

/* Mobile */

@media (max-width: 768px) {
    .stueck-meta .meta-time { margin-left: 0; }
    .stueck h1 { font-size: 28px; }
    .stueck-content { font-size: 16px; }
}

/* Light-Mode */

.light-mode .stueck h1 { color: var(--aubergine); }
.light-mode .stueck-content { color: var(--aubergine); }
.light-mode .hook-slot { color: var(--aubergine); }
.light-mode .strang-tile h3 a { color: var(--aubergine); }
.light-mode .strang-tile-teaser { color: #2D2734; }
/* :not(meinung) — Meinung-Karten behalten ihren warmen --cl-meinung-bg (MS-01) */
.light-mode .strang-tile:not([data-lane="meinung"]) { background: var(--surface); }

/* ── Meinungs-Stück (Strang D, W4a) ─────────────────────────────── */
/* Terrakotta-Lane-Rahmen ums ganze Stück + Newsreader-Italic-Titel. */
.stueck[data-lane="meinung"] {
    border-left: 4px solid var(--cl-lane-meinung);
    padding-left: var(--space-6);
}

.stueck[data-lane="meinung"] h1 {
    font-family: var(--cl-font-serif);
    font-style: italic;
}

.stueck-byline {
    font-family: var(--font-mono);
    font-size: 13px;
    color: var(--color-text-muted);
    margin-bottom: var(--space-6);
    letter-spacing: 0.03em;
}

.stueck-byline strong {
    color: var(--terracotta);
    font-weight: 700;
}

/* Beleg-Marker im Meinungs-Fließtext (sup.beleg) — dezent, terrakotta. */
.stueck-content sup.beleg {
    color: var(--terracotta);
    font-family: var(--font-mono);
    font-size: 0.7em;
    font-weight: 700;
    padding: 0 1px;
    vertical-align: super;
}

@media (max-width: 768px) {
    .stueck[data-lane="meinung"] { padding-left: var(--space-4); }
}
} /* end @layer pages */

/* ═══ css/pages/anleitungen.css ═══ */
@layer pages {
/* Strang E · Anleitungen — Listenseite + Schritt-für-Schritt-Template */

/* ── Listen-Übersicht ───────────────────────────────────────────── */

.anleitungen-intro {
    border-left: 5px solid var(--sage);
    padding: var(--space-4) var(--space-6);
    background: rgba(142, 154, 108, 0.06);
    margin-bottom: var(--space-8);
}

.anleitungen-intro h2 {
    color: var(--cream);
    margin-bottom: var(--space-3);
}

.anleitungen-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
    gap: var(--space-4);
}

.anleitung-tile {
    padding: var(--space-6);
    background: var(--surface);
    border-left: 5px solid var(--sage);
    text-decoration: none;
    display: flex;
    flex-direction: column;
    gap: var(--space-3);
    transition: transform var(--transition-fast), background var(--transition-fast);
    color: var(--cream);
}

.anleitung-tile:hover,
.anleitung-tile:focus-visible {
    transform: translateY(-2px);
    background: #2A2238;
}

.anleitung-tile-label {
    font-family: var(--font-mono);
    font-size: 11px;
    color: var(--sage);
    text-transform: uppercase;
    letter-spacing: 0.08em;
}

.anleitung-tile h3 {
    color: var(--cream);
    font-size: 20px;
    margin: 0;
    line-height: 1.3;
}

.anleitung-tile-teaser {
    color: rgba(236, 227, 204, 0.85);
    font-size: 15px;
    line-height: 1.5;
    margin: 0;
}

.anleitung-tile-meta {
    display: flex;
    flex-wrap: wrap;
    gap: var(--space-3);
    align-items: center;
    margin-top: var(--space-2);
    font-family: var(--font-mono);
    font-size: 12px;
    color: var(--color-text-muted);
}

.anleitung-tile-meta .schritte-count {
    color: var(--sage);
    border: 1px solid var(--sage);
    padding: 1px 6px;
}

/* ── Single-Anleitung: Schritt-für-Schritt-Template ─────────────── */

.anleitung-single {
    max-width: 760px;
    margin: 0 auto;
    padding: var(--space-12) 0;
}

.anleitung-meta {
    display: flex;
    flex-wrap: wrap;
    gap: var(--space-3);
    align-items: center;
    margin-bottom: var(--space-6);
}

.anleitung-meta .meta-time {
    margin-left: auto;
    font-family: var(--font-mono);
    font-size: 12px;
    color: var(--color-text-muted);
    text-transform: uppercase;
    letter-spacing: 0.08em;
}

.anleitung-single h1 {
    color: var(--cream);
    font-size: 40px;
    line-height: 1.15;
    margin-bottom: var(--space-4);
    letter-spacing: -0.01em;
}

/* "Was du brauchst" — Voraussetzungen */
.voraussetzungen {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
    gap: var(--space-3);
    margin: var(--space-6) 0 var(--space-8);
    padding: var(--space-4);
    background: rgba(142, 154, 108, 0.08);
    border-left: 4px solid var(--sage);
}

.voraussetzung {
    display: flex;
    flex-direction: column;
    gap: var(--space-1);
}

.voraussetzung-label {
    font-family: var(--font-mono);
    font-size: 11px;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: var(--sage);
}

.voraussetzung-wert {
    color: var(--cream);
    font-weight: 700;
    font-size: 15px;
}

/* Schritte — nummerierte Liste */
.schritte-liste {
    list-style: none;
    padding: 0;
    margin: var(--space-8) 0;
}

.schritt {
    display: grid;
    grid-template-columns: 56px 1fr;
    gap: var(--space-4);
    padding: var(--space-6) 0;
    border-bottom: 1px solid var(--aubergine);
    position: relative;
}

.schritt:last-child {
    border-bottom: 0;
}

.schritt-nr {
    width: 48px;
    height: 48px;
    border: 2px solid var(--sage);
    display: flex;
    align-items: center;
    justify-content: center;
    font-family: var(--font-mono);
    font-weight: 700;
    font-size: 20px;
    color: var(--sage);
    background: rgba(142, 154, 108, 0.08);
}

.schritt-body h3 {
    color: var(--cream);
    margin: 0 0 var(--space-3) 0;
    font-size: 22px;
    line-height: 1.3;
}

.schritt-body p {
    color: var(--cream);
    line-height: 1.6;
    margin-bottom: var(--space-3);
}

/* Schritt-Detail-Boxen (wo, mit was, kosten) */
.schritt-detail {
    display: grid;
    grid-template-columns: 80px 1fr;
    gap: var(--space-3);
    padding: var(--space-2) 0;
    font-size: 14px;
    border-top: 1px dashed rgba(87, 74, 124, 0.4);
}

.schritt-detail:first-of-type {
    border-top: 0;
    margin-top: var(--space-2);
}

.schritt-detail-label {
    font-family: var(--font-mono);
    font-size: 11px;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: var(--sage);
    padding-top: 2px;
}

.schritt-detail-wert {
    color: var(--cream);
}

.schritt-detail-wert a {
    color: var(--sage);
    text-decoration: underline;
    text-decoration-color: var(--aubergine);
    text-underline-offset: 2px;
}

.schritt-detail-wert a:hover {
    color: var(--signal);
}

/* "Kosten, Bearbeitungszeit, häufige Probleme" Sektionen */
.anleitung-faq {
    margin: var(--space-12) 0;
    padding: var(--space-6);
    background: rgba(87, 74, 124, 0.10);
    border-left: 4px solid var(--aubergine);
}

.anleitung-faq h3 {
    font-family: var(--font-mono);
    font-size: 14px;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: var(--sage);
    margin: 0 0 var(--space-4) 0;
    font-weight: 700;
}

.anleitung-faq dl {
    display: grid;
    grid-template-columns: max-content 1fr;
    gap: var(--space-2) var(--space-4);
    margin: 0;
}

.anleitung-faq dt {
    font-family: var(--font-mono);
    font-size: 12px;
    color: var(--sage);
    text-transform: uppercase;
    letter-spacing: 0.05em;
}

.anleitung-faq dd {
    margin: 0;
    color: var(--cream);
    font-size: 15px;
    line-height: 1.5;
}

/* Häufige Probleme — als Block-Liste */
.haeufige-probleme {
    margin-top: var(--space-6);
}

.haeufige-probleme h4 {
    font-family: var(--font-mono);
    font-size: 12px;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: var(--terracotta);
    margin: 0 0 var(--space-3) 0;
    font-weight: 700;
}

.haeufige-probleme h4::before {
    content: "⚠ ";
}

.haeufige-probleme ul {
    list-style: none;
    padding: 0;
}

.haeufige-probleme li {
    padding: var(--space-2) 0;
    border-bottom: 1px dashed rgba(198, 107, 69, 0.25);
    color: var(--cream);
    font-size: 15px;
    line-height: 1.5;
}

.haeufige-probleme li:last-child {
    border-bottom: 0;
}

.haeufige-probleme li strong {
    color: var(--terracotta);
    font-family: var(--font-mono);
    font-size: 13px;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    display: block;
    margin-bottom: 2px;
}

/* Mobile */
@media (max-width: 768px) {
    .anleitung-single h1 { font-size: 28px; }

    .schritt {
        grid-template-columns: 1fr;
        gap: var(--space-3);
    }

    .schritt-detail {
        grid-template-columns: 1fr;
        gap: var(--space-1);
    }

    .voraussetzungen {
        grid-template-columns: 1fr;
    }

    .anleitung-faq dl {
        grid-template-columns: 1fr;
    }
}

/* Light-Mode */
.light-mode .anleitung-tile { background: var(--surface); color: var(--aubergine); }
.light-mode .anleitung-tile h3 { color: var(--aubergine); }
.light-mode .anleitung-tile-teaser { color: #2D2734; }
.light-mode .anleitung-single h1 { color: var(--aubergine); }
.light-mode .schritt-body h3 { color: var(--aubergine); }
.light-mode .schritt-body p,
.light-mode .voraussetzung-wert,
.light-mode .anleitung-faq dd,
.light-mode .haeufige-probleme li { color: var(--aubergine); }

/* ── Collapsible Documents Checklist ────────────────────────────── */

.unterlagen-details {
    background: rgba(87, 74, 124, 0.06);
    border: 1px solid var(--aubergine);
    border-radius: 2px;
    margin: var(--space-4) 0 var(--space-6) 0;
    padding: var(--space-4);
    transition: background var(--transition-fast);
}

.unterlagen-details:hover {
    background: rgba(87, 74, 124, 0.10);
}

.unterlagen-summary {
    font-family: var(--font-primary);
    font-size: 16px;
    font-weight: 700;
    color: var(--cream);
    cursor: pointer;
    user-select: none;
    outline: none;
    list-style: none; /* Hide default arrow in modern browsers */
}

.unterlagen-summary::-webkit-details-marker {
    display: none; /* Hide default arrow in WebKit */
}

.unterlagen-summary::before {
    content: "▶  ";
    font-size: 12px;
    color: var(--sage);
    display: inline-block;
    transition: transform var(--transition-fast);
}

.unterlagen-details[open] .unterlagen-summary::before {
    transform: rotate(90deg);
}

.unterlagen-list {
    margin: var(--space-4) 0 0 0;
    padding-left: var(--space-6);
    list-style-type: square;
    color: var(--cream);
}

.unterlage-item {
    font-size: 15px;
    line-height: 1.5;
    margin-bottom: var(--space-2);
}

.unterlage-item strong {
    color: var(--sage);
}

/* ── Process Flowchart Diagram (Stepper) ────────────────────────── */

.process-flowchart {
    background: var(--surface);
    border: 1px solid var(--aubergine);
    border-radius: 2px;
    padding: var(--space-4);
    margin: var(--space-6) 0;
}

.process-flowchart-title {
    font-family: var(--font-mono);
    font-size: 12px;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: var(--sage);
    font-weight: 700;
    margin-bottom: var(--space-4);
}

.process-flowchart-steps {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: var(--space-2) var(--space-3);
}

.flow-step {
    display: flex;
    align-items: center;
    gap: var(--space-2);
    background: rgba(142, 154, 108, 0.05);
    border: 1px solid rgba(142, 154, 108, 0.2);
    padding: var(--space-2) var(--space-3);
    border-radius: 2px;
}

.flow-step-num {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 22px;
    height: 22px;
    background: var(--sage);
    color: var(--ink);
    font-family: var(--font-mono);
    font-weight: 700;
    font-size: 12px;
    border-radius: 50%;
}

.flow-step-name {
    font-family: var(--font-primary);
    font-size: 14px;
    font-weight: 500;
    color: var(--cream);
}

.flow-step-connector {
    color: var(--sage);
    font-size: 18px;
    user-select: none;
}

/* Mobile responsive collapsing for the flowchart */
@media (max-width: 768px) {
    .process-flowchart-steps {
        flex-direction: column;
        align-items: stretch;
    }
    
    .flow-step-connector {
        text-align: center;
        transform: rotate(90deg);
        display: block;
        margin: var(--space-1) 0;
    }
}

/* ── Light Mode overrides ───────────────────────────────────────── */

.light-mode .unterlagen-details {
    background: rgba(87, 74, 124, 0.03);
    border-color: rgba(87, 74, 124, 0.2);
}

.light-mode .unterlagen-summary {
    color: var(--aubergine);
}

.light-mode .unterlagen-list {
    color: var(--aubergine);
}

.light-mode .unterlage-item strong {
    color: var(--olive);
}

.light-mode .process-flowchart {
    background: var(--surface);
    border-color: rgba(87, 74, 124, 0.2);
}

.light-mode .flow-step {
    background: rgba(110, 122, 78, 0.05);
    border-color: rgba(110, 122, 78, 0.2);
}

.light-mode .flow-step-name {
    color: var(--aubergine);
}

.light-mode .flow-step-num {
    background: var(--olive);
    color: var(--cream);
}

/* ── Lebenslagen-Gruppen (AUDIT-11, W4a) ────────────────────────── */
.anleitungen-count {
    margin-top: var(--space-3);
    font-family: var(--font-mono);
    font-size: 13px;
    color: var(--sage);
    letter-spacing: 0.04em;
}

.anleitungen-gruppe {
    margin-top: var(--space-10);
}

.anleitungen-gruppe:first-of-type {
    margin-top: var(--space-8);
}

.anleitungen-gruppe-head {
    display: flex;
    align-items: center;
    gap: var(--space-3);
    margin-bottom: var(--space-5);
    padding-bottom: var(--space-2);
    border-bottom: 1px solid var(--aubergine);
}

.anleitungen-gruppe-titel {
    color: var(--cream);
    font-size: 22px;
    margin: 0;
    line-height: 1.2;
}

.anleitungen-gruppe-count {
    font-family: var(--font-mono);
    font-size: 12px;
    color: var(--sage);
    border: 1px solid var(--sage);
    border-radius: 999px;
    padding: 1px 9px;
}

/* ── Anleitung-FAQ (Häufige Fragen, W4a) ────────────────────────── */
.anleitung-faq-liste {
    margin: var(--space-12) 0;
}

.anleitung-faq-liste h3 {
    font-family: var(--font-mono);
    font-size: 14px;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: var(--sage);
    margin: 0 0 var(--space-4) 0;
    font-weight: 700;
}

.anleitung-faq-item {
    border-bottom: 1px solid var(--aubergine);
    padding: var(--space-3) 0;
}

.anleitung-faq-item summary {
    cursor: pointer;
    color: var(--cream);
    font-weight: 700;
    font-size: 16px;
    line-height: 1.4;
    list-style: none;
    display: flex;
    gap: var(--space-2);
}

.anleitung-faq-item summary::-webkit-details-marker { display: none; }

.anleitung-faq-item summary::before {
    content: "+";
    color: var(--sage);
    font-family: var(--font-mono);
    flex: 0 0 auto;
}

.anleitung-faq-item[open] summary::before { content: "–"; }

.anleitung-faq-item p {
    margin: var(--space-3) 0 0 var(--space-5);
    color: var(--cream);
    line-height: 1.6;
    font-size: 15px;
}

.light-mode .anleitungen-gruppe-titel { color: var(--aubergine); }
.light-mode .anleitung-faq-item summary,
.light-mode .anleitung-faq-item p { color: var(--aubergine); }
} /* end @layer pages */

/* ═══ css/pages/wissenswertes.css ═══ */
@layer pages {
/* =============================================================================
   CivicNova — Wissenswertes (Wahlprogramm-Explorer)
   Portiert aus volt-giessen/css/pages/programm.css (2026-06-22).
   Restyled auf CivicNova-Tokens: dark-first, kantig (border-radius 0–6px),
   Sage/Aubergine/Signal/Cream/Terracotta statt Volt-Purple.
   Page-scoped Tokens mit .prog-* Prefix.
   ============================================================================= */

.prog-page {
    /* Tokens — Dark Mode (CivicNova Default) */
    --prog-bg:          var(--ink);              /* #171019 */
    --prog-surface:     var(--surface);          /* #221A2B */
    --prog-surface-2:   #2A2238;
    --prog-border:      rgba(87, 74, 124, 0.35); /* aubergine soft */
    --prog-text:        var(--cream);            /* #ECE3CC */
    --prog-dim:         #B8B0C2;
    --prog-mute:        #8B829A;
    --prog-accent:      var(--sage);             /* #8E9A6C — Aufklärungs-Lane */
    --prog-accent-ink:  #B5C28A;                 /* sage helleres Ink für Dark-Text */
    --prog-accent-soft: rgba(142, 154, 108, 0.14);
    --prog-signal:      var(--signal);           /* #E0A93B */
    --prog-head:        linear-gradient(135deg, #1F1729 0%, #0E0A14 100%);
    --prog-shadow:      0 8px 24px -6px rgba(0, 0, 0, 0.6);
    --prog-card-hover:  0 14px 40px -10px rgba(0, 0, 0, 0.75);

    --prog-container-max: 1200px;
    --prog-container-pad: 28px;

    color: var(--prog-text);
    background: var(--prog-bg);
    font-family: var(--font-primary, 'Archivo', sans-serif);
    -webkit-font-smoothing: antialiased;
    min-height: 60vh;
}

/* Light-Mode = CivicNova Phase-1-Lesemodus (warm, papierruhig)
   Fix 2026-07-01: Selector war `body.light-mode` — Theme-System setzt `.light-mode`
   aber auf <html> (documentElement), nicht auf <body>. Alle anderen Files nutzen
   `.light-mode .X` (matched html.light-mode). Ohne diesen Fix rendered die
   Wissenswertes-SPA-View (wp-topic-tabs + prog-hero + prog-cluster-card + prog-*
   Chips/Inputs) dunkel-on-cream, obwohl User Light-Mode aktiv hat. */
.light-mode .prog-page {
    --prog-bg:          #F1E8CE;
    --prog-surface:     var(--cl-surface);   /* MS-06: Creme-Papier #FBF6E6 statt hartem #FFFFFF */
    --prog-surface-2:   #ECE3CC;
    --prog-border:      rgba(87, 74, 124, 0.22);
    --prog-text:        #2D2734;
    --prog-dim:         #5C5464;
    --prog-mute:        #7A7188;
    --prog-accent:      var(--aubergine);        /* #574A7C */
    --prog-accent-ink:  var(--aubergine);
    --prog-accent-soft: rgba(87, 74, 124, 0.10);
    --prog-head:        linear-gradient(135deg, #574A7C 0%, #3B3257 100%);
    --prog-shadow:      0 4px 20px -2px rgba(87, 74, 124, 0.14);
    --prog-card-hover:  0 10px 30px -5px rgba(87, 74, 124, 0.22);
}

.prog-page * { box-sizing: border-box; }

.prog-container {
    max-width: var(--prog-container-max);
    margin: 0 auto;
    padding: 40px var(--prog-container-pad) 80px;
}

/* ─── Loading / Error ─────────────────────────────────────────────────────── */
.prog-loading {
    min-height: 50vh; display: flex; flex-direction: column;
    align-items: center; justify-content: center; gap: 18px;
    color: var(--prog-dim);
}
.prog-spinner {
    width: 42px; height: 42px; border-radius: 50%;
    border: 3px solid var(--prog-surface-2);
    border-top-color: var(--prog-accent);
    animation: prog-spin .9s linear infinite;
}
@keyframes prog-spin { to { transform: rotate(360deg); } }

.prog-error {
    max-width: 640px; margin: 80px auto; padding: 32px;
    background: var(--prog-surface); border: 1px solid var(--prog-border);
    border-radius: 6px; box-shadow: var(--prog-shadow); text-align: center;
}
.prog-error h2 { margin: 0 0 12px; color: var(--prog-text); font-size: 22px; }
.prog-error p { color: var(--prog-dim); margin: 0 0 8px; }
.prog-error-hint { font-size: 14px; color: var(--prog-mute); }
.prog-error code {
    background: var(--prog-surface-2); padding: 2px 6px; border-radius: 3px;
    font-family: var(--font-mono, 'Space Mono', monospace); font-size: 13px;
}

/* ─── HERO ────────────────────────────────────────────────────────────────── */
.prog-hero {
    position: relative; overflow: hidden;
    background: var(--prog-head); color: var(--cream);
    border-bottom: 1px solid var(--prog-border);
}
.prog-hero-bg {
    position: absolute; inset: 0; opacity: .35; pointer-events: none;
    background: radial-gradient(120% 130% at 85% -10%,
                rgba(224, 169, 59, 0.18) 0%, transparent 45%);
}
.prog-hero-skyline {
    position: absolute; left: 0; right: 0; bottom: 0; height: 74px;
    display: flex; align-items: flex-end; gap: 6px; padding: 0 6%;
    opacity: .14; pointer-events: none;
}
.prog-hero-skyline > div {
    flex: 1; background: var(--cream); border-radius: 0;
}
.prog-hero-inner {
    position: relative; max-width: var(--prog-container-max);
    margin: 0 auto; padding: 74px var(--prog-container-pad) 92px;
}
.prog-hero-eyebrow {
    display: inline-flex; align-items: center; gap: 9px;
    font-family: var(--font-mono, 'Space Mono', monospace);
    font-size: 12.5px; font-weight: 700; letter-spacing: .14em;
    text-transform: uppercase;
    background: rgba(241,232,206,.10);
    border: 1px solid rgba(241,232,206,.18);
    color: var(--cream);
    padding: 7px 14px; border-radius: 0; margin-bottom: 22px;
}
.prog-hero-title {
    margin: 0; font-size: clamp(36px, 5.6vw, 60px); line-height: 1.05;
    font-weight: 700; letter-spacing: -.02em; max-width: 22ch;
    color: var(--cream);
}
.prog-hero-lead {
    margin: 22px 0 0; font-size: clamp(16px, 1.5vw, 19px);
    line-height: 1.6; max-width: 64ch; color: rgba(236, 227, 204, 0.86);
}
.prog-hero-lead strong { color: var(--cream); font-weight: 700; }
.prog-hero-stats {
    display: flex; flex-wrap: wrap; gap: 36px; margin-top: 38px;
}
.prog-hero-stats > div { display: flex; flex-direction: column; gap: 6px; }
.prog-stat-num {
    font-family: var(--font-mono, 'Space Mono', monospace); font-size: 34px;
    font-weight: 700; line-height: 1; color: var(--signal);
}
.prog-stat-label {
    font-size: 11.5px; font-weight: 700;
    letter-spacing: .08em; text-transform: uppercase;
    color: rgba(236, 227, 204, 0.72);
}
.prog-stat-sep { width: 1px; background: rgba(236, 227, 204, 0.22); }

/* ─── Variant Switcher + Graph Button ─────────────────────────────────────── */
.prog-switcher-row {
    display: flex; flex-wrap: wrap; gap: 18px;
    align-items: flex-end; justify-content: space-between;
    margin-bottom: 30px;
}
.prog-switcher-intro { max-width: 50ch; }
.prog-eyebrow {
    font-family: var(--font-mono, 'Space Mono', monospace);
    font-size: 12.5px; font-weight: 700; letter-spacing: .14em;
    text-transform: uppercase; color: var(--prog-accent-ink);
}
.prog-switcher-sub {
    font-size: 15px; color: var(--prog-dim); margin-top: 7px;
}
.prog-switcher-controls {
    display: flex; align-items: center; gap: 14px; flex-wrap: wrap;
}
.prog-segmented {
    display: inline-flex; background: var(--prog-surface-2);
    border: 1px solid var(--prog-border); border-radius: 0; padding: 3px;
}
.prog-seg-btn {
    border: 0; border-radius: 0; padding: 10px 18px;
    min-height: 44px;                 /* v2 · WISS-07: Hit-Target ≥ 44px */
    font-family: inherit; font-size: 13.5px; font-weight: 700;
    letter-spacing: .02em;
    cursor: pointer; background: transparent; color: var(--prog-dim);
    transition: background var(--cl-motion-fast) var(--cl-ease-out), color var(--cl-motion-fast) var(--cl-ease-out);
}
.prog-seg-btn.is-active {
    background: var(--prog-accent); color: var(--ink);
}
.prog-seg-btn:not(.is-active):hover { color: var(--prog-text); }

.prog-graph-btn {
    display: inline-flex; align-items: center; gap: 8px;
    background: transparent; border: 1px solid var(--prog-accent);
    color: var(--prog-accent-ink); border-radius: 0;
    padding: 10px 16px; font-family: inherit; font-size: 13.5px; font-weight: 700;
    letter-spacing: .02em;
    cursor: pointer; text-decoration: none;
    transition: background var(--cl-motion-fast) var(--cl-ease-out), color var(--cl-motion-fast) var(--cl-ease-out), transform var(--cl-motion-fast) var(--cl-ease-out), box-shadow var(--cl-motion-fast) var(--cl-ease-out);
}
.prog-graph-btn:hover {
    background: var(--prog-accent); color: var(--ink);
    transform: translateY(-1px);
    box-shadow: var(--prog-shadow);
}
.prog-graph-btn svg { flex: 0 0 auto; }
.prog-graph-ext { font-size: 11px; opacity: .7; margin-left: 2px; }

/* ─── Search + Tag Chips (Variant A) ──────────────────────────────────────── */
.prog-search-block {
    display: flex; flex-direction: column; gap: 18px; margin-bottom: 26px;
}
.prog-search-field {
    position: relative; display: flex; align-items: center;
}
.prog-search-icon {
    position: absolute; left: 16px; color: var(--prog-mute); font-size: 16px;
    pointer-events: none;
}
.prog-search-input {
    width: 100%; font-family: inherit; font-size: 15px; color: var(--prog-text);
    background: var(--prog-surface); border: 1px solid var(--prog-border);
    border-radius: 0; padding: 14px 16px 14px 42px; outline: none;
}
.prog-search-input:focus {
    border-color: var(--prog-accent);
    box-shadow: 0 0 0 1px var(--prog-accent);
}

.prog-tag-section {
    display: flex; flex-direction: column; gap: 10px;
}
.prog-tag-section-head {
    display: flex; flex-wrap: wrap; gap: 6px 16px;
    align-items: baseline; justify-content: space-between;
}
.prog-tag-section-label {
    font-family: var(--font-mono, 'Space Mono', monospace);
    font-size: 12px; font-weight: 700; letter-spacing: .12em;
    text-transform: uppercase; color: var(--prog-accent-ink);
}
.prog-tag-section-hint {
    font-size: 12.5px; color: var(--prog-mute);
}
.prog-tag-chips { display: flex; flex-wrap: wrap; gap: 9px; align-items: center; }
.prog-tag-chip {
    display: inline-flex; align-items: center; gap: 8px;
    border: 1px solid var(--prog-border); background: var(--prog-surface);
    color: var(--prog-dim); border-radius: 0; padding: 7px 13px;
    min-height: 44px;                 /* v2 · WISS-07: Hit-Target ≥ 44px */
    font-family: inherit; font-size: 13px; font-weight: 500;
    cursor: pointer; transition: all var(--cl-motion-fast) var(--cl-ease-out);
}
.prog-tag-chip:hover { border-color: var(--prog-accent); color: var(--prog-accent-ink); }
.prog-tag-chip.is-active {
    border-color: var(--prog-accent); background: var(--prog-accent);
    color: var(--ink); font-weight: 700;
}
.prog-tag-chip-label { line-height: 1; }
.prog-tag-chip-count {
    font-family: var(--font-mono, 'Space Mono', monospace); font-size: 11.5px;
    background: rgba(236, 227, 204, 0.08);
    color: inherit; padding: 2px 7px; border-radius: 0;
    min-width: 22px; text-align: center;
}
.prog-tag-chip.is-active .prog-tag-chip-count {
    background: rgba(23, 16, 25, 0.18); color: var(--ink);
}
.prog-tag-expander {
    background: transparent; border: 1px dashed var(--prog-border);
    color: var(--prog-accent-ink); font-family: inherit;
    font-size: 13px; font-weight: 700; padding: 7px 13px;
    border-radius: 0; cursor: pointer; transition: all var(--cl-motion-fast) var(--cl-ease-out);
}
.prog-tag-expander:hover { border-color: var(--prog-accent); background: var(--prog-accent-soft); }

/* ─── Filter Header ───────────────────────────────────────────────────────── */
.prog-filter-header {
    display: flex; align-items: flex-start; justify-content: space-between;
    gap: 16px; margin-bottom: 18px; flex-wrap: wrap;
}
.prog-filter-meta { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.prog-filter-count { font-size: 16px; color: var(--prog-dim); }
.prog-filter-count strong { color: var(--prog-text); font-weight: 700; }
.prog-filter-criteria { font-size: 13.5px; color: var(--prog-mute); }
.prog-filter-criteria strong { color: var(--prog-accent-ink); font-weight: 700; }
.prog-filter-clear {
    background: transparent; border: 1px solid var(--prog-border);
    color: var(--prog-dim); font-family: inherit; font-size: 13.5px;
    padding: 8px 14px; border-radius: 0; cursor: pointer;
    transition: all var(--cl-motion-fast) var(--cl-ease-out); flex: 0 0 auto;
}
.prog-filter-clear:hover { border-color: var(--prog-accent); color: var(--prog-accent-ink); }
.prog-empty {
    text-align: center; padding: 50px 20px;
    color: var(--prog-mute); font-size: 16px;
    background: var(--prog-surface); border: 1px dashed var(--prog-border);
    border-radius: 0;
}
.prog-empty p { margin: 0 0 10px; }
.prog-empty-hint { font-size: 14px; color: var(--prog-dim); }

/* ─── Cards (shared) ──────────────────────────────────────────────────────── */
.prog-card-grid {
    display: grid; gap: 18px;
    grid-template-columns: repeat(auto-fill, minmax(330px, 1fr));
}
.prog-card-grid-small {
    grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
}
.prog-card {
    position: relative; overflow: hidden; text-align: left;
    background: var(--prog-surface); border: 1px solid var(--prog-border);
    border-radius: 0; padding: 22px 22px 18px;
    cursor: pointer; box-shadow: var(--prog-shadow);
    font-family: inherit; color: var(--prog-text);
    transition: transform var(--cl-motion-fast) var(--cl-ease-out), box-shadow var(--cl-motion-fast) var(--cl-ease-out), border-color var(--cl-motion-fast) var(--cl-ease-out);
}
.prog-card:hover {
    transform: translateY(-3px); box-shadow: var(--prog-card-hover);
    border-color: var(--prog-accent);
}
.prog-card-bar {
    position: absolute; top: 0; left: 0; right: 0; height: 3px;
    background: var(--accent, var(--prog-accent));
}
.prog-card-eyebrow {
    font-family: var(--font-mono, 'Space Mono', monospace); font-size: 11.5px;
    letter-spacing: .07em; text-transform: uppercase;
    color: var(--prog-mute); margin-bottom: 9px;
}
.prog-card-title {
    font-size: 18px; font-weight: 700; color: var(--prog-text);
    line-height: 1.25; letter-spacing: -.01em;
}
.prog-card-summary {
    font-size: 14.5px; color: var(--prog-dim);
    line-height: 1.5; margin-top: 9px;
}
.prog-card-tags {
    font-size: 12.5px; color: var(--prog-mute); margin-top: 13px;
}
.prog-card-foot {
    display: flex; align-items: center; justify-content: space-between;
    margin-top: 16px;
}
.prog-card-more {
    color: var(--prog-accent-ink); font-weight: 700; font-size: 13.5px;
    letter-spacing: .02em;
}

/* Measure pill: accent-tinted background, accent text */
.prog-measure-pill {
    display: inline-block;
    font-family: var(--font-mono, 'Space Mono', monospace); font-size: 11.5px; font-weight: 700;
    padding: 5px 10px; border-radius: 0;
    background: color-mix(in srgb, var(--accent, var(--prog-accent)) 18%, transparent);
    color: var(--accent, var(--prog-accent-ink));
    border: 1px solid color-mix(in srgb, var(--accent, var(--prog-accent)) 40%, transparent);
}

/* ─── Variant A: Cluster Cards ────────────────────────────────────────────── */
.prog-cluster-grid {
    display: grid; gap: 22px;
    grid-template-columns: repeat(auto-fit, minmax(420px, 1fr));
}
.prog-cluster-card {
    position: relative; overflow: hidden;
    background: var(--prog-surface); border: 1px solid var(--prog-border);
    border-radius: 0; padding: 26px 26px 12px;
    box-shadow: var(--prog-shadow);
}
.prog-cluster-bar {
    position: absolute; top: 0; left: 0; right: 0; height: 4px;
    background: var(--accent);
}
.prog-cluster-head {
    display: flex; align-items: flex-start; gap: 16px;
}
.prog-cluster-num {
    flex: 0 0 auto; width: 52px; height: 52px; border-radius: 0;
    background: var(--accent); color: var(--ink);
    display: flex; align-items: center; justify-content: center;
    font-family: var(--font-mono, 'Space Mono', monospace); font-weight: 700; font-size: 22px;
}
.prog-cluster-titles { flex: 1; }
.prog-cluster-title {
    margin: 0; font-size: 22px; font-weight: 700;
    line-height: 1.2; letter-spacing: -.01em; color: var(--prog-text);
}
.prog-cluster-meta {
    display: flex; gap: 8px; margin: 18px 0 4px; flex-wrap: wrap;
}
.prog-meta-pill {
    font-family: var(--font-mono, 'Space Mono', monospace); font-size: 11.5px;
    color: var(--prog-mute); background: var(--prog-surface-2);
    border: 1px solid var(--prog-border);
    padding: 4px 10px; border-radius: 0;
}
.prog-cluster-themes {
    display: flex; flex-direction: column;
}
.prog-tb-row {
    display: flex; align-items: center; gap: 13px;
    width: 100%; text-align: left; background: transparent;
    border: 0; border-top: 1px solid var(--prog-border);
    padding: 14px 4px; cursor: pointer; color: var(--prog-text);
    font-family: inherit; font-size: 15px; font-weight: 500;
    transition: color var(--cl-motion-fast) var(--cl-ease-out);
}
.prog-tb-row:hover { color: var(--prog-accent-ink); }
.prog-tb-dot {
    width: 10px; height: 10px; border-radius: 0;
    background: var(--accent); flex: 0 0 auto;
}
.prog-tb-name { flex: 1; }
.prog-tb-sub-count {
    font-family: var(--font-mono, 'Space Mono', monospace); font-size: 11px;
    color: var(--prog-mute);
    background: color-mix(in srgb, var(--accent) 14%, transparent);
    padding: 2px 7px; border-radius: 0;
}
.prog-tb-count {
    font-family: var(--font-mono, 'Space Mono', monospace); font-size: 11.5px;
    color: var(--prog-mute);
}
.prog-tb-arrow { color: var(--prog-mute); font-size: 15px; }

/* ─── Variant B: Explorer ─────────────────────────────────────────────────── */
.prog-explorer {
    display: grid; grid-template-columns: 330px 1fr;
    gap: 28px; align-items: start;
}
.prog-sidebar {
    background: var(--prog-surface); border: 1px solid var(--prog-border);
    border-radius: 0; padding: 10px; box-shadow: var(--prog-shadow);
    position: sticky; top: calc(var(--nav-height, 80px) + 12px);
    max-height: calc(100vh - var(--nav-height, 80px) - 32px);
    overflow-y: auto;
}
.prog-sidebar-head {
    font-family: var(--font-mono, 'Space Mono', monospace);
    font-size: 11px; font-weight: 700; letter-spacing: .14em;
    text-transform: uppercase; color: var(--prog-mute);
    padding: 10px 12px 8px;
}
.prog-sb-cluster-btn {
    display: flex; align-items: center; gap: 12px;
    width: 100%; text-align: left; background: transparent; border: 0;
    padding: 10px 12px; border-radius: 0; cursor: pointer;
    color: var(--prog-text); font-family: inherit;
    transition: background var(--cl-motion-fast) var(--cl-ease-out);
}
.prog-sb-cluster-btn:hover { background: var(--prog-surface-2); }
.prog-sb-cluster-num {
    flex: 0 0 auto; width: 30px; height: 30px; border-radius: 0;
    background: var(--accent); color: var(--ink);
    display: flex; align-items: center; justify-content: center;
    font-family: var(--font-mono, 'Space Mono', monospace); font-weight: 700; font-size: 13px;
}
.prog-sb-cluster-title {
    flex: 1; font-size: 14px; font-weight: 700; line-height: 1.2;
}
.prog-sb-chevron {
    color: var(--prog-mute); font-size: 18px; transition: transform var(--cl-motion-fast) var(--cl-ease-out);
}
.prog-sb-chevron.is-open { transform: rotate(90deg); }
.prog-sb-themes { padding: 2px 0 8px 16px; }
.prog-sb-theme {
    display: flex; align-items: center; gap: 10px;
    width: 100%; text-align: left; background: transparent;
    border: 0; border-radius: 0; padding: 9px 11px;
    cursor: pointer; font-family: inherit; font-size: 13.5px;
    font-weight: 500; color: var(--prog-text);
    transition: background var(--cl-motion-fast) var(--cl-ease-out), color var(--cl-motion-fast) var(--cl-ease-out);
}
.prog-sb-theme:hover { background: var(--prog-surface-2); }
.prog-sb-theme.is-active {
    background: var(--prog-accent-soft); color: var(--prog-accent-ink); font-weight: 700;
}
.prog-sb-theme-dot {
    width: 8px; height: 8px; border-radius: 0;
    background: var(--accent); flex: 0 0 auto;
}
.prog-sb-theme-name { flex: 1; }
.prog-sb-theme-count {
    font-family: var(--font-mono, 'Space Mono', monospace); font-size: 11px;
    color: var(--prog-mute);
}

.prog-panel { min-width: 0; }
.prog-panel-eyebrow {
    font-family: var(--font-mono, 'Space Mono', monospace); font-size: 12px;
    letter-spacing: .07em; text-transform: uppercase; color: var(--prog-mute);
}
.prog-panel-title {
    margin: 8px 0 0; font-size: 30px; font-weight: 700;
    letter-spacing: -.02em; color: var(--prog-text);
}
.prog-panel-intro {
    margin: 12px 0 0; font-size: 16px; line-height: 1.6;
    color: var(--prog-dim); max-width: 92ch;
    white-space: pre-line;
}
.prog-panel-divider {
    display: flex; align-items: center; gap: 10px; margin: 22px 0 20px;
}
.prog-panel-divider span {
    font-family: var(--font-mono, 'Space Mono', monospace); font-size: 11.5px;
    color: var(--prog-mute); letter-spacing: .04em; text-transform: uppercase;
}
.prog-panel-divider::after {
    content: ''; height: 1px; flex: 1; background: var(--prog-border);
}

/* ─── Sub-Groups (Zwischenebene) ──────────────────────────────────────────── */
.prog-subgroup { margin-bottom: 32px; }
.prog-subgroup-intro {
    margin: 0 0 18px; font-size: 15.5px; line-height: 1.6;
    color: var(--prog-dim); max-width: 92ch;
    white-space: pre-line;
}
.prog-subgroup-head {
    display: flex; align-items: center; gap: 10px;
    margin-bottom: 14px;
    font-family: var(--font-mono, 'Space Mono', monospace); font-size: 12.5px;
    font-weight: 700; letter-spacing: .08em; text-transform: uppercase;
    color: var(--prog-text);
}
.prog-subgroup-dot {
    width: 10px; height: 10px; border-radius: 0;
    background: var(--accent);
}
.prog-subgroup-count {
    font-weight: 500; color: var(--prog-mute);
}

/* ─── Theme View ──────────────────────────────────────────────────────────── */
.prog-theme-view { padding-top: 30px; }
.prog-back-btn {
    display: inline-flex; align-items: center; gap: 7px;
    background: var(--prog-surface); border: 1px solid var(--prog-border);
    color: var(--prog-text); font-family: inherit; font-size: 13.5px; font-weight: 500;
    padding: 9px 16px; border-radius: 0; cursor: pointer;
    margin-bottom: 18px; box-shadow: var(--prog-shadow);
    transition: all var(--cl-motion-fast) var(--cl-ease-out);
}
.prog-back-btn:hover { border-color: var(--prog-accent); color: var(--prog-accent-ink); }

.prog-breadcrumb {
    display: flex; align-items: center; gap: 9px;
    font-size: 13.5px; color: var(--prog-mute);
    margin-bottom: 26px; flex-wrap: wrap;
}
.prog-bc-link {
    cursor: pointer; color: var(--prog-dim); transition: color var(--cl-motion-fast) var(--cl-ease-out);
}
.prog-bc-link:hover { color: var(--prog-accent-ink); }
.prog-bc-active { color: var(--prog-text); font-weight: 500; }
.prog-sep { color: var(--prog-mute); }

.prog-theme-head {
    display: flex; align-items: flex-start; gap: 16px;
    margin-bottom: 14px;
}
.prog-theme-num {
    flex: 0 0 auto; width: 56px; height: 56px; border-radius: 0;
    background: var(--accent); color: var(--ink);
    display: flex; align-items: center; justify-content: center;
    font-family: var(--font-mono, 'Space Mono', monospace); font-weight: 700; font-size: 24px;
}
.prog-theme-cluster-eyebrow {
    font-family: var(--font-mono, 'Space Mono', monospace); font-size: 12px;
    letter-spacing: .08em; text-transform: uppercase; color: var(--prog-mute);
}
.prog-theme-title {
    margin: 6px 0 0; font-size: clamp(28px, 3.6vw, 42px);
    font-weight: 700; letter-spacing: -.02em; line-height: 1.08;
    color: var(--prog-text);
}
.prog-theme-intro {
    margin: 0 0 30px; font-size: 17px; line-height: 1.6;
    color: var(--prog-dim); max-width: 92ch;
    white-space: pre-line;
}
.prog-theme-divider {
    display: flex; align-items: center; gap: 10px; margin: 0 0 22px;
}
.prog-theme-divider span {
    font-family: var(--font-mono, 'Space Mono', monospace); font-size: 12.5px;
    color: var(--prog-text); font-weight: 700;
    letter-spacing: .06em; text-transform: uppercase;
}
.prog-theme-divider::after {
    content: ''; height: 1px; flex: 1; background: var(--prog-border);
}

/* ─── Detail View ─────────────────────────────────────────────────────────── */
.prog-detail-view {
    max-width: 1080px; padding-top: 30px;
}
.prog-detail-eyebrow {
    font-family: var(--font-mono, 'Space Mono', monospace); font-size: 12.5px;
    letter-spacing: .08em; text-transform: uppercase; color: var(--prog-mute);
}
.prog-detail-title {
    margin: 10px 0 0; font-size: clamp(28px, 4vw, 44px);
    font-weight: 700; letter-spacing: -.02em; line-height: 1.1;
    color: var(--prog-text); max-width: 24ch;
}
.prog-detail-lead {
    margin: 18px 0 0; font-size: 19px; line-height: 1.55;
    color: var(--prog-dim); max-width: 66ch;
}
.prog-detail-meta {
    display: flex; flex-wrap: wrap; gap: 10px; margin-top: 22px;
}
.prog-detail-tags {
    font-family: var(--font-mono, 'Space Mono', monospace); font-size: 12px;
    color: var(--prog-mute); background: var(--prog-surface-2);
    border: 1px solid var(--prog-border);
    padding: 6px 12px; border-radius: 0;
}

.prog-detail-grid {
    display: grid; grid-template-columns: 1fr 280px;
    gap: 34px; margin-top: 38px; align-items: start;
}
.prog-detail-main { min-width: 0; }

.prog-detail-section { margin-bottom: 30px; }
.prog-detail-section-head {
    display: flex; align-items: center; gap: 11px; margin-bottom: 13px;
}
.prog-detail-section-head h2 {
    margin: 0; font-size: 13px; font-weight: 700;
    letter-spacing: .12em; text-transform: uppercase;
    color: var(--prog-dim);
}
.prog-detail-section-badge {
    width: 26px; height: 26px; border-radius: 0;
    background: var(--prog-surface-2); border: 1px solid var(--prog-border);
    display: flex; align-items: center; justify-content: center;
    font-size: 14px; color: var(--prog-text);
}
.prog-detail-section-body {
    margin: 0; font-size: 17px; line-height: 1.65; color: var(--prog-text);
    white-space: pre-line;
}
.prog-detail-section-count {
    font-family: var(--font-mono, 'Space Mono', monospace); font-size: 12px;
    color: var(--prog-mute); margin-left: auto;
}

.prog-detail-ziel {
    background: var(--prog-accent-soft);
    border: 1px solid color-mix(in srgb, var(--prog-accent) 35%, transparent);
    border-left: 3px solid var(--prog-accent);
    border-radius: 0; padding: 24px 26px;
}
.prog-detail-ziel .prog-detail-section-head h2 { color: var(--prog-accent-ink); }
.prog-ziel-star {
    background: var(--prog-accent); color: var(--ink); border-color: var(--prog-accent);
}
.prog-detail-ziel-body {
    margin: 0; font-size: 18px; line-height: 1.6;
    font-weight: 500; color: var(--prog-text);
    white-space: pre-line;
}

.prog-maßnahmen-list {
    list-style: none; padding: 0; margin: 0;
    display: flex; flex-direction: column; gap: 10px;
}
.prog-maßnahme {
    display: flex; gap: 15px; align-items: flex-start;
    background: var(--prog-surface); border: 1px solid var(--prog-border);
    border-radius: 0; padding: 16px 18px;
}
.prog-maßnahme-num {
    flex: 0 0 auto; width: 32px; height: 32px; border-radius: 0;
    background: var(--accent); color: var(--ink);
    display: flex; align-items: center; justify-content: center;
    font-family: var(--font-mono, 'Space Mono', monospace); font-weight: 700; font-size: 14px;
}
.prog-maßnahme-text {
    font-size: 16px; line-height: 1.5; color: var(--prog-text); padding-top: 3px;
}
.prog-detail-empty {
    background: var(--prog-surface-2); border: 1px dashed var(--prog-border);
    padding: 20px; border-radius: 0; color: var(--prog-dim);
    font-size: 15px;
}

.prog-prev-next {
    display: flex; gap: 14px; margin-top: 40px; flex-wrap: wrap;
}
.prog-prev, .prog-next {
    flex: 1; min-width: 220px;
    background: var(--prog-surface); border: 1px solid var(--prog-border);
    border-radius: 0; padding: 16px 18px; cursor: pointer;
    font-family: inherit; color: var(--prog-text);
    transition: border-color var(--cl-motion-fast) var(--cl-ease-out), color var(--cl-motion-fast) var(--cl-ease-out);
}
.prog-prev { text-align: left; }
.prog-next { text-align: right; }
.prog-prev-spacer { flex: 1; min-width: 220px; }
.prog-prev:hover, .prog-next:hover {
    border-color: var(--prog-accent); color: var(--prog-accent-ink);
}
.prog-prev-label, .prog-next-label {
    font-family: var(--font-mono, 'Space Mono', monospace);
    font-size: 11.5px; color: var(--prog-mute); margin-bottom: 4px;
    letter-spacing: .04em; text-transform: uppercase;
}
.prog-prev-title, .prog-next-title {
    font-size: 14.5px; font-weight: 700; color: inherit;
}

.prog-detail-aside {
    position: sticky; top: calc(var(--nav-height, 80px) + 12px);
    background: var(--prog-surface); border: 1px solid var(--prog-border);
    border-radius: 0; padding: 22px; box-shadow: var(--prog-shadow);
}
.prog-aside-head {
    font-family: var(--font-mono, 'Space Mono', monospace);
    font-size: 11px; font-weight: 700; letter-spacing: .14em;
    text-transform: uppercase; color: var(--prog-mute); margin-bottom: 16px;
}
.prog-aside-row { margin-bottom: 16px; }
.prog-aside-label {
    font-size: 12px; color: var(--prog-mute); margin-bottom: 3px;
}
.prog-aside-val {
    display: flex; align-items: center; gap: 8px;
    font-size: 14.5px; font-weight: 500; color: var(--prog-text);
}
.prog-aside-dot {
    width: 11px; height: 11px; border-radius: 0;
    background: var(--accent); flex: 0 0 auto;
}
.prog-aside-sep {
    border: 0; border-top: 1px solid var(--prog-border); margin: 16px 0;
}
.prog-aside-big {
    font-family: var(--font-mono, 'Space Mono', monospace); font-size: 40px;
    font-weight: 700; line-height: 1; color: var(--signal);
}
.prog-aside-big-label {
    font-size: 13px; color: var(--prog-dim); margin-top: 4px;
}
.prog-aside-page {
    font-size: 12.5px; color: var(--prog-mute);
}

/* ─── Responsive ──────────────────────────────────────────────────────────── */
@media (max-width: 980px) {
    .prog-explorer { grid-template-columns: 1fr; }
    .prog-sidebar {
        position: static; max-height: none; overflow: visible;
    }
    .prog-detail-grid { grid-template-columns: 1fr; }
    .prog-detail-aside { position: static; }
}

@media (max-width: 640px) {
    .prog-container { padding: 24px 16px 60px; }
    .prog-hero-inner { padding: 56px 16px 68px; }
    .prog-cluster-grid { grid-template-columns: 1fr; }
    .prog-card-grid, .prog-card-grid-small { grid-template-columns: 1fr; }
    .prog-switcher-row { flex-direction: column; align-items: stretch; }
    .prog-switcher-controls { justify-content: space-between; }
    .prog-graph-btn { flex: 1; justify-content: center; }
    .prog-segmented { flex: 1; }
    .prog-seg-btn { flex: 1; padding: 10px 12px; }
    .prog-hero-stats { gap: 20px; }
    .prog-hero-stats > div { flex: 1; min-width: 110px; }
}

/* ─── Topic Tabs (Wahlprogramm vs. Klimabericht) ──────────────────────────
   Sub-Nav oben auf der Wissenswertes-Seite. Sticky NICHT — soll mit der
   Hero einrollen. Zwei Tabs als Hauptbereichswahl.
   ============================================================================ */
.wp-topic-tabs {
    background: var(--prog-surface);
    border-bottom: 1px solid var(--prog-border);
}
.wp-topic-tabs-inner {
    max-width: var(--prog-container-max);
    margin: 0 auto;
    padding: 14px var(--prog-container-pad);
    display: flex;
    align-items: center;
    gap: 18px;
    flex-wrap: wrap;
}
.wp-topic-tabs-label {
    font-family: var(--font-mono, 'Space Mono', monospace);
    font-size: 11px; font-weight: 700;
    letter-spacing: 0.16em; text-transform: uppercase;
    color: var(--prog-mute);
}
.wp-topic-tabs-row {
    display: flex; gap: 4px;
    background: var(--prog-surface-2);
    border: 1px solid var(--prog-border);
    padding: 3px;
}
.wp-topic-tab {
    display: inline-flex; align-items: center; gap: 8px;
    padding: 9px 16px;
    min-height: 44px;                 /* v2 · WISS-07: Hit-Target ≥ 44px */
    background: transparent; border: 0; border-radius: 0;
    color: var(--prog-dim);
    font-family: var(--font-primary, 'Archivo', sans-serif);
    font-size: 13px; font-weight: 700;
    letter-spacing: 0.02em;
    cursor: pointer; text-decoration: none;
    transition: background var(--cl-motion-fast) var(--cl-ease-out), color var(--cl-motion-fast) var(--cl-ease-out);
    white-space: nowrap;
}
.wp-topic-tab:not(.is-active):hover {
    color: var(--prog-text);
    background: rgba(142, 154, 108, 0.08);
}
.wp-topic-tab.is-active {
    background: var(--prog-accent);
    color: var(--ink);
    cursor: default;
}
.wp-topic-tab[disabled] { opacity: 1; }
.wp-topic-tab-icon { font-size: 14px; line-height: 1; }
.wp-topic-tab-text { line-height: 1; }

/* Ironie-Marginalie unter dem Tab-Hub (DESIGN §6.8) — an der Container-Kante
   der Tabs ausgerichtet. */
.wp-topic-tabs-marginalie {
    max-width: var(--prog-container-max);
    margin: 0 auto;
    padding: 10px var(--prog-container-pad) 0;
}

@media (max-width: 640px) {
    .wp-topic-tabs-inner { gap: 10px; padding: 12px 16px; }
    .wp-topic-tabs-row { flex: 1; }
    .wp-topic-tab { flex: 1; justify-content: center; padding: 9px 10px; }
    .wp-topic-tab-text { font-size: 12px; }
}

/* ─── Zurück-zur-Übersicht (in der Tool-Ansicht, sekundäre Nav) ───────────── */
.wp-topic-back {
    display: inline-flex; align-items: center; gap: 7px;
    min-height: 44px;                 /* Hit-Target ≥ 44px */
    padding: 8px 14px; border-radius: 0;
    background: transparent; border: 1px solid var(--prog-border);
    color: var(--prog-dim); text-decoration: none;
    font-family: var(--font-mono, 'Space Mono', monospace);
    font-size: 12.5px; font-weight: 700; letter-spacing: .04em;
    text-transform: uppercase; white-space: nowrap;
    transition: border-color var(--cl-motion-fast) var(--cl-ease-out), color var(--cl-motion-fast) var(--cl-ease-out);
}
.wp-topic-back:hover { border-color: var(--prog-accent); color: var(--prog-accent-ink); }

/* ─── Themen-Hub: kuratierte Werkzeug-Übersicht (AUDIT-12) ─────────────────── */
.wp-hub { padding-top: 40px; }
.wp-hub .lane-label { margin-bottom: var(--space-4, 16px); }
.wp-hub-head { margin-bottom: 36px; max-width: 68ch; }
.wp-hub-title {
    margin: 0; font-size: clamp(30px, 4.4vw, 46px); line-height: 1.06;
    font-weight: 700; letter-spacing: -.02em; color: var(--prog-text);
}
.wp-hub-lead {
    margin: 16px 0 0; font-size: clamp(15px, 1.4vw, 18px);
    line-height: 1.6; color: var(--prog-dim);
}

.wp-hub-group { margin-bottom: 40px; }
.wp-hub-group-title {
    display: flex; align-items: center; gap: 12px;
    margin: 0 0 18px;
    font-family: var(--font-mono, 'Space Mono', monospace);
    font-size: 13px; font-weight: 700; letter-spacing: .1em;
    text-transform: uppercase; color: var(--prog-accent-ink);
}
.wp-hub-group-title::after {
    content: ''; flex: 1; height: 1px; background: var(--prog-border);
}

.wp-hub-card-grid {
    display: grid; gap: 18px;
    grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
}
.wp-hub-card {
    position: relative; overflow: hidden; display: flex; flex-direction: column;
    text-decoration: none; text-align: left;
    background: var(--prog-surface); border: 1px solid var(--prog-border);
    border-radius: 0; padding: 24px 22px 18px;
    box-shadow: var(--prog-shadow); color: var(--prog-text);
    transition: transform var(--cl-motion-fast) var(--cl-ease-out), box-shadow var(--cl-motion-fast) var(--cl-ease-out), border-color var(--cl-motion-fast) var(--cl-ease-out);
}
.wp-hub-card:hover {
    transform: translateY(-3px); box-shadow: var(--prog-card-hover);
    border-color: var(--prog-accent);
}
.wp-hub-card-bar {
    position: absolute; top: 0; left: 0; right: 0; height: 3px;
    background: var(--prog-accent);
}
.wp-hub-card-top {
    display: flex; align-items: center; justify-content: space-between;
    margin-bottom: 14px; min-height: 30px;
}
.wp-hub-card-icon { font-size: 26px; line-height: 1; }
.wp-hub-card-badge {
    font-family: var(--font-mono, 'Space Mono', monospace);
    font-size: 10.5px; font-weight: 700; letter-spacing: .12em;
    text-transform: uppercase; color: var(--ink);
    background: var(--prog-signal); padding: 4px 9px; border-radius: 0;
}
.wp-hub-card-title {
    margin: 0; font-size: 20px; font-weight: 700; line-height: 1.2;
    letter-spacing: -.01em; color: var(--prog-text);
}
.wp-hub-card-benefit {
    margin: 9px 0 0; font-size: 14.5px; line-height: 1.5;
    color: var(--prog-dim);
}
.wp-hub-card-foot {
    display: flex; align-items: center; justify-content: space-between;
    gap: 12px; margin-top: 18px; padding-top: 14px;
    border-top: 1px solid var(--prog-border);
}
.wp-hub-card-meta {
    font-family: var(--font-mono, 'Space Mono', monospace); font-size: 11.5px;
    letter-spacing: .04em; text-transform: uppercase; color: var(--prog-mute);
}
.wp-hub-card-more {
    color: var(--prog-accent-ink); font-weight: 700; font-size: 13.5px;
    letter-spacing: .02em;
}
.wp-hub-marginalie { margin-top: 8px; color: var(--prog-mute); }

/* ─── Volt intern (Zugangs-Disclosure, dritte Qualität neben Lane neutral/
   meinung) ── Label-Optik bewusst identisch zu [data-lane="meinung"]
   .lane-label (lanes.css): --cl-lane-meinung als Text (flippt korrekt
   zwischen Dark/Light-Kontrast) auf @10%-Terracotta-Tint. Die Alpha-Fläche
   hat kein Token-Pendant — gleiche Konvention wie lanes.css/mandate-strip.css. */
.wp-hub-group-intern-label {
    display: inline-block;
    font-family: var(--font-mono, 'Space Mono', monospace);
    font-size: 12px; font-weight: 700; letter-spacing: .08em;
    text-transform: uppercase; color: var(--cl-lane-meinung);
    background: rgba(198, 107, 69, 0.10);
    padding: 4px 10px; margin: 0 0 8px;
}
.wp-hub-group-intern-note {
    margin: 0 0 18px; max-width: 68ch;
    font-size: 14px; line-height: 1.5; color: var(--prog-dim);
}
/* Terracotta-Fläche + fester Ink-Text — gleiches Paar wie --btn-primary-*
   (variables.css), dort bereits auf 4,97:1 in beiden Modi verifiziert. */
.wp-hub-card-badge--intern {
    background: var(--btn-primary-bg); color: var(--btn-primary-text);
}
.wp-hub-card-meta--intern { color: var(--cl-lane-meinung); }
.wp-hub-card--intern .wp-hub-card-foot {
    flex-direction: column; align-items: flex-start; gap: 6px;
}

@media (max-width: 640px) {
    .wp-hub-card-grid { grid-template-columns: 1fr; }
    .wp-topic-back-text { display: none; }
}

/* Iframe embedding for subpages */
.wissenswertes-iframe-container {
    width: 100%;
    height: calc(100vh - 145px);
    overflow: hidden;
    background: var(--prog-bg);
}
.wissenswertes-iframe {
    width: 100%;
    height: 100%;
    border: none;
    background: transparent;
}
} /* end @layer pages */

/* ═══ css/animations/04-variable-font-hover.css ═══ */
/* CivicNova — Animation 04: Variable Font Weight Hover
   ──────────────────────────────────────────────────────────────

   PROVENIENZ
     Erstellt:    2026-06-30 (Animations-Welle 04–08, Sprint 5)
     Spec-Doku:   02 Projekte/CivicLab/11 Code-Prompt Animations 2026-06-30.md  (Schritt 1)
                  + 10 Animation-Inspiration 2026-06-30.md  (Pattern #4)
     Vorbild:     https://variable-font-weight-hover.webflow.io/
     Tech-Stack:  reines CSS font-variation-settings + transition (0 KB Lib-Add)

   WAS ES MACHT
     Headlines + Karten-/Tile-Titel reagieren unter dem Cursor mit weicher
     Weight-Interpolation (400 → 680) der variablen Archivo-Schrift. Subtiles
     Tracking-Tightening verstärkt das "Anschwellen". Brand-konform: kein neues
     Asset, Archivo ist schon variabel eingebunden (wght-Achse).

   WICHTIG (Repo-Abweichung von der Spec)
     Die Spec nannte Ubuntu als variable Schrift. Das Repo nutzt aber Archivo
     (--cl-font-display) als variable Display-Schrift. Mechanik identisch — die
     wght-Achse von Archivo deckt 100–900 ab. Damit die Interpolation flüssig
     ist, lädt index.html die Archivo-Achse als Range (wght@100..900).

   INTEGRATION (in index.html)
     <link rel="stylesheet" href="css/animations/04-variable-font-hover.css">
     (nach den bestehenden Animation-/Page-CSS einfügen)

   PERFORMANCE
     Lib-Add:     0 KB (reines CSS, Archivo schon geladen)
     Custom Code: ~0,7 KB
     Runtime:     compositor-/paint-thread, kein JS, kein Layout-Thrash
     Lighthouse:  0 Impact

   A11Y
     • prefers-reduced-motion: reduce → transition wird deaktiviert, Hover-Weight
       greift dann instant (oder gar nicht, je Pointer) — kein animiertes Schwellen
     • Touch-Geräte: :hover triggert nicht dauerhaft → kein Bruch, Titel bleibt 400
     • Semantik unverändert — rein visueller Effekt, kein DOM-/ARIA-Eingriff */

/* ── Hover-Targets: Headlines + Karten-/Tile-Titel ──────────────────────────── */
.fv-hover,
.strang-card h3,
.strang-tile h3,
.section-title,
.page-head__title,
.category-title {
    font-variation-settings: "wght" 400;
    transition: font-variation-settings var(--cl-motion-base) var(--cl-ease-out),
                letter-spacing var(--cl-motion-base) var(--cl-ease-out);
}

/* Hover am Element selbst ODER an der umschließenden Karte (Karten-Titel sind
   verlinkt, der Hover liegt oft auf der Card, nicht exakt auf dem h3). */
.fv-hover:hover,
.strang-card:hover h3,
.strang-tile:hover h3,
.section-title:hover,
.page-head__title:hover,
.category-title:hover {
    font-variation-settings: "wght" 680;
    letter-spacing: -0.005em;
}

/* ── A11Y: prefers-reduced-motion deaktiviert die weiche Interpolation ──────── */
@media (prefers-reduced-motion: reduce) {
    .fv-hover,
    .strang-card h3,
    .strang-tile h3,
    .section-title,
    .page-head__title,
    .category-title {
        transition: none;
    }
}

/* ═══ css/animations/06-svg-path-draw.css ═══ */
/* CivicNova — Animation 06: Scroll-Linked SVG Path Draw
   ──────────────────────────────────────────────────────────────

   PROVENIENZ
     Erstellt:    2026-06-30 (Animations-Welle 04–08, Sprint 4)
     Spec-Doku:   02 Projekte/CivicLab/11 Code-Prompt Animations 2026-06-30.md  (Schritt 5)
                  + 10 Animation-Inspiration 2026-06-30.md  (Pattern #2)
     Vorbild:     https://scroll-driven-animations.style/  (Bramus Spec-Demo)
     Tech-Stack:  reines CSS scroll-timeline (animation-timeline: view()), 0 JS-Lib

   WAS ES MACHT
     Eine SVG-Linie ("Beteiligungspfad: vom Bürgerbrief zur StVV-Entscheidung")
     zeichnet sich beim Scroll von oben nach unten in Sage. Datenklarheit statt
     AI-Slop: die Linie IST die Erklärung des Beteiligungswegs.

   HTML-VERTRAG
     <section class="funnel-section">
       <svg class="funnel-path-svg" viewBox="0 0 800 600" role="img" aria-label="…">
         <path class="draw-on-scroll" d="…" pathLength="1" />
       </svg>
     </section>
     pathLength="1" im SVG normalisiert die Pfadlänge → dasharray/offset = 1.

   INTEGRATION (in index.html)
     <link rel="stylesheet" href="css/animations/06-svg-path-draw.css">

   PERFORMANCE
     Lib-Add:     0 KB (reines CSS scroll-timeline)
     Custom Code: ~0,8 KB CSS
     Runtime:     compositor-thread, kein main-thread JS, kein scroll-jank
     Lighthouse:  0 Impact

   A11Y
     • prefers-reduced-motion: reduce → Linie sofort komplett (kein Zeichnen)
     • Browser ohne scroll-timeline → @supports-Fallback: Linie sofort komplett
     • SVG braucht role="img" + aria-label (siehe HTML-Vertrag) */

.funnel-path-svg {
    width: 100%;
    height: auto;
    max-height: 70vh;
    display: block;
    margin: 0 auto;
}

.funnel-path-svg path.draw-on-scroll {
    fill: none;
    stroke: var(--cl-sage, #8E9A6C);
    stroke-width: 3;
    stroke-linecap: round;
    /* pathLength="1" im Markup normalisiert die Länge → dasharray/offset in [0..1] */
    stroke-dasharray: 1;
    stroke-dashoffset: 1;
}

/* ── Scroll-Driven Draw (Native CSS, 0 JS) ──────────────────────────────────── */
@supports (animation-timeline: view()) {
    .funnel-path-svg path.draw-on-scroll {
        animation: path-draw linear both;
        animation-timeline: view();
        animation-range: entry 10% cover 70%;
    }

    @keyframes path-draw {
        to { stroke-dashoffset: 0; }
    }
}

/* ── Fallback: Browser ohne scroll-timeline → Linie sofort komplett ──────────── */
@supports not (animation-timeline: view()) {
    .funnel-path-svg path.draw-on-scroll {
        stroke-dashoffset: 0;
    }
}

/* ── A11Y: prefers-reduced-motion → Linie sofort komplett ────────────────────── */
@media (prefers-reduced-motion: reduce) {
    .funnel-path-svg path.draw-on-scroll {
        animation: none !important;
        stroke-dashoffset: 0 !important;
    }
}

/* ── Beteiligungspfad-Sektion (Container + Labels) ──────────────────────────── */
.funnel-section {
    margin: var(--space-16, 4rem) 0 var(--space-8, 2rem);
}

.funnel-section h2 {
    font-family: var(--cl-font-display, 'Archivo', sans-serif);
    color: var(--cl-cream, #ECE3CC);
    margin-bottom: var(--space-6, 1.5rem);
}

.funnel-path-svg .funnel-node {
    fill: var(--cl-surface, #221A2B);
    stroke: var(--cl-sage, #8E9A6C);
    stroke-width: 2;
}

.funnel-path-svg .funnel-label {
    fill: var(--cl-cream, #ECE3CC);
    font-family: var(--cl-font-mono, 'Space Mono', monospace);
    font-size: 18px;
}

/* ═══ css/animations/02-sticky-section-pin.css ═══ */
/* CivicNova — Animation 02: Sticky-Section-Pin (Pudding-Pattern)
   ──────────────────────────────────────────────────────────────

   PROVENIENZ
     Erstellt:    2026-06-30 (Recherche-Session „Mind-Blowing Animations 2026")
     Spec-Doku:   02 Projekte/CivicLab/10 Animation-Inspiration 2026-06-30.md  (Top-3.2)
     Vorbild:     Pudding.cool „democracy" Visual Essay (2026) +
                  https://scroll-driven-animations.style/  (Bramus Spec-Demo)
     Tech-Stack:  CSS Scroll-Driven Animations (animation-timeline: scroll() / view())
     Browser:     Moderne Browser mit @supports-Fallback; Inhalt bleibt ohne
                  animation-timeline voll konsumierbar.

   WAS ES MACHT
     Bindet zwei Hebel zusammen:
     1. Linkes Visual-Anchor (Diagramm/Karte/Graph) ist sticky innerhalb eines
        langen Erklär-Containers.
     2. Erklär-Sections rechts daneben fade-revealen beim Scrollen via view()-Timeline,
        und das Anchor-Visual bekommt sanften Scrub-Effekt (opacity/scale).

   HTML-STRUKTUR (Erklär-Seite, z.B. js/pages/erklaert.js)
     <div class="pin-story">
       <aside class="pin-anchor">
         <svg class="pin-diagram" aria-label="...">...</svg>   <!-- oder <img>, <canvas> -->
       </aside>
       <div class="pin-track">
         <section class="pin-step" data-step="1">
           <h2>Magistrat</h2>
           <p>…</p>
         </section>
         <section class="pin-step" data-step="2">
           <h2>Stadtverordneten­versammlung</h2>
           <p>…</p>
         </section>
         <section class="pin-step" data-step="3">
           <h2>Ausschüsse</h2>
           <p>…</p>
         </section>
         <section class="pin-step" data-step="4">
           <h2>Bürgermeister:in</h2>
           <p>…</p>
         </section>
       </div>
     </div>

   INTEGRATION (in index.html)
     <link rel="stylesheet" href="css/animations/02-sticky-section-pin.css">
     (am besten NACH css/animations.css einfügen)

   PERFORMANCE
     Lib-Add:     0 KB (reines CSS, native scroll-timeline)
     Custom Code: ~1,2 KB gzip
     Runtime:     compositor-thread (kein main-thread JS, kein scroll-jank)
     Lighthouse:  0 Impact

   A11Y
     • prefers-reduced-motion: animation wird deaktiviert, sticky-Position bleibt funktional
     • Diagramm braucht aria-label (siehe HTML-Vorlage oben)
     • Tab-Order: durch pin-step normal, pin-anchor ist Tab-skip (decorative)
     • Reader: Text wird linear gelesen, Diagramm als beschriftetes Element präsent

   ROLLBACK
     Diesen File-Link aus index.html entfernen. Sticky-Layout ist dann weg,
     Erklär-Sections fallen auf normalen Scroll-Flow zurück.

   BROWSER-FALLBACK
     Browser ohne scroll-timeline (Chrome <115, Safari <18) sehen statischen
     Layout — Sticky-Pin funktioniert (CSS position: sticky ist seit Jahren stabil),
     nur Scrub-Animationen fehlen. Inhalt bleibt voll konsumierbar. */

/* ── Container: 2-Spalten-Layout, eine sticky, eine scrolling ──────────────── */
.pin-story {
    display: grid;
    grid-template-columns: minmax(280px, 2fr) minmax(0, 3fr);
    gap: var(--space-8);
    margin: var(--space-16) 0;
    align-items: start;
}

/* Mobile: stack — kein Pin auf <768 px, weil Sticky-Layout auf Smartphones nervt */
@media (max-width: 767px) {
    .pin-story {
        grid-template-columns: 1fr;
    }
    .pin-anchor {
        position: relative !important;
        top: auto !important;
        height: auto !important;
    }
}

/* ── Sticky-Anchor (linke Spalte) ──────────────────────────────────────────── */
.pin-anchor {
    position: sticky;
    top: calc(var(--nav-height, 64px) + var(--space-6));
    align-self: start;
    /* Höhe so dimensionieren, dass Diagramm voll sichtbar bleibt während Scroll */
    height: calc(100vh - var(--nav-height, 64px) - var(--space-12));
    display: flex;
    align-items: center;
    justify-content: center;
    background: var(--surface);
    border: 1px solid var(--aubergine);
    padding: var(--space-6);
}

.pin-anchor .pin-diagram {
    max-width: 100%;
    max-height: 100%;
    width: auto;
    height: auto;
}

/* ── Scroll-Track (rechte Spalte, jedes pin-step ist eine Erklär-Phase) ────── */
.pin-track {
    display: flex;
    flex-direction: column;
    gap: var(--space-16);
}

.pin-step {
    min-height: 60vh;
    padding: var(--space-6);
    border-left: 5px solid var(--sage);
    background: linear-gradient(90deg, rgba(142, 154, 108, 0.04), transparent 80%);
}

.pin-step h2 {
    font-family: var(--font-primary, 'Archivo', sans-serif);
    color: var(--cream);
    margin-bottom: var(--space-4);
}

.pin-step p {
    color: var(--color-text-body, var(--cream));
    line-height: 1.65;
}

/* ── Scroll-Driven Reveal per view()-Timeline (Native CSS, 0 JS) ───────────── */
@supports (animation-timeline: view()) {
    .pin-step {
        opacity: 0;
        transform: translateY(24px);
        animation: pin-step-reveal linear both;
        animation-timeline: view();
        animation-range: entry 10% cover 30%;
    }

    @keyframes pin-step-reveal {
        to {
            opacity: 1;
            transform: translateY(0);
        }
    }

    /* Anchor-Visual bekommt sanften Scale + Filter-Scrub während des ganzen Story-Containers.
       Wirkung: das Diagramm „atmet" mit dem Scroll, ohne abzulenken. */
    .pin-anchor {
        animation: pin-anchor-breathe linear;
        animation-timeline: scroll(nearest);
        animation-range: 0 100%;
    }

    @keyframes pin-anchor-breathe {
        0%   { filter: brightness(0.85); transform: scale(0.98); }
        50%  { filter: brightness(1.00); transform: scale(1.00); }
        100% { filter: brightness(0.85); transform: scale(0.98); }
    }
}

/* ── Fallback: Browser ohne scroll-timeline (Chrome <115, Safari <18) ──────── */
@supports not (animation-timeline: view()) {
    .pin-step {
        opacity: 1;
        transform: none;
    }
}

/* ── A11Y: prefers-reduced-motion deaktiviert die Scrub-Reveals ────────────── */
@media (prefers-reduced-motion: reduce) {
    .pin-step,
    .pin-anchor {
        animation: none !important;
        opacity: 1 !important;
        transform: none !important;
        filter: none !important;
    }
}
