/*
 * Ad Astra Lab 2026 – Design-Ergänzungen zu theme.json.
 */

/* ── Eckenradien ──
   Die Skala steht in theme.json unter settings.border.radiusSizes und kommt
   hier als --wp--preset--border-radius--* an. Nicht settings.custom nehmen:
   radiusSizes (WP 6.9+) füttert zusätzlich den Radius-Regler im Block-Editor,
   der damit stufenweise rastet, statt frei px/rem/em laufen zu lassen.
   Keine festen Zahlen mehr im Stylesheet:

     10  0,375rem   Submenü-Einträge
     20  0,5rem     Verbands-Badges
     30  0,625rem   Footer-Logo, Submenü-Karte
     40  0,75rem    FAQ-Items, Inhaltsbilder (is-style-rounded-soft)
     50  1rem       Kacheln, Therapiekarten
     60  1,5rem     Hero-Porträt – der weichste Radius, dem Leitbild vorbehalten
     pill 999px     Buttons, Chips

   60 ist zusätzlich in theme.json der Standard für core/image. Der Wert steht
   dort als `:root :where(.wp-block-image img, …)`, also mit Spezifität 0 –
   jede Regel hier im Stylesheet schlägt ihn, ohne !important. Deshalb bleiben
   Footer-Logo (30) und Inhaltsbilder (40) unverändert eckiger.

   Die 0,25rem am Fokusring unten gehören bewusst nicht zur Skala: Das ist die
   Ecke eines Indikators, keine Fläche. */

/* ── Basis ── */
html {
	scroll-behavior: smooth;
}

::selection {
	background: var(--wp--preset--color--gold);
	color: var(--wp--preset--color--contrast);
}

/* ── Lange Wörter ──
   Deutsch baut Komposita, und die Rechtstexte enthalten volle URLs.
   „Verbraucherschlichtung/Universalschlichtungsstelle" schob das Impressum
   bei 320px um 252px aus dem Bild – als H2 mit 32px umso deutlicher.

   break-word greift erst, wenn ein Wort sonst nicht passt, ändert an normalem
   Textumbruch also nichts. Auf schmalen Schirmen zusätzlich echte Silben-
   trennung für Überschriften: ein Trennstrich liest sich besser als ein
   harter Bruch mitten im Wort. Grundlage ist das lang="de" am <html>. */
body {
	overflow-wrap: break-word;
}

@media (max-width: 599px) {
	.wp-block-heading,
	h1,
	h2,
	h3 {
		-webkit-hyphens: auto;
		hyphens: auto;
	}
}

/* ── Fokus-Indikator ──
   Gold-dark (#c4994a) erreicht auf Weiß nur 2,62:1 und verfehlt damit die
   3:1 aus WCAG 2.2 (1.4.11 Non-text Contrast). Petrol-deep liegt bei 15,08:1
   auf Weiß, 13,74:1 auf Creme und 7,62:1 auf dem Gold-Button; der weiße Halo
   sorgt zusätzlich für Kontrast auf den dunklen Petrol-Flächen.

   Reihenfolge ist Absicht: :focus zuerst als Fallback, weil Safari 15.0–15.3
   :focus-visible noch nicht kennt und eine gruppierte Regel mit unbekanntem
   Selektor komplett verwirft. */
a:focus,
button:focus,
summary:focus,
input:focus,
select:focus,
textarea:focus,
[tabindex]:focus {
	outline: 3px solid var(--wp--preset--color--petrol-deep);
	outline-offset: 2px;
	box-shadow: 0 0 0 5px #fff;
	border-radius: 0.25rem;
}

/* Wo :focus-visible unterstützt wird: Ring nur für Tastatur, nicht für Maus. */
a:focus:not(:focus-visible),
button:focus:not(:focus-visible),
summary:focus:not(:focus-visible),
[tabindex]:focus:not(:focus-visible) {
	outline: none;
	box-shadow: none;
}

/* ── Adminleiste (nur für angemeldete Benutzer) ──
   WordPress schiebt das Dokument per html { margin-top } nach unten und legt
   die Leiste darüber. Jedes fest oder klebend positionierte Element im Theme
   muss diese Höhe kennen, sonst verschwindet es darunter.

   Die Höhe wechselt bei 783px von 32 auf 46px – nicht bei einem der
   Theme-Breakpoints. Deshalb eine eigene Grenze, die WordPress' Wert spiegelt. */
/* Grundwerte auf :root, die Umschaltung auf body – „admin-bar" ist eine
   Body-Klasse. So sind die Variablen auch für Elemente außerhalb von <body>
   definiert; sonst wäre dort jedes calc() damit ungültig und fiele auf 0. */
:root {
	--alab-admin-h: 0px;
	/* Höhe der Topbar, wenn sie sichtbar ist – unter 600px ist sie ausgeblendet.
	   Der klebende Header schiebt sich um genau diesen Betrag nach oben aus dem
	   Bild (siehe „Header: sticky mit Blur"), damit dauerhaft nur die
	   Navigationszeile Platz kostet.

	   Rechenweg: Zeile (0,8125rem × 1,7) + Innenabstand (2 × 0,5rem) = 38,1px.
	   Beide Faktoren sind festgeschrieben – die Zeilenhöhe unten auf
	   `.site-topbar`, der Innenabstand im Pattern `patterns/header.php`.
	   Wer einen davon ändert, muss diesen Wert nachziehen, sonst bleibt entweder
	   ein Streifen Topbar stehen oder die Navigation wird oben angeschnitten. */
	--alab-topbar-h: 0px;
	/* Höhe der dauerhaft klebenden Navigationszeile plus etwas Luft – Grundlage
	   für Sprungziele. Gemessen: 89px unter 600px, 87px darüber. Die Topbar
	   zählt nicht mehr mit, sie ist beim Scrollen weggeklappt; deshalb ein Wert
	   für alle Breiten statt der früheren drei Stufen (6 / 8,5 / 11,25rem).
	   112px lassen rund 24px Luft unter der Leiste – nachgemessen. */
	--alab-sticky-h: 7rem;

	/* Motion-Tokens (animations.dev): ease-out Enter, ease Hover-Farbe,
	   ease-in-out für Bewegung auf dem Schirm. Nur transform/opacity. */
	--alab-ease-out: cubic-bezier(0.23, 1, 0.32, 1);       /* out-quint */
	--alab-ease-move: cubic-bezier(0.645, 0.045, 0.355, 1); /* in-out-cubic */
	--alab-ease-hover: ease;
	--alab-dur-micro: 150ms;
	--alab-dur-ui: 220ms;
	--alab-dur-move: 400ms;
	/* FAQ-Klappe: Chevron (CSS) und Panelhöhe (alab-motion.js) gehören zu
	   einer Geste und laufen deshalb gleich lang. Der Zahlwert steht als
	   FAQ_DUR_OPEN auch in assets/js/src/alab-motion.mjs – beim Ändern
	   beide Stellen nachziehen. */
	--alab-dur-faq: 260ms;

	/* Elevation-Rang: portrait ≈ header > card hover > FAQ open > card rest;
	   Rating = null. Petrol-getönte Schatten, nie reines Schwarz. */
	--alab-elev-rest: 0 1px 2px rgba(6, 42, 54, 0.04), 0 8px 20px -14px rgba(6, 42, 54, 0.10);
	--alab-elev-hover: 0 12px 28px -14px rgba(6, 42, 54, 0.16);
	--alab-elev-faq-open: 0 12px 28px -14px rgba(6, 42, 54, 0.12);
	--alab-elev-portrait: 0 20px 40px -18px rgba(6, 42, 54, 0.22);
	--alab-elev-header: 0 10px 28px -18px rgba(6, 42, 54, 0.28);

	/* Primär-CTA (Design-Vorgabe): Pill, Gold als Fläche, leises Licht von
	   links, weicher Schatten – ruhig genug für eine Praxis, klar genug für
	   Conversion. Kein flaches Flat, kein hartes Metall. */
	--alab-btn-gold: linear-gradient(
		108deg,
		#e2c58f 0%,
		#dbb26f 40%,
		#d4ab62 72%,
		#cfa65c 100%
	);
	--alab-btn-gold-hover: linear-gradient(
		108deg,
		#dbb26f 0%,
		#cda65a 42%,
		#c4994a 100%
	);
	--alab-btn-gold-shadow:
		inset 0 1px 0 rgba(255, 255, 255, 0.4),
		0 6px 18px -8px rgba(6, 42, 54, 0.22),
		0 1px 3px rgba(6, 42, 54, 0.08);
	--alab-btn-gold-shadow-hover:
		inset 0 1px 0 rgba(255, 255, 255, 0.35),
		0 10px 24px -10px rgba(6, 42, 54, 0.26),
		0 2px 4px rgba(6, 42, 54, 0.08);
	--alab-btn-gold-shadow-active:
		inset 0 1px 2px rgba(6, 42, 54, 0.1),
		0 2px 6px -2px rgba(6, 42, 54, 0.16);
}

body.admin-bar {
	--alab-admin-h: 46px;
}

@media (min-width: 600px) {
	:root {
		--alab-topbar-h: calc(0.8125rem * 1.7 + 1rem); /* 38,1px – Rechenweg oben */
	}
}

@media (min-width: 783px) {
	body.admin-bar {
		--alab-admin-h: 32px;
	}
}

/* Unter 783px setzt WordPress die Leiste auf position: absolute – sie scrollt
   dann weg. Für Burger und Schließen-Kreuz heißt das: Der Burger säße bei
   Scrollposition 0 auf y=84, gescrollt auf y=38. Eine feste Position für das
   Kreuz kann beides nicht treffen, und genau davon lebt die Ausrichtung.
   Mit fixed ist die Geometrie konstant – und die Leiste bleibt beim Scrollen
   erreichbar, so wie auf dem Desktop auch. */
@media (max-width: 782px) {
	.admin-bar #wpadminbar {
		position: fixed;
	}
}

/* Die klebende Kopfzeile verdeckt sonst jedes Sprungziel – inkl. dem
   Skip-Link-Ziel. Bei angemeldeten Benutzern kommt die Adminleiste dazu. */
:target,
#wp--skip-link--target,
[id] {
	scroll-margin-top: calc(var(--alab-sticky-h) + var(--alab-admin-h));
}

/* ── Reduzierte Bewegung ──
   Relevant für die Zielgruppe: Angst- und Traumapatienten reagieren
   überdurchschnittlich oft empfindlich auf Bewegung. alab-motion.js startet
   bei reduce gar nicht; CSS killt trotzdem alle Transitionen/Transforms. */
@media (prefers-reduced-motion: reduce) {
	html {
		scroll-behavior: auto;
	}

	*,
	*::before,
	*::after {
		animation-duration: 0.01ms !important;
		animation-iteration-count: 1 !important;
		transition-duration: 0.01ms !important;
		scroll-behavior: auto !important;
	}

	.wp-block-button__link:hover,
	.wp-block-button__link:active,
	.wp-block-group.is-style-kachel:hover,
	.wp-block-group.is-style-kachel:focus-within,
	.alab-tile:hover,
	.alab-tile:focus-within,
	.therapy-card:hover,
	.therapy-card:focus-within,
	.therapy-card:hover .wp-block-cover__image-background,
	.therapy-card:focus-within .wp-block-cover__image-background,
	.site-header .nav-cta > a.wp-block-navigation-item__content:hover,
	.site-header .nav-cta > a.wp-block-navigation-item__content:active,
	.wp-block-navigation .nav-cta > a.wp-block-navigation-item__content:hover,
	.wp-block-navigation .nav-cta > a.wp-block-navigation-item__content:active {
		transform: none;
	}

	.alab-will-reveal {
		opacity: 1 !important;
		transform: none !important;
	}
}

/* Motion.js-Reveal: will-change nur während der Animation (Klasse setzt JS).
   Kein dauerhaftes opacity:0 im CSS – Progressive Enhancement ohne FOUC. */
.alab-will-reveal {
	will-change: transform, opacity;
}

.alab-revealed {
	will-change: auto;
}

/* Boot-Verstecken gegen den Hero-Flicker: `js-alab-motion-boot` setzt ein
   Inline-Skript im Head vor dem ersten Paint (functions.php) – nur mit JS und
   nur ohne prefers-reduced-motion. Die Selektoren spiegeln exakt die Sequenz,
   die initHero() in alab-motion.js einsammelt (Kinder der ersten Spalte plus
   die zweite Spalte). alab-motion.js löst die Klasse beim Start im selben
   synchronen Task, in dem es die Inline-Startwerte setzt; bleibt das Skript
   aus, räumt der Timeout im Head nach 2,5 s ab. Ohne JS existiert die Klasse
   nie – Crawler und No-JS-Besucher sehen den Hero sofort. */
@media screen {
	html.js-alab-motion-boot .home-hero .wp-block-columns > .wp-block-column:first-child > *,
	html.js-alab-motion-boot .home-hero .wp-block-columns > .wp-block-column:nth-child(2) {
		opacity: 0;
	}
}

/* ── Layout-Korrekturen zu Core ──
   Core setzt :where(.wp-site-blocks) > * { margin-block-start: 1.25rem }.
   <header> ist erstes Kind und bekommt 0, <main> erbt die 1,25rem – dadurch
   klaffte zwischen Header-Trennlinie und farbigem Hero eine weiße Lücke.
   Jedes Template steuert seinen oberen Abstand ohnehin über eigenes Padding. */
.wp-site-blocks > main {
	margin-block-start: 0;
}

/* Dieselbe 1,25rem trifft den Footer – nur sitzt sie auf
   <footer class="wp-block-template-part">, nicht auf der Gruppe darin. Ein
   margin-top:0 an `.site-footer` läuft deshalb ins Leere: die beiden Ränder
   kollabieren, der äußere bleibt stehen. Seit der Footer eine eigene helle
   Fläche ist, stand darüber ein weißer Streifen. */
.wp-site-blocks > footer.wp-block-template-part {
	margin-block-start: 0;
}

/* Vollbreite Sektionen stoßen ohne Fuge aneinander.
   Zwischen den Top-Level-Blöcken des Inhalts liegt derselbe blockGap; wo zwei
   farbige Sektionen aufeinandertreffen (Mist → Creme, CTA → Footer), wird
   daraus ein weißer Streifen quer über die Seite. Jede Sektion bringt ihren
   Abstand über eigenes Padding mit, der Zwischenraum ist also nur Störung.
   Die Regel greift ausschließlich, wenn **beide** Nachbarn vollbreit sind –
   normaler Fließtext behält seinen Rhythmus, und eine alignwide-Karte (CTA auf
   Unterseiten) behält ihre Luft.

   Der zweite Selektor ist die Editor-Entsprechung: dort hängen die Blöcke nicht
   in .wp-block-post-content, sondern im Root-Container. Ohne ihn stünden im
   Editor Fugen, die das Frontend nicht hat. */
.wp-block-post-content > .alignfull + .alignfull,
.editor-styles-wrapper .is-root-container > .alignfull + .alignfull {
	margin-block-start: 0;
}

/* ── Grid-Raster ──
   Core rendert für Grid-Layouts repeat(auto-fill, minmax(minimumColumnWidth, 1fr)).
   Zwei Probleme damit:

   1. auto-fill lässt leere Tracks stehen – vier Karten in einem breiten
      Container ergaben fünf Spalten, rechts blieb Platz tot (siehe A14).
   2. Bei auto-fit/auto-fill bestimmt das MAXIMUM der minmax()-Funktion die
      Spaltenzahl, nicht das Minimum. Jede Obergrenze koppelt das Raster damit
      an die genaue Containerbreite: Mit einer auf 1272px passenden Grenze fiel
      ein 1280px-Laptop (Container 1216px) auf zwei Spalten zurück, weil dort
      eine Spalte weniger hineinpasste.

   Deshalb feste Spaltenzahlen pro Breakpoint. Das ist vorhersehbar, füllt die
   Wide-Kante auf jeder Desktop-Breite und hängt an keiner Rechnung, die bei
   geändertem wideSize nachgezogen werden müsste.

   minimumColumnWidth bleibt im Block-Markup stehen: Es ist der Wert, den Core
   ohne dieses Stylesheet verwenden würde. Da main.css über add_editor_style
   auch im Editor läuft, sehen Editor und Frontend dasselbe Raster. */
.wp-block-group.is-layout-grid.alab-grid-cards,
.wp-block-group.is-layout-grid.alab-grid-tiles {
	grid-template-columns: 1fr;
}

@media (min-width: 640px) {
	.wp-block-group.is-layout-grid.alab-grid-cards,
	.wp-block-group.is-layout-grid.alab-grid-tiles {
		grid-template-columns: repeat(2, minmax(0, 1fr));
	}
}

/* Textkacheln ab 1024px dreispaltig – bei 1272px sind das rund 410px je Kachel. */
@media (min-width: 1024px) {
	.wp-block-group.is-layout-grid.alab-grid-tiles {
		grid-template-columns: repeat(3, minmax(0, 1fr));
	}
}

/* Bildkarten erst ab 1200px vierspaltig. Früher wären sie bei 1024px nur 225px
   breit – zu schmal für eine 380px hohe Cover-Box. */
@media (min-width: 1200px) {
	.wp-block-group.is-layout-grid.alab-grid-cards {
		grid-template-columns: repeat(4, minmax(0, 1fr));
	}
}

/* ── Kicker / Sektions-Label ──
   Als Block-Stil registriert (is-style-kicker) und zusätzlich über die alten
   Klassennamen ansprechbar, damit bestehende Seiteninhalte weiterlaufen. */
.is-style-kicker,
.is-style-kicker-zentriert,
.section-label,
.section-label-center {
	font-family: var(--wp--preset--font-family--system-sans);
	font-size: 0.8125rem;
	font-weight: 500;
	letter-spacing: 0.14em;
	text-transform: uppercase;
	color: var(--wp--preset--color--bronze);
	line-height: 1.5;
}

/* box-sizing ist Pflicht: WordPress setzt kein globales border-box. Ohne die
   Zeile addieren Rand und Innenabstand 17px auf die 640px der Textspalte und
   der Kicker steht rechts über die Spalte hinaus. */
.is-style-kicker,
.section-label {
	box-sizing: border-box;
	border-left: 3px solid var(--wp--preset--color--gold);
	padding-left: 0.875rem;
}

.is-style-kicker-zentriert,
.section-label-center {
	border-bottom: 2px solid var(--wp--preset--color--gold);
	display: table;
	margin-left: auto;
	margin-right: auto;
	padding-bottom: 0.625rem;
}

/* ── Vorspann ──
   Größe kommt aus der Preset-Skala (fontSize "large"), hier nur Farbe und
   Zeilenlänge. 34rem bei 20px sind rund 55 Zeichen. */
.is-style-lede,
.hero-lede {
	color: var(--wp--preset--color--muted);
	max-width: 34rem;
	line-height: 1.6;
}

/* Zentrierte Vorspänne (Sektionseinleitungen) mittig begrenzen. */
.is-style-lede.has-text-align-center,
.hero-lede.has-text-align-center {
	margin-left: auto;
	margin-right: auto;
}

/* ── Topbar ── */
.site-topbar {
	font-size: 0.8125rem;
	letter-spacing: 0.02em;
	/* Festgeschrieben, nicht von :root geerbt: `--alab-topbar-h` rechnet mit
	   genau diesem Faktor. Ein geänderter Wurzelwert würde den klebenden Header
	   sonst still um ein paar Pixel verschieben. */
	line-height: 1.7;
}

.site-topbar a {
	color: #d7e2e6;
	text-decoration: none;
}

.site-topbar a:hover {
	color: var(--wp--preset--color--gold);
}

/* Die Topbar lief bis 781px und verschwand dann komplett – zwischen 600 und
   781px stand die Telefonnummer dadurch nirgends im Kopfbereich, denn das
   mobile Overlay mit seiner Aktionsleiste beginnt erst unter 600px.
   Jetzt fällt die Grenze mit Cores Overlay-Grenze zusammen: darüber Topbar,
   darunter Aktionsleiste. Auf schmalen Schirmen bleibt nur die Kontaktzeile,
   Öffnungszeiten und Adresse stehen ohnehin im Footer. */
@media (max-width: 599px) {
	.site-topbar {
		display: none;
	}
}

/* ── Der Umbruch der Topbar ──
   Die Meta-Zeile lief bis 781px – und brach darüber auf zwei Zeilen um, weil
   der Platz nicht reicht. Gemessen: „Mo. – Fr. … Würzburg" ist 444px breit,
   die Kontaktzeile 366px, dazu 20px Abstand = 830px. Der innere Container ist
   Viewport minus 64px Randabstand, gedeckelt auf 1272px – einzeilig also erst
   ab 894px Viewport. Zwischen 782 und 893px stand die Topbar damit 80px hoch
   statt 38px, und der klebende Kopf wuchs auf 169px. Genau die Breiten, auf
   denen Tablets stehen (iPad hoch: 834px).

   Die Grenze liegt jetzt bei 999px – rund 100px Reserve über dem rechnerischen
   Umbruchpunkt, damit auch eine erhöhte Mindestschriftgröße im Browser die
   Zeile nicht kippt. Darunter bleibt die Kontaktzeile mittig stehen, wie schon
   zwischen 600 und 781px; Öffnungszeiten und Adresse stehen im Footer. */
@media (max-width: 999px) {
	.site-topbar .topbar-meta {
		display: none;
	}

	.site-topbar .wp-block-group {
		justify-content: center;
	}
}

/* ── Header: sticky mit Blur ──
   Die drei Custom-Properties sind die Grundlage dafür, dass Burger und
   Schließen-Kreuz im mobilen Menü exakt übereinanderliegen. Beide Buttons
   rechnen ihre Position daraus aus – wer die Logo-Höhe ändert, verschiebt
   damit automatisch beide. Nicht einzeln überschreiben. */
/* ── Der klebende Header ist die Template-Part, nicht die Gruppe darin ──
   `position: sticky` stand auf `.site-header` – und war wirkungslos: Ein
   sticky-Element kann seine Elternbox nie verlassen, und <header> ist nur so
   hoch wie sein Inhalt (149px). Ab dort scrollte der Header einfach mit weg.
   Gemessen: bei Scrollposition 700 stand er auf y=-482.

   Jetzt klebt die Template-Part selbst.

   ── Die Topbar klebt bewusst nicht mit ──
   Anfangs hing sie dauerhaft oben – bequem für die Telefonnummer, aber teuer:
   Zusammen mit der Navigationszeile standen dauerhaft 125px im Bild, auf einem
   iPad quer (768px hoch) also ein Sechstel des Schirms. Der negative
   `top`-Wert schiebt sie beim Scrollen um ihre eigene Höhe aus dem Bild; die
   Navigationszeile bleibt bündig oben stehen. Bei Scrollposition 0 ist wieder
   alles zu sehen, ohne Skript und ohne Sprung.

   Die Telefonnummer geht dabei nicht verloren: unter 600px steht sie in der
   Aktionsleiste des Menü-Overlays (`.nav-tel`), darüber im Footer und auf
   /kontakt/. Und der Kontakt-Button der Navigation bleibt ohnehin sichtbar.

   top rechnet die Adminleiste ein, sonst schiebt sich der Header darunter. */
header.wp-block-template-part {
	position: sticky;
	top: calc(var(--alab-admin-h) - var(--alab-topbar-h));
	z-index: 100;
}

.site-header {
	background: rgba(255, 255, 255, 0.96);
	border-bottom: 1px solid var(--wp--preset--color--border);
	/* Leichter Schlagschatten statt harter Kante: Die klebende Leiste schwebt
	   damit über dem Inhalt statt sich per Haarlinie abzugrenzen. */
	box-shadow: var(--alab-elev-header);

	--alab-tap: 2.75rem;                 /* 44px – Touch-Ziel beider Buttons */
	--alab-logo-h: 4rem;                 /* Logo-Höhe unter 600px */
	--alab-head-pad: 0.75rem;            /* = padding-top/bottom im Pattern */
	--alab-head-h: calc(var(--alab-logo-h) + 2 * var(--alab-head-pad));
	/* Überhang des 44px-Ziels über das 24px-Icon – hält das Icon selbst
	   bündig an der Inhaltskante, während die Trefferfläche darüber hinausragt. */
	--alab-tap-bleed: calc((var(--alab-tap) - 1.5rem) / 2);
	/* Höhe der festen Aktionsleiste im Overlay:
	   1rem + Button 3rem + 0,5rem + Telefonzeile 2,75rem + 1rem */
	--alab-action-h: 8.25rem;
}

/* Blur nur auf Desktop: backdrop-filter macht den Header sonst zum
   Containing Block für das fixe Mobil-Overlay der Navigation. */
@media (min-width: 600px) {
	.site-header {
		background: rgba(255, 255, 255, 0.92);
		-webkit-backdrop-filter: blur(12px);
		backdrop-filter: blur(12px);
	}

	/* ── Abstände in der Hauptnavigation ──
	   Die Einträge standen mit 8px Abstand und ohne Innenabstand nebeneinander –
	   optisch gedrängt, und mit 24px Höhe war die Trefferfläche zu klein.

	   Der verfügbare Platz unterscheidet sich stark: Bei 600px teilen sich Logo
	   und fünf Einträge 552px, ab 1272px sind über 400px frei. Deshalb zwei
	   Bereiche – knapp, aber lesbar unten; großzügig oben.

	   box-sizing ist auch hier nötig: ohne border-box addiert das Padding auf
	   die min-height und die Einträge werden 60 statt 44px hoch. */
	.site-header .wp-block-navigation__container > .wp-block-navigation-item:not(.nav-cta):not(.nav-tel) > .wp-block-navigation-item__content {
		box-sizing: border-box;
		display: flex;
		align-items: center;
		min-height: var(--alab-tap);
	}

	/* Chevron eng am Label: Core setzt margin-left .25em, und das Rechts-
	   padding des Links liegt *zwischen* Text und Icon (Geschwister).
	   SVG-Pfad hat links ohnehin etwas Luft im viewBox – daher 0 + Hauch. */
	.site-header .wp-block-navigation__container > .wp-block-navigation-item.has-child > .wp-block-navigation-item__content {
		padding-right: 0;
	}

	.site-header .wp-block-navigation__container > .wp-block-navigation-item > .wp-block-navigation__submenu-icon {
		margin-left: 0.05em;
		margin-right: 0.1rem;
		/* Trefferfläche halten, optisch aber am Wort kleben. */
		width: 0.55em;
		height: 0.55em;
	}

	/* Das Logo darf nicht mitschrumpfen – sonst zieht die breiter gewordene
	   Navigation es im Flex-Layout zusammen und es wird unscharf klein. */
	.site-header .wp-block-site-logo {
		flex-shrink: 0;
		width: auto;
	}

	.site-header .wp-block-site-logo img {
		width: auto;
	}

	/* Die Telefonzeile gehört nur ins mobile Overlay – ab 600px trägt die
	   Topbar die Nummer. Ein schlichtes `.nav-tel { display: none }` verliert
	   gegen Cores Regeln für Navigationseinträge, daher der volle Pfad. */
	.site-header .wp-block-navigation__container > .nav-tel {
		display: none;
	}
}

/* Enger Bereich: feste, knappe Werte – 16px zwischen den Beschriftungen statt
   der bisherigen 8px, mehr passt neben Logo und Kontakt-Button nicht. */
@media (min-width: 600px) and (max-width: 899px) {
	.site-header .wp-block-site-logo img {
		height: 4rem;
	}

	.site-header .wp-block-navigation__container {
		gap: 0.25rem;
	}

	.site-header .wp-block-navigation__container > .wp-block-navigation-item:not(.nav-cta):not(.nav-tel) > .wp-block-navigation-item__content {
		padding: 0.5rem 0.375rem;
	}

	.site-header .wp-block-navigation__container > .wp-block-navigation-item.has-child > .wp-block-navigation-item__content {
		padding-right: 0;
	}
}

/* Weiter Bereich: ab 1272px stehen 38px zwischen den Beschriftungen. */
/* Das Logo trägt drei Zeilen – „AD ASTRA", „LIFE SKILLS LAB" und die
   Berufsbezeichnung. Bei 120px war die dritte kaum noch lesbar. */
@media (min-width: 900px) {
	.site-header .wp-block-site-logo img {
		height: auto;
		width: 150px;
	}

	.site-header .wp-block-navigation__container {
		gap: clamp(0.375rem, 0.7vw, 0.75rem);
	}

	.site-header .wp-block-navigation__container > .wp-block-navigation-item:not(.nav-cta):not(.nav-tel) > .wp-block-navigation-item__content {
		padding: 0.5rem clamp(0.5rem, 0.9vw, 0.875rem);
	}

	/* Label-Padding rechts 0, damit Chevron am Wort klebt;
	   Abstand zum nächsten Menüpunkt kommt vom Container-gap. */
	.site-header .wp-block-navigation__container > .wp-block-navigation-item.has-child > .wp-block-navigation-item__content {
		padding-right: 0;
	}
}

/* Untermenüs (Desktop-Dropdown): Karte mit Schatten.
   Die Medienabfrage ist Pflicht, nicht Kosmetik: `:not(.is-menu-open)` trifft
   auf Safari 15 auch auf dem Telefon zu, weil dort mangels Interactivity nie
   ein Overlay geöffnet wird. Ohne die Abfrage erbte die statische Mobilliste
   das min-width: 300px der Dropdown-Karte und schob die Seite bei 375px um
   12px aus dem Bild. */
@media (min-width: 600px) {
	.site-header .wp-block-navigation__responsive-container:not(.is-menu-open) .wp-block-navigation__submenu-container {
		border: 1px solid var(--wp--preset--color--border) !important;
		border-radius: var(--wp--preset--border-radius--30);
		box-shadow: 0 14px 30px rgba(6, 42, 54, 0.14);
		padding: 0.4rem !important;
		/* ~20 % schmaler als 300px; längere Labels (Therapie) wachsen weiter mit. */
		min-width: 240px !important;
		background: var(--wp--preset--color--base) !important;
	}

	.site-header .wp-block-navigation__responsive-container:not(.is-menu-open) .wp-block-navigation__submenu-container .wp-block-navigation-item__content {
		border-radius: var(--wp--preset--border-radius--10);
		padding: 0.5rem 0.75rem !important;
		font-size: 0.875rem;
		font-weight: 400;
	}

	.site-header .wp-block-navigation__responsive-container:not(.is-menu-open) .wp-block-navigation__submenu-container .wp-block-navigation-item__content:hover {
		background: var(--wp--preset--color--cream);
		color: var(--wp--preset--color--heading);
	}
}

/* ══════════════════════════════════════════════════════════════════
   MOBILES MENÜ (unter 600px)
   ══════════════════════════════════════════════════════════════════
   Was Core liefert und warum das nicht reicht:

   · Das Schließen-Kreuz sitzt `position: absolute; top: 0; right: 0` – also
     20px rechts und 43px über dem Burger, den es ersetzt. Der Blick springt.
   · Der Overlay-Container ist selbst der Scroll-Container. Ein absolut
     positioniertes Kreuz scrollt mit und ist bei 21 Einträgen nach kurzem
     Wischen aus dem Bild.
   · Die Liste wird als zentrierter Block gesetzt: links klafft ein Gutter von
     über 100px, während die Einträge selbst linksbündig stehen.
   · Der Kontakt-Eintrag bleibt ein 51×24px kleiner Goldschnipsel am Ende der
     Liste – auf einem 844px hohen Telefon unterhalb des Bildschirmrands.

   Der Aufbau hier: feste Kopfleiste oben (Kreuz exakt auf dem Burger), feste
   Aktionsleiste unten (Kontakt + Telefon), dazwischen die scrollende Liste.
   ────────────────────────────────────────────────────────────────── */
@keyframes alab-overlay-fade-in {
	from {
		opacity: 0;
	}

	to {
		opacity: 1;
	}
}

@media (max-width: 599px) {
	/* Die Kopfzeile war 111px hoch – auf einem Telefon ein Achtel des
	   Bildschirms, und sie klebt. 76px reichen. */
	.site-header .wp-block-site-logo,
	.site-header .wp-block-site-logo img {
		width: auto;
		height: var(--alab-logo-h);
	}

	/* Burger auf 44×44 (vorher 24×24, unter der Touch-Empfehlung).
	   Der negative Rand hält das Icon an der Inhaltskante, während die
	   Trefferfläche darüber hinausragt. */
	.site-header .wp-block-navigation__responsive-container-open {
		display: flex;
		align-items: center;
		justify-content: center;
		width: var(--alab-tap);
		height: var(--alab-tap);
		margin-right: calc(-1 * var(--alab-tap-bleed));
	}

	/* ── Overlay-Rahmen ──
	   Zur Spezifität: Core adressiert das Overlay mit Ketten wie
	   `.wp-block-navigation__responsive-container.is-menu-open:not(.disable-default-overlay) …`
	   – vier Klassen. `:not()` und `:where()` zählen dabei unterschiedlich, das
	   Ergebnis liegt aber immer bei (0,4,0). Alle Regeln hier tragen deshalb
	   `.site-header` als fünfte Klasse. Ohne den Präfix gewinnt Core, und zwar
	   still: Nur einzelne Eigenschaften kippen zurück, der Rest sieht richtig aus.

	   Ausrichtung läuft über Cores eigene Layout-Variablen statt über
	   !important – `stretch` macht die Einträge voll breit und linksbündig. */
	.site-header .wp-block-navigation__responsive-container.is-menu-open {
		/* Unterhalb der Kopfzeile beginnen. Damit bleibt zweierlei sichtbar
		   und bedienbar, was Cores Vollbild-Overlay sonst zudeckt: das Logo
		   (Orientierung – man sieht, wo man ist) und die Adminleiste
		   (z-index 100000 gegen 99999 – im offenen Menü käme man sonst nicht
		   mehr ins Backend). Die echte Kopfzeile ersetzt damit die Kopfleiste,
		   die hier vorher als ::before nachgebaut war. */
		top: calc(var(--alab-admin-h) + var(--alab-head-h));
		padding: 0;
		text-align: left;
		--navigation-layout-justification-setting: stretch;
		--navigation-layout-align: stretch;

		/* Cores Öffnen-Animation blendet ein und schiebt dabei um 0,5em hoch.
		   Sie läuft mit animation-fill-mode: forwards, der Endwert
		   transform: translateY(0) bleibt also stehen – als Identitätsmatrix
		   optisch unsichtbar, aber ein Transform macht das Element zum
		   Containing Block für jedes position: fixed darin. Da der Container
		   zugleich der Scroll-Container ist, scrollten Kopfleiste, Kreuz und
		   Aktionsleiste beim Wischen einfach mit weg.

		   Ein einfaches `transform: none` reicht nicht: Animationen schlagen in
		   der Kaskade jede normale Deklaration. Deshalb eine eigene Animation,
		   die nur die Deckkraft bewegt. Der Effekt bleibt, das Transform nicht.
		   Reduzierte Bewegung greift weiterhin über die globale Regel oben. */
		animation: alab-overlay-fade-in 0.15s ease-out both;
	}

	/* Solange das Menü offen ist, ersetzt das Kreuz den Burger – beide
	   zugleich an derselben Stelle wäre Unsinn. `visibility` statt `display`,
	   damit die Kopfzeile ihre Breite behält und nichts springt.
	   `has-modal-open` setzt Core beim Öffnen auf das <html>-Element. */
	.has-modal-open .site-header .wp-block-navigation__responsive-container-open {
		visibility: hidden;
	}

	/* Fläche hinter der Aktionsleiste, damit die Liste nicht durchscheint. */
	.site-header .wp-block-navigation__responsive-container.is-menu-open::after {
		content: "";
		position: fixed;
		left: 0;
		right: 0;
		bottom: 0;
		z-index: 1;
		height: calc(var(--alab-action-h) + env(safe-area-inset-bottom, 0px));
		background: var(--wp--preset--color--base);
		border-top: 1px solid var(--wp--preset--color--border);
	}

	/* Das Kreuz – exakt dort, wo der Burger war.
	   Waagerecht: gleicher Überhang wie beim Burger, dadurch dieselbe Mitte.
	   Senkrecht:  mittig in der Kopfleiste, die Höhe kommt aus denselben Werten.
	   `fixed` statt `absolute`, damit es beim Scrollen der Liste stehen bleibt. */
	.site-header .wp-block-navigation__responsive-container-close {
		position: fixed;
		z-index: 3;
		top: calc(var(--alab-admin-h) + (var(--alab-head-h) - var(--alab-tap)) / 2);
		right: calc(var(--wp--custom--gutter) - var(--alab-tap-bleed));
		display: flex;
		align-items: center;
		justify-content: center;
		width: var(--alab-tap);
		height: var(--alab-tap);
		padding: 0;
		color: var(--wp--preset--color--heading);
	}

	/* ── Liste ──
	   Core setzt hier padding-top: calc(24px + 2rem) – ausgelegt auf sein Kreuz
	   in der Ecke des Vollbild-Overlays. Unseres beginnt bereits unter der
	   Kopfzeile, deshalb genügt ein normaler Abstand. */
	.site-header .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content {
		display: block;
		width: 100%;
		padding: 1.25rem var(--wp--custom--gutter)
			calc(var(--alab-action-h) + 1.5rem + env(safe-area-inset-bottom, 0px));
	}

	/* align-items direkt setzen, nicht nur über die Layout-Variable: Core gibt
	   das justifyContent des Blocks ("right") als Inline-Custom-Property auf
	   genau dieser Liste aus, und die schlägt jeden geerbten Wert. */
	.site-header .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__container,
	.site-header .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__submenu-container,
	.site-header .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item {
		width: 100%;
		gap: 0;
		align-items: stretch;
	}

	/* Gliederung über Haarlinien statt über Einrückungslinien: Der Rand
	   #e5e1d8 erreicht auf Weiß nur 1,30:1 und war als Einrückungsmarke
	   praktisch unsichtbar. Als waagerechter Trenner zwischen Gruppen
	   genügt das – dort ist er Dekoration, keine Information. */
	.site-header .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__container > .wp-block-navigation-item:not(.nav-cta):not(.nav-tel) {
		display: block;
		width: 100%;
		margin-top: 0.5rem;
		padding-top: 0.5rem;
		border-top: 1px solid var(--wp--preset--color--border);
	}

	.site-header .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__container > .wp-block-navigation-item:not(.nav-cta):not(.nav-tel):first-child {
		margin-top: 0;
		padding-top: 0;
		border-top: 0;
	}

	/* Oberste Ebene: Überschrift der Gruppe – und selbst ein Link. */
	.site-header .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__container > .wp-block-navigation-item:not(.nav-cta):not(.nav-tel) > .wp-block-navigation-item__content {
		display: flex;
		align-items: center;
		justify-content: flex-start;
		text-align: left;
		min-height: var(--alab-tap);
		padding: 0.25rem 0;
		font-size: 1.0625rem;
		font-weight: 600;
		color: var(--wp--preset--color--heading);
	}

	/* Zweite Ebene: eingerückt, leichter, aber weiterhin volles Touch-Ziel. */
	.site-header .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__submenu-container {
		display: block;
		width: 100%;
		padding: 0 0 0.25rem !important;
		border: 0 !important;
		box-shadow: none !important;
		min-width: 0 !important;
		background: transparent !important;
	}

	.site-header .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__submenu-container .wp-block-navigation-item__content {
		display: flex;
		align-items: center;
		justify-content: flex-start;
		text-align: left;
		min-height: var(--alab-tap);
		padding: 0.125rem 0 0.125rem 1rem;
		font-size: 1rem;
		font-weight: 400;
		color: var(--wp--preset--color--contrast);
	}

	/* ── Aktionsleiste ──
	   Unter 781px blendet main.css die Topbar aus; im Menü steht die
	   Telefonnummer damit an ihrer einzigen Stelle auf dem Telefon. Für eine
	   Praxis ist der Anruf der kürzeste Weg zum Termin – deshalb fest am
	   unteren Rand statt am Ende einer 21 Einträge langen Liste. */
	.site-header .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__container > .nav-cta,
	.site-header .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__container > .nav-tel {
		position: fixed;
		z-index: 2;
		left: var(--wp--custom--gutter);
		right: var(--wp--custom--gutter);
		width: auto;
		margin: 0;
		padding: 0;
		border-top: 0;
	}

	.site-header .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__container > .nav-cta {
		bottom: calc(1rem + 2.75rem + 0.5rem + env(safe-area-inset-bottom, 0px));
	}

	.site-header .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__container > .nav-tel {
		bottom: calc(1rem + env(safe-area-inset-bottom, 0px));
	}

	/* box-sizing: WordPress setzt kein globales border-box. Ohne die Zeile
	   addiert das Padding des Buttons 40px auf seine 100 % Breite und er läuft
	   rechts aus dem Bild – derselbe Fallstrick wie beim Kicker. */
	.site-header .wp-block-navigation__responsive-container.is-menu-open .nav-cta > a.wp-block-navigation-item__content {
		box-sizing: border-box;
		display: flex;
		align-items: center;
		justify-content: center;
		width: 100%;
		min-height: 3rem;
		padding: 0.85rem 1.5rem;
		font-size: 0.9375rem;
		font-weight: 600;
		letter-spacing: 0.06em;
		text-transform: uppercase;
		line-height: 1.25;
		border-radius: var(--wp--preset--border-radius--pill);
	}

	/* Bronze auf Weiß: 5,03:1. */
	.site-header .wp-block-navigation__responsive-container.is-menu-open .nav-tel > a.wp-block-navigation-item__content {
		box-sizing: border-box;
		display: flex;
		align-items: center;
		justify-content: center;
		width: 100%;
		min-height: var(--alab-tap);
		font-size: 1rem;
		font-weight: 500;
		color: var(--wp--preset--color--bronze);
	}
}

/* Kontakt-Button in der Navigation – gleiches Champagner-Gold wie Primary-CTA.
   border-radius muss auf :focus/:active mit höherer Spezifität stehen:
   die globale a:focus-Regel setzt 0.25rem und würde die Pille sonst eckig. */
.site-header .nav-cta > a.wp-block-navigation-item__content,
.wp-block-navigation .nav-cta > a.wp-block-navigation-item__content,
.site-header .nav-cta > a.wp-block-navigation-item__content:hover,
.wp-block-navigation .nav-cta > a.wp-block-navigation-item__content:hover,
.site-header .nav-cta > a.wp-block-navigation-item__content:focus,
.wp-block-navigation .nav-cta > a.wp-block-navigation-item__content:focus,
.site-header .nav-cta > a.wp-block-navigation-item__content:active,
.wp-block-navigation .nav-cta > a.wp-block-navigation-item__content:active {
	border-radius: var(--wp--preset--border-radius--pill);
}

.site-header .nav-cta > a.wp-block-navigation-item__content,
.wp-block-navigation .nav-cta > a.wp-block-navigation-item__content {
	background-color: var(--wp--preset--color--gold);
	background-image: var(--alab-btn-gold);
	color: var(--wp--preset--color--contrast) !important;
	border: 0;
	padding: 0.6rem 1.35rem;
	font-size: 0.875rem;
	font-weight: 600;
	letter-spacing: 0.06em;
	text-transform: uppercase;
	line-height: 1.25;
	box-shadow: var(--alab-btn-gold-shadow);
	transition:
		background-color var(--alab-dur-micro) var(--alab-ease-hover),
		background-image var(--alab-dur-ui) var(--alab-ease-hover),
		transform var(--alab-dur-micro) var(--alab-ease-out),
		box-shadow var(--alab-dur-ui) var(--alab-ease-hover);
}

@media (hover: hover) and (pointer: fine) {
	.site-header .nav-cta > a.wp-block-navigation-item__content:hover,
	.wp-block-navigation .nav-cta > a.wp-block-navigation-item__content:hover {
		background-color: var(--wp--preset--color--gold-dark);
		background-image: var(--alab-btn-gold-hover);
		transform: translateY(-1px);
		box-shadow: var(--alab-btn-gold-shadow-hover);
	}
}

.site-header .nav-cta > a.wp-block-navigation-item__content:active,
.wp-block-navigation .nav-cta > a.wp-block-navigation-item__content:active {
	transform: scale(0.97);
	box-shadow: var(--alab-btn-gold-shadow-active);
}

/* Fokus: Halo + Gold-Schatten. a:focus:not(:focus-visible) setzt global
   box-shadow:none – deshalb hier den Metallic-Schatten zurückgeben. */
.site-header .nav-cta > a.wp-block-navigation-item__content:focus,
.wp-block-navigation .nav-cta > a.wp-block-navigation-item__content:focus {
	box-shadow: 0 0 0 5px #fff, var(--alab-btn-gold-shadow);
}

.site-header .nav-cta > a.wp-block-navigation-item__content:focus:not(:focus-visible),
.wp-block-navigation .nav-cta > a.wp-block-navigation-item__content:focus:not(:focus-visible) {
	box-shadow: var(--alab-btn-gold-shadow);
}

/* ── Inline-Icons (Font Awesome Free Phone/Envelope, CC BY 4.0 / FA Free License)
   currentColor → erbt Textfarbe von Button, Topbar und Links. */
.alab-icon {
	display: inline-block;
	width: 1em;
	height: 1em;
	margin-right: 0.4em;
	vertical-align: -0.125em;
	line-height: 1;
	flex-shrink: 0;
}

.alab-icon svg {
	display: block;
	width: 100%;
	height: 100%;
}

/* Mobil-Menü: nav-link erlaubt kein SVG im Label – Icon per Mask. */
.site-header .nav-tel > a.wp-block-navigation-item__content::before {
	content: "";
	display: inline-block;
	width: 1em;
	height: 1em;
	margin-right: 0.4em;
	vertical-align: -0.125em;
	background-color: currentColor;
	-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 640 640'%3E%3Cpath fill='black' d='M224.2 89C216.3 70.1 195.7 60.1 176.1 65.4L170.6 66.9C106 84.5 50.8 147.1 66.9 223.3C104 398.3 241.7 536 416.7 573.1C493 589.3 555.5 534 573.1 469.4L574.6 463.9C580 444.2 569.9 423.6 551.1 415.8L453.8 375.3C437.3 368.4 418.2 373.2 406.8 387.1L368.2 434.3C297.9 399.4 241.3 341 208.8 269.3L253 233.3C266.9 222 271.6 202.9 264.8 186.3L224.2 89z'/%3E%3C/svg%3E");
	mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 640 640'%3E%3Cpath fill='black' d='M224.2 89C216.3 70.1 195.7 60.1 176.1 65.4L170.6 66.9C106 84.5 50.8 147.1 66.9 223.3C104 398.3 241.7 536 416.7 573.1C493 589.3 555.5 534 573.1 469.4L574.6 463.9C580 444.2 569.9 423.6 551.1 415.8L453.8 375.3C437.3 368.4 418.2 373.2 406.8 387.1L368.2 434.3C297.9 399.4 241.3 341 208.8 269.3L253 233.3C266.9 222 271.6 202.9 264.8 186.3L224.2 89z'/%3E%3C/svg%3E");
	-webkit-mask-size: contain;
	mask-size: contain;
	-webkit-mask-repeat: no-repeat;
	mask-repeat: no-repeat;
	-webkit-mask-position: center;
	mask-position: center;
}

/* ── Buttons ──
   Primary = weiches Gold (Gradient + Inset-Licht + Schatten).
   Outline bleibt flach/transparent – kein Metallic.
   Pill-Radius auf allen Interaktionszuständen erzwingen (globale a:focus). */
.wp-block-button .wp-block-button__link,
.wp-block-button .wp-block-button__link:hover,
.wp-block-button .wp-block-button__link:focus,
.wp-block-button .wp-block-button__link:active {
	border-radius: var(--wp--preset--border-radius--pill);
}

/* Typo-Vorgabe (KD-2 + ruhige Praxis-Stimme):
   Sans, semi-bold, Versalien mit mäßigem Tracking, 16px – lesbar und
   conversion-klar, ohne Schreiton. theme.json hält den Editor gleich.

   Einheitliche Außenmaße für Primary, Outline und Outline-hell:
   1) Jeder Button trägt 1px Rand – Primary transparent, Outline farbig.
      Ohne das wüchse Outline um 2px (Rahmen) gegenüber Primary.
   2) Padding explizit wie theme.json (0.9rem / 1.75rem). Core setzt auf
      is-style-outline absichtlich kleineres Padding (0.667em / 1.333em),
      weil dort 2px Border vorausgesetzt werden – bei unserem 1px-Rand
      und dem größeren Theme-Padding würde Outline sonst spürbar kleiner. */
.wp-block-button .wp-block-button__link {
	box-sizing: border-box;
	border: 1px solid transparent;
	padding: 0.9rem 1.75rem;
	font-family: var(--wp--preset--font-family--system-sans);
	font-size: 1rem;
	font-weight: 600;
	letter-spacing: 0.06em;
	text-transform: uppercase;
	line-height: 1.25;
}

.wp-block-button:not(.is-style-outline):not(.is-style-outline-light) .wp-block-button__link {
	background-color: var(--wp--preset--color--gold);
	background-image: var(--alab-btn-gold);
	color: var(--wp--preset--color--contrast);
	border-color: transparent;
	box-shadow: var(--alab-btn-gold-shadow);
	transition:
		background-color var(--alab-dur-ui) var(--alab-ease-hover),
		background-image var(--alab-dur-ui) var(--alab-ease-hover),
		border-color var(--alab-dur-ui) var(--alab-ease-hover),
		color var(--alab-dur-ui) var(--alab-ease-hover),
		box-shadow var(--alab-dur-ui) var(--alab-ease-hover),
		transform var(--alab-dur-micro) var(--alab-ease-out);
}

@media (hover: hover) and (pointer: fine) {
	.wp-block-button:not(.is-style-outline):not(.is-style-outline-light) .wp-block-button__link:hover {
		background-color: var(--wp--preset--color--gold-dark);
		background-image: var(--alab-btn-gold-hover);
		transform: translateY(-1px);
		box-shadow: var(--alab-btn-gold-shadow-hover);
	}
}

/* Press: sofortiges Feedback (animations.dev) – auch auf Touch. */
.wp-block-button:not(.is-style-outline):not(.is-style-outline-light) .wp-block-button__link:active {
	transform: scale(0.97);
	box-shadow: var(--alab-btn-gold-shadow-active);
}

.wp-block-button:not(.is-style-outline):not(.is-style-outline-light) .wp-block-button__link:focus {
	box-shadow: 0 0 0 5px #fff, var(--alab-btn-gold-shadow);
}

.wp-block-button:not(.is-style-outline):not(.is-style-outline-light) .wp-block-button__link:focus:not(:focus-visible) {
	box-shadow: var(--alab-btn-gold-shadow);
}

/* Outline teilt die Motion-Sprache des Primary (Lift + Press), bleibt aber
   flach: kein Gold-Gradient, nur ein leiser Petrol-Schatten. */
.is-style-outline .wp-block-button__link,
.is-style-outline-light .wp-block-button__link {
	transition:
		background-color var(--alab-dur-ui) var(--alab-ease-hover),
		border-color var(--alab-dur-ui) var(--alab-ease-hover),
		color var(--alab-dur-ui) var(--alab-ease-hover),
		box-shadow var(--alab-dur-ui) var(--alab-ease-hover),
		transform var(--alab-dur-micro) var(--alab-ease-out);
}

.is-style-outline .wp-block-button__link {
	background: transparent;
	background-image: none;
	border: 1px solid var(--wp--preset--color--heading) !important;
	color: var(--wp--preset--color--heading) !important;
	box-shadow: none;
}

/* bronze-dark statt gold-dark: gold-dark ist als Text 2,62:1 auf Weiß.
   Hover-Lift wie Primary (−1px), Schatten ohne Metallic-Inset. */
@media (hover: hover) and (pointer: fine) {
	.is-style-outline .wp-block-button__link:hover {
		border-color: var(--wp--preset--color--bronze-dark) !important;
		color: var(--wp--preset--color--bronze-dark) !important;
		background: transparent;
		background-image: none;
		transform: translateY(-1px);
		box-shadow:
			0 10px 24px -10px rgba(6, 42, 54, 0.18),
			0 2px 4px rgba(6, 42, 54, 0.06);
	}
}

.is-style-outline .wp-block-button__link:active {
	transform: scale(0.97);
	box-shadow: 0 2px 6px -2px rgba(6, 42, 54, 0.12);
}

/* ── Startseiten-Hero ──
   Warmes Licht aus Gold und Petrol über dem Creme-Grund: zwei Radial-
   Verläufe als background-image. Opazitäten bewusst leise (Gold 0.12 /
   Petrol 0.06), damit H1 und die Trust-Zeile die Hierarchie halten.
   background-color (Creme) bleibt unberührt. */
.home-hero {
	overflow: hidden;
	background-image:
		radial-gradient(46rem 34rem at 88% 8%, rgba(219, 178, 111, 0.12), rgba(219, 178, 111, 0) 70%),
		radial-gradient(38rem 30rem at 4% 96%, rgba(11, 60, 77, 0.06), rgba(11, 60, 77, 0) 70%);
	background-repeat: no-repeat;
}

/* isolation: isolate ist hier die ganze Miete. Der goldene Versatzrahmen unten
   liegt auf z-index: -1. Ohne eigenen Stacking-Context rutscht er hinter den
   Creme-Hintergrund der Hero-Sektion und war schlicht unsichtbar – die
   Dekoration existierte im CSS, aber nicht auf dem Schirm.

   Bildunterschrift: absolut im Bild unten mittig, mit weichem Petrol-Gradient.
   Sonst wächst die <figure> um die Caption und der goldene Versatzrahmen
   (inset:0) wird nach unten unnötig groß. Absolute Caption hält figure = img. */
.hero-portrait,
.wp-block-image.is-style-versatzrahmen {
	position: relative;
	isolation: isolate;
	/* Der Rahmen ist rein dekorativ. Wer die Rundung des Bildes ändert, setzt
	   diese Variable nach, sonst steht ein 24px-Rahmen um ein eckiges Bild. */
	--alab-frame-radius: var(--wp--preset--border-radius--60);
	--alab-frame-offset: 1.125rem;
}

.hero-portrait img {
	border-radius: var(--wp--preset--border-radius--60);
	box-shadow: var(--alab-elev-portrait);
	display: block;
	width: 100%;
	height: auto;
}

.hero-portrait::after,
.wp-block-image.is-style-versatzrahmen::after {
	content: "";
	position: absolute;
	inset: 0;
	transform: translate(var(--alab-frame-offset), var(--alab-frame-offset));
	border: 2px solid var(--wp--preset--color--gold);
	border-radius: var(--alab-frame-radius);
	z-index: -1;
	pointer-events: none;
}

/* ── Block-Stil „Goldener Versatzrahmen" (core/image) ──
   Dieselbe Zeichnung wie am Hero-Porträt, aber frei auf jedem Bild wählbar.

   Ein Unterschied zum Hero: Der steht in einer Sektion mit `overflow: hidden`
   und darf rechts und unten aus seiner Box laufen. Überall sonst gibt es diese
   Zusage nicht – ein Rahmen, der 18px über den Textrand hinausragt, erzeugt auf
   dem Telefon eine waagerechte Scrollleiste. Der Stil reserviert den Platz
   deshalb selbst, und zwar über `padding`, nicht über `margin`: Core zentriert
   `aligncenter` mit `margin-inline: auto`, ein eigener margin-right würde das
   aus der Mitte ziehen. Padding fasst niemand sonst an.

   Der Rahmen sitzt danach mit `inset: 0 offset offset 0` genau auf der
   Bildfläche (inset misst ab der Padding-Box) und wird von dort in den
   reservierten Streifen geschoben. Gesamtabdruck bleibt die Containerbreite.

   Zwei Dinge zum Wissen:
   - Block-Stile schließen sich in WordPress gegenseitig aus. „Goldener
     Versatzrahmen" und „Weich gerundet" sind nicht gleichzeitig wählbar; wer
     beides will, setzt am Block `--alab-frame-radius`.
   - Mit sichtbarer Bildunterschrift umfasst der Rahmen Bild *und* Unterschrift,
     weil er an der <figure> hängt. Am Hero fällt das nicht auf, dort liegt die
     Unterschrift absolut im Bild. Ohne `:has()` – im Theme bewusst nicht im
     Einsatz, siehe CLAUDE.md – lässt sich das nicht sauber unterscheiden. */
.wp-block-image.is-style-versatzrahmen {
	box-sizing: border-box;
	padding-right: var(--alab-frame-offset);
	padding-bottom: var(--alab-frame-offset);
}

.wp-block-image.is-style-versatzrahmen::after {
	inset: 0 var(--alab-frame-offset) var(--alab-frame-offset) 0;
}

.wp-block-image.is-style-versatzrahmen img {
	border-radius: var(--alab-frame-radius);
	display: block;
}

/* Auf schmalen Schirmen frisst der volle Versatz anteilig zu viel Bildbreite.
   Nur der Block-Stil – der Hero behält seine 1,125rem, die sind dort mit dem
   Sektionsraster abgestimmt. */
@media (max-width: 599px) {
	.wp-block-image.is-style-versatzrahmen {
		--alab-frame-offset: 0.75rem;
	}
}

/* Caption über dem Foto – liest sich als dezenter Credit, nicht als
   zweite Box unter dem Rahmen. Gradient nur unten, damit das Porträt
   nicht dunkelt und der Name auf hellen und dunklen Bildbereichen hält. */
.hero-portrait > figcaption,
.hero-portrait .wp-element-caption {
	position: absolute;
	left: 0;
	right: 0;
	bottom: 0;
	z-index: 1;
	box-sizing: border-box;
	margin: 0 !important;
	padding: 2.75rem 1.25rem 0.95rem;
	border-radius: 0 0 var(--wp--preset--border-radius--60) var(--wp--preset--border-radius--60);
	text-align: center;
	font-family: var(--wp--preset--font-family--system-sans);
	font-size: 0.875rem;
	font-weight: 500;
	line-height: 1.35;
	letter-spacing: 0.02em;
	color: #ffffff;
	background: linear-gradient(
		to top,
		rgba(6, 42, 54, 0.78) 0%,
		rgba(6, 42, 54, 0.42) 42%,
		rgba(6, 42, 54, 0) 100%
	);
	text-shadow: 0 1px 2px rgba(0, 0, 0, 0.4);
	pointer-events: none;
}

/* ── Vertrauens-/Badge-Leiste ── */
.alab-badges {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: center;
	gap: 1.25rem 3rem;
}

.alab-badges img {
	height: 56px;
	width: auto;
	filter: grayscale(1);
	opacity: 0.7;
	transition: filter 0.25s ease, opacity 0.25s ease;
}

.alab-badges img:hover {
	filter: none;
	opacity: 1;
}

.alab-badges figcaption,
.alab-badge-text {
	font-family: var(--wp--preset--font-family--system-sans);
	font-size: 0.8125rem;
	letter-spacing: 0.1em;
	text-transform: uppercase;
	color: var(--wp--preset--color--muted);
}

/* ── Verlinkte Karten / Kacheln ──
   .is-style-kachel ist der registrierte Block-Stil für core/group und der Weg,
   den Patterns und Editor nutzen. .alab-tile bleibt als Alias bestehen, weil
   bestehende Seiteninhalte in der Datenbank noch damit arbeiten. */
.wp-block-group.is-style-kachel,
.alab-tile {
	position: relative;
	background: var(--wp--preset--color--base);
	border: 1px solid var(--wp--preset--color--border);
	border-radius: var(--wp--preset--border-radius--50);
	padding: 1.75rem !important;
	box-shadow: var(--alab-elev-rest);
	transition:
		border-color var(--alab-dur-ui) var(--alab-ease-hover),
		transform var(--alab-dur-ui) var(--alab-ease-out),
		box-shadow var(--alab-dur-ui) var(--alab-ease-out);
	height: 100%;
}

/* Hover nur auf echten Zeigern – Touch löst sonst „Sticky Hover“ aus.
   Tastatur: :focus-within mit gleicher Sprache. Kein Gold-Top-Strich. */
@media (hover: hover) and (pointer: fine) {
	.wp-block-group.is-style-kachel:hover,
	.alab-tile:hover {
		border-color: var(--wp--preset--color--gold);
		transform: translateY(-2px);
		box-shadow: var(--alab-elev-hover);
	}
}

.wp-block-group.is-style-kachel:focus-within,
.alab-tile:focus-within {
	border-color: var(--wp--preset--color--gold);
	transform: translateY(-2px);
	box-shadow: var(--alab-elev-hover);
}

/* Kartenüberschrift bewusst kleiner als die H3 der Seitenskala (25px):
   in einer 17rem–24rem breiten Kachel würde die volle Größe zwei bis drei
   Zeilen belegen und die Karten optisch auseinanderziehen. */
.wp-block-group.is-style-kachel h3,
.alab-tile h3 {
	font-size: 1.25rem;
	line-height: 1.35;
	margin-bottom: 0.5rem;
}

.wp-block-group.is-style-kachel h3 a,
.alab-tile h3 a {
	color: var(--wp--preset--color--heading);
	text-decoration: none;
}

/* ── Ganze Karte klickbar, ein einziger Link ──
   Das ::after legt sich als unsichtbare Fläche über die gesamte Karte. Damit
   ist die Karte anklickbar, ohne dass Bild, Text und „Mehr erfahren" je einen
   eigenen <a> brauchen: Für Suchmaschinen bleibt es **ein** Link mit der
   Überschrift als Ankertext statt drei konkurrierender auf dasselbe Ziel.
   Text lässt sich weiterhin markieren – die Fläche liegt nur darüber. */
.wp-block-group.is-style-kachel h3 a::after,
.alab-tile h3 a::after {
	content: "";
	position: absolute;
	inset: 0;
	z-index: 1;
}

.wp-block-group.is-style-kachel p,
.alab-tile p {
	font-size: 1rem;
	color: var(--wp--preset--color--muted);
	margin: 0;
}

.wp-block-group.is-style-kachel .alab-tile-more,
.alab-tile .alab-tile-more {
	display: inline-block;
	margin-top: 0.875rem;
	font-family: var(--wp--preset--font-family--system-sans);
	font-size: 0.8125rem;
	font-weight: 500;
	letter-spacing: 0.06em;
	color: var(--wp--preset--color--bronze);
}

.wp-block-group.is-style-kachel:hover .alab-tile-more,
.wp-block-group.is-style-kachel:focus-within .alab-tile-more,
.alab-tile:hover .alab-tile-more,
.alab-tile:focus-within .alab-tile-more {
	color: var(--wp--preset--color--bronze-dark);
}

/* ── Schrittzahl (Block-Stil für core/paragraph) ──
   Löst die frühere ol.alab-steps ab: die Schritte sind jetzt ein Core-Grid aus
   Kacheln, die Zahl ein normaler Absatz. Gerahmte Medaille in Serif – als
   Ordnungszahl Text, deshalb Bronze auf Creme (4,58:1); der Goldrand ist
   Dekoration. */
.is-style-schrittzahl,
.wp-block-group.is-style-kachel p.is-style-schrittzahl,
.alab-tile p.is-style-schrittzahl {
	box-sizing: border-box;
	display: flex;
	align-items: center;
	justify-content: center;
	width: 3rem;
	height: 3rem;
	border: 1px solid var(--wp--preset--color--gold);
	border-radius: var(--wp--preset--border-radius--pill);
	background: var(--wp--preset--color--cream);
	font-family: var(--wp--preset--font-family--crimson-pro);
	font-size: 1.375rem;
	font-weight: 400;
	line-height: 1;
	color: var(--wp--preset--color--bronze);
	margin: 0 0 1rem;
}

/* ── Therapieangebot-Karten (Cover-Blöcke, Bildkacheln) ── */
.therapy-card {
	border-radius: var(--wp--preset--border-radius--50);
	overflow: hidden;
	box-shadow: 0 10px 24px -8px rgba(6, 42, 54, 0.16);
	transition:
		transform var(--alab-dur-ui) var(--alab-ease-out),
		box-shadow var(--alab-dur-ui) var(--alab-ease-out);
}

@media (hover: hover) and (pointer: fine) {
	.therapy-card:hover {
		transform: translateY(-2px);
		box-shadow: 0 18px 36px -14px rgba(6, 42, 54, 0.24);
	}

	/* Leises Einzoomen des Motivs – 1.03 statt 1.05 (ruhiger). */
	.therapy-card:hover .wp-block-cover__image-background {
		transform: scale(1.03);
	}
}

.therapy-card:focus-within {
	transform: translateY(-2px);
	box-shadow: 0 18px 36px -14px rgba(6, 42, 54, 0.24);
}

.therapy-card .wp-block-cover__image-background {
	transition: transform var(--alab-dur-move) var(--alab-ease-move);
}

.therapy-card:focus-within .wp-block-cover__image-background {
	transform: scale(1.03);
}

.therapy-card .wp-block-cover__background {
	background: linear-gradient(
		to top,
		rgba(6, 42, 54, 0.88) 0%,
		rgba(6, 42, 54, 0.34) 45%,
		rgba(6, 42, 54, 0) 75%
	) !important;
	opacity: 1 !important;
}

.therapy-card h3 {
	color: #fff;
	font-size: 1.375rem;
	line-height: 1.3;
	margin-bottom: 0.25rem;
	text-shadow: 0 1px 3px rgba(0, 0, 0, 0.55);
}

.therapy-card h3 a {
	color: #fff;
	text-decoration: none;
}

.therapy-card h3 a::after {
	content: "";
	position: absolute;
	inset: 0;
	z-index: 2;
}

.therapy-card p {
	color: rgba(255, 255, 255, 0.92);
	font-size: 0.875rem;
	margin: 0;
	text-shadow: 0 1px 3px rgba(0, 0, 0, 0.55);
}

/* ── Titel unterstreichen, sobald die Karte angesteuert wird ──
   Die Karte ist als Ganzes klickbar, der Link sitzt aber nur auf der
   Überschrift. Ohne Rückmeldung an der Überschrift bleibt beim Überfahren
   unklar, wohin der Klick führt – der Schatten allein sagt das nicht.

   currentColor statt einer festen Farbe: Auf den Bildkarten ist die Schrift
   weiß, auf den Textkacheln petrol. So stimmt der Strich in beiden Fällen und
   es entsteht keine neue Kontrastfrage.

   :focus-within deckt die Tastatur mit ab (Safari 10.1+, unkritisch). */
.therapy-card:hover h3 a,
.therapy-card:focus-within h3 a,
.wp-block-group.is-style-kachel:hover h3 a,
.wp-block-group.is-style-kachel:focus-within h3 a,
.alab-tile:hover h3 a,
.alab-tile:focus-within h3 a {
	text-decoration: underline;
	text-decoration-thickness: 1px;
	text-underline-offset: 0.18em;
}

/* ── Themen-Chips ── */
ul.alab-chips {
	list-style: none;
	padding: 0;
	display: flex;
	flex-wrap: wrap;
	gap: 0.625rem;
	margin: 0;
}

ul.alab-chips li {
	border: 1px solid var(--wp--preset--color--border);
	background: var(--wp--preset--color--base);
	border-radius: var(--wp--preset--border-radius--pill);
	padding: 0.5rem 1.125rem;
	font-size: 0.9375rem;
	color: var(--wp--preset--color--contrast);
	margin: 0;
	transition: border-color 0.2s ease, background-color 0.2s ease;
}

ul.alab-chips li:hover {
	border-color: var(--wp--preset--color--gold);
	background: var(--wp--preset--color--cream);
}

/* Die frühere „ol.alab-steps"-Konstruktion (CSS-Counter auf einer Liste, <strong>
   als Pseudo-Überschrift) ist entfallen. Die Ablauf-Schritte sind jetzt ein
   Core-Grid aus .is-style-kachel-Gruppen mit .is-style-schrittzahl – siehe oben. */

/* ── Listen: Marker in Bronze ── */
.wp-block-list li::marker,
.entry-content ul li::marker {
	color: var(--wp--preset--color--bronze);
}

/* ── Breadcrumbs (Yoast) ──
   Die Brotkrumen kommen aus dem Block `yoast-seo/breadcrumbs`; damit liefert
   Yoast auch das BreadcrumbList-Schema in seinem @graph. Der frühere eigene
   ACF-Block gab beides doppelt aus und ist entfallen.

   Yoast rendert ein nacktes <div class="yoast-breadcrumbs"> mit verschachtelten
   <span> und dem Trennzeichen als Textknoten dazwischen – keine Liste, deshalb
   keine ol/li-Regeln mehr. Das <nav> mit Namen kommt aus functions.php.
   Trennzeichen (›) und „Startseite" stehen in den Yoast-Einstellungen. */
.alab-breadcrumbs {
	padding-top: 1.25rem;
	font-size: 0.8125rem;
	color: var(--wp--preset--color--border);
}

/* Die volle Leiste erlaubt einen nahtlosen, cremefarbenen Übergang in den
   Seiten-Hero. Ohne Hero bleibt sie transparent. */
.page-breadcrumb-bar {
	background-color: transparent;
}

/* Such- und Archiv-Listen (Templates search/archive/index). */
.alab-search-result,
.alab-archive-item {
	border-bottom: 1px solid var(--wp--preset--color--border);
}

.alab-search-result .wp-block-post-title a,
.alab-archive-item .wp-block-post-title a {
	text-decoration: none;
}

.alab-search-result .wp-block-post-title a:hover,
.alab-archive-item .wp-block-post-title a:hover {
	text-decoration: underline;
	text-underline-offset: 0.16em;
}

.alab-single__meta {
	color: var(--wp--preset--color--muted);
	font-family: var(--wp--preset--font-family--system-sans);
}

.has-page-intro-hero .page-breadcrumb-bar {
	background-color: var(--wp--preset--color--cream);
}

/* Beim zweispaltigen Seiten-Hero folgen die Brotkrumen derselben Wide-Kante
   wie dessen Spalten. Rechtliche Seiten ohne Hero bleiben in der 640px-
   Textspalte. Der Post-Content-Abstand entfällt zugunsten eines gleichmäßigen
   Innenabstands in der Brotkrumenleiste. */
.has-page-intro-hero .alab-breadcrumbs {
	box-sizing: border-box;
	width: 100%;
	max-width: var(--wp--style--global--wide-size) !important;
	padding-top: 0.875rem;
	padding-bottom: 0.875rem;
}

.has-page-intro-hero main > .entry-content {
	margin-block-start: 0;
}

.alab-breadcrumbs .yoast-breadcrumbs > span {
	display: inline;
	color: var(--wp--preset--color--muted);
}

.alab-breadcrumbs a {
	color: var(--wp--preset--color--muted);
	text-decoration: none;
}

.alab-breadcrumbs a:hover {
	color: var(--wp--preset--color--bronze);
	text-decoration: underline;
	text-underline-offset: 0.18em;
}

.alab-breadcrumbs .breadcrumb_last,
.alab-breadcrumbs [aria-current] {
	color: var(--wp--preset--color--heading);
	font-weight: 500;
}

/* ── FAQ: zweispaltiges Layout (Titel links, Fragen rechts) ──
   Der Titelblock steht als schmale Spalte neben den Fragen, statt zentriert
   darüber. Umgesetzt mit dem Core-Spalten-Block – kein Grid, kein :has(),
   damit die Sektion bis Safari 14 trägt. */

/* Der Vorspann behält seine globale Grenze von 34rem (rund 55 Zeichen): in der
   34%-Spalte greift sie ohnehin nie, im gestapelten Zustand verhindert sie die
   sonst über 700px lange Zeile. Deshalb hier bewusst kein Override.

   Core stapelt Spalten erst unter 782px. Zwischen 782px und 900px bleibt für
   die Fragen weniger als die halbe Zeile übrig – die Klappzeilen brechen dann
   drei- bis vierzeilig um. Deshalb hier früher stapeln.
   !important ist Pflicht: Core setzt seine eigene Stapel-Regel ebenfalls mit
   !important, und die steht in derselben Kaskade. */
@media (max-width: 899px) {
	.alab-faq-split.wp-block-columns:not(.is-not-stacked-on-mobile) {
		flex-wrap: wrap !important;
		row-gap: var(--wp--preset--spacing--50);
	}

	.alab-faq-split.wp-block-columns:not(.is-not-stacked-on-mobile) > .wp-block-column {
		flex-basis: 100% !important;
		flex-grow: 0;
	}
}

/* ── FAQ (Core-Accordion-Block) ── */
.faq-accordion > .wp-block-accordion-item {
	background: var(--wp--preset--color--cream);
	border: 1px solid transparent;
	border-radius: var(--wp--preset--border-radius--40);
	transition: border-color 0.2s ease, background-color 0.2s ease, box-shadow 0.2s ease;
}

.faq-accordion > .wp-block-accordion-item.is-open {
	background: var(--wp--preset--color--base);
	border-color: var(--wp--preset--color--border);
	box-shadow: var(--alab-elev-faq-open);
}

.faq-accordion > .wp-block-accordion-item + .wp-block-accordion-item {
	margin-top: 0.75rem;
}

/* Die Frage ist ein <h3>, würde also 25px erben. In einer Klappzeile ist das
   zu laut – 18px liegt knapp über dem Fließtext und bleibt als Bedienelement
   erkennbar. */
.faq-accordion .wp-block-accordion-heading {
	margin: 0;
	font-size: 1.125rem;
	font-family: var(--wp--preset--font-family--system-sans);
	font-weight: 600;
	letter-spacing: 0;
	color: var(--wp--preset--color--heading);
}

.faq-accordion .wp-block-accordion-heading__toggle {
	padding: 1.0625rem 1.375rem;
	gap: 1rem;
	line-height: 1.45;
}

.faq-accordion .wp-block-accordion-heading__toggle:hover .wp-block-accordion-heading__toggle-title {
	text-decoration: none;
	color: var(--wp--preset--color--bronze);
}

/* Gold auf Creme lag bei 1,80:1 – deutlich unter den geforderten 3:1. */
.faq-accordion .wp-block-accordion-heading__toggle:focus {
	outline: 3px solid var(--wp--preset--color--petrol-deep);
	outline-offset: 2px;
	border-radius: var(--wp--preset--border-radius--20);
}

.faq-accordion .wp-block-accordion-heading__toggle:focus:not(:focus-visible) {
	outline: none;
}

/* Klapp-Indikator: Chevron statt Plus.
   ─────────────────────────────────────
   Core liefert im Markup ein Text-„+" und dreht es beim Öffnen um 45° zum
   Kreuz. Eine Glyphe sitzt aber nie mittig in ihrer Zeilenbox – die Drehung
   lief deshalb sichtbar um einen Punkt neben der optischen Mitte. Wir blenden
   die Glyphe aus (font-size: 0) und maskieren stattdessen ein SVG in die Box:
   eine echte quadratische Fläche, die sich exakt um ihren Mittelpunkt dreht.

   Bewusst als Maske und nicht als <svg> im Pattern: Der Pattern-Inhalt liegt
   längst als post_content in der Datenbank (siehe CLAUDE.md) – eine
   Markup-Änderung erreicht die bestehenden Seiten nicht, diese Regel schon.

   -webkit-mask-* zusätzlich zur ungeprefixten Form: unprefixed kann Safari
   erst ab 15.4, das Theme trägt bis 14. */
.faq-accordion .wp-block-accordion-heading__toggle-icon {
	flex: none;
	width: 0.875rem;
	height: 0.875rem;
	/* Das gelieferte „+" verschwindet, die Box bleibt (Maße in rem). */
	font-size: 0;
	background-color: var(--wp--preset--color--bronze);
	-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.75' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 8.5 12 16.5l8-8'/%3E%3C/svg%3E");
	mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.75' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 8.5 12 16.5l8-8'/%3E%3C/svg%3E");
	-webkit-mask-repeat: no-repeat;
	mask-repeat: no-repeat;
	-webkit-mask-position: center;
	mask-position: center;
	-webkit-mask-size: contain;
	mask-size: contain;
	transform: rotate(0deg);
	transform-origin: 50% 50%;
}

/* Core dreht das „+" hier auf 45° – überschreiben, sonst steht der Chevron
   schräg. Fünf Klassen, damit die Regel unabhängig von der Ladereihenfolge
   gewinnt. */
.faq-accordion .wp-block-accordion-item.is-open > .wp-block-accordion-heading .wp-block-accordion-heading__toggle-icon {
	transform: rotate(180deg);
}

/* Bewegung auf dem Schirm (kein Enter/Exit) → ease-in-out. Dauer wie das
   Panel, beide gehören zu einer Geste. Core klammert seine eigenen
   Übergänge genauso – ohne die Klammer drehte der Chevron auch bei
   prefers-reduced-motion.

   Die lange Selektorkette ist Absicht: Core setzt hier `transform .2s`
   über `.wp-block-accordion-item > .wp-block-accordion-heading …` und
   gewinnt sonst auf Spezifität. */
@media (prefers-reduced-motion: no-preference) {
	.faq-accordion .wp-block-accordion-item > .wp-block-accordion-heading .wp-block-accordion-heading__toggle-icon {
		transition: transform var(--alab-dur-faq) var(--alab-ease-move),
			background-color var(--alab-dur-micro) var(--alab-ease-hover);
	}
}

.faq-accordion .wp-block-accordion-heading__toggle:hover .wp-block-accordion-heading__toggle-icon {
	background-color: var(--wp--preset--color--bronze-dark);
}

/* Der Abstand zwischen Frage und Antwort steckt in der Polsterung, nicht im
   Außenabstand – und das ist keine Geschmacksfrage:

   Core gibt dem offenen Panel den `blockGap` des Flow-Layouts als
   `margin-block-start` (20px) und nullt ihn per `[inert]`, sobald zugeklappt
   wird. Beim Zuklappen kippt der Wert damit in **einem Frame** von 20 auf 0,
   während die Höhe noch animiert – der Antworttext sprang sichtbar nach oben.
   Mit `margin-block-start: 0` schaltet nichts mehr um; den Abstand trägt die
   Polsterung, die von der Höhenanimation sauber mitgeschnitten wird.

   Maße: 8px oben, 18px unten. Vorher waren es 37px (20 Margin + 17 Absatz)
   bzw. 37px (17 Absatz + 20 Polsterung) – beides deutlich zu luftig. Oben
   darf es so knapp sein, weil der Schalter selbst schon 17px Polsterung
   unter der Frage trägt; vom Titel- zum Fließtext bleiben damit rund 35px. */
.faq-accordion .wp-block-accordion-panel {
	margin-block-start: 0;
	padding: 0.5rem 1.375rem 1.125rem;
}

/* Core nullt den oberen Abstand des ersten Panel-Kindes – erstes Kind ist
   hier aber das `<meta itemprop="text">` der Microdata, nicht der Absatz.
   Der brachte seinen eigenen Abstand deshalb zusätzlich mit, und die
   Rückfallebenen (reduced-motion, Safari < 16.4) standen 17px luftiger als
   die animierte Fassung. Die zweite Zeile fängt genau diesen Fall. */
.faq-accordion .wp-block-accordion-panel > :first-child,
.faq-accordion .wp-block-accordion-panel > meta + * {
	margin-block-start: 0;
}

.faq-accordion .wp-block-accordion-panel > :last-child {
	margin-block-end: 0;
}

/* Auf- und Zuklappen animiert `assets/js/alab-motion.js`.
   ──────────────────────────────────────────────────────
   Core versteckt geschlossene Panels per display:none ([inert]) – aus
   display lässt sich nichts animieren. Alles hier hängt deshalb an
   `.js-alab-faq`, und die Klasse setzt das Skript erst, wenn es die Items
   tatsächlich gebunden hat. Nicht `.js-alab-motion` nehmen: Die steht auch
   dann auf <html>, wenn das FAQ ausgestiegen ist – der Antworttext stünde
   dann ohne Polsterung am Kartenrand.

   Ohne die Klasse bleibt es beim Core-Verhalten, hartes Umschalten:
   · prefers-reduced-motion → das Skript startet gar nicht erst. Genau
     richtig, die Zielgruppe umfasst Angst- und Traumapatienten.
   · kein JS, Skriptfehler, Datei fehlt.
   · `.no-interactivity` (Safari < 16.4) → dort liefert der Fallback weiter
     unten die Antworten ohnehin offen aus.

   Die Zugänglichkeit trägt das inert-Attribut selbst, nicht das CSS: Das
   Skript klinkt sich nur unter `.has-interactivity` ein, und das setzt
   Import-Map-Unterstützung voraus (Safari 16.4+) – dort ist inert nativ
   implementiert und nimmt das geschlossene Panel aus Tab-Reihenfolge und
   Accessibility-Baum. */
.js-alab-faq .faq-accordion .wp-block-accordion-panel[inert],
.js-alab-faq .faq-accordion .wp-block-accordion-panel[aria-hidden="true"] {
	display: block;
}

/* Der Innenabstand wandert auf den Wrapper, den das Skript einzieht: Sonst
   bliebe bei height:0 die untere Polsterung als 20px-Streifen stehen. */
.js-alab-faq .faq-accordion .wp-block-accordion-panel {
	padding: 0;
	overflow: hidden;
}

/* `flow-root` ist hier tragend, nicht kosmetisch: Der Wrapper hat oben weder
   Polsterung noch Rahmen, also kollabierte der obere Außenabstand des ersten
   Absatzes aus ihm heraus ins Panel. Der Wrapper maß sich damit um genau
   diesen Betrag zu klein (17px) – das Skript animierte auf den zu kleinen
   Wert und das Panel sprang am Ende auf seine echte Höhe. `flow-root` macht
   den Wrapper zum BFC, der Abstand bleibt drin. An der Darstellung ändert
   sich nichts: Der Absatz sitzt so oder so 17px unter der Panel-Oberkante. */
.js-alab-faq .faq-accordion .alab-faq-panel__inner {
	display: flow-root;
	/* Der Wrapper ist eine reine Mess- und Animationshülle und darf am
	   Blockabstand nicht teilnehmen. Ohne die Null bekäme er den blockGap des
	   Flow-Layouts als oberen Außenabstand. */
	margin: 0;
	padding: 0.5rem 1.375rem 1.125rem;
}

/* Core nullt die Randabstände der Panel-Kinder über `.is-layout-flow >
   :first-child` / `:last-child`. Der Wrapper hat diese Selektoren gekappt –
   der Absatz brachte seinen eigenen Abstand von 17px oben und unten wieder
   mit, zusätzlich zur Polsterung. Hier steht dieselbe Regel eine Ebene
   tiefer, damit die Polsterung oben den Abstand allein bestimmt. */
.js-alab-faq .faq-accordion .alab-faq-panel__inner > :first-child {
	margin-block-start: 0;
}

.js-alab-faq .faq-accordion .alab-faq-panel__inner > :last-child {
	margin-block-end: 0;
}

/* ── Button-Stil: Outline hell (für dunkle Flächen) ──
   Gleiche Lift-/Press-Motion wie Outline und Primary; Schatten etwas
   dunkler, damit er auf Petrol-Flächen noch lesbar ist. */
.wp-block-button.is-style-outline-light .wp-block-button__link {
	background: transparent;
	border: 1px solid rgba(255, 255, 255, 0.4) !important;
	color: #ffffff !important;
	box-shadow: none;
}

@media (hover: hover) and (pointer: fine) {
	.wp-block-button.is-style-outline-light .wp-block-button__link:hover {
		border-color: var(--wp--preset--color--gold) !important;
		background: rgba(255, 255, 255, 0.06);
		color: #ffffff !important;
		transform: translateY(-1px);
		box-shadow:
			0 10px 24px -10px rgba(0, 0, 0, 0.35),
			0 2px 4px rgba(0, 0, 0, 0.12);
	}
}

.wp-block-button.is-style-outline-light .wp-block-button__link:active {
	transform: scale(0.97);
	box-shadow: 0 2px 6px -2px rgba(0, 0, 0, 0.2);
}

/* ── Unterseiten-Hero ──
   Dieselbe visuelle Familie wie der Startseiten-Hero, aber mit einem
   begrenzten Bildausschnitt für die überwiegend querformatigen Seitenmotive. */
.page-intro-hero {
	overflow: hidden;
}

.page-intro-hero__media img {
	display: block;
	width: 100%;
	height: clamp(20rem, 40vw, 31rem);
	object-fit: cover;
	object-position: center;
}

@media (max-width: 781px) {
	/* Visuell beginnt der mobile Hero mit dem Motiv. Die semantische
	   Reihenfolge im HTML bleibt H1 → Bild, damit Screenreader die Seite
	   weiterhin direkt über ihre Überschrift erschließen können.
	   row-gap extra: im Markup ist blockGap nur horizontal (left) gesetzt,
	   deshalb klebte das Motiv am Kicker. */
	.page-intro-hero > .wp-block-columns {
		flex-direction: column-reverse;
		row-gap: var(--wp--preset--spacing--40);
	}
}

/* Altbestand: bleibt als sichere Darstellung erhalten, falls ein noch nicht
   migrierter Seiteninhalt weiterhin mit einem vollbreiten Headerbild arbeitet. */
.page-hero img {
	width: 100%;
	max-height: 400px;
	object-fit: cover;
	object-position: center;
}

@media (min-width: 782px) {
	.page-hero img {
		max-height: 560px;
	}
}

/* Rundes Portrait */
.wp-block-image.is-style-rundes-portrait img,
.portrait-round img {
	border-radius: var(--wp--preset--border-radius--pill);
	box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1);
}

/* Die CTA-Karte auf Unterseiten steht als letzter Block direkt über dem Footer
   und behielt dorthin nur 8px Rest-Abstand. Solange beide dunkel waren, fiel das
   nicht auf; gegen die helle Sandfläche liest eine abgerundete Karte 8px über der
   Kante als Kollision. Nur die Karte (alignwide) – die vollbreite Start-CTA
   (alignfull) schließt bewusst bündig an den Footer an. */
.entry-content > .alignwide.has-petrol-fade-gradient-background:last-child {
	margin-bottom: var(--wp--preset--spacing--50);
}

/* ── Footer (hell, Sand) ──
   Der Footer ist bewusst hell: Die CTA steht unmittelbar darüber und ist die
   einzige große dunkle Fläche der Seite. Gegen einen petrolfarbenen Footer
   verlor sie ihre Kontur – beides las als ein dunkler Block. Sand statt Weiß,
   damit der Footer trotzdem eine eigene Zone bleibt und keine Trennlinie braucht.
   Kontraste auf Sand #efe9df: Petrol-deep 12,5:1 · Bronze-dark 5,9:1 · Muted 5,1:1.
   Kein Gold als Text- oder Icon-Farbe – auf Sand nur 1,6:1 (Gold) bzw. 2,2:1
   (Gold-dark) und damit unter jeder Schwelle. */
.site-footer {
	color: var(--wp--preset--color--contrast);
}

.site-footer a {
	color: var(--wp--preset--color--bronze-dark);
	text-decoration: none;
	transition: color 0.2s ease;
}

.site-footer a:hover {
	color: var(--wp--preset--color--petrol-deep);
	text-decoration: underline;
}

/* Die Footer-Zwischentitel sind Labels, keine Überschriften im Skalensinn –
   deshalb Versalien in Sans, auch wenn Überschriften sonst Serif tragen. */
.site-footer h2 {
	color: var(--wp--preset--color--petrol-deep);
	font-family: var(--wp--preset--font-family--system-sans);
	font-size: 0.8125rem;
	font-weight: 500;
	letter-spacing: 0.14em;
	text-transform: uppercase;
	margin-bottom: 1rem;
}

.site-footer p {
	font-size: 0.9375rem;
}

.site-footer .footer-links p {
	margin: 0 0 0.5625rem;
	font-size: 0.9375rem;
}

/* Der weiße Kasten bleibt – auch auf Sand. Er hebt das Logo als eigene Marke
   heraus und nimmt dieselbe Karten-Optik auf wie die Verbands-Badges darunter. */
.footer-logo img {
	background: #ffffff;
	border-radius: var(--wp--preset--border-radius--30);
	padding: 0.875rem 1rem;
}

.footer-badges {
	display: flex;
	gap: 0.75rem;
	flex-wrap: wrap;
}

/* Die Verbandslogos behalten die weiße Karte: dptv-20Jahre-logo.jpg hat einen
   eingebrannten weißen Hintergrund, der sonst als Rechteck auf Sand stünde.
   Beide Badges gleich behandeln, sonst schwimmt eines und das andere nicht. */
.footer-badges img {
	background: #ffffff;
	border: 1px solid var(--wp--preset--color--border);
	border-radius: var(--wp--preset--border-radius--20);
	padding: 0.5rem;
	height: 64px;
	width: auto;
}

.site-footer .wp-block-social-links a {
	color: var(--wp--preset--color--petrol-deep) !important;
}

.site-footer .wp-block-social-links a:hover {
	color: var(--wp--preset--color--bronze-dark) !important;
}

/* Schlusszeile auf Petrol-deep – Gegenstück zur Topbar, erdet die Seite.
   #8fa5ad auf #062a36 = 5,9:1. */
.footer-bottom {
	font-size: 0.8125rem;
	color: #8fa5ad;
}

.footer-bottom a {
	color: #8fa5ad;
	text-decoration: none;
	transition: color 0.2s ease;
}

.footer-bottom a:hover {
	color: #ffffff;
	text-decoration: underline;
}

/* Bildunterschriften dezent */
figcaption {
	color: var(--wp--preset--color--muted);
	font-size: 0.8125rem;
}

/* Zitate im Fließtext tragen dieselbe Serif-Stimme wie der Slider. */
.wp-block-quote p {
	font-family: var(--wp--preset--font-family--crimson-pro);
	font-size: 1.25rem;
	line-height: 1.55;
}

/* ── Karten-Bilder in Inhaltsseiten ── */
.entry-image-rounded img,
.wp-block-image.is-style-rounded-soft img {
	border-radius: var(--wp--preset--border-radius--40);
	box-shadow: 0 16px 32px -12px rgba(6, 42, 54, 0.2);
}

/* ── Google-Bewertung kompakt (adastralab/google-rating) ──
   Ruhige Trust-Zeile – kein dunkles Pill-Widget.
   Link bronze-dark (AA auf Creme/Mist/Sand/Weiß). Sterne dekorativ.
   Keine eigenen Fokus-Overrides: globaler Petrol-Ring + weißer Halo. */
.alab-google-rating {
	box-sizing: border-box;
	display: inline-flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 0.35rem 0.5rem;
	max-width: 100%;
	padding: 0;
	border-radius: 0;
	background: transparent;
	box-shadow: none;
	font-family: var(--wp--preset--font-family--system-sans);
	font-size: 0.9375rem;
	line-height: 1.4;
	color: var(--wp--preset--color--muted);
}

/* Im Start-Hero: die Bewertung ersetzt den Kicker – gleiche Stimme
   (Sans, Versalien, Bronze, Goldstrich links), kein zweites Label darunter. */
.home-hero .alab-google-rating {
	border-left: 3px solid var(--wp--preset--color--gold);
	padding-left: 0.875rem;
	margin: 0 0 0; /* Abstand zur H1 steuert die Heading-Margin im Inhalt */
	font-size: 0.8125rem;
	font-weight: 500;
	letter-spacing: 0.14em;
	text-transform: uppercase;
	line-height: 1.5;
	color: var(--wp--preset--color--bronze);
}

.alab-google-rating__score,
.alab-google-rating__stars {
	display: inline-flex;
	align-items: center;
}

.alab-google-rating__score {
	gap: 0.35rem;
}

.alab-google-rating__value {
	color: var(--wp--preset--color--heading);
	font-weight: 600;
	font-variant-numeric: tabular-nums;
}

.home-hero .alab-google-rating__value {
	color: var(--wp--preset--color--bronze);
	font-weight: 500;
}

.alab-google-rating__stars {
	gap: 0.05rem;
	color: var(--wp--preset--color--gold-dark);
}

.home-hero .alab-google-rating__stars {
	/* Etwas enger, damit die Zeile wie ein Label sitzt, nicht wie Widget. */
	gap: 0.04rem;
	color: var(--wp--preset--color--gold);
}

.alab-google-rating__star {
	display: block;
	width: 0.875em;
	height: 0.875em;
}

.home-hero .alab-google-rating__star {
	/* Etwas größer als die Versal-Zeile – lesbarer als Schmucksterne. */
	width: 1.2em;
	height: 1.2em;
}

.alab-google-rating__link {
	color: var(--wp--preset--color--bronze-dark);
	font-weight: 500;
	text-decoration: none;
	white-space: nowrap;
	transition: color var(--alab-dur-micro) var(--alab-ease-hover);
}

.home-hero .alab-google-rating__link {
	color: var(--wp--preset--color--bronze);
	letter-spacing: 0.14em;
}

.alab-google-rating__link:hover,
.home-hero .alab-google-rating__link:hover {
	color: var(--wp--preset--color--heading);
	text-decoration: underline;
	text-underline-offset: 0.16em;
}

/* ── Rezensionen-Slider (adastralab/testimonials) ──
   Ohne JavaScript stehen mehrere Zitate untereinander; erst .is-ready
   macht daraus einen Slider. Kein Autoplay – Absicht, siehe testimonials.js. */
.alab-testimonials {
	text-align: center;
}

/* Alles im Slider rechnet mit Border-Box. WordPress setzt das nicht global,
   und ein content-box-Slide wäre breiter als seine flex-basis von 100 % –
   dann trifft translateX(-200 %) nicht mehr und der Nachbar-Slide lugt hervor. */
.alab-testimonials *,
.alab-testimonials *::before,
.alab-testimonials *::after {
	box-sizing: border-box;
}

.alab-testimonials__label {
	margin-bottom: 1.75rem;
}

.alab-testimonials__mark {
	display: block;
	margin: 0 auto 1.5rem;
	width: 3rem;
	height: auto;
	/* Bronze statt Gold: Gold erreicht auf Creme nur 1,80:1. */
	color: var(--wp--preset--color--bronze);
}

/* Ein schmaler Champagner-Lichtstreifen läuft mit langer Ruhephase über die
   Kontur. Nur die Clip-Maske bewegt sich; das Zeichen selbst bleibt ruhig. */
.alab-testimonials__shimmer-sweep {
	animation: alab-testimonials-shimmer 5.5s var(--alab-ease-move) infinite;
	transform: translateX(-18px);
	will-change: transform;
}

.alab-testimonials__shimmer-light {
	animation: alab-testimonials-shimmer-light 5.5s var(--alab-ease-move) infinite;
	fill: #f2d49d;
	opacity: 0;
	will-change: opacity;
}

@keyframes alab-testimonials-shimmer {
	0%,
	60% {
		transform: translateX(-18px);
	}

	80% {
		transform: translateX(72px);
	}

	100% {
		transform: translateX(72px);
	}
}

@keyframes alab-testimonials-shimmer-light {
	0%,
	60% {
		opacity: 0;
	}

	64%,
	80% {
		opacity: 0.95;
	}

	84%,
	100% {
		opacity: 0;
	}
}

.alab-testimonials__viewport {
	position: relative;
}

.alab-testimonials__track {
	display: block;
	list-style: none;
	margin: 0;
	padding: 0;
}

.alab-testimonials__slide {
	margin: 0;
	padding: 0;
}

/* Ohne JS: mehrere Zitate als gestapelte Karten trennen. */
.alab-testimonials:not(.is-ready) .alab-testimonials__slide + .alab-testimonials__slide {
	margin-top: 2.5rem;
	padding-top: 2.5rem;
	border-top: 1px solid var(--wp--preset--color--border);
}

/* Im Editor nur die erste Position zeigen. Die komplette Auswahl und ihre
   Reihenfolge stehen im Inspector; 20 gestapelte SSR-Folien würden die
   Bearbeitung im Canvas unnötig verlängern. Das Frontend bleibt unverändert. */
.editor-styles-wrapper .alab-testimonials-editor-preview .alab-testimonials:not(.is-ready) .alab-testimonials__slide:not(:first-child) {
	display: none;
}

/* Zeilenlänge begrenzen. Die umgebende Gruppe ist 1140px breit – das ergäbe
   über 90 Zeichen pro Zeile. 40rem landet bei rund 55–60 Zeichen.
   Das max-width sitzt bewusst hier und nicht auf der Sektion: Core setzt für
   direkte Kinder einer constrained-Gruppe ein eigenes max-width, das mit
   gleicher Spezifität gewinnen würde. */
.alab-testimonials__figure {
	max-width: 40rem;
	margin: 0 auto;
}

.alab-testimonials__quote {
	margin: 0;
	border: 0;
	padding: 0;
}

/* Kursiv ist hier eine echte Zeichnung, keine Schrägstellung: Crimson Pro
   liegt als eigener Kursiv-Schnitt im Theme (Variable Font, 200–900). */
.alab-testimonials__quote p {
	margin: 0;
	font-family: var(--wp--preset--font-family--crimson-pro);
	font-style: italic;
	font-size: 1.3125rem;
	line-height: 1.55;
	color: var(--wp--preset--color--contrast);
}

.alab-testimonials__cite {
	display: block;
	margin-top: 1.5rem;
	font-size: 0.8125rem;
	font-weight: 500;
	letter-spacing: 0.1em;
	text-transform: uppercase;
	color: var(--wp--preset--color--bronze);
}

.alab-testimonials__source {
	display: block;
	margin-top: 0.25rem;
	font-weight: 400;
	letter-spacing: 0.06em;
	color: var(--wp--preset--color--muted);
	text-transform: none;
}

/* ── Aktiver Slider ── */
.alab-testimonials.is-ready .alab-testimonials__viewport {
	overflow: hidden;
}

.alab-testimonials.is-ready .alab-testimonials__track {
	display: flex;
	align-items: stretch;
	transition: transform var(--alab-dur-move) var(--alab-ease-move);
}

/* Kein horizontales Padding hier – mit box-sizing:border-box wäre es zwar
   unschädlich, aber die Breite muss exakt 100 % bleiben, damit die
   Verschiebung um Vielfache von 100 % sauber aufgeht. */
.alab-testimonials.is-ready .alab-testimonials__slide {
	flex: 0 0 100%;
	width: 100%;
	min-width: 0;
}

.alab-testimonials__controls {
	display: flex;
	align-items: center;
	justify-content: center;
	gap: 1rem;
	margin-top: 2rem;
}

.alab-testimonials__controls[hidden] {
	display: none;
}

/* Rand in "muted": 5,65:1 auf Creme, 6,20:1 auf Weiß, 5,42:1 auf Nebel.
   Vorher stand hier "border" (#e5e1d8) mit 1,19:1 – die Buttons waren als
   Fläche praktisch unsichtbar und verfehlten WCAG 1.4.11 (3:1). */
.alab-testimonials__nav {
	display: flex;
	align-items: center;
	justify-content: center;
	/* 44px – komfortables Touch-Ziel, nicht nur die geforderten 24px. */
	width: 2.75rem;
	height: 2.75rem;
	padding: 0;
	border: 1px solid var(--wp--preset--color--muted);
	border-radius: var(--wp--preset--border-radius--pill);
	background: transparent;
	color: var(--wp--preset--color--heading);
	cursor: pointer;
	transition: border-color 0.2s ease, color 0.2s ease, background-color 0.2s ease;
}

.alab-testimonials__nav:hover {
	border-color: var(--wp--preset--color--petrol-deep);
	background: var(--wp--preset--color--petrol-deep);
	color: #ffffff;
}

.alab-testimonials__dots {
	display: flex;
	align-items: center;
	gap: 0.5rem;
}

/* Ab fünf Folien ersetzt ein kompakter Zähler die Punktleiste. Mit 44px pro
   Touch-Ziel würden fünf oder mehr Punkte samt Pfeilen mobil überlaufen. */
.alab-testimonials__count {
	min-width: 4rem;
	font-size: 0.875rem;
	font-variant-numeric: tabular-nums;
	letter-spacing: 0.08em;
	color: var(--wp--preset--color--muted);
}

/* Der Button ist 2,75rem groß (Touch-Ziel), der sichtbare Punkt klein. */
.alab-testimonials__dot {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 2.75rem;
	height: 2.75rem;
	padding: 0;
	border: 0;
	background: none;
	cursor: pointer;
}

/* Inaktiv in "muted" (5,65:1 auf Creme) statt "border" (1,19:1 – unsichtbar).
   Der aktive Punkt hebt sich zusätzlich über Größe ab, damit der Zustand
   nicht allein über Farbe transportiert wird (WCAG 1.4.1). */
.alab-testimonials__dot > span {
	display: block;
	width: 0.5rem;
	height: 0.5rem;
	border-radius: var(--wp--preset--border-radius--pill);
	background: var(--wp--preset--color--muted);
	transition: background-color 0.2s ease, transform 0.2s ease;
}

.alab-testimonials__dot:hover > span {
	background: var(--wp--preset--color--bronze-dark);
}

.alab-testimonials__dot[aria-current="true"] > span {
	background: var(--wp--preset--color--petrol-deep);
	transform: scale(1.5);
}

/* Auf dunklen Flächen (z. B. Petrol-Verlauf) lesbar bleiben. */
.alab-testimonials.has-petrol-deep-background-color,
.alab-testimonials.has-petrol-fade-gradient-background {
	--alab-on-dark: 1;
}

.alab-testimonials.has-petrol-deep-background-color .alab-testimonials__quote p,
.alab-testimonials.has-petrol-fade-gradient-background .alab-testimonials__quote p {
	color: #ffffff;
}

.alab-testimonials.has-petrol-deep-background-color .alab-testimonials__mark,
.alab-testimonials.has-petrol-fade-gradient-background .alab-testimonials__mark,
.alab-testimonials.has-petrol-deep-background-color .alab-testimonials__cite,
.alab-testimonials.has-petrol-fade-gradient-background .alab-testimonials__cite {
	color: var(--wp--preset--color--gold);
}

.alab-testimonials.has-petrol-deep-background-color .alab-testimonials__source,
.alab-testimonials.has-petrol-fade-gradient-background .alab-testimonials__source,
.alab-testimonials.has-petrol-deep-background-color .alab-testimonials__nav,
.alab-testimonials.has-petrol-fade-gradient-background .alab-testimonials__nav,
.alab-testimonials.has-petrol-deep-background-color .alab-testimonials__count,
.alab-testimonials.has-petrol-fade-gradient-background .alab-testimonials__count {
	color: #d7e2e6;
	border-color: #d7e2e6;
}

.alab-testimonials.has-petrol-deep-background-color .alab-testimonials__dot > span,
.alab-testimonials.has-petrol-fade-gradient-background .alab-testimonials__dot > span {
	background: #d7e2e6;
}

.alab-testimonials.has-petrol-deep-background-color .alab-testimonials__dot[aria-current="true"] > span,
.alab-testimonials.has-petrol-fade-gradient-background .alab-testimonials__dot[aria-current="true"] > span {
	background: var(--wp--preset--color--gold);
}

@media (min-width: 782px) {
	.alab-testimonials__quote p {
		font-size: 1.5rem;
	}
}

@media (prefers-reduced-motion: reduce) {
	.alab-testimonials.is-ready .alab-testimonials__track {
		transition: none;
	}

	.alab-testimonials__shimmer-sweep {
		animation: none;
	}

	.alab-testimonials__shimmer-light {
		animation: none;
		opacity: 0;
	}

	.alab-testimonials__dot[aria-current="true"] > span {
		transform: none;
	}
}

/* ══════════════════════════════════════════════════════════════════
   FALLBACK FÜR ALTE BROWSER (Safari < 16.4, iOS/iPadOS 15)
   ══════════════════════════════════════════════════════════════════
   WordPress 7.0 liefert Navigation und Accordion als ES-Script-Module
   mit Bare Specifier ("@wordpress/interactivity"), aufgelöst über
   <script type="importmap">. Import Maps können erst Safari 16.4+,
   Chrome 89+ und Firefox 108+ – einen Polyfill bringt Core nicht mit.

   Ohne die Module passiert Folgendes:
   · Accordion-Panels behalten ihr serverseitig gesetztes [inert] und
     bleiben per Core-CSS auf display:none  → FAQ-Antworten unsichtbar.
   · Der Overlay-Menü-Button hat keinen Click-Handler  → unter 600px
     ist die Navigation nicht erreichbar.

   functions.php setzt per Feature-Test .no-interactivity auf <html>.
   Die Regeln hier stellen dann statische, funktionierende Varianten her.
   Details und Alternativen: docs/optimierung.md
   ────────────────────────────────────────────────────────────────── */

/* FAQ: alle Antworten offen ausliefern statt sie zu verstecken. */
.no-interactivity .wp-block-accordion-panel[inert],
.no-interactivity .wp-block-accordion-panel[aria-hidden="true"] {
	display: block !important;
}

/* Das "+" würde eine Klappfunktion versprechen, die es hier nicht gibt. */
.no-interactivity .wp-block-accordion-heading__toggle-icon {
	display: none;
}

.no-interactivity .wp-block-accordion-heading__toggle {
	cursor: default;
}

.no-interactivity .faq-accordion > .wp-block-accordion-item {
	background: var(--wp--preset--color--base);
	border-color: var(--wp--preset--color--border);
}

/* Navigation: Overlay durch eine dauerhaft sichtbare Liste ersetzen. */
@media (max-width: 599px) {
	/* Die Kopfzeile ist ein Flex-Row mit nowrap. Die aufgeklappte Liste ist
	   100% breit und kann als Flex-Item nicht unter ihre Inhaltsbreite
	   schrumpfen – neben dem Logo lief sie deshalb 35px aus dem Bild.
	   Mit wrap rutscht sie unter das Logo. */
	.no-interactivity .site-header > .wp-block-group {
		flex-wrap: wrap;
	}

	/* Das <nav> selbst ebenfalls binden: Als Flex-Item ist seine Basisgröße
	   max-content – also die Breite des längsten Untermenü-Eintrags samt
	   Einrückung. Ohne width/min-width blieb es 35px zu breit. */
	.no-interactivity .site-header .wp-block-navigation {
		width: 100%;
		min-width: 0;
	}

	.no-interactivity .wp-block-navigation__responsive-container {
		display: block !important;
		position: static !important;
		width: 100%;
		padding: 0;
		background-color: transparent !important;
		z-index: auto;
	}

	.no-interactivity .wp-block-navigation__responsive-container-open,
	.no-interactivity .wp-block-navigation__responsive-container-close {
		display: none !important;
	}

	.no-interactivity .wp-block-navigation__responsive-container-content {
		display: block !important;
		width: 100%;
	}

	.no-interactivity .wp-block-navigation__container,
	.no-interactivity .wp-block-navigation__submenu-container {
		display: block !important;
		position: static !important;
		width: 100%;
		opacity: 1 !important;
		visibility: visible !important;
		min-width: 0 !important;
		border: 0 !important;
		box-shadow: none !important;
	}

	/* Untermenüs einrücken, damit die Hierarchie lesbar bleibt.
	   box-sizing: sonst addieren Einrückung und Rand 18px auf die volle Breite. */
	.no-interactivity .wp-block-navigation__submenu-container {
		box-sizing: border-box;
		padding-left: 1rem !important;
		border-left: 2px solid var(--wp--preset--color--border) !important;
	}

	/* Lange Einträge müssen umbrechen dürfen – „Humanistische Psychotherapie"
	   passt auf einem 320px-Gerät sonst nicht in die Spalte. */
	.no-interactivity .site-header .wp-block-navigation-item__content {
		white-space: normal;
		overflow-wrap: break-word;
	}

	.no-interactivity .wp-block-navigation__submenu-icon {
		display: none !important;
	}

	.no-interactivity .site-header .wp-block-navigation-item__content {
		display: block;
		padding: 0.625rem 0;
	}

	/* Der Header darf dann nicht mehr kleben – die aufgeklappte Liste ist zu
	   hoch. Gilt jetzt für die Template-Part, die das Kleben übernommen hat. */
	.no-interactivity header.wp-block-template-part {
		position: static;
	}
}
