/*
 * ag_header — Seitenkopf (Organismus)
 *
 * Quelle  : Figma `header` (1721:32935), Seite 0.5 · gemessen 17.08.2026
 *           Mitwirkend: `nav-overlay` (2696:53716), `nav-toggle` (2693:35040),
 *           `nav-item` (684:241), `lang-switch` (2652:34960),
 *           `icon-button` (2710:35248), `agenic-logo` (4:668).
 * Kontrakt: v0.2 (claude/kontrakt-ag-header.md)
 *
 * Token-Kette: L3 (--ag-header-*) → L2 (--color-*, --spacing-*, --motion-*) → L1.
 * Kein Hex, keine harten Spacings — Ausnahmen sind unten einzeln begründet.
 *
 * Gemessene Geometrie der Quelle (Desktop 1440 × 80):
 *   Wurzel      padding-inline 64 (Values/spacing/xxl), Inhalt unten ausgerichtet
 *   container   1200 (Values/Sizes&Breakpoints/Content), space-between,
 *               padding-bottom 16 (Values/spacing/m), Höhe 56
 *   → 80 = 24 Vorlauf + 40 Inhaltszeile + 16 Nachlauf
 *   logo-nav    gap 32 (Values/spacing/l)   ·  actions-cta gap 24
 *   actions     gap 12                      ·  divider 1 × 24
 * Mobil (375 × 64):
 *   Wurzel      padding-inline 16 (Layout/padding/mobile), Inhalt zentriert
 *   container   343, space-between, Höhe 48 → 64 = 8 + 48 + 8
 *   nav-toggle  48 × 48 (Values/size/control-m)
 * Tablet (768 – 1212) — keine eigene Quelle in Figma:
 *   Wurzel      padding-inline 24, seit 26.08.2026. Kein Kopfmaß, sondern das
 *               Seitenpadding des Bestands (Full-Bleed-Mindestpolster
 *               --spacing-ml); `Layout/padding/*` führt nur `mobile`.
 */

.ag-header {
	/* ── Flächen und Linien ──────────────────────────────────────────── */
	/* Quelle balken/light war Füllung #f8fafa bei 50 % — in Figma NICHT an ein
	   Token gebunden (Befund F41). Auf Surface/lightest stand die Leiste damit
	   auf der eigenen Farbe: Kontrast 1,00 : 1 (gemessen 07.09.2026), die
	   Leiste war dort unsichtbar. Entscheidung Vincent 07.09.2026: dunkler,
	   damit sie auf Surface/light UND Surface/lightest trägt.
	   Surface/medium war zu dunkel, die halbe Stufe ebenfalls (zwei
	   Rueckmeldungen Vincent, 07.09.2026), also ein Viertel der Stufe:
	   Surface/light zu 75 %, Surface/medium zu 25 % = #ccd7d8.
	   ABWEICHUNG von der Figma-Quelle — dort nachzuziehen. */
	/* tmp — fuer die Stufe zwischen Surface/light und Surface/medium gibt es
	   kein Token; beide Enden sind gebunden, der Mischpunkt nicht (Finding). */
	--ag-header-flaeche-basis: color-mix(in srgb, var(--color-surface-light) 75%, var(--color-surface-medium));
	--ag-header-flaeche:      color-mix(in srgb, var(--ag-header-flaeche-basis) 50%, transparent);
	--ag-header-flaeche-fest: var(--color-surface-lightest);   /* deckend bei offenem Overlay */
	--ag-header-linie:        transparent;
	--ag-header-linie-breite: 0px;    /* nur Layout=border zieht eine Linie */
	--ag-header-blur:         12px;

	/* ── Text und Zeichen ────────────────────────────────────────────── */
	--ag-header-text:         var(--color-text-standard);      /* Figma Text/standard */
	--ag-header-text-leise:   var(--color-text-grey);
	--ag-header-lang-aktiv:   var(--color-text-link);          /* Figma Text/link */
	--ag-header-trenner:      var(--color-border);             /* Figma Border */

	/* ── Maße ────────────────────────────────────────────────────────── */
	--ag-header-luft-inline:  var(--spacing-xxl);   /* 64 — Quelle: Values/spacing/xxl */
	--ag-header-luft-oben:    var(--spacing-ml);    /* 24 — 80 − 56 der Quelle        */
	--ag-header-luft-unten:   var(--spacing-m);     /* 16 — Values/spacing/m          */
	--ag-header-zeile:        var(--spacing-xl);    /* 40 — Höhe der Inhaltszeile     */
	--ag-header-gap-gruppe:   var(--spacing-l);     /* 32 — Values/spacing/l          */
	--ag-header-gap-aktionen: var(--spacing-ml);    /* 24                              */
	--ag-header-gap-meta:     var(--spacing-ms);    /* 12                              */
	--ag-header-nav-pad:      var(--spacing-ms);    /* 12 — nav-item padding-inline;
	                                                   schrumpft in der sehr engen
	                                                   Zone auf 8 (A-11)             */
	/* Figma `Values/size/control-m` = 48 hat in tokens.css noch keine Entsprechung
	   (Befund F42). Bis das Token nachgezogen ist, steht der Wert hier als L3. */
	--ag-header-schalter:     48px;

	/* Außenkappe des Kopfes — A-11/A-14 (fortgeschrieben 27.08.2026):
	   Seit A-14 (Entscheidung Vincent, 27.08.2026) liegt die NAV-ZONE
	   (nav + meta + Trenner) im 1200er-Seitenraster (--content-width,
	   Mittelspalte des Grids auf __inner); Logo und CTA sitzen AUSSERHALB
	   davon und docken INNEN an (32 zur Zone über den column-gap — Vorgabe
	   Vincent, gleicher Tag). Die Kappe begrenzt damit nur noch den
	   Innenraum der Leiste, nicht mehr die Position von Logo/CTA.
	   Herleitung, Font-Metrik-Modell vom
	   26.08. (ul 720 live validiert): 1200 Mitte + 2 × 32 column-gap
	   + 2 × 131 Außenspalte (CTA „Kontakt" 131; Logo 100 braucht weniger;
	   der Trenner gehört seit der Präzisierung vom 27.08. in die Mitte)
	   = 1526, Kappe 1600 → 37 px Textreserve je Seite.
	   Die frühere Kappe 1440 (alles zentriert, Quelle
	   Desktop-Frame) ist abgelöst — mit ihr könnte die Mitte nie volle 1200
	   erreichen. ACHTUNG: textabhängig — mit CTA „Kontakt aufnehmen" (+82)
	   wird die rechte Spalte breiter und die Mitte rückt aus der Rastermitte;
	   bei Textänderungen im Kopf nachmessen. Kein Token: bewusst nur für den
	   Header, nicht als gemeinsame Grundlage. */
	--ag-header-inhalt-max:   1600px;
	--ag-header-logo-breite:  100px;                /* Quelle: logo-container 100 × 40 */
	--ag-header-logo-ratio:   4.4;                  /* 633,35 / 143,94 der Wort-Bild-Marke */

	/* ── Bewegung ────────────────────────────────────────────────────── */
	/* Hover am Such-Icon. Entscheidung Vincent, 07.09.2026 (Kandidat A
	   „Schwenk"): die Lupe kippt und wächst leicht. Rezept identisch zur
	   Logo-Drehung — nur `transform`, Dauer `Motion/hover`, Easing
	   `standard` (Figma 0.7 · Animation, shelf/logo-drehung 3978:1640). */
	--ag-header-suche-kippung: -18deg;
	--ag-header-suche-zoom:    1.12;
	--ag-header-suche-dauer:   var(--motion-hover);           /* 350 ms */
	--ag-header-suche-easing:  var(--motion-ease-standard);

	/* Verdichteter Zustand (Klasse `is-gescrollt`, setzt header.js).
	   Nur die Luft schrumpft, die Inhaltszeile bleibt bei 40 — Entscheidung
	   Vincent, 24.08.2026. Damit bewegt sich am Inhalt nichts: Logo, Nav und
	   Aktionen behalten ihre Maße, und die Breitenreserve des
	   Light-→-Medium-Wechsels (A-6) bleibt gültig.
	   Rechnung Desktop: 80 = 24 + 40 + 16  →  56 = 8 + 40 + 8. */
	--ag-header-luft-oben-kompakt:  var(--spacing-s);   /*  8 */
	--ag-header-luft-unten-kompakt: var(--spacing-s);   /*  8 */

	--ag-header-space-before: 0px;
	--ag-header-space-after:  0px;

	box-sizing: border-box;
	position: relative;
	z-index: 100;
	margin-block-start: var(--ag-header-space-before);
	margin-block-end:   var(--ag-header-space-after);
	color: var(--ag-header-text);
}

.ag-header *,
.ag-header *::before,
.ag-header *::after {
	box-sizing: border-box;
}

/* ── Leiste: Fläche über die volle Breite, Inhalt im Container ───────── */
/* Keine max-width auf __inner: Die Außenbegrenzung leistet allein das
   Polster der Leiste (Full-Bleed-Regel). Eine zusätzliche max-width würde
   sich mit dem Polster addieren und den Inhalt schmaler machen. */

.ag-header__leiste {
	padding-block-start: var(--ag-header-luft-oben);
	/* Kappe ist --ag-header-inhalt-max (A-11/A-14): die Außenkante von Logo
	   und CTA. Die NAV-ZONE begrenzt nicht das Polster, sondern die
	   Mittelspalte des Grids auf __inner (--content-width). */
	padding-inline: max(var(--ag-header-luft-inline), calc((100% - var(--ag-header-inhalt-max, 1600px)) / 2));
	background: var(--ag-header-flaeche);
}

/* Drei Spalten (A-14): Außen links (Logo) | Nav-Zone im 1200er-Seitenraster
   | Außen rechts (Trenner + CTA bzw. Burger). Die 1fr-Ränder sind nie
   schmaler als ihr Inhalt (implizites auto-Minimum) — wird es eng, schrumpft
   zuerst die Mitte (minmax(0, …)), und ihr Inhalt weicht über die
   Verdichtungszonen aus (Abschnitt „Breakpoints"). Exakt im Raster liegt die
   Mitte, sobald beide Ränder ihren Platz haben (Innenraum ≥ 1526 — Rechnung
   im Variablenkommentar der Kappe). */
.ag-header__inner {
	display: grid;
	grid-template-columns: 1fr minmax(0, var(--content-width, 1200px)) 1fr;
	align-items: center;
	column-gap: var(--ag-header-gap-gruppe);
	min-block-size: var(--ag-header-zeile);
	padding-block-end: var(--ag-header-luft-unten);
	/* Ohne Linie exakt 0 — sonst wäre der Kopf 81 statt der gemessenen 80 px. */
	border-block-end: var(--ag-header-linie-breite) solid var(--ag-header-linie);
}

/* Spalten EXPLIZIT zuweisen — Auto-Placement-Falle, live gemessen 27.08.2026:
   Mobil ist __mitte display:none und fällt aus dem Auto-Flow; __aktionen
   rückte dadurch in Spalte 2 nach, und der Burger saß NEBEN dem Logo
   (l 148 statt an der Polsterkante) statt space-between. */
.ag-header .ag-header__logo  { grid-column: 1; }
.ag-header__mitte            { grid-column: 2; }
.ag-header__aktionen         { grid-column: 3; }

/* Nav-Zone (Präzisierung Vincent, 27.08.2026): Nav links — das K des ersten
   Punktes auf der Rasterkante —, dann Meta (Suche, Sprachen), zuletzt der
   Trenner exakt AUF der rechten Rasterkante. margin-inline-start: auto am
   Meta schiebt Meta + Trenner nach rechts; der gap hält die Abstände. */
.ag-header__mitte {
	display: flex;
	flex-direction: row;
	align-items: center;
	gap: var(--ag-header-gap-aktionen);
	min-width: 0;
}

.ag-header__mitte > .ag-header__meta {
	margin-inline-start: auto;
}

/* Der erste Punkt rückt um sein eigenes Polster nach links, damit der TEXT
   (das K) auf der Rasterkante liegt — das Polster ist nur die Hover-Pille
   und ragt über die Kante hinaus, wie beim sub-schalter. */
.ag-header__nav-liste > li:first-child .ag-header__nav-link {
	margin-inline-start: calc(var(--ag-header-nav-pad) * -1);
}

/* ── Layout=balken ───────────────────────────────────────────────────── */
/* Fläche, keine Linie. Die halbtransparente Füllung bekommt den Blur, den die
   Quelle beim dunklen border-Kopf führt (BACKGROUND_BLUR) — ohne ihn wird
   Text auf bewegtem Grund unruhig. */

.ag-header--balken .ag-header__leiste {
	backdrop-filter: blur(var(--ag-header-blur));
}

.ag-header--balken.ag-header--dark {
	/* Quelle balken/dark: Surface/darkest, deckend. */
	--ag-header-flaeche:      var(--color-surface-darkest);
	--ag-header-flaeche-fest: var(--color-surface-darkest);
}

/* ── Layout=border ───────────────────────────────────────────────────── */
/* Keine Fläche, eine Linie unter dem Container (nicht über die volle Breite —
   die Quelle setzt den Strich auf `container`, also auf 1200). */

.ag-header--border {
	--ag-header-flaeche:      transparent;
	--ag-header-linie:        var(--color-border);          /* Figma Border */
	--ag-header-linie-breite: var(--border-width-xs, 1px);
}

.ag-header--border.ag-header--dark {
	/* Quelle border/dark: Surface/lightest bei 1 % plus Hintergrund-Blur. */
	--ag-header-flaeche: color-mix(in srgb, var(--color-surface-lightest) 1%, transparent);
	--ag-header-linie:   var(--color-border-inverse);  /* Figma Border--inverse */
}

.ag-header--border.ag-header--dark .ag-header__leiste {
	backdrop-filter: blur(var(--ag-header-blur));
}

/* ── Theme=dark ──────────────────────────────────────────────────────── */

.ag-header--dark {
	--ag-header-text:       var(--color-text-inverse-soft);   /* Figma Text/inverse */
	--ag-header-text-leise: var(--color-text-grey-inverse);   /* Figma Text/grey--inverse */
	--ag-header-lang-aktiv: var(--color-text-inverse-soft);
	--ag-header-trenner:    var(--color-border-soft);         /* Figma Border--subtle */
	--ag-header-flaeche-fest: var(--color-surface-darkest);
}

/* ── Sticky ──────────────────────────────────────────────────────────── */
/* Entscheidung Vincent 19.08.2026: Alle Header-Animationen entfernt, auch das
   Scroll-Umschalten (`is-gescrollt`, transparent → deckend, Entscheidung vom
   11.08.2026 damit aufgehoben). Die Leiste trägt jetzt immer die Fläche der
   Quelle. Abweichung von Kontrakt §7 dokumentiert.

   Die dort angekündigte Neugestaltung ist am 24.08.2026 erfolgt — aber als
   etwas anderes: `is-gescrollt` schaltet NICHT mehr die Fläche um, sondern
   verdichtet die Höhe (Abschnitt „Verdichten" weiter unten). Die Fläche
   bleibt in beiden Zuständen die der Quelle. Wichtig für die Naht zur
   floating pill: `ag_tabs_bar_pill` kopiert Flächenwert und Blur des Headers
   fest in tabs-bar-pill.css (Stil e, `--ecken-weich`, Kontrakt §18.1). Weil
   hier nur Polster wandern, bleibt diese Kopie gültig.

   `--ueberlagern` legt den Kopf ÜBER den Inhalt (position: fixed). Ohne die
   Klasse bleibt er im Fluss (position: sticky) und verdeckt nichts. Der
   Standardwert im Widget ist „nicht überlagern"; siehe Kontrakt §7. */

/* Warum fixiert und nicht `position: sticky`:
   Im Theme Builder steckt das Widget in einem Elementor-Container, der genau so
   hoch ist wie der Kopf. `sticky` klebt nur innerhalb seines Elternteils — es
   gäbe also keinen Weg, an dem der Kopf kleben könnte. Live gemessen am
   17.08.2026: der Kopf scrollte einfach weg. Deshalb wird die **Leiste**
   fixiert, und `.ag-header` selbst hält als Element im Fluss die Höhe frei. */

.ag-header--sticky .ag-header__leiste {
	position: fixed;
	inset-block-start: 0;
	inset-inline: 0;
	z-index: 100;
}

/* Reservierte Höhe = dieselbe Rechnung wie die Leiste. Ohne sie rutschte der
   Inhalt unter den Kopf. Bei `ueberlagern` entfällt sie — genau das ist der
   Unterschied zwischen „klebt oben" und „schwebt über dem Hero". */
.ag-header--sticky:not(.ag-header--ueberlagern) {
	min-block-size: calc(var(--ag-header-luft-oben) + var(--ag-header-zeile) + var(--ag-header-luft-unten) + var(--ag-header-linie-breite));
}

/* ── Verdichten ──────────────────────────────────────────────────────────
   Entscheidung Vincent, 24.08.2026. Keine Figma-Quelle — die Quelle kennt
   keinen Scrollzustand (wie schon A-3). Neue Abweichung A-10, Kontrakt §7.

   Gilt NUR mit `--sticky`. Ohne sticky scrollt die Leiste ohnehin weg; sie
   dabei schrumpfen zu lassen, sähe man nur als Zucken beim Verschwinden.

   Was schrumpft: allein die Luft über und unter der Inhaltszeile. Die Zeile
   selbst (`--ag-header-zeile`), das Logo und die Nav bleiben unangetastet.

   Die Höhenreserve im Fluss schrumpft MIT (Entscheidung Vincent gegen meine
   Empfehlung, 24.08.2026): `min-block-size` rechnet aus denselben Variablen,
   also folgt sie ohne Extra-Code. Bewusst in Kauf genommen: Der Seiteninhalt
   rückt beim Verdichten um 24 px nach oben. Das ist auch der Grund, warum
   die Schwelle in header.js an `window.scrollY` hängt und nicht an einer
   Elementposition — sonst könnte das Hochrücken die Schwelle wieder
   unterschreiten und der Kopf flackerte zwischen beiden Zuständen. */

.ag-header--sticky.is-gescrollt {
	--ag-header-luft-oben:  var(--ag-header-luft-oben-kompakt);
	--ag-header-luft-unten: var(--ag-header-luft-unten-kompakt);
}

/* Bewegung: `xs` (150 ms) und nicht die sonst übliche `s`-Stufe. Zwei Gründe,
   beide gemessen und nicht ästhetisch: (1) Die Verdichtung läuft während des
   Scrollens — je länger sie dauert, desto länger schiebt sich der Inhalt
   unter der Hand weg. (2) `ag_tabs_bar_pill` misst die Header-Unterkante im
   Scroll-Handler; während der Transition scrollt niemand. Ein
   ResizeObserver zieht sie nach (tabs-bar-pill.js), aber jede Millisekunde
   Transition ist eine Millisekunde, in der die Leiste hinterherhängt.
   Nur Polster und Reserve — kein `height`, kein `top`. */
.ag-header--sticky .ag-header__leiste,
.ag-header--sticky .ag-header__inner,
.ag-header--sticky:not(.ag-header--ueberlagern) {
	transition:
		padding-block   var(--motion-duration-xs) var(--motion-ease-standard),
		min-block-size  var(--motion-duration-xs) var(--motion-ease-standard);
}

/* Im Editor steht die Seite still — dort schaltet header.js gar nicht erst,
   die Regel ist die zweite Absicherung (gleiches Muster wie tabs-bar-pill). */
html.ag-editor .ag-header--sticky .ag-header__leiste,
html.ag-editor .ag-header--sticky .ag-header__inner,
html.ag-editor .ag-header--sticky:not(.ag-header--ueberlagern) {
	transition: none;
}

@media (prefers-reduced-motion: reduce) {
	.ag-header--sticky .ag-header__leiste,
	.ag-header--sticky .ag-header__inner,
	.ag-header--sticky:not(.ag-header--ueberlagern) {
		transition: none;   /* Zustand schaltet hart, Verdichtung bleibt */
	}
}

/* Eingeloggt schiebt die WordPress-Adminleiste alles nach unten. Werte aus
   dem WP-Core: 32 px, unter 783 px Breite 46 px. */
body.admin-bar .ag-header--sticky .ag-header__leiste,
body.admin-bar .ag-header.is-offen .ag-header__leiste {
	inset-block-start: 32px;
}

@media screen and (max-width: 782px) {
	body.admin-bar .ag-header--sticky .ag-header__leiste,
	body.admin-bar .ag-header.is-offen .ag-header__leiste {
		inset-block-start: 46px;
	}
}

/* Solange das Overlay offen ist, muss die Leiste sichtbar bleiben — sonst
   fehlt bei nicht-stickem Kopf das Schließkreuz. */
.ag-header.is-offen .ag-header__leiste {
	position: fixed;
	inset-block-start: 0;
	inset-inline: 0;
	z-index: 2;
	background: var(--ag-header-flaeche-fest);
	padding-inline: max(var(--ag-header-luft-inline), calc((100% - var(--ag-header-inhalt-max, 1600px)) / 2));
}

/* ── Marke ───────────────────────────────────────────────────────────── */
/* Der frühere Wrapper __gruppe (Logo + Nav, gap 32) ist mit A-14 entfallen:
   Logo ist direktes Grid-Kind der linken Außenspalte, die Nav steckt in
   __mitte. Den Abstand Logo ↔ Nav-Zone leistet der column-gap des Grids
   (--ag-header-gap-gruppe, dieselbe Leiter wie zuvor). */

.ag-header .ag-header__logo {
	display: inline-flex;
	align-items: center;
	/* Innen andocken (Vorgabe Vincent, 27.08.2026): 32 zur Nav-Zone — das
	   leistet der column-gap des Grids (--ag-header-gap-gruppe, 32;
	   Verdichtungszone 24 nach Token-Leiter). Nicht an der Außenkappe. */
	justify-self: end;
	color: inherit;
	line-height: 0;
	text-decoration: none;
	min-width: var(--ag-header-logo-breite);   /* Safari-Härtung, s. __logo-mark */
}

.ag-header__logo-mark {
	inline-size: var(--ag-header-logo-breite);
	block-size: calc(var(--ag-header-logo-breite) / var(--ag-header-logo-ratio));
	display: block;
	/* Schrumpfschutz im A-14-Grid, live gemessen 27.08.2026: Ein Inline-SVG
	   hat kein natürliches Mindestmaß — die 1fr-Außenspalte ließ das Logo
	   bei 1380 auf 0 kollabieren, während die Mitte ihre 1200 behielt.
	   flex-shrink: 0 gibt dem Anker (flex) ein echtes min-content = Logobreite,
	   damit hält die Spalte ihr Minimum und die MITTE schrumpft zuerst. */
	flex: 0 0 auto;
	/* Safari-Härtung (QS Vincent, 26.09.2026: „agenic Logo nicht sichtbar
	   (Safari)"). VORBEUGEND, nicht in Safari gemessen: WebKit leitet das
	   min-content eines Inline-SVG in Flex/Grid teils aus dem viewBox statt aus
	   den logischen Maßen ab und lässt es in der 1fr-Außenspalte auf 0 fallen —
	   dasselbe Fehlerbild wie am 27.08.2026 in Chrome bei 1380. Deshalb die
	   Maße zusätzlich physisch und als Mindestmaß. In Chrome ändert sich nichts
	   (gleiche Werte). */
	width: var(--ag-header-logo-breite);
	height: calc(var(--ag-header-logo-breite) / var(--ag-header-logo-ratio));
	min-width: var(--ag-header-logo-breite);
}

/* ── Navigation ──────────────────────────────────────────────────────── */
/* nav-item der Quelle: padding 8/12, radius max, Copy/M (Inter Light 16/21,
   Laufweite −2 %). Aktiv und Hover wechseln auf Headline/S (Inter Medium) —
   ein Gewichtswechsel verschiebt sonst das Layout. Deshalb reserviert jeder
   Punkt über ein unsichtbares Doppel in Medium schon die breitere Breite. */

.ag-header__nav {
	min-width: 0;
}

.ag-header__nav-liste,
.ag-header__overlay-liste {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
}

.ag-header__nav-liste {
	flex-direction: row;
	flex-wrap: nowrap;
	gap: 0;                       /* Quelle: nav gap 0, der Abstand steckt im Item */
}

.ag-header .ag-header__nav-link {
	display: inline-block;
	padding-block: var(--spacing-s);    /*  8 */
	padding-inline: var(--ag-header-nav-pad);  /* 12, sehr enge Zone 8 (A-11) */
	border-radius: var(--radius-max);
	color: var(--ag-header-text);
	text-decoration: none;
	font-size: var(--fs-300);           /* 16 */
	line-height: 21px;                  /* Quelle: Copy/M, feste 21 px */
	letter-spacing: -0.02em;            /* Quelle: −2 % */
	font-weight: 300;                   /* Inter Light */
	white-space: nowrap;
}

/* Platzhalter in Medium: gleiche Schrift, Höhe 0, unsichtbar — er zwingt die
   Breite des Punktes auf das Maß des schwereren Schnitts. */
.ag-header .ag-header__nav-link::after {
	content: attr(data-label);
	display: block;
	block-size: 0;
	overflow: hidden;
	visibility: hidden;
	font-weight: 500;
	pointer-events: none;
}

.ag-header .ag-header__nav-link:visited {
	color: var(--ag-header-text);
}

.ag-header .ag-header__nav-link:hover,
.ag-header .ag-header__nav-link:focus-visible,
.ag-header .is-aktiv > .ag-header__nav-link {
	font-weight: 500;                   /* Inter Medium — Quelle State=Hover/Aktiv */
	color: var(--ag-header-text);
}

.ag-header :focus-visible {
	outline: var(--border-width-s, 2px) solid currentColor;
	outline-offset: 2px;
	border-radius: var(--radius-xxs, 4px);
}

/* ── Aktionen ────────────────────────────────────────────────────────── */

.ag-header__aktionen {
	display: flex;
	flex-direction: row;
	align-items: center;
	gap: var(--ag-header-gap-aktionen);   /* 24 */
	/* Innen andocken (Vorgabe Vincent, 27.08.2026): 32 zwischen Trenner und
	   CTA über den column-gap — Gegenstück zum Logo links. Mobil ist die
	   Mitte leer und die Spalte inhaltsbreit; der Burger bleibt rechts. */
	justify-self: start;                  /* rechte Außenspalte (A-14) */
}

.ag-header__meta {
	display: flex;
	flex-direction: row;
	align-items: center;
	gap: var(--ag-header-gap-meta);       /* 12 */
}

/* icon-button der Quelle: 40 × 40, radius max, Glyph 16.
   Abweichung: die Quelle nutzt einen Font-Awesome-Glyph, hier steht ein
   Inline-SVG — dieselbe Regel wie beim Pfeil in ag_button (F25, kein Icon-Font). */
.ag-header .ag-header__suche {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	inline-size: var(--spacing-xl);   /* 40 */
	block-size: var(--spacing-xl);
	border-radius: var(--radius-max);
	color: var(--ag-header-text);
	text-decoration: none;
	flex: 0 0 auto;
}

.ag-header__suche-icon {
	inline-size: var(--fs-300);       /* 16 */
	block-size: var(--fs-300);
	/* Der Griff darf beim Zoom über die 16 hinausragen. */
	overflow: visible;
	/* Drehpunkt ist die Mitte des Lupenkreises (cx 7 / cy 7 der viewBox
	   `0 0 16 16`) = 7/16 = 43,75 % der Zeichenfläche. */
	transform-box: fill-box;
	transform-origin: 43.75% 43.75%;
	transition: transform var(--ag-header-suche-dauer) var(--ag-header-suche-easing);
}

/* Hover und Tastaturfokus zeigen denselben Zustand (Regel 0.7 · Animation). */
.ag-header .ag-header__suche:hover .ag-header__suche-icon,
.ag-header .ag-header__suche:focus-visible .ag-header__suche-icon {
	transform: rotate(var(--ag-header-suche-kippung)) scale(var(--ag-header-suche-zoom));
}

/* Bei reduzierter Bewegung steht die Lupe still. */
@media (prefers-reduced-motion: reduce) {
	.ag-header__suche-icon {
		transition: none;
	}
	.ag-header .ag-header__suche:hover .ag-header__suche-icon,
	.ag-header .ag-header__suche:focus-visible .ag-header__suche-icon {
		transform: none;
	}
}

.ag-header__trenner {
	inline-size: var(--border-width-xs, 1px);
	block-size: var(--spacing-ml);    /* 24 — Quelle: divider 1 × 24 */
	background: var(--ag-header-trenner);
	flex: 0 0 auto;
}

/* ── Sprachumschalter ────────────────────────────────────────────────── */
/* Quelle `lang-switch`: gap 8, Headline/S (Inter Medium 16/21), aktive Sprache
   in Text/link (hell) bzw. Text/inverse (dunkel), inaktive in Text/standard
   bzw. Text/grey--inverse, Trennstrich 1 × 16. */

.ag-header__lang {
	display: flex;
	flex-direction: row;
	align-items: center;
	gap: var(--spacing-s);            /* 8 */
	font-size: var(--fs-300);
	line-height: 21px;
	letter-spacing: -0.02em;
	font-weight: 500;
}

.ag-header .ag-header__lang-label {
	color: var(--ag-header-text-leise);
	text-decoration: none;
}

.ag-header .ag-header__lang-label:visited {
	color: var(--ag-header-text-leise);
}

.ag-header .ag-header__lang-label.is-aktiv {
	color: var(--ag-header-lang-aktiv);
}

.ag-header__lang-trenner {
	inline-size: var(--border-width-xs, 1px);
	block-size: var(--spacing-m);     /* 16 */
	background: var(--ag-header-trenner);
}

/* ── Umschalter (Burger) ─────────────────────────────────────────────── */
/* Quelle `nav-toggle`: 48 × 48, Balkenrahmen 24 × 16, drei Balken 24 × 2,
   Abstand 5. Zustand=offen: Balken 1 und 3 um ±45° gedreht, Balken 2 aus. */

/* Spezifität (0,2,0): Der Elementor-Kit legt auf JEDEN <button> den
   Markenverlauf und helle Schrift (`.elementor-kit-7 button`, 0,1,1).
   Ohne die zusätzliche Klasse wäre der Umschalter ein grüner Kreis. */
.ag-header .ag-header__toggle {
	display: none;                    /* nur am Mobil-Breakpoint */
	align-items: center;
	justify-content: center;
	inline-size: var(--ag-header-schalter);
	block-size: var(--ag-header-schalter);
	padding: 0;
	border: 0;
	background: none;
	background-image: none;
	box-shadow: none;
	color: var(--ag-header-text);
	cursor: pointer;
	border-radius: var(--radius-max);
	flex: 0 0 auto;
}

.ag-header .ag-header__toggle:hover,
.ag-header .ag-header__toggle:focus,
.ag-header .ag-header__toggle:focus-visible,
.ag-header .ag-header__toggle:active {
	background: none;
	background-image: none;
	box-shadow: none;
	color: var(--ag-header-text);
}

.ag-header__bars {
	position: relative;
	display: block;
	inline-size: var(--spacing-ml);   /* 24 */
	block-size: var(--spacing-m);     /* 16 */
}

/* Zustandswechsel zu ↔ offen als Morph statt Hartschnitt (Entscheidung
   Vincent, 26.08.2026, aus HTML-Demo freigegeben; noch ohne Figma-Quelle —
   Rückspiel nach 0.5/0.7 offen). Zwei Phasen:
   Öffnen   → Balken 1/3 fahren sofort zur Mitte und drehen mit Überschwung
              (easing/spring) ins X, Balken 2 klappt ein.
   Schließen→ Balken 1/3 warten eine Stagger-Stufe (erst zurückdrehen),
              Balken 2 blendet währenddessen wieder ein. */
.ag-header__bar {
	position: absolute;
	inset-inline-start: 0;
	inline-size: 100%;
	block-size: 2px;
	background: currentColor;
	transition:
		transform var(--motion-duration-s) var(--motion-ease-spring),
		opacity   var(--motion-duration-xs) var(--motion-ease-standard);
}

.ag-header__bar:nth-child(1) { inset-block-start: 0; }
.ag-header__bar:nth-child(2) { inset-block-start: 7px; }   /* 0 + 2 + 5 */
.ag-header__bar:nth-child(3) { inset-block-start: 14px; }  /* 7 + 2 + 5 */

.ag-header__bar:nth-child(1),
.ag-header__bar:nth-child(3) {
	transition-delay: var(--motion-stagger-m), 0ms;
}

.ag-header__bar:nth-child(2) {
	transform-origin: center;
	transition:
		transform var(--motion-duration-xs) var(--motion-ease-standard),
		opacity   var(--motion-duration-xs) var(--motion-ease-standard);
}

.ag-header.is-offen .ag-header__bar:nth-child(1) { transform: translateY(7px)  rotate(45deg); transition-delay: 0ms; }
.ag-header.is-offen .ag-header__bar:nth-child(2) { transform: scaleX(0); opacity: 0; }
.ag-header.is-offen .ag-header__bar:nth-child(3) { transform: translateY(-7px) rotate(-45deg); transition-delay: 0ms; }

/* Editor steht still (gleiches Muster wie die Sticky-Verdichtung oben). */
html.ag-editor .ag-header__bar {
	transition: none;
}

@media (prefers-reduced-motion: reduce) {
	.ag-header__bar {
		transition: none;   /* Zustand schaltet hart, X bleibt X */
	}
}

/* ── Overlay ─────────────────────────────────────────────────────────── */
/* Quelle `nav-overlay`: Fläche Surface/lightest bzw. Surface/darkest,
   padding 24/16/40/16, gap 32; nav (Zeilen 48), divider, actions (gap 24)
   mit meta (space-between) und Button M über die volle Breite.
   Entscheidung Vincent 11.08.2026: Vollbild von oben, nur Hauptpunkte — seit
   dem 30.09.2026 abgelöst durch Muster A: Ebene 1 bis 3 als Aufklapp-Zeilen
   (Abschnitt „Panel im Overlay", Konzept claude/menue-mobil-ebenen-konzept-30-09.md).
   Das Einfahren von oben ist entfernt (Entscheidung 19.08.2026, Animationen
   raus) — das Overlay erscheint hart; Neugestaltung folgt. */

.ag-header__overlay {
	position: fixed;
	inset-block-start: 0;
	inset-inline: 0;
	block-size: 100dvh;
	z-index: 1;
	display: flex;
	flex-direction: column;
	overflow-y: auto;
	overscroll-behavior: contain;
	background: var(--color-surface-lightest);
	color: var(--ag-header-text);
	padding-block-start: calc(var(--ag-header-luft-oben) + var(--ag-header-zeile) + var(--ag-header-luft-unten));
	visibility: hidden;
}

.ag-header--dark .ag-header__overlay {
	background: var(--color-surface-darkest);
}

.ag-header.is-offen .ag-header__overlay {
	visibility: visible;
}

.ag-header__overlay-inner {
	display: flex;
	flex-direction: column;
	gap: var(--spacing-l);                /* 32 */
	padding-block: var(--spacing-ml) var(--spacing-xl);   /* 24 / 40 */
	padding-inline: var(--spacing-m);     /* 16 */
}

.ag-header__overlay-liste {
	flex-direction: column;
	gap: 0;
}

/* Jede Zeile — Ebene 1 bis 3 — ist 48 hoch (Quelle nav-row 48; seit Muster A
   30.09.2026 auch für Ebene 2 und 3, Values/size/control-m). Spalte statt
   Zeile, damit das Panel unter der Zeile steht; der Schalter sitzt absolut
   am Zeilenende (Abschnitt „Panel im Overlay"). */
.ag-header__overlay-liste__item {
	position: relative;
	display: flex;
	flex-direction: column;
	align-items: stretch;
	min-block-size: var(--ag-header-schalter);   /* 48 */
}

.ag-header__overlay-trenner {
	display: block;
	block-size: var(--border-width-xs, 1px);
	background: var(--ag-header-trenner);
}

.ag-header__overlay-aktionen {
	display: flex;
	flex-direction: column;
	gap: var(--ag-header-gap-aktionen);   /* 24 */
}

.ag-header__overlay-meta {
	display: flex;
	flex-direction: row;
	align-items: center;
	justify-content: space-between;
	min-block-size: var(--spacing-xl);    /* 40 */
}

/* Der Overlay-Button trägt Größe M und volle Breite (Quelle: 343 × 48). */
.ag-header__overlay .ag-header__cta {
	inline-size: 100%;
}

/* ── Breakpoints ─────────────────────────────────────────────────────── */
/* Die Quelle kennt nur Desktop (1440) und Mobil (375). Die Zwischenzonen sind
   Abweichung A-11 (26.08.2026), fortgeschrieben für das A-14-Grid
   (27.08.2026, Font-Metrik-Modell vom 26.08., ul 720 live validiert):
   Mindestbreite verdichtet = Logo 100 + gap 24 + Mitte 877 (ul 720 + gap 16
   + meta 124 + gap 16 + Trenner 1) + gap 24 + Außen rechts 131 (CTA)
   = 1156 — das Grid trennt Logo/CTA von der Nav-Zone, deshalb 25 px mehr
   als die 1131 der alten einteiligen Zeile. Der K-Ausgleich des ersten
   Punktes (−8 verdichtet) ist als Reserve NICHT eingerechnet. Vier Zonen:

   < 1213         Burger + Overlay. Härter geht es nicht: Alle Abstände stehen
                  schon auf der nächstkleineren Token-Stufe, item-pad 8 ist die
                  Untergrenze, bevor sich die Punkte berühren. Grenze gerechnet:
                  1156 + 2×16 Polster + 17 Scrollbar + 8 Reserve = 1213.
                  Das Inline-Polster ist hier das SEITENPADDING der Seite,
                  nicht das Kopfpolster der Quelle: 768–1212 → 24, ≤ 767 → 16
                  (Messung und Begründung am Block unten).
   1213 – 1379    Volle Nav, sehr eng: Polster 16, gruppe-gap 24, gaps 16/8,
                  item-pad 8 — jede Stufe eine Token-Leiter tiefer.
   1380 – 1567    Volle Nav, Quellabstände, nur Polster 64 → 24 (--spacing-ml).
                  Bedarf mit Quellabständen: 100+32+957+32+131 = 1252,
                  + 48 Polster + 17 Scrollbar = 1317 ≤ 1380 (Reserve 63).
   ≥ 1568         Volle Nav, Polster 64, Außenkappe 1600 (A-14). Die Mitte
                  erreicht ihre vollen 1200 ab Innenraum 1526 (≈ Viewport
                  1654) und liegt dann exakt im Seitenraster.

   ACHTUNG, die Grenzen hängen am REDAKTIONSTEXT: Sie sind gegen den heutigen
   Inhalt gerechnet (CTA „Kontakt", 7 Nav-Punkte). Wird der CTA wieder
   „Kontakt aufnehmen" (+82 px) oder kommt ein Nav-Punkt dazu, müssen sie
   steigen. Bei Textänderungen im Kopf: nachmessen. */

@media (max-width: 1212px) {

	.ag-header {
		/* Geometrie des Mobil-Frames: 64 = 8 + 48 + 8. Die Zeile wächst auf
		   die Schaltergröße — das ist das Touch-Ziel, daran wird nicht
		   gespart. */
		--ag-header-luft-oben:   var(--spacing-s);   /* 24 →  8 */
		--ag-header-luft-unten:  var(--spacing-s);   /* 16 →  8 */

		/* Seitenpadding statt Kopfpolster (Auftrag Vincent, 26.08.2026).
		   Bis hierher stand in der ganzen Burger-Zone der Desktop-Wert 64,
		   weil nur ≤ 767 überschrieben wurde — zwischen 768 und 1187 saß der
		   Kopf damit 40 px weiter innen als jede Sektion darunter.
		   Gemessen am Bestand: Sektionen tragen in dieser Zone das
		   Full-Bleed-Mindestpolster `max(var(--spacing-ml), …)` = 24
		   (Regel „Full-Bleed" im Skill; Beispiele tabs-bar-pill.css:734,
		   process-chain-columns.css:50, footer.css:32). Ein eigenes
		   Figma-Token für Tablet gibt es nicht: die Semantics-Sammlung führt
		   `Layout/padding/*` ausschließlich als `mobile` (Alias auf
		   Values/spacing/m = 16), gemessen 26.08.2026. Deshalb hier die
		   Leiterstufe des Bestands, nicht ein neu erfundenes Token. */
		--ag-header-luft-inline: var(--spacing-ml);   /* 64 → 24 */
		--ag-header-zeile:       var(--ag-header-schalter);   /* 40 → 48 */

		/* Verdichtet 64 = 8 + 48 + 8  →  56 = 4 + 48 + 4. */
		--ag-header-luft-oben-kompakt:  var(--spacing-xs);   /* 8 → 4 */
		--ag-header-luft-unten-kompakt: var(--spacing-xs);
	}

	/* Die ganze Nav-Zone (nav + meta) verschwindet mit ihrem Wrapper; die
	   leere Mittelspalte des Grids hält Logo links und Burger rechts —
	   space-between (Vorgabe Vincent, 27.08.2026). */
	.ag-header__mitte,
	.ag-header__trenner,
	.ag-header__inner > .ag-header__aktionen > .ag-header__cta {
		display: none;
	}

	/* Ohne Nav-Zone gibt es innen nichts zum Andocken — der Burger geht an
	   die rechte Polsterkante (überschreibt das Desktop-justify: start). */
	.ag-header__aktionen {
		justify-self: end;
	}

	.ag-header .ag-header__toggle {
		display: inline-flex;
	}
}

/* Sehr enge Desktop-Zone: alles eine Token-Stufe tiefer (A-11). */
@media (min-width: 1213px) and (max-width: 1379px) {

	.ag-header {
		--ag-header-luft-inline:  var(--spacing-m);    /* 64 → 16 */
		--ag-header-gap-gruppe:   var(--spacing-ml);   /* 32 → 24 */
		--ag-header-gap-aktionen: var(--spacing-m);    /* 24 → 16 */
		--ag-header-gap-meta:     var(--spacing-s);    /* 12 →  8 */
		--ag-header-nav-pad:      var(--spacing-s);    /* 12 →  8 */
	}
}

/* Enge Desktop-Zone: Polster 24 statt 64, damit die volle Nav Platz hat. */
@media (min-width: 1380px) and (max-width: 1567px) {

	.ag-header {
		--ag-header-luft-inline: var(--spacing-ml);   /* 64 → 24 */
	}
}

/* Mobil: das einzige Seitenpadding, das die Semantics-Sammlung wirklich führt.
   `Layout/padding/mobile` ist ein Alias auf `Values/spacing/m` (16) — im CSS
   ist --spacing-m die Entsprechung. Gegenprobe: Mobile-content 343 =
   375 − 2 × 16. Steht nach der 1212er-Zone, überschreibt deren 24. */

@media (max-width: 767px) {

	.ag-header {
		--ag-header-luft-inline: var(--spacing-m);   /* 24 → 16, Layout/padding/mobile */
	}
}

@media (min-width: 1213px) {

	/* Das Overlay existiert nur in der Burger-Zone — darüber nie sichtbar,
	   auch nicht, wenn es beim Verkleinern offen war (header.js schließt es
	   zusätzlich beim Umschalten des Breakpoints). */
	.ag-header__overlay {
		display: none;
	}
}

/* ── Bewegung ────────────────────────────────────────────────────────── */
/* Am 19.08.2026 wurden alle Header-Animationen entfernt. Seit dem 24.08.2026
   gibt es genau eine wieder: die Verdichtung der Höhe beim Scrollen. Sie
   steht mitsamt ihren Abschalt-Blöcken (prefers-reduced-motion, Editor) im
   Abschnitt „Verdichten" — dort, wo sie entsteht, und nicht hier unten
   getrennt von ihrer Ursache. Seit dem 26.08.2026 kommt die zweite dazu: das
   Auf- und Zuklappen des Untermenüs. Sie steht aus demselben Grund im
   Abschnitt „Untermenü". */

/* ── Untermenü (Subnavi im Kopf) ─────────────────────────────────────── */
/*
 * Auftrag Vincent, 26.08.2026. Das Panel ist keine eigene Komponente: Es
 * rendert `ag_render_subnavi()` — dasselbe Markup und dieselben Tokens wie
 * das Widget `ag_subnavi`. Hier steht nur, WO das Panel sitzt und WIE es
 * auf- und zugeht; alles Gestalterische steht in subnavi.css.
 *
 * Position: absolut zur Wurzel `.ag-header` (die ist position: relative),
 * nicht zum Listenpunkt. Sonst könnte ein Mega-Panel nie breiter werden als
 * sein Punkt. Für `simple` misst header.js die x-Position des Punktes, zieht
 * seit 21.09.2026 das Panel-Polster ab (damit der Text unter dem Text des
 * Punktes steht) und legt das Ergebnis als --ag-header-sub-x ab — das ist die
 * einzige Stelle, an der das Panel überhaupt von seinem Punkt weiß.
 *
 * Ohne JavaScript bleibt das Attribut `hidden` stehen und es gibt kein
 * Untermenü; die Hauptpunkte bleiben verlinkt und führen auf ihre
 * Übersichtsseite. Bewusst kein reiner :hover-Weg — der ließe sich per
 * Tastatur nicht schließen und käme mit dem Klickzustand ins Gehege.
 */

.ag-header {
	/* Startversatz der Einblendung: das Panel fährt aus der Leiste heraus. */
	--ag-header-sub-versatz: var(--spacing-s);       /*  8 */
	--ag-header-sub-dauer:   var(--motion-duration-s); /* 350ms — Figma motion/duration/s */
	--ag-header-sub-easing:  var(--motion-ease-standard);
	--ag-header-sub-x:       0px;
	/* Seitliches Polster der Panels (21.09.2026: 40) — siehe „Breite Panels". */
	--ag-header-sub-polster: var(--spacing-xl);      /* 40 */
	/* Luft zwischen Leiste und Panel (Vorgabe Vincent, 26.08.2026: 32).
	   Über den Abstand fährt der Zeiger auf dem Weg ins Panel — die Brücke
	   weiter unten hält es dabei offen. */
	--ag-header-sub-abstand: var(--spacing-l);       /* 32 */
}

.ag-header__nav-liste__item.has-sub {
	display: inline-flex;
	align-items: center;
	gap: var(--spacing-xxs);   /* 2 — Schalter sitzt am Wort, nicht daneben */
}

/* Schalter am verlinkten Punkt. Kit-Härtung auf Doppelklasse:
   `.elementor-kit-7 button` (0,1,1) setzt sonst Verlauf, Radius 999 und
   Schriftgrad — dieselbe Falle wie bei ag_tab_item (19.08.2026). */
.ag-header .ag-header__sub-schalter {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	inline-size: var(--spacing-ml);   /* 24 */
	block-size: var(--spacing-ml);
	/* Der Punkt trägt bereits sein Polster — der Schalter rückt in dessen
	   rechte Luft hinein, sonst stünde er sichtbar zu weit vom Wort ab. */
	margin-inline-start: calc(var(--ag-header-nav-pad) * -1);
	padding: 0;
	border: 0;
	border-radius: var(--radius-max);
	background: transparent;
	background-image: none;
	box-shadow: none;
	color: inherit;
	font: inherit;
	cursor: pointer;
}

/* Punkt ohne Ziel ist selbst der Schalter — derselbe Reset, damit er nicht
   als Kit-Pille erscheint. */
.ag-header .ag-header__nav-link--schalter {
	display: inline-flex;
	align-items: center;
	gap: var(--spacing-xxs);
	border: 0;
	background: transparent;
	background-image: none;
	box-shadow: none;
	cursor: pointer;
}

.ag-header__sub-chevron {
	display: block;
	flex: 0 0 auto;
	transition: transform var(--ag-header-sub-dauer) var(--ag-header-sub-easing);
}

.ag-header [aria-expanded="true"] .ag-header__sub-chevron {
	transform: rotate(180deg);
}

/* ── Panel in der Leiste ─────────────────────────────────────────────── */

.ag-header__sub {
	position: absolute;
	top: calc(100% + var(--ag-header-sub-abstand));
	z-index: 3;
	opacity: 0;
	visibility: hidden;
	transform: translateY(calc(var(--ag-header-sub-versatz) * -1));
	pointer-events: none;
	/* visibility springt erst NACH der Blende — sonst verschwindet das Panel
	   im selben Moment, in dem es noch ausblendet. */
	transition:
		opacity   var(--ag-header-sub-dauer) var(--ag-header-sub-easing),
		transform var(--ag-header-sub-dauer) var(--ag-header-sub-easing),
		visibility 0s linear var(--ag-header-sub-dauer);
}

/* Breite Panels (mega, bild-raster) — Entscheidung Vincent 21.09.2026:
   „Content = Container, Box etwas größer, aber zentriert."
   Der INHALT des Panels steht genau auf dem Seitenraster (--content-width,
   dieselbe Mittelspalte wie die Navigation darüber, A-14). Die FLÄCHE ist um
   das Panel-Polster größer — links und rechts gleich, also zentriert.
   Damit liegt der Text zugleich auf der Textlinie des ersten Menüpunkts.

   Löst zwei Regeln ab: Kante auf der Mitte des Logos (20.09.2026) und
   Kante auf der Textlinie links / CTA-Mitte rechts (21.09.2026, Stand
   vormittags) — beide machten das Panel schief. Reines CSS, keine Messung.
   Die Außenluft bleibt Untergrenze: Wird das Fenster so schmal, dass die
   Fläche nicht mehr neben das Raster passt, rückt sie an die Luft heran —
   symmetrisch auf beiden Seiten. */
.ag-header__sub--mega,
.ag-header__sub--bild-raster {
	--ag-header-sub-rand: max(var(--ag-header-luft-inline), calc((100% - var(--content-width, 1200px)) / 2 - var(--ag-header-sub-polster)));

	inset-inline: 0;
	padding-inline: var(--ag-header-sub-rand);
}

/* Das Polster der Panels im Kopf kommt von hier — EINE Quelle für die Rechnung
   oben und für das Polster der Subnavi-Spalte. Wert wie in subnavi.css
   (Entscheidung Vincent 21.09.2026: 32/40). */
.ag-header__sub .ag-subnavi {
	--ag-subnavi-pad-inline: var(--ag-header-sub-polster);
}

/* Simple hängt unter seinem Punkt. Die x-Position misst header.js. */
.ag-header__sub--simple {
	inset-inline-start: var(--ag-header-sub-x);
}

/* Brücke über die Lücke. Ohne sie steht der Zeiger auf dem Weg von der Zeile
   ins Panel für 32 px über nichts — `mouseleave` feuert, und das Menü fährt zu.
   Die Nachlaufzeit in header.js (220 ms) fängt das ab, aber nur, solange man
   zügig geht; wer langsam zielt, verliert das Panel. Die Brücke ist ein
   unsichtbarer Streifen, der genau den Abstand überdeckt — nur am OFFENEN
   Panel, sonst finge sie Klicks auf die Seite darunter ab. */
.ag-header__nav-liste__item.is-sub-offen > .ag-header__sub::before {
	content: "";
	position: absolute;
	inset-block-end: 100%;
	inset-inline: 0;
	block-size: var(--ag-header-sub-abstand);
}

.ag-header__nav-liste__item.is-sub-offen > .ag-header__sub {
	opacity: 1;
	visibility: visible;
	transform: none;
	pointer-events: auto;
	transition-delay: 0s;
}

/* ── Verdunkelung dahinter ───────────────────────────────────────────── */
/* Fläche und Unschärfe kommen aus denselben Tokens wie der ::backdrop der
   Suchpalette (search-palette.css) — ein geöffnetes Untermenü und eine
   geöffnete Suche legen dieselbe Schicht über die Seite. */

.ag-header__scrim {
	position: fixed;
	inset: 0;
	/* Negativ im Stapel des Kopfes: hinter Leiste und Panel, aber weil der
	   Kopf selbst z-index 100 trägt, immer noch über dem Seiteninhalt. */
	z-index: -1;
	background: var(--color-interaction-overlay-scrim);
	-webkit-backdrop-filter: blur(var(--effect-backdrop-blur));
	backdrop-filter: blur(var(--effect-backdrop-blur));
	opacity: 0;
	visibility: hidden;
	transition:
		opacity var(--ag-header-sub-dauer) var(--ag-header-sub-easing),
		visibility 0s linear var(--ag-header-sub-dauer);
}

.ag-header.is-sub-offen .ag-header__scrim {
	opacity: 1;
	visibility: visible;
	transition-delay: 0s;
}

/* ── Panel im Overlay (Burger-Zone) ──────────────────────────────────── */
/* Muster A (Entscheidung Vincent, 30.09.2026; Konzept
   claude/menue-mobil-ebenen-konzept-30-09.md): Ebene 1 bis 3 als
   Aufklapp-Zeilen, jede 48 hoch, Ebene 2 und 3 je eine Stufe eingerückt,
   Gewicht folgt dem Zustand. Das Panel klappt im Fluss auf, nicht darüber —
   auf jeder Ebene dieselbe Klasse, dieselbe Bewegung. `grid-template-rows:
   0fr → 1fr` ist der einzige Weg, eine unbekannte Höhe zu animieren, ohne
   sie zu messen — max-height mit Fantasiewert springt am Ende. */

.ag-header__overlay .ag-header__sub {
	position: static;
	inset: auto;
	top: auto;                 /* hebt die 32-px-Luft der Leiste auf */
	padding-inline: 0;
	transform: none;
	opacity: 1;
	/* `inherit` statt `visible` (QS Vincent, 26.09.2026: „Menütext bleibt nach
	   Auswahl stehen. Menü verschwindet, Text weiter über dem Inhalt bis die
	   Seite neu lädt"). Ein Kind mit `visibility: visible` bleibt sichtbar,
	   auch wenn das Overlay darüber auf `hidden` schaltet — genau das geschah
	   mit einem aufgeklappten Untermenü, sobald ein Link darin das Overlay
	   schloss. So folgt das Panel dem Overlay. */
	visibility: inherit;
	pointer-events: auto;
	display: grid;
	grid-template-rows: 0fr;
	transition: grid-template-rows var(--ag-header-sub-dauer) var(--ag-header-sub-easing);
}

.ag-header__overlay .ag-header__sub > * {
	min-block-size: 0;
	overflow: hidden;
}

.ag-header__overlay .is-sub-offen > .ag-header__sub {
	grid-template-rows: 1fr;
}

/* Ebene 2 und 3 rücken je eine Stufe ein — L3 mit L2-Default (spacing/m);
   Ebene 3 landet damit bei 32 = spacing/l (Konzept 3.4, E4). */
.ag-header__overlay {
	--ag-header-sub-einzug: var(--spacing-m);   /* 16 */
}

.ag-header__overlay-liste--e2,
.ag-header__overlay-liste--e3 {
	padding-inline-start: var(--ag-header-sub-einzug);
}

/* Die Zeile ist das Tippziel: Text senkrecht mittig in 48, darf umbrechen
   (EN-Beschriftungen bis 44 Zeichen, gemessen 30.09.2026), rechts Platz für
   den Schalter. Grid statt Flex, damit das unsichtbare Medium-Doppel
   (::after, Höhe 0) unter dem Text liegt und keine Breite frisst. */
.ag-header__overlay .ag-header__nav-link {
	display: grid;
	grid-template-columns: minmax(0, 1fr);
	align-content: center;
	min-block-size: var(--ag-header-schalter);
	white-space: normal;
	padding-inline-end: calc(var(--ag-header-schalter) + var(--ag-header-nav-pad));
}

/* Offener Punkt: Gewicht folgt dem Zustand (Quelle nav-item, State=Hover/
   Aktiv = Medium) — der offene Pfad wird zur Brotkrume (E4). */
.ag-header__overlay .is-sub-offen > .ag-header__nav-link {
	font-weight: 500;
}

/* Punkt MIT Ziel: eigener Schalter, absolut am Zeilenende. Er darf nicht in
   den Fluss, sonst schöbe er den Link aus seiner Zeile. */
.ag-header__overlay .ag-header__sub-schalter {
	position: absolute;
	inset-block-start: 0;
	inset-inline-end: 0;
	margin-inline-start: 0;
	inline-size: var(--ag-header-schalter);   /* 48 — die ganze Zeilenhöhe als Tippziel */
	block-size: var(--ag-header-schalter);
}

/* Punkt OHNE Ziel: Der Punkt ist selbst der Schalter, das Zeichen sitzt in
   derselben Zeile und wird ans Ende geschoben. */
.ag-header__overlay .ag-header__nav-link--schalter {
	display: flex;
	align-items: center;
	justify-content: space-between;
	inline-size: 100%;
	padding-inline-end: var(--ag-header-nav-pad);   /* Zeichen sitzt in der Zeile, kein Extra-Platz */
	text-align: start;
}

/* Die Overrides für das frühere `simple`-Panel im Overlay (A-13, bis 10.75)
   entfielen mit Muster A — das Overlay verbaut kein .ag-subnavi mehr. */

/* ── Untermenü: Bewegung abschalten ──────────────────────────────────── */

@media (prefers-reduced-motion: reduce) {

	.ag-header__sub,
	.ag-header__scrim,
	.ag-header__sub-chevron,
	.ag-header__overlay .ag-header__sub {
		transition-duration: 1ms;
	}
}

/* Im Editor bleibt alles stehen — dieselbe Regel wie überall (ag-editor
   setzt header.js auf dem <html>-Element). */
.ag-editor .ag-header__sub,
.ag-editor .ag-header__scrim,
.ag-editor .ag-header__sub-chevron {
	transition: none;
}
