/* =============================================================================
   VISENZA — "Naturewalk"
   Gemeinsames Stylesheet für alle vier Seiten:
   index-de.html, index-en.html, index-de-price.html, index-en-price.html
   Vanilla CSS, keine Frameworks, keine Build-Schritte.

   ABHÄNGIGKEIT: design-tokens.css wird davor geladen und liefert die
   Marken-Palette, die drei Schriftfamilien und --section-gap / --radius.
   Diese Datei erfindet keine Farbe neu — jeder Wert unten ist ein
   Palettenton oder eine daraus abgeleitete Helligkeit/Deckung.
   design-tokens.css bringt zusätzlich ein helles Grundthema mit
   (body, h1-h3, section, .btn). Was davon hier stört, wird in Abschnitt 2
   ausdrücklich zurückgesetzt — nicht in der Token-Datei geändert.

   Aufbau
   1. Tokens          — dunkle, warme Anwendung der Palette
   2. Basis           — Reset, Grundtypografie, Rücknahmen aus design-tokens
   3. Bausteine       — Container, Buttons, Icons
   4. Abschnitte      — Kopf, Hero, Merkmale, Stimmung, Zitat, Vertrauen,
                        Vorteile, FAQ, Abschluss, Preis
   5. Responsive      — Desktop → Tablet → Mobil (375px)
   6. Bewegung        — Auftakt, Einblenden, zwei Dauerbewegungen
   ========================================================================== */

/* =============================================================================
   1. TOKENS
   ========================================================================== */

:root {
  /* --- Herkunft der Farben ----------------------------------------------
     Die Palette selbst (--kalk --sand --stein --lehm --erde --moos --fels
     --nacht) steht in design-tokens.css und wird davor geladen. Hier steht
     nur die Anwendung. Jeder Wert unten ist entweder ein Palettenton oder
     eine daraus abgeleitete Helligkeit bzw. Deckung — nie eine neue Farbe.

     v2: Der Grund war bis hierher ein warmes Fast-Schwarz (#050403). Die
     Kundin wollte ausdrücklich weg davon — wärmer, farbiger, lebendiger,
     echte fotografische Wärme statt steriler dunkler Flächen. Verfahren:
     Sättigung der Palette bleibt, bewegt werden Helligkeit und Farbton.

     Zum Farbton: nachgemessen im freigegebenen Referenzbild
     (mockup-naturewalk-v2-referenz.jpg) liegen dessen ruhige Flächen bei
     H69–77°, nicht bei H102°. Der Grund kommt deshalb von --moos
     (#8A8F7A, H74°), dem olivgrünen Palettenton, und nicht von --fels
     (H102°, dem klaren Grün). Beides sind Palettentöne. Die Helligkeit
     des Referenzbildes stimmt mit der hier gewählten überein (L11–19%
     dort, L12/L17 hier) — "wärmer" hieß Farbton, nicht Helligkeit.       */
  --tiefe:        #222518;                    /* Seitengrund — tiefer Waldboden.
                                                 --moos (H74°) bei S21% L12% */
  --tiefe-0:      rgb(34 37 24 / 0%);         /* --tiefe transparent — für Verläufe.
                                                 MUSS --tiefe folgen, sonst blenden
                                                 alle Verläufe nach durchsichtig-
                                                 Schwarz und legen einen grauen
                                                 Schleier über das Grün. */
  --flaeche:      #2F3324;                    /* Karten und die Merkmal-Bande.
                                                 --moos bei S17% L17%, also +5 L
                                                 über dem Grund (vorher +3) —
                                                 auf dem helleren Grund braucht
                                                 die Fläche mehr Abstand. */
  --flaeche-glas: rgb(47 51 36 / 72%);        /* --flaeche mit Deckung: dieselbe
                                                 Bande, wenn ein Foto durchscheint */
  --scrim:        34 37 24;                   /* --tiefe als blanke Kanäle, für
                                                 rgb(var(--scrim) / X%) in den
                                                 Foto-Abschnitten */

  /* Trennlinien: --stein mit Deckung. Keine Vollton-Linien, sie laufen an
     beiden Enden aus — siehe .reihe__zelle.
     Angegeben ist jeweils die Deckung im Maximum. Alle Werte sind gegenüber
     v1 angehoben: der Grund ist von L2% auf L12% gestiegen, bei gleicher
     Deckung verlieren die Linien sonst ihre Präsenz.                      */
  --linie:        rgb(214 206 194 / 30%);     /* Spaltentrenner, Mitte */
  --rand:         rgb(214 206 194 / 20%);     /* Karten-Rand */

  --text:         var(--kalk);                /* Überschriften — 13.6:1 auf --tiefe */
  --text-ruhig:   rgb(242 237 232 / 86%);     /* Fließtext — ≈10.4:1. Angehoben,
                                                 weil Fließtext jetzt auch über
                                                 Fotos und Schleiern steht. */
  --text-leise:   rgb(242 237 232 / 68%);     /* Beschreibungen, Kleinzeilen.
                                                 ≈6.3:1 auf --tiefe, ≈5.2:1 auf
                                                 --flaeche; bei den alten 60%
                                                 wäre der zweite Wert unter 4.5
                                                 gerutscht. */
  --akzent:       var(--erde);                /* Kicker — 5.5:1 auf --tiefe.
                                                 Nicht auf --flaeche für Kleintext
                                                 verwenden, dort bleibt kaum Reserve. */
  --gold:         var(--lehm);                /* Merkmal-Labels — 8.3:1 */

  /* --fels ist der einzige Grünton der Palette und steckt jetzt im Grund.
     Als *Textfarbe* misst er nur 4.2:1 auf --tiefe und ist damit unter der
     Schwelle — er darf ausschließlich dekorativ und für Zeichnungen stehen. */
  /* Die Strichzeichnungen stehen im Mockup durchweg leiser als die Labels
     daneben: Spitzenwert der Linien 148 (Merkmale) bzw. 167 (Listenmarke)
     gegen 201 beim Titel derselben Zelle — also rund 0.8 × --lehm. Die
     beiden Icon-Reihen des Mockups sind untereinander uneinheitlich
     (0.74 / 0.86); 80 % liegt zwischen beiden statt eine Reihe zu treffen
     und die andere zu verfehlen. */
  --gold-icon:    rgb(200 186 166 / 85%);     /* --lehm, gedämpft: alle Icons.
                                                 85 statt 80 %, weil die Zeichen
                                                 jetzt auf der olivfarbenen
                                                 --flaeche stehen (6.9:1). */

  /* CTA-Fläche: unverändert aus v1. Der Knopf ist das einzige am Mockup
     abgenommene, von der Kundin freigegebene Element — er bleibt über beide
     Fassungen wiedererkennbar, und alle drei Platzierungen sind identisch.
     Kalk auf diesem Gold ergibt 7.4:1, unabhängig vom Seitengrund.        */
  --gold-tief:      #5C4929;                  /* CTA-Fläche */
  --gold-tief-hell: #6E5934;                  /* CTA :hover */
  --cta-text:       var(--kalk);              /* Beschriftung, aus der Palette */

  /* --- Schrift -----------------------------------------------------------
     Die drei Familien und ihre Schnitte kommen 1:1 aus design-tokens.css;
     geladen werden nur 300 und 400, deshalb kommt auf der ganzen Seite
     kein anderes font-weight vor (kein gerechneter Fettschnitt).          */
  --font-head:   'Cormorant Garamond', 'Times New Roman', serif;
  --font-body:   'Jost', 'Helvetica Neue', Arial, sans-serif;
  /* Pinyon Script steht nur noch als Marken-Referenz hier: beide
     Schreibschrift-Momente liegen als Bild vor, keine Regel wendet
     die Familie an, und keine Sprachfassung lädt sie noch. */
  --font-script: 'Pinyon Script', 'Segoe Script', cursive;

  /* Typoskala — die vw-Anteile sind aus dem Mockup zurückgerechnet:
     bei 1290 px trifft jeder Wert die dort gemessene Schriftgröße.
     Gemessen wurde an der Ink-Breite ganzer Zeilen, nicht an einzelnen
     Buchstaben — der Serif des Mockups baut etwas höhere Versalien als
     Cormorant Garamond, die Breite ist das verlässlichere Maß. */
  --fs-h1:        clamp(2.75rem, 6.95vw, 5.625rem); /* 44 → 90 px */
  --fs-subline:   clamp(1.5rem, 2.65vw, 2.25rem);   /* 24 → 34 px */
  --fs-h2:        clamp(2rem, 3.4vw, 2.75rem);      /* 32 → 44 px */
  --fs-abschluss: clamp(1.5rem, 2.85vw, 2.375rem);  /* 24 → 37 px */
  --fs-body:      1.125rem;                         /* 18 px */
  --fs-hero-text: clamp(1.0625rem, 1.82vw, 1.5rem); /* 17 → 24 px — der Hero-
                                                       absatz steht im Mockup
                                                       deutlich größer als der
                                                       übrige Fließtext */
  --fs-klein:     1.1875rem;                        /* 19 px — Preiszeile */
  --fs-mini:      1rem;                             /* 16 px — Kicker */
  --fs-zitat:     1.03125rem;                       /* 16.5 px — Zitat-Karte */

  /* --- Icon-Größen -------------------------------------------------------
     Kantenlänge der SVG-Box. Die Strichzeichnung füllt sie zu 80–88 %;
     die Werte sind aus der im Mockup gemessenen Strichhöhe zurückgerechnet.
     Das Sprite selbst bleibt unangetastet, skaliert wird nur per CSS.      */
  --icon-marke:   clamp(52px, 6vw, 80px);           /* 77 px @1290, Ink 68 */
  --icon-merkmal: clamp(46px, 5.2vw, 68px);         /* 67 px @1290, Ink 54 */
  --icon-vorteil: clamp(30px, 3.47vw, 46px);        /* 45 px @1290, Ink 36 */
  --icon-liste:   27px;                             /*             Ink 23 */
  --icon-play:    clamp(64px, 8vw, 104px);          /* 103 px @1290        */
  --zitat-bild:   96px;                             /* Porträt in der Zitat-Karte */

  /* --- Rhythmus ---------------------------------------------------------- */
  --section-gap: 100px;                             /* Token aus design-tokens.css */
  --raum-xl:     clamp(64px, 7.4vw, var(--section-gap));
  --raum-l:      clamp(44px, 4.8vw, 64px);
  --raum-m:      clamp(28px, 3vw, 40px);
  --rand-seite:  clamp(20px, 5.75vw, 88px);         /* 74 px @1290 */
  --breite:      100%;                              /* Inhalt über die volle Breite */
  --kopf-hoehe:  clamp(88px, 8.4vw, 116px);

  /* --- Radien ------------------------------------------------------------ */
  --radius:        2px;                             /* Token aus design-tokens.css */
  --radius-karte:  18px;
  --radius-video:  14px;
  --radius-pill:   999px;
}

/* =============================================================================
   2. BASIS
   ========================================================================== */

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

html {
  -webkit-text-size-adjust: 100%;
  scroll-behavior: smooth;
  /* Auch am <html>, nicht nur am <body>: waehrend eines Seitenwechsels und
     im Ueberrollbereich malt der Browser diese Flaeche, bevor der Body
     steht. Ohne sie blitzt dort Weiss auf. */
  background: var(--tiefe);
}

body {
  margin: 0;
  background: var(--tiefe);
  color: var(--text-ruhig);
  font-family: var(--font-body);
  font-size: var(--fs-body);
  font-weight: 300;
  line-height: 1.75;
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
  overflow-x: hidden; /* Hero-Bild darf über den rechten Rand hinauslaufen */
}

img { display: block; max-width: 100%; }

/* <picture> ist nur eine Klammer um WebP und JPEG und soll im Layout gar
   nicht vorkommen — sonst stuende im Raster der Foto-Abschnitte eine
   leere Inline-Box zwischen Abschnitt und Bild. */
picture { display: contents; }

/* Rücknahme aus design-tokens.css: dort bekommt jedes <section> pauschal
   --section-gap oben und unten. Der Seitenrhythmus wird hier aber pro
   Abschnitt gesetzt (--raum-xl / --raum-l / --raum-m), und die randlosen
   Foto-Abschnitte dürfen überhaupt kein Polster tragen. Also einmal auf
   null und danach gezielt vergeben.                                       */
section { padding: 0; }

/* h3 steht mit in der Regel, weil design-tokens.css sonst jede Frage im
   FAQ in Versalien mit 0.2em Sperrung setzt. Größe und Schriftfamilie der
   Fragen kommen aus .faq__knopf, nicht von hier.                          */
h1, h2, h3 {
  margin: 0;
  font-family: var(--font-head);
  font-weight: 300;
  line-height: 1.14;
  letter-spacing: 0.005em;
  color: var(--text);
  /* Bewusst nicht in Versalien wie im hellen Token-Theme:
     das Mockup setzt die Headlines gemischt. */
  text-transform: none;
}

p { margin: 0; }
ul { margin: 0; padding: 0; list-style: none; }

a { color: inherit; }

/* Sichtbarer Fokus für Tastaturbedienung */
:where(a, button):focus-visible {
  outline: 2px solid var(--lehm);
  outline-offset: 4px;
  border-radius: var(--radius);
}

/* =============================================================================
   3. BAUSTEINE
   ========================================================================== */

.container {
  width: 100%;
  max-width: var(--breite);
  margin-inline: auto;
  padding-inline: var(--rand-seite);
}

/* Sprunglink — erst bei Tastaturfokus sichtbar */
.sprung {
  position: absolute;
  top: 0; left: 50%;
  z-index: 10;
  transform: translate(-50%, -120%);
  padding: 10px 20px;
  background: var(--flaeche);
  border: 1px solid var(--rand);
  border-radius: 0 0 var(--radius-karte) var(--radius-karte);
  color: var(--kalk);
  font-size: var(--fs-klein);
  text-decoration: none;
  transition: transform 0.2s ease;
}
.sprung:focus-visible { transform: translate(-50%, 0); }

/* Das Icon-Set liegt als SVG-Sprite im HTML */
.sprite { position: absolute; width: 0; height: 0; overflow: hidden; }

.icon {
  display: block;
  fill: none;
  stroke: currentcolor;
  stroke-linecap: round;
  stroke-linejoin: round;
}

/* --- Kicker / Eyebrow ---------------------------------------------------- */
.kicker {
  font-size: var(--fs-mini);
  font-weight: 400;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--akzent);
}

/* --- CTA — genau ein Button-Stil auf der ganzen Seite --------------------- */
.cta {
  display: inline-flex;
  align-items: center;
  gap: 1.4em;
  padding: 1.15em 2.2em;
  border: 0;
  border-radius: var(--radius-pill);
  background: var(--gold-tief);
  color: var(--cta-text);
  font-family: var(--font-body);
  font-size: clamp(1rem, 1.55vw, 1.25rem);   /* 20 px @1290 → Pille 335 × 66 */
  font-weight: 400;
  line-height: 1;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  text-decoration: none;
  transition: background 0.25s ease, box-shadow 0.25s ease, transform 0.25s ease;
}
.cta:hover {
  background: var(--gold-tief-hell);
  /* 32 statt 45 %: das braune Leuchten war auf Fast-Schwarz abgestimmt,
     auf dem gruenen Grund truebt es die Flaeche darunter ein. */
  box-shadow: 0 10px 34px rgb(92 73 41 / 32%);
  transform: translateY(-1px);
}
.cta:active { transform: translateY(0); box-shadow: none; }

.cta__pfeil {
  width: 1.85em;    /* wächst mit der Beschriftung — Verhältnis 26 : 10 */
  height: 0.72em;
  stroke-width: 1.2;
  flex: none;
}

/* =============================================================================
   4. ABSCHNITTE
   ========================================================================== */

/* --- 4.1 Kopf / Logo ----------------------------------------------------- */

.kopf {
  position: relative;
  z-index: 2;
  display: flex;
  align-items: center;
  height: var(--kopf-hoehe);
}

/* Logo links, Sprachumschalter rechts */
.kopf > .container {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: clamp(16px, 3vw, 40px);
}

.marke {
  display: flex;
  align-items: center;
  gap: 18px;
}

/* Auf den Preisseiten ist das Zeichen ein Link zurueck auf die Landingpage
   ("cool would be to click here on the logo and come back to the main
   page", Feedback-Video 2:00). Auf den Landingpages bleibt es ein <div>.

   Der Link braucht keinen eigenen Namen: der sichtbare Schriftzug VISENZA
   steht in ihm und gibt ihn her — deshalb bleibt alt="" am Bild richtig,
   sonst stuende der Name doppelt. Farbe und Groesse aendern sich nicht,
   nur der Unterstrich muss weg; das Fokusfeld kommt aus der globalen
   :focus-visible-Regel. */
a.marke {
  color: inherit;
  text-decoration: none;
}

a.marke:hover .marke__name,
a.marke:focus-visible .marke__name { color: var(--gold); }

a.marke .marke__name,
a.marke .marke__claim { transition: color 200ms ease; }

/* Echtes Markenzeichen als Bild (weisse Logo-Variante), nicht mehr als
   nachgezeichnetes Icon. Breite folgt dem Seitenverhaeltnis des Bildes. */
.marke__zeichen {
  width: auto;
  height: calc(var(--icon-marke) * 1.35);
  flex: none;
}

.marke__name {
  font-family: var(--font-head);
  font-size: clamp(1.25rem, 1.7vw, 1.5rem);
  font-weight: 400;
  line-height: 1.2;
  letter-spacing: 0.28em;
  text-transform: uppercase;
  color: var(--kalk);
}

.marke__claim {
  margin-top: 0.35em;
  font-size: 0.6875rem;
  font-weight: 300;
  line-height: 1.2;
  letter-spacing: 0.19em;
  text-transform: uppercase;
  color: var(--text-leise);
}

/* Sprachumschalter — leise Pille in der Kopfzeile, rechts oben.
   Kein zweiter Button-Stil: nur Fläche, Rand und die Kicker-Typografie.
   Die aktive Sprache steht in Gold, die andere ist der Link. */
.sprachen {
  display: inline-flex;
  align-items: center;
  flex: none;
  gap: 0.8em;
  padding: 0.62em 1.05em;
  border: 1px solid var(--rand);
  border-radius: var(--radius-pill);
  background: var(--flaeche);
  font-family: var(--font-body);
  font-size: 0.8125rem;
  line-height: 1;
  pointer-events: auto;   /* sitzt in der Ton-Schiene, die selbst none traegt */
}

.sprachen__opt {
  /* Die Sperrung schiebt hinter dem letzten Buchstaben Luft nach —
     der negative Rand holt sie wieder herein, damit die Pille sitzt. */
  margin-right: -0.16em;
  font-weight: 300;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--text-leise);
  text-decoration: none;
  transition: color 0.25s ease;
}

.sprachen__opt--aktiv {
  font-weight: 400;
  color: var(--gold);
}

a.sprachen__opt:hover { color: var(--kalk); }

.sprachen__trenner {
  width: 1px;
  height: 0.95em;
  background: var(--linie);
}

/* --- 4.1a Ton-Schalter -----------------------------------------------------
   Der Naturklang startet automatisch (siehe sound.js); dieser Schalter ist
   die einzige Bedienung dafuer. Der Sprachumschalter zog aus dem Kopf
   hierher um, in dieselbe fixierte Schiene: beide sassen zuvor in zwei
   getrennten, unabhaengig rechtsbuendigen Ebenen (Kopf im Fluss, Schiene
   fixiert) und landeten dadurch beide exakt an derselben rechten Kante,
   also aufeinander statt nebeneinander. Jetzt echte Flex-Nachbarn in EINER
   Ebene, per gap getrennt — das kann nicht mehr auseinanderlaufen. Der Kopf
   selbst traegt jetzt nur noch die Marke und bleibt im Fluss (verschwindet
   beim Scrollen hinter dem Hero, wie bisher); die Schiene mit Ton und
   Sprache bleibt laut Vorgabe immer sichtbar. pointer-events: none auf der
   Schiene, damit sie den Rest der Seite nicht blockiert — Knopf und
   Sprachpille tragen es einzeln wieder. */
.ton-schiene {
  position: fixed;
  inset: 0 0 auto 0;
  height: var(--kopf-hoehe);
  z-index: 40;
  pointer-events: none;
}

.ton-schiene > .container {
  height: 100%;
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: 0.65em;
}

.ton {
  pointer-events: auto;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex: none;
  width: 2.5em;
  height: 2.5em;
  border: 1px solid var(--rand);
  border-radius: var(--radius-pill);
  background: var(--flaeche);
  color: var(--text-leise);
  font-size: 0.8125rem;   /* dieselbe Bezugsgroesse wie .sprachen */
  cursor: pointer;
  transition: color 0.25s ease, border-color 0.25s ease;
}

.ton:hover, .ton:focus-visible { color: var(--gold); border-color: var(--gold); }

/* Dezenter Hinweis, solange der Naturklang noch auf die erste echte
   Interaktion wartet (siehe sound.js) — kein Lauttonspiel, nur ein
   ruhiges Pulsieren am Rand, das den Schalter ins Auge fallen laesst. */
@media (prefers-reduced-motion: no-preference) {
  .ton--hinweis {
    animation: ton-hinweis-puls 2.2s ease-in-out infinite;
  }
}

@keyframes ton-hinweis-puls {
  0%, 100% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--gold) 35%, transparent); }
  50%      { box-shadow: 0 0 0 6px color-mix(in srgb, var(--gold) 0%, transparent); }
}

.ton__zeichen {
  width: 1.05em;
  height: 1.05em;
  stroke-width: 1.4;
}

.ton__zeichen--aus { display: none; }
.ton[data-stumm] .ton__zeichen--an { display: none; }
.ton[data-stumm] .ton__zeichen--aus { display: block; }

/* --- 4.2 Hero ------------------------------------------------------------ */

.hero {
  position: relative;
  padding-block: clamp(28px, 3.4vw, 44px) var(--raum-m);
}

/* Auf dem Desktop fuellt der Hero zusammen mit dem Kopf genau einen
   Bildschirm. Vorher endete er frueher, und vom naechsten Abschnitt lugten
   schon ein paar Zeilen herein — der erste Eindruck war dadurch kein Bild,
   sondern ein angeschnittenes Bild plus Textanfang.

   Abgezogen wird --kopf-hoehe, weil der Kopf im Fluss steht und seine Hoehe
   beansprucht; 100vh am Hero allein ergaebe Kopf + Bildschirm.

   min-height, nicht height: auf einem flachen Fenster darf der Block
   weiterwachsen, statt den Text abzuschneiden. Der Inhalt steht dann
   mittig in der Flaeche, die Innenabstaende bleiben als Mindestluft.

   Nur ab 900 px. Gestapelt (Bild ueber Text) waere ein Bildschirm zu wenig
   fuer beides, und auf dem Handy verschieben die Browserleisten 100vh
   ohnehin staendig. */
@media (min-width: 900px) {
  .hero {
    display: grid;
    align-content: center;
    min-height: calc(100vh - var(--kopf-hoehe));
  }
}

/* Bild läuft nach oben hinter den Kopf und füllt seit v3 die volle Breite.

   Bis v2 stand es als 58 % breiter Block rechts, links davon der Text auf
   blankem Grund. Genau das hat der Kunde im Video bemängelt: erst soll
   nirgends mehr blanke Farbe stehen, und zweitens soll das Video "through
   the whole screen" laufen mit dem Text nur darauf. Beides ist dieselbe
   Änderung — der Block wird so breit wie der Abschnitt.

   pointer-events bleibt aus, damit Klicks den Text darüber erreichen;
   .hero__bild[data-playing] schaltet es an, sobald ein echtes Video
   läuft (siehe 4.9).                                                      */
.hero__bild {
  position: absolute;
  inset: calc(-1 * var(--kopf-hoehe)) 0 0 0;
  width: auto;
  z-index: 0;
  pointer-events: none;
}

/* Der Ausschnitt sitzt bewusst tief. Der Block fuellt seit v3 die volle
   Breite und ist immer breiter als hoch (bei 1920 x 964 px im Verhaeltnis
   0,50), der Master dagegen ist mit 0,98 fast quadratisch. object-fit:
   cover skaliert also auf die Breite und schneidet oben und unten weg —
   der zweite Wert entscheidet allein, der erste hat hier gar keine
   Wirkung mehr (nachgemessen: 20 % bis 80 % ergeben denselben Ausschnitt).
   68 % holt Weg und Person ins Band; mittig stuende dort nur die dunkle
   Kronenpartie. */
.hero__bild img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: 50% 68%;
}

/* Der grüne Schleier links — deutlich schwächer als bis v2.

   Wörtlich aus dem Video: "make the green fade from the left side for the
   text way less". Vorher lief er von vollem --tiefe bei 0 % über 92 % auf
   45 % und war erst bei 72 % ganz offen; jetzt beginnt er bei 72 % und
   bleibt rechts bei 8 % stehen.

   Die frühere erste Stufe MUSSTE Vollton sein, und der Grund dafür ist
   mit v3 entfallen: der Bildblock endete bei 58 % Breite, seine linke
   Kante war zugleich die Naht zum blanken Seitengrund, und jeder Rest
   Deckung darunter zeigte dort helles Laub als senkrechte Linie. Der Block
   füllt jetzt die ganze Breite — es gibt links keine Naht mehr, also auch
   keinen Grund für Vollton.

   Nachgemessen trägt die Überschrift damit weiterhin: das linke Drittel
   des Motivs liegt bei Helligkeit 1,9 bis 8, unter 72 % Schleier ergibt
   das rund 2,7 und für --text 8,7:1.

   Der untere Auslauf endet bei 84 % statt Vollton — darunter folgt seit
   v3 ein weiterer Foto-Abschnitt, und ein Vollton-Streifen an dieser Naht
   wäre wieder die blanke Farbe, die weg soll. Er setzt zugleich früher an
   (48 % statt 66 %) und läuft in zwei Stufen: das ist die Naht, auf die
   der Kunde im Video bei 0:26 zeigt und "a little bit more smooth" sagt. */
.hero__bild::after {
  content: "";
  position: absolute;
  inset: 0;
  background:
    /* 2026-08-25, Lukas' Rueckmeldung: sie soll sichtbarer sein. Deckung
       ueberall reduziert, nicht die Farbe geaendert. Vorlaeufig, mit Jose
       live gegen das neue Hero-Standbild geprueft, kann noch weiter runter
       oder muss wieder hoch, je nachdem wie es dort aussieht.
       2026-08-26, Jose: Christina wirkt auf dem neuen Standbild blass,
       nochmal deutlich runter. Bei 72 % Deckung trug die Ueberschrift
       gemessen 8,7:1 gegen die 4,5:1-Schwelle, also reichlich Reserve —
       selbst nach dieser zweiten Kuerzung sollte das noch tragen, aber
       ungeprueft, live gegenchecken. */
    linear-gradient(to right,
      rgb(var(--scrim) / 38%)   0%,
      rgb(var(--scrim) / 26%)  24%,
      rgb(var(--scrim) / 12%)  56%,
      rgb(var(--scrim) /  3%)  82%,
      rgb(var(--scrim) /  2%) 100%),
    linear-gradient(to bottom,
      var(--tiefe-0)           26%,
      rgb(var(--scrim) / 11%)  54%,
      rgb(var(--scrim) / 37%)  74%,
      rgb(var(--scrim) / 65%)  90%,
      rgb(var(--scrim) / 69%) 100%);
}

.hero__inhalt {
  position: relative;
  z-index: 1;
  /* wächst mit der Seite mit, bleibt aber schmaler als das Foto daneben */
  max-width: clamp(520px, 40vw, 720px);
  /* Der Textblock erzeugt einen eigenen Stapelkontext (z-index:1) und
     lag damit VOR dem gesamten .hero__bild, das den Play-Knopf enthält
     (dessen eigenes z-index:2 gilt nur innerhalb seines eigenen Kontexts,
     nicht gegen aussenliegende Geschwister). Am Desktop fiel das nicht auf,
     weil der Knopf per padding-left neben die schmale Textspalte rueckt —
     am Handy ist .hero__inhalt aber volle Breite (siehe 899px-Regel) und
     lag exakt ueber dem Knopf, klickbar war dann nur noch der Text.
     pointer-events: none hier + auto auf dem CTA-Link darunter loest das,
     ohne den Textblock optisch zu veraendern. */
  pointer-events: none;
}

.hero__inhalt a {
  pointer-events: auto;
}

/* Die Markenzeile über der Überschrift steht auf dem Foto, nicht auf dem
   Seitengrund — und das verträgt --akzent nicht.

   --akzent ist --erde (#A89680), mit Leuchtdichte 31,7 der dunkelste
   Textton der ganzen Seite. Auf --tiefe trägt er seine 5,45:1. Auf dem
   Hero-Foto sind es nachgemessen 4,42:1, und das ist kein Fehler des
   Verlaufs, sondern der Preis dafür, dass das Foto seit v3 die volle
   Breite füllt und der grüne Schleier links auf Wunsch des Kunden von
   92 % auf 72 % zurückgenommen wurde.

   Zwei Wege standen offen. Den Schleier wieder dichter machen hiesse, die
   Bitte zurueckzunehmen — ein Versuch damit landete links bei 94 %
   Deckung, also dichter als vorher. Also stattdessen den Nachbarton der
   Palette: --gold ist --lehm (#C8BAA6), auf demselben Grund 6,58:1. Er
   steht auf dieser Seite ohnehin schon, naemlich auf den
   Merkmal-Labels. Bei einer 16 px grossen Versalzeile mit weitem
   Buchstabenabstand ist der Unterschied ein Hauch waermeres Hell — der
   Verlauf bleibt dafuer so offen, wie der Kunde ihn wollte.             */
.hero .kicker { color: var(--gold); }

.hero h1 {
  margin-top: 0.34em;
  font-size: var(--fs-h1);
  /* Das Mockup setzt die Headline auf 84 px Zeilenabstand bei 90 px Schrift —
     deutlich enger als die 1.14 der übrigen Überschriften. */
  line-height: 0.96;
}

.hero__subline {
  margin-top: 0.6em;
  font-family: var(--font-head);
  font-size: var(--fs-subline);
  font-weight: 300;
  line-height: 1.32;
  color: var(--akzent);
}

.hero__text {
  margin-top: 1.1em;
  max-width: 21em;   /* Sicherheitsnetz — der Umbruch steht im Markup;
                        weit genug für die längere englische Zeile */
  font-size: var(--fs-hero-text);
  line-height: 1.36;
  color: var(--text-ruhig);
}

/* Kleinzeile ueber dem Knopf ("Zum Start oeffne ich Naturewalk nur fuer
   einen kleinen ersten Kreis."). Bewusst nicht in Kicker-Versalien: neben
   dem echten Kicker weiter oben waere das eine Wiederholung. */
.hero__hinweis {
  margin-top: 1.4em;
  font-size: var(--fs-mini);
  line-height: 1.5;
  color: var(--text-leise);
}

/* v2 setzt eine Zeile ueber den Knopf. Der alte Abstand stammt aus einem
   Hero, in dem direkt ueber dem Knopf der Fliesstext endete — unveraendert
   ruckte der Knopf jetzt zu weit nach unten. */
.hero__aktion { margin-top: clamp(18px, 2vw, 26px); }

/* Buendig mit dem uebrigen Hero-Text, nicht unter der Knopfbeschriftung.
   In v1 stand hier ein Einzug von 2.2em, damit die Zeile mittig unter dem
   Knopf sass. Neben Kicker, Ueberschrift, Absatz und Hinweiszeile — die
   alle an derselben Kante beginnen — liest sich dieser eine Einzug als
   Fehler und nicht als Absicht. */
.hero__preis {
  margin-top: 1.1em;
  font-size: var(--fs-klein);
  color: var(--text-leise);
}

/* --- 4.3 Icon-Reihen (Merkmale + Vorteile) ------------------------------- */

/* v1 hatte fuenf Zellen je Reihe, v2 hat vier — in beiden Reihen. */
.reihe {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
}

.reihe__zelle {
  position: relative;
  display: flex;
  flex-direction: column;
  align-items: center;
  padding-inline: clamp(12px, 1.6vw, 24px);
  text-align: center;
}

/* Trenner zwischen den Zellen.
   Im Mockup sind das keine Vollton-Linien: senkrecht wie waagerecht laufen
   sie an beiden Enden weich aus (gemessen am Trenner x=290: unsichtbar bei
   y≈1335, Maximum #3C3835 in der Mitte, wieder unsichtbar bei y≈1508).
   Deshalb Verläufe in Pseudo-Elementen statt border — die lassen sich in den
   umgebrochenen Layouts unten einzeln an- und abschalten, ohne dass eine
   Kante stehen bleibt.
     ::before = senkrechter Trenner links
     ::after  = waagerechter Trenner oben (nur in umgebrochenen Reihen)     */
.reihe__zelle::before,
.reihe__zelle::after {
  content: "";
  position: absolute;
  display: none;
  pointer-events: none;
}

.reihe__zelle::before {
  inset-block: 0;
  inset-inline-start: 0;
  width: 1px;
  background: linear-gradient(
    to bottom,
    transparent 0%, var(--linie) 18%, var(--linie) 82%, transparent 100%
  );
}

.reihe__zelle::after {
  inset-inline: 0;
  top: 0;
  height: 1px;
  background: linear-gradient(
    to right,
    transparent 0%, var(--linie) 18%, var(--linie) 82%, transparent 100%
  );
}

/* Desktop: fünf Spalten, Trenner vor jeder Zelle außer der ersten */
.reihe__zelle + .reihe__zelle::before { display: block; }

.reihe__icon {
  color: var(--gold-icon);
}

.reihe__titel {
  font-size: 1.25rem;
  font-weight: 400;
  line-height: 1.4;
  color: var(--gold);
}

.reihe__text {
  margin-top: 0.35em;
  max-width: 20em;
  font-size: 1.0625rem;
  line-height: 1.55;
  color: var(--text-leise);
}

/* Merkmale: großes Icon, Titel + Beschreibung.

   Bis v2 lag der Abschnitt als randlose Bande auf --flaeche, oben und unten
   über 72 px in den Seitengrund auslaufend. Diese Bande ist ersatzlos weg:
   sie war eine Farbfläche, und Farbflächen soll es nicht mehr geben. An
   ihre Stelle tritt ein Foto (.fond) mit der Tafel darauf — dieselbe
   Absicht, "eine ruhige Fläche, die sich vom Grund abhebt", nur mit einem
   Bild darunter statt einer Volltonfarbe. */
.merkmale {
  padding-block: var(--raum-l);
}

.merkmale .reihe__icon {
  width: var(--icon-merkmal); height: var(--icon-merkmal);
  stroke-width: 1.1;
  margin-bottom: 20px;
}

/* Vorteile: kleineres Icon, nur Label */
.vorteile { padding-block: var(--raum-l); }

/* Kein eigener Schleier mehr, sondern der Grundverlauf aus .fond.

   Bis hierher lag ueber diesem Abschnitt ein flacher Schleier mit 88 %
   Deckung. Grund war, dass die Beschriftungen frei auf dem Foto standen und
   der Ausschnitt hier ein helles Stueck des Mooses trifft — bei nur rund
   150 px Bandhoehe blieb kein Platz fuer einen Verlauf, der zur Mitte hin
   aufmacht, also musste die Deckung durchgehend hoch sein. Der Abschnitt
   stand dadurch dunkler als seine Nachbarn.

   Seit die Reihe auf einer Glastafel sitzt (siehe .glas), traegt die Tafel
   die Schrift und der Grund darf offen bleiben. Damit sieht der Abschnitt
   aus wie die Merkmale darueber und wie die Preiskarte, auf die der Kunde
   gezeigt hat — dieselbe Deckung, derselbe Rand, derselbe Radius. */

.vorteile .reihe__icon {
  width: var(--icon-vorteil); height: var(--icon-vorteil);
  stroke-width: 1.2;
  margin-bottom: 14px;
}

/* „Auf allen Geräten" ist im Mockup als einziges Zeichen deutlich breiter
   als hoch (54 x 35 px gegen 28–43 px Breite bei den Nachbarn). Sein Symbol
   hat deshalb eine 30 statt 24 Einheiten breite viewBox; damit es nicht
   gestaucht wird, bekommt es hier dieselbe Höhe und die passende Breite. */
.vorteile .reihe__icon--breit {
  width: calc(var(--icon-vorteil) * 30 / 24);
}

.vorteile .reihe__titel {
  font-size: 1.125rem;
  color: var(--text-ruhig);
}

/* --- 4.4 Foto-Untergrund für beliebige Abschnitte ------------------------ */

/* .fond legt ein Foto unter einen Abschnitt, der seine Höhe weiterhin selbst
   bestimmt. Der Unterschied zu .foto weiter unten: .foto ist ein Schaustück
   mit eigener Mindesthöhe und mittigem Satz, .fond ist nur Untergrund und
   mischt sich in die Gestaltung des Abschnitts nicht ein.

   Warum es das überhaupt gibt: die Kundin will nirgends mehr eine blanke
   Farbfläche sehen, jeder Abschnitt soll auf einem Bild stehen. Sechs der
   zehn Blöcke waren bisher flach.

   Der Schleier erreicht bewusst NIE volle Deckung. Liefe er wie frueher bei
   .foto in ein deckendes --tiefe aus, stuende an jeder Naht ein Streifen
   blanker Farbe; genau das soll weg. Die Farbe unter dem Bild bleibt
   trotzdem --tiefe: sie fuellt die Halbpixelzeile, die beim Skalieren an
   einer Abschnittskante entstehen kann, und liegt so nah am Schleier, dass
   sie dort nicht auffaellt.

   Er laeuft ausserdem fast flach durch (78/72/78). Bis zur zweiten
   Rueckmeldung schloss er an beiden Raendern auf 92 %, damit die Naht im
   Dunkeln verschwindet. Das hat die Naht zwar versteckt, aber jeden
   Abschnitt in einen dunklen Rahmen gesetzt — die Seite las sich als Stapel
   von Tafeln, und genau das hat die Kundin gemeldet. Seit es die Blende
   gibt (Abschnitt 4.4a), braucht die Naht keine Verdunklung mehr.

   72 % in der Mitte sind der Arbeitswert fuer Text: ueber einem Foto der
   Helligkeit 3,5 ergibt das gemessen 9,3:1, ueber dem hellsten der neuen
   Motive (13,5) noch 6,7:1. Bei 78 % an den Raendern wird es nicht
   schlechter, sondern minimal besser — mehr Deckung heisst dunkler.        */
.fond {
  position: relative;
  isolation: isolate;
  background: var(--tiefe);
}

.fond__bild {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  z-index: 0;
}

.fond > picture::after {
  background: linear-gradient(
    to bottom,
    rgb(var(--scrim) / 78%)   0%,
    rgb(var(--scrim) / 74%)  14%,
    rgb(var(--scrim) / 72%)  50%,
    rgb(var(--scrim) / 74%)  86%,
    rgb(var(--scrim) / 78%) 100%
  );
}

.fond > .container { position: relative; z-index: 2; }

/* --- 4.4a Blende: ein Foto geht in das naechste ueber -------------------- */

/* Die Kundin hat in der zweiten Runde zweimal dasselbe verlangt: "there
   should always be a fade from one image to the next". Runde eins hat den
   ersten Teil geliefert — nirgends mehr blanke Farbe — den zweiten nicht.
   Die Fotos stiessen weiterhin stumpf aneinander.

   Warum das trotz gleicher Helligkeit sichtbar war: an jeder Naht lagen die
   Werte gemessen bei 1,5 bis 2,2, es gab also keine Helligkeitskante. Die
   Kante war eine Texturkante — oberhalb Moos, unterhalb Nadelwald, dazwischen
   eine gerade Linie quer ueber den Schirm. Das Auge findet so etwas auch
   ohne Helligkeitsunterschied.

   Dazu kam die Rhythmik: jeder Abschnitt schloss oben und unten mit 92 %
   Deckung. Zwischen zwei Abschnitten standen damit zwei zulaufende Raender
   uebereinander, und die Seite las sich als Stapel einzeln gerahmter Tafeln
   statt als eine Landschaft. Deshalb laeuft der Schleier in .fond jetzt fast
   flach durch (78/72/78 statt 92/72/92); die Kantenverdunklung war nur dazu
   da, die Naht zu verstecken, und die Naht gibt es nicht mehr.

   Die Blende selbst: die Bildschicht eines Abschnitts reicht um --blende
   nach oben in den Vorgaenger hinein und wird dort weggeblendet. Weil der
   Abschnitt spaeter im Dokument steht, liegt er obenauf — im Blendenband
   loest sich also das obere Foto in das untere auf.

   Entscheidend ist, dass Foto UND Schleier gemeinsam maskiert werden, nicht
   jedes fuer sich. Deshalb sitzt die Maske am <picture> und der Schleier als
   dessen ::after darin. Maskierte man beide einzeln, faellt im Band auch die
   Deckung des Schleiers ab, und das durchscheinende Foto stuende dort heller
   als in beiden Nachbarn — statt einer Naht ein heller Streifen. Gerechnet:
   in der Bandmitte kaeme das eintretende Foto mit 27 % statt 4 % durch.

   Die Maske laeuft nicht geradlinig, sondern in sechs Stufen. Ein gerader
   Alpha-Verlauf endet an einem Knick, und diesen Knick sieht das Auge als
   Linie — dasselbe Argument wie beim Verlauf in .stimmung, dort nachgemessen
   mit 11,5 gegen 5,3 Helligkeitssprung je Pixel.

   --blende steht per Vorgabe auf 0. Nur Abschnitte, die einen Vorgaenger
   haben, bekommen einen Wert: der erste Abschnitt einer Seite hat nichts,
   in das er ueberblenden koennte, und wuerde oben durchsichtig werden.      */
:root { --blende: 0px; }

main > section:not(:first-child),
.fuss {
  --blende: clamp(96px, 10vw, 200px);
}

/* Bildschicht eines Abschnitts: Foto und Schleier in EINER maskierten Ebene.
   <picture> traegt sonst display: contents (siehe Abschnitt 2) und faellt aus
   der Darstellung heraus; hier wird es gebraucht, weil nur ein echtes Element
   Maske und Schleier zusammenhalten kann.

   Der Verlauf steht ausgeschrieben und nicht in einer eigenen Variablen —
   der naheliegende Weg funktioniert naemlich nicht: eine Eigenschaft, die
   var(--blende) enthaelt, bekommt diesen Wert schon dort eingesetzt, wo sie
   deklariert ist. Am :root waeren das die vorgegebenen 0 px, und die Maske
   waere ueberall vollflaechig deckend. Genau so gemessen: statt einer Blende
   stand eine harte Kante 128 px ueber der Abschnittsgrenze.

   Der letzte Stopp haelt seine Farbe bis zum Ende, der Rest der Ebene bleibt
   also unmaskiert. Bei --blende: 0px fallen alle Stopps auf 0 zusammen und
   die Maske ist durchgehend deckend — der erste Abschnitt einer Seite bleibt
   damit unveraendert.                                                       */
.fond > picture,
.foto > picture {
  display: block;
  position: absolute;
  inset: calc(-1 * var(--blende)) 0 0 0;
  z-index: 0;
  pointer-events: none;
  -webkit-mask-image: linear-gradient(
    to bottom,
    rgb(0 0 0 /   0)                              0px,
    rgb(0 0 0 / 0.03) calc(var(--blende) * 0.14),
    rgb(0 0 0 / 0.16) calc(var(--blende) * 0.32),
    rgb(0 0 0 / 0.44) calc(var(--blende) * 0.52),
    rgb(0 0 0 / 0.76) calc(var(--blende) * 0.72),
    rgb(0 0 0 / 0.95) calc(var(--blende) * 0.88),
    rgb(0 0 0 /   1)       var(--blende));
  mask-image: linear-gradient(
    to bottom,
    rgb(0 0 0 /   0)                              0px,
    rgb(0 0 0 / 0.03) calc(var(--blende) * 0.14),
    rgb(0 0 0 / 0.16) calc(var(--blende) * 0.32),
    rgb(0 0 0 / 0.44) calc(var(--blende) * 0.52),
    rgb(0 0 0 / 0.76) calc(var(--blende) * 0.72),
    rgb(0 0 0 / 0.95) calc(var(--blende) * 0.88),
    rgb(0 0 0 /   1)       var(--blende));
}

/* Der Schleier deckt den Abschnitt selbst, nicht das Blendenband: inset oben
   um --blende versetzt. Damit beziehen sich alle Prozentstopps der einzelnen
   Abschnitte weiterhin auf deren eigene Hoehe und muessen nicht umgerechnet
   werden.                                                                   */
.fond > picture::after,
.foto > picture::after {
  content: "";
  position: absolute;
  inset: var(--blende) 0 0 0;
  z-index: 1;
}

/* Im Blendenband gilt der Randwert des eintretenden Abschnitts, konstant.
   Er entspricht dem 0-%-Stopp des jeweiligen Schleiers, sonst saesse an der
   Abschnittsoberkante eine Stufe.                                           */
.fond > picture::before,
.foto > picture::before {
  content: "";
  position: absolute;
  inset: 0 0 auto 0;
  height: var(--blende);
  z-index: 1;
  background: rgb(var(--scrim) / var(--kante, 78%));
}

/* Halbdurchsichtige Tafel über einem Foto.

   Das ist kein neuer Einfall, sondern die Preiskarte (.preis__karte), auf
   die der Kunde im Video acht Sekunden lang gezeigt und "chic" gesagt hat —
   dieselbe Deckung, derselbe Rand, derselbe Radius. Sie gehört nur auf
   dunkle Motive: über --flaeche-glas mit 72 % ergibt ein Foto der
   Helligkeit 3 gemessen 8,4:1, ein helles (29) dagegen nur 4,3:1.          */
.glas {
  background: var(--flaeche-glas);
  border: 1px solid var(--rand);
  border-radius: var(--radius-karte);
  padding: clamp(22px, 3vw, 40px);
}

/* --- 4.5 Fließtext-Abschnitte (Übergang, Vertrauen) ---------------------- */

/* Zwei ruhige Textabschnitte. Bis v2 standen sie als Atempausen auf flachem
   Grund; seit v3 liegt auch unter ihnen ein Foto (.fond), weil blanke Farbe
   nirgends mehr vorkommen soll. Ruhig bleiben sie trotzdem: das Motiv ist
   dunkle Waldtextur ohne Blickfang, und der Schleier steht bei 72 %.
   Eine mittige Spalte, der Satz darin bleibt linksbündig — drei ganze
   Absätze zentriert zu setzen liest sich schlecht.

   Polster jetzt auf beiden Seiten. Vorher trug der Folgeabschnitt mit
   seinem oberen Polster den Abstand bei; als eigenes Bildband braucht der
   Abschnitt seinen Abstand selbst, sonst klebt der Text an der Naht.      */
.textblock {
  padding-block: var(--raum-l);
}

.textblock__spalte {
  max-width: 34em;
  margin-inline: auto;
}

.textblock h2 {
  font-size: var(--fs-h2);
  margin-bottom: 0.6em;
}

.textblock p + p { margin-top: 1em; }

.textblock p {
  color: var(--text-ruhig);
}

/* Der Uebergangstext ("Vieles von mir siehst du oeffentlich ...") ist die
   erste eigene Stimme nach dem Hero und trug bisher nur Fliesstextgroesse.
   Er steht jetzt eine Stufe groesser und skaliert mit der Fensterbreite.
   Bewusst nur hier und nicht auf .textblock p: der Vertrauensblock nutzt
   dieselbe Klasse und soll ruhig bleiben. Der Takt-Satz am Ende behaelt
   seine eigene, groessere Groesse, deshalb die Ausnahme. */
.persoenlichkeit p:not(.textblock__takt) {
  font-size: clamp(1.1875rem, 1.55vw, 1.4375rem);
  line-height: 1.62;
}

/* Die letzte Zeile des Übergangs ("Ich gehe. Ich spüre. …") steht im
   Briefing als eigener Takt, nicht als weiterer Absatz — sie bekommt die
   Serife und etwas mehr Luft davor.                                       */
.textblock__takt {
  margin-top: 1.6em;
  font-family: var(--font-head);
  font-size: var(--fs-subline);
  line-height: 1.32;
  color: var(--akzent);
}

/* --- 4.6 Zitat-Karte ----------------------------------------------------- */

/* In v1 saß die Karte in der schmalen linken Spalte des "Für dich"-Rasters,
   das es nicht mehr gibt. Freistehend braucht sie eine eigene Breite —
   ohne die Deckelung liefe sie sonst über die ganze Seite.                 */
.zitatblock {
  padding-block: var(--raum-l);
  text-align: center;
}

.zitat {
  display: flex;
  align-items: center;
  gap: 14px;
  /* 600 px hält die zweite Zitatzeile auf zwei Zeilen — genau der Umbruch,
     den die Karte in v1 in ihrer 397 px breiten Spalte hatte. Ohne die
     Deckelung zerfiele das Zitat freistehend in eine einzige lange Zeile. */
  max-width: 600px;
  margin: 0 auto;
  padding: 18px;
  /* Deckung statt Vollton, seit unter der Karte ein Foto liegt: --flaeche
     als undurchsichtiger Block waere hier wieder die blanke Farbflaeche,
     die weg soll. Derselbe Ton, nur mit 72 % — wie bei .glas und der
     Preiskarte. */
  background: var(--flaeche-glas);
  border: 1px solid var(--rand);
  border-radius: var(--radius-karte);
  text-align: left;
}

/* Kleinzeile unter einem CTA — dieselbe Stimme wie .hero__preis, aber
   mittig, weil die Blöcke unterhalb des Heros zentriert stehen. */
.cta-klein {
  margin-top: 1.1em;
  font-size: var(--fs-klein);
  color: var(--text-leise);
}

.aktion { margin-top: clamp(26px, 2.8vw, 36px); }

/* Das Porträt bestimmt die Höhe der Karte: im Mockup misst es 96 px bei
   137 px Kartenhöhe (70 %) und sitzt exakt mittig — gemessene Polster oben
   20, unten 21. Mit 64 px stand es deutlich zu klein in einer Karte, die
   dadurch oben und unten zu viel Luft hatte. */
.zitat__bild {
  width: var(--zitat-bild); height: var(--zitat-bild);
  flex: none;
  border-radius: 50%;
  object-fit: cover;
}

/* Ink-Breite der zweiten Zeile im Mockup 250 px, gerendert waren es 206 —
   die Schrift stand rund 19 % zu klein. Der Zeilenabstand von 29 px ergibt
   sich bei 17 px Schrift wieder aus dem unveränderten line-height 1.7. */
.zitat__text {
  margin: 0;
  font-size: var(--fs-zitat);
  line-height: 1.7;
  color: rgb(242 237 232 / 84%);
}

/* Die Signatur ist kein Schriftsatz mehr, sondern images/Sign.png —
   Schriftzug und Herz stecken zusammen in der Datei. Sie liegt rein weiß
   auf transparentem Grund; die Deckkraft bringt sie auf denselben Ton, den
   Pinyon Script vorher hatte (rgb(242 237 232 / 74%) über --tiefe ergibt
   180, Weiß bei 0.7 ergibt 180). line-height: 0 verhindert, dass die
   Zeilenbox unter dem Bild die Karte höher macht als das Porträt. */
.zitat__signatur {
  margin-top: 13px;       /* Mockup: 32 px von der Zitat- zur Signaturzeile */
  line-height: 0;
}

.zitat__signatur img {
  height: 28px;           /* Mockup: Ink der Signaturzeile 28 px */
  width: auto;
  opacity: 0.7;
}

/* --- 4.7 Vertrauensblock — Text links, Foto rechts ----------------------- */

/* Das Raster stammt aus dem "Für dich"-Abschnitt von v1, nur andersherum
   gewichtet: hier trägt der Text, das Foto steht als ruhige Fläche daneben.
   Über dem Bild steht kein Wort — deshalb braucht es hier keinen Schleier,
   und es ist die einzige Fotostelle der Seite ganz ohne Kontrastrisiko. */
/* Das Paar ist gedeckelt und steht mittig, statt die volle Containerbreite
   auszufuellen. Ohne Deckel wuchs die Bildkarte ungebremst mit dem Fenster:
   bei 2000 px stand sie 734 x 978 px neben drei Zeilen Text von zusammen
   271 px Hoehe — 708 px Leerraum in einem Abschnitt, der ruhig wirken soll.
   Der Text hatte seinen Deckel (30em) laengst, das Bild nicht.

   Der Deckel sitzt am Raster, nicht an den Spalten: so bleibt das
   Verhaeltnis 1.4 : 1 auch dann erhalten, wenn der Platz knapp wird, und
   der Text behaelt die groessere Haelfte. Spalten mit eigenem em-Deckel
   schrumpfen stattdessen zu gleich breiten Haelften. */
.vertrauen__raster {
  display: grid;
  grid-template-columns: minmax(0, 1.4fr) minmax(0, 1fr);
  gap: clamp(24px, 3vw, 48px);
  align-items: center;
  max-width: 52em;
  margin-inline: auto;
}

.vertrauen__spalte { max-width: 30em; }

/* Bildkarte — der Rahmen des früheren Video-Platzhalters. Ein Unterschied:
   die Kanten laufen NICHT mehr weich in den Grund aus. Das Auslaufen war
   für einen randlosen Block gedacht; eine gerahmte Karte will eine klare
   Kante, sonst franst der Rand über dem Verlauf aus. */
.bildkarte {
  position: relative;
  aspect-ratio: 3 / 4;
  border-radius: var(--radius-video);
  border: 1px solid var(--rand);
  overflow: hidden;
  /* Grund unter dem Foto, sichtbar solange es lädt. --nacht wäre der
     naheliegende Palettenton, ist aber der einzige blaustichige (H240°)
     und stünde als kalter Fleck in einer durchgehend warmen Seite. */
  background: var(--flaeche);
}

.bildkarte img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: 50% 60%;   /* schneidet den ausgebrannten Himmel oben ab */
}

/* --- 4.8 Randlose Foto-Abschnitte (Stimmung, Abschluss) ------------------ */

/* Zwei Abschnitte laufen über die volle Breite und tragen den Text direkt
   auf dem Foto. Kein 100vw und kein background-attachment: fixed — das
   erste erzeugt unter Windows einen Überlauf in Breite der Scrollleiste,
   das zweite ist auf iOS kaputt. Stattdessen ein absolut gesetztes <img>,
   damit srcset, loading und object-position überhaupt greifen können.

   Die Höhe hängt an der Breite, nicht an vh: auf dem Handy schiebt die
   ein- und ausfahrende Adressleiste sonst das Layout.
     375 px  → Untergrenze  384 px
     768 px  → 430 px
     1280 px → Obergrenze   672 px, und darüber bleibt es dabei.           */
/* Kein overflow: hidden mehr. Es klammerte frueher nichts ein — das Foto
   liegt mit inset: 0 innerhalb — und wuerde jetzt die Blende abschneiden,
   die absichtlich nach oben in den Vorgaenger reicht (Abschnitt 4.4a). */
.foto {
  position: relative;
  display: grid;
  align-items: end;
  min-height: clamp(24rem, 56vw, 42rem);
}

.foto__bild {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  z-index: 0;
}

/* Schleier. Oben und unten blendet er in den Seitengrund, damit nirgends
   eine harte Fotokante steht — dieselbe Sprache wie am Hero. Der kräftige
   Anteil sitzt unten, wo der Text steht.

   Oben wie unten 84 %, kein Vollton mehr an keiner der beiden Kanten. Bis
   zur zweiten Rueckmeldung stand oben --tiefe; das war die Reserve gegen
   eine helle Haarlinie an der Abschnittsgrenze — Abschnittsraender fallen
   nicht zwangslaeufig auf ganze Geraetepixel (nachgemessen endete ein
   Abschnitt bei 4075,922 px in einem 4076 px hohen Dokument), und Chrome
   mischt die angeschnittene Zeile aus Verlauf und Foto. Bei 84 % Deckung
   ist diese Mischung selbst schon fast --tiefe, das helle Foto kann dort
   also nicht mehr als Linie durchschlagen — und die Grenze selbst liegt
   seit der Blende (Abschnitt 4.4a) ohnehin mitten in einer Ueberblendung
   und nicht mehr auf einer Kante. */
.foto > picture::after {
  background:
    linear-gradient(to bottom,
      rgb(var(--scrim) / 84%)       0%,
      rgb(var(--scrim) / 0%)       18%,
      rgb(var(--scrim) / 0%)       38%,
      rgb(var(--scrim) / 78%)      78%,
      rgb(var(--scrim) / 84%)     100%);
}

/* Eigener Schleier fuer den Stimmungsabschnitt.
   Der gemeinsame Verlauf oben war zu breit angelegt: 18 % Auslauf am
   oberen Rand und ein Anstieg schon ab 38 % liessen bei 1920 x 672 px nur
   134 px voellig freies Foto stehen — ein Fünftel der Abschnittshoehe.
   Der Rest lag unter Schleier, und der Abschnitt las sich als schmaler
   Bildstreifen zwischen zwei dunklen Baendern.

   Das Foto ist ueber die ganze Hoehe fast gleich hell (L 34–37 %), oben
   braucht es also gar keine Deckung — der kurze Auslauf dort ist reine
   Kantenpflege zum vorigen Abschnitt. Gebraucht wird sie nur unter dem
   Satz, und dort sind es nachgerechnet 65 %. Also: Auslauf kuerzer,
   Anstieg spaeter, dafuer unter dem Satz etwas kraeftiger als zuvor.

   Der obere Auslauf laeuft NICHT geradlinig, sondern in fuenf Stufen:
   erst schnell, dann mit langem flachem Ausklang. Ein gerader Verlauf
   endet an einem Knick — die Helligkeit steigt gleichmaessig und hoert
   dann schlagartig auf zu steigen, und genau diesen Knick sieht das Auge
   als Kante, gerade weil das Foto direkt darunter hell ist. Gemessen als
   groesster Helligkeitssprung je Pixel: gerade Rampe 11,5, gestufte 5,3
   (Tausendstel, 1905 x 672 px). Das Foto steht dabei fast gleich frueh
   offen, y = 73 px statt 46 px.

   Anfang und Ende liegen bei 90 % beziehungsweise 84 % Deckung, nicht bei
   voller Farbe. Bis v2 stand oben --flaeche, weil darueber die Merkmal-Bande
   lag; die gibt es nicht mehr, oben und unten steht jetzt ebenfalls ein Foto
   unter Schleier. Wertgleich ist die Naht damit weiterhin, nur ohne
   Volltonfarbe: die Nachbarn schliessen mit 78 % ueber einem Motiv der
   Helligkeit 3, dieser Abschnitt mit 90 % ueber einem Motiv der Helligkeit
   20. Etwas dichter als die Nachbarn muss er sein, weil sein Foto das mit
   Abstand hellste der Seite ist. Ausserdem liegt die Grenze seit der Blende
   (Abschnitt 4.4a) in einer Ueberblendung: der Wertsprung verteilt sich
   ueber gut hundert Pixel statt auf eine Zeile.

   Bewusst an .stimmung und nicht an .foto: .preis auf der Preisseite
   traegt einen ganzen Block statt eines Satzes und behaelt den Grundwert. */
.stimmung { --kante: 90%; }

/* Christinas neues Foto (2026-08-24): der Rahmen in tools/bilder.py laesst
   die volle Bildhoehe stehen, aber .foto selbst rendert deutlich flacher
   als das Zuschnittsverhaeltnis dort (min-height: 56vw statt 72%) - object-
   fit: cover schneidet dadurch am Bildschirm nochmal nach, mittig per
   Vorgabe. Jose fand das zu nah an ihrem Kopf: Schleife nach unten
   verschoben, damit mehr von ihr (Hals abwaerts) und mehr Wald sichtbar
   bleibt statt oben abgeschnitten zu werden. Reine Positionsverschiebung
   im bereits vorhandenen Bildausschnitt, kein zusaetzlicher Zuschnitt. */
.stimmung .foto__bild { object-position: 50% 75%; }

/* Der Abschnitt traegt seit dem Zusammenlegen mit dem Zitatblock deutlich
   mehr Text ueber mehr Hoehe als zuvor (siehe 4.8a). Die alte Kurve ging
   zwischen 17% und 42% bis auf 0% Deckung runter — das war fuer den
   kurzen Einzeiler vorher unproblematisch, liegt jetzt aber genau dort,
   wo "Vielleicht bist du..." steht, und macht den Text auf dem hellen,
   kontrastreichen Foto (Gegenlicht, Laub) kaum lesbar. Durchgehend
   mindestens 45% Deckung statt eines offenen Fensters. */
/* 2026-08-25, Lukas' Rueckmeldung: sie soll sichtbarer sein, Deckung
   reduziert statt der Farbe geaendert. Nicht unter das dokumentierte
   Minimum von 45 % (siehe oben), sonst wird "Vielleicht bist du..."
   unleserlich. Vorlaeufig, mit Jose live geprueft. */
.stimmung > picture::after {
  background: linear-gradient(
    to bottom,
    rgb(var(--scrim) / 75%)   0%,
    rgb(var(--scrim) / 63%)   6%,
    rgb(var(--scrim) / 45%)  14%,
    rgb(var(--scrim) / 45%)  25%,
    rgb(var(--scrim) / 45%)  42%,
    rgb(var(--scrim) / 45%)  55%,
    rgb(var(--scrim) / 55%)  70%,
    rgb(var(--scrim) / 63%)  90%,
    rgb(var(--scrim) / 69%) 100%
  );
}

.foto__inhalt {
  position: relative;
  z-index: 2;
  padding-block: clamp(36px, 5vw, 72px);
  text-align: center;
}

/* Auf dem Foto steht ausschließlich großer Satz. Der hellste Fleck in
   hintergrund-stimmung.jpg liegt bei L≈79 % — bei 78 % Schleier trägt das
   die 3:1-Schwelle für Schrift ab 24 px, aber keine Kleinschrift mehr.
   Deshalb hier kein --text-leise und keine Kicker-Zeile.                   */
.foto__satz {
  max-width: 24em;
  margin-inline: auto;
  font-family: var(--font-head);
  font-size: var(--fs-abschluss);
  font-weight: 300;
  line-height: 1.3;
  color: var(--text);
  text-wrap: balance;
}

/* --- 4.9 Startvideo im Hero ---------------------------------------------- */

/* Stand v2: es gibt noch kein echtes Video. Im Hero liegt ein Standbild,
   darauf das Play-Zeichen — aber als reine Zeichnung (<span aria-hidden>),
   nicht als Knopf. Ein Knopf, der auf den Klick schweigt, ist schlechter
   als gar keiner. Sobald Christinas Film vorliegt, wird aus dem <span> ein
   <button id="hero-video-play"> und neben das Bild ein
   <video id="hero-video">; video.js hängt sich dann von selbst ein
   (siehe README). Die Regeln unten gelten für beide Zustände.

   Das Video ersetzt das fruehere Hero-Bild und wird genauso beschnitten.
   Der Verlauf darueber (.hero__bild::after) bleibt, solange das Video
   ruht; beim Abspielen wird er ausgeblendet und der Block nimmt Klicks an. */
.hero__video {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: 50% 28%;
  /* 2026-08-26, Jose: Christina wirkt auf dem Standbild blass. Der
     Filter stand zuerst auf .hero__bild img, hatte dort aber gar keine
     Wirkung: das <video id="hero-video"> traegt dasselbe Bild als
     poster="..." und steht im Markup NACH dem <picture>, faerbt also,
     ohne eigenen z-index, einfach ueber dem <img> — sichtbar ist immer
     das Video-Element, auch im Ruhezustand vor dem Abspielen. Beide
     Elemente tragen die Klasse .hero__video, deshalb hier statt dort:
     wirkt so auf das ruhende Poster-Bild UND spaeter auf das laufende
     Video gleichermassen. Aus komprimiertem H.264-Material gezogene
     Standbilder wirken fast immer flacher als ein echtes Foto, das ist
     die vermutete Ursache, nicht der Schleier (eigenes ::after/::before,
     wirkt hier gar nicht mit rein). Bewusst als filter, nicht im
     Bild-Pipeline-Schritt (tools/bilder.py): laesst sich live in einer
     Zahl nachjustieren. */
  filter: saturate(1.3) contrast(1.06);
}

.hero__bild[data-playing] {
  pointer-events: auto;
}

/* "Once the person clicks on the video the text disappears" — aus dem
   Feedback-Video, 0:44.

   Das geht ohne eine Zeile JavaScript: video.js setzt beim Start ohnehin
   data-playing auf den Bildblock, und der steht im selben Abschnitt vor
   der Textspalte. Der Geschwister-Selektor greift das ab. video.js bleibt
   damit unveraendert — so, wie es in seinem Kopf zugesichert ist.

   visibility zusaetzlich zu opacity, nicht nur opacity: sonst bleibt der
   unsichtbare Text in der Tabreihenfolge, und der Fokus wandert beim
   Tabben in ein Nichts. display: none waere zu grob, damit gaebe es
   keinen Uebergang.

   Der Text kommt zurueck, sobald das Video pausiert oder zu Ende ist —
   video.js nimmt data-playing dann wieder weg. Das ist kein Beiwerk: im
   Hero steht der erste Kaufknopf der Seite. Verschwaende er dauerhaft,
   naehme das Video der Seite ihre Hauptbewegung.                          */
.hero__inhalt {
  transition: opacity 420ms ease, visibility 420ms;
}

.hero__bild[data-playing] ~ .container .hero__inhalt {
  opacity: 0;
  visibility: hidden;
}

/* Der Verlauf bleibt auch waehrend des Abspielens stehen: er ist die weiche
   Kante zum Text links und zum Seitengrund unten, ohne ihn endet das
   laufende Video an zwei harten Linien. Er liegt ueber dem Video und darf
   keine Klicks abfangen, sonst erreicht ein Klick das Video nie (Pause und
   Weiter laufen darueber). */
.hero__bild::after {
  pointer-events: none;
  transition: opacity 420ms ease;
}

/* Auf Wunsch entfernt: der Verlauf stand bisher auch waehrend des
   Abspielens, damit der Text darueber immer lesbar bleibt. Der Text
   verschwindet aber ohnehin sobald das Video laeuft (siehe oben), also
   braucht es den Verlauf in diesem Zustand nicht mehr — er machte das
   Video nur unnoetig duester. */
.hero__bild[data-playing]::after {
  opacity: 0;
}

/* Das Video atmet leicht ueber seine Kante hinaus (siehe @keyframes atem);
   ohne diese Klammer entsteht daraus ein waagerechter Scrollbalken. */
.hero__bild {
  overflow: hidden;
}

.hero__play {
  position: absolute;
  inset: 0;
  z-index: 2;              /* ueber Verlauf und weicher Kante */
  display: grid;
  place-items: center;
  width: 100%;
  padding: 0;
  border: 0;
  background: transparent;
  color: var(--kalk);
}

/* Seit der Bildblock die volle Breite füllt, säße das Zeichen bei
   place-items: center mitten auf der Überschrift — vorher lag die Mitte
   des Blocks bei 58 % Breite und damit von selbst rechts vom Satz.
   Das linke Polster schiebt es zurück in die rechte Hälfte: zentriert
   wird nur noch der Rest, die Mitte liegt damit bei rund 74 %. Die
   Textspalte endet spätestens bei 720 px, auf 1280 px also bei 56 %. */
@media (min-width: 900px) {
  .hero__play { padding-left: 48%; }
}

/* Nur wenn das Zeichen tatsaechlich ein Knopf ist, verhaelt es sich auch
   wie einer. Als <span> faengt es keine Klicks ab — sonst laege ein
   unsichtbares Feld ueber dem halben Hero, das nichts tut.               */
span.hero__play { pointer-events: none; }

button.hero__play {
  cursor: pointer;
  pointer-events: auto;     /* .hero__bild selbst nimmt keine Klicks an */
}

button.hero__play:hover .video__zeichen,
button.hero__play:focus-visible .video__zeichen {
  transform: scale(1.06);
}

/* Ring und Dreieck kommen zusammen aus einem Zeichen (#i-video-play,
   Vorlage images/play.svg): der Ring ist kein CSS-Rahmen, sonst stuende
   das Dreieck nur auf rund 14 % des Ringdurchmessers statt auf den 32 %
   der Vorlage.
   --icon-play ist der *Ringdurchmesser*. Der Kreis in #i-video-play hat
   r=10.5 in einer 24er viewBox, fuellt sein Feld also nur zu 21/24 — das
   Feld muss entsprechend groesser sein, damit der Ring auf dem Token-Mass
   landet. */
.video__zeichen {
  width: calc(var(--icon-play) * 24 / 21);
  height: calc(var(--icon-play) * 24 / 21);
  transition: transform 0.25s ease;
}

/* --- 4.9a Video im Abschluss ----------------------------------------------

   Gleiches Prinzip wie der Hero (4.9), anderer Wirt: statt eines eigenen
   Bildblocks (.hero__bild) sitzt das Video hier direkt im .foto.abschluss
   Abschnitt, als Geschwister von <picture>. .foto__bild liefert Groesse
   und object-fit: cover bereits mit (beide teilen die Klasse), diese Regeln
   ergaenzen nur den Ausschnitt und die Ebene.

   z-index: <picture> liegt auf 0, ihr ::after-Schleier auf 1 (siehe .foto >
   picture::after), .foto__inhalt auf 2. Das Video steht mit .foto__bild
   ebenfalls auf 0 und rangiert damit unter dem Schleier — der Text bleibt
   also auch bei ruhendem Video lesbar. Der Knopf braucht mehr als der
   Schleier, deshalb 3, nicht 2: sonst laege die Textspalte optisch davor.  */

/* --- 4.9a Video in der Vertrauen-Karte -------------------------------------

   .bildkarte ist schon position:relative + overflow:hidden mit fester
   3:4-Flaeche (siehe 4.7), Video und Knopf liegen hier absolut in
   derselben Flaeche statt eines einzelnen <img>. Kein Schleier in dieser
   Karte noetig, sie sitzt selbst auf dem fond-Foto des Abschnitts. */
.bildkarte__video {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: 50% 60%;
}



/* --- 4.10 Abschluss ------------------------------------------------------- */

/* Der Abschluss ist der zweite randlose Fotoabschnitt: Hoehe, Bild und
   Schleier kommen aus .foto, hier steht nur der Inhalt darin. Er bekommt
   mehr Luft als der Stimmungsabschnitt, weil unter dem Satz noch der
   dritte CTA und seine Kleinzeile stehen. */
.abschluss .foto__inhalt {
  padding-block: clamp(48px, 7vw, 96px);
}

/* Der Abschluss braucht mehr Hoehe als der Stimmungsabschnitt: dort steht
   ein Satz, hier vier Elemente (Strich, zwei Zeilen, CTA, Kleinzeile) von
   zusammen rund 400 px. In der gemeinsamen Hoehe fuellte der Textblock
   60 % des Abschnitts und begann schon bei 30 % — dort ist der gemeinsame
   Schleier noch voellig offen. Mehr Hoehe schiebt den Block nach unten und
   laesst oben Foto stehen. */
.abschluss {
  min-height: clamp(30rem, 68vw, 50rem);
  /* Groessere Blende als der Standard (96-200px): das FAQ-Foto davor ist
     gleichmaessig dunkel-blaugruen, das Abschluss-Foto beginnt mit einem
     dunklen Blaetterdach und wird darunter schnell hell (Abendsonne). Der
     Sprung zwischen beiden Motiven ist staerker als bei den uebrigen
     Uebergaengen, eine laengere Ueberblendung verteilt ihn auf mehr Platz
     statt auf eine sichtbare Zeile. */
  --blende: clamp(160px, 18vw, 340px);
}

/* Eigener Schleier, gerechnet gegen dieses Foto.
   hintergrund-abschluss.jpg ist Laub im Gegenlicht und stellenweise
   nahezu weiss — ohne Deckung misst die erste Zeile 1,02:1, sie steht
   dort praktisch unsichtbar. Nachgerechnet ueber die gesamte Textbreite
   braucht jede Zeile rund 70 %, die Kleinzeile unten 80 %, damit auch das
   hellste Pixel unter ihr noch 4,5:1 traegt.

   Kein offenes Fenster mehr. Ein erster Versuch liess das Foto zwischen
   12 % und 24 % bei nur 26 % Deckung stehen — auf einem so hellen Motiv
   war das kein Bildausschnitt, sondern ein heller Querbalken: dunkel
   darueber, dunkel darunter, dazwischen ein schmaler Streifen. Gemessen
   betrug die Helligkeitsspanne im oberen Drittel 129 (Tausendstel) bei
   einem groessten Sprung von 13,3 je Pixel.

   Jetzt laeuft die Deckung durchgehend und flach: vom Vollton an der
   Oberkante in vier Stufen auf ein Minimum von 55 %, dann ueber die halbe
   Abschnittshoehe sanft zurueck auf 80 %. Das Foto steht damit ueberall
   als Textur da statt an einer Stelle als Balken — Spanne 67, groesster
   Sprung 3,3. */
.abschluss { --kante: 90%; }

/* Neu abgestimmt auf das echte Foto (Christina unter dunklem Blaetterdach,
   Sonnenuntergang im unteren Drittel): die alte Kurve war auf ein sehr
   helles Platzhalterfoto gerechnet und sackte zwischendurch von 58% auf
   55% ab, bevor sie wieder auf 76% anstieg — genau dieser Einbruch-dann-
   Anstieg erzeugt eine sichtbare Naht, wenn das Foto an dieser Stelle
   selbst hell ist (hier: die Abendsonne). Jetzt durchgehend steigend,
   kein Auf und Ab. */
/* 2026-08-25, Lukas' Rueckmeldung: sie soll sichtbarer sein, Deckung
   reduziert statt der Farbe geaendert. Nicht unter das dokumentierte
   Minimum von 55 % (siehe oben). Vorlaeufig, mit Jose live geprueft. */
.abschluss > picture::after {
  background: linear-gradient(
    to bottom,
    rgb(var(--scrim) / 63%)   0%,
    rgb(var(--scrim) / 55%)  22%,
    rgb(var(--scrim) / 57%)  38%,
    rgb(var(--scrim) / 65%)  62%,
    rgb(var(--scrim) / 73%)  84%,
    rgb(var(--scrim) / 77%) 100%
  );
}

.abschluss__serif {
  font-family: var(--font-head);
  font-size: var(--fs-abschluss);
  font-weight: 300;
  line-height: 1.3;
  color: rgb(242 237 232 / 88%);
}

/* Die Schreibschrift-Zeile stand in v1 als Bild da (images/BottomSign.png
   je Sprache), weil sie aus der Mockup-Vorlage kam. In v2 lautet der Satz
   anders — "Echt. Sinnlich. Spontan. Unverstellt." statt "Echt. Ungeplant.
   Unverstellt." — und neue Bilddateien sind laut Briefing nicht erlaubt.
   Also echter Text in Pinyon Script, der Marken-Schreibschrift aus
   design-tokens.css. Nebeneffekt: beide Sprachfassungen sehen jetzt
   identisch aus (die englische Datei war in Satisfy auf 85,1 % gestaucht,
   um die deutsche Handschrift nachzuahmen), und die Zeile bricht am Handy
   normal um, statt als starres Bild zu schrumpfen.                        */
.abschluss__schrift {
  margin-top: 0.35em;
  font-family: var(--font-script);
  font-size: clamp(1.75rem, 3.6vw, 3rem);
  font-weight: 400;
  line-height: 1.35;
  letter-spacing: normal;
  text-transform: none;
  color: rgb(242 237 232 / 86%);
}

/* Das Herz stand mit in der alten Bilddatei — hier als eigenes Zeichen,
   damit das Motiv nicht verloren geht. */
.abschluss__herz {
  width: var(--icon-vorteil);
  height: var(--icon-vorteil);
  margin: 0.5em auto 0;
  stroke-width: 1.2;
  color: var(--gold-icon);
}

.abschluss__zeile {
  margin-top: 1.2em;
  font-size: var(--fs-hero-text);
  line-height: 1.4;
  color: var(--text-ruhig);
}


/* --- 4.11 FAQ ------------------------------------------------------------- */

/* Aufklappbare Fragen. Bewusst <button aria-expanded> statt <details>:
   der geschlossene Inhalt eines <details> steht auf display:none, damit
   laesst sich die Hoehe nicht animieren — und die Standardloesung dafuer
   (interpolate-size / ::details-content) gibt es Stand 2026 nur in
   Chromium. Mit dem Raster-Trick unten laeuft die Animation in allen drei
   Engines.

   Der zugeklappte Zustand haengt an .js-faq: ohne JavaScript stehen alle
   Antworten offen. Dasselbe Prinzip wie .js-enthuellen weiter unten — die
   Seite ist nie darauf angewiesen, dass ein Skript laeuft, um lesbar zu
   sein.                                                                    */
.faq { padding-block: var(--raum-l); }

/* Mittige Abschnittsüberschrift — genutzt von "Das erwartet dich" und
   vom FAQ. In v1 trugen die Icon-Reihen nur ein aria-label; v2 stellt
   die Überschrift sichtbar davor, weil die Seite doppelt so lang ist
   und sonst die Orientierung fehlt. */
.abschnitt__titel {
  font-size: var(--fs-h2);
  margin-bottom: clamp(20px, 2.4vw, 32px);
  text-align: center;
}

.faq__liste {
  max-width: 720px;
  margin-inline: auto;
}

/* Trenner wie ueberall auf der Seite: ein an den Enden auslaufender
   Verlauf, kein Vollton-Strich. Harte 1-px-Linien kommen im ganzen
   Entwurf nicht vor. */
.faq__punkt + .faq__punkt {
  background-image: linear-gradient(
    to right,
    transparent 0%, var(--linie) 18%, var(--linie) 82%, transparent 100%
  );
  background-size: 100% 1px;
  background-repeat: no-repeat;
  background-position: top;
}

.faq__frage { margin: 0; }

.faq__knopf {
  display: flex;
  width: 100%;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--raum-m);
  min-height: 44px;          /* Tippziel, auch wenn die Frage kurz ist */
  padding-block: 22px;
  border: 0;
  background: none;
  color: var(--text);
  /* Pflicht, nicht Kosmetik: Safari vererbt die Schrift nicht in Knoepfe. */
  font: inherit;
  font-family: var(--font-head);
  font-size: var(--fs-subline);
  line-height: 1.3;
  text-align: left;
  cursor: pointer;
  transition: color 0.25s ease;
}

/* Der Fokusring kommt aus :where(a, button):focus-visible weiter oben —
   hier ist nichts zu ergaenzen. */
.faq__knopf:hover { color: var(--gold); }

/* Kein eigenes Chevron im Zeichensatz — #i-pfeil aus dem CTA, gedreht.
   Zu: zeigt nach unten. Offen: nach oben. */
.faq__zeichen {
  flex: none;
  width: 1.5em;
  height: 0.58em;
  stroke-width: 1.2;
  color: var(--gold-icon);
  transform: rotate(90deg);
  transform-origin: 50% 50%;
  transition: transform 0.3s ease;
}

.faq__punkt.ist-offen .faq__zeichen { transform: rotate(-90deg); }

/* Auf- und Zuklappen ueber max-height, den Zielwert misst faq.js.

   Zwei Alternativen und warum sie hier nicht stehen:

   Das Raster-Verfahren (grid-template-rows: 0fr → 1fr) ist der modernere
   Weg und braucht kein Messen. Es hat aber eine unangenehme Eigenschaft:
   kommt die Animation nicht zu Ende — throttled im Hintergrund-Tab, sehr
   langsames Geraet, unterbrochener Frame — bleibt die Antwort auf Hoehe
   null stehen und der Text ist schlicht nicht erreichbar. Hier setzt das
   Skript die Hoehe selbst, der Endzustand steht also auch dann richtig,
   wenn der Uebergang nie laeuft.

   Ein fester max-height-Deckel waere die klassische Notloesung, taugt
   hier aber schlecht: die laengste Antwort misst am Handy 211 px, die
   kuerzeste 54 px. Ein Deckel, der beiden passt, laesst die kurzen
   Antworten in einem Bruchteil der Zeit aufspringen und danach warten.
   Deshalb der gemessene Wert je Antwort — und nach dem Aufklappen
   raeumt faq.js ihn wieder weg (max-height: none), damit ein spaeteres
   Drehen des Geraets die Hoehe nicht einfriert.

   visibility nimmt den zugeklappten Text zusaetzlich aus Tab-Reihenfolge
   und Vorlesereihenfolge. */
.faq__antwort {
  overflow: hidden;
  transition:
    max-height 0.35s cubic-bezier(0.22, 0.61, 0.36, 1),
    visibility 0.35s;
}

.faq__antwort p {
  padding-bottom: 22px;
  max-width: 60ch;
  color: var(--text-leise);
}

/* Ohne .js-faq greift nichts davon — dann stehen alle Antworten offen. */
.js-faq .faq__punkt:not(.ist-offen) .faq__antwort {
  max-height: 0;
  visibility: hidden;
}


/* --- 4.12 Preis-Seite ---------------------------------------------------- */

/* Anders als die beiden Stimmungsbilder traegt dieser Abschnitt einen
   ganzen Block Inhalt statt eines Satzes — er steht deshalb mittig und
   nicht am unteren Rand. */
/* Der Abschnitt laeuft nach oben hinter den Kopf.

   Auf den Landingpages tut das Hero-Foto das laengst (.hero__bild bekommt
   ein negatives inset in Hoehe des Kopfes), der Kopf steht dort also auf
   dem Bild. Auf den Preisseiten fehlte das: der Kopf sass auf blankem
   --tiefe, und damit stand ausgerechnet ueber dem Foto der einzige
   Farbstreifen, den es laut Kundin nirgends mehr geben soll.

   Hier geht es nicht ueber ein negatives inset am Bild — .foto hat
   overflow: hidden, das Bild wuerde am oberen Rand abgeschnitten. Also
   wird der ganze Abschnitt hochgezogen und das Polster gibt den Platz
   zurueck, damit der Inhalt bleibt, wo er war. Der Kopf hat bereits
   z-index 2 und liegt darueber.                                          */
.preis {
  align-items: center;
  margin-top: calc(-1 * var(--kopf-hoehe));
  padding-top: var(--kopf-hoehe);
  min-height: calc(clamp(24rem, 56vw, 42rem) + var(--kopf-hoehe));
}

/* Preis nutzt seit KW35 Punkt 2 dasselbe Foto wie .stimmung, dieselbe
   Zuschnittsverschiebung uebernommen, sonst schneidet .foto__bild mittig
   und damit naeher an ihrem Kopf. */
.preis .foto__bild { object-position: 50% 75%; }

/* Eigener Schleier: der Grundverlauf aus .foto beginnt mit 84 % Deckung,
   und so dicht darf es hinter dem Kopf nicht sein — das Foto stuende dort
   praktisch still. Er beginnt deshalb bei 78 % Deckung; das ist derselbe
   Wert, mit dem der Kopf auf den Landingpages ueber dem Hero-Foto steht.

   Dieser Abschnitt ist der erste seiner Seite und bekommt deshalb keine
   Blende (--blende bleibt 0, siehe Abschnitt 4.4a): oberhalb liegt nichts,
   in das er ueberblenden koennte.

   Die Stopps sind gegenueber .foto nach unten verschoben, weil der
   Abschnitt um die Kopfhoehe gewachsen ist: aus 18/38/78 % werden bei
   895 px Inhalt plus 108 px Kopf rechnerisch 27/45/80 %. Das offene
   Fenster liegt damit wieder genau dort, wo es vorher lag — der Kunde hat
   im Video ausdruecklich auf diesen Abschnitt gezeigt.                    */
/* Das offene Fenster bei 16% war auf das alte, dunkle Platzhalterfoto
   gerechnet. Das echte Foto (heller Himmel, See) ist an genau dieser
   Stelle hell statt dunkel, der Text stand dort praktisch ohne Deckung.
   Durchgehend mindestens 55%. */
/* 2026-08-25, Lukas' Rueckmeldung: sie soll sichtbarer sein, Deckung
   reduziert statt der Farbe geaendert. Nicht unter das dokumentierte
   Minimum von 55 % (siehe oben) — die beiden mittleren Stufen stehen
   bereits dort und bleiben unveraendert. Vorlaeufig, mit Jose live
   geprueft. */
.preis > picture::after {
  background: linear-gradient(
    to bottom,
    rgb(var(--scrim) / 63%)   0%,
    rgb(var(--scrim) / 55%)  11%,
    rgb(var(--scrim) / 55%)  27%,
    rgb(var(--scrim) / 55%)  45%,
    rgb(var(--scrim) / 63%)  80%,
    rgb(var(--scrim) / 69%) 100%
  );
}


.preis .foto__inhalt {
  padding-block: clamp(44px, 6vw, 88px);
}

/* Hier traegt der Fuss das Motiv des Abschnitts ueber ihm weiter: das
   FAQ-Bild der Preisseite zeigt Blaetterdach und Lichtstrahlen, also selbst
   schon reine Textur — der Uebergang wird dadurch nahtlos, ohne dass ein
   Gesicht ein zweites Mal auftaucht (der Grund, warum die Landingpage das
   nicht mehr tut, steht bei .fuss). Erkannt wird die Seite an ihrem
   Preis-Abschnitt statt ueber eine Klasse am <body> — so bleiben alle vier
   HTML-Dateien unberuehrt. */
body:has(.preis) .fuss::before {
  background-image:
    linear-gradient(rgb(var(--scrim) / 86%), rgb(var(--scrim) / 86%)),
    url("images/hintergrund-faq-640.jpg");
  background-image:
    linear-gradient(rgb(var(--scrim) / 86%), rgb(var(--scrim) / 86%)),
    image-set(
      url("images/hintergrund-faq-640.webp") type("image/webp"),
      url("images/hintergrund-faq-640.jpg")  type("image/jpeg")
    );
}

.preis h1 {
  font-size: var(--fs-h2);
  margin-bottom: 0.5em;
}

/* --gold statt --akzent, aus demselben Grund wie beim Kicker im Hero
   (siehe 4.2): die Zeile steht auf einem Foto, und --akzent ist der
   dunkelste Textton der Palette. Gemessen 3,82:1 — schon in v2 so, hier
   nur zum ersten Mal nachgerechnet. Mit --gold traegt sie ohne dass am
   Schleier der Preisseite etwas geaendert werden muss; der bleibt genau
   so offen, wie der Kunde ihn im Video gelobt hat.                       */
.preis__marke {
  font-size: var(--fs-mini);
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--gold);
}

.preis__text {
  max-width: 30em;
  margin: 1.1em auto 0;
  color: var(--text-ruhig);
}

.preis__zugang {
  margin-top: 1em;
  font-family: var(--font-head);
  font-size: var(--fs-subline);
  color: var(--gold);
}

/* Die Preiskarte steht auf --flaeche und nicht auf dem Foto: der Betrag
   ist die einzige Stelle der Seite, an der nichts flimmern darf. */
.preis__karte {
  max-width: 460px;
  margin: clamp(28px, 3.2vw, 44px) auto 0;
  padding: clamp(24px, 3vw, 36px);
  background: var(--flaeche-glas);
  border: 1px solid var(--rand);
  border-radius: var(--radius-karte);
}

.preis__betrag {
  font-family: var(--font-head);
  font-size: clamp(2.25rem, 4.6vw, 3.5rem);
  font-weight: 400;
  line-height: 1.1;
  color: var(--text);
}

.preis__abo {
  margin-top: 0.5em;
  font-size: var(--fs-klein);
  color: var(--text-ruhig);
}

.preis__sicher {
  margin-top: 1.4em;
  font-size: var(--fs-mini);
  line-height: 1.6;
  color: var(--text-leise);
}

/* Der Altershinweis steht genau einmal auf der ganzen Seite: hier, direkt
   unter dem Kaufknopf. Die "18+" weiter oben im Text sind freigegebene
   Copy, nicht der Hinweis — sie duerfen nicht zusammengezogen werden. */
.preis__alter {
  margin-top: 1.6em;
  font-size: 0.9375rem;
  line-height: 1.6;
  color: var(--text-leise);
}


/* =============================================================================
   5. RESPONSIVE
   ========================================================================== */

/* --- Tablet: Hero gestapelt, Icon-Reihen dreispaltig ---------------------- */
@media (max-width: 899px) {

  /* Hero gestapelt? Nein — wie auf dem Desktop steht der Text auf dem
     Foto, nur untereinander statt nebeneinander. Der Grund ist der erste
     Bildschirm: gestapelt (Bild als Block, Text darunter) stand der Knopf
     nachgemessen bei y = 833 und lag damit auf 360x740, 375x812 und
     390x844 unter dem Falz. Ein Foto, das kleiner wird, bis alles passt,
     waere nur noch ein Streifen. Also volle Flaeche, Text darauf.

     100svh statt 100vh: svh ist die KLEINE Ansichtshoehe, also die mit
     eingeblendeten Browserleisten. Damit passt der Bildschirm auch in dem
     Moment, in dem die Leisten da sind — 100vh waere dort zu hoch und der
     Knopf rutschte doch wieder hinaus. --kopf-hoehe geht ab, weil der Kopf
     im Fluss steht. */
  /* Unten 0: hier stand --raum-s, ein Token, das es nie gab. Eine ungueltige
     var() macht die ganze Deklaration ungueltig, und padding-bottom faellt
     dann auf seinen Anfangswert 0 zurueck — nachgemessen 0px. Genau so
     wurde der Hero am Handy immer ausgeliefert, und genau so ist er
     abgenommen worden. Der Wert steht jetzt da, wo er hingehoert, statt
     sich aus einem Fehler zu ergeben. */
  .hero {
    padding-top: 0;
    padding-bottom: 0;
    display: grid;
    align-content: end;          /* Text unten, Foto atmet oben */
    min-height: calc(100vh - var(--kopf-hoehe));
    min-height: calc(100svh - var(--kopf-hoehe));
  }

  /* Foto liegt jetzt HINTER dem Text und fuellt die ganze Flaeche, nach
     oben bis unter den Kopf. */
  .hero__bild {
    position: absolute;
    inset: calc(-1 * var(--kopf-hoehe)) 0 0 0;
    width: auto;
    aspect-ratio: auto;
    margin-bottom: 0;
    z-index: 0;
    pointer-events: none;        /* Klicks gehoeren dem Text darueber */
  }

  /* Schleier: oben offen, damit das Foto wirkt, ab der Mitte kraeftig,
     weil dort der Text steht. Werte gegen hintergrund-hero.jpg gerechnet.
     Der Verlauf sitzt in ::before, nicht in ::after — ::after blendet beim
     Abspielen eines echten Videos aus, und der Schleier soll bleiben. */
  .hero__bild::before {
    content: "";
    position: absolute;
    inset: 0;
    z-index: 1;
    /* Oben dichter als bis v2. Nachgemessen trugen Markenname (3,88:1),
       Markenzeile (4,18:1) und der Kicker (3,92:1) am Handy die 4,5:1
       nicht — das stand schon in v2 so und faellt erst auf, seit jede
       Textstelle einzeln gemessen wird. Die offene Zone oben bleibt
       erhalten, sie wird nur von 30 % auf 46 % Deckung nachgezogen.

       Unten 84 % statt Vollton: darunter steht seit v3 ein weiterer
       Foto-Abschnitt, ein Vollton-Streifen waere dort wieder die blanke
       Farbe, die weg soll. */
    background: linear-gradient(
      to bottom,
      rgb(var(--scrim) / 44%)   0%,
      rgb(var(--scrim) / 46%)  12%,
      rgb(var(--scrim) / 46%)  22%,
      rgb(var(--scrim) / 66%)  38%,
      rgb(var(--scrim) / 68%)  78%,
      rgb(var(--scrim) / 64%) 100%
    );
    pointer-events: none;
    transition: opacity 420ms ease;
  }
  /* 2026-08-26, Lukas' Rueckmeldung ("Header less green overlay" am Handy):
     erste Kuerzung, jeder Stopp um rund 8 Prozentpunkte runter, ausser dem
     12-%-Stopp. Der blieb bei 46 % stehen, das ist der oben dokumentierte,
     gemessene Boden fuer Markenname/Markenzeile/Kicker (4,5:1) — darunter
     faellt genau dort der Kontrast wieder unter die Schwelle.
     2026-08-26 (spaeter), Jose: Christina wirkt auf dem Standbild blass,
     nochmal runter, auch am Handy. Der 12-%-Stopp bleibt trotzdem bei 46 %,
     der einzige Stopp mit einer tatsaechlich nachgerechneten Zahl dahinter —
     den 22-%-Stopp stattdessen auf denselben Wert gezogen (statt tiefer),
     damit die geschuetzte Zone nicht doch unter den Boden faellt. Fuer die
     uebrigen Stopps gibt es weiterhin keine einzeln nachgerechnete
     Untergrenze (anders als bei Stimmung/Abschluss) — das war schon beim
     letzten Round offener Punkt und gilt nach dieser zweiten, ebenfalls
     ungeprueften Kuerzung erst recht: vor dem naechsten Versand an Lukas
     unbedingt live auf einem echten Handy gegenchecken, Ueberschrift UND
     Knopf am unteren Rand. */

  /* Wie am Desktop (::after) soll der Schleier beim Abspielen weg, nicht
     nur der Text: er machte das Video sonst unnoetig duester. */
  .hero__bild[data-playing]::before {
    opacity: 0;
  }

  .hero__bild::after { background: none; }
  .hero__bild img    { object-position: 50% 42%; }
  .hero__video       { object-position: 50% 30%; }

  /* Das Play-Zeichen sass mittig im Bildblock. Ueber die ganze Flaeche
     laege es jetzt mitten im Text — also hoch in die offene Zone.

     Beides haengt an svh, nicht an px: die offene Zone ist der Teil des
     Bildschirms oberhalb des Textblocks, und der schrumpft mit der
     Fensterhoehe mit. Auf einem 568 px hohen Schirm bleibt das Zeichen
     dadurch kleiner und rueckt hoeher, statt in die Ueberschrift zu
     rutschen. */
  .hero__play {
    align-items: start;
    padding-top: clamp(48px, 13svh, 150px);
    --icon-play: clamp(52px, 11svh, 104px);
  }

  .hero__inhalt { max-width: none; }
  /* Gestapelt bricht der Absatz wieder frei um — die harten Umbrüche aus
     dem Markup gelten nur für das Desktop-Layout. Vor jedem <br> steht im
     Markup ein Leerzeichen, damit die Wörter hier nicht zusammenlaufen. */
  .hero__text    { max-width: 34em; }
  .hero__text br { display: none; }

  /* Vertrauensblock gestapelt: erst das Foto, dann der Text. */
  .vertrauen__raster {
    grid-template-columns: minmax(0, 1fr);
    gap: clamp(28px, 4vw, 40px);   /* gestapelt braucht es mehr Luft */
  }
  .vertrauen__spalte { order: 2; max-width: none; }
  /* width: 100% ist hier Pflicht, nicht Kosmetik: der Block hat nur absolut
     positionierte Kinder, also keine eigene Inhaltsgroesse; zusammen mit
     aspect-ratio faellt er in Safari dadurch auf 0 x 0 zusammen und war auf
     dem iPhone unsichtbar. Mit fester Breite rechnet aspect-ratio die Hoehe
     wieder korrekt aus. Das Hochformat wird ausserdem quer — ueber die
     ganze Breite waere es sonst hoeher als der Bildschirm. */
  /* Das Hochformat bleibt hochformatig — nur gedeckelt und mittig. Ueber
     die ganze Breite waere es bei 899 px rund 1200 px hoch und fuellte den
     Schirm; ein quer gelegter Rahmen loeste das zwar, warf aber mehr als
     die Haelfte des Fotos weg (der Master ist auf 3:4 gerahmt). */
  .bildkarte {
    order: 1;
    width: min(100%, 22em);
    margin-inline: auto;
    aspect-ratio: 3 / 4;
  }

  /* Vier Zellen: zwei mal zwei. Drei Spalten wie in v1 (dort fuenf Zellen)
     liessen hier eine einzelne Waise in der zweiten Reihe stehen. */
  .reihe { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .reihe__zelle { padding-block: 0; }

  /* Zwei Spalten: kein senkrechter Trenner am Zeilenanfang (Zellen 1 und 3),
     dafuer ein waagerechter ueber jeder Zelle ab der zweiten Reihe (3 und 4).
     Die Ueberschreibung von .reihe__zelle + .reihe__zelle::before gelingt
     nur ueber die Reihenfolge im Datei — beide Regeln wiegen 0,2,0. */
  .reihe__zelle:nth-child(2n + 1)::before { display: none; }
  .reihe__zelle:nth-child(n + 3)::after   { display: block; }
  .reihe__zelle:nth-child(n + 3) {
    margin-top: 34px;
    padding-top: 34px;
  }

  /* Dasselbe gilt fuer die Stimmung, und dort ist es schlimmer: das Motiv
     ist das hellste der Seite (Mittel 29, Spitzen bei 79), der Abschnitt
     bei 375 px nur 384 px hoch, und der grosse Satz nimmt fast die ganze
     Hoehe ein. Der Desktop-Verlauf macht zwischen 25 % und 42 % ganz auf —
     genau dort steht am Handy die erste Zeile, gemessen 2,66:1 bei
     noetigen 3,0:1. Auch dieser Wert stand schon in v2 so.

     Ein offenes Fenster gibt es hier also nicht mehr, nur noch eine
     Senke auf 46 %. Das Foto bleibt als Motiv erkennbar, traegt aber
     durchgehend Schrift. */
  .stimmung { --kante: 90%; }

  .stimmung > picture::after {
    background: linear-gradient(
      to bottom,
      rgb(var(--scrim) / 90%)   0%,
      rgb(var(--scrim) / 62%)   8%,
      rgb(var(--scrim) / 46%)  26%,
      rgb(var(--scrim) / 52%)  44%,
      rgb(var(--scrim) / 74%)  66%,
      rgb(var(--scrim) / 84%)  88%,
      rgb(var(--scrim) / 84%) 100%
    );
  }

  /* Schleier im Abschluss frueher schliessen. Der Textblock ist auf
     schmalen Schirmen fast so hoch wie der Abschnitt selbst — bei 375 px
     stehen 458 px Inhalt in 480 px Hoehe. Die erste Zeile faellt damit
     genau in das offene Fotofenster des Desktop-Verlaufs und misst dort
     nur 2,07:1. Fuer ein offenes Fenster ist hier schlicht kein Platz. */
  .abschluss > picture::after {
    background: linear-gradient(
      to bottom,
      rgb(var(--scrim) / 90%)   0%,
      rgb(var(--scrim) / 90%)   3%,
      rgb(var(--scrim) / 80%)   7%,
      rgb(var(--scrim) / 73%)  14%,
      rgb(var(--scrim) / 71%)  24%,
      rgb(var(--scrim) / 76%)  50%,
      rgb(var(--scrim) / 80%)  84%,
      rgb(var(--scrim) / 84%) 100%
    );
  }
}

/* --- Mobil --------------------------------------------------------------- */
@media (max-width: 599px) {

  /* Das echte Zeichen ist breiter als das frueher gezeichnete Icon: auf
     schmalen Handys kleiner und mit weniger Abstand, damit der Claim
     einzeilig neben dem Logo bleibt. */
  .marke__zeichen { width: auto; height: 44px; }
  .marke          { gap: 12px; }

  /* Auf den schmalsten Geraeten laeuft der deutsche Claim sonst in eine
     zweite Zeile: engere Laufweite statt kleinerer Schrift. */
  @media (max-width: 389px) {
    .marke__claim { letter-spacing: 0.12em; }
  }

  /* Neben dem Logo bleibt wenig Platz — die Pille wird kompakter. */
  .sprachen {
    gap: 0.7em;
    padding: 0.55em 0.85em;
    font-size: 0.75rem;
  }

  /* Derselbe knappe Platz gilt fuer den Ton-Schalter daneben. */
  .ton {
    width: 2.15em;
    height: 2.15em;
    font-size: 0.75rem;
  }

  .ton-schiene > .container { gap: 0.5em; }

  .cta {
    justify-content: center;
    width: 100%;
    max-width: 340px;
  }

  /* Merkmale untereinander, getrennt durch feine Linien */
  .merkmale .reihe { grid-template-columns: minmax(0, 1fr); }
  .merkmale .reihe__zelle { padding-inline: 0; }
  .merkmale .reihe__zelle::before        { display: none; }
  .merkmale .reihe__zelle + .reihe__zelle::after { display: block; }
  .merkmale .reihe__zelle + .reihe__zelle {
    margin-top: 28px;
    padding-top: 28px;
  }
  .merkmale .reihe__icon { margin-bottom: 14px; }

  /* Vorteile bleiben zwei mal zwei — das Raster und die Trennerlogik
     stehen schon im Tablet-Block und gelten hier weiter. Nur der Abstand
     zwischen den Reihen wird auf dem Handy knapper: 26 statt 34 px.
     (In v1 stand hier zusaetzlich eine Regel fuer die allein stehende
     fuenfte Zelle. Bei vier Zellen kann :last-child:nth-child(odd) nie
     greifen — die Regel ist ersatzlos entfallen.) */
  .vorteile .reihe__zelle:nth-child(n + 3) {
    margin-top: 26px;
    padding-top: 26px;
  }

  .zitat {
    flex-direction: column;
    align-items: flex-start;
    gap: 16px;
    padding: 22px;
  }

  /* Am Handy laeuft die Bildkarte ueber die ganze Breite, ohne Rahmen und
     ohne runde Ecken: sie bricht per negativem Rand aus dem Seitenrand des
     Containers aus. Die Breite steht als Rechnung und nicht als 100vw,
     damit kein Pixel ueberlaeuft — und explizit, weil der Block sonst in
     Safari zusammenfaellt (nur absolut positionierte Kinder). */
  /* Randlos ueber die volle Breite. 4:5 statt 4:3: der Master ist auf 3:4
     gerahmt, in einem querliegenden Feld schnitte object-fit: cover 44 %
     der Bildhoehe weg und die Person stuende angeschnitten darin. Bei 4:5
     bleiben 93 % des Ausschnitts stehen, und 375 x 469 px sind auf einem
     Handyschirm immer noch keine halbe Seite. */
  .bildkarte {
    aspect-ratio: 4 / 5;
    width: calc(100% + 2 * var(--rand-seite));
    max-width: none;
    margin-inline: calc(-1 * var(--rand-seite));
    border: 0;
    border-radius: 0;
  }

  /* Die randlosen Fotoabschnitte duerfen am Handy nicht die halbe
     Bildschirmhoehe fressen — der Satz darauf ist nur drei Zeilen lang. */
  .foto__inhalt { padding-block: clamp(28px, 8vw, 44px); }

  /* Die Frage steht am Handy oft zweizeilig — knapperes Polster, damit
     sechs Fragen nicht den halben Bildschirm einnehmen. Das Tippziel
     bleibt ueber min-height: 44px erhalten. */
  .faq__knopf {
    gap: 16px;
    padding-block: 16px;
    font-size: 1.25rem;
  }
  .faq__antwort p { padding-bottom: 16px; }

  /* Die Kleinzeile unter dem Knopf steht am Handy unter einer Pille, die
     ueber die volle Breite laeuft — das seitliche Polster kann weg. */
  .cta-klein { padding-inline: 0; }
}

/* =============================================================================
   6. BEWEGUNG — ein ruhiger Auftakt, sonst nichts
   ========================================================================== */

@media (prefers-reduced-motion: no-preference) {
  .auftakt {
    animation: auftakt 0.9s cubic-bezier(0.22, 0.61, 0.36, 1) both;
  }
  .auftakt:nth-child(2) { animation-delay: 0.06s; }
  .auftakt:nth-child(3) { animation-delay: 0.12s; }
  .auftakt:nth-child(4) { animation-delay: 0.18s; }
  .auftakt:nth-child(5) { animation-delay: 0.24s; }
  .auftakt:nth-child(6) { animation-delay: 0.30s; }
}

@keyframes auftakt {
  from { opacity: 0; transform: translateY(14px); }
  to   { opacity: 1; transform: none; }
}

/* --- Einblenden beim Scrollen -------------------------------------------
   Greift nur, wenn bewegung.js die Klasse .js-enthuellen gesetzt hat. Ohne
   JavaScript und bei "Bewegung reduzieren" bleibt jeder Abschnitt sichtbar,
   die Seite ist also nie von einem Skript abhaengig, um lesbar zu sein.
   Dieselbe Kurve und Weglaenge wie beim Hero-Auftakt, damit sich das obere
   und das untere Drittel der Seite gleich anfuehlen. */
.js-enthuellen .enthuellen {
  opacity: 0;
  transform: translateY(18px);
  transition:
    opacity 0.85s cubic-bezier(0.22, 0.61, 0.36, 1),
    transform 0.85s cubic-bezier(0.22, 0.61, 0.36, 1);
  will-change: opacity, transform;
}

.js-enthuellen .enthuellen.ist-da {
  opacity: 1;
  transform: none;
}

/* --- Zwei ruhige Dauerbewegungen ---------------------------------------- */

@media (prefers-reduced-motion: no-preference) {
  /* Das Standbild des Startvideos atmet sehr langsam, damit der Kopf der
     Seite nicht wie ein Foto steht. Sobald das Video laeuft, hoert das auf,
     sonst wuerde der Bildausschnitt waehrend des Films wandern. */
  .hero__video {
    animation: atem 26s ease-in-out infinite alternate;
  }

  /* Angehalten, nicht entfernt: ein entfernter transform wuerde beim Start
     des Videos sichtbar zurueckspringen. So bleibt das Bild einfach stehen,
     wo es gerade war. */
  .hero__bild[data-playing] .hero__video {
    animation-play-state: paused;
  }

  /* Das Play-Zeichen weitet sich kaum merklich, das genuegt als Hinweis,
     dass hier etwas zu holen ist. */
  .hero__play .video__zeichen {
    animation: puls 3.6s ease-in-out infinite;
  }

  /* Beim Zeigen gewinnt der Hover-Effekt, die Dauerbewegung pausiert. */
  button.hero__play:hover .video__zeichen,
  button.hero__play:focus-visible .video__zeichen {
    animation: none;
  }
}

@keyframes atem {
  from { transform: scale(1); }
  to   { transform: scale(1.055); }
}

@keyframes puls {
  0%, 100% { transform: scale(1); }
  50%      { transform: scale(1.045); }
}

/* --- Sprachwechsel ------------------------------------------------------
   DE <-> EN ist ein echter Dokumentwechsel, obwohl sich fuer das Auge fast
   nichts aendert: gleiche Anordnung, gleiche Fotos, nur andere Woerter.
   Ohne Uebergang schneidet der Browser hart um. Mit @view-transition
   blendet er die beiden Dokumente ineinander — die Bilder liegen beim
   Wechsel ohnehin schon im Cache, es wechselt also praktisch nur der Text.

   Reine Aufwertung, kein Skript: Browser ohne dokumentuebergreifende View
   Transitions navigieren genau wie bisher, und unter file:// greift die
   Regel ebenfalls nicht (dort ist jedes Dokument ein eigener Ursprung).
   Die Seite haengt an keiner Stelle davon ab.                            */
@view-transition {
  navigation: auto;
}

/* Dieselbe Kurve wie beim Auftakt und beim Einblenden, nur kuerzer: der
   Wechsel soll begleiten, nicht warten lassen. */
::view-transition-old(root),
::view-transition-new(root) {
  animation-duration: 0.3s;
  animation-timing-function: cubic-bezier(0.22, 0.61, 0.36, 1);
}

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

  /* Die Notbremse oben erreicht die View-Transition-Pseudoelemente nicht:
     ::view-transition-old/new sind keine ::before/::after und damit von
     *, *::before, *::after nicht erfasst. Deshalb hier noch einmal
     ausdruecklich — und zusaetzlich der Weg ueber die At-Regel, falls der
     Browser sie in @media unterstuetzt. */
  @view-transition { navigation: none; }

  ::view-transition-old(root),
  ::view-transition-new(root) {
    animation-duration: 0.01ms !important;
  }
}

/* ---------------------------------------------------------------------
   Fussbereich

   Kam in v2 zunaechst nicht vor, ist aber Pflicht: Impressum und
   Datenschutz muessen von jeder Seite aus erreichbar sein. Bewusst
   leise gehalten (--text-leise, --fs-mini), damit der Abschluss der
   Seite die Wirkung behaelt und der Fuss nur Rechtliches traegt.
   Ziele liegen auf feel.visenza.co, wo die Rechtsseiten von Visenza
   stehen. Beide Seiten dort haben einen DE/EN-Umschalter, eine URL
   reicht deshalb fuer beide Sprachfassungen. */
/* Der Fuss stand bis v3 auf --flaeche. Das war die letzte blanke Farbflaeche
   der Seite und sass ausgerechnet direkt unter dem Abschluss-Foto — nach der
   Regel "nirgends blanke Farbe" musste sie mit weg. Der Kunde hat den Fuss
   selbst nachgetragen und dabei nicht daran gedacht; hier ist es
   nachgezogen.

   Als Untergrund steht eine Textur ohne Menschen: Moos und Wurzeln, das
   dunkelste Motiv des Satzes. Bis hierher lief das Foto des Abschnitts
   darueber weiter, und das war ein Fehlgriff — der Fuss ist viel flacher
   als der Abschnitt, sein Ausschnitt aus demselben Bild faellt deshalb
   ganz anders aus, und der Kopf der Frau tauchte darin ein zweites Mal in
   anderer Groesse auf. Auf dem Schirm las sich das als zwei Frauen, die
   nicht zusammenpassen. Ein Fuss traegt ohnehin keine Bildaussage, nur
   Textur; ein Portraet gehoert dort nicht hin.

   Auf den Preisseiten bleibt es beim Motiv des Abschnitts darueber (siehe
   4.12) — das FAQ-Bild zeigt Blaetterdach und Lichtstrahlen, also selbst
   schon reine Textur, und das Problem stellt sich dort nicht.

   Bewusst die 640er Stufe: unter 86 % Schleier ist von der Aufloesung
   nichts mehr zu sehen, und der Fuss soll nicht ein weiteres grosses Bild
   nachladen. Auf dem Handy ist es ausserdem dieselbe Datei, die der
   Abschnitt „Ueber mich" oben schon geladen hat.

   Kein <picture> wie bei den Abschnitten, sondern ein CSS-Hintergrund —
   der Fuss traegt keine Bildaussage, nur Textur. image-set liefert webp,
   die Zeile darueber bleibt als Rueckfall fuer alte Browser stehen.       */
/* Kein border-top mehr. Solange der Fuss ein eigener Farbblock war, trennte
   die Linie ihn vom Abschluss darueber. Jetzt laeuft das Foto durch, und
   gemessen war diese eine Pixelzeile mit Abstand die hellste der ganzen
   Seite: 29,6 gegen 2,0 bei den Nachbarn oben und unten. Genau so eine
   Haarlinie hat der Kunde in der Runde davor als "weisser Strich"
   gemeldet. Getrennt wird jetzt durch den Abstand, nicht durch einen
   Strich. */
.fuss {
  position: relative;
  isolation: isolate;
  background-color: var(--tiefe);
  padding: var(--raum-m) var(--rand-seite);
  text-align: center;
}

/* Foto und Schleier liegen zusammen im ::before, nicht am Fuss selbst.
   Grund ist die Blende (Abschnitt 4.4a): die Ebene reicht nach oben in den
   Abschluss hinein und wird dort weggeblendet, damit auch die letzte Naht
   der Seite ein Uebergang ist und keine Kante. Maskiert werden muss dabei
   Bild samt Schleier in einem Stueck — am Fuss selbst ginge das nicht, die
   Maske wuerde den Text mitnehmen.                                         */
.fuss::before {
  content: "";
  position: absolute;
  inset: calc(-1 * var(--blende)) 0 0 0;
  z-index: 0;
  pointer-events: none;
  /* Auf Wunsch entfernt: der Fuss der Landingpages hatte ein eigenes,
     drittes Foto (Persoenlichkeit-Motiv erneut), das gegen das
     Abschluss-Foto direkt darueber wie ein zusaetzlicher harter Schnitt
     wirkte. Der Fuss faellt jetzt auf die normale dunkle Flaeche
     (--tiefe, siehe .fuss) zurueck, das Abschluss-Foto blendet direkt in
     diese Flaeche aus. Die Preisseite behaelt ihr eigenes Fuss-Foto,
     siehe body:has(.preis) .fuss::before weiter oben. */
  background-image: none;
  background-size: cover;
  background-position: center;
  background-repeat: no-repeat;
  /* Ausgeschrieben aus demselben Grund wie bei .fond > picture. */
  -webkit-mask-image: linear-gradient(
    to bottom,
    rgb(0 0 0 /   0)                              0px,
    rgb(0 0 0 / 0.03) calc(var(--blende) * 0.14),
    rgb(0 0 0 / 0.16) calc(var(--blende) * 0.32),
    rgb(0 0 0 / 0.44) calc(var(--blende) * 0.52),
    rgb(0 0 0 / 0.76) calc(var(--blende) * 0.72),
    rgb(0 0 0 / 0.95) calc(var(--blende) * 0.88),
    rgb(0 0 0 /   1)       var(--blende));
  mask-image: linear-gradient(
    to bottom,
    rgb(0 0 0 /   0)                              0px,
    rgb(0 0 0 / 0.03) calc(var(--blende) * 0.14),
    rgb(0 0 0 / 0.16) calc(var(--blende) * 0.32),
    rgb(0 0 0 / 0.44) calc(var(--blende) * 0.52),
    rgb(0 0 0 / 0.76) calc(var(--blende) * 0.72),
    rgb(0 0 0 / 0.95) calc(var(--blende) * 0.88),
    rgb(0 0 0 /   1)       var(--blende));
}

.fuss > * { position: relative; z-index: 1; }

.fuss__links {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  align-items: center;
  gap: 0.6em 1.4em;
  margin: 0;
  padding: 0;
  list-style: none;
}

.fuss__links a {
  color: var(--text-leise);
  font-family: var(--font-body);
  font-size: 0.9375rem;
  letter-spacing: 0.04em;
  text-decoration: none;
  border-bottom: 1px solid transparent;
  padding-bottom: 2px;
  transition: color 200ms ease, border-color 200ms ease;
}

.fuss__links a:hover,
.fuss__links a:focus-visible {
  color: var(--text);
  border-bottom-color: var(--linie);
}

/* =============================================================================
   7. ALTERSBESTAETIGUNG
   Voller Deckel ueber der ganzen Seite bis zur Bestaetigung. Erscheint bei
   jedem Aufruf neu, es wird nichts gespeichert (kein localStorage, keine
   Cookies) — Absicht, nicht Zwischenstand. z-index 1000 liegt bewusst weit
   ueber der hoechsten sonst vergebenen Zahl auf dieser Seite (40, die
   Ton-Sprachen-Schiene), damit wirklich nichts durchscheint oder klickbar
   bleibt, solange der Deckel steht.
   ========================================================================== */

body.gate-aktiv { overflow: hidden; }

.altersgate {
  position: fixed;
  inset: 0;
  z-index: 1000;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: var(--rand-seite);
  background: rgb(var(--scrim) / 90%);
  backdrop-filter: blur(6px);
}
.altersgate[hidden] { display: none; }

.altersgate__karte {
  width: 100%;
  max-width: 440px;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 22px;
  padding: clamp(32px, 5vw, 48px) clamp(24px, 4vw, 40px);
  border: 1px solid var(--rand);
  border-radius: var(--radius-karte);
  background: var(--flaeche);
  text-align: center;
}

.altersgate__zeichen {
  flex: none;
  width: 78px;
  height: 78px;
  display: flex;
  align-items: center;
  justify-content: center;
  border: 2px solid var(--gold);
  border-radius: 50%;
  font-family: var(--font-head);
  font-size: 1.375rem;
  letter-spacing: 0.02em;
  color: var(--gold);
}

.altersgate__text {
  font-family: var(--font-body);
  font-size: var(--fs-klein);
  line-height: 1.65;
  color: var(--text-ruhig);
}

.altersgate__aktionen {
  display: flex;
  flex-direction: column;
  gap: 12px;
  width: 100%;
  margin-top: 6px;
}

/* .cta ist sonst immer ein <a>, hier ein <button> mit derselben Optik —
   Breite auf 100% der Karte statt der sonst ueblichen inline-Breite. */
.altersgate__ja {
  width: 100%;
  justify-content: center;
  border: 0;
  cursor: pointer;
}

.altersgate__nein {
  width: 100%;
  padding: 1.15em 2.2em;
  border: 1px solid var(--rand);
  border-radius: var(--radius-pill);
  background: transparent;
  color: var(--text-leise);
  font-family: var(--font-body);
  font-size: clamp(1rem, 1.55vw, 1.25rem);
  font-weight: 400;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  cursor: pointer;
  transition: color 0.2s ease, border-color 0.2s ease;
}
.altersgate__nein:hover,
.altersgate__nein:focus-visible {
  color: var(--text);
  border-color: var(--text-leise);
}

/* Trennpunkt zwischen den Links, nur wo zwei nebeneinander stehen.
   aria-hidden im Markup, damit Screenreader ihn nicht vorlesen. */
.fuss__punkt {
  color: var(--text-leise);
  font-size: var(--fs-mini);
  opacity: 0.55;
}

.fuss__marke {
  margin: 1em 0 0;
  color: var(--text-leise);
  font-family: var(--font-body);
  font-size: 0.8125rem;
  letter-spacing: 0.08em;
  opacity: 0.8;
}

@media (max-width: 389px) {
  /* Auf sehr schmalen Geraeten untereinander statt gequetscht in eine
     Zeile — der Trennpunkt entfaellt dann. */
  .fuss__punkt { display: none; }
  .fuss__links { flex-direction: column; }
}

/* =============================================================================
   8. RECHTSTEXTE (Impressum, Datenschutz, AGB)

   Die sechs Seiten aus tools/rechtstexte.py. Sie tragen keinen eigenen
   Entwurf: dieselbe Palette, dieselben Schriften, dieselbe Kopf- und
   Fusszeile wie die vier Inhaltsseiten. Neu ist hier nur die Typografie
   fuer laufenden Text, und die braucht es, weil Abschnitt 2 bewusst
   aufraeumt: `p { margin: 0 }` und `ul { list-style: none }` sind fuer
   gebaute Abschnitte richtig und fuer einen Rechtstext falsch.

   Der zweite Grund ist die Zeilenlaenge. --breite steht auf 100%, weil
   die Landingpage ueber die volle Breite baut. Fuer einen Fliesstext waere
   das auf einem grossen Bildschirm unlesbar, deshalb bekommt der Satz hier
   ein eigenes Mass.
   ========================================================================== */

.rechtstext {
  padding: var(--raum-l) 0 var(--raum-xl);
}

/* Das Mass: rund 68 Zeichen je Zeile. .container liefert weiterhin den
   Seitenrand, diese Klasse nur die Begrenzung darin. */
.rechtstext__satz {
  max-width: 68ch;
  margin-inline: auto;
}

.rechtstext h1 {
  font-size: clamp(1.875rem, 3.6vw, 2.5rem);
  margin-bottom: clamp(24px, 2.6vw, 36px);
}

/* Deutlich zurueckhaltender als --fs-h2 (32 bis 44 px): das ist die Groesse
   fuer eine Abschnittsueberschrift der Landingpage. In einem Dokument mit
   32 Zwischentiteln wuerde sie den Text erschlagen.

   Nach unten gibt es aber auch eine Grenze, und die wurde beim ersten Blick
   im Browser gerissen. Diese Ueberschriften stehen in Cormorant Garamond im
   Leichtschnitt, die **fetten** Labels der Dokumente direkt darunter in Jost
   mit Gewicht 500. Bei fast gleicher Groesse gewinnt das fette Label optisch,
   und die Abschnittsueberschrift sah aus wie die Unterzeile ihrer eigenen
   Unterzeile. Sie muss daher klar groesser sein als der Fliesstext, nicht nur
   etwas. */
.rechtstext h2 {
  font-size: clamp(1.5rem, 2.2vw, 1.875rem);
  margin-top: clamp(40px, 4vw, 60px);
  margin-bottom: 0.55em;
}

/* Die erste Ueberschrift nach dem Titel braucht den grossen Abstand nicht. */
.rechtstext h1 + h2 { margin-top: clamp(24px, 2.6vw, 34px); }

.rechtstext h3 {
  font-size: clamp(1.0625rem, 1.5vw, 1.1875rem);
  margin-top: clamp(24px, 2.6vw, 34px);
  margin-bottom: 0.4em;
  letter-spacing: 0.01em;
}

.rechtstext p {
  margin-bottom: 1em;
  color: var(--text-ruhig);
  /* Absaetze aus mehreren Quellzeilen tragen <br>; ohne Umbruchschutz
     stehen kurze Zeilen wie die Anschrift sonst zerrissen. */
  text-wrap: pretty;
}

/* Der Fliesstext laeuft in 300, eine Hervorhebung braucht deshalb mehr als
   die uebliche Stufe, um ueberhaupt als eine zu lesen. Die Dokumente setzen
   damit ihre Zwischenlabels ("Kontakt und Support"), das traegt Struktur. */
.rechtstext strong {
  font-weight: 500;
  color: var(--text);
}

/* Aufzaehlungspunkte zurueckholen, die Abschnitt 2 global abschaltet. */
.rechtstext__liste {
  margin: 0 0 1em;
  padding-left: 1.4em;
  color: var(--text-ruhig);
}

.rechtstext__liste li { margin-bottom: 0.4em; }
ul.rechtstext__liste { list-style: disc; }
ol.rechtstext__liste { list-style: decimal; }
ul.rechtstext__liste::marker,
.rechtstext__liste li::marker { color: var(--lehm); }

/* In einem Rechtstext muss ein Link als Link erkennbar sein, auch mitten
   im Satz — a { color: inherit } aus Abschnitt 2 reicht dafuer nicht. */
.rechtstext a {
  color: var(--text);
  text-decoration: underline;
  text-decoration-color: var(--lehm);
  text-underline-offset: 3px;
}

.rechtstext a:hover,
.rechtstext a:focus-visible { text-decoration-color: var(--text); }

/* Die E-Mail-Huelle. Ohne JavaScript bleibt die umschriebene Form stehen,
   deshalb darf sie nicht wie ein toter Link aussehen. */
.rechtstext .mail { white-space: nowrap; }

.rechtstext code {
  font-size: 0.9375em;
  color: var(--lehm);
}

.rechtstext__zurueck {
  margin-top: clamp(36px, 4vw, 56px);
  padding-top: clamp(20px, 2.2vw, 28px);
  border-top: 1px solid var(--rand);
}
