@layer settings, tools, generic, elements, objects, components, utilities;
/* settings.tokens.css + fonts.css werden im <head> parallel per <link> geladen
   (Reihenfolge tokens -> fonts -> main), NICHT mehr via @import (Render-Wasserfall). */
/* E5-Skin-Port (Referenz entwuerfe/entwuerfe/05_live_lage/styles.css + assets/_shared/base.css):
   - generic/elements: reset, base typography, focus-visible (1a)
   - objects (CUBE): .wrap .flow .grid(-2/3/4) .sec(-tight)  — reines Layout, kein Skin
   - components: E5-Skin (chrome/nav/feedbar, panes/cards/pillars/viz, sec--light,
     watermark, hero, forms, footer, view-transitions) + die base.css-Primitive, die der
     Skin ueberschreibt (.eyebrow/.lead/.body/.btn/.btn-ghost/h4)
   - utilities: .mt-0/.mt-1/.measure-24 usw. ersetzen die E5-Inline-Styles (KEIN style= im Output) */

@layer generic {
  *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; hyphens: none; }
  html { scroll-behavior: smooth; -webkit-text-size-adjust: 100%; }
  img, svg, video { display: block; max-width: 100%; }
  a { color: inherit; text-decoration: none; }
  button { font: inherit; color: inherit; background: none; border: none; cursor: pointer; }
  ul { list-style: none; }
}

@layer elements {
  body {
    font-family: var(--font);   /* Marken-Font Hanken Grotesk als Body-/Ueberschriftenschrift (CLS-Metriken in fonts.css) */
    background: var(--navy);
    color: var(--ink);
    line-height: 1.6;
    -webkit-font-smoothing: antialiased;
    text-rendering: optimizeLegibility;
    min-height: 100vh;
  }
  h1 { font-weight: 400; font-size: clamp(2.75rem, 6vw, 4.25rem); line-height: 1.0; letter-spacing: -.03em; }
  h2 { font-weight: 500; font-size: clamp(1.875rem, 3.6vw, 2.5rem); line-height: 1.08; letter-spacing: -.025em; }
  h3 { font-weight: 500; font-size: 1.75rem; line-height: 1.15; letter-spacing: -.02em; }
  p { line-height: 1.65; }
  :focus-visible { outline: 2px solid var(--signal); outline-offset: 3px; border-radius: 2px; }
}

@layer objects {
  /* CUBE-Layout-Primitive — nur display/grid/spacing, keine Farben/Border-Skins.
     .pane/.card/.pillar/.viz sind fast ausschliesslich Skin (Border-/BG-Token) und
     leben daher komplett in components (siehe dort). */
  .wrap { max-width: var(--wrap); margin-inline: auto; padding-inline: clamp(20px, 5vw, 40px); }
  .flow > * + * { margin-top: 1rem; }
  .grid { display: grid; gap: 1.1rem; }               /* margin-top -> .flow (DS-05), NICHT hier */
  .grid-2 { grid-template-columns: repeat(2, 1fr); }
  .grid-3 { grid-template-columns: repeat(3, 1fr); }
  .grid-4 { grid-template-columns: repeat(4, 1fr); }
  .sec { padding-block: clamp(2.6rem, 6vw, 4.6rem); }
  @media (max-width: 960px) { .grid-3, .grid-4 { grid-template-columns: repeat(2, 1fr); } }
  @media (max-width: 720px) { .grid-2, .grid-3, .grid-4 { grid-template-columns: 1fr; } }
}

@layer components {
  /* ---------------------------------------------------------------------
     Base typographic + button primitives ported from E5 base.css. Needed
     because the E5-skin overrides below (13.1/13.10) only add deltas on
     top of these — without them .lead/.body/.btn-ghost etc. would be
     incomplete. Kept in components (not elements) — Task 1a's elements
     layer (h1-h3, :focus-visible) is treated as closed for this task.
     Note: base.css's --fg/--bg aliases do not exist in settings.tokens.css
     (Task 2) — resolved directly to --ink/--navy here. --------------------- */
  h4 { font-weight: 600; font-size: 1.3125rem; line-height: 1.3; letter-spacing: -.01em; }
  .eyebrow { font-weight: 600; font-size: .75rem; text-transform: uppercase; letter-spacing: .20em; color: var(--muted); }
  .lead { font-weight: 400; font-size: clamp(1.125rem, 1.6vw, 1.3125rem); line-height: 1.55; color: var(--text-dim); }
  .body { font-weight: 400; font-size: 1.0625rem; line-height: 1.65; }
  .btn {
    display: inline-flex; align-items: center; gap: .5em; font-family: var(--font); font-weight: 600;
    font-size: .9375rem; letter-spacing: .01em; padding: .7em 1.15em; border-radius: var(--radius-sm);
    background: var(--ink); color: var(--navy); border: 1px solid var(--ink);
    transition: opacity var(--dur) var(--ease), transform var(--dur) var(--ease);
  }
  .btn:hover { opacity: .9; }
  .btn-ghost { background: transparent; color: var(--ink); border: 1px solid var(--faint); }
  .btn-ghost:hover { border-color: var(--ink); }
  /* .btn nutzt background:var(--ink)/color:var(--navy) — im Standard-Theme
     kippen beide gegenlaeufig (ink hell, navy dunkel). .sec--light kippt NUR
     --ink (wird dort dunkel), --navy bleibt konstant dunkel -> ohne diesen
     Override waere der Button dunkel auf dunkel und unlesbar (gefunden per
     Screenshot). --pane kippt in .sec--light auf einen hellen Cremeton. */
  .sec--light .btn { color: var(--pane); }

  /* =====================================================================
     0 · PAGE BASE — radial wash as a fixed deco layer (PERF-07: avoids the
     body-attachment=fixed technique) + CRT scanline texture.
     ===================================================================== */
  body::before {
    content: ""; position: fixed; inset: 0; z-index: -1; pointer-events: none;
    background: radial-gradient(1200px 560px at 50% -180px, var(--body-radial) 0, transparent 70%);
  }
  body::after {
    content: ""; position: fixed; inset: 0; z-index: 9998; pointer-events: none;
    background: repeating-linear-gradient(0deg, rgba(234, 240, 247, .016) 0 1px, transparent 1px 4px);
  }

  /* =====================================================================
     1 · PERSISTENT CHROME — console feed bar · tab-strip nav · scanline
     ===================================================================== */
  .scan {
    position: fixed; left: 0; right: 0; top: 0; height: 1px; z-index: 95;
    pointer-events: none; opacity: 0;
    background: linear-gradient(90deg, transparent, var(--term) 16%, var(--ink) 50%, var(--term) 84%, transparent);
  }
  .chrome {
    position: sticky; top: 0; z-index: 60;
    background: rgb(11 20 36 / calc(var(--hp, 0) * .85));
    -webkit-backdrop-filter: blur(calc(var(--hp, 0) * 15px)) saturate(120%);
    backdrop-filter: blur(calc(var(--hp, 0) * 15px)) saturate(120%);
    border-bottom: 1px solid rgb(34 58 92 / calc(var(--hp, 0)));
    will-change: background, backdrop-filter;
  }
  .feedbar {
    view-transition-name: feedbar;
    position: relative; z-index: 60;
    border-bottom: 1px solid rgb(26 46 61 / calc(var(--hp, 0)));
    background: transparent;
  }
  .feedbar-in {
    display: flex; flex-wrap: wrap; align-items: center; gap: .4em .8em;
    padding-block: .63rem;
    font-family: var(--font-mono); font-size: .6875rem; letter-spacing: .04em;
    color: var(--term); text-transform: uppercase;
  }
  .fb-dot { width: 6px; height: 6px; border-radius: 50%; background: var(--signal); display: inline-block;
    box-shadow: 0 0 0 3px rgba(90, 208, 140, .12); }
  .fb-seg { white-space: nowrap; }
  .fb-sep { color: var(--faint); }
  .fb-coord, .fb-snap { color: var(--muted); }
  .fb-uptime { color: var(--term); margin-left: auto; }

  .site-nav {
    view-transition-name: site-nav;
    position: relative; z-index: 50;
    background: transparent;
    border-bottom: none;
  }
  .nav-in { display: flex; align-items: flex-end; gap: 1.25rem; min-height: 93px; padding-top: .85rem; }
  .brand {
    view-transition-name: brand;
    display: inline-flex; align-items: center; gap: .6rem; color: var(--ink);
    flex: 0 0 auto; padding-bottom: .55rem;
  }
  .emit { height: 24px; width: auto; color: var(--ink); }
  .brand-word {
    font-family: var(--font-logo); font-weight: 600; font-size: 1.05rem;
    letter-spacing: .24em; padding-left: .12em; color: var(--ink);
  }
  .nav-links { display: flex; gap: .1rem; margin-inline: auto; align-self: flex-end;
    font-family: var(--font-mono); font-size: .76rem; letter-spacing: .02em; }
  .nav-links a {
    display: flex; align-items: center; gap: .45em;
    padding: .5em .85em; color: var(--muted);
    border: 1px solid transparent; border-bottom: none;
    border-top-left-radius: 5px; border-top-right-radius: 5px;
    transition: color var(--dur) var(--ease), background var(--dur) var(--ease), border-color var(--dur) var(--ease);
  }
  .nav-links a::before { content: "·"; color: var(--faint); }
  .nav-links a:hover { color: var(--ink); background: rgba(34, 58, 92, .18); }
  .nav-links a[aria-current="page"] {
    color: var(--ink); background: var(--pane);
    border-color: var(--edge-2);
    box-shadow: inset 0 2px 0 var(--accent);
  }
  .nav-links a[aria-current="page"]::before { content: "›"; color: var(--accent); }
  .nav-right { display: flex; align-items: center; gap: .9rem; flex: 0 0 auto; padding-bottom: .55rem; }
  .nav-cta { font-size: .8rem; padding: .55em .9em; }
  .lang { display: flex; gap: .1rem; font-family: var(--font-mono); font-size: .68rem; }
  .lang-b { padding: .3em .42em; color: var(--faint); letter-spacing: .06em; border-radius: 3px; }
  .lang-b.is-active { color: var(--ink); border: 1px solid var(--edge-2); }
  .lang-b[disabled] { cursor: not-allowed; opacity: .7; }
  .lang-b:not([disabled]):hover { color: var(--muted); }

  /* =====================================================================
     2 · SECTION/PANE SKIN + z-index stacking for the fixed watermark
     (.sec/.sec-tight padding live in objects)
     ===================================================================== */
  main { display: block; position: relative; }
  main > section > .wrap { position: relative; z-index: 2; }
  main > section > .sec-split-text, main > section > .sec-split-image { position: relative; z-index: 2; }
  main > section > .content-shot { position: relative; z-index: 2; }

  .pane { position: relative; border: 1px solid var(--edge-2); border-radius: var(--radius-sm); background: var(--pane); overflow: clip; }
  .pane-bar {
    display: flex; align-items: center; gap: .7rem;
    padding: .5rem .9rem;
    border-bottom: 1px solid var(--edge);
    background: var(--bar);
    font-family: var(--font-mono); font-size: .68rem; letter-spacing: .04em;
    color: var(--muted);
  }
  .win-dots { display: flex; gap: .34rem; flex: 0 0 auto; }
  .win-dots i { width: 8px; height: 8px; border-radius: 50%; border: 1px solid var(--edge-2); }
  .pane-path { color: var(--term); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
  .pane-path .sub { color: var(--faint); }
  .pane-stat { margin-left: auto; flex: 0 0 auto; letter-spacing: .08em; }
  .pane-stat.ok { color: var(--signal); }
  .pane-body { padding: clamp(1.3rem, 3vw, 2.4rem); }

  .eyebrow.cmd { display: flex; align-items: center; gap: .55em; }
  .eyebrow.cmd::before { content: ">"; color: var(--accent); font-family: var(--font-mono); font-weight: 600; }
  .eyebrow.cmd .ac { color: var(--accent); }
  .sec-head { max-width: 62ch; }
  .sec-head .lead { margin-top: 1rem; }
  .sec-head h2 { margin-top: .7rem; }
  /* Grundsaetzliche Style-Anweisung (06.07., Micha): Header -> Subheader
     -> Body braucht je ca. 15px Luft. In .sec-head bedeutet das konkret:
     h2 (Header) -> .t1 (Subheader, ProseSection's betonter erster Absatz)
     und .t1 -> .flow (Body, restliche Absaetze); hat eine Sektion keinen
     Subheader-Absatz (z.B. ReportsSection: h2 direkt gefolgt vom .flow-
     Body), gilt derselbe 15px-Abstand ersatzweise fuer h2 + .flow. Als
     generische Selektoren statt Einzelfix, gilt automatisch fuer jede
     aktuelle wie kuenftige Sektion mit diesem Muster. */
  .sec-head h2 + .t1 { margin-top: 15px; }
  .sec-head .t1 + .flow { margin-top: 15px; }
  .sec-head h2 + .flow { margin-top: 15px; }
  /* .sec-head + .grid — Kachel-Sektionen (Zielgruppen/Einsatzfelder/Reports/
     Analyseebenen-Pillars): .grid selbst traegt bewusst kein margin-top
     (s. Kommentar bei .grid), .wrap ist kein .flow-Objekt -> ohne diese
     Regel beruehren sich Intro-Text und Kartenraster (verifiziert per
     getBoundingClientRect: 0px, teils -20px Ueberlappung). 25px = Design-
     Wunsch Micha (06.07.), universell fuer dieses Muster statt Einzelfix. */
  .sec-head + .grid { margin-top: 25px; }

  /* .sec--split — ProseSection mit `image`-Prop (s. ProseSection.astro):
     3-Spalten-Grid direkt auf der <section> (kein .wrap, damit die Bildspalte
     bis zum physischen Fensterrand ausbrechen kann). Mittlere Spalte (Text,
     62ch) bleibt IMMER an derselben Stelle; --text-inset repliziert exakt
     .wrap's Center-Gutter (max(0,(100vw-var(--wrap))/2) + dessen
     Padding), damit der Text nicht verrutscht. Die grosse 1fr-Spalte
     (Bild) liegt standardmaessig rechts vom Text bis zum Viewport-Rand;
     .sec--split-img-left tauscht nur, welche Aussenspalte die 1fr-Bildspalte
     ist bzw. die kleine feste Rand-Spalte — DOM-Reihenfolge bleibt immer
     Text-vor-Bild (Screenreader-Lesereihenfolge unveraendert), nur
     grid-column plaziert visuell um. */
  .sec--split {
    --text-inset: calc(max(0px, (100vw - var(--wrap)) / 2) + clamp(20px, 5vw, 40px));
    display: grid;
    grid-template-columns: var(--text-inset) minmax(0, 62ch) 1fr;
    align-items: center;
    column-gap: clamp(2rem, 5vw, 4rem);
  }
  /* .sec-split-full: fuer Sektionen, die zusaetzlich ein Kapitel-/Karten-
     Grid unterhalb von Text+Bild tragen (ReportsSection) — spannt alle 3
     Split-Spalten (Zeile 2 des .sec--split-Grids), damit das Grid als
     normaler .wrap zentriert auf voller Breite steht statt in die schmale
     62ch-Textspalte gequetscht zu werden (Korrektur 06.07.: "Modal-Boxen
     muessen in der Mitte der Seite sein, nicht rechts"). Text+Bild bleiben
     dadurch ein kurzer Block (nur .sec-head-Hoehe) — normales
     align-items:center zentriert das Bild von selbst auf den Fliesstext,
     kein position:sticky noetig (zurueckgenommen nach Ruecksprache "nicht
     kleben"). */
  .sec-split-full { grid-column: 1 / -1; grid-row: 2; margin-top: clamp(2.5rem, 5vw, 4rem); }
  .sec--split-img-left { grid-template-columns: 1fr minmax(0, 62ch) var(--text-inset); }
  /* grid-row:1 explizit auf beiden noetig: bei .sec--split-img-left steht das
     Bild (Spalte 1) im DOM NACH dem Text (Spalte 2) — sprich absteigende
     Spaltenreihenfolge. Ohne explizite Zeile schiebt Grid-Auto-Placement
     (sparse packing, vorwaerts-only Cursor) das Bild in eine neue Zeile 2
     statt es neben den Text in Zeile 1 zu setzen (verifiziert per
     getBoundingClientRect: Bild landete unterhalb statt neben dem Text). */
  .sec--split .sec-split-text { grid-column: 2; grid-row: 1; min-width: 0; }
  .sec--split .sec-split-image { grid-column: 3; grid-row: 1; }
  .sec--split-img-left .sec-split-image { grid-column: 1; }
  /* .sec--split-img-top (Design-Wunsch 06.07., #datenschutz: "Bild soll an
     der oberen Kante beginnen, wo die Zeile 'Die Plattform ist auf die
     Anforderungen...' ist" — NICHT an der Kante des ganzen sec-head-Blocks
     inkl. Eyebrow/h2/Intro-Absatz). Ein Kind, das INNERHALB eines hoeheren
     Geschwister-Grid-Items liegt (die alte sec-head-umschliesst-alles-
     Struktur), kann ohne JS-Messung/CSS-Subgrid nicht an einen Punkt
     MITTEN in diesem Geschwister ausgerichtet werden — deshalb splittet
     ProseSection.astro im top-Zweig .sec-split-intro (Eyebrow/h2/erster
     Absatz) und .sec-split-flow (restliche Absaetze) in zwei EIGENSTAENDIGE
     Grid-Items in Zeile 1 bzw. 2; das Bild liegt in DERSELBEN Zeile 2 wie
     .sec-split-flow — zwei Items in derselben Grid-Zeile beginnen
     zwangslaeufig an derselben Startlinie, exakt bei "Die Plattform...".
     MUSS NACH der generischen ".sec--split .sec-split-image { grid-row: 1 }"
     -Regel oben stehen: gleiche Spezifitaet (2 Klassen), also entscheidet
     die Quellreihenfolge — stand dieser Block VOR der generischen Regel,
     gewann faelschlich grid-row:1 (Bug, per getBoundingClientRect gefunden:
     Bild lag neben dem Intro-Block statt neben .sec-split-flow).
     KEIN position:sticky (zurueckgenommen 06.07., Korrektur "nicht sticky,
     soll mit dem ersten Fliesstext-Absatz verbunden bleiben"): das Bild
     scrollt normal mit der Seite, bleibt aber an genau dieser Startposition
     neben dem ersten Absatz "verankert", statt am Viewport zu kleben.
     Der 15px-Abstand (Konvention: h2/t1 -> flow, s. .sec-head .t1 + .flow
     oben) sitzt bewusst als margin-BOTTOM auf .sec-split-intro, NICHT als
     margin-top auf .sec-split-flow: eine Grid-Zeile wird per Auto-Sizing
     von ALLEN Items inkl. ihrer Margins bestimmt — margin-bottom auf Zeile
     1 verschiebt die gemeinsame Zeile-1/2-Startlinie selbst nach unten (Bild
     UND Flow ruecken zusammen), waehrend margin-top auf dem Zeile-2-Item
     .sec-split-flow es relativ zu genau dieser (dann falschen) Startlinie
     verschieben wuerde — Bild und Flow-Absatz waeren um 15px versetzt. */
  .sec--split-img-top { grid-template-rows: auto auto; }
  .sec--split-img-top .sec-split-intro { grid-column: 2; grid-row: 1; margin-bottom: 15px; }
  .sec--split-img-top .sec-split-flow { grid-column: 2; grid-row: 2; }
  .sec--split-img-top .sec-split-image { grid-column: 3; grid-row: 2; align-self: start; }
  .sec--split-img-top.sec--split-img-left .sec-split-image { grid-column: 1; }
  .sec-split-image {
    display: flex; align-items: center; justify-content: center; min-width: 0;
    padding-inline-end: clamp(1rem, 4vw, 2.5rem);
  }
  .sec--split-img-left .sec-split-image { padding-inline: clamp(1rem, 4vw, 2.5rem) 0; }
  @media (max-width: 900px) {
    .sec--split, .sec--split-img-left { grid-template-columns: 1fr; padding-inline: clamp(20px, 5vw, 40px); row-gap: 2rem; }
    .sec--split .sec-split-text, .sec--split .sec-split-image,
    .sec--split-img-left .sec-split-image { grid-column: 1; }
    .sec-split-image, .sec--split-img-left .sec-split-image { padding-inline: 0; }
    .sec-split-full { padding-inline: 0; }
    /* .sec--split-img-top-Stack: 1 Spalte, 3 Zeilen (Intro -> Flow -> Bild). */
    .sec--split-img-top .sec-split-intro,
    .sec--split-img-top .sec-split-flow,
    .sec--split-img-top .sec-split-image { grid-column: 1; }
    .sec--split-img-top .sec-split-intro { grid-row: 1; }
    .sec--split-img-top .sec-split-flow { grid-row: 2; }
    .sec--split-img-top .sec-split-image { grid-row: 3; }
  }
  .sec-shot { display: block; width: 100%; height: auto; border-radius: var(--radius-sm); }

  /* .content-shot — Button-Reset um ein klickbares Inhaltsbild (Hero-UI-Shot,
     ProseSection-Diagramme). Oeffnet #detail-modal wie .card-disclose/.more
     (bindDetailDialog() in enhance.ts) — neue grundlegende Design-Regel:
     Bilder verhalten sich beim Klick wie die Detail-Boxen. */
  .content-shot {
    display: block; width: 100%; padding: 0; border: none; background: transparent;
    cursor: pointer; border-radius: var(--radius-sm);
    transition: transform var(--dur) var(--ease), opacity var(--dur) var(--ease);
  }
  .content-shot:hover { opacity: .92; transform: scale(1.01); }
  .content-shot:focus-visible { outline: 2px solid var(--signal); outline-offset: 3px; }

  .benefit {
    position: relative; padding-left: 2.6rem; margin-top: 1.15rem;
    font-size: 1.0625rem; line-height: 1.55; color: var(--ink);
  }
  /* Aufzaehlungszeichen = kleiner goldener Bloodhawk-Falke (ersetzt das
     vormalige Text-"=>"); gilt als Standard-Marker fuer Benefit-/Nutzen-
     Aufzaehlungen sitework, siehe SONDAR_CI/20_produkte/bloodhawk/
     bloodhawk_brandguide.md. 2 Leerzeichen Abstand zum Textbeginn. */
  .benefit::before {
    content: ""; position: absolute; left: 0; top: -.1em;
    width: 1.7em; height: 1.7em;
    background: url('/logo/bloodhawk_falke.svg') center / contain no-repeat;
  }

  /* margin-top:auto (statt fixem 1.15rem, 06.07. Design-Wunsch Micha):
     .card-in ist ein Flex-Column-Container (flex:1) — die Karten sind seit
     der ReportsSection-Umstellung auf Grid-Default (kein grid--start mehr)
     bereits reihenweise gleich hoch; margin-top:auto schiebt "mehr erfahren"
     zusaetzlich an den unteren Rand JEDER Karte, unabhaengig von der Laenge
     des .t1-Purpose-Texts darueber — dadurch liegen alle "mehr erfahren" in
     einer Reihe exakt auf derselben Hoehe. */
  .more { margin-top: auto; border-top: 1px solid var(--edge); }
  .more > summary { list-style: none; cursor: pointer; padding: .7rem 0 .2rem; display: flex; align-items: center; gap: .6rem; font-family: var(--font-mono); font-size: .74rem; letter-spacing: .06em; color: var(--muted); }
  .more > summary::-webkit-details-marker { display: none; }
  .more > summary:hover { color: var(--ink); }
  .more-body { padding: .5rem 0 .9rem; color: var(--text-dim); }

  /* =====================================================================
     3 · HERO — the console that boots up
     ===================================================================== */
  .hero { position: relative; padding-block: clamp(2.2rem, 5vw, 4rem); }
  .hero::before {
    content: ""; position: absolute; inset: 0; z-index: 0; pointer-events: none;
    background: url('/media/feed-backdrop.svg') center top / min(1100px, 140%) no-repeat;
    opacity: .45;
    -webkit-mask-image: linear-gradient(180deg, #000 50%, transparent);
    mask-image: linear-gradient(180deg, #000 50%, transparent);
  }
  .hero .wrap { position: relative; z-index: 2; }
  .console-body { padding: clamp(1.5rem, 3.5vw, 2.8rem); }

  /* Bloodhawk-Lockup im Console-Pane — nur auf /bloodhawk gerendert (BloodhawkHero.astro),
     .pane traegt bereits position:relative (Z.174). */
  .bh-mark { position: absolute; top: clamp(1.5rem, 3.5vw, 2.8rem); right: clamp(1.5rem, 3.5vw, 2.8rem); height: clamp(70px, 10vw, 105px); width: auto; }
  @media (max-width: 720px) { .bh-mark { display: none; } }

  /* Abstand Boot-Log -> Eyebrow um 400% vergroessert (1.4rem -> 7rem), auf Wunsch. */
  .boot { font-family: var(--font-mono); font-size: .74rem; line-height: 1.85; letter-spacing: .02em; color: var(--muted); margin-bottom: 7rem; }
  .boot .ln { display: block; }
  .boot .ok { color: var(--signal); }
  .boot .pend { color: var(--faint); }

  .hero-eyebrow { margin-bottom: 1.1rem; }
  .hero-h { max-width: 19ch; margin-bottom: 2.4rem; }
  .hero-lead { max-width: 64ch; }
  .hero-cta { display: flex; flex-wrap: wrap; gap: .8rem; margin-top: 1.8rem; }
  /* .hero-ui-shot-full — bricht bis zum physischen Fensterrand aus (100%
     Fensterbreite, Design-Wunsch 06.07.): liegt als Geschwister von .wrap
     direkt in .hero (kein padding-inline dort, s. main.css .hero-Regel),
     dadurch reicht width:100% (von .content-shot geerbt) automatisch bis
     zum Viewport-Rand, ohne die Zentrierung/Padding von .wrap zu erben. */
  .hero-ui-shot-full { margin-top: clamp(2rem, 5vw, 3.5rem); border-radius: 0; padding-inline: 25px; }
  .bh-ui-shot {
    display: block; width: 100%; height: auto;
    border-radius: var(--radius-sm); border: 1px solid var(--edge-2);
  }

  .caret {
    display: inline-block; width: .55ch; height: 1.02em; margin-left: .02em;
    background: currentColor; transform: translateY(.14em);
    vertical-align: baseline; animation: e5-blink 1.06s steps(1, end) infinite;
  }
  .boot .caret { background: var(--signal); }
  @keyframes e5-blink { 0%, 49% { opacity: 1; } 50%, 100% { opacity: 0; } }

  /* =====================================================================
     4 · GRID COMPONENTS — cards, sovereignty pillars
     (.grid/.grid-2/3/4 layout primitives live in objects)
     ===================================================================== */
  /* .card-Hintergrund (06.07., Design-Wunsch Micha): leichter Farbverlauf
     hell (oben) -> dunkel (unten) + Schatten, damit sich die Karte vom
     Sektions-Hintergrund abhebt (vorher: flaches var(--pane), verschmolz
     mit dem fast gleichfarbigen Sektionshintergrund). color-mix() statt
     eines zweiten Farb-Tokens, damit "heller Top-Stop" in .sec--light UND
     im Dark-Default gilt, unabhaengig davon ob dort ein helleres Token
     ueberhaupt existiert bzw. wie es zu --pane relativ liegt. */
  .card {
    position: relative; display: flex; flex-direction: column;
    border: 1px solid var(--edge-2); border-radius: var(--radius-sm);
    background: linear-gradient(180deg, color-mix(in srgb, var(--pane) 92%, white 8%), var(--pane));
    box-shadow: 0 10px 28px rgba(0, 0, 0, .28);
    transition: transform var(--dur) var(--ease), box-shadow var(--dur) var(--ease);
    cursor: pointer;
  }
  /* Hover-Feedback (06.07., Design-Wunsch Micha): leichtes Vergroessern +
     staerkerer Schatten signalisiert Klickbarkeit (jede .card traegt ein
     .card-disclose/.more-Details-Element). transform statt Groessenaenderung
     via width/height, damit Nachbarkarten im Grid nicht mitverschoben werden
     (kein Reflow, reine Compositor-Animation). */
  .card:hover { transform: scale(1.015); box-shadow: 0 16px 36px rgba(0, 0, 0, .34); }
  .card-in { padding: 1.4rem; display: flex; flex-direction: column; flex: 1; }
  .card h3 { margin-bottom: .8rem; }
  /* #reports/#einsatzfelder .card h3 min-height (06.07., Design-Wunsch
     Micha): reserviert immer 2 Zeilen Titel-Hoehe, auch wenn ein Titel nur
     1 Zeile braucht — damit der .t1-Fliesstext bei ein- und zweizeiligen
     Titeln in derselben Grid-Reihe auf exakt derselben Hoehe beginnt (beide
     Sektionen sind 3-spaltig, schmal genug dass laengere Titel wie
     "Segment- und Audience-Bubble-Übersicht"/"Reputations- und
     Wettbewerbsbeobachtung" auf 2 Zeilen umbrechen, kuerzere wie
     "Kernzahlen"/"Issue Monitoring" nicht). Nur fuer diese beiden Sektionen
     skaliert — ZielgruppenGrid hat durchgehend einzeilige Titel und
     braucht die Reserve nicht. */
  #reports .card h3, #einsatzfelder .card h3 { min-height: calc(1.75rem * 1.15 * 2); }
  /* Basis-.t1 (06.07., Bugfix): .card .t1 ist eine scoped Regel — wird der
     Inhalt per cloneNode(true) in #detail-modal verschoben (s. enhance.ts
     bindDetailDialog), geht der .card-Vorfahre verloren und .t1 faellt ohne
     diese Basisregel auf ungestyltes Browser-Default zurueck (wirkte
     kleiner/schlechter lesbar als .body im geoeffneten Modal, Design-Fund
     06.07.). Gleiche Groesse wie .body als Fallback; die spezifischere
     .card .t1-Regel unten gewinnt weiterhin innerhalb ihres eigentlichen
     Live-Kontexts. */
  .t1 { font-size: 1.0625rem; line-height: 1.65; margin-bottom: .8rem; }
  .card .t1 { color: var(--ink); font-size: 1.02rem; margin-bottom: .8rem; }
  .card-cta { margin-top: auto; padding-top: 1rem; }
  .card-cta a { font-family: var(--font-mono); font-size: .76rem; color: var(--accent); letter-spacing: .03em; }
  .card-cta a::after { content: " →"; }
  .card-cta a:hover { color: var(--ink); }

  /* .tier-price/.tier-features (PreiseSection-Gerüst, 06.07.): Preis in
     Mono-Ziffern analog Terminal-Aesthetik (--font-mono/--accent), Feature-
     Liste als .flow aus <p> (kein <ul><li>, gleiche Konvention wie
     ReportsSection-Beispiele — main.css setzt list-style global zurueck). */
  .tier-price { font-family: var(--font-mono); font-size: 1.6rem; color: var(--accent); margin-bottom: .6rem; }
  .tier-features { margin-top: .6rem; }
  .tier-features p { font-size: .92rem; color: var(--text-dim); }

  /* .pillar carries its own position:relative (E5 sourced this from the now-
     dropped hover-lightbox rule, section 13.5) — still needed as the
     positioning context for the corner-dots (13.4). */
  /* .pillar-Hintergrund: gleiche Behandlung wie .card (s. dortiger Kommentar)
     — als "perfektes Styling fuer alle Boxen" bestaetigt (Micha, 06.07.). */
  .pillar {
    position: relative; padding: 1.3rem;
    border: 1px solid var(--edge); border-radius: var(--radius-sm);
    background: linear-gradient(180deg, color-mix(in srgb, var(--bar) 92%, white 8%), var(--bar));
    box-shadow: 0 10px 28px rgba(0, 0, 0, .28);
    transition: transform var(--dur) var(--ease), box-shadow var(--dur) var(--ease);
  }
  /* Hover-Feedback nur fuer Pillars MIT .card-disclose (SovereigntyPillars/
     ServicePillars) — AnalyseebenenLayers' Pillars sind reiner Fliesstext
     ohne Klick-Interaktion (s. dortiger Komponenten-Kommentar), ein
     Vergroesserungs-Hover wuerde dort eine nicht vorhandene Klickbarkeit
     vortaeuschen. :has() grenzt praezise auf die tatsaechlich interaktiven
     Pillars ein, statt pauschal auf die ganze Klasse zu wirken. */
  .pillar:has(.card-disclose):hover { transform: scale(1.015); box-shadow: 0 16px 36px rgba(0, 0, 0, .34); }
  .pillar:has(.card-disclose) { cursor: pointer; }
  .pillar-h { margin: .5rem 0 .6rem; }
  .pillar p { font-size: .92rem; color: var(--text-dim); }
  figcaption { margin-top: .4rem; padding: 0 .2rem; font-size: .84rem; color: var(--text-dim); }

  /* =====================================================================
     9 · NEWSLETTER + FORMS
     ===================================================================== */
  .news .pane-body { background: linear-gradient(180deg, rgba(18, 32, 54, .4), transparent); }
  .news h2 { max-width: 26ch; margin: .4rem 0 .9rem; }
  .news .lead { max-width: 66ch; }
  .nl-form { display: flex; flex-wrap: wrap; gap: .7rem; margin-top: 1.4rem; max-width: 520px; }
  .nl-form input[type=email] {
    flex: 1 1 240px; min-width: 0; padding: .7em .9em; font: inherit; color: var(--ink);
    background: var(--bar); border: 1px solid var(--edge-2); border-radius: var(--radius-sm);
  }
  .nl-form input::placeholder, .mini-form input::placeholder { color: var(--muted); }
  .nl-hint { margin-top: .7rem; font-size: .78rem; color: var(--muted); }

  /* =====================================================================
     10 · FOOTER — terminal status line
     ===================================================================== */
  .site-footer {
    view-transition-name: site-footer;
    border-top: 1px solid var(--edge-2); margin-top: 2rem; padding-block: 2.6rem;
    background: var(--footer-bg); position: relative;
  }
  .site-footer > .wrap { position: relative; z-index: 2; }
  .footer-grid { display: grid; grid-template-columns: 1.4fr 1fr; gap: 2rem; }
  .footer-brand .emit { height: 23px; }
  .foot-tag { margin-top: .9rem; font-family: var(--font-mono); font-size: .72rem; letter-spacing: .05em; color: var(--muted); }
  .foot-claim { margin-top: .7rem; font-size: .8rem; color: var(--muted); max-width: 46ch; }
  .foot-links { display: flex; flex-wrap: wrap; gap: 1rem; margin-top: 1rem; font-family: var(--font-mono); font-size: .76rem; }
  .foot-links a { color: var(--muted); }
  .foot-links a:hover { color: var(--ink); }
  .mini-nl label { display: block; font-size: .86rem; color: var(--text-dim); margin-bottom: .6rem; }
  .mini-form { display: flex; gap: .5rem; }
  .mini-form input {
    flex: 1 1 auto; min-width: 0; padding: .55em .75em; font: inherit; color: var(--ink);
    background: var(--pane); border: 1px solid var(--edge-2); border-radius: var(--radius-sm);
  }
  .foot-legal {
    margin-top: 2rem; padding-top: 1.2rem; border-top: 1px solid var(--edge);
    display: flex; flex-wrap: wrap; gap: .6rem 1.2rem; font-size: .76rem; color: var(--muted); font-family: var(--font-mono);
  }

  /* =====================================================================
     11 · SIGNATURE VIEW-TRANSITION — "Pane-Slide"
     Chrome (feedbar/nav/brand/footer) carries its own view-transition-name
     so it persists (morphs, not fades) across page navigations.
     ===================================================================== */
  @keyframes e5-slide-out { from { transform: translateX(0); opacity: 1; } to { transform: translateX(-2.5%); opacity: 0; } }
  @keyframes e5-slide-in { from { transform: translateX(3%); opacity: 0; } to { transform: translateX(0); opacity: 1; } }

  ::view-transition-old(root) { animation: e5-slide-out .42s var(--ease) both; }
  ::view-transition-new(root) { animation: e5-slide-in .50s var(--ease) both; }

  ::view-transition-group(site-nav),
  ::view-transition-group(feedbar),
  ::view-transition-group(brand),
  ::view-transition-group(site-footer) { animation-duration: .45s; }

  /* =====================================================================
     12 · RESPONSIVE (chrome/skin; grid-column collapses live in objects)
     ===================================================================== */
  @media (max-width: 960px) {
    .footer-grid { grid-template-columns: 1fr; }
  }
  @media (max-width: 720px) {
    .nav-in { flex-wrap: wrap; gap: .5rem 1rem; align-items: center; }
    .nav-links {
      order: 3; width: 100%; margin: 0; justify-content: flex-start; overflow-x: auto;
      border-top: 1px solid var(--edge); padding-top: .4rem;
    }
    .nav-links a { border-radius: 5px; }
    .nav-right { margin-left: auto; }
    .nav-cta { display: none; }
    .fb-snap { display: none; }
  }
  @media (max-width: 420px) {
    .lang { display: none; }
    .fb-coord { display: none; }
  }

  /* =====================================================================
     13 · v02 ENHANCEMENTS — bigger reading text, alternating section
     bands, fixed watermark, card corner-dots, big statements, animated
     bubble-net, media slots, scroll reveal.
     ===================================================================== */

  /* --- 13.1 Larger reading text ------------------------------------------ */
  .lead { font-size: clamp(1.32rem, 1.95vw, 1.58rem); line-height: 1.6; }
  .sec-head .lead { font-size: clamp(1.38rem, 2.2vw, 1.72rem); }
  .body { font-size: 1.32rem; line-height: 1.7; }
  .t1 { font-size: 1.32rem; line-height: 1.7; }
  .card .t1 { font-size: 1.34rem; line-height: 1.44; }
  .pillar p { font-size: 1.18rem; line-height: 1.62; }
  .pillar-h { font-size: 1.36rem; }
  .tabpanel .ans, .tl-item p, .road .road-d, .qa-body, .more-body { font-size: 1.18rem; line-height: 1.64; }
  .benefit { font-size: 1.3rem; line-height: 1.5; }
  figcaption { font-size: 1.04rem; }
  .hero-lead { font-size: clamp(1.34rem, 2vw, 1.62rem); }

  /* --- 13.2 Alternating section bands — SKIN only; the token overrides for
     .sec--light (colours, --box, --accent, --signal per Produkt) already
     live in settings.tokens.css (Task 2). ---------------------------------- */
  .sec--light {
    position: relative;
    background: var(--bone);
    color: var(--ink);
    border-block: 1px solid var(--bone-line);
  }
  .sec--light::after {
    content: ""; position: absolute; inset: 0; z-index: 0; pointer-events: none;
    background: repeating-linear-gradient(0deg, rgba(22, 32, 46, .022) 0 1px, transparent 1px 4px);
  }
  .sec--light > .wrap { position: relative; z-index: 2; }
  .sec--light > .sec-split-text, .sec--light > .sec-split-image { position: relative; z-index: 2; }

  /* --- 13.3 Fixed watermark (PERF-06: no mix-blend-mode; band-fill is
     Task-4 JS toggling body[data-band] against the --wm-color token). ----- */
  .watermark {
    position: fixed; z-index: 2; pointer-events: none; user-select: none;
    right: clamp(12px, 3vw, 56px); bottom: clamp(12px, 4vh, 56px); left: auto; top: auto;
    width: min(40vw, 440px); color: var(--wm-color); opacity: .22;
  }
  .watermark svg { width: 100%; height: auto; display: block; }
  @media (max-width: 720px) { .watermark { width: 64vw; } }

  /* --- 13.4 Card + pillar corner-dots ------------------------------------ */
  .card, .pillar { overflow: visible; }
  .card::before, .card::after, .pillar::before, .pillar::after {
    content: ""; position: absolute; width: 9px; height: 9px; border-radius: 50%;
    background: var(--pane); border: 1px solid var(--edge-2); z-index: 4; pointer-events: none;
  }
  .pillar::before, .pillar::after { background: var(--bar); }
  .card::before, .pillar::before { top: -4px; left: -4px; }
  .card::after, .pillar::after { bottom: -4px; right: -4px; }

  /* .card-disclose > summary — the native-<details> toggle affordance for
     .card-detail (13.5 above), used by Task 9 (ServicePillars) and Task 10
     (SovereigntyPillars). Same marker convention as .qa (13-below FAQ) and
     .more: hide the browser default triangle, show a mono [+]/[–] instead.
     margin-top:auto sitzt auf .card-disclose SELBST (nicht auf summary,
     06.07. Bugfix): .card-disclose ist das direkte Flex-Kind von .card-in
     (display:flex;flex-direction:column) — margin-top:auto schiebt nur ein
     direktes Flex-Kind an den unteren Rand, auf einem verschachtelten Kind
     (summary, normaler Block-Kontext innerhalb <details>) loeste "auto" zu
     0px auf (verifiziert per getComputedStyle: "Details ansehen" lag in
     #einsatzfelder trotz gleich hoher Karten bis zu 62px auseinander). */
  .card-disclose { margin-top: auto; }
  .card-disclose > summary {
    list-style: none; cursor: pointer;
    padding-top: 1rem;
    font-family: var(--font-mono); font-size: .78rem; letter-spacing: .04em; color: var(--muted);
  }
  .card-disclose > summary::-webkit-details-marker { display: none; }
  .card-disclose > summary::before { content: "[+] "; color: var(--accent); }
  .card-disclose[open] > summary::before { content: "[–] "; }
  .card-disclose > summary:hover { color: var(--ink); }
  .card-detail {
    margin-top: 1rem;
    padding: clamp(1.4rem, 2.2vw, 2rem);
    border-radius: var(--radius-sm);
    border: 1px solid var(--edge-2);
    background: var(--box);
    background: color-mix(in srgb, var(--box) 92%, transparent);
    -webkit-backdrop-filter: blur(15px) saturate(120%);
    backdrop-filter: blur(15px) saturate(120%);
    box-shadow: 0 12px 34px -20px rgba(3, 8, 18, .5);
    display: flex; flex-direction: column; gap: 1rem;
  }
  .card-detail .card-cta { margin-top: 0; padding-top: 0; }

  /* --- 13.5b Detail-Dialog (Modal) — Progressive-Enhancement-Layer ueber
     .card-disclose/.more (JS: enhance.ts bindDetailDialog(), Task 3). Ohne
     JS bleibt <dialog> ungenutzt/inert (kein [open] wird je gesetzt) — die
     <details>/<summary>-Basis traegt die Interaktion dann allein, wie
     bisher. .qa (FAQ) ist ausdruecklich NICHT Teil dieses Musters. Siehe
     entwuerfe/_spec/detail-dialog-modal_design_2026-07-05_v1.md. --------- */
  .detail-modal {
    padding: 0; border: none; background: transparent;
    max-width: min(640px, 92vw); margin: auto;
    opacity: 0; transform: perspective(1200px) rotateX(8deg) scale(.94);
    transition: opacity var(--dur) var(--ease), transform var(--dur) var(--ease);
  }
  /* leichter 3D-Effekt beim Oeffnen (06.07., Design-Wunsch Micha): die Box
     kippt aus einer leichten Neigung (rotateX) in die flache Endposition,
     statt nur flach reinzuzoomen. perspective() steht direkt in der
     transform-Deklaration (nicht als eigene Property auf einem Vorfahren),
     weil <dialog> im Top-Layer rendert und ein Perspective-Property auf
     einem normalen Elternelement dort nicht mehr greifen wuerde. */
  .detail-modal[open] { opacity: 1; transform: perspective(1200px) rotateX(0deg) scale(1); }
  /* Design-Regel (06.07.): angeklickte Medien (Bilder/Videos, .content-shot)
     nehmen 100% der Fensterbreite ein — NUR fuer diesen Pfad, die Text-
     Detail-Box (.card-disclose/.more) bleibt bei ihrer schmaleren Breite.
     Skalierung bleibt erhalten: das Medium selbst behaelt sein eigenes
     Seitenverhaeltnis (width:100%/height:auto, s. [data-modal-body] unten),
     nur die Box darum wird breiter. */
  .detail-modal--media { max-width: 100vw; width: 100vw; }
  .detail-modal::backdrop {
    background: rgba(4, 9, 18, .6); opacity: 0;
    -webkit-backdrop-filter: blur(15px); backdrop-filter: blur(15px);
    transition: opacity var(--dur) var(--ease);
  }
  .detail-modal[open]::backdrop { opacity: 1; }
  @starting-style {
    .detail-modal[open] { opacity: 0; transform: perspective(1200px) rotateX(8deg) scale(.94); }
    .detail-modal[open]::backdrop { opacity: 0; }
  }
  .detail-modal-box {
    position: relative;
    padding: clamp(1.6rem, 3vw, 2.4rem);
    border-radius: var(--radius-sm);
    border: 1px solid var(--edge-2);
    /* <dialog> hat eine UA-Default-Textfarbe (praktisch Schwarz); ohne
       diese explizite color wuerde geklonter Inhalt ohne eigene Farbregel
       (z. B. .body, main.css:66) oder mit an .card gebundener Farbregel
       (.card .t1/.card .t2, main.css:287-288 — der .card-Vorfahre geht
       beim cloneNode(true)-Umzug in den Dialog verloren) auf dieses
       schwarze Default zurueckfallen statt auf --ink. */
    color: var(--ink);
    background: var(--box);
    background: color-mix(in srgb, var(--box) 92%, transparent);
    -webkit-backdrop-filter: blur(15px) saturate(120%);
    backdrop-filter: blur(15px) saturate(120%);
    box-shadow: 0 12px 34px -20px rgba(3, 8, 18, .5);
    max-height: 88vh; overflow-y: auto;
    display: flex; flex-direction: column; gap: 1rem;
  }
  /* .content-shot-Klick klont ein <img>/<video> in [data-modal-body] (s.
     enhance.ts bindDetailDialog()) — ohne diese Regel wuerde es an seiner
     urspruenglich inline gesetzten width/height (Astro-Attribute) kleben
     bleiben statt die Modal-Box auszufuellen; width:100%/height:auto ist
     zugleich die "Skalierung bleibt erhalten"-Regel (Seitenverhaeltnis
     unangetastet, nur die Breite skaliert mit). */
  [data-modal-body] img, [data-modal-body] video { display: block; width: 100%; height: auto; border-radius: var(--radius-sm); }
  .detail-modal-close {
    position: absolute; top: .9rem; right: .9rem;
    width: 2rem; height: 2rem; display: grid; place-items: center;
    border: 1px solid var(--edge-2); border-radius: 999px; background: transparent;
    color: var(--muted); font-size: 1.1rem; line-height: 1; cursor: pointer;
    transition: color var(--dur) var(--ease), border-color var(--dur) var(--ease);
  }
  .detail-modal-close:hover { color: var(--ink); border-color: var(--ink); }
  @media (prefers-reduced-motion: reduce) {
    .detail-modal, .detail-modal::backdrop { transition: none; }
  }
  @keyframes bn-draw { from { stroke-dashoffset: 300; } to { stroke-dashoffset: 0; } }
  @keyframes bn-march { to { stroke-dashoffset: -90; } }
  @keyframes bn-pop { from { opacity: 0; transform: scale(.3); } to { opacity: 1; transform: none; } }
  @keyframes bn-pulse { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.06); } }
  @keyframes e5-stream { from { background-position: 0 0, 0 0; } to { background-position: 320px 0, -320px 0; } }

  /* --- 13.9 Scroll reveal (gentle motion; only active when JS present) --- */
  html.js .reveal { opacity: 0; transform: translateY(20px); transition: opacity .7s var(--ease), transform .7s var(--ease); }
  html.js .reveal.in { opacity: 1; transform: none; }
  @media (prefers-reduced-motion: reduce) { html.js .reveal { opacity: 1; transform: none; } }

  /* --- 13.10 Buttons — base.css's .btn-ghost above is only a modifier (no
     display/padding/radius on its own); this makes it self-sufficient and
     aligns both buttons to the enlarged (13.1) body-copy scale. ----------- */
  .btn-ghost {
    display: inline-flex; align-items: center; gap: .5em;
    font-family: var(--font); font-weight: 600; letter-spacing: .01em;
    padding: .72em 1.2em; border-radius: var(--radius-sm);
  }
  .btn, .btn-ghost { font-size: 1.02rem; line-height: 1.1; }

  /* --- 13.11 Nav CI-colour hover ------------------------------------------
     Selectors reconciled (Task 5) to Header.astro's real Astro routes
     (getSite().nav: home→"/", bloodhawk→"/bloodhawk", cernavis→"/cernavis";
     faq keeps the neutral default hover from 13.x above, no CI-colour). */
  .nav-links a[href="/"]:hover { background: rgba(234, 240, 247, .12); color: var(--ink); }
  .nav-links a[href="/bloodhawk"]:hover { background: rgba(201, 162, 75, .22); color: var(--ink); }
  .nav-links a[href="/bloodhawk"]:hover::before { color: var(--gold); }
  .nav-links a[href="/cernavis"]:hover { background: rgba(43, 179, 107, .22); color: var(--ink); }
  .nav-links a[href="/cernavis"]:hover::before { color: var(--green); }

  /* --- 13.12 Frosted content boxes (PERF-01/02: rationed) -----------------
     E5's catch-all applied backdrop-filter to every bordered box, including
     grid-repeated ones (.card/.pillar/.cap/.road li) that can all be on
     screen simultaneously — many concurrent blurs during scroll. Keep the
     frosted treatment only on the few, mostly single-instance "workspace"
     panels; grid/list items keep their own solid token background (set
     above), which already reads fine without blur. Fixed 15px blur. ------- */
  .frame,
  .pane, .viz, .readout, .tabpanel, .tbl-wrap {
    background: var(--box);
    background: color-mix(in srgb, var(--box) 70%, transparent);
    -webkit-backdrop-filter: blur(15px) saturate(115%);
    backdrop-filter: blur(15px) saturate(115%);
  }

  /* =====================================================================
     14 · PRINT + PERF-05 (Task 13)
     ===================================================================== */

  /* --- 14.1 Print — the interactive header chrome (brand link, nav links,
     "Erstgespräch anfragen" CTA, language switcher) plus the decorative
     scan/watermark and the aria-hidden feedbar don't belong on a printed
     page (standard print practice: strip navigation/chrome, keep content);
     the console-styled interactive panes/cards/figures are content and
     should not split mid-box across a page break. ------------------------ */
  @media print {
    .chrome, .scan, .watermark, .feedbar { display: none; }
    .pane, .card, .viz { break-inside: avoid; }
  }

}

@layer utilities {
  /* Ersetzen die E5-Inline-Styles (0 style= im Output): margin-top-Stufen,
     align-items auf .grid, max-width:Nch (measure-24/32), color+font-size (t1--ink). */
  .mt-1 { margin-top: 1rem; }
  .grid--start { align-items: start; }
  .measure-24 { max-width: 24ch; } .measure-32 { max-width: 32ch; } .measure-64 { max-width: 64ch; }
  .t1--ink { color: var(--ink); font-size: 1.06rem; text-transform: uppercase; }
  .skip { position: absolute; left: -9999px; top: 0; background: var(--ink); color: var(--navy); padding: .6em 1em; z-index: 1000; }
  .skip:focus { left: 8px; top: 8px; }
}

/* Hero-Zitat — 25px unter der h1, zentriert. */
.hero-quote {
  margin: 25px auto 0;
  max-width: 52ch;
  text-align: center;
  border: 0;
}
.hero-quote p {
  /* font-size kommt bewusst aus .lead (Absatz danach) — nicht ueberschreiben. */
  margin: 0;
  font-style: italic;
  color: var(--ink);
}
.hero-quote cite {
  display: block;
  margin-top: .6rem;
  font-style: normal;
  font-family: var(--font-mono);
  font-size: .78rem;
  letter-spacing: .06em;
  color: var(--accent);
}

/* Hero-Zusatzblock (Audience Analysis / Nutzen / Quellen) — 25px unter den Leads. */
.hero-more { margin-top: 25px; }

/* Quellen-/Plattform-Badges (Vorbild: rundes Farb-Icon + Label darunter, zentriert). */
.src-grid {
  margin: 1.8rem auto;
  display: flex;
  flex-direction: column;
  gap: 1.7rem;
  align-items: center;
}
.src-row {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 1.4rem 2.6rem;
  margin: 0;
  padding: 0;
  list-style: none;
}
.src-item {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: .7rem;
  width: 6rem;
}
.src-item img {
  width: clamp(50px, 5.4vw, 68px);
  height: auto;
}
.src-label {
  font-family: var(--font);
  font-weight: 600;
  font-size: .95rem;
  line-height: 1.15;
  color: var(--ink);
  text-align: center;
}

/* Ab "Nutzen" bricht der Text aus dem Console-Pane aus -> direkt auf Navy,
   80% Fensterbreite, Text nutzt die volle Breite (max-width der Leads aufgehoben). */
.hero-out {
  width: 80%;
  max-width: 1700px;            /* deckelt sehr lange Zeilen auf Ultrawide (greift erst >~2100px) */
  margin: 4rem auto 0;          /* Abstand ueber Nutzen verdoppelt (2rem -> 4rem) */
}
.hero-out .hero-lead,
.hero-out .hero-sources { max-width: none; }

/* Nutzen als Zwei-Spalten-Block: Bild links, Text rechts (Vorbild #analysiert). */
.hero-split {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  gap: clamp(1.5rem, 3.5vw, 3.5rem);
  align-items: center;
  margin-bottom: 2.8rem;
}
.hero-split-media .content-shot { display: block; width: 100%; padding: 0; }
.hero-split-media img { width: 100%; height: auto; border-radius: 14px; }
.hero-split-h {
  margin: .4rem 0 1.1rem;
  font-family: var(--font);
  font-weight: 700;
  font-size: clamp(1.9rem, 3vw, 2.7rem);
  line-height: 1.08;
  color: var(--ink);
}
.hero-split-text .body { max-width: none; }
@media (max-width: 760px) {
  .hero-split { grid-template-columns: 1fr; }
}
/* Tail "Bloodhawk liefert Fakten" — Sektions-Kopf-Stil (Vorbild #zusammenarbeit),
   in .wrap eingerueckt wie #zusammenarbeit (gleicher linker Rand). */
.hero-tail { margin-top: 3rem; }
.hero-tail .hero-cta { margin-top: 1.6rem; }
.hero-tail-wrap { padding-bottom: 3.5rem; }  /* Abstand unter den CTA-Buttons verdoppelt (+56px zur UI-Shot-margin) */

/* Pricing-Zusatzzeilen (optionaler Add-on-Preis je Karte + globale USt-Fussnote). */
.tier-opt { margin-top: .9rem; font-size: .85rem; color: var(--muted); }
.tier-note { margin-top: 1.7rem; font-size: .85rem; color: var(--muted); }

/* Quellen-Link (externe Zitat-Referenz) im gedaempften Stil sichtbar machen. */
.hero-sources a { color: inherit; text-decoration: underline; text-underline-offset: 2px; }
.hero-sources a:hover { color: var(--ink); }

/* Halbfett (semibold) — Betonung einzelner Kern-Saetze im Fliesstext. */
.hb { font-weight: 600; }
.hero-sources {
  margin: 0;
  max-width: 64ch;
  font-family: var(--font-mono);
  font-size: .8rem;
  line-height: 1.5;
  color: var(--muted);
}

/* 404-Seite (404.html) — zentrierter, ruhiger Block. */
.e404 { min-height: 62vh; display: grid; place-content: center; text-align: center; gap: 1rem; }
.e404-code { font-family: var(--font-mono); color: var(--bloodhawk); letter-spacing: .12em; margin: 0; }
