/**
 * Ignite — Component Classes (c-*)
 * Werte 1:1 aus Figma (Node 13674:15476 „04 Funding Programs // Section" via get_design_context
 * + Design-Kit-Variablen). Konvention: c-Präfix, BEM-Modifier. Motion (GSAP) folgt später.
 *
 * Farbtokens (Figma Semantics):
 *   text-primary #1e063d · text-secondary #786a8b · text-alternate #f8fafc
 *   text-quarternary #e2e8f0 · text-quinary(mint) #0aebbf · text-accent(violett) #753bbd
 *   bg-primary #fff · bg-tertiary #f1f5f9 · bg-quarternary(mint) #0aebbf · bg-alternate #1e063d
 */

/* Margin-Reset lebt global in style.css (`*, *::before, *::after { margin: 0 }`) — hier bewusst
   keine per-Komponenten-Liste mehr. Abstände ausschließlich über `gap`. */

/* ============================================================= Buttons (exakt, Node 11202:6280)
   Base: min-h 44, py 12, Pill, Open Sans Medium 12/12 tracking .12px, Border 1px.
   Ohne Icon: gap 12, px 20. Mit Icon (.c-btn--has-icon): gap 10, pl 20 / pr 12. Icon 20px. */
.c-btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 0.75rem;
  /* 🔴 Der Rahmen wird aus dem Innenabstand herausgerechnet. Figmas Strich liegt INNEN und
     zaehlt nicht zur Groesse; `box-sizing: border-box` zaehlt ihn mit. Ohne den Abzug ist jeder
     Button 48 statt 46 hoch und 190 statt 188 breit — an derselben Stelle stand der Fehler schon
     bei der Navbar-Pille. Der Term steht ausgeschrieben, damit die 12/20 aus dem Node lesbar
     bleiben statt als 11/19 zu erscheinen. */
  --btn-strich: 0.0625rem;
  min-height: 2.75rem;
  padding: calc(0.75rem - var(--btn-strich)) calc(1.25rem - var(--btn-strich));
  border-radius: 62.5rem; border: var(--btn-strich) solid transparent;
  /* 🔴 14/22 ls 0 — auf BEIDEN Leinwaenden. Hier stand bis 2026-08-12 12/12 mit +0,12 Tracking;
     das war an keinem Node belegt. Nachgemessen an vier unabhaengigen Stellen, alle identisch:
     Startseite-CTA Desktop (13818:30283 Primary 188x46 / Secondary 304x46), Funding mobil
     (14077:35075), Weiteres Management mobil (14304:34557), Navbar-Fuss (14077:34843).
     Die Hoehe 46 ergibt sich damit von selbst (12 + 22 + 12) — vorher trug sie `min-height: 44`. */
  font-family: var(--u-font-body); font-weight: 500;
  font-size: 0.875rem; line-height: 1.375rem; letter-spacing: 0;
  white-space: nowrap; text-decoration: none; cursor: pointer; transition: background-color var(--u-dur-fast) var(--u-ease), color var(--u-dur-fast) var(--u-ease), border-color var(--u-dur-fast) var(--u-ease);
}
.c-btn__icon { width: 1.25rem; height: 1.25rem; flex: 0 0 auto; }
.c-btn--has-icon { gap: 0.625rem;
  padding-left: calc(1.25rem - var(--btn-strich)); padding-right: calc(0.75rem - var(--btn-strich)); }

/* ---- Fill-Hover (Agentur-Standard, animation.md §Button-Fill) -----------------------------
   Die Fuellflaeche wird von anim.js injiziert und per GSAP in X skaliert — sie waechst von der
   Seite, an der der Cursor eintritt, und zieht sich zur Austrittsseite zurueck.

   Warum ein eigenes Element statt `background-position` oder einem Gradient: nur so laesst sich
   der Ursprung pro Hover umsetzen. Ein Gradient-Trick kann immer nur EINE Richtung.

   `isolation: isolate` ist Pflicht — der Fill liegt auf z-index:-1, ohne eigenen Stacking-Context
   wuerde er hinter den Sektionshintergrund rutschen statt hinter den Button-Text.

   🔴 `overflow: hidden` ist ebenfalls Pflicht, und der Fill darf KEINEN eigenen Radius tragen.
   Erster Versuch war `border-radius: inherit` ohne `overflow` — gemessen sass der Fill zwar in
   jeder Phase inhalb der Bounding-Box (ueberall -0.5px), sah aber trotzdem kaputt aus: der
   geerbte Radius wird von `scaleX` MIT gestaucht, die runden Enden werden zu schmalen Ellipsen
   und folgen der Pillen-Kontur des Buttons nicht mehr. Die Bounding-Box haelt ihn, die
   Silhouette nicht — ein Rechteck-Check findet das nie, nur das Clipping am Elternteil loest es.
   (Die Sorge, `overflow` breche `position: sticky`, gilt nur fuer sticky NACHFAHREN — ein Button
   hat keine. War hier ein Fehlschluss.) */
.c-btn { position: relative; isolation: isolate; overflow: hidden; }
.c-btn__fill {
  position: absolute; inset: 0; z-index: -1; border-radius: 0;
  transform: scaleX(0); transform-origin: left center; pointer-events: none;
  will-change: transform;
}
/* Text-Varianten fuellen NICHT — die bekommen den Unterstrich-Reveal (animation.md §Underline).
   🔴 Und sie duerfen NICHT clippen: der Unterstrich sitzt per `bottom: -0.125rem` bewusst
   UNTERHALB der Box. Mit dem geerbten `overflow: hidden` (das nur der Fill braucht) wurde er
   vollstaendig weggeschnitten — sichtbar war dann nur noch der Pfeil-Kreis, weil der innerhalb
   der Box liegt. Gemeldet 2026-08-05 an den Blog-Karten. */
.c-btn--tertiary, .c-btn--menu, .c-card__link { overflow: visible; }
.c-btn--tertiary .c-btn__fill, .c-btn--menu .c-btn__fill, .c-card__link .c-btn__fill { display: none; }

/* Primary — 4 Fills */
.c-btn--mint   { background: var(--wp--preset--color--accent); border-color: var(--wp--preset--color--accent); color: var(--wp--preset--color--text-primary); }
.c-btn--purple { background: var(--wp--preset--color--text-primary); border-color: var(--wp--preset--color--text-primary); color: var(--wp--preset--color--text-alternate); }
.c-btn--grey   { background: var(--wp--preset--color--bg-tertiary); border-color: var(--wp--preset--color--border-tertiary); color: var(--wp--preset--color--text-primary); }
.c-btn--blur   { background: rgba(71,85,105,0.01); border-color: rgba(251,251,251,0.1); color: var(--wp--preset--color--text-alternate);
  backdrop-filter: blur(5rem); -webkit-backdrop-filter: blur(5rem); }
/* Secondary — transparent, heller Border (#e2e8f0), dunkler Text */
.c-btn--secondary { background: transparent; border-color: var(--wp--preset--color--border-tertiary); color: var(--wp--preset--color--text-primary); }

/* ---- Hover-Farbregeln (User-Vorgabe 2026-08-05) ----
   Mint → Purple mit weissem Content · Purple → Mint · Grey/transparent/Secondary → Mint mit
   purple Content. Der Border wandert mit der Fuellfarbe, sonst bleibt ein Rand der alten Farbe
   stehen, waehrend die Flaeche schon umgeschlagen ist. */
/* Mint auf DUNKLEM Grund fuellt WEISS statt purple (User 2026-08-05): auf einer dunklen Flaeche
   verschwindet die purple Fuellung fast im Untergrund, der Button sieht im Hover ausgegraut aus
   statt hervorgehoben.

   🔴 Das laeuft ueber zwei VERERBTE Variablen, nicht ueber einen Selektor am Button. Vorher
   zaehlte ein `:is(…)`-Vorspann die dunklen Sektionen direkt vor `.c-btn--mint` auf — und war
   prompt unvollstaendig: `.c-highlights` (dunkles Bild unter dem Inhalt) und die dunkle
   Statistik-Karte `.c-stat` fehlten, nachgemessen ueber alle Seiten (User 2026-08-07: „ich
   glaube du hast nicht alle erwischt"). Mit Variablen erbt jeder Mint-Button die Werte seiner
   Umgebung, egal wie tief er darin sitzt, und eine neue dunkle Flaeche braucht genau EINE Zeile
   in der Liste unten statt einer Erweiterung mehrerer Selektoren.
   Nebeneffekt: kein Spezifitaets-Wettlauf mehr — die Basisregel liest nur die Variable. */
.c-btn--mint .c-btn__fill { background: var(--u-mint-fill, var(--wp--preset--color--text-primary)); }
.c-btn--mint:hover {
  color:        var(--u-mint-fill-text, var(--wp--preset--color--text-alternate));
  border-color: var(--u-mint-fill,      var(--wp--preset--color--text-primary));
}

/* Die dunklen Flaechen. `.c-hero:has(.c-hero__bg)` statt einer Varianten-Liste: das Bild ist das
   Merkmal, und es fehlt genau dem hellen `--overview`-Hero (nachgemessen). Bei `.c-highlights`
   und `.c-interrupter` liegt die dunkle Ebene als Overlay UNTER dem Inhalt, nicht als
   Hintergrund eines Vorfahren — deshalb waren sie mit blossem Hochlaufen der Elternkette nicht
   zu finden; gemessen wurde ueber `elementsFromPoint` neben dem Button. */
.c-hero:has(.c-hero__bg),
.c-hero--locations,
.c-ctaband,
.c-interrupter,
.c-highlights,
.c-stat,
.c-card--dark,
.c-card--darkgrey,
.c-advantage__card--darkgrey {
  --u-mint-fill:      var(--wp--preset--color--text-alternate);
  --u-mint-fill-text: var(--wp--preset--color--text-primary);
}

.c-btn--purple .c-btn__fill { background: var(--wp--preset--color--accent); }
.c-btn--purple:hover         { color: var(--wp--preset--color--text-primary); border-color: var(--wp--preset--color--accent); }

.c-btn--grey   .c-btn__fill { background: var(--wp--preset--color--accent); }
.c-btn--grey:hover           { color: var(--wp--preset--color--text-primary); border-color: var(--wp--preset--color--accent); }

.c-btn--blur   .c-btn__fill { background: var(--wp--preset--color--accent); }
.c-btn--blur:hover           { color: var(--wp--preset--color--text-primary); border-color: var(--wp--preset--color--accent); }

.c-btn--secondary .c-btn__fill { background: var(--wp--preset--color--accent); }
.c-btn--secondary:hover        { color: var(--wp--preset--color--text-primary); border-color: var(--wp--preset--color--accent); }
/* Auf dunklem Grund traegt der Secondary hellen Text — im Hover steht er aber auf Mint. */
.c-btn--secondary.c-btn--on-dark:hover { color: var(--wp--preset--color--text-primary); }
/* Kontext-Modifier (Muster wie .c-btn--tertiary.c-btn--on-light): auf dunklem Grund traegt der
   Secondary den Text in text-quarternary statt text-primary — sonst unlesbar. */
.c-btn--secondary.c-btn--on-dark { color: var(--wp--preset--color--text-quarternary); }
.c-btn[disabled], .c-btn--disabled { opacity: .4; pointer-events: none; }

/* Tertiary / Text-Link (auch Card-Link): kein bg, 14/22, gap 10, Icon 20, Default mint (#0aebbf) */
.c-btn--tertiary, .c-card__link {
  display: inline-flex; align-items: center; gap: 0.625rem;
  min-height: auto; padding: 0; background: none; border: none; border-radius: 0;
  font-family: var(--u-font-body); font-weight: 500; font-size: 0.875rem; line-height: 1.375rem; letter-spacing: 0;
  white-space: nowrap; text-decoration: none; color: var(--wp--preset--color--accent); cursor: pointer;
}
/* Tertiary-Link: Farbe ist KONTEXTUELL (Figma: mint auf dunkel · violett auf hell · dunkel auf mint).
   Als Modifier statt Inline-Style, damit der Styleguide keine Hex-Werte im Markup trägt. */
.c-btn--tertiary.c-btn--on-light { color: var(--wp--preset--color--text-accent); }
.c-btn--tertiary.c-btn--on-mint  { color: var(--wp--preset--color--text-primary); }

/* Menu — weißer Text (dunkle Nav), Chevron-Down, animierter Unterstrich (Slide-in bei Hover) */
.c-btn--menu {
  display: inline-flex; align-items: center; gap: 0.25rem; padding: 0.25rem 0;
  min-height: auto; background: none; border: none; border-radius: 0; position: relative;
  font-family: var(--u-font-body); font-weight: 500; font-size: 0.875rem; line-height: 1.375rem; color: var(--wp--preset--color--text-alternate);
  text-decoration: none; cursor: pointer;
}
.c-btn--menu::after { content: ""; position: absolute; left: 0; right: 100%; bottom: 0; height: 0.0625rem; background: currentColor; transition: right var(--u-dur-fast) var(--u-ease); }
.c-btn--menu:hover::after { right: 0; }

/* ---- Unterstrich-Reveal, beidseitig (animation.md §Underline) -----------------------------
   Die Linie ist ein echtes Element (nicht `::after`), weil GSAP den Ursprung pro Hover setzen
   muss — ein Pseudo-Element ist fuer GSAP nicht adressierbar, und `::after` kann per CSS immer
   nur EINE Richtung. Sitzt im `.c-link__label`, damit sie nur unter dem Text laeuft und nicht
   unter einem nachgestellten Pfeil-Icon.

   `has-underline-js` wird von anim-links.js gesetzt und schaltet die alten `::after`-Unterstriche
   ab — sonst laegen zwei Linien uebereinander. */
.c-link__label { position: relative; display: inline; }
.c-link__line {
  position: absolute; left: 0; right: 0; bottom: -0.125rem;
  /* `max(1px, …)`: die Root-Font-Size skaliert fluid mit dem Viewport, dadurch faellt
     0.0625rem auf kleineren Breiten unter ein Geraetepixel und der Browser zeichnet die Linie
     nur noch blass antialiased. Ein Unterstrich muss aber immer voll deckend sein. */
  height: max(1px, 0.0625rem);
  background: currentColor; transform: scaleX(0); transform-origin: left center;
  pointer-events: none;
}
.has-underline-js::after { display: none !important; }
/* Footer-Links: KEIN Mint-Hover mehr (User 2026-08-05) — der Unterstrich-Reveal ersetzt ihn.
   Die drei `:hover { color: accent }`-Regeln sind entfernt statt ueberschrieben: sie standen im
   Stylesheet SPAETER und haetten einen Override bei gleicher Spezifitaet geschlagen. */

/* ============================================================= Tags
   pad 8/10, radius 4, Open Sans Medium 12/12 uppercase. Zwei Tönungen. */
.c-tag {
  display: inline-flex; align-items: center; justify-content: center;
  padding: 0.5rem 0.625rem; border-radius: 0.25rem; border: 0.0625rem solid transparent;
  font-family: var(--u-font-body); font-weight: 500; font-size: 0.75rem; line-height: 0.75rem;
  text-transform: uppercase; letter-spacing: 0; white-space: nowrap;
}
/* 5 Varianten (Node 11202 Components → Tags). Struktur identisch, nur Farbe. */
.c-tag--mint  { background: rgba(7,235,191,.1); border-color: rgba(7,235,191,.15); color: var(--wp--preset--color--accent); } /* soft mint */
.c-tag--dark  { background: rgba(30,6,61,.1);   border-color: rgba(30,6,61,.1);    color: var(--wp--preset--color--text-primary); } /* purple-grey tint */
.c-tag--grey  { background: var(--wp--preset--color--bg-tertiary);            border-color: var(--wp--preset--color--border-tertiary);             color: var(--wp--preset--color--text-primary); } /* neutral grey */
.c-tag--ghost { background: transparent;        border-color: transparent;         color: var(--wp--preset--color--text-primary); } /* nur Text */
.c-tag--solid { background: var(--wp--preset--color--accent);            border-color: var(--wp--preset--color--accent);             color: var(--wp--preset--color--text-primary); } /* solid mint */

/* ============================================================= Card
   pad 26, radius 8, quadratisch, justify-between; Container-gap 40, Text-gap 10;
   Headline H3 36/44 -0.0675rem; Subtitle 16/24 semibold -.48; Body 16/24 -.48; Meta 14/22 gap 6. */
/* Keine max-width: die Card füllt ihre Grid-Zelle. Maßgeblich sind (1) die Aspect Ratio und
   (2) über wie viele Spalten sie im jeweiligen Kontext gelegt wird — nicht eine fixe Breite. */
.c-card {
  display: flex; flex-direction: column; justify-content: space-between;
  padding: 1.625rem; border-radius: 0.5rem; border: 0.0625rem solid transparent; overflow: hidden;
  background: var(--wp--preset--color--bg-tertiary); color: var(--wp--preset--color--text-primary); aspect-ratio: 1 / 1; min-width: 0;
}
.c-card__container { display: flex; flex-direction: column; gap: 2.5rem; width: 100%; }
.c-card__head { display: flex; flex-wrap: wrap; align-items: center; gap: 0.625rem; width: 100%; }
.c-card__meta { display: flex; flex-wrap: wrap; align-items: center; gap: 0.375rem;
  font-family: var(--u-font-body); font-weight: 500; font-size: 0.875rem; line-height: 1.375rem; }
.c-card__text { display: flex; flex-direction: column; gap: 0.625rem; width: 100%; }
.c-card__headline { font-family: var(--u-font-heading); font-weight: 500; font-size: 2.25rem; line-height: 2.75rem; letter-spacing: -0.0675rem; }
.c-card__subtitle { font-family: var(--u-font-body); font-weight: 700;   /* Figma: 700, nicht 600 (Font-Audit 13.08.) */ font-size: 1rem; line-height: 1.5rem; letter-spacing: -0.03rem; }
.c-card__body { font-family: var(--u-font-body); font-weight: 400; font-size: 1rem; line-height: 1.5rem; letter-spacing: -0.03rem; }
.c-card__image { width: 100%; height: 100%; object-fit: cover; border-radius: 0.5rem; display: block; }

.c-card--dark  { background: var(--wp--preset--color--text-primary); border-color: rgba(30,6,61,.4); color: var(--wp--preset--color--text-alternate); }
.c-card--dark  .c-card__meta { color: var(--wp--preset--color--border-tertiary); }
.c-card--dark  .c-card__body { opacity: .8; }
.c-card--dark  .c-card__link { color: var(--wp--preset--color--accent); }
.c-card--light { background: var(--wp--preset--color--bg-tertiary); border-color: rgba(226,232,240,.4); color: var(--wp--preset--color--text-primary); }
.c-card--light .c-card__body { color: var(--wp--preset--color--text-secondary); }
.c-card--light .c-card__link { color: var(--wp--preset--color--text-accent); }
.c-card--mint  { background: var(--wp--preset--color--accent); border-color: rgba(10,235,191,.4); color: var(--wp--preset--color--text-primary); }
.c-card--mint  .c-card__body { opacity: .6; }
.c-card--mint  .c-card__link { color: var(--wp--preset--color--text-primary); }
.c-card--image { padding: 0; border: none; background: none; }
.c-card--white { background: var(--wp--preset--color--bg-primary); border-color: var(--wp--preset--color--border-tertiary); color: var(--wp--preset--color--text-primary); }
.c-card--white .c-card__body { color: var(--wp--preset--color--text-secondary); }
.c-card--white .c-card__link { color: var(--wp--preset--color--text-accent); }
.c-card--darkgrey { background: var(--wp--preset--color--surface-darkgrey); border-color: var(--wp--preset--color--surface-darkgrey); color: var(--wp--preset--color--text-alternate); }
.c-card--darkgrey .c-card__meta { color: var(--wp--preset--color--border-tertiary); }
.c-card--darkgrey .c-card__body { opacity: .8; }
.c-card--darkgrey .c-card__link { color: var(--wp--preset--color--accent); }
.c-card--darkgrey .c-card__icon { background: rgba(255,255,255,.12); color: #fff; }

/* ---- Card-Modifier: 3 saubere Achsen, nie Inhaltstyp ----
   FARBE   : --dark · --darkgrey · --mint · --light · --white
   FORMAT  : (default = 1:1 Square) · --portrait (4:5) · --row (horizontal)
   VARIANTE: --image (nur Bild) · --compact (engere Gaps, z.B. Förderprogramm) */
.c-card--portrait { aspect-ratio: 4 / 5; }

/* Icon-Kreis (Förderscan / Förderprogramm) */
.c-card__icon { width: 2.5rem; height: 2.5rem; flex: 0 0 auto; border-radius: 62.5rem;
  display: inline-flex; align-items: center; justify-content: center; background: var(--wp--preset--color--accent); color: var(--wp--preset--color--text-primary); }
.c-card__icon .c-btn__icon { width: 1.25rem; height: 1.25rem; }
.c-card--dark .c-card__icon { background: rgba(255,255,255,.12); color: #fff; }
.c-card__headline--sm { font-size: 1.5rem; line-height: 1.75rem; }   /* Förderscan */

/* VARIANTE --compact: engere Gaps (z.B. Förderprogramm-Card: mehrere Tags + Icon + Heading + Text + Link).
   Kombiniert mit --portrait für 4:5. Ersetzt das frühere --foerder (Inhaltstyp im Format-Modifier). */
.c-card--compact .c-card__head { gap: 0.375rem; }
.c-card--compact .c-card__container { gap: 1.25rem; }

/* FORMAT --row: horizontal (Bild links + Content rechts). Ersetzt das frühere --ressource. */
/* Querformat ohne Bild (Foerderprogramm-Karte, Node 13684:17722): 648 x 393,33.
   NICHT .c-card--row — das ist die horizontale BILD-Karte. Body ist hier 18/26 statt 16/24. */
.c-card--wide { aspect-ratio: 648 / 393.33; }
.c-card--wide .c-card__body { font-size: var(--u-fs-body-medium); line-height: 1.625rem; letter-spacing: -0.03375rem; }
.c-card__tags { display: flex; flex-wrap: wrap; align-items: flex-start; gap: 0.5rem; }   /* 8 */

.c-card--row { flex-direction: row; aspect-ratio: auto; gap: 1.25rem; align-items: stretch; padding: 1rem; max-width: none; }
.c-card--row .c-card__image { width: 40%; min-height: 12rem; border-radius: 0.375rem; }
.c-card--row .c-card__container { flex: 1; gap: 1rem; justify-content: center; }
.c-card--row .c-card__headline { font-size: 1.25rem; line-height: 1.5rem; letter-spacing: -0.03rem; }

/* ============================================================= Interactive Elements */
.c-check { display: inline-flex; align-items: center; gap: .5rem; font-size: 0.875rem; color: var(--wp--preset--color--text-primary); cursor: pointer; }
/* `.c-check__input` ist der Hook fuer Kontexte OHNE `.c-check`-Wrapper (z.B. die Consent-Zeile
   im Kontaktformular, die ihr eigenes Flex-Layout mitbringt). */
.c-check input, .c-check__input { position: absolute; opacity: 0; width: 0; height: 0; }
.c-check__box { width: 1.25rem; height: 1.25rem; flex: 0 0 auto; border: 0.09375rem solid var(--wp--preset--color--border-tertiary); border-radius: 0.375rem;
  display: inline-flex; align-items: center; justify-content: center; color: var(--wp--preset--color--text-primary); transition: background var(--u-dur-fast) var(--u-ease), border-color var(--u-dur-fast) var(--u-ease); }
/* Checkmark nur im Checked-Zustand sichtbar; Box wird mint, Haken dunkel.
   Der Haken selbst kommt 1:1 aus dem Figma-Checkbox-Node (11202:6368) — dort ist er flacher und
   breiter als der frueher genutzte. Strichbreite 1 statt der Icon-Standardbreite 1,25, ebenfalls
   wie im Node; deshalb hier ueberschrieben statt im Icon-Helfer. */
.c-check__box svg { width: 1.25rem; height: 1.25rem; opacity: 0; stroke-width: 1; transition: opacity var(--u-dur-fast) var(--u-ease); }
.c-check input:checked + .c-check__box,
.c-check__input:checked + .c-check__box { background: var(--wp--preset--color--accent); border-color: var(--wp--preset--color--accent); }
.c-check input:checked + .c-check__box svg,
.c-check__input:checked + .c-check__box svg { opacity: 1; }
/* Fehlerzustand wie bei den uebrigen Feldern (roter Rahmen) — die Validierung setzt aria-invalid. */
.c-check__input[aria-invalid="true"] + .c-check__box { border-color: var(--wp--preset--color--status-error); }
/* Radio: runde Box, im Checked-Zustand mint mit dunklem Punkt */
.c-check--radio .c-check__box { border-radius: 62.5rem; }
.c-check--radio .c-check__box::after { content: ""; width: 0.5rem; height: 0.5rem; border-radius: 62.5rem; background: var(--wp--preset--color--text-primary); opacity: 0; transition: opacity var(--u-dur-fast) var(--u-ease); }
.c-check--radio input:checked + .c-check__box { background: var(--wp--preset--color--accent); border-color: var(--wp--preset--color--accent); }
.c-check--radio input:checked + .c-check__box::after { opacity: 1; }
.c-toggle { position: relative; width: 2.75rem; height: 1.5rem; border-radius: 62.4375rem; background: var(--wp--preset--color--border-tertiary); transition: background var(--u-dur-fast) var(--u-ease); cursor: pointer; display: inline-block; }
.c-toggle__knob { position: absolute; top: 0.125rem; left: 0.125rem; width: 1.25rem; height: 1.25rem; border-radius: 62.4375rem; background: #fff; transition: transform var(--u-dur-fast) var(--u-ease); }
.c-toggle--on { background: var(--wp--preset--color--text-primary); }
.c-toggle--on .c-toggle__knob { transform: translateX(1.25rem); }

/* ============================================================= Pagination (Figma-Referenz)
   Runde Items (40px), Prev/Next-Pfeile; Active = helle Grau-Fläche (#e2e8f0), dunkler Text. */
.c-pagination { display: inline-flex; align-items: center; gap: 0.25rem; }
.c-pagination__item { width: 2.5rem; height: 2.5rem; padding: 0; flex: 0 0 auto; border-radius: 62.5rem;
  display: inline-flex; align-items: center; justify-content: center;
  font-family: var(--u-font-body); font-size: 0.875rem; color: var(--wp--preset--color--text-primary); background: none; border: none; text-decoration: none; cursor: pointer; }
.c-pagination__item .c-btn__icon { width: 1.25rem; height: 1.25rem; }
/* Fill-Hover, beidseitig — dieselbe Mechanik wie an den Buttons.
   Diese Komponente ist seit 2026-08-07 die EINZIGE Paginierung im Projekt: der Artikel-Browser
   rendert sie mit, sein eigenes `.c-articles__page` ist entfallen. Vorher liefen zwei
   Implementierungen mit eigenem Radius, eigenem Aktiv-Zustand und eigenem Hover nebeneinander —
   und der Fill hing nur an der unsichtbaren von beiden.
   `isolation` und `overflow` sind Pflicht, der Fill traegt keinen eigenen Radius; die Ziffer ist
   ein Textknoten und bleibt dank z-index:-1 ohne Wrapper obenauf. */
.c-pagination__item { position: relative; isolation: isolate; overflow: hidden;
  transition: color var(--u-dur-base) var(--u-ease), background-color var(--u-dur-base) var(--u-ease); }
.c-pagination__item .c-btn__fill { background: var(--wp--preset--color--text-primary); }
.c-pagination__item:not(.c-pagination__item--current):not(.c-pagination__item--disabled):hover,
.c-pagination__item:not(.c-pagination__item--current):not(.c-pagination__item--disabled):focus-visible {
  color: var(--wp--preset--color--text-alternate);
}
/* Grundzustand ohne JS — `has-fill-js` setzt anim-buttons.js an jedem verdrahteten Element. */
.c-pagination__item:not(.has-fill-js):not(.c-pagination__item--current):hover {
  background: var(--wp--preset--color--bg-tertiary);
}
.c-pagination__item--current { background: var(--wp--preset--color--border-tertiary); color: var(--wp--preset--color--text-primary); font-weight: 500; }   /* war 600 — existiert in Figma nicht */
.c-pagination__item--disabled { color: var(--wp--preset--color--text-disabled); pointer-events: none; }
/* „…" ist eine Auslassung, kein Ziel: kein Zeiger, kein Hover, kein Fill (JS ueberspringt es). */
.c-pagination__item--gap { color: var(--wp--preset--color--text-tertiary); cursor: default; pointer-events: none; }

/* ============================================================= Slider-Nav (Karussell prev/next)
   Runde Icon-Buttons (44px) in 3 Zuständen × 2 Richtungen. */
/* Slider-Pfeile — Zustaende gegen die Figma-Instanzen geprueft (Blog-Teaser, Concept-File
   13690:2756 = inaktiv / 13690:2757 = aktiv). 44x44, voll rund, Icon 20 — das stimmte bereits.
   Falsch waren die beiden FLAECHEN-Zustaende (Backlog #26):
     aktiv    Figma fill #f1f5f9 + Rand #e2e8f0   — unser Rand war `transparent`
     inaktiv  Figma OHNE Fill    + Rand #e2e8f0   — unserer war #f8fafc mit Rand #f1f5f9,
              sah dadurch aus wie eine zweite gefuellte Taste statt wie ein leerer Umriss
   Der Methodik-Override (`.c-methodik__nav`) hatte den inaktiven Zustand schon richtig; die
   Basis zieht jetzt nach. Sein Frosted-Glass fuer den AKTIVEN Zustand bleibt noetig und
   unangetastet: auf dem grauen Panel wuerde ein #f1f5f9-Grund verschwinden. */
.c-slidernav { display: inline-flex; align-items: center; justify-content: center; flex: 0 0 auto; padding: 0;
  width: 2.75rem; height: 2.75rem; border-radius: 62.5rem;
  border: 0.0625rem solid var(--wp--preset--color--border-tertiary);        /* #e2e8f0 */
  background: var(--wp--preset--color--bg-tertiary); color: var(--wp--preset--color--text-primary); cursor: pointer; transition: background var(--u-dur-fast) var(--u-ease), color var(--u-dur-fast) var(--u-ease); }
.c-slidernav .c-btn__icon { width: 1.25rem; height: 1.25rem; }
.c-slidernav:hover, .c-slidernav--hover { background: var(--wp--preset--color--text-primary); color: #fff; }
.c-slidernav--disabled { background: transparent; border-color: var(--wp--preset--color--border-tertiary); color: var(--wp--preset--color--text-disabled); pointer-events: none; }

/* ============================================================= Filter (Figma-Referenz)
   Chip: Icon links + Label + Chevron-Down. Inaktiv = grau (#f1f5f9). Aktiv = mint + X-Remove-Button. */
.c-filter { display: inline-flex; flex-wrap: wrap; align-items: center; gap: 0.5rem; }
.c-filter__chip { display: inline-flex; align-items: center; gap: 0.5rem;
  padding: 0.5rem 0.75rem; border-radius: 0.5rem; border: 0.0625rem solid var(--wp--preset--color--border-tertiary); background: var(--wp--preset--color--bg-tertiary); color: var(--wp--preset--color--text-primary);
  font-family: var(--u-font-body); font-size: 0.875rem; cursor: pointer; }
.c-filter__chip .c-btn__icon { width: 1.25rem; height: 1.25rem; flex: 0 0 auto; }
.c-filter__chip--active { background: var(--wp--preset--color--accent); border-color: var(--wp--preset--color--accent); color: var(--wp--preset--color--text-primary); }
.c-filter__remove { display: inline-flex; align-items: center; justify-content: center; flex: 0 0 auto; padding: 0;
  width: 2.375rem; height: 2.375rem; border-radius: 0.5rem; border: none; background: var(--wp--preset--color--accent); color: var(--wp--preset--color--text-primary); cursor: pointer; }
.c-filter__remove .c-btn__icon { width: 1.25rem; height: 1.25rem; }

/* ============================================================= Accordion (exakt, Node 11202:6406)
   Item: border-bottom 0.0625rem #e2e8f0, padding 1.25rem 0. Header Open Sans Regular 16/24 -.48 #1e063d.
   Icon Plus (zu) / Minus (auf), 1.25rem. Body Open Sans Regular 16/24 #786a8b. Container pl 0.5rem. */
/* Container: heller Hintergrund + Radius (Figma-Visual); Items durch Divider getrennt, letzter ohne. */
.c-accordion { background: var(--wp--preset--color--text-alternate); border: 0.0625rem solid var(--wp--preset--color--border-tertiary); border-radius: 0.5rem; padding: 0 1.5rem; }
.c-accordion__item { border-bottom: 0.0625rem solid var(--wp--preset--color--border-tertiary); padding: 1.25rem 0; }
.c-accordion__item:last-child { border-bottom: none; }
.c-accordion__inner { display: flex; flex-direction: column; gap: 1rem; padding-left: 0.5rem; }
.c-accordion__head { display: flex; align-items: center; justify-content: space-between; gap: 1rem; width: 100%;
  background: none; border: none; cursor: pointer; text-align: left; color: var(--wp--preset--color--text-primary); }
.c-accordion__q { font-family: var(--u-font-body); font-weight: 400; font-size: 1rem; line-height: 1.5rem; letter-spacing: -0.03rem; color: var(--wp--preset--color--text-primary);
  /* 🔴 Flex-Kind mit Standard `min-width: auto` schrumpft nicht unter seine Mindestbreite. Bei
     langen Komposita („Forschungszulagengesetz") schob der Text im Glossar das Icon aus der Box —
     nachgemessen bei 360: Icon stand rechts bei 374. Beides noetig: schrumpfen duerfen UND
     umbrechen koennen. */
  min-width: 0; overflow-wrap: anywhere; }
.c-accordion__icon { flex: 0 0 auto; width: 1.25rem; height: 1.25rem; color: var(--wp--preset--color--text-primary); }
/* Body linksbündig → „Förderscan starten"-Button ist linksbündig */
.c-accordion__body { display: flex; flex-direction: column; align-items: flex-start; gap: 1.25rem; }
.c-accordion__answer { font-family: var(--u-font-body); font-weight: 400; font-size: 1rem; line-height: 1.5rem; letter-spacing: -0.03rem; color: var(--wp--preset--color--text-secondary); }

/* ============================================================= Stat */
.c-stat-item__value { font-family: var(--u-font-heading); font-weight: 500; font-size: 3.5rem; line-height: 1; color: var(--wp--preset--color--text-primary); }
.c-stat-item__label { margin-top: 0.5rem; color: var(--wp--preset--color--text-secondary); display: inline-flex; align-items: center; gap: 0.5rem; }
.c-stat { position: relative; overflow: hidden; border-radius: 0.5rem; color: #fff; aspect-ratio: 1/1; display: flex; flex-direction: column; justify-content: flex-end; padding: 1.625rem; background: var(--wp--preset--color--text-primary); }
.c-stat__bg { position: absolute; inset: 0; background-size: cover; background-position: center; opacity: .35; }
.c-stat__eyebrow { position: absolute; top: 1.625rem; left: 1.625rem; right: 1.625rem; font-family: var(--u-font-heading); font-size: 1.25rem; }
.c-stat__value { position: relative; font-family: var(--u-font-heading); font-weight: 500; font-size: 4rem; line-height: 1; }
.c-stat__value small { font-size: 2rem; }
.c-stat__label { position: relative; margin-top: 0.5rem; color: rgba(255,255,255,.8); }
.c-stat__cta { position: absolute; right: 1.625rem; bottom: 1.625rem; }

/* ============================================================= Form fields */
.c-field { display: flex; flex-direction: column; gap: 0.375rem; margin-bottom: 1rem; }
.c-field__label { font-family: var(--u-font-body); font-size: 0.875rem; font-weight: 500;   /* OS 600 gibt es in Figma nicht */ color: var(--wp--preset--color--text-primary); }
.c-field__control { width: 100%; padding: 0.75rem 1rem; border: 0.0625rem solid var(--wp--preset--color--border-tertiary); border-radius: 0.5rem;
  background: var(--wp--preset--color--bg-primary); color: var(--wp--preset--color--text-primary); font-family: var(--u-font-body); font-size: 1rem; transition: border-color var(--u-dur-fast) var(--u-ease), box-shadow var(--u-dur-fast) var(--u-ease); }
.c-field__control::placeholder { color: var(--wp--preset--color--text-secondary); }
.c-field__control:focus { outline: none; border-color: var(--wp--preset--color--accent); box-shadow: 0 0 0 0.1875rem rgba(10,235,191,.25); }
select.c-field__control { appearance: none; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12'%3E%3Cpath fill='%23786a8b' d='M6 8L2 4h8z'/%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: right 1rem center; }
textarea.c-field__control { min-height: 6rem; resize: vertical; }
.c-field--error .c-field__control { border-color: var(--wp--preset--color--status-error); }
.c-field--error .c-field__msg { color: var(--wp--preset--color--status-error); font-size: 0.8125rem; }

/* ============================================================= Navbar (exakt, Nodes 13674:15768/15837/15872)
   Pill: py-10 pl-40 pr-10, radius 999, blur-80. Weiß = bg #fff, Text #1e063d, CTA Purple.
   Blur/über-Hero = bg rgba(35,47,64,.01), Border rgba(251,251,251,.1), Text #f8fafc, CTA Light-Grey. */
/* 3 States (Figma-Component-Set 13253:8377) — je nachdem, worauf die Navbar liegt.
   Struktur identisch, nur Background/Text/CTA unterscheiden sich. blur-80 immer. */
/* Die Hoehe kommt aus dem Token, nicht aus dem Innenabstand. Damit entfaellt auch die Rechnerei
   um Figmas INNEN liegenden Strich: der Rahmen steckt bei `border-box` in der Hoehe, und
   `align-items: center` setzt den Inhalt mittig — genau wie die symmetrischen 10/10 bzw. 16/16
   im Node. Vorher stand hier `padding: 10px` und die Hoehe fiel als Nebenprodukt heraus; jede
   Aenderung an Logo, Button oder Zeilenhoehe verschob sie still. */
.c-nav { display: flex; align-items: center; justify-content: space-between; gap: 3rem;
  height: var(--nav-pille);
  padding-block: 0;
  border-radius: 62.5rem;
  border: 0.0625rem solid transparent;
  backdrop-filter: blur(5rem); -webkit-backdrop-filter: blur(5rem);
  transition: background-color var(--u-dur-base) var(--u-ease), color var(--u-dur-base) var(--u-ease); }
/* On dark / Default — im Hero: #232F40 @ 1% */
.c-nav--hero   { background: rgba(35,47,64,0.01); border-color: rgba(251,251,251,0.1); color: var(--wp--preset--color--text-alternate); }
/* On dark / On Scroll — nach dem Hero: #232F40 @ 65% (Figma 60%, User-Entscheidung 65%) */
.c-nav--scroll { background: rgba(35,47,64,0.65); border-color: rgba(255,255,255,0.1); color: var(--wp--preset--color--text-alternate); }
/* On light — auf hellem Hintergrund: weiß, dunkler Text, CTA Purple */
.c-nav--light  { background: var(--wp--preset--color--bg-primary); border-color: rgba(255,255,255,0.1); color: var(--wp--preset--color--text-primary); }
/* Der CTA wird auf hellem Grund violett (User 2026-08-07). Bewusste Abweichung von Figma, das
   fuer „Theme=On Light" (13893:20080) einen weissen Knopf zeigt.

   🔴 Warum im CSS und nicht in `ignite_navbar()`: `c-nav--light` haengt `anim-navstate.js` zur
   Laufzeit an, sobald ein Mega-Menue offen ist. Serverseitig rendert diesen State nur die
   Styleguide-Seite — eine PHP-Fallunterscheidung greift im echten Betrieb also nie.

   Ohne `:where()`, weil diese Regel `.c-btn--grey` schlagen MUSS; und mit eigenem Fill, sonst
   liefe der violette Grund gegen einen violetten Fill (unsichtbarer Hover).

   ⚠️ Die Werte sind exakt die von `.c-btn--purple` gespiegelt, NICHT neu gewaehlt. „Purple" ist
   in diesem Projekt `text-primary` (#1e063d); `accent` ist das Mint (#0aebbf). Der erste Anlauf
   griff zu `accent` und lieferte einen mintgruenen Knopf. */
.c-nav--light .c-btn--grey {
  background: var(--wp--preset--color--text-primary);
  border-color: var(--wp--preset--color--text-primary);
  color: var(--wp--preset--color--text-alternate);
}
.c-nav--light .c-btn--grey .c-btn__fill { background: var(--wp--preset--color--accent); }
.c-nav--light .c-btn--grey:hover {
  color: var(--wp--preset--color--text-primary);
  border-color: var(--wp--preset--color--accent);
}
.c-nav__left  { display: flex; align-items: center; gap: 3rem; min-width: 0; }
.c-nav__links { display: flex; align-items: center; gap: 1.25rem; }
.c-nav__right { display: flex; align-items: center; gap: 1.5rem; }
/* Logo ist ein Link zur Startseite → color: inherit, sonst erbt das currentColor-SVG
   die blaue Default-Linkfarbe statt der Nav-Textfarbe. */
.c-nav__logo  { width: 9.363rem; height: 2rem; flex: 0 0 auto; display: block; color: inherit; }
.c-nav__logo svg { width: 100%; height: 100%; display: block; }
/* Menu-Link (Nav + Submenu): 14px Open Sans Medium, optional Chevron, Underline-Slide bei Hover */
.c-nav__link { display: inline-flex; align-items: center; gap: 0.25rem; padding: 0.25rem 0; position: relative;
  font-family: var(--u-font-body); font-weight: 500; font-size: 0.875rem; line-height: 1.375rem; color: inherit;
  text-decoration: none; background: none; border: none; cursor: pointer; white-space: nowrap; }
.c-nav__link .c-btn__icon { width: 1.25rem; height: 1.25rem; }
.c-nav__link::after { content: ""; position: absolute; left: 0; right: 100%; bottom: 0; height: 0.0625rem; background: currentColor; transition: right var(--u-dur-fast) var(--u-ease); }
.c-nav__link:hover::after, .c-nav__link--active::after { right: 0; }
.c-nav__lang { display: inline-flex; align-items: center; gap: 0.5rem; flex: 0 0 auto; }
/* Der Sprachschalter bekommt denselben Unterstrich wie jeder andere Nav-Link (User 2026-08-07).
   Mit JS uebernimmt `.c-link__line` und laeuft nur unter „Deutschland"; dieses `::after` ist der
   Fallback ohne JS und liegt dann — wie bei allen Nav-Links — unter dem ganzen Trigger. */
.c-nav__globe { width: 1.25rem; height: 1.25rem; flex: 0 0 auto; }
/* Feste Groesse statt `100%`: prozentuale Masse beziehen sich auf den Elternblock — wird das
   Icon je umgehaengt (wie es anim-links.js kurzzeitig tat), waechst es sonst auf dessen Breite.
   20px sind ohnehin der einzige vorgesehene Wert (vgl. `.c-nav__globe` und `.c-nav__mobile-lang`). */
.c-nav__globe svg { width: 1.25rem; height: 1.25rem; }
/* Unter 1440px zeigt die Länderauswahl nur das Globe-Icon (Label raus), damit die Desktop-Nav
   zwischen 768 und 1440px nicht überläuft (gemessen: bei 1200px sonst 56px Überlappung). */
@media (max-width: 1439px) { .c-nav__lang-label { display: none; } }
.c-nav__switch { display: inline-flex; align-items: center; gap: 0.5rem; }

/* Mega-Menü / Dropdown: blur-62, bg white, radius 10, px-40 py-32, Shadow.
   --full = auf volle Navbar-Breite gestreckt (Lösungen); Länder-Dropdown bleibt auto-breit. */
.c-megamenu { display: inline-flex; gap: 1rem; align-items: flex-start;
  padding: 2rem 2.5rem; border-radius: 0.625rem; border: 0.0625rem solid rgba(255,255,255,0.1);
  background: var(--wp--preset--color--bg-primary); backdrop-filter: blur(3.875rem); -webkit-backdrop-filter: blur(3.875rem);
  box-shadow: 1rem 1rem 3rem rgba(0,0,0,0.08); }
/* Mega-Menü liegt auf dem 12er-Grid: 3 + 3 + 1 (Spacer) + 1 (Divider) + 4 (Feature) = 12. */
.c-megamenu--full { display: grid; grid-template-columns: repeat(12, minmax(0, 1fr)); gap: 1rem; width: 100%; }
.c-megamenu--full > .c-megamenu__spacer { grid-column: span 1; }
/* Länderauswahl (Figma 13674:15875): Padding 32 rundum. Breite hugged den Inhalt (max-content) statt
   fixer 316px — so öffnet das Dropdown vom Globe nach rechts, ohne über die Nav-Kante zu laufen. */
.c-megamenu--country { width: max-content; padding: 2rem; }
/* CTA-Dropdown: kompakter, hugged den Inhalt. */
.c-megamenu--cta { width: auto; padding: 1.5rem 2rem; }
.c-megamenu--cta .c-megamenu__col--narrow { width: auto; }
.c-megamenu__tags { display: flex; flex-wrap: wrap; gap: 0.5rem; }
.c-megamenu__feature-link { color: var(--wp--preset--color--text-accent); }
.c-megamenu__col { display: flex; flex-direction: column; gap: 1.5rem; align-self: stretch; min-width: 0; }
.c-megamenu--full > .c-megamenu__col { grid-column: span 3; }
.c-megamenu__col--narrow { width: 11.1875rem; }   /* 179px (Länder-Dropdown) */
.c-megamenu__label { font-family: var(--u-font-body); font-weight: 500; font-size: 0.875rem; line-height: 1.375rem; color: var(--wp--preset--color--text-tertiary); }
.c-megamenu__menu { display: flex; flex-direction: column; gap: 1.125rem; align-items: flex-start; }
.c-megamenu__menu--region { gap: 1rem; }
/* Divider = 1 Grid-Spalte, deren border-right die sichtbare Linie ist (wie in Figma). */
.c-megamenu__divider { align-self: stretch; border-right: 0.0625rem solid var(--wp--preset--color--border-tertiary); }
.c-megamenu--full > .c-megamenu__divider { grid-column: span 1; }
/* align-items: flex-start → Button/Tags hugen ihren Inhalt und sind linksbündig
   (sonst zieht stretch den Link auf volle Breite und .c-btn zentriert den Inhalt). */
/* Feature = 4 Grid-Spalten. Headline in Figma auf 3 Spalten (316px) begrenzt → max-width, schrumpfbar. */
/* Teaser = EINE vertikale Spalte (Node 13674:15862, 426,67 breit, gap 24):
   Label · Titel (316 = 3 Spalten) · Tag-Reihe · Bild (füllt die Resthöhe) · Link.
   🔴 Vorher standen hier `grid-template-rows: auto 1fr auto` und ein 4-spaltiges Subgrid OHNE
   Spaltenregel an den Kindern. Der Auto-Placement-Algorithmus verteilte die fünf Kinder daraufhin
   über das 4x3-Raster: Label in Zelle 1, Titel daneben, die Tag-Reihe in die `1fr`-Zeile — wo die
   Tags auf Zeilenhöhe gestreckt wurden und als hohe Kästen untereinander standen. Deshalb bekommt
   jetzt jedes Kind eine explizite Spalte, und die Zeilen zählen alle fünf Kinder. */
/* Zeilen: Label · Titel · Tags · Bild · Link. Das Bild fuellt seit Backlog #20 NICHT mehr die
   Restzeile, sondern haelt 16:9 — die freie Hoehe faellt deshalb an die LETZTE Zeile, der Link
   sitzt darin oben. Vorher lag das `1fr` beim Bild. */
.c-megamenu__feature {
  display: grid; grid-template-rows: auto auto auto auto 1fr;
  justify-items: start; align-self: stretch; gap: 1.5rem; min-width: 0;   /* 24 */
}
.c-megamenu__feature-link { align-self: start; }
.c-megamenu--full > .c-megamenu__feature { grid-column: span 4; grid-template-columns: subgrid; }
.c-megamenu__feature > * { grid-column: 1 / -1; }
.c-megamenu__feature-title { grid-column: 1 / span 3; justify-self: stretch; }   /* Figma 316 */
.c-megamenu__feature-title { font-family: var(--u-font-heading); font-weight: 500; font-size: 1.5rem; line-height: 1.875rem; letter-spacing: -0.015rem; color: var(--wp--preset--color--text-primary); }
/* Bild ist seit Backlog #20 ein LINK auf dasselbe Ziel wie der Text darunter und haelt 16:9
   (vorher fuellte es die Restzeile, das Seitenverhaeltnis haing damit an der Spaltenhoehe).
   Der Radius sitzt am Link mit `overflow:hidden` — sonst ragt das `object-fit`-Bild ueber
   die abgerundeten Ecken hinaus. */
.c-megamenu__feature-media {
  grid-column: 1 / -1; justify-self: stretch;
  display: block; width: 100%; aspect-ratio: 16 / 9;
  border-radius: 0.625rem; overflow: hidden;
}
.c-megamenu__feature-img {
  width: 100%; height: 100%; object-fit: cover; display: block;
}

/* ============================================================= PROJEKT-GRID (verbindlich)
   12 Spalten · 16px Gutter · 64px Margin (= Figma Grid Setup/Margin). Zieht sich durch die ganze Seite.
   Card = 4 Spalten (in Figma 426,67px), „3-columns" = 316px → Spaltenbreite ≈ 94,67px. */
/* Projekt-Grid als Variablen — EINE Quelle. Alles Weitere leitet ab; nie einen dieser Werte in einer
   Komponente oder einem Breakpoint duplizieren, sondern IMMER die Variable selbst überschreiben. */
/* `--nav-h` als echte Laenge registrieren. Ohne das liefert `getComputedStyle` bei einer
   Custom Property den TOKEN-TEXT zurueck — hier also `calc(1.5rem + 3.9375rem)` statt `87px`.
   Der IntersectionObserver in nav.js braucht fuer `rootMargin` aber eine Zahl in px, und ein
   `parseFloat` auf diesen Text ergibt NaN und faellt still auf seinen Fallback zurueck.
   Mit `@property` rechnet der Browser den Wert aus, und JS liest ihn, statt ihn zu messen. */
@property --nav-h {
  syntax: "<length>";
  inherits: true;
  initial-value: 87px;
}

:root {
  --u-global-width: 100%;   /* Design-Canvas. 100% = fluid. Auf z.B. 90rem setzen ⇒ Cap greift. */
  /* Content-Aussenrand. Fluid & vom (an Breakpoints springenden) rem-Scaling ENTKOPPELT: aktiver Wert
     ist der vw-Term (4.4444vw = 64px @1440), rem dient nur als Boden/Deckel. So skaliert der Rand GLATT
     mit der Viewport-Breite — auf kleineren Viewports schmaler → Content breiter, und kein Sprung an
     991px (dort machte 4rem sonst 72px). @1440 unverändert 64px. Floor 24px, Cap 4rem (=64px @1440). */
  --u-margin:       clamp(1.5rem, 4.4444vw, 4rem);
  --u-gutter:       1rem;   /* 16 = Figma Grid Setup/Gutter */
  --u-cols:         12;
  /* ---- Abstands-Skala (ADR 0010 §1.6, Tabelle der Designerin, Node 14106:43215) ------------
     🔴 Die ZAHL IM NAMEN ist der Figma-DESKTOP-Wert — sie ist ein Name, keine Zusage über die
     gerenderte Groesse. Unter 768 nimmt jeder Token seinen Mobile-Wert an (siehe unten). Wer in
     Figma 96 misst, schreibt `var(--u-s-96)` — auf beiden Leinwaenden dieselbe Zeile.
     Die Tabelle ist eine gestaltete Kurve, KEINE Formel: 48 und 32 landen beide auf 20. Werte,
     die hier fehlen, werden auf den naechstliegenden Token gerundet, nicht interpoliert. */
  --u-s-96: 6rem;      --u-s-80: 5rem;      --u-s-72: 4.5rem;    --u-s-64: 4rem;
  --u-s-56: 3.5rem;    --u-s-48: 3rem;      --u-s-32: 2rem;      --u-s-26: 1.625rem;
  --u-s-24: 1.5rem;    --u-s-20: 1.25rem;
  /* Serif-Akzent, nur fuer Zitate (.c-quote__open / __close). Projekt-Token, kein DevKit-Token —
     Heading/Body kommen aus der theme.json (`--wp--preset--font-family--*`), Newsreader hat dort
     bewusst keinen Eintrag, weil es nirgends im Editor waehlbar sein soll.
     🔴 Wurde 3x benutzt, war aber nirgends definiert: die Zitate erbten still die Body-Schrift. */
  --u-font-quote:   "Newsreader", Georgia, "Times New Roman", serif;
  /* ---- Bewegung (Agentur-Standard, ~/Claude/web-dev-standards/animation.md) ----------------
     `--u-ease` ist NUR die Kurve, die Dauer kommt aus den `--u-dur-*`-Token:
         transition: opacity var(--u-dur-fast) var(--u-ease);

     🔴 Korrigiert 2026-08-05: stand vorher auf `0.24s cubic-bezier(0.4, 0, 0.2, 1)` — eine
     andere Kurve als der Agentur-Standard, unter demselben Namen. Der Standard (cp.de,
     Accordion v1, GSAP-CustomEase 'cp') ist `cubic-bezier(0.2, 0, 0.2, 1)`. Zwei Kurven unter
     einem Namen heisst: dieselbe Bewegung fuehlt sich je nach Projekt anders an, ohne dass
     man es im Code sieht. Ausserdem war die Dauer eingebacken — damit war jede Transition
     zwangsweise 0.24s, egal ob Farbwechsel oder Panel-Hoehe.

     ⚠️ Deckungsgleich mit der GSAP-CustomEase 'bws' in assets/js/anim.js. Aendert sich eine
     Seite, muss die andere mit — sonst laufen CSS und GSAP auf derselben Seite auseinander. */
  --u-ease:         cubic-bezier(0.2, 0, 0.2, 1);
  --u-dur-fast:     0.2s;    /* Farbe, Opacity, kleine Zustandswechsel */
  --u-dur-base:     0.35s;   /* Standard: Hover-Fills, Unterstriche, Transforms */
  --u-dur-slow:     0.6s;    /* Grosse Flaechen, Bild-Reveals */
  --u-accordion-duration: 0.4s;   /* Accordion-Standard v1 — GSAP liest diesen Wert aus */
  /* ---- Navbar-Geometrie (Nodes 13253:8377 · Seiten-Frames Home/Leadership/Glossar) ----------
     🔴 EIN Token pro Breakpoint. `--nav-pille` setzt die Hoehe der Pille UND speist `--nav-h` —
     dieselbe Variable, ein Auseinanderlaufen ist damit ausgeschlossen.

     Bis 2026-08-12 hat `nav.js` die Huelle gemessen und `--nav-h` als Inline-Style ins <html>
     geschrieben. Gebraucht wurde das fuer den Overlay-Pull-up; der ist weg (Huelle ist `fixed`).

     ⚠️ 62, nicht 60: die Menu-Expanded-Frames zeigen 60, ihre Leinwand ist aber nur 344 breit
     statt 360 — zugeschnittene Arbeitsrahmen. Die neun gelayouteten Seiten-Frames und das
     Component-Set sagen uebereinstimmend 62 (mobil) bzw. 63 (Desktop), Ober-Offset ueberall 24.
     VERTIKALE Masze (Eigengroesse) — keine Grid-Breiten, check_css prueft nur Breiten. */
  --nav-offset:     1.5rem;      /* 24 — die Pille schwebt unter der Viewportkante */
  --nav-pille:      3.9375rem;   /* 63 Desktop (Node 1392x63) */
  --nav-h:          calc(var(--nav-offset) + var(--nav-pille));
  /* Sticky-Stopp für alle Seiten-Sticky-Elemente (Programs-Stack, Intro, FAQ-Headline, Funding-Col):
     Navbar-Höhe + 1rem Luft, damit sie NICHT direkt an der klebenden Navbar anschlagen (User-Vorgabe).
     An --nav-h gekoppelt, das seinerseits aus --nav-pille faellt. */
  --sticky-top:     calc(var(--nav-h) + 1rem);
  /* EINE Spalte des 12er-Grids, für Kontexte AUSSERHALB eines echten `.u-grid`
     (Slider-Karten, Media-Slots, Sticky-Stack-Breiten) — dort, wo `grid-column: span N`
     nicht geht (z.B. weil die Box aus ihrem Container bleedet/scrollt).
     ⚠️ Bewusst `vw`, nicht `%`: eine `%` in einer Custom Property löst sich NICHT an der
     Deklarationsstelle auf, sondern am VERWENDUNGSORT, gegen das Containing Block DORT — das
     hat `--m-col`/`--blog-col` schon zweimal zu Bugs geführt (component-architecture.md).
     `vw` ist deklarationsunabhängig, löst also überall gleich auf.
     `vw` zählt die OS-Scrollbar mit (auf Nicht-Overlay-Scrollbar-Systemen ~1px/Spalte Fehler) —
     für interne Komponenten-Proportionen (Kartenbreite, Slot-Breite) akzeptiert. NICHT für
     Kantenbündigkeit/Bleed am Viewport-Rand verwenden, da zählt der Fehler. */
  --u-col: calc((100vw - 2 * var(--u-margin) - 11 * var(--u-gutter)) / 12);
}
/* Der Container ist die CONTENT-Breite, nicht die Viewport-Breite: global-width abzüglich beider
   Aussenränder. Deshalb KEIN padding-inline — der Rand steckt schon in der Breite, sonst zieht man
   ihn zweimal ab. `width` sorgt für den Rand auf jeder Viewport-Breite; `max-width` greift erst,
   wenn --u-global-width ein fester Wert ist (bei 100% ein No-op). */
/* Mobile-Leinwand (ADR 0010 §1.2): 767 ist die Kante, an der die Abstands-Skala und der Gutter
   kippen. Die Spaltenzahl kippt NICHT — zwoelf Spalten gelten von 360 bis 1440. */
@media (max-width: 767px) {
  :root {
    --u-s-96: 4.5rem;  --u-s-80: 3rem;      --u-s-72: 2.5rem;    --u-s-64: 2rem;
    --u-s-56: 1.5rem;  --u-s-48: 1.25rem;   --u-s-32: 1.25rem;   --u-s-26: 1rem;
    --u-s-24: 0.75rem; --u-s-20: 0.5rem;
    --u-gutter: 0.5rem;                     /* 8 — der einzige Rasterwert, der kippt */
    --nav-pille: 3.875rem;                  /* 62 (Node 344x62); Ober-Offset bleibt 24 */
  }
}

.u-container {
  width:         calc(100% - var(--u-margin) * 2);
  max-width:     calc(var(--u-global-width) - var(--u-margin) * 2);
  margin-inline: auto;
}
/* minmax(0, 1fr) statt 1fr → Spalten dürfen unter ihre Content-Breite schrumpfen (Projekt-Standard). */
/* Margin 64 = Figma Grid Setup/Margin → Spalte 94,67 = Columns-Tokens.
   --u-container-width: 100% = fluid (Content = Viewport − 2×Margin), skaliert mit dem rem-System,
   analog zum Webflow-DevKit (global-width). KEIN fixer 90rem-Cap. Auf Cap umstellen = Variable auf 90rem. */
.u-grid { display: grid; grid-template-columns: repeat(var(--u-cols), minmax(0, 1fr)); gap: var(--u-gutter); }
.u-col-1  { grid-column: span 1; }
.u-col-2  { grid-column: span 2; }
.u-col-3  { grid-column: span 3; }
.u-col-4  { grid-column: span 4; }
.u-col-5  { grid-column: span 5; }
.u-col-6  { grid-column: span 6; }
.u-col-8  { grid-column: span 8; }
.u-col-12 { grid-column: span 12; }
/* --u-margin wird NICHT mehr pro Breakpoint überschrieben — der clamp oben skaliert selbst glatt
   (24px Floor greift auf schmalen Phones automatisch). Hier nur noch das Grid auf 1 Spalte. */
/* 🔴 Hier stand bis 2026-08-11 der Raster-Kollaps: `.u-grid { grid-template-columns: 1fr }` plus
   alle `.u-col-*` auf `span 1`. Er hat auf dem Handy ALLES gestapelt — und damit jahrelang
   verdeckt, dass die Mobile-Werte fehlen. Entfernt mit ADR 0010: zwoelf Spalten gelten von 360
   bis 1440, jede Sektion sagt selbst, wie breit sie dort ist. Nicht wieder einfuehren. */

/* ---- Globale sticky Navbar-Hülle (wp_body_open, eine Instanz je Seite) ----
   Die Navbar liegt im Fluss ganz oben und klebt beim Scrollen (position: sticky, kein fixed —
   fixed wäre aus dem Fluss und bräuchte einen manuellen Platzhalter). Der Ober-Offset (Figma y=20)
   steckt als padding-block-start in der Hülle, damit die Pille frei schwebt. */
.c-nav-shell {
  /* --nav-bleed HIER (nicht auf .c-nav), damit sowohl die Pille ALS AUCH die Mega-Menü-Panels es
     erben — die Panels sollen exakt so breit wie die Pille sein (User-Vorgabe „immer"). */
  --nav-bleed: calc(var(--u-margin) - 1rem);
  /* 🔴 `fixed`, nicht `sticky`. Die Huelle stand ganz oben im Fluss und klebte bei `top: 0` —
     sie hat sich also von der ersten Sekunde an wie `fixed` verhalten, nur mit dem Unterschied,
     dass sie Platz belegte. Diesen Platz nahm ein Pull-up (`margin-bottom: -var(--nav-h)`) wieder
     weg, und NUR dafuer musste ihre Hoehe auf den Pixel bekannt sein — deshalb die JS-Messung.
     Ohne Fluss gibt es nichts zurueckzuziehen: Pull-up, Body-Klasse und Messung sind weg.

     Den Kopfabstand traegt seitdem jede Seite selbst: Hero, Page-Header und Artikel-Kopf
     reservieren je 176. Daraus folgt die Regel — JEDE Seite beginnt mit einem dieser drei Koepfe.
     Haelt sie sich nicht daran, laeuft der erste Inhalt unter die Pille; das faellt sofort auf. */
  position: fixed; inset-inline: 0; top: 0; z-index: 200;
  padding-block-start: var(--nav-offset);
}
/* Der Overlay-Pull-up stand hier bis 2026-08-12 (`body.ig-has-hero .c-nav-shell { margin-bottom:
   calc(-1 * var(--nav-h)) }`). Er ist mit dem Fluss entfallen — siehe `.c-nav-shell` oben. */
/* Pillen-Ausrichtung (User-Vorgabe, verifiziert am Figma-Node 21655:15354):
   • LINKS: das Logo ist IMMER BÜNDIG mit dem Content. Kopplung: das linke Padding = dem Bleed
     (`--nav-bleed`). Die Pille zieht sich um --nav-bleed aus dem Container (dessen Kante bei
     `--u-margin` liegt) heraus, das gleich große Padding schiebt das Logo exakt auf die Container-
     Kante zurück → Logo-Flucht = --u-margin, unabhängig vom konkreten Rand. Ändert sich --u-margin,
     folgt das Logo automatisch (Content-bündig „für immer").
   • RECHTS: pr 10px wie in Figma (Button-Kante 10px zur Pillenkante); die Pille ragt rechts bewusst
     über den Content hinaus (CTA muss nicht bündig sein).
   ⚠️ --nav-bleed ist an --u-margin GEKOPPELT (nicht fix 3rem): so sitzt die Pille immer 1rem vom
   Viewport (16px), egal wie klein der jetzt FLUIDE --u-margin wird. Fix 3rem ragte sonst über den
   Viewport, sobald --u-margin < 48px fiel (kleinere Viewports → 10px Overflow). @1440: 64−16 = 48 = 3rem. */
.c-nav-shell .c-nav {
  margin-inline: calc(-1 * var(--nav-bleed));   /* --nav-bleed geerbt von .c-nav-shell */
  padding-left: var(--nav-bleed);
  padding-right: 0.625rem;
}

/* ---- Nav-Panels (Mega-Menü / Länderauswahl) — Öffnen/Schließen ----
   Abstand Nav→Panel = 20px (Figma gap-20). Verhalten via JS-Toggle; Motion folgt im GSAP-Pass. */
.c-nav-wrap { position: relative; }
/* Mega-Menü-Panel: EXAKT so breit wie die Pille (User-Vorgabe „immer"). Es sitzt in .c-nav-wrap
   (Container-Kante = --u-margin); um auf die Pillenbreite zu kommen, zieht es sich beidseitig um
   --nav-bleed heraus — derselbe Bleed wie die Pille → Panel-Kanten = Pillen-Kanten, bei jeder Breite. */
.c-nav__panel { position: absolute; top: calc(100% + 1.25rem);
  left: calc(-1 * var(--nav-bleed)); right: calc(-1 * var(--nav-bleed)); z-index: 60; }
/* Länderauswahl: auto-breit; JS richtet sie linksbündig am Globe-Icon aus. */
.c-nav__panel--country { left: auto; right: 0; width: auto; }
/* CTA-Dropdown: auto-breit, rechtsbündig am CTA-Button (JS setzt right). */
.c-nav__panel--cta { left: auto; right: 0; width: auto; }
.c-nav__panel[hidden] { display: none; }
/* geöffneter Trigger: Unterstrich sichtbar */
.c-nav__link[aria-expanded="true"]::after { right: 0; }

/* ---- Hamburger + Mobile-Overlay (< 768px) ---------------------------------------------------
   Desktop-Nav weicht unter 768px einem Vollbild-Accordion. Kein Figma für Mobile — Accordion ist
   die bewusste Standardwahl. Das Sticky-Verhalten der Hülle (oben) gilt hier ebenso. */
.c-nav__burger { display: none; }   /* Desktop: kein Hamburger */
.c-nav__mobile { display: none; }   /* Desktop: kein Overlay */
.c-nav__backdrop { display: none; } /* Desktop: kein Backdrop (Element existiert nur zur Laufzeit) */

/* Hamburger schon ab 1280px: die 5 langen deutschen Nav-Labels + rechte Gruppe brauchen ~1265px
   Pillen-Innenbreite; darunter flogen die Links vorher raus (bei 900px 408px Überlappung). Also
   unter 1280px → Hamburger. Die Pillen-Geometrie (Bleed, Logo-Content-Flucht) bleibt auf Tablet
   Desktop-like; nur Phones (<768) resetten sie (eigener Block weiter unten). */
@media (max-width: 1279px) {
  /* Desktop-Steuerung raus, Hamburger rein */
  .c-nav__links, .c-nav__lang, .c-nav__switch, .c-nav__right > .c-btn { display: none; }
  .c-nav__panel { display: none; }   /* Hover-Mega-Menüs gibt es auf Touch nicht */

  /* Menue-Knopf (Node 14202:54864 › Menu Button 63x30): Label „Menue" mit Unterstrich, danach das
     Icon. Kein blosser Burger — das Label traegt die Bedeutung, das Icon zeigt nur den Zustand. */
  .c-nav__burger {
    display: inline-flex; align-items: center; gap: 0.25rem; flex: 0 0 auto;
    /* `padding-inline: 0` ist noetig, nicht kosmetisch: <button> bringt vom User-Agent
       `padding: 1px 6px` mit. Der Knopf war damit 74,2 statt der gezeichneten 63. */
    padding-block: 0.25rem; padding-inline: 0;
    background: none; border: 0; color: inherit; cursor: pointer;
  }
  .c-nav__burger-label {
    position: relative;
    font-family: var(--u-font-body); font-weight: 500;
    font-size: var(--u-fs-body-small); line-height: 1.375rem;
  }
  /* 🔴 KEIN Unterstrich. Der Node hat zwar eine Ebene `Underline` 63x1 — sie liegt aber bei
     x = 198, waehrend der Knopf bei x = 261 sitzt. Sie steht also NEBEN dem Knopf, nicht darunter:
     eine abgestellte Ebene, keine Gestaltung. Aus ihrer Groesse (63x1 = exakt die Knopfbreite)
     liess sich das Gegenteil schliessen — die x-Position entscheidet.
     Dieselbe Falle bei den Menuepunkten unten (`Underline` 304x1 bei x = −284). */
  .c-nav__burger-icon {
    display: inline-flex; flex-direction: column; justify-content: center; gap: 0.25rem;
    width: 1.25rem; height: 1.25rem; flex: 0 0 auto;
  }
  .c-nav__burger-bar { display: block; width: 100%; height: 0.125rem; background: currentColor;
    border-radius: 0.0625rem; transition: transform var(--u-dur-fast) var(--u-ease), opacity var(--u-dur-fast) var(--u-ease); }
  /* Offen → Kreuz. Die mittlere Linie verschwindet, die aeusseren kippen aufeinander. */
  .c-nav__burger[aria-expanded="true"] .c-nav__burger-bar:nth-child(1) { transform: translateY(0.375rem) rotate(45deg); }
  .c-nav__burger[aria-expanded="true"] .c-nav__burger-bar:nth-child(2) { opacity: 0; }
  .c-nav__burger[aria-expanded="true"] .c-nav__burger-bar:nth-child(3) { transform: translateY(-0.375rem) rotate(-45deg); }

  /* Vollbild-Overlay (position: fixed → an den Viewport, kein Ancestor mit transform/filter).
     z-index 0 INNERHALB der Hülle: die Pille (z-index 1) bleibt darüber, damit der Hamburger/X zum
     Schliessen sichtbar und klickbar bleibt. Die ganze Hülle (z-index 200) liegt ohnehin über dem
     Seiteninhalt, das Overlay verdeckt ihn also trotzdem. */
  .c-nav-shell .c-nav { position: relative; z-index: 1; }
  /* Hamburger sitzt wie in Figma pr-10 nah an der rechten Pillenkante (Basis padding-right: 0.625rem
     bleibt) — die Pille ragt rechts um --nav-bleed über den Content, das ist gewollt. FRÜHER hier
     `padding-inline: --nav-bleed` gesetzt, um den Burger content-bündig zu machen; das riss auf
     breiten Viewports eine grosse Lücke (Bleed bis 48px) rechts neben dem Burger auf (User: „rechts
     zu viel Platz"). Der eigentliche Fix für den Phone-Fall ist der WEGGEFALLENE Phone-Reset unten:
     seitdem gilt die Basis-Geometrie auch auf Phones (Bleed nur ~8px → Burger ~content-bündig). */
  /* ---- Mobile-Panel (ADR 0010 §1.3, Node 14202:54864 / 14077:34453 / 14077:34805) -----------
     Panel 344 breit (Seitenrand 8 wie die Karten-Sektionen), volle Viewporthoehe, pad 24/20/32/20.

     🔴 WEISS, nicht dunkel. Beide Fills im Node sind rgb(255,255,255) — sowohl `Header Navigation`
     als auch `Expanded`. Der erste Bau nahm `bg-alternate` (dunkel); Text, Raender und Verlauf
     mussten daraufhin alle mitgedreht werden.

     `display: flex` steht seit dem Animations-Auftrag 2026-08-15 WIEDER in der Basis — jetzt
     bewusst: es ist der No-JS-Grundzustand (Menue offen/erreichbar, accordion-Muster). Die
     Schliess-Mechanik haengt nicht mehr daran: mit JS (html.js) uebernehmen die Regeln unter
     diesem Block, und `.c-nav__mobile[hidden] { display: none }` (eigene Regel, hoehere
     Spezifitaet als die Basis) traegt weiterhin den End-Zustand — der historische Bug
     („display in der Basis schlug [hidden], Menue unschliessbar") kann so nicht wiederkehren. */
  .c-nav__mobile {
    display: flex;
    /* 🔴 Das Panel liegt UNTER der Pille, nicht darueber. Der erste Bau setzte `inset: 8px` —
       damit deckte es die Pille komplett zu, und der einzige Weg zurueck war das X, das darunter
       lag. Im Node stehen beide nebeneinander: Pille 344x60, dann 16 Luecke, dann Panel 344x672.
       24 + 60 + 16 + 672 + 8 = 780 = Viewporthoehe.

       `--nav-h` ist die GEMESSENE Hoehe der Huelle (Offset + Pille, nav.js per ResizeObserver) —
       damit stimmt der Abstand auch im Tablet-Band, fuer das es keine Vorlage gibt. */
    /* z-index 190 statt 0: das Panel ist kein Kind der Huelle mehr (die steht auf 200), sondern
       ihr Geschwister. Es muss ueber dem Seiteninhalt liegen und unter der Pille — sonst deckt es
       den Schliessen-Knopf zu. Genau dieser Fehler hat das Menue schon einmal unschliessbar
       gemacht, damals ueber `inset: 8px`. */
    position: fixed; z-index: 190;
    top: calc(var(--nav-h) + 1rem);
    left: var(--u-gutter); right: var(--u-gutter); bottom: var(--u-gutter);
    flex-direction: column;
    /* 40 ausgeschrieben, nicht als Token: das Panel ist eine reine Mobile-Komponente ohne
       Desktop-Gegenstueck, und die Abstands-Tabelle benennt ihre Token nach dem DESKTOP-Wert.
       `--u-s-72` waere unter 768 zwar 40, hiesse aber „72" — im Tablet-Band waere es 72. */
    gap: 2.5rem;                     /* 40 — Node `Expanded` gap */
    border-radius: 0.625rem;         /* 10 — nicht 16, das ist der Karten-Radius */
    padding: 1.5rem 1.25rem 2rem;    /* 24/20/32/20 */
    background: var(--wp--preset--color--bg-primary);
    color: var(--wp--preset--color--text-primary);
    box-shadow: 0 0 0 0.0625rem var(--wp--preset--color--border-tertiary);
  }
  /* ---- Sichtbarkeits-Mechanik (Animations-Auftrag 2026-08-15; animation.md: CSS ist der
     Grundzustand, JS veredelt) ------------------------------------------------------------
     Grundzustand OHNE JS (kein `html.js`): das Menue ist DA — sichtbar, erreichbar, und
     STATISCH IM FLUSS statt fixed, damit auch die Seite dahinter benutzbar bleibt. Der
     `js`-Marker kommt inline im <head> (ignite-group.php) und entscheidet damit VOR dem
     ersten Paint — kein Aufblitzen fuer JS-Besucher.
     MIT JS haengt die Sichtbarkeit an `.is-open` (Klasse, nav.js) — nicht mehr am
     [hidden]-Toggle. Laeuft das Anim-Modul (`--anim`), bleibt das Panel dauerhaft im
     Renderbaum und GSAP faehrt die Sichtbarkeit ueber opacity/y; `hidden` ist nur noch der
     semantische END-Zustand (anim-burger setzt es im onReverseComplete, wie beim Accordion).
     🔴 Klickbarkeit haengt SYNCHRON an der Klasse (pointer-events), nie an visibility oder
     einem Tween-Ende (autoAlpha-Falle, auftrag-mobile-autonom §8). */
  html:not(.js) .c-nav__mobile { position: static; }
  html:not(.js) .c-nav__acc-body[hidden] { display: flex; }          /* no-JS: Punkte offen */
  html.js .c-nav__mobile:not(.is-open) { display: none; }            /* JS ohne Anim-Modul: zu */
  html.js .c-nav__mobile--anim:not([hidden]) { display: flex; }      /* Anim-Modul: GSAP blendet */
  .c-nav__mobile[hidden] { display: none; }                          /* End-Zustand */
  .c-nav__mobile--anim:not(.is-open) { pointer-events: none; }

  /* Backdrop hinter dem offenen Menue — existiert nur zur Laufzeit (anim-burger.js ruestet ihn
     nach, Muster anim-stats-Fill). Rein dekorativ: `pointer-events: none`, er faengt keine Taps
     und schliesst nichts (kein neues Verhalten, nur Tiefe). GSAP faehrt die opacity 0 → 0.24. */
  .c-nav__backdrop {
    display: block;
    position: fixed; inset: 0; z-index: 180;   /* ueber dem Inhalt, unter Panel (190) + Huelle (200) */
    background: var(--wp--preset--color--text-primary);
    opacity: 0;
    pointer-events: none;
  }

  /* Der Scrollbereich. `min-height: 0` ist Pflicht — ein Flex-Kind schrumpft sonst nicht unter
     seinen Inhalt und das Panel waechst, statt zu scrollen. */
  .c-nav__mobile-scroll {
    flex: 1 1 auto; min-height: 0; overflow-y: auto; -webkit-overflow-scrolling: touch;
    display: flex; flex-direction: column; gap: 2.5rem;   /* 40 zwischen Sprache und Punkten */
    /* Der `padding-top: 4.5rem`, der hier stand, hielt die zugedeckte Pille frei. Das Panel liegt
       jetzt darunter — der Freiraum waere eine Luecke ohne Grund. */
  }
  /* Menuepunkte untereinander, Gap 12 (Node `Menu Items` 304x408 gap 12). */
  .c-nav__mobile-items { display: flex; flex-direction: column; gap: 0.75rem; }

  /* Land + Sprache stehen OBEN (Node: `Column` 304x22 als erstes Kind), nicht im Fuss. */
  .c-nav__mobile-lang { display: flex; align-items: center; gap: 0.5rem;
    font-family: var(--u-font-body); font-weight: 500; font-size: var(--u-fs-body-small); line-height: 1.375rem;
    color: var(--wp--preset--color--text-secondary); }
  .c-nav__mobile-lang .c-nav__globe { width: 1.25rem; height: 1.25rem; flex: 0 0 auto; }
  /* Node `Column` 304x22 gap 24: Land und Sprache stehen NEBENEINANDER (112 + 24 + 54 = 190 von
     304), nicht an die Kanten gezogen. Das `margin-right: auto`, das hier stand, schob die
     Sprachwahl an den rechten Rand. */
  .c-nav__mobile-lang { gap: 1.5rem; }
  .c-nav__mobile-country { display: inline-flex; align-items: center; gap: 0.5rem; }
  .c-nav__mobile-langs { display: inline-flex; align-items: center; gap: 1rem; }
  /* `.c-nav__link` bringt `padding: 4px 0` mit (Platz fuer den Hover-Unterstrich auf Desktop) —
     damit war die Zeile 30 statt 22 hoch. Im Panel traegt der aktive Zustand die Markierung. */
  .c-nav__mobile-langs .c-nav__link { padding-block: 0; }
  .c-nav__mobile-langs .c-nav__link { color: inherit; }
  .c-nav__mobile-langs .c-nav__link--active { color: var(--wp--preset--color--text-primary); }

  /* Node `Menu Button` 304x36: pad 4/0, Text 20/28 ls-0,6 w400, darunter ein Unterstrich ueber die
     GANZE Breite (`Underline` 304x1) — nicht nur unter dem Wort. 4 + 28 + 4 = 36. */
  /* 🔴 KEINE Trennlinie zwischen den Punkten. Die `Underline`-Ebene im Node (304x1) steht bei
     x = −284 — weit links AUSSERHALB des 344er Panels. Wie beim Menue-Knopf: vorhanden, sichtbar,
     aber nicht an ihrem Platz. Sie deshalb als `border-bottom` zu bauen war doppelt falsch — sie
     machte den Punkt ausserdem 37 statt 36 hoch. */
  .c-nav__acc { position: relative; }
  .c-nav__acc-head { display: flex; align-items: center; justify-content: space-between; width: 100%;
    /* `padding-inline: 0` ist Pflicht: <button> bringt vom User-Agent `padding: 1px 6px` mit.
       Die sechs Akkordeon-Koepfe standen damit 6px weiter rechts als „Kontakt", das ein <a> ist.
       Dritter Fall dieser Falle heute — sie faellt nur im Vergleich zweier Elementtypen auf. */
    padding-block: 0.25rem; padding-inline: 0;
    background: none; border: 0; color: inherit; cursor: pointer; text-align: left;
    font-family: var(--u-font-body); font-weight: 400;
    font-size: 1.25rem; line-height: 1.75rem; letter-spacing: -0.0375rem; }
  .c-nav__acc-head--link { text-decoration: none; }
  .c-nav__acc-chevron { width: 1.25rem; height: 1.25rem; flex: 0 0 auto; transition: transform var(--u-dur-fast) var(--u-ease); }
  .c-nav__acc-head[aria-expanded="true"] .c-nav__acc-chevron { transform: rotate(180deg); }
  /* Node `Menu Item Expanded` gap 20 (Kopf → Inhalt), `Expanded Elements` gap 40 + pad-bottom 40,
     `Submenus` gap 12, `Ressource` pad-top 16. */
  /* Node `Menu Item Expanded` gap 20 (Kopf → Inhalt), `Expanded Elements` gap 40 + pad-bottom 40,
     `Submenus` gap 12. Zwei Ebenen, zwei Gaps — deshalb die eigene Spalten-Box. */
  .c-nav__acc-body { display: flex; flex-direction: column; gap: 2.5rem;
    padding-top: 1.25rem; padding-bottom: 2.5rem; }
  .c-nav__acc-cols { display: flex; flex-direction: column; gap: 0.75rem; }
  .c-nav__acc-body[hidden] { display: none; }
  .c-nav__acc-label { font-family: var(--u-font-body); font-weight: 500;   /* OS 600 gibt es in Figma nicht */
    font-size: 0.75rem; text-transform: uppercase; letter-spacing: 0.04em;
    color: var(--wp--preset--color--text-secondary); }
  /* Node `Submenus` 304x156: vier Punkte a 30 im Abstand 42 — also 22 Zeile + 4/4 Innenabstand,
     Gap 12. Ohne den Innenabstand ist der Schritt 34 statt 42 und die Liste sitzt zu dicht. */
  .c-nav__acc-link { display: block; color: inherit; text-decoration: none;
    padding-block: 0.25rem;
    font-family: var(--u-font-body); font-weight: 500;   /* Node: Menu Button 14/22 w500 */
    font-size: var(--u-fs-body-small); line-height: 1.375rem; }

  /* Feature-Teaser im aufgeklappten Punkt (Node: `Ressource` 304x387, Bild 304x171). */
  /* Node `Ressource` 304x387: Strich oben (INSIDE, 1), pad-top 16, gap 8. Der Abstand zur
     Untermenue-Liste ist 40 (`Expanded Elements` gap) — der 12er-Gap des Koerpers traegt davon
     schon einen Teil, der Rest steht als margin. */
  .c-nav__acc-feature { display: flex; flex-direction: column; gap: 0.5rem; color: inherit; text-decoration: none;
    padding-top: 1rem;                       /* Node `Ressource` pad-top 16, Strich oben */
    border-top: 0.0625rem solid var(--wp--preset--color--border-tertiary); }
  .c-nav__acc-feature-label { font-family: var(--u-font-body); font-weight: 500;
    font-size: var(--u-fs-body-small); line-height: 1.375rem; color: var(--wp--preset--color--text-secondary); }
  .c-nav__acc-feature-title { font-family: var(--u-font-body); font-weight: 500;
    font-size: var(--u-fs-body-regular); line-height: 1.5rem; }
  .c-nav__acc-feature-tags { display: flex; flex-wrap: wrap; gap: 0.5rem; }
  .c-nav__acc-feature-img { width: 100%; height: auto; aspect-ratio: 304 / 171; object-fit: cover;
    border-radius: 0.375rem; display: block; }
  .c-nav__acc-feature-link { display: inline-flex; align-items: center; gap: 0.625rem;
    font-family: var(--u-font-body); font-weight: 500; font-size: var(--u-fs-body-small); line-height: 1.375rem;
    color: var(--wp--preset--color--text-accent); }
  .c-nav__acc-feature-link svg { width: 1.25rem; height: 1.25rem; }

  /* Verlaufskante (Node: `Gradient` 344x108) — liegt UEBER dem Scrollbereich und zeigt an, dass
     dort noch etwas kommt. `pointer-events: none`, sonst faengt sie Taps ab. */
  /* Verlaufskante (Node `Gradient` 344x108 bei y=506, direkt ueber dem Button-Block).
     Sie ist ueber die GANZE Panelbreite gezeichnet, nicht nur ueber den Inhalt — deshalb die
     negativen Seiten (304 + 2x20 = 344). `height: 0` im Fluss: sie soll keinen Platz einnehmen,
     nur ueber dem Scrollende liegen. Der 40er-Gap des Panels wuerde sie sonst zusaetzlich
     abstaenden und die Buttons nach unten schieben.
     `pointer-events: none`, sonst faengt sie Taps ab. */
  /* Box, in der Scrollbereich und Verlaufskante zusammenliegen. `min-height: 0` ist Pflicht,
     sonst schrumpft sie nicht unter ihren Inhalt und das Panel waechst, statt zu scrollen. */
  .c-nav__mobile-body { flex: 1 1 auto; min-height: 0; position: relative; display: flex; }
  .c-nav__mobile-fade {
    position: absolute; left: -1.25rem; right: -1.25rem; bottom: 0;   /* 304 + 2x20 = 344 */
    height: 6.75rem;                                                  /* 108 */
    pointer-events: none;                                             /* sonst faengt sie Taps ab */
    background: linear-gradient(180deg,
      rgba(255, 255, 255, 0) 0%, var(--wp--preset--color--bg-primary) 100%);
  }

  /* Zwei gestapelte Buttons, FEST unten (Node: `Action` 304x106 = 46 + 14 + 46). */
  /* Node `Action` 304x106 = 46 + 14 + 46, ohne Innenabstand — der 40er-Abstand nach oben kommt
     vom Panel-Gap. Die Buttons HUGEN ihren Inhalt (Sekundaer 214, Primaer 188) und stehen links;
     ueber die volle Breite gezogen waren sie beide 304. */
  .c-nav__mobile-foot { flex: 0 0 auto; display: flex; flex-direction: column;
    align-items: flex-start; gap: 0.875rem; }

  /* Die weisse Pille bei offenem Menue laeuft ueber den vorhandenen `--light`-State, den `nav.js`
     mitschaltet. Ein `:has()`-Selektor war der erste Versuch — er MATCHT (per `matches()` geprueft),
     wird von der Engine aber nicht angewandt.

     🔴 Bei offenem Menue bekommt die Pille denselben feinen Ring wie das Panel.
     Der Node gibt beiden einen 1px-Strich in WEISS auf 10 % — auf dem dunklen Hero des
     Figma-Frames trennt der die beiden Flaechen sichtbar, auf hellem Grund ist er unsichtbar.
     Gemessen sind zwischen Pille und Panel 16px (bei 360 wie bei 820), gesehen hat man sie
     trotzdem nicht: zwei weisse Flaechen ohne Kante lesen sich als eine.
     Das ist eine BEWUSSTE Abweichung vom Node — sie macht sichtbar, was dort die Bildtiefe
     erledigt. Faellt sie weg, verschmelzen Pille und Panel auf jeder hellen Seite wieder.

     Eigene Klasse statt `--light`: den Zustand gibt es auch beim Scrollen auf hellen Seiten,
     dort soll die Pille randlos bleiben. `nav.js` setzt `--menu` genau beim Oeffnen. Und statt
     `:has()` — das hat in genau diesem Selektor schon einmal gematcht, ohne angewandt zu werden. */
  .c-nav--menu { box-shadow: 0 0 0 0.0625rem var(--wp--preset--color--border-tertiary); }
}

/* ---- Pillen-Geometrie unter 768 (Node 14077:34805 › Header Navigation) --------------------
   🔴 Auf dem Phone ist die Pille NICHT content-buendig. Der Node zeigt sie 344 breit bei x = 8 —
   also 8 vom Viewport, wie die Karten-Sektionen — mit 20 Innenabstand. Das Logo sitzt damit bei
   28, der Content beginnt bei 24. Die content-buendige Desktop-Geometrie (Bleed + kompensierendes
   padding-left) galt hier bis 2026-08-12 mit: die Pille war 328 statt 344 und stand 16 vom Rand.

   Tablet (768–1279) behaelt die Desktop-Geometrie — dafuer gibt es keine Vorlage (ADR 0010 §1.3). */
@media (max-width: 767px) {
  .c-nav-shell { --nav-bleed: 1rem; }                  /* 312 + 2x16 = 344 */
  .c-nav-shell .c-nav {
    padding-inline: 1.25rem;                           /* 20/20 (Node) — Hoehe kommt aus --nav-pille */
    gap: 0.625rem;                                     /* Node gap 10 */
  }
  /* Logo 112,36 x 24 (Desktop 149,8 x 32). Breite folgt der Hoehe ueber das SVG-Verhaeltnis. */
  .c-nav__logo { width: 7.0225rem; height: 1.5rem; }
}

/* ============================================================= Hero (Node 13674:15301)
   Figma: 1440×860, pt 176 (Navbar-Raum), pb 48, Inhalt oben/unten via justify-between.
   Zwei Overlays über dem Bild: __scrim (vertikal, unten dunkler) + __vignette (horizontal, Ränder dunkler).
   Fakten-Zeile liegt auf dem Projekt-Grid: Tag = 3 Spalten, Fakten = 9 Spalten (Figma 980px = exakt 9 Spalten). */
.c-hero {
  position: relative; display: flex; flex-direction: column; align-items: flex-start;
  /* Figma 860px, aber nie hoeher als der Viewport (User-Vorgabe). svh statt vh: sonst rechnet Mobile
     mit ausgeklappter Adressleiste und der Hero wird beim Scrollen abgeschnitten. */
  min-height: min(53.75rem, 100svh);
  padding-top: 11rem; isolation: isolate; color: var(--wp--preset--color--text-alternate);
}
/* Bild-Clipping als eigene Ebene (nicht overflow:hidden am Hero) — sonst bricht position:sticky
   in der Solutions-Variante (sticky sucht den naechsten Scroll-/Clip-Container). */
.c-hero__media { position: absolute; inset: 0; z-index: -2; overflow: hidden; }
/* object-position Y: kleiner = Bildinhalt wandert nach unten (es wird mehr vom oberen Rand gezeigt).
   Hier so gewaehlt, dass das Gesicht unter der Button-Reihe sitzt und die Headline auf ruhigem Grund liegt. */
/* Bildausschnitt aus der Figma-Crop-Matrix gerechnet, nicht nach Gefuehl gesetzt: der Node traegt
   das Foto als FUELLUNG der Sektion mit `imageTransform`. Desktop [[1,0,0],[0,0.79985,0.08352]]
   → Ausschnitt-Mitte 50 % / 48,3 % → bei `cover` in 1440x860 aus einer 1920er Quelle: 50 % 46 %.
   (Hier stand 50 % 25 % — geschaetzt.) */
.c-hero__bg { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; object-position: 50% 46%; }
/* ---- Hero-Verlauf: EINE Ebene, drei Fuellungen (Node `Gradient`) ------------------------------
   🔴 Hier standen `__scrim` (vertikal) und `__vignette` (horizontal) — unsere Naeherung an zwei
   der drei Fuellungen. Die dritte, eine DIAGONALE Slate-Ebene im Multiply-Modus, fehlte ganz;
   sie ist es, die dem Bild seine Tiefe gibt (User 2026-08-12: „den Gradient mitnehmen").

   Reihenfolge: In CSS steht die OBERSTE Schicht zuerst, in Figma die unterste. Die Liste unten
   ist deshalb gegenueber dem Node gedreht. Die Ebenen-Deckkraft aus Figma ist in die
   Farbwerte eingerechnet (0,3 · 0,6 · 0,6), weil `background-image` keine Schicht-Opacity kennt;
   der Multiply-Modus dagegen kommt ueber `background-blend-mode`, Position fuer Position.

   Werte je Leinwand verschieden — der Node fuehrt sie getrennt, siehe die Mobile-Fassung unten. */
.c-hero__gradient {
  position: absolute; inset: 0; z-index: -1; pointer-events: none;
  background-image:
    /* 3. vertikal, transparent → Schwarz (Ebenen-Opacity 0,3) */
    linear-gradient(180deg, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.3) 100%),
    /* 2. diagonal, Slate → transparent, MULTIPLY (0,6). Winkel aus den Figma-Handles:
          Vektor (1440, 844) auf der 1440x860-Leinwand = 120deg. */
    linear-gradient(120deg, rgba(71, 85, 105, 0.6) 24.52%, rgba(102, 102, 102, 0) 100%),
    /* 1. horizontal, Raender dunkel, Mitte frei (0,6) */
    linear-gradient(270deg,
      rgba(0, 0, 0, 0.6) 0%, rgba(0, 0, 0, 0.3) 10%, rgba(0, 0, 0, 0) 50%,
      rgba(0, 0, 0, 0.3) 90%, rgba(0, 0, 0, 0.6) 100%);
  background-blend-mode: normal, multiply, normal;
}
.c-hero__inner {
  flex: 1 1 auto; display: flex; flex-direction: column; justify-content: space-between;
  align-items: flex-start; padding-bottom: 3rem; position: relative;
}
.c-hero__intro { display: flex; flex-direction: column; align-items: flex-start; gap: 2rem; width: 100%; }
/* Grid statt Flex-Stack (2026-08-05): Headline und Lead tragen Rasterbreiten (6 bzw. 4 Spalten).
   Als Flex-Stack liessen die sich nur ueber `max-width` in px ausdruecken — genau das verbietet
   die Layout-Regel (§3: Breite kommt aus dem Grid). Der Hero-Inner IST `.u-container`, hier gilt
   also dasselbe 12er-Raster wie im Rest der Seite.
   `justify-items: start`, damit Kinder ohne eigene Spanne weiterhin ihre Inhaltsbreite behalten. */
/* 🔴 Ueberschreibungen dieser Klasse duerfen NUR `row-gap` setzen, nie `gap`. Die Shorthand
   verstellt auch den Spalten-Gutter und damit die Rasterbreite: mit `gap: 1.5rem` waren 6 Spalten
   644 statt 648px breit — lautlos, weil das Layout ja weiterhin plausibel aussieht. */
.c-hero__text  {
  display: grid; grid-template-columns: repeat(var(--u-cols), minmax(0, 1fr));
  column-gap: var(--u-gutter); row-gap: 1.25rem;
  justify-items: start; align-content: start; width: 100%;
}
.c-hero__text > * { grid-column: 1 / -1; }
/* 🔴 Jede Spanne hier beginnt EXPLIZIT bei Spalte 1. Mit blossem `span n` sucht die
   Auto-Platzierung die naechste freie Luecke — der Lead (span 4) landete dann RECHTS NEBEN
   der Headline (span 6) in derselben Zeile statt darunter. Ein erzwungener Start bei 1 passt
   nicht mehr in die belegte Zeile und faellt korrekt in die naechste. */
.c-hero__headline {
  font-family: var(--u-font-heading); font-weight: 500;
  font-size: 4rem; line-height: 4rem; letter-spacing: -0.12rem;
}
.c-hero__lead {
  grid-column: 1 / span 4;    /* Figma 426,67 = 4 Rasterspalten (war `max-width: 26.667rem`) */
  font-family: var(--u-font-body); font-weight: 400;
  font-size: 1rem; line-height: 1.5rem; letter-spacing: -0.03rem;
}
.c-hero__actions { display: flex; align-items: center; gap: 0.875rem; }

/* ---- Fakten-Leiste („Talking Numbers") ---- */
.c-hero__facts { display: flex; flex-direction: column; gap: 2rem; width: 100%; }
.c-hero__rule  { height: 0.0625rem; width: 100%; background: var(--wp--preset--color--border-tertiary); opacity: .6; }
.c-hero__facts-row { align-items: start; }              /* .u-grid → 12 Spalten */
.c-hero__facts-tag { grid-column: span 3; justify-self: start;
  backdrop-filter: blur(5rem); -webkit-backdrop-filter: blur(5rem); }
/* Breite kommt weiter aus dem äußeren Grid (span 9); die 5 Fakten selbst liegen HORIZONTAL per Flex
   (space-between verteilt sie über die 9 Spalten) — Anordnung im Element = Flex (Normalfall, §3). */
.c-hero__stats {
  grid-column: span 9; display: flex; flex-wrap: wrap;
  align-items: center; justify-content: space-between; gap: 1.5rem 2rem;
}
.c-hero__fact { display: flex; flex-direction: column; align-items: flex-start; gap: 0.25rem; min-width: 0; }
.c-hero__fact-value {
  font-family: var(--u-font-heading); font-weight: 500;
  font-size: 1.75rem; line-height: 2.125rem; letter-spacing: -0.0175rem; white-space: nowrap;
}
.c-hero__fact-label {
  display: inline-flex; align-items: center; gap: 0.375rem; min-width: 0;
  font-family: var(--u-font-body); font-weight: 500; font-size: 0.875rem; line-height: 1.375rem;
  color: var(--wp--preset--color--border-tertiary); white-space: nowrap;
}
.c-hero__fact-icon { flex: 0 0 auto; width: 1.25rem; height: 1.25rem; }

/* Auf Desktop ist der Klipp-Rahmen nicht im Kastenbaum — die Reihe behaelt ihre 9 Rasterspalten. */
.c-hero__stats-clip { display: contents; }

@media (max-width: 767px) {
  /* Node 14068:26284: Sektion 360x780. Container pad-top 112, darunter der Intro-Block mittig im
     verbleibenden Raum, die Fakten stehen unten. Die 780 sind ein MINDESTMASS, keine feste Hoehe —
     laengere Texte duerfen die Sektion wachsen lassen, statt sie zu ueberlaufen. */
  .c-hero { min-height: 48.75rem; padding-top: 7rem; }              /* 780 / 112 */
  /* Der Node fuehrt den Verlauf mobil ANDERS: unten keine Vignette, sondern eine flaechige
     Schwarz-Fuellung auf 40 %, und die Diagonale steht steiler — Vektor (216, 523) auf der
     360x936-Leinwand = 158deg. Die beiden anderen Ebenen bleiben. */
  .c-hero__gradient {
    background-image:
      linear-gradient(180deg, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.3) 100%),
      linear-gradient(158deg, rgba(71, 85, 105, 0.6) 0.87%, rgba(102, 102, 102, 0) 100%),
      linear-gradient(rgba(0, 0, 0, 0.4), rgba(0, 0, 0, 0.4));
    background-blend-mode: normal, multiply, normal;
  }
  /* Crop-Matrix mobil [[0.3446,0,0.4997],[0,1,0]] → Ausschnitt-Mitte 67,2 % / 50 %, volle Hoehe.
     Bei `cover` in 360x780 aus der 1920er Quelle ergibt das 82 % 50 %. Mit den geerbten
     50 % 25 % zeigte das Bild nur einen hellen Mittelstreifen ohne Personen. */
  .c-hero__bg { object-position: 82% 50%; }
  .c-hero__inner { padding-bottom: 2rem; }                          /* Sektion unten 32 */
  /* Intro fuellt den Raum ueber den Fakten und sitzt darin mittig (Node: Text bei y=204,5 in
     einem 627 hohen Container mit 112 Kopfabstand — das ist genau die Mitte des Rests). */
  .c-hero__intro { flex: 1 1 auto; justify-content: center; gap: 1.25rem; }   /* Node-Gap 20 */

  /* Node › Text: 32/32 w500 ls −0,96 (= −0.03em). Unsere 48/52 waren geschaetzt — die Sektion
     lief dadurch auf 937 statt der gezeichneten 780. */
  .c-hero__headline { font-size: 2rem; line-height: 2rem; letter-spacing: -0.03em; }
  /* 16/24 ls −0,48 — und Gewicht 500, nicht 400. Der Lead ist im Node halbfett. */
  .c-hero__lead { font-size: var(--u-fs-body-regular); line-height: 1.5rem;
    letter-spacing: -0.03rem; font-weight: 500; grid-column: 1 / -1; }

  /* Node › `Action` 304x106 = zwei 46 hohe Buttons mit 14 Gap UNTEREINANDER.
     🔴 Sie HUGEN ihren Inhalt (304 bzw. 188), sie werden NICHT auf die Containerbreite gezogen —
     der Block ist im Node 304 breit, also 8 schmaler als der 312er-Container. Ein gestreckter
     Button waere 312 und damit breiter als alles andere in der Sektion. */
  .c-hero__actions { flex-direction: column; align-items: flex-start; gap: 0.875rem; }
  .c-hero__intro > .c-hero__actions { align-self: flex-start; }
  /* 🔴 Reihenfolge gedreht: im Node steht der dunkle Sekundaer-Button OBEN und der Mint-Button
     darunter — auf Desktop ist es umgekehrt. Ueber `order`, nicht im Markup: die DOM-Reihenfolge
     traegt die Wichtigkeit (Primaeraktion zuerst), und die bleibt fuer Screenreader und
     Tastatur gleich. */
  .c-hero__actions > .c-btn:first-child { order: 2; }

  /* ---- Fakten: Tag → Linie → Reihe (Node-Reihenfolge; im Markup steht die Linie zuerst) ---- */
  .c-hero__facts { gap: 1.25rem; }                                  /* 20 */
  /* `display: contents` loest die Rasterzeile auf, damit Tag und Reihe direkte Flex-Kinder von
     `.c-hero__facts` werden — nur so laesst sich die Linie per `order` dazwischenschieben. */
  .c-hero__facts-row { display: contents; }
  /* 🔴 `align-self`, nicht `justify-self`: die Basisregel richtet den Tag ueber `justify-self:
     start` im Raster aus — mit `display: contents` an der Rasterzeile ist er aber Flex-Kind, und
     dort ist `justify-self` wirkungslos. Er lief dadurch auf die vollen 312 statt der 131 aus
     dem Node. */
  .c-hero__facts-tag { order: 1; align-self: flex-start; }
  .c-hero__rule      { order: 2; }
  .c-hero__stats-clip { order: 3; }

  /* Der Klipp-Rahmen: randlos bis an beide Sektionskanten, und er schneidet ab. Ohne das
     `overflow: hidden` erzeugt die ueberstehende Reihe horizontalen Seiten-Ueberlauf. */
  /* Grundzustand OHNE JS: natives Wischen. `anim-slider.js` uebernimmt die Achse und schaltet
     per `is-gsap` auf `hidden` — nativer Scroll und GSAP-Transform wuerden sich sonst gegenseitig
     verschieben (dieselbe Regel wie bei den Karussells). */
  .c-hero__stats-clip {
    display: block; overflow-x: auto; overflow-y: hidden;
    margin-inline: calc(-1 * var(--u-margin));
    width: calc(100% + 2 * var(--u-margin));
    scrollbar-width: none;
    user-select: none; -webkit-user-select: none;
  }
  .c-hero__stats-clip::-webkit-scrollbar { display: none; }
  .is-gsap .c-hero__stats-clip { overflow-x: hidden; }
  /* EINE Reihe, nicht umgebrochen. Gap 32 aus dem Node. Die Reihe ist breiter als der Viewport —
     das ist beabsichtigt, `anim-marquee.js` laesst sie laufen. Ohne JS steht sie still und zeigt
     die ersten Kennzahlen; der Rest ist dann nicht erreichbar, aber nichts bricht. */
  .c-hero__stats {
    flex-wrap: nowrap; justify-content: flex-start; gap: 2rem;
    width: max-content; padding-inline: var(--u-margin);
  }
  .c-hero__stats .c-hero__fact { flex: 0 0 auto; gap: 0.125rem; }   /* 28 + 2 + 22 = 52 */
  /* Node › Item: Wert 22/28 (Desktop 28/34). Mit der Desktop-Groesse war die Reihe 60 statt 52
     hoch — und schob den ganzen Fakten-Block um 8 nach oben. */
  .c-hero__fact-value { font-size: 1.375rem; line-height: 1.75rem; letter-spacing: -0.01375rem; }
}

/* Navbar über den Hero gelegt (Block-Option overlay=true). Figma: y=20 → top 1.25rem.
   Den vertikalen Platz reserviert der Hero via padding-top; die Navbar nimmt keinen Fluss ein.
   Provisorium bis zum globalen Header-Block. */
.c-nav-overlay { position: absolute; top: 1.25rem; left: 0; right: 0; z-index: 60; }
/* Navbar-Pille sitzt bei 16px Rand (Figma-Component 13253:8377: pill 1392 @ 16px), NICHT an der
   48er-Content-Marge. Der Overlay-Container bekommt darum 16px statt --u-margin -> die Nav-Inhalte
   (Logo/Menue/CTA) stehen dann bündig mit dem Seiten-Content statt 40px nach innen versetzt. */
/* Navbar-Overlay: Container auf 64er-Raster (wie der Seiten-Content) — NICHT mehr 16px.
   Damit der Nav-CONTENT (Logo/CTA) bündig mit dem Content sitzt (Logo=64, CTA-Kante=1376),
   zieht die Pille sich per negativem Margin um ihr eigenes Padding (pl 2.5rem / pr .625rem)
   nach aussen — die Pille umschliesst den Content, statt ihn 40px nach innen zu quetschen. */
.c-nav-overlay .c-nav { margin-inline: -2.5rem -0.625rem; }

/* ============================================================= Logo-Slider (Node 21674:15481)
   „Proof of brands" — 1440×176, sitzt direkt unter dem Hero.
   Höhe = 72 + 32 (Logo) + 72 = 176. Reihe zentriert, läuft über beide Ränder hinaus (Marquee-Optik).
   Rand-Fade = dieselbe Vignette wie im Hero, nur in WEISS (kein Mask) — Stops 1:1 identisch.
   Noch ohne Animation: statischer Zustand. Der Track ist bereits so gebaut, dass GSAP später nur
   noch die X-Position bewegen muss. */
.c-logos {
  position: relative; overflow: hidden;
  padding-block: 4.5rem;
  background: rgba(255,255,255,0.01);
}
.c-logos__track {
  display: flex; align-items: center; justify-content: center;
  gap: 3.5rem;
  /* kein padding-inline: die Reihe ist breiter als der Viewport und überläuft bewusst
     (Figma deklariert px 64, das ist bei 13 Logos wirkungslos — und beim Marquee sogar falsch). */
}
.c-logos__item {
  flex: 0 0 auto; display: flex; align-items: center;
  height: 2rem;                 /* 32px — Logo-Zeilenhöhe aus Figma */
  color: var(--wp--preset--color--text-primary);
  opacity: .6;                  /* einheitlich (Figma mischt 60% / 100%, siehe Doku) */
}
/* width/height kommen als HTML-Attribute vom Block -> Box ist vor dem Laden reserviert.
   Nur die Hoehe deckeln; Breite folgt dem Seitenverhaeltnis. */
.c-logos__item img { display: block; width: auto; max-height: 2rem; }
/* Rand-Fade: weisse Vignette, Stops identisch zur horizontalen Ebene in .c-hero__gradient */
/* Randmaske. Deckender gemacht (User 2026-08-05): der Figma-Verlauf war fuer eine STATISCHE
   Reihe gezeichnet — dort muss er nur andeuten, dass es weitergeht. Seit die Reihe laeuft, muessen
   die Logos an den Raendern wirklich verschwinden, sonst poppen sie sichtbar rein und raus.
   Deshalb: aussen voll deckend (1 statt 0.6) und der Uebergang faellt frueher auf 0 (35 % statt
   50 %), damit die Mitte trotzdem klar bleibt. */
.c-logos__fade {
  position: absolute; inset: 0; pointer-events: none;
  background: linear-gradient(270deg,
    rgba(255,255,255,1) 0%, rgba(255,255,255,0.92) 8%, rgba(255,255,255,0) 35%,
    rgba(255,255,255,0) 65%, rgba(255,255,255,0.92) 92%, rgba(255,255,255,1) 100%);
}
@media (max-width: 767px) {
  .c-logos { padding-block: var(--u-s-72); }   /* 40 (Node), war 48 */
  /* Kein Gap-Override: der Mobil-Node (14068:26458) fuehrt 56 wie der Desktop. */
}

/* ============================================================= Row-List (Node 21674:15610)
   „Wo möchten Sie ansetzen?" — 4 Bedarfs-Einstiege (IA: Solutions „By Need").
   Figma annotiert die Sektion selbst mit „gsap Nr. 30": Hover auf eine Zeile enthüllt ein Bild,
   das der Maus vertikal folgt. HIER NUR HTML/CSS — die Bewegung kommt im GSAP-Pass.
   Zeilen-Raster: 4 (Titel) + 3 (Bild-Slot) + 4 (Text) + 1 (Icon) = 12 Spalten. */
.c-rowlist { position: relative;
  background: var(--wp--preset--color--bg-primary);
  padding-block: 5rem 6rem;
  display: flex; flex-direction: column; gap: 4rem;
}
.c-rowlist__headline {
  grid-column: span 7;                                  /* Figma: Columns/7 Columns = 758,67 */
  font-family: var(--u-font-heading); font-weight: 500;
  font-size: var(--u-fs-h2); line-height: 3.5rem; letter-spacing: -0.0975rem;
  color: var(--wp--preset--color--text-primary);
}
.c-rowlist__headline em { font-style: normal; color: var(--wp--preset--color--text-tertiary); }

/* Bühne: Bezugsrahmen für das mitwandernde Bild (GSAP rechnet Y gegen diese Box). */
.c-rowlist__stage { position: relative; }
.c-rowlist__list { list-style: none; padding: 0; }   /* UA-Default padding-inline-start: 40px */
/* Trennstrich als inset-Shadow statt border: Figma-Strokes vergroessern den Frame nicht,
   eine echte border schon. Nachgemessen: Zeilen-Pitch im Design = exakt 106 INKL. Strich.
   Die Zeilenhoehe entsteht ohnehin aus dem 3-zeiligen Fliesstext (3x22 + 2x20 = 106). */
.c-rowlist__row { box-shadow: inset 0 -0.0625rem 0 var(--wp--preset--color--border-tertiary); }
.c-rowlist__link {
  display: block; text-decoration: none;
  min-height: 6.625rem;                                  /* 106 */
  padding-block: 1.25rem;                                /* 20 */
}
.c-rowlist__inner { align-items: center; }               /* .u-grid */
.c-rowlist__title {
  font-family: var(--u-font-heading); font-weight: 500;
  font-size: var(--u-fs-h6); line-height: 1.75rem; letter-spacing: -0.0125rem;
  color: var(--wp--preset--color--text-secondary);
  transition: color var(--u-dur-fast) var(--u-ease);
}
.c-rowlist__body {
  font-family: var(--u-font-body); font-weight: 500;
  font-size: var(--u-fs-body-small); line-height: 1.375rem;
  color: var(--wp--preset--color--text-primary);
  opacity: 0; transition: opacity var(--u-dur-fast) var(--u-ease);
}
.c-rowlist__icon { display: flex; justify-content: flex-end; color: var(--wp--preset--color--text-accent); }
.c-rowlist__icon svg { width: 1.25rem; height: 1.25rem; }
/* Aktive Zeile: Titel dunkel, Beschreibung sichtbar. :hover fürs Statische,
   .is-active als Haken für den GSAP-Pass (Touch/Keyboard). */
.c-rowlist__row:hover .c-rowlist__title,
.c-rowlist__row.is-active .c-rowlist__title { color: var(--wp--preset--color--text-primary); }
.c-rowlist__row:hover .c-rowlist__body,
.c-rowlist__row.is-active .c-rowlist__body { opacity: 1; }

/* ---------------------------------------------------------------------------
   Variante „industries" (Node 13684:2334 „06 Branchen Übersicht").
   BEWUSST dieselben Klassen wie die Bedarfs-Liste: identische GSAP-Haken
   (__stage/__list/__row/__medias/__media) → EIN Script instanziiert beide Listen
   per querySelectorAll. Nur das Raster und die Zeilenhoehe unterscheiden sich.
   Raster: 5 (Titel) + 4 (Bild) + 3 (Icon) = 12   statt   4 + 3 + 4 + 1.
   --------------------------------------------------------------------------- */
.c-rowlist--industries .c-rowlist__link { min-height: 0; padding-block: 1.625rem; }   /* py 26 */
.c-rowlist--industries .c-rowlist__title { grid-column: span 5; }
.c-rowlist--industries .c-rowlist__slot  { grid-column: span 4; }
.c-rowlist--industries .c-rowlist__icon  { grid-column: span 3; }
.c-rowlist--industries .c-rowlist__body  { display: none; }                            /* keine Textspalte */
/* Bild fuellt hier die volle 4-Spalten-Zelle (quer), statt 2 Spalten zentriert (4:5). */
.c-rowlist--industries .c-rowlist__media-anchor { grid-column: 6 / span 4; }
.c-rowlist--industries .c-rowlist__media {
  width: 100%; aspect-ratio: 426.67 / 256.65;                                          /* Figma-Maße */
}

/* Kopfzeile: Headline + Buttons nebeneinander (nur wo Buttons gesetzt sind) */
.c-rowlist__header { align-items: end; }                       /* .u-grid */
.c-rowlist__actions {
  grid-column: span 5; justify-self: end;
  display: flex; align-items: center; gap: 0.875rem;           /* 14 */
}

/* Kopfzeile-Variante „lead" (Node 13690:19337 „02 Branchen Übersicht"): Fliesstext neben der
   Headline statt Buttons daneben. Lead (4) + 1 Spalte Rest, per Grid-Konstruktion.
   Zeile 2 (Button) darunter, linksbündig — daher grid-row statt zweitem Flex-Container.

   🔴 KONVENTION: Zeilenumbrüche in Überschriften entstehen über die SPALTENBREITE, nie über
   <br>/\n im Inhalt. Figmas H2-Box misst hier 7 Spalten und bricht darin nach „eine". 7 Spalten
   tragen das aber nicht über die Breite: der Container ist fluid, die Spalten wachsen also mit dem
   Viewport, die Schrift nur mit der Root-Font-Size — ab ca. 1720px kippt die Headline auf eine
   Zeile. 6 Spalten halten den Figma-Umbruch durchgängig.
   Der Lead startet deshalb auf einer FESTEN Spalte (8) statt per Auto-Placement — sonst rückt er
   der schmaleren Headline nach und verlässt seinen Figma-Platz (x 838,67). */
.c-rowlist__header--lead { row-gap: 2rem; }                    /* 32, statt der 16 aus .u-grid */
.c-rowlist__header--lead .c-rowlist__headline { grid-row: 1; grid-column: span 6; }
.c-rowlist__lead {
  grid-row: 1; grid-column: 8 / span 4; align-self: end;
  font-family: var(--u-font-body); font-weight: 400;
  font-size: var(--u-fs-body-regular); line-height: 1.5rem; letter-spacing: -0.03rem;
  color: var(--wp--preset--color--text-secondary);
}
.c-rowlist__header--lead .c-rowlist__actions { grid-row: 2; grid-column: span 5; justify-self: start; }

/* --- Bild-Ebene: liegt über den Zeilen, fängt keine Maus ab --- */
.c-rowlist__media-layer { position: absolute; inset: 0; pointer-events: none; }
.c-rowlist__media-layer > .u-grid { height: 100%; }
.c-rowlist__media-anchor { grid-column: 5 / span 3; position: relative; }  /* der Bild-Slot der Zeile */
/* 2 Spalten breit, im 3-Spalten-Slot zentriert — aus dem Grid gerechnet, keine festen px.
   KEIN transform hier: das gehört GSAP (yPercent/y). X-Zentrierung darum via margin-inline. */
.c-rowlist__media {
  --slot-col: calc((100% - 2 * var(--u-gutter)) / 3);
  position: absolute; top: 0; left: 0; right: 0; margin-inline: auto;
  width: calc(2 * var(--slot-col) + var(--u-gutter));
  aspect-ratio: 4 / 5;                                   /* Figma 205,33 × 256,65 */
  border-radius: 0.375rem;                               /* 6 */
  box-shadow: 0.5rem 0.5rem 1.5rem rgba(0,0,0,0.05);     /* Figma Shadow/Below */
  overflow: hidden;
  visibility: hidden;                                    /* GSAP: .is-on schaltet sichtbar */
}
.c-rowlist__media.is-on { visibility: visible; }
/* Die beiden folgenden Regeln gelten den Elementen, die GSAP zur Laufzeit einfügt (Masken-Reveal):
   Wrapper startet über der Maske, das Bild fast komplett darunter — beide laufen auf 0. */
.c-rowlist__media > div {
  position: absolute; inset: 0; overflow: hidden; transform: translate(0, -100%);
}
.c-rowlist__media img {
  position: absolute; inset: 0; width: 100%; height: 100%;
  object-fit: cover; display: block; transform: translate(0, 90%);
}
/* Vorlade-Liste: index-gleich zu den Zeilen. GSAP liest hier die URLs. */
.c-rowlist__medias img {
  position: absolute; top: 0; left: 0; width: 1px; height: 1px;
  visibility: hidden; pointer-events: none;
}

@media (max-width: 767px) {
  /* Node 14096:37398 (Bedarf): 56/56, gap 32. Node 14077:36848 (Branchen): 72/72, gap 32.
     56 steht in keinem Mobile-Token (die Tabelle bildet 80→48 und 96→72 ab) — ausgeschrieben. */
  .c-rowlist { padding-block: 3.5rem; gap: 2rem; }
  .c-rowlist--industries { padding-block: 4.5rem; }
  /* Buttons stehen im Frame UNTER der Liste (Node 14077:36848: `Action` bei y 752, gestapelt,
     gap 14). Header-Huelle und Grid mobil aufloesen (`display: contents`), damit Headline und
     Aktionen Flex-Kinder der Sektion werden und die Aktionen per `order` ans Ende ruecken.
     Der Sektions-Gap (32) traegt dann alle Abstaende: Headline→Liste und Liste→Buttons. */
  .c-rowlist > .u-container, .c-rowlist__header { display: contents; }
  .c-rowlist__headline { padding-inline: 1.5rem; font-size: 1.625rem; line-height: 2rem; letter-spacing: -0.0488rem;   /* Figma Mobil-H3 26/32, ls -3% */ }
  .c-rowlist__lead { padding-inline: 1.5rem; }
  /* column-REVERSE: der Frame stellt den Sekundaer-CTA (254) ueber den Primaer (188) —
     dasselbe Muster wie CTA-Sektion und Hero; das Markup behaelt den Primaer zuerst. */
  .c-rowlist__actions { order: 5; padding-inline: 1.5rem; flex-direction: column-reverse; align-items: flex-start; gap: 0.875rem; }
  /* Industries-Titel sind im Node auf 8 Mobil-Spalten gedeckelt (205,33) — laengere
     Branchennamen brechen um (Zeile 76 statt 54), der Pfeil sitzt am rechten Rand. */
  .c-rowlist--industries .c-rowlist__inner { justify-content: space-between; }
  .c-rowlist--industries .c-rowlist__title { flex: 0 0 calc(8 * var(--u-col) + 7 * var(--u-gutter)); }
  /* Zeilen nach Node 14199:53683: eine Zeile Titel (SG 500 16/22, ls -1%) + Pfeil rechts,
     Hoehe 54 = 16 + 22 + 16. Kein Raster — der Titel FUELLT bis zum 20er-Icon (276 ist
     keine Spaltenbreite), also Flex. Das Bild parkt im Node AUSSERHALB des Frames (x 561)
     und die Beschreibung ist ausgeblendet; Zeile 2 des Frames illustriert den offenen
     Zustand (.is-active-Haken, Body 14/22 unter dem Titel) — Standard bleibt zu, wie beim
     FAQ (ADR 0010 Teil 3). */
  .c-rowlist__inner { display: flex; flex-wrap: wrap; align-items: center; gap: 1rem; }
  .c-rowlist__link, .c-rowlist--industries .c-rowlist__link { min-height: 0; padding-block: 1rem; }
  .c-rowlist__title { flex: 1 1 0; min-width: 0; font-size: 1rem; line-height: 1.375rem; letter-spacing: -0.01rem; }
  .c-rowlist__slot { display: none; }
  .c-rowlist__icon { flex: 0 0 auto; }
  .c-rowlist__body, .c-rowlist__media-layer { display: none; }   /* kein Hover auf Touch */
  .c-rowlist__row.is-active .c-rowlist__body { display: block; flex: 0 0 100%; }
}

/* ============================================================= Footer (Node 21674:15698)
   Dunkle Flaeche, zwei Spalten die sich vertikal auseinanderziehen (justify-between):
   links Newsletter (4 Sp.) + Logo unten, rechts Menue (6 Sp.) + CTA und darunter 3 Link-Spalten (je 2 Sp.).
   Figma-Breiten = Spalten: 426,67 = 4 · 647,33 ≈ 6 · 205,33 = 2 · 869 ≈ 8. */
.c-footer {
  background: var(--wp--preset--color--bg-alternate);
  color: var(--wp--preset--color--text-alternate);
  padding-block: 5rem 2rem;                       /* 80 / 32 */
  display: flex; flex-direction: column; gap: 6rem;  /* 96 */
}
.c-footer__top { align-items: stretch; }          /* .u-container > .u-grid */

/* ---- links: Newsletter + Logo ---- */
.c-footer__newsletter {
  grid-column: span 4;
  display: flex; flex-direction: column; justify-content: space-between; gap: 4rem;
}
.c-footer__signup {
  /* Figma: 316 = 3 Spalten in einer 4-Spalten-Zelle -> aus dem Grid gerechnet, kein px. */
  --nl-col: calc((100% - 3 * var(--u-gutter)) / 4);
  max-width: calc(3 * var(--nl-col) + 2 * var(--u-gutter));
  display: flex; flex-direction: column; gap: 2rem;   /* 32 */
}
.c-footer__claim {
  font-family: var(--u-font-heading); font-weight: 500;
  font-size: var(--u-fs-h4); line-height: 2.125rem; letter-spacing: -0.0175rem;  /* 28/34 */
}
.c-footer__claim em { font-style: normal; color: var(--wp--preset--color--text-tertiary); }
.c-footer__field-group { display: flex; flex-direction: column; gap: 0.25rem; }   /* 4 */
.c-footer__field-label {
  padding-right: 0.375rem;                        /* 6 */
  font-family: var(--u-font-body); font-weight: 500;
  font-size: var(--u-fs-body-small); line-height: 1.375rem;
  color: var(--wp--preset--color--text-tertiary);
}
.c-footer__field {
  display: flex; align-items: center; gap: 0.25rem;
  padding: 0.75rem;                               /* 12 */
  border-radius: 0.375rem;                        /* 6 */
  background: rgba(251,251,251,0.1);
}
.c-footer__input {
  flex: 1 1 auto; min-width: 0;
  background: none; border: 0; padding: 0;
  font-family: var(--u-font-body); font-weight: 400;
  font-size: var(--u-fs-body-medium); line-height: 1.625rem; letter-spacing: -0.03375rem;  /* 18/26 */
  color: var(--wp--preset--color--text-alternate);
}
.c-footer__input::placeholder { color: var(--wp--preset--color--text-alternate); opacity: 1; }
.c-footer__input:focus-visible { outline: 0.125rem solid var(--wp--preset--color--accent); outline-offset: 0.25rem; }
.c-footer__submit {
  flex: 0 0 auto; background: none; border: 0; cursor: pointer;
  display: inline-flex; align-items: center; gap: 0.625rem;   /* 10 */
  font-family: var(--u-font-body); font-weight: 500;
  font-size: var(--u-fs-body-small); line-height: 1.375rem;
  color: var(--wp--preset--color--text-quinary, var(--wp--preset--color--accent));
}
.c-footer__logo { width: 8.617rem; height: 4.5rem; color: var(--wp--preset--color--text-alternate); }  /* 137,879 x 72 */
.c-footer__logo svg { width: 100%; height: 100%; display: block; }

/* ---- rechts: Menue + CTA, darunter Link-Spalten ---- */
.c-footer__nav {
  grid-column: span 8;
  --nav-col: calc((100% - 7 * var(--u-gutter)) / 8);   /* Spaltenbreite INNERHALB der 8er-Zelle */
  display: flex; flex-direction: column; justify-content: space-between; gap: 4rem;
}
.c-footer__menu-row { display: flex; align-items: flex-start; gap: var(--u-gutter); padding-bottom: 0.5rem; }
.c-footer__menu {
  width: calc(6 * var(--nav-col) + 5 * var(--u-gutter));   /* Figma 647,33 = 6 Spalten */
  display: flex; flex-direction: column; gap: 1rem;        /* 16 */
  list-style: none; padding: 0;
}
.c-footer__menu a {
  font-family: var(--u-font-heading); font-weight: 500;
  font-size: var(--u-fs-h3); line-height: 2.75rem; letter-spacing: -0.0675rem;   /* 36/44 */
  color: inherit; text-decoration: none;
}
/* Der frühere Footer-CTA war bewusst groesser als der Standard-Button (Figma px 30 / py 22,
   18/26). Seit er der Navbar-Button MIT Dropdown ist, gilt die Navbar-Groesse — die Extra-Regel
   ist damit entfallen (User, 2026-08-03: „hier wirkt der riesig"). */
/* Der CTA ist derselbe helle Button MIT Dropdown wie in der Navbar (User, 2026-08-03).
   `position: relative` macht den Wrapper zum Bezugspunkt fuer das absolut gesetzte Panel —
   sonst haenge es an der Sektion und liefe aus dem Footer heraus. */
.c-footer__cta-wrap { position: relative; flex: 0 0 auto; }
/* Oeffnet nach UNTEN wie in der Navbar (User-Entscheidung) — `.c-nav__panel` bringt das
   `top: calc(100% + 1.25rem)` schon mit, hier ist also nichts zu ueberschreiben.
   Die Rechtsbuendigkeit rechnet `nav.js` (Schluessel `cta`) selbst. */
/* Der Panel-Grund ist weiss — die Links darin duerfen nicht die hellen Footer-Farben erben. */
.c-footer__cta-panel .c-nav__link { color: var(--wp--preset--color--text-primary); }

/* Seit Backlog #21 VIER Spalten (Ressources · Best of · Unternehmen · Socials). Sie fuellen die
   8er-Zelle exakt aus — 4×(2·nav-col + gutter) + 3 Flex-gaps = 8·nav-col + 7·gutter = 100 % —
   die Socials sitzen dadurch von selbst an der rechten Kante, ohne Hilfs-Margin. */
.c-footer__cols { display: flex; align-items: flex-start; gap: var(--u-gutter); }
.c-footer__col {
  width: calc(2 * var(--nav-col) + var(--u-gutter));   /* Figma 205,33 = 2 Spalten */
  display: flex; flex-direction: column; gap: 1.25rem; /* 20 = Titel → Liste */
}
.c-footer__col-title {
  font-family: var(--u-font-body); font-weight: 500;
  font-size: var(--u-fs-body-small); line-height: 1.375rem;
  color: var(--wp--preset--color--text-tertiary);
  /* Abstand kommt aus dem `gap` der Spalte, nicht mehr aus einem margin-bottom (Hausregel:
     Abstaende nur ueber gap; stand so auch im Konventions-Audit). */
}
.c-footer__list { list-style: none; padding: 0; display: flex; flex-direction: column; gap: 1rem; }
.c-footer__list a {
  display: inline-flex; align-items: center; gap: 0.625rem;   /* 10 (Social-Icon) */
  font-family: var(--u-font-body); font-weight: 500;
  font-size: var(--u-fs-body-small); line-height: 1.375rem;
  color: var(--wp--preset--color--text-alternate); text-decoration: none;
}
.c-footer__list svg { flex: 0 0 auto; width: 1.25rem; height: 1.25rem; }
/* Legal-Fortsetzung der Socials-Spalte gibt es NUR mobil (Node 14106:42449) — auf Desktop
   tragen Privacy/Terms/Imprint die Fuss-Zeile neben dem Copyright. */
.c-footer__list--legal { display: none; }

/* ---- Fusszeile ---- */
.c-footer__foot { display: flex; align-items: center; justify-content: space-between; gap: 1.5rem; }
.c-footer__legal, .c-footer__legal ul { display: flex; align-items: center; gap: 1rem; }
.c-footer__legal ul { gap: 0.625rem; list-style: none; padding: 0; }
.c-footer__legal, .c-footer__legal a {
  font-family: var(--u-font-body); font-weight: 500;
  font-size: var(--u-fs-body-small); line-height: 1.375rem;
  color: var(--wp--preset--color--text-alternate); text-decoration: none;
}
.c-footer__meta { display: flex; align-items: center; gap: 1.5rem; }   /* 24 */
.c-footer__country { display: inline-flex; align-items: center; gap: 0.5rem; }
.c-footer__country, .c-footer__lang a {
  font-family: var(--u-font-body); font-weight: 500;
  font-size: var(--u-fs-body-small); line-height: 1.375rem;
  color: var(--wp--preset--color--text-quarternary, var(--wp--preset--color--border-tertiary));
  text-decoration: none;
}
.c-footer__lang { display: inline-flex; align-items: center; gap: 0.375rem; }
.c-footer__lang a--current, .c-footer__lang .is-current { text-decoration: underline; }

/* Elemente, die es nur unter 768 gibt (Node 14106:42449): Kontakt als sechster Menuepunkt,
   die zwei ausgeschriebenen CTA-Buttons, Legal-Links in der Socials-Spalte, Land/Sprache als
   Spalten-Reihe, das grosse Logo im Fuss. Auf Desktop traegt der Fuss Legal + Meta selbst. */
.c-footer__menu-li--mobil, .c-footer__actions,
.c-footer__col--mobil, .c-footer__logo--foot { display: none; }

@media (max-width: 767px) {
  .c-footer { padding-block: 3rem 1.5rem; gap: 3rem; }        /* Node pad 48/24/24 */
  .c-footer__newsletter, .c-footer__nav { grid-column: 1 / -1; }
  /* 🔴 Der Abstand Newsletter → Links kommt aus dem RASTER, nicht aus `.c-footer`. Beide sind
     Kinder von `.c-footer__top` (ein `.u-grid`), und dessen `row-gap` ist der Gutter — mobil 8.
     Der 48er-Gap der Sektion greift eine Ebene zu hoch und war deshalb wirkungslos: gemessen
     lagen 8 zwischen den Bloecken, der Node fuehrt 48 (Newsletter endet 200, Container ab 248). */
  .c-footer__top { row-gap: 3rem; }
  /* Node `Frame 27354` gap 20 (Claim endet 104, Feld-Gruppe ab 124) — Desktop hat 32. */
  .c-footer__signup { max-width: none; gap: 1.25rem; }
  /* Node: 22/28, nicht die Desktop-Groesse 28/34. Zwei Zeilen sind damit 56 statt 68 hoch. */
  .c-footer__claim { font-size: 1.375rem; line-height: 1.75rem; letter-spacing: -0.0138rem; }
  /* Das grosse Logo im Newsletter-Block ist im Node ausgeblendet (`visible: false`) — es steht
     stattdessen unten im Fuss. */
  .c-footer__newsletter > .c-footer__logo { display: none; }

  /* Hauptmenue: 6 Punkte a 24/30 im Schritt 46 (Node `Menu` 312x260 gap 16). */
  .c-footer__menu { width: 100%; display: flex; flex-direction: column; gap: 1rem; }
  .c-footer__menu a { font-size: var(--u-fs-h5); line-height: 1.875rem; }
  .c-footer__menu-li--mobil { display: block; }
  .c-footer__menu-row { flex-direction: column; gap: 2rem; }   /* Menu → Action 32 (Node) */
  /* Node `Container` gap 48 (Menue-Block → Spalten-Reihen). Desktop fuehrt hier 64. */
  .c-footer__nav { gap: 3rem; }

  /* CTA: das Dropdown weicht den zwei ausgeschriebenen Buttons (Node `Action` 304x106).
     Sie hugen ihren Inhalt und stehen links — wie im Hero und im Burger-Panel. */
  .c-footer__cta-wrap { display: none; }
  .c-footer__actions { display: flex; flex-direction: column; align-items: flex-start; gap: 0.875rem; }
  /* `.c-btn--secondary` traegt dunklen Text — auf dem violetten Footer unlesbar. Der Node gibt
     dem Knopf den hellen Rand (#e2e8f0) und helle Schrift. */
  .c-footer__actions .c-btn--secondary { color: var(--wp--preset--color--text-alternate); }

  /* Node 14106:42449: die Link-Spalten stapeln NICHT einzeln, sie stehen paarweise —
     drei `row`-Bloecke mit je zwei Spalten a 152 (= span 6), Gutter 8 dazwischen. */
  /* Reihen-Abstand 48 AUSGESCHRIEBEN: `--u-s-48` kippt mobil auf 20, der Node fuehrt zwischen
     den drei Spalten-Reihen aber echte 48 (row-Starts 702/1004/1344). Die Abstands-Tabelle ist
     eine gestaltete Kurve — hier hat die Designerin sie bewusst nicht angewandt. */
  .c-footer__cols { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 3rem var(--u-gutter); }
  /* 🔴 `align-self: stretch` ist Pflicht, nicht Kosmetik: `.c-footer__cols` traegt
     `align-items: flex-start`. Ohne die Streckung waechst die Socials-Spalte nur auf
     Inhaltshoehe (gemessen 244,5 statt 295,5 Zeilenhoehe) — dann hat `margin-top: auto`
     der Legal-Liste keinen Freiraum zu verteilen und sie steht 51px zu hoch. */
  .c-footer__col { width: auto; display: flex; flex-direction: column; align-self: stretch; }
  /* Node 14106:42449: Privacy/Terms/Imprint schliessen die Socials-Spalte nach UNTEN ab,
     buendig mit „Karriere" der Nachbarspalte (beide enden bei y −11923,3). Die Luecke
     darueber misst im Node 92 — das ist Restraum, kein gestalteter Wert, also `margin-top:
     auto` statt einer festen Zahl. Die Grid-Zelle streckt die Spalte bereits auf Zeilenhoehe,
     deshalb genuegt das. Abstand zwischen den Eintraegen kommt aus `.c-footer__list` (16). */
  .c-footer__list--legal { display: flex; margin-top: auto; padding-top: 1rem; }
  /* `flex`, nicht `block`: das Einblenden darf die Spalten-Basis (flex column, gap 20 =
     Titel→Liste) nicht aushebeln — mit `block` fehlte der 20er-Abstand in Land/Sprache. */
  .c-footer__col--mobil { display: flex; }
  /* Die <li> sind Zeilenboxen um inline-flex-Links (22 hoch) und addieren ~0,5-3,5px Leading —
     die Spaltenzeilen liefen dadurch auf 257/295,5/67,5 statt der Node-Werte 254/292/64.
     Als Flex-Container ist das <li> exakt so hoch wie sein Link. */
  .c-footer__list li { display: flex; }

  /* Fuss: oben grosses Logo links + (c)2026 rechts, NEBENEINANDER und unten buendig
     (Node `Frame 1000004221`: Logo 152x79,4 bei x=24, Copyright bei x=205/y=1513) — darunter
     die Legal-Links als eigene Zeile, buendig am unteren Ende des Footers.

     🔴 ZURUECKGENOMMEN am 2026-08-13 (User): „legal im footer bitte wie in figma als Spalte
     unten buendig". Vorher stand hier eine bewusste Abweichung vom Node (User 2026-08-12) —
     Privacy/Terms/Imprint sollten an den Fuss statt in die Socials-Spalte. Mobil gilt jetzt
     wieder der Node: die drei Links schliessen die Socials-Spalte nach unten ab.
     DESKTOP bleibt unveraendert bei der Fuss-Zeile.

     Raster statt Flex, weil drei Bloecke auf zwei Zeilen liegen und `.c-footer__legal` sie zu
     zweit umschliesst: `display: contents` loest die Huelle auf, damit Copyright und Linkliste
     getrennt platziert werden koennen. */
  .c-footer__foot { display: grid; grid-template-columns: auto minmax(0, 1fr); align-items: end;
    gap: 1.5rem var(--u-gutter); }
  /* height: auto ist Pflicht: die Basis `.c-footer__logo` deckelt auf 4.5rem (72) — bei 152
     Breite ist das gestapelte Logo aber 79,37 hoch (Node), das SVG lief 7px aus der Box. */
  .c-footer__logo--foot { display: block; grid-column: 1; grid-row: 1; width: 9.5rem; height: auto; }   /* 152x79,37 */
  .c-footer__logo--foot svg { width: 100%; height: auto; }
  .c-footer__legal { display: contents; }
  .c-footer__legal > span { grid-column: 2; grid-row: 1; justify-self: end; align-self: end; }
  /* Der Fuss traegt mobil NUR Logo + Copyright — `Frame 1000004221` (312x79,37) fuehrt
     nichts weiter. Die Legal-Links stehen jetzt in der Socials-Spalte. */
  .c-footer__legal ul { display: none; }
  .c-footer__legal-li--desktop { display: none; }   /* Kontakt steht mobil im Hauptmenue */
  .c-footer__meta { display: none; }                /* Land/Sprache stehen mobil in den Spalten */
}

/* ============================================================= Stats-Slider (Node 21674:15618)
   Vollflaechige Bildkarte, 16px vom Viewport-Rand eingerueckt (Sektion px 16, Karte 1408 = 1440-32).
   Kartenhoehe 774 = Figma-Token „Screen/Screen Height 0,9" (0,9 x 860).
   Oben die Headline, unten Stepper + aktueller Wert + CTA (justify-between).
   NOCH OHNE Slider-Logik: der 2. Schritt ist aktiv wie im Design; das Umschalten kommt im GSAP-Pass. */
.c-stats { position: relative; background: var(--wp--preset--color--bg-primary); padding-inline: 1rem; }   /* 16 */
.c-stats__card {
  position: relative; isolation: isolate; overflow: hidden;
  /* Grid statt Flex-Stack: die Headline ist 4 Rasterspalten breit und soll das auch sagen.
     `align-content: space-between` ersetzt das bisherige `justify-content: space-between` —
     die vertikale Verteilung Headline/Slider bleibt damit identisch.
     ⚠️ Bezugsrahmen ist die CONTENT-BOX DER KARTE, nicht der Seiten-Container. Bei 1440px sind
     beide exakt 1312px breit (Karte: 100vw - 2rem Sektionsrand - 6rem Innenabstand; Container:
     100vw - 2x4rem Rand), darunter laufen sie um wenige Pixel je Spalte auseinander. Das ist
     genauer als der fruehere feste `max-width`-Wert und bleibt beim Skalieren stabil. */
  display: grid; grid-template-columns: repeat(var(--u-cols), minmax(0, 1fr));
  column-gap: var(--u-gutter); align-content: space-between;
  min-height: 48.375rem;                          /* 774 */
  padding: 3.5rem 3rem 3rem;                      /* 56 / 48 / 48 */
  border-radius: 1rem;                            /* 16 */
  background: var(--wp--preset--color--bg-tertiary);
  color: var(--wp--preset--color--text-alternate);
}
.c-stats__bg { position: absolute; inset: 0; z-index: -2; width: 100%; height: 100%; object-fit: cover; }
/* Figma: mix-blend-multiply, 14,29deg, bg-quinary 8,08% -> transparent 65,11% */
.c-stats__tint {
  position: absolute; inset: 0; z-index: -1; pointer-events: none; mix-blend-mode: multiply;
  background: linear-gradient(14.292849528964496deg,
    var(--wp--preset--color--surface-darkgrey) 8.0806%, rgba(102,102,102,0) 65.11%);
}
.c-stats__card > .c-stats__slider { grid-column: 1 / -1; }
.c-stats__headline {
  grid-column: 1 / span 4;   /* Figma 426,67 = 4 Rasterspalten (die Karte traegt jetzt das Raster) */
  font-family: var(--u-font-heading); font-weight: 500;
  font-size: var(--u-fs-h2); line-height: 3.5rem; letter-spacing: -0.0975rem;   /* 52/56 */
}
/* Zeilen-Maske fuer den Fliesstext-Reveal (von anim-text.js injiziert, SplitText liefert die Zeilen).
   🔴 `clip-path` mit negativem Inset ist Pflicht: `overflow: hidden` allein schneidet im
   RUHEZUSTAND die Unterlaengen ab (g, p, j). Der Bleed gibt vertikal Luft zurueck, klemmt aber
   noch fest genug, dass die um 110 % nach unten versetzte Startlage unsichtbar bleibt. */
.ig-line-mask {
  display: block;
  overflow: hidden;
  clip-path: inset(-0.25em 0 -0.25em 0);
}
.ig-line { display: block; will-change: transform; }

/* Maske fuer den Zeilen-Reveal der Subline (von anim-stats.js injiziert).
   🔴 `clip-path` mit negativem Inset ist kein Zierrat: `overflow: hidden` allein wuerde im
   RUHEZUSTAND Ober- und Unterlaengen abschneiden (g, p, j). Der Bleed laesst vertikal wieder
   Luft, klemmt aber immer noch fest genug, dass der um eine volle Zeilenhoehe nach unten
   versetzte Startzustand unsichtbar bleibt. */
.c-stats__subline-mask {
  overflow: hidden;
  clip-path: inset(-0.35em 0 -0.35em 0);
}
.c-stats__slider { display: flex; flex-direction: column; gap: 1.25rem; }        /* 20 */

/* Stepper: 5 gleich breite Schritte; aktiv = weiss + 3px, sonst 1px @60% */
.c-stats__stepper { display: flex; align-items: center; gap: var(--u-gutter); }
/* Der Strich ist die UNGEFUELLTE Spur — dieselbe Farbe fuer alle Schritte, aktiv wie inaktiv.
   🔴 `opacity` gehoert NICHT hierher: sie wuerde die weisse Fuellung mitdimmen und der Balken
   waere nie voll deckend. Die Daempfung steckt deshalb in der Farbe selbst. */
.c-stats__step {
  flex: 1 1 0; min-width: 0; height: 0.0625rem; border-radius: 0.125rem;         /* 1 / 2 */
  background: color-mix(in srgb, var(--wp--preset--color--border-tertiary) 60%, transparent);
  border: 0; padding: 0; cursor: pointer;
  position: relative; overflow: hidden;
  transition: height var(--u-dur-fast) var(--u-ease);
}
/* Nur der laufende Schritt ist dicker (Figma) — abgeschlossene bleiben duenn, aber gefuellt. */
.c-stats__step.is-current { height: 0.1875rem; }                                 /* 3 */

/* Ladebalken-Fuellung, von anim-stats.js injiziert. Der Balken IST die Fortschrittsanzeige.
   Abgeschlossene Schritte behalten scaleX(1) → der Fortschritt baut sich von links nach rechts
   auf und wird erst am Ende des Durchlaufs komplett zurueckgesetzt. */
.c-stats__step-fill {
  position: absolute; inset: 0; border-radius: inherit;
  background: var(--wp--preset--color--bg-primary);
  transform: scaleX(0); transform-origin: left center;
  pointer-events: none; will-change: transform;
}
/* Ohne JS gibt es keine Fuellung — dann markiert der aktive Schritt sich selbst. */
.c-stats__step.is-current:not(:has(.c-stats__step-fill)) {
  background: var(--wp--preset--color--bg-primary);
}
.c-stats__row { display: flex; align-items: flex-end; justify-content: space-between; gap: 1.5rem; }
.c-stats__stat { display: flex; flex-direction: column; align-items: flex-start; gap: 1.25rem; }
/* WICHTIG: unser display:flex wuerde das [hidden]-Attribut aushebeln (Autor schlaegt UA-Stylesheet).
   Gleiche Regel wie bei .c-nav__panel[hidden]. */
.c-stats__stat[hidden] { display: none; }
.c-stats__value {
  font-family: var(--u-font-heading); font-weight: 500;
  font-size: 12.5rem; line-height: 0.8; letter-spacing: -0.5rem;                 /* 200 / -8 */
  white-space: nowrap;
}
.c-stats__value sup {                       /* „+" ist kleiner (116,667) und sitzt auf der Grundlinie */
  font-size: 7.292rem; line-height: 0.8; vertical-align: baseline; top: 0;
}
.c-stats__subline { display: flex; align-items: center; gap: 0.5rem; }           /* 8 */
.c-stats__subline svg { flex: 0 0 auto; width: 1.25rem; height: 1.25rem; color: var(--wp--preset--color--accent); }
.c-stats__label {
  font-family: var(--u-font-heading); font-weight: 500;
  font-size: var(--u-fs-h5); line-height: 1.875rem; letter-spacing: -0.015rem;   /* 24/30 */
}

@media (max-width: 767px) {
  /* Node 14068:26595: Sektion 360x601 (pad 8), Karte 344x585 (pad 24), Headline 312x64 bei y=32,
     Slider 312x245 bei y=324. Die Karte trug `min-height: 0` — sie fiel damit auf ihre
     Inhaltshoehe zusammen (gemessen 460 statt 601) und die vertikale Verteilung
     Headline/Slider, die `align-content: space-between` leistet, hatte keinen Raum. */
  .c-stats { padding: 0.5rem; }                      /* 8 rundum (Node 360x601 = 8 + 585 + 8) */
  .c-stats__card { min-height: 36.5625rem; padding: 1.5rem 1rem; }   /* 585 / 24 oben+unten, 16 seitlich (Node pad 24/16) — Inhalt 312 */
  .c-stats__headline { font-size: 1.625rem; line-height: 2rem; letter-spacing: -0.0325rem;
    grid-column: 1 / -1; }                           /* 26/32 (Node), nicht die h3-Groesse */
  /* Node `Stat` 312x96: Wert-Box 64 hoch, Gap 8, Subline 24. 6rem waeren allein 96. */
  .c-stats__value { font-size: 3.5rem; line-height: 4rem; letter-spacing: -0.105rem; }
  .c-stats__value sup { font-size: 2rem; }
  .c-stats__slider { gap: 1.25rem; }                 /* Stepper → Row 20 (Node) */
  /* Node `Row` gap 80: Stat endet 443, Button ab 523.

     🔴 Die fuenf Kennzahlen liegen ALLE im DOM, `anim-stats.js` blendet die inaktiven per
     `hidden` aus — jede bestimmt also fuer sich, wie hoch die Reihe ist. Bricht ein Label um,
     wird der Block hoeher, und weil die Karte `align-content: space-between` traegt, schiebt das
     Stepper UND Text nach oben. Genau das war der Sprung beim letzten Punkt.

     Deshalb liegen die Kennzahlen jetzt gestapelt in EINER Rasterzelle: die Zelle ist immer so
     hoch wie die laengste, egal welche gerade sichtbar ist. Die inaktiven behalten ihren Platz
     (`visibility: hidden` statt `display: none`) — sie bleiben damit auch fuer Vorlesesoftware
     unsichtbar, nehmen aber Raum ein. Der Stepper steht danach fest, unabhaengig vom Inhalt.
     Eine Groessen-Korrektur allein haette nicht gereicht: mit 18/24 passten vier der fuenf Labels
     in eine Zeile, das fuenfte nicht. */
  .c-stats__row {
    display: grid; grid-template-rows: auto auto; gap: 5rem; justify-items: start;
    align-items: start;
  }
  /* Node `Stat` 312x96 = Wert 64 + Gap 8 + Subline 24. Unser Gap war 20 (Desktop-Wert). */
  .c-stats__stat { grid-area: 1 / 1; gap: 0.5rem; }
  /* 🔴 Die Zelle bekommt eine FESTE Hoehe. Ohne sie richtet sie sich nach der gerade sichtbaren
     Kennzahl — die inaktiven messen im gestapelten Zustand weniger (ihre Subline ist fuer den
     Reveal maskiert), also traegt die Stapelung allein den Sprung nicht.
     120 = zwei Label-Zeilen, der Hoechstfall. Der Node kommt mit 96 aus, weil dort JEDES Label in
     eine Zeile passt; bei uns tut das „Compliance in Behoerdenpruefungen" auch bei 18/24 nicht.
     Wird dieser Text gekuerzt, kann hier wieder 6rem stehen und die Sektion trifft den Node auf
     den Pixel. */
  .c-stats__row { grid-template-rows: 7.5rem auto; }
  .c-stats__stat[hidden] { display: block; visibility: hidden; pointer-events: none; }
  .c-stats__row > :not(.c-stats__stat) { grid-row: 2; }
  /* 🔴 Label 18/24, nicht die Desktop-Groesse 24/30 (Node `Subline` 187x24).
     Das ist nicht nur ein Maszfehler, es war der SPRUNG: mit 24/30 brechen drei der fuenf Labels
     um („Spezialist:innen in Europa", „Foerderung allein in 2025", „Compliance in
     Behoerdenpruefungen"), der Stat wird dadurch 144 statt 96 hoch — und weil die Karte
     `align-content: space-between` traegt, schiebt der hoehere Block Stepper und Text um 30 nach
     oben. Beim Durchsteppen sah das aus wie ein Wackeln des Sliders.
     Mit 18/24 passt jedes Label in eine Zeile, jeder Stat ist 96 hoch wie im Node, und der
     Stepper steht still. Wer das Label spaeter vergroessert, holt sich den Sprung zurueck. */
  .c-stats__label { font-size: 1.125rem; line-height: 1.5rem; letter-spacing: -0.0135rem; }
}

/* ============================================================= Funding Programs (Node 21572:11147)
   „Was Förderung bewirkt" — Textspalte (4 Sp.) links, Bento 2x2 (8 Sp.) rechts = 12.
   Die Karten sind der bestehende Block `ignite/card` (.c-card) — hier wird NICHTS an der Karte
   nachgebaut, nur das Raster drumherum. Card-Werte kommen laut Regel aus dem Concept-File. */
.c-funding { position: relative; background: var(--wp--preset--color--bg-primary); padding-block: 6rem; }   /* 96 */
.c-funding__inner {
  display: grid; grid-template-columns: repeat(var(--u-cols), minmax(0, 1fr));
  gap: var(--u-gutter); align-items: start;
}
/* Textspalte laeuft in BEIDEN Varianten mit, bis die Kartenreihe durch ist (User 2026-08-05 —
   vorher nur in `--text-right`).
   🔴 `align-self: start` statt `stretch` ist die Voraussetzung, nicht Kosmetik: ein gestrecktes
   Grid-Item fuellt die Zeile komplett aus und hat damit keinen Weg zum Wandern — `sticky` waere
   wirkungslos. Aus demselben Grund faellt `justify-content: center` weg; die vertikale Zentrierung
   und ein Sticky-Lauf schliessen sich gegenseitig aus. */
.c-funding__col {
  grid-column: span 4; min-width: 0;
  align-self: start;
  display: flex; flex-direction: column; justify-content: flex-start; align-items: flex-start;
  gap: 2rem;                                            /* 32 */
  position: sticky;
  top: var(--sticky-top);                               /* Navbar-Höhe + 1rem Luft */
}
.c-funding__headline {
  font-family: var(--u-font-heading); font-weight: 500;
  font-size: var(--u-fs-h2); line-height: 3.5rem; letter-spacing: -0.0975rem;   /* 52/56 */
  color: var(--wp--preset--color--text-primary);
}
.c-funding__headline em { font-style: normal; color: var(--wp--preset--color--text-tertiary); }
.c-funding__actions { display: flex; align-items: flex-start; gap: 0.875rem; }   /* 14 */
/* Bento: 8 Spalten breit, 2 Karten je Reihe (Figma 869,34 = 8 Sp.) */
.c-funding__grid {
  grid-column: span 8;
  display: grid; grid-template-columns: repeat(2, minmax(0, 1fr));
  align-content: start; gap: var(--u-gutter);
}

/* Anordnung `text-right` (Node 13702:16410, /solutions): Bento LINKS (8 Sp.), Textspalte RECHTS
   auf 3 Spalten — dazwischen bleibt eine Spalte Luft. Figma schreibt `justify-between` mit
   869,34 + 316; bei 1312 Container ist der Rest genau 1 Spalte + 2 Gutter (126,67).
   Deshalb NICHT `flex: 1` wie bei `text-left` (dort fuellt die Spalte den Rest = 4 Sp.),
   sondern feste 3 Spalten + `space-between`.
   🔴 `grid-row: 1` auf BEIDEN ist PFLICHT: `.c-funding__col` (Spalte 10-12) steht im Markup VOR
   `.c-funding__grid` (Spalte 1-8) — die Text-Spalte springt im DOM also nach rechts, die Karten
   danach zurueck nach links. Ohne explizite Zeile interpretiert Grid-Auto-Placement diesen
   Rueckwaertssprung als „neue Zeile" und schiebt das Bento in Zeile 2 — Kopf und Karten liefen
   dann nicht auf gleicher Hoehe los, und die freie Zeile 1 (nur Text, kein Bento daneben)
   erzeugte einen zusaetzlichen Abstand vor der naechsten Sektion. Bei `text-left` trat das nie
   auf, weil dort die Spalten in DOM-Reihenfolge steigen (1-4 dann 5-12) — kein Rueckwaertssprung. */
.c-funding--text-right .c-funding__grid { grid-column: 1 / span 8; grid-row: 1; }
.c-funding--text-right .c-funding__col {
  grid-column: 10 / span 3;   /* Spalte 9 bleibt leer = die eine Spalte Luft aus Figma */
  grid-row: 1;
  /* Oben ausgerichtet und sticky: die Spalte laeuft mit, bis die Kartenreihe durchgescrollt ist.
     🔴 `align-self: start` ist PFLICHT — das Elternteil setzt `align-items: start`, aber der
     Basis-Selektor .c-funding__col ueberschreibt das mit `align-self: stretch` (dort braucht es
     die volle Hoehe fuer `justify-content: center`). Ein gestrecktes Item fuellt den Container
     komplett aus, hat also keinen Weg zum Wandern — `sticky` waere wirkungslos.
     `justify-content` zurueck auf `flex-start`, sonst zentriert die alte Regel weiter. */
  align-self: start;
  justify-content: flex-start;
  position: sticky;
  top: var(--sticky-top);                                /* Navbar-Höhe + 1rem Luft */
}

@media (max-width: 767px) {
  /* 🔴 Node-Wert, ueber das Token statt als feste Zahl: `--u-s-96` ist mobil 4,5rem = 72.
     Hier stand `3rem` — 48 statt 72. Dieselbe Abweichung lag in fuenf Sektionen, immer als
     handgesetzte 3rem an einer Stelle, an der die Abstands-Tabelle schon die richtige Antwort
     hatte (Audit 2026-08-12). */
  .c-funding { padding-block: var(--u-s-96); }
  /* Eine Spalte: `.c-funding__inner` ist ein GRID (kein Flex) — `flex-direction: column`
     waere ein No-op. Deshalb das Raster selbst auf 1 Spalte kollabieren und die fest
     platzierten Kinder (span 8 bzw. Spalte 10/span 3 aus `--text-right`) auf `1 / -1`
     zuruecksetzen, sonst bleiben Text- und Bento-Spalte nebeneinander und ueberlaufen. */
  .c-funding__inner { grid-template-columns: minmax(0, 1fr); gap: 2rem; }   /* 32 (Node) */
  /* 🔴 Der Button steht im Node UNTER den Karten (Reihenfolge Kopf → Grid → Action),
     im Markup aber IN der Textspalte vor dem Grid. Die Spalte wird deshalb aufgeloest
     (`display: contents`) und die Aktionen ruecken per `order` hinter das Karussell —
     der 32er-Raster-Gap traegt dann alle drei Abstaende (676 = 72+32+32+390+32+46+72). */
  .c-funding__col,
  .c-funding--text-right .c-funding__col { display: contents; }
  .c-funding__grid,
  .c-funding--text-right .c-funding__grid { grid-column: 1 / -1; grid-row: auto; }
  .c-funding__actions { order: 3; grid-column: 1 / -1; }
  .c-funding__headline { font-size: 1.625rem; line-height: 2rem; letter-spacing: -0.0488rem;   /* Figma Mobil-H3 26/32, ls -3% */ }
  /* Bento-Raster → Endlos-Karussell (ADR 0010 §1.7). Der Node zeichnet drei Karten a 312 bei
     x = −296 · 24 · 344, die erste also im negativen Bereich — das Umlauf-Kriterium.
     `--karten-spalten: 12` heisst: die Karte ist genau so breit wie der Container (312 @360). */
  .c-funding__grid { --karten-spalten: 12; }
  /* Der Button unter den Karten steht im Frame mittig (x = 62,5 bei Breite 235 in 360). */
  .c-funding__actions { justify-content: center; }
  /* Die Bildkarte ist im Mobile-Frame nicht gezeichnet — der Node fuehrt dort GENAU DREI
     Karten (dunkel · grau · mint). Auf Desktop bleibt sie die vierte Kachel des Bentos. */
  .c-funding__grid > .c-card--image { display: none; }
}
/* (hier stand eine ueberzaehlige `}` — Browser verwarfen sie still, aber jede naive
   Klammer-Bilanz wurde davon getaeuscht; entfernt beim T2-Anbau 2026-08-15) */

/* ============================================================= Methodik (Node 13674:15556, Concept-File)
   „So arbeiten wir" — 4 Phasen-Karten auf heller Flaeche.
   Container 16px vom Viewport-Rand eingerueckt (wie Stats), radius 16.
   Raster: Headline 5 Sp. + Button rechts · Karten 4 x 3 Sp. = 12. */
.c-methodik { position: relative; background: var(--wp--preset--color--bg-primary); padding-inline: 1rem; }   /* 16 */
.c-methodik__panel {
  background: var(--wp--preset--color--bg-secondary);
  border-radius: 1rem;                                        /* 16 */
  padding: 6rem 3rem;                                         /* 96 / 48 */
  display: flex; flex-direction: column; gap: 6rem;            /* 96 */
}
.c-methodik__row { display: flex; align-items: flex-end; justify-content: space-between; gap: var(--u-gutter); }
.c-methodik__intro {
  /* Breite = 5 Spalten des Seiten-Grids, aus --u-col (vw-basiert) statt einer lokalen
     %-Neuberechnung — die frühere --m-col ging vom Panel-Padding aus und war an die
     konkrete Verschachtelung gebunden (siehe component-architecture.md, §Grid-Token). */
  width: calc(5 * var(--u-col) + 4 * var(--u-gutter));         /* Figma 537,33 = 5 Spalten */
  display: flex; flex-direction: column; gap: 1.25rem;         /* 20 */
}
.c-methodik__headline {
  font-family: var(--u-font-heading); font-weight: 500;
  font-size: var(--u-fs-h2); line-height: 3.5rem; letter-spacing: -0.0975rem;   /* 52/56 */
  color: var(--wp--preset--color--text-primary);
}
.c-methodik__headline em { font-style: normal; color: var(--wp--preset--color--text-tertiary); }
.c-methodik__lead {
  font-family: var(--u-font-body); font-weight: 400;
  font-size: var(--u-fs-body-regular); line-height: 1.5rem; letter-spacing: -0.03rem;
  color: var(--wp--preset--color--text-secondary);
}
.c-methodik__cards { display: flex; gap: var(--u-gutter); align-items: stretch; }

/* ---- Phasen-Karte: Icon oben, Text unten. Eigene Komponente (kein .c-card:
   andere Struktur, asymmetrisches Padding, kein Tag/Meta/Link). ---- */
.c-phase {
  flex: 1 1 0; min-width: 0;                                  /* je 3 Spalten (4 x 3 = 12) */
  min-height: 24.6875rem;                                     /* 395 */
  display: flex; flex-direction: column; justify-content: space-between;
  padding: 1.625rem 1.625rem 2rem;                            /* 26 / 26 / 32 — asymmetrisch */
  border-radius: 0.5rem;                                      /* 8 */
  border: 0.0625rem solid transparent; overflow: hidden;
}
.c-iconcircle, .c-phase__icon {
  display: flex; align-items: center; justify-content: center; flex: 0 0 auto;
  width: 3.333rem; height: 3.333rem; border-radius: 62.5rem;  /* 53,333 */
  border: 0.0625rem solid transparent;
  backdrop-filter: blur(5rem); -webkit-backdrop-filter: blur(5rem);
}
.c-iconcircle svg, .c-phase__icon svg { width: 1.25rem; height: 1.25rem; }
.c-phase__text {
  display: flex; flex-direction: column; gap: 2rem;            /* 32 */
  /* KEINE max-width. Die Breite steht schon fest: die Phasen-Karte ist 316px = 3 Rasterspalten,
     abzueglich 2x26 Innenabstand bleiben 264 fuer den Text. Die frueheren 15.75rem (252) waren
     die Breite, die der TEXT im Figma-Node zufaellig einnahm — keine gestaltete Grenze und
     keine Rasterbreite (252 = 2,42 Spalten). Ein Textmass an dieser Stelle haette die
     Kartenbreite nur ein zweites Mal, ungenauer, nachgebaut. */}
.c-phase__head { display: flex; flex-direction: column; gap: 0.625rem; }   /* 10 */
.c-phase__label {
  font-family: var(--u-font-body); font-weight: 500;
  font-size: 0.75rem; line-height: 0.75rem; text-transform: uppercase; opacity: .6;
}
.c-phase__title {
  font-family: var(--u-font-heading); font-weight: 500;
  font-size: var(--u-fs-h4); line-height: 2.125rem; letter-spacing: -0.0175rem;   /* 28/34 */
}
.c-phase__body {
  font-family: var(--u-font-body); font-weight: 400;
  font-size: var(--u-fs-body-regular); line-height: 1.5rem; letter-spacing: -0.03rem;
}
/* Themes — Border = eigene Flaeche @40%, Icon-Kreis INVERS getoent (wie im Design) */
.c-phase--dark {
  background: var(--wp--preset--color--bg-alternate); border-color: rgba(30,6,61,.4);
  color: var(--wp--preset--color--text-alternate);
}
.c-phase--dark .c-phase__icon { background: rgba(7,235,191,.1); border-color: rgba(7,235,191,.15); color: var(--wp--preset--color--accent); }
.c-phase--dark .c-phase__body { opacity: .8; }

.c-phase--mint {
  background: var(--wp--preset--color--accent); border-color: rgba(10,235,191,.4);
  color: var(--wp--preset--color--text-primary);
}
.c-phase--mint .c-phase__icon { background: rgba(30,6,61,.1); border-color: rgba(30,6,61,.1); color: var(--wp--preset--color--text-primary); }
.c-phase--mint .c-phase__body { opacity: .6; }

.c-phase--darkgrey {
  background: var(--wp--preset--color--surface-darkgrey); border-color: rgba(71,85,105,.4);
  color: var(--wp--preset--color--text-alternate);
}
.c-phase--darkgrey .c-phase__icon { background: rgba(7,235,191,.1); border-color: rgba(7,235,191,.15); color: var(--wp--preset--color--accent); }
.c-phase--darkgrey .c-phase__body { opacity: .8; }

.c-phase--white {
  background: var(--wp--preset--color--bg-primary); border-color: rgba(226,232,240,.4);
  color: var(--wp--preset--color--text-primary);
}
/* Weisse Card kehrt den Icon-Container um: SOLIDES Mint (nicht transparent) + DUNKLER Glyph.
   Sonst waere ein transparent-mint Kreis auf Weiss zu blass. Figma 21674:15641 gegengeprueft:
   Container #0aebbf, Glyph #1e063d, Border rgba(30,6,61,.05). */
.c-phase--white .c-phase__icon { background: var(--wp--preset--color--accent); border-color: rgba(30,6,61,.05); color: var(--wp--preset--color--text-primary); }
.c-phase--white .c-phase__body { color: var(--wp--preset--color--text-secondary); }

@media (max-width: 991px) {   /* war 1200 — auf die Tablet-Kante gezogen (ADR 0010 §1.2) */
  .c-methodik__cards { flex-wrap: wrap; }
  .c-phase { flex: 1 1 calc(50% - var(--u-gutter)); }
}
@media (max-width: 767px) {
  /* Node 14068:26607: Panel 344x709,3 — pad 40/16, gap 56, Kopf 148 (Headline 32 + 20 + Lead 96).
     Der Button steht im Node UNTER der Kartenreihe; im Markup sitzt er in der Kopfzeile —
     Kopfzeile aufloesen (display: contents), Button per order ans Panel-Ende. */
  .c-methodik__panel { padding: 2.5rem 1rem; gap: 3.5rem; }
  .c-methodik__row { display: contents; }
  .c-methodik__row > .c-btn { order: 3; align-self: flex-start; }
  .c-methodik__intro { width: 100%; }
  .c-methodik__headline { font-size: 1.625rem; line-height: 2rem; letter-spacing: -0.0488rem;   /* Figma Mobil-H3 26/32, ls -3% */ }
  .c-phase { flex: 1 1 100%; min-height: 0; }
}

/* ---------------------------------------------------------------------------
   Variante „slider" (Node 13690:19535 „04 Methodik", Industries-Seite).
   Kopf im selben header--lead-Muster wie `ignite/rowlist` (Headline 7 + Lead 4,
   bodenbuendig, Spalte 12 bleibt leer) — hier unter der eigenen c-methodik-Namespace
   neu geschrieben, keine Cross-Block-Klassen (BEM-Disziplin, siehe naming-taxonomie.md).
   Darunter Secondary-Button + Slider-Nav, dann 5 Phasen-Karten in einem Track, der aus dem
   Panel-Padding (px-48) bleedet, wie der Blog-Slider aus dem u-container bleedet.
   --------------------------------------------------------------------------- */
.c-methodik--slider .c-methodik__panel { gap: 6rem; }   /* 96, wie Figma gap-96 zwischen Head und Cards */
.c-methodik__head { display: flex; flex-direction: column; align-items: flex-start; gap: 2rem; width: 100%; }   /* 32 */
.c-methodik__head-row { align-items: end; }              /* .u-grid */
.c-methodik--slider .c-methodik__headline { grid-column: span 7; }
.c-methodik__lead--inline { grid-column: span 4; align-self: end; }   /* Typo erbt von .c-methodik__lead */

.c-methodik__actions { display: flex; align-items: center; justify-content: space-between; width: 100%; }
.c-methodik__nav { display: flex; gap: 0.25rem; }         /* 4 */
/* Die geteilten .c-slidernav-Defaults (grau/naheweiss) sind fuer eine WEISSE Flaeche kalibriert
   (Blog-Slider) — auf der grauen Methodik-Panel-Flaeche (background-tertiary #f1f5f9) verschwindet
   sowohl der graue Default- als auch der naheweisse Disabled-Zustand optisch. Figma setzt hier einen
   eigenen „Frosted Glass"-Look: enabled = weiss + Blur, disabled = transparent + Blur + Icon 50%.
   Scoped auf .c-methodik__nav, damit der (verifiziert korrekte) Blog-Slider unberuehrt bleibt. */
.c-methodik__nav .c-slidernav {
  background: var(--wp--preset--color--bg-primary);
  border-color: rgba(226, 232, 240, .4);
  backdrop-filter: blur(0.301rem); -webkit-backdrop-filter: blur(0.301rem);   /* 4,812px */
}
.c-methodik__nav .c-slidernav--disabled {
  background: transparent;
  border-color: var(--wp--preset--color--border-tertiary);   /* #e2e8f0 */
}
.c-methodik__nav .c-slidernav--disabled .c-btn__icon { opacity: .5; }

/* Track bleedet aus dem Panel-Padding (48px), wie .c-blog__viewport aus dem u-container.
   Traegt bereits ohne JS: overflow-x + scroll-snap scrollt nativ per Touch/Trackpad.
   GSAP ersetzt das spaeter durch Draggable — Achse bleibt bis dahin ohne CSS-transform. */
.c-methodik__viewport {
  margin-inline: -3rem; padding-inline: 3rem;             /* -48 / 48, hebt sich mit dem Panel-Padding auf */
  overflow-x: auto; scroll-snap-type: x mandatory; scroll-padding-inline: 3rem;
  filter: drop-shadow(0 0 1.031rem rgba(10, 235, 191, .11));   /* Figma: 16,5px mint glow um die Kartenreihe */
}
/* 🔴 Der -48/+48-Ausgleich ist auf den DESKTOP-Panelrand (48) geeicht. Auf Mobile ist der
   Panelrand 16 — nachgemessen lief /industries/ dadurch auf 368 heraus.
   Diese Regel MUSS hinter der Basis stehen: der erste Versuch lag in einem 767er-Block WEITER
   OBEN (Zeile 1483 gegen 1526) und verlor bei gleicher Spezifitaet gegen die spaetere Basis. */
@media (max-width: 767px) {
  .c-methodik__viewport { margin-inline: -1rem; padding-inline: 1rem; scroll-padding-inline: 1rem; }
}
.c-methodik__track { display: flex; gap: var(--u-gutter); list-style: none; padding: 0; }   /* UA ul-padding raus */
/* --u-col (vw-basiert) statt einer lokalen %-Neuberechnung — der Track bleedet aus dem
   Panel-Padding, eine %-Custom-Property waere hier wieder vom Containing Block des <li>
   abhaengig (Bezugsbox aendert sich mit jeder Verschachtelung, siehe --u-col-Kommentar oben). */
.c-methodik__track > li { flex: 0 0 calc(3 * var(--u-col) + 2 * var(--u-gutter)); min-width: 0; scroll-snap-align: start; }
.c-methodik--slider .c-phase { width: 100%; }

@media (max-width: 767px) {
  .c-methodik--slider .c-methodik__head-row { grid-column: 1 / -1; }
  .c-methodik--slider .c-methodik__headline,
  .c-methodik__lead--inline { grid-column: 1 / -1; }
  .c-methodik__lead--inline { align-self: start; }
  /* Frame 14106:43557: Kopf → Karten 56, Karten → Pfeile → Button je 32; Pfeile und Button
     stehen UNTER den Karten (im Markup sitzen sie im Kopf → Kopf aufloesen, Aktionen per
     order ans Ende; column-reverse stellt die Pfeile ueber den Button).
     Karten 258,67 = 10 Mobil-Spalten (wie der Home-Slider), NICHT 80 %. */
  .c-methodik--slider .c-methodik__panel { gap: 2rem; }
  .c-methodik--slider .c-methodik__head { display: contents; }
  .c-methodik--slider .c-methodik__viewport { padding-top: 1.5rem; }   /* 32 + 24 = 56 zum Kopf */
  .c-methodik__actions { order: 3; flex-direction: column-reverse; align-items: flex-start; gap: 2rem; }
  .c-methodik__track > li { flex-basis: calc(10 * var(--u-col) + 9 * var(--u-gutter)); }
}

/* ============================================================= Testimonial (Node 13674:15650)
   „07 Testimonial Quotes" — Bild links (2 Sp.), Zitat rechts (8 Sp.).
   Raster: 1 (Filler) + 2 (Bild) + 1 (Filler) + 8 (Zitat) = 12.
   Serif-Zitat in Newsreader (--u-font-quote) — die einzige Stelle mit Serif. */
.c-quote { position: relative; background: var(--wp--preset--color--bg-primary); padding-block: 2.5rem; }   /* 40 */
/* Buehne: alle Testimonials liegen UEBEREINANDER in derselben Grid-Zelle -> Cross-Fade
   moeglich, ohne dass die Sektion springt (hoechstes Item bestimmt die Hoehe). */
.c-quote__stage { display: grid; }
.c-quote__item {
  grid-area: 1 / 1;                                   /* alle Items in dieselbe Zelle stapeln */
  align-items: stretch;                               /* .u-grid */
  /* Figmas Sektion ist 688 hoch (40 + 608 + 40). Diese Hoehe ERZEUGT den Versatz:
     Bild pt 128 von oben, Zitat justify-end py 112 von unten. Ohne sie kollabiert die
     Beziehung und beide stehen auf gleicher Hoehe. */
  min-height: 38rem;                                  /* 608 */
}
.c-quote__item[hidden] { display: none; }             /* sonst schlaegt display:grid das [hidden] */
/* Mit Crossfade (anim-quote.js) bleiben nicht-aktive Items LAYOUTWIRKSAM: `display: none`
   naehme sie aus der Hoehenrechnung und die Buehne spraenge beim Wechsel (mobil gemessen
   546 -> 580; die Zusage „das hoechste Item bestimmt die Hoehe", component-architecture.md,
   gilt nur solange alle Items stapeln). `visibility: hidden` ist hier NICHT die §8-Falle:
   sie trifft ausschliesslich die dauerhaft nicht-aktiven Items — unsichtbar, unklickbar,
   nicht fokussierbar ist fuer sie der GEWOLLTE Zustand; das aktive Item traegt nie hidden. */
.c-quote--anim .c-quote__item[hidden] { display: grid; visibility: hidden; }
/* Bild: 2 Spalten, 4:5, oben 128 abgesetzt (Figma pt 128) */
/* align-items: flex-start ist Pflicht: die Figur ist Grid-Item in einer stretch-Zeile,
   Flex wuerde das <img> sonst auf volle Zeilenhoehe ziehen und aspect-ratio aushebeln. */
.c-quote__figure { grid-column: 2 / span 2; display: flex; flex-direction: column; justify-content: center;
  align-items: flex-start; padding-top: 8rem; gap: 1.5rem; }   /* 24: Portrait -> Logo */
.c-quote__img {
  width: 100%; aspect-ratio: 205.33 / 256.65;                    /* 4:5 */
  border-radius: 0.375rem;                                       /* 6 */
  object-fit: cover; display: block;
}
/* Kundenlogo unter dem Portrait (Node 13910:34885) — auf Portraitbreite begrenzt, links. */
.c-quote__logo { display: block; max-width: 100%; max-height: 3rem; width: auto; height: auto; object-fit: contain; object-position: left center; }
/* Zitat: 8 Spalten, unten ausgerichtet */
.c-quote__body {
  grid-column: 5 / span 8;
  display: flex; flex-direction: column; align-items: flex-start; justify-content: flex-end;
  gap: 1.25rem;                                                  /* 20 */
  padding-block: 7rem;                                           /* 112 */
}
.c-quote__text {
  font-family: var(--u-font-quote); font-weight: 400;
  font-size: 2.5rem; line-height: 2.75rem; letter-spacing: -0.075rem;   /* 40/44 (Figma; hier stand 46) */
  color: var(--wp--preset--color--text-secondary);
}
.c-quote__mark { color: var(--wp--preset--color--accent); display: block; }   /* das oeffnende „ in Mint */
/* Fusszeile des Zitats: Name (4 Sp.) + schliessendes Anfuehrungszeichen (3 Sp.) + Filler (1 Sp.) = 8 */
.c-quote__foot {
  display: flex; align-items: center; gap: var(--u-gutter); width: 100%;
  --q-col: calc((100% - 7 * var(--u-gutter)) / 8);
}
.c-quote__author {
  width: calc(4 * var(--q-col) + 3 * var(--u-gutter));
  display: flex; align-items: center; gap: 0.375rem;             /* 6 */
  font-family: var(--u-font-body); font-weight: 500;
  font-size: var(--u-fs-body-small); line-height: 1.375rem;
  color: var(--wp--preset--color--text-primary); white-space: nowrap;
}
.c-quote__close {
  flex: 1 1 0; min-width: 0; text-align: right;
  font-family: var(--u-font-quote); font-weight: 400;
  font-size: 2.25rem; line-height: 2.75rem; letter-spacing: -0.0675rem;   /* 36/44 */
  color: var(--wp--preset--color--accent);
}
.c-quote__foot-filler { flex: 0 0 auto; width: var(--q-col); }   /* Figma: 1 Spalte frei rechts */
/* Mobil-Stepper (Node 14124:50254) — auf Desktop nicht gezeichnet. */
.c-quote__stepper { display: none; }

@media (max-width: 767px) {
  .c-quote { padding-block: var(--u-s-96); }   /* 72 (Node), war 32 */
  /* Node 14124:50250: Bild 178,67 (= 7 Mobil-Spalten) 4:5 · Stepper 312 (12) · Zitat 258,67
     (= 10 Spalten) — echte Spans im Item-Grid. Abstaende: Bild→Stepper 32 (row-gap 16 +
     Stepper-pad 16), Stepper→Zitat 16, Zitat→Autor 12. */
  /* min-height 0: die 608 sind der DESKTOP-Traeger (688er-Beziehung). Mobil ist die Sektion
     HUG — mit 608 verteilte `align-content: stretch` den Ueberschuss auf die Auto-Zeilen
     (+20,6 je Zeile, Bild 243,9 statt 223,3). */
  .c-quote__item { row-gap: 1rem; min-height: 0; }
  .c-quote__figure { grid-column: 1 / span 7; padding-top: 0; max-width: none; }
  .c-quote__stepper { grid-column: 1 / -1; display: flex; align-items: center; gap: var(--u-gutter);
    padding-top: 1rem;
    /* line-height 0: ein Zeilen-Strut (~23,6px) blaehte den 3px-Stepper auf 39 — die Steps
       tragen feste Hoehen, Text gibt es hier nicht. */
    line-height: 0; }
  .c-quote__step { flex: 1 1 0; height: 0.0625rem; border-radius: 0.125rem;
    background: var(--wp--preset--color--border-tertiary); }
  .c-quote__step.is-current { height: 0.1875rem; background: var(--wp--preset--color--accent); }

  /* ---- Crossfade-Veredelung (anim-quote.js, Animations-Auftrag 2026-08-15) --------------
     Nur unter `--anim` (JS gesetzt): der statische Block — Einzel-Zitate, no-JS, reduce ohne
     Autoplay — behaelt die Fassung darueber (aktiver Strich voll mint).
     Mit Autoplay wird der aktive Strich zur SPUR und die nachgeruestete Fuellung zum ZEITGEBER
     (Ladebalken IST der Timer, §Stats): GSAP faehrt ihre scaleX 0 -> 1 ueber die Anzeigedauer.
     Die Ruhelage (scaleX 0) setzt das Modul per gsap.set — kein CSS-transform, die Achse
     gehoert GSAP (gleiche Regel wie bei den CTA-Streubildern). */
  .c-quote--anim .c-quote__step { position: relative; cursor: pointer; }
  /* Tap-Flaeche: 3px Strich ist kein Ziel — unsichtbar auf ~23px aufgepolstert, ohne Layout. */
  .c-quote--anim .c-quote__step::after { content: ''; position: absolute; inset: -0.625rem 0; }
  .c-quote--anim .c-quote__step.is-current { background: var(--wp--preset--color--border-tertiary); }
  .c-quote__step-fill { position: absolute; inset: 0; border-radius: inherit;
    background: var(--wp--preset--color--accent); transform-origin: left center; }
  .c-quote__body { grid-column: 1 / span 10; padding-block: 0; gap: 0.75rem; }
  .c-quote__text { font-size: 1.75rem; line-height: 2.125rem; letter-spacing: -0.0525rem; }
  .c-quote__foot { flex-wrap: wrap; }
  .c-quote__author { width: 100%; white-space: normal; }
  .c-quote__close, .c-quote__foot-filler { display: none; }
}

/* ============================================================= Förderprogramme-Stapel (Node 13684:17711)
   Links Text (6 Sp.), rechts drei Karten (6 Sp.) = 12.
   NOCH OHNE GSAP. Das Stapeln traegt bereits CSS-`sticky`: jede Karte sitzt in einer Huelle,
   die mit wachsendem `top` klebt -> die Karten schieben sich uebereinander und bleiben sichtbar.
   Figma kodiert genau das: Rahmen 569,33 = pt 176 + Karte 393,33, Rahmen-Abstand 411,33
   (= Ueberlappung 158). Der GSAP-Pass legt spaeter nur Scale/Opacity drauf.
   KEIN CSS-transform auf .c-card hier — die Achse gehoert GSAP. */
.c-programs { position: relative; background: var(--wp--preset--color--bg-primary); padding-block: 5rem 4rem; }   /* 80 / 64 */
/* Shadow/Above nur wo der Node ihn traegt (need-Single 13723:3947; Startseite + expertise nicht).
   Figma-Radius 32 -> box-shadow 32; der Tailwind-Export kodiert dasselbe als drop-shadow 16
   (Filter-Radien halbiert, gleiche ÷2-Regel wie Background-Blur 160->80).
   `position: relative` steht bereits an der Basis .c-programs (Sektions-weite Konvention,
   siehe .c-grants) — hier nur noch der Schatten selbst. */
.c-programs--shadow { box-shadow: -0.25rem -0.25rem 2rem 0 rgba(0,0,0,0.05); }
.c-programs__inner { align-items: start; }                     /* .u-grid */
.c-programs__intro {
  grid-column: span 6; position: sticky; top: var(--sticky-top); /* Navbar-Höhe + 1rem; bleibt stehen, waehrend rechts gestapelt wird */
  /* 🔴 `row-gap`, NIE `gap`: die Shorthand setzt auch den Spalten-Gutter (hier 32 statt 16) und
     bricht damit genau das, wofuer `subgrid` da ist — die Spaltenlinien liefen nicht mehr auf
     denen des Elterngrids. Gemessen: `.c-programs__lead` (span 5) war 529,33 statt 537,33px. */
  display: grid; grid-template-columns: subgrid; row-gap: 2rem; align-items: start; justify-items: start;
}
/* 🔴 In einem `subgrid` braucht JEDES Kind eine explizite Spalte. Ohne sie verteilt der
   Auto-Placement-Algorithmus die Kinder der Reihe nach auf die sechs Spuren: die Überschrift
   belegte 1–5, der Lead landete dadurch in der EINZELNEN Restspalte 6 (94,67 breit), wurde 240
   hoch und lief seitlich aus der Sektion — er überlagerte die Kartenspalte rechts.
   Der Lead kam später dazu als die Überschrift und hatte nie eine eigene Spaltenregel. */
.c-programs__intro > * { grid-column: 1 / -1; }
.c-programs__headline,
.c-programs__lead { grid-column: 1 / span 5; }                 /* Figma 537,33 (beide Files) */
.c-programs__headline {
  /* Spalte steht oben (1 / span 5) — hier NICHT erneut setzen, sonst gewinnt das spätere
     `span 5` ohne Startlinie und die Auto-Platzierung ist wieder im Spiel. */
  font-family: var(--u-font-heading); font-weight: 500;
  font-size: var(--u-fs-h2); line-height: 3.5rem; letter-spacing: -0.0975rem;
  color: var(--wp--preset--color--text-primary);
}
.c-programs__headline em { font-style: normal; color: var(--wp--preset--color--text-tertiary); }
.c-programs__actions { display: flex; align-items: center; gap: 0.875rem; }   /* 14 */
.c-programs__stack { grid-column: span 6; display: flex; flex-direction: column; }
/* Hinweis fuer spaeter: Ein Nachlauf (Endstation fuer die letzte Karte) plus ein frueheres
   Loesen der Headline war gebaut und funktionierte, wurde aber am 2026-08-05 als zu viel
   verworfen — der Stapel endet bewusst direkt nach der letzten Karte.
   Falls das je zurueckkommt: der Zuschlag muss ein echtes Flex-Item sein (`::after`), NICHT
   `padding-bottom`. Ein klebendes Element wandert nur in der CONTENT-Box seines Containers,
   Padding liegt ausserhalb und verlaengert den Sticky-Weg um exakt null. */
/* Sticky-Huelle je Karte. Basis = --sticky-top (Navbar-Höhe + 1rem Luft), dazu der pro Karte
   wachsende Versatz --stack-offset (inline: 0/3/6 rem) für die gestapelte Sichtbarkeit. */
.c-programs__slot { position: sticky; top: calc(var(--sticky-top) + var(--stack-offset, 0rem)); padding-bottom: 1.125rem; }  /* 18 = 411,33 - 393,33 */
/* Zustaende setzt anim-programs.js. Nur die bereits ueberdeckte Karte ist ein Ziel — die aktive
   ist schon da, die noch kommende waere ein Sprung nach vorn.
   ⚠️ Der Zeiger sitzt am SLOT, nicht an der Karte: klickbar ist der oben herausragende Streifen,
   und genau der gehoert dem Slot. */
.c-programs__slot.is-covered { cursor: pointer; }
.c-programs__slot.is-covered:focus-visible { outline: 0.125rem solid var(--wp--preset--color--accent); outline-offset: 0.25rem; }

@media (max-width: 767px) {
  .c-programs { padding-block: var(--u-s-96); }   /* 72 (Node), war 48 */
  /* `min-width: 0`: die `.u-grid`-Spalte ist `minmax(auto, 1fr)` — ihr Auto-Minimum ist der
     min-content der Zelle. Ohne das ziehen die Karten (langes Wort „Forschungszulage") bzw. die
     Button-Reihe das 1fr-Gleis breiter als der Container und die Sektion laeuft ueber. */
  /* Intro aufloesen: der Grid-Frame (14134:52733) stellt den CTA UNTER den Stapel — Headline,
     Lead und Aktionen werden Raster-Kinder, die Aktionen ruecken per `order` ans Ende. */
  .c-programs__intro { display: contents; }
  /* row-gap 0: die Abstaende Kopf→Lead (20) und Kopf→Karussell/Karussell→Aktionen (32)
     werden als Paddings gesetzt (uneinheitliche Werte, EIN row-gap kann sie nicht tragen). */
  .c-programs__inner { row-gap: 0; }
  /* 1/-1 auch fuer Headline/Lead: das `span 5` der Basis liesse die Headline auf 5 Mobil-
     Spalten (125px) Wort fuer Wort umbrechen. Node: 312x96. */
  .c-programs__headline, .c-programs__lead { grid-column: 1 / -1; }
  .c-programs__headline { font-size: 1.625rem; line-height: 2rem; letter-spacing: -0.0488rem;   /* Figma Mobil-H3 26/32, ls -3% */ max-width: none; }
  .c-programs__lead { padding-top: 1.25rem; }   /* Headline -> Lead 20 (Node, row-gap ist 0) */
  /* SETZUNG: Aktionen bleiben mobil sichtbar (Grid-Frame zeichnet den CTA, die Single-Frames
     ebenso) — nur der Home-Frame laesst sie weg; das werte ich als Zeichnungs-Luecke, nicht
     als Regel (der Home-Desktop fuehrt beide Buttons). Gestapelt, linksbuendig, gap 14. */
  .c-programs__actions { grid-column: 1 / -1; order: 5; min-width: 0;
    flex-direction: column; align-items: flex-start; gap: 0.875rem; padding-top: 2rem; }
  /* 🔴 Stapel AUS auf Mobile — Umlauf-Karussell rein (User-Entscheidung 15.08., ADR 0010 §1.7
     Nachtrag; Auftrag 2026-08-15-programs-slider). Der Home-Frame zeichnet zwar den Stapel
     (Slots 312x614, pad 48/176), die Entscheidung ersetzt ihn: drei Karten als Umlauf wie
     04 Funding. Figur = §1.7: Karte 312 (12 Spalten), Gutter 8, aktive Karte mittig,
     Anschnitt folgt (16). SETZUNG: Kopf→Karussell 32 und Karussell→Aktionen 32 aus der
     §1.7-Schwester 04 Funding (Node 14077:35071, Sektions-gap 32) — die 48er-Vorluft des
     Stapels gehoerte zur Slot-Figur und geht mit ihr.
     Mechanik: anim-slider.js (`.c-programs`-Eintrag, umlauf, nurMobil); die Slots SIND die
     Track-Kinder (Breite ueber `.c-carousel__track > *`), Sticky und Slot-Padding weichen.
     Grundzustand ohne JS: natives Wischen mit Snap (geteilter `.c-carousel`-Rahmen). */
  .c-programs .c-carousel { grid-column: 1 / -1; padding-top: 2rem; }
  .c-programs__stack { flex-direction: row; --karten-spalten: 12; }
  .c-programs__slot { position: static; padding: 0; }
}

/* ============================================================= Blog-Teaser (Node 13690:2752)
   „Aktuelles aus der Förderwelt" — Headline + Slider-Nav, Karten-Slider, CTA zentriert.
   Slider-Nav = bestehendes `.c-slidernav`. Karte = neue Komponente `.c-postcard`
   (Bild oben, p 6 — das ist NICHT .c-card, die hat p 26 und kein Kopfbild).
   NOCH OHNE JS: der Track scrollt bereits nativ mit scroll-snap; GSAP/JS verdrahten spaeter nur
   die beiden Pfeil-Buttons und den Disabled-State. */
.c-blog { position: relative;
  background: var(--wp--preset--color--bg-primary);
  border-top: 0.0625rem solid var(--wp--preset--color--border-tertiary);
  padding-block: 6rem 5rem;                                   /* 96 / 80 */
  display: flex; flex-direction: column; align-items: center; gap: 4rem;   /* 64 */
}
/* Kopfzeile als GRID (Layout-Regel Stufe 1): Headline links, Pfeile rechts. Vorher eine
   Flex-Reihe mit `flex: 1 1 0` — damit hing die Textbreite am Restplatz statt am Raster.
   Span 5 (537,33) ist aus dem UMBRUCH abgeleitet: der Node bricht nach „Das könnte Sie";
   bei 6 Spalten (648) passte „auch" noch in die erste Zeile. */
.c-blog__row {
  display: grid; grid-template-columns: repeat(var(--u-cols), minmax(0, 1fr));
  gap: var(--u-gutter); align-items: end; width: 100%;
}
.c-blog__nav { grid-column: span 7; justify-self: end; }
.c-blog__headline {
  grid-column: span 5; min-width: 0;
  font-family: var(--u-font-heading); font-weight: 500;
  font-size: var(--u-fs-h2); line-height: 3.5rem; letter-spacing: -0.0975rem;
  color: var(--wp--preset--color--text-primary);
}
.c-blog__headline em { font-style: normal; color: var(--wp--preset--color--text-tertiary); }
.c-blog__nav { display: flex; align-items: flex-start; gap: 0.25rem; }   /* 4 */

/* Track blutet ueber den Container hinaus -> die naechste Karte lugt am Rand heraus (wie Figma).
   Kartenbreite = 4 Container-Spalten, aus der Viewport-Breite gerechnet. */
.c-blog__viewport {
  /* KEIN width: 100% — sonst verschieben die negativen Margins die Box nur, statt sie zu
     verbreitern, und der Ueberhang faellt weg. Auto-Breite + negative Margins = echter Bleed:
     Container-Inhalt (1344) + 2x48 = 1440 -> Karte 4 lugt in den rechten Rand. */
  margin-inline: calc(-1 * var(--u-margin));
  padding-inline: var(--u-margin);
  overflow-x: auto; overflow-y: hidden;
  scroll-snap-type: x mandatory;
  /* Pflicht: ohne scroll-padding schnappt `mandatory` die erste Karte an die PADDING-Box-Kante
     und scrollt damit ueber das Padding hinweg -> Karte 1 klebte auf 0 statt am 48er-Rand. */
  scroll-padding-inline: var(--u-margin);
  scrollbar-width: none;
}
.c-blog__viewport::-webkit-scrollbar { display: none; }
/* ---- Gemeinsame Slider-Zustaende: Blog · Featured (News/Blog/Webinare-Hero) · Methodik -------
   Die drei Bloecke sind unabhaengig entstanden und hatten je eigene Logik. Sie teilen sich jetzt
   `anim-slider.js` — und damit auch diese Regeln. Ein Selektor pro Zustand, nicht drei Kopien:
   sonst laufen die Slider optisch wieder auseinander.

   Auswahl unterbinden, sonst markiert ein Zieh-Versuch die Kartentexte statt zu schieben.
   Der Cursor selbst kommt von Draggable (`cursor` / `activeCursor`). */
.c-blog__viewport, .c-featured__viewport, .c-methodik__viewport {
  user-select: none; -webkit-user-select: none;
}

/* 🔴 `is-gsap` setzt anim-slider.js, sobald es die Achse uebernimmt.
   Nativer Overflow-Scroll UND eine GSAP-Transform auf demselben Track verschieben sich sonst
   gegenseitig — und `scroll-snap-type: mandatory` wuerde jeden Wurf sofort abwuergen (Snap und
   Traegheit schliessen sich auf einer Achse aus). Ohne JS greift diese Klasse nie, dann bleibt
   der native Zustand mit Snap unveraendert. */
.is-gsap .c-blog__viewport,
.is-gsap .c-featured__viewport,
.is-gsap .c-methodik__viewport {
  overflow-x: hidden;
  scroll-snap-type: none;
}
.is-gsap .c-blog__track > *,
.is-gsap .c-featured__track > *,
.is-gsap .c-methodik__track > * { scroll-snap-align: none; will-change: transform; }
.c-blog__track { display: flex; align-items: center; gap: var(--u-gutter); list-style: none; padding: 0; }
/* Die Kartenbreite haengt am <li>, NICHT an .c-postcard (Bezugsbox waere sonst das <li> selbst,
   zirkulaer). Breite ueber --u-col (vw-basiert, s. Definition oben) statt einer lokalen
   %-Neuberechnung — eine %-Custom-Property loest am VERWENDUNGSORT auf, nicht an der
   Deklarationsstelle, und war hier schon einmal die Fehlerursache (component-architecture.md). */
.c-blog__track > li {
  flex: 0 0 auto; scroll-snap-align: start;
  width: calc(4 * var(--u-col) + 3 * var(--u-gutter));
}
.c-postcard {
  display: flex; flex-direction: column; gap: 1.625rem;        /* 26 */
  width: 100%;                                                 /* Breite kommt vom <li> */
  height: 33.334rem;                                           /* 533,35 */
  padding: 0.375rem;                                           /* 6 */
  border-radius: 0.5rem;                                       /* 8 */
  background: var(--wp--preset--color--bg-tertiary);
  border: 0.0625rem solid rgba(226,232,240,.4);
  /* 🔴 `backdrop-filter: blur(5rem)` entfernt (2026-08-05): bei deckendem Hintergrund ohne
     jede Wirkung, aber sobald der Hover-Hintergrund transparent wird, zieht der Blur die Seite
     dahinter durch und verfaelscht die Hover-Farbe. Tote CSS im Ruhezustand, schaedlich im Hover. */
  overflow: hidden; text-decoration: none;
}
/* ---- Karten-Hover (User-Vorgabe 2026-08-05) -----------------------------------------------
   Graue Karten schlagen auf Brand-Purple **#1e063d** mit 10 % Deckkraft um (Figma-Palette:
   „Secondary-500", Frame 11377:637). Liegt im Theme als `brand-dark` — der Token war vorher
   projektweit nie benutzt, alle dunklen Flaechen griffen auf `text-primary` (gleicher Hex).

   🔴 Warum der erste Anlauf falsch AUSSAH, obwohl die Farbe stimmte: `.c-postcard` trug
   `backdrop-filter: blur(5rem)`. Bei deckendem Ruhe-Hintergrund macht der Filter nichts — er
   wird erst sichtbar, sobald der Hintergrund transparent wird. Genau das passiert im Hover:
   der Blur zieht die Seite hinter der Karte durch und verfaelscht den Farbeindruck. Der Filter
   war also im Ruhezustand tote CSS und im Hover aktiv schaedlich → entfernt (siehe .c-postcard).

   `color-mix` statt eines fest notierten rgba(): der Token bleibt die einzige Quelle, eine
   Farbaenderung im Theme wandert automatisch mit.

   ⚠️ Kein `box-shadow` als Hover (Agentur-Regel) — Flaeche statt Schatten.

   🔴 NUR Beitrags-, Download- und Webinar-Karten. Erste Fassung hatte zusaetzlich
   `.c-card--light` gefasst — das ist die generische helle Karte und trifft damit auch die
   gestapelten Programm-Karten (c-programs) und die Funding-Bento. Die stehen auf dunklem bzw.
   mintfarbenem Grund, wo eine zu 10 % deckende Flaeche schlicht „durchsichtig" aussieht.
   Der Hover gehoert an die Karten-TYPEN, nicht an die Farbvariante.
   Die weissen Blog-Karten sind ebenfalls `.c-postcard` (`.c-articles__grid` setzt nur den
   Grund auf weiss) — sie sind damit automatisch mit abgedeckt. */
.c-postcard,
.c-download-card {
  transition: background-color var(--u-dur-base) var(--u-ease);
}
.c-postcard:hover,
.c-download-card:hover {
  background-color: color-mix(in srgb, var(--wp--preset--color--brand-dark) 10%, transparent);
}

.c-postcard__img {
  flex: 0 0 auto; width: 100%; height: 14.58rem;               /* 233,28 */
  border-radius: 0.375rem; object-fit: cover; display: block;
}
.c-postcard__body {
  flex: 1 1 auto; min-height: 0;
  display: flex; flex-direction: column; justify-content: space-between;
  padding: 0 1.25rem 1.25rem;                                  /* px 20, pb 20 */
}
.c-postcard__text { display: flex; flex-direction: column; gap: 1.625rem; }   /* 26 */
.c-postcard__head { display: flex; align-items: center; gap: 0.625rem; }      /* 10 */
.c-postcard__meta {
  display: flex; align-items: center; gap: 0.375rem;           /* 6 */
  font-family: var(--u-font-body); font-weight: 500;
  font-size: var(--u-fs-body-small); line-height: 1.375rem;
  color: var(--wp--preset--color--text-primary); white-space: nowrap;
}
.c-postcard__title {
  font-family: var(--u-font-heading); font-weight: 500;
  font-size: var(--u-fs-h5); line-height: 1.875rem; letter-spacing: -0.015rem;   /* 24/30 */
  color: var(--wp--preset--color--text-primary);
}

@media (max-width: 767px) {
  .c-blog { padding-block: var(--u-s-96); gap: 2rem; }   /* 72 · gap 32 (Node 14068:26662) */
  /* Kopf bleibt EINE Zeile: Headline links (hug), die beiden 44er-Pfeile rechts (Node `Row`
     312x64, Navigation 92x44). Vorher gestapelt — der Node stapelt nicht. */
  .c-blog__row { display: flex; flex-direction: row; justify-content: space-between; align-items: center; gap: 1rem; }
  .c-blog__headline, .c-blog__nav { grid-column: auto; justify-self: start; }
  .c-blog__headline { font-size: 1.625rem; line-height: 2rem; letter-spacing: -0.0488rem;   /* Figma Mobil-H3 26/32, ls -3% */ }
  /* 🔴 Hier stand eine lokale 6-Spalten-Rechnung („Mobile-Grid ist 6 statt 12") — sie stammte
     aus dem Raster-Kollaps, den ADR 0010 §1.1 aufgehoben hat. Zwoelf Spalten gelten von 360 bis
     1440, also greift wieder `--u-col` wie ueberall. Der Node zeichnet die Karte auf 312 = genau
     die Containerbreite = 12 Spalten (Node 14068:26662 › Blog Container). */
  .c-blog__track { --karten-spalten: 12; }
  /* Hoehe kommt aus der 4:5-Faustregel unten — 312 x 5/4 = 390, genau der Node-Wert.
     Innenleben nach Node: pad 6 (wie Desktop), Bild 300x150 (r6), Body pad 10, gap 24. */
  /* 4:5 (390) ist die MINDESThoehe, kein Deckel: unsere Titel laufen bis 4 Zeilen und
     schoben den Artikel-Link aus der fixen Karte (§6: Layout robust statt Text kuerzen).
     `align-items: stretch` der Spur haelt alle Karten gleich hoch. */
  .c-blog .c-postcard { padding: 0.375rem; aspect-ratio: auto; min-height: 24.375rem; height: auto; }
  .c-blog .c-postcard__img { height: 9.375rem; }
  .c-blog .c-postcard__body { padding: 0 0.625rem 0.625rem; gap: 1.5rem; }
}

/* ============================================================= CTA (Node 13818:30283)
   „Bereit, sich Ihre Förderung zu sichern?" — Karte mit 16px Einrueckung (wie Stats),
   Text mittig, dahinter 6 frei verstreute Bilder.
   Figma-Annotation: „Interaktive Section, Bilder werden animiert, aehnlich sanalabs.com".
   NOCH OHNE GSAP: die Streuung steht statisch wie im Design; der Pass legt spaeter Parallax/
   Scroll-Bewegung drauf. KEIN CSS-transform auf den Bildern — die Achse gehoert GSAP,
   Position laeuft deshalb ueber left/top (Muster wie .c-rowlist__media). */
.c-cta { position: relative; background: var(--wp--preset--color--bg-primary); padding: 1rem; }   /* 16 */
/* Auf Mobile ist der Sektionsrand 8, nicht 16 — die Karte misst im Frame 344 (= 360 − 2×8), wie
   bei Stats und Methodik. Mit 16 blieben 328 (nachgemessen). */
@media (max-width: 767px) { .c-cta { padding: var(--u-gutter); } }
.c-cta__card {
  position: relative; isolation: isolate; overflow: hidden;
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: 4rem;                                       /* 64 */
  padding: 5rem 3rem;                              /* 80 / 48 */
  min-height: 42.375rem;                           /* 678 — Raum fuer die Streuung */
  border-radius: 1rem;                             /* 16 */
  background: var(--wp--preset--color--bg-tertiary);
}
/* Bilder: absolut, Bezugsbox = Padding-Box der Karte (1408) -> 100% loest hier korrekt auf. */
.c-cta__img {
  --cta-col: calc((100% - 2 * 3rem - 11 * var(--u-gutter)) / 12);   /* Karten-Grid: 94,67 */
  position: absolute; z-index: -1;
  aspect-ratio: 205.33 / 256.65;                   /* 4:5 */
  border-radius: 0.375rem;                         /* 6 */
  object-fit: cover; display: block; pointer-events: none;
}
/* Die 6 Positionen 1:1 aus Figma (left/top relativ zur 1408er Karte, in % umgerechnet). */
.c-cta__img--1 { width: calc(2 * var(--cta-col) + var(--u-gutter)); left:  3.399%; top:  178.7px; }
.c-cta__img--2 { width: calc(2 * var(--cta-col) + var(--u-gutter)); left: 82.163%; top:  421.7px; }
.c-cta__img--3 { width: calc(2 * var(--cta-col) + var(--u-gutter)); left: 74.137%; top:  126.7px; }
.c-cta__img--4 { width: var(--cta-col);                             left: 22.291%; top:  468.7px; }
.c-cta__img--5 { width: var(--cta-col);                             left: 86.140%; top:   71.5px; }
.c-cta__img--6 { width: calc(2 * var(--cta-col) + var(--u-gutter)); left: 16.041%; top: -144.3px; }

.c-cta__text {
  width: calc(6 * var(--cta-col) + 5 * var(--u-gutter));   /* Figma 648 = 6 Spalten */
  --cta-col: calc((100% - 11 * var(--u-gutter)) / 12);     /* hier: Bezugsbox = Karten-Innenbreite (1312) */
  display: flex; flex-direction: column; align-items: center; gap: 1.25rem;   /* 20 */
  text-align: center; color: var(--wp--preset--color--text-primary);
}
.c-cta__headline {
  font-family: var(--u-font-heading); font-weight: 500;
  font-size: var(--u-fs-h2); line-height: 3.5rem; letter-spacing: -0.0975rem;
}
.c-cta__headline em { font-style: normal; color: var(--wp--preset--color--text-tertiary); }
.c-cta__lead {
  /* Gewicht 500, nicht 400: Desktop-Node 13818:30283 UND Mobil-Node 14068:26674 fuehren
     Open Sans 500 16/24 (elementgenau gelesen, 2026-08-13). */
  font-family: var(--u-font-body); font-weight: 500;
  font-size: var(--u-fs-body-regular); line-height: 1.5rem; letter-spacing: -0.03rem;
}
.c-cta__actions { display: flex; align-items: center; gap: 0.875rem; }   /* 14 */

@media (max-width: 767px) {
  /* Node 14068:26674: Sektion 624 FIX, Karte 344x608, Inhalt mittig. Die Hoehe ist
     Layout-Traeger (gleiche Lehre wie .c-quote/688): ohne sie kollabiert die Karte auf
     Inhaltshoehe und die Streubilder haben keinen Raum. */
  .c-cta__card { min-height: 38rem; padding: 1rem; gap: 3rem; }   /* 608 · 16 · 48 */
  .c-cta__text { width: 100%; gap: 0.875rem; }                    /* 312 · Headline->Lead 14 */
  .c-cta__headline { font-size: 1.625rem; line-height: 2rem; letter-spacing: -0.0488rem; }  /* Mobil-H3 26/32, ls -3% */
  /* Buttons gestapelt: SEKUNDAER oben, Primaer darunter (Node-Reihenfolge), mittig, je
     HUG-Breite (Sek. 304, Prim. 188 im Node — Breite kommt aus dem Inhalt, nicht gestreckt).
     column-reverse statt DOM-Umbau: das Markup fuehrt den Primaer zuerst (Vorlesereihenfolge). */
  .c-cta__actions { flex-direction: column-reverse; align-items: center; gap: 0.875rem; }
  /* Streubilder BLEIBEN (ADR 0010 §2.1) — eigene Mobil-Positionen aus dem Node.
     Groessen sind Spannen des SEITEN-Rasters (98,67 = 4 Sp. + 3 Gutter, 45,33 = 2 Sp. + 1
     Gutter bei 360/24/8) -> var(--u-col), nicht die Karten-Spalte des Desktops.
     Zuordnung Bild->Position ueber die imageRef-Hashes von Desktop- und Mobil-Node
     (--1 118189dd · --2 8d0d6a87 · --3 cb223abb · --5 add7c1c3); --4/--6 nach Groesse
     (SETZUNG, Hashes der Platzhalter-Stacks nicht eindeutig). */
  .c-cta__img { display: block; }
  .c-cta__img--1, .c-cta__img--2, .c-cta__img--3, .c-cta__img--6 { width: calc(4 * var(--u-col) + 3 * var(--u-gutter)); }
  .c-cta__img--4, .c-cta__img--5 { width: calc(2 * var(--u-col) + var(--u-gutter)); }
  .c-cta__img--1 { left: -9.012%; top: 1.6875rem; }    /* -31 / 27  */
  .c-cta__img--2 { left: 80.814%; top: 22.8125rem; }   /* 278 / 365 */
  .c-cta__img--3 { left: 5.233%;  top: 27.0625rem; }   /* 18 / 433  */
  .c-cta__img--4 { left: 58.721%; top: 2.875rem; }     /* 202 / 46  */
  .c-cta__img--5 { left: 27.326%; top: 33.5625rem; }   /* 94 / 537  */
  .c-cta__img--6 { left: 35.465%; top: -3.0625rem; }   /* 122 / -49 */
}

/* ============================================================= Hero-Variante „solutions" (Node 21674:15702)
   Seiten-Hero (Solutions by Industry): 1,4x hoch (1204 = Screen Height 1,4), Breadcrumbs oben,
   H1 6 Spalten, 2 Buttons, und rechts ein STICKY mitscrollender Fliesstext (6 Spalten).
   Figma-Annotation: „text scrollt mit … ueber der Fold sichtbar, laeuft dann mit" -> natives sticky. */
.c-hero--solutions {
  min-height: 75.25rem;                              /* 1204 — bewusst hoeher als der Viewport (Scroll fuer sticky) */
  padding-top: 11rem;
}
/* Bild-Overlays der Variante: Partikel-Bild + zwei getoente Verlaeufe (multiply/darken) + Abdunklung.
   Ersetzt Scrim/Vignette des Home-Heros. */
.c-hero--solutions .c-hero__gradient { display: none; }
.c-hero__tint { position: absolute; inset: 0; z-index: -1; pointer-events: none; }
.c-hero__tint--a { mix-blend-mode: multiply;
  background: linear-gradient(35.58deg, var(--wp--preset--color--surface-darkgrey) 8.18%, rgba(102,102,102,0) 64.69%); }
.c-hero__tint--b { mix-blend-mode: darken;
  background: linear-gradient(-16.11deg, var(--wp--preset--color--surface-darkgrey) 7.87%, rgba(102,102,102,0) 66.57%); }
.c-hero__tint--c { background: rgba(3,3,22,0.2); }
/* Zweite Toenungs-Stufe (Achse `tint`), Werte 1:1 aus Node 13702:16119: Verlauf a laeuft nur mit
   60% Deckkraft, Verlauf b ist multiply (nicht darken) und endet schon bei 41% statt 66,57%.
   Ergebnis: das Bild bleibt deutlich heller — sichtbar, kein Rundungsdetail. Verlauf c ist gleich. */
.c-hero--tint-soft .c-hero__tint--a {
  background: linear-gradient(35.58deg, rgba(71,85,105,0.6) 8.18%, rgba(102,102,102,0) 64.69%);
}
.c-hero--tint-soft .c-hero__tint--b {
  mix-blend-mode: multiply;
  background: linear-gradient(-15.05deg, var(--wp--preset--color--surface-darkgrey) 7.38%, rgba(102,102,102,0) 41.08%);
}

.c-hero--solutions .c-hero__inner { padding-bottom: 5rem; }   /* pb 80 */

.c-hero--solutions .c-hero__text { row-gap: 1.5rem; }             /* 24 (Breadcrumbs->H1) */
.c-hero--solutions .c-hero__headline { grid-column: 1 / span 6; }   /* Figma 648 = 6 Rasterspalten */

/* Body: rechte 6 Spalten. Zwei Positionen (Achse `--sticky` / `--bottom`), sonst identisch. */
.c-hero__body {
  flex: 1 1 auto; position: relative; width: 100%;
  display: grid; grid-template-columns: repeat(var(--u-cols), minmax(0, 1fr)); column-gap: var(--u-gutter);
}
.c-hero__body-text {
  /* Rechte 6 Spalten — als Grid-Position, nicht als nachgebaute Spaltenformel plus
     `margin-left: auto` (Layout-Regel §3). `7 / -1` ist die rechte Haelfte des 12er-Rasters. */
  grid-column: 7 / -1;
  font-family: var(--u-font-body); font-weight: 400;
  font-size: var(--u-fs-body-medium); line-height: 1.625rem; letter-spacing: -0.03375rem;   /* 18/26 */
  color: var(--wp--preset--color--text-alternate);
}
/* Mitscrollend (Node 21674:15702). Figma: pt-176 + sticky top-0. Das pt schiebt den START nach unten
   (~685 = 57% der Hoehe), beim Scrollen klebt die Padding-Oberkante bei 0 -> Text bleibt bei 176
   unter dem Viewport-Rand. */
.c-hero__body--sticky .c-hero__body-text { position: sticky; top: 0; padding-top: 11rem; }
/* Unten ausgerichtet (Node 13702:16119): Figma `flex-[1_0_0] items-end justify-end`.
   Der Body fuellt die Resthoehe, der Text sitzt an dessen Unterkante — kein sticky. */
/* 🔴 KEIN `display: flex` mehr: `.c-hero__body` ist ein 12er-Raster, ein Display-Wechsel wuerde
   `grid-column` an den Kindern wirkungslos machen (still — kein Fehler, nur falsche Breite).
   `align-content: end` liefert dieselbe Unterkanten-Ausrichtung; die Rechtslage kommt aus der
   Spalte `7 / -1` des Textes, nicht aus `justify-content`. */
.c-hero__body--bottom { align-content: end; }

@media (max-width: 767px) {
  /* Node 14216:58784 (Needs Overview): Hero 780 FIX — Inhalt ab 128 oben, Fliesstext unten
     buendig (pb 48). 780 ist MINDESThoehe: unser laengerer Fliesstext streckt die Buehne
     (§6, Layout robust). Flex + space-between ersetzt die feste Beziehung. */
  .c-hero--solutions { min-height: 48.75rem; padding-top: 0; padding-bottom: 3rem;
    display: flex; flex-direction: column; justify-content: space-between; gap: 2rem; }
  .c-hero--solutions .c-hero__inner { padding-top: 8rem; padding-bottom: 0; }
  .c-hero--solutions .c-hero__text { row-gap: 1rem; }   /* Breadcrumbs -> H1 16 (Node) */
  .c-hero--solutions .c-hero__intro { gap: 2rem; }  /* H1 -> Buttons 32 (Node Container gap) */
  .c-hero--solutions .c-hero__headline { grid-column: 1 / -1; font-size: 2rem; line-height: 2rem; letter-spacing: -0.03em; }
  /* Buttons: Sekundaer (304) OBEN, Primaer (188) darunter (Node). Die Reihenfolge dreht
     bereits die bestehende `order: 2`-Regel am Mint-Button (Home-Hero-Muster) — hier nur
     stapeln, NICHT column-reverse (sonst doppelt gedreht). */
  .c-hero--solutions .c-hero__actions { flex-direction: column; align-items: flex-start; gap: 0.875rem; }
  .c-hero__body-text { grid-column: 1 / -1; position: static; margin-top: 3rem; padding-top: 0; }
  .c-hero--solutions .c-hero__body-text { margin-top: 0; }
  .c-hero__lead, .c-hero--overview .c-hero__lead, .c-hero--overview .c-hero__headline,
  .c-hero--single .c-hero__body--single .c-hero__body-text { grid-column: 1 / -1; }
}

/* ============================================================= Statement (Node 13690:18411)
   „03 Statement" — zentrierter Eyebrow + zweifarbiges Statement. Breite = Spalten 2–11 (10 von 12),
   über `.u-grid` + `grid-column: 2 / span 10` — keine `max-width`-Rechnung (css-grundregeln §5:
   "Aspect Ratio + Span, keine max-width"). Symmetrische Spalte 1/12 bleibt leer -> zentriert sich
   selbst, ohne extra Flex-Centering. Beide Textteile sind im Figma-Node freier Fliesstext OHNE
   manuelle Umbrueche — Umbruch entsteht aus der Spaltenbreite (Auto-Wrap), nicht aus kopierten
   `\n` (§3a). */
.c-statement { position: relative; background: var(--wp--preset--color--bg-primary); padding-block: 8rem; }   /* 128 */
.c-statement__inner {
  grid-column: 2 / span 10;
  display: flex; flex-direction: column; align-items: center; gap: 2rem;   /* 32 */
  text-align: center;
}
.c-statement__eyebrow {
  font-family: var(--u-font-body); font-weight: 400;
  font-size: var(--u-fs-body-regular); line-height: 1.5rem; letter-spacing: -0.03rem;
  color: var(--wp--preset--color--text-primary);
}
.c-statement__text {
  font-family: var(--u-font-heading); font-weight: 400;                              /* Regular, keine H-Medium-Ausnahme */
  font-size: var(--u-fs-h3); line-height: 2.75rem; letter-spacing: -0.0675rem;        /* 36/44, -3% */
}
.c-statement__lead { color: var(--wp--preset--color--text-primary); }
.c-statement__rest { color: var(--wp--preset--color--text-tertiary); }

@media (max-width: 767px) {
  /* Node 14115:45406: pad 72, gap 20, Statement SG 400 26/32 ls -3%. */
  .c-statement { padding-block: 4.5rem; }
  .c-statement__inner { grid-column: 1 / -1; gap: 1.25rem; }
  .c-statement__text { font-size: 1.625rem; line-height: 2rem; letter-spacing: -0.0488rem; }
}

/* =========================================================================================
   Interrupter „03 Interrupter // Section" (Node 13702:17014, Concept-File)
   Breites Bildband, 16px vom Viewport-Rand eingerueckt (Muster wie .c-stats / .c-cta).
   Karte: h 516, px 48 / py 56, Radius 8, justify-between (Text oben, Aktionen unten rechts).

   Die Hoehe 516 ist LAYOUTRELEVANT, nicht Deko: sie erzeugt erst den Abstand, den
   `justify-content: space-between` verteilt. Ohne sie wird die Karte nur so hoch wie ihr Inhalt
   und Text + Buttons kleben aneinander (gleiche Lehre wie .c-quote__item / 688).
   ========================================================================================= */
.c-interrupter { position: relative; background: var(--wp--preset--color--bg-primary); padding: 1rem; }   /* 16 */
.c-interrupter__card {
  position: relative; isolation: isolate;                /* haelt mix-blend-multiply in der Karte */
  display: flex; flex-direction: column; justify-content: space-between; align-items: flex-start;
  min-height: 32.25rem;                                  /* 516 */
  padding: 3.5rem 3rem;                                  /* 56 / 48 */
  border-radius: 0.5rem;                                 /* 8 */
  overflow: hidden;
}

/* --- Bildstapel: Bild → Abdunklung → getoenter Verlauf (Muster wie Hero/Stats) --- */
.c-interrupter__media { position: absolute; inset: 0; z-index: -1; }
.c-interrupter__bg { width: 100%; height: 100%; object-fit: cover; display: block; }
.c-interrupter__scrim { position: absolute; inset: 0; background: rgba(0,0,0,0.53); }
.c-interrupter__tint {
  position: absolute; inset: 0; mix-blend-mode: multiply;
  background: linear-gradient(-73.108deg, var(--wp--preset--color--surface-darkgrey) 5.9975%, rgba(102,102,102,0) 46.986%);
}

/* --- Text --- */
.c-interrupter__text {
  /* .u-grid im Markup: die Karteninnenbreite IST das 12er-Raster dieser Sektion. Damit kommt die
     Spaltenbreite aus dem System (Projekt-Grid), statt sie je Komponente per calc() nachzubauen. */
  row-gap: 1.25rem;                                      /* 20 — Spalten-gap bleibt der Gutter */
  width: 100%;
}
/* Beide Textblöcke liegen auf Spalte 1 und sind 4 Spalten breit (Figma: Lead 426,67 = 4 Sp.,
   Headline per Entscheidung ebenso). Explizites `1 /` erzwingt je eine eigene Zeile — ohne das
   setzt die Auto-Platzierung den Lead NEBEN die Headline (Spalten 5–8), weil im 12er-Raster
   noch Platz ist. */
.c-interrupter__headline,
.c-interrupter__lead { grid-column: 1 / span 4; }

/* Serif-Headline (Figma-Style „Headings/H2 - Serif", 48/52). Newsreader ist im Projekt als
   --u-font-quote gesetzt — laut Vorgabe für Zitate UND Serif-Akzente, das hier ist einer.
   KONVENTION: Figma setzt hier ein <br>; im Bau entsteht der Umbruch über die Spaltenbreite. */
.c-interrupter__headline {
  font-family: var(--u-font-quote); font-weight: 400;
  font-size: 3rem; line-height: 3.25rem; letter-spacing: -0.03rem;    /* 48 / 52 / -0,48 */
  color: var(--wp--preset--color--text-alternate);
}
.c-interrupter__lead {
  font-family: var(--u-font-body); font-weight: 400;
  font-size: var(--u-fs-body-regular); line-height: 1.5rem; letter-spacing: -0.03rem;
  color: var(--wp--preset--color--text-alternate);
}

/* --- Aktionen: unten rechts --- */
.c-interrupter__actions {
  display: flex; align-items: center; justify-content: flex-end; gap: 0.875rem;   /* 14 */
  width: 100%;
}

@media (max-width: 767px) {
  /* Node 14115:46297 („Disruptor Section" der Needs Overview = DIESE Karte): Sektion 640 =
     8 + Karte 344x624 FIX + 8, Karte pad 16, gap 48, Inhalt mittig. Headline bleibt Serif —
     26/32 mit ls -1% (Desktop-Serif hat dieselbe Ratio), NICHT die -3% der Sans-Koepfe. */
  .c-interrupter { padding: var(--u-gutter); }
  .c-interrupter__card { min-height: 39rem; padding: 1rem; gap: 3rem; justify-content: center; }
  .c-interrupter__headline, .c-interrupter__lead { grid-column: 1 / -1; }
  .c-interrupter__headline { font-size: 1.625rem; line-height: 2rem; letter-spacing: -0.0163rem; }
  .c-interrupter__lead { font-weight: 500; }
  /* Buttons gestapelt, der breite Sekundaer OBEN (Node: 273 vor 173) — Markup bleibt. */
  .c-interrupter__actions { flex-direction: column-reverse; align-items: flex-start; justify-content: flex-start; gap: 0.875rem; }
}

/* =========================================================================================
   Positionierung „05 // Section" (Node 13702:15397) — Textspalte + Panel
   Raster: Text 5 Sp. + 1 Sp. Luft + Panel 6 Sp. = 12. Figma nutzt `justify-between` mit
   537,33 und 648; bei 1312 Container ist der Rest genau 1 Spalte + 2 Gutter (126,67).
   ========================================================================================= */
.c-positioning { position: relative; background: var(--wp--preset--color--bg-primary); padding-block: 6rem; }   /* 96 */
/* Textspalte: Headline oben, Body unten — die Panel-Hoehe spannt die Spalte auf. */
.c-positioning__text {
  grid-column: span 5;
  display: flex; flex-direction: column; justify-content: space-between; gap: 4rem;
}
.c-positioning__headline {
  font-family: var(--u-font-heading); font-weight: 500;
  font-size: var(--u-fs-h2); line-height: 3.5rem; letter-spacing: -0.0975rem;   /* 52/56/-1,56 */
  color: var(--wp--preset--color--text-primary);
}
.c-positioning__headline em { font-style: normal; color: var(--wp--preset--color--text-tertiary); }
.c-positioning__body {
  font-family: var(--u-font-body); font-weight: 400;
  font-size: var(--u-fs-body-regular); line-height: 1.5rem; letter-spacing: -0.03rem;
  color: var(--wp--preset--color--text-secondary);
}

/* Panel: startet fest auf Spalte 7, damit die Luftspalte erhalten bleibt (Figma justify-between). */
.c-positioning__panel {
  grid-column: 7 / span 6;
  display: flex; flex-direction: column; gap: 4rem;         /* 64 */
  padding: 2rem;                                            /* 32 */
  border-radius: 0.5rem;                                    /* 8 */
  background: var(--wp--preset--color--bg-tertiary);
  overflow: hidden;
}
.c-positioning__items { display: flex; flex-direction: column; gap: 1.5rem; }   /* 24 */
.c-positioning__row { display: flex; gap: 2rem; }                               /* 32 */
.c-positioning__item { flex: 1 1 0; min-width: 0; display: flex; flex-direction: column; gap: 2rem; }
/* Trenner laufen SPALTENWEISE (zwei Linien mit Gutter), nicht als eine durchgehende Linie. */
.c-positioning__divider { display: flex; gap: 2rem; }
.c-positioning__divider span { flex: 1 1 0; min-width: 0; height: 0.0625rem; background: rgba(30,6,61,.1); }
.c-positioning__itemtext { display: flex; flex-direction: column; gap: 0.625rem; }   /* 10 */
.c-positioning__itemtitle {
  font-family: var(--u-font-heading); font-weight: 500;
  font-size: var(--u-fs-h6); line-height: 1.75rem; letter-spacing: -0.0125rem;   /* 20/28/-0,2 */
  color: var(--wp--preset--color--text-primary);
}
.c-positioning__itemsub {
  font-family: var(--u-font-body); font-weight: 500;
  font-size: var(--u-fs-body-small); line-height: 1.375rem;                      /* 14/22 */
  color: var(--wp--preset--color--text-tertiary);
}
.c-positioning__actions { display: flex; align-items: flex-end; justify-content: flex-end; gap: 0.875rem; }

/* Icon-Kreis, transparente Variante auf hellem Grund (Figma: bg 1% / Border 10% des Purple). */
.c-iconcircle--ghost-dark {
  background: rgba(30,6,61,.01); border-color: rgba(30,6,61,.1);
  color: var(--wp--preset--color--text-primary);
}
/* Secondary mit Haarlinien-Border statt border-tertiary (Figma: rgba(30,6,61,.1)). */
.c-btn--hairline { border-color: rgba(30,6,61,.1); }

@media (max-width: 767px) {
  /* Node 14115:45435: pad 72, Sektionsrand seitlich 8 — das Panel laeuft auf 344 (Bleed aus
     dem 24er-Container), der Textblock bleibt bei 24. Panel pad 16, gap 32; Items gap 24,
     Item-Zeilen gap 20; Buttons gestapelt links (Sekundaer 304 ueber Primaer 188, gap 14 —
     Markup-Reihenfolge stimmt bereits). */
  .c-positioning { padding-block: 4.5rem; }
  .c-positioning__text, .c-positioning__panel { grid-column: 1 / -1; }
  .c-positioning__text { gap: 1.25rem; }
  .c-positioning__panel { margin-inline: calc(0.5rem - var(--u-margin)); padding: 1rem; gap: 2rem; }
  .c-positioning__headline { font-size: 1.625rem; line-height: 2rem; letter-spacing: -0.0488rem;   /* Figma Mobil-H3 26/32, ls -3% */ }
  .c-positioning__items { gap: 1.5rem; }
  .c-positioning__row { flex-direction: column; gap: 1.25rem; }
  .c-positioning__item { gap: 1.25rem; }
  .c-positioning__divider span:last-child { display: none; }
  .c-positioning__actions { flex-direction: column; align-items: flex-start; justify-content: flex-start; gap: 0.875rem; }
  .c-positioning__actions { flex-wrap: wrap; justify-content: flex-start; }
}

/* =========================================================================================
   FAQ-Sektion „09 FAQ" (Node 13702:15528)
   Raster: Headline 5 Sp. + Liste 7 Sp. = 12 (Figma 537,33 + 16 + 758,67 = 1312 — exakt unsere
   Container-Innenbreite; Figmas `px 48` am Section-Frame widerspricht dem und wird ignoriert,
   der Projekt-Margin ist 64).
   ========================================================================================= */
.c-faq { position: relative; background: var(--wp--preset--color--bg-primary); padding-block: 6rem; }   /* 96 */
.c-faq__headline {
  grid-column: span 5;
  font-family: var(--u-font-heading); font-weight: 500;
  font-size: var(--u-fs-h2); line-height: 3.5rem; letter-spacing: -0.0975rem;   /* 52/56/-1,56 */
  color: var(--wp--preset--color--text-primary);
}
.c-faq__headline em { font-style: normal; color: var(--wp--preset--color--text-tertiary); }
.c-faq__list { grid-column: 6 / span 7; }
/* Headline laeuft mit, bis die Liste durch ist — wie die Textspalte in `.c-funding--text-right`.
   🔴 `align-self: start` ist Pflicht: Grid-Items sind per Default `stretch`, fuellen also die
   ganze Zeilenhoehe und haetten keinen Weg zum Wandern — `sticky` bliebe wirkungslos. */
.c-faq__headline { align-self: start; position: sticky; top: var(--sticky-top); }

/* Accordion ohne Karten-Chrome: in der Sektion sind die Zeilen nur durch eine Linie getrennt.
   Achse „Variante", nicht Inhaltstyp — die Styleguide-Liste behaelt ihre Karte. */
.c-accordion--bare { background: none; border: none; border-radius: 0; padding: 0; }

/* Frage-Typo in der Sektion: H6 20/28 — in BEIDEN Zustaenden.
   ⚠️ Bewusste Abweichung vom Node: Figmas Komponente traegt in der Variante „Default"
   (geschlossen) Body 16/24 und erst in der aufgeklappten Variante H6 20/28. Als Akkordeon ist
   das ein Fehler — die Frage wuerde beim Aufklappen die Groesse wechseln und die Zeile springen
   lassen; im Design faellt es nicht auf, weil dort statische Instanzen nebeneinander liegen.
   Sichtbare Folge im Bau war, dass der erste (geschlossene) Eintrag kleiner wirkte als alle
   anderen. Vereinheitlicht. BEI DESIGN-FREEZE BESTAETIGEN. */
.c-accordion--bare .c-accordion__q {
  font-family: var(--u-font-heading); font-weight: 500;
  font-size: var(--u-fs-h6); line-height: 1.75rem; letter-spacing: -0.0125rem;   /* 20/28/-0,2 */
}
/* In der Sektion traegt AUCH die letzte Zeile eine Trennlinie (Figma). Die Karten-Variante im
   Styleguide laesst sie weg, weil dort der Karten-Rand die Kante bildet. */
.c-accordion--bare .c-accordion__item:last-child { border-bottom: 0.0625rem solid var(--wp--preset--color--border-tertiary); }
.c-accordion__head { background: none; border: none; padding: 0; cursor: pointer; text-align: left; }
.c-accordion__icon { display: inline-flex; }
.c-accordion__icon svg { width: 1.25rem; height: 1.25rem; }
/* Heading UM den Button (Accordion-Standard v1, A11y) — es soll nur gruppieren, nicht gestalten:
   die Typografie sitzt an `.c-accordion__q`, nicht am Heading. */
.c-accordion__heading { font: inherit; color: inherit; }

/* ---- Accordion-Bewegung (Backlog #15, Accordion-Standard v1) ---------------------------------
   🔴 Der GRUNDZUSTAND ist OFFEN. Eingeklappt wird erst, wenn `anim-accordion.js` `--anim` setzt.
   Ohne JS bleiben damit alle Antworten lesbar — genau das verlangt der Motion-Kontrakt („die
   CSS-Basis ist der Grundzustand, GSAP legt nur drauf"). Umgekehrt (CSS klappt zu, JS klappt auf)
   waere eine FAQ ohne JS eine Liste unbeantworteter Fragen.

   Das Panel-Innere zieht das Modul zur Laufzeit ein (`.c-accordion__panel`), damit die zwei
   Accordion-Blocks, die mir in diesem Sprint nicht gehoeren (casestudy-detail, glossary-archive),
   ohne Markup-Aenderung mitlaufen. Muster wie `anim-stats.js`, das seine Fuell-Elemente ebenso
   nachruestet. */
/* Abstand Kopf → Antwort wandert vom `gap` des Inners in ein padding-top des Panels.
   Grund: ein Flex-`gap` bleibt auch bei Panel-Hoehe 0 stehen — das ist der „Rest-Padding"-Bug,
   den der Standard ausdruecklich nennt. Als padding des Panels faehrt er mit der Hoehe auf 0. */
.c-accordion--anim .c-accordion__inner { gap: 0; }

/* Der Body wird zur reinen Hoehen-Maske, seine Layout-Rolle uebernimmt das eingezogene Panel.
   🔴 Die Doppelklasse ist Absicht, kein Zufall: `.c-accordion--programs .c-accordion__body`
   (Spezifitaet 0,2,0) steht WEITER UNTEN im Stylesheet und schlaegt eine gleich spezifische
   Regel lautlos. Mit `.c-accordion--anim.c-accordion--programs` (0,3,0) gewinnt sie sicher. */
.c-accordion--anim .c-accordion__body { overflow: hidden; display: block; }
.c-accordion--anim.c-accordion--programs .c-accordion__body { display: block; }

.c-accordion--anim .c-accordion__panel {
  padding-top: 1rem;
  display: flex; flex-direction: column; align-items: flex-start; gap: 1.25rem;
}
.c-accordion--anim.c-accordion--glossary .c-accordion__panel { padding-top: 1.25rem; }   /* war gap 20 */
.c-accordion--anim.c-accordion--programs .c-accordion__panel {
  display: grid; grid-template-columns: repeat(12, minmax(0, 1fr)); column-gap: 1rem;
  align-items: start;
}

@media (max-width: 767px) {
  .c-faq { padding-block: 4rem; }
  .c-faq__headline, .c-faq__list { grid-column: 1 / -1; }
  .c-faq__headline { font-size: 1.625rem; line-height: 2rem; letter-spacing: -0.0488rem;   /* Figma Mobil-H3 26/32, ls -3% */ }
}

/* ============================================================= Hero-Variante „single" (Node 13714:22007)
   CPT-Single-Hero (need): 860 hoch wie Home, Breadcrumbs + H1 + Buttons oben, Fliesstext unten
   rechts (5 Sp.), Logo-Leiste als Overlay am unteren Rand (siehe .c-herostack).
   Buehne: Bild → zwei Multiply-Verlaeufe → flacher Scrim rgba(3,3,22,.2) → Rand-Vignette (geteilt). */
.c-hero--single { min-height: min(53.75rem, 100svh); }
.c-hero--single .c-hero__tint--d {
  position: absolute; inset: 0; pointer-events: none; mix-blend-mode: multiply;
  background: linear-gradient(27.067deg, rgba(71,85,105,0.6) 8.1837%, rgba(102,102,102,0) 64.691%);
}
.c-hero--single .c-hero__tint--e {
  position: absolute; inset: 0; pointer-events: none; mix-blend-mode: multiply;
  background: linear-gradient(-13.5736deg, var(--wp--preset--color--surface-darkgrey) 8.8319%, rgba(102,102,102,0) 40.878%);
}
/* Der `single`-Hero hat statt des dreischichtigen Verlaufs eine flaechige Abdunklung. */
.c-hero--single .c-hero__gradient { background-image: none; background-color: rgba(3, 3, 22, 0.2); }
.c-hero--single .c-hero__text { row-gap: 1.5rem; }                /* 24 (Breadcrumbs -> H1) */
.c-hero--single .c-hero__intro { gap: 2rem; }                 /* 32 (Text -> Buttons) */
/* H1-Box: Figma nennt 676 — keine Spaltenbreite. 6 Spalten (648) sind der naechste Spaltenwert
   und erzeugen dieselben Umbrueche (im Browser gegengeprueft). Konvention: Spalten, keine px. */
.c-hero--single .c-hero__headline { width: calc(6 * var(--u-col) + 5 * var(--u-gutter)); max-width: 100%; }
/* Fliesstext unten rechts: 5 Spalten (Figma 537,33), Abstand 56 zur Logo-Leiste + deren Hoehe 80.
   margin-top: auto drueckt die Zeile ans Ende des Hero-Flex. */
/* Inner-Basis bringt pb 48 mit — hier auf 0, die Abstaende unten kommen komplett vom Body:
   56 (Figma pb der Zeile) + 80 (Logo-Leiste = Figmas Section-pb) = 136. Nachgemessen. */
.c-hero--single .c-hero__inner { padding-bottom: 0; }
.c-hero--single .c-hero__body--single {
  margin-top: auto; width: 100%;
  /* 🔴 MINDESTABSTAND zu den Buttons, 132 (Node 13714:22007: Action endet bei y=496, der
     Fliesstext beginnt bei 628). `margin-top: auto` schiebt den Block bei kurzen Ueberschriften
     ohnehin nach unten — auf Seiten mit langer H1 war der Abstand aber 0, die beiden Bloecke
     klebten aneinander (User 2026-08-12). Beides zusammen heisst: mindestens 132, sonst mehr.
     Die Sektion darf dabei ueber 860 wachsen, `min-height` laesst das zu. */
  padding-top: 8.25rem;
  padding-bottom: 8.5rem;                                     /* 56 + 80 Logo-Leiste */
}
.c-hero--single .c-hero__body--single .c-hero__body-text {
  /* 🔴 RECHTE fuenf Spalten. Der Node setzt den Fliesstext bei x=838,7 an — das ist der Anfang
     von Spalte 8 — und die Blockbeschreibung sagt seit jeher „Fliesstext unten RECHTS (5 Sp.)".
     Hier stand `1 / span 5`, also links; die Breite stimmte, die Seite nicht. */
  position: static; padding-top: 0;
  grid-column: 8 / span 5;   /* Node x=838,7 = Spalte 8, 537,33 = 5 Spalten */
}

/* ---- Titel-Hero (Node 21681:15239, Approach-Seite „Methodik und Technologie") --------------------
   Achse ggü. den anderen Page-Heros (Naming-Regel P2 — was sich real unterscheidet, nicht --methodik):
   NUR Breadcrumbs + H1, unten ausgerichtet, EIN Diagonal-Tint (kein Scrim/Vignette/Lead/Buttons/Facts/
   Body-Text). Kurz: 688px = 0,8× der 860er-Basishöhe (Figma-Metadata verifiziert, kein Screen-Height-Token). */
.c-hero--title {
  min-height: 43rem;                                          /* 688 = 0,8 × 860 */
  padding-top: 11rem; padding-bottom: 5rem;                    /* pt 176 / pb 80 */
}
.c-hero--title .c-hero__gradient { display: none; }
.c-hero--title .c-hero__tint--g {
  mix-blend-mode: multiply;
  background: linear-gradient(22.235deg, rgba(71,85,105,0.6) 8.1837%, rgba(102,102,102,0) 64.691%);
}
.c-hero--title .c-hero__inner { justify-content: flex-end; padding-bottom: 0; }
.c-hero--title .c-hero__text { row-gap: 1.5rem; }                  /* 24 (Breadcrumbs -> H1) */
/* H1 auf 6 Spalten begrenzt, damit laengere Titel („Methodik und Technologie") ueber die Box-Breite
   umbrechen statt per manuellem \n (Konvention: keine manuellen Zeilenumbrueche). Kurze Titel
   („Glossar") bleiben einzeilig. */
.c-hero--title .c-hero__headline { width: calc(6 * var(--u-col) + 5 * var(--u-gutter)); max-width: 100%; }  /* 648 = 6 Sp. */
@media (max-width: 767px) {
  .c-hero--title { min-height: 0; padding-top: 8.5rem; padding-bottom: 3rem; }
}

/* ============================================================= Hero-Variante „casestudy" (13910:34387)
   860 hoch, dunkles Bild + Multiply-Stapel (teilt sich Tints mit `single`). Oben Breadcrumbs + zwei-
   farbige H1 (weiss + grau #93899f) + Body (4 Sp.); unten Fakten-Leiste (Regel + Tag „Fakten vorweg"
   + 3 Label/Wert-Paare). pb 48 (Node), Text-Block max 907. */
.c-hero--casestudy { padding-bottom: 3rem; }                   /* 48 */
/* Bild sitzt bildfuellend rechts; Text links braucht dunklen Grund. Node 13910:34387 stapelt
   radialen Purple-Multiply + color-burn-Bild + Schwarz-Verlauf 0→0.8 + Slate/Purple-Multiply.
   Nachgebaut mit drei Ebenen: (1) globaler Purple-Multiply-Grundton, (2) starker Verlauf von links
   (fast schwarz → transparent Richtung Bild rechts), (3) Abdunklung nach unten fuer die Fakten. */
/* Nur leichter Marken-Multiply ueber dem GESAMTEN Bild — die Roboterhand rechts bleibt gut sichtbar
   (User: „Bild mit reinpacken"). Die Textseite links wird ueber cs-left kraeftig abgedunkelt. */
.c-hero--casestudy .c-hero__tint--cs-burn {
  background: rgba(30,6,61,0.25); mix-blend-mode: multiply;
}
.c-hero--casestudy .c-hero__tint--cs-left {
  background: linear-gradient(101deg, rgba(15,10,30,0.95) 1%, rgba(30,6,61,0.5) 38%, rgba(30,6,61,0) 62%);
}
.c-hero--casestudy .c-hero__tint--cs-bottom {
  background: linear-gradient(to bottom, rgba(0,0,0,0) 12%, rgba(0,0,0,0.78) 100%);
}
/* Roboterhand sitzt rechts/oben im Quellbild — dorthin ausrichten. */
.c-hero--casestudy .c-hero__bg { object-position: 65% 30%; }
/* `min(907px, 100%)` + Intro auf volle Containerbreite: sonst schrumpft der Intro-Flex-Container
   auf die 907px-Textbreite und ragt bei < 907px Container (z.B. 900px Viewport) rechts heraus
   (Overflow). Mit Intro width:100% liefert `100%` im min() die echte Containerbreite als Deckel. */
/* 🔴 Der 907er-Deckel sitzt auf der HEADLINE, nicht auf `.c-hero__text`: `__text` traegt seit
   2026-08-05 das 12er-Raster. Ein Breiten-Deckel dort wuerde alle Spalten darin mitverkleinern und
   der geerbte `.c-hero__lead` (span 4) waere 286 statt 426,67px breit. 907 ist ohnehin keine
   Rasterbreite, sondern ein Figma-Textmass — es begrenzt genau ein Element, nicht das Raster. */
.c-hero--casestudy .c-hero__headline { width: min(56.6875rem, 100%); }     /* 907 (Node-Textblock) */
.c-hero--casestudy .c-hero__intro { gap: 2rem; width: 100%; }
.c-hero--casestudy .c-hero__headline-rest { display: block; color: var(--wp--preset--color--text-tertiary); }  /* grauer 2. Teil, Node #93899f */
/* Body erbt Breite (4 Sp.) + 16/24 vom Basis-`.c-hero__lead` — hier nur Farbe/Bold ergaenzt. */
.c-hero--casestudy .c-hero__lead--cs { color: var(--wp--preset--color--text-quarternary); }
.c-hero--casestudy .c-hero__lead--cs strong { font-weight: 700; color: var(--wp--preset--color--text-alternate); }
/* Fakten-Leiste im 12er-Grid (kein px-Width): Tag links (span 2), 3 Paare rechts als 8-Sp.-Block
   (grid-column 5/-1) — Label OBEN grau / Wert UNTEN h5 weiss. */
.c-hero__facts-row--cs { align-items: center; }
/* Nur der Blur wird fuer den CS-Hero neutralisiert (die Basis traegt blur(5rem) fuer den
   Home-Hero). Vorher stand die Regel UNSCOPED und toetete als spaetere Regel gleicher
   Spezifitaet den Blur JEDES Heros (code-audit #2 / Beschluss 21); background/border/Farbe
   waren zudem 1:1-Duplikate von .c-tag--mint (das Markup traegt die Klasse) — gestrichen. */
.c-hero--casestudy .c-hero__facts-tag {
  backdrop-filter: none; -webkit-backdrop-filter: none;
}
.c-hero__facts-row--cs .c-hero__facts-tag { grid-column: 1 / span 2; justify-self: start; }
.c-hero__stats--cs {
  grid-column: 5 / -1;                                                    /* rechte 8 Spalten */
  display: flex; align-items: flex-start; gap: 5.875rem;                  /* 94 (Node-Gap) */
}
.c-hero__fact--cs { display: flex; flex-direction: column; align-items: flex-start; gap: 0.25rem; flex: 1 1 0; min-width: 0; }
.c-hero__fact-label--cs {
  font-family: var(--u-font-body); font-weight: 500; font-size: 0.875rem; line-height: 1.375rem;   /* 14/22 */
  color: var(--wp--preset--color--text-tertiary); white-space: nowrap;
}
.c-hero__fact-value--cs {
  font-family: var(--u-font-heading); font-weight: 500;
  font-size: var(--u-fs-h5); line-height: 1.875rem; letter-spacing: -0.015rem;   /* 24/30 */
  color: var(--wp--preset--color--text-alternate); white-space: nowrap;
}
/* 🔴 Die EINZIGE Sektion, die im Tablet-Band (768–991) tatsaechlich bricht — genau der Fall, fuer
   den ADR 0010 §1.2 die Tablet-Kante vorsieht („nur aendern, wo Desktop wirklich bricht").
   Nachgemessen bei 800px: die Seite lief auf 838 heraus, Verursacher waren `c-hero__fact-value`
   und `-label`. Die Werte sind `nowrap` (z.B. „Forschungszulage") und passen zu dritt nicht in die
   8-Spalten-Zelle. Alle 49 uebrigen 991er-Bloecke sind reine Mobile-Regeln und stehen jetzt bei
   767 — dieser eine bleibt oben. */
@media (max-width: 991px) {
  .c-hero--casestudy .c-hero__facts-row { grid-template-columns: minmax(0, 1fr); row-gap: var(--u-s-20); }
  .c-hero--casestudy .c-hero__facts-tag { grid-column: 1; }
  .c-hero__stats--cs { grid-column: 1; flex-direction: column; align-items: flex-start; gap: var(--u-s-20); }
}

/* Herostack: Template-Wrapper, der die Logo-Leiste (ignite/logos) ans untere Hero-Ende legt.
   Der Logos-Block bleibt die EINE Quelle; hier nur Position + Farbwelt (dunkler Grund):
   transparenter Hintergrund, py 24 statt 72, kein weisser Rand-Fade. Platzhalter-Logos sind
   dunkle SVGs -> per Filter auf weiss gehoben, bis echte Logos (helle Variante) da sind. */
.c-herostack { position: relative; }
.c-herostack .c-logos {
  position: absolute; bottom: 0; left: 0; right: 0; z-index: 5;
  background: transparent; padding-block: 1.5rem;             /* 24 */
}
.c-herostack .c-logos__fade { display: none; }
.c-herostack .c-logos__item img { filter: brightness(0) invert(1); }

/* ============================================================= Intro (Node 13782:22066)
   Eyebrow · Statement 9 Sp. + Mint-Button rechts unten · Stat-Reihe (3 Items, gap 96).
   py 112, Schatten nach oben (Figma Shadow/Above). Abstand Top -> Stats = 112. */
.c-intro { position: relative;
  background: var(--wp--preset--color--bg-primary);
  padding-block: 7rem;                                        /* 112 */
  box-shadow: -0.25rem -0.25rem 2rem 0 rgba(0,0,0,0.05);
  display: flex; flex-direction: column; gap: 7rem;           /* 112 */
}
.c-intro > .u-container { display: flex; flex-direction: column; gap: 7rem; }
.c-intro__top { row-gap: 2rem; }                              /* 32 (Eyebrow -> Statement) */
.c-intro__eyebrow {
  grid-row: 1; grid-column: 1 / span 4;
  font-family: var(--u-font-body); font-weight: 400;
  font-size: var(--u-fs-body-regular); line-height: 1.5rem; letter-spacing: -0.03rem;
  color: var(--wp--preset--color--text-primary);
}
/* Statement: Space Grotesk REGULAR 36/44 (Figma „Special/Quote Medium"), grau; <strong> ist die
   dunkle Hervorhebung — Farbwechsel, KEIN Fettdruck (Figma: gleiche Weight). */
.c-intro__statement {
  grid-row: 2; grid-column: 1 / span 9;                       /* Figma 980 = 9 Spalten */
  font-family: var(--u-font-heading); font-weight: 400;
  font-size: var(--u-fs-h3); line-height: 2.75rem; letter-spacing: -0.0675rem;   /* 36/44 */
  color: var(--wp--preset--color--text-tertiary);
}
.c-intro__statement strong { font-weight: 400; color: var(--wp--preset--color--text-primary); }
/* Backlog #30: flacher Unterstrich, exakt auf Hoehe des g-Abstrichs.
   Gemessen statt geschaetzt (canvas TextMetrics, Space Grotesk 36px): actualBoundingBoxDescent
   des „g" = 7,2px = 0,2em. Der Offset lag auf 0,15em und schnitt die g-Fahne deshalb an.
   `thickness: 1px` haelt die Linie flach — `auto` skaliert sie mit der Schriftgroesse und wird
   bei 36px sichtbar fett. `skip-ink: none`, damit die Linie durchlaeuft statt um Unterlaengen
   herumzuspringen; genau das macht sie optisch „flach". */
.c-intro__statement a {
  color: var(--wp--preset--color--text-accent);
  text-decoration: underline;
  text-underline-offset: 0.2em;          /* = gemessener g-Abstrich */
  text-decoration-thickness: 1px;
  text-decoration-skip-ink: none;
}
.c-intro__action { grid-row: 2; grid-column: 10 / -1; justify-self: end; align-self: end; }
.c-intro__stats { display: flex; gap: var(--u-s-96); align-items: flex-end; }
/* 🔴 Zweiter echter Tablet-Bruch (ADR 0010 §1.2). Nachgemessen bei 800px: die drei Stats wollen
   792 in einem 729 breiten Container — der 96er-Gap frisst den Platz, den die Werte brauchen.
   Auf 48 halbiert, statt zu stapeln: gestapelt wird erst auf der Mobile-Kante, so steht es im
   360er-Frame (Stat Row, drei Items untereinander, gap 48). */
@media (max-width: 991px) { .c-intro__stats { gap: var(--u-s-48); } }
.c-intro__stat {
  flex: 1 1 0; min-width: 0;
  border-top: 0.0625rem solid var(--wp--preset--color--border-tertiary);
  padding-top: 2rem; padding-left: 0.25rem;                   /* 32 / 4 */
  display: flex; flex-direction: column; gap: 0.625rem;       /* 10 */
}
.c-intro__stat-value {
  font-family: var(--u-font-heading); font-weight: 500;
  font-size: var(--u-fs-h1); line-height: 4rem; letter-spacing: -0.12rem;   /* 64/64/-1,92 */
  color: var(--wp--preset--color--text-tertiary);
}
.c-intro__stat-label {
  font-family: var(--u-font-body); font-weight: 400;
  font-size: var(--u-fs-body-regular); line-height: 1.5rem; letter-spacing: -0.03rem;
  color: var(--wp--preset--color--text-primary);
}

@media (max-width: 767px) {
  .c-intro { padding-block: 4rem; gap: 4rem; }
  .c-intro > .u-container { gap: 4rem; }
  .c-intro__eyebrow, .c-intro__statement { grid-column: 1 / -1; }
  .c-intro__statement { font-size: 1.5rem; line-height: 2rem; }
  .c-intro__action { grid-row: 3; grid-column: 1 / -1; justify-self: start; }
  .c-intro__stats { flex-direction: column; gap: 2rem; align-items: stretch; }
  .c-intro__stat-value { font-size: 3rem; line-height: 3.25rem; }
}

/* ============================================================= Methodik-Variante „steps" (Node 13723:3652)
   Panel grau (bg-tertiary statt bg-secondary), Kopf: Headline volle Zeile + darunter
   Lead 5 Sp. / Secondary-Button rechts. Kartenreihe traegt Figmas Mint-Glow. */
.c-methodik--steps .c-methodik__panel { background: var(--wp--preset--color--bg-tertiary); }
.c-methodik--steps .c-methodik__head--steps {
  display: flex; flex-direction: column; align-items: flex-start; gap: 1.25rem; width: 100%;   /* 20 */
}
/* Headline-Box 5 Spalten: erzwingt den Umbruch nach „wir" (Fenster gemessen im Browser),
   Figmas <br> entfaellt (Konvention: Breite statt manueller Umbruch). */
.c-methodik__headline--steps { width: calc(5 * var(--u-col) + 4 * var(--u-gutter)); max-width: 100%; }
.c-methodik__steps-row {
  display: flex; align-items: center; justify-content: space-between; gap: var(--u-gutter); width: 100%;
}
.c-methodik__lead--steps { width: calc(5 * var(--u-col) + 4 * var(--u-gutter)); max-width: 100%; }
.c-methodik--steps .c-methodik__cards { filter: drop-shadow(0 0 1.03rem rgba(10,235,191,0.11)); }

/* ============================================================= Programs: Lead unter der Headline */
.c-programs__lead {
  /* KEINE max-width: die Breite kommt aus `grid-column: 1 / span 5` weiter oben (gegen beide
     Figma-Files verifiziert). Die frueher hier stehende `max-width: 26.667rem` war ein
     Ueberbleibsel und ueberschrieb den Grid-Span aktiv — 426,67 statt 537,33 px. */
  font-family: var(--u-font-body); font-weight: 400;
  font-size: var(--u-fs-body-regular); line-height: 1.5rem; letter-spacing: -0.03rem;
  color: var(--wp--preset--color--text-secondary);
}
/* Headline -> Lead 20, Lead -> Button 32: __intro hat gap 2rem; die 20 kommen lokal. */
.c-programs__intro .c-programs__lead { margin-top: -0.75rem; }

/* ============================================================= Experten (Node 13796:16009)
   Testimonial-Switch: Textspalte 6 Sp. + Bildpaar 6 Sp. (4 + 2 + Gutter = 648).
   Buehne wie .c-quote: Items uebereinander (grid-area 1/1), .is-current sichtbar, Rest hidden.
   Der GSAP-Pass haengt nur die Klasse um und nimmt `hidden` VOR dem Einblenden weg. */
.c-experts { position: relative; background: var(--wp--preset--color--bg-primary); padding-block: 5rem 6rem; }   /* 80 / 96 */
.c-experts__stage { display: grid; }
.c-experts__item { grid-area: 1 / 1; align-items: stretch; }   /* .u-grid */
.c-experts__item[hidden] { display: none; }                    /* display:grid schlaegt [hidden] */
.c-experts__col {
  grid-column: 1 / span 6;
  display: flex; flex-direction: column; justify-content: space-between; align-items: flex-start;
}
.c-experts__eyebrow {
  font-family: var(--u-font-body); font-weight: 400;
  font-size: var(--u-fs-body-regular); line-height: 1.5rem; letter-spacing: -0.03rem;
  color: var(--wp--preset--color--text-primary);
}
.c-experts__info { display: flex; flex-direction: column; gap: 3.375rem; padding-bottom: 1.625rem; width: 100%; }   /* 54 / 26 */
.c-experts__name { display: flex; flex-direction: column; gap: 0.25rem; }   /* 4 */
.c-experts__title {
  width: calc(4 * var(--u-col) + 3 * var(--u-gutter));         /* 426,67 = 4 Spalten */
  max-width: 100%;
  font-family: var(--u-font-heading); font-weight: 500;
  font-size: var(--u-fs-h2); line-height: 3.5rem; letter-spacing: -0.0975rem;
  color: var(--wp--preset--color--text-primary);
}
.c-experts__role {
  font-family: var(--u-font-body); font-weight: 400;
  font-size: var(--u-fs-body-regular); line-height: 1.5rem; letter-spacing: -0.03rem;
  color: var(--wp--preset--color--text-tertiary);
}
/* Bio: rechtsbuendig in einem 5-Spalten-Feld, Text 4 Spalten (Figma: Container 537,33 items-end). */
.c-experts__bio {
  width: calc(5 * var(--u-col) + 4 * var(--u-gutter)); max-width: 100%;
  display: flex; flex-direction: column; align-items: flex-end; gap: 1.25rem;   /* 20 */
}
.c-experts__bio-text {
  width: calc(4 * var(--u-col) + 3 * var(--u-gutter)); max-width: 100%;
  font-family: var(--u-font-body); font-weight: 400;
  font-size: var(--u-fs-body-regular); line-height: 1.5rem; letter-spacing: -0.03rem;
  color: var(--wp--preset--color--text-secondary);
}
.c-experts__bio .c-btn--tertiary { align-self: flex-start; margin-left: calc(1 * var(--u-col) + 1 * var(--u-gutter)); }
.c-experts__media {
  grid-column: 7 / span 6;
  display: flex; align-items: center; justify-content: center; gap: var(--u-gutter);
}
.c-experts__big, .c-experts__small { position: relative; border-radius: 0.375rem; overflow: hidden; }   /* 6 */
.c-experts__big {
  flex: 0 0 auto; width: calc(4 * var(--u-col) + 3 * var(--u-gutter));
  aspect-ratio: 426.67 / 532.5;
  display: flex; align-items: flex-end; padding: 1.625rem;     /* 26 */
}
.c-experts__small {
  flex: 0 0 auto; width: calc(2 * var(--u-col) + 1 * var(--u-gutter));
  aspect-ratio: 205.33 / 256.66;
}
.c-experts__img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.c-experts__grade { position: absolute; inset: 0; pointer-events: none; }
.c-experts__grade--tint { mix-blend-mode: multiply; background: linear-gradient(to bottom, rgba(71,85,105,0) 0%, rgba(71,85,105,0.7) 100%); }
.c-experts__grade--dark { background: linear-gradient(to bottom, rgba(0,0,0,0) 0%, rgba(0,0,0,0.2) 100%); }
.c-experts__quote {
  position: relative;
  font-family: var(--u-font-heading); font-weight: 500;
  font-size: var(--u-fs-h5); line-height: 1.875rem; letter-spacing: -0.015rem;   /* 24/30 */
  color: var(--wp--preset--color--text-alternate);
  text-shadow: 0.125rem 0.125rem 0.5rem rgba(0,0,0,0.15);
}

@media (max-width: 767px) {
  .c-experts { padding-block: 3rem 4rem; }
  .c-experts__col, .c-experts__media { grid-column: 1 / -1; }
  .c-experts__info { gap: 2rem; margin-top: 2.5rem; }
  .c-experts__title { width: 100%; font-size: 1.625rem; line-height: 2rem; letter-spacing: -0.0488rem;   /* Figma Mobil-H3 26/32, ls -3% */ }
  .c-experts__bio { width: 100%; align-items: flex-start; }
  .c-experts__bio-text { width: 100%; }
  .c-experts__bio .c-btn--tertiary { margin-left: 0; }
  .c-experts__media { margin-top: 2.5rem; flex-wrap: wrap; }
  .c-experts__big { width: 100%; }
}

/* ============================================================= Quote: CTA unter dem Zitat */
.c-quote__cta { margin-top: 2rem; }

/* ============================================================= Intro: Themen-Reihe + Anker-Pfeil
   (Node 13807:17896) — Variante der Stat-Reihe: 3 Text-Items, Trennlinie LINKS statt oben,
   grosser Gap (112) zwischen Titel und Text. Gleiche Geometrie (373,33 = (1312-192)/3, gap 96). */
/* ---- Themen-Reihe = Stepper (Backlog #17) ----------------------------------------------------
   Aufbau 1:1 aus Node 13867:19343 („Text Item Hover", 316 breit = 3 Spalten):
   Headline 24 · gap 10 · Linie 316x1 · gap 10 · Body.
   🔴 Vorher trug das Item einen LINKEN Rahmen und 112 gap — der Node zeigt eine WAAGERECHTE
   Linie zwischen Titel und Text. Sie ist zugleich der Ladebalken, deshalb ein eigenes Element:
   eine `border` laesst sich nicht fuellen. Die Items sind im Node unterschiedlich hoch (179/201/
   157) und oben ausgerichtet — das fruehere `align-items: stretch` + `margin-top:auto` am Body
   hat sie kuenstlich auf gleiche Hoehe gezogen. */
.c-intro__topics { display: flex; gap: var(--u-gutter); align-items: flex-start; }
.c-intro__topic {
  flex: 1 1 0; min-width: 0;
  display: flex; flex-direction: column; gap: 0.625rem;       /* 10 (Node) */
}
.c-intro__topic-rule {
  position: relative; display: block; height: 0.0625rem;      /* 1 (Node) */
  background: var(--wp--preset--color--border-tertiary);      /* #e2e8f0 — passiv */
}
/* Fuellung des Ladebalkens: DUNKEL, nicht mint. Node 13867:19343 gibt der Linie des aktiven
   Eintrags #1e063d, die der passiven #e2e8f0 — Mint kommt dort ueberhaupt nicht vor.
   `transform` statt `width`, damit die Bewegung auf dem Compositor laeuft. */
.c-intro__topic-fill {
  position: absolute; inset: 0;
  background: var(--wp--preset--color--text-primary);         /* #1e063d — aktiv */
  transform: scaleX(0); transform-origin: left center;
}
.c-intro__topic-title {
  font-family: var(--u-font-body); font-weight: 400;
  font-size: var(--u-fs-body-regular); line-height: 1.5rem; letter-spacing: -0.03rem;
  color: var(--wp--preset--color--text-primary);
}
.c-intro__topic-body {
  padding-right: 1.25rem;                                     /* 20 */
  font-family: var(--u-font-body); font-weight: 400;
  font-size: var(--u-fs-body-small); line-height: 1.375rem; letter-spacing: -0.03rem;  /* 14/22 (Node) */
  color: var(--wp--preset--color--text-primary);              /* #1e063d (Node) */
}
/* Panel = Text + Link. Beides zeigt laut Node NUR der aktive Eintrag; die passiven stehen
   nur mit grauer Ueberschrift und heller Linie da (im Node-Screenshot eindeutig, im Baum
   liegen ihre Texte trotzdem — Figma blendet sie in der Instanz aus). */
.c-intro__topic-panel { display: flex; flex-direction: column; gap: 1.5rem; }   /* 24 (Node) */
.c-intro__topic-title { transition: color var(--u-dur-fast) var(--u-ease); }

/* Aktiv/Passiv erst mit JS — ohne bleibt alles lesbar (Motion-Kontrakt). */
.c-intro__topics--anim .c-intro__topic-title { color: var(--wp--preset--color--text-secondary); }   /* #786a8b */
.c-intro__topics--anim .c-intro__topic.is-current .c-intro__topic-title { color: var(--wp--preset--color--text-primary); }
/* 🔴 Die Dauer MUSS mitgeschrieben werden: `transition: prop var(--u-ease)` deklariert nur die
   Kurve, die Dauer bleibt 0s — die Transition laeuft dann gar nicht (gemessen 2026-08-05:
   `transitionDuration: 0s, 0s`, das Panel schaltete hart). Frueher trug `--u-ease` Dauer UND
   Kurve; seit der Trennung in `--u-ease` + `--u-dur-*` ist die alte Kurzform still wirkungslos. */
/* 🔴 FESTE Hoehe statt animierter Hoehe (User 2026-08-05).
   Vorher wuchs das Panel per `grid-template-rows: 0fr → 1fr`. Das ist eine LAYOUT-Aenderung: bei
   jedem Themenwechsel schob sich die gesamte Sektion darunter auf und ab. `--ig-topic-panel-h`
   misst anim-stepper.js einmal aus dem hoechsten Panel und reserviert den Platz fuer alle — die
   Box steht dann still, es bewegt sich nur noch der Inhalt darin.
   Muster wie im Cycle-Block, der die groesstmoegliche Listenhoehe ebenfalls vorab misst.

   ⚠️ Die Dauer MUSS mitgeschrieben werden: `transition: prop var(--u-ease)` deklariert nur die
   Kurve, die Dauer bleibt 0s und die Transition laeuft gar nicht (gemessen: `0s, 0s`). Frueher
   trug `--u-ease` Dauer UND Kurve; seit der Trennung ist die alte Kurzform still wirkungslos. */
.c-intro__topics--anim .c-intro__topic-panel {
  height: var(--ig-topic-panel-h, auto);
  overflow: hidden;
  opacity: 0;
  transition: opacity var(--u-dur-base) var(--u-ease);
}
.c-intro__topics--anim .c-intro__topic.is-current .c-intro__topic-panel { opacity: 1; }
/* Der Text faehrt VON OBEN herein und geht nach oben wieder heraus. Der Versatz sitzt am INHALT,
   nicht am Panel: das Panel ist die stillstehende Maske, der Text gleitet darin. */
.c-intro__topics--anim .c-intro__topic-panel > * {
  transform: translateY(-0.75rem);
  transition: transform var(--u-dur-base) var(--u-ease);
}
.c-intro__topics--anim .c-intro__topic.is-current .c-intro__topic-panel > * { transform: translateY(0); }
/* Anker-Pfeil: derselbe Kreis-Pfeil, 90° gedreht (Figma „Icon / Arrow down" = rotierter Frame). */
.c-btn--icon-down .c-btn__icon { transform: rotate(90deg); }

@media (max-width: 767px) {
  .c-intro__topics { flex-direction: column; gap: 2rem; }
  .c-intro__topic { gap: 0.625rem; }
}

/* ============================================================= Card: Icon-Modus (Node 13803:15267)
   Icon-Kreis statt Tags im Kopf. Kreis = .c-iconcircle (geteilt mit .c-phase), Tint kontextuell
   zum Karten-Theme — mint/light dunkel getönt, dark/darkgrey mint (dasselbe Muster wie .c-phase). */
.c-card__iconcircle { align-self: flex-start; }
.c-card__glyph { width: 1.25rem; height: 1.25rem; }
.c-card--mint  .c-card__iconcircle { background: rgba(30,6,61,.1);  border-color: rgba(30,6,61,.1);   color: var(--wp--preset--color--text-primary); }
.c-card--light .c-card__iconcircle { background: rgba(30,6,61,.1);  border-color: rgba(30,6,61,.08);  color: var(--wp--preset--color--text-primary); }
.c-card--dark  .c-card__iconcircle,
.c-card--darkgrey .c-card__iconcircle,
.c-card--transparent .c-card__iconcircle { background: rgba(7,235,191,.1); border-color: rgba(7,235,191,.15); color: var(--wp--preset--color--accent); }
/* ⚠️ theme=transparent hatte KEINE Iconcircle-Regel — fiel auf den unstyled .c-iconcircle-Default
   zurück (Ignite-Node 21681:15336: Approach-Highlights, /grants-Highlights blieb unberührt).
   Werte identisch zu dark/darkgrey (rgba(7,235,191,.1)/(.15)) — Node bestätigt, keine neue Farbe. */

/* ============================================================= Projekt-Liste (Node 13807:18352 — Panel-Chrome)
   „Typisch förderfähige Programme" — graues Panel (16px eingerückt, radius 16, py 96),
   Headline pl 48. Die LISTE selbst ist seit Bau-Auftrag 3 (Grilling 2026-07-22) keine eigene
   Zeilen-Komponente mehr, sondern die Akkordion-Variante `.c-accordion--programs` weiter unten —
   KEIN ignite/rowlist (kein GSAP-030-Vertrag: keine Bild-Ebene, keine Vorladebilder). */
.c-projectlist { position: relative; background: var(--wp--preset--color--bg-primary); padding-inline: 1rem; }   /* 16 */
.c-projectlist__panel {
  background: var(--wp--preset--color--bg-tertiary);
  border-radius: 1rem;                                        /* 16 */
  padding-block: 6rem;                                        /* 96 */
  display: flex; flex-direction: column; gap: 4rem;           /* 64 */
  overflow: hidden;
}
.c-projectlist__headline {
  padding-inline: 3rem;                                       /* 48 */
  font-family: var(--u-font-heading); font-weight: 500;
  font-size: var(--u-fs-h2); line-height: 3.5rem; letter-spacing: -0.0975rem;
  color: var(--wp--preset--color--text-primary);
}
.c-projectlist__headline em { font-style: normal; color: var(--wp--preset--color--text-tertiary); }

@media (max-width: 767px) {
  .c-projectlist__panel { padding-block: 3rem; gap: 2rem; }
  .c-projectlist__headline { padding-inline: 1.5rem; font-size: var(--u-fs-h3); line-height: 2.75rem; }
}

/* ============================================================= Accordion-Variante „programs"
   (Bau-Auftrag 3, Grilling 2026-07-22 — Sektion nachgereicht: Node 21674:16606, Client-File)
   🔴 KORREKTUR: die Sektion ist VOLLBREIT, nicht in einen 7-von-12-Container gezwängt (frühere
   Fassung hatte fälschlich `.c-accordion--programs { grid-column: span 7 }` in einem gepolsterten
   Wrapper — User-Korrektur „in Figma ist die Sektion vollbreit"). Der horizontale Panel-Inset
   (Figma-Zeile hat ihr eigenes `px-64`) sitzt jetzt direkt an der Liste, keine Zwischenbox mehr. */
.c-accordion--programs { padding-inline: 4rem; }   /* 64 — Figma: Zeile px-64 */

/* Kopf ist pro Zeile ein EIGENES 12-Spalten-Grid (fluid, nicht die Basis-Flexbox von .c-accordion__head
   — die galt nur fuer den 2-Kind-FAQ-Fall). Titel `span 6` (Figma 648 = 6 Sp.) · Tags+Icon-Gruppe
   explizit `8 / span 5` (Figma 537,33 = 5 Sp.) — Spalte 7 bleibt leer, das IST Figmas Luecke
   zwischen den beiden Boxen, kein Gutter-Auto-Placement. Beide Werte am Node nachgemessen:
   6 Sp. = 6×94,667+5×16 = 648,0 · 5 Sp. = 5×94,667+4×16 = 537,34 — exakt. */
.c-accordion--programs .c-accordion__head {
  display: grid; grid-template-columns: repeat(12, minmax(0, 1fr)); column-gap: 1rem; align-items: center;
}
.c-accordion--programs .c-accordion__q { grid-column: span 6; min-width: 0; }
.c-accordion--programs .c-accordion__meta {
  grid-column: 8 / span 5; min-width: 0;
  display: flex; align-items: center; justify-content: flex-end; gap: 1.5rem;   /* 24 — User: „Tags mehr Abstand nach rechts zum Icon" */
}
/* Tags-Sichtbarkeit: opacity/visibility-Uebergang statt display:none-Sprung (User-Meldung
   „Hover klappt nicht gut" — ein harter display-Wechsel hat keinen Uebergang und wirkt abrupt).
   Die Tags+Icon-Spalte ist immer 5 Spalten breit RESERVIERT (Grid-Track aendert sich nicht,
   nur der Inhalt blendet ein) → kein Reflow beim Ein-/Ausblenden, die Transition laeuft sauber. */
.c-accordion--programs .c-accordion__tags {
  display: inline-flex; gap: 0.5rem;                          /* 8 */
  opacity: 0; visibility: hidden; pointer-events: none;
  transition: opacity var(--u-dur-fast) var(--u-ease);
}
@media (hover: hover) {
  .c-accordion--programs .c-accordion__item:not(.c-accordion__item--open):hover .c-accordion__tags {
    opacity: 1; visibility: visible; pointer-events: auto;
  }
}
.c-accordion--programs .c-accordion__item--open .c-accordion__tags {
  opacity: 1; visibility: visible; pointer-events: auto;
}

/* Bodytext (= .c-accordion__answer dieser Variante) im offenen Zustand: NICHT die volle Zeilenbreite
   (User-Korrektur „Bodytext trotzdem nur etwa 7 Spalten Breit"). Eigenes 12-Spalten-Grid wie der Kopf,
   Answer auf `span 7` — bewusst 7 statt 6 (Titel-Breite): der Body ist Fliesstext, nicht an die
   Titel-Spalte gebunden, 7 Sp. ist der vom User genannte Zielwert. */
.c-accordion--programs .c-accordion__body {
  display: grid; grid-template-columns: repeat(12, minmax(0, 1fr)); column-gap: 1rem;
}
.c-accordion--programs .c-accordion__answer { grid-column: span 7; }

@media (max-width: 767px) {
  .c-accordion--programs { padding-inline: 1.5rem; }
  /* Titel + Tags+Icon-Gruppe stapeln (je eigene Grid-Zeile) statt nebeneinander zu quetschen —
     dasselbe Muster wie .c-projectlist__row vor Bau-Auftrag 3. */
  .c-accordion--programs .c-accordion__head { grid-template-columns: minmax(0, 1fr); row-gap: 0.75rem; }
  .c-accordion--programs .c-accordion__q,
  .c-accordion--programs .c-accordion__meta { grid-column: 1; }
  .c-accordion--programs .c-accordion__meta { justify-content: flex-start; }
  /* Tags brechen um statt die Zeile zu sprengen: als Flex-Kind hat .c-accordion__tags sonst
     `min-width:auto` (Content-Breite) und schiebt das Icon ueber den Viewport-Rand hinaus, sobald
     die Tags im offenen/getippten Zustand sichtbar werden (gefunden per Grid-Overflow-Check). */
  .c-accordion--programs .c-accordion__tags { flex-wrap: wrap; min-width: 0; row-gap: 0.5rem; }
  .c-accordion--programs .c-accordion__answer { grid-column: 1 / -1; }
}

/* ============================================================= Card-Theme „transparent" (21674:15163)
   Blur-Button-Rezept auf Kartenniveau: bg slate 1% + heller Border 10% + backdrop-blur.
   Fuer dunkle Bild-Flaechen (Highlights). Tags mint-getönt via tag_mod, Link mint. */
.c-card--transparent {
  background: rgba(71,85,105,0.01);
  border-color: rgba(251,251,251,0.1);
  color: var(--wp--preset--color--text-alternate);
  backdrop-filter: blur(5rem); -webkit-backdrop-filter: blur(5rem);
}
.c-card--transparent .c-card__body { opacity: .8; }
.c-card--transparent .c-card__link { color: var(--wp--preset--color--accent); }

/* ============================================================= Hero-Variante „overview" (21674:16773)
   Heller Archiv-Hero: weisser Grund, Breadcrumbs grau, H1 dunkel (6 Sp.), Lead 18/26 (5 Sp.),
   Mint-Button mit Anker-Pfeil. Rechts 4 verstreute 4:5-Bilder (absolute, left in %, top in px —
   Muster wie .c-cta__img). Hoehe 860 wie Home. */
.c-hero--overview {
  min-height: min(53.75rem, 100svh);
  background: var(--wp--preset--color--bg-primary);
}
.c-hero--overview .c-hero__text { row-gap: 1.5rem; }
.c-hero--overview .c-hero__intro { gap: 2rem; }
.c-hero--overview .c-hero__headline {
  color: var(--wp--preset--color--text-primary);
  grid-column: 1 / span 6;    /* 648 = 6 Spalten */
}
.c-hero--overview .c-hero__lead {
  grid-column: 1 / span 5;    /* 537,33 = 5 Spalten (war `max-width`, das gegen die geerbte 4er-Spanne nie griff) */
  font-size: var(--u-fs-body-medium); line-height: 1.625rem; letter-spacing: -0.03375rem;   /* 18/26 */
  color: var(--wp--preset--color--text-secondary);
}
.c-hero--overview .c-hero__float {
  position: absolute; border-radius: 0.375rem; object-fit: cover;
  width: calc(2 * var(--u-col) + var(--u-gutter)); aspect-ratio: 205.33 / 256.65;
}
/* Positionen 1:1 aus dem Node (left/1440 in %, top px): 1129,85/176 · 960,85/231 · 719,85/519 · 1170,85/664 */
.c-hero--overview .c-hero__float--1 { width: var(--u-col); left: 78.46%; top: 11rem; }
.c-hero--overview .c-hero__float--2 { left: 66.73%; top: 14.45rem; }
.c-hero--overview .c-hero__float--3 { left: 49.99%; top: 32.44rem; }
.c-hero--overview .c-hero__float--4 { left: 81.31%; top: 41.5rem; }

/* ---- Groessen-Achse `compact` (Node 13918:27192, Leadership) ------------------------------
   Derselbe Aufbau wie der Archiv-Hero, aber ein anderes Mass. Alle Werte am Node gezogen:

     Sektion   1440 x 614, pad 176/64/64/64   (Archiv: fest 860, pad unten 80)
     Aufbau    Krumen · gap 24 · Container(H1 · gap 24 · Lead · gap 32 · Button)
     Lead      16/24 Weight 500                (Archiv: 18/26 Weight 400 — nachgemessen an
                                                21674:16785, es sind wirklich zwei Groessen)
     Bilder    zwei statt vier

   614 ist eine INHALTSHOEHE (Figma: HUG), keine gesetzte Zahl — deshalb `min-height: 0` und die
   Hoehe aus dem Inhalt, statt 614 hart einzutragen. Mit dem 16/24-Lead ergibt sie sich von
   selbst: 176 + 26 + 24 + 324 + 64. */
.c-hero--overview-compact { min-height: 0; padding-bottom: 4rem; }   /* 64 */
/* `.c-hero__inner` bringt 48 Innenabstand unten mit — gedacht fuer die hohen Bild-Heros, wo der
   Text nicht auf der Kante stehen soll. Hier ist der Abstand nach unten die 64 der Sektion, sonst
   waeren es 112 und die Sektion 664 statt 614 (nachgemessen). */
.c-hero--overview-compact .c-hero__inner { padding-bottom: 0; }
/* Die H1 misst im Node 676 — wieder ein SCHRIFTMASS, keine Rasterbreite (6 Spalten waeren 648,
   7 schon 758,7). Auf 648 passt „Expertise" nicht mehr in die erste Zeile und der Browser trennt
   mitten im Wort („Experti-se"). Der Umbruch kommt aus der Box-Breite, nicht aus einem `<br>` —
   also bekommt die Box die Breite, die der Node ihr gibt. In rem, damit sie mit der Schrift
   skaliert und nicht mit dem Viewport. */
.c-hero--overview-compact .c-hero__headline {
  grid-column: 1 / -1;
  width: 42.25rem; max-inline-size: 100%;                                             /* 676 */
}
.c-hero--overview-compact .c-hero__lead {
  font-size: var(--u-fs-body-regular); line-height: 1.5rem; letter-spacing: -0.03rem;   /* 16/24 */
  font-weight: 500;
}
/* Nur die ersten beiden Positionen — der Node zeigt zwei Bilder, nicht vier. */
.c-hero--overview-compact .c-hero__float--3,
.c-hero--overview-compact .c-hero__float--4 { display: none; }

@media (max-width: 767px) {
  /* Node 14124:50537: DREI Streubilder bleiben mobil sichtbar (unten rechts/links),
     Groessen als Raster-Spannen (125,3 = 5 Sp. · 72 = 3 Sp. · 98,7 = 4 Sp.), Positionen
     aus dem Node; das vierte entfaellt. Zuordnung nach Reihenfolge (SETZUNG — Platzhalter). */
  /* Vom UNTEREN Rand verankert (im 780-FIX-Frame gerechnet: 54 / 166 / −12) — mit unserem
     laengeren Lead waechst der Hero, Top-Anker liefen in den Text. */
  .c-hero--overview .c-hero__float--1 { width: calc(5 * var(--u-col) + 4 * var(--u-gutter)); left: 56.67%; top: auto; bottom: 3.375rem; }
  .c-hero--overview .c-hero__float--2 { width: calc(3 * var(--u-col) + 2 * var(--u-gutter)); left: 81.94%; top: auto; bottom: 10.375rem; }
  .c-hero--overview .c-hero__float--3 { width: calc(4 * var(--u-col) + 3 * var(--u-gutter)); left: 17.5%; top: auto; bottom: -0.75rem; }
  .c-hero--overview .c-hero__float--4 { display: none; }
  /* 🔴 1/-1 MUSS hier stehen (nach den Basis-Spans 3361/3365): die gleichlautende Regel im
     Solutions-Block weiter oben verlor gegen `span 6`/`span 5` — H1 und Lead liefen auf
     152/150px und brachen Silbe fuer Silbe (achter Fall der Reihenfolge-Familie). */
  .c-hero--overview .c-hero__headline,
  .c-hero--overview .c-hero__lead { grid-column: 1 / -1; width: 100%; }
  /* Node: Inhalt ab 176 (nicht die 112 des Home-Heros). Unten reserviert das Padding das
     Streubild-Band (Frame: Bilder belegen die unteren 256 = y 524..780, Inhalt endet davor).
     `overflow: clip`, weil Bild 2 im Frame 7px ueber die rechte Kante blutet — ohne Clip
     waere das horizontales Scrollen. Kein Scroll-Container (clip), und dieser Hero hat
     keine sticky-Kinder. */
  .c-hero--overview { padding-top: 11rem; padding-bottom: 16rem; overflow: clip; }
}

/* ============================================================= Hero-Variante „locations" (21724:17193)
   Dunkler Archiv-Hero, gleiches 860-Grundgeruest wie home/single (Basis-.c-hero liefert bereits
   min-height 860 + pt-176 + color:text-alternate — 1:1 die Node-Werte, keine Ueberschreibung noetig).
   Slate-Grund + Europakarte (SVG, zwei deckungsgleiche Ebenen Map+Strokes, Node 21724:17196, 30%
   Deckkraft) + Verlauf Mint 40% -> Slate 40% darueber.
   🔴 KORREKTUR: `object-fit:cover` (erster Versuch) verzerrt die Geografie — Cover skaliert die Karte
   auf EXAKT 1440 Breite (Zoom ~43,6%), der Node zeigt sie aber bei NATUERLICHER Groesse (kein Zoom,
   1 Bild-px = 1 Referenz-px bei 1440 Breite), nur per Crop -112/-1921 verschoben. Bei Cover landet
   der 860-hohe Ausschnitt automatisch bei Skandinavien/Russland statt DACH/Benelux (per Screenshot
   verifiziert). Fix: Bild in NATUERLICHER Groesse rendern, in `vw` (nicht %/rem) positionieren —
   `vw` skaliert Breite UND Hoehe/Position im selben Verhaeltnis mit der Viewport-Breite, `top` als %
   wuerde dagegen an der (fixen) Hero-Hoehe haengen und bei anderen Breiten auseinanderlaufen.
   Werte 1:1 aus dem Node: 3307/1440=229,65 · -112/1440=-7,78 · -1921/1440=-133,40. */
.c-hero--locations { background: var(--wp--preset--color--surface-darkgrey); }
.c-hero--locations .c-hero__bg--map {
  position: absolute; width: 229.65vw; height: auto; max-width: none;
  left: -7.78vw; top: -133.4vw; opacity: 0.3;
}
.c-hero--locations .c-hero__tint--locations {
  background: linear-gradient(to bottom, rgba(10,235,191,0.4), rgba(71,85,105,0.4));
}
/* Nahtloser Übergang Hero -> Location-Liste (User 2026-07-24: „Da ist gerade ein Cut drin, die
   Landkarte soll aber nicht mit Abstand enden").
   Ursache des Cuts war AUSSCHLIESSLICH das Kartenbild: `.c-hero__media` hat `overflow:hidden`, also
   endete die Karte an der Hero-Unterkante hart. Der Tint darüber lief bereits auf rgba(71,85,105,.4)
   aus — dieselbe Farbe wie `surface-darkgrey` (#475569, gemessen), und `.c-locations` startet exakt
   damit. Sobald das BILD nach unten sauber ausblendet, ist die Naht rechnerisch unsichtbar: 40%
   #475569 über #475569 ergibt wieder #475569.
   Deshalb kein Umbau in „eine Sektion" (das würde die Trennung Präsentation/Query aufbrechen,
   s. archive-location.php) — stattdessen ein langer, weicher Verlauf über die unteren 55% INNERHALB
   von `.c-hero__media` (z-index -2, also unter Tint und Pins): die Karte hört nicht auf, sie löst
   sich auf. */
.c-hero--locations .c-hero__media::after {
  content: ""; position: absolute; inset: auto 0 0 0; height: 55%; pointer-events: none;
  background: linear-gradient(to bottom,
    rgba(71,85,105,0) 0%,
    rgba(71,85,105,0.45) 45%,
    rgba(71,85,105,0.85) 78%,
    var(--wp--preset--color--surface-darkgrey) 100%);
}

/* Karten-Pins (21724:17197ff): Positionen 1..4 fest wie .c-hero__float (links % / oben rem, Referenz
   1440x860 — gleiches Muster, gleicher Grund: Pins skalieren horizontal mit, bleiben vertikal an
   ihrer Bild-Position). Punkt = zwei konzentrische Kreise (Glow 16px @20% + Kern 8px) via ::before,
   kein Bild noetig (Node 21724:17198 ff — die 8 "kollabierten" Pins, nicht die eine aufgeklappte
   Beispielansicht 21724:17197, die im Node nur den Hover-Zustand demonstriert).
   Tooltip nur bei echtem Hover sichtbar — opacity/visibility statt display (Muster
   .c-accordion--programs .c-accordion__tags: kein harter Sprung). Touch zeigt keinen Tooltip
   (rein dekorativ, die echten Adressdaten stehen im Location-Browser darunter). */
/* Pin ist ein <button> (klickbar, s. hero/index.php) — Reset + vergroesserte Klickflaeche per
   Padding/Negativ-Margin-Trick: verschiebt NICHT den sichtbaren Punkt (Figma-verifizierte
   Position), vergroessert nur die Trefferflaeche um 12px pro Seite. */
/* z-index:1 noetig — .c-hero__inner (Breadcrumbs/Headline/Lead) ist ein SPAETERER Geschwister-
   Knoten mit z-index:auto; ohne eigenen z-index wuerden Pin und .c-hero__inner in derselben
   "auto"-Stapelebene nach DOM-Reihenfolge gemalt, .c-hero__inner (danach im Markup) läge dann
   trotz fehlendem sichtbaren Hintergrund ÜBER dem Pin und würde jeden Klick abfangen (gefunden per
   elementFromPoint — Pin visuell "da", aber unklickbar). */
/* 40px-Bühne, per translate(-50%,-50%) auf den Markerpunkt zentriert → left/top sind die
   Punktmitte, und alle Marker-Layer sind absolut ZENTRIERT (Wachsen verschiebt den Punkt nicht). */
.c-hero--locations .c-hero__pin {
  position: absolute; z-index: 1;
  width: 2.5rem; height: 2.5rem;                                             /* 40 = max. Halo + Klickfläche */
  transform: translate(-50%, -50%);
  background: none; border: 0; padding: 0; margin: 0; cursor: pointer;
}
/* Aktiver Pin nach vorne (sein Popover wandert mit) — sonst decken spätere Geschwister-Punkte es zu. */
.c-hero--locations .c-hero__pin:hover,
.c-hero--locations .c-hero__pin:focus-visible,
.c-hero--locations .c-hero__pin:focus-within { z-index: 6; }
.c-hero--locations .c-hero__pin:focus-visible {
  outline: 0.125rem solid var(--wp--preset--color--accent); outline-offset: 0.125rem;   /* 2/2 */
  border-radius: 50%;
}
/* Kern-Dot + Halo als zentrierte Layer (Node 13887:20791). Default: 8px Dot + 16px Halo @20%. */
.c-hero--locations .c-hero__pin-dot {
  position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);
  width: 0.5rem; height: 0.5rem; border-radius: 50%;                         /* 8 */
  background: var(--wp--preset--color--accent);
  transition: width var(--u-dur-fast) var(--u-ease), height var(--u-dur-fast) var(--u-ease);
}
.c-hero--locations .c-hero__pin-dot::before {
  content: ""; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);
  width: 1rem; height: 1rem; border-radius: 50%;                             /* 16 */
  background: var(--wp--preset--color--accent); opacity: 0.2;
  box-shadow: 0.5rem 0.5rem 1.5rem 0 rgba(0,0,0,0.05);                       /* 8/8/24 */
  transition: width var(--u-dur-fast) var(--u-ease), height var(--u-dur-fast) var(--u-ease);
}
/* „+" nur im Aktiv-Zustand: echtes Icon (dünner Strich 1.25 statt fetter Balken), dreht beim
   Einblenden leicht ein (Node-Prototyp: „dreht sich ein wenig bei Hover"). */
.c-hero--locations .c-hero__pin-plus {
  position: absolute; top: 50%; left: 50%;
  display: flex; align-items: center; justify-content: center; pointer-events: none;
  color: var(--wp--preset--color--text-primary);
  opacity: 0; transform: translate(-50%, -50%) rotate(-90deg) scale(0.4);
  transition: opacity var(--u-dur-fast) var(--u-ease), transform var(--u-dur-base) var(--u-ease);
}
.c-hero--locations .c-hero__pin-plus-icon { display: block; width: 1.25rem; height: 1.25rem; }   /* 20 */
/* Aktiv (Hover/Focus): Dot 8→24, Halo 16→40 (beide zentriert → kein Versatz), „+" dreht ein. */
.c-hero--locations .c-hero__pin:hover .c-hero__pin-dot,
.c-hero--locations .c-hero__pin:focus-visible .c-hero__pin-dot,
.c-hero--locations .c-hero__pin:focus-within .c-hero__pin-dot { width: 1.5rem; height: 1.5rem; }        /* 24 */
.c-hero--locations .c-hero__pin:hover .c-hero__pin-dot::before,
.c-hero--locations .c-hero__pin:focus-visible .c-hero__pin-dot::before,
.c-hero--locations .c-hero__pin:focus-within .c-hero__pin-dot::before { width: 2.5rem; height: 2.5rem; } /* 40 */
.c-hero--locations .c-hero__pin:hover .c-hero__pin-plus,
.c-hero--locations .c-hero__pin:focus-visible .c-hero__pin-plus,
.c-hero--locations .c-hero__pin:focus-within .c-hero__pin-plus { opacity: 1; transform: translate(-50%, -50%) rotate(0) scale(1); }

/* Popover 1:1 Figma (Node 13887:20791): mint Fläche, Stadt (Space Grotesk 20/28) + Adresse
   (Open Sans 14/22), 316 breit, radius 6, padding 16, gap 32, kein Rand/Schatten/Pfeil. */
.c-hero--locations .c-hero__pin-tip {
  position: absolute; left: 4rem; top: 50%; transform: translateY(-50%);      /* 24px rechts vom 40px-Marker, mittig */
  display: flex; flex-direction: column; gap: 2rem;                           /* 32 Titel→Adresse */
  width: min(19.75rem, 90vw);                                                 /* 316 (fixes Popover, kein Grid-Span) */
  padding: 1rem; border-radius: 0.375rem;                                     /* 16 / 6 */
  background: var(--wp--preset--color--accent);
  backdrop-filter: blur(0.125rem); -webkit-backdrop-filter: blur(0.125rem);   /* 2 */
  color: var(--wp--preset--color--text-primary); text-align: left;
  opacity: 0; visibility: hidden; pointer-events: none; transition: opacity var(--u-dur-fast) var(--u-ease);
  z-index: 5;
}
.c-hero--locations .c-hero__pin-city {
  display: block; font-family: var(--u-font-heading); font-weight: 500;
  font-size: var(--u-fs-h6); line-height: 1.4em; letter-spacing: -0.01em;      /* 20/28 */
  color: var(--wp--preset--color--text-primary);
}
.c-hero--locations .c-hero__pin-address {
  display: block; font-family: var(--u-font-body); font-weight: 500;
  font-size: var(--u-fs-body-small); line-height: 1.375rem;                    /* 14/22 */
  color: var(--wp--preset--color--text-primary);
}
@media (hover: hover) {
  .c-hero--locations .c-hero__pin:hover .c-hero__pin-tip { opacity: 1; visibility: visible; pointer-events: auto; }
}
/* 🔴 Pin-Positionen echt geografisch kalibriert gegen die Karte (User 2026-07-30: „Venlo kann nicht
   rechts von der Grenze sein"). Verankert am verlässlichen Bremen-Pin (Figma-Aktiv-Pin: Viewport
   941,5/436,5 = Map-Pixel 1053,5/2357,5 bei Map-Offset −112/−1921, Bremen = 8,80°O/53,08°N).
   Mercator-Näherung um 52°N: k_lat ≈ 85 px/°, k_lon = k_lat·cos52° ≈ 52 px/°.
     x_map = 1053,5 + 52·(lon−8,80) · y_map = 2357,5 − 85·(lat−53,08) · vw = (map − offset)/14,4.
   Beide Achsen vw (Karte ist ebenfalls vw → Pins tracken bei jeder Breite). pin--N = Template-
   Reihenfolge (bremen, enschede, nijmegen, deventer, breda, amsterdam, heerenveen, st-ingbert,
   venlo, delft). */
.c-hero--locations .c-hero__pin--1  { left: 65.38vw; top: 30.31vw; }   /* Bremen     · 53,08N 8,80E */
.c-hero--locations .c-hero__pin--2  { left: 58.52vw; top: 35.39vw; }   /* Enschede   · 52,22N 6,90E */
.c-hero--locations .c-hero__pin--3  { left: 54.76vw; top: 37.63vw; }   /* Nijmegen   · 51,84N 5,86E */
.c-hero--locations .c-hero__pin--4  { left: 55.85vw; top: 35.22vw; }   /* Deventer   · 52,25N 6,16E */
.c-hero--locations .c-hero__pin--5  { left: 50.87vw; top: 39.23vw; }   /* Breda      · 51,57N 4,78E */
.c-hero--locations .c-hero__pin--6  { left: 51.30vw; top: 34.51vw; }   /* Amsterdam  · 52,37N 4,90E */
.c-hero--locations .c-hero__pin--7  { left: 54.98vw; top: 31.02vw; }   /* Heerenveen · 52,96N 5,92E */
.c-hero--locations .c-hero__pin--8  { left: 59.28vw; top: 52.74vw; }   /* St. Ingbert · 49,28N 7,11E */
.c-hero--locations .c-hero__pin--9  { left: 55.88vw; top: 40.41vw; }   /* Venlo      · 51,37N 6,17E */

@media (max-width: 767px) {
  .c-hero--locations .c-hero__pin { display: none; }
}

/* ============================================================= Grants-Browser (21674:16794)
   Filterbare Programm-Uebersicht: Intro (4 Sp. linksbuendig) · Filter-Zeile · Karten/Listen ·
   „Mehr anzeigen". py 80, gap 64, Shadow/Above. EIN DOM fuer beide Ansichten: das Item traegt
   die c-card-Struktur; `--rows` ordnet per CSS auf Titel | Tags | Link um. */
.c-grants {
  /* 🔴 KONVENTION (verbindlich fuer JEDE Sektion in components.css): position: relative,
     IMMER, auch ohne eigenen Shadow/Float. Grund — CSS-Painting-Order, kein Stacking-Sonderfall:
     positionierte Elemente (position != static) werden als Gruppe NACH allen nicht-positionierten
     Flow-Geschwistern gemalt, unabhaengig von der DOM-Reihenfolge; INNERHALB jeder der beiden
     Gruppen gilt wieder DOM-Reihenfolge. Sobald in einer Sektionskette (Hero -> Grants -> Statement
     -> Programme -> ...) auch nur EIN Element positioniert ist und ein anderes nicht, kippt die
     Malreihenfolge zwischen den beiden Gruppen — mit sichtbaren Folgen ueberall dort, wo eine
     Sektion optisch ueber ihre eigene Box hinausragt (box-shadow-Bleed wie hier, oder Float-Bilder
     wie beim Hero „overview").
     Zweimal falsch herum gebaut, bevor die Regel klar war:
       1. Nur .c-grants bekam position:relative (wegen SEINES EIGENEN Schattens) -> Hero
          (position:relative, davor im DOM) rutschte dadurch in die „positionierte" Gruppe,
          waehrend .c-statement (kein Shadow, blieb static) in der „nicht positionierten" Gruppe
          war -> Statement malte VOR Hero, nicht danach -> Heros Float-Bilder ueberdeckten
          die Filterzeile.
       2. .c-grants ohne position (weil NUR das Statement-Problem im Blick war) loeste zwar DAS,
          riss aber die Kette zu Hero -> derselbe Fehler, nur an der anderen Naht.
     Deshalb: nicht pro Sektion einzeln je nach eigenem Shadow entscheiden, sondern ALLE
     Sektionen einheitlich positionieren, damit DOM-Reihenfolge = Mal-Reihenfolge bleibt,
     komplett unabhaengig davon, welche Sektion gerade einen Schatten/Float traegt. */
  position: relative;
  background: var(--wp--preset--color--bg-primary);
  padding-block: 5rem;                                        /* 80 */
  /* Shadow/Above (Figma -4 -4 32 spread0, wie bei Intro/Programme verifiziert). Blutet nach
     allen Seiten aus — nach oben sichtbar gegen den Hero, nach unten vom folgenden .c-statement
     verdeckt (dessen deckendes #fff, gapAfter=0 gemessen), weil beide jetzt in derselben
     Paint-Gruppe stehen. */
  box-shadow: -0.25rem -0.25rem 2rem 0 rgba(0,0,0,0.05);
}
.c-grants__inner { display: flex; flex-direction: column; gap: 4rem; }   /* 64 */
.c-grants__intro {
  /* 🔴 War faelschlich `5 / span 4` (mittig im Grid) — am Figma-Node nachgemessen: die Box sitzt
     bei x=64, exakt am Seitenrand, gleiche Kante wie die Filterzeile darunter. Kein Grid-Versatz,
     nur 4 Spalten breit, linksbuendig ab Spalte 1. Text selbst ist zusaetzlich links (nicht das
     eigentliche Problem — die BOX stand an der falschen Stelle). */
  grid-column: 1 / span 4;                                    /* 426,67 = 4 Sp., linksbuendig */
  font-family: var(--u-font-body); font-weight: 400;
  font-size: var(--u-fs-body-regular); line-height: 1.5rem; letter-spacing: -0.03rem;
  color: var(--wp--preset--color--text-secondary);
}

/* --- Filter-Zeile --- */
.c-grants__bar { display: flex; align-items: center; gap: 1rem; }
/* Bau-Auftrag 4: 5 statt 3 Filter passen nicht mehr sicher in eine Zeile. `.c-grants__filters`
   bricht selbst um (nicht `.c-grants__bar` — Reset-Button + Suche/Views bleiben angedockt).
   `flex: 1 1 auto; min-width: 0` macht den Umbruch erst wirksam: ohne das haelt ein Flex-Kind
   per Default seine Content-Breite (`min-width: auto`) und wuerde die Zeile sprengen statt zu
   schrumpfen/umzubrechen. Kein festes width/nowrap (css-grundregeln.md §3) — `gap` gilt fuer
   beide Achsen gleich, dadurch bleibt der Abstand in der zweiten Zeile identisch, „kein Sprung". */
.c-grants__filters {
  display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem;       /* 8 */
  flex: 1 1 auto; min-width: 0;
}
.c-grants__filterset { display: inline-flex; gap: 0.125rem; }             /* 2 */
.c-grants__filter { position: relative; }
.c-grants__filter > summary { list-style: none; }
.c-grants__filter > summary::-webkit-details-marker { display: none; }
/* Verlaesst sich normalerweise auf natives <details>-Verhalten (UA-Stylesheet:
   details:not([open]) > *:not(summary) { display: none }) — explizit hier nochmal gesetzt,
   selbes Absicherungs-Muster wie .c-grants__chip--clear[hidden] unten. Gefunden beim
   390px-Overflow-Test (Bau-Auftrag 4): ohne das kann sich kein Preview-/Test-Tool darauf
   verlassen, dass ein geschlossenes Panel wirklich unsichtbar ist. */
.c-grants__filter:not([open]) .c-grants__panel { display: none; }
.c-grants__chip {
  display: inline-flex; align-items: center; gap: 0.5rem;
  height: 2.25rem; padding: 0.75rem 0.875rem;                 /* 36 / 12 / 14 */
  border-radius: 0.25rem;
  background: var(--wp--preset--color--bg-tertiary);
  border: 0.0625rem solid rgba(226,232,240,0.4);
  font-family: var(--u-font-body); font-weight: 500;
  font-size: 0.75rem; line-height: 0.75rem; text-transform: uppercase;
  color: var(--wp--preset--color--text-primary);
  cursor: pointer; white-space: nowrap; text-decoration: none;
}
.c-grants__chip--active { background: var(--wp--preset--color--accent); border-color: rgba(30,6,61,0.05); }
.c-grants__chip--clear { padding: 0.625rem; aspect-ratio: 1; justify-content: center; }
/* 🔴 [hidden] wird von .c-grants__chip { display: inline-flex } ausgehebelt — vierter Fall
   dieser Familie im Projekt (nach .c-nav__panel / .c-stats__stat / .c-quote__item). Pflicht. */
.c-grants__chip--clear[hidden] { display: none; }
/* Node I21674:16801;13852:18648 „Icon-wrap": der Chevron liegt dort als 20er-Icon in einem 16er-
   Slot und ragt bewusst darueber hinaus — sichtbare Pfeilbreite 10px. Wir hatten ihn auf 16
   heruntergerechnet, wodurch nur 8px Pfeil blieben und rechts zu viel Luft stand (gemessen 19px
   statt 16,5px bis zur Chip-Kante, Backlog #23). `scale` stellt die Figma-Groesse her, ohne den
   16er-Layoutslot zu veraendern — ueber `width` wuerde der Chip breiter.
   `overflow: visible`, weil SVG per UA-Stylesheet sonst am eigenen Viewport clippt. */
.c-grants__chip-icon { width: 1rem; height: 1rem; flex: 0 0 auto; overflow: visible; transform: scale(1.25); }
.c-grants__panel {
  position: absolute; top: calc(100% + 0.25rem); left: 0; z-index: 30;
  min-width: 13rem; list-style: none; padding: 0.375rem; margin: 0;
  background: var(--wp--preset--color--bg-primary);
  border: 0.0625rem solid var(--wp--preset--color--border-tertiary);
  border-radius: 0.375rem; box-shadow: 0.5rem 0.5rem 1.5rem rgba(0,0,0,0.05);
}
.c-grants__panel a {
  display: block; padding: 0.5rem 0.625rem; border-radius: 0.25rem;
  font-family: var(--u-font-body); font-weight: 500; font-size: 0.875rem; line-height: 1.375rem;
  color: var(--wp--preset--color--text-primary); text-decoration: none;
}
.c-grants__panel a:hover { background: var(--wp--preset--color--bg-tertiary); }
.c-grants__panel a[aria-current] { background: rgba(10,235,191,0.12); }
.c-grants__reset { flex: 0 0 auto; }
/* 🔴 [hidden] wird von .c-btn { display: inline-flex } ausgehebelt — derselbe Fall wie
   .c-grants__chip--clear[hidden] oben (fuenfter Fall dieser Familie im Projekt). Ohne das zeigte
   „Filter zuruecksetzen" auch ohne aktiven Filter an, gefunden beim Reset-Klick-Test (Bau-Auftrag 4). */
.c-grants__reset[hidden] { display: none; }
.c-grants__tools { margin-left: auto; display: flex; align-items: center; gap: 0.5rem;
  width: calc(4 * var(--u-col) + 3 * var(--u-gutter)); }      /* 426,67 = 4 Spalten */
.c-grants__search {
  flex: 1 1 auto; min-width: 0; display: flex; align-items: center; gap: 0.75rem;
  height: 2.75rem; padding: 0.625rem 0.75rem;                 /* 44 / 10 / 12 */
  border-radius: 0.25rem;
  background: var(--wp--preset--color--bg-tertiary);
  border: 0.0625rem solid rgba(226,232,240,0.4);
}
.c-grants__search-icon { width: 1.25rem; height: 1.25rem; flex: 0 0 auto; color: var(--wp--preset--color--text-accent); }
.c-grants__search-input {
  flex: 1 1 auto; min-width: 0; border: none; background: none; padding: 0; outline: none;
  font-family: var(--u-font-body); font-weight: 500; font-size: 0.875rem; line-height: 1.375rem;
  color: var(--wp--preset--color--text-primary);
}
.c-grants__search-input::placeholder { color: var(--wp--preset--color--text-accent); opacity: 1; }
/* .c-grants__views/__view ersetzt durch die gemeinsame `.c-viewtoggle` (Backlog #22, unten). */

/* --- Karten-Ansicht: 3 Spalten, Karten 1:1 --- */
.c-grants__list {
  list-style: none; padding: 0; margin: 0;
  display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 1rem;
}
.c-grants__item { aspect-ratio: 1; }                          /* 426,67 x 426,67 */
.c-grants__item[hidden] { display: none; }                    /* display schlaegt [hidden] */
.c-grants__title { font-size: var(--u-fs-h3); line-height: 2.75rem; letter-spacing: -0.0675rem; }

/* --- Listen-Ansicht (Desktop-Frame 13852:22100): Zeile 80, Titel 3 Sp. | Tags | Link rechts.
   Zustand haengt am `data-view` der SEKTION (gehaertete Mechanik 2026-08-15, EIN Traeger statt
   Klassen an zwei Stellen) — die Mobile-Fassung nach Frame 14242:22475 steht am Dateiende. --- */
.c-grants[data-view="list"] .c-grants__list { display: flex; flex-direction: column; }
.c-grants[data-view="list"] .c-grants__item {
  aspect-ratio: auto; min-height: 5rem;                       /* 80 */
  flex-direction: row; align-items: center; gap: var(--u-gutter);
  /* Zeile exakt 80: Figma-Strokes sind inset. Echte Borders addierten 4px (Row 2 + Tag 2,
     gemessen 84) -> im Listen-Scope als inset-Shadow (Muster .c-rowlist__row). */
  border: none; box-shadow: inset 0 0 0 0.0625rem rgba(226,232,240,0.4);
}
.c-grants[data-view="list"] .c-tag { border: none; box-shadow: inset 0 0 0 0.0625rem rgba(30,6,61,0.1); }
.c-grants[data-view="list"] .c-grants__cardbody { display: contents; }   /* Container aufloesen -> Zeilen-Flex */
.c-grants[data-view="list"] .c-grants__tags { order: 2; flex: 1 1 auto; }
.c-grants[data-view="list"] .c-card__text { order: 1; flex: 0 0 auto; width: calc(3 * var(--u-col) + 2 * var(--u-gutter)); }
.c-grants[data-view="list"] .c-grants__title { font-size: var(--u-fs-h6); line-height: 1.75rem; letter-spacing: -0.0125rem; }
.c-grants[data-view="list"] .c-grants__body { display: none; }
.c-grants[data-view="list"] .c-grants__link { order: 3; flex: 0 0 auto; }

.c-grants__morewrap { display: flex; justify-content: center; }
.c-grants__empty {
  font-family: var(--u-font-body); font-size: var(--u-fs-body-regular); line-height: 1.5rem;
  color: var(--wp--preset--color--text-secondary);
}
.c-grants__empty a { color: var(--wp--preset--color--text-accent); }

@media (max-width: 767px) {
  .c-grants { padding-block: var(--u-s-96); }   /* 72 (Node 14124:50688), war 80 */
  .c-grants__bar { flex-wrap: wrap; }
  .c-grants__tools { width: 100%; margin-left: 0; }
  .c-grants__list { grid-template-columns: minmax(0, 1fr); }
  .c-grants__item { aspect-ratio: auto; }
  .c-grants__intro { grid-column: 1 / -1; }
  /* Mobile Listen-Fassung nach Frame 14242:22475: eigener Block am DATEIENDE (Reihenfolge-Regel
     auftrag-mobile-autonom §3.1 — Mobile-Regeln, die Komponenten-Werte schlagen, ans Ende). */
}

/* ============================================================= Highlights (21674:16838)
   Dunkle Bildkarte 1408, radius 16, p 56/48/48. Links Intro unten ausgerichtet
   (Headline 5 Sp. + Lead 4 Sp. + Button), rechts 2 transparente Karten (gap 4, je 274 hoch). */
.c-highlights { position: relative; background: var(--wp--preset--color--bg-primary); padding: 1rem; }
.c-highlights__card {
  position: relative; isolation: isolate; overflow: hidden;
  border-radius: 1rem;
  padding: 3.5rem 3rem 3rem;                                  /* 56 / 48 / 48 */
  display: flex; gap: var(--u-gutter); align-items: stretch;
}
.c-highlights__media { position: absolute; inset: 0; z-index: -1; background: var(--wp--preset--color--surface-darkgrey); }
.c-highlights__bg { width: 100%; height: 100%; object-fit: cover; display: block; }
.c-highlights__scrim { position: absolute; inset: 0; background: rgba(0,0,0,0.33); }
.c-highlights__tint {
  position: absolute; inset: 0; mix-blend-mode: multiply;
  background: linear-gradient(90deg, var(--wp--preset--color--surface-darkgrey) 0%, rgba(102,102,102,0) 100%);
}
.c-highlights__intro {
  flex: 1 1 0; min-width: 0;
  display: flex; flex-direction: column; justify-content: flex-end; align-items: flex-start;
  gap: 1.25rem;                                               /* 20 */
}
.c-highlights__headline {
  width: calc(5 * var(--u-col) + 4 * var(--u-gutter)); max-width: 100%;   /* 537,33 */
  font-family: var(--u-font-heading); font-weight: 500;
  font-size: var(--u-fs-h2); line-height: 3.5rem; letter-spacing: -0.0975rem;
  color: var(--wp--preset--color--text-alternate);
}
.c-highlights__lead {
  width: calc(4 * var(--u-col) + 3 * var(--u-gutter)); max-width: 100%;   /* 426,67 */
  font-family: var(--u-font-body); font-weight: 400;
  font-size: var(--u-fs-body-regular); line-height: 1.5rem; letter-spacing: -0.03rem;
  color: var(--wp--preset--color--text-alternate);
}
.c-highlights__cta { margin-top: 0.75rem; }
.c-highlights__cards {
  flex: 0 0 auto; width: calc(6 * var(--u-col) + 5 * var(--u-gutter));    /* 648 = 6 Spalten */
  display: flex; flex-direction: column; justify-content: center; gap: 0.25rem;   /* 4 */
}
/* Karten hier flacher (274 statt 393) — Scope-Override, die Card selbst bleibt unveraendert. */
.c-highlights__cards .c-card { min-height: 17.125rem; aspect-ratio: auto; }

/* Achse `cardsLayout=row` (Node 21681:15324, Approach-Seite): Karten NEBENEINANDER statt
   gestapelt, eigene Breite (7 statt 6 Spalten), eigene Kartenhöhe (417,333 statt 274). Gap 4px
   bleibt (Node: identisch in beiden Varianten). Intro verliert Lead/Button (PHP: !empty-Checks),
   CSS braucht dafür keine Änderung — .c-highlights__intro bleibt flex:1, füllt den Rest. */
.c-highlights--row .c-highlights__cards {
  width: calc(7 * var(--u-col) + 6 * var(--u-gutter));           /* 758,67 = 7 Spalten */
  flex-direction: row; align-items: center;
}
.c-highlights--row .c-highlights__cards .c-card { min-height: 0; height: 26.083rem; flex: 1 1 0; }  /* 417,333 */

@media (max-width: 767px) {
  /* Node 14134:52975: Sektion 8 + Panel 344x902 (HUG) — pad 56/16/16/16, gap 48, r16.
     Kopf: Headline 26/32 + Lead OS 500 16/24 (gap 20), Button ohne Margin-Zuschlag. */
  .c-highlights { padding: var(--u-gutter); }                             /* 8 */
  .c-highlights__card { flex-direction: column; padding: 3.5rem 1rem 1rem; gap: 3rem; }   /* 56/16/16 · 48 */
  .c-highlights--row .c-highlights__cards { flex-direction: column; height: auto; width: 100%; }
  .c-highlights--row .c-highlights__cards .c-card { height: auto; min-height: 0; }
  .c-highlights__headline, .c-highlights__lead { width: 100%; }
  .c-highlights__headline { font-size: 1.625rem; line-height: 2rem; letter-spacing: -0.0488rem; }  /* 26/32 */
  .c-highlights__lead { font-weight: 500; }                               /* Node: OS 500 16/24 */
  .c-highlights__cta { margin-top: 0; }                                   /* Kopf-Gap 20 traegt allein */
  .c-highlights__cards { width: 100%; }
}

/* ============================================================= Förderlebenszyklus
   Nodes 21405:3879 (Client) / 13867:19454 (Concept) — beide identisch im Raster.
   Volle Viewport-Breite, eigenes px-64 = --u-margin, KEIN 16px-Inset-Wrapper.

   UMBAU 2026-08-03 (User, Vorbild occhio-doro.com „section_anim"): die Zahlen scrollen normal mit,
   die Textliste daneben KLEBT und wechselt zwischen aktivem und passivem Zustand. Vorher stapelten
   sich Schichten aus Zahl + Text sticky übereinander.

   Raster 1:1 aus Figma:  Kopf 1–6 (648) · Zahlen 5–6 (205,33) · Füller 7 · Text 8–11 (426,67)
   Der Textspalten-Versatz von 442,67 ist exakt 4 Spalten + 4 Gutter — deshalb Startlinie 8. */
.c-cycle {
  position: relative;
  background: var(--wp--preset--color--bg-primary);
  border-radius: 1rem;                                        /* 16 */
  padding-inline: var(--u-margin);
  padding-block: 5rem;                                        /* 80 */
  display: grid; grid-template-columns: repeat(12, minmax(0, 1fr));
  column-gap: var(--u-gutter); row-gap: 6rem;                 /* 96 = Figma-Abstand Kopf → Schritte */
  align-items: start;
}
/* Kopf links, 5 Spalten, KLEBEND — er steht, waehrend rechts die Zahlen durchlaufen
   (User 2026-08-12, Vorlage Node 13867:21338).

   Das Raster folgt dem Node und nicht mehr der frueheren Aufteilung:
     Kopf      Spalten 1–5   (Node: Text 538 breit = 5 Spalten; vorher 6)
     Spalte 6  bleibt leer   (der 96er-Abstand aus dem Node ist genau eine Spalte)
     Zahlen    Spalten 7–8   (Node x=728 = Anfang Spalte 7, 205,3 = 2 Spalten; vorher 5–6)
     Text      Spalten 9–12  (Node x=949,3 = Anfang Spalte 9, 426,7 = 4 Spalten; vorher 8–11)
   Damit ruecken beide Spalten nach rechts, die frueher ungenutzte 12. Spalte am rechten Rand
   faellt weg, und zwischen Zahlen und Text steht nur noch der Gutter statt einer ganzen Spalte.

   🔴 Kopf und Scroll-Teil liegen jetzt in DERSELBEN Rasterzeile (vorher Zeile 1 und 2
   untereinander) — nur so hat der klebende Kopf ueberhaupt einen Weg: sein Bezugsrahmen ist
   seine Rasterzelle, und die ist erst dann so hoch wie die Zahlenspalte. */
.c-cycle__head {
  grid-column: 1 / span 5; grid-row: 1;
  display: flex; flex-direction: column; align-items: flex-start; gap: 2rem;   /* 32 */
  position: sticky; top: var(--sticky-top); align-self: start;
}

.c-cycle__eyebrow {
  font-family: var(--u-font-body); font-weight: 500;
  font-size: var(--u-fs-body-small); line-height: 1.375rem;
  color: var(--wp--preset--color--text-secondary);
}
.c-cycle__headline {
  font-family: var(--u-font-heading); font-weight: 500;
  font-size: var(--u-fs-h2); line-height: 3.5rem; letter-spacing: -0.0975rem;   /* 52/56/-1,56 */
  color: var(--wp--preset--color--text-primary);
}
.c-cycle__headline em { font-style: normal; color: var(--wp--preset--color--text-tertiary); }

/* ---- Zahlenspalte: scrollt normal mit ---- */
.c-cycle__numbers {
  grid-column: 7 / span 2; grid-row: 1; display: flex; flex-direction: column;
  gap: 11rem;                                                 /* 176 (Node) */
  padding-top: 0.5rem;                                        /* 8 (Node) */
  /* Nachlauf unter der letzten Zahl. Nicht Kosmetik: die Zahlenspalte ist der Containing Block der
     klebenden Liste, und ein Sticky-Element löst sich, sobald dessen Unterkante erreicht ist. Ohne
     Nachlauf wäre die Liste schon weggescrollt, während Zahl 06 noch in die Lesezone läuft —
     Bedarf hergeleitet: die Liste bleibt gepinnt, solange die Unterkante dieser Spalte mindestens
     `50vh + halbe Listenhöhe` unter dem Viewport-Anfang liegt. Wenn Zahl 06 in der Lesezone (35vh)
     steht, sind das rund `15vh + halbe Listenhöhe − 96`. Der rem-Anteil deckt die Listenhöhe (die
     ist NICHT viewport-relativ), der vh-Anteil die Lesezone. */
  padding-bottom: calc(20vh + 12rem);
}
.c-cycle__number {
  font-family: var(--u-font-heading); font-weight: 300;
  font-size: 6rem; line-height: 6rem; letter-spacing: -0.18rem;   /* 96/96/-2,88 */
  color: var(--wp--preset--color--text-tertiary);
  transition: color var(--u-dur-fast) var(--u-ease), opacity var(--u-dur-fast) var(--u-ease);
}

/* ---- Textliste: bleibt stehen, MITTIG im Bild (User 2026-08-03) ----
   🔴 Die LISTE selbst klebt, nicht eine viewporthohe Hülle um sie herum. Der Unterschied ist nicht
   kosmetisch, sondern bestimmt, WIE LANGE sie stehen bleibt: ein Sticky-Element bleibt so lange
   gepinnt wie `Höhe des Containing Block − eigene Höhe`. Mit einer 100vh-Hülle waren das bei einer
   1464 hohen Zahlenspalte nur 564px — die Liste löste sich, während die letzten Zahlen noch liefen.
   Mit der Liste selbst (632) sind es 832px. Genauso macht es die Referenz (occhio-doro): dort ist
   `.number_list` das Sticky-Element, nicht ein Wrapper.

   🔴 Zentriert über den STICKY-PUNKT (`50vh − halbe Listenhöhe`), NICHT über `top: 50vh` +
   `translateY(-50%)`. Optisch dasselbe, für die Sticky-Rechnung ein grosser Unterschied: ein
   Transform verschiebt nur die Darstellung, die Layout-Box läge weiterhin komplett UNTERHALB der
   Viewportmitte. Das Element bräuchte dann `50vh + ganze Listenhöhe` Platz unter sich statt
   `50vh + halbe` — nachgemessen löste es sich dadurch 61px zu früh, und mehr Nachlauf half nicht,
   weil der Nachlauf gar nicht die Ursache war.
   Die halbe Höhe kann CSS nicht kennen, sie kommt als `--cycle-half` vom Script. Der Fallback
   trägt den Fall ohne JS — dort stehen ohnehin alle Beschreibungen offen. */
/* `align-self: stretch` ist PFLICHT: die Sektion setzt `align-items: start`, der Wrapper würde
   sonst auf die Listenhöhe schrumpfen — und ein Sticky-Element in einem gleich hohen Containing
   Block hat null Weg, klebt also überhaupt nicht. Er muss die Höhe der Zahlenspalte annehmen. */
/* „01" und „Idee" sollen oben bündig stehen (User). Die 14 sind nachgemessen, nicht geschätzt:
   8 davon sind der Node-Innenabstand der Zahlenspalte, die restlichen 6,1 der Unterschied der
   Versalhöhen-Offsets — in einer 96/96-Zeile beginnt die Tinte 12,46 unter der Boxkante, in einer
   24/30-Zeile schon nach 6,36. Ohne Ausgleich stünde der Titel 14,1 zu hoch.
   ⚠️ Der Wert hängt an den beiden Schriftgrößen; ändert sich eine, neu messen. */
.c-cycle__list-wrap {
  grid-column: 9 / span 4; grid-row: 1; align-self: stretch;
  padding-top: 0.875rem;                                      /* 14 */
}
.c-cycle__list {
  list-style: none; padding: 0;
  position: sticky; top: calc(50vh - var(--cycle-half, 14rem));
  display: flex; flex-direction: column; gap: 2rem;           /* 32 */
}
/* Zum Abstand 32: der Node führt zwischen den Textblöcken 64 — dort steht die Spalte aber im
   SCROLL, jeder Block neben seiner Zahl, und nie mehr als zwei gleichzeitig im Bild. Hier stehen
   alle sechs gleichzeitig in einer klebenden Liste. Mit 64 wird sie 632 hoch und füllt 70% eines
   900er Viewports — dann bleibt so wenig Spielraum, dass sie sich löst, während die letzten Zahlen
   noch laufen (nachgemessen: Zahl 6 lag 311px daneben). Mit 32 sind es 422, und die Liste bleibt
   über alle sechs Zahlen mittig stehen. Typografie und Innenabstand (10) sind unverändert Node. */
.c-cycle__item { display: flex; flex-direction: column; gap: 0.625rem; }   /* 10 (Node) */
/* Titel 24/30/-0,24 und Text 16/24/-0,48 stehen so im Node — KEINE Trennlinie und keine Nummer,
   die Textspalte fuehrt dort nur Titel + Beschreibung. */
.c-cycle__item-title {
  display: block; width: 100%; padding: 0; border: 0;
  background: none; text-align: left; cursor: pointer;
  font-family: var(--u-font-heading); font-weight: 500;
  font-size: var(--u-fs-h5); line-height: 1.875rem; letter-spacing: -0.015rem;   /* 24/30/-0,24 */
  color: var(--wp--preset--color--text-primary);
  transition: opacity var(--u-dur-fast) var(--u-ease), color var(--u-dur-fast) var(--u-ease);
}
.c-cycle__item-body {
  font-family: var(--u-font-body); font-weight: 400;
  font-size: var(--u-fs-body-regular); line-height: 1.5rem; letter-spacing: -0.03rem;
  color: var(--wp--preset--color--text-secondary);
}

/* ---- Aktiv/Passiv — greift ERST, wenn das Script `--anim` gesetzt hat.
   Ohne JS bleibt die Sektion damit vollständig lesbar: alle Titel, alle Beschreibungen,
   nichts gedimmt, nichts eingeklappt (derselbe Vertrag wie beim Vorgänger-Bau). ---- */
.c-cycle--anim .c-cycle__number { opacity: 0.25; }
.c-cycle--anim .c-cycle__number.is-active { opacity: 1; color: var(--wp--preset--color--text-primary); }
.c-cycle--anim .c-cycle__item-title { opacity: 0.25; }
.c-cycle--anim .c-cycle__item.is-active .c-cycle__item-title { opacity: 1; }
/* Aufklappen über die Zeilengröße statt über max-height: `0fr → 1fr` animiert sauber auf die
   echte Inhaltshöhe, ohne dass irgendwo ein Pixelwert geraten werden muss. */
.c-cycle--anim .c-cycle__item-panel {
  display: grid; grid-template-rows: 0fr; overflow: hidden;
  transition: grid-template-rows var(--u-dur-base) var(--u-ease);
}
.c-cycle--anim .c-cycle__item.is-active .c-cycle__item-panel { grid-template-rows: 1fr; }
.c-cycle--anim .c-cycle__item-panel > * { min-height: 0; }

/* Messhilfe: das Script klappt zum Ermitteln der größtmöglichen Listenhöhe kurz alle
   Beschreibungen zu und wieder auf. Das läuft synchron in einem Rutsch, es wird also nichts davon
   gezeichnet — ohne diese Regel liefen aber die Transitions an und man würde Zwischenstände messen. */
.c-cycle--measuring, .c-cycle--measuring * { transition: none !important; }

@media (prefers-reduced-motion: reduce) {
  .c-cycle--anim .c-cycle__item-panel { transition: none; }
  .c-cycle__number, .c-cycle__item-title { transition: none; }
}

@media (max-width: 767px) {
  /* Nebeneinander geht hier nicht mehr auf — Zahl über den Text, Liste im normalen Fluss.
     Damit verschwindet auch der 98px-Overflow, den der Audit bei 992 gefunden hat. */
  .c-cycle { padding-block: 3rem; row-gap: 2.5rem; grid-template-columns: minmax(0, 1fr); }
  /* Kein Kleben auf Mobile: einspaltig gaebe es nichts, woran der Kopf entlanglaufen koennte —
     er stuende ueber seinen eigenen Schritten fest. Dieselbe Abschaltung wie bei `.c-funding__col`
     und `.c-related__head`. (ADR 0010 §3: der Foerderzyklus wird mobil zur Timeline.) */
  .c-cycle__head { grid-column: 1 / -1; grid-row: auto; position: static; }
  .c-cycle__numbers { grid-row: auto; }
  .c-cycle__list-wrap { grid-row: auto; }
  .c-cycle__headline { font-size: var(--u-fs-h3); line-height: 2.75rem; }
  /* Die grosse Zahlenspalte entfaellt — nebeneinander geht hier nicht auf. Damit die Schritte
     trotzdem nummeriert bleiben, uebernimmt ein CSS-Zaehler die Nummer vor dem Titel. */
  .c-cycle__numbers { display: none; }
  .c-cycle__list-wrap { grid-column: 1 / -1; }
  .c-cycle__list { position: static; transform: none; counter-reset: cycle; gap: 2rem; }
  .c-cycle__item { counter-increment: cycle; }
  .c-cycle__item-title::before {
    content: counter(cycle, decimal-leading-zero) '  ';
    font-weight: 300; color: var(--wp--preset--color--text-tertiary);
  }
  /* 🔴 Aktiv/Passiv wird hier ABGESCHALTET. Der aktive Schritt haengt an der Position der Zahlen —
     die sind auf Touch aber `display: none` und haben damit gar keine Box mehr. Der Observer
     koennte nie sinnvoll schalten, fuenf von sechs Beschreibungen blieben dauerhaft zugeklappt.
     Ohne klebende Liste gibt es hier ohnehin nichts zu fokussieren: alle Schritte offen, keiner
     gedimmt — derselbe Zustand wie ohne JS. */
  .c-cycle--anim .c-cycle__item-title { opacity: 1; cursor: default; }
  .c-cycle--anim .c-cycle__item-panel { grid-template-rows: 1fr; }
}
/* ============================================================= Engagement-Modelle (Node 21681:15249,
   Approach-Seite „So arbeiten wir mit Ihnen zusammen", Client-File). 16px-Inset-Panel wie
   Methodik/Stats-Slider: äusserer Wrapper padding 16, innerer Container bg-tertiary radius 16 py 80. */
.c-models { padding-inline: 1rem; }                            /* 16 */
.c-models__panel {
  background: var(--wp--preset--color--bg-tertiary);
  border-radius: 1rem;                                          /* 16 */
  padding-block: 5rem;                                          /* 80 */
  display: flex; flex-direction: column; gap: 4rem;              /* 64 */
}
.c-models__head {
  padding-inline: 3rem;                                         /* 48 */
  display: flex; align-items: flex-end; justify-content: space-between; gap: var(--u-gutter);
}
.c-models__headline {
  font-family: var(--u-font-heading); font-weight: 500;
  font-size: var(--u-fs-h2); line-height: 3.5rem; letter-spacing: -0.0975rem;   /* 52/56 */
  color: var(--wp--preset--color--text-primary);
  width: calc(7 * var(--u-col) + 6 * var(--u-gutter));           /* 758,67 = 7 Spalten */
  max-width: 100%;
}
.c-models__headline em { font-style: normal; color: var(--wp--preset--color--text-tertiary); }

.c-models__list { list-style: none; padding: 0; border-top: 0.0625rem solid var(--wp--preset--color--border-tertiary); }
.c-models__row {
  min-height: 6.625rem;                                         /* 106, wie .c-rowlist__link */
  padding-inline: 4rem;                                         /* 64 */
  display: flex; align-items: center; justify-content: space-between; gap: var(--u-gutter);
  border-bottom: 0.0625rem solid var(--wp--preset--color--border-tertiary);
}
.c-models__title {
  font-family: var(--u-font-heading); font-weight: 500;
  font-size: var(--u-fs-h6); line-height: 1.75rem; letter-spacing: -0.0125rem;  /* 20/28 */
  color: var(--wp--preset--color--text-primary);
  width: calc(6 * var(--u-col) + 5 * var(--u-gutter));           /* 648 = 6 Spalten */
}
.c-models__tags {
  display: flex; align-items: center; justify-content: flex-end; gap: 0.5rem;   /* 8 */
  width: calc(5 * var(--u-col) + 4 * var(--u-gutter));           /* 537,33 = 5 Spalten */
}

@media (max-width: 767px) {
  .c-models__head { flex-direction: column; align-items: flex-start; gap: 1.5rem; padding-inline: 1.5rem; }
  .c-models__headline { width: 100%; font-size: var(--u-fs-h3); line-height: 2.75rem; }
  .c-models__row { flex-direction: column; align-items: flex-start; gap: 0.75rem; padding: 1.25rem 1.5rem; min-height: 0; }
  .c-models__title, .c-models__tags { width: 100%; }
  .c-models__tags { justify-content: flex-start; }
}

/* ============================================================= Location-Card (Bau-Auftrag 6,
   Node 21724:17226ff, „Location Item"). Jede Karte traegt ihre EIGENE Top-Border (auch die erste —
   im Node trennt sie die Filterzeile darueber, 64px Gap davor, kein Sonderfall fuer :first-child). */
.c-location-card {
  display: flex; align-items: flex-start; justify-content: space-between; width: 100%;
  padding-top: 1.25rem;                                         /* 20 */
  border-top: 0.0625rem solid var(--wp--preset--color--border-tertiary);
}
.c-location-card__col { display: flex; flex-direction: column; gap: 2rem; flex: 1 1 0; min-width: 0; }   /* 32 */
.c-location-card__city {
  font-family: var(--u-font-heading); font-weight: 500;
  font-size: var(--u-fs-h3); line-height: 2.75rem; letter-spacing: -0.0675rem;   /* 36/44 */
  color: var(--wp--preset--color--text-primary);
}
.c-location-card__row { display: flex; gap: var(--u-gutter); align-items: flex-start; }
.c-location-card__group {
  display: flex; flex-direction: column; gap: 1.25rem; align-items: flex-start;   /* 20 */
  width: calc(3 * var(--u-col) + 2 * var(--u-gutter));                           /* 316 = 3 Spalten */
}
.c-location-card__label {
  font-family: var(--u-font-body); font-weight: 500;
  font-size: 0.875rem; line-height: 1.375rem;                   /* 14/22 */
  color: var(--wp--preset--color--text-primary);
}
.c-location-card__addr-wrap { display: flex; flex-direction: column; gap: 0.75rem; align-items: flex-start; }   /* 12 */
.c-location-card__address, .c-location-card__hours {
  font-family: var(--u-font-body); font-weight: 400;
  font-size: 1rem; line-height: 1.5rem; letter-spacing: -0.03rem;   /* 16/24 */
  color: var(--wp--preset--color--text-secondary);
}
.c-location-card__image {
  flex: 0 0 auto; width: calc(4 * var(--u-col) + 3 * var(--u-gutter));   /* 426,67 = 4 Spalten */
  height: 17.7775rem;                                            /* 284,44 */
  border-radius: 0.375rem; overflow: hidden;
}
.c-location-card__image img { width: 100%; height: 100%; object-fit: cover; display: block; }

@media (max-width: 767px) {
  /* align-items: stretch (statt des Desktop-Werts flex-start) — sonst bleibt jede Ebene
     (__col, __row, __group) auf ihre Inhaltsbreite geschrumpft und `width:100%` weiter unten
     greift ins Leere, weil nirgends in der Kette eine definite Breite ankommt. */
  .c-location-card { flex-direction: column; align-items: stretch; gap: 1.25rem; }
  .c-location-card__row { flex-direction: column; align-items: stretch; gap: 1.25rem; }
  .c-location-card__group { width: 100%; }
  .c-location-card__image { width: 100%; height: auto; aspect-ratio: 426.67 / 284.44; }
}

/* Der Mint-Puls nach dem Sprung von einem Karten-Pin (.c-location-card--flash + Keyframe
   ignite-location-flash) ist mit Backlog #23 entfallen — er war als Provisorium gedacht und
   nicht im Design vorgesehen. Die Sprungmarke bleibt: das JS scrollt weiterhin zur Karte. */

/* ============================================================= Location-Browser (Bau-Auftrag 6,
   Node 21724:17193/17219, "Location List"). Panel: weiss, radius 8, Mint-Glow-Schatten (verifiziert:
   0 0 33 -8.333 rgba(10,235,191,.15) — abweichend von der sonst ueblichen Slate-Schatten-Familie,
   eigens am Node gemessen). NUR EIN Filter (Land) → Pills statt Grants' <details>-Dropdowns
   (Node 21724:17222, FilterRadioButtonType — kein Dropdown im echten Design, s. index.php-Kommentar). */
/* position:relative — Standard-Regel jeder Top-Level-Sektion (Paint-Order, s. .c-grants-Kommentar
   weiter oben, docs/component-architecture.md). */
/* padding-inline 16 statt .u-container-Wrapper: der Node zeigt fuer diese Sektion einen fluid, kaum
   eingerueckten Rand (px-16 am Root), NICHT den 64px-.u-container-Rand — exakt das Muster von
   .c-projectlist (dieselbe "randnahe, volle Panel-Breite"-Bauweise, dort ebenfalls padding-inline:1rem
   statt .u-container). Der Panel-Innenabstand (48/64, s. unten) ist eigenstaendig, kein Grid-Bezug. */
/* 🔴 KORREKTUR (User): das Panel ist NICHT randlos-vollbreit — es sitzt eingerueckt auf dem
   fortgesetzten Hero-Verlauf, sodass links/rechts (und im 36er-Streifen darueber) der dunkle
   Slate-Grund des Heros durchscheint und nach unten zu Weiss auslaeuft. Im Figma ist Hero + Liste
   EINE Sektion mit durchgehendem Verlauf (from #475569 33% -> white 93% ueber die volle Seitenhoehe);
   der Hero-Block darueber traegt denselben Slate-Grund, hier setzt der Verlauf nahtlos fort. Der
   16px-Inline-Rand + der Streifen oben zeigen den Verlauf; das weisse Panel deckt die Mitte. */
.c-locations {
  position: relative;
  padding: 2.25rem 1rem 0;   /* 36 oben (Slate-Streifen wie Node y860->896) · 16 seitlich */
  background: linear-gradient(to bottom,
    var(--wp--preset--color--surface-darkgrey) 0%,
    var(--wp--preset--color--surface-darkgrey) 12%,
    var(--wp--preset--color--bg-primary) 90%);
}
.c-locations__panel {
  background: var(--wp--preset--color--bg-primary);
  border-radius: 0.5rem;                                          /* 8 */
  box-shadow: 0 0 2.0625rem -0.52081rem rgba(10,235,191,0.15);     /* 33 / -8.333 */
  padding: 4rem 3rem;                                              /* 64 / 48 */
  display: flex; flex-direction: column; gap: 4rem;                /* 64 */
}
.c-locations__bar { display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem; }   /* 8 */
.c-locations__pill {
  display: inline-flex; align-items: center; gap: 0.5rem;          /* 8 */
  height: 2.5rem; padding: 0.75rem 0.875rem;                       /* 40 / 12 / 14 */
  border-radius: 0.25rem; background: var(--wp--preset--color--bg-tertiary);
  border: 0.0625rem solid rgba(226,232,240,0.4);
  text-decoration: none; cursor: pointer;
}
.c-locations__pill--active {
  background: var(--wp--preset--color--accent); border-color: rgba(30,6,61,0.05); justify-content: center;
}
.c-locations__pill-label {
  font-family: var(--u-font-body); font-weight: 500;
  font-size: 0.75rem; line-height: 0.75rem; text-transform: uppercase;
  color: var(--wp--preset--color--text-primary);
}
.c-locations__pill-count {
  font-family: var(--u-font-body); font-weight: 500; opacity: 0.6;
  font-size: 0.875rem; line-height: 1.375rem; color: var(--wp--preset--color--text-primary);
}
/* Backlog #23: das X sitzt als EIGENER Kasten NEBEN dem Pill (Node I21724:17223;13893:21160:
   40x40, radius 4, Abstand 2). Es ist zugleich der Reset — das Figma-Board zeigt in der
   Locations-Leiste keinen zusaetzlichen Text-Link „Filter zuruecksetzen".
   Sichtbarkeit rein ueber den Geschwister-Selektor: das JS schaltet beim Filtern ohne Reload nur
   `--active` am Pill um, das X folgt dadurch ohne eigene JS-Zeile.
   `display: none` steht am Grundzustand, nicht per [hidden] — [hidden] wuerde von einem
   display-Wert geschlagen (die im Projekt bekannte Falle). */
.c-locations__filterset { display: inline-flex; align-items: center; gap: 0.125rem; }   /* 2 */
.c-locations__clear {
  display: none; align-items: center; justify-content: center; flex: 0 0 auto;
  width: 2.5rem; height: 2.5rem; padding: 0.625rem;                 /* 40 / 10 */
  border-radius: 0.25rem;                                           /* 4 */
  background: var(--wp--preset--color--accent);
  border: 0.0625rem solid rgba(30,6,61,0.05);
  color: var(--wp--preset--color--text-primary); cursor: pointer;
}
.c-locations__pill--active + .c-locations__clear { display: inline-flex; }
.c-locations__clear-icon { width: 1.25rem; height: 1.25rem; }       /* 20 */

/* gap 64 zwischen den Karten (Node: Location List ist `flex-col gap-64`) — der Trenner (border-top)
   sitzt am Karten-Kopf, dadurch steht unter jedem Bild ein 64er-Abstand bis zum naechsten Trenner
   (User: „Bilder oben platziert, Abstand nach unten"). Das gap wirkt trotz `.c-locations__item`-
   Wrapper (display:contents): Flex-Gap greift zwischen den effektiven Flex-Items (den Karten). */
.c-locations__list { display: flex; flex-direction: column; gap: 4rem; width: 100%; }   /* 64 */
/* Wrapper fuer client-seitiges Filtern (data-country + hidden-Toggle) — verschwindet aus dem
   Box-Tree, die Karte bleibt direktes Flex-Kind von .c-locations__list, Layout unveraendert.
   `display:contents` (Autoren-Regel) wuerde sonst das UA-Default `[hidden]{display:none}`
   ueberstimmen (Autoren- schlaegt User-Agent-Stylesheet unabhaengig von der Spezifitaet) —
   deshalb hier explizit erzwungen. */
.c-locations__item { display: contents; }
.c-locations__item[hidden] { display: none; }
.c-locations__empty {
  font-family: var(--u-font-body); font-size: var(--u-fs-body-regular); line-height: 1.5rem;
  color: var(--wp--preset--color--text-secondary);
}
.c-locations__empty a { color: var(--wp--preset--color--text-accent); }

@media (max-width: 767px) {
  /* Frame 14263:28390: Sektion seitlich 8, Liste pad 16 -> Karten 312; Karten-Gap 48,
     Karte: pad-top 20, Bild 312x208, gap 20 (Item 528). */
  .c-locations { padding-inline: 0.5rem; }
  .c-locations__panel { padding: 2rem 1rem; gap: 2.5rem; }
  .c-locations__list { gap: 3rem; }
}

/* ============================================================= Page-Header, schlicht (Node 21724:17266,
   Glossar-Archiv, Client-File). Weisser Grund, KEIN Bild — grundlegend anderer Typ als `.c-hero`
   (Bild-Bühne mit Scrim/Tint). Nur Breadcrumbs + H1 + optionaler Lead. */
.c-page-header { background: var(--wp--preset--color--bg-primary); padding-block: 11rem 6rem; }  /* pt176/pb96 */
/* Abstand Breadcrumbs → H1 über `gap` am Container, nicht über `margin-bottom` an den Krumen:
   der globale Margin-Reset gilt „ohne Ausnahmen", Abstände kommen aus `gap`. Der Wert ist 24 —
   nachgemessen an beiden Hero-Nodes (Krumen-Grundlinie 194, H1-Oberkante 225,6); vorher 32. */
/* KEIN `align-items: flex-start` — der Text-Block ist im Split-Layout ein Raster über die volle
   Breite und würde sonst auf seine Inhaltsbreite schrumpfen. */
.c-page-header > .u-container { display: flex; flex-direction: column; gap: 1.5rem; }
.c-page-header__text { display: flex; flex-direction: column; align-items: flex-start; gap: 1.25rem; }  /* 20 */
.c-page-header__headline {
  font-family: var(--u-font-heading); font-weight: 500;
  font-size: 4rem; line-height: 4rem; letter-spacing: -0.12rem;
  color: var(--wp--preset--color--text-primary);
}
/* Der graue Teil beginnt IMMER eine neue Zeile — so zeigen es alle drei Hero-Nodes
   (21745:20980 „Aktuelles / von Ignite.", 21743:19922, 13918:35662 „Lernen Sie von /
   unseren Experten"). Das ist KEIN Umbruch über die Boxbreite und auch kein `<br>`, sondern
   Struktur: es gibt keine Breite, die alle drei richtig umbricht — „Aktuelles von Ignite."
   bräuchte unter 390, „Lernen Sie von unseren Experten" mindestens 510. Die zwei Farbteile
   sind zwei Zeilen, nicht ein umbrechender Satz. */
.c-page-header__headline em { display: block; }
/* Wie `.c-hero--card .c-hero__headline` (Dateiende): das globale `hyphens: auto` der Headings
   trennt auch zum Zeilenfuellen, nicht nur bei Platznot — am FAQ-Kopf zog es mobil „häufi-"
   in Zeile 1 hoch. Der Node (14408:27640) bricht OHNE Trennstrich vor „häufige"; `manual`
   reproduziert die Node-Zeilen (Gegenprobe figma-to-css §3a). */
.c-page-header__headline { hyphens: manual; }
.c-page-header__lead {
  width: calc(5 * var(--u-col) + 4 * var(--u-gutter));           /* 537,33 = 5 Spalten */
  max-width: 100%;
  font-family: var(--u-font-body); font-weight: 400;
  font-size: var(--u-fs-body-medium); line-height: 1.625rem; letter-spacing: -0.03375rem;   /* 18/26 */
  color: var(--wp--preset--color--text-secondary);
}
@media (max-width: 767px) {
  /* pt 176 / pb 48 · Krumen→H1 16 — Nodes 14408:27628 (FAQ) UND 14275:32228 (Glossar),
     beide identisch pad 176/24/48/24 + gap 16 (Auftrag 2026-08-15-faq-mobile). Vorher standen
     hier 136/64 + 24 OHNE Node-Quelle; die Differenz war im Mobile-Protokoll der News/Blog-
     Uebersichten schon sichtbar („Kopf Soll 330 / Ist 314") und dort als inhaltlich verbucht. */
  .c-page-header { padding-block: 11rem 3rem; }
  .c-page-header > .u-container { gap: 1rem; }
  /* 32/32 wie bei jedem anderen Kopf — nachgemessen an vier Mobile-Frames (Industries Ov, Needs
     Ov, Leadership, Glossar), alle identisch. Der Glossar-Kopf ist ein `.c-page-header`. */
  .c-page-header__headline { font-size: 2rem; line-height: 2rem; letter-spacing: -0.03em; }
  .c-page-header__lead { width: 100%; }
}

/* ============================================================= Glossar-Archiv (Node 21724:17279,
   Client-File, Bau-Auftrag 7). Suche + A-Z-Filter serverseitig (?q=/?letter=), kein JS. */
.c-glossary { background: var(--wp--preset--color--bg-primary); padding-block: 5rem;   /* 80 */
  /* Hoehe der Desktop-Controls (Suche 44 + Gap 40 + 2 A-Z-Reihen 96 = 180) — GEMESSEN, headless
     @1440. Fuer den Marker-Anschlag unterhalb der sticky Controls gebraucht (CSS kann keine
     Geschwister messen); die A-Z-Zeilen wrappen nicht (flex:1-Zellen schrumpfen), der Wert ist
     damit ueber alle Desktop-Breiten stabil. */
  --glossary-controls-h: 11.25rem;
}
/* Sticky (Figma-Kommentar Melanie 10.08., 1878519250): A-Z + Suche bleiben beim Scrollen
   sichtbar. Anschlag = --sticky-top (aus den Nav-Tokens abgeleitet, nie als Zahl). Deckender
   Grund in Token-Farbe, sonst scheint die Begriffsliste beim Kleben durch; z-index ueber dem
   spaeter im DOM stehenden, ebenfalls positionierten Marker (sticky). */
.c-glossary__controls {
  display: flex; flex-direction: column; gap: 2.5rem; margin-bottom: 6rem;  /* 40 / 96 */
  position: sticky; top: var(--sticky-top); z-index: 2;
  background: var(--wp--preset--color--bg-primary);
}

/* Suchfeld — Node: bg #f1f5f9, Border rgba(226,232,240,.4), Text/Placeholder in text-accent (#753bbd,
   Node-Farbe „icon-quinary" — 1:1 übernommen, kein Rundungsfehler). */
.c-glossary__search {
  display: flex; align-items: center; gap: 0.75rem;                /* 12 */
  height: 2.75rem; padding-inline: 0.75rem;                         /* 44 / 12 */
  background: var(--wp--preset--color--bg-tertiary);
  border: 0.0625rem solid rgba(226,232,240,0.4); border-radius: 0.25rem;   /* 4 */
}
.c-glossary__search-icon { flex: 0 0 auto; width: 1.25rem; height: 1.25rem; color: var(--wp--preset--color--text-accent); }
.c-glossary__search-input {
  flex: 1 1 0; min-width: 0; background: none; border: none; outline: none;
  font-family: var(--u-font-body); font-weight: 500;
  font-size: var(--u-fs-body-small); line-height: 1.375rem;
  color: var(--wp--preset--color--text-accent);
}
.c-glossary__search-input::placeholder { color: var(--wp--preset--color--text-accent); opacity: 1; }

/* A-Z: 2 Reihen à 13 gleich breite Zellen (flex:1), Kreis 40x40 zentriert. */
.c-glossary__alphabet { display: flex; flex-direction: column; gap: 1rem; }   /* 16 */
.c-glossary__alphabet-row { display: flex; gap: 1.25rem; }                    /* 20 */
/* ZWEI Ebenen (Node-Struktur, verifiziert per G2): .c-glossary__letter ist die flex:1-ZELLE
   (gleich breite Spalten, grosses Tap-Target), .c-glossary__letter-dot ist der FESTE 40x40-Kreis
   darin. `flex:1` + eine feste `width` auf DEMSELBEN Element widersprechen sich — flex-grow
   ignoriert die width und zieht die „Kreise" zu 82x40-Pillen (gemessen, kein Kreis mehr). */
.c-glossary__letter {
  flex: 1 1 0; display: flex; align-items: center; justify-content: center;
  text-decoration: none; cursor: pointer;
}
.c-glossary__letter-dot {
  display: flex; align-items: center; justify-content: center;
  width: 2.5rem; height: 2.5rem; border-radius: 16rem;   /* 256, rund */
  font-family: var(--u-font-heading); font-weight: 500;
  font-size: var(--u-fs-h6); line-height: 1.75rem; letter-spacing: -0.0125rem;   /* 20/28 */
  color: var(--wp--preset--color--text-primary);
  border: 0.0625rem solid transparent;
}
a.c-glossary__letter:not(.c-glossary__letter--disabled):hover .c-glossary__letter-dot { border-color: var(--wp--preset--color--border-tertiary); }
.c-glossary__letter--active .c-glossary__letter-dot {
  background: var(--wp--preset--color--accent); border-color: var(--wp--preset--color--accent);
}
/* Strukturell (nie belegter Anfangsbuchstabe) gedimmt, aber bewusst weiter ein klickbarer <a> —
   client-seitig gibt es keine Elementtyp-Umschaltung (Link vs. Span) mehr, ein Klick landet
   höchstens im „keine Treffer"-Zustand. */
.c-glossary__letter--disabled { text-decoration: line-through; opacity: 0.2; }

.c-glossary__empty { font-family: var(--u-font-body); color: var(--wp--preset--color--text-secondary); }

/* Output: Buchstaben-Marker (sticky, 4 Sp.) + Akkordion-Liste (flex:1) — Marker ist IMMER im DOM
   (JS blendet ihn per hidden-Attribut ein/aus, kein Reload); ohne aktiven Buchstaben füllt die
   Liste automatisch die volle Breite (hidden entfernt den Marker aus dem Flex-Fluss). */
.c-glossary__output { display: flex; gap: var(--u-gutter); align-items: flex-start; }
.c-glossary__marker {
  flex: 0 0 auto; width: calc(4 * var(--u-col) + 3 * var(--u-gutter));   /* 426,67 = 4 Spalten */
  /* Anschlag UNTER den sticky Controls (vorher: nav-h + 1.25rem — der Marker verschwand sonst
     hinter deren deckendem Grund). Die 0.25rem sind die alte Extra-Luft: nav-h + 1.25rem war
     (Sticky-Stopp + 0.25rem), das Verhaeltnis bleibt erhalten. */
  position: sticky; top: calc(var(--sticky-top) + var(--glossary-controls-h) + 0.25rem);
}
.c-glossary__marker-text {
  font-family: var(--u-font-heading); font-weight: 400;
  font-size: 6rem; line-height: 6rem; letter-spacing: -0.18rem;   /* 96/96, -3% */
  color: var(--wp--preset--color--text-tertiary);
}
.c-accordion--glossary { flex: 1 1 0; min-width: 0; background: none; border: none; border-radius: 0; padding: 0; }
.c-accordion--glossary .c-accordion__item { padding: 1.25rem 0; }   /* 20 */
.c-accordion--glossary .c-accordion__inner { padding-left: 0.5rem; gap: 1.25rem; }   /* 8 / 20 */
.c-accordion--glossary .c-accordion__q {
  font-family: var(--u-font-heading); font-weight: 500;
  font-size: var(--u-fs-h4); line-height: 2.125rem; letter-spacing: -0.0175rem;   /* 28/34 */
  color: var(--wp--preset--color--text-primary);
}
.c-accordion--glossary .c-accordion__answer {
  font-size: var(--u-fs-body-regular); line-height: 1.5rem; letter-spacing: -0.03rem;
  color: var(--wp--preset--color--text-secondary);
}

@media (max-width: 767px) {
  /* Node 14275:32249: Sektion pad 48, gap 48; Suche volle 312; A-Z ist EINE horizontal
     scrollende 40er-Zeile (Node-row 1240 breit im 312er-Container, gap 8) — kein Umbruch-Grid. */
  .c-glossary { padding-block: 3rem; }
  /* SETZUNG (Sticky-Fix, Frame 14275:32227 zeigt nichts): auf 360 klebt NUR die A-Z-Zeile,
     nicht der ganze Controls-Stapel — Suche (44) + Gap (20) + A-Z (40) waeren zusammen mit der
     Nav-Zone ~190px Dauer-Overlay auf ~640px Viewport und erdruecken den Lesefluss; der Filter
     ist das staendig gebrauchte Werkzeug, die Suche bleibt einen Scroll entfernt.
     Mechanik: `display: contents` loest die Controls-Box auf, damit die A-Z-Zeile im
     .u-container (der auch die Liste enthaelt) kleben kann — sticky reicht nur bis zum Ende
     des eigenen Elterncontainers, und der endete vorher direkt unter der A-Z-Zeile. */
  .c-glossary > .u-container { display: flex; flex-direction: column; gap: 1.25rem; }  /* 20 = Suche->A-Z (Node) */
  .c-glossary__controls { display: contents; }
  /* Abstand A-Z -> Liste zurueck auf 48 (Node): 20 Container-Gap + 28 Eigen-Padding.
     Padding statt Margin (globaler Margin-Reset, Abstaende nie ueber Margins). */
  .c-glossary__output { padding-block-start: 1.75rem; }
  .c-glossary__search { width: 100%; }
  /* Der Node fuehrt EINE 26er-Zeile — die zwei Desktop-Reihen werden aufgeloest
     (display: contents), die Alphabet-Huelle selbst scrollt. Sticky wie am Desktop die
     Controls: Anschlag aus den Nav-Tokens, deckender Grund (voller Bleed = ganze
     Viewport-Breite, der Grund deckt damit randlos). */
  .c-glossary__alphabet { flex-direction: row; gap: 0.5rem;
    overflow-x: auto; scrollbar-width: none; margin-inline: calc(-1 * var(--u-margin)); padding-inline: var(--u-margin);
    position: sticky; top: var(--sticky-top); z-index: 2;
    background: var(--wp--preset--color--bg-primary); }
  .c-glossary__alphabet::-webkit-scrollbar { display: none; }
  .c-glossary__alphabet-row { display: contents; }
  .c-glossary__letter { flex: 0 0 auto; }
  /* Begriffe: H6 20/28 wie die Sektions-FAQ (Node-Zeile 60 = 16+28+16); `anywhere` brach
     mitten im Wort („Bewilligungsbesche/id"). */
  .c-accordion--glossary .c-accordion__q { font-size: 1.25rem; line-height: 1.75rem; letter-spacing: -0.0125rem; overflow-wrap: normal; }
  .c-glossary__output { flex-direction: column; }
  .c-glossary__marker { position: static; width: 100%; }
  /* 🔴 `min-width: 0` ist Pflicht, sobald ein Flex-Kind schmaler werden muss als sein Inhalt.
     Ohne das behielt die Begriffsliste ihre Mindestbreite und lief bei 360 auf 374 heraus. */
  .c-glossary__output > * { min-width: 0; width: 100%; }
}

/* ============================================================= Video (Node 13910:34496, Case-Study)
   Text links 3 Sp. · Video 6 Sp. (16:9, 648×364,5) · Text rechts 3 Sp. Weisser Grund, py 16.
   Consent-gated: Poster + Play, iframe erst nach Klick (s. video/index.php). */
.c-video { position: relative; background: var(--wp--preset--color--bg-primary); padding-block: 1rem; }  /* 16 */
.c-video__inner { align-items: center; }
.c-video__aside {
  font-family: var(--u-font-body); font-weight: 400;
  font-size: var(--u-fs-body-regular); line-height: 1.5rem; letter-spacing: -0.03rem;
  color: var(--wp--preset--color--text-primary); align-self: center;
}
.c-video__aside--left  { grid-column: 1 / span 3; }
.c-video__aside--right { grid-column: 10 / -1; text-align: right; }
.c-video__stage {
  grid-column: 4 / span 6; position: relative; aspect-ratio: 16 / 9;
  border-radius: 0.375rem; overflow: hidden; background: var(--wp--preset--color--bg-alternate);
  display: flex; align-items: center; justify-content: center;
}
.c-video__poster { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.c-video__frame  { position: absolute; inset: 0; width: 100%; height: 100%; border: 0; }
.c-video__play {
  position: relative; z-index: 2; display: inline-flex; align-items: center; justify-content: center;
  width: 4.5rem; height: 4.5rem; border-radius: 50%; cursor: pointer;
  background: var(--wp--preset--color--accent); border: none; color: var(--wp--preset--color--text-primary);
  transition: transform var(--u-dur-fast) var(--u-ease);
}
.c-video__play:hover { transform: scale(1.06); }
.c-video__play-icon { width: 1.5rem; height: 1.5rem; }
.c-video__hint {
  position: relative; z-index: 2; font-family: var(--u-font-body); font-weight: 500;
  font-size: 0.875rem; color: var(--wp--preset--color--text-quarternary); text-transform: uppercase; letter-spacing: 0.05em;
}
@media (max-width: 767px) {
  .c-video__inner { row-gap: 1.5rem; }
  .c-video__aside--left, .c-video__aside--right { grid-column: 1 / -1; text-align: left; }
  .c-video__stage { grid-column: 1 / -1; }
}

/* ============================================================= Case-Study-Detail (Node 13910:34506)
   Grauer Panel: links zweifarbige H2 + PDF-Download-Button (unten), rechts Akkordion (7 Sp.).
   Nutzt die geteilte .c-accordion-Komponente. */
.c-csdetail { position: relative; background: var(--wp--preset--color--bg-primary); padding-block: 5rem; }  /* 80 */
.c-csdetail__panel {
  background: var(--wp--preset--color--bg-tertiary); border-radius: 1rem;   /* 16 */
  padding: 4rem 3rem;                                                       /* 64 / 48 */
  align-items: stretch; row-gap: 2.5rem;
}
.c-csdetail__head {
  grid-column: 1 / span 4; display: flex; flex-direction: column; justify-content: space-between;
  gap: 2.5rem; align-self: stretch;   /* fuellt die Panelhoehe → Button sitzt unten links (Node/User) */
}
.c-csdetail__headline {
  font-family: var(--u-font-heading); font-weight: 500;
  font-size: var(--u-fs-h2); line-height: 3.5rem; letter-spacing: -0.0975rem;   /* 52/56 */
  color: var(--wp--preset--color--text-primary);
}
.c-csdetail__headline em { font-style: normal; color: var(--wp--preset--color--text-tertiary); }
.c-csdetail__download { align-self: flex-start; }
.c-csdetail__list { grid-column: 6 / -1; }
/* Akkordion im Panel: Trenner nur zwischen den Eintraegen, kein Rahmen/Radius (Node: schlichte Linien). */
.c-csdetail__list .c-accordion { background: none; border: none; border-radius: 0; padding: 0; }

@media (max-width: 767px) {
  .c-csdetail { padding-block: 3rem; }
  .c-csdetail__panel { padding: 2.5rem 1.5rem; }
  .c-csdetail__head { grid-column: 1 / -1; position: static; }
  .c-csdetail__headline { font-size: var(--u-fs-h3); line-height: 2.75rem; }
  .c-csdetail__list { grid-column: 1 / -1; }
}

/* ============================================================= CTA-Bildband zentriert (Client-File
   21724:19408 „07 Highlight"). Gerundete Karte (16px Rand), Vollbild + Schwarz-33% + Slate-Multiply.
   Zentrierter Inhalt max 648: H2 weiss + Lead + 2 Buttons (Mint + Blur). */
.c-ctaband { position: relative; background: var(--wp--preset--color--bg-primary); padding: 1rem; }  /* 16 Rand */
.c-ctaband__card {
  position: relative; overflow: hidden; border-radius: 1rem;   /* 16 */
  /* Backlog #30: der CTA der Case-Study-Seite ist 80vh hoch (Vorgabe Miguel). `ignite/ctaband`
     wird ausschliesslich von single-customer-story.php gerendert — deshalb direkt an der
     Komponente statt ueber einen Seiten-Scope. */
  min-height: 80vh;
  /* Grid statt „flex + zentrieren": der Inhalt ist 6 Rasterspalten breit und mittig — als Grid
     ist das `4 / span 6` (3 Spalten links, 6 in der Mitte, 3 rechts) statt einer festen
     `width: 40.5rem`. `align-content: center` ersetzt das bisherige `align-items: center`.
     ⚠️ Gleicher Bezugsrahmen-Vorbehalt wie bei `.c-stats__card`: das Raster liegt auf der
     Content-Box der Karte, nicht auf dem Seiten-Container. Bei 1440px sind beide 1312px breit. */
  display: grid; grid-template-columns: repeat(var(--u-cols), minmax(0, 1fr));
  column-gap: var(--u-gutter); align-content: center;
  padding: 3.5rem 3rem;                                        /* 56 / 48 */
  isolation: isolate;
}
.c-ctaband__media { position: absolute; inset: 0; z-index: -1; }
.c-ctaband__bg { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.c-ctaband__scrim { position: absolute; inset: 0; background: rgba(0,0,0,0.33); }
.c-ctaband__tint {
  position: absolute; inset: 0; mix-blend-mode: multiply;
  background: linear-gradient(-8.64deg, rgba(71,85,105,1) 8.87%, rgba(102,102,102,0) 58.15%);
}
.c-ctaband__inner {
  display: flex; flex-direction: column; align-items: center; text-align: center;
  gap: 2.0833rem;                                             /* 33,333 (Text -> Aktion) */
  grid-column: 4 / span 6;                                    /* Figma 648 = 6 mittige Rasterspalten */
}
.c-ctaband__headline {
  font-family: var(--u-font-heading); font-weight: 500;
  font-size: var(--u-fs-h2); line-height: 3.5rem; letter-spacing: -0.0975rem;   /* 52/56 */
  color: var(--wp--preset--color--text-alternate); margin-bottom: -0.75rem;     /* gap 20 zu Lead */
}
.c-ctaband__lead {
  font-family: var(--u-font-body); font-weight: 400;
  font-size: var(--u-fs-body-regular); line-height: 1.5rem; letter-spacing: -0.03rem;
  color: var(--wp--preset--color--text-alternate);
}
.c-ctaband__actions { display: flex; align-items: center; justify-content: center; gap: 0.875rem; flex-wrap: wrap; }  /* 14 */
@media (max-width: 767px) {
  /* „Disruptor Section" der Case Study (14310:36984): Sektion 640 = 8 + Karte 344x624 + 8,
     Karte pad 16, Inhalt mittig, Headline 26/32, gestapelte Buttons (dieselbe
     Karten-Geometrie wie Interrupter/Newsletter). */
  .c-ctaband { padding: var(--u-gutter); }
  .c-ctaband__card { padding: 1rem; min-height: 39rem; }
  .c-ctaband__inner { grid-column: 1 / -1; }
  .c-ctaband__headline { font-size: 1.625rem; line-height: 2rem; letter-spacing: -0.0488rem; }
  .c-ctaband__actions { flex-direction: column-reverse; align-items: center; }
}

/* ============================================================= Weitere Erfolgsgeschichten (Client-File
   21724:19419). Grauer Panel (px-48 py-96, radius 16, 16px vom Rand). Links zweifarbige H2 + dunkler
   Button, rechts 869er-Raster: 2 Inhalts-Cards (Mint+Slate) oben, breite Bildkarte unten. */
.c-related { position: relative; background: var(--wp--preset--color--bg-primary); }
.c-related__wrap { padding-inline: 1rem; }                     /* 16 vom Viewport-Rand (Node px-16) */
.c-related__panel {
  background: var(--wp--preset--color--bg-tertiary); border-radius: 1rem;   /* 16 */
  padding: 6rem 3rem;                                                       /* 96 / 48 */
  display: flex; align-items: stretch; gap: 6rem;                          /* 96 */
}
/* Der Kopf laeuft mit, bis die Kartenreihe durch ist — genau wie die Textspalte in `.c-funding`
   (User 2026-08-05: „das muss Standard sein"). Die beiden Sektionen sind faktisch dieselbe Figur,
   Text links / Karten rechts; dass nur eine davon sticky war, war die Abweichung.

   🔴 Dieselben zwei Voraussetzungen wie dort, beide sind Bedingung und nicht Kosmetik:
   `align-self: flex-start` — der Panel setzt `align-items: stretch`, ein gestrecktes Flex-Item
   fuellt die Zeile komplett aus und hat damit keinen Weg zum Wandern; `sticky` waere wirkungslos.
   Und `justify-content: flex-start` statt `center` — vertikale Zentrierung und ein Sticky-Lauf
   schliessen sich gegenseitig aus. */
.c-related__head {
  flex: 1 1 0; min-width: 0; align-self: flex-start;
  display: flex; flex-direction: column; justify-content: flex-start; align-items: flex-start;
  gap: 2rem;                                                   /* 32 */
  position: sticky; top: var(--sticky-top);                    /* Navbar-Hoehe + 1rem Luft */
}
.c-related__headline {
  font-family: var(--u-font-heading); font-weight: 500;
  font-size: var(--u-fs-h2); line-height: 3.5rem; letter-spacing: -0.0975rem;   /* 52/56 */
  color: var(--wp--preset--color--text-primary);
}
.c-related__headline em { font-style: normal; color: var(--wp--preset--color--text-tertiary); }
.c-related__grid {
  flex: 0 0 auto; width: calc(8 * var(--u-col) + 7 * var(--u-gutter));    /* 869,33 = 8 Sp. */
  display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--u-gutter);
}
.c-related__grid > .c-card { height: auto; aspect-ratio: 1 / 1; }
.c-related__imgcard {
  grid-column: 1 / -1; border-radius: 0.5rem; overflow: hidden;            /* 8 */
  background: var(--wp--preset--color--surface-darkgrey); aspect-ratio: 869.34 / 426.72;
}
.c-related__imgcard img { width: 100%; height: 100%; object-fit: cover; display: block; }
@media (max-width: 767px) {
  /* Node 14310:36986: pad 40/16, gap 48 — beides steht in KEINEM Token der Abstands-Tabelle
     (die bildet 96→72 und 48→20 ab). Deshalb ausgeschrieben, mit der Quelle daneben. */
  .c-related__panel { flex-direction: column; padding: 2.5rem 1rem; gap: 3rem; }
  /* Einspaltig gibt es nichts, woran der Kopf entlanglaufen koennte — er klebte sonst ueber den
     eigenen Karten fest. Gleiche Abschaltung wie bei `.c-funding__col`. */
  .c-related__head { position: static; align-self: auto; }
  /* Kopf und Button stehen im Mobile-Frame mittig (Node 14310:36985: Titel x = 63,5 bei 233
     Breite in 312, Button x = 71,5 bei 217). Auf Desktop bleiben beide linksbuendig. */
  .c-related__head { align-items: center; text-align: center; }
  .c-related__headline { font-size: var(--u-fs-h3); line-height: 2.75rem; }
  /* 2x2-Raster → Endlos-Karussell (ADR 0010 §1.7): drei Karten a 312 bei x = −296 · 24 · 344. */
  .c-related__grid { --karten-spalten: 12; }
  /* Das breite Bild ueber den Karten ist im Mobile-Frame nicht gezeichnet — als vierter,
     querformatiger Eintrag mitten im Karussell waere es auch keine Karte mehr. */
  .c-related__imgcard { display: none; }
}

/* ============================================================= News + Blog (Bau-Auftrag 8,
   Nodes 21745:20978ff / 21743:19920ff). Beide Übersichten und beide Artikel teilen sich dieselben
   Komponenten — der Unterschied ist Inhalt, nicht Struktur.
   `position: relative` an jeder Sektion: Sektions-weite Konvention (Paint-Reihenfolge). */

/* ---- Seitenkopf, Achse `split`: Lead RECHTS statt darunter (News/Blog) ---- */
/* Breiten kommen aus dem GRID (Layout-Regel Stufe 1), nicht aus einer Spaltenformel:
   Node 21745:20995 → Lead-Spalte 537,33 = 5 Spalten, Headline nimmt die restlichen 7. */
.c-page-header--split .c-page-header__text {
  display: grid; grid-template-columns: repeat(var(--u-cols), minmax(0, 1fr));
  gap: var(--u-gutter); align-items: end;
}
.c-page-header--split .c-page-header__headline { grid-column: span 7; }
.c-page-header--split .c-page-header__lead { grid-column: span 5; }
.c-page-header__headline em { font-style: normal; color: var(--wp--preset--color--text-tertiary); }

/* ---- Featured-Slider: Bleed + scroll-snap, Muster .c-blog__viewport ---- */
/* Abstände nachgemessen an BEIDEN Hero-Nodes (21745:20980 News, 13918:35662 Webinare) — sie
   stimmen dort exakt überein: Karten enden bei 876/877, die Pfeile beginnen bei 940/941 und die
   Sektion endet 64 unter ihnen. Vorher standen hier 24 und 48, beides frei gegriffen. */
.c-featured { position: relative; background: var(--wp--preset--color--bg-primary); padding-block: 0 4rem; }
.c-featured__viewport {
  /* KEIN width:100% — sonst verschieben die negativen Margins die Box nur, statt sie zu
     verbreitern, und der Bleed faellt weg (dokumentierter Fallstrick, s. .c-blog__viewport). */
  margin-inline: calc(-1 * var(--u-margin));
  padding-inline: var(--u-margin);
  overflow-x: auto; overflow-y: hidden;
  scroll-snap-type: x mandatory;
  scroll-padding-inline: var(--u-margin);   /* Pflicht, sonst schnappt Karte 1 auf 0 statt an den Rand */
  scrollbar-width: none;
}
.c-featured__viewport::-webkit-scrollbar { display: none; }
.c-featured__track { display: flex; align-items: stretch; gap: var(--u-gutter); list-style: none; padding: 0; }
.c-featured__track > li {
  flex: 0 0 auto; scroll-snap-align: start;
  /* Node 21745:21006 misst 869,33 — das IST die 8-Spalten-Breite. Als Formel statt als feste
     rem-Zahl, damit sie mit dem Raster mitskaliert (Regel: Grid-Mathematik nicht nachbauen). */
  width: calc(8 * var(--u-col) + 7 * var(--u-gutter));
  max-width: 100%;
}
.c-featured__nav { display: flex; justify-content: flex-end; gap: 0.25rem; padding-top: 4rem; }

/* ---- Postcard, FORMAT-Achse `--row`: Bild links statt oben ----
   Bewusst am Postcard-Stamm und nicht `.c-card--row`: die Doku begründet, warum Postcard und Card
   getrennt sind (Bild oben, p 6 statt 26) — die Featured-Karte teilt die Postcard-Struktur, nur
   die Anordnung dreht sich. Das ist die zulässige FORMAT-Achse. */
/* Masse 1:1 aus Node 21745:21006 („Ressources"): Karte 869,33 breit, Bild QUADRATISCH 414,72,
   Padding 6 → Kartenhoehe 414,72 + 2x6 = 426,72. Ohne diese feste Hoehe richtet sich die Karte
   nach der Textlaenge und der Slider wird ungleichmaessig (User: „weird"). */
.c-postcard--row {
  flex-direction: row; align-items: center;
  height: 26.67rem;                                            /* 426,72 */
  /* Node 13918:31262 → Karte „Ressources" (13918:31278): pad 6, gap 24 zwischen Bild und
     Container. Hier stand `gap: 0` mit `justify-content: space-between` — weil der Body
     `flex: 1 1 auto` ist, blieb vom Ausgleich nichts uebrig: das Bild lag auf Kante am Body, und
     zum Text waren es nur die 20 Innenabstand des Bodys statt 24 + 20 (User 2026-08-05, nachge-
     messen: Luecke Bild→Body 0, Bild→Text 20). `space-between` ist damit auch hinfaellig. */
  gap: 1.5rem;                                                 /* 24 */
}
.c-postcard--row .c-postcard__img {
  flex: 0 0 25.92rem; width: 25.92rem; height: 25.92rem;       /* 414,72 quadratisch */
  align-self: center;
}
.c-postcard--row .c-postcard__body {
  flex: 1 1 auto; min-width: 0;                                /* Rest der Karte (Node: 414,67) */
  height: 100%; padding: 1.25rem;                              /* 20 */
  justify-content: space-between; align-items: flex-start;
}
.c-postcard--row .c-postcard__text { gap: 1.625rem; }          /* 26 */

/* Webinar-Slider (Node 13918:35662): schmalere Karte, Bild HOCHKANT statt quadratisch.
   Karte 759 = 7 Rasterspalten (758,67); Bild 332 x 415 — das ist exakt die Innenhöhe (427 − 2×6)
   im Verhältnis 4:5. Deshalb `aspect-ratio` statt einer zweiten festen rem-Zahl: die Höhe bleibt
   die der Karte, die Breite folgt. Kartenhöhe und Padding sind identisch zu News/Blog. */
.c-featured--webinar .c-featured__track > li { width: calc(7 * var(--u-col) + 6 * var(--u-gutter)); }
.c-featured--webinar .c-postcard--row .c-postcard__img {
  flex: 0 0 auto; width: auto; height: 100%; aspect-ratio: 4 / 5; align-self: stretch;
}
/* 🔴 `.c-btn` ist inline-flex mit justify-content:center. Als Kind einer Flex-Spalte mit dem
   Default `align-items: stretch` wird es auf volle Breite gezogen und der Text landet MITTIG.
   Der Node zeigt den Link linksbuendig — deshalb explizit nicht strecken. */
.c-postcard__body { align-items: flex-start; }
.c-postcard__body > .c-btn { align-self: flex-start; }
.c-postcard__lede {
  font-family: var(--u-font-body); font-weight: 400;
  font-size: var(--u-fs-body-regular); line-height: 1.5rem; letter-spacing: -0.03rem;
  color: var(--wp--preset--color--text-secondary);
}

/* ---- Artikel-Browser ---- */
/* Die Sektion selbst ist nur der Rahmen um die Bühne — Maße am Node 21745:21012 abgelesen
   (Pixelmessung, weil `get_metadata` auf diesem Teilbaum abbricht):
     Sektion 1440 breit, Bühne 1408 an x=16      → padding-inline 16
     Bühne oben bündig, unten 16 Luft            → padding 0 16 16
     Bühne radius 16, padding 64 / 48 / 80
     Inhalt beginnt bei x=64 (16 + 48) = Rastermarge, steht also auf derselben Linie wie überall. */
.c-articles { position: relative; padding: 0 1rem 1rem; }
.c-articles__panel {
  background: var(--wp--preset--color--bg-secondary); border-radius: 1rem;
  /* Seitlich NICHT die 48 fest verdrahten, sondern aus der Rastermarge ableiten: die 16 der
     Sektion stecken schon in der Einrückung, der Rest ist Innenabstand. Bei 1440 sind das
     genau die 48 des Nodes (64 − 16); auf jeder anderen Breite steht der Inhalt der Bühne
     dadurch automatisch auf derselben Linie wie der übrige Seiteninhalt. */
  padding: 4rem calc(var(--u-margin) - 1rem) 5rem;
  /* 64 zwischen Überschrift, Filterzeile und Ergebnis — der einzige vertikale Abstand der Bühne. */
  display: flex; flex-direction: column; gap: 4rem;
}
/* Span 5 (537,33) aus dem Umbruch: der Node bricht nach „Alle Fördermittel-News". „…News auf"
   misst 620,93 — passt also nicht in 537,33, wohl aber in 648. Bei span 6 stünde „auf" noch in
   Zeile 1, der Umbruch läge falsch. */
.c-articles__headline {
  grid-column: span 5;
  font-family: var(--u-font-heading); font-weight: 500;
  font-size: var(--u-fs-h2); line-height: 3.5rem; letter-spacing: -0.0975rem;
  color: var(--wp--preset--color--text-primary);
}
.c-articles__headline em { font-style: normal; color: var(--wp--preset--color--text-tertiary); }
/* Kein eigenes padding-block mehr — der Abstand nach oben und unten kommt aus dem `gap` der Bühne. */
.c-articles__bar {
  display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between;
  gap: 1rem;
}
.c-articles__filters { display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem; }
/* Node 21745:21028 „Column": die GRUPPE aus Suche + Ansicht ist 426,67 breit (4 Rasterspalten),
   itemSpacing 8. Die Suche fuellt nur den Rest (335,67 = 426,67 − 8 − 83 Ansicht). Vorher trug die
   Suche allein die vollen 4 Spalten und war dadurch zu lang (Backlog #25 „kuerzer"). */
.c-articles__tools {
  display: flex; align-items: center; gap: 0.5rem;                     /* itemSpacing 8 */
  width: calc(4 * var(--u-col) + 3 * var(--u-gutter));                  /* 426,67 = 4 Spalten */
}
.c-articles__chip {
  display: inline-flex; align-items: center; gap: 0.5rem;
  height: 2.5rem; padding: 0.75rem 0.875rem;
  border-radius: 0.25rem; background: var(--wp--preset--color--bg-tertiary);
  border: 0.0625rem solid rgba(226,232,240,0.4);
  text-decoration: none; cursor: pointer; list-style: none;
}
.c-articles__chip::-webkit-details-marker { display: none; }
.c-articles__chip--active { background: var(--wp--preset--color--accent); border-color: rgba(30,6,61,0.05); }
.c-articles__chip-label {
  font-family: var(--u-font-body); font-weight: 500;
  font-size: 0.75rem; line-height: 0.75rem; text-transform: uppercase;
  color: var(--wp--preset--color--text-primary);
}
.c-articles__chip-count {
  font-family: var(--u-font-body); font-weight: 500; opacity: 0.6;
  font-size: 0.875rem; line-height: 1.375rem; color: var(--wp--preset--color--text-primary);
}
/* Backlog #23: das X sitzt als EIGENER Kasten NEBEN dem Chip (Node I21745:21017;13893:21160 —
   40x40, radius 4, Abstand 2 zum Chip), Muster wie Grants-Overview. `.c-articles__chip-icon`
   entfaellt damit: es gibt kein Icon mehr IM Chip (der Chevron ging schon mit dem Dropdown, #24). */
.c-articles__filterset { display: inline-flex; align-items: center; gap: 0.125rem; }   /* 2 */
.c-articles__clear {
  display: inline-flex; align-items: center; justify-content: center; flex: 0 0 auto;
  width: 2.5rem; height: 2.5rem; padding: 0.625rem;                  /* 40 / 10 */
  border-radius: 0.25rem;                                            /* 4 */
  background: var(--wp--preset--color--accent);
  border: 0.0625rem solid rgba(30,6,61,0.05);
  color: var(--wp--preset--color--text-primary); cursor: pointer; text-decoration: none;
}
.c-articles__clear-icon { width: 1.25rem; height: 1.25rem; }         /* 20 */

/* .c-articles__dropdown/__menu/__option sind mit Backlog #24 entfallen — Blog zeigt die
   Kategorien jetzt als flache Pills wie News und Locations, es gibt kein Dropdown mehr. */
.c-articles__reset {
  font-family: var(--u-font-body); font-size: 0.875rem; line-height: 1.375rem;
  color: var(--wp--preset--color--text-accent); text-decoration: none;
}
/* Suchfeld 1:1 aus Node 21745:21029 „Search": 44 hoch, padding 10/12, gap 12, weiss auf
   #e2e8f0-Rand, radius 4. Breite NICHT mehr fix — sie fuellt den Rest der 4-Spalten-Gruppe
   (layoutGrow=1 im Node). Lupe und Placeholder sind violett (#753bbd = text-accent), identisch
   zur bereits korrekten `.c-grants__search`. */
.c-articles__search {
  flex: 1 1 auto; min-width: 0;
  display: flex; align-items: center; gap: 0.75rem;                    /* itemSpacing 12 */
  height: 2.75rem; padding: 0.625rem 0.75rem;                          /* 44 / 10 / 12 */
  background: var(--wp--preset--color--bg-primary);
  border: 0.0625rem solid var(--wp--preset--color--border-tertiary); border-radius: 0.25rem;
}
.c-articles__search-icon { width: 1.25rem; height: 1.25rem; flex: 0 0 auto; color: var(--wp--preset--color--text-accent); }
.c-articles__search-input {
  flex: 1 1 auto; min-width: 0; border: 0; background: none; padding: 0; outline: none;
  font-family: var(--u-font-body); font-weight: 500; font-size: 0.875rem; line-height: 1.375rem;
  color: var(--wp--preset--color--text-primary);
}
.c-articles__search-input::placeholder { color: var(--wp--preset--color--text-accent); opacity: 1; }
/* .c-articles__views/__view ersetzt durch die gemeinsame `.c-viewtoggle` (Backlog #22, unten). */
/* Zeilenabstand 64, Spaltenabstand 16 — im Node stehen die Kartenreihen 348,5→880,5 und
   946,5→1478,5, also 532 hoch mit 64 Luft dazwischen, während die Spalten den normalen Gutter
   halten (Karte 426,67 = (1312 − 2×16)/3). */
.c-articles__grid {
  list-style: none; padding: 0; display: grid;
  row-gap: 4rem; column-gap: var(--u-gutter);
  grid-template-columns: repeat(3, minmax(0, 1fr));
}
/* Node 21745:21012: die Karten im Grid stehen auf WEISS, nicht auf bg-tertiary. Bewusst hier
   gescoped und nicht am `.c-postcard`-Stamm — der Teaser auf der Startseite behaelt seinen Grund.

   🔴 `:where()` ist hier Absicht, nicht Kosmetik. Ohne es hat dieser Selektor Spezifitaet (0,2,0)
   — exakt so viel wie `.c-postcard:hover`. Weil er im Stylesheet SPAETER steht, gewann er auch
   im Hover-Zustand: die Overview-Karten blieben beim Ueberfahren weiss, der Hover war unsichtbar
   (2026-08-05 gemeldet). `:where()` zieht die Spezifitaet auf (0,1,0), damit der Ruhe-Grund
   weiterhin gesetzt wird, der Hover ihn aber schlagen kann.
   Merksatz fuer weitere kontextuelle Grund-Overrides an `.c-postcard`: immer in `:where()`. */
.c-articles__grid :where(.c-postcard) { background: var(--wp--preset--color--bg-primary); }
/* Auch hier 64 (Gitter → Seitenzahlen), wieder über `gap` statt über ein padding an der Nav. */
.c-articles__result { display: flex; flex-direction: column; gap: 4rem; transition: opacity var(--u-dur-fast) var(--u-ease); }
.c-articles.is-loading .c-articles__result { opacity: 0.55; }
.c-articles__empty {
  font-family: var(--u-font-body); font-size: var(--u-fs-body-regular); line-height: 1.5rem;
  color: var(--wp--preset--color--text-secondary);
}
.c-articles__empty a { color: var(--wp--preset--color--text-accent); }
/* Seitenzahlen: siehe `.c-pagination` (eine Komponente fuer beide Orte, Backlog 2026-08-07).
   Hier stand eine zweite, eigene Paginierung mit anderem Radius, anderem Aktiv-Zustand und
   anderem Hover. */

/* Listenansicht: EIN DOM, nur die Anordnung dreht sich (Muster grants-browser).
   Zustand haengt am `data-view` der Sektion (gehaertete Mechanik 2026-08-15) — der Traeger an
   der Wurzel ueberlebt den fetch-Swap der Bar, Klassen im getauschten Markup taten das nicht.
   Der 64er-Zeilenabstand gilt nur für die Kartenreihen im Gitter — flache Zeilen stehen dicht. */
.c-articles[data-view="list"] .c-articles__grid { grid-template-columns: minmax(0, 1fr); row-gap: var(--u-gutter); }
.c-articles[data-view="list"] .c-postcard { flex-direction: row; height: auto; min-height: 0; align-items: center; }
.c-articles[data-view="list"] .c-postcard__img { width: 18%; height: 7.5rem; }
.c-articles[data-view="list"] .c-postcard__body { flex: 1 1 0; min-width: 0; flex-direction: row; align-items: center;
  justify-content: space-between; gap: var(--u-gutter); padding: 1rem 1.25rem 1rem 0; }
.c-articles[data-view="list"] .c-postcard__text { flex: 1 1 auto; gap: 0.5rem; }

/* ---- Newsletter (im Figma „CTA" — es ist die Anmeldung, kein ignite/cta) ----
   Werte 1:1 aus Node 21745:21055 (G1): Sektion 1440x688 mit px-16 → Container 1408x656,
   radius 16, padding 48, gap 48. Der Bild-Stapel ist vierlagig wie im Node:
   Grundfarbe → Foto (cover) → 33% Schwarz → Multiply-Verlauf aus surface-darkgrey. */
/* Padding RINGSUM, nicht nur seitlich: Node 21745:21054 ist 1440x688 bei einem Container von
   1408x656 an x=16/y=16 — also 16 auf allen vier Seiten. Vorher stand hier `padding-inline`,
   dadurch klebte die Bühne oben an der Liste und unten am Footer (688 = 656 + 2x16). */
.c-newsletter { position: relative; padding: 1rem; }                     /* 16 */
.c-newsletter__stage {
  position: relative; isolation: isolate; overflow: hidden;
  min-height: 41rem;                                                     /* 656 */
  border-radius: 1rem;                                                   /* 16 */
  padding: 3rem;                                                         /* 48 */
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: 3rem;                                                             /* 48 */
  background: var(--wp--preset--color--bg-tertiary);
}
.c-newsletter__media { position: absolute; inset: 0; z-index: -1; border-radius: 1rem; overflow: hidden; }
.c-newsletter__bg { width: 100%; height: 100%; object-fit: cover; display: block; }
.c-newsletter__scrim { position: absolute; inset: 0; background: rgba(0,0,0,0.33); }
/* Node: linear-gradient(-8.64deg, surface-darkgrey 8.87%, rgba(102,102,102,0) 58.15%), multiply. */
.c-newsletter__tint {
  position: absolute; inset: 0; mix-blend-mode: multiply;
  background: linear-gradient(-8.64deg,
    var(--wp--preset--color--surface-darkgrey) 8.87%, rgba(102,102,102,0) 58.15%);
}
.c-newsletter__headline {
  font-family: var(--u-font-heading); font-weight: 500;
  font-size: var(--u-fs-h2); line-height: 3.5rem; letter-spacing: -0.0975rem;   /* 52/56/-1,56 */
  color: var(--wp--preset--color--text-alternate); text-align: center;
  /* 🔴 Breite = 5 Spalten. Der Umbruch kommt daraus, NICHT aus einem <br>. */
  width: calc(5 * var(--u-col) + 4 * var(--u-gutter));
  max-width: 100%;
}
.c-newsletter__form { display: flex; flex-direction: column; align-items: flex-start; gap: 0.25rem; }
/* Ein Feld, Label oben DRIN, Button rechts DRIN (Node 21745:21059): radius 6, padding 12, gap 4. */
.c-newsletter__field {
  display: flex; align-items: center; gap: 0.25rem;                      /* 4 */
  padding: 0.75rem;                                                      /* 12 */
  border-radius: 0.375rem;                                               /* 6 */
  background: rgba(251,251,251,0.1);
  -webkit-backdrop-filter: blur(5rem); backdrop-filter: blur(5rem);      /* 80 */
}
.c-newsletter__input-wrap {
  display: flex; flex-direction: column; align-items: flex-start; justify-content: center;
  padding-inline-end: 6rem;                                              /* 96 */
}
.c-newsletter__label {
  font-family: var(--u-font-body); font-weight: 500;
  font-size: var(--u-fs-body-small); line-height: 1.375rem;              /* 14/22 */
  color: var(--wp--preset--color--text-alternate); opacity: 0.6;
}
.c-newsletter__input {
  border: 0; background: none; outline: none; padding: 0; min-width: 11rem;
  font-family: var(--u-font-body); font-weight: 400;
  font-size: var(--u-fs-body-medium); line-height: 1.625rem; letter-spacing: -0.03375rem;  /* 18/26 */
  color: var(--wp--preset--color--text-alternate);
}
.c-newsletter__input::placeholder { color: var(--wp--preset--color--text-alternate); opacity: 0.85; }
.c-newsletter__submit {
  display: inline-flex; align-items: center; justify-content: center; gap: 0.75rem;   /* 12 */
  flex: 0 0 auto; align-self: stretch; cursor: pointer;
  padding: 0.75rem 0.75rem 0.75rem 1.25rem;                              /* 12 / pl 20 */
  border-radius: 52rem;                                                  /* Pille */
  background: var(--wp--preset--color--accent);
  border: 0.0625rem solid var(--wp--preset--color--accent);
  color: var(--wp--preset--color--text-primary);
  font-family: var(--u-font-body); font-weight: 400;
  font-size: 1rem; line-height: 1.5rem; letter-spacing: -0.03rem;        /* 16/24/-0,48 */
  white-space: nowrap;
}
.c-newsletter__submit-icon { width: 1.25rem; height: 1.25rem; flex: 0 0 auto; }

@media (max-width: 767px) {
  .c-page-header--split .c-page-header__text { display: flex; flex-direction: column; gap: 1.25rem; }
  .c-page-header--split .c-page-header__headline,
  .c-page-header--split .c-page-header__lead { grid-column: auto; }
  /* Die Kartenbreite steht jetzt in der gemeinsamen Karussell-Regel am Dateiende (ADR 0010 §1.7);
     hier bleibt nur die Spaltenzahl. 12 = Containerbreite (312 @360), wie beim Blog-Slider —
     die Sammlung im Hero von News/Blog funktioniert wie der Blog-Teaser der Startseite.
     Der Webinar-Modifier muss beim ZURUECKSETZEN mitgenannt werden: die 7-Spalten-Formel steht
     auf `.c-featured--webinar .c-featured__track > li` und ist spezifischer als die nackte Klasse.
     Sie waere auf dem Handy 184px breit — eine unbrauchbar schmale Karte. */
  .c-featured__track,
  .c-featured--webinar .c-featured__track { --karten-spalten: 12; }
  .c-postcard--row { flex-direction: column; height: auto; }
  /* Ebenso beim Bild: hochkant 4:5 gilt nur im Querformat der Karte. Klappt die Karte auf dem
     Handy in die Spalte, liegt das Bild wieder oben und über die volle Breite. */
  .c-postcard--row .c-postcard__img,
  .c-featured--webinar .c-postcard--row .c-postcard__img {
    flex: 0 0 auto; width: 100%; height: 12rem; aspect-ratio: auto;
  }
  .c-postcard--row .c-postcard__body { flex: 1 1 auto; width: 100%; height: auto; padding: 0 1.25rem 1.25rem; }
  /* Node 14370:25941: Sektion pad 8, Buehne 344 (pad 16/16/32/16, gap 32), Karten 312x390
     gestapelt mit gap 8, Pagination 46. Der Kopf der Buehne entfaellt im Frame nicht —
     Suche 312 + Chips (wrap) mit gap 8. */
  .c-articles { padding: var(--u-gutter); }
  .c-articles__panel { padding: 1rem 1rem 2rem; gap: 2rem; }
  .c-articles__head { display: block; }
  .c-articles__headline { font-size: 1.625rem; line-height: 2rem; letter-spacing: -0.0488rem; }
  .c-articles__bar { flex-direction: column; align-items: stretch; gap: 0.5rem; }
  /* Die 4-Spalten-Breite haengt jetzt an der Tools-GRUPPE (Suche fuellt darin) — auf schmal
     traegt die Gruppe volle Breite, die Suche folgt automatisch ueber ihr flex-grow. */
  .c-articles__tools { width: 100%; }
  .c-articles__result { gap: 2rem; }
  .c-articles__grid { grid-template-columns: minmax(0, 1fr); row-gap: 0.5rem; }
  /* Featured-Slider: in KEINEM der beiden Uebersichts-Frames vorhanden (News 14370:25927,
     Blog 14331:42323 — der Kopf geht direkt in die Buehne). Die fruehere Karussell-Ableitung
     aus ADR 0010 Teil 3 ist damit ueberholt; Desktop unveraendert. */
  .c-featured { display: none; }
  /* Der Kopf-Lead entfaellt im Split-Kopf (Frame-Hero 330 = Breadcrumbs + Headline + pb 48,
     kein Lead) — im Glossar-Kopf bleibt er (dort gezeichnet). */
  .c-page-header--split .c-page-header__lead { display: none; }
  /* Mobile Listen-Fassung nach dem List-Frame-Muster: eigener Block am DATEIENDE (die fruehere
     Rueckklapp-Regel hier machte die „Liste" zum Grid-Klon — Auftrag 2026-08-15, Schritt 0). */
  /* Newsletter = „Disruptor Section" der Mobile-Frames (Node 14370:25966, 4 Vorkommen):
     Sektion 640 = 8 + Karte 624 + 8, Karte r8 (Desktop r16!), pad 16, gap 48, Inhalt mittig.
     Formular-Box 312x136: pad 12, gap 16 — Eingabe 288x48 OBEN, Button 288x48 darunter,
     beide volle Boxbreite (nicht mehr Label+Button nebeneinander im Feld). */
  .c-newsletter { padding: var(--u-gutter); }                            /* 8 */
  .c-newsletter__stage { min-height: 39rem; border-radius: 0.5rem; padding: 1rem; }   /* 624 · 8 · 16 */
  .c-newsletter__media { border-radius: 0.5rem; }
  .c-newsletter__headline { width: 100%;
    font-size: 1.625rem; line-height: 2rem; letter-spacing: -0.0488rem; }   /* 26/32, ls -3% */
  .c-newsletter__form { width: 100%; align-items: stretch; }
  .c-newsletter__field { flex-direction: column; align-items: stretch; gap: 1rem; }   /* 16 */
  .c-newsletter__input-wrap { padding-inline-end: 0; }
  .c-newsletter__submit { justify-content: center; }
}

/* ---- Artikel-Kopf (Nodes 21745:21069 / 21743:19995) ---- */
.c-articlehead {
  position: relative; background: var(--wp--preset--color--bg-secondary);
  /* pt 176 wie .c-page-header: der Artikel-Kopf liegt unter der overlay-enden Navbar
     (body.ig-has-hero zieht sie hoch) und muss dieselbe Flaeche reservieren — sonst
     verschwinden die Breadcrumbs hinter der Pille. */
  padding-block: 11rem 4rem;
}
/* Vertikale Rhythmik über `gap`, nicht über Margins (globaler Margin-Reset).
   Node 21745:21072: Breadcrumbs → Headline 32, Headline-Block → Bild-Reihe 64. */
.c-articlehead__inner { display: flex; flex-direction: column; gap: 4rem; }        /* 64 */
.c-articlehead__head  { display: flex; flex-direction: column; gap: 2rem; }        /* 32 */
/* 🔴 Breite über das Grid, NICHT über `calc(n * --u-col …)`. Node 21745:21087: 648 = 6 Spalten
   (Figma-Gutter 16 → Spalte 94,67). Die Spaltenformel ist laut Layout-Regel nur die Rückfallebene
   für Kontexte OHNE Grid (Slider-Karten, Media-Slots) — hier gibt es ein Grid. */
.c-articlehead__headline {
  grid-column: span 6;
  font-family: var(--u-font-heading); font-weight: 500;
  font-size: var(--u-fs-h1); line-height: 4rem; letter-spacing: -0.12rem;
  color: var(--wp--preset--color--text-primary);
}
.c-articlehead__meta {
  grid-column: span 3;                                    /* Node 21745:21095: 316 = 3 Spalten */
  display: flex; flex-direction: column; align-items: flex-start; gap: 1.25rem;
}
.c-articlehead__facts {
  display: grid; grid-template-columns: auto 1fr; gap: 0.375rem 1rem;
  font-family: var(--u-font-body); font-size: 0.875rem; line-height: 1.375rem;
}
.c-articlehead__facts dt { color: var(--wp--preset--color--text-tertiary); }
.c-articlehead__facts dd { color: var(--wp--preset--color--text-primary); }
.c-articlehead__media { grid-column: span 9; min-width: 0; }   /* Node 21745:21109: 980 = 9 Spalten */
/* Feste Buehne statt Original-Seitenverhaeltnis: die Quellbilder kommen aus der Live-Seite in
   allen moeglichen Formaten (4:3, hochkant …) und wuerden den Kopf sonst beliebig hoch machen.
   Node zeigt ein liegendes Format. */
.c-articlehead__img { width: 100%; aspect-ratio: 16 / 9; object-fit: cover; border-radius: 0.5rem; display: block; }

/* ---- Artikel-Körper: Inhaltsverzeichnis · Text · Promo ---- */
.c-articlebody { position: relative; background: var(--wp--preset--color--bg-primary); padding-block: 4rem 5rem; }
.c-articlebody__grid { align-items: start; }                   /* .u-grid liefert die Spalten */
.c-articlebody__toc {
  grid-column: span 3;
  position: sticky; top: var(--sticky-top);
  display: flex; flex-direction: column; gap: 1rem;
}
.c-articlebody__toc-title {
  font-family: var(--u-font-body); font-weight: 500; font-size: 0.75rem; line-height: 0.75rem;   /* Node: 12/12 ls 0 */
  text-transform: uppercase;
  color: var(--wp--preset--color--text-tertiary);
}
.c-articlebody__toc-nav { display: flex; flex-direction: column; gap: 0.75rem; }
.c-articlebody__toc-link {
  font-family: var(--u-font-body); font-weight: 400; font-size: 0.875rem; line-height: 1.375rem;
  color: var(--wp--preset--color--text-tertiary); text-decoration: none;
  transition: color var(--u-dur-fast) var(--u-ease);
}
.c-articlebody__toc-link.is-current { color: var(--wp--preset--color--text-primary); font-weight: 500; }
.c-articlebody__main { grid-column: span 6; min-width: 0; display: flex; flex-direction: column; gap: 3rem; }
/* Sprungziel für „Intro" — sitzt oben, damit der Scrollspy einen echten Anker hat. */
.c-articlebody__anchor { display: block; height: 0; scroll-margin-top: var(--sticky-top); }
.c-articlebody__promo {
  grid-column: span 3;
  position: sticky; top: var(--sticky-top);
  display: flex; flex-direction: column; gap: 0.75rem;
}
.c-articlebody__promo-label {
  font-family: var(--u-font-body); font-weight: 500; font-size: 0.75rem; line-height: 0.75rem;   /* Node: 12/12 ls 0 */
  text-transform: uppercase;
  color: var(--wp--preset--color--text-tertiary);
}
.c-articlebody__promo-card {
  display: flex; flex-direction: column; align-items: flex-start; gap: 1rem;
  padding: 1.25rem; border-radius: 0.5rem;
  background: var(--wp--preset--color--bg-secondary);
}
.c-articlebody__promo-title {
  font-family: var(--u-font-heading); font-weight: 500;
  font-size: var(--u-fs-h5); line-height: 1.875rem; letter-spacing: -0.015rem;
  color: var(--wp--preset--color--text-primary);
}
/* Ohne Verzeichnis (Artikel ohne H2) wird die Textspalte breiter — kein Loch stehen lassen. */
.c-articlebody--notoc .c-articlebody__main { grid-column: span 9; }   /* ohne Verzeichnis breiter */

/* ---- CTA-Karte im Textfluss ---- */
.c-ctacard {
  display: flex; flex-direction: column; align-items: flex-start; gap: 1rem;
  padding: 2rem; border-radius: 0.5rem;
  background: var(--wp--preset--color--text-primary);
  color: var(--wp--preset--color--text-alternate);
}
.c-ctacard__tags { display: flex; flex-wrap: wrap; gap: 0.5rem; }
.c-ctacard__headline {
  font-family: var(--u-font-heading); font-weight: 500;
  font-size: var(--u-fs-h4); line-height: 2.25rem; letter-spacing: -0.03rem;
}
.c-ctacard__lead {
  font-family: var(--u-font-body); font-weight: 400;
  font-size: var(--u-fs-body-regular); line-height: 1.5rem; letter-spacing: -0.03rem;
  opacity: 0.8;
}
.c-ctacard__link { color: var(--wp--preset--color--accent); }

/* ============================================================= .c-prose — Editor-Content
   🔴 ERSTE Stelle im Projekt, an der echter `the_content()`-Text gerendert wird. Der globale
   Margin-Reset gilt „OHNE AUSNAHMEN, auch im Rich-Text" (style.css) — die Absatzabstände kommen
   deshalb ausschliesslich über `gap` am Flex-Container, nicht über Element-Margins. Genau diese
   Regel wartete in style.css darauf, „sobald ein Content-Template gebaut wird". */
.c-prose { display: flex; flex-direction: column; gap: 1.5rem; }
.c-prose > h2, .c-prose > h3, .c-prose > h4 { scroll-margin-top: calc(var(--sticky-top) + 1rem); }
.c-prose h2 {
  font-family: var(--u-font-heading); font-weight: 500;
  font-size: var(--u-fs-h3); line-height: 2.75rem; letter-spacing: -0.0675rem;   /* Node: 36/44 (hier stand 28/36) */
  color: var(--wp--preset--color--text-primary);
  padding-top: 1rem;
}
.c-prose h3 {
  font-family: var(--u-font-heading); font-weight: 500;
  font-size: var(--u-fs-h4); line-height: 2.125rem; letter-spacing: -0.0175rem;   /* Node: 28/34 (hier stand 24/30) */
  color: var(--wp--preset--color--text-primary);
}
.c-prose h4 {
  font-family: var(--u-font-heading); font-weight: 500;
  font-size: var(--u-fs-body-large); line-height: 1.75rem;
  color: var(--wp--preset--color--text-primary);
}
/* Die Live-Artikel liefern durchgängig `<h2><strong>…</strong></h2>` (Editor-Eigenart) — das darf
   die Überschrift nicht zusätzlich fetten. */
.c-prose h2 strong, .c-prose h3 strong, .c-prose h4 strong { font-weight: inherit; }
.c-prose p, .c-prose li {
  font-family: var(--u-font-body); font-weight: 400;
  font-size: var(--u-fs-body-medium); line-height: 1.625rem; letter-spacing: -0.03375rem;   /* Node: 18/26 (hier stand 16/26) */
  color: var(--wp--preset--color--text-secondary);
}
.c-prose ul, .c-prose ol { display: flex; flex-direction: column; gap: 0.5rem; padding-inline-start: 1.25rem; }
.c-prose ul { list-style: disc; }
.c-prose ol { list-style: decimal; }
.c-prose li::marker { color: var(--wp--preset--color--text-tertiary); }
.c-prose a { color: var(--wp--preset--color--text-accent); text-decoration: underline; }
.c-prose strong { font-weight: 700;   /* echtes Bold; OS 600 existiert in Figma nicht */ color: var(--wp--preset--color--text-primary); }
.c-prose figure { display: flex; flex-direction: column; gap: 0.5rem; }
.c-prose img { width: 100%; height: auto; border-radius: 0.5rem; display: block; }
.c-prose figcaption {
  font-family: var(--u-font-body); font-size: var(--u-fs-body-small); line-height: 1.375rem;
  color: var(--wp--preset--color--text-tertiary);
}
.c-prose blockquote {
  display: flex; flex-direction: column; gap: 0.5rem;
  padding-inline-start: 1.25rem; border-inline-start: 0.125rem solid var(--wp--preset--color--accent);
}
.c-prose blockquote p { color: var(--wp--preset--color--text-primary); }

@media (max-width: 767px) {
  /* Node 14355:24471 (Blog-Detail, News identisch): pad 176/24/24, gap 32 — die 176er-Reserve
     MUSS bleiben (fixe Navbar!), hier stand 24 und der Kopf lief unter die Pille.
     H1 = Kopf-Headline 32/32; Bild 312x390 (4:5, r6). */
  .c-articlehead { padding-block: 11rem 1.5rem; }
  .c-articlehead__headline { width: 100%; font-size: 2rem; line-height: 2rem; letter-spacing: -0.06rem; }
  .c-articlehead__inner { gap: 2rem; }
  .c-articlehead__row { display: flex; flex-direction: column; gap: 1rem; }
  /* 1/-1, nicht `auto`: `auto` platziert im 12er-Raster auf EINE Spur (18,7px) —
     die H1 stand 18 Pixel schmal und brach Buchstabe fuer Buchstabe. */
  .c-articlehead__headline, .c-articlehead__meta, .c-articlehead__media { grid-column: 1 / -1; }
  .c-articlehead__media img { width: 100%; height: auto; aspect-ratio: 4 / 5; object-fit: cover; border-radius: 0.375rem; }
  /* Node 14355:24484: Koerper pad 48, gap 48 — Verzeichnis zuerst, dann der Text. */
  .c-articlebody { padding-block: 3rem; }
  /* Kein Sticky auf Touch: Verzeichnis und Promo laufen im normalen Fluss mit. */
  .c-articlebody__grid { display: flex; flex-direction: column; gap: 3rem; }
  .c-articlebody__toc, .c-articlebody__promo, .c-articlebody__main { grid-column: auto; width: 100%; }
  .c-articlebody__toc, .c-articlebody__promo { position: static; }
  .c-articlebody__toc-nav { gap: 0.5rem; }
  .c-ctacard { padding: 1.5rem; }
}

/* ===========================================================================================
   Kontakt-Kopf — „Contact // Section" (Client-File Node 21746:25944)
   Voll-Bleed Zweispalter: LINKS weiss (601), RECHTS graues Panel (823) das zum Viewport-Rand
   blutet. Grid-Ratio 601:823 hält beide Spalten proportional; align-items: stretch → gleiche
   Höhe, damit der graue Panel-Grund die volle Bandhöhe füllt. Padding-inline = --u-margin.
   =========================================================================================== */
.c-contact {
  display: grid;
  grid-template-columns: repeat(12, minmax(0, 1fr));      /* echtes 12er-Raster */
  gap: var(--u-gutter);
  width: calc(100% - var(--u-margin) * 2);                /* Content-Breite (= u-container), Ränder aussen */
  margin-inline: auto;
  background: var(--wp--preset--color--bg-primary);
  align-items: stretch;
}
/* Subgrid statt Flex-Stack (User 2026-08-05): Ueberschrift, Kontaktzeilen und Logo-Reihe sollen
   auf 4 der 5 Spalten enden, damit zwischen ihnen und dem grauen Panel eine Rasterspalte frei
   bleibt. Die Breite kommt damit aus dem Grid — keine `max-width`, keine nachgebaute
   Spaltenformel (css-grundregeln §3: Breite kommt aus dem Grid). */
.c-contact__intro {
  grid-column: 1 / span 5;                                /* linke Spalte = 5 Rasterspalten */
  display: grid; grid-template-columns: subgrid;
  align-content: center; justify-items: start;
  /* 🔴 NUR row-gap setzen. `gap: 7rem` wuerde auch den SPALTEN-Abstand auf 112px ziehen — ein
     Subgrid erbt die Tracks des Elterngrids, aber nicht automatisch dessen Gutter, und mit einem
     eigenen Spaltenabstand liegen die Spalten nicht mehr auf dem Raster (gemessen: span 4 ergab
     3,53 Rasterspalten statt glatt 4). */
  row-gap: 7rem;                                          /* 112 */
  column-gap: var(--u-gutter);
  padding-block: 8rem;                                    /* py generös (Node pt192/pb256); Rand liegt in der Content-Breite */
  /* 🔴 Kopfreserve. Die Kontakt-Seite hat als einzige gebaute Seite keinen der drei Koepfe (Hero,
     Page-Header, Artikel-Kopf) — und seit die Navbar `fixed` ist, reserviert nichts mehr ihren
     Platz. Der Breadcrumb lag damit unter der Pille (gemessen: 64 gegen Navbar-Unterkante 86).
     `--nav-h` + 64 statt einer festen Zahl: der Term sagt, worum es geht (Navbar freihalten, dann
     der Abstand aus dem Node), und folgt dem Token automatisch.
     ⚠️ Provisorium. Der Mobile-Frame zeichnet fuer Kontakt eine eigene `01 Hero // Section`
     (360x362, Node 13918:32997 › Kontakt / Formular // Mobile), die noch nicht gebaut ist. Ist sie
     da, traegt sie die Reserve wie ueberall sonst und diese Zeile faellt weg. */
  padding-block-start: max(8rem, calc(var(--nav-h) + 4rem));
}
/* Die Bloecke enden buendig auf Spalte 4 — die fuenfte bleibt Luft zum Panel. */
.c-contact__intro > * { grid-column: span 4; width: 100%; }
/* Kontaktdaten + Logo-Beleg als eine Einheit: eigener, deutlich engerer Abstand als der
   7rem-Rhythmus des Intros. Die Logos sollen an den Telefonzeilen kleben, nicht als dritter
   gleichwertiger Block wirken (User 2026-08-05). */
.c-contact__proof { display: flex; flex-direction: column; gap: 2rem; }
.c-contact__head { display: flex; flex-direction: column; gap: 1.5rem; }  /* 24 */
.c-contact__headline {
  font-family: var(--u-font-heading); font-weight: 500;
  font-size: var(--u-fs-h2); line-height: 1.0769em; letter-spacing: -0.03em;   /* 52/56 = H2 */
  color: var(--wp--preset--color--text-primary);
}
.c-contact__headline em { font-style: normal; color: var(--wp--preset--color--text-tertiary); }

/* Kontakt-Zeilen — bordered list, zwei gleiche Hälften (Titel | Wert) */
.c-contact__list { list-style: none; margin: 0; padding: 0; border-top: 0.0625rem solid var(--wp--preset--color--border-tertiary); }
.c-contact__item {
  display: flex; gap: 1rem; align-items: flex-start;
  padding: 0.625rem 0 0.625rem 0.5rem;                    /* py10 pl8 */
  border-bottom: 0.0625rem solid var(--wp--preset--color--border-tertiary);
}
.c-contact__item-title { flex: 1 0 0; min-width: 0; display: inline-flex; align-items: center; gap: 0.625rem; }
.c-contact__item-icon { width: 1.25rem; height: 1.25rem; flex: 0 0 auto; color: var(--wp--preset--color--text-primary); }
.c-contact__item-label { font-family: var(--u-font-body); font-weight: 500; font-size: var(--u-fs-body-small); line-height: 1.375rem; color: var(--wp--preset--color--text-secondary); }
.c-contact__item-value { flex: 1 0 0; min-width: 0; font-family: var(--u-font-body); font-weight: 500; font-size: var(--u-fs-body-small); line-height: 1.375rem; color: var(--wp--preset--color--text-primary); text-decoration: none; }
a.c-contact__item-value:hover { color: var(--wp--preset--color--text-accent); }

/* Anjas Zusatz — Kunden-Logo-Zeile + Bildunterschrift */
.c-contact__logos { display: flex; flex-direction: column; gap: 1rem; }
/* Kleinere Marquee-Fassung (anim-marquee.js setzt hier `flex-wrap: nowrap` und bewegt die Reihe).
   Randmaske als `mask-image` statt als weisser Verlauf wie bei `.c-logos__fade`: die Reihe steht
   hier nicht zwingend auf Weiss, eine eingefaerbte Ueberlagerung waere an den Grund gebunden.

   🔴 Die Maske sitzt auf dem VIEWPORT, nicht auf `.c-contact__logos` und nicht auf der Reihe:
   - am `.c-contact__logos`-Wrapper faerbte sie die Caption darunter mit aus (gemeldet 2026-08-05)
   - an der Reihe selbst waere sie mit dem Track mitgewandert, weil eine Maske im Koordinatensystem
     ihres eigenen Elements liegt. */
.c-contact__logos-viewport {
  overflow: hidden;
  /* 🔴 `min-width: 0` ist Pflicht: `anim-marquee.js` setzt die Reihe auf `nowrap`, damit waechst
     ihre Mindestbreite auf die Summe aller Logos. Ein Flex-Kind mit dem Standard `min-width: auto`
     gibt dieser Mindestbreite nach — der Viewport war dann breiter als der Container und schnitt
     nichts mehr ab. Nachgemessen bei 360: die Seite lief auf 371 heraus, Logos standen bis 675. */
  min-width: 0;
  /* Maskenbreite 10/90 wie bei harvey.ai (gemessen) — weicher als der erste Ansatz mit 6/94. */
  -webkit-mask-image: linear-gradient(90deg, transparent 0, #000 10%, #000 90%, transparent 100%);
          mask-image: linear-gradient(90deg, transparent 0, #000 10%, #000 90%, transparent 100%);
}
/* Spaltenabstand aus der harvey.ai-Referenz abgeleitet: dort 48px Luft bei 60px Logohoehe,
   also Verhaeltnis 0,8. Uebertragbar ist das VERHAELTNIS, nicht der Pixelwert — die Logos hier
   sind 1.75rem hoch → 0,8 × 1.75 = 1.4rem. (Vorher 2rem, das wirkte zu luftig.) */
.c-contact__logos-row { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; align-items: center; gap: 1.5rem 1.4rem; }
.c-contact__logo img { display: block; height: 1.75rem; width: auto; object-fit: contain; opacity: .8; }
.c-contact__logos-caption { font-family: var(--u-font-body); font-size: var(--u-fs-body-small); line-height: 1.5; color: var(--wp--preset--color--text-secondary); }

/* Graues Formular-Panel — rechte Spalte = 7 Rasterspalten, Grund blutet per negativer Margin zum Rand */
.c-contact__panel {
  grid-column: 6 / span 7;                                /* rechte Spalte = 7 Rasterspalten */
  margin-right: calc(-1 * var(--u-margin));               /* Bleed: Border-Box bis zum Viewport-Rand */
  background: var(--wp--preset--color--bg-tertiary);
  display: flex; flex-direction: column; justify-content: center;
  padding: 8rem var(--u-margin) 8rem 4rem;                /* pl64 (Node), pr=margin fängt den Bleed wieder ein */
}
.c-contact__form { display: flex; flex-direction: column; gap: 2.5rem; width: min(33.5833rem, 100%); }  /* 537,33; gap40 */
.c-contact__fields { display: flex; flex-direction: column; gap: 1.5rem; }  /* 24 */
.c-contact__row { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--u-gutter); }
.c-contact__field { display: flex; flex-direction: column; gap: 0.25rem; min-width: 0; }  /* gap4 */
.c-contact__label { font-family: var(--u-font-body); font-weight: 500; font-size: var(--u-fs-body-small); line-height: 1.375rem; color: var(--wp--preset--color--text-secondary); }
.c-contact__input {
  width: 100%; padding: 0.75rem; border-radius: 0.25rem;                 /* p12, radius4 */
  border: 0.0625rem solid var(--wp--preset--color--border-tertiary);
  background: var(--wp--preset--color--bg-primary);
  font-family: var(--u-font-body); font-weight: 500; font-size: var(--u-fs-body-small); line-height: 1.375rem;
  color: var(--wp--preset--color--text-primary);
}
.c-contact__input::placeholder { color: var(--wp--preset--color--text-primary); opacity: 1; }
.c-contact__input:focus { outline: none; border-color: var(--wp--preset--color--accent); box-shadow: 0 0 0 0.1875rem rgba(10,235,191,.25); }
.c-contact__input--area { min-height: 8rem; resize: vertical; }           /* min-h 128 */
.c-contact__meta { display: flex; gap: 1.25rem; align-items: flex-start; }  /* gap20 */
.c-contact__consent { flex: 1 0 0; min-width: 0; display: flex; gap: 0.625rem; align-items: flex-start; cursor: pointer; }
/* Die Consent-Checkbox nutzt die geteilte Komponente `.c-check__box` — eine native Checkbox
   zeichnet das Betriebssystem selbst und zeigte damit NICHT den Figma-Haken. */
.c-contact__consent-text, .c-contact__required { font-family: var(--u-font-body); font-weight: 500; font-size: var(--u-fs-body-tiny); line-height: 1.25rem; letter-spacing: -0.03em; color: var(--wp--preset--color--text-secondary); }
.c-contact__required { flex: 0 0 auto; white-space: nowrap; }
.c-contact__submit { align-self: flex-start; }

@media (max-width: 767px) {
  /* 🔴 `minmax(0, 1fr)`, nicht `1fr`: die Kurzform ist `minmax(AUTO, 1fr)` — die Spur waechst dann
     auf die Mindestbreite ihres breitesten Kindes. Genau das ist hier passiert, nachgemessen bei
     360px: die Sektion lief auf 918 heraus und riss Krumen, Headline und Panel mit. Hausregel. */
  .c-contact { grid-template-columns: minmax(0, 1fr); gap: 0; width: 100%; }   /* Stack, volle Breite (Ränder via Padding) */
  /* Die Kopfreserve muss hier MITGENANNT werden: das `padding`-Shorthand setzt auch
     `padding-block-start` und stuende sonst spaeter in der Datei als die Regel oben. */
  .c-contact__intro { grid-column: 1 / -1; gap: 3rem;
    padding: max(4rem, calc(var(--nav-h) + 2rem)) var(--u-margin) 3rem; }
  /* Das Raster ist hier einspaltig — `span 4` waere ein Ueberlauf. Volle Breite statt Rest-Spalte. */
  .c-contact__intro > * { grid-column: 1 / -1; }
  .c-contact__panel { grid-column: 1 / -1; margin-right: 0; padding: 3rem var(--u-margin) 3rem; }
  .c-contact__form { width: 100%; gap: 1.5rem; }   /* 24 (Node 14283:35303) */
  /* Kopf-Headline 32/32 (Node-Text 14283:34713) — hier stand die Desktop-52. */
  .c-contact__headline { font-size: 2rem; line-height: 2rem; letter-spacing: -0.06rem; }
}
@media (max-width: 767px) {   /* war 599 — auf die Mobile-Kante gezogen (ADR 0010 §1.2) */
  .c-contact__row { grid-template-columns: minmax(0, 1fr); }
  .c-contact__meta { flex-direction: column; gap: 0.75rem; }
}

/* ===========================================================================================
   Standorte-Teaser — „Location // Section" (Client-File Node 21746:25991)
   Weisser Grund, Schatten oben-links. LINKS 537er-Spalte (H2 oben, Liste+Button unten),
   RECHTS 759er-Kartenpanel (#e2e8f0, radius 8). Karte + Pins sind in % desselben Stage
   verankert → beide skalieren gemeinsam, Pins bleiben deckungsgleich mit ihren Städten.
   Städte-Liste ist bewusst NICHT verlinkt (keine Single-Pages laut Sitemap, MASTERPLAN „?").
   =========================================================================================== */
.c-locteaser { background: var(--wp--preset--color--bg-primary); padding: 5rem var(--u-margin); box-shadow: -0.25rem -0.25rem 2rem 0 rgba(0,0,0,0.05); }
.c-locteaser__inner { display: grid; grid-template-columns: repeat(12, minmax(0, 1fr)); gap: var(--u-gutter); align-items: stretch; }
.c-locteaser__col { grid-column: 1 / span 5; display: flex; flex-direction: column; justify-content: space-between; gap: 3rem; }  /* 5 Rasterspalten */
.c-locteaser__headline {
  font-family: var(--u-font-heading); font-weight: 500;
  font-size: var(--u-fs-h2); line-height: 1.0769em; letter-spacing: -0.03em;   /* 52/56 = H2 */
  color: var(--wp--preset--color--text-primary);
}
.c-locteaser__headline em { font-style: normal; color: var(--wp--preset--color--text-tertiary); }
.c-locteaser__foot { display: flex; flex-direction: column; gap: 2rem; }        /* 32 */
.c-locteaser__list { list-style: none; margin: 0; padding: 0; }
.c-locteaser__item {
  padding: 0.625rem 0 0.625rem 0.5rem;                                          /* py10 pl8 */
  border-bottom: 0.0625rem solid var(--wp--preset--color--border-tertiary);
  font-family: var(--u-font-body); font-weight: 500; font-size: var(--u-fs-body-regular); line-height: 1.5;
  color: var(--wp--preset--color--text-primary);
}
.c-locteaser__cta { align-self: flex-start; }

/* Kartenpanel — die Europakarte liegt als grosses, verschobenes Bild im überlaufenden Stage */
.c-locteaser__map { grid-column: 6 / span 7; background: var(--wp--preset--color--text-quarternary); border-radius: 0.5rem; overflow: hidden; min-height: 25rem; }  /* 7 Rasterspalten */
.c-locteaser__map-stage { position: relative; width: 100%; height: 100%; min-height: inherit; overflow: hidden; }
.c-locteaser__map-img {
  position: absolute; max-width: none; pointer-events: none;
  width: 435.71%; height: 512.71%; left: -89.61%; top: -294.65%;               /* Europe-Container 3307×3589, Node-Transform */
}
.c-locteaser__pin { position: absolute; width: 1rem; height: 1rem; transform: translate(-50%, -50%); }
.c-locteaser__pin::before {
  content: ""; position: absolute; inset: 0; border-radius: 50%;
  background: var(--wp--preset--color--accent); opacity: 0.2;
}
.c-locteaser__pin-core {
  position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);
  width: 0.4167rem; height: 0.4167rem; border-radius: 50%;                      /* 6,667 */
  background: var(--wp--preset--color--accent);
}
/* 9 Pin-Positionen (Mitte in % des 759×700-Panels, 1:1 aus dem Node) */
.c-locteaser__pin--1 { left: 51.10%; top: 37.49%; }
.c-locteaser__pin--2 { left: 40.69%; top: 75.35%; }
.c-locteaser__pin--3 { left: 36.61%; top: 48.21%; }
.c-locteaser__pin--4 { left: 35.95%; top: 45.21%; }
.c-locteaser__pin--5 { left: 28.70%; top: 51.21%; }
.c-locteaser__pin--6 { left: 29.10%; top: 47.07%; }
.c-locteaser__pin--7 { left: 29.76%; top: 41.35%; }
.c-locteaser__pin--8 { left: 33.18%; top: 42.92%; }
.c-locteaser__pin--9 { left: 32.52%; top: 53.92%; }

@media (max-width: 767px) {
  .c-locteaser { padding: 3rem var(--u-margin); }
  .c-locteaser__inner { grid-template-columns: minmax(0, 1fr); gap: 2.5rem; }
  .c-locteaser__col { grid-column: 1 / -1; gap: 2rem; }
  /* 🔴 `min-height` UND `aspect-ratio` zusammen sind ein Ueberlauf: die Mindesthoehe treibt ueber
     das Verhaeltnis die BREITE. 20rem × 759/700 = 347 — plus Rand ergab das die gemessenen 371 bei
     360px Fenster. Das Verhaeltnis gewinnt, die Mindesthoehe faellt weg. */
  .c-locteaser__map { grid-column: 1 / -1; min-height: 0; aspect-ratio: 759 / 700; }
}

/* ===========================================================================================
   FAQ-Übersicht — „FAQ // Section" (Node 21745:25642) + Filter-Zeile (Node 21745:25547, y=450).
   Aufbau wie .c-faq (Headline 5 Sp. sticky + Liste 7 Sp.), zusätzlich volle Filter-Zeile oben
   und interaktives Accordion (Body immer im DOM, CSS blendet geschlossene aus).
   =========================================================================================== */
.c-faqover { position: relative; background: var(--wp--preset--color--bg-primary); padding-block: 6rem; }  /* 96 */

/* Filter-Zeile: volle Breite über dem Zweispalter, Pills links / Reset rechts */
.c-faqfilter { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 1rem; margin-bottom: 2.5rem; }
.c-faqfilter__group { display: inline-flex; align-items: center; gap: 0.25rem; }
.c-faqfilter__reset { flex: 0 0 auto; }

/* Zweispalter — identisch zu .c-faq. `__head` wrapt Headline + optionalen „Alle FAQs"-Link
   (Einbettungen ausserhalb /faqs/, ADR 0007) — beide muessen gemeinsam sticky mitlaufen. */
.c-faqover__body { align-items: start; }
.c-faqover__head {
  /* 2 Spalten (User, 2026-08-03) — der Node umbricht die Headline dreizeilig („FAQs zu /
     unserem / Ansatz"); mit 5 Spalten wie in `.c-faq` blieb sie zweizeilig. Der Umbruch kommt
     ausschliesslich aus der Spaltenbreite, nicht aus manuellen Zeilenumbruechen. */
  grid-column: span 2; align-self: start; position: sticky; top: var(--sticky-top);
  display: flex; flex-direction: column; align-items: flex-start; gap: 1.5rem;   /* 24 */
}
.c-faqover__headline {
  font-family: var(--u-font-heading); font-weight: 500;
  font-size: var(--u-fs-h2); line-height: 3.5rem; letter-spacing: -0.0975rem;   /* 52/56/-1,56 */
  color: var(--wp--preset--color--text-primary);
}
.c-faqover__headline em { font-style: normal; color: var(--wp--preset--color--text-tertiary); }
.c-faqover__list { grid-column: 6 / span 7; }

/* Antwort ist jetzt Rich-Text (post_content, ADR 0007) statt eines einzelnen <p> — Absätze
   brauchen daher einen expliziten Abstand zueinander (voher lieferte das Flex-`gap` auf
   `.c-accordion__body` das gratis, weil <p> und CTA-Button direkte Geschwister waren). */
.c-accordion__answer p + p { margin-top: 0.75rem; }
.c-accordion__answer a { color: var(--wp--preset--color--text-accent); }

/* 🔴 Hier stand ein `display:none` fuer geschlossene Antworten in `.c-faqover`. Es ist mit
   Backlog #15 ENTFALLEN: ein Element ohne Box hat keine Hoehe, die man animieren koennte — die
   Timeline waere auf der FAQ-Uebersicht als einziger Flaeche wirkungslos gewesen. Das Ein- und
   Ausklappen macht jetzt ueberall `anim-accordion.js` (Hoehe + `hidden`), der Grundzustand ohne
   JS ist bewusst OFFEN.

   Ebenfalls entfallen: der Plus/Minus-Swap per `display`. Beide Zustaende liegen jetzt als
   Pfade im selben SVG (`ignite_icon('accordion-toggle')`) und werden gemorpht — ein
   `display`-Wechsel kann per Konstruktion nicht morphen. */

@media (max-width: 767px) {
  /* 48 — Mobil-Node 14408:27642 pad 48/24 (= Tabellenzeile 80→48 des NEUEN Desktop-pads 80;
     gebauter Desktop bleibt bei 96 → Festwert mit Quellkommentar statt Token, Vorrang-Kette #3:
     `--u-s-80` hiesse „80" und stuende im Tablet-Band auf 80). Vorher 4rem ohne Node-Quelle. */
  .c-faqover { padding-block: 3rem; }
  .c-faqover__head, .c-faqover__list { grid-column: 1 / -1; }
  .c-faqover__head { position: static; }
  /* Headline→Liste 32 (Node 14408:30545 gap 32). NUR row-gap — der Body ist Rastertraeger,
     `gap` wuerde den 8er-Gutter verstellen (css-grundregeln §3). */
  .c-faqover__body { row-gap: 2rem; }
  .c-faqover__headline { font-size: 1.625rem; line-height: 2rem; letter-spacing: -0.0488rem;   /* Figma Mobil-H3 26/32, ls -3% — vom neuen Node 14408:30477 bestaetigt (26/32 ls-0,78 w500) */ }
}

/* ===========================================================================================
   Downloads — „Downloads Übersicht" (/resource, Client-File Node 21481:10503)
   Filter-Pills (Format + Count) · Suche (Underline) · Grid/List-Toggle · 3-Spalten-Karten.
   Werte 1:1 aus dem Node (G1). Karten = c-download-card (Tag + Meta + H3 + Body + Download-Link).
   =========================================================================================== */
.c-downloads { padding-block: 0 6rem; }
.c-downloads__inner { display: flex; flex-direction: column; gap: 2rem; }

/* Leiste: links Pills (flex-1), rechts Tools (Suche + Ansicht, flex-1, rechtsbündig) */
.c-downloads__bar { display: flex; align-items: center; gap: 1rem; }
.c-downloads__filters { flex: 1 1 auto; display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem; }  /* gap 8 */
.c-downloads__pill {
  display: inline-flex; align-items: center; gap: 0.375rem;                    /* 6 */
  padding: 0.5rem 0.625rem; border-radius: 0.375rem;                           /* py8 px10, radius6 */
  border: 0.0625rem solid rgba(30,6,61,0.05);
  background: var(--wp--preset--color--bg-tertiary);
  font-family: var(--u-font-body); font-weight: 500; font-size: var(--u-fs-body-small); line-height: 1.375rem;
  color: var(--wp--preset--color--text-primary); cursor: pointer;
}
.c-downloads__pill-count { color: var(--wp--preset--color--text-tertiary); }
.c-downloads__pill--active { background: var(--wp--preset--color--accent); border-color: var(--wp--preset--color--accent); }
.c-downloads__pill--active .c-downloads__pill-count { color: var(--wp--preset--color--text-primary); opacity: 0.6; }
.c-downloads__clear {
  display: inline-flex; align-items: center; justify-content: center;
  width: 2.25rem; height: 2.25rem; padding: 0.5rem; border-radius: 0.375rem;   /* 36×36 */
  border: 0.0625rem solid rgba(30,6,61,0.05); background: var(--wp--preset--color--accent); cursor: pointer;
}
.c-downloads__clear-icon { width: 1.25rem; height: 1.25rem; color: var(--wp--preset--color--text-primary); }

/* Tools rechts */
.c-downloads__tools { flex: 1 1 auto; display: flex; align-items: center; justify-content: flex-end; gap: 1rem; }
.c-downloads__search {
  flex: 1 1 16rem; display: flex; align-items: center; gap: 1rem;              /* Underline-Feld */
  padding: 0.5rem 0.75rem; border-bottom: 0.0625rem solid var(--wp--preset--color--border-tertiary);
}
.c-downloads__search-icon { width: 1.25rem; height: 1.25rem; flex: 0 0 auto; color: var(--wp--preset--color--text-accent); }
.c-downloads__search-input {
  flex: 1 1 auto; min-width: 0; border: 0; background: none;
  font-family: var(--u-font-body); font-weight: 500; font-size: var(--u-fs-body-small); line-height: 1.375rem;
  color: var(--wp--preset--color--text-primary);
}
.c-downloads__search-input::placeholder { color: var(--wp--preset--color--text-accent); opacity: 1; }
.c-downloads__search-input:focus { outline: none; }
/* .c-downloads__views/__view ersetzt durch die gemeinsame `.c-viewtoggle` (Backlog #22, unten). */

/* Karten-Raster (3 Spalten, gutter 16 in beide Richtungen) */
/* Backlog #28: das Raster ist das 12er-Raster, die Karte belegt 4 Spalten (Node 21481:10503:
   Karte 426,67 breit = 4 Spalten, drei nebeneinander fuellen die 1312 Content-Breite exakt).
   Bewusst `grid-column: span 4` statt `repeat(3, 1fr)` — die Breite kommt aus dem Raster, nicht
   aus einer nachgebauten Spaltenformel (Layout-Regel §3, tools/check_css.py prueft das). */
.c-downloads__grid {
  list-style: none; margin: 0; padding: 0;
  display: grid; grid-template-columns: repeat(12, minmax(0, 1fr)); gap: var(--u-gutter);
}
.c-downloads__grid > .c-download-card { grid-column: span 4; }
.c-download-card {
  display: flex; background: var(--wp--preset--color--bg-tertiary);
  border: 0.0625rem solid var(--wp--preset--color--border-tertiary); border-radius: 0.5rem;
  padding: 0.375rem; overflow: hidden;                                          /* äusseres 6px */
  aspect-ratio: 1;                                       /* Node: 426,67 x 426,72 = quadratisch */
}
.c-download-card__body { flex: 1; display: flex; flex-direction: column; justify-content: space-between; gap: 2.5rem; padding: 1.25rem; }  /* inner 20, gap40 → Link unten */
.c-download-card__top { display: flex; flex-direction: column; gap: 1.25rem; }  /* 20 */
.c-download-card__head { display: flex; flex-wrap: wrap; align-items: center; gap: 0.625rem; }  /* 10 */
.c-download-card__tag {
  display: inline-flex; align-items: center; padding: 0.375rem 0.5rem; border-radius: 0.25rem;
  border: 0.0625rem solid rgba(30,6,61,0.08); background: rgba(30,6,61,0.05);
  font-family: var(--u-font-body); font-size: var(--u-fs-body-tiny); line-height: 1; letter-spacing: 0;
  text-transform: uppercase; color: var(--wp--preset--color--text-primary);
}
.c-download-card__meta { display: flex; flex-wrap: wrap; align-items: center; gap: 0.375rem;
  font-family: var(--u-font-body); font-weight: 500; font-size: var(--u-fs-body-small); line-height: 1.375rem; color: var(--wp--preset--color--text-primary); }
.c-download-card__sep { color: var(--wp--preset--color--text-tertiary); }
.c-download-card__text { display: flex; flex-direction: column; gap: 0.625rem; }  /* 10 */
.c-download-card__title { font-family: var(--u-font-heading); font-weight: 500; font-size: var(--u-fs-h3); line-height: 1.2222em; letter-spacing: -0.03em; color: var(--wp--preset--color--text-primary); }
.c-download-card__desc { font-family: var(--u-font-body); font-weight: 400; font-size: var(--u-fs-body-regular); line-height: 1.5; letter-spacing: -0.03em; color: var(--wp--preset--color--text-secondary); }
.c-download-card__link { display: inline-flex; align-items: center; gap: 0.875rem; align-self: flex-start;  /* 14 */
  font-family: var(--u-font-body); font-weight: 500; font-size: var(--u-fs-body-small); line-height: 1.375rem;
  color: var(--wp--preset--color--text-accent); text-decoration: none; }
.c-download-card__link-icon { width: 1.25rem; height: 1.25rem; flex: 0 0 auto; }
/* Hover = Unterstrich-Reveal ueber die ganze Karte (anim-links.js). Als `::after`-Grundzustand
   fuer den Fall ohne JS; `text-decoration` waere hier falsch, weil `has-underline-js` nur
   Pseudo-Elemente abschaltet und sonst zwei Linien uebereinander laegen. Die Linie sitzt nur
   unter dem Text, nicht unter dem Download-Icon — deshalb `right`-Anschlag ueber das Label. */
.c-download-card__link { position: relative; }
.c-download-card:hover .c-download-card__link::after,
.c-download-card__link:focus-visible::after { right: 0; }
.c-download-card__link::after {
  content: ""; position: absolute; left: 0; right: 100%; bottom: -0.125rem;
  height: max(1px, 0.0625rem); background: currentColor;
  transition: right var(--u-dur-fast) var(--u-ease);
}

.c-downloads__empty { font-family: var(--u-font-body); font-size: var(--u-fs-body-regular); color: var(--wp--preset--color--text-secondary); }
.c-downloads__reset-link { background: none; border: 0; padding: 0; color: var(--wp--preset--color--text-accent); cursor: pointer; font: inherit; text-decoration: underline; }

/* Listen-Ansicht — eine Spalte, Karte als Zeile (Titel + Meta links, Link rechts, Body aus).
   Zustand haengt am `data-view` der Sektion (gehaertete Mechanik 2026-08-15, wie Grants/Articles). */
/* Listen-Ansicht: volle Zeile statt 4 Spalten, und das Quadrat faellt weg (eine Zeile ist flach). */
.c-downloads[data-view="list"] .c-downloads__grid > .c-download-card { grid-column: 1 / -1; aspect-ratio: auto; }
.c-downloads[data-view="list"] .c-download-card__body { flex-direction: row; align-items: center; justify-content: space-between; gap: 1.5rem; }
.c-downloads[data-view="list"] .c-download-card__top { flex-direction: row; align-items: center; gap: 1.5rem; flex: 1; }
.c-downloads[data-view="list"] .c-download-card__desc { display: none; }
.c-downloads[data-view="list"] .c-download-card__title { font-size: var(--u-fs-h5); line-height: 1.25; }

@media (max-width: 767px) {
  /* Raster bleibt 12-spaltig, nur der Span waechst: 6 = zwei Karten pro Zeile. */
  .c-downloads__grid > .c-download-card { grid-column: span 6; }
  .c-downloads__bar { flex-wrap: wrap; }
  .c-downloads__tools { flex-basis: 100%; justify-content: flex-start; }
}
@media (max-width: 767px) {   /* war 599 — auf die Mobile-Kante gezogen (ADR 0010 §1.2) */
  /* Eine Karte pro Zeile; das Quadrat faellt weg, sonst wird sie auf schmal absurd hoch. */
  .c-downloads__grid > .c-download-card { grid-column: 1 / -1; aspect-ratio: auto; }
  .c-downloads[data-view="list"] .c-download-card__body { flex-direction: column; align-items: flex-start; gap: 1rem; }
  .c-downloads[data-view="list"] .c-download-card__top { flex-direction: column; align-items: flex-start; gap: 0.625rem; }
}

/* [hidden] muss die eigenen display-Regeln der Buttons schlagen — sonst zeigen alle Pills ihr
   ×-Segment und „Filter zurücksetzen" dauerhaft (UA-[hidden] hat zu niedrige Spezifität). */
.c-faqfilter [hidden] { display: none !important; }

/* [hidden] muss die display-Regeln der Cards überstimmen (JS-Filter blendet per hidden-Attribut) */
.c-download-card[hidden], .c-downloads__grid [hidden], .c-downloads__empty[hidden] { display: none !important; }

/* ── Kontaktformular: Verdrahtung (ADR 0006) ────────────────────────────────────────────────
   Honeypot: NICHT `display:none` — manche Bots ueberspringen genau das und fuellen nur
   sichtbare Felder. Stattdessen aus dem Viewport schieben; `tabindex=-1` + `aria-hidden`
   im Markup halten Tastatur und Screenreader fern. */
.c-contact__hp { position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden; }
.c-contact__error {
  font-family: var(--u-font-body); font-size: var(--u-fs-body-tiny); line-height: 1.25rem;
  color: var(--wp--preset--color--status-error);
}
.c-contact__input[aria-invalid="true"] { border-color: var(--wp--preset--color--status-error); }
.c-contact__consent-wrap { flex: 1 0 0; min-width: 0; display: flex; flex-direction: column; gap: 0.375rem; }
.c-contact__status {
  font-family: var(--u-font-body); font-size: var(--u-fs-body-regular); line-height: 1.5;
  padding: 0.75rem 1rem; border-radius: 0.25rem;
}
.c-contact__status.is-success {
  color: var(--wp--preset--color--text-primary);
  background: var(--wp--preset--color--accent);
}
.c-contact__status.is-error {
  color: var(--wp--preset--color--status-error);
  background: var(--wp--preset--color--bg-primary);
  border: 0.0625rem solid var(--wp--preset--color--status-error);
}
/* `[hidden]` muss die Flex/Block-Regeln der eigenen Elemente schlagen (gleiche Ursache wie
   beim FAQ-Filter: UA-[hidden] hat zu niedrige Spezifitaet). */
.c-contact [hidden] { display: none !important; }
/* Turnstile laeuft im Managed-Modus unsichtbar (ADR 0006 §2): die Challenge erscheint nur bei
   Verdacht. Solange keine sichtbare Challenge laeuft, darf der Container KEINEN Platz belegen —
   sonst entsteht der Layout-Shift, den das CLS-0-Ziel der RFP verbietet, und im Formular klafft
   eine Luecke, die das Figma nicht vorsieht.
   ⚠️ `:empty` allein genuegt NICHT: Turnstile legt sofort ein Wrapper-<div> mit dem versteckten
   Token-Input an (gemessen: 69,5px hoch, obwohl optisch nichts zu sehen ist). Erst eine echte
   Challenge erzeugt ein <iframe> — genau darauf prueft die zweite Regel. */
.c-contact .cf-turnstile:empty { display: none; }
.c-contact .cf-turnstile:not(:has(iframe)) { display: none; }

/* ===========================================================================================
   Advantage Ignite — „04 Advantage // Section" (Concept-File Node 13918:37651)
   Dunkles Panel (bg-alternate, radius 16, 16px eingerückt): H2 + 4 Vorteils-Karten (4 Themen)
   + Praxisbeispiel-Zweispalter. Werte 1:1 aus dem Node (G1).
   =========================================================================================== */
.c-advantage { padding: 1rem; }
.c-advantage__panel {
  background: var(--wp--preset--color--bg-alternate); border-radius: 1rem;
  padding: 6rem 3rem;                                   /* 96 / 48 */
  display: flex; flex-direction: column; gap: 6rem;      /* 96 */
}
.c-advantage__headline {
  font-family: var(--u-font-heading); font-weight: 500;
  font-size: var(--u-fs-h2); line-height: 1.0769em; letter-spacing: -0.03em;   /* 52/56 */
  color: var(--wp--preset--color--text-alternate);
}

/* 4 Vorteils-Karten */
.c-advantage__cards {
  list-style: none; margin: 0; padding: 0;
  display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--u-gutter);
  filter: drop-shadow(0 0 1.03rem rgba(10,235,191,0.11));   /* Mint-Glow */
}
.c-advantage__card {
  min-height: 24.6875rem;                                /* 395 */
  border-radius: 0.5rem; padding: 1.625rem 1.625rem 2rem;  /* 26/26/32 */
  display: flex; flex-direction: column; justify-content: space-between; gap: 2rem;
  overflow: hidden; border: 0.0625rem solid transparent;
}
.c-advantage__badge {
  display: inline-flex; align-items: center; justify-content: center; flex: 0 0 auto;
  width: 3.3333rem; height: 3.3333rem; border-radius: 50%;   /* 53,33 */
  border: 0.0625rem solid transparent;
}
.c-advantage__badge-icon { width: 1.25rem; height: 1.25rem; }
.c-advantage__card-text { display: flex; flex-direction: column; gap: 2rem; }   /* 32 */
.c-advantage__card-head { display: flex; flex-direction: column; gap: 0.625rem; }  /* 10 */
.c-advantage__card-label { font-family: var(--u-font-body); font-weight: 500; font-size: var(--u-fs-body-tiny); line-height: 1; letter-spacing: 0; text-transform: uppercase; }
.c-advantage__card-title { font-family: var(--u-font-heading); font-weight: 500; font-size: var(--u-fs-h4); line-height: 1.2143em; letter-spacing: -0.01em; }  /* 28/34 */
.c-advantage__card-body { font-family: var(--u-font-body); font-weight: 400; font-size: var(--u-fs-body-regular); line-height: 1.5; letter-spacing: -0.03em; }

/* Themen */
.c-advantage__card--light { background: var(--wp--preset--color--bg-tertiary); border-color: rgba(226,232,240,.4); }
.c-advantage__card--light .c-advantage__badge { background: rgba(30,6,61,.1); border-color: rgba(30,6,61,.08); color: var(--wp--preset--color--text-primary); }
.c-advantage__card--light .c-advantage__card-label,
.c-advantage__card--light .c-advantage__card-body { color: var(--wp--preset--color--text-secondary); }
.c-advantage__card--light .c-advantage__card-title { color: var(--wp--preset--color--text-primary); }

.c-advantage__card--white { background: var(--wp--preset--color--bg-primary); border-color: var(--wp--preset--color--border-tertiary); }
.c-advantage__card--white .c-advantage__badge { background: var(--wp--preset--color--accent); border-color: rgba(30,6,61,.05); color: var(--wp--preset--color--text-primary); }
.c-advantage__card--white .c-advantage__card-label,
.c-advantage__card--white .c-advantage__card-body { color: var(--wp--preset--color--text-secondary); }
.c-advantage__card--white .c-advantage__card-title { color: var(--wp--preset--color--text-primary); }

.c-advantage__card--mint { background: var(--wp--preset--color--accent); border-color: rgba(10,235,191,.4); }
.c-advantage__card--mint .c-advantage__badge { background: rgba(30,6,61,.1); border-color: rgba(30,6,61,.1); color: var(--wp--preset--color--text-primary); }
.c-advantage__card--mint .c-advantage__card-label { color: var(--wp--preset--color--text-primary); opacity: .6; }
.c-advantage__card--mint .c-advantage__card-title { color: var(--wp--preset--color--text-primary); }
.c-advantage__card--mint .c-advantage__card-body { color: var(--wp--preset--color--text-primary); opacity: .6; }

.c-advantage__card--darkgrey { background: var(--wp--preset--color--surface-darkgrey); border-color: rgba(71,85,105,.4); }
.c-advantage__card--darkgrey .c-advantage__badge { background: rgba(7,235,191,.1); border-color: rgba(7,235,191,.15); color: var(--wp--preset--color--accent); }
.c-advantage__card--darkgrey .c-advantage__card-label { color: var(--wp--preset--color--text-alternate); opacity: .6; }
.c-advantage__card--darkgrey .c-advantage__card-title { color: var(--wp--preset--color--text-alternate); }
.c-advantage__card--darkgrey .c-advantage__card-body { color: var(--wp--preset--color--text-alternate); opacity: .8; }

/* Praxisbeispiel-Zweispalter (Text | Bild-Quadrat).
   Seit dem Mobil-Umbau (Auftrag 2026-08-15-grow-partner-mobile, S3) liegen Eyebrow + Bild als
   `ex-figure`-Gruppe im Markup (der Mobil-Node stellt beide VOR den Text). Auf Desktop ist die
   Gruppe `display: contents` und die drei Teile werden einzeln platziert — row-gap 10 ersetzt
   das fruehere Kopf-gap (Eyebrow→Titel 10), Geometrie 1:1 wie vor dem Umbau (gemessen 1440:
   Eyebrow y2203 · Titel y2237 · Body y2313 · Buttons unten buendig · Bild 608x608 rechts). */
.c-advantage__example {
  display: grid; grid-template-columns: repeat(2, minmax(0, 1fr));
  grid-template-rows: auto minmax(0, 1fr);
  column-gap: 6rem; row-gap: 0.625rem; align-items: stretch;
}
.c-advantage__ex-figure { display: contents; }
.c-advantage__ex-eyebrow { grid-column: 1; grid-row: 1; }
.c-advantage__ex-text { grid-column: 1; grid-row: 2; }
.c-advantage__ex-media { grid-column: 2; grid-row: 1 / span 2; }
.c-advantage__ex-text { display: flex; flex-direction: column; justify-content: space-between; gap: 2.5rem; }
.c-advantage__ex-content { display: flex; flex-direction: column; gap: 1.25rem; }   /* 20 */
.c-advantage__ex-head { display: flex; flex-direction: column; gap: 0.625rem; }      /* 10 */
.c-advantage__ex-eyebrow { font-family: var(--u-font-body); font-weight: 400; font-size: var(--u-fs-body-regular); line-height: 1.5; letter-spacing: -0.03em; color: var(--wp--preset--color--text-quarternary); }
.c-advantage__ex-title { font-family: var(--u-font-heading); font-weight: 500; font-size: var(--u-fs-h2); line-height: 1.0769em; letter-spacing: -0.03em; color: var(--wp--preset--color--text-alternate); }
.c-advantage__ex-body { font-family: var(--u-font-body); font-weight: 400; font-size: var(--u-fs-body-medium); line-height: 1.4444em; letter-spacing: -0.03em; color: var(--wp--preset--color--text-quarternary); width: min(26.6667rem, 100%); }
.c-advantage__ex-actions { display: flex; flex-wrap: wrap; gap: 0.875rem; }          /* 14 */
.c-advantage__ex-media { border-radius: 0.5rem; overflow: hidden; aspect-ratio: 1 / 1; }
.c-advantage__ex-media img { width: 100%; height: 100%; object-fit: cover; display: block; }

@media (max-width: 767px) {
  .c-advantage__panel { padding: 3rem 1.5rem; gap: 3rem; }
  .c-advantage__cards { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .c-advantage__card { min-height: 20rem; }
  .c-advantage__example { grid-template-columns: minmax(0, 1fr); gap: 2rem; }
  .c-advantage__ex-media { aspect-ratio: 16 / 10; }
}
@media (max-width: 767px) {   /* war 599 — auf die Mobile-Kante gezogen (ADR 0010 §1.2) */
  .c-advantage__cards { grid-template-columns: 1fr; }
  .c-advantage__card { min-height: 0; }
  .c-advantage__headline, .c-advantage__ex-title { font-size: 1.625rem; line-height: 2rem; letter-spacing: -0.0488rem;   /* Figma Mobil-H3 26/32, ls -3% */ }
}

/* ═══════════════════════════════════════════════════════════════════════════════════════════
   CTA — Variante `plain` (Concept-Node 13918:34712, User-Klärung 2026-07-30)
   Kontakt und FAQs nutzen NICHT die getönte Karte, sondern einen weissen Grund, auf dem die
   Bilder direkt streuen. Nur die Bühne aendert sich, Inhalt und Bild-Groessen bleiben gleich.
   ⚠️ Eigene Positionswerte noetig: die getoente Karte ist 1408 breit (1440 − 2×16 Einrueckung),
   die weisse Buehne volle 1440 — dieselben Figma-Koordinaten ergeben also andere Prozente.
   ═══════════════════════════════════════════════════════════════════════════════════════════ */
.c-cta--plain { padding: 0; }                          /* keine 16er-Einrueckung → Buehne = Sektion */
.c-cta--plain .c-cta__card {
  background: transparent; border-radius: 0;           /* Karte verschwindet, Grund bleibt weiss */
  padding: 6rem var(--u-margin);                       /* py96 / px = Seitenrand (Node: 64) */
  min-height: 43rem;                                   /* 688 — Node-Hoehe, Raum fuer die Streuung */
  gap: 2rem;                                           /* 32 (Node) statt 64 */
}
/* Zweite Headline-Zeile ist hier text-secondary (#786a8b), nicht text-tertiary wie in der
   getoenten Variante — steht so im Node, deshalb bewusst nur fuer `plain` ueberschrieben. */
.c-cta--plain .c-cta__headline em { color: var(--wp--preset--color--text-secondary); }
/* Fuenfter Fall der hyphens-Familie (c-hero--card, Kopf-H1, FAQ-Frage): `auto` trennte mobil
   „schlau-er" zum Zeilenfuellen; der CTA-Node bricht an Leerzeichen (Text 312x126 = 2+1 Zeilen).
   Scoped auf plain (Auftrags-Scope faq-mobile); Standard-CTA als Nebenbefund notiert. */
.c-cta--plain .c-cta__headline { hyphens: manual; }
/* Die weisse Buehne ist so breit wie die Seite und nutzt denselben Seitenrand — ihr Spaltenmass
   IST damit das globale Raster. Also `--u-col` benutzen statt die Formel zu duplizieren
   (die getoente Karte braucht ihre eigene, weil sie 16px schmaler ist und 48er-Polsterung hat). */
.c-cta--plain .c-cta__img { --cta-col: var(--u-col); }
/* Positionen 1:1 aus dem Node, left in % der 1440er Buehne, top in px ab Buehnenoberkante */
.c-cta--plain .c-cta__img--1 { left:  4.4340%; top: 194.7px; }
.c-cta--plain .c-cta__img--2 { left: 81.4479%; top: 437.7px; }
.c-cta--plain .c-cta__img--3 { left: 73.6007%; top: 142.7px; }
.c-cta--plain .c-cta__img--4 { left: 22.9062%; top: 484.7px; }
.c-cta--plain .c-cta__img--5 { left: 85.3368%; top:  87.5px; }
.c-cta--plain .c-cta__img--6 { left: 16.7956%; top: -128.3px; }   /* oben angeschnitten */
/* Wie viele Bilder erscheinen, steuert die Anzahl im Block (Kontakt-Node: 5, FAQ-Node: 6) —
   NICHT das CSS. So bleibt dieselbe Optik fuer Sektionen mit unterschiedlich vielen Bildern. */

@media (max-width: 767px) {
  /* SETZUNG (Auftrag 2026-08-15-faq-mobile, S3): fuer `plain` existiert NIRGENDS ein
     Mobil-Frame — die FAQ- und Kontakt-Mobil-Frames zeichnen beide die Standard-Karten-CTA
     (624er-Figur). Struktur daher komplett von der naechstverwandten Sektion MIT Frame
     uebernommen (Standard-CTA mobil, Node 14068:26674): Buehne 608 hoch, Inhalt mittig,
     gap 48, Streubilder auf den Mobil-Positionen. Vorher: min-height 0 + Desktop-Tops der
     plain-Regeln (0,2,0 schlaegt die Mobil-Basis 0,1,0) — Bilder liefen aus der Sektion und
     ueber beide Buttons. Seitenrand 24 statt Karten-16, damit der Text wie gezeichnet 312
     misst (Buehne ist 360 statt 344 breit); lefts = dieselben gezeichneten px, in % der
     360er-Buehne (-31 · 278 · 18 · 202 · 94 · 122). */
  .c-cta--plain .c-cta__card { min-height: 38rem; padding: 1rem 1.5rem; gap: 3rem; }
  .c-cta--plain .c-cta__img--1 { left: -8.611%; top: 1.6875rem; }
  .c-cta--plain .c-cta__img--2 { left: 77.222%; top: 22.8125rem; }
  .c-cta--plain .c-cta__img--3 { left: 5%;      top: 27.0625rem; }
  .c-cta--plain .c-cta__img--4 { left: 56.111%; top: 2.875rem; }
  .c-cta--plain .c-cta__img--5 { left: 26.111%; top: 33.5625rem; }
  .c-cta--plain .c-cta__img--6 { left: 33.889%; top: -3.0625rem; }
}

/* ===========================================================================================
   Gründe/Spalten — „Intro // Section" (Concept-File Node 13918:37635 / 37820)
   Eyebrow (dunkel) + 3 Spalten mit vertikaler Trennlinie links, großem H3-Titel oben und Body
   weit darunter. Statt des fixen 176px-Gaps aus dem Node: min-height + space-between → Bodys
   richten sich robust auf einer Linie aus (auch bei 1-zeiligen Titeln). Werte sonst 1:1 (G1).
   =========================================================================================== */
.c-reasons { padding-block: 5rem 7rem; }                       /* pt80 / pb112 */
.c-reasons > .u-container { display: flex; flex-direction: column; gap: 6rem; }   /* 96 */
.c-reasons__eyebrow { font-family: var(--u-font-body); font-weight: 400; font-size: var(--u-fs-body-regular); line-height: 1.5; letter-spacing: -0.03em; color: var(--wp--preset--color--text-primary); }
.c-reasons__cols { align-items: stretch; }
.c-reasons__col {
  grid-column: span 4; min-height: 21rem;                      /* 336 */
  display: flex; flex-direction: column; justify-content: space-between; gap: 2rem;
  border-left: 0.0625rem solid var(--wp--preset--color--border-tertiary);
  padding-left: 1.25rem;                                       /* 20 */
}
.c-reasons__col-title { font-family: var(--u-font-heading); font-weight: 500; font-size: var(--u-fs-h3); line-height: 1.2222em; letter-spacing: -0.03em; color: var(--wp--preset--color--text-primary); }
.c-reasons__col-body { font-family: var(--u-font-body); font-weight: 400; font-size: var(--u-fs-body-regular); line-height: 1.5; letter-spacing: -0.03em; color: var(--wp--preset--color--text-secondary); padding-right: 3rem; }  /* pr 48 */

@media (max-width: 767px) {
  .c-reasons { padding-block: 3rem 4rem; }
  .c-reasons__cols { row-gap: 2.5rem; }
  .c-reasons__col { grid-column: span 6; min-height: 0; gap: 1rem; padding-right: 0; }
}
@media (max-width: 767px) {   /* war 599 — auf die Mobile-Kante gezogen (ADR 0010 §1.2) */
  .c-reasons__col { grid-column: 1 / -1; }
}

/* Advantage — Panel-Variante HELL + Card-Theme „dark" + Logo-Strip (Partner-Vorteile, Node 13918:37859) */
.c-advantage--light .c-advantage__panel { background: var(--wp--preset--color--bg-tertiary); padding-bottom: 8rem; }  /* pb 128 */
.c-advantage--light .c-advantage__headline { color: var(--wp--preset--color--text-primary); }

.c-advantage__card--dark { background: var(--wp--preset--color--bg-alternate); border-color: rgba(248,250,252,.12); }
.c-advantage__card--dark .c-advantage__badge { background: rgba(7,235,191,.1); border-color: rgba(7,235,191,.15); color: var(--wp--preset--color--accent); }
.c-advantage__card--dark .c-advantage__card-label { color: var(--wp--preset--color--text-alternate); opacity: .6; }
.c-advantage__card--dark .c-advantage__card-title { color: var(--wp--preset--color--text-alternate); }
.c-advantage__card--dark .c-advantage__card-body { color: var(--wp--preset--color--text-alternate); opacity: .8; }

.c-advantage__logos { display: flex; flex-direction: column; align-items: center; gap: 6rem; padding: 2.5rem 5rem; }  /* gap96, py40 px80 */
.c-advantage__logos-head { display: flex; flex-direction: column; align-items: center; gap: 1.5rem; }  /* 24 */
.c-advantage__logos-title { font-family: var(--u-font-heading); font-weight: 500; font-size: var(--u-fs-h2); line-height: 1.0769em; letter-spacing: -0.03em; color: var(--wp--preset--color--text-primary); text-align: center; }
.c-advantage__logos-sub { font-family: var(--u-font-body); font-weight: 400; font-size: var(--u-fs-body-medium); line-height: 1.4; color: var(--wp--preset--color--text-secondary); text-align: center; }
.c-advantage__logos-row { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: 2rem 3.5rem; }  /* 56 */
.c-advantage__logo img { display: block; height: 2.3125rem; width: auto; object-fit: contain; opacity: .55; filter: grayscale(1); }  /* 37px, gemutet */

@media (max-width: 767px) {
  .c-advantage--light .c-advantage__panel { padding-bottom: 3rem; }
  .c-advantage__logos { padding: 1rem 0; gap: 2.5rem; }
  .c-advantage__logos-row { gap: 1.5rem 2rem; }
}

/* Intro-Spalten: untere Texte OBEN bündig (User 2026-07-30) — feste Titel-Höhe (2 Zeilen) + fixer
   Abstand statt space-between, damit alle Bodys auf gleicher Höhe beginnen (statt am Boden). */
.c-reasons__col { justify-content: flex-start; gap: 0; }
.c-reasons__col-title { min-height: 5.5rem; margin-bottom: 11rem; }   /* 88 (2 Zeilen) + 176 Abstand */
@media (max-width: 767px) {
  .c-reasons__col { gap: 1rem; }
  .c-reasons__col-title { min-height: 0; margin-bottom: 0; }
}

/* Delft — 10. Standort (User 2026-07-30), West-NL (Den Haag/Rotterdam-Raum, 52,01N 4,36E):
   südlich von Amsterdam, nördlich von Breda, westlich beider. */
.c-hero--locations .c-hero__pin--10 { left: 49.35vw; top: 36.63vw; }   /* Delft · 52,01N 4,36E — West-NL (Den Haag/Rotterdam) */

/* Headquarter-Tag im Karten-Popover — lila auf transparent (User: „im popover das lila mit transparent").
   margin-bottom hebt den 2rem-Flex-Gap des Popovers auf 0,5rem zum Stadtnamen an. */
.c-hero--locations .c-hero__pin-tag--hq {
  align-self: flex-start; margin-bottom: -1.5rem;
  display: inline-flex; align-items: center; padding: 0.25rem 0.5rem; border-radius: 0.25rem;
  background: rgba(117,59,189,0.14); color: var(--wp--preset--color--text-accent);
  font-family: var(--u-font-body); font-weight: 500; font-size: var(--u-fs-body-tiny); line-height: 1;   /* OS 600 gibt es in Figma nicht */
  letter-spacing: 0.02em; text-transform: uppercase;
}

/* Headquarter-Tag in der Location-Liste — Mint-Tag (c-tag--mint = Mint auf Weiß) neben dem Stadtnamen */
.c-location-card__city { display: flex; align-items: center; flex-wrap: wrap; gap: 0.75rem; }
.c-location-card__hq { flex: 0 0 auto; }

/* ============================================================= Ansicht-Umschalter (Backlog #22)
   EINE Komponente fuer Grants, Blog/News und Downloads — vorher drei unabhaengige Bauten
   (.c-grants__views / .c-articles__views / .c-downloads__views), die zwangslaeufig auseinander
   liefen. Werte 1:1 aus Node 21745:21030 „Ansicht": 83x44, radius 6, padding 2, zwei 40er-Felder
   mit itemSpacing −1 (sie ueberlappen um 1px) → 2 + 40 − 1 + 40 + 2 = 83.
   Der Thumb ist ein eigener Layer UNTER den Buttons; er faehrt, statt dass zwei Flaechen
   umgefaerbt werden — dadurch ist die Bewegung sichtbar und nicht nur ein Farbsprung.
   `.c-toggle` bleibt unangetastet: das ist der Formular-Schalter aus dem Styleguide, eine andere
   Komponente mit anderer Anatomie. */
.c-viewtoggle {
  position: relative; flex: 0 0 auto;
  display: inline-flex; align-items: center;
  height: 2.75rem; padding: 0.125rem;                       /* 44 / 2 */
  border-radius: 0.375rem;                                  /* 6 */
  background: var(--wp--preset--color--bg-tertiary);
}
/* „Auf weissem Grund grau hinterlegt, auf grauem Grund weiss" (Vorgabe Miguel). Die Blog/News-
   Buehne liegt auf bg-secondary, dort dreht sich die Spur um. `:where()` haelt die Spezifitaet
   bei 0 — sonst schluege dieser Kontext-Override spaeter im Stylesheet die Zustandsregeln. */
:where(.c-articles) .c-viewtoggle { background: var(--wp--preset--color--bg-primary); }
.c-viewtoggle__thumb {
  position: absolute; top: 0.125rem; left: 0.125rem; z-index: 0;
  width: 2.5rem; height: 2.5rem;                            /* 40 */
  border-radius: 0.25rem;                                   /* 4 */
  background: var(--wp--preset--color--accent);
  border: 0.0625rem solid rgba(30,6,61,0.05);
  transition: transform var(--u-dur-base) var(--u-ease);
}
/* 39 = 40 Feldbreite − 1 Ueberlappung (itemSpacing −1 im Node).
   Zustand kommt vom `data-view` der SEKTION (gehaertete Mechanik 2026-08-15) — dadurch steht
   der Thumb auch in einem frisch per fetch getauschten Schalter sofort richtig, ohne JS.
   Die Buttons tragen zwar selbst `data-view`, sind aber nie VORFAHR des Thumbs — der
   Nachfahren-Selektor kann sie nicht faelschlich treffen. */
[data-view="list"] .c-viewtoggle__thumb { transform: translateX(2.4375rem); }
.c-viewtoggle__btn {
  position: relative; z-index: 1;
  display: inline-flex; align-items: center; justify-content: center; flex: 0 0 auto;
  width: 2.5rem; height: 2.5rem; padding: 0.5rem;           /* 40 / 8 */
  background: none; border: 0; cursor: pointer;
  color: var(--wp--preset--color--text-primary);
}
.c-viewtoggle__btn + .c-viewtoggle__btn { margin-left: -0.0625rem; }   /* itemSpacing −1 */
/* Touch-Ziel >= 44x44 (Auftrag 2026-08-15 Punkt 3): die 40er-Felder aus dem Node bleiben
   sichtbar wie gezeichnet, die TREFFFLAECHE waechst unsichtbar um 2px je Seite ueber die
   Feldkante hinaus (40 + 2 + 2 = 44, deckt zugleich die 44er-Spur in der Hoehe).
   SETZUNG: an der Naht ueberlappen sich die beiden Flaechen um ~5px; dort gewinnt der spaetere
   Button im DOM (Liste). Der Bias liegt am Feldrand, die Icons (mittig, 20px) bleiben
   eindeutig — die Alternative (nur nach aussen wachsen) bliebe unter 44. */
.c-viewtoggle__btn::before { content: ""; position: absolute; inset: -0.125rem; }
.c-viewtoggle__btn svg { width: 1.25rem; height: 1.25rem; }            /* 20 */
.c-viewtoggle__btn:focus-visible { outline: 0.125rem solid var(--wp--preset--color--text-primary); outline-offset: -0.125rem; border-radius: 0.25rem; }
@media (prefers-reduced-motion: reduce) {
  .c-viewtoggle__thumb { transition: none; }
}

/* ============================================================= Silbentrennung (Backlog #31)
   Lange Komposita („Erfolgsgeschichten", „Compliance-Anforderungen") sprengen sonst schmale
   Spalten. Geloest wird das ueber die Sprache, NICHT ueber manuelle <br> — ein kopierter Umbruch
   sitzt nach jeder Uebersetzung an der falschen Stelle und bricht lautlos (Regel verschaerft
   2026-07-22: „Umbrueche entstehen ueber die Box-Breite").
   🔴 Voraussetzung ist ein korrektes `lang` am <html>: der Browser waehlt daran seine
   Trennmuster. Die Seite stand auf `en-US` und lieferte deutschen Text — englische Muster haetten
   an falschen Stellen getrennt. Site-Sprache deshalb auf de_DE gesetzt, `language_attributes()`
   gibt jetzt `lang="de"` aus. Sobald Polylang da ist, liefert es das pro Sprache.
   Bewusst auf Element-Ebene statt an Komponentenklassen: Trennung ist eine Eigenschaft des
   Textes, nicht einer einzelnen Sektion. Kurze Zeilen bleiben unberuehrt — `auto` trennt nur,
   wenn ein Wort sonst nicht passt. */
h1, h2, h3, h4, h5, h6 { hyphens: auto; }


/* ---- EINE Filter-Optik fuer alle Leisten (User 2026-08-05, Punkte 5 + 7) --------------------
   Nachgemessen unterschieden sich die drei Leisten in JEDER Dimension:
     Artikel/Webinare  40 hoch · radius 4 · padding 12/14 · 16px · aktiv mint
     Downloads         40      · radius 6 · padding  8/10 · 14px · aktiv mint
     FAQ               37      · radius 8 · padding  8/12 · 14px · aktiv NICHT unterscheidbar
   Die Artikel-Leiste ist die am Node verifizierte (Backlog #23/#24) und gibt den Ton an; die
   beiden anderen erben sie hier, statt eigene Werte zu pflegen.

   🔴 Steht bewusst am DATEIENDE: `.c-downloads__pill` und `.c-filter__chip` sind weiter oben
   mit gleicher Spezifitaet definiert. Beim ersten Versuch stand dieser Block davor und wurde
   lautlos ueberschrieben (nachgemessen: Downloads blieb bei radius 6 / 14px). Ein spaeterer Node-Fix an der
   Artikel-Leiste zieht damit automatisch mit. */
.c-downloads__pill,
.c-filter__chip {
  display: inline-flex; align-items: center; gap: 0.5rem;
  height: 2.5rem; padding: 0.75rem 0.875rem;                         /* 40 · 12/14 */
  border-radius: 0.25rem;                                            /* 4 */
  background: var(--wp--preset--color--bg-tertiary);
  border: 0.0625rem solid rgba(226,232,240,0.4);
  color: var(--wp--preset--color--text-primary);
  cursor: pointer; text-decoration: none;
}
/* 🔴 Die Schrift sitzt bei Grants und Blog NICHT am Chip, sondern am Label darin
   (`.c-articles__chip-label`, `.c-grants__chip`): 12/12, Weight 500, VERSALIEN. Der erste Anlauf
   setzte hier 16px direkt auf den Chip — die Box stimmte danach auf den Pixel, aber Downloads und
   FAQ lasen sich weiter voellig anders als ihre beiden Vorbilder (User 2026-08-07, im
   Vergleichs-Screenshot der vier Leisten sofort sichtbar). Beim FAQ-Chip steht der Text direkt
   im Knopf, bei Downloads in einem eigenen Label-Span — deshalb beide Selektoren. */
.c-downloads__pill-label,
.c-filter__chip {
  font-family: var(--u-font-body); font-weight: 500;
  font-size: 0.75rem; line-height: 0.75rem; text-transform: uppercase;   /* 12/12 */
}
/* Der Zaehler bleibt gemischt und groesser — 14/22 wie `.c-articles__chip-count`. */
.c-downloads__pill-count {
  font-family: var(--u-font-body); font-weight: 500;
  font-size: 0.875rem; line-height: 1.375rem; text-transform: none;      /* 14/22 */
}
/* Aktiv-Zustand: die FAQ-Chips hatten gar keinen sichtbaren (Grund wie passiv). */
.c-downloads__pill--active,
.c-filter__chip--active { background: var(--wp--preset--color--accent); border-color: rgba(30,6,61,0.05); }

/* Das X ist ueberall derselbe 40x40-Kasten. Bei den Downloads war es zusaetzlich kleiner —
   `.c-downloads__clear-icon` traegt jetzt dieselben 20px wie die anderen. */
.c-downloads__clear,
.c-filter__remove {
  display: inline-flex; align-items: center; justify-content: center; flex: 0 0 auto;
  width: 2.5rem; height: 2.5rem; padding: 0.625rem;                  /* 40 / 10 */
  border-radius: 0.25rem;
  background: var(--wp--preset--color--accent);
  border: 0.0625rem solid rgba(30,6,61,0.05);
  color: var(--wp--preset--color--text-primary); cursor: pointer;
}
.c-downloads__clear-icon,
.c-filter__remove svg { width: 1.25rem; height: 1.25rem; }           /* 20 */

/* `display: inline-flex` oben schlaegt das `display: none` des Browsers fuer `[hidden]` — ohne
   diese Zeile waeren alle Kategorie-X gleichzeitig sichtbar. */
/* Sechster und siebter Fall dieser Familie: beim FAQ waren nach der Vereinheitlichung ALLE
   fuenf X gleichzeitig sichtbar (User 2026-08-07). */
.c-downloads__clear[hidden],
.c-filter__remove[hidden] { display: none; }

/* ==========================================================================
   Breadcrumbs (Node 21745:21075) — EINE Leiste fuer Hero, Page-Header,
   Artikel-Kopf und Contact. Vorher vier Markups mit vier CSS-Baeumen, drei davon
   voneinander abweichend, keiner mit Hover.

   Werte am Node gezogen: gap 2, Krume pad 2/6, Text 14/22 Weight 500, Chevron 20x20,
   Farbe #786a8b (text-secondary) — auch fuer die letzte Krume.

   Hover: Farbe auf text-primary + Unterstrich. Kein Schatten (Hausregel), keine Flaeche —
   die Leiste sitzt in Heros direkt auf Bildern, wo eine Pille als Fremdkoerper wirkt.
   Die letzte Krume ist ein `<span>` und hat deshalb gar keinen Hover, ohne Extra-Regel.
   ========================================================================== */
.c-crumbs { display: flex; flex-wrap: wrap; align-items: center; gap: 0.125rem; }   /* 2 */
.c-crumb {
  display: inline-flex; align-items: center; padding: 0.125rem 0.375rem;            /* 2/6 */
  font-family: var(--u-font-body); font-weight: 500;
  font-size: var(--u-fs-body-small); line-height: 1.375rem;                         /* 14/22 */
  color: var(--wp--preset--color--text-secondary); text-decoration: none;
  transition: color var(--u-dur-fast) var(--u-ease);
}
/* Hover = derselbe Unterstrich-Reveal wie bei allen Textlinks: als `::after`-Grundzustand,
   den `anim-links.js` gegen die beidseitig laufende Linie tauscht (siehe §Unterstrich-Reveal).
   Kein eigenes `text-decoration` — sonst laegen zwei Linien uebereinander. */
a.c-crumb { position: relative; }
a.c-crumb::after {
  content: ""; position: absolute; left: 0.375rem; right: 100%; bottom: 0;
  height: max(1px, 0.0625rem); background: currentColor;
  transition: right var(--u-dur-fast) var(--u-ease);
}
a.c-crumb:hover::after,
a.c-crumb:focus-visible::after { right: 0.375rem; }
a.c-crumb:hover,
a.c-crumb:focus-visible { color: var(--wp--preset--color--text-primary); }
.c-crumb__sep {
  display: inline-flex; width: 1.25rem; height: 1.25rem;                            /* 20 */
  color: var(--wp--preset--color--text-secondary); opacity: .8;
}

/* Auf Bild/Dunkel: helle Schrift. Der Hover unterstreicht nur — ein Farbwechsel nach
   text-primary waere hier unlesbar, deshalb bleibt die Farbe stehen. Diese Regel MUSS die
   Hover-Farbe oben schlagen, steht also bewusst ohne `:where()`. */
.c-crumbs--on-dark .c-crumb,
.c-crumbs--on-dark .c-crumb__sep { color: var(--wp--preset--color--text-alternate); }
.c-crumbs--on-dark a.c-crumb:hover,
.c-crumbs--on-dark a.c-crumb:focus-visible { color: var(--wp--preset--color--text-alternate); }


/* ============================================================= Personen-Karte (geteilt)
   Porträt-Karte mit Namen, Rolle und LinkedIn. Wird von ZWEI Sektionen benutzt und hiess bis
   2026-08-11 `.c-leadership__card` — der Name log, seit `04 Team` dieselbe Karte zeigt.

   Node 13918:27987 (Geschäftsleitung, 316×567) und 13918:27190 › 04 Team (316×395): identisch bis
   auf die Höhe — pad 26, gap 26, Radius 8, Inhalt unten, Bild als Kartenfläche mit Verlauf darüber.
   Deshalb eine Komponente mit einer Höhen-Achse statt zweier Karten. */
.c-personcard {
  grid-column: span 3;                                                                     /* 316 */
  position: relative; isolation: isolate; overflow: hidden;
  display: flex; flex-direction: column; justify-content: flex-end;                        /* Node: MAX */
  aspect-ratio: 316 / 567;
  padding: var(--u-s-26);
  border-radius: 0.5rem;                                                                   /* 8 */
  background: var(--wp--preset--color--surface-darkgrey);
}
/* „Weiteres Management": dieselbe Karte, 395 statt 567 hoch. */
.c-personcard--kurz { aspect-ratio: 316 / 395; }
.c-personcard__portrait {
  position: absolute; inset: 0; z-index: -2;
  width: 100%; height: 100%; object-fit: cover;
  transition: transform var(--u-dur-slow) var(--u-ease);
}
/* Der Verlauf steht im Node als ZWEITER Fill über dem Bild: transparent bei 35,1 % → #0c0317
   bei 100 %. Er ist kein Dekor — ohne ihn steht der Name auf hellen Porträts unlesbar. */
.c-personcard__scrim {
  position: absolute; inset: 0; z-index: -1; pointer-events: none;
  background: linear-gradient(180deg, rgba(12,3,23,0) 35.1%, rgba(12,3,23,1) 100%);
}
/* Hover = Bildzoom, kein Schatten (Hausregel). */
.c-personcard:hover .c-personcard__portrait { transform: scale(1.04); }
.c-personcard__body { display: flex; flex-direction: column; gap: var(--u-s-26); }
.c-personcard__name {
  font-family: var(--u-font-body); font-weight: 400;
  font-size: var(--u-fs-body-large); line-height: 1.75rem;                                 /* 20/28 */
  color: var(--wp--preset--color--text-alternate);
}
.c-personcard__role {
  font-family: var(--u-font-body); font-weight: 400;
  font-size: var(--u-fs-body-large); line-height: 1.75rem;                                 /* 20/28 */
  color: var(--wp--preset--color--text-tertiary);
}
/* Name und Rolle sind im Node EIN Block („Name", 264 × 56, gap None) — der 26er-Gap trennt erst
   diesen Block vom LinkedIn-Link. Als eigener Wrapper statt als Negativ-Margin zwischen den
   Zeilen: Abstände kommen aus `gap`, ohne Ausnahmen. 28 + 28 Zeilenhöhe ergeben genau die 56. */
.c-personcard__ident { display: flex; flex-direction: column; }
.c-personcard__linkedin {
  display: inline-flex; align-items: center; align-self: flex-start; gap: 0.375rem;        /* 6 */
  font-family: var(--u-font-body); font-weight: 500;
  font-size: var(--u-fs-body-small); line-height: 1.375rem;                                /* 14/22 */
  color: var(--wp--preset--color--text-alternate); text-decoration: none;
}
.c-personcard__linkedin-icon { width: 1.25rem; height: 1.25rem; flex: 0 0 auto; }          /* 20 */

/* ============================================================= Geschäftsleitung
   „03 Führung // Section" (Concept 13918:27228). Sektion py 96, Gap 72, weiß. */
.c-leadership { background: var(--wp--preset--color--bg-primary); padding-block: var(--u-s-96); }
.c-leadership__inner { display: flex; flex-direction: column; gap: var(--u-s-72); }
.c-leadership__head { row-gap: var(--u-s-20); }
.c-leadership__headline {
  grid-column: 1 / span 12;
  font-family: var(--u-font-heading); font-weight: 500;
  font-size: var(--u-fs-h2); line-height: 3.5rem; letter-spacing: -0.0975rem;              /* 52/56 */
  color: var(--wp--preset--color--text-primary);
}
.c-leadership__lead {
  grid-column: 1 / span 5;                                                                 /* 537 */
  font-family: var(--u-font-body); font-weight: 500;   /* OS 600 gibt es in Figma nicht */
  font-size: var(--u-fs-body-regular); line-height: 1.5rem; letter-spacing: -0.03rem;      /* 16/24 */
  color: var(--wp--preset--color--text-secondary);
}
/* Vier Karten à 316 = exakt 3 Rasterspalten, 4 × 3 = 12. Eine Reihe im 12er-Raster, keine feste
   Breite. `row-gap` allein: die Shorthand `gap` würde den Spalten-Gutter überschreiben. */
.c-leadership__row { list-style: none; padding: 0; row-gap: var(--u-gutter); }

/* ============================================================= Weiteres Management
   „04 Team // Section" (Concept 13918:27190 › 04 Team, Stand 2026-08-11).

   🔴 Diese Sektion wurde am 11.08. NEU gezeichnet und ersetzt das frühere „Leadership Team":
   aus 16 Personen im 5er-Raster mit Lead wurden DREI mittige Karten plus CTA, ohne Lead. Wer hier
   ein Raster sucht, sucht die alte Fassung (ADR 0010, 2.2).

   Karte 1408 = 1440 − 2×16, Radius 16, bg-tertiary, Padding 96/48, Gap 72.
   ⚠️ Eigener Bezugsrahmen wie `.c-stats__card`: das Raster liegt auf der Content-Box der Karte
   (1408 − 96 = 1312), nicht auf `.u-container`. Bei 1440 deckt sich das exakt, darunter laufen
   beide um wenige Pixel je Spalte auseinander — bewusst so (docs/STATUS.md). */
.c-team { background: var(--wp--preset--color--bg-primary); padding-inline: var(--u-gutter); }
.c-team__panel {
  display: flex; flex-direction: column; gap: var(--u-s-72);
  padding: var(--u-s-96) var(--u-s-48);
  border-radius: 1rem;                                                                     /* 16 */
  background: var(--wp--preset--color--bg-tertiary);
}
.c-team__headline {
  font-family: var(--u-font-heading); font-weight: 500;
  font-size: var(--u-fs-h2); line-height: 3.5rem; letter-spacing: -0.0975rem;              /* 52/56 */
  color: var(--wp--preset--color--text-primary);
}
/* 🔴 BENANNTE AUSNAHME von „Breite kommt aus dem Grid" (css-grundregeln §3, Gate Phase 3).
   Die drei Karten stehen im Node MITTIG: Versatz 166 = exakt 1,5 Spalten. Drei Karten à 3 Spalten
   plus zwei Gutter sind 9 Spalten (980) — und 9 lassen sich in 12 nicht symmetrisch platzieren,
   es bliebe immer eine Spalte Rest auf einer Seite. Die Position ist also nicht rasterfähig,
   die BREITE dagegen schon: 316 = 3 Spalten.
   Deshalb zentrierender Flex-Container, und die Kartenbreite über die Spaltenformel — das ist die
   in der Regel vorgesehene Rückfallebene für „Elternteil ist kein Raster", nicht ihre Umgehung. */
.c-team__row {
  list-style: none; padding: 0;
  display: flex; justify-content: center; flex-wrap: wrap;
  gap: var(--u-gutter);
}
.c-team__row > .c-personcard {
  grid-column: auto;                                    /* im Flex-Kontext wirkungslos, aber ehrlich */
  flex: 0 0 calc(3 * var(--u-col) + 2 * var(--u-gutter));
}
/* Der CTA steht im Node mittig unter der Reihe (88×46 bei x=676 in 1312). */
.c-team__action { display: flex; justify-content: center; }

@media (max-width: 767px) {
  /* Node 14304:33652: Panel 344 (Sektion pad 8), pad 40/16, gap 48. Wie bei `.c-related__panel`
     trifft die Abstands-Tabelle diese Werte nicht — 96→72 und 48→20 waeren 72/20. */
  .c-team__panel { padding: 2.5rem 1rem; gap: 3rem; }
  .c-team__headline { font-size: 1.625rem; line-height: 2rem; letter-spacing: -0.0488rem; }   /* 26/32 */
  /* Geschaeftsfuehrung (Node 14304:33579): Kopf volle Breite — die Desktop-Spannen liessen
     den Lead auf 5 Mobil-Spalten (125px) Wort fuer Wort umbrechen; Kopf-Gap 20 AUSGESCHRIEBEN
     (das Token --u-s-20 kippt mobil auf 8), Sektions-Gap 48. */
  .c-leadership__inner { gap: 3rem; }
  .c-leadership__head { row-gap: 1.25rem; }
  .c-leadership__headline { grid-column: 1 / -1; font-size: 1.625rem; line-height: 2rem; letter-spacing: -0.0488rem; }
  .c-leadership__lead { grid-column: 1 / -1; }
}


/* ============================================================= Endlos-Karussell (ADR 0010 §1.7)
   Sechs Sektionen laufen unter 768 endlos um: die aktive Karte steht mittig, links und rechts
   lugt je eine Nachbarin herein, und es gibt keinen Anschlag.

   🔴 Woran man sie im Entwurf erkennt: die erste Karte steht bei NEGATIVEM x. Dann ist dort schon
   etwas vorbeigelaufen, und das geht nur zyklisch. Bei einem endlichen Slider sitzt Karte 1 am
   Containeranfang (x = 24) — deshalb ist `.c-methodik--slider` KEIN Karussell.

   Der Anschnitt ist ein ERGEBNIS, kein einzustellender Wert: die Karte steht mittig, also bleibt
   (360 − Kartenbreite) / 2 als Rand, minus dem Gutter. Bei 312 sind das 16, bei 258,67 sind es
   42,67. (ADR 0010 nannte fuer die schmale Karte 45 — das war um gut zwei Pixel daneben.)

   Dieser Block steht bewusst am DATEIENDE: die Kartenbreiten muessen die Desktop-Regeln der
   einzelnen Sektionen schlagen, und die haben teils dieselbe Spezifitaet. Bei Gleichstand
   gewinnt die spaetere Regel — dieser Fehler ist in diesem Projekt schon sechsmal passiert. */

/* Auf Desktop ist der Wrapper NICHT DA: `display: contents` nimmt ihn aus dem Kasten-Baum, die
   Kartenreihe behaelt also ihre Platzierung im Sektionsraster, als gaebe es ihn nicht.
   Damit braucht keine Desktop-Regel angefasst zu werden, um mobil einen Viewport zu bekommen. */
.c-carousel { display: contents; }

@media (max-width: 767px) {
  .c-carousel {
    display: block;
    /* Randlos: die Spur laeuft aus dem 312er-Container bis an beide Viewport-Kanten.
       KEIN `width: 100%` und kein `100vw` — negative Margins plus gleich grosses Padding sind
       echter Bleed, `100vw` wuerde die Scrollbar mitzaehlen (s. --u-col). */
    /* `--karussell-rand` ist der Abstand von der SEKTIONSKANTE bis zur Karte — nicht zwangslaeufig
       `--u-margin`. Sektionen, die in einem Panel sitzen (`.c-team`, `.c-related`: 8 Sektions-
       Padding + 16 Panel-Padding), haben einen anderen und setzen ihn selbst. Ohne das schnitt
       der Umlauf 4px zu frueh ab: der Anschnitt endete bei 4/356 statt bei 0/360. */
    --karussell-rand: var(--u-margin);
    margin-inline: calc(-1 * var(--karussell-rand));
    padding-inline: var(--karussell-rand);
    /* Grundzustand OHNE JS: natives Wischen mit Snap. Der Umlauf ist die Veredelung, nicht die
       Voraussetzung (Motion-Kontrakt). `anim-slider.js` schaltet das per `is-gsap` ab, sobald es
       die Achse uebernimmt — Snap und Traegheit schliessen sich auf einer Achse aus. */
    overflow-x: auto; overflow-y: hidden;
    scroll-snap-type: x mandatory;
    /* Pflicht: ohne scroll-padding schnappt `mandatory` die erste Karte an die Padding-Box-Kante
       und scrollt ueber das Padding hinweg — Karte 1 klebte dann auf 0 statt am Rand. */
    scroll-padding-inline: var(--karussell-rand);
    scrollbar-width: none;
    /* Auswahl unterbinden, sonst markiert ein Zieh-Versuch die Kartentexte statt zu schieben. */
    user-select: none; -webkit-user-select: none;
  }
  .c-carousel::-webkit-scrollbar { display: none; }

  /* Die Spur selbst: aus dem Sektionsraster wird eine Reihe. `width: max-content`, damit sie
     ueber den Container hinauslaeuft statt die Karten zu stauchen. */
  .c-carousel__track {
    display: flex; align-items: stretch; gap: var(--u-gutter);
    width: max-content;
    grid-template-columns: none;   /* die Grid-Spuren der Desktop-Regel abraeumen */
    /* Beides bringt `.c-team__row` von Desktop mit, und beides ist hier falsch: `wrap` bricht die
       Spur um, statt sie hinauslaufen zu lassen, und `center` schoebe eine breiter-als-der-
       Viewport-Spur zur Haelfte links aus dem Bild. Gilt schon im Grundzustand (natives Wischen),
       nicht erst im Umlauf. */
    flex-wrap: nowrap; justify-content: flex-start;
  }

  /* EINE Breitenformel fuer alle sechs. `--karten-spalten` steht auf der jeweiligen Spur und ist
     die einzige Zahl, die sich je Sektion unterscheidet: 12 = Containerbreite (312 @360),
     10 = 258,67. Beides sind Rasterspalten — die Breite kommt also weiterhin aus dem Grid
     (css-grundregeln §3), nur ueber die dokumentierte `--u-col`-Rueckfallebene, weil die Karten
     aus ihrem Container herausscrollen und `grid-column: span N` dort nicht greift.

     Die Selektoren der drei Bestands-Slider stehen mit in der Liste: ihre Desktop-Regeln sind
     spezifischer als `.c-carousel__track > *` (Element- bzw. Modifier-Selektor) und wuerden sonst
     gewinnen. Wer eine Sektion hinzufuegt, ergaenzt hier eine Zeile. */
  .c-carousel__track > *,
  .c-blog__track > li,
  .c-featured__track > li,
  .c-featured--webinar .c-featured__track > li,
  .c-team__row > .c-personcard {
    flex: 0 0 auto;
    scroll-snap-align: start;
    width: calc(var(--karten-spalten) * var(--u-col) + (var(--karten-spalten) - 1) * var(--u-gutter));
  }

  /* Sobald GSAP die Achse hat, muss der native Scroll weichen — sonst verschieben sich
     Scroll-Position und Transform gegenseitig. Gleiche Regel wie bei den drei Bestands-Slidern. */
  .is-gsap .c-carousel { overflow-x: hidden; scroll-snap-type: none; }
  .is-gsap .c-carousel__track > * { scroll-snap-align: none; will-change: transform; }

  /* ---- Spaltenzahl je Sektion (12 = Container, 10 = 258,67) ----
     `.c-funding__grid`, `.c-related__grid`, `.c-blog__track` und `.c-featured__track` setzen sie
     in ihren eigenen Bloecken weiter oben; hier stehen nur die beiden Personen-Reihen, deren
     Karten schmaler sind (Nodes 14304:34257 und 14304:34438 — je 258,67 = 10 Spalten). */
  .c-leadership__row,
  .c-team__row,
  /* Node 14068:26607 › Card Elements: 258,67 breit = 10 Rasterspalten, wie die Personen-Karten.
     Erste Karte am Containeranfang, deshalb kein Umlauf — nur rechts angeschnitten. */
  .c-methodik__cards { --karten-spalten: 10; }
  /* Die Reihe bringt von Desktop `flex-wrap: wrap` mit (Mobil-Regel weiter oben) — im Slider
     muss sie in EINER Zeile bleiben. */
  .c-methodik__cards { flex-wrap: nowrap; }
  /* Node 14068:26607: Sektion 8 rundum. Gebaut waren 16 seitlich und 0 oben/unten. */
  .c-methodik { padding: 0.5rem; }
  /* Kein eigener Rand noetig: `.c-methodik` hat mobil kein Seiten-Padding, der Panel-Inhalt
     beginnt bei 24 — der Standard-Bleed (`--u-margin`) trifft die Sektionskante damit genau.
     Ein Versuch mit 40/24 (aus der falschen Annahme, das Panel liege bei 48) schob die Spur auf 8
     und riss 16px Ueberlauf auf. */

  /* Panel-Sektionen: die Karte startet 8 (Sektion) + 16 (Panel) von der Sektionskante entfernt.
     Feste 24 statt `--u-margin` — der clamp waechst mit der Viewport-Breite, die beiden
     Panel-Innenabstaende nicht. Bei 360 sind beide 24, darueber liefen sie auseinander. */
  .c-team .c-carousel,
  .c-related .c-carousel { --karussell-rand: calc(var(--u-gutter) + 1rem); }

  /* 🔴 Die beiden Personen-Reihen bekommen KEINE Pfeile. Im Mobile-Frame gibt es zwar je einen
     `Navigation`-Knoten mit zwei 44×44 Knoepfen (14304:34515 / 14304:34477) — beide stehen auf
     `visible: false` und liegen deckungsgleich unter dem naechsten Element. ADR 0010 §2.2 nannte
     sie als gezeichnet; das war aus einer ausgeblendeten Ebene gelesen (korrigiert 2026-08-12). */
}

/* 🔴 FAUSTREGEL (User 2026-08-12): ALLE Karten sind auf Mobile 4:5.
   Belegt an vier unabhaengigen Stellen im Entwurf, jedes Mal exakt:
     Funding-Karte   312 x 390    (14077:35071)
     Blog-Karte      312 x 390,01 (14068:26662)
     Related-Karte   312 x 390    (14310:36985)
     Methodik-Karte  258,67 x 323,34 · Weiteres Management ebenso (14304:34438)
   Die Regel steht deshalb EINMAL hier, fuer alle Karten-Komponenten zusammen, statt in jeder
   Sektion erneut. Wer eine neue Karte baut, bekommt sie geschenkt.

   ⚠️ EINE benannte Ausnahme: `.c-personcard` ohne `--kurz` (Geschaeftsfuehrung) ist 258,67 x 464,17
   — ein Portraet, keine Inhaltskarte. Ihr Verhaeltnis steht an ihrer eigenen Regel und bleibt.

   Innenmasze aus demselben Node (Card Elements): pad 16 statt 26, Karten-Gap 24 statt 40,
   Container-Gap 16 statt 40.

   🔴 Dieser Block steht am DATEIENDE, nicht bei `.c-card`. Die Komponenten definieren ihre Hoehen
   teils weiter unten (`.c-postcard { height: 33.334rem }` auf Zeile ~2160, `.c-card--wide` mit
   `aspect-ratio: auto`) — bei gleicher Spezifitaet gewinnt die spaetere Regel, und die Karten
   blieben 533 statt 390 hoch. Siebter Fall dieser Familie im Projekt. */
@media (max-width: 767px) {
  .c-card, .c-postcard, .c-phase { aspect-ratio: 4 / 5; }
  .c-card { padding: 1rem; gap: 1.5rem; }
  .c-card__container { gap: 1rem; }
  /* Karten-Headline mobil 24/30, ls −3 % — beide gezeichneten Mobil-Karten sagen dasselbe
     (Funding-Karte 14077:35778: „Bis zu €890K" · Stapel-Karte 14068:26657: „Forschungszulage",
     je 24/30 ls−0,72 w500). Ohne die Regel rendert die Desktop-36 und „Forschungszulage"
     (300px breit) wird bei 278 Innenbreite horizontal beschnitten — Teil des
     „sieht komplett kaputt aus"-Befunds (Auftrag 2026-08-15-programs-slider).
     Font-Audit-Familie „Mobile rendert Desktop-Groessen" (auftrag-mobile-autonom.md §9). */
  .c-card__headline { font-size: 1.5rem; line-height: 1.875rem; letter-spacing: -0.045rem; }
  /* Feste Hoehen weichen dem Verhaeltnis — sonst gewinnt die Zahl gegen die Regel. */
  .c-postcard { height: auto; min-height: 0; padding: 1rem; }
  /* Phasen-Karte: Node 14202:53764 fuehrt pad 16/16/32/16 — unten bleibt der 32er
     (asymmetrisch wie auf Desktop 26/26/32). */
  .c-phase    { min-height: 0; padding: 1rem 1rem 2rem; }
  /* `.c-related__grid > .c-card` traegt auf Desktop 1:1 und ist spezifischer als die Regel oben. */
  .c-related__grid > .c-card { aspect-ratio: 4 / 5; height: auto; }
  /* 🔴 Highlights-Karten sind KEINE 4:5-Karten: der Mobile-Node (14134:52975) zeichnet sie
     inhaltshoch (312x212 bzw. 312x248) — Tags + Titel (SG 500 24/30) + Link, gap 48.
     Die 4:5-Faustregel gilt fuer Bild-/Inhaltskarten, nicht fuer diese Info-Chips.
     Der Karten-BODY ist im Node ausgeblendet (`visible: false` auf der Beschreibung) —
     das ist Mobil-Struktur („was wegfaellt"), kein Inhaltseingriff: der Text bleibt im
     Markup und auf Desktop, mobil traegt die Karte Tags + Titel + Link. */
  .c-highlights__cards .c-card { aspect-ratio: auto; min-height: 0; gap: 3rem; }
  .c-highlights__cards .c-card__headline { font-size: 1.5rem; line-height: 1.875rem; letter-spacing: -0.045rem; }
  .c-highlights__cards .c-card__body { display: none; }
  /* Ausnahme `--row` (Approach-Seite, KEINE Mobil-Vorlage): die Chip-Regeln oben gelten der
     gestapelten Grid/List-Fassung. Die row-Karten fallen auf volle Breite + Mindesthoehe 274
     zurueck, Body bleibt sichtbar — SETZUNG, bis ein Mobil-Frame existiert. */
  .c-highlights--row .c-highlights__cards .c-card { width: 100%; min-height: 17.125rem; }
  .c-highlights--row .c-highlights__cards .c-card__body { display: block; }

  /* 🔴 Hier stand `.wp-block-ignite-card { width: calc(100% - 2 * var(--u-margin)); … }`
     („Standalone-Einzelkarte /company/", 92a93ea) — ENTFERNT (Programs-Slider-Auftrag 15.08.).
     Die Regel traf JEDE Karte (jede traegt die Blockklasse), stand hinter der Karussell-
     Breitenformel (Z. ~6119, gleiche Spezifitaet → Reihenfolge gewinnt) und machte im
     max-content-Track aus `100%` einen Zirkelbezug: Funding-Karten 1980×2475 statt 312×390,
     Stapel-Karten 264×330 mit beschnittenem Text. Ihr Zielfall ist leer: die Event-Karte ist
     `.c-hero__card` im Hero-Block, kein Standalone-`ignite/card` existiert (DB + Templates
     geprueft). Wer je eine Standalone-Karte braucht, scoped sie auf ihren Kontext —
     NIE wieder auf die nackte Blockklasse. */

  /* Timeline-Modus des Foerderlebenszyklus (`--labels`, Ueber-Ignite „Unsere Geschichte",
     Node 14244:27660): mobil bleibt die ZWEISPALTIGE Figur (ADR 0010: „Timeline wird nicht
     gestapelt") — Jahre 54er-Spalte (SG 500 16/22) mit gap 176, Text 232 mit gap 64,
     alles offen, kein Sticky, kein Zaehler vor dem Titel. */
  .c-cycle--labels { display: grid; grid-template-columns: 3.375rem minmax(0, 1fr);
    column-gap: var(--u-gutter); row-gap: 3rem; }
  /* Kopf aufloesen: der Button steht im Frame UNTER der Timeline (Action y 1272), im Markup
     aber im Kopf — per contents + order ans Ende, volle Breite. */
  .c-cycle--labels .c-cycle__head { display: contents; }
  .c-cycle--labels .c-cycle__eyebrow, .c-cycle--labels .c-cycle__headline { grid-column: 1 / -1; }
  .c-cycle--labels .c-cycle__head > .c-btn { grid-column: 1 / -1; order: 5; justify-self: start; }
  .c-cycle--labels .c-cycle__numbers { display: flex; flex-direction: column; gap: 11rem;
    grid-column: 1; grid-row: 2; padding: 0; }
  .c-cycle--labels .c-cycle__number { font-family: var(--u-font-heading); font-weight: 500;
    font-size: 1rem; line-height: 1.375rem; letter-spacing: -0.01rem; color: var(--wp--preset--color--text-primary); }
  .c-cycle--labels .c-cycle__list-wrap { grid-column: 2; grid-row: 2; min-width: 0; padding-top: 0; }
  .c-cycle--labels .c-cycle__list { display: flex; flex-direction: column; gap: 4rem; }
  .c-cycle--labels .c-cycle__item-title::before { content: none; }
  .c-cycle--labels .c-cycle__cta-row { grid-column: 1 / -1; }

  /* FAQ-Frage mobil: SG 500 16/22, ls -1% (Node 14115:45496, offene Akkordions — der Frame
     wiederholt die bekannte Zustands-Inkonsistenz [zu: OS 16/24], die Regel „eine Typo fuer
     beide Zustaende" bleibt; vereinheitlicht auf den Mehrheits-/Offen-Stil).
     Antwort: OS 500 16/24 (Node). Steht am DATEIENDE, weil `.c-accordion--bare .c-accordion__q`
     weiter oben dieselbe Spezifitaet traegt. */
  .c-accordion--bare .c-accordion__q { font-size: 1rem; line-height: 1.375rem; letter-spacing: -0.01rem; }
  .c-accordion--bare .c-accordion__answer { font-weight: 500; line-height: 1.5rem; }
}
/* 🔴 Die schliessende Klammer oben fehlte: das Mobile-@media am Dateiende war UNGESCHLOSSEN.
   Der Browser schliesst offene Bloecke bei EOF still selbst — deshalb fiel es nie auf. Jede
   angehaengte Top-Level-Regel rutschte damit lautlos ins Mobile-Media (beim T2-Anbau passiert,
   per CSSOM-Inspektion gefunden: die Regeln existierten nur als „(media)"-Eintraege). */

/* ============================================================= Reasons — Lead-Achse (T2, 2026-08-15)
   Culture-Kopf der About-Seite (Desktop-Node 14065:24774, Mobil-Node 14244:26347): Eyebrow +
   Lead als Kopf, gap 10; Kopf→Spalten 64 (statt 96 der Intro-Fassung — nur mit Lead, Achse
   additiv). Lead = H3-Typo SG 500 36/44 −3% (#1e063d), Breite 980 = 9 Spalten (Node 14244:26119);
   mobil 26/32 volle Breite (Node 14244:26351). Eyebrow im Kopf: OS 500 (Node — Intro-Fassung
   bleibt bei 400). Steht am DATEIENDE (Reihenfolge-Regel §3.1). */
.c-reasons--lead > .u-container { gap: 4rem; }                       /* 64 (beide Nodes) */
.c-reasons__head { row-gap: 0.625rem; }                              /* 10 — Rasterträger: nur row-gap */
.c-reasons__head > .c-reasons__eyebrow { grid-column: 1 / -1; }
.c-reasons__head > .c-reasons__lead { grid-column: 1 / span 9; }     /* 980 = 9 Spalten */
.c-reasons--lead .c-reasons__eyebrow { font-weight: 500; }
.c-reasons__lead {
  font-family: var(--u-font-heading); font-weight: 500;
  font-size: var(--u-fs-h3); line-height: 1.2222em; letter-spacing: -0.03em;
  color: var(--wp--preset--color--text-primary);
}
@media (max-width: 767px) {
  .c-reasons__lead { font-size: 1.625rem; line-height: 2rem; }       /* 26/32 (Node 14244:26351) */
  .c-reasons__head > .c-reasons__lead { grid-column: 1 / -1; }       /* 312 volle Breite */
}

/* ============================================================= Logos — Kopf-Achse (T3, 2026-08-15)
   Partnerschafts-Sektion der About-Seite (Desktop-Node 14065:24738, Mobil-Node 14244:32721):
   Headline H2 52/56 −3% links (Kasten 642, Umbruch gesetzt) + Lead OS 500 16/24 −3%
   (#786a8b) rechts auf Spalte 8-12 (537,33 = 5 Sp.), vertikal mittig (Node: CENTER).
   Kopf→Marquee 80 (mobil 48), Sektion pad 96/40 (mobil 72/24). Der Rand-Fade haengt in der
   Kopf-Variante an .c-logos__stage statt an der Sektion. Achse additiv — ohne Kopf-Felder
   aendert sich nichts. */
.c-logos--head { padding-block: 6rem 2.5rem; display: flex; flex-direction: column; gap: 5rem; }
.c-logos__stage { position: relative; }
.c-logos__head { row-gap: 1.25rem; }                                 /* Rasterträger: nur row-gap */
.c-logos__headline {
  grid-column: 1 / span 6;
  font-family: var(--u-font-heading); font-weight: 500;
  font-size: var(--u-fs-h2); line-height: 1.0769em; letter-spacing: -0.03em;
  color: var(--wp--preset--color--text-primary);
}
.c-logos__lead {
  grid-column: 8 / span 5; align-self: center;
  font-family: var(--u-font-body); font-weight: 500;
  font-size: var(--u-fs-body-regular); line-height: 1.5; letter-spacing: -0.03em;
  color: var(--wp--preset--color--text-secondary);
}
@media (max-width: 767px) {
  .c-logos--head { padding-block: 4.5rem 1.5rem; gap: 3rem; }        /* 72 / 24, gap 48 */
  .c-logos__headline { grid-column: 1 / -1; font-size: 1.625rem; line-height: 2rem; }  /* 26/32 */
  .c-logos__lead { grid-column: 1 / -1; }
}

/* ============================================================= Hero-Variante „card" (T4, 2026-08-15)
   Gradient-Buehne + Event-Karte (About-Seite). Desktop-Node 14065:24692 (User-gegeben, 1440x860):
   Bild + ZWEI Slate-Multiply-Verlaeufe (fillop 1; 36,9deg · 0deg ab 15,36%), Inhalt unten
   buendig (counter MAX), Text links / Karte rechts (SPACE_BETWEEN), pad 176/64/64/64.
   Mobil-Node 14244:26300 (360x936 FIX): Text oben (pad-top 128), Karte unten (pb 48), Verlauf =
   Dreifach-Fuellung wie die Basis, Diagonale 143,6deg. Karte: Nodes 14244:27078 / 14244:27174. */
.c-hero--card .c-hero__tint--d {
  position: absolute; inset: 0; pointer-events: none; mix-blend-mode: multiply;
  background: linear-gradient(36.9deg, #475569 0%, rgba(102, 102, 102, 0) 100%);
}
.c-hero--card .c-hero__tint--e {
  position: absolute; inset: 0; pointer-events: none; mix-blend-mode: multiply;
  background: linear-gradient(0deg, #475569 15.36%, rgba(102, 102, 102, 0) 100%);
}
.c-hero--card .c-hero__gradient { background-image: none; }        /* Desktop: kein Scrim/Vignette */
.c-hero--card .c-hero__bg { object-position: 50% 50%; }            /* Fill ohne Transform = mittig */
/* Inhalt: Text unten links, Karte unten rechts, beide auf der Grundlinie (Node counter MAX). */
.c-hero--card .c-hero__inner { flex-direction: row; align-items: flex-end; justify-content: space-between; padding-bottom: 4rem; }   /* 64 */
.c-hero--card .c-hero__intro { width: auto; flex: 0 1 auto; min-width: 0; }
/* Text-Stack als Flex (der 12er-Grid der Basis saesse hier auf der SCHMALEN Intro-Breite und
   ergaebe falsche Spalten) — Breiten kommen als --u-col-Spannen (Muster .c-hero--single). */
.c-hero--card .c-hero__text { display: flex; flex-direction: column; align-items: flex-start; gap: 1.25rem; }   /* 20/20 (Node Teaxt gap 20) */
.c-hero--card .c-hero__headline { width: calc(7 * var(--u-col) + 6 * var(--u-gutter)); max-width: 100%; }   /* Node-Kasten 787 → 7 Spalten (SETZUNG) */
/* Gegen den Figma-Render geprueft (figma-to-css §3a): Figma bricht „25 Jahre. Eine /
   Überzeugung: Innovation / verdient Finanzierung." OHNE Trennstrich. Das globale
   `hyphens: auto` der Headings zog stattdessen „Überzeu-" in Zeile 1 hoch (auto trennt auch
   zum Zeilenfuellen, nicht nur bei Platznot). Mit `manual` reproduziert der Auto-Wrap die
   Node-Zeilen exakt — 1440: 3 Zeilen (400/732/647 in 759) · 360: 4 Zeilen, 128 hoch. */
.c-hero--card .c-hero__headline { hyphens: manual; }
.c-hero--card .c-hero__lead { width: calc(4 * var(--u-col) + 3 * var(--u-gutter)); max-width: 100%; font-weight: 500; }   /* Node 452 → 4 Spalten (SETZUNG) · OS 500 (Node) */
/* Event-Karte: Glass (Fuellung 232f40@1%, Rahmen f8fafc@20%, Blur Figma 160 = CSS 80) */
.c-hero__card {
  flex: 0 0 calc(3 * var(--u-col) + 2 * var(--u-gutter));          /* 316 = 3 Spalten */
  display: flex; flex-direction: column; gap: 1.625rem;            /* 26 */
  padding: 0.375rem;                                               /* 6 */
  border-radius: 0.5rem;
  background: rgba(35, 47, 64, 0.01);
  border: 0.0625rem solid rgba(248, 250, 252, 0.2);
  backdrop-filter: blur(5rem); -webkit-backdrop-filter: blur(5rem);
  color: var(--wp--preset--color--text-alternate); text-decoration: none;
}
.c-hero__card-img { display: block; width: 100%; aspect-ratio: 304 / 171; object-fit: cover; border-radius: 0.375rem; }
.c-hero__card-body { display: flex; flex-direction: column; gap: 1.625rem; padding: 0 0.75rem 0.75rem; }   /* 26 · 12 */
.c-hero__card-row { display: flex; flex-direction: column; gap: 0.625rem; }                                /* 10 */
.c-hero__card-tags { display: flex; align-items: center; justify-content: space-between; }                 /* Node: SPACE_BETWEEN */
.c-hero__card-arrow { width: 1.25rem; height: 1.25rem; color: var(--wp--preset--color--accent); }
.c-hero__card-meta {
  font-family: var(--u-font-body); font-weight: 500;
  font-size: 0.75rem; line-height: 1.25rem; letter-spacing: -0.03em;   /* 12/20 −0,36 */
}
.c-hero__card-title {
  font-family: var(--u-font-heading); font-weight: 500;
  font-size: 1.5rem; line-height: 1.875rem; letter-spacing: -0.01em;   /* 24/30 −0,24 */
}
@media (max-width: 767px) {
  .c-hero--card { min-height: 58.5rem; padding-top: 8rem; }        /* 936 · 128 */
  /* Mobil-Fuellungen des Gradient-Layers (Node 14244:33911): flach 0,4 + Diagonale 143,6deg
     slate 0,6 multiply + Vertikale 0→0,3. Die Desktop-Tints zeichnet der Mobil-Node nicht. */
  .c-hero--card .c-hero__tint--d, .c-hero--card .c-hero__tint--e { display: none; }
  .c-hero--card .c-hero__gradient {
    background-image:
      linear-gradient(180deg, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.3) 100%),
      linear-gradient(143.6deg, rgba(71, 85, 105, 0.6) 0%, rgba(102, 102, 102, 0) 100%),
      linear-gradient(rgba(0, 0, 0, 0.4), rgba(0, 0, 0, 0.4));
    background-blend-mode: normal, multiply, normal;
  }
  /* Crop-Matrix mobil [[0.258,0,0.258],[0,1,0]] → Fenster-Mitte 38,7 % / volle Hoehe. */
  .c-hero--card .c-hero__bg { object-position: 39% 50%; }
  .c-hero--card .c-hero__inner { flex-direction: column; align-items: stretch; justify-content: space-between; padding-bottom: 3rem; }   /* 48 */
  /* Text Oben (Basis zentriert mobil) — Node: Breadcrumbs ab y 128, Karte unten. */
  .c-hero--card .c-hero__intro { flex: 0 0 auto; justify-content: flex-start; }
  .c-hero--card .c-hero__headline, .c-hero--card .c-hero__lead { width: auto; }
  /* Karte: Node zeichnet 316 zentriert (2px Ueberhang) — 316 ist keine Rasterbreite,
     SETZUNG: volle Containerbreite 312. Gaps 16/26, Body-Rand 10 (Nodes). */
  .c-hero__card { flex: 0 0 auto; width: 100%; gap: 1rem; }
  .c-hero__card-body { padding: 0 0.625rem 0.625rem; }
  .c-hero__card-title { font-size: 1.125rem; line-height: 1.5rem; }   /* 18/24 −0,18 */
}

/* ============================================================= Listen-Ansicht mobil (Auftrag
   2026-08-15-grid-list-toggle, Schritt 2). Werte aus dem List-Frame gezogen (G1):
   Mobil-Item 14242:22475 = 312x208, VERT, pad 16, r8, bg #f1f5f9, Stroke #e2e8f0@0.4 —
   Reihenfolge TAGS -> TITEL (gap 20), danach gap 48 -> Tertiary-Link 14/22. Titel mobil
   SG 500 16/22 ls -0,16 (NICHT die Desktop-20/28). Item-Gap in der Liste 16 (Grid 14242:22474).
   🔴 Am DATEIENDE, weil diese Regeln die 4:5-Karten-Regel und die Karten-Gaps des globalen
   Mobile-Blocks (oeffnet ~Z. 6131) schlagen muessen — Reihenfolge-Regel, achter Fall vermieden.
   Die Desktop-Zeilen (13852:22100, Zeile 80) stehen unveraendert im Grants-Block (~Z. 3730). */
@media (max-width: 767px) {
  .c-grants[data-view="list"] .c-grants__item {
    aspect-ratio: auto; min-height: 0;
    flex-direction: column; align-items: stretch; gap: 3rem;              /* 48 */
  }
  /* Cardbody wird mobil wieder ein echter Stapel (Desktop loest ihn per display:contents in
     die Zeile auf): Tags ueber Titel, gap 20 — exakt die Frame-Reihenfolge. */
  .c-grants[data-view="list"] .c-grants__cardbody {
    display: flex; flex-direction: column; gap: 1.25rem;                  /* 20 */
  }
  .c-grants[data-view="list"] .c-grants__tags { order: 0; flex: 0 0 auto; }
  .c-grants[data-view="list"] .c-card__text { order: 0; width: auto; }
  .c-grants[data-view="list"] .c-grants__title {
    font-size: 1rem; line-height: 1.375rem; letter-spacing: -0.01rem;     /* 16/22/-0,16 */
  }

  /* Webinare/News/Blog: kein eigener 360er-List-Frame — abgeleitet nach dem List-Frame-MUSTER
     (kompakte Info-Karte OHNE Bild: Kopf -> Titel gap 20, dann gap 48 -> Link; pad 16 kommt
     aus der globalen Mobile-Postcard-Regel). Vorher klappte die Postcard in die Spalte zurueck
     (Bild 100% x 12rem) — die "Liste" war ein Grid-Klon (Schritt-0-Befund).
     SETZUNGEN: (a) Bild entfaellt in der Liste — das Muster (14242:22475) zeichnet keins;
     (b) Item-Gap 16 wie im List-Frame (der 8er-Gap des Karten-Stapels gehoert zum Grid-Frame
     14370:25941, nicht zur Liste); (c) Farben bleiben kontextuell (weisse Karte auf der
     bg-secondary-Buehne, wie in der Karten-Ansicht dieser Sektion). */
  .c-articles[data-view="list"] .c-articles__grid { row-gap: 1rem; }      /* 16 */
  .c-articles[data-view="list"] .c-postcard {
    flex-direction: column; align-items: stretch; aspect-ratio: auto; gap: 3rem;   /* 48 */
  }
  .c-articles[data-view="list"] .c-postcard__img { display: none; }
  .c-articles[data-view="list"] .c-postcard__body {
    /* 🔴 flex-BASIS zurueck auf auto: die Desktop-Zeilenregel setzt `flex: 1 1 0` — im mobilen
       Spalten-Kontext ist 0 die Basis der HAUPTACHSE (Hoehe), und ein height:auto-Container
       verteilt keinen freien Raum -> die Karte kollabierte auf Padding+Border (gemessen 34px). */
    flex: 0 0 auto;
    flex-direction: column; align-items: stretch; justify-content: flex-start;
    gap: 3rem; padding: 0;                                                /* 48; pad traegt die Karte (16) */
  }
  .c-articles[data-view="list"] .c-postcard__text { gap: 1.25rem; }       /* 20 */
  /* Kopfzeile umbruchfaehig: `.c-postcard__meta` traegt `white-space: nowrap` + Flex ohne wrap —
     auf 280px Kartenbreite lief „Datum · Laufzeit" bis 50px aus der Box (gemessen, Screenshot-
     Befund). Im List-Muster bricht der Kopf wie die Tag-Zeile des Frames. */
  .c-articles[data-view="list"] .c-postcard__head { flex-wrap: wrap; }
  .c-articles[data-view="list"] .c-postcard__meta { flex-wrap: wrap; white-space: normal; }
  .c-articles[data-view="list"] .c-postcard__title {
    font-size: 1rem; line-height: 1.375rem; letter-spacing: -0.01rem;     /* 16/22/-0,16 (Muster) */
  }
}

/* ============================================================= Krumen-Kuerzung mobil (Auftrag 2026-08-15-faq-mobile, S1)
   Mobil steht nur „› Aktuelle Seite" — gezeichnet in ALLEN vier geprueften Mobil-Frames
   (FAQ 14408:27630 · Glossar 14275:32236 · News-Detail 14370:26300 · Kontakt 14216:58824):
   vordere Krumen und erster Chevron stehen dort auf [AUS], sichtbar bleiben ausschliesslich
   der letzte Chevron und die aktuelle Krume. Gilt fuer ALLE Koepfe (eine Krumen-Komponente).
   Steht am DATEIENDE (Reihenfolge-Regel §3.1): muss `.c-crumb`/`.c-crumb__sep` (weiter oben,
   gleiche Spezifitaet der display-Regeln) sicher schlagen. */
@media (max-width: 767px) {
  .c-crumbs > * { display: none; }
  .c-crumbs > .c-crumb--current,
  .c-crumbs > .c-crumb__sep:nth-last-child(2) { display: inline-flex; }
}

/* ============================================================= FAQ-Filter + Akkordeon mobil (Auftrag 2026-08-15-faq-mobile, S2)
   Steht am DATEIENDE (Reihenfolge-Regel §3.1): muss `.c-filter` (oben), `.c-faqfilter`
   (Basis-margin) und den geteilten Chip-Block bei gleicher Spezifitaet sicher schlagen. */
@media (max-width: 767px) {
  /* Filter-Zeile = EINE wischbare Zeile, randlos (Mobil-Node 14413:53921: 6 Chips, gap 8,
     erste Chips bei x=-164 — die Zeile ist im Entwurf mitten im Scroll gezeichnet und laeuft
     ueber beide Kanten). §1.7-Umlauf gilt nur fuer Karten-Sektionen; ein Filter ist ein
     endlicher Satz, Umlauf waere absurd → SETZUNG: natives overflow-x-Scrollen, kein Slider.
     Bleed exakt um den Seitenrand (`--u-margin` = Container-Rand, §4a-konform). */
  .c-faqfilter {
    flex-wrap: nowrap; justify-content: flex-start; gap: 0.5rem;            /* 8 (Node) */
    overflow-x: auto; scrollbar-width: none;
    margin-inline: calc(-1 * var(--u-margin)); padding-inline: var(--u-margin);
    /* Hit-Raum NUR nach unten: der Scroll-Container clippt an der Padding-Box, die
       44er-Hit-Area (SETZUNG unten) braucht darin Platz. Asymmetrisch, damit die Chips oben
       buendig auf dem 48er-Sektions-pad sitzen (Node); 44 Container-gap + 4 = 48 unten. */
    padding-bottom: 0.25rem;
    margin-bottom: 0;                       /* Abstand liefert das Container-gap (Hausregel) */
  }
  .c-faqfilter::-webkit-scrollbar { display: none; }
  /* Abstand Filter→Inhalt ueber gap statt margin (Margin-Reset-Hausregel): 44 + 4 Hit-Raum
     = 48 sichtbar (Node-Sektions-gap 48). Ohne Filter (Einbettung Seite 95) ohne Wirkung. */
  .c-faqover > .u-container { display: flex; flex-direction: column; gap: 2.75rem; }
  .c-filter { flex-wrap: nowrap; gap: 0.5rem; }                              /* 8 (Node) */
  .c-faqfilter__group { gap: 0.125rem; }                                     /* 2 (Node Head gap 2) */
  /* SETZUNG Touch-Targets ≥44 (Auftragsvorgabe) vs. Node-Chips 40 hoch: visuell bleiben 40
     (Node gewinnt die Optik), die Hit-Area waechst per ::before nach unten auf 44 —
     ohne Layout-Einfluss, und im Scroll-Container nicht abgeschnitten. */
  .c-faqfilter .c-filter__chip, .c-faqfilter .c-filter__remove { position: relative; }
  .c-faqfilter .c-filter__chip::before, .c-faqfilter .c-filter__remove::before {
    content: ""; position: absolute; inset: 0 0 -0.25rem;
  }
  /* SETZUNG: eine EINZEILIGE Frage ergaebe einen 22px-Trigger — Hit-Area vertikal auf ≥44
     (22 + 2×11). Ragt nur ins Padding des EIGENEN Items (20), nie ueber den Nachbar-Trigger. */
  .c-faqover .c-accordion__head { position: relative; }
  .c-faqover .c-accordion__head::before { content: ""; position: absolute; inset: -0.6875rem 0; }
  /* Drittes Mitglied der hyphens-Familie (c-hero--card, .c-page-header__headline): das globale
     `hyphens: auto` der Headings trennte „Förderprogram-me" zum Zeilenfuellen, obwohl
     „Förderprogramme kombinieren?" in die Zeile passt — der Node bricht an Leerzeichen.
     Scope bewusst nur .c-faqover (Auftrags-Scope); andere Akkordeons als Nebenbefund notiert. */
  .c-faqover .c-accordion__heading { hyphens: manual; }
}

/* ============================================================= Casestudy-Hero mobil — Grow/Partner
   (Auftrag 2026-08-15-grow-partner-mobile, S1 · Nodes 14437:67197 / 14437:67373, beide identisch:
   Sektion 360x780 FIX, pad 176/24/48/24, SPACE_BETWEEN — Text OBEN unter der Navbar, Button UNTEN
   auf dem 48er-Grundabstand. Das ist NICHT die zentrierte Basis-Mobilfigur des Home-Heros.
   Steht am DATEIENDE (Reihenfolge-Regel §3.1): muss die Basis-Mobilregeln von `.c-hero`
   (~Z. 1069, gleiche Kaskadenlage) sicher schlagen. */
@media (max-width: 767px) {
  .c-hero--casestudy { padding-top: 11rem; }                     /* 176 (Basis-Mobil: 112) */
  /* Sektions-pb 3rem (Desktop-Regel, gilt weiter) traegt die 48 allein — der 32er-Innen-pb
     der Basis kaeme sonst obendrauf und der Button saesse bei 706 statt 686. */
  .c-hero--casestudy .c-hero__inner { padding-bottom: 0; }
  .c-hero--casestudy .c-hero__intro { justify-content: space-between; }
  .c-hero--casestudy .c-hero__text { row-gap: 1rem; }            /* Krumen → H1 16 (Node Text-gap) */
  /* H1 → Lead ist im Node 24 (inneres Text-gap), Krumen → H1 aber 16 — EIN Grid kann nur einen
     row-gap. Die 8 Differenz liegen als Hit-freier Innenabstand auf dem Lead (Padding, kein
     Margin — Margin-Reset-Hausregel; dasselbe Muster wie der FAQ-Filter-Hit-Raum). */
  .c-hero--casestudy .c-hero__lead { padding-top: 0.5rem; }
  /* Verlauf: der Mobil-Node zeichnet NICHT die drei Desktop-CS-Tints, sondern die Standard-
     Gradient-Ebene mit VIER Fuellungen (Fills 1:1 aus dem Dump, CSS-Reihenfolge = Figma
     gedreht): vertikal 0→0,3 · Diagonale 153,6deg Slate 0,6 multiply (Handles (0|0,159)→
     (0,6|0,718) auf 360x780) · Flaeche 0,4 · horizontales Randband 0,6/0,3 (Stops 26,44/65,87).
     Alle vier liegen auf EINEM Tint-Element (Muster .c-hero__gradient: Schicht-Opacity in die
     Farben eingerechnet, Multiply via background-blend-mode). */
  .c-hero--casestudy .c-hero__tint--cs-burn,
  .c-hero--casestudy .c-hero__tint--cs-left { display: none; }
  .c-hero--casestudy .c-hero__tint--cs-bottom {
    background: none;
    background-image:
      linear-gradient(180deg, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.3) 100%),
      linear-gradient(153.6deg, rgba(71, 85, 105, 0.6) 0.87%, rgba(102, 102, 102, 0) 100%),
      linear-gradient(rgba(0, 0, 0, 0.4), rgba(0, 0, 0, 0.4)),
      linear-gradient(270deg, rgba(0, 0, 0, 0.6) 0%, rgba(0, 0, 0, 0.3) 26.44%,
        rgba(0, 0, 0, 0.3) 65.87%, rgba(0, 0, 0, 0.6) 100%);
    background-blend-mode: normal, multiply, normal, normal;
  }
  /* Node-Bildfuellung FILL ohne Transform = mittig (Desktop-65/30 gilt der Roboterhand). */
  .c-hero--casestudy .c-hero__bg { object-position: 50% 50%; }
  /* Sechster Fall der hyphens-Familie (c-hero--card · Kopf-H1 · FAQ-Frage · plain-CTA):
     `auto` trennte „An-gebot" zum Zeilenfuellen — der Node (14437:67373) bricht am Wort. */
  .c-hero--casestudy .c-hero__headline { hyphens: manual; }
}

/* ============================================================= Bedarf-Spalten mobil = Umlauf
   (Auftrag 2026-08-15-grow-partner-mobile, S2 · Nodes 14437:67208 / 14437:67384, identische
   Figur): Sektion pad 56/24, Eyebrow→Reihe 32, Items 285,33 (= 11 Rasterspalten) mit Gap 16,
   Item 1 bei x=−264 → Umlauf-Karussell (§1.7), Anschnitt beidseitig 21,33 folgt aus der
   mittigen Ruhelage. Item: border-left 1px border-tertiary, pad-links 16, Titel 24/30 −3 %
   OBEN, Body 16/24 w500 auf FESTEM 112er-Abstand (Node itemSpacing — die Desktop-Figur
   min-height+space-between gilt mobil nicht; im Karussell zaehlt die Einzelkarte).
   NUR die Plain-Fassung: die `--lead`-Instanz (About-Culture) stapelt laut EIGENEM Node
   (14244:26348) und behaelt ihre T2-Werte. Dateiende (Reihenfolge-Regel §3.1). */
@media (max-width: 767px) {
  .c-reasons:not(.c-reasons--lead) { padding-block: 3.5rem; }          /* 56/56 (Node) */
  .c-reasons:not(.c-reasons--lead) > .u-container { gap: 2rem; }       /* Eyebrow → Reihe 32 */
  .c-reasons__eyebrow { font-weight: 500; }                            /* Node mobil w500 */
  .c-reasons__cols.c-carousel__track {
    --karten-spalten: 11;                                              /* 285,33 = 11 Spalten */
    gap: 1rem;                                                         /* 16 (Node Row-gap, NICHT der 8er-Gutter — Vorrang-Kette #1) */
  }
  .c-reasons__cols.c-carousel__track > .c-reasons__col {
    justify-content: flex-start; gap: 7rem;                            /* Titel→Body fest 112 (Node) */
    padding-left: 1rem;                                                /* 16 (Desktop: 20) */
  }
  .c-reasons__cols.c-carousel__track .c-reasons__col-title {
    font-size: 1.5rem; line-height: 1.875rem;                          /* 24/30, ls erbt −3 % */
  }
  .c-reasons__cols.c-carousel__track .c-reasons__col-body {
    font-weight: 500; padding-right: 0;                                /* Node: w500, Body randlos */
  }
}

/* ============================================================= Methodik-Panel mobil (Advantage)
   (Auftrag 2026-08-15-grow-partner-mobile, S3 · Nodes 14437:67214 [Grow, dunkel + Artikel] /
   14437:67409 [Partner, hell + Logo-Grid]): Sektion pad 8, Panel 344 pad 48/16 gap 56.
   Karten = ENDLICHER Slider (Karte 1 bei x=24, §1.7 — Direktive 1), Karte 258,67x323,34 =
   exakt 4:5 (Direktive 2), pad 16/16/32/16 wie `.c-phase`. Artikel: Eyebrow+Bild(1:1) ->
   Text -> Buttons gestapelt (Sekundaer OBEN per order, DOM-Reihenfolge bleibt — Muster
   Hero-Actions). Dateiende (Reihenfolge-Regel §3.1): schlaegt die Advantage-Mobilregeln
   ~Z. 5640 und die Karussell-Breitenformel. */
@media (max-width: 767px) {
  .c-advantage { padding: 0.5rem; }                                    /* Sektion 8 (Node) */
  .c-advantage__panel { padding: 3rem 1rem; gap: 3.5rem; }             /* 48/16 · gap 56 */
  /* Panel-Sektion wie .c-team/.c-related: Karte startet 8 (Sektion) + 16 (Panel) von der
     Sektionskante — fester 24er-Rand statt --u-margin (clamp waechst, die Panel-Abstaende nicht). */
  .c-advantage .c-carousel { --karussell-rand: calc(var(--u-gutter) + 1rem); }
  .c-advantage__cards { --karten-spalten: 10; }                        /* 258,67 = 10 Spalten */
  .c-advantage__card {
    aspect-ratio: 4 / 5; min-height: 0;                                /* 258,67x323,34 (Node) */
    padding: 1rem 1rem 2rem;                                           /* 16/16/32/16 (Node, wie c-phase) */
  }
  .c-advantage__card-text { gap: 1rem; }                               /* 16 (Desktop 32) */
  .c-advantage__card-head { gap: 0.5rem; }                             /* 8 (Desktop 10) */
  .c-advantage__card-title { font-size: 1.375rem; line-height: 1.75rem; letter-spacing: -0.01em; }   /* 22/28 */
  .c-advantage__card-body { font-weight: 500; }                        /* Node mobil w500 */
  /* Artikel (Grow): Figur [Eyebrow+Bild gap 10] -> 48 -> [Titel+Body gap 24] -> 48 -> Buttons */
  .c-advantage__example { display: flex; flex-direction: column; gap: 3rem; }
  .c-advantage__ex-figure { display: flex; flex-direction: column; gap: 0.625rem; }
  .c-advantage__ex-eyebrow { font-weight: 500; }                       /* Node mobil w500 */
  .c-advantage__ex-media { aspect-ratio: 1 / 1; }                      /* 312x312 (Node, statt 16/10) */
  .c-advantage__ex-content { gap: 1.5rem; }                            /* Titel→Body 24 */
  .c-advantage__ex-text { justify-content: flex-start; gap: 3rem; }    /* Text→Buttons 48 */
  .c-advantage__ex-body { font-size: 1rem; line-height: 1.5rem; font-weight: 500; width: 100%; }   /* 16/24 w500 (Desktop 18/26 w400) */
  .c-advantage__ex-actions { flex-direction: column; align-items: flex-start; }
  .c-advantage__ex-actions > .c-btn:first-child { order: 2; }          /* Sekundaer oben (Node) */
  /* Logo-Strip (Partner): Kopf gap 20, Titel 26/32, Kopf→Grid 56; Logos in Zweierreihen
     zentriert mit 56/56 — bei 312 Containerbreite bricht flex-wrap von selbst auf 2 je Zeile
     (Node: Paar 196 breit, zentriert, Zeilenabstand 56). */
  .c-advantage__logos { padding: 0; gap: 3.5rem; }
  .c-advantage__logos-head { gap: 1.25rem; }
  .c-advantage__logos-title { font-size: 1.625rem; line-height: 2rem; letter-spacing: -0.0488rem; }
  .c-advantage__logos-row { gap: 3.5rem; }
}

/* ============================================================= Foerderzyklus mobil = Timeline-Figur
   (Auftrag 2026-08-15-grow-partner-mobile, S4 · Node 14437:67390 „03 Timeline // Section").
   Der Node loest ein, was ADR 0010 §3 laengst sagt („Foerderzyklus wird auf Mobile zur
   Timeline") — die Bestands-Zaehler-Fassung (Zahlen versteckt, counter vor dem Titel, ~Z. 3995)
   hatte keine Vorlage und damit keine Autoritaet. Figur: 12er-Raster, Zahlenspalte span 3
   (28er-Inhalt, 22/28 w500, Gap 112), Textspalte Spalte 4–12 (= 232 @360, Gap 64) — die
   Spalten laufen wie gezeichnet UNABHAENGIG (Zahlen-Pitch 140, Text-Pitch 194; dieselbe
   Zweispalt-Logik wie die Case-Study-Timeline im Katalog). Zustands-Farben des Nodes
   (01 primary, 02/03 tertiary) sind die Aktiv-Illustration des Scroll-Modus — statisch stehen
   alle primary (FAQ-Praezedenz „Illustration, keine Vorgabe"). Dateiende (Reihenfolge-Regel).
   🔴 Alles auf `:not(--labels)` gescoped: die Jahres-Timeline der About-Historie ist eine
   EIGENE Figur mit eigenem Node (54er-Spalte, Block ~Z. 6290) — ein ungescoptes 12er-Raster
   hier schob deren Textspalte in eine 18px-Zelle (beim Gegenmessen auf /company/ gefunden). */
@media (max-width: 767px) {
  .c-cycle:not(.c-cycle--labels) {
    padding-block: 4.5rem;                                             /* 72 (Node) */
    row-gap: 3rem;                                                     /* Kopf → Spalten 48 */
    grid-template-columns: repeat(12, minmax(0, 1fr));                 /* 12er-Raster bleibt */
  }
  .c-cycle:not(.c-cycle--labels) .c-cycle__head { gap: 1.25rem; }                                     /* Eyebrow → Headline 20 */
  .c-cycle:not(.c-cycle--labels) .c-cycle__eyebrow { font-size: 1rem; line-height: 1.5rem; color: var(--wp--preset--color--text-primary); }   /* 16/24 primary (Node) */
  .c-cycle:not(.c-cycle--labels) .c-cycle__headline { font-size: 1.625rem; line-height: 2rem; letter-spacing: -0.0488rem; }   /* 26/32 */
  .c-cycle:not(.c-cycle--labels) .c-cycle__numbers {
    display: flex; grid-column: 1 / span 3; gap: 7rem; padding: 0;     /* Zahlen ZURUECK · Gap 112 · kein Sticky-Nachlauf */
  }
  .c-cycle:not(.c-cycle--labels) .c-cycle__number {
    font-size: 1.375rem; line-height: 1.75rem; letter-spacing: -0.01em; font-weight: 500;   /* 22/28 */
    color: var(--wp--preset--color--text-primary);
  }
  .c-cycle:not(.c-cycle--labels) .c-cycle__list-wrap { grid-column: 4 / -1; padding-top: 0; }         /* Node x=104 = Spalte 4 → 232 breit; die Desktop-14 (Versalhoehen-Ausgleich der 96er-Zahlen) entfallen — Node: Boxen buendig */
  .c-cycle:not(.c-cycle--labels) .c-cycle__list { gap: 4rem; }                                        /* 64 (Node) */
  /* Aktiv/Passiv bleibt mobil AUS (Bestandsregel Z. ~4021) — mit sichtbarer Zahlenspalte muss
     auch deren Dimmung neutralisiert werden (Node-Farben 01 primary / 02+03 tertiary sind die
     Aktiv-Illustration des Desktop-Scrollmodus, statisch stehen alle voll — FAQ-Praezedenz). */
  .c-cycle--anim:not(.c-cycle--labels) .c-cycle__number { opacity: 1; color: var(--wp--preset--color--text-primary); }
  .c-cycle:not(.c-cycle--labels) .c-cycle__item-title { font-size: 1.125rem; line-height: 1.5rem; letter-spacing: -0.01em; }   /* 18/24 */
  .c-cycle:not(.c-cycle--labels) .c-cycle__item-title::before { content: none; }                      /* Zaehler weg — echte Spalte traegt die Nummer */
  .c-cycle:not(.c-cycle--labels) .c-cycle__item-body { font-weight: 500; }                            /* Node w500 */
}
