/**
 * GreenGood Hero — full-bleed, Bubble-Canvas + Wort + CTA.
 *
 * Layout-Plan (v3):
 *   - .gg-hero ist *exakt* 100svh. Kein Wachstum darunter; USPs leben in
 *     einer eigenen Section direkt unterhalb (siehe hero-usps Pattern).
 *   - Stacking innerhalb von .gg-hero per DOM-Reihenfolge, KEINE z-indexes
 *     auf media/canvas/content. Damit bleibt die .gg-hero das einzige
 *     Stacking-Context-Element und `mix-blend-mode: difference` auf dem
 *     Hero-Wort sieht den darunter liegenden Canvas + Video.
 *   - Auf Mobile darf das Hero-Wort full-bleed werden (random Padding kann
 *     es nicht clippen).
 *
 * CSS-Variables werden in <head> via inline-Style aus dem Customizer
 * gesetzt (`inc/customizer.php` → `greengood_print_hero_vars`).
 */

/* Fallback-Defaults wenn der Customizer-Inline-Style fehlt. Werden via
   greengood_print_hero_vars im <head> (Priority 20, also NACH den CSS-
   Linktags) überschrieben — Customizer-Slider gewinnen. */
:root {
	--gg-logo-size: 2.8rem;
	--gg-word-size: 78vw;
	--gg-word-blend: difference;
	--gg-sub-shadow: 0.55;
}

.gg-hero {
	position: relative;
	isolation: isolate;   /* macht .gg-hero zum Blending-Anker */
	/* Flex-Column statt fixer Höhe: der zentrale Stack (Logo/Sub/CTA) und die
	   USP-Boxen liegen im normalen Fluss untereinander, NICHT mehr absolut
	   übereinander. min-height füllt den ersten Screen; reicht der Platz nicht
	   (flache/kleine Displays), wächst der Hero einfach mit → kein Overlap. */
	display: flex;
	flex-direction: column;
	min-height: 100vh;    /* Fallback für Browser ohne svh-Support */
	min-height: 100svh;   /* exakt, ohne URL-Bar-Wackeln auf Mobile */
	overflow: clip;
	background: var(--wp--preset--color--base);
	color: var(--wp--preset--color--contrast);
}

/* --- Layer 0: Media (Video oder Background-Fill) --------------------- */
.gg-hero__media {
	position: absolute;
	inset: 0;
	background: var(--wp--preset--color--base);
	/* KEIN z-index — Stack via DOM-Reihenfolge, sonst bricht mix-blend-mode */
}

/* Self-hosted <video> — object-fit löst das „schwarzer Balken"-Problem
   sauber, weil das Browser-Native ist (keine cross-origin iframe-Tricks). */
.gg-hero__video--file {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	object-fit: cover;
	border: 0;
	opacity: 0.55;
	pointer-events: none;
	background: var(--wp--preset--color--base);
}

/* YouTube-iframe — Cover-Trick: über-skalieren auf volle Deckung + zentrieren.
   +2px Sicherheitsmarge gegen Subpixel-Rundungs-Bars. Das YouTube-Titel-Overlay
   wird NICHT durch Reinzoomen versteckt (zu viel Crop), sondern durch die
   Top-Maske unten (.gg-hero__media::after). pointer-events:none unterdrückt
   zusätzlich jedes Hover-UI. */
.gg-hero__video--yt {
	position: absolute;
	top: 50%; left: 50%;
	width: calc(max(100vw, 100svh * 16 / 9) + 2px);
	height: calc(max(100svh, 100vw * 9 / 16) + 2px);
	transform: translate(-50%, -50%);
	border: 0;
	opacity: 0.42;
	pointer-events: none;
	background: var(--wp--preset--color--base);
}

/* Top-Maske: verdeckt YouTubes Titel-Overlay + Buttons (sitzen oben am Player),
   ohne ins Video zu zoomen. Liegt im Media-Layer ÜBER dem iframe, aber UNTER
   Canvas/Content (DOM-Reihenfolge) — die Bubbles bleiben also sichtbar. Sieht
   wie ein bewusster Hero-Verlauf aus und hebt Logo/Menü oben besser ab.
   Greift nur sichtbar, wenn ein Video läuft; sonst Verlauf über Base = unsichtbar. */
.gg-hero__media::after {
	content: "";
	position: absolute;
	top: 0;
	left: 0;
	right: 0;
	height: clamp(90px, 18vh, 200px);
	background: linear-gradient(
		to bottom,
		var(--wp--preset--color--base) 0%,
		color-mix(in oklab, var(--wp--preset--color--base) 55%, transparent) 50%,
		transparent 100%
	);
	pointer-events: none;
}

/* --- Layer 1: Bubble-Shader Canvas ----------------------------------- */
.gg-hero__canvas {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	display: block;
	opacity: 0;
	transition: opacity 1200ms ease-out;
	pointer-events: none;
	/* KEIN z-index */
}
.gg-hero__canvas.is-active { opacity: 1; }

/* --- Layer 2: Content ------------------------------------------------- */
/* Höhe = 100% von .gg-hero. Grid mit 1fr/auto/1fr → Content vertikal
   zentriert, Header-Padding oben + Scroll-Hint-Reserve unten. */
.gg-hero__content {
	position: relative;     /* z-index: auto — KEIN neuer Stacking Context */
	flex: 1 1 auto;         /* füllt den verfügbaren Hero-Raum; USPs kommen darunter */
	min-height: 0;
	display: grid;
	grid-template-rows: 1fr auto 1fr;
	padding:
		clamp(5rem, 9vw, 7rem)
		clamp(1rem, 3vw, 3rem)
		clamp(3rem, 5vh, 4.5rem);
}

.gg-hero__center {
	grid-row: 2;
	align-self: center;
	display: grid;
	justify-items: center;
	gap: clamp(0.6rem, 1.2vw, 1.2rem);
	text-align: center;
	width: 100%;
	max-width: 1600px;
	margin-inline: auto;
}

.gg-hero__center > * { margin-inline: auto; }

/* Das Hero-Wort ist jetzt das GreenGood-Logo. Das <h1> ist der semantische
   Container, das <img> drin trägt den Brand-Namen als alt-Text. Breite via
   --gg-word-size (Customizer-Slider „Hero-Logo Breite"). Mix-blend-mode
   wirkt sauber nur wenn die PNG Alphakanal hat. */
.gg-hero__word {
	margin: 0;
	display: flex;
	justify-content: center;
	align-items: center;
	/* Breite kommt aus dem Customizer (--gg-word-size). ZUSÄTZLICH an die
	   Viewport-Höhe gedeckelt: Logo-Seitenverhältnis ist ~2.62:1, also begrenzt
	   `40vh * 2.62` die Logo-Höhe auf ~40vh. Auf flachen Screens schrumpft das
	   Logo damit automatisch mit und drängt Sub/CTA/USPs nicht aus dem Bild. */
	width: min(var(--gg-word-size, 78vw), calc(40vh * 2.62));
	max-width: 1200px;
	mix-blend-mode: var(--gg-word-blend);
}

.gg-hero__word img {
	width: 100%;
	height: auto;
	display: block;
}

.gg-hero__sub {
	font-size: clamp(0.95rem, 1.3vw, 1.2rem);
	font-weight: 400;
	line-height: 1.45;
	color: var(--wp--preset--color--muted);
	margin: 0 auto;
	max-width: 52ch;
	text-wrap: balance;
	text-shadow:
		0 1px 2px rgba(0, 0, 0, calc(var(--gg-sub-shadow) * 0.9)),
		0 4px 18px rgba(0, 0, 0, calc(var(--gg-sub-shadow) * 0.6));
}

.gg-hero__sub strong {
	color: var(--wp--preset--color--contrast);
	font-weight: 500;
}

.gg-hero__cta {
	display: flex;
	gap: clamp(0.6rem, 1.2vw, 1rem);
	justify-content: center;
	flex-wrap: wrap;
	margin-top: clamp(0.4rem, 0.8vw, 0.8rem);
}

.gg-hero__cta a {
	display: inline-flex;
	align-items: center;
	gap: 0.5em;
	padding: 0.85em 1.6em;
	border-radius: 999px;
	font-weight: 600;
	font-size: clamp(0.85rem, 1vw, 0.95rem);
	text-decoration: none;
	transition: transform 220ms cubic-bezier(0.2, 0.7, 0.2, 1),
	            background-color 220ms ease,
	            color 220ms ease;
}

.gg-hero__cta a[data-variant="primary"] {
	background: var(--wp--preset--color--contrast);
	color: var(--wp--preset--color--base);
}
.gg-hero__cta a[data-variant="primary"]:hover { transform: translateY(-2px); }

.gg-hero__cta a[data-variant="ghost"] {
	background: transparent;
	color: var(--wp--preset--color--contrast);
	box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--wp--preset--color--contrast) 30%, transparent);
}
.gg-hero__cta a[data-variant="ghost"]:hover {
	background: color-mix(in oklab, var(--wp--preset--color--contrast) 10%, transparent);
	transform: translateY(-2px);
}

/* --- Scroll-Hint ----------------------------------------------------- */
.gg-hero__scroll {
	position: absolute;
	left: 50%;
	bottom: clamp(1rem, 2vw, 1.75rem);
	transform: translateX(-50%);
	font-size: 0.7rem;
	letter-spacing: 0.22em;
	text-transform: uppercase;
	color: color-mix(in oklab, var(--wp--preset--color--contrast) 45%, transparent);
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 0.5rem;
	pointer-events: none;  /* unterhalb klickbarer Content-Anker */
}

.gg-hero__scroll::after {
	content: "";
	display: block;
	width: 1px;
	height: 28px;
	background: linear-gradient(to bottom,
		color-mix(in oklab, var(--wp--preset--color--contrast) 60%, transparent),
		transparent);
	animation: gg-scroll-pulse 2.4s ease-in-out infinite;
}

@keyframes gg-scroll-pulse {
	0%, 100% { transform: scaleY(0.4); transform-origin: top; opacity: 0.4; }
	50%      { transform: scaleY(1);   transform-origin: top; opacity: 1; }
}

/* --- Mobile ---------------------------------------------------------- */
/* Hero-Wort full-bleed: Content-Padding inline auf 0, Word direkt an die
   Viewport-Kanten gerückt. Sub/CTA bekommen eigenes Inline-Padding. */
@media (max-width: 720px) {
	.gg-hero__content {
		padding-inline: 0;
		padding-top: clamp(4.5rem, 16vw, 6rem);
		padding-bottom: clamp(2rem, 6vh, 3rem);
		/* Zentraler Stack (Logo/Sub/CTA) füllt auf Mobile den GANZEN ersten Screen,
		   damit das Logo maximal Luft bekommt. Die USP-Absätze rutschen dadurch
		   unter den Fold und erscheinen erst beim Runterscrollen. */
		min-height: 100svh;
	}
	/* Der Hero ist auf Mobile höher als ein Screen (Content 100svh + USPs darunter).
	   Damit das Hintergrund-Video NICHT über den ganzen gewachsenen Hero gestreckt
	   wird, sondern oben bleibt und exakt den ersten Screen abdeckt: Media-Layer auf
	   100svh deckeln, oben verankert. Das innenliegende <video> (inset:0) und die
	   Top-Maske folgen automatisch, da sie sich auf .gg-hero__media beziehen. Der
	   Bereich hinter den USPs zeigt dann die Basis-Hintergrundfarbe. */
	.gg-hero__media {
		bottom: auto;
		height: 100svh;
	}
	/* Bubble-Shader-Canvas genauso auf den ersten Screen begrenzen, damit die
	   Bubbles mit der Unterkante des Videos/Screens abschließen und nicht in den
	   USP-Bereich darunter laufen. */
	.gg-hero__canvas {
		bottom: auto;
		height: 100svh;
	}
	.gg-hero__center {
		max-width: 100%;
		gap: clamp(0.8rem, 2vw, 1.2rem);
	}
	.gg-hero__word {
		width: calc(100vw - 1rem);
		padding-inline: 0.5rem;
	}
	.gg-hero__sub  {
		font-size: 0.92rem;
		max-width: 32ch;
		padding-inline: 1rem;
	}
	.gg-hero__cta  { gap: 0.5rem; padding-inline: 1rem; }
	.gg-hero__cta a {
		padding: 0.75em 1.3em;
		font-size: 0.85rem;
	}
	.gg-hero__scroll { display: none; }
}

/* -------------------------------------------------------------------------- *
 *  Hero-USPs am unteren Hero-Rand.
 *
 *  Eigener absolut positionierter Layer, damit Position und Padding via
 *  Customizer-CSS-Vars (--gg-usps-bottom / --gg-usps-cols / --gg-usps-py
 *  / --gg-usps-px) live anpassbar bleiben.
 *  KEIN z-index → bleibt im selben Stacking-Context wie der Rest und das
 *  mix-blend-mode am Hero-Word funktioniert weiter.
 * -------------------------------------------------------------------------- */

.gg-hero__usps {
	/* Im normalen Fluss unter dem zentralen Stack (kein absolutes Overlay mehr).
	   --gg-usps-bottom (Customizer-Slider) steuert jetzt den unteren Abstand. */
	/* WICHTIG: position:relative holt die USPs in dieselbe positionierte
	   Paint-Ebene wie .gg-hero__content. Ohne das malt der absolut positionierte,
	   deckende .gg-hero__media-Layer drüber und die USPs verschwinden komplett.
	   z-index:auto → KEIN neuer Stacking-Context, mix-blend am Hero-Wort bleibt. */
	position: relative;
	padding-inline: clamp(1rem, 3vw, 3rem);
	padding-bottom: var(--gg-usps-bottom, 4vh);
	margin-top: auto;     /* schiebt die USPs an den unteren Rand, solange Platz da ist */
	pointer-events: none; /* Block selber lässt Clicks durch zur Bubble */
}

.gg-hero__usps-inner {
	pointer-events: auto;
	/* An die Hero-Logo-Breite gekoppelt: die USP-Boxen sollen nicht breiter
	   wirken als das Logo darüber. --gg-word-size kommt aus dem Customizer
	   (Default 78vw, real oft ~50vw); 1100px deckelt es auf großen Screens. */
	max-width: min(var(--gg-word-size, 50vw), 1100px);
	margin-inline: auto;
	display: grid;
	grid-template-columns: repeat(var(--gg-usps-cols, 2), 1fr);
	gap: clamp(1.25rem, 3vw, 3rem);
	padding: var(--gg-usps-py, 0.5rem) var(--gg-usps-px, 1.5rem);
}

.gg-hero__usp {
	min-width: 0; /* gegen Grid-Overflow bei langen Headings */
}

.gg-hero__usp-h {
	margin: 0 0 0.35rem;
	font-family: var(--wp--preset--font-family--display);
	font-size: clamp(1.1rem, 1.5vw, 1.5rem);
	font-weight: 600;
	letter-spacing: -0.005em;
	line-height: 1.15;
	color: var(--wp--preset--color--contrast);
	text-shadow:
		0 1px 2px rgba(0, 0, 0, calc(var(--gg-sub-shadow, 0.55) * 0.9)),
		0 4px 14px rgba(0, 0, 0, calc(var(--gg-sub-shadow, 0.55) * 0.5));
}

.gg-hero__usp-b {
	margin: 0;
	font-size: clamp(0.88rem, 1.05vw, 1rem);
	line-height: 1.55;
	color: var(--wp--preset--color--muted);
	text-shadow:
		0 1px 2px rgba(0, 0, 0, calc(var(--gg-sub-shadow, 0.55) * 0.85)),
		0 3px 12px rgba(0, 0, 0, calc(var(--gg-sub-shadow, 0.55) * 0.45));
}

.gg-hero__usp-b strong {
	color: var(--wp--preset--color--contrast);
	font-weight: 500;
}

/* Wenn USPs aktiv sind: Scroll-Hint ausblenden (sonst doppeltes Signal am
   unteren Rand). Eine Bottom-Padding-Reserve am Content braucht es nicht mehr —
   die USPs liegen im Fluss, nicht als absolutes Overlay. */
.gg-hero:has(.gg-hero__usps) .gg-hero__scroll {
	display: none;
}

/* Mobile: bei 2-3 Spalten zu eng → single column. Variante „Kompakt & ruhig":
   die beiden USPs stehen gestapelt, durch eine dezente Trennlinie und großzügigen,
   gleichmäßigen Rhythmus getrennt. Der Rhythmus kommt bewusst aus margin/padding/
   border der Items (gap: 0), damit die Trennlinie sauber mittig zwischen den beiden
   Boxen sitzt. Typo etwas ruhiger, mehr Luft unter den Headlines — so wirkt der
   Block schlanker, ohne dass Inhalt verloren geht. */
@media (max-width: 720px) {
	.gg-hero__usps {
		/* etwas dichter an den unteren Rand, damit der Block nicht den halben
		   Screen einnimmt */
		padding-bottom: var(--gg-usps-bottom, 3vh);
		/* Absätze näher an die Unterkante des Videos/ersten Screens ziehen:
		   negativer Top-Margin holt den Block nach oben (überschreibt das
		   margin-top:auto aus der Basis-Regel). Wert nach Gefühl justierbar. */
		margin-top: -5vh;
	}
	.gg-hero__usps-inner {
		grid-template-columns: 1fr;
		gap: 0;
		max-width: 32rem;
		padding-block: 0;
	}
	.gg-hero__usp + .gg-hero__usp {
		margin-top: 1.6rem;
		padding-top: 1.6rem;
		border-top: 1px solid color-mix(in oklab, var(--wp--preset--color--contrast) 14%, transparent);
	}
	.gg-hero__usp-h {
		margin-bottom: 0.6rem;   /* mehr Luft unter der Überschrift zum Fließtext */
		font-size: 1.15rem;
	}
	.gg-hero__usp-b {
		font-size: 0.9rem;
		line-height: 1.5;
		max-width: 36ch;
	}
}

/* Flache Screens (Landscape-Handys, kleine Laptops): Top-Padding und Abstände
   im zentralen Stack zusammenziehen, Sub-Text etwas kleiner — damit der erste
   Screen luftig statt überfüllt wirkt. Höhe-Deckel am Logo greift zusätzlich. */
@media (max-height: 680px) {
	.gg-hero__content {
		padding-top: clamp(3.5rem, 9vh, 5rem);
		padding-bottom: clamp(1.5rem, 4vh, 3rem);
	}
	.gg-hero__center { gap: clamp(0.4rem, 1.4vh, 0.9rem); }
	.gg-hero__sub { font-size: clamp(0.85rem, 1.8vh, 1.05rem); }
	.gg-hero__usps { padding-bottom: clamp(0.75rem, 2vh, 2rem); }
}

@media (prefers-reduced-motion: reduce) {
	.gg-hero__canvas, .gg-hero__cta a, .gg-hero__media video {
		transition: none;
	}
	.gg-hero__cta a:hover { transform: none; }
	.gg-hero__scroll::after { animation: none; }
}
