/**
 * Flora & Flow – Basis-Layer
 *
 * Gestalterische Richtung: Editorial-Apotheke. Die Ruhe eines gut gesetzten
 * Fachjournals statt Wellness-Klischee. Die drei Logo-Elemente (Sprosse,
 * Schale, Welle) sind die durchgehende Formensprache, nicht nur ein Icon.
 *
 * Alle Werte kommen aus theme.json (--wp--preset--*, --wp--custom--*).
 * Hier stehen nur Dinge, die theme.json nicht ausdruecken kann.
 *
 * Struktur:
 *   1. Grundlage & Papier
 *   2. Typografischer Rhythmus
 *   3. Header
 *   4. Footer
 *   5. Buttons
 *   6. Karten
 *   7. Formulare
 *   8. Sektionen & Markenmotive
 *   9. FAQ / Akkordeon
 *  10. Slider-Basis
 *  11. Bewegung
 *  12. Barrierefreiheit & Fokus
 */

/* ==========================================================================
 * 1. Grundlage & Papier
 * ========================================================================== */

html {
	scroll-behavior: smooth;
	-webkit-text-size-adjust: 100%;
}

/* Feines Papierkorn auf dem Hafermilch-Grund. Liegt als Hintergrundbild
 * hinter allem Inhalt — kein Overlay, keine z-index-Konflikte, keine
 * Einbusse an Textschaerfe. */
body {
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='140' height='140'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='3' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='140' height='140' filter='url(%23n)' opacity='0.04'/%3E%3C/svg%3E");
	background-attachment: fixed;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

img {
	max-width: 100%;
	height: auto;
}

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

/* Sprungziele duerfen nicht unter dem Sticky-Header landen. */
:target,
[id] {
	scroll-margin-top: 7.5rem;
}

/* Zahlen in Tabellen und Preisen laufen auf gleicher Breite. */
.ff-tnum,
table {
	font-variant-numeric: tabular-nums;
}

/* ==========================================================================
 * 2. Typografischer Rhythmus
 *
 * Der haeufigste Fehler bei Block-Themes: ein globaler blockGap fuer alles.
 * Absaetze brauchen weniger Luft als Sektionen, und eine Ueberschrift
 * gehoert enger an ihren Text als an den Absatz davor.
 * ========================================================================== */

/* Fliesstext-Bereiche: enge Absatzfolge, Ueberschriften mit Vorlauf. */
.ff-prose > * + * {
	margin-block-start: 1.15em;
}

.ff-prose > * + :is(h2, h3, h4) {
	margin-block-start: 2.2em;
}

.ff-prose > :is(h2, h3, h4) + * {
	margin-block-start: 0.7em;
}

.ff-prose :is(ul, ol) {
	padding-left: 1.35em;
}

.ff-prose li + li {
	margin-block-start: 0.45em;
}

/* Lead-Absatz direkt unter einer Ueberschrift. */
.ff-lead {
	font-size: var(--wp--preset--font-size--lg);
	line-height: var(--wp--custom--line-height--lead);
	color: var(--wp--preset--color--body);
	max-width: 34rem;
}

/* Auf dunkler Flaeche wuerde das fest gesetzte Salbei die geerbte
 * Schlagrahm-Farbe ueberschreiben — Ergebnis waere Gruen auf Gruen. */
.is-style-section-dark .ff-lead,
.ff-cta .ff-lead {
	color: color-mix(in srgb, var(--wp--preset--color--base-2) 88%, transparent);
}

/* Zentrierte Sektionsintros bekommen ihre Begrenzung mittig — und mehr
 * Breite als die 34rem des Fliesstextmasses.
 *
 * 34rem = 544px liess den Intro-Absatz auf /fuer-fachpersonen/ schmaler
 * werden als die Ueberschrift direkt darueber (736px): vier Zeilen unter
 * einer zweizeiligen Headline, mittig, sichtbar zu eng. 34rem ist ein
 * Lesemass fuer laufenden Text in einer Spalte, kein Mass fuer einen
 * zentrierten Anreisser.
 *
 * 55rem = 880px kommt aus dem Entwurf selbst: Fuer-Fachpersonen.dc.html
 * setzt die zentrierte Intro-Spalte auf `max-width:880px`, und Eyebrow,
 * Ueberschrift, Lead und Leitsatz fuellen sie gemeinsam. Der Leitsatz stand
 * hier schon richtig auf 880px — der Lead hing daneben auf 544px.
 *
 * Zwischenschritt am 17.08.2026 waren 620px; das ist der Hero-Lead-Wert aus
 * Material/entwurf-sollwerte.md und fuer diese Spalte ebenfalls zu schmal.
 * Linksbuendige Leads behalten die 34rem des Fliesstextmasses. */
.has-text-align-center.ff-lead {
	margin-inline: auto;
	max-width: min(55rem, 100%);
}

/* Playfair setzt Ziffern als Mediaevalziffern — in Kennzahlen stoert das. */
.ff-stat__number,
.ff-price {
	font-variant-numeric: lining-nums tabular-nums;
}

/* Kursive Zitate in Playfair brauchen minimal mehr Laufweite. */
em,
i {
	letter-spacing: 0.01em;
}

/* Sehr lange Woerter (Fachbegriffe) duerfen umbrechen statt zu ueberlaufen. */
h1, h2, h3, h4 {
	overflow-wrap: break-word;
	text-wrap: balance;
}

p,
li {
	text-wrap: pretty;
}

/* ==========================================================================
 * 3. Header
 * ========================================================================== */

/* Der Header liegt auf Seiten mit Foto-Hero transparent IM Bild — die
 * Mechanik dafuer steht vollstaendig in Abschnitt 8i
 * (`.ff-has-overlay-header`, Body-Klasse aus inc/setup.php): absolute
 * Position, eigener Schleier fuer die Navigation, Trennlinie darunter.
 *
 * Hier stand am 13.08. kurz eine zweite Fassung davon — transparenter Grund,
 * `.ist-geklebt` beim Scrollen, eine eigene Haarlinie, eine negative
 * Aussenkante am Hero. Alles doppelt, weil ich nicht nachgesehen hatte.
 * Entfernt; dieselbe Sorte Fehler wie die zweite Haekchenliste.
 *
 * Die Regel hier gilt fuer Seiten OHNE Overlay-Header: Blog, Archiv, 404. */
.ff-header {
	position: sticky;
	top: 0;
	z-index: 50;
	background: color-mix(in srgb, var(--wp--preset--color--base) 94%, transparent);
	backdrop-filter: saturate(160%) blur(10px);
	-webkit-backdrop-filter: saturate(160%) blur(10px);
	box-shadow: var(--wp--preset--shadow--header);
}

/* Offenes Handymenue: backdrop-filter macht die Kopfzeile zum Bezugsrahmen
 * fuer position:fixed, das Menue war dann nur so hoch wie die Kopfzeile
 * (Termin buchen, Blog … – gemeldet 01.10.2026). WordPress setzt beim
 * Oeffnen `has-modal-open` auf <html>. */
html.has-modal-open .ff-header {
	backdrop-filter: none;
	-webkit-backdrop-filter: none;
}

.ff-header__bar {
	font-size: var(--wp--preset--font-size--xs);
	letter-spacing: 0.01em;
}

.ff-header__bar-inner {
	display: flex;
	align-items: center;
	gap: var(--wp--preset--spacing--md);
	max-width: var(--wp--custom--grid--content);
	margin-inline: auto;
	padding: 0.4rem var(--wp--preset--spacing--gutter);
}

.ff-header__bar-info {
	gap: var(--wp--preset--spacing--md);
	align-items: center;
}

.ff-header__bar p {
	margin: 0;
}

.ff-header__bar a {
	color: inherit;
	text-decoration: none;
}

.ff-header__bar a:hover {
	text-decoration: underline;
	text-underline-offset: 3px;
}

/* Vertrauenshinweis mit Haekchen — Trust-Signal, kein Button-Look. */
.ff-header__badge::before {
	content: "✓";
	margin-right: 0.45em;
	color: var(--wp--preset--color--cta);
	font-weight: 700;
}

.ff-header__social {
	gap: 0.125rem !important;
}

/* --- 3b. Hauptzeile: Navigation | Logo mittig | Navigation + CTA --- */

.ff-header__inner {
	display: grid;
	/* minmax(0, 1fr), nicht 1fr: `1fr` heisst `minmax(auto, 1fr)` — die
	 * Spalte darf also breiter werden als ihr Anteil, wenn der Inhalt nicht
	 * hineinpasst. Genau das passierte zwischen 1080 und 1100 px: Die
	 * rechte Haelfte dehnte sich, die linke blieb, und das angeblich
	 * mittige Logo stand 18 px daneben. Mit einer harten Untergrenze von 0
	 * sind beide Spalten unter allen Umstaenden gleich breit. */
	grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
	align-items: center;
	gap: var(--wp--preset--spacing--md);
	max-width: var(--wp--custom--grid--content);
	margin-inline: auto;
	/* SENKRECHT 18 OBEN, 14 UNTEN, direkt aus SiteNav.dc.html
	 * (`padding:18px 40px 14px`).
	 *
	 * Hier standen 8px oben und unten. Die Bildmarke sass damit 8px unter
	 * der Blattkante und wirkte oben eingeklemmt; gemeldet von Lucas am
	 * 19.08.2026. Der Zustand ist aelter als dieser Tag, er steht auch auf
	 * den Screens vom 17.08.
	 *
	 * Die Sorge des alten Kommentars, die klebende Leiste wuerde auf 141px
	 * wachsen, traf auf die frueher groessere Bildmarke zu. Gerechnet mit
	 * dem heutigen Stand: 18 + 89 (Marke 74 plus Wortmarke) + 14 = 121px,
	 * unter den 135px, die der Entwurf fuer die SiteNav vorsieht.
	 *
	 * WAAGRECHT bleibt der Gutter (56px) statt der 40px des Entwurfs: Die
	 * Sektionen darunter stehen ebenfalls auf 56px, und eine Kopfleiste, die
	 * 16px weiter aussen beginnt als der Inhalt, sitzt sichtbar schief. */
	padding: 1.125rem var(--wp--preset--spacing--gutter) 0.875rem;
}

/* 28 px links und rechts des Logos, wie im Entwurf. Der globale Abstand
 * waere 24 px und damit knapper, als die Sperrfassung Luft braucht. */
.ff-header__inner {
	column-gap: 28px;
}

/* WordPress setzt seinen Fliess-Blockabstand als margin-block-start auf jedes
 * zweite Kind der Gruppe. Im Raster addiert sich diese Margin zur Zeilenhoehe:
 * Die Leiste war dadurch 24 px hoeher, als ihr hoechstes Element verlangt —
 * ohne dass irgendwo ein Abstand gesetzt waere. Die Hoehe der Kopfzeile regelt
 * allein ihr Innenabstand. */
.ff-header__inner > * {
	margin-block: 0;
}

/* BEIDE HAELFTEN RUECKEN ANS LOGO, nicht an die Aussenkanten.
 *
 * Vorher stand hier `start` links und `end` rechts — beide Bloecke also an
 * den Rand gedrueckt. Das Raster ist damit zwar rechnerisch mittig (beide
 * 1fr-Spalten gleich breit), das Logo steht optisch aber schief: Die linke
 * Navigation ist rund 40 px schmaler als die rechte Haelfte mit dem
 * CTA-Knopf, und dieser Unterschied landet komplett als Luft zwischen
 * linker Navigation und Logo. Rechts klebt der Knopf am Logo, links klafft
 * eine Luecke — genau der schiefe Eindruck.
 *
 * Der Entwurf loest es andersherum (SiteNav.dc.html): `justify-content:
 * flex-end` auf der linken Gruppe, Standard auf der rechten. Beide Gruppen
 * fassen das Logo mit demselben Abstand ein; die ungleiche Breite landet
 * aussen, wo sie niemandem auffaellt. */
.ff-header__nav--left {
	justify-self: end;
}

.ff-header__end {
	justify-self: start;
	gap: var(--wp--preset--spacing--md);
	align-items: center;
}

/* Doppelter Klassen-Selektor: WordPress druckt seine Block-Styles
 * (.wp-block-navigation{display:flex}) nach dem Theme-Stylesheet aus und
 * wuerde ein einfaches .ff-header__nav--mobile{display:none} ueberschreiben. */
.ff-header .ff-header__nav--mobile {
	display: none;
}

/* Die Farbe gehoert an den CONTAINER, nicht an den Link.
 *
 * WordPress-Core liefert
 *   .wp-block-navigation .wp-block-navigation-item__content.wp-block-navigation-item__content { color: inherit }
 * — mit doppelter Klasse und damit Spezifitaet (0,3,0). Jede Regel auf
 * `.ff-header__nav a` (0,2,1) verliert dagegen, egal wie spaet sie steht.
 * Da Core auf `inherit` setzt, ist der Container der richtige Ort: von dort
 * holt sich der Link die Farbe ohne Spezifitaetskampf. */
.ff-header__nav {
	color: var(--wp--preset--color--contrast);
}

/* 16.5px / Gewicht 400 — Entwurf (SiteNav.dc.html). Vorher lief die
 * Navigation auf der SM-Stufe mit, die inzwischen 15.5px misst. */
.ff-header__nav a {
	position: relative;
	color: var(--wp--preset--color--contrast);
	font-size: 16.5px;
	font-weight: 400;
	text-decoration: none;
	white-space: nowrap;
	padding-block: 0.35rem;
}

/* Aktiver und angesteuerter Punkt bekommen eine feine Unterstreichung,
 * die aus der Mitte waechst — Farbe allein reicht nicht als Signal. */
.ff-header__nav a::after {
	content: "";
	position: absolute;
	left: 0;
	right: 0;
	bottom: 0;
	height: 1px;
	background: currentColor;
	transform: scaleX(0);
	transition: transform var(--wp--custom--transition--base);
}

.ff-header__nav a:hover::after,
.ff-header__nav a[aria-current="page"]::after,
.ff-header__nav .current-menu-item > a::after {
	transform: scaleX(1);
}

.ff-header__nav a[aria-current="page"] {
	color: var(--wp--preset--color--accent-dark);
}

/* --- 3c. Logo (Bildmarke + Wortmarke) --- */

/* SEIT 10.09.2026 EIN SVG FUER MARKE UND WORTMARKE (Canva-Export).
 * --ff-marke ist jetzt die Breite des ganzen Logos; die Wortmarke steht darin
 * 0,99 x so breit wie die Marke, die Versalhoehe betraegt 0,076 x.
 *
 * Header 84 px: Die Versalhoehe landet bei 6,4 px, knapp unter der
 * bisherigen Schrift (7,4 px) — mehr gibt das Logo bei dieser Breite nicht
 * her, ohne die Kopfleiste zu erhoehen. Footer 104 px, Versalhoehe 7,9 px. */
.ff-header__brand {
	--ff-marke: 84px;
}

.ff-footer__brand {
	--ff-marke: 104px;
}

.ff-header__brand {
	justify-self: center;
	display: flex;
	flex-direction: column;
	align-items: center;
	text-decoration: none;
	color: var(--wp--preset--color--contrast);
	line-height: 1;
}

/* Der Gruppen-Block bringt seinen globalen Blockabstand mit und setzt ihn als
 * margin-block-start auf jedes zweite Kind — hier also 24 px zusaetzlich zum
 * Flex-Abstand. Der Abstand der Sperrfassung gehoert an EINE Stelle. */
.ff-header__brand > *,
.ff-footer__brand > * {
	margin-block: 0;
}

.ff-header__mark {
	display: block;
	width: var(--ff-marke);
	/* Der Container war 98 px hoch, obwohl die Grafik nur 59 px misst. Die
	 * Differenz war kein Abstand, sondern ein Zeilenkasten: Zwischen <span>
	 * und <svg> steht im Markup ein Zeilenumbruch, und dieser Textknoten
	 * spannt eine Zeile mit voller Schrifthoehe auf. Das SVG steht als Block
	 * darueber, der Kasten bleibt trotzdem stehen — 23 px Luft, die niemand
	 * gesetzt hat und die die Kopfleiste auf 138 px trieben. */
	line-height: 0;
	transition: transform var(--wp--custom--transition--base);
}

.ff-header__brand:hover .ff-header__mark {
	transform: translateY(-2px);
}

.ff-header__mark svg,
.ff-footer__mark svg {
	display: block;
	width: 100%;
	height: auto;
}

/* Die Bildmarke allein steht nur im Handy-Header (siehe Abschnitt 3e). */
.ff-header__zeichen {
	display: none;
	line-height: 0;
}

.ff-header__zeichen svg {
	display: block;
	width: 100%;
	height: auto;
}

/* --- 3d. Variante: Header transparent ueber einem Hero-Bild ---
 * Nicht per Default aktiv. Der Verlauf ist ein Scrim, damit heller
 * Navigationstext auch ueber hellen Bildpartien die AA-Schwelle haelt. */

.ff-header--over-hero {
	position: absolute;
	inset: 0 0 auto;
	background: linear-gradient(
		180deg,
		color-mix(in srgb, var(--wp--preset--color--contrast) 55%, transparent) 0%,
		transparent 100%
	);
	backdrop-filter: none;
	box-shadow: none;
}

.ff-header--over-hero .ff-header__bar {
	background: transparent !important;
}

.ff-header--over-hero .ff-header__brand,
.ff-header--over-hero .ff-header__nav a {
	color: var(--wp--preset--color--base-2);
}

/* --- 3e. Burger-Overlay --- */

.ff-header .wp-block-navigation__responsive-container-open,
.ff-header .wp-block-navigation__responsive-container-close {
	color: var(--wp--preset--color--contrast);
}

.ff-header .wp-block-navigation__responsive-container.is-menu-open {
	padding: var(--wp--preset--spacing--xl) var(--wp--preset--spacing--gutter);
}

.ff-header .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__container {
	gap: var(--wp--preset--spacing--md);
	padding-top: var(--wp--preset--spacing--lg);
}

.ff-header .wp-block-navigation__responsive-container.is-menu-open a {
	font-family: var(--wp--preset--font-family--display);
	font-size: 1.625rem;
	letter-spacing: var(--wp--custom--letter-spacing--display);
}

.ff-header .wp-block-navigation__responsive-container.is-menu-open a:hover {
	color: var(--wp--preset--color--accent-dark);
}

.ff-header .wp-block-navigation__responsive-container.is-menu-open a::after {
	display: none;
}

/* --- 3f. Schmal: Burger | Logo | CTA ---
 *
 * Umschaltpunkt 1120 px, vorher 900 px. Rechnung: Die rechte Haelfte
 * (drei Menuepunkte plus CTA-Knopf) misst 412 px, die linke 370 px. Da
 * beide Rasterspalten gleich breit sein muessen, damit das Logo mittig
 * steht, braucht die Leiste 2 x 412 + 81 Logo + 2 x 28 Abstand + Seitenrand
 * — zusammen rund 1060 px. Darunter wurde der Knopf zweizeilig.
 *
 * 1120 statt der errechneten 1060: Bei 1080 und 1100 px war der Platz zwar
 * rechnerisch da, aber ohne Reserve — der Knopf stand dann direkt an der
 * Spaltenkante. Nachgemessen ueber alle Breiten von 360 bis 1920.
 *
 * Der Entwurf beschreibt ohnehin nur den Desktop (min-width:1100px). */
@media (max-width: 1119.98px) {
	.ff-header__bar {
		display: none;
	}

	/* `1fr auto 1fr` statt `auto 1fr auto`: Bei `auto 1fr auto` bestimmen
	 * Burger (24 px) und CTA (rund 150 px) die Seitenspalten — und weil sie
	 * verschieden breit sind, sitzt die mittlere Spalte nicht in der Mitte.
	 * Das Logo stand dadurch rund 70 px zu weit links. Zwei gleich breite
	 * 1fr-Spalten halten es unabhaengig vom Inhalt auf der Mittellinie.
	 * minmax(0, …), damit die Spalten auch unter ihre Inhaltsbreite duerfen
	 * und nichts ueberlaeuft. */
	.ff-header__inner {
		grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
		column-gap: var(--wp--preset--spacing--sm);
	}

	/* SEHR SCHMALE SCHIRME: Spalten nach Inhalt, nicht gleich breit.
	 *
	 * `minmax(0, 1fr)` erlaubt den Aussenspalten, unter ihre Inhaltsbreite
	 * zu schrumpfen — das war fuer die Mittigkeit des Logos gedacht. Auf
	 * 390px misst der Termin-Knopf aber 134px bei 100px Spaltenbreite und
	 * lief 22px in die Wortmarke hinein.
	 *
	 * Ab hier zaehlt Nichtueberlappen mehr als die Mittellinie: Die Spalten
	 * nehmen ihre Inhaltsbreite, der Rest verteilt sich dazwischen. Das
	 * Logo steht dann nicht exakt mittig — bei 24px Burger links und 134px
	 * Knopf rechts geht beides nicht gleichzeitig. */
	@media (max-width: 30em) {
		.ff-header__inner {
			grid-template-columns: auto auto auto;
			justify-content: space-between;
			column-gap: 0.75rem;
		}

		.ff-header__brand {
			justify-self: center;
		}
	}

	/* Der CTA gehoert hier an die Aussenkante — anders als im Desktop-Raster,
	 * wo beide Haelften das Logo einfassen. */
	.ff-header__end {
		justify-self: end;
	}

	.ff-header .ff-header__nav--left,
	.ff-header .ff-header__nav--right {
		display: none;
	}

	.ff-header .ff-header__nav--mobile {
		display: flex;
		justify-self: start;
	}

	/* Das ganze Logo haette hier eine Wortmarke von 3 px Versalhoehe.
	 * Also nur die Bildmarke; der Name steht im aria-label des Links. */
	.ff-header__mark {
		display: none;
	}

	.ff-header__zeichen {
		display: block;
		width: 40px;
	}

	/* Kompakterer CTA, damit das mittige Logo nicht aus der Mitte rutscht. */
	.ff-header__cta .wp-block-button__link {
		padding: 0.875rem 1.125rem;
		font-size: 0.6875rem;
	}
}

/* Der CTA bleibt einzeilig. Bricht er um, waechst die Leiste und das Logo
 * sitzt nicht mehr auf der Mittellinie der Menuepunkte. */
.ff-header__end .wp-block-button__link {
	white-space: nowrap;
}

/* ==========================================================================
 * 4. Footer
 * ========================================================================== */

/* Der globale Block-Gap setzt sonst helle Flaeche zwischen letzter Sektion
 * und Footer — der Footer soll buendig anschliessen. */
.wp-site-blocks > footer.wp-block-template-part {
	margin-block-start: 0;
}

/* HELLER FOOTER (Entwurf Footer.dc.html, 13.08.2026). Vorher eine dunkle
 * Rosmarin-Flaeche. Er liegt jetzt auf Surface Sand — eine Spur tiefer als
 * die Hafermilch der Seite — und grenzt sich zusaetzlich mit einer Haarlinie
 * ab. Gemessene Textkontraste auf Sand #EDE8DC:
 *   Salbei      #56624C   5,29:1
 *   Matcha dkl. #267369   4,98:1
 *   Rosmarin    #24301E  11,79:1 */
/* Masse aus Footer.dc.html — 15.08.2026 nachgezogen.
 * Polster 90/56/36, Oberkante als Haarlinie in Leinsamen 25%. */
.ff-footer {
	/* Quer der Gutter-Token statt fester 3.5rem (21.08.2026).
	 *
	 * 56px stehen so im Entwurf — der ist `min-width:1100px`. Fest gesetzt
	 * frassen sie auf einem 360px-Schirm 112 der 360 Pixel, also fast ein
	 * Drittel: Der Footer stand deutlich schmaler als der Seitenkoerper
	 * darueber, und der Einwilligungstext im Newsletter-Kasten quetschte
	 * sich in eine 174px-Saeule ueber neun Zeilen.
	 *
	 * Der Token laeuft von 20px bis 56px — am oberen Ende also derselbe
	 * Wert wie im Entwurf, auf dem Handy derselbe wie im uebrigen Layout. */
	padding: 5.625rem var(--wp--preset--spacing--gutter) 2.25rem !important;
	border-top: 1px solid color-mix(in srgb, var(--wp--preset--color--muted) 25%, transparent);
}

/* Vier Spalten im Verhaeltnis 1.5 / 1 / 1 / 1.3, Abstand 64px — der
 * Entwurf gibt der Markenspalte mehr Raum und der Kontaktspalte etwas
 * mehr als den beiden Linklisten. Als Columns-Block lief alles gleich
 * breit mit 21.6px Abstand. */
@media (min-width: 48em) {
	.ff-footer__cols.ff-footer__cols {
		display: grid;
		grid-template-columns: minmax(0, 1.5fr) minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1.3fr);
		gap: 4rem;
	}

	.ff-footer__cols > * {
		flex-basis: auto !important;
		margin: 0;
	}
}

/* Links und Adresse 14.5px — vorher liefen sie auf Fliesstextgroesse mit. */
.ff-footer__cols :is(a, p, li, div) {
	font-size: 0.90625rem;
}

.ff-footer__cols .ff-footer__heading {
	font-size: 1.1875rem; /* 19px */
}

.ff-footer a {
	color: inherit;
	text-decoration: none;
	transition: color var(--wp--custom--transition--base);
}

/* Minze als Hover-Farbe funktionierte auf der dunklen Flaeche. Auf Sand
 * liegt sie bei 1,6:1 — hier uebernimmt Rosmarin. */
.ff-footer a:hover {
	color: var(--wp--preset--color--contrast);
}

/* Dasselbe Logo-SVG wie im Header, nur groesser (siehe --ff-marke). */
.ff-footer__brand {
	display: inline-flex;
	flex-direction: column;
	align-items: flex-start;
	margin-bottom: var(--wp--preset--spacing--md);
	line-height: 1;
}

.ff-footer__mark {
	display: block;
	width: var(--ff-marke);
	line-height: 0;
	color: var(--wp--preset--color--contrast);
}


/* Spaltentitel in Playfair statt gesperrten Versalien — so der Entwurf. Die
 * kleinen Versalien lasen sich auf der dunklen Flaeche als Etikett; auf der
 * hellen Flaeche traegt die Display-Schrift den Rhythmus der Seite weiter. */
.ff-footer__heading {
	font-family: var(--wp--preset--font-family--display);
	font-weight: 400;
	color: var(--wp--preset--color--contrast);
	margin-bottom: 0.25rem;
}

.ff-footer__list {
	list-style: none;
	padding-left: 0;
	display: grid;
	gap: 0.55rem;
}

/* Social als Textreihe. Matcha Dunkel liegt auf Sand bei 4,98:1 und ist als
 * einzige farbige Stelle im Footer sofort als Link erkennbar. */
/* Runde Icon-Knoepfe statt Textlinks — Masse aus Footer.dc.html:
 * 40px, 1px Rand in Matcha 40%, Zeichen 19px, Hover fuellt mit Minze und
 * setzt das Zeichen auf Rosmarin. */
.ff-footer__social {
	display: flex;
	flex-wrap: wrap;
	gap: 0.875rem; /* 14px */
	margin-top: var(--wp--preset--spacing--md);
}

.ff-footer__social a {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 2.5rem;
	height: 2.5rem;
	border: 1px solid color-mix(in srgb, var(--wp--preset--color--accent) 40%, transparent);
	border-radius: 50%;
	color: var(--wp--preset--color--accent);
	transition:
		background var(--wp--custom--transition--base),
		border-color var(--wp--custom--transition--base),
		color var(--wp--custom--transition--base);
}

.ff-footer__social a:hover,
.ff-footer__social a:focus-visible {
	background: var(--wp--preset--color--cta);
	border-color: var(--wp--preset--color--cta);
	color: var(--wp--preset--color--contrast);
}

.ff-footer__social svg {
	display: block;
}

/* --- Newsletter-Kasten ---
 * Schlagrahm-Karte auf der Sandflaeche, wie im Entwurf. Text links, Feld und
 * Knopf rechts; unter 48em stapeln beide. */
.ff-footer__news {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: var(--wp--preset--spacing--lg);
	margin-top: var(--wp--preset--spacing--xl);
	/* 28/36 ab rund 800px, darunter enger — der Kasten steht sonst mit
	 * 72px Polster auf einer 320px breiten Flaeche. */
	padding: 1.75rem clamp(1.25rem, 5vw, 2.25rem);
	background: var(--wp--preset--color--base-2);
	border: 1px solid color-mix(in srgb, var(--wp--preset--color--muted) 25%, transparent);
	border-radius: 1.125rem; /* 18px */
}

.ff-footer__news > * {
	margin-block: 0;
}

.ff-footer__news-text {
	flex: 1 1 17rem;
}

.ff-footer__news-text .ff-footer__heading {
	margin-bottom: 0.25rem;
}

.ff-footer__news-form {
	flex: 1 1 20rem;
}

.ff-footer__news-zeile {
	display: flex;
	flex-wrap: wrap;
	gap: 0.625rem;
}

.ff-footer__news-zeile input[type="email"] {
	flex: 1 1 12rem;
	min-width: 0;
}

.ff-footer__news-zeile button {
	flex: 0 0 auto;
}

/* Die Einwilligung steht klein unter dem Feld — sie muss lesbar sein, darf
 * den Kasten aber nicht dominieren. */
.ff-footer__news-check {
	margin-top: 0.75rem;
	font-size: var(--wp--preset--font-size--xs);
	line-height: 1.5;
}

.ff-footer__news-check a {
	text-decoration: underline;
	text-underline-offset: 2px;
	color: var(--wp--preset--color--accent-dark);
}

.ff-footer__sep {
	/* WP setzt Trenner ohne Stil-Variante auf feste 100px Breite. */
	width: 100%;
	max-width: none;
	border-color: color-mix(in srgb, var(--wp--preset--color--muted) 40%, transparent) !important;
	margin-top: var(--wp--preset--spacing--xl);
	margin-bottom: var(--wp--preset--spacing--md);
}

/* Fusszeile: eigene Trennlinie und Abstaende nach dem Entwurf
 * (40px Abstand, 24px Polster, Haarlinie in Leinsamen 30%). */
.ff-footer__legal {
	margin-top: 2.5rem;
	padding-top: 1.5rem;
	border-top: 1px solid color-mix(in srgb, var(--wp--preset--color--muted) 30%, transparent);
}

.ff-footer__legal p {
	margin: 0;
	font-size: 0.84375rem; /* 13.5px */
}

/* Rechtslinks muessen als Links erkennbar sein — im Copyright-Absatz
 * unterscheiden sie sich sonst durch nichts vom Fliesstext. */
.ff-footer__legal-links a {
	text-decoration: underline;
	text-underline-offset: 3px;
}

.ff-footer__nav a {
	font-weight: 400;
}

/* Die Angebots-Spalte ist ein Navigations-Block, die Wissens-Spalte eine
 * Liste. Ohne diese Zeile stehen die beiden Spalten mit unterschiedlichem
 * Zeilenabstand nebeneinander — der Navigations-Block bringt den globalen
 * Block-Gap mit. */
.ff-footer__nav .wp-block-navigation__container {
	gap: 0.55rem;
}

/* ==========================================================================
 * 5. Buttons
 * ========================================================================== */

/* KEINE VERSALIEN, 16.08.2026.
 *
 * Hier stand `text-transform: uppercase` — jeder Knopf der Seite lief in
 * Grossbuchstaben. Der Entwurf setzt sie durchgehend normal: „Termin
 * buchen", „Nachricht senden", „Kostenloses Kennenlernen buchen".
 *
 * Versalien waren meine Zutat aus dem CI-Dokument, das sie fuer Labels
 * vorsieht — nicht fuer Knopfbeschriftungen. Bei laengeren Beschriftungen
 * („NACHRICHT SENDEN") wirkt der Knopf dadurch lauter und breiter als
 * gemeint. */
.wp-block-button__link {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: 0.5rem;
	text-transform: none;
	transition:
		background-color var(--wp--custom--transition--base),
		color var(--wp--custom--transition--base),
		border-color var(--wp--custom--transition--base),
		transform var(--wp--custom--transition--base);
}

.wp-block-button__link:hover {
	transform: translateY(-1px);
}

.wp-block-button__link:active {
	transform: translateY(0);
}

/* Secondary: Outline Rosmarin. */
.is-style-secondary .wp-block-button__link {
	background: transparent;
	color: var(--wp--preset--color--contrast);
	border: 1px solid var(--wp--preset--color--contrast);
	padding-top: calc(1.0625rem - 1px);
	padding-bottom: calc(1.0625rem - 1px);
}

.is-style-secondary .wp-block-button__link:hover {
	background: var(--wp--preset--color--contrast);
	color: var(--wp--preset--color--base-2);
}

/* Auf dunklen Flaechen invertiert Secondary automatisch. */
.is-style-section-dark .is-style-secondary .wp-block-button__link,
.ff-cta .is-style-secondary .wp-block-button__link {
	color: var(--wp--preset--color--base-2);
	border-color: color-mix(in srgb, var(--wp--preset--color--base-2) 45%, transparent);
}

.is-style-section-dark .is-style-secondary .wp-block-button__link:hover,
.ff-cta .is-style-secondary .wp-block-button__link:hover {
	background: var(--wp--preset--color--base-2);
	color: var(--wp--preset--color--contrast);
	border-color: var(--wp--preset--color--base-2);
}

/* Ghost: reiner Textlink mit Pfeil, fuer sekundaere Wege. */
.is-style-ghost .wp-block-button__link {
	background: transparent;
	color: var(--wp--preset--color--accent-dark);
	padding-inline: 0.25rem;
	padding-block: 0.5rem;
	text-decoration: none;
	border-bottom: 1px solid currentColor;
	border-radius: 0;
}

.is-style-ghost .wp-block-button__link:hover {
	background: transparent;
	color: var(--wp--preset--color--contrast);
}

.is-style-section-dark .is-style-ghost .wp-block-button__link,
.ff-cta .is-style-ghost .wp-block-button__link {
	color: var(--wp--preset--color--cta);
}

.is-style-section-dark .is-style-ghost .wp-block-button__link:hover,
.ff-cta .is-style-ghost .wp-block-button__link:hover {
	color: var(--wp--preset--color--base-2);
}

/* ==========================================================================
 * 6. Karten
 * ========================================================================== */

/* Karten tragen im Entwurf durchgehend DIESELBE Cremefarbe und einen zarten
 * Schatten. Verschiedene Kartenfarben in einem Set lassen gleichrangige
 * Inhalte ungleich aussehen; die Tiefe kommt vom Schatten, nicht von der
 * Farbe. */
/* Kartenmasse nach dem Entwurf (Home.dc.html, Angebotskarten):
 * radius 24px, padding 46px 42px, gap 18px,
 * Schatten 0 10px 34px rgba(36,48,30,0.07), Hover -6px auf 0 18px 44px /0.12.
 * Vorher lag hier ein doppelter, viel flacherer Schatten (1px/2px + 10px/28px)
 * und ein Hover von nur -3px — die Karten standen dadurch flach auf der
 * Flaeche, statt zu schweben. Das Padding traegt die Karte jetzt selbst;
 * Patterns duerfen es nicht mehr per Inline-Style setzen. */
/* Doppelte Klasse mit Absicht: Core setzt `.wp-block-group.has-background
 * { padding: 1.25em 2.375em }` (Spezifitaet 0,2,0). Ein einfaches .ff-card
 * (0,1,0) verliert dagegen — die Karten haetten nach dem Entfernen der
 * Inline-Styles 20/38px statt 46/42px bekommen. */
.ff-card.ff-card {
	position: relative;
	display: flex;
	flex-direction: column;
	gap: 1.125rem;
	/* 46/42 ab rund 840px, darunter mitwachsend (21.08.2026).
	 *
	 * Fest gesetzt frassen sie auf einer 320px-Karte ein Viertel der
	 * Breite: Die Textspalte blieb bei 236px und der Satz brach in
	 * Wortfetzen um. Die Entwuerfe sind `min-width:1100px` und sagen ueber
	 * das Handy nichts, die Mobilwerte sind also unsere.
	 *
	 * Karten mit eigenem Polster aus dem Entwurf (ff-thema, ff-onlinekurs,
	 * ff-mission__punkt, ff-wb-karte, ff-wb-info, ff-vortraege__karte,
	 * ff-kursformat__eignung) haben ihre eigene Doppelklassen-Regel und
	 * bleiben davon unberuehrt — ihre Werte sind ohnehin kleiner. */
	padding: clamp(1.75rem, 5vw, 2.875rem) clamp(1.5rem, 5.5vw, 2.625rem);
	border-radius: var(--wp--custom--radius--card);
	box-shadow: var(--wp--preset--shadow--card);
	transition: var(--wp--custom--transition--lift);
}

.ff-card > * {
	margin-block: 0;
}

/* Kartenlink am Fuss — im Entwurf ein schlichter Textlink, kein Knopf.
 * `margin-top: auto` schiebt ihn an den unteren Kartenrand, damit alle
 * Karten des Rasters ihn auf derselben Hoehe tragen. */
.ff-kartenlink {
	margin-top: auto !important;
	margin-bottom: 0;
	font-size: 0.875rem; /* 14px */
	font-weight: 500;
}

.ff-kartenlink a {
	color: var(--wp--preset--color--accent);
	text-decoration: none;
	white-space: nowrap;
}

.ff-kartenlink a:hover,
.ff-kartenlink a:focus-visible {
	color: var(--wp--preset--color--cta-hover);
	text-decoration: underline;
	text-underline-offset: 3px;
}

/* Dritte Karte traegt zusaetzlich eine Minze-Pille (Entwurf: „Workshops
 * entdecken"). Kleiner als der Standardknopf, weil sie in einer Karte
 * steht und nicht auf einer Sektionsflaeche. */
.ff-kartenaktion {
	display: flex;
	flex-direction: column;
	gap: 1rem;
	margin-top: auto !important;
}

.ff-kartenaktion .ff-kartenlink {
	margin-top: 0 !important;
}

.ff-kartenknopf .wp-block-button__link {
	font-size: 0.90625rem; /* 14.5px */
	padding: 0.6875rem 1.625rem; /* 11/26 */
}

/* Karte mit Link: die ganze Flaeche ist klickbar (Overlay-Technik), der
 * Link bleibt aber ein echter Link fuer Tastatur und Screenreader. */
.ff-card--link:hover {
	transform: var(--wp--custom--lift--hover);
	box-shadow: var(--wp--preset--shadow--card-hover);
}

/* KARTENLINK — Masse aus den Entwuerfen, nicht aus dem Bauch.
 *
 * Home.dc.html „Zum Praxisangebot →" 14px/500, Wissen.dc.html
 * „Zu den Artikeln →" 13.5px/500, Fuer-Fachpersonen.dc.html
 * „Bisherige Vortraege →" 14px/500 — durchgehend Gewicht 500, 13.5 bis 14px
 * und NIE unterstrichen. Hier standen 600 und `sm` (15.5px) mit einer
 * Unterkante als Strich; deshalb sahen die Links auf /wissen/ anders aus als
 * ueberall sonst.
 */
.ff-card__more {
	margin-top: auto;
	padding-top: 0.5rem;
	font-weight: 500;
	/* `!important`, weil die Patterns `has-sm-font-size` mitgeben und
	 * WordPress Schriftgroessen-Presets selbst mit `!important` ausgibt.
	 * Ohne das kam 15.5px an statt 14px. */
	font-size: 0.875rem !important;
	letter-spacing: 0.02em;
}

.ff-card__more a {
	/* `!important` wie bei .ff-ankernav a: die globale Linkunterstreichung
	 * des Themes schlaegt sonst durch. Der Entwurf unterstreicht diese
	 * Kartenlinks nirgends. */
	text-decoration: none !important;
}

/* Der Pfeil traegt die Erkennbarkeit, die vorher der Strich uebernahm — so
 * loest es der Entwurf. Er steht bewusst im CSS und nicht im Text: kein
 * Pattern fuehrt ihn im Inhalt, also kann er sich auch nicht verdoppeln. */
.ff-card__more a::after {
	content: "\00a0→";
}

.ff-card--link .ff-card__more a::before {
	content: "";
	position: absolute;
	inset: 0;
	border-radius: inherit;
}

.ff-card__more a:hover {
	color: var(--wp--preset--color--contrast);
}

/* Karte mit Bild oben. */
.ff-card__media {
	margin: 0 0 0.25rem;
	border-radius: var(--wp--custom--radius--card-small);
	overflow: hidden;
}

.ff-card__media img {
	display: block;
	width: 100%;
	transition: transform 0.6s cubic-bezier(0.22, 0.61, 0.36, 1);
}

/* Bildplatzhalter: WP-Core rendert core/image ohne src als LEEREN String —
 * die Spalte verschwaende dann komplett. Deshalb tragen alle Platzhalter
 * assets/images/platzhalter.svg als echtes src. Diese Regel gibt ihnen
 * zusaetzlich den gestrichelten Rahmen, damit im Abnahmestand sofort
 * erkennbar ist, wo noch ein Motiv fehlt. */
.wp-block-image img[src$="platzhalter.svg"] {
	border: 1px dashed var(--wp--preset--color--muted);
	border-radius: var(--wp--custom--radius--media);
}

.ff-card--link:hover .ff-card__media img {
	transform: scale(1.03);
}

/* Kartenraster stapeln.
 * Die Patterns setzen "columnCount":N mit "minimumColumnWidth":null. WP-Core
 * erzeugt daraus ein starres repeat(N, minmax(0, 1fr)) ohne auto-fit, das auf
 * kleinen Viewports nicht von selbst umbricht. Die Selektoren hier haben
 * Spezifitaet 0,2,0 und schlagen damit die generierte
 * .wp-container-core-group-is-layout-* Regel (0,1,0). */
@media (max-width: 63.99em) {
	.wp-block-group.is-layout-grid {
		grid-template-columns: repeat(2, minmax(0, 1fr));
	}
}

@media (max-width: 39.99em) {
	.wp-block-group.is-layout-grid {
		grid-template-columns: minmax(0, 1fr);
	}
}

/* ==========================================================================
 * 7. Formulare
 * ========================================================================== */

.ff-form input[type="text"],
.ff-form input[type="email"],
.ff-form input[type="tel"],
.ff-form input[type="date"],
.ff-form select,
.ff-form textarea,
.wp-block-search__input {
	/* Ohne border-box rechnet der Browser die 2rem Innenabstand und die
	 * beiden Rahmenlinien ZUSAETZLICH zu width:100% — jedes Feld war damit
	 * 34 px breiter als seine Spalte. In breiten Formularen blieb das
	 * unsichtbar, im zweispaltigen Newsletter-Stopper stand das E-Mail-Feld
	 * ueber der Kartenkante. WordPress setzt border-box nur fuer Bloecke,
	 * nicht fuer Formularfelder in core/html. */
	box-sizing: border-box;
	width: 100%;
	/* Masse aus Kontakt.dc.html: Polster 13/16, Radius 12, Schrift 14.5px,
	 * Grund Seitengrund (nicht Kartenweiss — die Felder liegen auf einer
	 * weissen Karte und muessen sich davon absetzen). */
	padding: 0.8125rem 1rem;
	font: inherit;
	font-size: 0.90625rem;
	line-height: 1.4;
	color: var(--wp--preset--color--contrast);
	background: var(--wp--preset--color--base);
	/* Bedienelement-Rahmen braucht 3:1 — helles Leinsamen reicht dafuer nicht. */
	border: 1px solid var(--wp--preset--color--muted-dark);
	border-radius: 0.75rem;
	transition: border-color var(--wp--custom--transition--base);
}

.ff-form textarea {
	min-height: 9rem;
	resize: vertical;
}

/* Sichtbarer Fokus: echter outline statt nur box-shadow — ein Schatten
 * verschwindet im Windows-Kontrastmodus ersatzlos. */
.ff-form input:focus-visible,
.ff-form select:focus-visible,
.ff-form textarea:focus-visible,
.wp-block-search__input:focus-visible {
	outline: 2px solid var(--wp--preset--color--accent-dark);
	outline-offset: 2px;
	border-color: var(--wp--preset--color--accent-dark);
}

.ff-form input:focus,
.ff-form select:focus,
.ff-form textarea:focus,
.wp-block-search__input:focus {
	border-color: var(--wp--preset--color--accent-dark);
}

.ff-form label {
	display: block;
	margin-bottom: 0.375rem;
	font-size: 0.84375rem; /* 13.5px, Entwurf */
	font-weight: 500;
	color: var(--wp--preset--color--contrast);
}

.ff-form__field {
	margin-bottom: var(--wp--preset--spacing--md);
}

.ff-form__hint {
	/* 0.35rem waren zu wenig — der Hinweis klebte am Knopf darueber
	 * (gemeldet 28.08.2026). */
	margin-top: 0.9rem;
	font-size: var(--wp--preset--font-size--xs);
	color: var(--wp--preset--color--muted-dark);
}

/* Spezifitaet muss .ff-form label (0-1-1) schlagen, sonst stapeln
 * Checkbox und Text und der Consent-Text laeuft fett. */
.ff-form .ff-form__check,
label.ff-form__check {
	display: flex;
	align-items: flex-start;
	gap: 0.65rem;
	font-size: var(--wp--preset--font-size--sm);
	font-weight: 400;
	color: var(--wp--preset--color--body);
}

.ff-form__check input {
	margin-top: 0.2rem;
	width: 1.1rem;
	height: 1.1rem;
	accent-color: var(--wp--preset--color--accent-dark);
	flex: 0 0 auto;
}

/* Honeypot-Feld (Spam-Falle) visuell und fuer Screenreader entfernen. */
.ff-form__hp {
	position: absolute !important;
	left: -9999px !important;
	width: 1px;
	height: 1px;
	overflow: hidden;
}

.ff-form__error {
	color: #9B2C2C;
	font-size: var(--wp--preset--font-size--sm);
	font-weight: 600;
}

.wp-block-search__button {
	border-radius: var(--wp--custom--radius--button);
}

/* ==========================================================================
 * 8. Sektionen & Markenmotive
 * ========================================================================== */

.ff-section {
	padding-block: var(--wp--preset--spacing--section);
}

/* KEIN Abstand zwischen den Sektionen einer Seite.
 *
 * WordPress setzt den globalen Blockabstand (24px) als `margin-block-start`
 * zwischen alle Geschwister im Inhaltsfluss — also auch zwischen zwei
 * Sektionen. Da benachbarte Sektionen verschiedene Flaechenfarben tragen,
 * blitzte dazwischen ueberall ein 24px breiter Streifen Seitengrund durch.
 * Im Entwurf stossen die Flaechen direkt aneinander. */
.entry-content > *,
.wp-site-blocks > * {
	margin-block-start: 0;
}

.ff-section--tight {
	padding-block: var(--wp--preset--spacing--xl);
}

/* Flaechenvarianten als Block-Stile — damit die Kundin eine Sektion im
 * Editor umschalten kann, ohne Farben einzeln zu waehlen.
 *
 * KORRIGIERT 15.08.2026: `section-soft` zeigte auf `base-2` (#FEFDF8) —
 * das ist der KARTENton. Der Entwurf wechselt die Sektionsflaechen aber
 * zwischen Seitengrund #FBF9F2 und Sand #F5F2E9; #FEFDF8 kommt als Flaeche
 * gar nicht vor, nur auf Karten. Der Stil steckt in 14 Patterns, die
 * Sektionen waren dadurch site-weit einen Ton zu hell und hoben sich kaum
 * vom Seitengrund ab. */
.is-style-section-soft {
	background-color: var(--wp--preset--color--surface-sand);
}

.is-style-section-sand {
	background-color: var(--wp--preset--color--surface-sand);
}

.is-style-section-ice {
	background-color: var(--wp--preset--color--surface-ice);
}

.is-style-section-dark {
	background-color: var(--wp--preset--color--contrast);
	color: var(--wp--preset--color--base-2);
}

.is-style-section-dark :is(h1, h2, h3, h4, h5) {
	color: var(--wp--preset--color--base-2);
}

/* Minze bleibt Buttons vorbehalten — auf dunkler Flaeche traegt das
 * Eyebrow deshalb gedaempftes Schlagrahm, nicht die Handlungsfarbe. */
.is-style-section-dark .ff-eyebrow {
	color: color-mix(in srgb, var(--wp--preset--color--base-2) 78%, transparent);
}

.is-style-section-dark .ff-eyebrow--rules::before,
.is-style-section-dark .ff-eyebrow--rules::after {
	background: color-mix(in srgb, var(--wp--preset--color--base-2) 35%, transparent);
}

/* --- 8a. Eyebrow: kleine Versalienzeile ueber Ueberschriften --- */

/* NACH DEM ENTWURF (Home.dc.html u. a.), 15.08.2026.
 *
 * Vorher: 15px, fett, Versalien, 0.1em gesperrt, Matcha Dunkel — ein
 * Fachjournal-Marker aus meinem eigenen System. Der Entwurf setzt an dieser
 * Stelle durchgehend `color:#2E8C80; font-size:16px; font-weight:400`
 * ohne Versalien und ohne Sperrung. Das ist ein ruhiger Zwischentitel,
 * kein Label — und er steht auf JEDER Seite, deshalb faellt der
 * Unterschied ueberall auf. */
.ff-eyebrow {
	/* 16px steht so in JEDEM Entwurf — Home, Vision-Mission, Fuer-Fachpersonen.
	 * `!important`, weil die Patterns den Eyebrows `has-sm-font-size` mitgeben
	 * und WordPress Schriftgroessen-Presets selbst mit `!important` ausgibt.
	 * Ohne das kam 15.5px an. */
	font-size: 1rem !important;
	font-weight: 400;
	letter-spacing: normal;
	text-transform: none;
	color: var(--wp--preset--color--accent);
	margin-bottom: 1rem;
}

/* Editorial-Variante mit Haarlinien links und rechts — der Sektionsmarker
 * eines Fachjournals. Traegt den Rhythmus der ganzen Seite. */
.ff-eyebrow--rules {
	display: flex;
	align-items: center;
	justify-content: center;
	gap: 1.15rem;
}

.ff-eyebrow--rules::before,
.ff-eyebrow--rules::after {
	content: "";
	flex: 0 0 2.75rem;
	height: 1px;
	background: var(--wp--preset--color--muted);
}

/* --- 8b. Display-Ueberschrift mit Zierstrich --- */

.ff-display-heading {
	margin-bottom: 0;
}

/* Die Fliesstextbreite (39rem) ist fuer Sektionstitel zu schmal — sie
 * brechen dann mitten in der Wortgruppe um. Titel und Eyebrow duerfen
 * deshalb breiter laufen als die Textspalte, in der sie stehen. */
.is-layout-constrained > .ff-display-heading,
.is-layout-constrained > .wp-block-heading,
.is-layout-constrained > .ff-eyebrow {
	max-width: min(46rem, 100%);
	margin-inline: auto;
}

/* ENTFERNT 15.08.2026 — hier stand eine 48px-Haarlinie unter JEDEM
 * zentrierten Sektionstitel. Sie kommt in keiner der Entwurfsdateien vor
 * (Home, Praxis, Wissen, Kontakt geprueft); sie war meine Zutat und stand
 * damit auf fast jeder Sektion der Seite. */

/* Versalien geloest von h1: sonst laufen alle Blog- und Wissen-Titel in
 * Grossbuchstaben. Gilt nur im Hero und wo ausdruecklich gesetzt. */
.ff-hero h1,
.ff-display-caps {
	text-transform: uppercase;
	letter-spacing: var(--wp--custom--letter-spacing--display-caps);
}

.ff-subline {
	color: var(--wp--preset--color--body);
}

/* --- 8c. Wellentrenner (Bildmarke als Sektionsgrenze) --- */

/* Als CSS-Maske statt Inline-SVG: so braucht kein Pattern einen
 * core/html-Block, den die Kundin im Editor gar nicht einfuegen darf. */
.ff-wave-divider {
	width: min(9rem, 34vw);
	aspect-ratio: 126 / 16;
	margin-inline: auto;
	background-color: currentColor;
	color: var(--wp--preset--color--muted);
	-webkit-mask: url("../logo/wave.svg") center / contain no-repeat;
	mask: url("../logo/wave.svg") center / contain no-repeat;
}

.ff-wave-divider--accent {
	color: var(--wp--preset--color--accent);
}

.is-style-section-dark .ff-wave-divider {
	color: color-mix(in srgb, var(--wp--preset--color--base-2) 45%, transparent);
}

/* Inline-Variante (PHP-Helfer floraflow_wave), falls doch mal gebraucht. */
.ff-wave {
	display: block;
	width: min(9rem, 34vw);
	margin-inline: auto;
	color: var(--wp--preset--color--muted);
}

.ff-wave svg {
	display: block;
	width: 100%;
	height: auto;
}

/* --- 8d. Punkt-Liste (Klassenname historisch: ff-list--sprout) ---
 *
 * KREIS STATT BLATT (11.09.2026, Jelina: „Ich bin mir bei diesem Icon nicht
 * sicher, vielleicht lieber der Kreis von Mind"). Das Blatt war eine
 * Ableitung aus der Sprosse im Logo, als eigenes Zeichen aber nirgends in
 * der CI. Der Kreis ist das Mind-Zeichen und zugleich der Kopf der
 * Bildmarke — damit kommt der Listenpunkt direkt aus dem Logo.
 *
 * 8 px statt 12: Eine gefuellte Scheibe traegt optisch mehr Gewicht als das
 * schmale Blatt; in 12 px stand sie neben 17,5-px-Text wie ein Knopf.
 * Senkrecht auf die Mitte der ersten Zeile (`lh` = Zeilenhoehe), damit der
 * Punkt bei mehrzeiligen Eintraegen oben bleibt. */

.ff-list--sprout {
	list-style: none;
	padding-left: 0;
	display: grid;
	gap: 0.7rem;
}

.ff-list--sprout li {
	position: relative;
	padding-left: 1.85rem;
}

.ff-list--sprout li::before {
	content: "";
	position: absolute;
	left: 0.125rem;
	top: 0.8em;
	top: 0.5lh;
	width: 0.5rem;
	height: 0.5rem;
	transform: translateY(-50%);
	background: var(--wp--preset--color--accent);
	border-radius: 50%;
}

/* Haken-Liste fuer Eignungs- und Leistungsaufzaehlungen. */
.ff-list--check {
	list-style: none;
	padding-left: 0;
	display: grid;
	gap: 0.7rem;
}

.ff-list--check li {
	position: relative;
	padding-left: 1.85rem;
}

/* Selbst gezeichneter Haken statt eines ✓-Zeichens: Generierten Text lesen
 * NVDA und VoiceOver mit vor — bei einer Nutzenliste hoerte man dann vor
 * jedem Punkt „Haekchen". Zwei Rahmenkanten, um 45 Grad gedreht, sind fuer
 * Screenreader gar nicht vorhanden und skalieren sauber mit. */
.ff-list--check li::before {
	content: "";
	position: absolute;
	left: 0.25rem;
	top: 0.35em;
	width: 0.75rem;
	height: 0.4rem;
	border-left: 2px solid var(--wp--preset--color--accent-dark);
	border-bottom: 2px solid var(--wp--preset--color--accent-dark);
	border-radius: 1px;
	transform: rotate(-45deg);
}

/* --- 8d2. Chips: Begriffsreihe mit zentriertem Umbruch ---
 * Bewusst Flex statt Grid: Bei sieben Begriffen bliebe die letzte
 * Rasterzeile linksbuendig stehen. */

.ff-chips > * {
	flex: 0 0 auto;
	min-width: 8.5rem;
	text-align: center;
}

/* --- 8e. Kennzahlen --- */

.ff-stat {
	text-align: center;
}

.ff-stat__number {
	display: block;
	font-family: var(--wp--preset--font-family--display);
	font-weight: 400;
	font-size: clamp(2.5rem, 1.8rem + 3vw, 4rem);
	line-height: 1;
	color: var(--wp--preset--color--contrast);
}

.ff-stat__label {
	display: block;
	margin-top: 0.6rem;
	font-size: var(--wp--preset--font-size--xs);
	font-weight: 600;
	letter-spacing: var(--wp--custom--letter-spacing--caps);
	text-transform: uppercase;
	color: var(--wp--preset--color--muted-dark);
}

/* --- 8f. Trust-Zeile --- */

.ff-trust-row__label {
	font-size: var(--wp--preset--font-size--xs);
	letter-spacing: var(--wp--custom--letter-spacing--caps);
	text-transform: uppercase;
	color: var(--wp--preset--color--muted-dark);
}

.ff-trust-row__logos {
	opacity: 0.7;
	filter: grayscale(1);
}

/* --- 8g. Testimonial --- */

/* Das Anfuehrungszeichen ist reine Dekoration und wird deshalb per ::before
 * erzeugt — als Textknoten wuerde der Screenreader es mitlesen. */
.ff-testimonial__mark::before {
	content: "«";
	display: block;
	font-family: var(--wp--preset--font-family--display);
	font-size: 2.75rem;
	font-style: normal;
	line-height: 0.75;
	color: var(--wp--preset--color--warm);
	margin-bottom: 0.35rem;
}

.ff-testimonial__quote {
	line-height: var(--wp--custom--line-height--lead);
}

.ff-testimonial__name {
	letter-spacing: 0.04em;
	color: var(--wp--preset--color--muted-dark);
}

/* --- 8g2. Foto-Sektionen mit stehendem Hintergrund ---
 *
 * Der Text wandert, das Bild bleibt stehen. Umgesetzt mit `position: sticky`
 * statt `background-attachment: fixed`: Letzteres ignoriert iOS Safari
 * komplett und ruckelt auf vielen Android-Geraeten. Ein sticky Medienelement
 * mit negativer Aussenkante nimmt keinen Platz im Fluss ein, bleibt am
 * Viewport haengen und wird vom Abschnitt sauber beschnitten.
 *
 * Anwendung: Stil-Variante „Fester Hintergrund" auf einem Cover-Block. */

/* WP-Core setzt auf .wp-block-cover ein display:flex. Ein sticky Medium
 * waere dort ein Flex-Item und wuerde den Inhalt zur Seite schieben —
 * deshalb hier Blockfluss. Die vertikale Zentrierung uebernimmt das
 * Innenabstands-Paar des Patterns. */
/* KORRIGIERT 15.08.2026 — der Hero ging nicht bis an den Rand.
 *
 * Der stehende Hintergrund ist hier ein Element IM FLUSS (`position:
 * sticky`), anders als Cores Hintergrundbild, das absolut liegt und
 * deshalb auch den Polsterbereich ueberdeckt. Ein Flusselement sitzt im
 * INHALTSKASTEN — es bekommt also das Polster des Covers vorgesetzt.
 *
 * Gemessen: Bild bei x=18, y=68 statt 0,0. Die 18px waren Cores
 * `.wp-block-cover { padding: 1em }` quer (mit 17.5px Grundschrift), die
 * 68px das Sektionspolster hoch. Sichtbar als heller Streifen links,
 * rechts und oben — genau das, was Lucas gemeldet hat.
 *
 * Loesung: Der Cover traegt kein Polster mehr, es wandert auf den
 * Innencontainer. Das `!important` schlaegt den Inline-Style des Patterns. */
.wp-block-cover.is-style-fixed-media {
	display: block;
	overflow: clip;
	padding: 0 !important;
}

/* ==========================================================================
 * STEHENDE HINTERGRUENDE — alle Fotoflaechen
 *
 * Der Entwurf setzt jede Fotoflaeche auf `background-attachment: fixed`:
 * Das Motiv bleibt stehen, der Inhalt scrollt darueber. Bisher galt das nur
 * fuer den Startseiten-Hero; alle uebrigen Baender scrollten mit.
 *
 * Technik: Das Hintergrundbild ist `position: sticky` mit negativer
 * Aussenkante — es nimmt keinen Platz im Fluss ein, bleibt aber am
 * Viewport haften. Das funktioniert auch dort, wo
 * `background-attachment: fixed` nicht greift (iOS).
 *
 * PREIS DER TECHNIK: Ein Flusselement sitzt im Inhaltskasten, bekommt also
 * das Polster des Covers vorgesetzt und waere nicht mehr randlos. Deshalb
 * tragen diese Cover KEIN eigenes Polster — es wandert auf den
 * Innencontainer. Wer hier ein Cover ergaenzt, muss beides mitnehmen.
 * ========================================================================== */

/* `display: block` ist hier ZWINGEND, nicht kosmetisch.
 *
 * Core setzt `.wp-block-cover { display: flex }`, um den Inhalt mittig zu
 * halten. Das Hintergrundbild liegt bei dieser Technik aber IM FLUSS —
 * als Flex-Element stellt es sich also NEBEN den Inhalt und teilt sich die
 * Breite mit ihm. Gemessen am Praxis-Hero: Bild 683px, Text daneben ab
 * x=683 statt beides ueber die vollen 1425px.
 *
 * Im Blockfluss liegt das Bild dagegen hinter dem Inhalt, so wie gemeint. */
.wp-block-cover.is-style-fixed-media,
.wp-block-cover.ff-fotoband,
.wp-block-cover.ff-quoteband,
.wp-block-cover.ff-seitenkopf,
.wp-block-cover.ff-hero-bokeh {
	display: block;
	padding: 0 !important;
	overflow: clip;
}

/* BORDER-BOX AUCH FUER DEN FOTO-HERO (21.08.2026).
 *
 * `is-style-fixed-media` fehlte in dieser Liste. Folge auf der Startseite
 * bei 375px: Core gibt dem Innencontainer `width:100%` (360px), Cores
 * `has-global-padding` legt 20px links und rechts DARAUF (content-box),
 * macht 400px — und `overflow: clip` am Cover schnitt die letzten 20px
 * jeder Zeile ab. Sichtbar stand dort „Ganzheitliche Gesundheit fuer
 * Koerper, Geis". Gemessen: h1 von 20 bis 380 bei sichtbaren 360.
 *
 * Eigene Regel statt Aufnahme in die Liste darunter: Die dortige Regel
 * setzt auch `padding-block` und `padding-inline`, und der Foto-Hero traegt
 * sein Polster aus dem Pattern (xxl oben und unten). Hier soll nur die
 * Rechenart wechseln. */
.wp-block-cover.is-style-fixed-media > .wp-block-cover__inner-container {
	box-sizing: border-box;
}

.wp-block-cover.ff-fotoband > .wp-block-cover__inner-container,
.wp-block-cover.ff-quoteband > .wp-block-cover__inner-container,
.wp-block-cover.ff-seitenkopf > .wp-block-cover__inner-container,
.wp-block-cover.ff-hero-bokeh > .wp-block-cover__inner-container {
	box-sizing: border-box;
	padding-block: var(--ff-band-polster, 6.875rem);
	padding-inline: var(--wp--preset--spacing--gutter);
	margin-block: 0;
}

/* Polster je Bandtyp — Werte aus dem Entwurf. */
.ff-fotoband--sektion { --ff-band-polster: var(--wp--preset--spacing--section); } /* 120px */
.ff-quoteband        { --ff-band-polster: var(--wp--preset--spacing--band); }     /* 100px */
.ff-seitenkopf       { --ff-band-polster: 8.125rem; }                             /* 130px */

/* Unterseiten-Hero: Der Entwurf setzt `130px 56px 150px` — gerechnet ab
 * UNTER der Navigation, die im Entwurf innerhalb der Sektion liegt. Bei uns
 * ueberlagert die Kopfzeile den Hero, ihre Hoehe kommt deshalb oben dazu. */
.ff-hero-bokeh > .wp-block-cover__inner-container {
	padding-block: 8.125rem 9.375rem; /* 130 / 150 */
}

.ff-has-overlay-header .ff-hero-bokeh > .wp-block-cover__inner-container {
	padding-top: calc(8.125rem + 7rem);
}

.wp-block-cover.ff-fotoband > .wp-block-cover__image-background,
.wp-block-cover.ff-quoteband > .wp-block-cover__image-background,
.wp-block-cover.ff-seitenkopf > .wp-block-cover__image-background,
.wp-block-cover.ff-hero-bokeh > .wp-block-cover__image-background,
.wp-block-cover.is-style-fixed-media > .wp-block-cover__image-background,
.wp-block-cover.is-style-fixed-media > .wp-block-cover__video-background {
	/* `block` ist hier NICHT kosmetisch: Als Inline-Element sitzt das Bild
	 * auf der Grundlinie, und die Zeilenbox haengt ihre Unterlaenge darunter
	 * — gemessen 29px (17.5px Grundschrift x 1.65 Zeilenhoehe). Genau diese
	 * 29px machten den Hero 849 statt 820px hoch. */
	display: block;
	position: sticky;
	top: 0;
	width: 100%;
	height: 100dvh;
	/* Nimmt keinen Platz im Fluss ein, bleibt aber am Viewport haften. */
	margin-bottom: -100dvh;
	object-fit: cover;
	object-position: center;
}

/* BAENDER: FIXED HINTER EINEM CLIP (09.09.2026, Lucas: „nicht sticky
 * sondern fix? dass es auch schmal stehen bleibt, geht das so? Nicht
 * einfach hoeher machen.")
 *
 * Ja, so geht es. Sticky kann sich nur innerhalb seines Abschnitts bewegen
 * und steht auf einem 311px-Band deshalb nie. `position: fixed` haengt
 * am Viewport, egal wie flach das Band ist — und `clip-path: inset(0)` am
 * Band beschneidet auch fixierte Nachfahren, OHNE (anders als transform,
 * filter oder overflow) zum Bezugsrahmen zu werden. Der Browser
 * komposiert das auf der GPU; das Ruckeln von `background-attachment:
 * fixed` (Anlauf 2 vom 28.08.) entfaellt.
 *
 * Gemessen am 09.09. auf /praxis/ (Band 529px): Bildoberkante bleibt bei
 * 0, das Band faehrt 150px, ein Treffer 20px ueber dem Band landet in der
 * Sektion darueber, nicht im Bild — der Clip greift.
 *
 * Nur die Baender (`ff-fotoband`); Heroes sind hoeher als der Schirm und
 * bleiben sticky. Voraussetzung wie immer: kein Transform auf einem
 * Vorfahren — die Einblendung (theme.js) schiebt vollbreite Flaechen
 * deshalb nicht mehr. */
@media (min-width: 48em) {
	.wp-block-cover.ff-fotoband {
		clip-path: inset(0);
	}

	.wp-block-cover.ff-fotoband > .wp-block-cover__image-background,
	.wp-block-cover.ff-fotoband > .wp-block-cover__background,
	.wp-block-cover.ff-fotoband > .wp-block-cover__gradient-background {
		position: fixed;
		inset: 0;
		top: 0;
		height: 100vh;
		margin-bottom: 0;
	}

	/* Das Bild nimmt als fixed keinen Platz mehr ein; die negative
	 * Randkorrektur der Sticky-Variante entfaellt, der Inhalt beginnt
	 * am Bandanfang. */
	.wp-block-cover.ff-fotoband > .wp-block-cover__inner-container {
		position: relative;
	}
}

/* DER SCHLEIER KLEBT MIT (20.08.2026, gemeldet von Lucas: „der dunkle
 * Overlay ueber den Bildern sollte auch sticky sein").
 *
 * Core legt `.wp-block-cover__background` absolut ueber den ganzen
 * Abschnitt. Das Motiv haengt seit dem 15.08. dagegen am Viewport. Beide
 * bezogen sich also auf verschiedene Systeme, und beim Scrollen zog der
 * Schleier am stehenden Bild vorbei.
 *
 * `display: block` ist hier ZWINGEND, genau wie beim Bild darueber: Der
 * Schleier ist ein <span>. Solange er absolut liegt, blockifiziert ihn der
 * Browser von selbst; mit `position: sticky` faellt er auf `inline`
 * zurueck, und eine Hoehe gilt fuer Inline-Elemente nicht. Ohne diese Zeile
 * ist er 0 Pixel hoch und der Schleier verschwindet ersatzlos.
 *
 * `inset: auto` hebt Cores `inset: 0` auf — sonst zerrt es das Element
 * wieder auf die volle Abschnittshoehe. */
/* ALLE FOTOFLAECHEN STEHEN, Heroes wie Baender.
 *
 * Am 28.08.2026 hatte ich die Baender kurz auf mitscrollend gestellt, weil
 * ich Lucas' Markierungen („static") als Wunsch gelesen hatte statt als
 * Befund. Er hat den Ist-Zustand beschrieben: Sie WAREN static, und das war
 * der Fehler. Zurueckgedreht.
 *
 * Dass sie static waren, lag an der Einblendung: `.ff-reveal` liess nach
 * dem Lauf ein Transform stehen, und das macht die Sektion zum Bezugsrahmen
 * fuer jedes sticky darin. Behoben in theme.js — seitdem greift die Technik
 * hier zum ersten Mal ueberhaupt. */
.wp-block-cover.ff-fotoband > .wp-block-cover__background,
.wp-block-cover.ff-quoteband > .wp-block-cover__background,
.wp-block-cover.ff-seitenkopf > .wp-block-cover__background,
.wp-block-cover.ff-hero-bokeh > .wp-block-cover__background,
.wp-block-cover.is-style-fixed-media > .wp-block-cover__background,
.wp-block-cover.ff-fotoband > .wp-block-cover__gradient-background,
.wp-block-cover.ff-quoteband > .wp-block-cover__gradient-background,
.wp-block-cover.ff-seitenkopf > .wp-block-cover__gradient-background,
.wp-block-cover.ff-hero-bokeh > .wp-block-cover__gradient-background,
.wp-block-cover.is-style-fixed-media > .wp-block-cover__gradient-background {
	display: block;
	position: sticky;
	inset: auto;
	top: 0;
	width: 100%;
	height: 100dvh;
	margin-bottom: -100dvh;
}

/* AUF DEM HANDY KEIN STEHENDES MOTIV (21.08.2026).
 *
 * Die Technik haengt Bild und Schleier mit `height: 100dvh` am Viewport.
 * Auf einem 360x812-Schirm heisst das: ein querformatiges Band wie
 * `band-pastell` (768x216, also 3,56:1) muss einen 0,44:1-Kasten fuellen.
 * `object-fit: cover` skaliert es dafuer auf das 3,8-Fache und wirft
 * 88 Prozent der Bildbreite weg — vom Motiv bleibt ein Farbschleier.
 *
 * Darunter faellt das Motiv deshalb in Cores normales Verhalten zurueck:
 * absolut im Abschnitt, volle Hoehe des Abschnitts. Der Parallaxe-Effekt
 * entfaellt — auf dem Telefon ist er ohnehin der unwichtigste Teil, und
 * iOS ignoriert `background-attachment: fixed` seit jeher.
 *
 * Gemessen an `band-pastell` bei 375px: vorher 12,5 Prozent der Bildbreite
 * sichtbar, jetzt 25 Prozent. Der Rest ist ein Bildproblem, kein
 * CSS-Problem: Ein 3,56:1-Motiv passt nicht in einen hochkanten Kasten.
 * Wirklich loesen wuerde es ein eigener Hochkant-Zuschnitt der Baender. */
@media (max-width: 47.99em) {
	.wp-block-cover.ff-fotoband > .wp-block-cover__image-background,
	.wp-block-cover.ff-quoteband > .wp-block-cover__image-background,
	.wp-block-cover.ff-seitenkopf > .wp-block-cover__image-background,
	.wp-block-cover.ff-hero-bokeh > .wp-block-cover__image-background,
	.wp-block-cover.is-style-fixed-media > .wp-block-cover__image-background,
	.wp-block-cover.is-style-fixed-media > .wp-block-cover__video-background,
	.wp-block-cover.ff-fotoband > .wp-block-cover__background,
	.wp-block-cover.ff-quoteband > .wp-block-cover__background,
	.wp-block-cover.ff-seitenkopf > .wp-block-cover__background,
	.wp-block-cover.ff-hero-bokeh > .wp-block-cover__background,
	.wp-block-cover.is-style-fixed-media > .wp-block-cover__background {
		position: absolute;
		inset: 0;
		width: 100%;
		height: 100%;
		margin-bottom: 0;
	}
}

/* WEG DER PARALLAXE, ZURUECK AUF STICKY (28.08.2026, Ansage von Lucas).
 *
 * Drei Anlaeufe an derselben Stelle, der Reihe nach:
 *
 * 1. `position: sticky` am Bild — das Original. Haelt nur, solange der
 *    Abschnitt mindestens so hoch ist wie das Motiv (100dvh). Beim Hero
 *    (820px) geht das auf, beim Zitatband (311px) nicht.
 * 2. `background-attachment: fixed`, wie im Entwurf. Technisch richtig,
 *    aber Chrome zeichnet solche Flaechen auf dem Hauptthread neu:
 *    „hier springt der Hintergrund".
 * 3. Echte Parallaxe per `translate3d`. Lief ruhig, gefiel aber nicht:
 *    „nee, das ist auch doof".
 *
 * Es bleibt bei 1. Konsequenz, damit sie hier steht und nicht wieder
 * gesucht werden muss: Auf Abschnitten, die niedriger sind als der
 * Bildschirm, verhaelt sich das Motiv wie ein normaler Hintergrund und
 * faehrt mit. Das ist keine Fehlkonfiguration, sondern die Grenze der
 * Technik — ein sticky Element kann sich nur innerhalb seines Containers
 * bewegen. Wer den Effekt auch dort will, braucht einen der beiden
 * anderen Wege samt ihrer Nachteile. */

/* DER SCHLEIER BRAUCHT SEINE DECKUNG AUS DEM THEME (28.08.2026).
 *
 * Gemeldet als „der Hintergrund ist weg" am Zitatband der Startseite: Statt
 * des Pastellbands stand dort eine satte dunkelgruene Flaeche.
 *
 * Ursache: WordPress laedt die Stilvorlage des Cover-Blocks auf dieser
 * Website nicht. Im ausgelieferten HTML stehen die Stilbloecke fuer button,
 * buttons, columns, group, heading, image, list, navigation-link und
 * paragraph — `wp-block-cover` fehlt, obwohl drei Cover im Inhalt stehen
 * und sauber als `core/cover` parsen. Damit fehlt auch die Regel, die
 * `has-background-dim-40` auf `opacity: 0.4` setzt: Der Schleier lief mit
 * voller Deckung und verdeckte das Motiv vollstaendig.
 *
 * Aufgefallen ist es nur an den Baendern OHNE Scrim-Variante. Die Heroes
 * sehen richtig aus, weil unsere eigenen Regeln (`ff-hero--scrim` und
 * Verwandte) ihre Flaeche mit einer durchscheinenden Farbe selbst malen und
 * `opacity: 1` setzen — sie brauchen Cores Leiter gar nicht.
 *
 * Hier steht sie deshalb selbst. Das Theme haengt damit nicht mehr davon
 * ab, ob WordPress die Cover-Stilvorlage ausliefert. Sollte sie eines Tages
 * wieder mitkommen, sind die Werte dieselben — es aendert sich nichts. */
.wp-block-cover > .wp-block-cover__background.has-background-dim-0 {
	opacity: 0;
}
.wp-block-cover > .wp-block-cover__background.has-background-dim-10 {
	opacity: 0.1;
}
.wp-block-cover > .wp-block-cover__background.has-background-dim-20 {
	opacity: 0.2;
}
.wp-block-cover > .wp-block-cover__background.has-background-dim-30 {
	opacity: 0.3;
}
.wp-block-cover > .wp-block-cover__background.has-background-dim-40 {
	opacity: 0.4;
}
.wp-block-cover > .wp-block-cover__background.has-background-dim-50 {
	opacity: 0.5;
}
.wp-block-cover > .wp-block-cover__background.has-background-dim-60 {
	opacity: 0.6;
}
.wp-block-cover > .wp-block-cover__background.has-background-dim-70 {
	opacity: 0.7;
}
.wp-block-cover > .wp-block-cover__background.has-background-dim-80 {
	opacity: 0.8;
}
.wp-block-cover > .wp-block-cover__background.has-background-dim-90 {
	opacity: 0.9;
}
.wp-block-cover > .wp-block-cover__background.has-background-dim-100 {
	opacity: 1;
}

/* --- 8g3. Foto-Sektionen: zwei Schleier-Varianten ---
 *
 * Welche Variante gilt, entscheidet die HELLIGKEIT des Motivs. Gemessen am
 * CI-Hintergrund (Pfingstrose, hellste Stelle Relativluminanz 0,91):
 *
 *   Weisse Schrift + dunkler Scrim   70 % → 3,0:1   nur Grosstext
 *                                    80 % → 4,1:1   nur Grosstext
 *                                    86 % → 5,2:1   AA — erschlaegt aber das Motiv
 *   Rosmarin-Schrift + heller Schleier 70 % → 10,5:1  AA mit grossem Puffer
 *
 * Bei den hellen, pastelligen CI-Motiven ist der helle Schleier deshalb die
 * richtige Wahl: normkonform UND naeher an der luftigen Anmutung der Marke.
 * Der dunkle Scrim bleibt fuer dunklere, kontrastreichere Motive.
 *
 * Nach jedem Motivwechsel neu messen — die Zahlen oben gelten fuer dieses Bild. */

/* Variante A — zartes Bokeh, Rosmarin-Schrift.
 * Gemessen auf lucidflowers27 mit den echten Textkaesten: schlechtester Wert
 * 4,66:1 bei nur 40 % Deckung links. Wenig Schleier heisst viel Motiv. */
.ff-hero--veil .wp-block-cover__background {
	background: linear-gradient(
		to right,
		color-mix(in srgb, var(--wp--preset--color--base) 40%, transparent) 0%,
		color-mix(in srgb, var(--wp--preset--color--base) 34%, transparent) 30%,
		color-mix(in srgb, var(--wp--preset--color--base) 20%, transparent) 60%,
		color-mix(in srgb, var(--wp--preset--color--base) 0%, transparent) 100%
	) !important;
	opacity: 1 !important;
}

/* Variante B — Foto-Hero mit linksbuendigem Text, Schlagrahm-Schrift.
 *
 * SCHWARZ statt Rosmarin, dieselbe Begruendung wie bei der Ellipse (B2):
 * Rosmarin ueber dem rosa Motiv ergibt Oliv. Und DEUTLICH kraeftiger als
 * die erste Fassung (42 %): `hintergrund-home` ist die hellste Flaeche im
 * Projekt — der alte Verlauf kam am gerenderten Ergebnis auf 2,27:1 am
 * schlechtesten Punkt der Textzone. In der Zone stehen neben der H1 auch
 * Subline und Krankenkassen-Link, also Kleintext: Ziel ist 4,5:1.
 * Nach jedem Motivwechsel neu messen. */
/* NACH DEM ENTWURF (Home.dc.html), 15.08.2026 — vollstaendig ersetzt.
 *
 * Vorher stand hier ein schwarzer Verlauf quer nach rechts, der die linke
 * Bildhaelfte zu 62 % abdunkelte. Der Entwurf macht etwas anderes: ein
 * Schleier in Rosmarin, NUR von oben, 28 % am oberen Rand und bei 30 %
 * Hoehe bereits vollstaendig transparent. Er deckt die Navigation ab,
 * nicht den Text — die Schrift wird stattdessen mit einem weichen
 * Schlagschatten vom Motiv abgesetzt (siehe .ff-hero--scrim h1/p unten).
 *
 * Das Motiv bleibt damit sichtbar, statt zu 60 % zugedeckt zu sein.
 * Gemessene Folge: Der Text steht nicht mehr durchgehend ueber 4,5:1,
 * sondern traegt sich ueber Schattenkante und Motivhelligkeit. Der
 * Entwurf gibt das so vor. */
.ff-hero--scrim .wp-block-cover__background {
	background: linear-gradient(
		180deg,
		rgba(36, 48, 30, 0.28) 0%,
		rgba(36, 48, 30, 0) 30%
	) !important;
	opacity: 1 !important;
}

/* Schlagschatten wie im Entwurf — er, nicht der Schleier, traegt die
 * Lesbarkeit der Hero-Schrift. */
.ff-hero--scrim h1 {
	text-shadow: 0 2px 24px rgba(36, 48, 30, 0.25);
}

.ff-hero--scrim p {
	text-shadow: 0 1px 12px rgba(36, 48, 30, 0.25);
}

/* Variante C — heller Schleier, Rosmarin-Schrift.
 *
 * Fuer das im Briefing genannte Startseitenmotiv `lucidflowers7.jpg`: eine
 * sehr helle, fast weisse Pfingstrose. Gemessen am Bildausschnitt hinter der
 * Headline (mittlere Helligkeit L = 0,543):
 *
 *   weisse Schrift  braucht 65 % Rosmarin-Schleier fuer 4,7:1
 *   dunkle Schrift  braucht 25 % Hafermilch-Schleier fuer 5,1:1
 *
 * 65 % Rosmarin machen aus der zarten Bluete grauen Brei — und genau ihre
 * Leichtigkeit ist der Grund, warum das Motiv gewaehlt wurde. Deshalb hier
 * die Umkehrung, wie schon bei den vier Farbwelten: helle Flaeche, dunkle
 * Schrift. Der Schleier steht auf 32 % links und laeuft nach rechts aus,
 * damit Jelina und die Bluete frei stehen.
 *
 * Das weicht von Latifas Entwurf ab, der weisse Schrift vorsieht. Ihr
 * weiss-auf-hell war im Mockup der kritischste Kontrast ueberhaupt; mit dem
 * echten Motiv liegt er bei 1,08:1 ohne Schleier. */
.ff-hero--hell .wp-block-cover__background {
	background: linear-gradient(
		to right,
		color-mix(in srgb, var(--wp--preset--color--base) 32%, transparent) 0%,
		color-mix(in srgb, var(--wp--preset--color--base) 26%, transparent) 42%,
		color-mix(in srgb, var(--wp--preset--color--base) 12%, transparent) 62%,
		color-mix(in srgb, var(--wp--preset--color--base) 4%, transparent) 100%
	) !important;
	opacity: 1 !important;
}

.ff-hero--hell,
.ff-hero--hell :is(h1, h2, p) {
	color: var(--wp--preset--color--contrast);
}

.ff-hero--hell .ff-eyebrow {
	color: var(--wp--preset--color--accent-dark);
}

.ff-hero--hell .ff-lead {
	color: var(--wp--preset--color--body);
}

/* Variante B2 — derselbe Scrim, aber als weiche Ellipse unter zentriertem Text.
 *
 * ZWEI ENTSCHEIDUNGEN, beide gemessen statt geschaetzt.
 *
 * 1. ELLIPSE STATT FLAECHE. Der Verlauf von links (Variante B) setzt eine
 *    gedeckte SEITE voraus. Bei einem mittig stehenden Zitat gibt es die
 *    nicht: Der Text braucht in der Mitte Deckung, und genau dort ist der
 *    Verlauf am schwaechsten. Die Ellipse legt die Deckung dorthin, wo der
 *    Text steht, und laeuft nach aussen aus — das Motiv bleibt an den
 *    Raendern hell.
 *
 * 2. SCHWARZ STATT ROSMARIN. Das ist die einzige Stelle im Theme, an der
 *    eine Farbe nicht aus der Palette kommt, und zwar aus einem Grund:
 *    Rosmarin ist ein dunkles GRUEN. Ueber der rosa Pfingstrose ergibt es
 *    Oliv. Gemessen in der Textzone, jeweils bei der Deckung, die weisse
 *    Schrift auf 4,5:1 bringt:
 *
 *      Schleier            Deckung   Farbtondrift   Saettigung
 *      Rosmarin #24301E      61 %        +22 Grad       0,17
 *      Schwarz  #000000      50 %         -4 Grad       0,22
 *
 *    Schwarz braucht weniger Deckung UND laesst der Bluete ihre Farbe. Ein
 *    Scrim ist ein Schatten, keine Markenflaeche — er soll abdunkeln, nicht
 *    einfaerben. Wer hier eine Palettenfarbe einsetzt, faerbt das Motiv.
 *
 * Weisse Schrift auf dem rohen Motiv beginnt bei 1,22:1; die im Entwurf
 * gesetzten 42 % kommen auf 2,85:1 und bleiben damit unter der Norm.
 *
 * Nach jedem Motivwechsel neu messen. */
/* AUS DER ELLIPSE WURDE EINE FLAECHE (20.08.2026).
 *
 * Die Ellipse war ein Denkfehler in Verbindung mit dem stehenden Motiv:
 * Sie sass in der Mitte des ABSCHNITTS, das Bild haengt am VIEWPORT. Beim
 * Scrollen wanderte also die dunkle Mitte ueber das stehende Bild, und der
 * untere Teil des Heros lief sichtbar hell aus. Genau das hat Lucas
 * gemeldet. Ein Verlauf laesst sich mit einem stehenden Motiv nicht
 * vereinbaren, solange er die Schrift decken soll: Die Schrift wandert, das
 * Bild nicht.
 *
 * Der Entwurf loest es anders und einfacher — Praxis-Bauchgefuehl.dc.html,
 * Hero und Spezialisierung, woertlich:
 *
 *     background: url(...) center/cover no-repeat FIXED
 *     <div style="position:absolute; inset:0; background:rgba(45,62,50,0.42)">
 *
 * Also ein GLEICHMAESSIGER Schleier ueber dem festen Motiv. Eine Flaeche
 * sieht an jeder Scrollposition gleich aus, damit ist das Problem weg.
 *
 * ZWEI ABWEICHUNGEN VOM ENTWURF, beide gemessen (Textzone, 2. Perzentil,
 * Schrift #FEFDF8, gegen die sechs echten Motive):
 *
 *   Entwurf rgba(45,62,50,0.42)   2,45 bis 3,12:1  — drei Motive unter AA
 *   hier    rgba(0,0,0,0.52)      4,61 bis 5,85:1  — AA auch fuer Kleintext
 *
 * SCHWARZ statt Rosmarin aus demselben Grund wie bisher: Rosmarin ist ein
 * dunkles Gruen und faerbt die rosa Motive oliv (+22 Grad Farbtondrift
 * gegen -4 Grad bei Schwarz). Ein Scrim ist ein Schatten, keine
 * Markenflaeche.
 *
 * 52 Prozent ist kein neuer Wert: Genau das stand bisher schon in der
 * Schmalansicht, wo die Ellipse keinen Rand zum Auslaufen hatte. Aus der
 * Ausnahme wird die Regel.
 *
 * Nach jedem Motivwechsel neu messen. */
.ff-hero--scrim.ff-hero--eben .wp-block-cover__background {
	/* 44 statt 52 Prozent (28.08.2026, „bg zu dunkel"). Nachgerechnet
	 * gegen alle sechs Motive, Textzone, 2. Perzentil, Schrift #FEFDF8:
	 * schlechtester Wert 3,53:1 bei hintergrund-home. Die Zitate sind
	 * 24 bis 33px gross, dort fordert AA 3,0:1. Der Entwurf liegt bei 42
	 * Prozent und kaeme auf 3,3 — 44 haelt etwas Luft. */
	/* 36 statt 44 Prozent (09.09.2026, Jelina: „Müssen die Hintergründe der
	 * Header so dunkel sein?"). Gemessen nach dem Wechsel, siehe Kommentar
	 * unten in Abschnitt 12: die Zitate bleiben ueber 3:1, Fliesstext im
	 * Hero gibt es nicht. Ein weicher Textschatten faengt die hellsten
	 * Stellen der Motive ab. */
	background: rgba(0, 0, 0, 0.36) !important;
	opacity: 1 !important;
}

.ff-hero--scrim.ff-hero--eben :is(h1, h2, p) {
	text-shadow: 0 1px 18px rgba(0, 0, 0, 0.35);
}

/* PRAXIS HELLER (11.09.2026, Lucas nach Jelinas Wunsch „koennte man hier
 * noch etwas erhellen?"). Nur diese Seite, ueber die Klasse ff-hero--hell
 * am Cover. Gemessen am Motiv hintergrund-praxis in der Textzone des
 * Zitats (40 px): 22 Prozent ergeben im Median 3,0:1, an den hellsten
 * 2 Prozent 1,9:1. Der dichtere Textschatten traegt die hellen Stellen. */
.ff-hero--scrim.ff-hero--eben.ff-hero--hell .wp-block-cover__background {
	background: rgba(0, 0, 0, 0.22) !important;
}

.ff-hero--scrim.ff-hero--eben.ff-hero--hell :is(h1, h2, p) {
	text-shadow: 0 1px 2px rgba(0, 0, 0, 0.25), 0 2px 22px rgba(0, 0, 0, 0.45);
}

.ff-hero--scrim,
.ff-hero--scrim :is(h1, h2, p) {
	color: var(--wp--preset--color--base-2);
}

.ff-hero--scrim .ff-eyebrow {
	color: color-mix(in srgb, var(--wp--preset--color--base-2) 82%, transparent);
}

.ff-hero--scrim .ff-eyebrow--rules::before,
.ff-hero--scrim .ff-eyebrow--rules::after {
	background: color-mix(in srgb, var(--wp--preset--color--base-2) 45%, transparent);
}

.ff-hero--scrim .ff-lead {
	color: color-mix(in srgb, var(--wp--preset--color--base-2) 94%, transparent);
}

/* Der Ghost-Button traegt normalerweise Matcha Dunkel — auf dem Scrim waere
 * das Gruen auf Gruen (rund 1,5:1). Auf dunklem Grund gilt Schlagrahm. */
.ff-hero--scrim .wp-block-button.is-style-ghost .wp-block-button__link {
	color: var(--wp--preset--color--base-2);
	border-color: color-mix(in srgb, var(--wp--preset--color--base-2) 60%, transparent);
}

.ff-hero--scrim .wp-block-button.is-style-ghost .wp-block-button__link:hover,
.ff-hero--scrim .wp-block-button.is-style-ghost .wp-block-button__link:focus-visible {
	background: color-mix(in srgb, var(--wp--preset--color--base-2) 14%, transparent);
	border-color: var(--wp--preset--color--base-2);
}

/* Linksbuendiger Textblock in der gedeckten Zone — wie im Entwurf.
 * Der Textkasten sitzt IM Inhaltsbereich, statt den Cover-Innencontainer
 * zu verschieben: So bleibt der Seitenrand mit allen anderen Sektionen
 * buendig und die Zentrierlogik von Core bleibt unangetastet. */
.ff-hero__text {
	display: grid;
	gap: 0;
}

/* Versalien-Headline wie im Entwurf. Playfair laeuft in Grossbuchstaben
 * eng — die Sperrung gleicht das aus. Zeilenabstand darf enger als der
 * Display-Standard sein, weil Versalien keine Unterlaengen haben. */
/* KURSIV — das ist das prägende Merkmal des Entwurfs, an H1 wie an H2.
 * Aufrecht gesetzt wirkt dieselbe Schrift wie ein anderes Design. Die
 * Sperrung gleicht die enge Laufweite der Playfair-Versalien aus. */
/* AUFRECHT, nicht mehr kursiv (14.08., nach dem Claude-Entwurf Home.dc.html).
 * Kursiv kam aus Latifas Mockup; der aktuelle Entwurf setzt die Hero-H1
 * aufrecht in Versalien und laesst kursiv den Zitaten (ff-bokeh__zitat).
 * Damit haben H1 und Zitat wieder zwei unterscheidbare Register. */
.ff-hero__title {
	text-transform: uppercase;
	letter-spacing: 0.03em;
	line-height: 1.08;
	text-wrap: balance;
}

/* Subline des Startseiten-Heros: 25 px, Schriftschnitt 300 (Home.dc.html).
 * Ueber .ff-lead allein waere sie 22 px und im Normalschnitt — der leichte
 * Schnitt ist hier Absicht, er setzt die Zeile deutlich von der massiven
 * Versalien-H1 darueber ab. */
.ff-hero__text .ff-lead {
	font-size: clamp(1.125rem, 0.86rem + 1.1vw, 1.5625rem);
	font-weight: 300;
}

/* Unterstrichener Textlink neben der Minze-Pille. Im Entwurf steht dort kein
 * zweiter Button — das hält die Blickführung auf einer einzigen Handlung. */
.ff-hero__hinweis {
	margin: 0;
	font-size: var(--wp--preset--font-size--sm);
}

.ff-hero__hinweis a {
	color: inherit;
	text-decoration: underline;
	text-underline-offset: 0.35em;
	text-decoration-thickness: 1px;
	text-decoration-color: color-mix(in srgb, currentColor 55%, transparent);
}

.ff-hero__hinweis a:hover,
.ff-hero__hinweis a:focus-visible {
	text-decoration-color: currentColor;
}

.ff-hero__aktionen {
	align-items: center;
}

/* --- Freigestellte Person im Hero ---
 *
 * Bewusst UEBER die Hero-Hoehe hinaus (106 %) und unten buendig: Die
 * Rahmenkante schneidet die Figur an. Endet sie stattdessen frei im Bild,
 * wirkt sie aufgeklebt — genau das war einer der Kritikpunkte an Latifas
 * Entwurf, und ihn wollen wir nicht nachbauen. */
/* Text und Figur stehen als Flex-Paar nebeneinander — bewusst NICHT
 * absolut positioniert. Ein absolut gesetztes Element haengt am naechsten
 * positionierten Vorfahren, und das ist hier der Inner-Container von Core,
 * dessen Kasten breiter ausfaellt als der Cover selbst. Die Figur landete
 * dadurch neben dem Fenster. Flex bezieht sich auf den tatsaechlichen
 * Inhaltsfluss und ist gegen solche Ueberraschungen immun. */
.ff-hero__figur {
	margin: 0;
	/* Rein dekorativ — die Aussage steht vollstaendig im Text daneben. */
	pointer-events: none;
}

/* Die Vertrauenszeile ist der laengste Kleintext im Hero. Ohne Begrenzung
 * laeuft sie bis an den Spaltenrand, wo der Scrim schon duenn ist — dort fiel
 * sie unter AA. Frueher umbrechen loest das ohne mehr Deckung. */
.ff-hero__trust {
	max-width: 29rem;
}

.ff-hero__figur img {
	display: block;
	width: 100%;
	height: auto;
	/* Weicher Schlagschatten statt harter Kante: sonst schwebt die
	 * Freistellung sichtbar ueber dem Bokeh. */
	filter: drop-shadow(0 1.5rem 2.5rem rgba(36, 48, 30, 0.22));
}

/* GEOMETRIE AUS DEM ENTWURF (Home.dc.html), 15.08.2026.
 *
 * Der Entwurf legt den Textblock und die Freistellung nicht nebeneinander,
 * sondern uebereinander: Die Figur liegt absolut in der Sektion
 * (`right:4%; bottom:0; width:42%; height:86%`, `fit=contain`), der Text
 * steht davor und ist vertikal zentriert (`padding:0 56px`,
 * `max-width:860px`).
 *
 * Vorher stand hier ein Flex-Paar mit dem Vermerk, absolut positionieren
 * gehe nicht, weil der Innencontainer breiter sei als der Cover. Das lag
 * an `contentSize: 74rem` — der Container war constrained. Nimmt man ihm
 * die Begrenzung, ist er exakt so breit wie der Cover, und die
 * Prozentwerte des Entwurfs stimmen wieder.
 *
 * Messbare Folge der alten Fassung: Figur 437x640 bei x=906 statt 598x705
 * bei x=770 — also deutlich zu klein und zu weit rechts. */
@media (min-width: 782px) {
	/* KEIN `position: relative` hier — sonst wird der Innencontainer zum
	 * Bezugsrahmen der Figur, und die Prozentwerte des Entwurfs beziehen
	 * sich auf den falschen Kasten. Die Figur soll am Cover haengen, der
	 * ist `position: relative` und exakt so breit wie die Sektion.
	 *
	 * `box-sizing` ausdruecklich: Ohne das rechnete der Container
	 * 100% + 2x56px Polster = 1537px bei 1425px Cover und lief 112px
	 * ueber den rechten Rand hinaus; dieselbe Rechnung machte ihn 932
	 * statt 820px hoch und zog die Figur auf 802px Hoehe mit. */
	.ff-hero--photo {
		--ff-hero-textbreite: 53.75rem; /* 860px, Entwurf */
	}

	.ff-hero--photo .wp-block-cover__inner-container {
		box-sizing: border-box;
		display: flex;
		align-items: center;
		max-width: none;
		width: 100%;
		min-height: var(--ff-hero-hoehe);
		padding-inline: 3.5rem;
		/* Core gibt dem Innencontainer den globalen Blockabstand als
		 * `margin-block-start` mit — das machte den Hero 29px hoeher als
		 * die 820px des Entwurfs. */
		margin-block: 0;
	}

	.ff-hero--photo .ff-hero__text.ff-hero__text {
		position: relative;
		z-index: 2;
		padding-bottom: 2.5rem;
		margin-left: 0 !important;
		margin-right: 0 !important;
	}

	/* Hinter dem Text (z-index 1), unten buendig, ueber die Hoehe skaliert. */
	.ff-hero--photo .ff-hero__figur {
		position: absolute;
		right: 4%;
		bottom: 0;
		z-index: 1;
		width: 42%;
		height: 86%;
		margin: 0;
	}

	.ff-hero--photo .ff-hero__figur img {
		width: 100%;
		height: 100%;
		max-width: none;
		object-fit: contain;
		object-position: bottom center;
	}
}

/* AUSSCHNITT WIE IM ENTWURF.
 *
 * `lucidflowers7.jpg` ist ein Hochformat von 1928x2560; im Hero ist davon nur
 * ein Band zu sehen. Mittig geschnitten — die Vorgabe von object-fit — landet
 * das Band auf der weissen Pfingstrose, und weisse Schrift wird unlesbar.
 * Latifa hat den UNTEREN Teil mit den gruenen Stielen genommen.
 *
 * Nachgerechnet ueber den Farbabstand zwischen ihrem Entwurf und elf
 * Ausschnitten: mittig 0,214 — unten 0,076. Die mittlere Helligkeit faellt
 * dabei von L=0,602 auf 0,455, und genau deshalb traegt ihr Entwurf weisse
 * Schrift. Nicht die Datei war falsch, der Ausschnitt war es. */
.ff-hero--photo > .wp-block-cover__image-background {
	object-position: center bottom;
}

/* Schmaler Schirm: nebeneinander geht nicht mehr auf. Die Figur rutscht
 * unter den Text und bleibt rechtsbuendig, der Hero waechst mit. */
@media (max-width: 781px) {
	.ff-hero__figur {
		width: 80%;
		max-width: 22rem;
		margin: var(--wp--preset--spacing--lg) 0 calc(var(--wp--preset--spacing--xxl) * -1) auto;
	}
}

/* WordPress gibt fuer den constrained-Layout-Container
 * `margin-left:auto !important` aus und zieht den Kasten damit mittig.
 * Nur ein eigenes !important kommt dagegen an. */
/* Breite ueber eine Variable, damit die Foto-Variante sie setzen kann, ohne
 * dass sich zwei gleich spezifische Regeln um `max-width` streiten — genau
 * das hatte den Hero-Text auf 34rem festgehalten, obwohl der Entwurf 860px
 * (53.75rem) vorgibt. Die spaetere Regel gewann, nicht die gemeinte. */
.ff-hero--left .ff-hero__text.ff-hero__text {
	max-width: var(--ff-hero-textbreite, 34rem);
	margin-left: 0 !important;
	margin-right: auto !important;
	text-align: left;
}

.ff-hero--left .ff-eyebrow--rules {
	justify-content: flex-start;
}

.ff-hero--left .ff-eyebrow--rules::before {
	display: none;
}

.ff-hero--left .ff-lead {
	margin-inline: 0;
	max-width: 30rem;
}

/* Mobil kippt der Verlauf von waagerecht auf senkrecht — und dreht dabei die
 * Richtung um: Der Text steht jetzt OBEN, die Figur darunter. Also deckt der
 * Schleier oben und laeuft nach unten aus, damit Jelina frei steht. */
@media (max-width: 781px) {
	.ff-hero--veil .wp-block-cover__background {
		background: linear-gradient(
			180deg,
			color-mix(in srgb, var(--wp--preset--color--base) 46%, transparent) 0%,
			color-mix(in srgb, var(--wp--preset--color--base) 40%, transparent) 46%,
			color-mix(in srgb, var(--wp--preset--color--base) 12%, transparent) 100%
		) !important;
	}

	.ff-hero--scrim .wp-block-cover__background {
		background: linear-gradient(
			180deg,
			rgba(0, 0, 0, 0.64) 0%,
			rgba(0, 0, 0, 0.56) 46%,
			rgba(0, 0, 0, 0.2) 100%
		) !important;
	}

	.ff-hero--left .wp-block-cover__inner-container {
		max-width: none;
	}

	.ff-hero--left .ff-lead {
		max-width: none;
	}
}

/* --- 8g4. Header über dem Foto-Hero ---
 * Auf Seiten, die mit einem Foto-Hero beginnen, liegt der Header
 * transparent darueber — wie im Entwurf. Body-Klasse kommt aus
 * inc/setup.php. Sticky entfaellt dort bewusst: Ein Header, der beim
 * Scrollen von hell auf dunkel umschlagen muesste, waere ohne JavaScript
 * nur mit Tricks zu haben, die im Zweifel unlesbar umschlagen. */

.ff-has-overlay-header .ff-header {
	position: absolute;
	inset: 0 0 auto;
	z-index: 50;
	background: transparent;
	backdrop-filter: none;
	-webkit-backdrop-filter: none;
	box-shadow: none;
}

/* Der Hero muss ganz oben ansetzen, sonst steht ueber ihm ein Cremestreifen
 * und der Header schwebt halb darueber. Die 24 px kommen aus dem blockGap
 * zwischen Header-Part und main — sinnvoll, wenn der Header eine eigene
 * Leiste ist, falsch, wenn er im Bild liegt. */
.ff-has-overlay-header .wp-site-blocks > main {
	margin-top: 0;
}

/* Eigener Schleier fuer die Kopfzeile.
 *
 * Der Hero-Scrim laeuft waagerecht aus, die Navigation aber quer ueber die
 * ganze Breite — auf der offenen rechten Seite stand sie damit auf hellen
 * Bildpartien und verschwand. Ein weicher Verlauf von oben loest das, ohne
 * den Hero-Verlauf anzufassen.
 *
 * z-index -1 ist hier zwingend: Ein absolut gesetztes Pseudoelement ohne
 * z-index wird NACH dem Text gemalt und wuerde ihn zudecken. */
/* ENTFERNT 15.08.2026 — der Header traegt keinen eigenen Schleier mehr.
 *
 * Hier lag ein zweiter, kraeftiger Verlauf (55 % Schwarz, auslaufend unter
 * die Kopfzeile). Zusammen mit dem Hero-Verlauf ergab das einen sichtbaren
 * grauen Balken ueber dem Motiv, der an seiner Unterkante hart abriss —
 * genau die Stufe, die er verhindern sollte.
 *
 * Der Entwurf loest es mit EINEM Verlauf: dem Hero-Schleier von oben
 * (28 %, transparent ab 30 % Hoehe). Die Kopfzeile selbst ist vollstaendig
 * transparent und traegt nur eine Haarlinie (siehe ::after unten). */
.ff-has-overlay-header.ff-overlay-header--hell .ff-header::before {
	content: none;
}

/* Feine Trennlinie unter der Kopfzeile — so steht sie im Entwurf und sie
 * setzt den Header sauber vom Motiv ab, ohne ihn zu beschweren. */
.ff-has-overlay-header.ff-overlay-header--hell .ff-header::after {
	content: "";
	position: absolute;
	left: 0;
	right: 0;
	bottom: 0;
	height: 1px;
	/* 28 % — Entwurf: `border-bottom: 1px solid rgba(255,255,255,0.28)`. */
	background: color-mix(in srgb, var(--wp--preset--color--base-2) 28%, transparent);
	pointer-events: none;
}

/* Der Platz fuer den ueberlagernden Header gehoert an den INHALT, nicht an
 * den Cover-Rahmen: Das sticky Hintergrundbild sitzt sonst erst hinter dem
 * Innenabstand und das Foto beginnt 180px zu tief.
 * .ff-hero-bokeh steht mit im Selektor, seit auch die Unterseiten-Heroes
 * (Praxis, Fachpersonen, Events) den Header im Bild tragen. */
.ff-has-overlay-header .ff-hero .wp-block-cover__inner-container,
.ff-has-overlay-header .ff-hero-bokeh .wp-block-cover__inner-container {
	padding-top: 7rem;
}

/* UNTERSEITEN-HERO: KOPFZEILENHOEHE **PLUS** DEM POLSTER DES ENTWURFS.
 *
 * Die Regel weiter oben (Abschnitt „stehende Hintergruende") setzt dafuer
 * schon `padding-block: 130px 150px` — sie kam nur nie an:
 *
 *   .wp-block-cover.ff-hero-bokeh > …__inner-container   (0,3,0)  110px
 *   .ff-hero-bokeh > …__inner-container                  (0,2,0)  130/150
 *   .ff-has-overlay-header .ff-hero-bokeh …              (0,3,0)  nur oben
 *
 * Die erste Regel ist spezifischer als die zweite, die dritte steht spaeter
 * und ueberschrieb den oberen Wert mit der blossen Kopfzeilenhoehe.
 * Gemessen auf /praxis/ bei 1440px: 112px oben, 110px unten statt 242/150 —
 * das Zitat klebte an der Navigation, genau wie zuvor auf dem Telefon.
 *
 * Deshalb stehen beide Werte jetzt hier, hinter allen konkurrierenden
 * Regeln. Die schmalen Ansichten weiter unten ueberschreiben sie danach. */
.ff-has-overlay-header .ff-hero-bokeh .wp-block-cover__inner-container {
	padding-top: calc(7rem + 8.125rem);   /* Kopfzeile + 130 */
	padding-bottom: 9.375rem;             /* 150 */
}

/* Gleicher Umschaltpunkt wie die Kopfleiste (3f): Ab hier ist sie deutlich
 * flacher und braucht weniger Platz im Bild. */
@media (max-width: 1119.98px) {
	.ff-has-overlay-header .ff-hero .wp-block-cover__inner-container,
	.ff-has-overlay-header .ff-hero-bokeh .wp-block-cover__inner-container {
		padding-top: 4.5rem;
	}

	.ff-has-overlay-header .ff-hero-bokeh .wp-block-cover__inner-container {
		padding-top: calc(4.5rem + 8.125rem);
	}
}

/* SCHMALE SCHIRME: Kopfzeilenhoehe PLUS Luft, nicht nur Kopfzeilenhoehe.
 *
 * Die 4.5rem oben waren so bemessen, dass sie die ueberlagernde Kopfzeile
 * gerade freihalten. Gemessen auf 390px: Kopfzeile endet bei 61px, die H1
 * begann bei 72px — 11px Abstand. Der Titel klebte damit an der
 * Navigation, obwohl technisch nichts ueberlappte.
 *
 * Der Entwurf setzt den Hero-Text vertikal mittig in die Flaeche unter der
 * Navigation; auf dem Telefon steht er im Fluss ueber der Freistellung.
 * Beides braucht denselben Atem nach oben. */
@media (max-width: 781.98px) {
	.ff-has-overlay-header .ff-hero .wp-block-cover__inner-container,
	.ff-has-overlay-header .ff-hero-bokeh .wp-block-cover__inner-container {
		padding-top: calc(4.5rem + 3rem);
	}

	/* Unterseiten-Heroes tragen nur ein Zitat und keine Freistellung.
	 * Dort ist die Flaeche hoeher als der Inhalt — das Zitat stand oben und
	 * darunter blieb die halbe Bildflaeche leer. Es sitzt jetzt mittig in
	 * dem Raum, der unter der Kopfzeile bleibt.
	 *
	 * `min-height` am Innencontainer statt am Cover: Der Cover ist bei der
	 * Technik fuer stehende Hintergruende `display: block`, dort gaebe es
	 * keinen Flex-Kontext zum Zentrieren. */
	.ff-has-overlay-header .ff-hero-bokeh .wp-block-cover__inner-container {
		box-sizing: border-box;
		display: flex;
		flex-direction: column;
		justify-content: center;
		/* Fester Wert, keine Variable: `--ff-hero-hoehe` ist nur an
		 * .ff-hero definiert, nicht an .ff-hero-bokeh. `min-height:
		 * var(--ff-hero-hoehe)` fiel dort still auf 0 zurueck — die
		 * Zentrierung hatte damit nichts, worin sie zentrieren konnte. */
		min-height: 62dvh;
		padding-bottom: 4.5rem;
	}
}

/* Die Infozeile traegt aus dem Pattern die Preset-Klassen fuer Rosmarin-
 * Flaeche und Schlagrahm-Text — beide mit !important. Ueber dem hellen Foto
 * muss beides gekippt werden, sonst steht heller Text auf hellem Grund. */
.ff-has-overlay-header .ff-header__bar {
	background: transparent !important;
	border-bottom: 1px solid color-mix(in srgb, var(--wp--preset--color--contrast) 14%, transparent);
}

.ff-has-overlay-header .ff-header__bar,
.ff-has-overlay-header .ff-header__bar p,
.ff-has-overlay-header .ff-header__bar a {
	color: var(--wp--preset--color--contrast) !important;
}

.ff-overlay-header--hell .ff-header__bar,
.ff-overlay-header--hell .ff-header__bar p,
.ff-overlay-header--hell .ff-header__bar a {
	color: var(--wp--preset--color--base-2) !important;
}

/* Standard ist der helle Schleier — dort traegt der Header Rosmarin.
 * Bei dunklem Scrim kehrt die Klasse ff-overlay-header--hell das um. */
.ff-has-overlay-header .ff-header__brand,
.ff-has-overlay-header .ff-header__nav a,
.ff-has-overlay-header .ff-header__bar,
.ff-has-overlay-header .ff-header .wp-block-navigation__responsive-container-open {
	color: var(--wp--preset--color--contrast);
}

.ff-has-overlay-header .ff-header__badge::before {
	color: var(--wp--preset--color--accent-dark);
}

.ff-has-overlay-header .ff-header__nav a[aria-current="page"] {
	color: var(--wp--preset--color--accent-dark);
}

.ff-overlay-header--hell .ff-header__brand,
.ff-overlay-header--hell .ff-header__nav,
.ff-overlay-header--hell .ff-header__nav a,
.ff-overlay-header--hell .ff-header__bar,
.ff-overlay-header--hell .ff-header .wp-block-navigation__responsive-container-open {
	color: var(--wp--preset--color--base-2);
}

.ff-overlay-header--hell .ff-header__bar {
	border-bottom-color: color-mix(in srgb, var(--wp--preset--color--base-2) 22%, transparent);
}

.ff-overlay-header--hell .ff-header__nav a[aria-current="page"] {
	color: var(--wp--preset--color--cta);
}

/* Das Overlay-Menue selbst bleibt hell — dort gilt wieder Rosmarin. */
.ff-has-overlay-header .ff-header .wp-block-navigation__responsive-container.is-menu-open a {
	color: var(--wp--preset--color--contrast);
}

/* --- 8h. Hero --- */

/* ACHTUNG, hier lag ein Fehler: An dieser Stelle stand ein pauschaler
 * Creme-Verlauf fuer .ff-hero mit !important. Er hat dieselbe Spezifitaet wie
 * .ff-hero--veil / .ff-hero--scrim in Abschnitt 8g3, steht aber SPAETER in
 * der Datei — und hat die beiden gemessenen Varianten damit stillschweigend
 * ueberschrieben. Der Hero rendert dann cremeweiss ueberwaschen, und weisse
 * Schrift steht auf hellem Grund.
 *
 * Die Deckung gehoert ausschliesslich zur jeweiligen Variante (8g3). Wer hier
 * wieder eine allgemeine Regel einzieht, hebelt sie erneut aus. */

/* Als Custom Property, weil der Innencontainer dieselbe Hoehe braucht (8g5)
 * — zwei Stellen liefen sonst irgendwann auseinander.
 *
 * 820px ist die Vorgabe des Entwurfs (`min-height:820px`). Vorher standen
 * hier 78dvh, auf einem 900px hohen Fenster also 702px — der Hero war
 * 118px zu flach. Der Entwurf ist auf `min-width:1100px` gebaut und rechnet
 * in festen Pixeln; die dvh-Fassung war meine Zutat.
 *
 * Unter 782px bleibt es bei einer Viewport-Hoehe, weil ein 820px hoher
 * Hero auf dem Telefon fast den ganzen Schirm fuellt. */
.ff-hero {
	--ff-hero-hoehe: 78dvh;
	min-height: var(--ff-hero-hoehe);
}

@media (min-width: 782px) {
	.ff-hero {
		--ff-hero-hoehe: 51.25rem; /* 820px */
	}
}

/* WP-Core setzt .wp-block-cover{color:#fff}. Auf unseren hellen Hero-
 * Flaechen wuerde damit jeder spaeter eingefuegte Block weiss auf Creme
 * rendern. Textfarbe deshalb am Container zuruecksetzen. */
.ff-hero .wp-block-cover__inner-container,
.ff-hero-quote .wp-block-cover__inner-container,
.ff-fotoband .wp-block-cover__inner-container {
	color: var(--wp--preset--color--body);
}

/* Die Karte auf dem Fotoband traegt dunkle Schrift. Ohne diese Zeile erbt
 * die Ueberschrift Cores Cover-Weiss und steht praktisch unsichtbar auf
 * dem cremefarbenen Kartengrund — genau das ist beim Umbau des CTA-Bandes
 * am 15.08.2026 passiert, weil die Klasse `ff-bokeh` mit ihrem Reset wegfiel. */
.ff-fotoband .ff-kartenstopper__titel {
	color: var(--wp--preset--color--contrast);
}

/* --- 8h2. Bokeh-Flaechen (Unterseiten-Heroes und Stopper) ---
 *
 * Latifas Entwurf gibt weiche, HELLE Bokeh-Farbfelder vor — je Unterseite
 * eine eigene Welt (gruen-rosa, blau, pfirsich). Ihre Schrift steht darauf
 * weiss, was 1,1:1 ergibt und nicht lesbar ist.
 *
 * Erster Versuch war, die Felder in die Tiefe zu ziehen, bis Weiss traegt.
 * Das war normkonform, hat aber den Zweck zerstoert: Alle vier Welten sahen
 * gleich dunkelgruen aus, die Unterscheidbarkeit war weg.
 *
 * Jetzt umgekehrt: Die Felder bleiben HELL wie im Entwurf, die Schrift steht
 * in Rosmarin. Damit sind die Welten klar unterscheidbar UND deutlich besser
 * lesbar als vorher. Gemessen am dunkelsten Ueberlagerungspunkt:
 *
 *   Praxis (gruen-rosa)     #ACBEBC  L=0,493  ->  7,17:1
 *   Wissen (blau-gruen)     #BBE0D9  L=0,688  ->  9,74:1
 *   Kurse (pfirsich)        #D7CCC2  L=0,618  ->  8,81:1
 *   Weiterbildung (salbei)  #C3D1C6  L=0,614  ->  8,75:1
 *
 * AUFTEILUNG: `.ff-bokeh` malt, die Style-Variante liefert nur die drei
 * Farben. So tragen Hero und Stopper dieselbe Mechanik, und eine neue
 * Farbwelt ist ein Vierzeiler statt eines Duplikats. */

.ff-bokeh {
	/* Grundton unter allen Bloems. Faellt ein Verlauf aus, bleibt Rosmarin
	 * auf Schlagrahm bei 13,6:1. */
	background-color: var(--wp--preset--color--base-2);

	/* Rueckfall, falls jemand .ff-bokeh ohne Farbwelt einsetzt. */
	--ff-bokeh-a: #2E8C80; --ff-bokeh-a-mix: 30%;
	--ff-bokeh-b: #C15C74; --ff-bokeh-b-mix: 26%;
	--ff-bokeh-c: #5CCFC0; --ff-bokeh-c-mix: 20%;
}

/* Die :has()-Klausel macht die Bokeh-Module bildfaehig. Ohne sie uebermalt
 * der Verlauf mit !important jedes eingesetzte Foto — der Redaktion erscheint
 * "Ersetzen" dann als kaputte Funktion. Liegt ein Cover-Bild vor, tritt die
 * Regel zurueck und der Cover verhaelt sich wie ein normaler Core-Cover. */
.ff-bokeh:not(:has(.wp-block-cover__image-background)) .wp-block-cover__background {
	background:
		radial-gradient(58% 74% at 18% 24%, color-mix(in srgb, var(--ff-bokeh-a) var(--ff-bokeh-a-mix), transparent) 0%, transparent 62%),
		radial-gradient(48% 62% at 84% 30%, color-mix(in srgb, var(--ff-bokeh-b) var(--ff-bokeh-b-mix), transparent) 0%, transparent 66%),
		radial-gradient(72% 72% at 60% 92%, color-mix(in srgb, var(--ff-bokeh-c) var(--ff-bokeh-c-mix), transparent) 0%, transparent 70%),
		var(--wp--preset--color--base-2) !important;
	opacity: 1 !important;
}

/* Vier Farbwelten — als Block-Styles im Editor umschaltbar
 * (inc/block-styles.php). WordPress schreibt daraus `is-style-<name>`. */
.is-style-welt-praxis {
	--ff-bokeh-a: #2E8C80; --ff-bokeh-a-mix: 30%;
	--ff-bokeh-b: #C15C74; --ff-bokeh-b-mix: 26%;
	--ff-bokeh-c: #5CCFC0; --ff-bokeh-c-mix: 20%;
}

.is-style-welt-wissen {
	--ff-bokeh-a: #5CCFC0; --ff-bokeh-a-mix: 38%;
	--ff-bokeh-b: #2E8C80; --ff-bokeh-b-mix: 24%;
	--ff-bokeh-c: #E7F1EE; --ff-bokeh-c-mix: 40%;
}

.is-style-welt-kurse {
	--ff-bokeh-a: #C15C74; --ff-bokeh-a-mix: 34%;
	--ff-bokeh-b: #F5D3B8; --ff-bokeh-b-mix: 45%;
	--ff-bokeh-c: #5CCFC0; --ff-bokeh-c-mix: 16%;
}

.is-style-welt-weiterbildung {
	--ff-bokeh-a: #56624C; --ff-bokeh-a-mix: 26%;
	--ff-bokeh-b: #2E8C80; --ff-bokeh-b-mix: 26%;
	--ff-bokeh-c: #EDE8DC; --ff-bokeh-c-mix: 40%;
}

/* KEINE MINDESTHOEHE FUER DEN UNTERSEITEN-HERO.
 *
 * Hier stand `min-height: 52dvh`. Die Entwuerfe geben den Unterseiten-Heroes
 * gar keine Mindesthoehe: Praxis, Wissen und Fachpersonen setzen
 * `padding:130px 56px 150px` um das Zitat, Vision und Kontakt
 * `110px ... 130px`. Die Hoehe kommt also aus Polster und Inhalt.
 *
 * `52dvh` band erst auf hohen Schirmen und wuchs dort ueber die Vorgabe
 * hinaus: bei 1343px Fensterhoehe wurden daraus 698px statt der rund 500px,
 * die Polster und Zitat ergeben. Auf einem 900px hohen Fenster waeren es
 * 468px gewesen und niemandem aufgefallen. Gemeldet von Lucas am 15.08.2026
 * („Zu hoch?"), gemessen am 19.08. bei 1920x1343.
 *
 * Der Stopper behaelt seine Mindesthoehe: ein Zitatband ohne sie faellt bei
 * kurzem Zitat auf Textzeilenhoehe zusammen. */
.ff-stopper { min-height: 26dvh; }

/* --- 8h2a. Kartenstopper (CTA, Newsletter) ---
 * Latifas viertes Grundmuster: eine cremefarbene Karte, die auf einem
 * Farbband liegt. Auf Seite 4 des Mockups steht sie auf Gruen-Rosa, auf
 * Seite 8 dieselbe Karte auf Petrol — ein Modul, zwei Farbwelten.
 *
 * Die Hoehe kommt hier aus dem Innenabstand, nicht aus min-height: Der
 * Inhalt der Karte schwankt zwischen drei Zeilen (CTA) und einem Formular
 * (Newsletter), eine feste dvh-Hoehe wuerde einen der beiden Faelle
 * quetschen oder leer laufen lassen. */
.ff-kartenband { min-height: 0; }

/* Fotoband — vollbreites Motiv, Karte darauf (Entwurf: „CTA Kennenlernen",
 * 110px hoch, 56px quer). Doppelter Selektor, weil Cores Blockstile NACH
 * dem Theme-CSS laden und `.wp-block-cover { padding: 1em }` sonst gewinnt. */
.wp-block-cover.ff-fotoband {
	padding-block: 6.875rem; /* 110px */
	padding-inline: var(--wp--preset--spacing--gutter);
}

/* Variante als ganze Inhaltssektion (Praxis, „Spezialisiert auf"):
 * 120px Polster statt 110px, und die Schrift steht hell auf dem Motiv. */
.wp-block-cover.ff-fotoband--sektion {
	padding-block: var(--wp--preset--spacing--section);
}

/* KEINE flaechige helle Schrift auf dem Innencontainer.
 *
 * Genau das stand hier zuerst — und die vier Karten auf dem Band erbten
 * sie: Schlagrahm auf Schlagrahm, Ueberschriften und Listen unsichtbar.
 * Derselbe Fehler wie beim CTA-Band eine Stunde vorher.
 *
 * Hell gehoert nur, was DIREKT auf dem Motiv steht. Die Sektionsueberschrift
 * traegt ihre Farbe als Blockattribut im Pattern (`textColor: base-2`);
 * alles in den Karten bleibt bei den normalen Textfarben. */
.ff-fotoband--sektion .ff-card :is(h1, h2, h3, h4) {
	color: var(--wp--preset--color--contrast);
}

/* Sterne ausgenommen: Sie tragen Minze und wurden von dieser Regel
 * sonst mit eingefaerbt (gleiche Spezifitaet, spaeter im Stylesheet). */
.ff-fotoband--sektion .ff-card,
.ff-fotoband--sektion .ff-card :is(p, li):not(.ff-stimme__sterne) {
	color: var(--wp--preset--color--body);
}

/* Die Karten auf dem dunklen Band tragen einen kraeftigeren Schatten als
 * auf heller Flaeche — sonst verschwinden sie im Motiv.
 * Entwurf: 0 14px 40px /0.22, Hover 0 24px 56px /0.3, Polster 36/30,
 * Radius 20, Abstand 14. */
.ff-fotoband--sektion .ff-card.ff-card {
	padding: 2.25rem 1.875rem;
	gap: 0.875rem;
	border-radius: var(--wp--custom--radius--card-small);
	box-shadow: 0 14px 40px rgba(36, 48, 30, 0.22);
}

.ff-fotoband--sektion .ff-card.ff-card:hover {
	transform: var(--wp--custom--lift--hover);
	box-shadow: 0 24px 56px rgba(36, 48, 30, 0.3);
}

/* --- Bildslider „Ueber mich" (Entwurf: Ueber-mich.dc.html) ---
 * Ueberblendung 0.9s, Punkte 11px unten mittig, aktiv in Minze.
 * Ohne JavaScript bleibt die erste Folie sichtbar stehen — die uebrigen
 * sind dann nicht erreichbar, aber es fehlt kein Inhalt, der nicht auch
 * im Text daneben stuende. */
.ff-bildslider {
	position: relative;
	height: 37.5rem; /* 600px, Entwurf */
	min-width: 0;
}

.ff-bildslider__buehne {
	position: absolute;
	inset: 0;
	border-radius: var(--wp--custom--radius--media);
	overflow: hidden;
}

.ff-bildslider__folie {
	position: absolute;
	inset: 0;
	margin: 0;
	opacity: 0;
	pointer-events: none;
	transition: opacity 0.9s ease;
}

.ff-bildslider__folie.ist-aktiv {
	opacity: 1;
	pointer-events: auto;
}

.ff-bildslider__folie img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
}

.ff-bildslider__punkte {
	position: absolute;
	bottom: 0.875rem;
	left: 50%;
	transform: translateX(-50%);
	display: flex;
	align-items: center;
	gap: 0;
	z-index: 5;
}

/* KLICKFLAECHE 24px (WCAG 2.5.8), sichtbar bleibt der 11px-Punkt aus dem
 * Entwurf — er sitzt als ::before in der Mitte. Vorher war der Button
 * selbst 11px gross, bei 21px Mittenabstand (18.09.2026, Pruefung). Der
 * Mittenabstand ist jetzt 24px, drei Pixel mehr als im Entwurf. */
.ff-bildslider__punkt,
.ff-bildslider__pause {
	position: relative;
	width: 24px;
	height: 24px;
	padding: 0;
	border: 0;
	border-radius: 50%;
	background: transparent;
	cursor: pointer;
}

.ff-bildslider__punkt::before {
	content: "";
	position: absolute;
	inset: 6.5px;
	border-radius: 50%;
	background: color-mix(in srgb, var(--wp--preset--color--base-2) 65%, transparent);
	transition: background 0.3s, transform 0.3s;
}

.ff-bildslider__punkt.ist-aktiv::before {
	background: var(--wp--preset--color--cta);
	transform: scale(1.25);
}

.ff-bildslider__punkt:focus-visible,
.ff-bildslider__pause:focus-visible {
	outline: 2px solid var(--wp--preset--color--base-2);
	outline-offset: 0;
}

/* ANHALTEN (WCAG 2.2.2): theme.js setzt den Knopf unten rechts ins Bild,
 * wenn der Slider von selbst wechselt — nicht in die Punktreihe, die ist
 * eine tablist. Zwei Balken = anhalten, Dreieck = weiterlaufen lassen. */
.ff-bildslider__pause {
	position: absolute;
	right: 0.75rem;
	bottom: 0.875rem;
	z-index: 5;
	/* Dunkler Kreis, helles Zeichen: sichtbar auf weisser Studiowand wie
	 * auf dunklem Saal (Vortragsfotos seit 18.09.2026). */
	background: color-mix(in srgb, var(--wp--preset--color--contrast) 55%, transparent);
}

.ff-bildslider__pause::before,
.ff-bildslider__pause::after {
	content: "";
	position: absolute;
	top: 7px;
	width: 3px;
	height: 10px;
	border-radius: 1px;
	background: color-mix(in srgb, var(--wp--preset--color--base-2) 85%, transparent);
}

.ff-bildslider__pause::before {
	left: 8px;
}

.ff-bildslider__pause::after {
	left: 13px;
}

.ff-bildslider__pause[aria-pressed="true"]::before {
	left: 9px;
	width: 0;
	height: 0;
	border-radius: 0;
	background: none;
	border-top: 5px solid transparent;
	border-bottom: 5px solid transparent;
	border-left: 8px solid color-mix(in srgb, var(--wp--preset--color--base-2) 85%, transparent);
}

.ff-bildslider__pause[aria-pressed="true"]::after {
	display: none;
}

@media (max-width: 63.99em) {
	.ff-bildslider {
		height: 24rem;
	}
}

/* Stimmenband: Die Karten liegen auf dem Motiv und brauchen mehr Radius
 * und Schatten als auf heller Flaeche (Entwurf: Radius 28, Polster
 * 38/36/34, Schatten 0 12px 34px /0.14). */
.ff-stimmenband .ff-card.ff-card {
	padding: 2.375rem 2.25rem 2.125rem;
	border-radius: 1.75rem;
	box-shadow: 0 12px 34px rgba(36, 48, 30, 0.14);
	text-align: center;
	align-items: center;
}

/* :not() ausdruecklich — sonst faerbt diese Regel auch die Sterne um.
 * Sie ist mit 0,3,1 spezifischer als `.ff-stimme__sterne` und hatte sie
 * von Minze auf Salbei gezogen. */
.ff-stimmenband .ff-card :is(p, blockquote, cite):not(.ff-stimme__sterne) {
	color: var(--wp--preset--color--body);
}

.ff-stimmenband .ff-stimme__zitat {
	font-size: 0.9375rem; /* 15px */
	line-height: 1.7;
}

.ff-stimmenband cite {
	margin-top: auto;
	font-size: 0.875rem; /* 14px */
	font-weight: 500;
	font-style: normal;
	color: var(--wp--preset--color--contrast);
}

/* Sterne ueber dem Zitat — Minze, 18px, 6px Sperrung (Entwurf). */
.ff-stimme__sterne {
	margin: 0;
	color: var(--wp--preset--color--cta);
	font-size: 1.125rem;
	letter-spacing: 6px;
	/* Sperrung schiebt optisch nach links — rechts ausgleichen. */
	text-indent: 6px;
	line-height: 1;
}

/* Absendeknopf im Kontaktformular — Entwurf: 16px, Polster 15/42.
 * Er ist ein <button> in core/html, erbt also nicht die Knopfgroessen
 * aus theme.json. */
.ff-form--kontakt button[type="submit"] {
	font-size: 1rem;
	padding: 0.9375rem 2.625rem;
	/* `appearance: none` — der Knopf ist ein echtes <button> in core/html
	 * und traegt sonst zusaetzlich die Browser-Eigengestaltung. Sichtbar
	 * wird das je nach Browser als andere Kante, Innenabstand oder
	 * Schriftglaettung. */
	appearance: none;
	-webkit-appearance: none;
	cursor: pointer;
}

/* SCHMALE SCHIRME: ganze Breite.
 *
 * Mit 42px Seitenpolster misst der Knopf 216px — bei 235px Platz in der
 * Karte bleiben 19px uebrig. Das sieht weder nach kompaktem Knopf aus noch
 * nach einer Schaltflaeche ueber die Zeile, sondern nach einer gestreckten
 * Leiste mit Rest. Ueber die volle Breite ist er eindeutig ein Absendeknopf
 * — und auf dem Telefon ausserdem leichter zu treffen. */
@media (max-width: 47.99em) {
	.ff-form--kontakt button[type="submit"] {
		width: 100%;
		padding-inline: 1.5rem;
	}
}

/* --- FAQ-Themengruppen ---
 * Entwurf: 64px zwischen den Gruppen, 24px unter dem Gruppentitel.
 * Auf schmalen Schirmen enger, sonst steht zwischen zwei Gruppen mehr
 * Leere als Inhalt. */
.ff-faq-gruppe + .ff-faq-gruppe {
	margin-top: 4rem;
}

.ff-faq-gruppe__titel {
	margin-bottom: 1.5rem !important;
}

@media (max-width: 47.99em) {
	.ff-faq-gruppe + .ff-faq-gruppe {
		margin-top: 2.75rem;
	}

	.ff-faq-gruppe__titel {
		margin-bottom: 0.75rem !important;
	}

	.ff-faq__item {
		padding-block: 1.125rem;
	}
}

/* Faktor-Piktogramm je Karte, 38px und linksbuendig — Entwurf. */
.ff-fotoband--sektion .ff-card .ff-ci-icon {
	width: 2.375rem;
	margin: 0;
	color: var(--wp--preset--color--accent-dark);
}

/* Masse aus dem Entwurf: `max-width:780px; background:#F5F2E9;
 * border-radius:22px; padding:56px 64px; box-shadow:0 18px 50px
 * rgba(36,48,30,0.18)`. Vorher: Schlagrahm statt Sand, Radius 28 statt 22,
 * ein deutlich flacherer Schatten. */
/* POLSTER MITWACHSEN LASSEN (21.08.2026).
 *
 * 56/64 stehen so im Entwurf — der ist aber `min-width:1100px` und sagt
 * ueber das Handy nichts. Fest uebernommen ergaben sie auf einer 320px
 * breiten Karte nur 192px Innenbreite: 40 Prozent der Karte waren Polster,
 * die Ueberschrift brach auf fuenf Zeilen, der Knopf auf drei und wurde zum
 * Klotz statt zur Pille. Betraf Ueber mich, Vision und Mission und Kontakt.
 *
 * Gemessen bei 375px: vorher 192px nutzbar, jetzt 272px. */
.ff-kartenstopper {
	padding: clamp(2rem, 6vw, 3.5rem) clamp(1.5rem, 7vw, 4rem);
	background: var(--wp--preset--color--surface-sand);
	border-radius: var(--wp--custom--radius--panel);
	box-shadow: var(--wp--preset--shadow--panel);
}

/* Der Knopf traegt global 16/44. In der schmalen Karte bleiben davon 104px
 * fuer „Kostenloses Kennenlernen buchen" — das bricht dreizeilig um. Nur
 * hier und nur auf schmalen Schirmen enger. */
@media (max-width: 30em) {
	.ff-kartenstopper .wp-block-button__link {
		padding-inline: 1.5rem;
	}
}

/* ECHTE KAPITAELCHEN seit 15.08.2026.
 *
 * Hier stand, Playfair Display bringe keine Kapitaelchen mit, deshalb
 * Versalien mit Sperrung. Richtig — nur setzt der Entwurf gar nicht
 * Playfair Display, sondern `Playfair Display SC`, eine eigene Familie mit
 * gezeichneten Kapitaelchen. Die liegt jetzt selbst gehostet im Theme, also
 * kein Kunstsatz und keine Ersatzloesung mehr.
 *
 * Die Schriftfamilie setzt das Pattern; hier nur Groesse und Zeilenfall. */
.ff-kartenstopper__titel {
	/* 31px ab rund 1100px, darunter mitwachsend. Fest gesetzt brach die
	 * Ueberschrift auf dem Handy auf fuenf Zeilen. */
	font-size: clamp(1.375rem, 1rem + 1.6vw, 1.9375rem);
	font-weight: 400;
	text-transform: none;
	letter-spacing: normal;
	line-height: 1.35;
	text-wrap: balance;
	margin: 0;
}

/* Die farbige Wortgruppe (Rote Bete) traegt 4,08:1 auf Schlagrahm: genug
 * fuer grossen Text (AA ab 3:1), NICHT fuer Fliesstext (4,5:1). Sie gehoert
 * deshalb ausschliesslich in diese Headline. */
.ff-kartenstopper__titel mark {
	background: none;
}

/* --- 8h2b. FAQ-Kurzblock ---
 * Schliesst jede Seite ab (floraflow/stopper-faq). Die Fragen sind
 * Sprungmarken in die vollstaendige FAQ — deshalb Links und keine
 * Aufzaehlungspunkte: Ein Listenpunkt vor einem Link sieht aus wie
 * Fliesstext, der Fragezeichen-Chevron sagt „hier geht es weiter". */

.ff-faq-kurz__liste {
	list-style: none;
	padding-left: 0;
	margin-block: var(--wp--preset--spacing--sm) 0;
	display: grid;
	gap: 0;
}

.ff-faq-kurz__liste li {
	border-top: 1px solid color-mix(in srgb, var(--wp--preset--color--muted) 35%, transparent);
}

.ff-faq-kurz__liste li:last-child {
	border-bottom: 1px solid color-mix(in srgb, var(--wp--preset--color--muted) 35%, transparent);
}

.ff-faq-kurz__liste a {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: var(--wp--preset--spacing--sm);
	padding-block: 0.9rem;
	color: var(--wp--preset--color--contrast);
	text-decoration: none;
	transition: color var(--wp--custom--transition--base);
}

/* Chevron wie im Akkordeon, damit der Kurzblock und die volle FAQ
 * erkennbar zusammengehoeren. */
.ff-faq-kurz__liste a::after {
	content: "";
	flex: 0 0 auto;
	width: 0.5rem;
	height: 0.5rem;
	border-right: 2px solid var(--wp--preset--color--accent-dark);
	border-bottom: 2px solid var(--wp--preset--color--accent-dark);
	transform: rotate(-45deg);
	transition: transform var(--wp--custom--transition--base);
}

.ff-faq-kurz__liste a:hover {
	color: var(--wp--preset--color--accent-dark);
}

.ff-faq-kurz__liste a:hover::after {
	transform: rotate(-45deg) translate(2px, 2px);
}

.ff-faq-kurz__mehr {
	margin-top: var(--wp--preset--spacing--md);
	color: var(--wp--preset--color--body);
}

/* Die Haken-Nutzenliste im Newsletter-Stopper ist `.ff-list--check` aus
 * Abschnitt 8d1 — hier stand zuerst eine zweite, gleichwertige Klasse
 * `.ff-checkliste`. Eingespart; der gezeichnete Haken ist dafuer in die
 * bestehende Klasse gewandert und verbessert damit auch richtig-hier. */

/* Im Newsletter-Stopper steht das Formular in der zweiten Spalte. Beim
 * Umbruch auf eine Spalte braucht es Abstand zum Nutzenversprechen — Core
 * setzt beim Stapeln nur den row-gap der Columns, und der ist hier klein. */
@media (max-width: 48.99em) {
	.ff-newsletter__cols .ff-form {
		margin-top: var(--wp--preset--spacing--md);
	}
}

/* Auf dem Bokeh gilt durchgaengig Schlagrahm — inklusive der Preset-Klassen,
 * die WordPress mit !important ausgibt. */
.ff-bokeh .wp-block-cover__inner-container,
.ff-bokeh .wp-block-cover__inner-container :is(h1, h2, p) {
	color: var(--wp--preset--color--contrast);
}

/* HERO-ZITAT DER UNTERSEITEN — eine Groesse fuer alle.
 *
 * Vorher hing sie an den Preset-Klassen der einzelnen Patterns und lief
 * damit auseinander: Praxis und Events auf 2xl (54 px), Fachpersonen auf
 * 3xl (86 px). Drei Unterseiten, drei Groessen — genau der Fehler, den man
 * beim Durchklicken sieht.
 *
 * Der Entwurf setzt auf ALLEN Unterseiten 40 px, Zeilenabstand 1,45,
 * Satzbreite 900 px (Praxis-Bauchgefuehl.dc.html und Events.dc.html,
 * identisch). Die Groesse steht deshalb hier und nicht mehr im Pattern —
 * sie ist eine Designkonstante, keine Entscheidung fuer den Editor.
 *
 * Die Klammer schrumpft auf schmalen Ansichten bis 28 px; der feste
 * 40-px-Wert des Entwurfs gilt fuer den Desktop, den er allein beschreibt
 * (min-width:1100px).
 *
 * !important, weil WordPress die Preset-Klasse `has-2-xl-font-size` mit
 * !important ausgibt. */
/* Unterseiten-Hero: 40px auf Praxis, Events, Wissen und Kontakt — auf
 * „Ueber mich" aber 38px, weil das Zitat dort laenger ist und der Entwurf
 * es eine Stufe kleiner setzt. Deshalb ueber eine Variable statt fest:
 * Die Seite kann `--ff-zitat-groesse` am Hero setzen.
 *
 * Aufrecht, nicht kursiv — der Entwurf setzt alle Hero-Zitate aufrecht. */
/* GROESSENSTUFEN ALS KLASSE (25.09.2026). Vorher stand die Variable als
 * style-Attribut am Absatz. Der Absatzblock kennt so ein Attribut nicht:
 * Der Editor packte das Zitat beim Laden in einen zweiten <p>, und nach dem
 * Speichern stand das doppelt im Frontend. Die Werte sind dieselben. */
.ff-bokeh__zitat--mittel {
	--ff-zitat-groesse: clamp(1.625rem, 1.05rem + 1.79vw, 2.375rem); /* 38px, /ueber-mich/ */
}

.ff-bokeh__zitat--klein {
	--ff-zitat-groesse: clamp(1.5rem, 1rem + 1.55vw, 2.0625rem); /* 33px, /vision-mission/ */
}

.ff-bokeh__zitat {
	font-family: var(--wp--preset--font-family--display);
	font-style: normal;
	font-weight: 400;
	font-size: var(--ff-zitat-groesse, clamp(1.75rem, 1.1rem + 1.9vw, 2.5rem)) !important;
	line-height: 1.45;
	text-wrap: balance;
	margin: 0;
}

/* Erste Wortgruppe fett — so hebt der Entwurf in jedem Hero-Zitat den
 * Kernbegriff heraus («Ernaehrungsberatung,» / «Ernaehrungsumstellung»). */
.ff-bokeh__zitat strong {
	font-weight: 700;
}

/* SATZBREITE 900 px, auf allen Unterseiten gleich.
 *
 * Abschnitt 8b kappt JEDE Ueberschrift im Constrained-Layout auf 46rem. Das
 * ist fuer Sektionstitel richtig, traf hier aber auch das Hero-Zitat — und
 * zwar nur dort, wo es als <h1> steht. Praxis und Fachpersonen liefen
 * deshalb auf 736 px, Events als Absatz auf 896 px. Gleicher Baustein, zwei
 * Breiten, je nach Tag. */
.is-layout-constrained > .ff-bokeh__zitat {
	max-width: min(56rem, 100%);
}

/* Doppelte Klasse: Die Regel fuer :is(h1,h2,p) im Innencontainer hat
 * dieselbe Spezifitaet plus Element und wuerde sonst gewinnen. */
.ff-bokeh .ff-eyebrow.ff-eyebrow {
	color: var(--wp--preset--color--accent-dark);
}

.ff-bokeh .ff-eyebrow--rules::before,
.ff-bokeh .ff-eyebrow--rules::after {
	background: color-mix(in srgb, var(--wp--preset--color--contrast) 30%, transparent);
}

/* --- 8h3. CI-Icons (Body / Mind / Soul) ---
 * Originaldateien aus dem CI-Ordner, auf currentColor umgestellt. Groesse und
 * Farbe kommen von hier, damit dieselbe Datei in der Karte, im Fliesstext und
 * auf dunklem Grund funktioniert. */

.ff-ci-icon {
	display: block;
	width: 3.5rem;
	margin-bottom: var(--wp--preset--spacing--xs);
	color: var(--wp--preset--color--accent-dark);
}

/* --- Zitatband ---
 * Der helle Schleier steckt als dimRatio im Block; hier steht nur, was
 * daraus folgt: kursives Playfair in Rosmarin, ruhig gesetzt. */
/* Aufrecht, nicht kursiv, und Zeilenhoehe 1.5 — so steht es im Entwurf
 * (Home.dc.html, Sektion „Zitat"). Kursiv war meine Zutat. */
.ff-quoteband__text {
	font-style: normal;
	font-weight: 400;
	line-height: 1.5;
	text-wrap: balance;
	margin: 0;
}

/* Medienzeile: vier Eintraege sollen in EINE Zeile passen. Vorher rutschte
 * der vierte allein in die naechste und stand verloren mittig. */
/* Raster statt Flexumbruch: Vier Eintraege brachen sonst 3+1 um, und der
 * letzte stand allein mittig — das liest sich wie ein Fehler. Als Raster
 * bricht es sauber auf 2x2 und dann auf eine Spalte. */
.ff-trust-row__logos {
	display: grid !important;
	grid-template-columns: repeat(4, auto);
	justify-content: center;
	align-items: baseline;
	gap: clamp(0.9rem, 3vw, 2.75rem) !important;
}

@media (max-width: 900px) {
	.ff-trust-row__logos {
		grid-template-columns: repeat(2, auto);
		row-gap: 1rem !important;
	}
}

@media (max-width: 480px) {
	.ff-trust-row__logos {
		grid-template-columns: 1fr;
	}
}

.ff-trust-row__medium {
	margin: 0;
	font-size: clamp(0.95rem, 1.5vw, 1.25rem);
	white-space: nowrap;
}

.ff-trust-row__medium a {
	color: var(--wp--preset--color--body);
	text-decoration: underline;
	text-underline-offset: 0.3em;
	text-decoration-color: color-mix(in srgb, currentColor 35%, transparent);
}

.ff-trust-row__medium a:hover,
.ff-trust-row__medium a:focus-visible {
	color: var(--wp--preset--color--accent-dark);
	text-decoration-color: currentColor;
}

.ff-trust-row__qual {
	color: var(--wp--preset--color--muted-dark);
	margin-top: var(--wp--preset--spacing--sm);
}

/* Kursive Ueberschrift als Akzent.
 *
 * Im Entwurf ist die Kursive KEIN Blankett: Hero-H1 und Zitate sind kursiv,
 * die funktionalen Sektionstitel stehen aufrecht. Diese Klasse markiert
 * bewusst die emotionalen Ueberschriften — Versprechen statt Gliederung.
 * Sparsam einsetzen, sonst verliert der Akzent seine Wirkung. */
.ff-display-heading--kursiv {
	font-style: italic;
}

/* Bild mit weicher Kante und Schatten, wie im Entwurf. */
.ff-willkommen__image img {
	box-shadow: 0 2px 4px rgba(36, 48, 30, 0.05), 0 18px 44px rgba(36, 48, 30, 0.10);
}

/* --- Die sieben Faktoren ---
 * Kleine Karten mit Piktogramm ueber dem Wort. Die Icons stammen aus dem
 * Textbriefing und sind nachgezeichnet, damit sie die Textfarbe erben. */

/* Breite so begrenzt, dass genau vier Karten in eine Reihe passen. Ohne das
 * bricht die Reihe 6+1 um und der siebte Faktor steht allein — das liest sich
 * wie ein Fehler statt wie Absicht. Jetzt 4+3, beide Reihen mittig. */
.ff-faktoren {
	/* Gemessen: vier gleich breite Karten (je 9,5rem) plus drei Abstaende
	 * brauchen rund 41rem. Ohne Begrenzung bricht die Reihe 5+2 um und der
	 * Rest steht verloren daneben. */
	max-width: 41rem;
	margin-inline: auto;
}

/* --- Kreis der sieben Faktoren (Entwurf: Home.dc.html, „Unser Ansatz") ---
 *
 * Fläche 480 x 460 auf Schlagrahm, Bildmarke 80px in der Mitte, die sieben
 * Faktoren auf festen Prozentpositionen darum herum. Vorher stand hier eine
 * Reihe aus sieben Kärtchen (656 x 235) — inhaltlich etwas anderes: eine
 * Aufzählung statt eines Zusammenspiels.
 *
 * `aspect-ratio` statt fester Höhe, damit der Kreis auf schmalen Spalten
 * mitskaliert und die Prozentpositionen weiterhin stimmen. */
.ff-kreis {
	position: relative;
	width: min(30rem, 100%); /* 480px */
	aspect-ratio: 480 / 460;
	margin-top: var(--wp--preset--spacing--xl);
	background: var(--wp--preset--color--base-2);
	border-radius: var(--wp--custom--radius--card);
	box-shadow: 0 10px 30px rgba(36, 48, 30, 0.08);
}

/* Spirale in der Mitte — Matcha wie in Latifas Mockup, nicht Rosmarin.
 * Etwas groesser als die 80px der Bildmarke, weil eine offene Linie
 * optisch leichter wiegt als eine Flaeche. */
.ff-kreis__marke {
	position: absolute;
	left: 50%;
	/* MITTIG IM RING, NICHT IN DER KARTE (11.09.2026, „Spirale ist nur nicht
	 * mittig"). Zwei Versaetze, beide gemessen:
	 *
	 * 1. Die Spirale sass in ihrer 200er-Zeichenflaeche nicht mittig — die
	 *    aeussere Windung laeuft nach rechts unten aus, der sichtbare
	 *    Kasten lag 5 bzw. 2 Einheiten neben der Mitte. Die viewBox ist
	 *    jetzt auf den Strich zugeschnitten (inklusive halber Strichbreite).
	 * 2. Der Ring war keiner (siehe .ff-kreis__faktor). Seit 14.09.2026
	 *    stehen die Icons auf einem Siebeneck; die Spirale sitzt genau in
	 *    dessen Mitte, bei 49,33 Prozent der Kartenhoehe. */
	top: 49.33%;
	transform: translate(-50%, -50%);
	/* Gleiche Strichgroesse wie vorher (160px auf 200 Einheiten = 0,8),
	 * nur auf die zugeschnittene viewBox von 164 Einheiten umgerechnet. */
	width: 8.2rem;
	line-height: 0;
	color: var(--wp--preset--color--accent);
}

.ff-kreis__marke svg {
	display: block;
	width: 100%;
	height: auto;
}

/* KEIN BLOCKABSTAND AUF DEN FAKTOREN (14.09.2026). Die Gruppe hat
 * Flow-Layout, WordPress gibt darin jedem Kind nach dem ersten
 * margin-block-start: 1,35 rem. Bei absolut positionierten Elementen
 * verschiebt dieser Rand das Element — alle sieben Faktoren sassen seit
 * dem 15.08. 21,6 px tiefer als ihre Prozentwerte sagen. Das war der
 * groesste Teil von „die Spirale ist nicht mittig". Doppelte Klasse, weil
 * Cores Layoutregel (:root :where(.is-layout-flow) > *) nach dem Theme
 * geladen wird. */
.ff-kreis .ff-kreis__faktor {
	margin: 0;
}

.ff-kreis__faktor {
	position: absolute;
	/* Anker = Icon-Mitte (Icon 30 px, also 15 px unter der Oberkante). */
	transform: translate(-50%, -0.9375rem);
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 0.375rem;
	transition: transform 0.3s ease;
}

/* EIN ECHTES SIEBENECK (14.09.2026, Lucas: „ist das Element mittig? Es
 * liegt vielleicht auch an der Anordnung der Icons, die auch nicht ganz
 * einheitlich sind"). Richtig vermutet. Die Prozentwerte aus dem Entwurf
 * lagen auf keinem Kreis: von der Spiralmitte gemessen 164 bis 177 px
 * Abstand, Winkel 46/96/152 Grad statt 51,4/102,9/154,3. Nervensystem und
 * Stress sassen 11 px zu nah und 7 Grad zu hoch — dadurch wirkte die
 * Spirale verschoben, obwohl sie es kaum war.
 *
 * Jetzt: Radius 170 px auf der 480 x 460-Karte, alle 51,43 Grad ein Icon,
 * im Uhrzeigersinn ab oben. Die Werte gelten fuer die ICON-MITTE — dafuer
 * verankert der Transform unten die Gruppe an ihrem Icon (15 px = halbe
 * Icongroesse) statt an der Mitte aus Icon plus Beschriftung. Der Ring
 * steht samt Beschriftungen senkrecht mittig in der Karte; die Spirale
 * sitzt genau in seiner Mitte (siehe .ff-kreis__marke).
 *
 * Nachrechnen: x = 240 + 170 * sin(k * 51,43), y = 226.9 - 170 * cos(k * 51,43),
 * dann in Prozent von 480 bzw. 460. */
.ff-kreis__faktor:nth-child(2) { left: 50.0%; top: 12.37%; } /* Ernährung */
.ff-kreis__faktor:nth-child(3) { left: 77.69%; top: 26.29%; } /* Darmmikrobiom */
.ff-kreis__faktor:nth-child(4) { left: 84.53%; top: 57.55%; } /* Nervensystem */
.ff-kreis__faktor:nth-child(5) { left: 65.37%; top: 82.63%; } /* Bewegung */
.ff-kreis__faktor:nth-child(6) { left: 34.63%; top: 82.63%; } /* Schlaf */
.ff-kreis__faktor:nth-child(7) { left: 15.47%; top: 57.55%; } /* Stress */
.ff-kreis__faktor:nth-child(8) { left: 22.31%; top: 26.29%; } /* Emotionen */

@media (prefers-reduced-motion: no-preference) {
	.ff-kreis__faktor:hover {
		transform: translate(-50%, -0.9375rem) scale(1.15);
	}
}

.ff-kreis__faktor .ff-ci-icon {
	width: 1.875rem; /* 30px, Entwurf */
	margin: 0;
	color: var(--wp--preset--color--accent-dark);
}

.ff-kreis__label {
	margin: 0;
	font-size: 0.84375rem; /* 13.5px, Entwurf */
	font-weight: 500;
	line-height: 1.2;
	white-space: nowrap;
}

/* Unter 600px Spaltenbreite kollidieren die Beschriftungen im Kreis.
 * Dort fällt die Anordnung auf eine zentrierte Reihe zurück — dieselben
 * Inhalte, nur ohne die Kreisform. */
@media (max-width: 600px) {
	.ff-kreis {
		aspect-ratio: auto;
		display: flex;
		flex-wrap: wrap;
		justify-content: center;
		gap: var(--wp--preset--spacing--md);
		padding: var(--wp--preset--spacing--lg);
	}

	.ff-kreis__marke { display: none; }

	.ff-kreis__faktor,
	.ff-kreis__faktor:hover {
		position: static;
		transform: none;
		width: 5.5rem;
	}
}

/* Zweispaltige Ansatz-Sektion — Raster 1.05fr / 0.95fr, Abstand 80px. */
@media (min-width: 782px) {
	.ff-ansatz-raster {
		display: grid;
		grid-template-columns: minmax(0, 1.05fr) minmax(0, 0.95fr);
		gap: 5rem;
		align-items: center;
	}

	.ff-ansatz-raster > * { margin-block: 0; }

	.ff-ansatz-raster__bild img {
		width: 100%;
		height: 35rem; /* 560px, Entwurf */
		object-fit: cover;
		border-radius: var(--wp--custom--radius--media);
	}
}

.ff-ansatz__lead {
	max-width: 32.5rem; /* 520px, Entwurf */
	line-height: 1.65;
}

/* --- Die drei Saeulen ---
 * Im Entwurf tragen alle drei Karten DIESELBE Farbe und dasselbe Gewicht.
 * Drei verschiedene Kartenfarben zerlegen die drei Saeulen optisch in drei
 * ungleiche Dinge — gemeint ist aber ein Zusammenspiel. */

.ff-saeule {
	text-align: center;
	box-shadow: 0 1px 2px rgba(36, 48, 30, 0.04), 0 10px 28px rgba(36, 48, 30, 0.07);
}

.ff-saeule .ff-ci-icon {
	/* 46px — Entwurf (Home.dc.html, „Body Mind Soul"). Vorher 5rem = 80px,
	 * fast doppelt so gross; die Karte wurde dadurch vom Icon dominiert. */
	width: 2.875rem;
	margin: 0 auto var(--wp--preset--spacing--sm);
	color: var(--wp--preset--color--contrast);
}

.ff-saeule__titel {
	margin: 0;
	font-family: var(--wp--preset--font-family--display);
	font-weight: 400;
	letter-spacing: 0.01em;
}

.ff-saeule p {
	color: var(--wp--preset--color--body-soft);
	max-width: 20rem;
	margin-inline: auto;
}

.ff-ci-icon svg {
	display: block;
	width: 100%;
	height: auto;
}

/* --- 8i. Ablauf-Schritte --- */

.ff-steps {
	list-style: none;
	padding-left: 0;
	counter-reset: ff-step;
	display: grid;
	gap: var(--wp--preset--spacing--lg);
}

.ff-steps > li {
	position: relative;
	padding-left: 3.75rem;
	counter-increment: ff-step;
}

.ff-steps > li::before {
	content: counter(ff-step);
	position: absolute;
	left: 0;
	top: -0.15em;
	width: 2.5rem;
	height: 2.5rem;
	display: grid;
	place-items: center;
	font-family: var(--wp--preset--font-family--display);
	font-size: 1.125rem;
	color: var(--wp--preset--color--accent-dark);
	border: 1px solid var(--wp--preset--color--muted);
	border-radius: 999px;
	background: var(--wp--preset--color--base-2);
}

/* Verbindungslinie zwischen den Schritten. */
.ff-steps > li:not(:last-child)::after {
	content: "";
	position: absolute;
	left: 1.25rem;
	top: 2.6rem;
	bottom: calc(-1 * var(--wp--preset--spacing--lg));
	width: 1px;
	background: var(--wp--preset--color--muted);
}

/* Programm-Variante von .ff-steps: eine Datumszeile ueber dem Titel. Mehr
 * unterscheidet die Kursabende nicht vom Beratungsablauf — deshalb dieselbe
 * Liste und kein zweiter Baustein. */
.ff-programm__datum {
	display: block;
	font-size: var(--wp--preset--font-size--xs);
	letter-spacing: 0.08em;
	text-transform: uppercase;
	color: var(--wp--preset--color--accent-dark);
	margin-bottom: 0.15rem;
}

/* --- 8h5. Kurskarten --- */

/* Der Durchfuehrungsstand steht oben auf der Karte, weil „laeuft das noch?"
 * beim Ueberfliegen die erste Frage ist. Offene Durchfuehrungen bekommen
 * einen Punkt in Matcha; die uebrigen bleiben still, damit „in Planung"
 * nicht wie ein Angebot aussieht. */
.ff-kurs__stand {
	display: flex;
	align-items: center;
	gap: 0.5rem;
	letter-spacing: 0.06em;
	text-transform: uppercase;
	color: var(--wp--preset--color--muted-dark);
	margin: 0;
}

.ff-kurs__stand--offen {
	color: var(--wp--preset--color--accent-dark);
}

.ff-kurs__stand--offen::before {
	content: "";
	flex: 0 0 auto;
	width: 0.45rem;
	height: 0.45rem;
	border-radius: 999px;
	background: var(--wp--preset--color--accent-dark);
}

.ff-kurs__unterzeile {
	margin-top: -0.35rem;
	font-style: italic;
}

/* Kein `margin-top: auto` hier: Den freien Raum beansprucht bereits
 * .ff-card__more, damit die „ansehen"-Links aller Karten auf einer Linie
 * stehen. Zwei Elemente koennen ihn sich nicht teilen — und der
 * gemeinsame Abschluss ist wichtiger als eine gemeinsame Preislinie. */
.ff-kurs__preis {
	padding-top: var(--wp--preset--spacing--xs);
}

/* ==========================================================================
 * 9. FAQ / Akkordeon
 * ========================================================================== */

/* --- FAQ nach dem Entwurf (Praxis-Bauchgefuehl.dc.html) ---
 *
 * Vorher waren die Fragen umrandete Karten mit Chevron. Der Entwurf setzt
 * eine schlichte Liste: keine Rahmen, keine Flaeche, nur eine Haarlinie
 * unter jedem Eintrag und ein „+" bzw. „−" am rechten Rand.
 *
 * Das Zeichen setzt assets/js/theme.js als eigenes Element, weil es beim
 * Auf- und Zuklappen wechselt. Ohne JavaScript bleibt `details` normal
 * bedienbar, nur ohne Zeichen und ohne gegenseitiges Schliessen. */
.ff-faq {
	display: flex;
	flex-direction: column;
	/* 840px aus Praxis-Bauchgefuehl.dc.html. Ohne diese Zeile erbt die Liste
	 * die Inhaltsbreite des Themes (39rem = 624px) und die Fragen brechen
	 * frueher um, als der Entwurf es vorsieht. */
	max-width: min(52.5rem, 100%);
	margin-inline: auto;
}

/* WordPress gibt jedem Kind einer Constrained-Gruppe `margin-inline: auto`.
 * Im Fluss ist das die Zentrierung; frueher im GRID schrumpfte das Element
 * dadurch auf seine Inhaltsbreite — die Fragen standen 364 px breit in
 * einer 624-px-Spalte. */
/* KORRIGIERT 15.08.2026: Die Eintraege schrumpften auf ihre Textbreite und
 * standen mittig — die Trennlinien liefen nicht durch, die Liste sah aus
 * wie zentrierter Flattersatz.
 *
 * Ursache: WordPress gibt jedem Kind einer Constrained-Gruppe
 * `margin-left:auto !important; margin-right:auto !important`. In einer
 * Flex-Spalte heisst das nicht „zentriert", sondern „auf Inhaltsbreite
 * schrumpfen UND zentrieren". Die frühere Regel ohne `!important` kam
 * gegen Cores `!important` nicht an. */
.ff-faq > * {
	margin-inline: 0 !important;
	width: 100%;
	max-width: none;
}

.ff-faq__item {
	border: 0;
	border-bottom: 1px solid color-mix(in srgb, var(--wp--preset--color--muted) 40%, transparent);
	border-radius: 0;
	background: none;
	padding: 1.375rem 0.25rem; /* 22px 4px */
}

.ff-faq__item summary {
	display: flex;
	justify-content: space-between;
	align-items: center;
	gap: 1.25rem;
	cursor: pointer;
	font-size: 1.0625rem; /* 17px */
	font-weight: 400;
	color: var(--wp--preset--color--contrast);
	list-style: none;
	line-height: var(--wp--custom--line-height--tight);
}

.ff-faq__item summary::-webkit-details-marker {
	display: none;
}

/* Das Zeichen kommt aus dem Skript. Ohne Skript steht rechts nichts —
 * besser als ein Pluszeichen, das sich beim Klick nicht aendert. */
.ff-faq__zeichen {
	flex: 0 0 auto;
	color: var(--wp--preset--color--accent);
	font-size: 1.375rem; /* 22px */
	font-weight: 400;
	line-height: 1;
}

.ff-faq__item > :not(summary) {
	margin-top: 0.875rem; /* 14px */
}

.ff-faq__item p {
	color: var(--wp--preset--color--body);
	font-size: 1rem; /* 16px */
	line-height: 1.7;
}

/* ==========================================================================
 * 10. Slider-Basis (Carousel-Blocks folgen in Phase b)
 * ========================================================================== */

.ff-slider {
	position: relative;
	overflow: hidden;
}

.ff-slider__track {
	display: flex;
	gap: var(--wp--preset--spacing--lg);
	scroll-snap-type: x mandatory;
	overflow-x: auto;
	-webkit-overflow-scrolling: touch;
	scrollbar-width: none;
}

.ff-slider__track::-webkit-scrollbar {
	display: none;
}

.ff-slider__slide {
	flex: 0 0 auto;
	scroll-snap-align: start;
}

/* ==========================================================================
 * 11. Bewegung
 *
 * Das Einblenden beim Scrollen liegt seit 15.08.2026 in assets/js/theme.js
 * und folgt reveal.js aus dem Entwurf: Deckkraft plus 26px Anheben, 700ms,
 * 90ms Versatz je Element.
 *
 * Vorher stand hier eine reine CSS-Loesung mit `animation-timeline: view()`,
 * die aus Vorsicht nur `transform` bewegt hat, nie `opacity` — die Sorge
 * war, Inhalt koenne unsichtbar haengen bleiben, wenn die Scroll-Timeline
 * nicht laeuft. Die JS-Fassung loest dasselbe Problem besser: Sie setzt die
 * Deckkraft selbst, greift also nur, wenn sie auch laeuft, und holt nach
 * vier Sekunden alles hervor, was uebrig ist. Damit ist der volle Effekt
 * aus dem Entwurf moeglich, ohne das Risiko einzugehen.
 * ========================================================================== */

@media print {
	.ff-reveal {
		animation: none !important;
		opacity: 1 !important;
		transform: none !important;
	}
}

@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;
	}
}

/* ==========================================================================
 * 12. Barrierefreiheit & Fokus
 * ========================================================================== */

:focus-visible {
	outline: 2px solid var(--wp--preset--color--accent-dark);
	outline-offset: 3px;
	border-radius: 2px;
}

/* Der Footer steht seit dem Umbau auf heller Flaeche und faellt damit unter
 * die Grundregel: Rosmarin-Umrandung. Minze haette dort 1,6:1 — der
 * Fokusrahmen waere praktisch unsichtbar. */
.is-style-section-dark :focus-visible,
.ff-cta :focus-visible,
.ff-wb-kosten :focus-visible {
	outline-color: var(--wp--preset--color--cta);
}

.wp-block-button__link:focus-visible {
	outline-offset: 4px;
}

/* Inline-Links im Fliesstext: In der CI-Palette gibt es keine Farbe, die
 * gleichzeitig 4.5:1 gegen die Flaeche und 3:1 gegen den Fliesstext schafft.
 * Der Unterstrich ist deshalb die einzige normkonforme Unterscheidung —
 * bitte nicht "aufraeumen". */
.ff-prose a,
.wp-block-post-content p a,
.entry-content p a {
	text-decoration: underline;
	text-decoration-thickness: 1px;
	text-underline-offset: 3px;
}

.skip-link {
	position: absolute;
	left: -9999px;
	z-index: 100;
	padding: 0.75rem 1.25rem;
	background: var(--wp--preset--color--contrast);
	color: var(--wp--preset--color--base-2);
	border-radius: var(--wp--custom--radius--input);
}

.skip-link:focus {
	left: 1rem;
	top: 1rem;
}

.screen-reader-text {
	position: absolute !important;
	width: 1px;
	height: 1px;
	padding: 0;
	margin: -1px;
	overflow: hidden;
	clip-path: inset(50%);
	white-space: nowrap;
	border: 0;
}

/* --- 8h6. Kursstimmen ---
 * Die ersten belegten Stimmen im Projekt (Weiterbildungen). Bewusst ohne
 * Sterne: Minze ist laut CI Klickbarem vorbehalten, und eine Bewertung in
 * Sternen behauptet eine Skala, die es hier nicht gibt. */

.ff-stimme__zitat {
	margin: 0;
	border: 0;
	padding: 0;
}

.ff-stimme__zitat p {
	font-family: var(--wp--preset--font-family--display);
	font-style: italic;
	font-size: var(--wp--preset--font-size--lg);
	line-height: var(--wp--custom--line-height--subheading);
	color: var(--wp--preset--color--contrast);
	margin: 0;
}

.ff-stimme__zitat cite {
	display: block;
	margin-top: var(--wp--preset--spacing--sm);
	font-family: var(--wp--preset--font-family--sans);
	font-style: normal;
	font-size: var(--wp--preset--font-size--xs);
	letter-spacing: 0.06em;
	text-transform: uppercase;
	color: var(--wp--preset--color--muted-dark);
}

/* Einzelstimme ohne Karte: Wenn nur eine belegte Stimme vorliegt, wirkt ein
 * grosses Zitat staerker als eine einsame Karte in einem Raster. */
.ff-stimme--solo {
	text-align: center;
	max-width: 40rem;
	margin-inline: auto;
}

.ff-stimme--solo p {
	font-size: var(--wp--preset--font-size--xl);
}

/* --- 8h6b. Text-Bild-Abschnitte (Claude-Entwurf) ---
 *
 * Das wiederkehrende Grundmuster der Unterseiten: eine Textspalte neben
 * einem hohen Motiv. Der Entwurf wechselt dabei die Seite — „Was dich
 * erwartet" hat das Bild rechts, „Was meine Beratung besonders macht"
 * links. Das gibt der Seite einen Rhythmus, statt zweimal dasselbe.
 *
 * Spaltenverhaeltnisse aus dem Entwurf: 1,1 zu 0,9 mit Bild rechts,
 * 0,9 zu 1,1 mit Bild links — die Textspalte ist also immer die breitere.
 * Abstand 90 px.
 *
 * Unter 64em stapeln beide, das Bild wandert dabei IMMER nach unten:
 * `order` sorgt dafuer, dass auch die Bild-links-Variante mit dem Text
 * beginnt. Ein Motiv vor der Ueberschrift laesst die Seite auf dem Handy
 * ohne Einstieg beginnen. */

.ff-textbild > * {
	margin-block: 0;
}

@media (min-width: 64em) {
	.ff-textbild {
		display: grid;
		gap: clamp(2.5rem, 5vw, 5.625rem);
		align-items: center;
	}

	.ff-textbild--bild-rechts {
		grid-template-columns: minmax(0, 1.1fr) minmax(0, 0.9fr);
	}

	.ff-textbild--bild-links {
		grid-template-columns: minmax(0, 0.9fr) minmax(0, 1.1fr);
	}

	/* Gleich breite Spalten fuer Text neben KARTE statt neben Motiv.
	 * Fuer-Fachpersonen.dc.html setzt die Vortragssektion auf
	 * `grid-template-columns:1fr 1fr; gap:80px`. Bei einem hohen Motiv ist
	 * die Textspalte die breitere, bei einer Karte stehen beide gleich. */
	.ff-textbild--halb {
		grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
		gap: 5rem;
	}
}

/* Die Karte im Zweispalter bringt ihr Polster selbst mit, 40 oben und
 * unten, 42 quer — Werte aus dem Entwurf.
 *
 * DOPPELTE KLASSE noetig: gegen `.ff-card.ff-card` (0,2,0) verlor die
 * einfache Klasse, die Regel war seit dem 19.08.2026 wirkungslos und die
 * Karte trug 46/42. Am 20.08.2026 beim Sweep gefunden. */
.ff-vortraege__karte.ff-vortraege__karte {
	padding: 2.5rem 2.625rem;
}

@media (max-width: 63.99em) {
	.ff-textbild {
		display: flex;
		flex-direction: column;
		gap: var(--wp--preset--spacing--xl);
	}

	.ff-textbild__bild {
		order: 2;
	}
}

.ff-textbild__bild {
	margin: 0;
	border-radius: var(--wp--custom--radius--media);
	overflow: hidden;
}

/* BILDSPALTE LAEUFT MIT, auf Lucas' Wunsch vom 15.08.2026.
 *
 * Bewusste Abweichung: Der Entwurf setzt die Spalten auf `align-items:center`
 * und laesst das Bild mitscrollen. Auf /praxis/ ist die Textspalte mit ihren
 * vier Punkten deutlich hoeher als das Bild, dadurch wandert das Bild oben
 * aus dem Blick, waehrend rechts nur noch Text steht.
 *
 * Nur auf breiten Schirmen: darunter stehen die Spalten untereinander, dort
 * waere ein klebendes Bild sinnlos. Der Abstand nach oben haelt die
 * klebende Ankernav frei. Eine Zeile entfernen stellt den Entwurf wieder her. */
@media (min-width: 48em) {
	.ff-textbild__bild {
		position: sticky;
		top: 6rem;
	}

	/* DIESELBE BEHANDLUNG FUER ZWEI WEITERE SPALTEN (28.08.2026, beide von
	 * Lucas als „sticky" markiert):
	 *
	 *   .ff-ansatz-raster__bild      Startseite, „Unser Ansatz" — das Foto
	 *                                neben dem Faktorenkreis
	 *   .ff-kursformat__eignung      Events, die Eignungskarte neben dem
	 *                                langen Einleitungstext
	 *
	 * In beiden Faellen ist die Nachbarspalte deutlich hoeher; ohne das
	 * Mitlaufen wandert das Bild bzw. die Karte oben aus dem Blick, waehrend
	 * daneben nur noch Text steht. Genau die Begruendung wie am 15.08. beim
	 * Text-Bild-Modul. */
	.ff-ansatz-raster__bild,
	.ff-kursformat__eignung {
		position: sticky;
		top: 6rem;
	}
}

.ff-textbild__bild img {
	display: block;
	width: 100%;
	/* Feste Hoehe wie im Entwurf (640 px bzw. 560 px). Ohne sie bestimmt
	 * das Seitenverhaeltnis die Hoehe, und die Spalten stehen ungleich. */
	height: clamp(22rem, 42vw, 40rem);
	object-fit: cover;
	object-position: center;
}

/* Die vier Punkte unter „Was dich erwartet": Ueberschrift und Absatz eng
 * zusammen, 30 px Abstand zwischen den Punkten (Entwurf). */
.ff-punkte {
	display: grid;
	/* 30px, direkt aus Praxis-Bauchgefuehl.dc.html („Was dich erwartet",
	 * `display:flex; flex-direction:column; gap:30px`). Der Token `lg` waere
	 * 36px; auf einem breiten Schirm summierte sich das ueber vier Punkte
	 * sichtbar auf. Kein Token, weil der Entwurf hier keinen nennt. */
	gap: 1.875rem;
}

.ff-punkt > * {
	margin-block: 0;
}

.ff-punkt > * + * {
	margin-top: 0.5rem;
}

/* Der Kernsatz in „Was meine Beratung besonders macht" — im Entwurf eine
 * Stufe groesser und in Rosmarin statt der sekundaeren Textfarbe. */
.ff-merksatz {
	font-size: var(--wp--preset--font-size--lg);
	font-weight: 600;
	line-height: var(--wp--custom--line-height--subheading);
}

/* --- 8h6g. Ankernavigation und Weiterbildungsabschnitte --- */

/* Klebende Sprungmarkenleiste. Sie sitzt UNTER der Kopfleiste, sobald diese
 * ebenfalls klebt — deshalb top:0 nur dort, wo der Header nicht klebt
 * (Foto-Hero-Seiten). Sonst waeren es zwei Leisten uebereinander. */
.ff-ankernav {
	position: sticky;
	top: 0;
	z-index: 40;
	background: color-mix(in srgb, var(--wp--preset--color--base) 92%, transparent);
	backdrop-filter: saturate(160%) blur(10px);
	-webkit-backdrop-filter: saturate(160%) blur(10px);
	border-top: 1px solid color-mix(in srgb, var(--wp--preset--color--muted) 35%, transparent);
	border-bottom: 1px solid color-mix(in srgb, var(--wp--preset--color--muted) 35%, transparent);
}

.ff-ankernav p {
	margin: 0;
}

/* Sprungziele muessen unter der klebenden Leiste hervorkommen. */
.ff-faq-gruppe,
[id="mikrobiom"],
[id="masterclass"],
[id="onkologie"],
[id="vortraege"],
[id="consulting"] {
	scroll-margin-top: 5.5rem;
}

/* SCHMALE SCHIRME: eine Zeile, seitlich scrollbar.
 *
 * Vorher brach die Leiste um — bei sieben Themen auf dem Telefon in drei
 * Zeilen, die klebend oben stehen bleiben und ein Drittel des Schirms
 * belegen. Als scrollbare Zeile bleibt sie eine Zeile hoch.
 *
 * `scroll-snap` laesst die Punkte einrasten, das Auslaufen am Rand zeigt,
 * dass es weitergeht. Die Bildlaufleiste wird versteckt, nicht die
 * Bedienbarkeit: Wischen, Trackpad und Tastatur funktionieren weiter. */
/* DIE LEISTE DARF NICHT AUF DIE INHALTSBREITE — AUF KEINEM SCHIRM.
 *
 * `max-width: none` stand nur in der Telefon-Abfrage weiter unten. Auf dem
 * Rechner erbte die Leiste dadurch die Inhaltsbreite des Themes, 39rem =
 * 624px. Die vier Pillen auf /fuer-fachpersonen/ brauchen zusammen 829px,
 * also brach die Leiste dort in zwei Zeilen um — bei 1425px freier Breite.
 * Gemessen am 17.08.2026 bei 1440px Fensterbreite.
 *
 * Die Inhaltsbreite ist ein Lesemass fuer Textspalten. Eine Sprungmarken-
 * leiste ist keine Textspalte.
 *
 * NICHT `none`: Fuer-Fachpersonen.dc.html setzt die Leiste auf
 * `max-width:1180px` — das ist die Inhaltsbreite des Entwurfs und zugleich
 * `wideSize` des Themes. Randlos war ein erster, zu weiter Schuss (1313px bei
 * 1440px Fenster). */
.ff-ankernav > * {
	max-width: min(73.75rem, 100%);
}

/* Pillenmasse direkt aus dem Entwurf: `font-size:14.5px`, `gap:8px`.
 * Das Pattern vergibt `has-sm-font-size` (15.5px) und blockGap `xs` (10.8px);
 * zusammen brauchten die vier Punkte 825px statt 775px. */
.ff-ankernav__liste {
	gap: 0.5rem;
}

/* Bis 72em statt 48em (21.09.2026): Mit dem fuenften Punkt „Vortraege und
 * Keynotes" brauchen die Pillen rund 1040px. Zwischen 930 und 1150px brach
 * die klebende Leiste sonst in zwei Zeilen um, 114 statt 66px hoch. */
@media (max-width: 71.99em) {
	.ff-ankernav__liste {
		display: flex;
		/* `flex-start` ist hier der eigentliche Fix.
		 *
		 * Die Leiste traegt von WordPress `is-content-justification-center`,
		 * also `justify-content: center`. Laeuft der Inhalt eines
		 * Flex-Containers ueber, zentriert das den UEBERLAUF: Der erste
		 * Punkt lag bei x=-215 und war auch durch Wischen nicht mehr
		 * erreichbar, weil `scrollLeft` schon bei 0 stand.
		 * Auf breiten Schirmen bleibt die Zentrierung. */
		justify-content: flex-start !important;
		flex-wrap: nowrap;
		gap: 0.25rem;
		overflow-x: auto;
		overscroll-behavior-x: contain;
		scroll-snap-type: x proximity;
		scrollbar-width: none;
		/* Rand, damit der erste und letzte Punkt nicht an der Kante kleben. */
		padding-inline: var(--wp--preset--spacing--gutter);
		/* `!important`, weil WordPress Kindern einer Constrained-Gruppe
		 * `margin-inline: auto !important` gibt. Bei einem Flex-Container,
		 * dessen Inhalt breiter ist als der Kasten, zentriert diese
		 * Auto-Aussenkante den UEBERLAUF — der erste Punkt lag dadurch bei
		 * x=-215 und war nicht mehr erreichbar, auch nicht durch Wischen. */
		margin-inline: calc(var(--wp--preset--spacing--gutter) * -1) !important;
		text-align: left;
	}

	.ff-ankernav__liste::-webkit-scrollbar {
		display: none;
	}

	.ff-ankernav a {
		flex: 0 0 auto;
		scroll-snap-align: start;
		white-space: nowrap;
	}
}

.ff-ankernav a {
	display: inline-block;
	font-size: 0.90625rem;          /* 14.5px, Entwurfswert */
	padding: 0.5rem 1.125rem;
	border-radius: 999px;
	color: var(--wp--preset--color--contrast);
	/* Ohne Unterstreichung — der Entwurf setzt die Themenpunkte als Pillen,
	 * nicht als Fliesstextlinks. Die globale Linkunterstreichung des Themes
	 * schlug hier durch. */
	text-decoration: none !important;
	transition: background var(--wp--custom--transition--base);
}

.ff-ankernav a:hover,
.ff-ankernav a:focus-visible {
	background: var(--wp--preset--color--cta);
	color: var(--wp--preset--color--contrast);
}

/* Sprungziele duerfen nicht unter der Ankerleiste landen. */
.ff-ankernav ~ * [id],
.ff-ankernav ~ [id] {
	scroll-margin-top: 5rem;
}

.ff-unterzeile {
	font-family: var(--wp--preset--font-family--display);
	font-style: italic;
	font-size: var(--wp--preset--font-size--lg);
	/* Vorher -0.35rem: Die Zeile wurde unter die Ueberschrift GEZOGEN und
	 * klebte an ihrer Unterlaenge (gemeldet 28.08.2026). Jetzt ein knapper
	 * positiver Abstand — sie gehoert zur Ueberschrift, soll sie aber nicht
	 * beruehren. */
	margin-top: 0.4rem;
}

/* WERTE AUS Fuer-Fachpersonen.dc.html (20.08.2026).
 *
 * Hier stand `gap: 0.5rem` fuer beide Karten — wirkungslos gegen
 * `.ff-card.ff-card` (0,1,0 gegen 0,2,0) und ausserdem inhaltlich falsch:
 * Der Entwurf gibt den beiden Kartentypen VERSCHIEDENE Abstaende. Gefunden
 * beim Sweep, der auch die Missionskarte aufgedeckt hat.
 *
 * Modulkarte, woertlich:
 *   background:#FEFDF8; border-radius:20px; padding:34px 28px;
 *   box-shadow:0 8px 26px rgba(36,48,30,0.06);
 *   display:flex; flex-direction:column; gap:10px
 *
 * Infokarte, woertlich:
 *   background:#F5F2E9; border-radius:20px; padding:34px 30px;
 *   display:flex; flex-direction:column; gap:14px
 *
 * Die Infokarte traegt im Entwurf KEINEN Schatten — sie steht auf Sand, ein
 * Schatten macht daraus eine schwebende Flaeche auf einer Flaeche. Die
 * Standardkarte gibt ihr einen, deshalb hier ausdruecklich `none`.
 *
 * Die Kinder tragen im Entwurf `margin:0`, die Abstaende haengen also am
 * Container. Das passt zu unserem Aufbau.
 *
 * NICHT UEBERNOMMEN: Der Entwurf stellt die beiden Karten der Supplement
 * Masterclass auf Schlagrahm MIT Schatten, waehrend dieselben Karten bei
 * Mikrobiom und Onkologie auf Sand ohne Schatten stehen. Unser Modul kennt
 * nur eine Infokarte fuer alle drei. Das zu trennen waere eine eigene
 * Variante; solange niemand danach fragt, bleibt es einheitlich. */
.ff-wb-karte.ff-wb-karte {
	gap: 0.625rem;
	padding: 2.125rem 1.75rem;
	border-radius: 1.25rem;
	box-shadow: 0 8px 26px rgba(36, 48, 30, 0.06);
}

.ff-wb-info.ff-wb-info {
	gap: 0.875rem;
	padding: 2.125rem 1.875rem;
	border-radius: 1.25rem;
	box-shadow: none;
}

/* Jelina 28.09.2026: Bei Onkologie fehlte der Hintergrund der Infokarten.
 * Die Abschnitte wechseln hell/Sand; auf Sand verschwand die Sandkarte.
 * Dort traegt die Karte deshalb Creme, wie die Karten der Kontaktseite. */
.is-style-section-soft .ff-wb-info.ff-wb-info {
	background-color: var(--wp--preset--color--base-2) !important;
}

.ff-wb-kosten {
	display: flex;
	flex-direction: column;
	gap: 0.5rem;
	box-shadow: 0 1px 2px rgba(36, 48, 30, 0.04), 0 10px 28px rgba(36, 48, 30, 0.07);
}

/* Auf der dunklen Kostenkarte gilt Schlagrahm — die Ueberschrift braucht
 * das ausdruecklich, sonst faerbt theme.json sie auf Rosmarin. */
.ff-wb-kosten :is(h2, h3) {
	color: var(--wp--preset--color--base-2);
}

.ff-wb-kosten p {
	color: color-mix(in srgb, var(--wp--preset--color--base-2) 78%, transparent);
}

.ff-wb-kosten__preis {
	font-family: var(--wp--preset--font-family--display);
	font-size: var(--wp--preset--font-size--xl);
	color: var(--wp--preset--color--cta) !important;
	line-height: 1.1;
}

.ff-wb-kosten__aktion {
	margin-top: auto;
	padding-top: var(--wp--preset--spacing--sm);
}

/* --- 8h6f. Werdegang, Stichworte, Leitbild (Claude-Entwurf) --- */

/* Zeitleiste: eine Linie links, je Station ein Punkt darauf. Sie laeuft
 * beim Scrollen ein, wie im Entwurf (Ueber-mich.dc.html) und wie der Ablauf
 * auf /praxis/.
 *
 * SEIT 28.08.2026 ANIMIERT, auf Lucas' Ansage. Vorher stand sie, mit der
 * Begruendung, ohne JavaScript waere der Text unsichtbar. Der Einwand galt
 * der Umsetzung des Entwurfs, der die Stationen per Inline-Style auf
 * `opacity:0` setzt. Hier macht das JavaScript es umgekehrt: Es setzt erst
 * `.ff-weg-liste--aktiv`, versteckt also nur, wenn es auch aufdecken kann,
 * und nimmt die Klasse wieder weg, wenn der Browser keine Frames zeichnet.
 * Ohne JavaScript steht der Werdegang vollstaendig da.
 *
 * Die Fuellung ist ein zweites Pseudoelement ueber der ruhenden Linie, seine
 * Hoehe kommt aus --ff-weg-fuellung. Deshalb braucht die Liste kein
 * zusaetzliches Markup — und der eingebettete Seiteninhalt musste nicht
 * angefasst werden. */
.ff-weg-liste {
	position: relative;
	margin: var(--wp--preset--spacing--xl) 0 0;
	padding-left: 2.75rem;
}

/* Die mitwachsende Linie. Ohne die Aktivklasse ist sie nicht da, die
 * ruhende Linie aus ::before traegt dann allein. */
.ff-weg-liste--aktiv::after {
	content: "";
	position: absolute;
	left: 0;
	top: 0.6rem;
	width: 2px;
	height: var(--ff-weg-fuellung, 0);
	max-height: calc(100% - 1.2rem);
	border-radius: 2px;
	background: linear-gradient(
		var(--wp--preset--color--accent-dark),
		var(--wp--preset--color--cta)
	);
}

/* Station und Punkt warten, bis der Fortschritt sie erreicht. */
.ff-weg-liste--aktiv .ff-weg-liste__station {
	opacity: 0;
	transform: translateY(18px);
	transition: opacity 0.6s ease, transform 0.6s cubic-bezier(0.22, 0.61, 0.36, 1);
}

.ff-weg-liste--aktiv .ff-weg-liste__station.ist-erreicht {
	opacity: 1;
	transform: none;
}

/* Der Punkt springt auf, mit demselben Ueberschwinger wie auf /praxis/. */
.ff-weg-liste--aktiv .ff-weg-liste__station::before {
	transform: scale(0);
	transition: transform 0.45s cubic-bezier(0.34, 1.56, 0.64, 1);
}

.ff-weg-liste--aktiv .ff-weg-liste__station.ist-erreicht::before {
	transform: scale(1);
}

.ff-weg-liste::before {
	content: "";
	position: absolute;
	left: 0;
	top: 0.6rem;
	bottom: 0.6rem;
	width: 2px;
	border-radius: 2px;
	background: color-mix(in srgb, var(--wp--preset--color--cta) 35%, transparent);
}

.ff-weg-liste__station {
	position: relative;
	padding-bottom: var(--wp--preset--spacing--lg);
}

.ff-weg-liste__station:last-child {
	padding-bottom: 0;
}

.ff-weg-liste__station::before {
	content: "";
	position: absolute;
	left: -3.19rem;
	top: 0.45rem;
	width: 0.875rem;
	height: 0.875rem;
	border-radius: 999px;
	background: var(--wp--preset--color--cta);
	box-shadow: 0 0 0 4px color-mix(in srgb, var(--wp--preset--color--cta) 22%, transparent);
}

.ff-weg-liste__marke {
	font-family: var(--wp--preset--font-family--display);
	font-size: var(--wp--preset--font-size--lg);
	color: var(--wp--preset--color--accent-dark);
	margin-bottom: 0.35rem;
}

.ff-weg-liste__text {
	margin: 0;
	color: var(--wp--preset--color--body-soft);
	line-height: var(--wp--custom--line-height--body);
}

@media (min-width: 48em) {
	.ff-weg-liste__station {
		display: grid;
		grid-template-columns: 7.5rem 1fr;
		gap: var(--wp--preset--spacing--lg);
		align-items: baseline;
	}

	.ff-weg-liste__marke {
		margin-bottom: 0;
	}
}

/* Stichworte („Wenn ich nicht arbeite"): Begriff in Matcha, Text daneben. */
.ff-stichworte {
	margin: var(--wp--preset--spacing--md) 0 0;
	display: grid;
	gap: var(--wp--preset--spacing--md);
}

.ff-stichworte__paar > dt {
	font-family: var(--wp--preset--font-family--display);
	font-size: var(--wp--preset--font-size--lg);
	color: var(--wp--preset--color--accent-dark);
	margin-bottom: 0.25rem;
}

.ff-stichworte__paar > dd {
	margin: 0;
	color: var(--wp--preset--color--body-soft);
	font-size: var(--wp--preset--font-size--sm);
	line-height: var(--wp--custom--line-height--body);
}

@media (min-width: 48em) {
	.ff-stichworte__paar {
		display: grid;
		grid-template-columns: 9.5rem 1fr;
		gap: var(--wp--preset--spacing--md);
		align-items: baseline;
	}

	.ff-stichworte__paar > dt {
		margin-bottom: 0;
	}
}

/* Grosse Ziffer auf den Ansatz-Karten. */
.ff-ansatz__ziffer {
	font-family: var(--wp--preset--font-family--display);
	font-size: 2.125rem;
	line-height: 1;
	color: var(--wp--preset--color--cta);
	margin-bottom: 0.25rem;
}

/* Leitsatz — kursives Playfair in Matcha, wie im Entwurf. */
/* 22px und aufrecht — Entwurf (Vision-Mission.dc.html, Leitsatzkarte).
 * Vorher LG (19px) und kursiv; kursiv ist im Theme die Zitatstimme, hier
 * steht der Satz aber als Aussage der Firma, nicht als Fremdzitat. */
.ff-leitsatz {
	font-family: var(--wp--preset--font-family--display);
	font-style: normal;
	font-size: 1.375rem;
	line-height: 1.6;
	text-wrap: pretty;
}

.ff-leitkarte {
	text-align: center;
}

.ff-leitkarte__mark {
	display: block;
	width: 3.5rem;
	margin: 0 auto;
	line-height: 0;
	color: var(--wp--preset--color--accent-dark);
}

.ff-leitkarte__mark svg {
	display: block;
	width: 100%;
	height: auto;
}

/* Mission: die drei Punkte als schmale Zeilen mit vorangestellter Ziffer.
 *
 * OBEN ANSETZEN, NICHT MITTIG (20.08.2026, gemeldet von Lucas: „die
 * Anordnung macht fuer mich nicht so viel Sinn").
 *
 * `.ff-textbild` zentriert seine beiden Spalten senkrecht — richtig, wenn
 * rechts ein Motiv steht, falsch, wenn dort drei Karten stehen: Der
 * Textblock schwebte auf halber Hoehe, mit einem grossen Loch darunter.
 * Vision-Mission.dc.html setzt fuer diesen Abschnitt `align-items:start`,
 * die Ueberschrift steht damit auf einer Linie mit Karte 01. */
.ff-textbild.ff-mission {
	align-items: start;
}

/* MISSION ALS ZEITSTRAHL (09.09.2026). Die drei Kacheln sind weg, das
 * Modul `ff-weg` von /praxis/ uebernimmt (Jelina: die Seite hat sehr viele
 * helle Kacheln, lieber das andere Design). `.ff-weg` bringt Bahn, Ziffern
 * und die Einlaufanimation mit; hier steht nur, was die Textbild-Spalte
 * anders braucht: kein Zentrieren, keine Breitenkappung. */
.ff-mission__weg {
	max-width: none;
	margin-inline: 0;
}

/* Bis 25.09.2026 standen auf /vision-mission/ zwei leere <span> vor dem
 * ersten Schritt; das Fluss-Layout gab ihm deshalb den Blockabstand nach
 * oben. Die Spans sind weg (Pseudoelemente), der Abstand bleibt: Der erste
 * Schritt steht so auf Hoehe der Ueberschrift daneben. */
.ff-mission__weg > .ff-weg__schritt:first-child {
	margin-block-start: var(--wp--style--block-gap);
}

.ff-mission__weg .ff-weg__schritt-titel {
	font-size: 1.375rem; /* 22px, wie vorher die Ziffer der Kachel */
}

/* --- 8h6e. Themenkarten (Claude-Entwurf) ---
 * Karte mit buendigem Bildband oben.
 *
 * POLSTER 0, DOPPELTE KLASSE (20.08.2026). `.ff-card.ff-card` traegt
 * 46/42 und gewinnt gegen ein einfaches `.ff-thema` (0,1,0 gegen 0,2,0).
 * Deshalb sass das Bild bis heute 42px eingerueckt und 46px tiefer in der
 * Karte — kein Band, sondern eine Briefmarke auf Karton. Gemeldet von
 * Lucas am 20.08.2026 („da ist nichts zu reparieren?"), nachdem ich den
 * Fehler zuvor selbst wegargumentiert hatte.
 *
 * Wissen.dc.html gibt der Karte kein Polster: das <a> traegt nur
 * `background`, `border-radius:22px`, `overflow:hidden` und den Schatten.
 * Den Innenabstand bringt allein der Textblock darunter mit.
 *
 * Radius bleibt beim Token (24px) statt der 22px des Entwurfs. Zwei Pixel
 * rechtfertigen keinen Sonderwert neben `radius--card`. */

.ff-thema.ff-thema {
	gap: 0;
	overflow: hidden;
	padding: 0;
}

.ff-thema__bild {
	margin: 0;
}

/* 200px fest, woertlich aus dem Entwurf (`style="height:200px"`). Vorher
 * clamp(9rem, 16vw, 12.5rem): Das machte das Band bei 900px nur 144px hoch
 * und damit unruhig gegen die Nachbarkarten.
 *
 * Die Motive liegen seit dem 20.08.2026 als 1200x640 vor. Das ist genau
 * das Verhaeltnis der Karte im Entwurf — (1180 - 2*28) / 3 = 374,67 breit
 * bei 200 hoch, also 1,875:1. Der Browser schneidet auf breiten Schirmen
 * dadurch praktisch nichts mehr weg; vorher waren es bei 1440px 38 Prozent
 * der Bildbreite, weil die Vorlagen 2,33:1 hatten. */
.ff-thema__bild img {
	display: block;
	width: 100%;
	height: 12.5rem;
	object-fit: cover;
}

.ff-thema__text {
	display: flex;
	flex-direction: column;
	flex: 1;
}

/* Das flache Podcast-Motiv steht neben kurzem Text und darf niedriger sein
 * als die hohen Kacheln der Text-Bild-Abschnitte. */
.ff-textbild__bild--flach img {
	height: clamp(18rem, 30vw, 26rem);
}

.ff-textlink a {
	font-weight: 600;
	text-decoration: underline;
	text-underline-offset: 4px;
}

.ff-medium__folgt {
	margin-top: auto;
	padding-top: var(--wp--preset--spacing--xs);
	font-style: italic;
}

/* --- 8h6d. Kontaktblock (Claude-Entwurf) ---
 * Zwei gleich breite Spalten, rechts drei gestapelte Bloecke. */

.ff-kontakt > *,
.ff-kontakt__spalte > * {
	margin-block: 0;
}

/* Kartenmasse der Kontaktseite aus Kontakt.dc.html — sie weichen bewusst
 * von der Standardkarte ab: Das Formular braucht mehr Innenraum als eine
 * Inhaltskarte, die beiden Karten rechts etwas weniger.
 *
 * Radius 24 statt der 28 des Medienradius; das Formular 48/50, die beiden
 * Karten rechts 44/46. Ohne diese Regeln erben sie die 46/42 der
 * Standardkarte. */
.ff-kontakt__karte.ff-kontakt__karte {
	padding: 3rem 3.125rem; /* 48/50 */
	border-radius: var(--wp--custom--radius--card);
}

.ff-kontakt__buchen.ff-kontakt__buchen,
.ff-kontakt__adresse.ff-kontakt__adresse {
	padding: 2.75rem 2.875rem; /* 44/46 */
	border-radius: var(--wp--custom--radius--card);
}

.ff-kontakt {
	display: grid;
	gap: 4rem; /* 64px, Entwurf */
	align-items: start;
}

@media (min-width: 64em) {
	.ff-kontakt {
		grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
	}
}

.ff-kontakt__spalte {
	display: grid;
	gap: var(--wp--preset--spacing--lg);
	align-content: start;
}

/* Auf der dunklen Buchungskarte braucht die Ueberschrift eine eigene Farbe:
 * theme.json setzt jede Ueberschrift auf Rosmarin, und Rosmarin auf
 * Rosmarin ist unsichtbar.
 *
 * Der Entwurf (Kontakt.dc.html) nennt hier SAND `#F5F2E9`, nicht Schlagrahm
 * — einen Hauch waermer und weniger hart auf dem dunklen Grund. Der
 * Fliesstext daneben steht in Leinsamen `#A39C93`, nicht in abgeblendetem
 * Weiss. */
.ff-kontakt__buchen :is(h2, h3) {
	color: var(--wp--preset--color--surface-sand);
}

.ff-kontakt__buchen p {
	color: var(--wp--preset--color--muted);
}

/* NICHT `a` pauschal: Der Knopf ist auch ein a, und Minze auf Minze war
 * genauso unsichtbar wie die Ueberschrift. Nur Textlinks umfaerben. */
.ff-kontakt__buchen p a {
	color: var(--wp--preset--color--cta);
}

/* Name und E-Mail nebeneinander, wie im Entwurf — darunter stapeln sie. */
.ff-form__paar {
	display: grid;
	gap: var(--wp--preset--spacing--md);
}

@media (min-width: 30em) {
	.ff-form__paar {
		grid-template-columns: 1fr 1fr;
	}
}

.ff-kontakt__daten a {
	font-weight: 600;
}

/* --- 8h6c. Ablauf als senkrechter Zeitstrahl (Entwurf) ---
 *
 * Masse aus Praxis-Bauchgefuehl.dc.html: Bahn 720px breit mit 72px
 * Einzug links, Linie bei 19px, Scheiben 40px auf der Linie.
 *
 * Vorher standen hier vier Spalten nebeneinander mit 56px-Scheiben —
 * falsch gelesen, siehe Kommentar im Pattern. */

.ff-weg__titel {
	margin-bottom: 4.5rem; /* 72px, Entwurf */
}

.ff-weg {
	position: relative;
	max-width: 45rem; /* 720px */
	margin-inline: auto;
	padding-left: 4.5rem; /* 72px */
}

/* Ruhende Bahn und wachsender Balken liegen uebereinander an derselben
 * Stelle; nur die Hoehe des Balkens aendert sich beim Scrollen.
 *
 * PSEUDOELEMENTE STATT SPANS (25.09.2026). Vorher standen zwei leere
 * <span> im Seiteninhalt (auf /vision-mission/ lose in der Gruppe, auf
 * /praxis/ in einem HTML-Block). Den losen Spans hat der Editor die Gruppe
 * als „ungueltig" angekreidet, der HTML-Block stand Jelina beim Bearbeiten
 * im Weg. Jetzt zeichnet das CSS beides; die Hoehe des Balkens setzt
 * theme.js ueber --ff-weg-fuellung, wie bei `.ff-weg-liste`.
 *
 * Ebenen: Das ::after kommt im Baum NACH den Schritten und laege sonst
 * ueber den Ziffer-Scheiben. Beide Linien liegen deshalb auf -1, `isolation`
 * haelt sie im Kasten von .ff-weg (sonst rutschten sie unter den
 * Sektionshintergrund). Ein z-index an den Schritten haette dasselbe
 * erreicht, aber die Schrift dort in eine eigene Ebene gehoben und ihre
 * Kantenglaettung sichtbar veraendert. */
.ff-weg {
	isolation: isolate;
}

.ff-weg::before,
.ff-weg::after {
	content: "";
	position: absolute;
	z-index: -1;
	left: 1.1875rem; /* 19px */
	top: 0.5rem;
	width: 2px;
	border-radius: 2px;
}

.ff-weg::before {
	bottom: 0.5rem;
	background: color-mix(in srgb, var(--wp--preset--color--cta) 22%, transparent);
}

.ff-weg::after {
	height: var(--ff-weg-fuellung, 0);
	background: linear-gradient(
		var(--wp--preset--color--accent),
		var(--wp--preset--color--cta)
	);
}

.ff-weg__schritt {
	position: relative;
	padding-bottom: 4rem; /* 64px */
}

.ff-weg__schritt:last-child {
	padding-bottom: 0;
}

.ff-weg__schritt > * {
	margin-block: 0;
}

/* Minze-Scheibe mit Ziffer, 40 px, sitzt auf der Linie. Die Ziffer steht in
 * Playfair — sie ist hier ein Schmuckelement, kein Fliesstext.
 *
 * `scale(0)` NUR wenn das Skript laeuft (Klasse am Container). Ohne
 * JavaScript stehen die Scheiben sofort da, statt unsichtbar zu bleiben. */
.ff-weg__ziffer {
	position: absolute;
	left: -4.5rem; /* -72px */
	top: -0.125rem;
	display: flex;
	align-items: center;
	justify-content: center;
	width: 2.5rem;
	height: 2.5rem;
	border-radius: 999px;
	background: var(--wp--preset--color--cta);
	color: var(--wp--preset--color--contrast);
	font-family: var(--wp--preset--font-family--display);
	font-size: 1.1875rem; /* 19px */
	font-weight: 400;
	line-height: 1;
	/* Playfair setzt Ziffern standardmaessig als Mediaevalziffern: 1 und 2
	 * auf x-Hoehe, 3 und 4 mit Unterlaenge. In der Scheibe sah das aus wie
	 * „nicht in der Mitte" (Jelina 09.09.2026). Gemessen war die Zeilenbox
	 * exakt zentriert (Abweichung 0,5 px) — die Glyphe selbst nicht.
	 * Versalziffern sitzen alle auf der Grundlinie und fuellen dieselbe
	 * Hoehe. */
	font-variant-numeric: lining-nums;
	box-shadow: 0 0 0 5px color-mix(in srgb, var(--wp--preset--color--cta) 18%, transparent);
}

.ff-weg__schritt-titel {
	font-size: 1.625rem; /* 26px */
	line-height: 1.25;
	margin-bottom: 0.625rem !important;
}

.ff-weg__schritt-text {
	font-size: 1.03125rem; /* 16.5px */
	line-height: 1.7;
	max-width: 35rem; /* 560px */
}

/* Bewegungszustaende — gesetzt von assets/js/theme.js. */
.ff-weg--aktiv .ff-weg__ziffer {
	transform: scale(0);
	transition: transform 0.45s cubic-bezier(0.34, 1.56, 0.64, 1);
}

.ff-weg--aktiv .ff-weg__schritt {
	opacity: 0;
	transform: translateY(18px);
	transition: opacity 0.6s ease, transform 0.6s cubic-bezier(0.22, 0.61, 0.36, 1);
}

.ff-weg--aktiv .ff-weg__schritt.ist-erreicht {
	opacity: 1;
	transform: none;
}

.ff-weg--aktiv .ff-weg__schritt.ist-erreicht .ff-weg__ziffer {
	transform: scale(1);
}

/* Schmale Schirme: Der 72px-Einzug frisst zu viel Breite. */
@media (max-width: 34em) {
	.ff-weg {
		padding-left: 3.25rem;
	}

	.ff-weg::before,
	.ff-weg::after {
		left: 0.9375rem;
	}

	.ff-weg__ziffer {
		left: -3.25rem;
		width: 2rem;
		height: 2rem;
		font-size: 1rem;
	}
}

/* --- 8h7. Onlinekurse ---
 * Zwei Bausteine der Kursseite: der zweispaltige Seitenkopf (Format links,
 * Eignung als Karte rechts) und die grosse Kurskarte mit Bildband.
 *
 * Der Entwurf setzt beides auf feste Spaltenmasse bei min-width:1100px — er
 * beschreibt nur den Desktop. Hier steht dieselbe Aufteilung als Raster, das
 * unter 64em auf eine Spalte faellt. */

.ff-kursformat > * {
	/* Der Gruppenblock liefert Fliess-Abstaende zwischen den Kindern; im
	 * Raster wuerden sie die Spalten gegeneinander verschieben. */
	margin-block: 0;
}

@media (min-width: 64em) {
	.ff-kursformat {
		display: grid;
		/* 1,1 zu 0,9 wie im Entwurf: Die linke Spalte traegt Headline, Lead
		 * und Nutzenliste und braucht die Zeilenlaenge; die Eignungskarte
		 * rechts besteht aus kurzen Zeilen und wirkt schmaler ruhiger. */
		grid-template-columns: minmax(0, 1.1fr) minmax(0, 0.9fr);
		gap: var(--wp--preset--spacing--xl);
		align-items: start;
	}
}

/* Die Eignungskarte hebt sich nur durch Flaeche und Schatten ab — sie ist
 * eine Nebenbemerkung zum Kopf, keine zweite Hauptsache. */
.ff-kursformat__eignung.ff-kursformat__eignung {
	/* .ff-card bringt Flex mit; hier reicht der normale Fluss, damit die
	 * Listenabstaende des Blocks greifen. */
	display: block;
	/* 40/42 aus dem Entwurf; ohne diese Zeile gelten die 46/42 der
	 * Standardkarte. Am 20.08.2026 nachgetragen. */
	padding: 2.5rem 2.625rem;
}

.ff-kursformat__eignung > * + * {
	margin-top: var(--wp--preset--spacing--sm);
}

/* --- Grosse Kurskarte --- */

/* Bildband oben, Text darunter, Button auf gemeinsamer Grundlinie. Der
 * Abstand zwischen Bild und Textblock ist 0: Das Band sitzt buendig an der
 * Kartenkante, sonst steht ein Streifen Karton darum. */
/* Doppelte Klasse aus demselben Grund wie bei `.ff-thema`: Der Kommentar
 * im Pattern verspricht seit jeher „Innenabstand ausdruecklich 0", das
 * Markup setzte ihn aber nie, und `.ff-card.ff-card` gewann. Am 20.08.2026
 * zusammen mit den Themenkarten gefunden. */
.ff-onlinekurs.ff-onlinekurs {
	gap: 0;
	overflow: hidden;
	padding: 0;
}

.ff-onlinekurs__bild {
	margin: 0;
}

.ff-onlinekurs__bild img {
	display: block;
	width: 100%;
	/* Feste Bandhoehe statt freiem Seitenverhaeltnis: Die beiden Karten
	 * stehen nebeneinander, und zwei unterschiedlich hohe Bilder lassen
	 * gleichrangige Kurse ungleich aussehen. Die Motive sind auf 7:3
	 * zugeschnitten, der Beschnitt hier ist also nur eine Sicherung.
	 *
	 * 240px fest, aus dem Entwurf. Das clamp davor zog das Band auf
	 * mittleren Schirmen auf 22vw hoch und liess die beiden Karten
	 * unterschiedlich wirken, sobald der Text unterschiedlich lang war. */
	height: 15rem;
	object-fit: cover;
	object-position: center;
}

/* Der Textblock traegt die Hoehe der Karte, damit margin-top:auto am Button
 * etwas zu verteilen hat. */
.ff-onlinekurs__text {
	display: flex;
	flex-direction: column;
	flex: 1;
}

/* Kursiv wie im Entwurf, aber eine Stufe kleiner als dort: Der Claim traegt
 * hier Jelinas vollstaendigen Satz (der Entwurf hatte ihn gekuerzt) und
 * liefe in Zitatgroesse ueber fuenf Zeilen — dann liest er sich als
 * Fliesstext und nicht mehr als Versprechen. */
.ff-onlinekurs__claim {
	font-style: italic;
	font-size: var(--wp--preset--font-size--md);
	line-height: var(--wp--custom--line-height--subheading);
}

/* Zwischenlabel, kein Sektionstitel: Versalien und Sperrung halten es
 * kleiner als die H3 darueber, obwohl es ein echtes H4 ist. */
.ff-onlinekurs__label {
	margin-bottom: 0;
	letter-spacing: var(--wp--custom--letter-spacing--caps);
	text-transform: uppercase;
	color: var(--wp--preset--color--muted-dark);
}

.ff-onlinekurs__liste {
	color: var(--wp--preset--color--body);
	line-height: var(--wp--custom--line-height--body);
}

/* Das Akkordeon steht INNERHALB der Karte. Rahmen und Schlagrahm-Flaeche
 * von .ff-faq__item waeren dort unsichtbar (Karte auf Karte) — deshalb nur
 * eine Haarlinie oben, der Pfeil bleibt. */
.ff-onlinekurs__eignung.ff-onlinekurs__eignung {
	border: 0;
	border-top: 1px solid color-mix(in srgb, var(--wp--preset--color--muted) 45%, transparent);
	border-radius: 0;
	background: none;
	padding: var(--wp--preset--spacing--sm) 0 0;
}

.ff-onlinekurs__eignung summary {
	padding-right: 1.75rem;
	font-size: var(--wp--preset--font-size--sm);
}

.ff-onlinekurs__aktion {
	/* Schiebt den Button ans Kartenende — beide Karten schliessen damit auf
	 * derselben Linie ab, unabhaengig von der Laenge der Lernziele. */
	margin-top: auto;
	padding-top: var(--wp--preset--spacing--md);
}

/* Seitenkopf der Angebotsseiten: dieselbe Bokeh-Flaeche wie das Zitat-Hero,
 * aber flacher und mit dem Angebotsnamen als H1 statt einem Zitat. Ein
 * Zitat eroeffnet eine Uebersichtsseite; auf einer Angebotsseite muss der
 * Name des Angebots die Ueberschrift sein. */
.ff-seitenkopf .ff-eyebrow.ff-eyebrow {
	margin-bottom: var(--wp--preset--spacing--xs);
}

.ff-seitenkopf .ff-lead {
	margin-top: var(--wp--preset--spacing--xs);
	color: var(--wp--preset--color--body);
}

/* --- 9. Seitenbezogene Abweichungen vom Home-Massstab ------------------
 *
 * Die Tokens des Themes sind aus Home.dc.html gezogen. Die uebrigen
 * Entwuerfe weichen an einzelnen Stellen davon ab — nachgelesen am
 * 17.08.2026 in Fuer-Fachpersonen.dc.html und Vision-Mission.dc.html:
 *
 *   Sektionspolster   Home 120px   Vision 110px   Fachpersonen 110px
 *   Lead              Home 19px/1.5              Fachpersonen 18px/1.7
 *   Sektionstitel     Home 1.15                  Fachpersonen 1.2
 *
 * Global umstellen ginge also nicht, ohne Home gegen seinen eigenen Entwurf
 * zu verschieben. Der Anker ist die Slug-Klasse aus inc/setup.php.
 */

.ff-seite-fuer-fachpersonen .ff-section {
	padding-block: clamp(3.667rem, 8.6vw, 6.875rem);   /* 110px statt 120px */
}

.ff-seite-fuer-fachpersonen .ff-lead {
	font-size: 1.125rem;      /* 18px */
	line-height: 1.7;
}

/* Die Ueberschrift traegt `ff-display-heading` und erbt damit die
 * Zeilenhoehe des Hero-Titels (1.08). Sie ist hier aber ein Sektionstitel
 * mit 46px, und der Entwurf gibt 1.2. */
.ff-seite-fuer-fachpersonen .ff-display-heading {
	line-height: 1.2;
}

/* DIE GANZE INTRO-SPALTE AUF 880px, nicht nur der Lead.
 *
 * Fuer-Fachpersonen.dc.html setzt den Intro-Block auf `max-width:880px`;
 * Eyebrow, Ueberschrift, Lead und Leitsatz fuellen ihn gemeinsam. Lead und
 * Leitsatz standen bereits dort, Eyebrow und Ueberschrift hingen auf dem
 * 46rem-Deckel, den Abschnitt 8b jeder Ueberschrift im Constrained-Layout
 * gibt. Gemeldet von Lucas am 15.08.2026 („die Breite ist nicht korrekt").
 *
 * Der Deckel bleibt global bestehen, er verhindert anderswo Umbrueche
 * mitten in der Wortgruppe. Hier wird er nur fuer diese Seite geloest, und
 * Die Ueberschrift braucht einzeilig 931px und bricht damit auch bei 880px
 * um. `text-wrap: pretty` aus dem Entwurf reicht dafuer nicht: es liess
 * „ankommt." allein auf der zweiten Zeile stehen, ein schlechterer Umbruch
 * als der vorherige. `balance` verteilt die beiden Zeilen gleichmaessig und
 * ist genau dafuer gemacht. Bewusste Abweichung vom Entwurfswert, gleiche
 * Absicht. */
.ff-seite-fuer-fachpersonen .ff-section > .ff-display-heading,
.ff-seite-fuer-fachpersonen .ff-section > .ff-eyebrow {
	max-width: min(55rem, 100%);
}

.ff-seite-fuer-fachpersonen .ff-section > .ff-display-heading {
	text-wrap: balance;
}

/* =====================================================================
 * 12. Rueckmeldungen Jelina (Dokument „Noch offen", 09.09.2026)
 * ===================================================================== */

/* --- 12a. Untermenue in der Kopfzeile ---
 * Auf- und Zuklappen kommt von Core (`wp-block-navigation-css` wird
 * geladen; die Hover-Regel steht dort in `@media (hover:hover)`, weshalb
 * Vorschau-Werkzeuge mit Touch-Emulation nichts aufklappen — im echten
 * Browser schon). Hier steht nur das Aussehen.
 *
/* --- 12b. Auswahlfeld mit eigenem Pfeil ---
 * Der Browserpfeil klebte an der Kante (Jelina: „Der Pfeil ist sehr am
 * Rand"). Eigener Pfeil, 18 px vom Rand, Polster rechts dafuer frei. */
.ff-form select {
	appearance: none;
	-webkit-appearance: none;
	padding-right: 2.875rem;
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16' fill='none' stroke='%2324301E' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 6l4 4 4-4'/%3E%3C/svg%3E");
	background-repeat: no-repeat;
	background-position: right 1.125rem center;
	background-size: 1rem 1rem;
}

/* --- 12c. Plakette fuer die offene Durchfuehrung ---
 * „Naechste Live-Durchfuehrung: Maerz 2027" als Minze-Pille statt als
 * stiller Eyebrow (Jelina: „Koennen wir diesen Text highlighten?"). */
.ff-wb-stand__plakette {
	display: inline-block;
	padding: 0.45rem 1.125rem;
	border-radius: 999px;
	background: var(--wp--preset--color--cta);
	color: var(--wp--preset--color--contrast);
	font-size: 0.9375rem;
	font-weight: 500;
	letter-spacing: 0.01em;
}

/* --- 12d. Masterclass-Kostenkarte: Faktenzeilen und Hinweisblock --- */
.ff-wb-fakten {
	display: grid;
	gap: 0.5rem;
	margin-top: var(--wp--preset--spacing--sm) !important;
	padding-top: var(--wp--preset--spacing--sm);
	border-top: 1px solid color-mix(in srgb, var(--wp--preset--color--base-2) 18%, transparent);
	font-size: 0.9375rem;
}

.ff-wb-fakten__zeile {
	display: flex;
	justify-content: space-between;
	gap: 1rem;
	margin: 0 !important;
}

.ff-wb-fakten__zeile span {
	color: color-mix(in srgb, var(--wp--preset--color--base-2) 72%, transparent);
}

.ff-wb-fakten__zeile strong {
	font-weight: 500;
}

.ff-wb-info__trenner {
	margin-block: 0.75rem !important;
	border: 0;
	border-top: 1px solid color-mix(in srgb, var(--wp--preset--color--contrast) 14%, transparent);
	opacity: 1;
}

.ff-wb-info__hinweis-titel {
	font-family: var(--wp--preset--font-family--body);
	font-size: 0.9375rem;
	font-weight: 600;
	margin: 0;
}

/* --- 12e. Punkte mit Icon links (Praxis, „Was dich erwartet") ---
 * Zwei Spalten: Icon oben links, Titel und Text rechts daneben. Das Icon
 * steht auf Hoehe der Titelzeile, nicht mittig zum ganzen Absatz — bei
 * vier- bis fuenfzeiligen Texten wuerde es sonst im Leeren schweben. */
.ff-punkte--icons .ff-punkt {
	display: grid;
	grid-template-columns: 2.5rem 1fr;
	column-gap: 1.25rem;
	align-items: start;
}

.ff-punkte--icons .ff-punkt > * {
	grid-column: 2;
}

.ff-punkte--icons .ff-punkt > .ff-ci-icon {
	grid-column: 1;
	grid-row: 1 / span 2;
	width: 2.5rem;
	margin: 0.1rem 0 0;
	color: var(--wp--preset--color--accent-dark);
}

.ff-punkte--icons .ff-punkt > h3 {
	margin-top: 0;
}

/* --- 12f. Medienkarten mit Senderlogo (/wissen/) ---
 * Aufbau der Themenkarten, das Band traegt statt eines Fotos das Logo auf
 * Hafermilch. Die Logos sind sehr unterschiedlich geschnitten (SRF ein
 * Rechteck, 20 Minuten ein Quadrat, MPS und ZIO lange Querformate); gleiche
 * Hoehe hiesse ungleiches Gewicht. Deshalb je eine eigene Hoehe, optisch
 * abgeglichen. Der Link am Fuss steht unten buendig, damit die vier Karten
 * ihn auf einer Linie tragen. */
.ff-medium__logo.ff-medium__logo {
	display: flex;
	align-items: center;
	justify-content: center;
	height: 9rem;
	margin: 0;
	padding: 0 1.75rem;
	background: var(--wp--preset--color--base);
	border-bottom: 1px solid color-mix(in srgb, var(--wp--preset--color--contrast) 8%, transparent);
}

.ff-medium__logo img {
	display: block;
	width: auto;
	max-width: 100%;
	height: 3.25rem;
	object-fit: contain;
}

.ff-medium__logo--srf img { height: 3.5rem; }
/* Das 20-Minuten-Zeichen fuellt seine Zeichenflaeche nur zu gut der Haelfte. */
.ff-medium__logo--zwanzig img { height: 5.25rem; }
.ff-medium__logo--mps img { height: 2.75rem; }
.ff-medium__logo--zio img { height: 3.5rem; }

.ff-medium .ff-thema__text .ff-card__more {
	margin-top: auto !important;
	padding-top: 0.5rem;
}

/* --- Bildslider im Querformat (Vortragssektion, 17.09.2026) ---
 * Auf „Ueber mich" steht der Slider in einer Portraitspalte und ist
 * deshalb fest 600px hoch. In der Vortragssektion liegen die Motive quer
 * (3:2 aus dem Shooting), dort folgt der Rahmen der Spaltenbreite. 4:3
 * statt 3:2, damit der breite weisse Rand der Studiobilder links und
 * rechts etwas beschnitten wird und Jelina groesser im Bild steht.
 *
 * Beide Regeln noetig: `.ff-bildslider` setzt 37.5rem, die Handyregel
 * darunter 24rem — ohne die zweite bliebe die feste Hoehe dort stehen. */
.ff-bildslider--quer {
	height: auto;
	aspect-ratio: 4 / 3;
}

@media (max-width: 63.99em) {
	.ff-bildslider--quer {
		height: auto;
	}
}

/* --- Artikel (templates/single.html, 18.09.2026) ---
 * Mit den ersten drei Blogartikeln von Jelina. Der Kopf steht auf Sand wie
 * die Einstiege der Unterseiten: Thema als Eyebrow, Titel, Anreisser (der
 * Auszug des Beitrags) und Datum mit Lesedauer, alles zentriert. Das
 * Titelbild ragt in den Kopf hinein, damit Kopf und Text nicht als zwei
 * getrennte Flaechen dastehen. Der Text laeuft im Lesemass (contentSize
 * 39rem aus theme.json). */
/* Die Flaechen des Artikels schliessen buendig aneinander; der Blockabstand
 * des Flow-Layouts (1,35rem) liess zwischen Kopf und Bildzone einen
 * hellen Streifen stehen. */
.ff-artikel > *,
.ff-archiv > * {
	margin-block: 0;
}

.ff-artikel__kopf > * + * {
	margin-block-start: var(--wp--preset--spacing--sm);
}

.ff-artikel__kopf .ff-artikel__thema a {
	color: inherit;
	text-decoration: none;
}

.ff-artikel__kopf .ff-artikel__lead {
	margin-block-start: var(--wp--preset--spacing--md);
}

.ff-artikel__kopf .ff-artikel__lead p {
	margin: 0;
}

.ff-artikel__datum {
	margin-block-start: var(--wp--preset--spacing--md) !important;
	color: var(--wp--preset--color--body-soft);
}

.ff-artikel__bildzone {
	background: linear-gradient(to bottom, var(--wp--preset--color--surface-sand) 50%, transparent 50%);
}

.ff-artikel__bild {
	margin: 0;
	border-radius: var(--wp--custom--radius--media);
	overflow: hidden;
}

.ff-artikel__bild img {
	display: block;
	width: 100%;
	object-fit: cover;
}

/* Zwischentitel im Text: Die globale h2 ist fuer Sektionen gebaut
 * (bis 2,875rem). Im Fliesstext waere das ein Plakat. */
.ff-artikel__text .wp-block-post-content h2 {
	font-size: clamp(1.4375rem, 1.1rem + 0.9vw, 1.6875rem);
	margin-block-start: var(--wp--preset--spacing--xl);
	margin-block-end: 0;
}

.ff-artikel__text .wp-block-post-content h2 + p {
	margin-block-start: var(--wp--preset--spacing--xs);
}

.ff-artikel__text .wp-block-post-content p {
	line-height: 1.75;
}

/* Absatz auf Absatz: Der globale Blockabstand (10,8px auf dem Desktop)
 * reicht bei 1,75 Zeilenhoehe nicht, die Absaetze lasen sich wie einer. */
.ff-artikel__text .wp-block-post-content > p + p {
	margin-block-start: 1.25em;
}

.ff-artikel__zurueck {
	max-width: var(--wp--style--global--content-size);
	margin-inline: auto !important;
}

/* Podcast-Kasten am Ende eines Artikels (floraflow/podcast-folge):
 * Cover links, Einordnung und Link rechts. Das Cover ist quadratisch. */
.ff-podcast-folge.ff-podcast-folge {
	display: grid;
	grid-template-columns: 7.5rem minmax(0, 1fr);
	gap: 1.5rem;
	align-items: center;
	margin-block-start: var(--wp--preset--spacing--xl);
	padding: 1.5rem;
}

.ff-podcast-folge .ff-podcast-folge__cover {
	margin: 0;
	border-radius: var(--wp--custom--radius--card-small, 1rem);
	overflow: hidden;
}

.ff-podcast-folge .ff-podcast-folge__cover img {
	display: block;
	width: 100%;
	height: auto;
}

.ff-podcast-folge__text > * {
	margin-block: 0;
}

.ff-podcast-folge__text > * + * {
	margin-block-start: 0.375rem;
}

@media (max-width: 30em) {
	.ff-podcast-folge.ff-podcast-folge {
		grid-template-columns: 5rem minmax(0, 1fr);
		gap: 1rem;
		padding: 1.125rem;
	}
}

/* Artikelkarten im Themenarchiv (floraflow/query-grid): Der Titel-Link
 * spannt die Klickflaeche ueber die ganze Karte, wie `.ff-card__more a`
 * bei den Themenkarten. Das Bild kommt hier aus dem Post-Featured-Image-
 * Block, der das img ohne Huelle ausgibt — daher die eigene Regel. */
.ff-artikelkarte .wp-block-post-title a {
	color: inherit;
	text-decoration: none;
}

.ff-artikelkarte .wp-block-post-title a::before {
	content: "";
	position: absolute;
	inset: 0;
	border-radius: inherit;
}

.ff-artikelkarte .ff-thema__bild {
	margin: 0;
}

.ff-artikelkarte .ff-thema__bild img {
	display: block;
	width: 100%;
	height: 12.5rem;
	object-fit: cover;
}

.ff-artikelkarte .wp-block-post-excerpt__excerpt {
	margin: 0;
}

/* Wenige Artikel pro Thema (zum Start je einer): Das starre Dreierraster
 * stellte die einzelne Karte an den linken Rand. Feste Kartenbreite und
 * zentriert, ab drei Karten sieht das aus wie das Raster auf /wissen/. */
/* SPALTEN JE BREITE (18.09.2026 nach Pruefung): Das Kernraster des
 * Query-Blocks ist starr dreispaltig und faellt erst unter 600px auf eine
 * Spalte. Die Stapelregeln fuer Gruppenraster (8. Kartenraster stapeln)
 * treffen die <ul> des Post-Templates nicht.
 *   ab 64em   drei gleiche Spalten; bei ein oder zwei Karten feste Breite,
 *             zentriert
 *   40-64em   zwei Spalten, eine einzelne Karte zentriert
 *   darunter  eine Spalte */
/* Abstand zur Ueberschrift. Stand bis 25.09.2026 als Blockattribut am
 * Abfrage-Block; der speichert keinen Aussenabstand, der Editor haette ihn
 * beim naechsten Speichern verworfen. Zwei Klassen, damit die Regel ueber
 * dem Fluss-Abstand des Layouts (:root :where(...) > *) steht. */
.wp-block-query.ff-artikelliste {
	margin-top: var(--wp--preset--spacing--xl);
}

.ff-artikelliste .wp-block-post-template.is-layout-grid {
	grid-template-columns: minmax(0, 1fr);
	justify-content: center;
}

@media (min-width: 40em) {
	.ff-artikelliste .wp-block-post-template.is-layout-grid {
		grid-template-columns: repeat(2, minmax(0, 1fr));
	}

	.ff-artikelliste .wp-block-post-template.is-layout-grid:not(:has(> li:nth-child(2))) {
		grid-template-columns: minmax(0, 23rem);
	}
}

@media (min-width: 64em) {
	.ff-artikelliste .wp-block-post-template.is-layout-grid {
		grid-template-columns: repeat(3, minmax(0, 1fr));
	}

	.ff-artikelliste .wp-block-post-template.is-layout-grid:not(:has(> li:nth-child(3))) {
		grid-template-columns: repeat(auto-fit, minmax(0, 23rem));
	}
}

/* Kartentitel fest 1,5rem (1,375rem auf dem Handy). Als Inline-Stil am
 * Post-Title-Block rechnete WordPress den Wert in ein fluides clamp() um,
 * das auf dem Handy bei 16px landete — kleiner als die Medienkarten-Titel
 * darunter. */
.ff-artikelkarte .ff-artikelkarte__titel {
	font-size: 1.5rem;
	line-height: 1.25;
}

@media (max-width: 39.99em) {
	.ff-artikelkarte .ff-artikelkarte__titel {
		font-size: 1.375rem;
	}
}

/* --- Themenwahl und Artikelkarten auf /wissen/ (18.09.2026) ---
 * Der Kategorien-Block gibt eine schlichte Liste aus; hier als zentrierte
 * Reihe von Pillen, im Ton der Kartenlinks (Matcha, Gewicht 500). */
.ff-themenwahl.ff-themenwahl {
	display: flex;
	flex-wrap: wrap;
	justify-content: center;
	gap: 0.625rem;
	margin-inline: auto;
	padding: 0;
	list-style: none;
}

.ff-themenwahl li {
	margin: 0;
}

.ff-themenwahl a {
	display: inline-block;
	padding: 0.5rem 1.125rem;
	border: 1px solid color-mix(in srgb, var(--wp--preset--color--accent) 45%, transparent);
	border-radius: 999px;
	background: var(--wp--preset--color--base-2);
	color: var(--wp--preset--color--accent-dark);
	font-size: var(--wp--preset--font-size--sm);
	font-weight: 500;
	text-decoration: none;
	transition: background 0.2s, color 0.2s, border-color 0.2s;
}

.ff-themenwahl a:hover,
.ff-themenwahl a:focus-visible {
	background: var(--wp--preset--color--accent-dark);
	border-color: var(--wp--preset--color--accent-dark);
	color: var(--wp--preset--color--base-2);
}

/* Thema als Eyebrow auf der Artikelkarte. Der Titel-Link spannt seine
 * Klickflaeche ueber die ganze Karte; das Thema liegt darueber und fuehrt
 * auf die Themenseite. */
.ff-artikelkarte .ff-artikelkarte__thema {
	margin: 0;
}

.ff-artikelkarte .ff-artikelkarte__thema a {
	position: relative;
	z-index: 1;
	color: var(--wp--preset--color--accent-dark);
	text-decoration: none;
}

.ff-artikelkarte .ff-artikelkarte__thema a:hover {
	text-decoration: underline;
}

/* Punkte im Vortragsslider: Die Motive dort sind Studiobilder mit weisser
 * Wand, der halbtransparente helle Punkt aus dem Entwurf verschwand darauf.
 * Hier dunkel mit hellem Rand, aktiv weiter in Minze. Der Slider auf
 * „Ueber mich" bleibt beim Entwurfswert. */
.ff-bildslider--quer .ff-bildslider__punkt::before {
	background: color-mix(in srgb, var(--wp--preset--color--contrast) 55%, transparent);
	box-shadow: 0 0 0 2px color-mix(in srgb, var(--wp--preset--color--base-2) 80%, transparent);
}

/* Aktiv in Matcha dunkel statt Minze: Minze auf weisser Wand erreicht die
 * 3:1 fuer Bedienelemente nicht (1,9:1), accent-dark liegt bei 5,7:1. */
.ff-bildslider--quer .ff-bildslider__punkt.ist-aktiv::before {
	background: var(--wp--preset--color--accent-dark);
}

.ff-bildslider--quer .ff-bildslider__punkt:focus-visible,
.ff-bildslider--quer .ff-bildslider__pause:focus-visible {
	outline-color: var(--wp--preset--color--contrast);
}

/* Artikelkarten gleich hoch: Das Raster streckt die <li>, die Karte darin
 * aber nicht — bei unterschiedlich langen Titeln endeten die Karten auf
 * verschiedenen Hoehen. */
.ff-artikelliste .wp-block-post {
	display: flex;
}

.ff-artikelliste .wp-block-post > .ff-artikelkarte {
	flex: 1;
}

/* --- Kostenkarte mit Paketen (Mikrobiom, 21.09.2026) ---
 * Zwei Preise untereinander, getrennt durch eine feine Linie, je mit
 * eigenem Knopf. Die Konturvariante des zweiten Knopfs braucht auf der
 * dunklen Karte die helle Fassung, wie auf dunklen Sektionen. */
.ff-wb-paket {
	display: flex;
	flex-direction: column;
	gap: 0.375rem;
}

.ff-wb-paket + .ff-wb-paket {
	margin-top: var(--wp--preset--spacing--sm) !important;
	padding-top: var(--wp--preset--spacing--sm);
	border-top: 1px solid color-mix(in srgb, var(--wp--preset--color--base-2) 18%, transparent);
}

.ff-wb-paket > * {
	margin: 0 !important;
}

.ff-wb-paket__name {
	font-size: 0.8125rem;
	font-weight: 600;
	letter-spacing: var(--wp--custom--letter-spacing--caps);
	text-transform: uppercase;
	color: color-mix(in srgb, var(--wp--preset--color--base-2) 72%, transparent) !important;
}

/* `--2-lg`, nicht `--2lg`: WordPress schreibt Slugs mit Ziffer in
 * kebab-case. Die falsche Variable liess den Preis auf Fliesstextgroesse
 * fallen (17.5px statt 22 bis 27px, Pruefung 21.09.2026). */
.ff-wb-paket .ff-wb-kosten__preis {
	font-size: var(--wp--preset--font-size--2-lg);
}

.ff-wb-paket__aktion {
	padding-top: 0.375rem;
}

.ff-wb-kosten .is-style-secondary .wp-block-button__link {
	color: var(--wp--preset--color--base-2);
	border-color: color-mix(in srgb, var(--wp--preset--color--base-2) 45%, transparent);
}

.ff-wb-kosten .is-style-secondary .wp-block-button__link:hover {
	background: var(--wp--preset--color--base-2);
	color: var(--wp--preset--color--contrast);
	border-color: var(--wp--preset--color--base-2);
}

.ff-wb-kosten__separat {
	margin-top: var(--wp--preset--spacing--sm) !important;
	padding-top: var(--wp--preset--spacing--sm);
	border-top: 1px solid color-mix(in srgb, var(--wp--preset--color--base-2) 18%, transparent);
}

.ff-wb-kosten__separat a {
	color: var(--wp--preset--color--cta);
}

/* Handy-Menue: Unterpunkte kleiner als die Hauptpunkte (Gespraech
 * 21.09.2026). Vorher standen „Weiterbildung Mikrobiom" usw. in derselben
 * 1,625rem-Playfair wie „Praxis Bauchgefuehl" — die Gliederung ging
 * verloren, und die langen Namen brachen um. */
.ff-header .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__submenu-container {
	gap: 0.5rem;
	padding-top: 0.625rem !important;
}

.ff-header .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__submenu-container a {
	font-family: var(--wp--preset--font-family--body);
	font-size: 1.0625rem;
	letter-spacing: 0;
}

/* --- Video-Vorschau (SRF-Beitrag, 21.09.2026) ---
 * 16:9, Standbild mit rundem Abspielknopf in der Mitte. Nach dem Klick
 * sitzt der Player im selben Rahmen. */
.ff-video {
	position: relative;
	aspect-ratio: 16 / 9;
	border-radius: var(--wp--custom--radius--media);
	overflow: hidden;
	background: var(--wp--preset--color--contrast);
	box-shadow: 0 14px 40px rgba(36, 48, 30, 0.14);
}

.ff-video__start,
.ff-video iframe {
	position: absolute;
	inset: 0;
	display: block;
	width: 100%;
	height: 100%;
	border: 0;
}

.ff-video__start img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	transition: transform 0.6s ease;
}

.ff-video__knopf {
	position: absolute;
	left: 50%;
	top: 50%;
	width: 4.5rem;
	height: 4.5rem;
	transform: translate(-50%, -50%);
	border-radius: 50%;
	background: color-mix(in srgb, var(--wp--preset--color--base-2) 90%, transparent);
	box-shadow: 0 8px 24px rgba(36, 48, 30, 0.25);
	transition: transform 0.3s ease, background 0.3s ease;
}

.ff-video__knopf::after {
	content: "";
	position: absolute;
	left: 54%;
	top: 50%;
	transform: translate(-50%, -50%);
	border-top: 0.75rem solid transparent;
	border-bottom: 0.75rem solid transparent;
	border-left: 1.2rem solid var(--wp--preset--color--contrast);
}

.ff-video__start:hover .ff-video__knopf,
.ff-video__start:focus-visible .ff-video__knopf {
	transform: translate(-50%, -50%) scale(1.08);
	background: var(--wp--preset--color--cta);
}

.ff-video__start:hover img {
	transform: scale(1.02);
}

.ff-video__start:focus-visible {
	outline: 3px solid var(--wp--preset--color--accent-dark);
	outline-offset: -3px;
}

.ff-video__hinweis {
	margin: 0.625rem 0 0 !important;
	font-size: var(--wp--preset--font-size--xs);
	color: var(--wp--preset--color--muted-dark);
}

.ff-video-spalte {
	min-width: 0;
}

.ff-video-spalte--mittig {
	margin-top: var(--wp--preset--spacing--lg) !important;
}

.ff-video-spalte--mittig .ff-video__hinweis {
	text-align: center;
}

/* Der Text steht im DOM vor dem Video (Ueberschrift, dann Video: gleiche
 * Reihenfolge fuer Tastatur und Screenreader wie auf dem Handy). Auf
 * breiten Schirmen rueckt das Video nach links, wie auf der alten Website. */
@media (min-width: 64em) {
	.ff-textbild--video-links > .ff-video-spalte {
		grid-column: 1;
		grid-row: 1;
	}
}

/* --- Vierspalter auf schmaleren Schirmen zweispaltig (21.09.2026) ---
 * Zwischen 1024 und 1280px standen vier Karten nebeneinander, 228 bis
 * 274px breit (Medien auf /wissen/, Praxisband, Abende und Module auf
 * /fuer-fachpersonen/). Darunter greift ohnehin die Stapelregel (8.
 * Kartenraster stapeln). Getroffen werden Raster mit genau vier Kindern. */
@media (min-width: 64em) and (max-width: 79.99em) {
	main .wp-block-group.is-layout-grid:has(> :nth-child(4):last-child) {
		grid-template-columns: repeat(2, minmax(0, 1fr));
	}
}

/* --- Faktorenkreis: Spirale kleiner, Icons groesser (21.09.2026) ---
 * Jelina: „Icons sehen im Verhaeltnis recht klein aus". Spirale 8,2 auf
 * 6,5rem, Icons 30 auf 40px. Der Anker des Faktors ist die Icon-Mitte,
 * deshalb waechst der Versatz mit (halbe Icongroesse). */
.ff-kreis__marke {
	width: 6.5rem;
}

.ff-kreis__faktor {
	transform: translate(-50%, -1.25rem);
}

@media (prefers-reduced-motion: no-preference) {
	.ff-kreis__faktor:hover {
		transform: translate(-50%, -1.25rem) scale(1.12);
	}
}

.ff-kreis__faktor .ff-ci-icon {
	width: 2.5rem;
}

.ff-kreis__label {
	font-size: 0.875rem;
}

/* Handy: keine Spirale, die Faktoren als Reihe — dort noch etwas groesser. */
@media (max-width: 600px) {
	.ff-kreis__faktor .ff-ci-icon {
		width: 2.75rem;
	}

	.ff-kreis__label {
		font-size: 0.9375rem;
	}

	.ff-kreis__faktor,
	.ff-kreis__faktor:hover {
		transform: none;
		width: 6.25rem;
	}
}

/* --- Hinweisband ganz oben (Praxisseite, 22.09.2026) ---
 * „Du bist hier richtig. Praxis Bauchgefühl gehört jetzt zu Flora & Flow." (Text seit 01.10.2026) Schmales Band in Rosmarin
 * vor der Kopfzeile, rechts ein Kreuz zum Schliessen. Ersetzt den runden
 * Aufkleber im Hero vom 21.09. Ausgabe und Speichern: inc/hinweisband.php,
 * theme.js (hinweisbandStarten). */
/* KEIN z-index: Das Band steht im Fluss vor .wp-site-blocks und wird von
 * nichts ueberlagert. Mit z-index 60 lag es ueber dem offenen Handy-Menue
 * (das im Stapelkontext der Kopfzeile, z-index 50, steckt) und deckte bei
 * 320px dessen Schliessen-Knopf zu (Pruefung 22.09.2026). */
.ff-hinweisband {
	position: relative;
	padding: 0.5rem 3rem;
	background: var(--wp--preset--color--contrast);
	color: var(--wp--preset--color--base-2);
	text-align: center;
}

.ff-hinweisband[hidden] {
	display: none;
}

.ff-hinweisband__text {
	margin: 0;
	font-size: 0.875rem;
	line-height: 1.4;
	letter-spacing: 0.01em;
}

/* Der neue Name bleibt beisammen; wird es eng, bricht die Zeile davor. */
.ff-hinweisband__text strong {
	font-weight: 600;
	white-space: nowrap;
}

.ff-hinweisband__zu {
	position: absolute;
	top: 50%;
	right: 0.5rem;
	width: 2rem;
	height: 2rem;
	padding: 0;
	border: 0;
	border-radius: 50%;
	background: transparent;
	color: inherit;
	cursor: pointer;
	transform: translateY(-50%);
	transition: background var(--wp--custom--transition--base);
}

.ff-hinweisband__zu:hover {
	background: color-mix(in srgb, var(--wp--preset--color--base-2) 14%, transparent);
}

.ff-hinweisband__zu::before,
.ff-hinweisband__zu::after {
	content: "";
	position: absolute;
	left: 50%;
	top: 50%;
	width: 0.875rem;
	height: 1.5px;
	background: currentColor;
	transform: translate(-50%, -50%) rotate(45deg);
}

.ff-hinweisband__zu::after {
	transform: translate(-50%, -50%) rotate(-45deg);
}

/* Minze auf Rosmarin: 7:1. Die Grundregel (Matcha Dunkel) waere hier
 * kaum zu sehen. */
.ff-hinweisband__zu:focus-visible {
	outline: 2px solid var(--wp--preset--color--cta);
	outline-offset: 1px;
}

/* Die Kopfzeile liegt auf der Praxisseite absolut im Hero. Ohne diesen
 * Bezugsrahmen saesse sie an der Oberkante des Dokuments, also auf dem
 * Band. So setzt sie unter dem Band an und rueckt nach dem Schliessen
 * wieder ganz nach oben. */
.ff-hat-hinweisband .wp-site-blocks {
	position: relative;
}

@media (max-width: 47.99em) {
	.ff-hinweisband {
		padding: 0.4375rem 2.75rem;
	}

	.ff-hinweisband__text {
		font-size: 0.8125rem;
	}

	.ff-hinweisband__zu {
		right: 0.375rem;
	}
}

/* Kontrastmodus: Das Kreuz ist mit Hintergrundfarbe gemalt, die der
 * Browser dort durch die Flaechenfarbe ersetzt. Ohne diese Regel waere der
 * einzige Weg, das Band zu schliessen, unsichtbar. */
@media (forced-colors: active) {
	.ff-hinweisband__zu {
		border: 1px solid ButtonText;
	}

	.ff-hinweisband__zu::before,
	.ff-hinweisband__zu::after {
		background: ButtonText;
	}
}

@media print {
	.ff-hinweisband {
		display: none;
	}
}

/* --- Terminbuchung (21.09.2026) --- */
.ff-termin__rahmen {
	display: block;
	width: 100%;
	height: 56rem;
	border: 0;
	border-radius: var(--wp--custom--radius--card);
	background: var(--wp--preset--color--base-2);
	box-shadow: 0 10px 30px rgba(36, 48, 30, 0.08);
}

.ff-termin__ausweg {
	margin-top: 0.75rem !important;
	font-size: var(--wp--preset--font-size--xs);
	color: var(--wp--preset--color--muted-dark);
	text-align: center;
}

@media (max-width: 47.99em) {
	.ff-termin__rahmen {
		height: 64rem;
	}
}

/* --- Kontakt: Buchungsblock mit Kontur (21.09.2026) ---
 * Vorher Rosmarin mit heller Schrift. Jetzt Schlagrahm mit Rand in Matcha;
 * die Farbregeln fuer den dunklen Grund (Ueberschrift Sand, Text muted)
 * werden hier zurueckgestellt. */
.ff-kontakt__buchen.ff-kontakt__buchen {
	border: 2px solid var(--wp--preset--color--accent);
	box-shadow: none;
}

.ff-kontakt__buchen.ff-kontakt__buchen :is(h2, h3) {
	color: var(--wp--preset--color--contrast);
}

.ff-kontakt__buchen.ff-kontakt__buchen p {
	color: var(--wp--preset--color--body-soft);
}

.ff-kontakt__buchen.ff-kontakt__buchen p a {
	color: var(--wp--preset--color--accent-dark);
}

/* --- Zeitstrahl: Punkte genau auf der Linie (21.09.2026) ---
 * Jelina: „Die Kreise sind nicht ganz zentriert." Nachgerechnet: Die Linie
 * ist 2px breit, ihre Mitte liegt 1px rechts vom Listenrand. Der 14px-Punkt
 * sass mit -3,19rem bei -0,04px — also einen Pixel links daneben. Jetzt
 * aus denselben Groessen gerechnet statt als Zahl: Einzug der Liste plus
 * halbe Punktbreite minus halbe Linienbreite.
 *
 * Breitere Markenspalte, seit „Praxis Bauchgefühl" eine Station ist. */
.ff-weg-liste__station::before {
	left: calc(-2.75rem - 0.4375rem + 1px);
}

@media (min-width: 48em) {
	.ff-weg-liste__station {
		grid-template-columns: 9.5rem 1fr;
	}
}

/* Bild von oben verankern, wenn der Rahmen es beschneidet (Freizeitbild auf
 * Über mich: der erhobene Arm soll bleiben). */
.ff-bild--oben img {
	object-position: 50% 0 !important;
}

/* --- Text-Bild-Abschnitte auf Tablet und Handy (23.09.2026) ---
 * Lucas: „Tablet klappt bei den Bildern noch nicht so geil". Unter 64em
 * stehen Text und Bild untereinander, das Bild lief dabei ueber die volle
 * Breite, die Hoehe blieb aber bei clamp(22rem, 42vw, 40rem) bzw. der
 * flachen Podcast-Variante. Gemessen bei 834px: 746 x 352px fuer ein
 * Hochformat 4:5, sichtbar nur 38 Prozent des Bildes (Podcast 31 Prozent),
 * die Koepfe waren abgeschnitten (Praxis „Was dich erwartet", Ueber mich,
 * Podcast auf Wissen).
 *
 * Jetzt behaelt das Bild dort sein eigenes Seitenverhaeltnis (die Motive
 * sind alle 4:5) und wird auf 30rem begrenzt und mittig gesetzt, damit es
 * auf dem Tablet nicht den ganzen Schirm fuellt. Auf dem Handy ist die
 * Spalte ohnehin schmaler als 30rem. */
@media (max-width: 63.99em) {
	.ff-textbild__bild {
		width: 100%;
		max-width: 30rem;
		margin-inline: auto;
	}

	.ff-textbild__bild img,
	.ff-textbild__bild--flach img {
		height: auto;
	}
}

/* --- Karte zur Praxis (Kontakt, 23.09.2026) ---
 * Google Maps im Kartenradius, nachgeladen kurz vor dem Sichtbereich
 * (inc/karte.php, theme.js). Bis die Karte da ist, steht die Sandflaeche. */
/* Breites Band unter Formular und Adresse: flach auf dem Rechner, auf
 * Tablet und Handy hoeher, damit die Umgebung erkennbar bleibt. */
.ff-kontakt__ort {
	margin-top: var(--wp--preset--spacing--xl) !important;
}

.ff-karte {
	position: relative;
	aspect-ratio: 4 / 3;
	border-radius: var(--wp--custom--radius--card);
	overflow: hidden;
	background: var(--wp--preset--color--surface-sand);
	box-shadow: var(--wp--preset--shadow--card);
}

@media (min-width: 48em) {
	.ff-karte {
		aspect-ratio: 16 / 9;
	}
}

@media (min-width: 64em) {
	.ff-karte {
		aspect-ratio: 3 / 1;
	}
}

.ff-karte iframe {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	border: 0;
}

.ff-karte__hinweis {
	margin: 0.75rem 0 0;
	color: var(--wp--preset--color--body-soft);
	font-size: var(--wp--preset--font-size--xs);
}

/* Matcha Dunkel wie „Details zur Kostenübernahme" im selben Block: Die
 * globale Linkfarbe kam auf dem Sand nur auf 3,6:1. */
.ff-karte__hinweis a {
	color: var(--wp--preset--color--accent-dark);
	font-weight: 600;
}

.ff-karte__hinweis a:hover {
	color: var(--wp--preset--color--contrast);
}

/* --- Kontakt: Abstand über dem Absendeknopf, gleich hohe Spalten (23.09.2026) ---
 * Lucas: „more padding to the text above. Can we have both columns have
 * the same height". Zwischen Einwilligung und Knopf lagen 6px, zwischen den
 * Feldern 22px; der Knopf klebte am Text. Jetzt mindestens 30px.
 *
 * Gleiche Höhe ab 64em, wo die Spalten nebeneinander stehen: Das Raster
 * streckt beide auf die höhere. Den gewonnenen Platz im Formular nimmt der
 * Abstand zwischen Einwilligung und Knopf (Lucas: „not the button. then
 * margin between text and button"), der Knopf steht damit unten bündig mit
 * der Adresskarte. Nachrichtenfeld und Knopf behalten ihre Grösse.
 * Ist einmal das Formular höher, füllt rechts die Adresskarte den Rest. */
.ff-form--kontakt button[type="submit"] {
	margin-top: 1.5rem;
}

@media (min-width: 64em) {
	.ff-kontakt {
		align-items: stretch;
	}

	.ff-kontakt__spalte {
		grid-template-rows: auto 1fr;
	}

	.ff-kontakt__karte.ff-kontakt__karte {
		display: flex;
		flex-direction: column;
	}

	.ff-kontakt__karte .ff-form--kontakt {
		display: flex;
		flex: 1 1 auto;
		flex-direction: column;
	}

	/* Mindestabstand über dem Knopf trägt die Einwilligung, den Rest das
	 * `margin-top: auto` des Knopfs. */
	.ff-form--kontakt .ff-form__check {
		margin-bottom: 1.875rem;
	}

	/* `height: auto`: WordPress gibt .wp-block-button__link `height: 100%`.
	 * Im gestreckten Formular hat das plötzlich eine Bezugshöhe, und der
	 * Knopf wurde 91px hoch. */
	.ff-form--kontakt button[type="submit"] {
		align-self: flex-start;
		flex: 0 0 auto;
		height: auto;
		margin-top: auto;
	}
}

/* --- Newsletter-Zustimmung beim Buchungsknopf (24.09.2026) ---
 * Setzt theme.js (newsletterZustimmung) ein. Klein und ruhig, aber lesbar:
 * Sie soll gesehen werden, ohne mit dem Knopf zu konkurrieren. */
.ff-nl-zustimmung {
	display: flex;
	flex-wrap: wrap;
	align-items: baseline;
	gap: 0.25rem 0.5rem;
	margin: var(--wp--preset--spacing--sm) 0 0 !important;
	font-size: var(--wp--preset--font-size--xs);
	line-height: 1.5;
	color: var(--wp--preset--color--body-soft);
}

.ff-nl-zustimmung__feld {
	flex: 0 0 auto;
	width: 1.05rem;
	height: 1.05rem;
	margin: 0;
	transform: translateY(0.15rem);
	accent-color: var(--wp--preset--color--accent-dark);
	cursor: pointer;
}

.ff-nl-zustimmung label {
	flex: 1 1 12rem;
	cursor: pointer;
}

.ff-nl-zustimmung a {
	color: var(--wp--preset--color--accent-dark);
	font-weight: 600;
}

/* Auf der dunklen Kostenkarte hell. */
.ff-wb-kosten .ff-nl-zustimmung {
	color: color-mix(in srgb, var(--wp--preset--color--base-2) 82%, transparent);
}

.ff-wb-kosten .ff-nl-zustimmung__feld {
	accent-color: var(--wp--preset--color--cta);
}

.ff-wb-kosten .ff-nl-zustimmung a {
	color: var(--wp--preset--color--cta);
}

/* --- Zurueck nach oben (Jelina 28.09.2026) ---
 * Minze-Kreis mit Rosmarin-Pfeil wie die Buttons (7,35:1), unten rechts,
 * ueber dem Inhalt, aber unter Menue und Hinweisen (z-index 50). */
.ff-nach-oben {
	position: fixed;
	right: max(1rem, env(safe-area-inset-right));
	bottom: max(1rem, env(safe-area-inset-bottom));
	z-index: 40;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 3rem;
	height: 3rem;
	padding: 0;
	border: 0;
	border-radius: 999px;
	background: var(--wp--preset--color--cta);
	color: var(--wp--preset--color--contrast);
	box-shadow: 0 6px 18px rgba(36, 48, 30, 0.18);
	cursor: pointer;
	transition: background-color 0.2s ease, transform 0.2s ease;
}

.ff-nach-oben[hidden] {
	display: none;
}

.ff-nach-oben:hover {
	background: var(--wp--preset--color--cta-hover);
	transform: translateY(-2px);
}

.ff-nach-oben:focus-visible {
	outline: 2px solid var(--wp--preset--color--contrast);
	outline-offset: 3px;
}

@media (prefers-reduced-motion: reduce) {
	.ff-nach-oben,
	.ff-nach-oben:hover {
		transition: none;
		transform: none;
	}
}

/* --- Vorträge auf /events/ (Jelina 28.09.2026) ---
 * Aufbau wie die Onlinekurse; rechts im Kopf ein Bild statt der
 * Eignungskarte, die Karten tragen Datum und Eckdaten. */
.ff-kursformat__bild {
	margin: 0;
}

.ff-kursformat__bild img {
	display: block;
	width: 100%;
	height: auto;
	aspect-ratio: 4 / 3;
	object-fit: cover;
	border-radius: var(--wp--custom--radius--card);
	box-shadow: var(--wp--preset--shadow--card);
}

@media (min-width: 64em) {
	.ff-kursformat--bild {
		align-items: center;
	}
}

.ff-vortrag .ff-onlinekurs__text {
	display: flex;
	flex-direction: column;
	flex: 1 1 auto;
	gap: 1rem;
}

.ff-vortrag .ff-onlinekurs__text > * {
	margin-block: 0;
}

.ff-vortrag .ff-onlinekurs__text > .ff-onlinekurs__aktion {
	margin-top: auto;
}

.ff-vortrag__datum {
	margin: 0;
	color: var(--wp--preset--color--accent-dark);
	font-weight: 600;
	letter-spacing: 0.02em;
}

.ff-vortrag__fakten {
	margin: 0;
	padding: 0;
	list-style: none;
	color: var(--wp--preset--color--body);
}

.ff-vortrag__fakten li + li {
	margin-top: 0.35rem;
}

.ff-vortrag__fakten strong {
	color: var(--wp--preset--color--contrast);
	font-weight: 600;
}

.ff-vortrag__bald {
	color: var(--wp--preset--color--muted-dark);
	font-style: italic;
}
