/* 2HOT2PAY — Startseite. Bauplan §5, §8, §9, §10, §11. */

/* font-display: optional statt swap (Founder-Auftrag 22.09., "kein Aufblitzen"):
   zusammen mit dem <link rel="preload"> im <head> ist Anton praktisch immer vor
   dem ersten Paint da; "optional" verhindert den sichtbaren Schriftwechsel bei
   langsamem Netz, statt nur kurz zu blockieren wie "swap". */
@font-face { font-family: 'Anton'; src: url('../fonts/anton-latin-400.woff2') format('woff2'); font-weight: 400; font-style: normal; font-display: optional; }
@font-face { font-family: 'Geist'; src: url('../fonts/geist-latin-400.woff2') format('woff2'); font-weight: 400; font-style: normal; font-display: swap; }
@font-face { font-family: 'Geist'; src: url('../fonts/geist-latin-500.woff2') format('woff2'); font-weight: 500; font-style: normal; font-display: swap; }
@font-face { font-family: 'Geist'; src: url('../fonts/geist-latin-600.woff2') format('woff2'); font-weight: 600; font-style: normal; font-display: swap; }
@font-face { font-family: 'Geist'; src: url('../fonts/geist-latin-700.woff2') format('woff2'); font-weight: 700; font-style: normal; font-display: swap; }

*, *::before, *::after { box-sizing: border-box; }
html { scroll-behavior: smooth; }
@media (prefers-reduced-motion: reduce) { html { scroll-behavior: auto; } }
/* Lenis (weiches Scrollen, §9/Bauplan-Nachtrag) übernimmt das Scrollen selbst —
   die native CSS-Glättung würde sich sonst mit Lenis' eigenem Rhythmus beißen. */
html.lenis { scroll-behavior: auto; }

html { overflow-x: hidden; }
body {
  margin: 0;
  overflow-x: hidden;
  background: var(--band-night);
  color: var(--foreground);
  font-family: var(--font-body);
  font-size: var(--fs-body);
  line-height: 1.55;
  letter-spacing: -0.005em;
  -webkit-font-smoothing: antialiased;
}

img { max-width: 100%; display: block; }
a { color: inherit; text-decoration: none; }
p, ul, ol, dl, blockquote, figure { margin: 0; }
button { font-family: inherit; }

/* --- Sprunglink --- */
.skip {
  position: absolute; left: 1rem; top: -100px;
  background: var(--pink); color: var(--pink-ink);
  padding: 12px 20px; border-radius: var(--r-pill);
  z-index: 1000; font-family: var(--font-body); font-weight: 700;
}
.skip:focus { top: 1rem; }

:focus-visible { outline: 2px solid var(--pink); outline-offset: 3px; }

/* --- Typografie-Rollen --- */
.eyebrow, .label { font: 700 var(--fs-label)/1 var(--font-body); letter-spacing: 0.06em; text-transform: uppercase; }
/* line-height 1.1 statt der ursprünglich engeren 0.9: bei per-Buchstabe/-Zeile
   animiertem Text (motion.js, SplitText erzeugt inline-block-Wrapper je Zeichen/
   Zeile) schneidet 0.9 die Punkte von "Ü/Ä/Ö" ab — reproduziert im Browser
   22.09. auch mit reinem inline-block ohne SplitText, betrifft also jede
   Überschrift mit Umlaut ("Gespräch", "läuft's", "für", "heiß"), nicht nur den
   Hero-Titel. Zwischenwerte (0.92–1.05) reichten nicht zuverlässig; 1.1 ist der
   kleinste Wert, der die Punkte in jedem Test sicher stehen lässt. */
h1 { font: 400 var(--fs-hero-title)/1.1 var(--font-display); letter-spacing: 0.005em; text-transform: uppercase; margin: 0; }
.display-xl { font: 400 var(--fs-display-xl)/1.1 var(--font-display); letter-spacing: 0.005em; text-transform: uppercase; margin: 0; }
.display, h2 { font: 400 var(--fs-display)/1.1 var(--font-display); letter-spacing: 0.005em; text-transform: uppercase; margin: 0; }
h2.section-title { font-size: var(--fs-h2); }
/* SplitText zerlegt Wörter in einzelne Zeichen-Spans (motion.js); ohne
   white-space:nowrap auf dem Wort-Wrapper darf der Browser mitten im Wort
   umbrechen ("Mach mehr aus deine|m Profil." wurde beobachtet, 22.09.). */
.hero__title .word,
[data-reveal="heading-slant"] .word,
.steps li span .word { white-space: nowrap; }
h3, .h3 { font: 600 var(--fs-h3)/1.15 var(--font-body); letter-spacing: -0.01em; margin: 0; }
.lead { font: 400 var(--fs-lead)/1.4 var(--font-body); letter-spacing: -0.01em; color: var(--muted); margin: 0; }
.small { font-size: var(--fs-small); line-height: 1.5; color: var(--muted); }
.stat { font: 400 var(--fs-stat)/0.9 var(--font-display); letter-spacing: 0; }

/* --- Layout --- */
.wrap { max-width: var(--content-max); margin: 0 auto; padding-left: var(--content-pad); padding-right: var(--content-pad); }

main { display: block; }

.panel {
  position: relative;
  border-radius: var(--r-panel) var(--r-panel) 0 0;
  margin-top: -40px;
  padding: var(--section-space) 0;
  border-top: 1px solid var(--border-strong);
  isolation: isolate;
}
.panel:first-of-type { margin-top: 0; }
.panel--night { background: var(--band-night); }
.panel--graphite { background: var(--band-graphite); }
.panel--smoke { background: var(--band-smoke); }
.panel--ember { background: var(--band-ember); }
.panel--pink { background: var(--band-pink); color: var(--pink-ink); padding-top: var(--sp-12); padding-bottom: var(--sp-12); }
.panel--glow::before {
  content: ''; position: absolute; inset: 0; z-index: -1; pointer-events: none;
  background: radial-gradient(ellipse 60% 40% at 50% 0%, rgba(255, 46, 126, .08), transparent 70%);
}

/* --- Navigation --- */
.nav {
  position: fixed; top: 0; left: 0; right: 0; z-index: 100;
  display: flex; align-items: center; justify-content: space-between;
  padding: var(--sp-4) var(--content-pad);
  transition: background-color .3s var(--ease-out), backdrop-filter .3s var(--ease-out), transform .5s var(--ease-bounce);
}
.nav.nav--solid { background: rgba(17, 17, 19, .85); backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px); }
.nav.nav--hidden { transform: translateY(-110%); }
.nav__brand { display: flex; align-items: center; flex-shrink: 0; }
.nav__logo { display: block; height: 40px; width: auto; }
@media (max-width: 640px) { .nav__logo { height: 34px; } }
.nav__links { display: flex; gap: var(--sp-2); list-style: none; margin: 0; padding: 0; }
.nav__links a {
  display: inline-block; padding: 10px 18px; border-radius: var(--r-pill);
  border: 1px solid var(--border-strong); font: 700 var(--fs-label)/1 var(--font-body);
  letter-spacing: 0.06em; text-transform: uppercase;
}
.nav__links a:hover { border-color: var(--pink-line); color: var(--pink); }
.nav__right { display: flex; align-items: center; gap: var(--sp-3); }
.lang-switch { display: flex; gap: var(--sp-1); font: 700 var(--fs-label)/1 var(--font-body); }
.lang-switch a { padding: 8px 10px; border-radius: var(--r-pill); }
.lang-switch a[aria-current="true"] { background: var(--surface-3); color: var(--foreground); }
.lang-switch a:not([aria-current="true"]) { color: var(--muted); }
.nav__menu-btn { display: none; background: none; border: 1px solid var(--border-strong); border-radius: var(--r-pill); color: var(--foreground); width: 44px; height: 44px; align-items: center; justify-content: center; }

@media (max-width: 900px) {
  .nav__links { display: none; }
  .nav__menu-btn { display: inline-flex; }
}

.mobile-menu {
  position: fixed; inset: 0; z-index: 99; background: var(--band-night);
  display: none; flex-direction: column; align-items: center; justify-content: center; gap: var(--sp-6);
}
.mobile-menu.is-open { display: flex; }
.mobile-menu a { font: 400 2rem/1 var(--font-display); text-transform: uppercase; }

/* --- Botones --- */
.btn {
  position: relative; display: inline-flex; align-items: center; justify-content: center;
  height: 52px; padding: 0 var(--sp-8); border-radius: var(--r-pill);
  font: 700 var(--fs-label)/1 var(--font-body); letter-spacing: 0.06em; text-transform: uppercase;
  border: 2px solid transparent; cursor: pointer; overflow: hidden;
  transition: box-shadow .2s var(--ease-out), transform .15s var(--ease-out), background-color .2s var(--ease-out);
}
.btn:active { transform: scale(.955); }
.btn-primary { background: var(--pink); color: var(--pink-ink); }
.btn-primary:hover { background: var(--pink-hover); box-shadow: var(--glow-pink); }
.btn-ghost { background: transparent; color: var(--foreground); border-color: var(--foreground); }
.btn-ghost:hover { border-color: var(--pink); color: var(--pink); }

/* Knopf-Rolle (A9) — nur Hover-fähige Geräte, Bewegung erlaubt */
.btn[data-roll] span { display: inline-block; }
@media (hover: hover) and (prefers-reduced-motion: no-preference) {
  .btn[data-roll] span {
    transition: transform .3s var(--ease-bounce);
    transform-style: preserve-3d;
  }
  .btn[data-roll]::after {
    content: attr(data-text);
    position: absolute; inset: 0; display: flex; align-items: center; justify-content: center;
    transform: translateY(100%) rotateX(-90deg);
    transition: transform .3s var(--ease-bounce);
  }
  .btn[data-roll]:hover span { transform: translateY(-100%) rotateX(90deg); }
  .btn[data-roll]:hover::after { transform: translateY(0) rotateX(0); }
}

/* --- Link-Unterstrich (A10) --- */
.link-underline { position: relative; display: inline-block; }
.link-underline::after {
  content: ''; position: absolute; left: 0; right: 0; bottom: -2px; height: 1px;
  background: currentColor; transform: scaleX(0); transform-origin: left;
  transition: transform .25s var(--ease-out);
}
.link-underline:hover::after { transform: scaleX(1); }

/* --- Hero --- */
.hero { padding-top: calc(var(--sp-24) + 48px); }

/* --- Video-Loop-Plätze (Higgsfield-Medienplan V1–V3, B1–B4 optional) ---------
   Platzhalter mit festem Verhältnis, damit später ein <video muted loop
   playsinline poster> oder ein Foto eingesetzt werden kann, ohne dass das
   Layout springt. Lazy-Load und "nur Standbild bei reduzierter Bewegung"
   übernimmt das künftige Einbau-Skript — der Platzhalter selbst zeigt ohnehin
   nur ein Standbild, es ist also bereits die reduced-motion-Ausgangslage. */
.media-loop { position: relative; overflow: hidden; background: var(--surface-3); border: 1px solid var(--border); display: flex; align-items: center; justify-content: center; }
.media-loop__placeholder { color: var(--muted-2); font-size: 0.75rem; text-align: center; padding: var(--sp-3); max-width: 22em; }

/* Hero (V1) und Schluss-CTA (V3): volle Fläche hinter Text/Handys, mit
   Abdunklung, damit Kontrast und Lesbarkeit erhalten bleiben. */
.hero__video-loop,
.cta-final__video-loop {
  position: absolute; inset: 0; z-index: 0; border: 0; border-radius: inherit;
}
.hero__video-loop::after,
.cta-final__video-loop::after {
  content: ''; position: absolute; inset: 0;
}
.hero__video-loop::after { background: linear-gradient(180deg, rgba(10, 10, 11, .55), rgba(10, 10, 11, .88)); }
.cta-final__video-loop::after { background: linear-gradient(180deg, rgba(10, 10, 11, .35), rgba(10, 10, 11, .55)); }
.hero .wrap, .cta-final .wrap { position: relative; z-index: 1; }

/* Echte Videos/Fotos in den media-loop-Plätzen: Fläche decken, nicht verzerren. */
.media-loop__video, .media-loop img { width: 100%; height: 100%; object-fit: cover; display: block; }

/* Logo-Animation (#community, Higgsfield v1, Founder-Auftrag 23.09. Runde 5B):
   spielt einmal beim Hinscrollen (kein loop-Attribut), dann blendet das
   Video auf das darunterliegende, echte Badge-PNG über — das KI-Bild im
   letzten Frame ist nicht pixelgenau, das echte Badge schon. Seitenverhältnis
   1270/720 = die tatsächlichen Maße der kodierten Datei, damit object-fit
   nichts beschneidet oder umrandet. Maße des Kreises im Video vermessen:
   mittig, Durchmesser 66,5% der Höhe — die Badge-Kachel bekommt exakt diese
   Größe/Position, damit die Überblendung nicht springt. */
.logo-anim {
  position: relative; overflow: hidden; margin: var(--sp-8) 0;
  aspect-ratio: 1270 / 720; background: var(--band-night);
  border: 1px solid var(--border);
}
.logo-anim__badge {
  position: absolute; top: 50%; left: 50%; height: 66.5%; width: auto;
  transform: translate(-50%, -50%); z-index: 0;
}
.logo-anim__video {
  position: absolute; inset: 0; z-index: 1;
  width: 100%; height: 100%; object-fit: cover; display: block;
  transition: opacity .6s var(--ease-out);
}
.logo-anim__video.is-ended { opacity: 0; }
/* Ohne erlaubte Bewegung läuft initLazyVideo() gar nicht erst los (main.js
   bricht dort selbst ab) — das Video bekommt nie eine src und bliebe sonst
   nur als stehendes Poster-Bild sichtbar. display:none legt zusätzlich die
   Ebene ganz frei, damit ausschließlich das echte Badge steht. */
@media (prefers-reduced-motion: reduce) {
  .logo-anim__video { display: none; }
}
.hero__video-loop, .cta-final__video-loop { display: block; }
.hero__video { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; display: none; }
.hero__video--wide { display: block; }
@media (max-width: 900px) {
  .hero__video--wide { display: none; }
  .hero__video--tall { display: block; }
}
/* --- Hero-Kopf: riesige Überschrift über volle Breite. Die Überschrift ist
   reines CSS ohne JS-Abhängigkeit, damit sie als LCP-Element sofort sichtbar
   ist, auch wenn kein Skript lädt (Bauplan §9-Fund: sieben verkettete
   Nachlade-Skripte hatten sie vorher unsichtbar gehalten). Logo im Hero
   entfernt (Founder-Auftrag 22.09.: nur noch ein Logo im Footer, nicht mehr
   in Nav oder Hero). */
.hero__top { position: relative; }

/* Container Query: die Zeile füllt die Spalte, egal wie breit der Viewport
   jenseits von --content-max ist (Founder: "jetzt ist der ganze Effekt weg",
   die Überschrift soll fast die ganze Spaltenbreite ausfüllen). */
.hero__title { container-type: inline-size; margin: 0 0 var(--sp-8); }
.hero__title-line {
  display: block; white-space: nowrap;
  font-size: clamp(2.2rem, 12.2cqi, 9rem);
}
@media (prefers-reduced-motion: no-preference) {
  html.js .hero__title-line { animation: hero-line-in .9s var(--ease-out) both; }
  html.js .hero__title-line:nth-child(1) { animation-delay: 0s; }
  html.js .hero__title-line:nth-child(2) { animation-delay: .12s; }
  html.js .hero__title-line:nth-child(3) { animation-delay: .24s; }
}
@keyframes hero-line-in { from { opacity: 0; transform: translateY(.4em); } to { opacity: 1; transform: translateY(0); } }

.hero__grid { display: grid; grid-template-columns: minmax(0, 7fr) minmax(240px, 3fr); gap: var(--sp-10); align-items: center; }
.hero__copy { max-width: 48ch; }
.hero__lead { margin-bottom: var(--sp-8); }
/* Eigener abgedunkelter Grund hinter den Hero-Knöpfen (Founder-Auftrag 22.09.,
   Runde 7): der zweite Knopf ist nur ein heller Umriss auf dem Video, dessen
   Helligkeit schwankt. ::before dunkelt gezielt diesen Bereich ab (Verlauf +
   Weichzeichner), unabhängig vom aktuellen Videobild — sicherer als nur die
   Knopffarbe zu ändern. */
.hero__ctas {
  position: relative; isolation: isolate; display: flex; justify-content: center; gap: var(--sp-4); flex-wrap: wrap;
  padding: var(--sp-3); margin: calc(var(--sp-3) * -1);
}
.hero__ctas::before {
  content: ''; position: absolute; inset: 0; z-index: -1; border-radius: var(--r-pill);
  background: linear-gradient(180deg, rgba(10, 10, 11, .35), rgba(10, 10, 11, .7));
  -webkit-backdrop-filter: blur(8px); backdrop-filter: blur(8px);
}
@media (prefers-reduced-motion: no-preference) {
  html.js .hero__lead { animation: hero-line-in .9s var(--ease-out) both; animation-delay: .36s; }
  html.js .hero__ctas { animation: hero-line-in .9s var(--ease-out) both; animation-delay: .46s; }
}

/* --- Ein Handy im Hero, leicht schräg, echte App-Screens im Wechsel --- */
.hero__phone-wrap { position: relative; display: flex; justify-content: center; }
.phone--app { width: 230px; height: 480px; transform: rotate(-7deg); transition: transform .4s var(--ease-out); }
.phone__screen--cycle { position: relative; padding: 0; }
.app-cycle__img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; opacity: 0; transition: opacity 1.1s var(--ease-out); }
.app-cycle__img.is-active { opacity: 1; }
@media (prefers-reduced-motion: no-preference) {
  html.js .phone--app { animation: hero-phone-in 1.3s var(--ease-bounce) both; animation-delay: .22s; }
}
@keyframes hero-phone-in {
  from { opacity: 0; transform: rotate(-7deg) scale(.7) translateY(48px); }
  to { opacity: 1; transform: rotate(-7deg) scale(1) translateY(0); }
}
@media (hover: hover) and (prefers-reduced-motion: no-preference) {
  .phone--app { transform-style: preserve-3d; perspective: 800px; }
}

@media (max-width: 900px) {
  .hero__grid { grid-template-columns: 1fr; }
  .hero__phone-wrap { margin-top: var(--sp-10); padding: 0 var(--sp-4); }
  .hero__copy { max-width: none; }
  .phone--app { width: 200px; height: 418px; transform: rotate(-6deg); }
  @keyframes hero-phone-in {
    from { opacity: 0; transform: rotate(-6deg) scale(.7) translateY(48px); }
    to { opacity: 1; transform: rotate(-6deg) scale(1) translateY(0); }
  }
}

/* --- Phone mockup (§10.1) --- */
.phone {
  position: relative; width: 260px; height: 540px;
  border-radius: var(--r-phone); border: 10px solid #1a1a1d;
  background: var(--background); overflow: hidden;
  box-shadow: 0 30px 60px rgba(0, 0, 0, .5);
}
.phone::before {
  content: ''; position: absolute; top: 10px; left: 50%; transform: translateX(-50%);
  width: 90px; height: 20px; border-radius: 999px; background: #1a1a1d; z-index: 5;
}
.phone__screen { position: absolute; inset: 0; padding: 40px 14px 18px; display: flex; flex-direction: column; gap: 10px; }
@media (max-width: 640px) {
  .phone { width: 220px; height: 458px; }
}

/* Echter Screenshot/Foto in einem einzelnen Handy (So läuft's, Für Creator):
   kein Nachbau, das Bild füllt den Screen randlos. */
.phone__screen--shot { padding: 0; }
.phone__screen--shot img { width: 100%; height: 100%; object-fit: cover; display: block; }
/* Foto statt App-Screen (Für Creator, Founder-Auftrag 22.09.): Ausschnitt so
   gewählt, dass beide Gesichter im schmalen Handy-Format sichtbar bleiben. */
.phone__screen--photo img { object-position: 38% 42%; }

.scan-frame {
  flex: 1; position: relative; overflow: hidden;
  border: 2px dashed var(--pink-line); border-radius: 20px;
  display: flex; align-items: center; justify-content: center;
  background: radial-gradient(circle at center, var(--surface-2), var(--background));
}
/* Statt einer leeren schwarzen Fläche: ein gedämpftes QR-Muster, als würde
   gerade ein Pass gescannt (Founder-Feedback 22.09., "sonst nur Schwarz"). */
.scan-frame::before {
  content: ''; position: absolute; inset: 22%;
  background-color: var(--pink-soft);
  -webkit-mask: url('/images/qr-mock.svg') center / contain no-repeat;
  mask: url('/images/qr-mock.svg') center / contain no-repeat;
  opacity: .4;
}
.scan-frame__mark { position: relative; font: 700 .95rem/1 var(--font-body); color: var(--ok); }
.checkin-list { display: flex; flex-direction: column; gap: 6px; }
.checkin-row { display: flex; align-items: center; gap: 8px; background: var(--surface-2); border: 1px solid var(--border); border-radius: 12px; padding: 6px 10px; }
.checkin-row__avatar { width: 26px; height: 26px; border-radius: 999px; background: var(--pink-soft); border: 1px solid var(--pink-line); display: flex; align-items: center; justify-content: center; font-size: .65rem; font-weight: 700; }
.checkin-row__label { font-size: .75rem; }
.checkin-row__ok { margin-left: auto; color: var(--ok); font-size: .7rem; font-weight: 700; }

/* Business-Handy: Scan-Rahmen + Check-in-Liste + Swipe-Einlösung liegen
   übereinander in einer eigenen Bühne, damit die Swipe-Einlösung die
   anderen beiden kurz überdecken kann, statt das Handy zu sprengen
   (Founder-Auftrag 22.09., passend zu "per Swipe oder QR-Code"). */
.scan-stage { position: relative; flex: 1; display: flex; flex-direction: column; gap: 10px; min-height: 0; }
.swipe-redeem {
  position: absolute; inset: 0; display: flex; align-items: center; justify-content: center;
  opacity: 0; pointer-events: none;
}
.swipe-redeem__card {
  width: 90%; text-align: center; background: var(--surface-2); border: 1px solid var(--pink-line);
  border-radius: var(--r-card); padding: 16px; box-shadow: 0 16px 32px rgba(0, 0, 0, .35);
}
.swipe-redeem__label { margin: 0 0 10px; font: 600 .8rem/1.3 var(--font-body); }
.swipe-redeem__track { position: relative; height: 32px; border-radius: 999px; background: var(--surface-3); border: 1px solid var(--border); overflow: hidden; }
.swipe-redeem__handle { position: absolute; top: 2px; left: 2px; width: 28px; height: 26px; border-radius: 999px; background: var(--pink); }
.swipe-redeem [data-swipe-ok] { display: inline-block; margin-top: 10px; }

/* Handy-Beschriftungen (Creator-App/Venue-Dashboard, "So läuft's") sind nur
   für Screenreader da, nirgends sichtbar (Founder-Auftrag 22.09., Runde 7:
   keine grauen Mini-Bildunterschriften unter den Handys). */
.phone-desc { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }

/* --- Business-Handy: Mockup im App-Look (kein echter Screen vorhanden,
   Founder-Auftrag 22.09.: Location-Name + Monatszahl, muss nicht echt
   aussehen, soll nur zeigen, dass dort Inhalt steckt). --- */
.venue-mock__name { font: 700 1rem/1.2 var(--font-body); margin: 0; }
.venue-mock__metric { font: 400 1.6rem/1.05 var(--font-display); text-transform: uppercase; color: var(--pink); margin: 2px 0 8px; }

/* --- Business-Handy: scannt live (A16 voll) --- */
[data-scan-frame] { position: relative; overflow: hidden; }
[data-scan-mark] { opacity: 0; transition: opacity .3s var(--ease-out); }
[data-scan-line] { position: absolute; left: 10%; right: 10%; top: 12%; height: 2px; border-radius: 2px; background: linear-gradient(90deg, transparent, var(--pink), transparent); opacity: 0; }
[data-scan-frame].is-scanning [data-scan-line] { opacity: 1; animation: h2p-scanline 1.8s ease-in-out infinite; }
@keyframes h2p-scanline { 0%, 100% { top: 12%; } 50% { top: 82%; } }
@media (prefers-reduced-motion: no-preference) {
  html.js [data-scan-mark] { opacity: 0; }
  html.js [data-scan-list] .checkin-row { opacity: 0; transform: translateY(10px); }
}
html.motion-fallback [data-scan-mark],
html.motion-fallback [data-scan-list] .checkin-row { opacity: 1 !important; transform: none !important; }

/* --- Leuchtspur (§5.1) --- */

/* --- Stempel (§5.1) --- */
/* Founder-Auftrag 23.09.: keine Drehung mehr, die Stempel stehen gerade. */
.stamp {
  display: inline-flex; align-items: center; padding: 8px 16px; border-radius: var(--r-pill);
  background: var(--surface-3); border: 1px solid var(--pink-line);
  font: 700 var(--fs-label)/1 var(--font-body); letter-spacing: 0.04em; text-transform: uppercase;
}

/* Diversitäts-Satz im Creator-Abschnitt: normale Textgröße statt "small",
   gut lesbare Farbe, abgesetzt mit pinker Linie (Founder-Auftrag 22.09.,
   Wortlaut bleibt unverändert). Abstand nach unten zum CTA-Knopf, sonst
   klebt der Knopf direkt am Text (Founder-Fund 23.09.). */
.creator-note {
  margin: var(--sp-6) 0 var(--sp-6); padding-left: var(--sp-4);
  border-left: 2px solid var(--pink-line); color: var(--foreground);
}

/* --- Marquee (Abschnitt 2, A13/S6): drei Bänder übereinander, Founder-Feedback
   22.09. — oben/unten nach rechts, Mitte nach links, leicht schräg gestellt. --- */
.marquee-group.panel--pink {
  position: relative; overflow: hidden;
  /* Der nächste Abschnitt ist ein .panel und zieht sich per margin-top:-40px
     mit abgerundeter Oberkante nach oben in den vorherigen Block hinein
     (Stapel-Optik, siehe .panel). Unten deshalb 40px mehr Innenabstand, sonst
     schneidet die Rundung in die dritte Laufschrift-Zeile (Founder-Fund 22.09.). */
  padding-top: var(--sp-8); padding-bottom: calc(var(--sp-8) + 40px);
  display: flex; flex-direction: column; gap: var(--sp-3);
}
.marquee { overflow: hidden; position: relative; display: flex; align-items: center; }
/* Founder-Feedback 22.09.: keine Schräglage mehr, alle drei Bänder waagerecht. */
.marquee__track { display: flex; gap: 2.5rem; white-space: nowrap; will-change: transform; }
.marquee__item { font: 700 1.25rem/1 var(--font-body); letter-spacing: 0.02em; text-transform: uppercase; display: inline-flex; align-items: center; gap: 2.5rem; }
.marquee__heart { width: 14px; height: 14px; display: inline-block; }
.marquee__pause {
  position: absolute; right: var(--content-pad); top: 50%; transform: translateY(-50%);
  width: 36px; height: 36px; border-radius: 999px; border: 1.5px solid var(--pink-ink);
  background: transparent; color: var(--pink-ink); display: flex; align-items: center; justify-content: center; z-index: 3;
}
@media (max-width: 640px) {
  .marquee__item { font-size: 1rem; gap: 1.75rem; }
  .marquee__track { gap: 1.75rem; }
  .marquee__heart { width: 11px; height: 11px; }
}

/* --- Für-wen Karten (Abschnitt 3) --- */
.card-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: var(--sp-6); margin-top: var(--sp-8); perspective: 1400px; }
/* Grundregel für jede Breite, nicht nur mobil (Founder-Fund 23.09., Live-Fehler:
   ohne diese Zeile war .card-grid__track oberhalb von 767px ein eigenes
   Grid-Kind statt unsichtbar fürs Layout, die vier Karten stapelten sich
   dadurch in einer Spalte statt in vier). display:contents macht den Track
   layout-los, die .audience-card-Elemente bleiben direkte Grid-Kinder von
   .card-grid. Die spezifischere Mobil-Regel .card-grid.is-drag-enhanced
   .card-grid__track { display:flex } (unten) gewinnt weiter, sobald der
   Wisch-Slider aktiv ist — hier nichts an der Mobil-Mechanik verändert. */
.card-grid__track { display: contents; }
.audience-card {
  background: var(--surface-2); border: 1px solid var(--border-strong); border-radius: var(--r-card);
  padding: var(--sp-6); display: flex; flex-direction: column; gap: var(--sp-3);
  transition: border-color .2s var(--ease-out);
  transform-style: preserve-3d; backface-visibility: hidden;
}
.audience-card:hover { border-color: var(--pink-line); }
.audience-card:hover .audience-card__arrow { transform: translateX(4px); }
.audience-card__media { aspect-ratio: 4 / 5; border-radius: 16px; background: var(--surface-3); border: 1px solid var(--border); display: flex; align-items: center; justify-content: center; overflow: hidden; }
.audience-card__media img { width: 100%; height: 100%; object-fit: cover; }
.audience-card__placeholder { color: var(--muted-2); font-size: .7rem; text-align: center; padding: var(--sp-3); }
.audience-card p { margin: 0; color: var(--muted); }
.audience-card__arrow { margin-top: auto; font-weight: 700; transition: transform .2s var(--ease-out); }

@media (max-width: 1100px) { .card-grid { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 767px) {
  /* WebKit-Fehler (iPhone Safari, Founder-Fund 23.09.): 3D-Transform-Kontext
     (perspective + preserve-3d/backface-visibility) innerhalb eines horizontal
     scrollenden Containers reißt die Karte an der rechten Kante ab bzw. legt
     eine dunkle Fläche darüber, sichtbar nur auf dem echten Gerät, nicht in
     Chrome/der Emulation. Ab hier wird .card-grid zum Wisch-Container —
     deshalb hier alle 3D-Eigenschaften abschalten, Desktop bleibt unberührt. */
  .card-grid { display: flex; gap: var(--sp-4); overflow-x: auto; scroll-snap-type: x mandatory; padding-bottom: var(--sp-2); margin-left: calc(var(--content-pad) * -1); margin-right: calc(var(--content-pad) * -1); padding-left: var(--content-pad); padding-right: var(--content-pad); perspective: none; }
  /* .card-grid__track ist im Ruhezustand (kein JS/vor S7) unsichtbar für das
     Layout, damit .audience-card weiter direkte Flex-Kinder von .card-grid
     bleiben (scroll-snap greift nur auf direkte Kinder). */
  .card-grid__track { display: contents; }
  .card-grid .audience-card { flex: 0 0 78%; scroll-snap-align: center; transform-style: flat; backface-visibility: visible; }
  /* Stapel-Slider (S7): sobald Draggable übernimmt, kein natives Scrollen mehr,
     die Karten werden per JS-Transform gezogen (Bauplan §9 A7m → S7 voll).
     WebKit-Fehler #2 (Founder-Fund 23.09., per echtem WebKit/Playwright
     nachgewiesen): overflow:hidden UND transform auf demselben Element
     lassen WebKit den Clip an der ursprünglichen, unverschobenen Position
     einfrieren — die verschobene Karte wird dann mitten im Bild hart
     abgeschnitten und eine dunkle Fläche (der Hintergrund des Panels
     dahinter) liegt darüber. Deshalb bekommt ab hier der äußere Container
     (.card-grid) nur noch die Klemme (overflow:hidden), die Verschiebung
     zieht GSAP nur noch am inneren .card-grid__track — nie beides auf
     einem Knoten. */
  .card-grid.is-drag-enhanced { display: block; overflow: hidden; scroll-snap-type: none; touch-action: pan-y; cursor: grab; }
  .card-grid.is-drag-enhanced:active { cursor: grabbing; }
  .card-grid.is-drag-enhanced .card-grid__track { display: flex; gap: var(--sp-4); }
  .card-grid.is-drag-enhanced .audience-card { scroll-snap-align: none; }
}

/* --- Feature-Split (Abschnitt 4 / 5) --- */
.split { display: grid; grid-template-columns: 1fr 1fr; gap: var(--sp-12); align-items: center; }
.split--reverse .split__media { order: 2; }
.split__points { list-style: none; margin: var(--sp-6) 0; padding: 0; display: flex; flex-direction: column; gap: var(--sp-4); }
.split__points li { padding-left: var(--sp-6); position: relative; }
.split__points li::before { content: ''; position: absolute; left: 0; top: .5em; width: 8px; height: 8px; border-radius: 999px; background: var(--pink); }
.split__points strong { display: block; color: var(--foreground); margin-bottom: 2px; }
.split__media { display: flex; flex-direction: column; align-items: center; gap: var(--sp-6); }
@media (max-width: 900px) { .split { grid-template-columns: 1fr; } .split--reverse .split__media { order: -1; } }

/* --- Bildstreifen (§10.2a B7–B10) --- */
.image-strip { display: grid; grid-template-columns: repeat(4, 1fr); gap: var(--sp-3); margin-top: var(--sp-12); }
.image-strip__item { aspect-ratio: 16 / 9; border-radius: 16px; background: var(--surface-3); border: 1px solid var(--border); display: flex; align-items: center; justify-content: center; overflow: hidden; }
.image-strip__item img { width: 100%; height: 100%; object-fit: cover; }
.image-strip__placeholder { color: var(--muted-2); font-size: .65rem; text-align: center; padding: var(--sp-2); }
@media (max-width: 900px) { .image-strip { grid-template-columns: repeat(2, 1fr); } }

/* --- Preise (F2, §14a) --- */
/* overflow:hidden kappt die Einfall-Animation der Kästen (y:-160, scale:1.3,
   siehe motion.js) an der eigenen Box-Kante, statt dass sie beim "Fallen"
   sichtbar über die Überschrift läuft (Founder-Screenshot 22.09.). Mobil
   bleibt nur die X-Achse zum Scrollen offen, Y bleibt gekappt. padding-top
   gibt dem normalen Hover-Lift (-6px) etwas Luft, ohne die Kappung zu lösen. */
.pricing { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--sp-6); margin-top: var(--sp-8); align-items: stretch; perspective: 1200px; overflow: hidden; padding-top: var(--sp-2); }
.price-card {
  background: var(--surface-2); border: 1px solid var(--border-strong); border-radius: var(--r-card);
  padding: var(--sp-8) var(--sp-6); display: flex; flex-direction: column; gap: var(--sp-4);
  transition: transform .3s var(--ease-out), border-color .2s var(--ease-out);
  transform-style: preserve-3d;
}
/* Gold-Puls beim Landen (Founder-Feedback 22.09., Tarife) */
@keyframes h2p-gold-pulse { 0%, 100% { box-shadow: none; } 45% { box-shadow: 0 0 0 3px var(--pink-line), var(--glow-pink); } }
.price-card--featured.is-glowing { animation: h2p-gold-pulse .9s var(--ease-out); }
.price-card:hover { transform: translateY(-6px); border-color: var(--pink-line); }
.price-card--featured { background: var(--surface-3); border-color: var(--pink-line); transform: scale(1.04); }
.price-card--featured:hover { transform: scale(1.04) translateY(-6px); }
.price-card__ribbon { align-self: flex-start; background: var(--pink); color: var(--pink-ink); font: 700 var(--fs-label)/1 var(--font-body); text-transform: uppercase; letter-spacing: .04em; padding: 4px 12px; border-radius: 999px; }
/* Nur Silber trägt "1 Monat gratis" — Gold und Platin halten trotzdem den
   gleichen Platz frei, sonst beginnen Tarifname/Preis/Liste nicht auf
   gleicher Höhe (Founder-Fund 23.09., Punkt 3). Regression 23.09. Runde 2:
   .reveal-forced * (Sicherheitsnetz) erzwingt visibility:visible auf jeden
   Nachfahren einer wiederhergestellten Karte und machte das Abzeichen bei
   Gold/Platin wieder sichtbar. Doppelt abgesichert — Selektor mit zwei
   Klassen schlägt .reveal-forced * (0,1,0) unabhängig von der
   Regelreihenfolge im Stylesheet, UND die Platzhalter tragen keinen
   lesbaren Text mehr (siehe Template), falls doch einmal etwas sichtbar
   wird. Jede weitere Stelle, die dauerhaft unsichtbar bleiben soll, auch
   wenn sie in einer data-reveal-Karte steckt, braucht dieselbe doppelte
   Klasse + !important, sonst gewinnt irgendwann das Sicherheitsnetz. */
.price-card__ribbon.price-card__ribbon--slot { visibility: hidden !important; }

.price-card__name { font: 400 1.75rem/1 var(--font-display); text-transform: uppercase; }
.price-card__price { font: 400 var(--fs-stat)/0.9 var(--font-display); }
.price-card__price small { font: 400 1rem var(--font-body); color: var(--muted); text-transform: none; letter-spacing: 0; }
.price-card__vat { color: var(--muted); margin: 0; }
.price-card__features { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: var(--sp-2); }
.price-card__features li { padding-left: 22px; position: relative; font-size: var(--fs-small); }
.price-card__features li::before { content: '✓'; position: absolute; left: 0; color: var(--pink); font-weight: 700; }
.pricing__footnote { grid-column: 1 / -1; text-align: center; margin-top: var(--sp-4); }

@media (max-width: 900px) {
  /* Gleicher WebKit-Fehler wie bei .card-grid (siehe dort): .pricing wird
     hier ebenfalls zum Wisch-Container, deshalb auch hier keine 3D-Eigenschaften. */
  .pricing { display: flex; gap: var(--sp-4); overflow-x: auto; scroll-snap-type: x mandatory; margin-left: calc(var(--content-pad) * -1); margin-right: calc(var(--content-pad) * -1); padding: 0 var(--content-pad) var(--sp-2); perspective: none; }
  .price-card { flex: 0 0 82%; scroll-snap-align: center; transform-style: flat; }
  .price-card--featured { transform: none; }
  .price-card--featured:hover { transform: translateY(-6px); }
}

/* Hover-Tilt (Maus-geführt, motion.js): auf hoverfähigen Geräten mit erlaubter
   Bewegung übernimmt GSAP rotateX/rotateY/y komplett, die CSS-Hebung entfällt,
   sonst würden sich Inline-Transform (GSAP) und Hover-Regel (CSS) beißen. */
@media (hover: hover) and (prefers-reduced-motion: no-preference) {
  html.js .price-card:hover,
  html.js .price-card--featured:hover { transform: none; }
}

/* --- Tabs "So läuft's" (Abschnitt 6, A8) --- */
.tabs__list { display: inline-flex; gap: var(--sp-2); background: var(--surface-2); border-radius: var(--r-pill); padding: 6px; margin: var(--sp-6) 0; }
.tabs__tab { border: 0; background: transparent; color: var(--muted); padding: 10px 22px; border-radius: var(--r-pill); font: 700 var(--fs-label)/1 var(--font-body); letter-spacing: 0.05em; text-transform: uppercase; cursor: pointer; }
.tabs__tab[aria-selected="true"] { background: var(--pink); color: var(--pink-ink); }
.tabs__body { position: relative; }
.tabs__panel { display: none; }
.tabs__panel.is-active { display: grid; grid-template-columns: 1fr 1fr; gap: var(--sp-12); align-items: center; }
/* Übergangs-Zustand (motion.js, A8 voll): alte und neue Schritte liegen kurz
   übereinander, während sich die Höhe des Wrappers weich anpasst. */
.tabs__body.is-animating { overflow: hidden; }
.tabs__body.is-animating .tabs__panel.is-active { position: absolute; inset: 0; }
.steps { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: var(--sp-6); counter-reset: step; }
.steps li { display: flex; gap: var(--sp-4); align-items: baseline; }
.steps__num { font: 400 2.5rem/1 var(--font-display); color: var(--pink); min-width: 1.4ch; }
@media (max-width: 900px) { .tabs__panel.is-active { grid-template-columns: 1fr; } }


/* --- Zahlen (Abschnitt 7): feste Zahlen (Weg A, Founder-Entscheidung
   23.09.), keine Schnittstelle. Drei Kacheln, TOTAL REACH deutlich
   größer als die anderen zwei. --- */
.stats-grid { display: grid; grid-template-columns: repeat(5, 1fr); gap: var(--sp-6); margin-top: var(--sp-12); }
.stats-grid--three { grid-template-columns: repeat(3, 1fr); align-items: end; }
.stat-tile { position: relative; text-align: center; }
.stat-tile__label { display: block; margin-top: var(--sp-2); }
.stat--reach { font-size: clamp(4.5rem, 15vw, 11rem); color: var(--pink); }
/* Kurzer Puls/Leuchten in Pink, wenn das Hochzählen ankommt (main.js
   setzt .heartbeat onComplete) — nur bei TOTAL REACH, die anderen
   beiden behalten den einfachen Skalier-Puls (.heartbeat generisch). */
@keyframes reach-pulse {
  0%, 100% { transform: scale(1); text-shadow: none; }
  50% { transform: scale(1.08); text-shadow: 0 0 28px var(--pink), 0 0 56px var(--pink); }
}
.stat--reach.heartbeat { animation: reach-pulse .8s var(--ease-out); }
.is-hidden, [hidden] { display: none !important; }

/* --- Info-Popover (Reichweiten-Fußnote hinter dem "i", Founder-Auftrag
   22.09.): per Tastatur (Button, Enter/Leertaste) und am Handy per Antippen
   erreichbar, schließt bei Escape oder Klick daneben (main.js). --- */
.info-toggle {
  display: inline-flex; align-items: center; justify-content: center;
  width: 18px; height: 18px; margin-left: 6px; vertical-align: middle;
  border-radius: 999px; border: 1px solid var(--border-strong); background: transparent;
  color: var(--muted); font: 700 .65rem/1 var(--font-body); cursor: pointer; padding: 0;
}
.info-toggle:hover, .info-toggle:focus-visible, .info-toggle[aria-expanded="true"] {
  color: var(--foreground); border-color: var(--pink-line);
}
.info-popover[hidden] { display: none !important; }
.info-popover {
  position: absolute; left: 50%; top: 100%; transform: translateX(-50%); margin-top: 8px;
  z-index: 20; width: max-content; max-width: 260px; text-align: left;
  background: var(--surface-3); border: 1px solid var(--pink-line); border-radius: var(--r-card);
  padding: 12px 14px; font-size: var(--fs-small); color: var(--muted);
  box-shadow: 0 16px 32px rgba(0, 0, 0, .4);
}
.claims { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--sp-6); margin: var(--sp-8) 0; }
.claim p { margin: 0; color: var(--muted); }
.claim strong { color: var(--foreground); }
.stats-footnote { text-align: center; margin-top: var(--sp-4); }
.investor-line { text-align: center; margin-top: var(--sp-12); }
@media (max-width: 900px) { .stats-grid, .claims { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 560px) { .stats-grid, .claims { grid-template-columns: 1fr; } }

/* --- Stimmen (Abschnitt 8): ziehbarer Kartenstapel (Founder-Feedback 22.09.) --- */
.voices { margin-top: var(--sp-8); outline: none; }
.voices__stage { position: relative; max-width: 640px; min-height: 320px; margin: 0 auto; touch-action: pan-y; }
.voice {
  position: absolute; inset: 0; background: var(--surface-2); border: 1px solid var(--border);
  border-radius: var(--r-card); padding: var(--sp-8); display: flex; flex-direction: column;
  justify-content: center; cursor: grab; will-change: transform;
}
.voice:active { cursor: grabbing; }
.voice p { margin: 0; font-size: var(--fs-lead); }
.voice cite { display: flex; align-items: center; gap: var(--sp-3); margin-top: var(--sp-4); font-style: normal; color: var(--muted); font-size: var(--fs-small); }
.voice__photo { width: 40px; height: 40px; border-radius: 50%; object-fit: cover; flex-shrink: 0; }
.voices__controls { display: flex; justify-content: center; gap: var(--sp-4); margin-top: var(--sp-6); }
.voices__arrow {
  width: 44px; height: 44px; border-radius: 999px; border: 1.5px solid var(--border-strong);
  background: transparent; color: var(--foreground); font-size: 1.5rem; line-height: 1; cursor: pointer;
  transition: border-color .2s var(--ease-out), color .2s var(--ease-out);
}
.voices__arrow:hover { border-color: var(--pink-line); color: var(--pink); }
@media (max-width: 640px) { .voices__stage { min-height: 360px; } }

/* --- Kontaktformular (Abschnitt 9, Neubau: Satz statt Raster) --- */
.sr-only {
  position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0;
}
.contact__grid { display: grid; grid-template-columns: minmax(0, 4fr) minmax(0, 6fr); gap: var(--sp-16); align-items: start; }
.contact__intro { position: relative; }
.contact__badge { display: block; width: 72px; height: 72px; margin: 0 0 var(--sp-4); }
.contact__ways { display: flex; flex-direction: column; gap: var(--sp-3); margin-top: var(--sp-8); }
.contact-way {
  display: flex; align-items: baseline; justify-content: space-between; gap: var(--sp-4);
  padding: 18px 26px; border-radius: var(--r-pill); background: var(--surface-2);
  border: 1px solid var(--border-strong); font: 700 var(--fs-body)/1.2 var(--font-body);
  transition: border-color .2s var(--ease-out), background .2s var(--ease-out), transform .2s var(--ease-out);
}
.contact-way:hover { border-color: var(--pink); background: var(--surface-3); transform: translateX(4px); }
.contact-way__meta { color: var(--muted); font-weight: 400; font-size: var(--fs-small); }

.form { max-width: none; margin-top: 0; }
.form__row { display: grid; grid-template-columns: 1fr 1fr; gap: var(--sp-4); }
.form > .field, .form > .form__row { margin-bottom: var(--sp-4); }
.chips { display: flex; flex-wrap: wrap; gap: var(--sp-2); }
.chip {
  border: 1px solid var(--border-strong); background: var(--surface-2); color: var(--foreground);
  border-radius: var(--r-pill); padding: 8px 18px; font: 700 var(--fs-small)/1 var(--font-body);
  cursor: pointer; transition: border-color .2s var(--ease-out), background .2s var(--ease-out), color .2s var(--ease-out);
}
.chip:hover { border-color: var(--pink); }
.chip.is-active { background: var(--pink); border-color: var(--pink); color: var(--pink-ink); }

.form__message-card {
  background: var(--surface-2); border: 1px solid var(--border-strong); border-radius: var(--r-card);
  padding: var(--sp-4);
}
.form__message-card textarea {
  width: 100%; background: transparent; border: 0; resize: vertical; min-height: 140px;
  color: var(--foreground); font: 400 var(--fs-body)/1.5 var(--font-body);
}
.form__message-card textarea:focus { outline: none; }
.form__message-card textarea::placeholder { color: var(--muted-2); }

.field { display: flex; flex-direction: column; gap: 6px; }
.field label, .field__legend { font: 700 var(--fs-label)/1 var(--font-body); letter-spacing: 0.04em; text-transform: uppercase; color: var(--muted); }
.field input, .field select {
  background: var(--surface); border: 1px solid var(--border-strong); border-radius: 12px;
  color: var(--foreground); padding: 12px 14px; font: 400 var(--fs-body)/1.4 var(--font-body);
}
.field input::placeholder { color: var(--muted-2); }
.field input:focus, .field select:focus { outline: none; border-color: var(--pink); }
.field select {
  appearance: none; cursor: pointer; padding-right: 34px;
  background-image: linear-gradient(45deg, transparent 50%, var(--muted) 50%), linear-gradient(135deg, var(--muted) 50%, transparent 50%);
  background-position: right 18px top 55%, right 12px top 55%; background-size: 6px 6px; background-repeat: no-repeat;
}
.field-error { color: var(--danger); font-size: var(--fs-small); min-height: 1.2em; display: none; }
.field-error:not(:empty) { display: block; }
.field--hp { position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden; }
.form__hint { margin: var(--sp-4) 0; }
/* Der Datenschutz-Link im Hinweis muss als Link erkennbar sein — die
   globale a { color: inherit } macht ihn sonst zu unmarkiertem Fließtext
   (Founder-Fund 23.09., Punkt 8). */
.form__hint a { color: var(--foreground); text-decoration: underline; text-underline-offset: 2px; }
.form__hint a:hover { color: var(--pink); }
.form__status { min-height: 1.5em; margin-top: var(--sp-3); text-align: center; }
.form__status.is-success { color: var(--ok); }
.form__status.is-error { color: var(--danger); }
.form__success-heart {
  display: none; width: 40px; height: 40px; margin: 0 auto var(--sp-2);
}
.form__success-heart path { stroke: var(--ok); stroke-dasharray: 220; stroke-dashoffset: 220; transition: stroke-dashoffset .9s var(--ease-out); }
.form__status.is-success .form__success-heart { display: block; }
.form__status.is-success .form__success-heart path { stroke-dashoffset: 0; }

@media (max-width: 900px) {
  .contact__grid { grid-template-columns: 1fr; gap: var(--sp-8); }
}
@media (max-width: 640px) {
  .form__row { grid-template-columns: 1fr; }
  .contact-way { padding: 16px 20px; }
}

/* --- Schluss-CTA (Abschnitt 10): panel--pink stellt color:pink-ink für
   einen soliden Pink-Grund — der Abschnitt hat aber ein Video (V3)
   dahinter, das den Pink-Grund komplett verdeckt (Founder-Fund 23.09.,
   Runde 2: Überschrift/Knöpfe unlesbar). Textfarbe zurück auf hell,
   Knöpfe wie im Hero (Creator pink gefüllt, Partner weiß/Rand). --- */
.cta-final { text-align: center; color: var(--foreground); }
.cta-final h2 { margin-bottom: var(--sp-8); }
.cta-final__ctas { display: flex; gap: var(--sp-4); justify-content: center; flex-wrap: wrap; }

/* --- Footer (Abschnitt 11) --- */
/* Founder-Fund 23.09. (Punkt 10): über der Trennlinie stand zu viel
   leere Fläche und die Links wirkten blass/klein — Abstände gestrafft,
   Links größer/heller mit Pink-Hover. */
.footer { background: var(--background); padding: var(--sp-12) 0 var(--sp-8); }
.footer__badge { display: block; width: 96px; height: 96px; margin: 0 auto var(--sp-4); }
.footer__wordmark { font: 400 clamp(3rem, 14vw, 11rem)/0.85 var(--font-display); text-transform: uppercase; text-align: center; margin: 0 0 var(--sp-8); overflow: hidden; }
.footer__cols { display: flex; justify-content: space-between; flex-wrap: wrap; gap: var(--sp-8); border-top: 1px solid var(--border); padding-top: var(--sp-8); }
.footer__links { list-style: none; margin: 0; padding: 0; display: flex; gap: var(--sp-6); flex-wrap: wrap; }
.footer__links a { color: var(--foreground); font-size: var(--fs-body); font-weight: 700; }
.footer__links a:hover { color: var(--pink); }
.footer__social { display: flex; gap: var(--sp-6); }
.footer__social a { color: var(--foreground); font-size: var(--fs-body); font-weight: 700; }
.footer__social a:hover { color: var(--pink); }
.footer__legal { color: var(--muted-2); font-size: var(--fs-small); margin-top: var(--sp-6); text-align: center; }

/* --- Barrierefreiheit: Bewegung reduziert --- */
@media (prefers-reduced-motion: reduce) {
  * { animation-duration: 0.001ms !important; animation-iteration-count: 1 !important; transition-duration: 0.001ms !important; scroll-behavior: auto !important; }
  .marquee__track { animation: none !important; }
}

/* --- Herzschlag (A17) --- */
@keyframes heartbeat { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.06); } }
.heartbeat { animation: heartbeat .6s var(--ease-out); }

/* --- Bewegung: Ausgangszustände, nur wenn JS läuft und Bewegung erlaubt ist --- */
@media (prefers-reduced-motion: no-preference) {
  html.js [data-reveal], html.js [data-reveal-lines] { opacity: 0; }
}
/* Notfall: motion.js hat nicht rechtzeitig geladen — nach 2,5s alles zeigen (site.js). */
html.motion-fallback [data-reveal], html.motion-fallback [data-reveal-lines] { opacity: 1 !important; transform: none !important; }
/* Sicherheitsnetz je Element (main.js, initRevealSafetyNet): motion.js ist
   geladen, aber die konkrete Animation eines Elements ist nicht angekommen
   (Founder-Fund 23.09., Punkt 8/9/10) — dieses Element wird trotzdem gezeigt. */
.reveal-forced, .reveal-forced * { opacity: 1 !important; visibility: visible !important; transform: none !important; }

/* --- Ansichtübergang (A18) --- */
@media (prefers-reduced-motion: no-preference) {
  @supports (view-transition-name: none) {
    ::view-transition-old(root), ::view-transition-new(root) { animation-duration: .25s; }
  }
}

/* --- Sichtbarkeitsleistung ---
   Runde 3, 23.09.: content-visibility:auto war die eigentliche Ursache
   hinter den "Überschrift/Wortmarke bleibt leer"-Funden. Solange ein
   .panel außerhalb des Bildschirms ist, rendert der Browser seinen Inhalt
   gar nicht und ersetzt ihn durch eine Platzhalterbox (contain-intrinsic-
   size, hier 1200px) — GSAP ScrollTrigger berechnet seine Start-/End-
   Positionen aber anhand der Seitenhöhe zu einem festen Zeitpunkt, und
   diese Platzhalterhöhen weichen spürbar von der echten Höhe ab, sobald
   der Abschnitt später tatsächlich gerendert wird. Ergebnis: die ganze
   Seite "atmet" beim Scrollen (Messung: so-läuft's/Zahlen/Stimmen/Kontakt/
   Schluss-CTA schrumpften beim echten Scrollen von je 1457px auf 960/828/
   747/962/427px), und Trigger-Positionen, die früh berechnet wurden,
   zeigen danach ins Leere — bei Abschnitten nah am Seitenende ist die
   berechnete Startposition dann nie erreichbar. clamp() (siehe motion.js)
   federt das zwar ab, behebt aber nicht die Ursache. Performance-Trick
   deshalb ganz raus statt nur abgeschwächt. */

/* --- Grundlayout Sektionen --- */
.section-head { max-width: 760px; margin-bottom: var(--sp-8); }
.section-head .lead { margin-top: var(--sp-3); }
