/* ============================================================
   goldenroom yoga | Components
   Baustein 1–6 aus dem Struktur-Plan, plus Buttons/Footer.
   Kein box-shadow auf irgendeinem Element. Border war lange komplett
   tabu, seit 13.09.2026 auf Wunsch aber bewusste Ausnahme: jedes Foto
   (<img>, siehe base.css) bekommt einen dünnen Gold-Rahmen (1px solid
   var(--gold-500)), gleiche Optik wie die Kundenstimmen-Karten. Logos,
   das Hero-Wasserzeichen und die rein dekorativen Gold-Ambiente-Bilder
   heben ihn gezielt wieder auf, siehe Ausnahmeliste weiter unten in
   dieser Datei. Animationen nur über transform/opacity,
   prefers-reduced-motion wird bei jeder Übergangs-Regel berücksichtigt.
   ============================================================ */

/* ---------- Ausnahmen vom globalen img-Rahmen (siehe base.css) ----------
   Logos, das Hero-Wasserzeichen, die rein dekorativen Gold-
   Ambiente-Bilder und die Deko-Gras-Fotos im Hero (.deko, siehe dort)
   sind keine "Fotos" im eigentlichen Sinn – die bekommen bewusst
   keinen Rahmen. Bei .deko wäre ein harter Gold-Rahmen um ein per
   mix-blend-mode freigestelltes Foto ohnehin unpassend. */
.site-header__logo img,
.site-footer__logo,
.hero__watermark,
.hero__signature,
.ambient-gold,
.deko {
  border: none;
}

/* ---------- Utility: Section-Divider ----------
   Gleiche einfache Linie wie bei .bio-section/.ablauf/.portrait-split,
   aber als eigenständige Utility-Klasse zum Anhängen an Sections, die
   sonst keinen eigenen Divider haben (z.B. .split, .testimonials) –
   markiert den Section-Wechsel optisch, auch wenn auf Handy weniger
   Leerfläche dazwischen liegt. War eine Doppellinie (zusätzliches
   ::before), auf Wunsch (13.09.2026) auf eine einzelne Linie reduziert. */
.section-divider {
  border-top: 1px solid var(--gold-500);
}

/* ---------- Utility: Karussell-Pfeile (Kundenstimmen, Instagram) ----------
   Bewusst anderes Design als die reinen Wisch-Karussells (Fuerwen-
   Karten, Formate-Fotos): hier klickt man sich über runde Pfeil-
   Buttons durch statt nur zu wischen (js/main.js, data-carousel). Nur
   auf Handy sichtbar – auf großen Screens bleibt die normale
   Grid-Ansicht, da gibt es nichts zu durchklicken. */
.carousel-nav {
  display: none;
}

@media (max-width: 700px) {
  .carousel-nav {
    display: flex;
    justify-content: center;
    gap: 1rem;
    margin-top: 1.25rem;
  }
}

.carousel-nav__btn {
  width: 2.25rem;
  height: 2.25rem;
  border-radius: 50%;
  border: 1px solid var(--gold-500);
  background: transparent;
  color: var(--gold-700);
  font-size: 0.9rem;
  line-height: 1;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: background 0.2s ease, color 0.2s ease, opacity 0.2s ease;
}

.carousel-nav__btn:hover:not(:disabled) {
  background: var(--gold-500);
  /* Nicht --cream: Weiß/Creme auf Gold-500 fällt auf 2,47:1 (siehe
     tokens.css) – stattdessen dunkle Schrift auf der Gold-Fläche. */
  color: var(--ink-on-gold);
}

.carousel-nav__btn:disabled {
  opacity: 0.3;
  cursor: default;
}

/* ---------- Buttons ---------- */

.btn {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  /* Padding/Schriftgröße auf Wunsch (12.09.2026) größer, war 0.75rem
     1.5rem / 1rem. */
  padding: 0.875rem 1.75rem;
  /* War 2px, auf Wunsch (14.09.2026, großer Umbau "wie die Hero-Section")
     eckig wie der Hero-CTA – praktisch jeder andere Radius auf der
     Seite ist ohnehin schon 0 (Karten, Formularfelder, Fotos), 2px war
     die letzte Ausnahme. */
  border-radius: 0;
  font-family: var(--font-body);
  font-weight: 700;
  font-size: 1.125rem;
  letter-spacing: 0.02em;
  text-transform: uppercase;
  transition: transform 0.2s ease, opacity 0.2s ease;
}

/* .btn--primary/--outline auf Wunsch (25.09.2026: "mach bitte alle
   Buttons in dem Gold") auf dieselbe Optik wie .btn--gold umgestellt
   (siehe dort) – ein einziger Ort statt jede der ca. 40 Button-
   Verwendungen site-weit in jeder HTML-Datei umzubenennen. Die
   Klassennamen selbst (--primary/--outline) blieben absichtlich
   unangetastet im Markup, nur ihre Farbgebung wurde angeglichen. */
/* color: var(--surface, ...) statt fest --ink-on-gold (28.09.2026, auf
   Wunsch: "Füllung und Schriftfarbe die Farbe des Hintergrunds, wie bei
   der Änderung vorhin... mach das bei allen Buttons, die so sind") –
   dieselbe Idee wie schon bei .hero__cta (Textfarbe folgt dem
   Seitenhintergrund, nicht der Button-Füllung, "ausgestanzter" Look),
   nur jetzt zentral über die CSS-Variable --surface statt einzelner
   Buttons: Sections, die eine bekannte, feste Fläche haben, setzen
   --surface auf sich selbst (siehe .bio-section/.format-detail/
   .contact-section/.formate/.podcast-banner), jeder Button darin erbt
   automatisch die passende Farbe. Ohne --surface in der Umgebung (z.B.
   .site-header__cta, der schwebt über wechselndem Foto/keiner festen
   Fläche) bleibt der bisherige --ink-on-gold als Fallback – dort bewusst
   unverändert. */
.btn--primary,
.btn--outline {
  background: var(--gold-500);
  color: var(--surface, var(--ink-on-gold));
  border: none;
}

/* Nur Hintergrundfarbe, kein Rahmen/Schatten (13.09.2026, Hero-CTA) –
   --ink-on-gold ist genau für diesen Fall in tokens.css vorgesehen
   (dunkle Schrift auf voller Gold-Fläche, 5,77:1 Kontrast). */
.btn--gold {
  background: var(--gold-500);
  color: var(--ink-on-gold);
}

.btn:hover { transform: translateY(-1px); opacity: 0.92; }

@media (prefers-reduced-motion: reduce) {
  .btn { transition: none; }
  .btn:hover { transform: none; }
}

/* KORREKTUR (21.09.2026, auf Wunsch: "generell bei den großen Buttons...
   zweizeilig, in der unteren Zeile nur der Pfeil... überall in die obere
   Hälfte, einzeilig"): site-weite Basis-Regel statt vieler einzelner
   Buttons einzeln nachzubessern – betrifft automatisch jeden .btn
   überall. Kleinere Schrift/Innenabstand verhindert das Umbrechen bei
   den meisten Buttons schon von selbst.
   BUGFIX: white-space:nowrap stand hier zusätzlich, bis "Zu den
   aktuellen Workshops →" (länger als das vorherige "Kurse") bei 320px
   trotz kleinerer Schrift nicht mehr ganz reinpasste – nowrap verbietet
   dann JEDES Umbrechen, das Ergebnis war seitliches Overflow statt
   einer zweiten Zeile. Jetzt stattdessen ein geschütztes Leerzeichen
   ("&nbsp;", siehe die einzelnen Button-Texte in den .html-Dateien)
   direkt vor jedem Pfeil: verhindert genau den ursprünglich gemeldeten
   Umbruch (Pfeil landet nie allein in einer eigenen Zeile, weil er am
   letzten Wort "klebt"), erlaubt aber weiterhin einen normalen Umbruch
   VOR diesem letzten Wort+Pfeil-Paar, falls der Text trotz kleinerer
   Schrift wirklich zu lang ist – sicher statt starr. .hero__cta und
   .formate__cta.btn (siehe dort) bleiben bei striktem nowrap – für die
   ist bei 320px bereits geprüft, dass der volle Text dort passt. */
@media (max-width: 700px) {
  .btn {
    font-size: 0.9375rem;
    padding: 0.75rem 1.25rem;
  }
}

.link-arrow {
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
  font-family: var(--font-body);
  font-weight: 600;
  /* Explizit statt geerbt, auf Wunsch (12.09.2026) größer – sonst wäre
     die Größe je nach Kontext (Fließtext, Footer, Formular) sehr
     unterschiedlich groß gewesen. */
  font-size: 1.0625rem;
  color: var(--gold-700);
  border-bottom: none; /* kein border laut Vorgabe – Unterstreichung ggf. über background-Trick später */
}

/* Modifier für einzelne Stellen, an denen doch eine (dezente) Unterstreichung
   gewünscht ist, z.B. Teaser-Links zu Unterseiten. */
.link-arrow--underline {
  text-decoration: underline;
  text-decoration-color: color-mix(in srgb, var(--gold-500) 55%, transparent);
  text-decoration-thickness: 1px;
  text-underline-offset: 4px;
}

/* ---------- Utility: Mobile-Mini-Überschrift ----------
   (20.09.2026, Mobile-Polish-Runde, auf Wunsch: "teil diese langen
   Texte generell bei Mobile in Abschnitte mit eigener Mini-Überschrift
   in Fett ein, das liest sich einfacher"). Als <strong> INNERHALB des
   jeweiligen Absatzes im Markup platziert (nicht als eigenes Element
   davor) – dadurch bleibt es ein einzelner <p>, kein zusätzliches
   HTML-Element pro Absatz nötig. Auf Desktop komplett unsichtbar
   (display:none – "Desktop ist fertig", keine Textänderung dort
   sichtbar), auf Handy per display:block eine eigene Zeile VOR dem
   eigentlichen Absatztext, dadurch optisch wie eine kleine
   Zwischenüberschrift, obwohl technisch derselbe Absatz. Verwendet u.a.
   in den Formate-Unterseiten (formate/*.html) und auf ueber-mich.html. */
.mobile-lede {
  display: none;
}

@media (max-width: 700px) {
  .mobile-lede {
    display: block;
    font-weight: 700;
    color: var(--ink);
    margin-bottom: 0.3rem;
    /* Zusätzlicher Abstand VOR jeder Mini-Überschrift (23.09.2026 auf
       Wunsch: "zwischen Ende des Textes und der neuen Mini-Überschrift
       soll auch Platz gelassen werden, einheitlich") – kommt oben auf
       den ohnehin schon vorhandenen Flex-gap zwischen den Absätzen
       (.bio-section__inner/.format-detail__body gap:1.1rem) obendrauf,
       damit der Sprung zur nächsten Mini-Überschrift klar größer wirkt
       als der enge Abstand zu ihrem eigenen Absatztext direkt danach
       (margin-bottom oben). Betrifft alle Stellen mit .mobile-lede
       (ueber-mich.html, formate/*.html). */
    margin-top: 1rem;
  }
}

/* KORREKTUR (22.09.2026, auf Wunsch: "sehr, sehr fett und sehr eng
   aneinander geschrieben, kaum Abstand zwischen den Zeichen... etwas
   größere Schrift, nicht so extrem fett, Buchstaben-/Zeichenabstand
   breiter"): betraf konkret "Wann 1:1 passt"/"Wie es abläuft" (beides
   .mobile-lede) – Ursache ist die Bebas-Neue-Umstellung auf Handy
   (siehe --font-body/--font-mono in tokens.css, 21.09.2026): Bebas Neue
   hat nur EINEN echten Schnitt (400), font-weight:700 oben wurde also
   vom Browser bisher synthetisch fett nachgezeichnet – auf einer
   ohnehin schon blockigen Versal-Display-Schrift wirkt das schnell zu
   schwer/gedrängt. Jetzt das echte (einzige) Gewicht plus mehr
   Zeichenabstand und etwas größere Schrift statt des unsauberen
   Fake-Fetts – Betonung kommt jetzt allein über Farbe/Tracking/Größe.
   Eigene, spätere Regel statt die Basisregel direkt zu ändern (dort
   bleibt font-weight:700 als Wert erhalten, falls --font-body an dieser
   Stelle mal wieder eine echte Fett-Schnitt-Schrift wird). */
@media (max-width: 700px) {
  .mobile-lede {
    font-weight: 400;
    font-size: 1.05em;
    letter-spacing: 0.04em;
  }
}

/* .eyebrow (die kleinen Section-Label wie "Der goldenroom", "Mein
   Yoga") war am 14.09.2026 kurz auf Desktop wieder sichtbar geschaltet
   ("Rest der Seite wie die Hero-Section"). Auf Wunsch (15.09.2026:
   "die Mini-Überschriften weglassen") wieder entfernt – .eyebrow bleibt
   damit wieder site-weit display:none, wie in base.css seit 11.09.2026
   angelegt. Die H2-Überschriften direkt darunter (z.B. "Was ist der
   goldenroom?", "Lauschen statt Leisten") tragen den Section-Auftakt
   jetzt wieder allein. */

/* ---------- Baustein 1: Header ---------- */

/* Nur noch eine Linie statt der vorherigen Doppellinie (11.09.2026 auf
   Wunsch) – gleiche Dicke wie vorher (1px), jetzt ein normaler
   border-bottom statt zweier absoluter Pseudo-Elemente. Liegt als
   echter Teil der Box am unteren Rand, kein Gap-Flacker-Risiko beim
   Sticky-Scrollen wie bei der alten außenliegenden Variante. */
.site-header {
  position: sticky;
  top: 0;
  z-index: var(--z-header);
  background: var(--cream);
  border-bottom: 1px solid var(--gold-500);
  /* QUALITY-VARIANTE: sanfter Übergang in den "Glas"-Zustand beim
     Scrollen, siehe .is-scrolled unten (Klasse wird per JS gesetzt,
     siehe js/main.js). */
  transition: background-color 0.3s ease, box-shadow 0.3s ease, border-color 0.3s ease;
}

/* QUALITY-VARIANTE (15.09.2026, 2. Änderung, auf Wunsch: "sobald man
   scrollt, wird der Header komplett weiß, und das bleibt die ganze
   Zeit so, bis man wieder ganz nach oben scrollt"): vollflächiges,
   deckendes Weiß statt der vorherigen halbtransparenten Glas-Optik –
   kein backdrop-filter mehr nötig, ein deckender Hintergrund lässt
   ohnehin nichts mehr durchscheinen. Gilt jetzt einheitlich überall
   (auch auf .site-header--home, siehe dortige Media Query – die
   frühere Sonderregel, die dort absichtlich transparent blieb, ist
   raus, weil der Header dort jetzt dauerhaft sichtbar bleibt statt
   aus dem Bild zu laufen). */
.site-header.is-scrolled {
  background: var(--white);
  border-bottom-color: var(--gold-500);
  box-shadow: 0 18px 32px -24px rgba(33, 22, 16, 0.35);
}

@media (prefers-reduced-motion: reduce) {
  .site-header {
    transition: none;
  }
}

/* Lese-/Scrollfortschritt am unteren Headerrand (22.09.2026, auf
   Wunsch: "zwischen Header und Website ein goldener Rand, der smooth
   je nach Scrollposition fortschreitet, beim Zurückscrollen wieder
   zurück"). Nur Handy – Desktop hat mit .site-header (sticky) bereits
   die schmale, statische Gold-Trennlinie (border-bottom), das reicht
   dort ("Desktop ist fertig"). Element wird per JS in jede .site-header
   eingehängt (siehe js/main.js, gleiches "leichte Zusatzelemente per JS
   statt in jeder einzelnen HTML-Datei duplizieren"-Prinzip wie bei den
   Karussell-Klonen) – keine Markup-Änderung an den 15+ Seiten nötig.
   transform:scaleX() statt width: läuft auf dem Compositor statt bei
   jedem Scroll-Frame Layout neu zu berechnen (die Leiste sitzt in
   .site-header, position:sticky bzw. auf der Startseite position:fixed,
   beides malt bei jedem Scroll ohnehin schon neu). transform-origin
   links, damit die Füllung von links nach rechts wächst/schrumpft statt
   mittig. Die kurze Transition glättet zusätzlich zwischen den
   Scroll-Events (der Balken "springt" dadurch nicht in sichtbaren
   Schritten, auch wenn Scroll-Events selbst nicht ganz gleichmäßig
   feuern) – lang genug zum Glätten, kurz genug um beim Zurückscrollen
   nicht spürbar hinterherzuhinken. */
.site-header__progress {
  display: none;
}

@media (max-width: 900px) {
  .site-header__progress {
    display: block;
    position: absolute;
    left: 0;
    bottom: 0;
    width: 100%;
    height: 3px;
    background: var(--gold-500);
    transform: scaleX(var(--scroll-progress, 0));
    transform-origin: left center;
    transition: transform 120ms linear;
    pointer-events: none;
  }
}

@media (max-width: 900px) and (prefers-reduced-motion: reduce) {
  .site-header__progress {
    transition: none;
  }
}

.site-header__row {
  display: flex;
  align-items: center;
  gap: 1.5rem;
  padding-inline: var(--space-section-x);
}

.site-header__row--top {
  justify-content: space-between;
  padding-block: 0.75rem;
  /* Wortmarke und CTA sind jetzt weg (siehe .site-header__wordmark/
     .site-header__cta), Logo und Burger stehen beide absolut – ohne
     eigene Mindesthöhe würde die Zeile sonst auf die reine
     padding-Höhe zusammenfallen und Logo/Burger oben/unten
     abgeschnitten aus dem Header herausragen. */
  min-height: var(--logo-size);
}

/* Logo liegt absolut relativ zum (sticky, also positionierten)
   .site-header und zentriert sich dadurch über die volle Header-Höhe.
   Auf Desktop ist das Bild größer als der Header (--logo-img-size >
   --logo-size, 13.09.2026, 5. Änderung), ragt also oben UND unten
   etwas über die Header-Kante hinaus – unkritisch, weil dort im PNG
   nur transparenter Leerraum liegt (der sichtbare Schriftzug sitzt nur
   im mittleren Bereich der Bildhöhe, siehe --logo-img-size in
   tokens.css) und bleibt dadurch selbst komplett innerhalb der
   Header-Fläche sichtbar. Auf Wunsch (13.09.2026, 6. Änderung: "Logo
   soll mittig vom Header sein") von reiner Oberkanten-Bündigkeit auf
   echte Zentrierung zurückgestellt. */
.site-header__logo {
  position: absolute;
  top: 50%;
  left: var(--space-section-x);
  /* +0.0519 * Bildgröße (17.09.2026 auf Wunsch: "Logo... zu weit
     oben"): reines translateY(-50%) zentriert das ganze PNG, aber der
     sichtbare Schriftzug sitzt darin selbst nicht mittig – per
     Pixel-Messung der Transparenz-Bounding-Box (header logo final.
     800x800.png) liegt sein optisches Zentrum ca. 42px oberhalb der
     Bildmitte (bei 800px Bildhöhe). Als Anteil von --logo-img-size
     ausgedrückt, bleibt die Korrektur bei jeder Logogröße (Desktop/
     Tablet/Handy) gleich gut zentriert statt nur bei einer Breite. */
  transform: translateY(calc(-50% + 0.0519 * var(--logo-img-size)));
  /* QUALITY-VARIANTE: kleine Hover-Rückmeldung, sonst ist das Logo ein
     reiner Link ohne jedes interaktive Feedback. */
  transition: opacity 0.2s ease;
}

.site-header__logo:hover {
  opacity: 0.82;
}

@media (prefers-reduced-motion: reduce) {
  .site-header__logo {
    transition: none;
  }
}

.site-header__logo img {
  height: var(--logo-img-size);
  width: var(--logo-img-size);
  object-fit: contain;
  /* QUALITY-VARIANTE: dezentes Eintreten beim ersten Laden der Seite –
     ein kleiner, einmaliger Qualitäts-Signal-Moment, kein Dauerloop. */
  animation: header-logo-in 0.7s cubic-bezier(0.16, 1, 0.3, 1) both;
}

@keyframes header-logo-in {
  from { opacity: 0; transform: translateY(-8px); }
  to { opacity: 1; transform: translateY(0); }
}

@media (prefers-reduced-motion: reduce) {
  .site-header__logo img {
    animation: none;
  }
}

/* Wortmarke (Name + Motto), CTA-Button und die Nav-Zeile sind
   11.09.2026 auf Wunsch komplett aus dem Header raus – bei allen
   Bildschirmgrößen bleibt oben nur noch Logo links + Burger rechts,
   genau wie vorher schon auf Mobile. Navigation läuft jetzt
   ausschließlich über das aufklappende .mobile-menu (siehe unten),
   das dadurch nicht mehr nur "das mobile Menü", sondern DIE
   Navigation der ganzen Seite ist. Regeln bewusst nicht gelöscht
   (nur ausgeblendet), falls das später wieder gebraucht wird. */
.site-header__wordmark,
.site-header__cta,
.site-header__row--nav {
  display: none;
}

.site-header__wordmark {
  flex-direction: column;
  align-items: center;
  text-align: center;
  flex: 1;
}

/* Der eigentliche Link liegt jetzt INNEN, nur um Name+Motto herum
   (shrink-wrap, kein flex:1) – .site-header__wordmark bleibt außen die
   volle Breite groß (zentriert die Wortmarke zwischen Logo und CTA),
   klickbar ist aber nur noch der Text selbst, nicht die ganze leere
   Fläche daneben. */
.site-header__wordmark-link {
  display: flex;
  flex-direction: column;
  align-items: center;
}

.site-header__name {
  font-family: var(--font-display);
  font-size: clamp(1.6rem, 2.4vw, 2.3rem);
  font-weight: 500;
  line-height: 1.05;
  /* Explizit statt geerbt: body ist seit der Flyer-Angleichung
     --graubraun (Fließtext-Farbe) – die Wortmarke soll aber weiter im
     kräftigen --ink stehen, nicht in der weicheren Lesetext-Farbe. */
  color: var(--ink);
}

.site-header__motto {
  font-family: var(--font-mono);
  font-size: 0.75rem;
  color: var(--gold-700);
  margin-top: 0.35rem;
}

/* Liegt wie das Logo absolut relativ zum .site-header, damit die
   Wortmarke daneben unbeeinflusst über die volle Zeilenbreite
   zentriert bleiben kann. */
.site-header__cta {
  position: absolute;
  top: 50%;
  right: var(--space-section-x);
  transform: translateY(-50%);
}

/* Absolut wie Logo/CTA (relativ zum .site-header), statt als normales
   Flex-Item neben der Wortmarke zu stehen. Nur so bleibt die Wortmarke
   (Name + goldenes Motto) auf Handy-Breiten wirklich mittig im Header
   – vorher stand sie nur mittig in ihrer eigenen, durch Logo links und
   Burger rechts unterschiedlich stark eingeengten Box, was je nach
   Logo-/Burger-Breite leicht schief wirken konnte. */
.site-header__burger {
  display: flex;
  position: absolute;
  top: 50%;
  right: var(--space-section-x);
  transform: translateY(-50%);
  flex-direction: column;
  gap: var(--burger-gap);
  padding: var(--burger-pad);
}

.site-header__burger span {
  display: block;
  width: var(--burger-span-w);
  height: var(--burger-span-h);
  /* Gold statt Ink (12.09.2026 auf Wunsch), passend zur restlichen
     Gold-Akzentfarbe der Seite. */
  background: var(--gold-500);
  transform-origin: center;
  /* QUALITY-VARIANTE: die drei Striche verwandeln sich beim Öffnen in
     ein X (siehe [aria-expanded="true"]-Regeln unten) statt sich nur
     aufzuklappen – aria-expanded wird bereits von js/main.js gesetzt,
     keine JS-Änderung nötig. */
  transition: transform 0.3s ease, opacity 0.3s ease, background-color 0.2s ease;
}

.site-header__burger:hover span {
  background: var(--gold-600);
}

.site-header__burger[aria-expanded="true"] span:nth-child(1) {
  transform: translateY(calc(var(--burger-gap) + var(--burger-span-h))) rotate(45deg);
}

.site-header__burger[aria-expanded="true"] span:nth-child(2) {
  opacity: 0;
}

.site-header__burger[aria-expanded="true"] span:nth-child(3) {
  transform: translateY(calc(-1 * (var(--burger-gap) + var(--burger-span-h)))) rotate(-45deg);
}

@media (prefers-reduced-motion: reduce) {
  .site-header__burger span {
    transition: none;
  }
}

.site-header__row--nav {
  padding-block: 0.55rem;
  justify-content: center;
}

/* Trennlinie sitzt direkt auf der Nav-Liste, nicht auf der ganzen
   Header-Breite – die Liste ist von Natur aus nur so breit wie ihr
   Inhalt (shrink-to-fit), dadurch reicht der Strich exakt vom ersten
   bis zum letzten Punkt, ohne eigenes Breiten-Tracking. */
.site-nav {
  display: flex;
  gap: 2.25rem;
  padding-top: 0.4rem;
  padding-inline: 1.5rem;
  border-top: 1px solid var(--gold-500);
}

.site-nav a {
  font-size: 0.8125rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  /* Explizit statt geerbt: body ist --graubraun (Fließtext), Nav soll
     wie ein Headline/Label im kräftigen --ink stehen. */
  color: var(--ink);
}

/* ---------- Feature-Schalter: Blog komplett deaktiviert ----------
   (20.09.2026, auf Wunsch: "soll weder als Unterseite noch als Link
   noch als Section irgendwo existieren, aber jederzeit wieder
   einschaltbar"). Die Homepage-Section selbst ist über das
   hidden-Attribut an #blog in index.html ausgeblendet (siehe dort).
   Der "Blog"-Menüpunkt kommt aber auf JEDER Seite dreimal vor (Header-
   Nav, mobiles Menü, Footer-Nav) – bei 12 Dateien (10 Hauptseiten +
   blog/beitrag.html + workshops/workshop.html) wären das über 30
   einzelne <li>-Zeilen zum Entfernen UND wieder Zurücktippen. Eine
   einzige Regel hier deckt alle auf einmal ab: :has() matcht jedes
   <li>, dessen direktes Kind-<a> auf "blog.html" oder "../blog.html"
   zeigt (href endet in beiden Fällen auf "blog.html"), unabhängig
   davon, in welcher Nav-Liste/Datei es steht. display:none statt nur
   das <a> auszublenden, damit kein leeres <li> als Lücke im Flex-Gap
   der Liste stehen bleibt. Wieder einschalten: einfach diesen ganzen
   Block hier löschen/auskommentieren – kein Markup irgendwo ändern.
   blog.html/blog/beitrag.html selbst bleiben unangetastete, voll
   funktionsfähige Dateien, nur eben nirgendwo mehr verlinkt. */
li:has(> a[href$="blog.html"]) {
  display: none;
}

/* Cream/Greige-Kette auf der Startseite (28.09.2026, 2. Neuausrichtung,
   auf Wunsch: "die drei Formate hell, alle Workshops dunkel, Melde dich
   gerne dunkel, Mehr von mir auf Insta hell" – vorher standen #ablauf
   und #formate direkt hintereinander beide Greige, seit das Motto-Reveal
   zwischen ihnen auf ueber-mich.html umgezogen ist). Kette ab hier:
   #formate jetzt Cream (siehe .formate), #workshops Greige, #kundenstimmen
   Cream, #kontakt Greige, #instagram Cream – weiterhin rein über :has()/
   Sibling-Selektoren an #blog[hidden] gebunden, kein Markup-Attribut
   sonst geändert. Blendet man #blog wieder ein (hidden-Attribut
   entfernen), greifen diese Regeln automatisch nicht mehr. (War
   zwischenzeitlich #kurse, 20.09.2026 auf Wunsch umbenannt, 21.09.2026
   auf Wunsch wieder zurück auf #workshops.) */
#blog[hidden] ~ #workshops { background: var(--surface-b); --surface: var(--surface-b); }
#blog[hidden] ~ #kundenstimmen { background: var(--surface-a); }
/* --surface hier mit ergänzt (28.09.2026) – #kontakt enthält den
   "Nachricht senden"-Button, dessen Textfarbe (.btn--primary, siehe
   dort) jetzt automatisch dieser Variable folgt statt einer eigenen,
   separat gepflegten Regel. */
#blog[hidden] ~ #kontakt { background: var(--surface-b); --surface: var(--surface-b); }
/* .podcast-banner ist am 24.09.2026 komplett von hier auf ueber-mich.html
   umgezogen – #instagram folgt jetzt direkt auf #kontakt (jetzt Greige)
   und wird dadurch selbst Cream. */
#blog[hidden] ~ #instagram { background: var(--surface-a); }

.site-nav a:hover { color: var(--gold-700); }

/* Kleines Dropdown-Panel statt Vollflächen-Overlay: klappt oben rechts
   unter dem Burger-Button auf, dunkler leicht transparenter Hintergrund
   (man sieht die Seite dahinter noch leicht durchschimmern) mit heller
   Schrift. Ruhezustand ist unsichtbar (nur opacity:0, kein transform/
   keine Richtung mehr seit 11.09.2026 – einfaches Ein-/Ausblenden statt
   Reinschieben), .is-visible (per JS kurz nach dem Entfernen von
   [hidden] gesetzt, siehe js/main.js) blendet dann ein. Gleiches
   Prinzip beim Schließen umgekehrt – erst ausblenden, dann erst
   [hidden] wieder setzen, damit die Transition sichtbar abläuft statt
   einfach zu verschwinden. */
.mobile-menu {
  position: fixed;
  /* Bündig an der oberen rechten Bildschirmecke statt schwebendes
     Panel mit Abstand – kein top/right-Puffer, keine Radien. */
  top: 0;
  right: 0;
  left: auto;
  /* War min(80vw, 20rem) (23.09.2026, auf Wunsch: "Menüpopup ist voll
     groß geworden, mach es kleiner") – die Breite war das eigentliche
     Problem, spürbar schmaler jetzt. Die max-height-Deckelung von der
     letzten Änderung ist wieder raus (auf Wunsch: "sollte direkt alles
     zu sehen sein, ohne scrollen") – stattdessen sorgen die kleineren
     Abstände/Schriftgröße bei .mobile-menu a weiter unten dafür, dass
     das Panel insgesamt kompakt genug ist, um komplett ohne Scrollen in
     die Bildschirmhöhe zu passen.
     War danach min(60vw, 16rem) (24.09.2026, auf Wunsch: "sieht sehr
     gepresst aus, etwas größer vom Container") – wieder etwas breiter. */
  width: min(70vw, 19rem);
  max-height: 100vh;
  overflow-y: auto;
  z-index: var(--z-mobile-menu);
  border-radius: 0;
  /* --taupe-dark statt --espresso, niedrigere Deckkraft (0.55 statt
     0.72) – auf Wunsch (11.09.2026) spürbar heller als vorher, aber
     immer noch dunkel genug für die helle Schrift (--cream/--gold-500)
     hier drin. */
  background: rgba(58, 51, 44, 0.55);
  backdrop-filter: blur(14px);
  -webkit-backdrop-filter: blur(14px);
  box-shadow: 0 24px 48px -18px rgba(43, 33, 24, 0.45);
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  text-align: left;
  /* padding-top ist an die Position von .mobile-menu__close gekoppelt
     (halbe Headerhöhe + halbe Kreisgröße + Luft) statt einem festen
     Wert – der Kreis liegt bei 901px+ viel weiter unten (großer Burger,
     siehe dort) als auf Mobile, ein fester Wert hätte dort das X mitten
     in die erste Nav-Zeile statt sauber darüber gesetzt. Luft/unteres
     Padding etwas verringert (war 2.75rem/1.5rem, 23.09.2026, auf
     Wunsch: "Abstände von der Höhe geringer, alles ohne Scrollen
     sichtbar"). */
  padding: calc((var(--logo-size) + 1px) / 2 + 2.25rem) 1.5rem 1rem;
  /* Einfache Appear-Animation statt Reinschieben von oben (11.09.2026
     auf Wunsch) – nur Opacity, kein transform/Richtung mehr. */
  opacity: 0;
  transition: opacity 0.25s ease;
}

.mobile-menu[hidden] { display: none; }

.mobile-menu.is-visible {
  opacity: 1;
}

@media (prefers-reduced-motion: reduce) {
  .mobile-menu {
    transition: none;
  }
  .mobile-menu li {
    transition: none;
  }
}

/* Schließen-Kreuz sitzt jetzt oben rechts IM Panel selbst (vorher
   relativ zum Vollflächen-Overlay positioniert). Gleiche runde
   Button-Sprache wie .carousel-nav__btn, nur helle statt dunkle
   Ruhefarbe – das Panel selbst ist jetzt dunkel. */
/* Zentrum liegt exakt auf dem Zentrum des Burger-Buttons im Header
   (11.09.2026 auf Wunsch: "Schließen-Button an derselben Stelle wie
   Öffnen-Button") – .site-header und .mobile-menu sind beide oben
   bündig (top:0), also dieselbe Bezugskante für "top". Formel
   spiegelt exakt die Burger-Box: rechts = space-section-x (gleicher
   Abstand wie der Burger) + halbe Burger-Box-Breite (Innenabstand +
   halbe Strich-Breite) minus der halben Kreisgröße hier; oben = halbe
   Headerhöhe (--logo-size + 1px Trennlinie) minus der halben
   Kreisgröße. --burger-pad/--burger-span-w kommen aus tokens.css und
   sind dieselben Werte, die auch .site-header__burger benutzt, daher
   bleibt das Zentrum bei jeder Breakpoint-Umschaltung (901px) exakt
   deckungsgleich, ohne die Werte zweimal pflegen zu müssen. Bleibt
   trotzdem ein normaler, gleich großer Kreis (kein Versuch, die
   rechteckige Burger-Box nachzubilden) – das X bleibt darin per
   flex/align-items/justify-content sauber zentriert. */
.mobile-menu__close {
  position: absolute;
  top: calc((var(--logo-size) + 1px) / 2 - 1.25rem);
  right: calc(var(--space-section-x) + var(--burger-pad) + var(--burger-span-w) / 2 - 1.25rem);
  width: 2.5rem;
  height: 2.5rem;
  border-radius: 50%;
  border: 1px solid var(--gold-500);
  background: transparent;
  color: var(--cream);
  display: flex;
  align-items: center;
  justify-content: center;
  transition: background 0.2s ease, color 0.2s ease;
}

/* KORREKTUR (23.09.2026, 2. Runde, auf Wunsch: "X immer noch nicht
   mittig, genau da wo es vorher war") – ein kleiner transform-Versatz
   auf dem Unicode-Zeichen "✕" hatte keine sichtbare Wirkung. Jetzt
   stattdessen ein selbst gezeichnetes SVG-X (zwei exakt symmetrische
   Linien in einem 16×16-Raster) statt des Schriftzeichens – dadurch
   entfällt jede Abhängigkeit von Schriftart/Glyphen-Metriken, die
   Zentrierung durch das umgebende flex ist danach garantiert exakt. */
.mobile-menu__close-icon {
  width: 0.95rem;
  height: 0.95rem;
  stroke: currentColor;
  stroke-width: 1.5;
  stroke-linecap: round;
  fill: none;
}

.mobile-menu__close:hover {
  background: var(--gold-500);
  /* Nicht --cream: Weiß/Creme auf Gold-500 fällt auf 2,47:1 (siehe
     tokens.css) – stattdessen dunkle Schrift auf der Gold-Fläche. */
  color: var(--ink-on-gold);
}

.mobile-menu__eyebrow {
  /* War 1rem (23.09.2026, auf Wunsch: "Abstände geringer"). */
  margin-bottom: 0.6rem;
  /* --gold-700 ist auf hellem Creme fürs Auge gedacht (siehe .eyebrow
     in base.css) – auf dem jetzt dunklen Panel wäre das kaum lesbar,
     deshalb hier auf das helle --gold-500 überschrieben. */
  color: var(--gold-500);
}

.mobile-menu nav {
  width: 100%;
}

.mobile-menu ul {
  display: flex;
  flex-direction: column;
  width: 100%;
}

/* Dünne Haarlinien zwischen den Punkten statt nur Lücke – gleiche
   Trennlinien-Sprache wie .credentials/.site-nav, macht aus der Liste
   ein bewusst gestaltetes Menü statt loser Textzeilen. */
/* QUALITY-VARIANTE: gestaffeltes Einblenden der Menüpunkte beim Öffnen
   (nth-child-Verzögerung wie bei .reveal-stagger im übrigen CSS-System,
   hier eigens definiert, weil .mobile-menu li kein Karten-/Bild-Muster
   ist). Ruhezustand ist unsichtbar (opacity:0) – wie beim restlichen
   Reveal-System kein kaputter Halbzustand möglich, weil .is-visible
   ohnehin von main.js gesetzt wird, sobald das Panel geöffnet ist. */
.mobile-menu li {
  border-top: 1px solid var(--gold-500);
  opacity: 0;
  transform: translateY(10px);
  transition: opacity 0.4s ease, transform 0.4s ease;
}

.mobile-menu li:last-child {
  border-bottom: 1px solid var(--gold-500);
}

.mobile-menu.is-visible li {
  opacity: 1;
  transform: none;
}

.mobile-menu.is-visible li:nth-child(1) { transition-delay: 0.05s; }
.mobile-menu.is-visible li:nth-child(2) { transition-delay: 0.09s; }
.mobile-menu.is-visible li:nth-child(3) { transition-delay: 0.13s; }
.mobile-menu.is-visible li:nth-child(4) { transition-delay: 0.17s; }
.mobile-menu.is-visible li:nth-child(5) { transition-delay: 0.21s; }
.mobile-menu.is-visible li:nth-child(6) { transition-delay: 0.25s; }
.mobile-menu.is-visible li:nth-child(7) { transition-delay: 0.29s; }

/* QUALITY-VARIANTE: große, aufrechte Instrument-Serif-Zeile statt
   fetter Bebas-Neue-Versalien – liest sich wie eine Kapitel-/Seiten-
   liste in einem gedruckten Programmheft statt wie ein UI-Label.
   font-weight:400 (kein Fett-Schnitt verfügbar), Kursive kommt erst bei
   Hover/aktiver Seite als Betonung dazu. */
.mobile-menu a {
  display: block;
  /* War 1rem/1.5rem, dann 0.6rem (23.09.2026, auf Wunsch: "Abstände von
     der Höhe geringer, Schrift etwas kleiner, damit das Menü direkt
     komplett ohne Scrollen zu sehen ist"), jetzt wieder etwas mehr Luft
     (24.09.2026, auf Wunsch: "sieht sehr gepresst aus"). */
  padding-block: 0.8rem;
  font-family: var(--font-display);
  font-weight: 400;
  font-size: 1.15rem;
  letter-spacing: -0.005em;
  text-align: left;
  /* Helle Schrift auf dem jetzt dunklen Panel statt --ink. */
  color: var(--cream);
  transition: color 0.2s ease;
}

.mobile-menu a:hover,
.mobile-menu a[aria-current="page"] {
  color: var(--gold-500);
  font-style: italic;
}

@media (prefers-reduced-motion: reduce) {
  .mobile-menu a {
    transition: none;
  }
}

/* KORREKTUR (22.09.2026, auf Wunsch: "im Menü auch die Bebas-Schrift"):
   .mobile-menu a/.mobile-menu__dropdown summary liefen bisher bewusst
   auf --font-display (Instrument Serif, siehe Kommentar oben) statt
   --font-body – dadurch hatte der Wechsel von letzter Runde (--font-body
   auf Bebas Neue, nur ≤900px) hier keine Wirkung. Jetzt hier direkt auf
   --font-body umgeschaltet (ebenfalls nur ≤900px, Desktop-Menü bleibt
   bei Instrument Serif, "ist fertig"). Zeichenabstand von leicht negativ
   auf leicht positiv gedreht – Bebas Neue ist als enge Grotesk-Caps-
   Schrift ohnehin schon eng gesetzt, negative Tracking hätte es zu sehr
   zusammengequetscht (gleiche positive Tracking-Größenordnung wie bei
   den Buttons, siehe .btn). */
@media (max-width: 900px) {
  /* BUGFIX: .mobile-menu__dropdown summary steht im Quellcode weiter
     unten (siehe dort) – bei gleicher Spezifität hätte die spätere Regel
     dort gewonnen und diese hier wieder auf Instrument Serif
     zurückgesetzt. Ein zusätzlicher Vorfahre (.mobile-menu) macht diese
     Regel bewusst spezifischer, damit sie zuverlässig gewinnt,
     unabhängig von der Position im Dateiverlauf. */
  .mobile-menu a,
  .mobile-menu .mobile-menu__dropdown summary {
    font-family: var(--font-body);
    letter-spacing: 0.02em;
  }
}

/* ---------- Dropdown für "Die drei Formate" im Menü ----------
   (20.09.2026, auf Wunsch: "dass man auch auf die drei Formate oben
   rechts im Menü... dann auch so ein Dropdown hat und die drei direkt
   anklicken kann"). Natives <details>/<summary> statt eigenem JS-
   Toggle – gleiche Technik wie schon bei .faq-list, braucht dadurch
   keine main.js-Änderung: der bestehende "jeder Link im Menü schließt
   das ganze Menü"-Handler (siehe main.js, sucht alle <a> im Menü) greift
   automatisch auch für die Submenu-Links, egal wie tief verschachtelt –
   nur der Klick auf <summary> selbst (kein <a>) klappt lediglich das
   Untermenü auf/zu, ohne das ganze Menü zu schließen. */
.mobile-menu__dropdown summary {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
  /* War 1rem/1.5rem, gleiche Reduktion wie .mobile-menu a (23.09.2026,
     auf Wunsch: "Abstände geringer, Schrift kleiner, alles ohne
     Scrollen sichtbar"), jetzt wieder etwas mehr Luft (24.09.2026, auf
     Wunsch: "sieht sehr gepresst aus"). */
  padding-block: 0.8rem;
  font-family: var(--font-display);
  font-weight: 400;
  font-size: 1.15rem;
  letter-spacing: -0.005em;
  color: var(--cream);
  cursor: pointer;
  list-style: none;
  transition: color 0.2s ease;
}

.mobile-menu__dropdown summary::-webkit-details-marker {
  display: none;
}

.mobile-menu__dropdown summary::after {
  content: "+";
  font-family: var(--font-mono);
  font-size: 1.15rem;
  color: var(--gold-500);
  flex-shrink: 0;
}

.mobile-menu__dropdown[open] summary::after {
  content: "–";
}

.mobile-menu__dropdown summary:hover {
  color: var(--gold-500);
}

/* Zeigt "Die drei Formate" schon in Gold an, wenn man sich gerade auf
   einer der drei Unterseiten befindet (aria-current sitzt dann auf dem
   jeweiligen Submenu-Link) – auch bei geschlossenem Untermenü sofort
   erkennbar, in welchem Bereich man ist. */
.mobile-menu__dropdown:has(a[aria-current="page"]) summary {
  color: var(--gold-500);
  font-style: italic;
}

.mobile-menu__submenu a {
  padding-block: 0.6rem;
  padding-left: 1rem;
  font-size: 1.125rem;
}

.mobile-menu__submenu li {
  border-top: none;
}

.mobile-menu__submenu li:last-child {
  padding-bottom: 0.5rem;
}

/* Reine Logo-Größen-Anpassung – die vorherigen Kompensations-Regeln
   für die Wortmarke (Padding links/rechts, Schriftgrößen) sind mit
   Wortmarke/CTA/Nav (siehe oben, jetzt display:none) hinfällig
   geworden und raus. Auf :root statt nur .site-header, weil
   .mobile-menu__close (Geschwister-Element von .site-header, kein
   Nachfahre) --logo-size für seine eigene Positionierung ebenfalls
   braucht – als Custom Property auf .site-header gesetzt käme der Wert
   dort nie an. */
@media (max-width: 1024px) {
  /* KORREKTUR (23.09.2026): --logo-img-size war hier bewusst gleich
     --logo-size gesetzt ("Logo soll exakt in die Header-Zeile passen").
     Das aktuelle Logo-PNG ("header logo final. 800x800.png") hat aber
     oben/unten sehr viel transparenten Leerraum um den sichtbaren
     Schriftzug (nur ca. die mittleren 40% der Bildhöhe sind wirklich
     "Logo") – bei gleichgesetzten Werten wirkte dieser Leerraum wie ein
     viel zu hoher, luftiger Header ("um das Logo herum oben und unten
     zu viel Platz"). Jetzt wieder entkoppelt wie am Desktop: die
     Header-Zeile (--logo-size) bleibt niedrig, das Bild
     (--logo-img-size) darf größer sein und oben/unten transparent
     überstehen – sichtbar bleibt trotzdem nur der große Schriftzug,
     die Zentrierung dafür siehe .site-header__logo (pixel-vermessener
     Versatz, funktioniert bei jeder Logogröße gleich gut).
     KORREKTUR (24.09.2026, auf Wunsch: "Header etwas höher, der
     Goldschweif vom Logo ist abgeschnitten bei mobile") – seit dem
     Logo-Wechsel auf "finales header logo.png" reicht der goldene
     Sprenkel-Ring viel näher an den Bildrand als beim alten,
     großzügiger freigestellten Logo (siehe Kommentar oben, der von der
     ALTEN Datei ausging) – dadurch ragte der Ring jetzt sichtbar über
     die knappe Header-Zeile hinaus. --logo-size (die Zeilenhöhe)
     spürbar vergrößert, damit drumherum wieder genug Luft ist. */
  :root { --logo-size: 100px; --logo-img-size: 130px; }
}

@media (max-width: 640px) {
  /* Fein nachjustiert (23.09.2026, 2. Runde, auf Wunsch: "etwas
     kleiner, ein bisschen Platz lassen, nur ganz wenig") – war
     64px/160px (0 Puffer um den sichtbaren Schriftzug), jetzt etwas
     kleineres Bild plus etwas mehr Puffer in der Zeile.
     KORREKTUR (24.09.2026, auf Wunsch: "Header etwas höher, Goldschweif
     abgeschnitten") – gleicher Grund wie in der 1024px-Regel oben,
     --logo-size vergrößert. */
  :root { --logo-size: 104px; --logo-img-size: 140px; }
  /* Das Logo-PNG hat links noch etwas transparenten Rand (die
     Funkenring-Deko reicht nicht ganz bis zum "Y" von YOGA) – bündig
     an der Section-Kante positioniert wirkt das "Y" dadurch optisch
     leicht eingerückt gegenüber Bildern/Content darunter. 10px nach
     links (bei 60px Logogröße) rücken das "Y" selbst an dieselbe
     Kante wie der Content darunter, nicht nur die Bildbox. */
  .site-header__logo {
    left: calc(var(--space-section-x) - 10px);
    /* Auf Wunsch (24.09.2026: "Logo Header Mobile View etwas nach oben
       schieben") – die pixel-vermessene Korrektur weiter oben in dieser
       Datei (+0.0519 * --logo-img-size) war ursprünglich für die alte
       Logo-Datei kalibriert; hier auf Handy komplett zurückgenommen
       (reines translateY(-50%), echte Mitte), dadurch sitzt das Logo
       ein Stück höher als mit der vollen Korrektur. */
    transform: translateY(-50%);
  }
}

/* Startseite: Header schwebt transparent über dem Hero-Bild statt als
   eigene Cream-Leiste davor zu stehen (14.09.2026 auf Wunsch, Vorbild
   war ein Screenshot einer anderen Yoga-Website: dort sieht man oben
   nur Logo links + Menü rechts, keinen weißen Balken). Modifier-Klasse
   nur im <header> von index.html gesetzt (site-header--home), alle
   anderen Seiten behalten den normalen blickdichten Cream-Header
   unverändert. Nur ab 901px – auf Mobile beginnt der Hero (siehe
   .hero-Regeln) weiterhin mit Text statt Bild direkt unter dem Header,
   eine durchsichtige Leiste hätte dort nichts, worüber sie schweben
   könnte. */
/* QUALITY-VARIANTE (15.09.2026, 2. Änderung, auf Wunsch): position
   fixed statt absolute – der Header bleibt jetzt dauerhaft am oberen
   Bildschirmrand sichtbar (transparent über dem Hero-Foto, sobald man
   scrollt komplett weiß, siehe .is-scrolled oben), statt beim
   Herunterscrollen aus dem Bild zu laufen. Scrollt man wieder ganz
   nach oben (is-scrolled wird per JS entfernt, siehe js/main.js), wird
   er wieder transparent – dann ist wieder das komplette Hero-Foto ohne
   jede Überdeckung zu sehen.
   War auf ≥901px beschränkt ("auf Mobile beginnt der Hero mit Text
   statt Bild direkt unter dem Header, eine durchsichtige Leiste hätte
   dort nichts, worüber sie schweben könnte") – seit dem Handy-Hero-
   Redesign (21.09.2026, auf Wunsch: "Header oben transparent, wird
   erst beim Scrollen dunkel") hat auch Mobile jetzt ein großes
   Hintergrundfoto (siehe .hero__media in der @media max-width:900px-
   Regel), die Einschränkung ist damit hinfällig – gilt jetzt auf jeder
   Breite. .is-scrolled (weiter oben) ist bereits breitenunabhängig, an
   der JS-Seite (js/main.js) ändert sich dadurch nichts. */
.site-header--home {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  background: transparent;
  border-bottom: none;
}

/* ---------- Hero: Ankommen ---------- */

.hero {
  position: relative;
  /* Eigener Stacking-Context (statt nur auf .hero__content), damit das
     Wasserzeichen unten – jetzt direktes Kind von .hero statt von
     .hero__content, siehe dort – trotz z-index:-1 nicht hinter den
     Seitenhintergrund rutscht. */
  isolation: isolate;
  display: grid;
  grid-template-columns: 1fr auto;
  align-items: center;
  gap: 3rem;
  padding-left: var(--space-section-x);
  /* padding-block bewusst 0 statt main > section-Standard – das Bild
     soll lückenlos vom Header bis zum unteren Bildschirmrand reichen,
     der Text bekommt stattdessen sein eigenes Innenpolster */
  padding-block: 0;
}

.hero__content {
  position: relative;
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center; /* Boxen (nicht nur Text) mittig, passend zum globalen text-align:center */
  gap: 1.25rem;
  max-width: 34rem;
  min-width: 0; /* Grid-Item-Default min-width:auto würde sonst durch den nowrap-Kicker die Spalte aufdrücken */
  padding-block: clamp(3rem, 7vh, 5.5rem);
}

/* QUALITY-VARIANTE (21.09.2026, Handy-Hero-Redesign): .hero__kicker
   trug bisher die eyebrow-Klasse (site-weit ausgeblendet, siehe
   base.css) – war dadurch die ganze Zeit unsichtbar. Jetzt eigener,
   sichtbarer Text ("come as you are.", übernommen von der Desktop-
   Version .hero__intro-kicker) in derselben goldenen Schreibschrift
   wie dort ("die andere Überschrift-Schrift soll auch Gold sein", auf
   Wunsch). Nur auf Handy sichtbar (.hero__kicker steckt in
   .hero__content, das ab 901px display:none ist), daher hier direkt in
   der Basisregel statt in einer eigenen Media Query. */
.hero__kicker {
  width: fit-content;
  font-family: var(--font-script);
  font-style: italic;
  /* Kleiner (23.09.2026 auf Wunsch), war clamp(1.6rem, 6vw, 2rem). */
  font-size: clamp(1.2rem, 4.5vw, 1.5rem);
  color: var(--gold-700);
  white-space: nowrap;
}

.hero__title {
  font-size: clamp(2.6rem, 5vw, 4.4rem);
  line-height: 1.05;
  /* Letter-spacing kommt von der h1-Regel in base.css (0.01em, Bebas
     Neue braucht bei dieser Größe weniger Luft als kleinere Labels). */
}

.hero__lead {
  font-size: var(--step-lead);
  max-width: 40ch;
}

.hero__note {
  font-family: var(--font-display);
  font-size: 1.1875rem;
  color: var(--gold-700);
  max-width: 36ch;
}

/* Großes, ganz dezentes Logo-Wasserzeichen, jetzt mittig zur vollen
   Bildschirmbreite statt an der Kante der Textspalte. Absolut
   positioniert relativ zu .hero selbst (nicht Teil des Grids, sonst
   stört es die Platzierung von Text/Bild) – .hero hat kein max-width
   und keinen rechten Innenabstand, spannt also faktisch die volle
   Viewport-Breite auf, wodurch 50% hier wirklich die Bildschirmmitte
   trifft. */
.hero__watermark {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: min(24vw, 360px);
  height: auto;
  /* logo-dunkeler-transparent.png ist eine selbst freigestellte Version
     (Original hatte weißen statt transparenten Hintergrund – per Skript
     in echte Transparenz umgewandelt), daher reicht hier opacity ohne
     Blend-Mode-Trick. */
  opacity: 0.4;
  z-index: -1;
  pointer-events: none;
  user-select: none;
}

/* QUALITY-VARIANTE (17.09.2026, komplett neue Handy-Komposition statt
   Vollbild-Foto mit Logo drüber): heller Hintergrund, Logo groß oben
   mittig, das eigentliche Foto klein unten (leicht rechts der Mitte),
   Gras-Ecken links UND rechts unten – siehe .hero__media/.deko weiter
   unten für die anderen beiden Bausteine. --hero-visual-h definiert
   den reservierten Bereich oben in .hero (siehe dort), auf den sich
   alle drei Elemente hier mit vh-Werten beziehen (nicht %, weil .heros
   eigene Höhe wegen des folgenden Fließtexts "auto" ist). Kein
   drop-shadow mehr: der war nötig, damit das Logo sich vom unruhigen
   Foto abhob – auf reinem Hellgrund braucht es das nicht mehr, wirkt
   dort eher wie ein Fleck. */
@media (max-width: 900px) {
  /* QUALITY-VARIANTE (21.09.2026, komplettes Handy-Hero-Redesign, auf
     Wunsch: "im Hintergrund ganz groß das Bild von ihr... unten weiß"):
     löst die bisherige "Logo oben, dann unten rechts, mit Gras-Ecken"-
     Komposition (17.–20.09.2026) komplett ab – das Foto (.hero__media)
     füllt jetzt selbst die ganze Fläche als großer Hintergrund, ein
     zusätzliches Wasserzeichen-Logo darüber wäre da nur noch redundant
     (der Header zeigt das echte Logo ohnehin schon transparent
     darüber, siehe .site-header--home weiter oben). Nicht gelöscht, nur
     ausgeblendet – die Positionsregel von vorher bleibt als Referenz
     im Git-Verlauf erhalten, falls die alte Komposition mal zurückkommen
     soll. */
  .hero__watermark {
    display: none;
  }
}

/* .hero__intro (Kicker/Headline/Lead/CTA-Textblock) ist die
   Desktop-Version des Hero-Texts, sichtbar erst ab 901px (siehe dort) –
   auf Mobile bleibt .hero__content aktiv. .hero__signature hat kein
   HTML-Element mehr (der frühere kleine Schriftzug über der Headline
   wurde beim Hero-Redesign vom 14.09.2026 mit entfernt), die Regel
   bleibt nur als Absicherung stehen, falls das Markup mal
   zurückkommt. */
.hero__signature,
.hero__intro {
  display: none;
}

/* Die vier ehemaligen Foto-Karten (yoga_pose_a/b/c/d) sind seit dem
   Hero-Redesign vom 14.09.2026 komplett raus (Markup entfernt, siehe
   index.html) – ein einzelnes großes Foto (.hero__media) übernimmt
   jetzt die Bild-Rolle. Diese Regel bleibt als Absicherung stehen. */
.hero__pose {
  display: none;
}

.hero__media {
  --hero-media-inset: clamp(2rem, 5vw, 4rem);
  position: relative;
  min-width: 0; /* sonst drückt das Bild (Grid-Item-Default min-width:auto) die Spur bei knappem Platz über den Rand */
  align-self: start; /* oben an den Header andocken statt in der Zeile zu zentrieren */
  /* Rundum Cream-Rand statt Vollbild-Bleed – das Foto steht dadurch
     frei im Raum, wie schon bei Über mich/Format-Detail (dieselbe Idee,
     hier eigens umgesetzt statt .split--framed, weil .hero ein anderes
     Grid-Layout als .split hat). Links keine Extra-Polsterung, das
     übernimmt schon der Grid-Gap zur Textspalte. */
  padding: var(--hero-media-inset) var(--hero-media-inset) var(--hero-media-inset) 0;
}

/* Kein object-fit:cover – das Bild behält sein Original-
   Seitenverhältnis und wird nicht beschnitten. Höhe: Bildschirmhöhe
   minus Header minus den Cream-Rand oben/unten. */
.hero__media img {
  display: block;
  width: auto;
  max-width: 100%;
  height: calc(100vh - 138px - 2 * var(--hero-media-inset));
}

@media (max-width: 900px) {
  /* QUALITY-VARIANTE (21.09.2026, komplettes Handy-Hero-Redesign, auf
     Wunsch: "im Hintergrund ganz groß das Bild von ihr... unten weiß,
     sehr weicher Übergang... Header oben transparent, wird erst beim
     Scrollen dunkel [gemeint: blickdicht, siehe .is-scrolled]... groß
     'Fühlen statt Funktionieren'... Button 'Die drei Formate
     entdecken' in Gold"). Ersetzt die bisherige "Logo oben/Foto klein
     in der Ecke + Gras-Dekoration"-Komposition (17.–20.09.2026) komplett
     – jetzt dasselbe Grundprinzip wie am Desktop (.hero__intro, siehe
     unten): großes Foto + transparent schwebender Header, hier eigens
     für Hochformat-Handy. --hero-visual-h (siehe :root-Block oben)
     wird für dieses Layout nicht mehr gebraucht (Logo/Gras sind weg,
     kein reservierter Bereich mehr nötig) – bewusst nicht gelöscht,
     falls die alte Komposition mal zurückkommen soll. */
  /* KOMPLETTE NEUFASSUNG (23.09.2026, 9. Runde, auf Wunsch: "auf jedem
     Gerät soll man Überschrift, Text, Übergang UND Button komplett
     sehen") – alle bisherigen Versuche (feste vh-Werte, dann cm-
     Zuschläge, dann vmin) waren geratene Zahlen, die auf JEDER
     Bildschirmgröße zufällig passen mussten – auf Geräten, deren
     Seitenverhältnis vom Referenzgerät abwich (z.B. iPhone 7 sehr
     kurz+schmal, iPhone 17 anders als das iPhone 16, auf das die Werte
     zuletzt abgestimmt waren), ragte der Text-/Button-Block dadurch
     zwangsläufig über den Bildschirm hinaus. Jetzt strukturell gelöst
     statt mit Zahlen geraten: Flexbox-Spalte mit fester Gesamthöhe
     (100dvh, siehe unten) – .hero__content bekommt IMMER genau die
     Höhe, die sein Inhalt braucht (flex: 0 0 auto, nie abgeschnitten),
     .hero__media bekommt automatisch den kompletten Rest (flex: 1 1 auto)
     und schrumpft/wächst von selbst so, dass beides zusammen exakt in
     einen Bildschirm passt – auf JEDEM Seitenverhältnis, ganz ohne
     Geräte-Sonderfälle oder geratene vh/vmin-Zahlen. */
  .hero {
    display: flex;
    flex-direction: column;
    padding-inline: var(--space-section-x);
    background: var(--white);
    /* BUGFIX (23.09.2026, 11. Runde) – GEFUNDENE URSACHE für "Bild ganz
       klein, kaum Übergang, trotzdem Section 2 sichtbar": die vorherige
       Korrektur (min-height statt height, siehe Git-Historie) hat
       versehentlich das Flex-Wachstum von .hero__media zerstört – ein
       Flex-Container OHNE feste height gibt "flex-grow" nichts zum
       Verteilen (kein definierter Rest-Platz), .hero__media fiel
       dadurch auf seine bloße Mindesthöhe (22dvh, siehe dort) zurück,
       statt wie vorgesehen den ganzen restlichen Bildschirm zu füllen
       – GENAU das erzeugte den "Übergang mitten im winzigen Bild,
       darunter viel zu viel Weiß"-Effekt. Jetzt wieder feste height
       (nötig, damit flex-grow korrekt funktioniert).
       BUGFIX (23.09.2026, 12. Runde) – der +10dvh-Puffer war NOCH
       INNERHALB dieser Flex-Höhe (siehe Kommentar oben), dadurch
       "fraß" .hero__media (flex-grow) einen Teil davon mit auf und
       wuchs entsprechend höher – das schob .hero__content (Button!)
       teilweise über die sichtbaren 100dvh hinaus, "man sieht den
       Button nicht". Jetzt wieder exakt 100dvh (Button/Text bleiben
       dadurch garantiert innerhalb des sichtbaren Bereichs, keine
       Verschiebung "durch Margins"), der Sicherheitspuffer gegen die
       Browser-Tableiste sitzt jetzt als eigenes, separates Element
       NACH der ganzen .hero-Section (siehe .hero__safety-buffer
       weiter unten in dieser Datei + im HTML) – konkurriert dadurch
       nicht mehr mit .hero__media um denselben Platz. */
    height: 100vh;
    height: 100dvh;
  }
  /* Eigenständiger Weißpuffer NACH der kompletten Hero-Section (nicht
     Teil ihrer Flexbox) – fängt denselben Fall ab wie vorher (durch
     die halbtransparente Browser-Tableiste schimmert im schlimmsten
     Fall Section 2 durch), OHNE dass .hero__media diesen Platz mit
     beanspruchen kann. Exakt dieselbe Größe (10dvh) wie zuvor, nur
     strukturell woanders. */
  .hero__safety-buffer {
    display: block;
    /* War 10dvh, dann 16dvh (23.09.2026, auf Wunsch: "unter dem Button
       noch mehr Weißfläche, generell an Höhe"). Jetzt zusätzlich +2cm
       obendrauf (23.09.2026, auf Wunsch: "unter dem Button noch ca.
       zwei Zentimeter komplett weiße Fläche, bevor die nächste Section
       anfängt, ohne sonst irgendetwas zu verschieben") – bewusst als
       eigenständiges +cm zum bestehenden 16dvh addiert statt die
       Prozentbasis selbst zu ändern: .hero__safety-buffer ist ein
       eigenständiges Element NACH der kompletten .hero-Section (siehe
       Kommentar oben), die Höhe von .hero selbst (100dvh, Button-/
       Textposition) bleibt dadurch komplett unangetastet – nur hier
       unten kommt mehr Fläche dazu.
       KORREKTUR (23.09.2026, auf Wunsch: "etwas von der Weißfläche weg,
       ungefähr die Hälfte") – beide Anteile (dvh UND cm) hälftig
       reduziert, damit das Verhältnis zwischen ihnen gleich bleibt. */
    height: calc(8dvh + 1cm);
    background: var(--white);
  }
  /* Header schwebt jetzt auch auf Handy transparent über dem Foto,
     genau wie schon am Desktop (siehe .site-header--home weiter oben,
     die Breiten-Einschränkung dort ist deshalb raus) – erst beim
     Scrollen wird er blickdicht (.is-scrolled, per JS gesetzt). */
  .hero__media {
    /* War position:absolute (feste vh/vmin-Höhe) – jetzt normales
       Flex-Item, füllt automatisch den nach .hero__content
       verbleibenden Rest der 100dvh (siehe .hero oben). position:
       relative bleibt nötig als Ankerpunkt für ::after (Übergangs-
       Verlauf, siehe dort). */
    position: relative;
    order: -1;
    /* Erlaubt dem Flex-Item, auch unter seine Bildinhaltsgröße zu
       schrumpfen (Flexbox-Standard wäre sonst min-height:auto, das
       würde auf sehr kurzen Screens Überlaufen erzwingen). Eine kleine
       Mindesthöhe als Untergrenze, damit auf keinem Gerät "quasi kein
       Bild mehr" übrig bleibt. */
    flex: 1 1 0;
    min-height: 22dvh;
    width: calc(100% + 2 * var(--space-section-x));
    margin-inline: calc(-1 * var(--space-section-x));
    z-index: 1;
    align-self: auto;
    padding: 0;
  }
  .hero__media.fade-right.is-armed,
  .hero__media.fade-right.is-armed.is-visible {
    transform: none;
  }
  /* KORREKTUR (23.09.2026, 7. Runde) – mask-image/-webkit-mask-image
     wurde komplett aufgegeben (zweimal in Folge kaputt: einmal durch
     eine CSS-Variable, einmal durch cm+Prozent-Mischung, und zuletzt
     trotz reiner Prozentwerte auf dem Zielgerät weiterhin ohne
     sichtbaren Effekt – mask-image ist auf iOS Safari insgesamt zu
     unzuverlässig für diesen Fall). Stattdessen jetzt die simpelste,
     überall zuverlässig unterstützte Technik: eine eigene Ebene mit
     einem ganz normalen Hintergrund-Gradient (kein mask-image mehr im
     Spiel), die oben komplett durchsichtig ist und unten zu --white
     ausblendet, direkt über dem Foto (zwischen Bild und Text) gelegt.
     Startet bei 62% der Bildhöhe (etwas weiter unten als der letzte
     mask-image-Versuch bei 55%, auf Wunsch "ein bisschen weiter
     runter"), endet bei 100% = Boxunterkante. */
  .hero__media::after {
    content: "";
    position: absolute;
    z-index: 2;
    /* Diese Regel wurde über viele Runden (14.–23.09.2026) immer wieder
       nur am START-Prozentwert nachjustiert (Historie siehe Git-Log) –
       das stieß strukturell an eine Grenze: bei fester Bildhöhe schließt
       sich "viel mehr vom Bild zeigen" (Start spät) und "Übergang über
       spürbar viel Fläche" (Start früh) gegenseitig aus, wenn beides
       exakt an der Boxunterkante enden muss.
       STRUKTURELLE NEUFASSUNG (23.09.2026, auf Wunsch, per markiertem
       Screenshot gezeigt: das Foto soll bis in den Bereich der
       Überschrift "Fühlen statt Funktionieren" sichtbar bleiben) –
       diese Ebene überragt jetzt wie das <img> (siehe .hero__media img)
       die eigene Box um 35% nach unten (height:135% statt 100%,
       position:absolute statt inset:0), sie deckt sich exakt mit dem
       überstehenden Foto. Dadurch stehen jetzt EIGENER Bildbereich UND
       Ausblend-Strecke gleichzeitig zur Verfügung, ohne sich Platz
       wegzunehmen: das Foto bleibt komplett unangetastet sichtbar bis
       74% (= die alte, echte Boxunterkante, jetzt bei 100/135 ≈ 74% der
       neuen Gesamthöhe), danach eine lange, weiche Ausblend-Strecke über
       die kompletten restlichen 26% (statt der letzten, viel zu kurzen
       10%), bis sie im überstehenden Teil – optisch hinter/um
       .hero__content herum – komplett in Weiß übergeht. .hero__content
       selbst bleibt dabei strukturell unberührt (siehe Kommentar bei
       .hero__media img): der Button rutscht nicht, nur das Foto+der
       Verlauf reichen jetzt optisch weiter runter. */
    top: 0;
    left: 0;
    width: 100%;
    height: 135%;
    background: linear-gradient(
      180deg,
      transparent 0%,
      transparent 74%,
      rgba(255, 255, 255, 0.08) 80%,
      rgba(255, 255, 255, 0.2) 86%,
      rgba(255, 255, 255, 0.4) 91%,
      rgba(255, 255, 255, 0.65) 96%,
      var(--white) 100%
    );
    pointer-events: none;
  }
  .hero__media img {
    /* War width/height:100% als normales Block-Element, exakt auf die
       eigene Box begrenzt (23.09.2026, auf Wunsch: "das Foto soll noch
       deutlich weiter unten sichtbar sein, ungefähr bis in den Bereich
       der Überschrift 'Fühlen statt Funktionieren', per markiertem
       Screenshot gezeigt"). Die Box selbst (.hero__media, flex:1) darf
       laut früherer Entscheidung NICHT wachsen (sonst schiebt sie
       .hero__content/den Button aus dem sichtbaren Bereich, siehe
       Kommentare oben) – stattdessen überragt jetzt NUR das Foto
       (position:absolute statt normales Block-Element) seine eigene Box
       nach unten hin, sichtbar bis HINTER den Anfang von .hero__content
       (der Button/die Flex-Höhe bleiben davon komplett unberührt, weil
       ein absolut positioniertes Kind keine Größe an seine Box
       zurückmeldet). .hero__media selbst bleibt position:relative als
       Bezugsrahmen, braucht aber KEIN overflow:hidden (Standard ist
       bereits "visible"), sonst würde genau dieser Überstand
       abgeschnitten. z-index-technisch unkritisch: .hero__media hat
       eigenen Stacking-Context (z-index:1), .hero__content (z-index:2)
       liegt immer darüber, unabhängig davon, wie weit das Foto optisch
       überragt. */
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 135%;
    max-width: none;
    max-height: none;
    object-fit: cover;
    /* War 32% (23.09.2026 auf Wunsch: "man sollte ihre Hand oben noch
       sehen") – niedrigerer Wert zeigt mehr vom OBEREN Bildbereich, die
       erhobene Hand bleibt dadurch sicher im Bild statt oben
       abgeschnitten zu werden. */
    object-position: 50% 15%;
    border-radius: 0;
    box-shadow: none;
    filter: none;
    /* KORREKTUR (21.09.2026, 4. Runde) – GEFUNDENE URSACHE für die
       wiederholt gemeldete "weiße harte Kante": der Winkel war bisher
       174deg statt exakt 180deg (für einen leichten Schräg-Effekt). Bei
       einem GEKIPPTEN Verlauf liegen die Prozent-Haltepunkte (0%/38%/
       100%) aber nicht mehr gleichmäßig auf gleicher Bildhöhe über die
       ganze Breite verteilt, sondern auf einer schrägen Linie – der
       Verlauf erreicht "100% = transparent" auf der einen Seite des
       Fotos dadurch schon VOR der echten Unterkante der Box, auf der
       anderen Seite aber erst DANACH. Weil die Box selbst (.hero__media,
       feste Höhe) an ihrer Unterkante hart endet, blieb auf der
       "zu spät"-Seite ein schmaler Rest des Fotos noch leicht sichtbar
       (im Beispiel ca. 15-20% Deckkraft), direkt an dieser harten
       Boxkante – genau die gemeldete Linie. Exakt 180deg (senkrecht)
       behebt das zuverlässig: die Prozent-Haltepunkte liegen dann auf
       JEDER Bildspalte exakt auf derselben Höhe, "100%" fällt dadurch
       überall exakt mit der Boxunterkante zusammen, nirgends bleibt ein
       Rest übrig. Der "ein bisschen schräg"-Wunsch von vorhin tritt
       hier bewusst zurück – ein zuverlässig randloser Übergang wiegt
       schwerer als die kaum wahrnehmbare Schräge, die diesen Bug
       überhaupt erst verursacht hat. */
    /* mask-image/-webkit-mask-image (Übergang zu --white unten) komplett
       entfernt (23.09.2026, 7. Runde) – nach mehreren gescheiterten
       Anläufen (CSS-Variable nicht Safari-kompatibel, dann cm+Prozent-
       Mischung ungültig, dann trotz reiner Prozentwerte weiterhin ohne
       sichtbaren Effekt auf dem Zielgerät) auf .hero__media::after
       umgestellt (eigene Overlay-Ebene mit normalem Hintergrund-
       Gradient statt Masken-Technik, siehe dort) – deutlich simpler
       und zuverlässiger browserübergreifend unterstützt. */
  }
  .hero__content {
    position: relative;
    z-index: 2;
    max-width: none;
    /* Flex-Item mit fester, eigener Größe (23.09.2026, Flexbox-
       Neufassung, siehe Kommentar bei .hero oben) – bekommt IMMER genau
       so viel Höhe wie sein Inhalt braucht, wächst/schrumpft nie, damit
       nie etwas (v.a. der Button) über den Bildschirmrand hinausragt.
       .hero__media (Foto) füllt automatisch den Rest. */
    flex: 0 0 auto;
    padding-block: 1.25rem;
    gap: 0.6rem;
  }
  /* Etwas kleiner als die feste clamp-Untergrenze (2.6rem) der
     Basis-Regel (23.09.2026 auf Wunsch: "nur etwas kleiner"). */
  .hero__title {
    font-size: 2.3rem;
  }
  /* War beim ersten Entwurf dieses Redesigns versehentlich rausgefallen
     (BUGFIX) – .hero__note soll hier weiterhin nicht mit anzeigt
     werden: der neue, kurze Text (Kicker/Lead/Button, siehe index.html)
     ist bewusst knapp gehalten, .hero__note wäre ein zusätzlicher,
     unpassender vierter Textblock davor. */
  .hero__note {
    display: none;
  }
  /* KORREKTUR (21.09.2026, auf Wunsch: "der Pfeil sollte nicht in einer
     eigenen Zeile sein, alles in einer Zeile, dadurch dünner"): der
     Button-Text ("Die drei Formate entdecken →") ist EIN durchgehender
     Textstring (Pfeil als letztes Zeichen, kein separates Icon-Element)
     – bei der normalen .btn-Schriftgröße (1.125rem, dazu Versalien und
     Zeichenabstand) war das auf schmalen Screens breiter als verfügbar,
     der Pfeil brach dadurch als letztes "Wort" in eine eigene zweite
     Zeile um. white-space:nowrap allein hätte das nur in ein
     Breiten-Overflow verwandelt – kleinere Schrift/Innenabstand sorgen
     stattdessen dafür, dass wirklich alles auf eine Zeile passt (auch
     beim schmalsten unterstützten Screen, 320px, gegengeprüft). Niedriger
     dadurch automatisch mit (nur noch eine Textzeile statt zwei plus
     entsprechend weniger vertikales Button-Padding gebraucht). */
  .hero__cta {
    white-space: nowrap;
    font-size: 0.9375rem;
    padding: 0.75rem 1.25rem;
    /* Auf Wunsch (22.09.2026: "Schrift... weiß") – war das dunkle
       --ink-on-gold von der .btn--gold-Basisregel geerbt. Gleiche
       Logik wie am Desktop (.hero__intro-cta, dort schon länger
       color:var(--cream) statt --ink-on-gold): Textfarbe folgt der
       Farbe des dahinterliegenden Seitenhintergrunds, nicht der
       Button-Füllung. Hier --white statt --cream, weil .hero auf Handy
       jetzt explizit auf --white steht (siehe .hero weiter oben), nicht
       auf dem sonst üblichen --cream. */
    color: var(--white);
    /* Auf Wunsch (21.09.2026: "Button etwas weiter nach unten") – extra
       Abstand nur vor dem Button, zusätzlich zum normalen gap zwischen
       den anderen Textblöcken. */
    margin-top: 0.75rem;
  }
}

/* Die frühere "niedrige Screens"-Sonderregel (21.09.2026, dann mehrfach
   nachjustiert) ist komplett entfernt (23.09.2026, 8. Runde, auf
   Wunsch: "soll auf jedem iPhone exakt gleich aussehen wie beim
   iPhone 16") – unterschiedliche Werte je nach Bildschirmhöhe waren
   genau das, was auf verschiedenen Geräten (iPhone 7 vs. iPhone 16)
   wie ein anderes Layout wirkte. Jetzt gilt auf jeder Breite/Höhe
   dieselbe Hero-Regel weiter oben (reines vh, siehe dortiger
   Kommentar) – skaliert dadurch überall im gleichen Verhältnis, auch
   wenn auf sehr kleinen Screens dadurch wieder mehr gescrollt werden
   muss, um Button/Text zu sehen (das war der Kompromiss, den diese
   Regel bisher vermieden hatte). */

/* ---------- Startseite: Mobile-Kompression ----------
   (21.09.2026, auf Wunsch: "die Website wirkt sehr erdrückend...
   vereinfachen, Sachen weglassen, die du auch bei den Unterseiten hast,
   viele Banner weglassen, komprimiert, die Startseite sollte kleiner
   wirken"). Drei Sections, ausschließlich auf der Startseite verwendet
   (siehe die jeweiligen IDs/Klassen), sind auf Handy komplett
   ausgeblendet – nicht gelöscht, nur ausgeblendet, jederzeit über
   [hidden]/display wieder einschaltbar:
   - .podcast-banner: wörtlich ein "Banner", reiner Zweitkanal-Hinweis.
   - #instagram: ebenfalls bannerartig (Icon + Link zum Profil), Instagram
     selbst ist ohnehin schon im Footer verlinkt.
   - #workshops (Homepage-Teaser "Aktuelle Workshops"): dupliziert die
     eigene Workshops-Seite (workshops.html), die über die Navigation
     ohnehin einen Klick entfernt ist.
   Ab 901px (Desktop, "ist fertig") bleiben alle drei unverändert
   sichtbar.
   BUGFIX (22.09.2026, auf Wunsch: "wenn man auf Alle Formate im
   Überblick klickt, fehlt Workshops"): #workshops matchte hier bisher
   JEDES Element mit dieser ID site-weit – formate.html hat aber eine
   komplett andere Section (das ausführliche Workshops-Detailformat,
   class="format-detail...") mit derselben ID, die dadurch auf Handy
   versehentlich mit verschwand. Jetzt #workshops.workshops (ID UND
   Klasse zusammen) – nur der Homepage-Teaser trägt beides (siehe
   index.html, <section id="workshops" class="workshops">), die
   formate.html-Section hat eine andere Klasse und bleibt dadurch
   unberührt sichtbar. */
@media (max-width: 900px) {
  /* #instagram UND .podcast-banner waren hier mit ausgeblendet
     (21.09.2026), auf Wunsch (24.09.2026: "hab ich nie gesagt, dass
     die weg soll!!" / "Podcast-Banner auch wieder reinnehmen") beide
     wieder raus aus dieser Liste – nur #workshops.workshops (der
     Homepage-Teaser, dupliziert die eigene Workshops-Seite) bleibt auf
     Handy ausgeblendet. */
  #workshops.workshops {
    display: none;
  }
  /* Cream/Greige-Kette erneut nachgezogen (28.09.2026, 2. Neuausrichtung,
     gleicher Anlass wie die Basiskette weiter oben in dieser Datei) –
     mit #workshops auf Handy zusätzlich ausgeblendet, folgt hier direkt
     #kundenstimmen auf #formate (jetzt Cream, siehe .formate), braucht
     also Greige – eine Stufe VERSETZT zur Desktop-Kette (dort steht
     #workshops sichtbar dazwischen). Selektoren bewusst identisch zu
     den Basisregeln (nur hier zusätzlich in eine Media Query gepackt) –
     bei gleicher Spezifität gewinnt auf Handy diese spätere Regel, ab
     901px greift unverändert nur die ursprüngliche. */
  #blog[hidden] ~ #kundenstimmen { background: var(--surface-b); }
  #blog[hidden] ~ #kontakt { background: var(--surface-a); --surface: var(--surface-a); }
  #blog[hidden] ~ #instagram { background: var(--surface-b); }
}

/* Desktop-Hero (14.09.2026 auf Wunsch, ersetzt die Version vom
   12./13.09. komplett: großes Zentrallogo + vier verstreute
   Foto-Karten sind raus). Vorbild war ein Screenshot einer anderen
   Yoga-Website: links Textspalte (Kicker/Headline/Lead/CTA), rechts
   ein einzelnes großes Foto über die volle Höhe, das nach links weich
   in den Cream-Hintergrund ausläuft statt an einer harten Kante zu
   enden. Schriftarten und Farben bleiben die der Seite (Bebas Neue,
   Alex Brush, Gold/Cream/Ink) – nur Foto und Layout-Idee sind vom
   Screenshot übernommen. Der Header schwebt jetzt transparent über
   dem Hero (siehe .site-header--home weiter oben), deshalb hier wieder
   die volle Bildschirmhöhe (100vh) statt 100vh minus Header-Höhe. */
@media (min-width: 901px) {
  .hero {
    display: grid;
    grid-template-columns: minmax(auto, 30rem) 1fr;
    align-items: stretch;
    column-gap: clamp(1.5rem, 4vw, 3.5rem);
    position: relative;
    width: 100%;
    min-height: 100vh;
    padding: 0;
    padding-left: var(--space-section-x);
    /* Rechter Rand fürs große Foto (14.09.2026, 6. Änderung, auf
       Wunsch: "mehr in die Mitte, aber immer noch mehr rechts, ca. 1/7
       der Bildschirmbreite Platz rechts") – .hero__media hängt per
       justify-self:end (siehe dort) am Ende der zweiten Grid-Spalte,
       die Spalte selbst hört jetzt schon 1/7 vor dem echten rechten
       Bildschirmrand auf, statt bis dorthin zu reichen. Betrifft nur
       den Grid-Inhalt (Textspalte/Foto) – die absolut positionierten
       .deko-Eckbilder hängen an .heros Rand (padding-box), nicht an der
       Grid-Spalte, und bleiben dadurch unverändert in der echten Ecke. */
    padding-right: calc(100% / 7);
    background: var(--cream);
  }

  /* Text (Mobile-Version) und das dezente Hintergrund-Wasserzeichen
     sind auf Desktop weiterhin komplett weg – .hero__intro (Textspalte)
     und .hero__media (Foto) übernehmen hier stattdessen die beiden
     Grid-Spalten. .hero__media selbst bleibt bewusst UNGEHIDDEN (anders
     als in den Vorgängerversionen): es ist jetzt dasselbe Element wie
     auf Mobile, bekommt unten aber ein komplett eigenes Desktop-Styling
     statt des mobilen Vollbild-Fotos. */
  .hero__content,
  .hero__watermark {
    display: none;
  }

  /* justify-content:flex-start (14.09.2026, 6. Änderung) + spürbar
     mehr Top-Padding (10. Änderung, auf Wunsch: "weiter weg vom Logo,
     eleganter") – der Block hängt oben statt vertikal mittig, jetzt
     aber mit deutlich mehr Luft zum schwebenden Header-Logo als
     vorher (war clamp(5.5rem,12vh,7.5rem)), damit Logo und Textblock
     nicht mehr so dicht beieinander wirken. Bei knapper
     Bildschirmhöhe (kleine vh-Werte) bleibt genug Puffer bis zum
     Button unten, siehe Rechnung im Kommentar bei .hero__intro-lead. */
  .hero__intro {
    display: flex;
    flex-direction: column;
    justify-content: flex-start;
    align-items: flex-start;
    text-align: left;
    position: relative;
    z-index: 2;
    /* Bündig mit dem sichtbaren Schriftzug im Logo statt mit dessen
       Bildkante (14.09.2026, 11. Änderung, auf Wunsch) – "final header
       600x600.png" hat ringsum transparenten Leerraum, der sichtbare
       Schriftzug (das "g" von "goldenroom", per Pixel-Messung
       nachgeprüft) beginnt erst bei x=37 von 600, nicht bei 0. Ohne
       diesen Versatz stand der Textblock links leicht VOR dem
       Schriftzug, nicht bündig mit ihm. Gleiche Formel/Herleitung wie
       beim früheren --hero-left-align (inzwischen entfernt, siehe
       Git-Historie), hier nur direkt auf .hero__intro statt auf die
       (nicht mehr existierenden) Foto-Karten angewendet. */
    margin-left: calc(var(--logo-img-size) * 37 / 600);
    padding-block: clamp(8rem, 19vh, 11.5rem) 3.5rem;
    padding-right: 1rem;
  }

  /* Kurze Gold-Linie vor dem Kicker (14.09.2026, 10. Änderung, auf
     Wunsch: "eleganter") – ruhiger, editorialer Auftakt vor dem
     Schreibschrift-Kicker, kein neues Element im Markup nötig. Greift
     dieselbe dünne Gold-Linie auf, die die Seite ohnehin schon als
     Trenner zwischen Sections nutzt (siehe .section-divider), hier nur
     kurz statt volle Breite. */
  .hero__intro-kicker::before {
    content: "";
    display: block;
    width: 3.5rem;
    height: 1px;
    background: var(--gold-500);
    margin-bottom: 1.5rem;
  }

  /* Kicker/Headline/Lead auf Wunsch (14.09.2026, 6. Änderung) alle
     etwas größer als vorher – reine Schriftgrößen-Anpassung, Familie/
     Farbe/Ablauf unverändert. Abstände (10. Änderung) neu austariert:
     Kicker rückt näher an die Headline (wirkt wie ein Auftakt zu genau
     dieser Zeile statt ein separater Block), Lead bekommt dafür mehr
     Luft zum Button, damit der CTA nicht gedrängt wirkt. */
  .hero__intro-kicker {
    font-family: var(--font-script);
    /* QUALITY-VARIANTE: font-style:italic ist jetzt nötig, damit der
       Schreibschrift-Ersatz (Instrument Serif statt Alex Brush, siehe
       fonts/fonts.css) tatsächlich als fließender Akzent wirkt – ohne
       italic wäre es nur eine aufrechte Serife. */
    font-style: italic;
    /* War clamp(1.7rem, 2.7vw, 2.3rem), dann größer (23.09.2026, auf
       Wunsch: "come as you are... Desktop größer") auf clamp(2.2rem,
       3.6vw, 3.2rem), dann (24.09.2026, "viel zu groß") auf clamp(1.9rem,
       3vw, 2.6rem) – reichte auf Wunsch ("noch deutlich kleiner") immer
       noch nicht, jetzt spürbar unter den ursprünglichen Ausgangswert
       reduziert. */
    font-size: clamp(1.4rem, 2.2vw, 1.8rem);
    color: var(--gold-700);
    margin-bottom: 0.5rem;
  }

  .hero__intro-title {
    font-size: clamp(3rem, 5.8vw, 5.2rem);
    line-height: 1.05;
    margin-bottom: 1.35rem;
  }

  .hero__intro-lead {
    font-size: clamp(1.35rem, 1.7vw, 1.6rem);
    color: var(--graubraun);
    max-width: 38ch;
    margin-bottom: 2.5rem;
    /* Minimal mehr Zeichenabstand auf Wunsch (13.09.2026). */
    letter-spacing: 0.015em;
  }

  /* CTA-Button: eckig (border-radius:0) und etwas mehr Zeichenabstand
     als der Standard-.btn (0.02em) bleiben (14.09.2026, 7. Änderung,
     "soll mehr nach Qualität aussehen"). Die "hohle" Schrift von dort
     (Füllung transparent, nur ein dünner Rand sichtbar) war auf Wunsch
     (9. Änderung: "die Schrift ist falsch") wieder raus – jetzt ganz
     normaler, durchgehend gefüllter Text: etwas größer als der
     Standard-.btn (1.125rem) und in --cream statt --ink-on-gold, damit
     die Textfarbe der Farbe von Website-Hintergrund/Header/Hero
     entspricht. text-align:center hat bei diesem einzeiligen Text/Pfeil
     keinen sichtbaren Effekt (der Button ist ein inline-flex-Element,
     das sich schon an seinen Inhalt anschmiegt), schadet aber nicht.
     Kontrast-Hinweis: Cream auf Gold liegt mit ca. 2,2:1 klar unter der
     WCAG-AA-Vorgabe für Fließtext (4,5:1) – für einen einzelnen, großen
     CTA-Button ausdrücklich so gewünscht (15.09.2026 auf Wunsch erneut
     bestätigt: Textfarbe soll der Farbe des dahinterliegenden
     Seitenhintergrunds entsprechen, nicht der Button-Füllung selbst;
     kurz auf --ink-on-gold umgestellt, auf Wunsch wieder zurück). */
  .hero__intro-cta {
    border-radius: 0;
    padding: 1rem 2.25rem;
    letter-spacing: 0.08em;
    font-size: 1.25rem;
    text-align: center;
    color: var(--cream);
  }

  /* Rechte Spalte: einzelnes großes Foto (Desktop: "yoga_pose_d
     Kopie.jpeg" per <picture>, siehe index.html). 14.09.2026, 6.
     Änderung (zurück zu align-self:stretch + object-fit:cover, löst
     die 5. Änderung – "Bild schmiegt sich an sein eigenes
     Seitenverhältnis an" – wieder ab): auf Wunsch soll das Foto jetzt
     IMMER bis zum unteren Rand der Section reichen ("komplett bis nach
     unten, an den Rand der Section"). Das ging mit der reinen
     <img>-Schrumpflogik der 5. Änderung nicht garantiert – bei
     bestimmten Fensterbreiten (v.a. seit die rechte Spalte durch das
     neue padding-right, siehe .hero oben, schmaler wurde) band die
     Breite stärker als die Höhe, das Foto wurde dann kürzer als die
     Section und ließ unten eine Cream-Lücke. .hero__media füllt die
     Spalte jetzt wieder komplett (align-self:stretch), das <img>
     deckt diese Fläche per object-fit:cover lückenlos ab – dafür kann
     es je nach Fensterbreite mal etwas seitlich beschnitten werden
     statt oben/unten (Kompromiss, auf Wunsch bewusst in Kauf
     genommen). object-position: 25% vom oberen Rand statt Mitte, damit
     bei einer Seiten-Beschneidung eher Wandfläche als der nach oben
     gestreckte Arm wegfällt. */
  .hero__media {
    display: block;
    position: relative;
    grid-column: 2 / 3;
    align-self: stretch;
    min-width: 0;
    padding: 0;
  }

  .hero__media img {
    display: block;
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    max-width: none;
    object-fit: cover;
    object-position: center 25%;
    border: none;
  }

  /* Weicher linker Rand als eigener Verlaufs-Layer über dem Foto statt
     mask-image auf dem <img> (14.09.2026, 4. Änderung, auf Wunsch: "der
     Übergang ist jetzt voll hart", dann 5. Änderung: eigentliche Ursache
     behoben, siehe Kommentar bei .hero__media oben – hier jetzt wieder
     ein einfacher, unproblematischer Prozentwert, weil .hero__media
     nicht mehr größer ist als das Foto selbst). z-index:1 hebt ihn über
     das <img> (das selbst kein z-index hat, zählt also als 0).
     pointer-events:none, damit er Klicks/Hover auf darunterliegenden
     Elementen nicht blockiert (aktuell zwar nichts Interaktives im
     Hero-Foto, aber saubere Absicherung). */
  .hero__media::before {
    content: "";
    position: absolute;
    inset: 0;
    z-index: 1;
    pointer-events: none;
    background: linear-gradient(to right, var(--cream) 0%, transparent min(22rem, 40%));
  }

  /* Spiegelbild von ::before, auf Wunsch (14.09.2026, 8. Änderung):
     rechts vom Foto (also Richtung des per padding-right freigehaltenen
     1/7-Randes, siehe .hero oben) endete das Bild bisher hart an der
     Spaltenkante – jetzt läuft es genauso weich in Cream aus wie
     links, nur mit "to left" statt "to right" gespiegelt. */
  .hero__media::after {
    content: "";
    position: absolute;
    inset: 0;
    z-index: 1;
    pointer-events: none;
    background: linear-gradient(to left, var(--cream) 0%, transparent min(22rem, 40%));
  }

  /* .hero__pose (die vier verstreuten Foto-Karten a-d) hat keine
     eigene Desktop-Regel mehr – die Elemente bleiben über die
     Basisregel (display:none, siehe oben in dieser Datei) auf allen
     Breiten unsichtbar. Die zugehörigen <img>-Tags wurden 14.09.2026
     aus index.html entfernt, ein einzelnes großes Foto (.hero__media,
     siehe oben) übernimmt jetzt die Bild-Rolle im Hero. */
}

/* Burger-Größe (--burger-pad/--burger-span-w/-h/--burger-gap) ist ab
   901px bereits in tokens.css umgeschaltet – hier keine eigene Regel
   mehr nötig, .site-header__burger nutzt überall dieselben Tokens. */

/* ---------- Deko-Gras (Hero) ---------- */
/* Zwei rein dekorative Fotos (unscharfes Pampasgras, weißer
   Bildhintergrund) in den unteren Ecken des Hero (14.09.2026 auf
   Wunsch), siehe index.html – dort ganz am Ende von .hero im Markup,
   damit sie über allem anderen im Hero liegen. .hero ist schon
   position:relative (siehe .hero-Basisregel weiter oben), dient hier
   als Bezugsrahmen für die absolute Positionierung. Gilt auf allen
   Breiten (kein eigenes Desktop/Mobile-Grundgerüst nötig), nur die
   Breite wird unten per @media (max-width:767px) angepasst. */
.deko {
  position: absolute;
  bottom: 0;
  z-index: 3;
  /* Nie klickbar/hoverbar – liegt zwar optisch über allem (auch über
     dem CTA-Button, falls sich das überschneidet), soll aber nie
     Klicks abfangen. Der Header bleibt trotz seines viel höheren
     z-index (siehe --z-header) unberührt, weil er ein eigenes,
     positioniertes Element außerhalb von .hero ist. */
  pointer-events: none;
  height: auto;
  /* Weißer Bildhintergrund verschwindet: Multiply mit reinem Weiß
     verändert den darunterliegenden Cream-Hintergrund nicht, übrig
     bleibt nur die (dunklere) Gras-Silhouette. */
  mix-blend-mode: multiply;
  /* Auf Wunsch (14.09.2026, 8. Änderung: "sehr verschwommen, nur noch
     leichte Umrisse erkennbar", dann 9. Änderung: "nicht so krass
     unscharf" – 20px war zu viel, jetzt moderater) zusätzlich zur
     Radial-Maske (siehe .deko--links/--rechts) noch ein Weichzeichner –
     die Fotos waren zwar schon unscharf fotografiert, sollen hier aber
     insgesamt weicher wirken als ein normales Foto, ohne komplett zur
     formlosen Fläche zu verschwimmen. */
  filter: blur(10px);
}

.deko--links {
  left: 0;
  /* Nochmal größer (auf Wunsch, 14.09.2026, 9. Änderung – war zuvor
     30vw/480px). */
  width: 38vw;
  max-width: 600px;
  /* Zusätzlich zu mix-blend-mode:multiply (das nur das Weiß im Foto
     verschwinden lässt) sorgt eine Maske dafür, dass auch der Rest der
     rechteckigen Bildkante weich ausläuft statt als Kante erkennbar zu
     bleiben (14.09.2026, 7. Änderung, auf Wunsch: "sanfterer Übergang
     zwischen Bild und Weißfläche"). Ursprung der Ellipse ist die echte
     untere linke Bildschirmecke (bleibt voll sichtbar), nach oben/
     rechts – Richtung Seiteninhalt – dünnt sie aus. */
  -webkit-mask-image: radial-gradient(ellipse at bottom left, black 40%, transparent 85%);
  mask-image: radial-gradient(ellipse at bottom left, black 40%, transparent 85%);
}

.deko--rechts {
  right: 0;
  /* Deutlich größer als ursprünglich (auf Wunsch, 14.09.2026, 7.
     Änderung – war zuvor bewusst kleiner als links, damit die
     Komposition nicht spiegelgleich wirkt; das ist jetzt ausdrücklich
     nicht mehr gewollt), dann nochmal größer (9. Änderung – war
     32vw/500px). */
  width: 40vw;
  max-width: 620px;
  -webkit-mask-image: radial-gradient(ellipse at bottom right, black 40%, transparent 85%);
  mask-image: radial-gradient(ellipse at bottom right, black 40%, transparent 85%);
}

/* War @media max-width:767px, jetzt 900px (17.09.2026) – einheitlich
   mit dem Breakpoint der restlichen Hero-Handy-Komposition (.hero/
   .hero__media/.hero__watermark, siehe oben), sonst gäbe es zwischen
   768-900px einen halbfertigen Zwischenzustand. */
@media (max-width: 900px) {
  /* bottom:0 (Basisregel) würde auf Mobile an der Unterkante des
     GESAMTEN .hero hängen – der ist dort viel länger als der oben
     reservierte helle Bereich (--hero-visual-h), danach kommt noch der
     Fließtext. top + translateY(-100%) setzt stattdessen die UNTERE
     Kante der Deko exakt auf die untere Kante dieses reservierten
     Bereichs. Beide Seiten jetzt sichtbar (17.09.2026 auf Wunsch: "unten
     links und unten rechts... das Gras sehen") – vorher war rechts
     komplett aus, weil daneben das Vollbild-Foto keinen Platz ließ;
     das Foto ist jetzt selbst klein, der Platzmangel besteht nicht
     mehr. Größe/Unschärfe (2.-4. Korrektur, 17.09.2026: "größer und
     nicht soo krass verschwommen", dann nochmal "größer") – filter
     überschreibt hier gezielt nur für Handy den site-weiten blur(10px)
     aus der .deko-Basisregel (die bleibt für den Desktop-Einsatz
     unverändert). */
  /* Etwas größer (20.09.2026, auf Wunsch: "sonst noch etwas mehr da,
     weil das sonst leer aussieht") – war 65vw, zusammen mit dem jetzt
     größeren Foto (siehe .hero__media) füllt die Ecke damit sichtbar
     mehr von der reservierten Fläche, statt klein verloren zu wirken. */
  /* QUALITY-VARIANTE (21.09.2026, Handy-Hero-Redesign): die Gras-Ecken
     gehörten zur alten "Logo/Foto klein + Deko"-Komposition (17.-
     20.09.2026) – das jetzt volle, große Hintergrundfoto (siehe
     .hero__media) braucht diese Auflockerung nicht mehr, zwei
     zusätzliche unscharfe Bilder über einem bereits großen Foto hätten
     nur unruhig gewirkt. Nicht gelöscht, nur ausgeblendet. */
  .deko--links,
  .deko--rechts {
    display: none;
  }
}

/* ---------- "Was ist der goldenroom?" (kein eigener Baustein, nutzt .split) ----------
   Gleiche dünne Gold-Linie wie bei .ablauf/.motto-reveal – macht den
   Übergang vom Hero (randloses Bild) zu dieser Section auf einen Blick
   sichtbar. Nur auf dieser einen Section per ID, nicht auf .split
   allgemein (das würde auch die Über-mich-Section verändern, die
   denselben Baustein weiter unten nutzt, ohne dass das dort verlangt
   war). War eine Doppellinie (zusätzliches ::before), auf Wunsch
   (13.09.2026) auf eine einzelne Linie reduziert. */
#ueberblick {
  border-top: 1px solid var(--gold-500);
  /* --surface-Override entfernt (28.09.2026, auf Wunsch: Cream/Greige-
     Kette an mehreren Stellen neu abgestimmt, siehe .ablauf/.formate/
     #workshops/#kundenstimmen/#kontakt/#instagram) – #ueberblick war
     bisher Greige, direkt danach folgten .ablauf UND .formate ebenfalls
     Greige (drei dunkle Flächen hintereinander). Jetzt fällt
     .split__text ohne Override auf seinen Standard var(--cream)
     zurück, .split__text nutzt normalerweise var(--surface,
     var(--cream)) – hier wird nur die CSS-Variable überschrieben,
     statt die geteilte .split-Basis anzufassen (die würde sonst auch
     andere .split-Sections mitverändern). */
}

/* ---------- Wie eine Stunde abläuft ----------
   Zeigt bewusst dauerhaft alle vier Karten direkt nebeneinander, kein
   Pin/Scroll-Crossfade mehr (früher gab es hier eine GSAP-Animation,
   auf Wunsch entfernt – die Section ist einfach eine normale,
   lesbare Liste). */

/* Eigener Hintergrund (Greige) + dünne Linie oben in Gold (wie die
   Trennlinie unter dem Header) – macht den Wechsel von der Hero-
   Section zu diesem neuen Thema auf einen Blick sichtbar, auch ohne
   dass man den Bildinhalt liest. War eine Doppellinie (zusätzliches
   ::before), auf Wunsch (13.09.2026) auf eine einzelne Linie
   reduziert. */
.ablauf {
  position: relative;
  isolation: isolate; /* eigener Stapelkontext, damit .ambient-gold (z-index:-1) zuverlaessig hinter dem Text bleibt */
  background: var(--surface-b);
  border-top: 1px solid var(--gold-500);
  padding-block: var(--space-section-y);
  padding-inline: var(--space-section-x);
}

.ablauf__pin {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 1.5rem;
}

.ablauf__intro {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.5rem;
}

.ablauf__heading {
  /* War eine eigene, etwas kleinere Größe – jetzt wie alle anderen
     Section-Überschriften auf --step-titel vereinheitlicht. */
  font-size: var(--step-titel);
  text-align: center;
}

.ablauf__media {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 1.5rem;
  width: 100%;
}

/* Nur Teil des Handy-Zickzack-Layouts (siehe @media max-width:700px
   weiter unten) – am Desktop-4-Spalten-Grid gibt es keine Kurve zum
   Zeichnen. */
.ablauf__thread {
  display: none;
}

.ablauf__item {
  display: flex;
  flex-direction: column;
  gap: 0.75rem;
}

.ablauf__img {
  width: 100%;
  aspect-ratio: 3 / 4;
  object-fit: cover;
}

.ablauf__caption {
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
  text-align: center;
}

/* Alle drei Caption-Ebenen deutlich größer (16.09.2026 auf Wunsch:
   "wirklich deutlich größer, sodass man das besser sehen kann") – die
   vier Spalten haben auf Desktop reichlich Platz, dadurch bleibt trotz
   der größeren Schrift alles auf 1-2 Zeilen und sieht nicht gedrängt
   aus. Über clamp() skaliert das an schmaleren Fenstern sanft zurück
   statt abrupt umzubrechen. */
.ablauf__step-index {
  font-family: var(--font-mono);
  font-weight: 700;
  font-size: clamp(0.9rem, 1.1vw, 1.05rem);
  letter-spacing: 0.04em;
  color: var(--gold-700);
}

/* QUALITY-VARIANTE: font-mono (Karla, echtes Fett) statt font-display –
   Instrument Serif hat keinen Fett-Schnitt, ein synthetisiertes Fett auf
   einer kleinen Serifen-Caption sieht unsauber aus. Kleine Bild-Labels
   wie diese lesen sich als klare Sans-Caption ohnehin besser als in
   einer Display-Serife. */
.ablauf__step-title {
  font-family: var(--font-mono);
  font-weight: 700;
  font-size: clamp(1.25rem, 1.8vw, 1.5rem);
  text-transform: uppercase;
  letter-spacing: 0.05em;
  /* Explizit statt geerbt: body ist --graubraun (Fließtext), diese
     Karten-Überschrift soll wie die anderen Headlines im --ink stehen. */
  color: var(--ink);
}

.ablauf__step-text {
  font-size: clamp(1.05rem, 1.3vw, 1.2rem);
}

/* Handy: statt einem 2x2-Grid oder dem Zickzack-Zeitstrahl (früher)
   alle vier Schritte sauber mittig untereinander – bündig statt
   abwechselnd links/rechts. Dazu ein dünnes goldenes Band, das die
   vier Schritte wie einen Faden verbindet: liegt HINTER den Karten
   (z-index 0, Karten z-index 1 mit eigenem Hintergrund), taucht also
   nur in den Lücken zwischen den Schritten auf – nie sichtbar über
   Foto oder Text, nur "durchleuchtend" dazwischen. Endet exakt mit
   dem vierten Schritt, kein Überstand mehr danach. */
@media (max-width: 700px) {
  /* MOBILE-POLISH (20.09.2026, auf Wunsch: "nimm bei wie läuft eine
     Stunde ab die Bilder raus"): die vier Fotos machten die Section auf
     Handy sehr lang – Ziffer/Titel/Text tragen die vier Schritte auch
     ohne Bild. Ab 701px (Desktop/Tablet, "ist fertig") unverändert mit
     Fotos. */
  .ablauf__img {
    display: none;
  }
  /* KORREKTUR (22.09.2026, auf Wunsch: "sieht nicht schön aus"): löste
     die damalige Fadenlinie-mit-schmal-schwebenden-Textblöcken-Optik ab
     (schmale, mittig frei stehende 290px-Boxen auf einem dünnen
     goldenen Faden dahinter – ohne Bilder/Rahmen wirkte das unfertig)
     zugunsten einer gebundenen Liste mit Trennlinien.
     NEUFASSUNG (23.09.2026, auf Wunsch: "Unterstriche weg, die vier
     Punkte versetzt in Blocks, goldene Linie die sich beim Scrollen
     durch die Punkte schlängelt"): die Trennlinien sind komplett raus,
     die vier Schritte sind jetzt eigenständige Karten (eigener
     Hintergrund + weicher Schatten statt Linien), abwechselnd links/
     rechts versetzt (Zickzack) statt bündig untereinander. Dahinter
     liegt (siehe .ablauf__thread weiter unten) ein goldener Strich, der
     beim Scrollen wächst – js/main.js koppelt den Fortschritt per GSAP
     ScrollTrigger (scrub) an die Scrollposition durch die Section,
     siehe dort. */
  .ablauf__media {
    position: relative;
    display: flex;
    flex-direction: column;
    gap: 2.25rem;
    width: 100%;
    max-width: 26rem;
    margin-inline: auto;
    padding-block: 0.5rem;
  }
  /* NACHTRAG (23.09.2026, 4. Runde, auf Wunsch: "entweder die ganze
     viel zu dicke Linie 100% da oder nicht, keine Entwicklung") –
     stroke-dasharray/-dashoffset (mehrere Runden lang versucht, siehe
     Git-Historie) komplett aufgegeben. GRUNDSÄTZLICH ANDERER Aufbau
     jetzt: .ablauf__thread-path ist eine STATISCHE Kurve, deren Form
     sich nie ändert (kein Dash, kein vector-effect-Sonderfall mehr
     nötig) – "eingezeichnet" wird stattdessen über clip-path:inset()
     auf dem äußeren .ablauf__thread selbst: eine simple, breit
     unterstützte Rechteck-Clip-Animation von unten nach oben (0%
     sichtbar → 100% sichtbar), technisch dieselbe Idee wie beim
     bewährten geraden Balken (dort per Höhe/Skalierung gewachsen, hier
     per Clip freigegeben) – nur dass die Kurvenform selbst jetzt
     komplett unabhängig davon, unangetastet feststeht. */
  .ablauf__thread {
    display: block;
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    z-index: 0;
    pointer-events: none;
    /* Ruhezustand: komplett sichtbar (kein Clip) – gleiche Konvention
       wie bei .motto-reveal__block (CSS-Ruhezustand IST der gute
       Endzustand). js/main.js setzt den Startzustand (von unten
       komplett weggeclippt) erst per JS, NUR wenn GSAP/ScrollTrigger
       verfügbar sind, und animiert dann scroll-gekoppelt zurück auf
       "nicht geclippt". */
    clip-path: inset(0 0 0% 0);
  }
  .ablauf__thread-svg {
    display: block;
    width: 100%;
    height: 100%;
    overflow: visible;
  }
  .ablauf__thread-path {
    fill: none;
    stroke: var(--gold-500);
    stroke-width: 1.5px;
    vector-effect: non-scaling-stroke;
  }
  .ablauf__item {
    position: relative;
    z-index: 1;
    /* War 76% + margin:auto, dann 88%/12% (23.09.2026, zwischenzeitlich
       auf Wunsch verkleinert) – jetzt auf Wunsch ("die 4 Punkte sollen
       weiter versetzt sein") wieder deutlich mehr Versatz. */
    width: 72%;
    /* War eigene Karte mit weißem Hintergrund + Schatten (23.09.2026,
       auf Wunsch: "die vier Kästen einfach ohne Füllung, einfach Text
       im Hintergrund") – jetzt komplett ohne eigene Fläche, der
       goldene Faden dahinter (.ablauf__thread) ist dadurch jetzt auch
       DURCH den Text hindurch sichtbar statt nur in den Lücken
       zwischen den Karten, genau das gewollte "schlängelt sich durch
       die Punkte"-Bild. */
    padding: 1.5rem 1.75rem;
  }
  /* Sanfter Versatz statt hartem Zickzack: 1./3. Karte minimal links,
     2./4. minimal rechts (fester Prozentwert statt margin:auto, das
     bisher voll bis zur gegenüberliegenden Kante zog). nth-of-type
     statt nth-child, weil .ablauf__thread (das SVG) als zusätzliches
     erstes Geschwisterelement sonst die Zählung der Karten-Position
     verschieben würde. */
  .ablauf__item:nth-of-type(odd) {
    margin-right: 22%;
  }
  .ablauf__item:nth-of-type(even) {
    margin-left: 22%;
  }
  /* Ziffer UND Titel trugen bisher font-weight:700 auf --font-mono –
     das ist seit der Bebas-Neue-Umstellung auf Handy (tokens.css) ein
     synthetisches Fake-Fett auf einer Schrift ohne echten Fett-Schnitt,
     siehe ausführliche Begründung bei .mobile-lede weiter oben. Echtes
     (einziges) Gewicht 400 plus mehr Zeichenabstand statt des
     zugedrückt/zu schweren Fake-Fetts, Titel zusätzlich etwas größer
     (auf Wunsch: "etwas größere Schrift, nicht so extrem fett,
     Zeichenabstand breiter"). */
  .ablauf__step-index {
    font-weight: 400;
    letter-spacing: 0.08em;
  }
  .ablauf__step-title {
    font-weight: 400;
    font-size: 1.35rem;
    letter-spacing: 0.06em;
  }
  /* Auf Handy sollen die vier Schritte von Anfang an alle da stehen,
     nicht nacheinander beim Scrollen erscheinen (Desktop behält das
     Fade-up). Reveal-Klasse bleibt im Markup (für Desktop), hier nur
     der Mobile-Zustand fest auf "sichtbar" gesetzt. */
  .ablauf__item.fade-up.is-armed {
    opacity: 1;
    transform: none;
    transition: none;
  }
}

/* ---------- Motto-Reveal ----------
   Zwei große, versetzte Textblöcke nach "Wie eine Stunde abläuft"
   (Greige) – eigener Cream-Hintergrund als Atempause danach, gleiche
   Linie oben wie bei .ablauf. Die Werte hier (padding-left/right der Rows)
   SIND der Ruhezustand – ohne JS steht alles direkt an dieser
   versetzten Position, kein kaputter Halbzustand. js/main.js lässt die
   Blöcke bei Bedarf zusätzlich einmalig von außen hereinfliegen. */

/* QUALITY-VARIANTE: Signature-Moment der Seite, mehrfach überarbeitet.
   War zwischenzeitlich ein dunkles Vollbild-Band (espresso → taupe-dark
   → ink), am 16.09.2026 auf Wunsch komplett zurückgenommen: "der
   Hintergrund sollte nicht dunkel sein, sondern hell, am besten weiß...
   nicht dieses sehr, sehr schwarze Braun". Jetzt --white statt einer
   der Dunkel-Stufen – heller als die sonst übliche --cream-Fläche der
   Seite, dadurch bleibt es trotzdem ein eigener, klar abgesetzter
   Moment, nur eben hell statt dunkel. Text dazu einheitlich in
   --gold-700 (siehe .motto-reveal__block--left/--right) statt des
   vorherigen Cream/Gold-Zweiklangs, der auf Hell keinen Kontrast mehr
   gehabt hätte. */
.motto-reveal {
  position: relative;
  isolation: isolate; /* eigener Stapelkontext, damit .ambient-gold (z-index:-1) zuverlaessig hinter dem Text bleibt */
  overflow: clip; /* verhindert horizontales Scrollen während die Blöcke von außen hereinfliegen – klippt als Nebeneffekt auch .ambient-gold sauber an der Sectiongrenze */
  background: var(--white);
  /* War clamp(5rem, 12vw, 8.5rem) – auf Wunsch (15.09.2026: "das Banner
     ist zu hoch") deutlich reduziert. Zusammen mit der viel größeren
     Schrift (siehe .motto-reveal__block) füllt der Text die Fläche jetzt
     von sich aus besser, die Section braucht dadurch weniger reines
     Leerpolster oben/unten, um trotzdem großzügig zu wirken. */
  padding-block: clamp(3rem, 6.5vw, 5rem);
  /* Kleine Sicherheitsmarge (16.09.2026, nach Vergrößern des
     Zeilenversatzes auf 14%): bei ca. 900-1024px reichte die Mitte-
     Überschneidung aus, um die untere Zeile ein paar Pixel über den
     linken Sectionrand hinauszuschieben (von .overflow:clip
     abgeschnitten). Der Wert ist bewusst klein, rein als Puffer. */
  padding-inline: clamp(0.5rem, 1.5vw, 1rem);
  display: flex;
  flex-direction: column;
  gap: clamp(0.5rem, 1.5vw, 1.25rem);
}

.motto-reveal__row {
  display: flex;
  width: 100%;
}

/* War kurzzeitig (16.09.2026) eine echte Kante-zu-Kante-Anordnung ohne
   Versatz – auf Wunsch direkt wieder zurückgenommen ("warum hast du die
   Animation geändert, die war doch vorher perfekt"): beide Zeilen
   wieder von der Mitte aus zueinander verschoben, sodass sich ihre
   Enden mittig überschneiden. Oben schiebt sich nach rechts (Richtung
   Mitte/darüber hinaus), unten nach links. Versatz direkt danach noch
   mal vergrößert (10% auf 12%, auf Wunsch: "nicht so nah aneinander,
   mittig... 'Erfahrung statt Erwartung' ein bisschen weiter rechts,
   'Präsenz statt Performance' ein bisschen weiter links") – 14% war der
   erste Versuch, überschritt aber bei 850-1100px den Bildschirmrand
   (per Playwright an vielen Breiten dazwischen gegengeprüft, nicht nur
   an den großen Sprüngen); 12% ist im gesamten getesteten Bereich
   (640-1920px) sicher. Handy hat weiterhin seine eigene, unversetzte
   Kante-zu-Kante-Regel, siehe @media weiter unten (dort war nie eine
   Überlappung nötig). */
.motto-reveal__row--top {
  justify-content: center;
  transform: translateX(12%);
}

.motto-reveal__row--bottom {
  justify-content: center;
  transform: translateX(-12%);
}

@media (max-width: 640px) {
  .motto-reveal__row--top {
    justify-content: flex-start;
    transform: none;
  }
  .motto-reveal__row--bottom {
    justify-content: flex-end;
    transform: none;
  }
}

/* QUALITY-VARIANTE: Instrument-Serif-Kursive statt Alex Brush (siehe
   fonts/fonts.css). Zeichenabstand am 16.09.2026 auf Wunsch ("ein
   bisschen mehr Buchstabenabstand, sodass es jeweils ein bisschen
   länger ist") von leicht negativ auf spürbar positiv gedreht – auf
   dem jetzt hellen Hintergrund und mit einheitlicher Goldfarbe (statt
   des vorherigen Cream/Gold-Zweiklangs) trägt die größere Laufweite
   zusätzlich zur ruhigen, editorialen Wirkung bei. */
.motto-reveal__block {
  /* will-change (19.09.2026, auf Wunsch "Animation cleaner machen, sie
     hackt aktuell etwas"): promoted den Block schon VOR dem ersten
     Scroll-Trigger auf eine eigene Compositor-Ebene. Ohne das musste
     der Browser die große, breite Schrift beim ersten Animations-Frame
     erst neu rastern und gleichzeitig verschieben – das allein sah wie
     ein kurzes Stottern zu Beginn der Bewegung aus. Siehe auch die
     toggleActions-Änderung in js/main.js gegen das Ruckeln bei
     Vor-und-Zurück-Scrollen um die Trigger-Linie. */
  will-change: transform;
  font-family: var(--font-script);
  font-style: italic;
  /* Etwas größer (16.09.2026, 3. Korrektur: "etwas größer von der
     Zeilengröße") – bewusst nur die Obergrenze angehoben, der
     vw-Faktor (7vw) bleibt exakt gleich: zwischen ca. 640-1150px
     bestimmt allein dieser vw-Faktor die Größe (die Obergrenze wird
     dort gar nicht erreicht), genau der Bereich, in dem der Versatz
     unten schon knapp gegen den Sectionrand geprüft ist. Eine größere
     Obergrenze wirkt sich dadurch nur auf breiten Bildschirmen aus
     (ab ca. 1150px, wo längst reichlich Luft ist), ohne die dort
     schon gefundene sichere Versatzgrenze zu gefährden. */
  font-size: clamp(2.35rem, 7vw, 4.85rem);
  line-height: 1.15;
  letter-spacing: 0.04em;
  white-space: nowrap;
}

.motto-reveal__block--left,
.motto-reveal__block--right {
  /* --gold-600 statt --gold-700 (16.09.2026, 3. Korrektur: "wirkt eher
     braun, soll etwas goldener wirken") – hellere, wärmere Goldstufe,
     auf dem weißen Hintergrund weiterhin gut lesbar (Kontrast ~3.6:1,
     reicht für die große Schriftgröße hier). */
  color: var(--gold-600);
}

/* Handy: statt umzubrechen (frühere Version, wurde dadurch sehr hoch)
   bleibt jede Zeile einzeilig, nur die Schrift wird deutlich kleiner –
   "Erfahrung statt Erwartung," bleibt links, "Präsenz statt
   Performance" bleibt rechts (gleiche justify-content wie oben), das
   Banner wird dadurch insgesamt spürbar niedriger. */
@media (max-width: 640px) {
  .motto-reveal {
    padding-block: clamp(2rem, 8vw, 3.5rem);
  }
  .motto-reveal__block {
    white-space: nowrap;
    font-size: clamp(1.15rem, 7vw, 1.75rem);
    line-height: 1.25;
  }
}

/* Desktop kleiner (24.09.2026, auf Wunsch: die Basisgröße oben (bis
   4.85rem) wirkte auf Desktop "riesig" im Vergleich zum gleich großen
   .leitsatz__text auf mein-yoga.html, siehe dort – beide jetzt auf
   denselben Wert angeglichen, statt wie zuvor jeweils eigene Werte zu
   verkleinern/vergrößern. */
@media (min-width: 901px) {
  .motto-reveal__block {
    font-size: clamp(1.9rem, 3.3vw, 2.9rem);
  }
}

/* ---------- Motto-Banner, statisch (formate.html) ----------
   Dünnes, unbewegtes Band (28.09.2026, 3. Korrektur, siehe Kommentar in
   formate.html) – bewusst simpler als .motto-reveal: keine Animation,
   keine zwei versetzten Zeilen, nur der Satz zentriert in einer Zeile.
   Schriftgröße/-art/-farbe 1:1 von .motto-reveal__block übernommen
   ("genau in der gleichen Schriftgröße"), nur padding-block deutlich
   kleiner ("Banner dünner"). */
.motto-static {
  background: var(--white);
  border-top: none;
  /* Höher (28.09.2026, auf Wunsch: "nur von der Bannerhöhe") – reine
     Innenabstand-Erhöhung, Schriftgröße (.motto-static__text) bleibt
     unangetastet. */
  padding-block: clamp(2rem, 4.5vw, 3rem);
  padding-inline: var(--space-section-x);
  text-align: center;
}

.motto-static__text {
  font-family: var(--font-script);
  font-style: italic;
  font-size: clamp(2.35rem, 7vw, 4.85rem);
  color: var(--gold-600);
  letter-spacing: 0.04em;
  line-height: 1.15;
}

@media (max-width: 640px) {
  .motto-static__text {
    font-size: clamp(1.15rem, 7vw, 1.75rem);
  }
}

@media (min-width: 901px) {
  .motto-static__text {
    font-size: clamp(1.9rem, 3.3vw, 2.9rem);
  }
}

/* ---------- Die drei Formate: Kurzfassung ----------
   Teaser-Section, führt zur ausführlichen Unterseite formate.html.
   Zwei Spalten: links Text + Link, rechts drei abgedunkelte Fotos
   (je Format) mit Titel/Kurztext in Weiß oben im Bild – wie kleine
   Service-Karten mit Foto statt Farbfläche. Heller Hintergrund
   (Cream) als Wechsel zum Greige der Section davor. */

.formate {
  position: relative; /* Ankerpunkt für .ambient-gold, siehe Dateiende */
  isolation: isolate; /* eigener Stapelkontext, damit .ambient-gold (z-index:-1) zuverlaessig hinter dem Text bleibt statt hinter den Section-Hintergrund zu rutschen */
  padding-block: var(--space-section-y);
  padding-inline: var(--space-section-x);
  /* Zurück auf --surface-a (28.09.2026, auf Wunsch: "die drei Formate
     dann hell machen") – war zwischenzeitlich Greige, weil damals noch
     das (inzwischen auf ueber-mich.html umgezogene) Motto-Reveal direkt
     davor stand, ebenfalls Cream. Jetzt folgt .formate direkt auf
     .ablauf (Greige) – Cream ist hier also wieder richtig. */
  background: var(--surface-a);
  --surface: var(--surface-a);
}

.formate__grid {
  max-width: var(--container-max);
  margin-inline: auto;
  display: grid;
  /* Rechte Spalte bewusst auf eine feste Höchstbreite gedeckelt statt
     proportional zu wachsen – die drei Hochformat-Fotos nebeneinander
     brauchen mehr Breite als die frühere Einzelspalte, aber sollen
     nicht beliebig mitwachsen. War minmax(0, 46rem), auf Wunsch
     (13.09.2026) größer, damit auch die Foto-Karten selbst mehr Raum
     bekommen. */
  grid-template-columns: minmax(0, 1fr) minmax(0, 54rem);
  gap: clamp(2rem, 5vw, 4rem);
  align-items: center;
}

.formate__intro {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 1.1rem;
  /* War 30rem – auf Wunsch (13.09.2026) breiter, damit der Lead-Text
     nicht mehr so schmal/kurzzeilig umbricht. */
  max-width: 38rem;
}

/* KORREKTUR (21.09.2026, auf Wunsch: "Überschrift, Text, Kleingruppen/
   Kurse/1:1, dann Alle Formate im Überblick, dann Sichere dir jetzt
   einen Platz"): beide CTAs stehen jetzt in einem eigenen Block NACH
   der Foto-Galerie im Markup (siehe index.html), statt wie vorher in
   .formate__intro direkt nach dem Lead-Text – damit lässt sich die neue
   Mobile-Reihenfolge einfach über die normale Dokument-Reihenfolge
   erreichen (.formate__grid ist auf Handy ohnehin schon eine einzelne
   Spalte, siehe @media max-width:900px). Gleiche Innenausrichtung wie
   .formate__intro direkt darüber, damit beide Blöcke wie ein
   zusammengehöriges Ganzes wirken. */
.formate__ctas {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 1.1rem;
  max-width: 38rem;
  margin-inline: auto;
}

/* Textfarbe des Buttons (.formate__cta.btn) kommt jetzt automatisch über
   --surface von .formate (siehe dort) – kein eigener Selektor mehr
   nötig, seit die generische Regel bei .btn--primary/--outline
   var(--surface) nutzt. Der einfache Link "Alle Formate im Überblick"
   daneben (.link-arrow, kein .btn) bleibt bewusst unangetastet: keine
   Füllung, gleiche Farbe wie sein eigener Hintergrund wäre dort
   unsichtbar. */

/* NEUFASSUNG (24.09.2026, auf Wunsch: "Platzierung der Buttons links,
   einiges ist linksbündig, was auch nicht geht, Bilder größer machen,
   Section anders aufstellen"): löst die bisherige "Bild-neben-Text wie
   beim Hero"-Idee (14.09.2026) komplett ab. War: Intro links, Fotos
   rechts, dazu wirkte die zentrierte CTA-Reihe darunter (grid-column
   1/3) gegenüber dem linksbündigen Intro darüber wie zwei nicht
   zusammengehörige Ausrichtungen im selben Block. Jetzt: EIN
   durchgehend zentrierter, gestapelter Aufbau (Intro oben, Galerie
   darunter, CTAs zuletzt) – dieselbe Struktur wie die Ablauf-Section
   ("Was dich in meiner Yogastunde erwartet") direkt darüber auf dieser
   Seite, macht beide Sections optisch konsistent. .formate__grid ist
   dadurch keine Zwei-Spalten-Grid mehr, sondern eine einzelne,
   schmalere Spalte (68rem statt der vollen 1440px Container-Breite) –
   das gibt der jetzt vollbreiten Galerie automatisch mehr Platz pro
   Foto als vorher (dort auf eine 54rem-Spalte gedeckelt), ganz ohne
   eigene Größenangabe an den Karten selbst. */
@media (min-width: 901px) {
  .formate__grid {
    grid-template-columns: 1fr;
    max-width: 68rem;
    gap: 3rem;
  }
  .formate__intro {
    align-items: center;
    text-align: center;
    margin-inline: auto;
  }
  .formate__gallery {
    gap: 1.5rem;
  }
  .formate__ctas {
    grid-column: auto;
    /* War flex-direction:row (nebeneinander) – auf Wunsch (24.09.2026:
       "Alle Formate im Überblick über dem Button Sichere dir jetzt
       einen Platz, untereinander mittig, nicht nebeneinander") wieder
       zurück auf die geerbte column-Basisregel, kein eigener Wert mehr
       hier nötig. */
    margin-top: 0.5rem;
  }
}

.formate__heading {
  font-size: var(--step-titel);
}

.formate__lead {
  font-size: var(--step-lead);
  /* Kein eigenes color: var(--ink) und kein opacity-Dimming mehr –
     wie alle anderen *__lead-Absätze jetzt einfach geerbtes
     body-Graubraun (siehe Kommentar bei --graubraun in tokens.css). */
}

/* ---- Rechte Spalte: drei abgedunkelte Foto-Karten, nebeneinander ----
   Alle drei Quellfotos sind Hochformat-Aufnahmen (~2:3) – passt gut zu
   drei schmalen Karten in einer Reihe statt gestapelt. */

.formate__gallery {
  display: flex;
  flex-direction: row;
  gap: 0.75rem;
}

/* QUALITY-VARIANTE (19.09.2026, auf Wunsch: "sieht nicht so gut aus
   wenns dunkel ist, dieses Text-in-Bild wirkt komisch"): Titel/
   Beschreibung standen bisher als heller Text mit Verlauf/Schlagschatten
   ÜBER dem Foto (::after-Abdunklung + position:absolute) – bei von sich
   aus schon dunkleren Fotos (z.B. dem Workshop-Raum) wirkte die
   zusätzliche Verlaufs-Abdunklung schnell schwer/matschig. Jetzt wie
   .ablauf__item (Bild oben, Caption normal darunter, keine Überlagerung
   mehr nötig) – Fotos bleiben dadurch in ihrer echten Farbigkeit/
   Helligkeit sichtbar, unabhängig davon, wie hell oder dunkel die
   jeweilige Aufnahme selbst ist. */
.formate__photo {
  display: flex;
  flex-direction: column;
  gap: 0.75rem;
  border-radius: 0;
  flex: 1 1 0;
  min-width: 0;
}

/* Ganze Karte klickbar (20.09.2026, siehe Kommentar in index.html) –
   display:contents nimmt die Box des <a> selbst komplett aus dem Fluss
   (kein zusätzliches Flex-Item, keine Breiten-/Abstandsänderung), Bild
   und Figcaption bleiben dadurch weiterhin direkte, normal berechnete
   Flex-Kinder von .formate__photo, wie vor der Umstellung – nur dass
   jetzt eben ein <a> drumherum liegt, der über die komplette
   gerenderte Fläche (Bild + Text) reagiert. */
.formate__photo-link {
  display: contents;
  /* Sicherheitsnetz gegen den Browser-Standard-Linkstil (blau,
     unterstrichen) – bei display:contents hat das <a> zwar keine
     eigene Box mehr, aber vererbte Eigenschaften wie color laufen
     trotzdem an Kind-Elemente durch. Alle eigentlichen Texte darin
     (Titel/Beschreibung/"Mehr erfahren") setzen zwar schon ihre eigene
     Farbe, das hier ist zusätzliche Absicherung, kostet nichts. */
  color: inherit;
  text-decoration: none;
}

.formate__photo img {
  width: 100%;
  aspect-ratio: 3 / 4;
  object-fit: cover;
  display: block;
  transition: filter 0.2s ease;
}

/* "Kleingruppen bild.jpg" ist sehr hochkant mit viel leerer Decke oben
   und den eigentlichen Personen (Savasana) erst im unteren Drittel –
   ein mittiger Zuschnitt (Standard object-position) zeigte vor allem
   Decke/Architektur statt der Personen. Zuschnitt jetzt unten statt
   mittig (23.09.2026 auf Wunsch: "unterer Ausschnitt zeigt mehr
   Wichtiges"). */
.formate__photo img[src*="Kleingruppen bild"] {
  object-position: center bottom;
}

/* "Schneidersitz Hand.jpg" ist quer (1000x661), die Hand samt Armband
   steht rechts im Bild (links vor allem unscharfer Fensterhintergrund)
   – bei mittigem Zuschnitt (Standard object-position) in die hochkante
   3:4-Karte würde die Hand größtenteils abgeschnitten, sichtbar bliebe
   vor allem die leere linke Bildhälfte. Zuschnitt nach rechts verschoben
   (24.09.2026, neues Foto), damit die Hand komplett im Bild bleibt. */
.formate__photo img[src*="Schneidersitz Hand"] {
  object-position: 75% center;
}

/* "Workshop bild neu.jpg" (1:1-Karte, Startseite): auf Wunsch
   (24.09.2026, "zeig mehr von unten") Zuschnitt Richtung unteren
   Bildbereich statt der mittigen Standardposition. */
.formate__photo img[src*="Workshop bild neu"] {
  object-position: center 80%;
}

.formate__photo-link:hover img {
  filter: brightness(1.06);
}

/* Siehe Kommentar in index.html: gleicht das dunklere 1:1-Foto tonal an
   die beiden helleren Kursraum-Fotos daneben an. Eigene Hover-Regel
   nötig (statt der generischen oben), sonst würde :hover den fixen
   Aufheller hier komplett ersetzen statt zu ergänzen – filter-Werte
   überschreiben sich als Ganzes, sie addieren sich nicht automatisch. */
.formate__photo--dark img {
  filter: brightness(1.22) saturate(1.05);
}

.formate__photo--dark .formate__photo-link:hover img {
  filter: brightness(1.29) saturate(1.05);
}

/* KORREKTUR (21.09.2026, auf Wunsch: "mittig gebunden und nicht links
   gebunden, weil die ganze Website mittig gebunden sein soll"): war
   text-align:left als Rest aus der früheren Scroll-Karussell-Optik
   (dort passte Linksbündig besser zu den schmalen, einzeln
   wischbaren Karten) – jetzt einfach kein eigenes text-align mehr,
   erbt dadurch ganz normal den site-weiten Zentriert-Standard (siehe
   body in base.css). Betrifft automatisch auch Desktop (dort stand
   ohnehin schon eine eigene, jetzt überflüssige
   @media(min-width:701px)-Regel, die exakt dasselbe nochmal explizit
   gesetzt hat – siehe deren Entfernung weiter unten). */
.formate__photo-text {
  display: flex;
  flex-direction: column;
  /* KORREKTUR (24.09.2026, auf Wunsch: "Mehr erfahren-Links mittig
     gebunden, genau wie Alle Formate im Überblick") – text-align:center
     (siehe Kommentar oben) zentriert nur echten Text, .formate__photo-more
     ist aber selbst ein Flex-Container (siehe dort) und wurde von
     align-items:stretch (Default) auf die volle Breite gedehnt, dadurch
     stand der Pfeil-Link trotz text-align am linken Rand. align-items:
     center lässt alle Kind-Elemente (inkl. Titel/Beschreibung, die
     optisch unverändert bleiben) auf ihre Inhaltsbreite schrumpfen und
     zentriert sie – exakt dieselbe Technik wie bei .formate__ctas
     (Alle-Formate-Link). */
  align-items: center;
  gap: 0.3rem;
}

/* QUALITY-VARIANTE: Kursive Serife statt fetter Versalien, jetzt in
   normaler Gold-Überschriftenfarbe statt Weiß (kein dunkles Foto mehr
   darunter, das Weiß gebraucht hätte). font-weight:400, da Instrument
   Serif keinen Fett-Schnitt hat. */
.formate__photo-title {
  font-family: var(--font-display);
  font-weight: 400;
  font-style: italic;
  color: var(--gold-700);
  font-size: clamp(1.2rem, 2.2vw, 1.4rem);
  line-height: 1.15;
}

.formate__photo-desc {
  color: var(--graubraun);
  font-weight: 500;
  font-size: clamp(0.875rem, 1.3vw, 0.95rem);
  line-height: 1.4;
}

/* War nur auf dem Handy sichtbar (Desktop hatte keinen eigenen Link
   pro Karte). Seit die ganze Karte klickbar ist (20.09.2026, siehe
   Kommentar in index.html) jetzt auch am Desktop sichtbar – sonst wäre
   nirgendwo zu erkennen, dass die ganze Fläche anklickbar ist. Kein
   <a> mehr (siehe Kommentar in index.html), nur noch ein Hinweistext;
   die eigentliche Navigation übernimmt .formate__photo-link. */
.formate__photo-more {
  display: inline-flex;
  margin-top: 0.2rem;
}

/* QUALITY-VARIANTE (19.09.2026, auf Wunsch: "Bilduntertitel größer und
   mittig gebunden, Bilder kleiner und freier"): Fotos schrumpfen auf
   82% ihrer Spaltenbreite und werden zentriert, statt die Spalte randlos
   auszufüllen – dadurch bleibt links/rechts sichtbar Luft ("freier").
   Größerer Gallery-Gap (2rem statt 0.75rem) verstärkt den Effekt
   zusätzlich. Titel/Beschreibung darunter mittig statt linksbündig,
   deutlich größer als vorher. Nur ab 701px (oberhalb des Handy-
   Scroll-Karussells, dort bleibt alles wie gehabt). */
@media (min-width: 701px) {
  .formate__gallery {
    gap: 2rem;
  }
  .formate__photo img {
    max-width: 82%;
    margin-inline: auto;
  }
  .formate__photo-title {
    font-size: clamp(1.5rem, 2.6vw, 1.8rem);
  }
  .formate__photo-desc {
    font-size: clamp(1rem, 1.5vw, 1.1rem);
  }
}

@media (max-width: 900px) {
  .formate__grid {
    grid-template-columns: 1fr;
  }

  .formate__intro {
    max-width: none;
  }

  /* KORREKTUR (21.09.2026, auf Wunsch: "nicht dass man zur Seite
     scrollt, das sieht nicht gut aus... alles miteinander gebunden"):
     löst das bisherige seitliche Scroll-Karussell (siehe Git-Historie)
     komplett ab. Die drei Formate stehen jetzt als gebundene Liste
     untereinander – gleiche Konvention wie .credentials/.price-list/
     .workshops__item (dünne goldene Linie zwischen den Einträgen),
     macht aus den drei einzelnen Karten sichtbar EINE zusammengehörige
     Gruppe statt drei lose nebeneinander wischbare Kacheln. Bindet
     dadurch automatisch auch Intro-Text oben und die Section insgesamt
     optisch zusammen, wie gewünscht. */
  .formate__gallery {
    max-width: 34rem;
    margin-inline: auto;
    flex-direction: column;
    gap: 0;
  }

  .formate__photo {
    border-top: 1px solid var(--gold-500);
    padding-block: 1.75rem;
  }

  .formate__gallery .formate__photo:last-child {
    border-bottom: 1px solid var(--gold-500);
  }

  /* BUGFIX (22.09.2026, auf Wunsch: "die Mehr erfahren Buttons sind
     nicht mittig gebunden"): .formate__photo-text ist selbst ein
     Flex-Kind von .formate__photo (column) und wird dadurch (Default
     align-items:stretch) auf die volle Spaltenbreite gestreckt – Titel/
     Beschreibung sind reine <span>-Textzeilen und zentrieren sich
     darin brav über das geerbte site-weite text-align:center. "Mehr
     erfahren" (.formate__photo-more) ist aber selbst ein
     display:inline-flex-Container (siehe .link-arrow) und wird als
     GESTRECKTES Flex-Kind dadurch zwar auch auf die volle Breite
     gezogen, sein eigener Inhalt (Text+Pfeil) richtet sich innen aber
     per flexeigenem justify-content:flex-start links aus statt dem
     text-align zu folgen – dadurch hing der Link sichtbar links, obwohl
     Titel/Text darüber schon zentriert waren. align-self:center
     verhindert das Strecken: die Box schrumpft auf ihre Inhaltsbreite
     und wird dadurch selbst mittig in der Spalte platziert. */
  .formate__photo-more {
    align-self: center;
  }

  /* KORREKTUR (21.09.2026, auf Wunsch: "generell bei den Buttons... der
     Pfeil soll nicht in eine eigene Zeile, alles in einer Zeile") –
     gleiches Problem/gleiche Lösung wie beim Hero-Button (siehe dort):
     "Sichere dir jetzt einen Platz →" ist ein einziger Textstring, war
     bei der normalen .btn-Schriftgröße auf schmalen Screens breiter als
     verfügbar, der Pfeil brach als letztes Wort um. Nur .formate__cta
     KOMBINIERT mit .btn (der zweite Link mit dieser Klasse ist ein
     reiner Text-Link ohne Button-Box, bricht harmloser um, bleibt
     unangetastet). */
  .formate__cta.btn {
    white-space: nowrap;
    font-size: 0.9375rem;
    padding: 0.75rem 1.25rem;
  }
}

@media (max-width: 700px) {
  /* KORREKTUR (22.09.2026, auf Wunsch: "bei den drei Formaten [Bild]
     niedriger von der Breite her, das soll so bleiben"): löst die
     Regel vom 20.09.2026 ab, die die Fotos hier komplett ausgeblendet
     hatte ("die Bilder raus", damals wegen der Seitenlänge). Jetzt
     stattdessen wieder sichtbar, aber in einem flachen Querformat
     (16:9) statt dem ursprünglichen hohen Hochformat (3:4, siehe
     Basisregel .formate__photo img weiter oben) – jeder Eintrag bekommt
     dadurch wieder ein Bild, ohne die Liste so lang zu machen wie beim
     alten Hochformat-Zuschnitt. object-fit:cover (Basisregel) schneidet
     automatisch auf dieses neue, breitere Verhältnis zu. */
  .formate__photo img {
    display: block;
    aspect-ratio: 16 / 9;
    /* Alle drei Fotos zeigen ihre Personen in der UNTEREN Bildhälfte
       (viel Stuck-Decke/Raumhöhe darüber, siehe Originaldateien) –
       Zuschnitt entsprechend nah am unteren Rand, sonst bliebe im
       flachen 16:9-Ausschnitt v.a. Decke stehen. */
    object-position: 50% 68%;
  }

  /* Etwas kleiner als vorher (19.09.2026, auf Wunsch: "generell zu
     große Content-Schrift kleiner") – war 1.6rem/1rem. */
  .formate__photo-title {
    font-size: 1.3rem;
    line-height: 1.2;
  }
  .formate__photo-desc {
    font-size: 0.9rem;
  }
  .formate__photo-more {
    margin-top: 0.35rem;
    font-size: 0.9rem;
  }
}

/* ---------- Baustein 2: Zwei-Spalten A/B ---------- */

.split {
  position: relative;
  isolation: isolate; /* eigener Stapelkontext, damit .ambient-gold (z-index:-1) zuverlaessig hinter dem Text bleibt */
  display: grid;
  grid-template-columns: 1fr 1fr;
  min-height: 70vh;
}

.split__text {
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center; /* Boxen (nicht nur Text) mittig, passend zum globalen text-align:center */
  gap: 1.25rem;
  padding: var(--space-section-y) var(--space-section-x);
  background: var(--surface, var(--cream));
}

/* Linksbündig auf Desktop statt zentriert (14.09.2026, großer Umbau
   "wie die Hero-Section") – .split ist strukturell dieselbe
   Bild-neben-Text-Idee wie der neue Hero (Foto auf der einen, Text auf
   der anderen Seite), sollte sich also auch so anfühlen. Mobile bleibt
   zentriert (die globale body-Regel), hier keine eigene Media Query
   nötig, weil .split ohnehin erst ab 901px die Zwei-Spalten-Anordnung
   hat (siehe @media max-width:900px weiter unten). */
@media (min-width: 901px) {
  .split__text {
    align-items: flex-start;
    text-align: left;
  }
  /* Mehr Luft zwischen Überschrift und Fließtext (28.09.2026, auf
     Wunsch: "Überschrift etwas weiter nach oben und den Text etwas
     weiter nach unten, sieht so zu gedrängt aus") – .split hat
     min-height:70vh, .split__text stand als ein einziger, eng gepackter
     Block (1.25rem Gap überall) mittig darin, wirkte dadurch wie ein
     kleiner Klumpen in viel Leerfläche. Extra margin-bottom NUR nach
     der Überschrift (nicht der generelle gap, sonst bekämen auch die
     drei Absätze untereinander unpassend viel Abstand) macht den
     Gesamtblock höher – da .split__text weiterhin komplett zentriert
     ist (justify-content:center), rutscht dadurch automatisch die
     Überschrift nach oben UND der Textblock nach unten, symmetrisch um
     die neue, größere Blockmitte. Nur Desktop – auf Handy hat .split
     ohnehin min-height:0 (kein Höhenproblem dort, siehe
     @media max-width:900px weiter unten). */
  .split__text h2 {
    margin-bottom: 1.5rem;
  }
}

.split__media {
  position: relative;
}

.split__media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.split__text h2 { font-size: var(--step-titel); }
/* :not(.eyebrow) – sonst überschreibt das hier (Spezifität Klasse+Typ)
   versehentlich das kleinere .eyebrow-Label (nur Klasse), das als
   erster <p> auch in .split__text steht. */
.split__text p:not(.eyebrow) { font-size: var(--step-lead); max-width: 42ch; }

/* Variante A: Text links, Bild rechts (Standard-Reihenfolge, kein Kippen nötig) */
.split--a .split__text { order: 1; }
.split--a .split__media { order: 2; }

/* Variante B: Bild links, Text rechts. DOM-Reihenfolge bleibt
   Text-zuerst (Tab-/Screenreader-Reihenfolge), nur die visuelle
   Reihenfolge kippt über order. */
.split--b .split__text { order: 2; }
.split--b .split__media { order: 1; }

@media (max-width: 900px) {
  .split { grid-template-columns: 1fr; min-height: 0; }
  .split--a .split__text, .split--a .split__media,
  .split--b .split__text, .split--b .split__media {
    order: initial;
  }
}

/* Section selbst: komplett Weiß (16.09.2026, 3. Korrektur). Vorher
   hatten weder #ueberblick noch .split--framed einen eigenen
   Hintergrund gesetzt, wodurch das --cream des <body> überall
   durchschien – zusammen mit dem ebenfalls cremefarbenen Bild- UND
   Textcontainer ergab das eine einzige durchgehende Beige-Fläche ohne
   sichtbaren Unterschied zwischen "Karte" und "Lücke drumherum".
   padding-block/-inline + column-gap lassen jetzt beide Karten frei
   auf diesem Weiß schweben (oben, außen und in der Mitte gleich viel
   Luft). Bewusst alle drei in vw statt %: bei column-gap bezieht sich
   ein %-Wert in CSS Grid auf die Breite der Box NACH Abzug von deren
   eigenem Padding, während sich % bei padding-inline auf die Breite
   DAVOR bezieht – zwei verschiedene Bezugsgrößen, obwohl beide "4%"
   dastehen (kurz ausprobiert am 17.09.2026, dadurch wurde die Lücke in
   der Mitte messbar schmaler als außen). vw hat für beide Eigenschaften
   dieselbe Bezugsgröße (die Fensterbreite), dadurch bleiben außen und
   Mitte garantiert exakt gleich. */
.split--framed {
  background: var(--white);
  padding-block: clamp(1.5rem, 4vw, 3rem);
  padding-inline: clamp(1.5rem, 4vw, 3rem);
  column-gap: clamp(1.5rem, 4vw, 3rem);
}

/* Variante "gerahmt": eigene, festere Bildform (aspect-ratio) statt
   Vollbild-Bleed. War hier zusätzlich noch ein eigenes Innenpolster
   ums Bild ("wie ein angeschnittenes Foto") – auf dem inzwischen
   weißen Hintergrund unsichtbar, dadurch wirkte das sichtbare Foto
   kleiner als der Container daneben, obwohl beide Boxen exakt gleich
   groß waren (19.09.2026 gefunden: "das Bild hat einen weißen Rand in
   Hintergrundfarbe... mach dass das Bild den kompletten Rahmen
   ausfüllt"). Padding jetzt weg, das Bild füllt seine Box komplett
   aus (object-fit:cover übernimmt den Bildausschnitt, aspect-ratio
   sitzt jetzt am Container statt am <img>, damit die Boxform schon
   vor dem Laden des Bildes feststeht). */
.split--framed .split__media {
  aspect-ratio: 3 / 4;
  background: var(--white);
}

/* Schmaler als die Textspalte, nur ab 901px wo beide nebeneinander
   stehen (19.09.2026 auf Wunsch: "Bild kann auch von der Breite
   kleiner sein als der Text... zu viel Freifläche oben/unten beim
   Text") – die Section-Höhe folgt über das Grid-Stretch immer dem
   höheren der beiden Container; bei voller Spaltenbreite war das
   (wegen aspect-ratio) fast immer das Bild, deutlich höher als der
   eigentliche Textinhalt braucht. Schmaler heißt bei gleichbleibendem
   Seitenverhältnis automatisch auch niedriger, wodurch die ganze
   Section kürzer wird. start statt der sonst üblichen
   Stretch-Vollbreite, damit das Bild an der äußeren (linken) Kante
   bündig bleibt und die eingesparte Breite nach innen (Richtung Text)
   frei bleibt statt sich mittig zu verteilen. Auf Handy (gestapelt,
   kein gemeinsamer Zeilen-Stretch mit dem Text) bleibt es dagegen bei
   voller Breite – dort sähe eine schmalere, linksbündige Karte nur wie
   eine falsch abgeschnittene Lücke rechts daneben aus. */
@media (min-width: 901px) {
  .split--framed .split__media {
    max-width: 80%;
    justify-self: start;
  }
}

.split--framed .split__media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  border-radius: 0;
  display: block;
}

/* Textcontainer bekommt den gleichen "Rahmen" wie der Bildcontainer
   daneben (16.09.2026 auf Wunsch: "soll vom Layout her genauso
   aussehen wie der Bildcontainer, genauso bündig, genauso viel Rand,
   genauso groß") – gleiches Padding wie .split--framed .split__media
   statt der sonst hier üblichen, viel größeren Section-Innenabstände
   (--space-section-y/-x). Nur ab 901px, weil Bild und Text erst dann
   nebeneinanderstehen und der Vergleich überhaupt sichtbar ist – auf
   Mobile bleibt der gewohnte, für gestapelten Fließtext angenehmere
   Innenabstand. Hintergrund bleibt --cream – die einzige Farbfläche
   dieser Section (Bild- und Textcontainer sind identisch groß, mit
   identischem Rand, nur die Füllung unterscheidet sich bewusst: Bild
   links, Beige-Karte mit Text rechts). */
@media (min-width: 901px) {
  .split--framed .split__text {
    padding: clamp(1rem, 2.5vw, 1.75rem);
    background: var(--cream);
  }
}

/* MOBILE-POLISH (20.09.2026, auf Wunsch: "keine schwebenden Container
   mit anderer Farbe... Text einfach auf dem Hintergrund, 2-3
   Hintergrundfarben insgesamt"): Unter 901px stand .split__text bisher
   in Greige (--surface-b, über #ueberblick als --surface gesetzt)
   MITTEN auf einer weißen Section (.split--framed-Basisregel oben) –
   wirkte wie eine schwebende Karte auf hellerem Grund. Jetzt eine
   einzige durchgehende Fläche: die ganze Section wird Greige, Bild UND
   Text liegen beide direkt darauf, keine zweite Farbe mehr dazwischen.
   Zusätzlich kürzer (weniger Innenabstand oben/unten) und ohne die
   doppelte Randbreite (äußerer Frame-Rand + innerer Karten-Rand), die
   vorher zusammen den Text unnötig stark eingerückt hat. Ab 901px
   unverändert (siehe eigene @media(min-width:901px)-Regeln oben –
   "Desktop ist fertig"). */
@media (max-width: 900px) {
  .split--framed {
    background: var(--surface-b);
    padding-block: clamp(1.25rem, 5vw, 2rem);
    row-gap: 1.5rem;
  }
  .split--framed .split__media {
    background: var(--surface-b);
  }
  .split--framed .split__text {
    background: transparent;
    padding: 0;
  }
}

/* ---------- Foto-Overlay ("Über mich"-Teaser, index.html) ----------
   Desktop: wie ursprünglich – Bild füllt die ganze Section randlos als
   Hintergrund (object-fit:cover, per Höhen-Clamp begrenzt), die
   freistehende Cream-Karte liegt mittig darüber. Handy: eigene
   Variante weiter unten (@media max-width:700px) – da wird bewusst das
   ganze Bild ohne Beschnitt gezeigt (Section-Höhe folgt der
   Bild-Höhe), mit der Karte frei schwebend darüber statt am Rand
   anliegend. */
.photo-overlay {
  position: relative;
  min-height: clamp(28rem, 62vh, 40rem);
  display: flex;
  /* Karte bewusst nicht mehr vertikal mittig, sondern deutlich weiter
     unten im Bild – wirkt dadurch freier/schwebender statt brav
     zentriert. padding-bottom hält trotzdem Abstand zur unteren
     Bildkante, die Karte "klebt" nicht am Rand. */
  align-items: flex-end;
  justify-content: center;
  padding-bottom: clamp(2.5rem, 7vh, 4.5rem);
  overflow: clip;
}

.photo-overlay__media {
  position: absolute;
  inset: 0;
  z-index: 0;
}

.photo-overlay__media picture {
  display: block;
  height: 100%;
}

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

.photo-overlay__card {
  position: relative;
  z-index: 1;
  width: 100%;
  /* War 34rem – mit dem gekürzten Text (ein Absatz statt zwei) braucht
     die Karte spürbar weniger Fläche. */
  max-width: 26rem;
  margin-inline: var(--space-section-x);
  background: var(--cream);
  padding: clamp(1.5rem, 3vw, 2.25rem);
  box-shadow: 0 12px 32px -14px rgba(43, 33, 24, 0.25);
}

.photo-overlay__card h2 {
  margin-bottom: 1rem;
}

.photo-overlay__card .eyebrow {
  margin-bottom: 0.75rem;
}

.photo-overlay__card p {
  margin-bottom: 0.75rem;
}

.photo-overlay__card a {
  display: inline-block;
  margin-top: 0.25rem;
}

/* Handy: komplett eigener Aufbau statt der Desktop-Idee (schwebende
   Karte auf dem Foto zentriert). Die früher stark verkleinerte, auf
   14.5rem gequetschte Karte über dem Bild war auf schmalen Screens
   schlicht zu knapp für Überschrift + Text – wirkte gedrängt und
   schwer lesbar vor dem unruhigen Fotohintergrund. Das Sonnenuntergangs-
   Foto (IMG_3780.jpeg) passte optisch ohnehin nicht zum ruhigen,
   textgeführten Rest der Seite – auf Handy daher komplett weg, nur
   noch der reine Textblock, ganz normal lesbar statt schwebend/
   verkleinert. Desktop behält Bild + Karte unverändert. */
@media (max-width: 700px) {
  .photo-overlay {
    min-height: 0;
    overflow: visible;
    flex-direction: column;
    align-items: stretch;
    padding-block: var(--space-section-y);
  }
  .photo-overlay__media {
    display: none;
  }
  .photo-overlay__card {
    position: static;
    transform: none;
    z-index: 1;
    width: 100%;
    max-width: none;
    margin-inline: 0;
    padding: clamp(2rem, 8vw, 2.75rem) var(--space-section-x);
    box-shadow: none;
    text-align: center;
  }
  .photo-overlay__card h2 {
    font-size: 1.5rem;
  }
  .photo-overlay__card p {
    font-size: 1rem;
  }
}

/* ---------- Baustein 3: Zwei-Bild-Parallax ---------- */
/* Zwei unterschiedliche, überlappende Bilder. Das große Bild läuft
   ganz normal mit der Seite (Faktor 1,0 – kein eigener Transform).
   Das kleine Bild bekommt zusätzlich einen scroll-gekoppelten
   Versatz von ca. 10% der Sektionshöhe obendrauf, über eine CSS
   View-Timeline – kein Scroll-Listener, kein GSAP nötig, siehe
   goldenroom/05-TECHNIK.md ("Zwei-Bild-Parallax braucht kein
   JavaScript"). Nur transform wird animiert, keine Skalierung,
   keine Rotation, kein Fade. */

.parallax-duo {
  position: relative;
  /* overflow: clip statt hidden – klippt genauso zuverlässig, erzeugt
     aber (anders als hidden) keinen eigenen Scroll-Container. Mit
     hidden würde diese Section selbst zum Bezugspunkt der weiter
     unten stehenden view()-Timeline werden (sie "scrollt" ja nie in
     sich selbst) und das Bild bliebe optisch eingefroren. */
  overflow: clip;
  /* War calc(var(--space-section-y) + 3rem) – zusammen mit dem
     eigenen Bottom-Padding von .page-intro direkt davor ergab das
     eine riesige Lücke zwischen Überschrift und Bildern (und
     nochmal so viel darunter). Jetzt ein eigener, viel kleinerer Wert. */
  padding-block: clamp(1.5rem, 4vw, 3rem);
  padding-inline: var(--space-section-x);
  /* Greige statt der vorherigen (fehlenden, also Cream-) Fläche –
     .page-intro direkt davor ist Cream, ohne diese Farbe stünden zwei
     gleiche Flächen hintereinander. Site-weite Abwechseln-Regel
     (13.09.2026 auf Wunsch). */
  background: var(--surface-b);
}

.parallax-duo__frame {
  position: relative;
  /* War min(60%, 640px) für das vorherige Hochkant-Bild – jetzt
     deutlich breiter für das große Querformat-Bild direkt unter der
     Seiten-Intro (13.09.2026 auf Wunsch: "ein grosses ganzes Bild im
     Querformat" für mein-yoga.html). */
  width: min(94%, 1180px);
  margin-inline: auto;
}

.parallax-duo__img { width: 100%; object-fit: cover; display: block; }

/* Großes Bild: normaler Dokumentfluss. War mal Referenz für den
   Scroll-Faktor 1,0 des kleinen, überlappenden Akzentbilds – das ist
   seit 11.09.2026 auf Wunsch entfernt (siehe mein-yoga.html), diese
   Section zeigt jetzt nur noch dieses eine Bild. 3/2 ist das native
   Seitenverhältnis von images/mein-yoga-wald.jpg (1800×1200) –
   object-fit:cover schneidet dadurch nichts vom Bild ab, es ist
   wirklich "ganz" zu sehen, nur groß statt schmal-hochkant. */
.parallax-duo__main {
  aspect-ratio: 3 / 2;
  width: 100%;
}

@media (max-width: 900px) {
  .parallax-duo__frame { width: 80%; }
}

/* ---------- Posen-Karten (Unterseite mein-yoga.html) ----------
   QUALITY-VARIANTE (15.09.2026, auf Wunsch): ersetzt .parallax-duo
   (Einzelfoto) am Seitenanfang von mein-yoga.html – drei ungefähr
   gleich große Fotokarten nebeneinander, die sich in der Mitte
   überlappen. Bewusst NICHT symmetrisch (unterschiedliche
   Rotationswinkel und Höhen-Versatz je Karte, siehe --left/--center/
   --right), damit es wie ein locker hingelegter Fotostapel wirkt statt
   wie ein maschinell gleichmäßiges Muster. Hover hebt die jeweilige
   Karte nur in der Ebene (z-index) nach vorn – ausdrücklich ohne
   zusätzliche Bewegung/Skalierung, siehe Auftrag ("sonst bewegen sie
   sich nicht, nur von dem Layer her"). .parallax-duo bleibt oben
   unverändert bestehen (anderswo im Baustein-System dokumentiert),
   auch wenn es aktuell auf keiner Seite mehr referenziert wird. */
.pose-cards {
  background: var(--surface-b);
  padding-block: clamp(3rem, 7vw, 5rem);
  padding-inline: var(--space-section-x);
}

/* gap QUALITY-VARIANTE (16.09.2026, auf Wunsch: "die Karten sollen
   nicht zusammengehen, sondern auseinanderbleiben, sich an den unteren
   Ecken treffen") ersetzt die vorherigen negativen Margins (echtes
   Überlappen) – der positive Abstand zwischen den ungedrehten Boxen
   plus die Rotation um die Unterkante (siehe .pose-cards__card) sorgen
   zusammen dafür, dass oben deutlich Luft bleibt, während sich die
   unteren Ecken benachbarter Karten gerade eben berühren. */
.pose-cards__row {
  display: flex;
  justify-content: center;
  align-items: center;
  gap: 1.25rem;
  max-width: min(94%, 1180px);
  margin-inline: auto;
}

.pose-cards__card {
  position: relative;
  width: min(30vw, 360px);
  aspect-ratio: 3 / 4;
  flex-shrink: 0;
  overflow: hidden;
  border-radius: 16px;
  box-shadow: 0 24px 48px -20px rgba(33, 22, 16, 0.35);
  z-index: 1;
  /* QUALITY-VARIANTE (15.09.2026, auf Wunsch: "oben ein bisschen mehr
     auseinander, zufälliger"): Drehpunkt an der Unterkante statt der
     CSS-Standardmitte – dadurch schwenkt beim Rotieren vor allem die
     OBERE Kante jeder Karte seitlich aus, während die untere Kante
     relativ nah beieinander bleibt. Ergibt den "aufgefächerten
     Fotostapel"-Look (oben spreizt sich auf, unten bleibt kompakt)
     statt eines Karten-Trios, das nur gleichmäßig um die eigene Mitte
     gedreht ist. */
  transform-origin: bottom center;
}

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

/* Unregelmäßige Winkel/Versätze statt eines symmetrischen Musters (auf
   Wunsch: "nicht so generisch, ein bisschen zufälliger") – links und
   rechts bewusst NICHT spiegelsymmetrisch (unterschiedliche Winkel,
   unterschiedlicher Zusatz-Versatz), Mitte bleibt der ruhige, fast
   gerade Anker zwischen den beiden. Keine Margins mehr (siehe
   .pose-cards__row: gap übernimmt jetzt den Grundabstand) – das
   "Auseinanderbleiben, an den unteren Ecken berühren" kommt allein aus
   Grundabstand + Rotation um die Unterkante. */
.pose-cards__card--left {
  transform: rotate(-10deg) translateY(20px);
}

.pose-cards__card--center {
  transform: rotate(2deg) translateY(-20px);
  z-index: 2;
}

.pose-cards__card--right {
  transform: rotate(9deg) translateY(14px);
}

/* QUALITY-VARIANTE (16.09.2026): explizite Übergangs-/Endzustände für
   das site-weite Scroll-Reveal-System (.fade-left/.fade-up/.fade-right,
   siehe weiter unten in dieser Datei). Ohne das würden die generischen
   Utility-Regeln (z.B. ".fade-left.is-armed.is-visible { transform:
   none; }") die obigen Rotations-/Versatz-Werte einfach überschreiben,
   sobald die Karten beim Reinscrollen sichtbar werden – die Karten
   landen dann flach und ohne Fächer-Effekt, statt wie oben gestylt
   stehenzubleiben (genau das gemeldete "die Karten gehen am Ende
   zusammen"-Problem). Gleiches Prinzip wie bei .yoga-band__card.fade-
   left.is-armed weiter unten: "is-armed" kombiniert die Rotation mit
   dem zusätzlichen Rein-Rutsch-Versatz, "is-armed.is-visible" landet
   exakt auf dem oben definierten Ruhezustand. */
.pose-cards__card--left.fade-left.is-armed {
  transform: rotate(-10deg) translate(-48px, 20px);
}
.pose-cards__card--left.fade-left.is-armed.is-visible {
  transform: rotate(-10deg) translateY(20px);
}

.pose-cards__card--center.fade-up.is-armed {
  transform: rotate(2deg) translateY(8px);
}
.pose-cards__card--center.fade-up.is-armed.is-visible {
  transform: rotate(2deg) translateY(-20px);
}

.pose-cards__card--right.fade-right.is-armed {
  transform: rotate(9deg) translate(48px, 14px);
}
.pose-cards__card--right.fade-right.is-armed.is-visible {
  transform: rotate(9deg) translateY(14px);
}

/* Hover: NUR die Ebene ändert sich (z-index), keine zusätzliche
   Bewegung/Skalierung – die Karte bleibt an ihrer Stelle und ihrem
   Winkel liegen, kommt aber vor die beiden anderen. */
.pose-cards__card:hover {
  z-index: 5;
}

/* QUALITY-VARIANTE (19.09.2026, auf Wunsch: "Karten kleiner, wie bei
   der Desktop-Ansicht, die können sich auch leicht überlappen an den
   Ecken"): vorher wurden die drei Karten hier komplett flach gelegt
   (volle Breite, keine Drehung, untereinander gestapelt) – auf einem
   schmalen Screen macht das jede Karte fast bildschirmfüllend hoch,
   zusammen ein sehr langer Abschnitt. Jetzt bleibt die Reihe (statt
   Spalte) und der aufgefächerte Fotostapel-Look (Drehung/Versatz/
   Ecken-Überlappung) wie am Desktop erhalten, nur die Kartengröße
   selbst schrumpft deutlich. */
@media (max-width: 900px) {
  .pose-cards__row {
    gap: 0.5rem;
    max-width: 24rem;
  }
  .pose-cards__card {
    width: min(28vw, 130px);
    border-radius: 10px;
    box-shadow: 0 14px 28px -14px rgba(33, 22, 16, 0.35);
  }
}

/* ---------- Seiten-Intro (Unterseiten, z.B. formate.html, ueber-mich.html) ----------
   Generischer Kopf für Unterseiten: Zurück-Link, Eyebrow, H1, Lead.
   Ursprünglich nur für formate.html gebaut (hieß .format-intro),
   umbenannt, weil das Muster jetzt auch auf ueber-mich.html
   wiederverwendet wird. */

.page-intro {
  position: relative; /* Ankerpunkt für .ambient-gold, siehe Dateiende */
  isolation: isolate; /* eigener Stapelkontext, damit .ambient-gold (z-index:-1) zuverlaessig hinter dem Text bleibt statt hinter den Section-Hintergrund zu rutschen */
  max-width: 46rem;
  margin-inline: auto;
  padding-block: clamp(2rem, 5vw, 3rem);
  padding-inline: var(--space-section-x);
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.9rem;
}

.page-intro__back {
  margin-bottom: 0.5rem;
}

.page-intro__title {
  /* War eigene, größere Stufe (--step-page-title) – auf Wunsch
     (23.09.2026, 2. Runde: "alles gleiche Größe") zurück auf dieselbe
     Stufe wie die Section-Überschriften (h2, --step-titel). */
  font-size: var(--step-titel);
}

.page-intro__lead {
  /* War 1.0625rem (die Fließtext-Größe) statt --step-lead wie alle
     anderen *__lead-Absätze site-weit – jetzt vereinheitlicht. */
  font-size: var(--step-lead);
  max-width: 56ch;
}

/* Neue, bewusst SICHTBARE Eyebrow-Variante nur für den Seitentitel auf
   ueber-mich.html/mein-yoga.html (22.09.2026, auf Wunsch: "man sollte
   auch sehen, dass es Über mich ist... 'Über mich' in goldener
   Schrift, etwas größer als der Content", analog für "Mein Yoga").
   .eyebrow ist site-weit display:none (siehe base.css, 15.09.2026:
   "Zwischenüberschriften weg") – bewusst NICHT global wieder
   eingeschaltet, das würde auch die vielen anderen .eyebrow-Labels auf
   jeder einzelnen Section sitewide wieder einblenden. Stattdessen eine
   eigene, explizit im Markup vergebene Zusatzklasse, nur auf dem
   jeweiligen Seiten-Intro-Label dieser beiden Seiten (siehe dort) –
   überall sonst bleibt .eyebrow unverändert unsichtbar. font-weight:400
   statt des geerbten 700 – gleicher Bebas-Neue-Fake-Fett-Grund wie bei
   .mobile-lede weiter oben, hier zusätzlich mehr Zeichenabstand statt
   des sonst zu blockigen Großbuchstaben-Fetts. Nur Handy: Desktop zeigt
   den Seitentitel schon groß genug über die H1 selbst ("Desktop ist
   fertig"). */
@media (max-width: 900px) {
  .page-intro__eyebrow--visible {
    display: block;
    font-weight: 400;
    font-size: 1.15rem;
    letter-spacing: 0.1em;
    margin-bottom: 0.5rem;
  }
}

/* Echtes Foto (kein Cutout mehr) direkt unter der Intro – bewusst ohne
   Rahmen/Karte/Schatten, einfach ein großes, offenes Bild auf dem
   Seitenhintergrund. Nur auf ueber-mich.html verwendet. Mobil/Tablet
   bleibt es die schmale Hochkant-Vorschau von vorher (kompletter Wert
   aus IMG_3238.jpeg, kein Zuschnitt). */
.page-intro__portrait {
  max-width: 34rem;
  margin-top: 1rem;
  margin-inline: auto;
}

/* Auf Handy deutlich schmaler (19.09.2026, auf Wunsch: "über mich
   Unterseite... Bilder zu riesig") – die 34rem-Obergrenze oben greift
   auf schmalen Screens praktisch nie (390px Fensterbreite abzüglich
   Section-Padding ist ohnehin schon schmaler), das Bild lief also
   trotzdem immer über die volle Breite. 65% der verfügbaren Breite
   macht daraus ein bewusst kleineres, ruhigeres Vorschaubild statt
   eines zweiten, fast bildschirmbreiten Hero-Fotos. */
/* KORREKTUR (22.09.2026, auf Wunsch: "über mich... Bilder, die quer
   sind, nicht so hoch"): war 65% (siehe Kommentar oben, extra schmal
   gehalten, weil ein Hochformat-Foto sonst bei voller Breite viel
   vertikale Fläche gefressen hätte). Jetzt volle Breite plus fester
   Querformat-Zuschnitt (siehe .page-intro__portrait-inner img unten,
   16:10 statt des ursprünglichen, unbeschnittenen Hochformat-Werts) –
   ein breites Querformat-Bild braucht die Breite, um nicht wie ein
   schmaler, wirkungsloser Streifen zu wirken. */
@media (max-width: 700px) {
  .page-intro__portrait {
    max-width: 100%;
  }
}

.page-intro__portrait-inner img {
  width: 100%;
  height: auto;
  display: block;
  border-radius: 0;
}

@media (max-width: 700px) {
  .page-intro__portrait-inner img {
    aspect-ratio: 16 / 10;
    object-fit: cover;
    /* IMG_3578.jpeg (24.09.2026 hierher getauscht, alter Wert 35%/80%
       war noch auf das vorherige Bild IMG_3238.jpeg abgestimmt) – auf
       Wunsch (24.09.2026, 2. Korrektur: "Kopf ist leicht oben
       abgeschnitten") etwas höher angesetzt, damit mehr vom Kopf im
       Querformat-Ausschnitt bleibt. */
    object-position: 35% 65%;
  }
}

/* Auf Desktop ausgeblendet (24.09.2026, 2. Korrektur: "mach das Bild
   eins nach unten, links neben den Text von 'Wie ich zu goldenroom
   yoga gekommen bin'") – das Bild sitzt auf Desktop jetzt stattdessen
   in .bio-section__media (siehe dort, .bio-section--story). Mobil/
   Tablet (unter 901px) bleibt unverändert die kleine Hochkant-Vorschau
   hier im Hero. */
@media (min-width: 901px) {
  .page-intro__portrait {
    display: none;
  }
}

/* ---------- Format-Detail (Unterseite formate.html) ----------
   Gleiche Parallax-Mechanik wie Baustein 3 oben (großes Bild läuft
   normal mit, kleines Bild bekommt zusätzlichen Scroll-Versatz über
   dieselbe @keyframes parallax-drift – bewusst nicht neu definiert,
   nur referenziert), aber diesmal Bild-Duo links + Text rechts statt
   freistehend zentriert. Dreimal auf der Seite verwendet (Kleingruppen,
   Workshops, 1:1), Maße/Ratios überall identisch, nur Fotos/Text
   unterscheiden sich. */

/* BUGFIX (28.09.2026, auf Wunsch: "der ganz außen Hintergrund... ist
   hell, und der innere ist beige... sollte nicht so sein") – max-width
   saß bisher direkt auf der <section> (.format-detail) selbst, dadurch
   füllte ein --alt-Hintergrund (Greige) auf breiten Bildschirmen nur die
   mittleren var(--container-max)/1440px, links/rechts blieb die reine
   Seitenfläche (Cream) sichtbar: "heller Rand außen, beige Box in der
   Mitte" statt einer echten, randlosen Section-Fläche. Jetzt wie bei
   .bio-section/.portrait-split: die <section> selbst ist nur noch für
   Hintergrund/Padding zuständig (randlos, volle Breite), Grid + max-width
   wandern in einen neuen inneren Wrapper (.format-detail__inner, siehe
   HTML in formate.html/formate/*.html). */
.format-detail {
  position: relative;
  isolation: isolate; /* eigener Stapelkontext, damit .ambient-gold (z-index:-1) zuverlaessig hinter dem Text bleibt */
  padding-block: var(--space-section-y);
  padding-inline: var(--space-section-x);
  /* --surface (28.09.2026), siehe Kommentar bei .btn--primary. */
  --surface: var(--surface-a);
}

.format-detail__inner {
  position: relative; /* Bezugsrahmen für .ambient-gold-formatdetail-*, die jetzt hier drin statt direkt in der <section> stecken (siehe HTML) – so bleibt der vw-Versatz relativ zur zentrierten Box, nicht zur vollen Viewportbreite. */
  display: grid;
  grid-template-columns: minmax(0, 440px) 1fr;
  align-items: center;
  gap: clamp(3rem, 6vw, 6rem);
  max-width: var(--container-max);
  margin-inline: auto;
}

/* QUALITY-VARIANTE (19.09.2026, auf Wunsch: "die drei Formate auf der
   Unterseite ordentlich an der Höhe kürzen, Desktop-Ansicht, durch
   schlaueres Platzieren, Leerfläche an den Rändern weglassen"):
   var(--space-section-y) (bis zu 11rem/176px oben UND unten) ist der
   sitweite Standard-Sectionabstand, hier auf Desktop spürbar kleiner –
   diese drei Sections stehen ohnehin schon dicht mit Trennlinien/Farb-
   wechsel hintereinander, brauchen also nicht denselben großen Puffer
   wie freistehende Sections. Nur ≥901px, Handy bleibt beim Standard-
   Abstand (dort ist ohnehin nur eine Spalte, weniger Leerraum-Problem). */
@media (min-width: 901px) {
  .format-detail {
    padding-block: clamp(3.5rem, 6vw, 5.5rem);
  }
}

.format-detail__media {
  position: relative;
  /* overflow: clip statt hidden – aus demselben Grund wie bei
     .parallax-duo: hidden würde einen eigenen Scroll-Container
     erzeugen und die view()-Timeline des Akzent-Bilds einfrieren. */
  overflow: clip;
  width: 100%;
  /* Puffer unten, damit der Übersteher des Akzent-Bilds (statischer
     Versatz + beide Parallax-Animationen zusammen, siehe unten) nicht
     an dieser Kante abgeschnitten wird. */
  padding-bottom: 7rem;
}

/* Eigene, dezente Bewegung für das GANZE Bild-Duo (nicht nur das
   kleine Bild) – läuft zusätzlich zur (stärkeren) Einzel-Animation
   des Akzent-Bilds weiter unten, beide addieren sich, weil das
   Akzent-Bild ein Kind von .format-detail__media ist. */
@media (prefers-reduced-motion: no-preference) {
  .format-detail__media {
    animation-name: parallax-drift-container;
    animation-timeline: view();
    animation-range: cover 0% cover 100%;
    animation-fill-mode: both;
    animation-timing-function: linear;
  }

  @keyframes parallax-drift-container {
    from { transform: translateY(-14px); }
    to { transform: translateY(14px); }
  }
}

/* Innerer Rahmen schmaler als der Media-Container – reserviert damit
   bewusst Platz rechts, in den das Akzent-Bild hineinragen kann, ohne
   vom overflow:clip des Containers abgeschnitten zu werden.
   position:relative macht den Rahmen (nicht den ganzen Media-Container)
   zum Bezugsrahmen für das absolut positionierte Akzent-Bild direkt
   darunter – wichtig bei .format-detail--split, wo im Media-Container
   zusätzlich noch der Fakten-Kasten/Button (.format-detail__aside)
   unter dem Bild-Duo steht: bottom:-10% soll sich auf die Bildhöhe
   beziehen, nicht auf Bild+Kasten zusammen. */
.format-detail__frame {
  position: relative;
  width: 78%;
}

.format-detail__img { width: 100%; object-fit: cover; display: block; }

.format-detail__main {
  aspect-ratio: 3 / 4;
  width: 100%;
  border-radius: 0;
}

/* BUGFIX (16.09.2026): stand vorher als Geschwister-Element NACH
   .format-detail__frame im Markup, dadurch positionierte sich
   bottom:-10% gegen die Höhe von .format-detail__media – bei
   .format-detail--split (Fakten-Kasten im selben Media-Container) war
   das viel zu hoch und hat das Akzent-Bild weit unter das Hauptfoto,
   fast auf Höhe des Kastens, verschoben. Jetzt im Markup ein Kind von
   .format-detail__frame (siehe formate.html) – bottom/right beziehen
   sich dadurch immer auf die Bildhöhe selbst, unabhängig davon, was im
   Media-Container sonst noch darunterstehen mag. */
.format-detail__accent {
  position: absolute;
  /* 05.10.2026, auf Wunsch: kleines Bild weiter nach unten/rechts und
     etwas kleiner, damit es das Hauptbild weniger verdeckt (war 55% /
     right -19% / bottom -10%). */
  width: 48%;
  aspect-ratio: 3 / 4;
  right: -25%;
  bottom: -18%;
  border-radius: 0;
  /* Schatten entfernt (23.09.2026 auf Wunsch: "schwarzer komischer
     Rand unten, wie ein Schatten, bitte entfernen") – wirkte als
     dunkle Kante statt als weicher Schatten. */
}

@media (prefers-reduced-motion: no-preference) {
  .format-detail__accent {
    animation-name: parallax-drift;
    animation-timeline: view();
    animation-range: cover 0% cover 100%;
    animation-fill-mode: both;
    animation-timing-function: linear;
  }
}

.format-detail__body {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 1.1rem;
}

.format-detail__body h1,
.format-detail__body h2 { font-size: var(--step-titel); }
/* max-width 52ch → 62ch (19.09.2026, Höhe-kürzen-Wunsch, siehe oben):
   die Textspalte ist bei minmax(0,440px)+1fr auf Desktop tatsächlich
   deutlich breiter als 52ch erlaubte – jede Zeile brach dadurch früher
   um als nötig. Bei der verfügbaren Spaltenbreite ist 62ch der Punkt,
   ab dem ohnehin die Spalte selbst (nicht mehr ch) die Grenze setzt,
   mehr würde also nichts mehr bringen. */
.format-detail__text { font-size: var(--step-lead); max-width: 62ch; }

/* Eigener, umrandeter Kasten statt zentriert umbrechender Fließtext
   (dt/dd nebeneinander lief vorher bei jeder Zeile unterschiedlich weit
   um und wirkte dadurch "versetzt"). Feste zweispaltige Grid-Ausrichtung
   sorgt dafür, dass Label und Wert bei jeder Zeile exakt untereinander
   stehen. Zeilen-Wrapper-Divs werden über display:contents unsichtbar
   fürs Grid – dt/dd rutschen dadurch direkt in die zwei Grid-Spalten,
   ohne eine zusätzliche Verschachtelungsebene zu erzeugen. Bewusst kein
   Icon-Set: die Seite hat sonst nirgendwo Piktogramme, eine dünne
   goldene Linie als Rahmen + die Mono-Eyebrow-Optik der Labels passen
   besser zur bestehenden Formsprache. Text-align:left als bewusste
   Ausnahme vom sonst zentrierten Seitentext – bei einer Werte-Tabelle
   liest sich Linksbündig klarer, gleiche Begründung wie beim
   Kontaktformular und der Workshop-Terminliste. */
.format-detail__facts {
  display: grid;
  grid-template-columns: auto 1fr;
  column-gap: 1.5rem;
  /* War 0.65rem – etwas mehr Luft, passend zur größeren Schrift
     (13.09.2026 auf Wunsch). */
  row-gap: 0.85rem;
  /* dt (klein, Mono-Uppercase) und dd (normale, größere Fließtextgröße)
     standen ohne das hier sichtbar nicht auf gleicher Höhe zueinander –
     dt hing am oberen Rand seiner Zeile, dd war durch die größere
     Schrift/Zeilenhöhe optisch tiefer. align-items:center zentriert
     beide innerhalb ihrer gemeinsamen Grid-Zeile (13.09.2026 auf
     Wunsch, betrifft alle drei Formate-Info-Kästen). */
  align-items: center;
  width: 100%;
  /* War 28rem – etwas breiter, damit die längeren dd-Zeilen (z.B. "5×
     donnerstags (1× 90 / 4× 75 Minuten)") bei größerer Schrift nicht
     unnötig oft umbrechen. */
  max-width: 31rem;
  margin-top: 0.75rem;
  padding: 1.35rem 1.6rem;
  border: 1px solid var(--gold-500);
  text-align: left;
}

.format-detail__facts div {
  display: contents;
}

.format-detail__facts dt {
  font-family: var(--font-mono);
  font-weight: 700;
  /* War 0.75rem, auf Wunsch (13.09.2026) größer. */
  font-size: 0.875rem;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--gold-700);
  white-space: nowrap;
}

.format-detail__facts dd {
  /* War 1rem, auf Wunsch (13.09.2026) größer – jetzt auf Höhe der
     normalen Fließtextgröße der Seite. */
  font-size: 1.1875rem;
}

/* KORREKTUR (22.09.2026, auf Wunsch, am Beispiel "1:1": "die Punkte für
   Für/Antwort sollten enger zusammen sein"): row-gap greift hier NICHT
   (das wäre nur für die Grid-Basisregel relevant) – ab 700px steht
   .format-detail__facts bereits auf display:flex/flex-direction:column
   um (siehe die eigene, weiter unten stehende @media(max-width:700px)-
   Regel, "BUGFIX 16.09.2026"), row-gap zwischen den einzelnen dt/dd-
   Paaren kommt dort über deren eigenes "gap" statt row-gap – siehe
   Anpassung dort. dt hier zusätzlich vom systemweiten Bebas-Neue-
   Fake-Fett befreit (font-weight:700 auf einer Schrift ohne echten
   Fett-Schnitt, siehe Kommentar bei .mobile-lede weiter oben für die
   volle Begründung) – gleiche Lösung: echtes Gewicht (400) plus mehr
   Zeichenabstand statt synthetischem Fett. */
@media (max-width: 700px) {
  .format-detail__facts dt {
    font-weight: 400;
    letter-spacing: 0.08em;
  }
}

.format-detail__cta {
  margin-top: 0.5rem;
}

/* Modifier statt nth-of-type: auf der Seite stehen noch andere
   <section>-Elemente (Intro) dazwischen, nth-of-type würde daher an
   der falschen Stelle zählen. Mittlerer Block bekommt Greige, wie der
   Section-Rhythmus auf der Startseite auch – reicht als Trennung,
   kein zusätzlicher Strich nötig. */
.format-detail--alt {
  background: var(--surface-b);
  --surface: var(--surface-b);
}

/* Modifier: "Kleingruppen"-Layout, bei dem Info-Kasten und CTA-Button
   in die linke Spalte (zu den Bildern) wandern statt unten im langen
   Textblock rechts zu stehen (13.09.2026 auf Wunsch) – dadurch bleibt
   die rechte Spalte kürzer (nur Überschrift + Fließtext) und die
   Section insgesamt weniger lang. align-items:start statt center lässt
   beide Spalten oben anschlagen, statt die kürzere (jetzt: Bilder +
   Kasten + Button) mittig in der Zeilenhöhe der längeren zu zentrieren
   – die Bilder rutschen dadurch automatisch weiter nach oben. */
.format-detail--split .format-detail__inner {
  align-items: start;
}

/* QUALITY-VARIANTE (19.09.2026, "Höhe kürzen"): die 7rem
   Puffer auf .format-detail__media (siehe oben) sind fürs
   nicht-gesplittete Layout gedacht, wo der Media-Container direkt mit
   dem überstehenden Akzent-Bild endet. Bei --split kommt danach noch
   der Fakten-Kasten (.format-detail__aside, per margin-top schon vom
   Akzent-Bild abgerückt, siehe dort) – der zusätzliche Puffer am Ende
   des ganzen Media-Containers hat hier keine Schutzfunktion mehr, war
   also reine, ungenutzte Leerfläche unter dem Kasten/Button. */
.format-detail--split .format-detail__media {
  padding-bottom: 0;
}

/* Auf Wunsch (24.09.2026: "das kleine Bild weg, das große Bild mittig")
   – nur auf den drei eigenen Formate-Unterseiten (--split), formate.html
   selbst (Kurzfassungen, kein --split) bleibt beim Bild-Duo
   unangetastet. .format-detail__frame war bisher bewusst nur 78% breit
   und linksbündig, um rechts Platz für das jetzt entfernte Akzent-Bild
   zu reservieren (siehe index.html/die drei Unterseiten) – margin:auto
   zentriert den Rahmen jetzt in seinem Container. */
.format-detail--split .format-detail__frame {
  margin-inline: auto;
}

.format-detail--split .format-detail__aside {
  display: flex;
  /* War column (Kasten oben, Button darunter) – auf Wunsch (24.09.2026:
     "Sections niedriger machen, Button nach rechts neben den Kasten
     verschieben") jetzt nebeneinander statt gestapelt, macht den
     ganzen Block spürbar niedriger. flex-wrap:wrap als Sicherheitsnetz
     auf sehr schmalen Screens, falls Kasten (max-width 31rem) + Button
     nicht mehr nebeneinander passen – fällt dann von selbst auf
     gestapelt zurück. */
  flex-direction: row;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
  gap: 1.75rem;
  width: 100%;
  /* War 4rem, dann 3.25rem (19.09.2026, "Höhe kürzen") – ursprünglich
     nötig, damit das inzwischen entfernte Akzent-Bild (siehe
     .format-detail__accent) nicht den Fakten-Kasten überlappt. Ohne
     Akzent-Bild nicht mehr nötig, auf Wunsch (24.09.2026, "niedriger
     machen") auf 1.5rem reduziert – reicht als normaler Abstand zum
     Hauptbild darüber. */
  margin-top: 1.5rem;
}

.format-detail--split .format-detail__facts {
  margin-top: 0;
}

/* Modifier: spiegelverkehrt – Bild-Duo rechts, Text links. DOM-
   Reihenfolge bleibt Bild-zuerst (Tab-/Screenreader-Reihenfolge, wie
   schon bei .split--b), nur die visuelle Reihenfolge kippt über
   order. Innenleben von .format-detail__media (Frame, Akzent-Bild,
   beide Animationen) bleibt komplett unverändert – nur die Spalte
   wechselt die Seite. */
.format-detail--reverse .format-detail__inner {
  grid-template-columns: 1fr minmax(0, 440px);
}
.format-detail--reverse .format-detail__media { order: 2; }
.format-detail--reverse .format-detail__body { order: 1; }

/* Modifier für Format-Sections ohne Bild (16.09.2026 wieder eingeführt,
   war zwischenzeitlich entfernt): Section kollabiert auf eine einzelne,
   zentrierte Textspalte statt eines Zwei-Spalten-Grids mit leerer
   Bildseite. Aktuell auf Wunsch bei Workshops (Raumfoto + Matten-Detail
   "passen nicht zueinander") und bei 1:1 (Foto "passt noch nicht", ganz
   entfernt) im Einsatz – Kleingruppen behält ihr Bild-Duo, weil dort
   nicht bemängelt. */
.format-detail--no-media .format-detail__inner {
  grid-template-columns: 1fr;
  max-width: 46rem;
}

@media (max-width: 900px) {
  .format-detail {
    /* MOBILE-POLISH (20.09.2026, auf Wunsch: "die Container bei den 3
       Formate-Unterseiten nicht so riesig, das kann alles niedriger") –
       war der site-weite Standard-Sectionabstand (bis zu 11rem oben UND
       unten), wie bei den Desktop-Formate-Sections (siehe
       @media(min-width:901px) oben) jetzt auch mobil spürbar kleiner. */
    padding-block: clamp(2rem, 7vw, 3rem);
  }
  .format-detail__inner,
  .format-detail--reverse .format-detail__inner {
    /* 08.10.2026: die --reverse-Regel (2 Spalten) hat die 1-Spalten-Regel
       auf dem Handy überstimmt – Workshops-Section war dadurch nach rechts
       verschoben und das Bild kollabierte auf Breite 0. */
    grid-template-columns: 1fr;
  }
  .format-detail--reverse .format-detail__media,
  .format-detail--reverse .format-detail__body {
    order: initial;
  }
  .format-detail__media {
    max-width: 440px;
    margin-inline: auto;
  }
}

@media (max-width: 700px) {
  /* War fix 7rem auf allen Breiten – das Akzent-Bild überragt den
     Rahmen bei der kleineren Mobile-Breite proportional weniger,
     die volle Reserve blieb dadurch als reine Leerfläche unter dem
     Bild-Duo übrig. */
  .format-detail__media {
    max-width: 320px;
    /* War 7rem (von der Basisregel geerbt), dann 4rem – das Akzentbild
       überragt den Rahmen hier nur um ca. 33px (10% der ~333px hohen
       Rahmenhöhe bei 320px Breite), 2.5rem/40px Puffer reichen also mit
       etwas Sicherheitsmarge (Mobile-Polish-Runde, 20.09.2026, "Container
       nicht so riesig"). */
    padding-bottom: 2.5rem;
  }

  /* BUGFIX (16.09.2026): .format-detail__facts nutzt normalerweise ein
     Grid (auto 1fr) mit white-space:nowrap auf dt – die eigentlich für
     Desktop gedachte feste Spaltenbreite. Ein 1fr-Grid-Track schrumpft
     aber nie unter die Mindestbreite seines Inhalts, und die nowrap-
     Labels plus lange zusammengesetzte dd-Wörter (z.B.
     "Einsteiger:innen") brauchen zusammen mehr Platz, als auf schmalen
     Handy-Breiten zur Verfügung steht. Ohne diese Regel wurde dadurch
     nicht nur der Kasten selbst, sondern die GANZE Section (und damit
     die ganze Seite) breiter als der Viewport gezogen – sichtbar am
     waagerecht abschneidenden Fließtext und einem generellen
     Seiten-Scrollbereich nach rechts. Ab hier: Label über Wert gestapelt
     (Flexbox statt Grid) statt nebeneinander, dt darf umbrechen – jede
     Zeile bleibt dadurch innerhalb der eigentlichen Kastenbreite. */
  .format-detail__facts {
    display: flex;
    flex-direction: column;
    /* Überschreibt das align-items:center der Grundregel – das war für
       die vertikale Mitte von dt/dd INNERHALB einer Grid-Zeile gedacht
       (Cross-Achse bei Grid), bedeutet bei flex-direction:column aber
       plötzlich "jede Zeile horizontal zentrieren" (Cross-Achse bei
       Flex ist hier waagerecht) – dadurch stand jedes Label/Wert-Paar
       unterschiedlich weit eingerückt, je nach eigener Textbreite. */
    align-items: stretch;
    /* War 0.85rem/1.35rem 1.6rem (Basisregel-Padding gilt hier weiter) –
       bei bis zu 8 Fakten-Zeilen (z.B. Kleingruppen) summierte sich das
       auf Handy spürbar (Mobile-Polish-Runde, 20.09.2026, "Container
       nicht so riesig"). War danach 0.6rem – auf Wunsch (22.09.2026, am
       Beispiel "1:1": "die Punkte für Für/Antwort sollten enger
       zusammen sein") nochmal kleiner: das ist der Abstand ZWISCHEN
       den einzelnen dt/dd-Paaren (Frage+Antwort selbst hängen über das
       eigene, viel kleinere gap von .format-detail__facts div direkt
       darunter ohnehin schon eng zusammen). */
    gap: 0.4rem;
    padding: 1.1rem 1.25rem;
  }
  .format-detail__facts div {
    display: flex;
    flex-direction: column;
    gap: 0.15rem;
  }
  .format-detail__facts dt {
    white-space: normal;
  }
}

/* ---------- Baustein 4: Sticky-Image-Section ---------- */

.sticky-image {
  position: relative;
}

.sticky-image__media {
  position: sticky;
  top: 0;
  height: 100vh;
}

.sticky-image__media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.sticky-image__content {
  position: relative;
  z-index: 1;
  margin-top: -40vh;
  padding-block: 4rem;
  display: flex;
  justify-content: center;
}

.sticky-image__panel {
  background: var(--cream);
  padding: var(--space-section-x);
  max-width: 34rem;
  text-align: center;
}

.sticky-image__panel h2 { font-size: var(--step-titel); margin-bottom: 1rem; }

@media (max-width: 900px) {
  .sticky-image__media { position: static; height: 60vh; }
  .sticky-image__content { margin-top: 0; }
}

/* Kompakte Variante: gleiches Prinzip (Bild steht komplett still,
   Text läuft normal darüber), aber deutlich kürzerer Scroll-Bereich –
   eine kurze Atempause statt eines langen Pins. Nur Bildhöhe und
   Überlappung sind kleiner, keine neue Technik. */
.sticky-image--compact .sticky-image__media { height: 55vh; }

.sticky-image--compact .sticky-image__content {
  margin-top: -28vh;
  padding-block: 2rem;
}

.sticky-image--compact .sticky-image__panel {
  padding: calc(var(--space-section-x) * 0.75);
  max-width: 26rem;
}

@media (max-width: 900px) {
  .sticky-image--compact .sticky-image__media { height: 40vh; }
  .sticky-image--compact .sticky-image__content { margin-top: 0; }
}

/* ---------- Baustein 5: Sticky-Spalten-Section ---------- */

.sticky-cols {
  padding-block: var(--space-section-y);
  padding-inline: var(--space-section-x);
}

.sticky-cols__grid {
  display: grid;
  grid-template-columns: 1fr minmax(280px, 480px) 1fr;
  gap: 3rem;
  align-items: start; /* zwingend nötig, sonst kein sticky */
  max-width: var(--container-max);
  margin-inline: auto;
}

.sticky-cols__col--left,
.sticky-cols__col--right {
  position: sticky;
  top: 1.5rem;
}

.sticky-cols__col--images {
  display: flex;
  flex-direction: column;
  gap: 45px;
}

.sticky-cols__col--images figure { margin: 0; }

.sticky-cols__col--images img {
  width: 100%;
  aspect-ratio: 3 / 4;
  object-fit: cover;
}

.sticky-cols__col--images figcaption {
  margin-top: 0.5rem;
  font-family: var(--font-mono);
  font-weight: 700;
  font-size: 0.8125rem;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--gold-700);
}

/* Zusätzliche Kennzeichnung neben den Bild-Labels: eine feste
   Legende in der rechten Spalte, die die drei Formate durchnummeriert
   auflistet. Bleibt stehen, während die Bilder in der Mitte
   durchlaufen – anders als figcaption (pro Bild) gilt sie für die
   ganze Section. */
.sticky-cols__legend {
  list-style: none;
  margin-top: 1.5rem;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
}

.sticky-cols__legend li {
  font-family: var(--font-mono);
  font-size: 0.8125rem;
  letter-spacing: 0.03em;
  color: var(--gold-700);
}

.sticky-cols__legend b {
  color: var(--ink);
  font-weight: 600;
}

@media (max-width: 900px) {
  .sticky-cols__grid {
    grid-template-columns: 1fr;
  }
  .sticky-cols__col--left,
  .sticky-cols__col--right {
    position: static;
  }
}

/* ---------- Baustein 6: Übergangs-Section ---------- */

.transition-section {
  position: relative;
}

.transition-section img {
  width: 100%;
  height: 60vh;
  object-fit: cover;
}

.transition-section__caption {
  position: absolute;
  bottom: 2rem;
  left: var(--space-section-x);
  color: var(--cream);
  font-family: var(--font-mono);
  font-weight: 700;
  font-size: 0.875rem;
  text-transform: uppercase;
  letter-spacing: 0.06em;
}

/* ---------- Reservierter Platzhalter (kein Baustein aus diesem Plan) ---------- */
/* Nur zur Sichtbarkeit im Grundgerüst-Screenshot. Die echte Komponente
   für den Bildstapel-Crossfade wird in einem eigenen Schritt gebaut. */

.placeholder-block {
  padding-block: var(--space-section-y);
  padding-inline: var(--space-section-x);
  text-align: center;
  background: repeating-linear-gradient(
    45deg,
    var(--greige),
    var(--greige) 12px,
    var(--cream) 12px,
    var(--cream) 24px
  );
}

/* ---------- Kontakt-Section (kein eigener Baustein, nutzt Tokens) ---------- */

.contact-section {
  position: relative; /* Ankerpunkt für ::before, siehe dort */
  isolation: isolate; /* eigener Stapelkontext, damit ::before (z-index:-1) zuverlaessig hinter dem Text bleibt statt hinter den Section-Hintergrund zu rutschen */
  padding-block: var(--space-section-y);
  padding-inline: var(--space-section-x);
  background: var(--surface-b);
  --surface: var(--surface-b);
  text-align: center;
}

/* Der Gold-Sprenkel-Hintergrund (13.09.2026, ::before mit
   background-kontakt.png) ist am 14.09.2026 im Zug des großen Umbaus
   wieder raus ("diese goldenen Punkte... sieht oft nicht gut aus") –
   .contact-section steht jetzt auf der reinen, flächigen --surface-b-
   Farbe, ohne Sprenkel-Textur obendrüber. */

.contact-section h2 { font-size: var(--step-titel); }

.contact-section__intro {
  max-width: 42rem;
  margin-inline: auto;
}

.contact-section__lead {
  font-size: var(--step-lead);
  max-width: 42ch;
  margin-inline: auto;
  margin-top: 0.75rem;
}

/* Zwei feste Spalten (Kanäle / Formular) statt vorher alles lose
   untereinander – macht auf einen Blick klar, dass das zwei
   gleichwertige, nebeneinander stehende Wege sind, statt dass das
   Formular wie ein loser Anhang unter den Kanälen wirkt. */
.contact-section__grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: clamp(2.5rem, 6vw, 5rem);
  max-width: 58rem;
  margin: clamp(3rem, 7vw, 4.5rem) auto 0;
  align-items: start;
  text-align: left; /* bewusste Ausnahme, siehe .credentials/.price-list: funktionale Liste + Formular lesen sich linksbündig klarer */
}

/* Kanäle als ruhige Liste im gleichen Stil wie .credentials/.price-list
   (dünne Gold-Trennlinien, Label/Wert nebeneinander) statt vorher als
   zentrierte, umbrechende Flex-Reihe. */
.contact-section__channels {
  display: flex;
  flex-direction: column;
}

.contact-section__channel {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: 1rem;
  padding-block: 0.9rem;
  border-top: 1px solid var(--gold-500);
}

.contact-section__channels .contact-section__channel:last-child {
  border-bottom: 1px solid var(--gold-500);
}

.contact-section__channel dt {
  font-family: var(--font-mono);
  font-weight: 700;
  font-size: 0.75rem;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--gold-700);
}

/* Platzhalter-Werte (noch keine echten Kontaktdaten) bewusst
   abgedimmt statt wie ein fertiger Link – deutlich erkennbar als "folgt",
   nicht als anklickbare, aber tote Adresse. Kein font-style: italic
   mehr (auch Bebas Neue hat keinen echten Kursivschnitt, nur die
   synthetische Schrägstellung sah unruhig aus) – opacity allein trägt
   den Platzhalter-Look. */
.contact-section__channel dd {
  font-size: 1.1875rem;
  opacity: 0.55;
  text-align: right;
}

/* Echte, verlinkte Werte (aktuell nur Instagram) brauchen NICHT den
   "folgt noch"-Look der reinen Platzhalter-Texte. */
.contact-section__channel dd:has(a) {
  font-style: normal;
  opacity: 1;
}

.contact-section__channel dd a {
  color: var(--gold-700);
}

/* ---- Kontaktformular ----
   Eigene, umrandete Karte (gleiche Rahmen-Sprache wie .method__card)
   statt vorher lose/randlos unter den Kanälen zu hängen – dadurch
   liest sich das Formular als klar abgegrenzte, gleichwertige zweite
   Spalte statt als Nachgedanke. Innerhalb der Karte bleiben die Felder
   selbst weiterhin minimalistisch: kein Kasten ums einzelne Feld, nur
   eine dünne goldene Unterstreichung. */
.contact-section__form-wrap {
  border: 1px solid var(--gold-500);
  padding: clamp(1.75rem, 3.5vw, 2.5rem);
}

.contact-section__form {
  display: flex;
  flex-direction: column;
  gap: 1.5rem;
}

.contact-section__field {
  display: flex;
  flex-direction: column;
  gap: 0.4rem;
}

.contact-section__field label {
  font-family: var(--font-mono);
  font-weight: 700;
  font-size: 0.75rem;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--gold-700);
}

.contact-section__field input,
.contact-section__field textarea {
  font-family: var(--font-body);
  font-size: 1rem;
  color: var(--ink);
  background: transparent;
  border: none;
  border-bottom: 1px solid var(--gold-500);
  padding-block: 0.5rem;
}

.contact-section__field textarea {
  resize: vertical;
  min-height: 6rem;
}

.contact-section__field input:focus-visible,
.contact-section__field textarea:focus-visible {
  border-bottom-color: var(--ink);
}

.contact-section__submit {
  align-self: center;
  margin-top: 0.5rem;
  /* Textfarbe kommt jetzt automatisch über --surface von .contact-section
     (siehe dort, inkl. der #blog[hidden]-Kette für index.html#kontakt) –
     kein eigener Selektor mehr nötig. */
}

@media (max-width: 700px) {
  .contact-section__grid {
    grid-template-columns: 1fr;
    margin-top: clamp(1.75rem, 7vw, 2.5rem);
    text-align: center;
  }
  .contact-section__channel {
    flex-direction: column;
    align-items: center;
    gap: 0.3rem;
  }
  .contact-section__channel dd { text-align: center; }
}

/* ---------- Blog-Teaser (kein eigener Baustein, nutzt Tokens) ----------
   Reine Optik, kein System dahinter. Greige statt Cream, um sich von
   den beiden Cream-Sections davor (Formate, Über mich) abzusetzen –
   Kontrast reicht wie schon bei Fuerwen/Formate, kein extra Trennstrich
   nötig. Karten-Bilder sind Platzhalter im gleichen Streifenmuster wie
   Instagram/placeholder-block. */

.blog {
  background: var(--surface-b);
  padding-block: var(--space-section-y);
  padding-inline: var(--space-section-x);
}

/* Nur der Homepage-Teaser (id="blog", index.html) auf Cream statt
   Greige umgeschaltet – die volle Blog-Seite (blog.html) nutzt .blog
   ohne diese ID und bleibt bei ihrem eigenen Greige. Site-weite
   Abwechseln-Regel (13.09.2026 auf Wunsch): auf index.html steht davor
   jetzt .formate auf Greige, .blog muss also Cream sein, damit keine
   zwei gleichen Flächen hintereinander stehen. */
#blog {
  background: var(--surface-a);
}

.blog__intro {
  max-width: 40rem;
  margin-inline: auto;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.85rem;
}

.blog__heading {
  font-size: var(--step-titel);
}

.blog__lead {
  /* War 1.0625rem (die Fließtext-Größe) statt --step-lead wie alle
     anderen *__lead-Absätze site-weit – jetzt vereinheitlicht. */
  font-size: var(--step-lead);
}

.blog__grid {
  max-width: var(--container-max);
  margin-inline: auto;
  margin-top: clamp(2.5rem, 6vw, 4rem);
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: clamp(1.5rem, 4vw, 2.5rem);
}

/* Link steht jetzt ganz unten in der Section statt oben im Intro –
   führt erst durch die Beiträge, dann erst zum "mehr davon"-Link. */
.blog__cta {
  text-align: center;
  margin-top: clamp(2rem, 5vw, 3rem);
}

.blog__card {
  display: flex;
  flex-direction: column;
  gap: 0.6rem;
}

/* Gleiche Klasse für zwei Fälle: leeres <div> (Platzhalter-Streifen,
   solange keine echten Beiträge/Bilder da sind) und echtes <img>
   (sobald js/blog.js einen Beitrag mit Bild-URL aus dem Sheet lädt).
   width/height/object-fit greifen nur beim <img>, sind für das <div>
   wirkungslos. */
.blog__card-image {
  display: block;
  width: 100%;
  aspect-ratio: 4 / 3;
  object-fit: cover;
  border-radius: 0;
  margin-bottom: 0.4rem;
  background: repeating-linear-gradient(
    45deg,
    var(--greige),
    var(--greige) 12px,
    var(--cream) 12px,
    var(--cream) 24px
  );
}

.blog__card-meta {
  font-family: var(--font-mono);
  font-weight: 700;
  font-size: 0.75rem;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--gold-700);
}

.blog__card-title {
  /* War 1.25rem, alle anderen Karten-Überschriften (H3) auf
     --step-card-title vereinheitlicht. */
  font-size: var(--step-card-title);
}

.blog__card-excerpt {
  font-size: 1rem;
}

.blog__card-link {
  margin-top: 0.2rem;
}

/* Lade-/Leer-/Fehlerzustand beim dynamischen Laden aus dem Sheet
   (js/blog.js) – ersetzt testweise den ganzen Grid-Inhalt. */
.blog__empty {
  grid-column: 1 / -1;
  text-align: center;
  font-size: 1.1875rem;
  padding-block: 2rem;
}

/* Bilder innerhalb eines geladenen Artikel-Fließtexts (post-body),
   siehe js/blog.js loadSinglePost(). */
.post-body__image {
  width: 100%;
  aspect-ratio: 4 / 3;
  object-fit: cover;
  display: block;
  margin-bottom: 1.5rem;
}

.post-body__gallery {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(10rem, 1fr));
  gap: 0.75rem;
  margin-top: 1rem;
}

.post-body__gallery img {
  width: 100%;
  aspect-ratio: 1 / 1;
  object-fit: cover;
  display: block;
}

@media (max-width: 900px) {
  /* QUALITY-VARIANTE (19.09.2026, auf Wunsch: "Blog-Section und
     Unterseite übersichtlicher für Besucher"): Bild-Format flacher (3:2
     statt 4:3) und Teaser-Text auf zwei Zeilen gedeckelt (line-clamp) –
     jede Karte ist dadurch auf einen Blick erfassbar statt ein langer,
     lückenlos wirkender Textblock. Nur mobil (Desktop-Grid bleibt beim
     vollen Teaser-Text) – betrifft hier automatisch beide Stellen, die
     dieselben Klassen nutzen: den Homepage-Teaser (--teaser) und die
     volle Übersicht auf blog.html, die ab hier beide einspaltig sind. */
  .blog__grid {
    grid-template-columns: 1fr;
    max-width: 34rem;
  }
  .blog__card-image {
    aspect-ratio: 3 / 2;
  }
  .blog__card-excerpt {
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 2;
    overflow: hidden;
  }
}

/* Handy: nur der Homepage-Teaser (--teaser, 3 Karten) wird zum
   seitlichen Scroll-Karussell, gleiches Prinzip wie .formate__gallery/
   .testimonials__row – die volle Artikelübersicht auf blog.html bleibt
   eine normale vertikale Liste. */
@media (max-width: 700px) {
  .blog__grid--teaser {
    display: flex;
    flex-wrap: nowrap;
    max-width: none;
    margin-inline: calc(var(--space-section-x) * -1);
    padding-inline: var(--space-section-x);
    gap: 1.1rem;
    overflow-x: auto;
    scroll-snap-type: x mandatory;
    -webkit-overflow-scrolling: touch;
    scrollbar-width: none;
  }
  .blog__grid--teaser::-webkit-scrollbar {
    display: none;
  }
  .blog__grid--teaser .blog__card {
    scroll-snap-align: center;
    flex: 0 0 auto;
    width: min(78vw, 300px);
  }
  .blog__cta {
    margin-top: clamp(1.5rem, 6vw, 2rem);
  }
}

/* ---------- Workshops (kein eigener Baustein, nutzt Tokens) ----------
   Werden jetzt live aus einem Google Sheet geladen (js/workshops.js,
   gleiches Prinzip wie js/blog.js für die Blogbeiträge) – jede Zeile
   ist ein anklickbarer Eintrag (Bild · Datum/Titel/Kurztext · Status-
   Badge "frei/knapp/ausgebucht"), Klick führt zur Detailseite
   (workshops/workshop.html) mit voller Beschreibung, weiteren Bildern
   und direktem Anmeldeformular. Auf workshops.html steht zusätzlich
   ein allgemeines Formular mit Workshop-Auswahl (siehe
   .workshops__form weiter unten). Details zur Sheet-Anbindung:
   WORKSHOPS-SETUP.md im Projektordner. Cream statt Greige, um sich vom
   Blog davor abzusetzen (beide sonst Greige direkt hintereinander). */

.workshops {
  position: relative; /* Ankerpunkt für .ambient-gold, siehe Dateiende */
  isolation: isolate; /* eigener Stapelkontext, damit .ambient-gold (z-index:-1) zuverlaessig hinter dem Text bleibt statt hinter den Section-Hintergrund zu rutschen */
  background: var(--surface-a);
  --surface: var(--surface-a);
  padding-block: var(--space-section-y);
  padding-inline: var(--space-section-x);
}

/* Nur der Homepage-Teaser (id="workshops", index.html) auf Greige
   umgeschaltet, damit er sich von der direkt davor stehenden .blog-
   Teaser-Fläche (Cream) unterscheidet – die volle Workshops-Seite
   (workshops.html) nutzt .workshops ohne diese ID und bleibt bei ihrem
   eigenen Cream. Site-weite Abwechseln-Regel (13.09.2026 auf Wunsch).
   (War zwischenzeitlich id="kurse", 20.09.2026 auf Wunsch umbenannt,
   21.09.2026 auf Wunsch wieder zurück auf id="workshops".) */
#workshops {
  background: var(--surface-b);
}

/* --alt: fürs allgemeine Anmeldeformular auf workshops.html, das direkt
   auf die Workshop-Liste (Cream) folgt – Greige setzt es optisch ab,
   gleiche Konvention wie .format-detail--alt/.bio-section--alt. */
.workshops--alt {
  background: var(--surface-b);
}

.workshops__intro {
  max-width: 40rem;
  margin-inline: auto;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.85rem;
}

/* Breiter auf Desktop (24.09.2026, auf Wunsch: "Du weißt schon, welcher
   Workshop es sein soll?..." soll in einer Zeile sein, nicht in zwei) –
   die 40rem-Obergrenze oben war zu schmal für den Satz. Bewusst OHNE
   white-space:nowrap: bei genug Platz steht der Satz dadurch ohnehin
   einzeilig, bei einem zufällig sehr schmalen Desktop-Fenster bricht er
   stattdessen sauber um statt über den Rand hinauszulaufen. */
@media (min-width: 901px) {
  .workshops__intro {
    max-width: 52rem;
  }
}

.workshops__heading {
  font-size: var(--step-titel);
}

.workshops__lead {
  /* War 1.0625rem (die Fließtext-Größe) statt --step-lead wie alle
     anderen *__lead-Absätze site-weit – jetzt vereinheitlicht. */
  font-size: var(--step-lead);
}

.workshops__list {
  max-width: 50rem;
  margin: clamp(2.5rem, 6vw, 4rem) auto 0;
  display: flex;
  flex-direction: column;
}

/* Link steht jetzt ganz unten in der Section statt oben im Intro –
   erst die aktuellen Termine, dann erst der Link zur vollen Übersicht. */
.workshops__cta {
  text-align: center;
  margin-top: clamp(2rem, 5vw, 3rem);
}

/* Ganze Zeile ist jetzt ein <a>-Link zur Detailseite statt nur der
   frühere einzelne "Jetzt anmelden"-Text – Bild links, Text in der
   Mitte, Status-Badge rechts. Gleiches 3-Spalten-Grundgerüst wie
   vorher, nur die mittlere/rechte Spalte sind jetzt Body/Badge statt
   Titel/CTA-Link. */
.workshops__item {
  display: grid;
  grid-template-columns: auto 1fr auto;
  align-items: center;
  gap: clamp(1rem, 3vw, 2rem);
  padding-block: 1.75rem;
  border-top: 1px solid var(--gold-500);
  text-align: left;
  transition: opacity 0.2s ease;
}

.workshops__item:hover {
  opacity: 0.85;
}

.workshops__list .workshops__item:last-child {
  border-bottom: 1px solid var(--gold-500);
}

.workshops__item-media {
  width: 5.5rem;
  height: 5.5rem;
  object-fit: cover;
  flex-shrink: 0;
  background: repeating-linear-gradient(
    45deg,
    var(--greige),
    var(--greige) 12px,
    var(--cream) 12px,
    var(--cream) 24px
  );
}

.workshops__item-date {
  font-family: var(--font-mono);
  font-weight: 700;
  font-size: 0.8125rem;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--gold-700);
}

.workshops__item-title {
  /* War 1.1875rem, alle anderen Karten-Überschriften (H3) auf
     --step-card-title vereinheitlicht. */
  font-size: var(--step-card-title);
}

.workshops__item-text {
  font-size: 1rem;
  margin-top: 0.25rem;
}

/* Auf Wunsch (24.09.2026, ausdrücklich nur Desktop: "diese Schrift...
   viel zu klein, kann man kaum lesen... auch das 'noch acht Plätze
   frei' größer machen") – Teaser-Text und Status-Badge auf den
   Workshop-Karten etwas größer, nur ab 901px.
   KORREKTUR (24.09.2026, erneut, auf Wunsch: "Beschreibungen und
   Uhrzeiten sollen ungefähr so groß sein wie die ganz normale
   Content-Größe der Website, nicht viel kleiner – kann dafür auch
   höher sein"): 1.0625rem reichte nicht, jetzt direkt auf die normale
   Fließtext-Größe der Seite (body, siehe base.css) statt eines eigenen,
   kleineren Werts – Karten dürfen dadurch bewusst höher werden. */
@media (min-width: 901px) {
  .workshops__item-date {
    font-size: 1rem;
  }
  .workshops__item-text {
    font-size: 1.1875rem;
  }
  .workshops__item-badge {
    font-size: 0.875rem;
  }
}

/* Status-Chip statt Ampelfarben (rot/grün) – passt nicht zur sonst
   warmen/gedeckten Palette der Seite. War erst Vollflächen-Farbe je
   Status (Olive für "frei" wirkte trotzdem zu grün, 12.09.2026 auf
   Wunsch geändert): jetzt durchgängig durchsichtig mit goldenem Rand
   als Grundform, "knapp" bekommt zusätzlich einen leicht rötlichen statt
   goldenen Rand/Text als sanftes Warnsignal (kein kräftiges Warnrot).
   "Ausgebucht" bleibt gedämpft (Opacity) statt alarmierend, gleiche
   Zurückhaltung wie bei den "folgt"-Platzhaltern in der
   Kontakt-Section. */
.workshops__item-badge {
  white-space: nowrap;
  font-family: var(--font-mono);
  font-size: 0.75rem;
  letter-spacing: 0.03em;
  padding: 0.4rem 0.85rem;
  border-radius: 999px;
  background: transparent;
  border: 1px solid var(--gold-500);
  color: var(--ink);
}

.workshops__item-badge--free {
  /* Kein eigener Zusatz – das ist schon die Grundform (durchsichtig,
     goldener Rand). */
}

.workshops__item-badge--low {
  /* Weiches, leicht rötliches Terracotta statt Gold – keine kräftige
     Warnfarbe, nur ein sanfter Unterschied zu "frei". */
  border-color: var(--clay-soft);
  color: #B0645A;
}

.workshops__item-badge--full {
  opacity: 0.55;
}

@media (max-width: 700px) {
  /* BUGFIX (19.09.2026, auf Wunsch: "sieht komisch aus mit dem mittigen
     Bild"): .workshops__item erbt von der Desktop-Regel oben
     align-items:center – dort passt das (Bild/Text/Badge stehen in
     EINER Zeile, ähnlich hoch). Hier spannt "media" aber über beide
     Grid-Zeilen (Titel+Text UND Badge darunter), die Karte ist dadurch
     insgesamt viel höher als das Bild selbst – zentriert schwebte das
     Bild dadurch mittig in der Kartenhöhe, statt oben am Datum/Titel
     auszurichten. align-items:start richtet das Bild stattdessen an
     der ersten Zeile (Datum/Titel) aus, wie man es von einer normalen
     Liste erwarten würde. */
  .workshops__item {
    grid-template-columns: auto 1fr;
    grid-template-areas:
      "media title"
      "media badge";
    align-items: start;
    column-gap: 1rem;
    row-gap: 0.4rem;
    padding-block: 1.5rem;
  }
  .workshops__item-media { grid-area: media; width: 4.5rem; height: 4.5rem; }
  .workshops__item-body { grid-area: title; }
  .workshops__item-badge { grid-area: badge; justify-self: start; }
  .workshops__list {
    margin-top: clamp(1.75rem, 7vw, 2.5rem);
  }
  .workshops__cta {
    margin-top: clamp(1.5rem, 6vw, 2rem);
  }
}

/* ---- Anmeldeformular (workshops.html + Detailseite) ----
   Gleiche Feld-Optik wie .contact-section__form (schlichte Unterstrich-
   Inputs statt umrandeter Boxen). Auf workshops.html steckt es in
   einer eigenen, umrandeten Karte (gleiche Sprache wie
   .contact-section__form-wrap); auf der Detailseite eines einzelnen
   Workshops (workshops/workshop.html) ist der Workshop schon fix
   vorausgewählt, daher dort ohne das Auswahlfeld. */
.workshops__form-wrap {
  border: 1px solid var(--gold-500);
  padding: clamp(1.75rem, 3.5vw, 2.5rem);
  max-width: 30rem;
  margin: clamp(2rem, 5vw, 3rem) auto 0;
}

.workshops__form {
  display: flex;
  flex-direction: column;
  gap: 1.5rem;
  text-align: left;
}

.workshops__form-field {
  display: flex;
  flex-direction: column;
  gap: 0.4rem;
}

.workshops__form-field label {
  font-family: var(--font-mono);
  font-weight: 700;
  font-size: 0.75rem;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--gold-700);
}

.workshops__form-field input,
.workshops__form-field select {
  font-family: var(--font-body);
  font-size: 1rem;
  color: var(--ink);
  background: transparent;
  border: none;
  border-bottom: 1px solid var(--gold-500);
  padding-block: 0.5rem;
  /* KORREKTUR (23.09.2026, auf Wunsch: "Auswahl-Button sieht nicht
     richtig aus, außerhalb eines kreisrunden Containers, Container
     weglassen") – das war die native, browsereigene Dropdown-Pfeil-
     Darstellung (v.a. auf iOS als kleiner, unpassend wirkender Kreis
     gerendert), nicht etwas, das hier im CSS gesetzt war. appearance:none
     nimmt dem Browser diese Eigendarstellung komplett weg, ein eigener,
     schlichter Pfeil (SVG als Hintergrundbild) ersetzt sie – sieht
     dadurch auf jedem Gerät/Browser gleich und bewusst gestaltet aus. */
  appearance: none;
  -webkit-appearance: none;
  padding-right: 1.75rem;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='none' stroke='%23C79A4B' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round' d='M3 6l5 5 5-5'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 0.1rem center;
  background-size: 0.9rem;
  border-radius: 0;
}

.workshops__form-field input:focus-visible,
.workshops__form-field select:focus-visible {
  border-bottom-color: var(--ink);
}

.workshops__form-submit {
  align-self: center;
  margin-top: 0.5rem;
}

.workshops__form-msg {
  font-size: 1rem;
  text-align: center;
  min-height: 1.5em;
}

.workshops__form-msg.is-ok { color: var(--gold-700); }
.workshops__form-msg.is-error { color: var(--espresso); }

/* ---------- Kundenstimmen (kein eigener Baustein, nutzt Tokens) ----------
   Cream zwischen Workshops (Cream) und Kontakt (Greige) – baut auf dem
   bereits bestehenden Doppel-Cream-Muster auf (wie Formate/Über mich)
   und sorgt für einen sauberen Übergang ins Greige von Kontakt danach.
   Eigenes Motiv statt Wiederverwendung des Fuerwen-Kartenstapels:
   überdimensionales Anführungszeichen statt Neigung/Überlappung, damit
   sich die Section nicht wie eine Kopie von "Hier ist Platz für dich"
   anfühlt. */

.testimonials {
  position: relative; /* Ankerpunkt für .ambient-gold, siehe Dateiende */
  isolation: isolate; /* eigener Stapelkontext, damit .ambient-gold (z-index:-1) zuverlaessig hinter dem Text bleibt statt hinter den Section-Hintergrund zu rutschen */
  background: var(--surface-a);
  padding-block: var(--space-section-y);
  padding-inline: var(--space-section-x);
}

.testimonials__intro {
  max-width: 40rem;
  margin-inline: auto;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.6rem;
}

.testimonials__heading {
  font-size: var(--step-titel);
}

.testimonials__row {
  max-width: var(--container-max);
  margin-inline: auto;
  margin-top: clamp(2.5rem, 6vw, 4rem);
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: clamp(1.5rem, 4vw, 2.5rem);
}

/* Linksbündig als bewusste Ausnahme vom sonst zentrierten Seitentext –
   das überdimensionale Anführungszeichen sitzt oben links in der Karte,
   zentrierter Text würde daneben schräg/unausgewogen wirken. */
.testimonials__card {
  position: relative;
  /* Deutlich leiser als vorher (war border-color: var(--gold-500) in
     voller Sättigung) – 14.09.2026, großer Umbau: bei drei Karten
     nebeneinander wirkte ein kräftiger Gold-Rahmen um jede einzelne wie
     zu viel Gold auf einmal. Das goldene Anführungszeichen (::before,
     schon vorher nur 35% Deckkraft) bleibt der einzige Gold-Akzent
     dieser Karte. */
  border: 1px solid color-mix(in srgb, var(--gold-500) 35%, transparent);
  padding: clamp(2.25rem, 5vw, 3rem) clamp(1.5rem, 3vw, 2rem) clamp(1.5rem, 3vw, 2rem);
  text-align: left;
  /* Flex-Spalte statt normalem Fluss (12.09.2026 auf Wunsch: "alle
     Namen auf einer Höhe") – .testimonials__row lässt die drei Karten
     per Grid-Default (align-items:stretch) schon gleich hoch werden,
     margin-top:auto auf .testimonials__author schiebt den Namen dann
     in jeder Karte konsequent ganz nach unten, unabhängig davon, wie
     lang das jeweilige Zitat ist. */
  display: flex;
  flex-direction: column;
}

.testimonials__card::before {
  content: "\201C";
  position: absolute;
  top: 0.1em;
  left: 1.1rem;
  font-family: var(--font-display);
  font-size: 4.5rem;
  line-height: 1;
  color: var(--gold-500);
  opacity: 0.35;
  pointer-events: none;
}

/* QUALITY-VARIANTE: echte Kursive (Instrument Serif italic) statt reinem
   Aufrecht – klassische Zitat-Optik, dazu eine etwas großzügigere
   Lesegröße. */
.testimonials__quote {
  font-family: var(--font-display);
  font-style: italic;
  font-size: clamp(1.15rem, 1.6vw, 1.35rem);
  line-height: 1.6;
}

/* Abstand nur zwischen mehreren Absätzen eines mehrteiligen Zitats
   (wie der ersten echten Bewertung) – bei einzeiligen Platzhaltern
   ohne Wirkung. */
.testimonials__quote + .testimonials__quote {
  margin-top: 0.75rem;
}

.testimonials__author {
  /* margin-top:auto schiebt den Namen an den unteren Rand der (gleich
     hohen) Karte, padding-top hält den Mindestabstand zum Zitat davor
     auch dann ein, wenn margin:auto in kurzen Karten kaum Raum hat. */
  margin-top: auto;
  padding-top: 1.25rem;
  font-family: var(--font-mono);
  font-weight: 700;
  font-style: normal;
  font-size: 0.8125rem;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--gold-700);
}

/* Welliger Strich vor dem Namen statt nacktem Text (12.09.2026 auf
   Wunsch) – als ::before statt im HTML, damit er nicht Teil des
   eigentlichen Namens (z.B. für Screenreader) wird. */
.testimonials__author::before {
  content: "〜 ";
}

@media (max-width: 900px) {
  .testimonials__row {
    grid-template-columns: 1fr;
    max-width: 34rem;
  }
}

/* Handy: keine gestapelten Karten mehr, sondern ein Klick-Karussell –
   immer eine Karte sichtbar, NUR per Pfeil-Buttons darunter wechseln
   (siehe .carousel-nav), bewusst nicht mit dem Finger wischbar.
   overflow-x:hidden blockiert Touch-/Wisch-Scrolling komplett, lässt
   aber programmatisches Scrollen (track.scrollBy(...) in js/main.js,
   von den Pfeil-Buttons ausgelöst) unangetastet – das funktioniert
   unabhängig vom overflow-Wert weiter. touch-action:pan-y verhindert
   zusätzlich, dass der Browser ein horizontales Wisch-Gesture auf dem
   Track überhaupt erst als Scroll-Versuch interpretiert (vertikales
   Scrollen der Seite bleibt an der Stelle trotzdem möglich). */
@media (max-width: 700px) {
  .testimonials__row {
    grid-template-columns: none;
    grid-auto-flow: column;
    /* War 84% (12.09.2026), auf Wunsch (20.09.2026, Mobile-Polish-Runde:
       "Container um die Kundenstimmen weg... dann können die breiter
       sein und das ist nicht so eng") auf fast volle Breite erhöht –
       ohne Rahmen/Karten-Optik (siehe .testimonials__card unten) muss
       hier auch kein Nachbar-Rand mehr sichtbar durchlugen. */
    grid-auto-columns: 96%;
    max-width: none;
    margin-top: clamp(1.75rem, 7vw, 2.5rem);
    overflow-x: hidden;
    touch-action: pan-y;
    scroll-snap-type: x mandatory;
    scrollbar-width: none;
  }
  .testimonials__row::-webkit-scrollbar {
    display: none;
  }
  /* Alle Karten bleiben immer gleich groß (kein Skalieren mehr von
     klein auf groß beim Wechseln) – die Nachbarkarten lugen einfach
     nur an den Rändern rein/raus, während man weiterklickt/wischt.
     .is-active wird zwar weiterhin per IntersectionObserver gesetzt
     (js/main.js), hat hier aber bewusst keine eigene Optik mehr. */
  .testimonials__card {
    scroll-snap-align: center;
    /* War clamp(2.25rem,5vw,3rem) oben / clamp(1.5rem,3vw,2rem) Seiten
       (Desktop-Werte, für drei Karten NEBENEINANDER gedacht) – auf
       Handy steht immer nur eine Karte allein im Karussell, das große
       Innenpolster machte sie unnötig hoch (Mobile-Polish-Runde,
       20.09.2026, "Testimonial-Bereich vereinfachen"). Kein Seiten-Padding
       mehr (siehe border:none direkt darunter) – der Text nutzt jetzt
       die volle Kartenbreite (96% der Section, siehe .testimonials__row),
       nur oben/unten noch etwas Luft fürs Anführungszeichen/den Namen. */
    padding: 2rem 0 1.5rem;
    /* Kein Rahmen mehr (20.09.2026, auf Wunsch: "Container um die
       Kundenstimmen weg... keine Umrandungen und mehr Breite") – das
       Zitat steht jetzt direkt auf dem Section-Hintergrund (--surface-a,
       Cream), nur das goldene Anführungszeichen und der welligen Strich
       vorm Namen markieren noch, dass es ein Zitat ist. Ab 701px
       unverändert mit Rahmen (dort stehen drei Karten nebeneinander,
       wo die Abgrenzung tatsächlich Orientierung gibt). */
    border: none;
  }
  /* Nur ein kleines bisschen größer (20.09.2026, auf Wunsch) – war
     clamp(1.15rem,1.6vw,1.35rem), der vw-Anteil greift auf Handy kaum,
     blieb dadurch praktisch immer bei 1.15rem hängen. */
  .testimonials__quote {
    font-size: 1.25rem;
  }
  .testimonials__card::before {
    /* War 4.5rem – auf der schmaleren Karussell-Karte wirkte das
       Anführungszeichen überproportional groß. */
    font-size: 3.25rem;
    left: 0;
  }
}

/* ---------- Instagram-Section (kein eigener Baustein, nutzt Tokens) ----------
   Cream nach dem Greige der Kontakt-Section davor – reicht als Wechsel,
   wie schon zwischen "Hier ist Platz für dich" und "Die drei Formate"
   (kein eigener Trennstrich nötig). Kacheln sind Platzhalter im
   gleichen Streifenmuster wie .placeholder-block, bis echte Posts
   oder ein Embed eingebunden werden. */

.instagram {
  position: relative; /* Ankerpunkt für .ambient-gold, siehe Dateiende */
  isolation: isolate; /* eigener Stapelkontext, damit .ambient-gold (z-index:-1) zuverlaessig hinter dem Text bleibt statt hinter den Section-Hintergrund zu rutschen */
  padding-block: var(--space-section-y);
  padding-inline: var(--space-section-x);
  /* War --surface-b – seit .podcast-banner davor auf Wunsch (24.09.2026)
     komplett auf ueber-mich.html umgezogen ist, folgt #instagram jetzt
     direkt auf #kontakt (Greige) – zurück auf Cream für die site-weite
     Abwechseln-Regel. */
  background: var(--surface-a);
}

.instagram__heading {
  font-size: var(--step-titel);
  margin-top: 0.75rem;
}

.instagram__lead {
  /* War 1.0625rem (die Fließtext-Größe) statt --step-lead wie alle
     anderen *__lead-Absätze site-weit – jetzt vereinheitlicht. */
  font-size: var(--step-lead);
  max-width: 42ch;
  margin-inline: auto;
  margin-top: 0.75rem;
}

.instagram__grid {
  display: grid;
  grid-template-columns: repeat(5, 1fr);
  gap: 1rem;
  max-width: var(--container-max);
  margin-inline: auto;
  margin-top: clamp(2rem, 5vw, 3rem);
}

/* Jede Kachel ist jetzt in einen Link zum Profil gewrappt. */
.instagram__tile-link {
  display: block;
}

/* Das Duplikat-Set fürs mobile Marquee (siehe @media 700px) bleibt am
   Desktop/Tablet unsichtbar und nimmt keinen Grid-Platz ein – sonst
   stünden zehn statt fünf Kacheln im 5er-Grid. */
.instagram__tile-link[aria-hidden="true"] {
  display: none;
}

.instagram__tile {
  display: block;
  width: 100%;
  aspect-ratio: 3 / 4;
  object-fit: cover;
  border-radius: 0;
  transition: opacity 0.2s ease;
}

.instagram__tile-link:hover .instagram__tile { opacity: 0.85; }

@media (prefers-reduced-motion: reduce) {
  .instagram__tile { transition: none; }
}

/* War mal Icon + eigener .btn--primary-Textbutton nebeneinander – der
   Textbutton ist am 16.09.2026 auf Wunsch komplett entfernt ("nur noch
   der Button mit dem Insta-Logo"), Mobile hatte das ohnehin schon immer
   so gehandhabt. .instagram__cta-row bleibt als Wrapper stehen (Abstand
   nach oben zum Grid), enthält jetzt aber nur noch das eine
   Icon-Element; die Insta-Markenfarben stecken komplett im kleinen
   Logo-Icon (.instagram__cta-icon, Verlauf per SVG-<defs> oben im
   Markup). */
.instagram__cta-row {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 1rem;
  margin-top: clamp(1.5rem, 4vw, 2.5rem);
}

.instagram__cta-icon-link {
  display: inline-flex;
  width: 2.75rem;
  height: 2.75rem;
  border-radius: 50%;
  border: 1px solid var(--gold-500);
  align-items: center;
  justify-content: center;
  transition: transform 0.2s ease, opacity 0.2s ease;
}

.instagram__cta-icon-link:hover {
  transform: translateY(-1px);
  opacity: 0.85;
}

.instagram__cta-icon {
  width: 1.4rem;
  height: 1.4rem;
}

@media (prefers-reduced-motion: reduce) {
  .instagram__cta-icon-link { transition: none; }
  .instagram__cta-icon-link:hover { transform: none; }
}

/* Handy: kompletter Neubau als reiner CSS-Endlos-Marquee statt des
   früheren Klick-Karussells (Scroll-Position messen/springen, aktive
   Kachel per IntersectionObserver, Klick musste erst zentrieren bevor
   der Link durchging – insgesamt fehleranfällig, blieb auf manchen
   Geräten hängen). Jetzt: reine transform-Animation, die den Track um
   exakt die Breite EINES Kachel-Satzes verschiebt (50%, da der Track
   das Duplikat-Set direkt im Markup enthält, siehe index.html) – an
   der Zielposition steht wieder exakt dasselbe Bild, der Sprung ist
   unsichtbar. Kein JS, kein scrollLeft, kein Zustand, der kaputtgehen
   kann. Jede Kachel bleibt ein ganz normaler <a href>, tippen navigiert
   sofort und zuverlässig – alle Kacheln zeigen ohnehin aufs selbe
   Profil, "welche Kachel genau aktiv/zentriert ist" spielt daher keine
   Rolle mehr. */
@media (max-width: 700px) {
  /* Der Track (.instagram__grid) enthält für den nahtlosen Loop absichtlich
     ein zweites, unsichtbares Kachel-Set und ist dadurch fast doppelt so
     breit wie der Viewport (width: max-content). Ohne diesen Clip hier an
     der Section reicht die überschüssige Breite bis zum <body> durch – das
     dort gesetzte overflow-x:clip greift nicht zuverlässig auf das
     Viewport-Scrollverhalten, die ganze Seite ließ sich dadurch weit nach
     rechts wegscrollen (v.a. auf Touch-Geräten spürbar). */
  .instagram {
    overflow-x: hidden;
  }
  .instagram__grid {
    /* Kachelbreite + Abstand als Variablen, damit die Loop-Distanz
       unten per calc() exakt aus denselben Werten berechnet wird –
       -50% der Box-Breite war nicht zuverlässig (die vom Browser
       berechnete max-content-Breite eines Flex-Containers zählt den
       Randabstand der letzten Kachel nicht konsequent mit, dadurch
       lag die Sprungstelle immer ein paar Pixel daneben). */
    --insta-tile-w: min(52vw, 13.5rem);
    --insta-tile-gap: 0.85rem;
    display: flex;
    grid-template-columns: none;
    gap: 0;
    width: max-content;
    margin-inline: 0;
    animation: instagram-marquee 32s linear infinite;
  }
  /* Antippen/Gedrückthalten pausiert kurz zum genauer Hinschauen,
     ohne dass man dafür extra Buttons braucht. */
  .instagram__grid:hover,
  .instagram__grid:active {
    animation-play-state: paused;
  }
  .instagram__tile-link,
  .instagram__tile-link[aria-hidden="true"] {
    display: block;
    flex: none;
    width: var(--insta-tile-w);
    margin-right: var(--insta-tile-gap);
  }
  .instagram__tile {
    aspect-ratio: 4 / 5;
  }
}

/* Verschiebt exakt um die Breite der 5 echten Kacheln (inkl. ihres
   Abstands) – an der Zielposition beginnt lückenlos das Duplikat-Set,
   siehe Variablen oben in .instagram__grid. */
@keyframes instagram-marquee {
  from { transform: translateX(0); }
  to { transform: translateX(calc(-5 * (var(--insta-tile-w) + var(--insta-tile-gap)))); }
}

/* Ohne Bewegung: kein Auto-Scroll, dafür ganz normal von Hand
   scrollbar (das unsichtbare Duplikat-Set bleibt dabei ausgeblendet,
   sonst gäbe es doppelt so viel – nicht erreichbare – Scroll-Strecke). */
@media (max-width: 700px) and (prefers-reduced-motion: reduce) {
  .instagram__grid {
    animation: none;
    overflow-x: auto;
    scroll-snap-type: x mandatory;
    scrollbar-width: none;
  }
  .instagram__grid::-webkit-scrollbar {
    display: none;
  }
  .instagram__tile-link[aria-hidden="true"] {
    display: none;
  }
  .instagram__tile-link {
    scroll-snap-align: center;
  }
  .instagram__tile {
    transition: none;
  }
}

/* ---------- Podcast-Banner (eigene Section, index.html) ----------
   3. Überarbeitung (13.09.2026): Bild links/Text rechts als Grid statt
   Flex-Reihe, Text deutlich breiter (kein 60ch-Deckel mehr) – bricht
   dadurch in weniger Zeilen um, der Block wird insgesamt niedriger.
   War Greige (--surface-b), auf Cream umgeschaltet, weil "Folge mir
   auf Instagram" direkt danach jetzt seinerseits Greige ist (site-weite
   Abwechseln-Regel, 13.09.2026 auf Wunsch) – die beiden bleiben damit
   weiterhin klar unterscheidbar, nur mit vertauschten Farben. Die
   Gold-Linie oben bleibt trotzdem (gleiche Konvention wie
   .bio-section/.portrait-split/.ablauf). Text wieder mittig gebunden
   statt linksbündig, wie der Rest der Seite. CTA ist ein normaler
   .btn--primary (siehe oben in dieser Datei) – der dortige Hover
   (transform/opacity, mit prefers-reduced-motion-Override) gilt hier
   automatisch mit, keine eigene Regel/kein JS nötig. */
/* QUALITY-VARIANTE (19.09.2026, auf Wunsch: "Banner dünner, Bild nur
   noch kleiner Platzhalter, daneben kurze Überschrift + ein Satz +
   Spotify-Button, mehr nicht, sehr clean"): aus der zentrierten,
   fünfzeiligen Textsäule (Kicker/Titel/Autor/Absatz/Hinweis) wird eine
   einzeilige, linksbündige Reihe – Cover links, Überschrift+Satz in
   der Mitte, Button rechts. padding-block deutlich reduziert, dadurch
   spürbar dünner als vorher. */
.podcast-banner {
  background: var(--surface-a);
  --surface: var(--surface-a);
  border-top: 1px solid var(--gold-500);
  padding-block: clamp(1.25rem, 2.5vw, 1.75rem);
  padding-inline: var(--space-section-x);
}

/* QUALITY-VARIANTE (20.09.2026, auf Wunsch: "am Desktop etwas höher,
   nur ein kleines bisschen, Bild deutlich größer"): nur Desktop/Tablet
   – am Handy bleibt das ganz dünne Banner von gestern unverändert
   (eigene, feste Werte in der @media max-width:700px-Regel weiter
   unten, davon unberührt). */
@media (min-width: 701px) {
  .podcast-banner {
    padding-block: clamp(1.75rem, 3.5vw, 2.5rem);
  }
}

/* QUALITY-VARIANTE (19.09.2026, auf Wunsch: "Podcast-Banner in der
   Desktop-Version enger zusammen und in der Mitte"): war "auto 1fr
   auto" – die mittlere 1fr-Spalte zog auf breiten Screens (bis
   --container-max, 1440px) den ganzen freien Platz zwischen Textblock
   (der ohnehin nur bis 52ch/.podcast-banner__text breit wird) und
   Button auseinander, der Button landete weit rechts isoliert. Jetzt
   alle drei Spalten content-breit ("auto") plus justify-content:center
   – Cover/Text/Button rücken zu einer kompakten, mittig stehenden
   Gruppe zusammen, unabhängig von der Fensterbreite. Nur Desktop/
   Tablet (≥701px), die Handy-Regel weiter unten bleibt unverändert. */
/* 2 statt 3 Spalten (02.10.2026, Audio-Player ergänzt): Der Spotify-
   Button ist aus der eigenen dritten Spalte in .podcast-banner__body
   gewandert (jetzt kleinerer Zweitlink unter dem neuen Player, siehe
   .podcast-banner__spotify) – align-items:stretch (02.10.2026, 2.
   Runde, auf Wunsch: "Bild mittig und deutlich größer, so hoch wie
   die ganze Spalte"), damit Cover und Textblock exakt dieselbe Höhe
   bekommen (Zeilenhöhe der Grid-Row = höheres Element) und dadurch
   automatisch vertikal zueinander zentriert wirken, statt oben
   bündig. Nur Desktop/Tablet – die Handy-Regel weiter unten bleibt
   mit fester, kleiner Cover-Breite unberührt. */
.podcast-banner__inner {
  display: grid;
  grid-template-columns: auto auto;
  justify-content: center;
  align-items: stretch;
  row-gap: clamp(1.25rem, 3vw, 2rem);
  column-gap: clamp(1.25rem, 3vw, 2rem);
  max-width: var(--container-max);
  margin-inline: auto;
}

/* Mehr Luft zwischen Cover und Textspalte (03.10.2026, auf Wunsch:
   "nicht so krass eng aneinander gepresst") – eigene, größere
   column-gap nur ab 701px (Mobile behält den schmaleren Abstand von
   oben unverändert, row-gap bleibt dort ebenfalls unangetastet). */
@media (min-width: 701px) {
  .podcast-banner__inner {
    column-gap: clamp(2.25rem, 5vw, 3.5rem);
  }
}

/* Echtes Podcast-Cover (25.09.2026, ersetzt das selbst gezeichnete
   Mikrofon-Icon-Platzhalter-<span> von vorher, siehe Git-Historie) –
   wieder ein normales <img>, object-fit:cover statt der vorherigen
   Flex-Zentrierung eines kleineren SVG-Icons. Höhe statt Breite
   vorgegeben (02.10.2026, 2. Runde, auf Wunsch: "deutlich größer,
   ungefähr so hoch wie die ganze Datei/Spalte") – height:100% füllt
   die durch align-items:stretch gleich hohe Grid-Zelle komplett aus,
   aspect-ratio hält das Cover quadratisch, die Breite ergibt sich
   daraus automatisch. max-width verhindert ein zu breites Bild, falls
   der Textblock durch wenig Inhalt mal ungewöhnlich hoch würde. Am
   Handy bleibt es klein (eigene, feste 56px in der
   @media max-width:700px-Regel weiter unten). */
.podcast-banner__cover {
  width: auto;
  height: 100%;
  max-width: 320px;
  aspect-ratio: 1 / 1;
  object-fit: cover;
  display: block;
}

.podcast-banner__body {
  display: flex;
  flex-direction: column;
  gap: 0.2rem;
  text-align: left;
  min-width: 0;
}

/* Spotify-Zweitlink (02.10.2026, siehe Kommentar in ueber-mich.html):
   bewusst kein .btn mehr (das war die Haupt-CTA-Rolle, die jetzt der
   Player übernimmt) – schlichter, kleinerer Textlink in Gold statt
   voller Button-Fläche. */
.podcast-banner__spotify {
  display: inline-block;
  margin-top: 0.6rem;
  color: var(--gold-700);
  font-family: var(--font-mono);
  font-size: 0.8rem;
  font-weight: 600;
  letter-spacing: 0.03em;
  text-decoration: underline;
  text-decoration-color: var(--gold-500);
  text-underline-offset: 3px;
}

.podcast-banner__spotify:hover {
  color: var(--gold-600);
}

/* font-family/-style/Farbe kommen von der h3-Regel in base.css
   (Instrument Serif kursiv, Espresso) – nur die Größe wird hier
   gedeckelt, damit die Überschrift wirklich "kurz und klein" bleibt
   statt wie eine vollwertige Section-Headline zu wirken. */
.podcast-banner__title {
  font-size: 1.2rem;
  line-height: 1.25;
  margin: 0;
}

.podcast-banner__text {
  color: var(--graubraun);
  font-size: 0.9375rem;
  max-width: 52ch;
  margin: 0;
}

/* ---------- Podcast-Player (02.10.2026 ergänzt) ----------
   Eigenes Steuerelement für die aus "video tonspur .mp4" extrahierte
   Audiodatei (audio/zu-gast-im-podcast.mp3), Logik in
   js/podcast-player.js. Gleiche runde Button-Sprache wie
   .carousel-nav__btn (Gold-Rahmen, transparent, auf Hover volle
   Gold-Fläche mit --ink-on-gold-Text/-Icon). */
.podcast-player {
  margin-top: 0.85rem;
  max-width: 52ch;
}

.podcast-player__controls {
  display: flex;
  align-items: center;
  gap: 0.6rem;
}

.podcast-player__btn {
  width: 2.25rem;
  height: 2.25rem;
  flex-shrink: 0;
  border-radius: 50%;
  border: 1px solid var(--gold-500);
  background: transparent;
  color: var(--gold-700);
  display: flex;
  align-items: center;
  justify-content: center;
  transition: background 0.2s ease, color 0.2s ease;
}

.podcast-player__btn:hover {
  background: var(--gold-500);
  color: var(--ink-on-gold);
}

.podcast-player__btn svg {
  width: 1.1rem;
  height: 1.1rem;
  fill: currentColor;
}

/* Play-/Pause-Icon-Umschalten (js/podcast-player.js): bewusst über eine
   Klasse auf dem Button statt über die svg.hidden-IDL-Property –
   anders als bei normalen HTML-Elementen spiegelt .hidden bei
   SVGElement das hidden-Attribut nicht zuverlässig (im Test blieb das
   Pause-Icon unsichtbar, obwohl Audio lief). */
.podcast-player__icon-pause {
  display: none;
}

.podcast-player__btn--play.is-playing .podcast-player__icon-play {
  display: none;
}

.podcast-player__btn--play.is-playing .podcast-player__icon-pause {
  display: block;
}

/* -10/+10: Text statt Icon (vermeidet ein überladenes "replay_10"-SVG),
   Zahlen in font-mono wie die übrigen kleinen Utility-Labels der
   Seite. Pille statt Kreis – "−10"/"+10" passt nicht verzerrungsfrei
   in einen 2.25rem-Kreis wie die reinen Icon-Buttons. */
.podcast-player__btn--skip {
  width: auto;
  min-width: 2.25rem;
  padding-inline: 0.5rem;
  border-radius: var(--radius-pill);
}

.podcast-player__btn--skip span {
  font-family: var(--font-mono);
  font-size: 0.7rem;
  font-weight: 600;
  letter-spacing: 0.01em;
}

/* Play/Pause ist die Hauptaktion, deshalb spürbar größer als die
   Nebenbuttons (Restart/±10) und mit voller Gold-Fläche statt nur
   Rahmen – gleiche Logik wie .btn--primary, nur rund. */
.podcast-player__btn--play {
  width: 2.75rem;
  height: 2.75rem;
  background: var(--gold-500);
  color: var(--ink-on-gold);
  border-color: var(--gold-500);
}

.podcast-player__btn--play:hover {
  background: var(--gold-600);
  border-color: var(--gold-600);
}

.podcast-player__btn--play svg {
  width: 1.2rem;
  height: 1.2rem;
}

.podcast-player__scrub {
  display: flex;
  align-items: center;
  gap: 0.6rem;
  margin-top: 0.6rem;
}

.podcast-player__time {
  font-family: var(--font-mono);
  font-size: 0.75rem;
  color: var(--graubraun);
  flex-shrink: 0;
  min-width: 2.6em;
}

.podcast-player__time:last-child {
  text-align: right;
}

/* Eigener Scrubber statt des sehr unterschiedlich gerenderten
   Browser-Standards (Chrome/Safari/Firefox zeichnen input[type=range]
   komplett verschieden) – Spur in Gold-soft, gefüllter Teil + Thumb in
   Gold-500, dieselbe Palette wie der Rest des Players. */
.podcast-player__range {
  flex: 1;
  -webkit-appearance: none;
  appearance: none;
  height: 4px;
  border-radius: var(--radius-pill);
  background: var(--gold-soft);
  cursor: pointer;
}

.podcast-player__range::-webkit-slider-thumb {
  -webkit-appearance: none;
  appearance: none;
  width: 0.9rem;
  height: 0.9rem;
  border-radius: 50%;
  background: var(--gold-500);
  border: none;
  transition: background 0.2s ease;
}

.podcast-player__range::-moz-range-thumb {
  width: 0.9rem;
  height: 0.9rem;
  border-radius: 50%;
  background: var(--gold-500);
  border: none;
  transition: background 0.2s ease;
}

.podcast-player__range:hover::-webkit-slider-thumb {
  background: var(--gold-600);
}

.podcast-player__range:hover::-moz-range-thumb {
  background: var(--gold-600);
}

/* Handy-Neugestaltung (03.10.2026, auf Wunsch: "Bild oben, groß,
   darunter zentrierter Text – eine richtige, etwas höhere Section"):
   vorher zweispaltig (kleines 56px-Cover links, Text rechts), jetzt
   eine Spalte – Cover zuerst (= oben, dank DOM-Reihenfolge automatisch
   vor dem Textblock), groß, darunter der komplett zentrierte
   Textblock inkl. Player/Spotify-Link. Mehr padding-block sorgt für
   die gewünschte "höhere Section"-Wirkung statt des vorherigen ganz
   dünnen Banner-Streifens. */
@media (max-width: 700px) {
  .podcast-banner {
    padding-block: clamp(2.5rem, 11vw, 3.5rem);
  }
  .podcast-banner__inner {
    grid-template-columns: 1fr;
    justify-items: center;
    row-gap: 1.5rem;
  }
  .podcast-banner__cover {
    width: min(68vw, 260px);
    height: auto;
    max-width: none;
  }
  .podcast-banner__body {
    align-items: center;
    text-align: center;
  }
  /* Player streckt sich auf volle Breite der Textspalte (03.10.2026,
     auf Wunsch: "der Balken sieht so extrem klein aus") – ohne das
     schrumpft der Block in der zentrierten Flex-Spalte auf seinen
     schmalsten Inhalt (die Buttonreihe), der Scrubber darunter wurde
     dadurch nur ca. 130px statt der verfügbaren ~340px breit. */
  .podcast-player {
    width: 100%;
    max-width: 360px;
  }
  .podcast-player__controls {
    justify-content: center;
  }
}

/* ---------- Bio-Section (Unterseite ueber-mich.html) ----------
   Generischer Textblock-Baustein für mehrere aufeinanderfolgende
   Abschnitte einer Biografie-Seite (Geschichte, Werdegang, Haltung).
   Gleiche Linie-oben-Konvention wie .ablauf/#ueberblick, --alt
   schaltet auf Greige um für Abwechslung zwischen den Blöcken. */

.bio-section {
  position: relative;
  isolation: isolate; /* eigener Stapelkontext, damit .ambient-gold (z-index:-1) zuverlaessig hinter dem Text bleibt */
  border-top: 1px solid var(--gold-500);
  padding-block: var(--space-section-y);
  padding-inline: var(--space-section-x);
  /* --surface (28.09.2026) – kein eigenes background hier (zeigt die
     normale Seiten-Fläche/Cream durch), Buttons drin (.btn--primary/
     --outline) sollen trotzdem ihre Textfarbe daran ausrichten, siehe
     Kommentar bei .btn--primary. */
  --surface: var(--surface-a);
}

.bio-section--alt {
  background: var(--surface-b);
  --surface: var(--surface-b);
}

/* ---- Modifier: "Wie ich zu goldenroom yoga gekommen bin" (ueber-mich.html) ----
   Auf Wunsch (13.09.2026) deutlich breiterer Textblock als das sonst
   auf 44rem/58ch gedeckelte .bio-section__inner/.bio-section__text,
   plus Überschrift in einer Zeile statt Umbruch. Eigener Modifier statt
   einer globalen Änderung an den Basisklassen, weil die noch an
   anderen, bewusst schmaleren Stellen verwendet werden (FAQ auf
   kontakt.html, Preisliste auf formate.html, Abschluss-CTAs). */
.bio-section--story .bio-section__inner {
  max-width: 64rem;
}

.bio-section--story .bio-section__text {
  max-width: 88ch;
}

/* Bild links neben dem Text, nur Desktop (24.09.2026, auf Wunsch) – siehe
   .bio-section__media im HTML. Auf Handy/Tablet bleibt es ausgeblendet,
   das Bild sitzt dort weiterhin oben im .page-intro-Hero (siehe dort). */
.bio-section__media {
  display: none;
}

@media (min-width: 901px) {
  /* Umbruch statt nowrap (24.09.2026, mit dem Bild-links-Layout unten
     ergänzt): die Überschrift hatte hier bisher die volle, breite
     einspaltige Textbreite (bis 64rem) für sich – seit die Spalte durch
     das Bild links deutlich schmaler geworden ist, passt "Wie ich zu
     goldenroom yoga gekommen bin" nicht mehr in eine Zeile, ohne über
     das Bild zu laufen. */
  .bio-section--story h2 {
    white-space: normal;
  }

  /* BUGFIX (28.09.2026, 3. Korrektur, auf Wunsch: "links und rechts noch
     so ein bisschen Platz mit der Hintergrundfarbe, ganz komisch...
     macht den Container bis ganz an den Rand, dann einen weißen
     Container drüben, genau wie bei Fast 30 Jahre in Bewegung/
     Ausbildung und Qualifikation") – max-width/margin-inline saßen
     bisher direkt auf der <section> (.bio-section--story) selbst,
     dadurch füllte die --alt-Fläche (Greige) auf breiten Bildschirmen
     nur die mittleren var(--container-max)/1440px, links/rechts blieb
     die reine Seitenfläche (Cream) sichtbar – derselbe Bug wie bei
     .format-detail (siehe dort), nur hier noch nicht gefixt. Jetzt wie
     bei .format-detail: die <section> bleibt randlos (nur Hintergrund/
     Flex-Zentrierung), max-width wandert in einen neuen inneren
     Wrapper (.bio-section__row, siehe HTML). Der weiße Textkasten
     (28.09.2026, 2. Korrektur, entfernt: "Container um den Container")
     ist damit auch geklärt – das war eigentlich dieser Full-Bleed-Bug
     (zwei sichtbare Flächen op durch den Rand-Fehler), nicht das
     weiß-auf-Greige-Muster an sich (das nutzen Fast 30 Jahre in
     Bewegung/Ausbildung genauso, unbeanstandet) – Kasten kommt daher
     hier wieder zurück. */
  .bio-section--story {
    display: flex;
    align-items: center;
    justify-content: center;
  }

  .bio-section__row {
    display: flex;
    align-items: center;
    max-width: var(--container-max);
    margin-inline: auto;
    width: 100%;
  }

  .bio-section__media {
    display: block;
    flex: 0 0 30%;
    height: clamp(24rem, 42vw, 32rem);
    align-self: center;
  }

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

  .bio-section--story .bio-section__inner {
    flex: 1 1 auto;
    min-width: 0;
    min-height: calc(clamp(24rem, 42vw, 32rem) - 5rem);
    margin-inline: 0;
    background: var(--white);
    justify-content: center;
    align-items: flex-start;
    text-align: left;
    padding: clamp(2rem, 4vw, 3rem);
  }

  .bio-section--story .bio-section__text {
    text-align: left;
  }

  /* "Mehr lesen" jetzt auch auf Desktop (24.09.2026, auf Wunsch: "nicht
     den ganzen Text sehen, aber auf Mehr lesen klicken kann... nicht
     deine gekürzte Version" + "Container... höher als das Bild") –
     ersetzt die vorherige, umgeschriebene Kurzfassung: Kathrins
     Originaltext bleibt komplett unangetastet, nur weniger davon ist
     standardmäßig sichtbar, damit die Textbox zur Bildhöhe passt.
     .bio-section__second (der zweite Absatz "Der Wendepunkt") wird
     hier zusätzlich zu .bio-section__more standardmäßig ausgeblendet –
     eigene Regel statt Verschieben in den .bio-section__more-Container,
     weil dessen Klapplogik auf Handy/Tablet unverändert bleiben soll
     (dort sind beide ersten Absätze weiterhin immer sichtbar). :has()
     koppelt ihn an denselben Button-Klick wie .bio-section__more, ganz
     ohne zweiten Wrapper/zweite ID. */
  .bio-section--story .bio-section__second {
    display: none;
  }

  .bio-section--story .bio-section__inner:has(#bio-story-more.is-expanded) .bio-section__second {
    display: block;
  }

  .bio-section--story .bio-section__more {
    display: none;
  }

  .bio-section--story .bio-section__more.is-expanded {
    display: flex;
  }

  .bio-section--story .bio-section__toggle {
    display: inline-flex;
    background: none;
    border: none;
    padding: 0;
    cursor: pointer;
    font: inherit;
  }
}

/* "Weiterlesen"-Umschalter für .bio-section--story (17.09.2026 auf
   Wunsch: fünf Absätze waren auf kleinen Screens sehr viel Scroll-
   Strecke auf einmal – "kannst du kürzen"). Kathrins Text bleibt dabei
   komplett unangetastet, nur die anfängliche Ansicht auf Handy wird
   kürzer: die ersten zwei Absätze bleiben immer sichtbar, der Rest
   steckt in .bio-section__more und ist nur unter 701px per Default
   eingeklappt. Ab 701px (wie vorher) immer alles offen, Button dort
   unsichtbar. Collapse-Zustand kommt rein aus CSS, kein Aufflackern
   des vollen Texts vor dem JS-Start – main.js schaltet nur .is-expanded
   sowie aria-expanded um (siehe js/main.js). */
.bio-section__toggle {
  display: none;
}

/* BUGFIX (23.09.2026, auf Wunsch: "Abstände zwischen den
   Minitextabschnitten sind nicht gleich") – .bio-section__more war ein
   normaler Block-Container ohne eigenen Abstand zwischen seinen
   Absätzen, während die ersten beiden Absätze (direkte Kinder von
   .bio-section__inner, siehe dort) den flex-gap von 1.1rem
   bekommen – dadurch wirkten die Absätze INNERHALB von
   .bio-section__more enger zusammengedrängt als die davor. Jetzt
   derselbe flex+gap-Aufbau wie beim äußeren Container, dieselbe
   Abstandsgröße überall. */
.bio-section__more {
  display: flex;
  flex-direction: column;
  gap: 1.1rem;
}

@media (max-width: 700px) {
  .bio-section__more {
    display: none;
  }
  /* display:flex statt block (23.09.2026 Bugfix, siehe Basisregel
     oben) – sonst ginge beim Aufklappen auf Handy der flex-gap
     zwischen den Absätzen wieder verloren. */
  .bio-section__more.is-expanded {
    display: flex;
  }
  .bio-section__toggle {
    display: inline-flex;
    background: none;
    border: none;
    padding: 0;
    cursor: pointer;
    font: inherit;
  }
  /* Generell etwas kleiner (19.09.2026, auf Wunsch: "generell zu große
     Content-Schrift kleiner") – 1.1875rem trug auf Handy in mehrzeiligen
     Bio-/Qualifikations-Absätzen unnötig auf. */
  .bio-section__text {
    font-size: 1.0625rem;
  }
}

.bio-section__toggle-label--less {
  display: none;
}
.bio-section__toggle[aria-expanded='true'] .bio-section__toggle-label {
  display: none;
}
.bio-section__toggle[aria-expanded='true'] .bio-section__toggle-label--less {
  display: inline;
}

.bio-section__inner {
  max-width: 44rem;
  margin-inline: auto;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 1.1rem;
}

.bio-section__inner h2 {
  font-size: var(--step-titel);
}

.bio-section__text {
  font-size: 1.1875rem;
  max-width: 58ch;
}

/* Leitsätze als ruhige, große Zitat-Akzente – bewusst kein Kasten,
   kein Outline-Effekt wie beim Haupt-Motto auf der Startseite (das
   bleibt Priorität 1 und einzigartig), sondern schlichter kursiver
   Display-Text wie .hero__note, nur größer. */
/* QUALITY-VARIANTE: font-weight:400 statt 700 (Instrument Serif hat
   keinen echten Fett-Schnitt) plus font-style:italic – trägt die
   Betonung jetzt über die Kursive statt über ein synthetisiertes Fett. */
.bio-section__quote {
  font-family: var(--font-display);
  font-weight: 400;
  font-style: italic;
  font-size: clamp(1.6rem, 3.4vw, 2.5rem);
  /* --gold-600 gilt bei dieser Größe weiterhin als "großer Text"
     (WCAG-Schwelle 24px), 3,43:1 reichen dafür, siehe tokens.css. */
  color: var(--gold-600);
  max-width: 26ch;
  line-height: 1.3;
}

/* Qualifikationen/Lizenzen als dünn liniierte Liste, gleiche
   Trennlinien-Optik wie die Workshop-Terminliste. Linksbündig als
   bewusste Ausnahme vom sonst zentrierten Seitentext – bei einer
   Aufzählung von Fakten liest sich das klarer. */
.credentials {
  width: 100%;
  max-width: 34rem;
  margin-top: 0.5rem;
  text-align: left;
}

.credentials li {
  padding-block: 0.9rem;
  border-top: 1px solid var(--gold-500);
  font-size: 1.1875rem;
}

.credentials li:last-child {
  border-bottom: 1px solid var(--gold-500);
}

/* Kleiner + kompakter auf Handy (19.09.2026, auf Wunsch: "diese
   Auflistung der Fortbildungen... ist so hoch und breit und
   unförmig" / "generell zu große Content-Schrift kleiner") – die
   langen, zusammengesetzten Bezeichnungen (z.B. "200-Stunden-
   Yogalehrerinnen-Ausbildung, SAFS & BETA") brachen bei 1.1875rem in
   einer schmalen Spalte in unruhig unterschiedlich lange Zeilen um. */
@media (max-width: 700px) {
  /* MOBILE-POLISH (20.09.2026, auf Wunsch: "mittiggebunden") – .credentials
     ist site-weit als bewusste linksbündige Ausnahme angelegt (Basisregel
     oben), das passte zum vorher ebenfalls linksbündigen Desktop-Layout.
     Seit der Container-Entfernung bei .portrait-split__text (siehe
     Kommentar dort) steht der ganze Text drumherum auf Handy jetzt aber
     zentriert – nur die Liste stach dadurch als einzig linksbündiges
     Element hervor. Nur hier, nur mobil: Ab 701px (Desktop, "ist fertig")
     bleibt die Liste bei ihrer ursprünglichen Linksbündigkeit. */
  .credentials {
    text-align: center;
  }
  .credentials li {
    padding-block: 0.7rem;
    font-size: 1rem;
  }
}

.bio-section__cta {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 1.5rem;
  margin-top: 0.5rem;
}

/* ---------- Portrait-Split (Unterseite ueber-mich.html) ----------
   Zwei Container wie ein seitlich liegendes T: das Hochformat-Bild ist
   der durchgehende Balken (~30% Breite, volle Höhe), der breitere
   Textcontainer hängt mittig daran – ca. 2cm (5rem) niedriger, dadurch
   ragt das Bild oben/unten leicht über ihn hinaus. Beide Container
   liegen ohne Abstand direkt aneinander, damit es als eine
   durchgehende Form wirkt statt als zwei getrennte Karten. Der
   Textcontainer bekommt zusätzlich einen eigenen weißen Kasten
   (--white), der sich vom Cream/Greige-Hintergrund der Section abhebt
   – gleiche Idee wie bei .bio-section (Linie oben, --alt schaltet auf
   Greige), nur mit Bild statt reinem Fließtext.
   --reverse wechselt die Seite (Bild links statt rechts). */
.portrait-split {
  position: relative;
  isolation: isolate; /* eigener Stapelkontext, damit .ambient-gold (z-index:-1) zuverlaessig hinter dem Text bleibt */
  border-top: 1px solid var(--gold-500);
  padding-block: var(--space-section-y);
  padding-inline: var(--space-section-x);
}

.portrait-split--alt {
  background: var(--surface-b);
}

.portrait-split__inner {
  max-width: var(--container-max);
  margin-inline: auto;
  display: flex;
  align-items: center;
}

.portrait-split__text { order: 1; }
.portrait-split__media { order: 2; }

/* --reverse: Bild links statt rechts. DOM-Reihenfolge bleibt
   Text-zuerst (Tab-/Screenreader-Reihenfolge, gleiche Konvention wie
   .split--a/.split--b weiter oben), nur die visuelle Reihenfolge
   dreht sich um. */
.portrait-split--reverse .portrait-split__text { order: 2; }
.portrait-split--reverse .portrait-split__media { order: 1; }

.portrait-split__media {
  flex: 0 0 30%;
  height: clamp(24rem, 42vw, 32rem);
  align-self: center;
}

.portrait-split__media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  border-radius: 0;
}


.portrait-split__text {
  flex: 1;
  /* ~2cm (5rem) niedriger als .portrait-split__media, siehe Kommentar oben */
  min-height: calc(clamp(24rem, 42vw, 32rem) - 5rem);
  background: var(--white);
  display: flex;
  flex-direction: column;
  justify-content: center;
  padding: clamp(2rem, 4vw, 3rem);
  text-align: left; /* bewusste Ausnahme, wie .credentials/.price-list */
}

.portrait-split__text .eyebrow { margin-bottom: 0.5rem; }
/* BUGFIX (23.09.2026, auf Wunsch: "Section-Überschriften sollen alle
   gleich groß sein, z.B. 'Fast 30 Jahre in Bewegung' ist nicht so groß
   wie andere") – font-size fehlte hier komplett, dadurch griff nur die
   Browser-Standardgröße statt --step-titel wie bei jeder anderen
   Section-Überschrift der Seite. Betrifft alle .portrait-split-
   Vorkommen (index.html, mein-yoga.html, ueber-mich.html). */
.portrait-split__text h2 { font-size: var(--step-titel); margin-bottom: 0.75rem; }
.portrait-split__text .bio-section__text + .bio-section__text { margin-top: 0.75rem; }
.portrait-split__text .bio-section__quote + .bio-section__quote { margin-top: 0.4rem; }
.portrait-split__text .bio-section__text { margin-top: 0.75rem; }
.portrait-split__text .credentials { margin-top: 0.75rem; }
/* Etwas mehr Luft über dem Link (23.09.2026 auf Wunsch, z.B. "Mehr zu
   meiner Methodik" in der "Lauschen statt Leisten"-Section) – vorher
   kein eigener Abstand, der Link hing direkt am Text davor. */
.portrait-split__text .link-arrow { margin-top: 1.25rem; }

@media (max-width: 900px) {
  .portrait-split__inner {
    flex-direction: column;
    align-items: stretch;
    /* Ersetzt den Abstand, den vorher .portrait-split__text' eigenes
       Padding lieferte (siehe Kommentar dort) – jetzt, wo das weg ist,
       braucht der gestapelte Aufbau seinen eigenen Zwischenraum. */
    gap: 1.5rem;
  }
  .portrait-split__media {
    flex: none;
    width: 100%;
    height: auto;
    aspect-ratio: 4 / 5;
    order: -1; /* Bild rutscht mobil immer nach oben, Text-DOM-Reihenfolge bleibt aber Text-zuerst */
  }
  /* MOBILE-POLISH (20.09.2026, 2. Korrektur, auf Wunsch: "das gibt es
     bei ganz vielen Sachen... Fast 30 Jahre in Bewegung, Ausbildung und
     Qualifikationen, Lauschen statt Leisten, das ist überall"): Diese
     EINE Klasse steckt hinter allen genannten Beispielen (.portrait-split
     wird auf index.html 1×, ueber-mich.html 2× und mein-yoga.html 4×
     verwendet, siehe HTML) – der Textblock stand bisher IMMER in Weiß
     (--white, Basisregel oben), unabhängig davon, ob die Section selbst
     Cream oder Greige (--alt) ist. Auf Handy jetzt kein eigener
     Hintergrund/Innenabstand mehr: der Text steht direkt auf der
     Section-eigenen Fläche, exakt wie im Rest der Seite. Ab 901px
     unverändert (dort bleibt es bewusst die weiße Karte neben dem Bild,
     "Desktop ist fertig"). */
  .portrait-split__text {
    order: 2;
    min-height: 0;
    align-items: center;
    text-align: center;
    background: transparent;
    padding: 0;
  }
  /* --compact (19.09.2026, auf Wunsch: "über mich Unterseite... Bilder
     zu riesig") – bisher lief jedes .portrait-split__media-Bild auf
     Handy immer volle Breite (siehe oben). Auf ueber-mich.html stehen
     gleich zwei davon direkt hintereinander (Fast 30 Jahre in
     Bewegung / Ausbildung & Qualifikationen), jedes davon nochmal
     zusätzlich zum großen Aufmacherfoto oben in .page-intro – dadurch
     wirkte die Seite auf Handy sehr bildlastig/lang. --compact
     schrumpft das Bild auf ~60% Breite und ein ruhigeres 1:1-Format
     statt 4:5, nur für diese Instanz (index.html/mein-yoga.html
     bleiben bei voller Breite). */
  /* KORREKTUR (22.09.2026, auf Wunsch: "über mich... Bilder, die quer
     sind, nicht so hoch"): war 60% Breite im ruhigen 1:1-Format (siehe
     Kommentar oben) – jetzt volle Breite in einem deutlichen
     Querformat (16:10), passend zum gleichen Umbau bei
     .page-intro__portrait weiter oben auf derselben Seite. object-
     position je Foto einzeln (per Dateiname statt neuer Modifier-
     Klasse, beide Fotos teilen sich sonst dieselbe --compact-Regel):
     IMG_3567 (Lavendel riechen) hat Kathrins Gesicht rechts oben im
     Bild, IMG_3578 (Herz-Geste im Lavendelfeld) steht mittig mit viel
     Himmel/Feld drumherum. */
  .portrait-split--compact .portrait-split__media {
    width: 100%;
    margin-inline: 0;
    aspect-ratio: 16 / 10;
  }
  /* KORREKTUR (23.09.2026, auf Wunsch: "man sieht ihr Gesicht immer
     noch nicht, viel zu hoch angesetzt") – war 22% (stark oben, zeigte
     vor allem Himmel/Bäume), jetzt deutlich weiter unten, wo ihr
     Gesicht im Bild tatsächlich sitzt. */
  .portrait-split--compact img[src*="IMG_3567"] {
    object-position: 68% 68%;
  }
  .portrait-split--compact img[src*="IMG_3578"] {
    object-position: 50% 42%;
  }
  /* IMG_3238.jpeg (24.09.2026, "Fast 30 Jahre in Bewegung", auf Wunsch:
     "ihr Kopf ist unten etwas abgeschnitten... zeig mehr von unten") –
     ohne eigene Regel lief das Bild auf der Standard-Mitte (50%/50%),
     ihr Kopf sitzt im Foto aber in der unteren Bildhälfte. Deutlich
     höherer Y-Wert zeigt mehr vom unteren Bildbereich statt ihn
     wegzuschneiden. */
  .portrait-split--compact img[src*="IMG_3238"] {
    object-position: 50% 80%;
  }
}

/* --wide (22.09.2026, auf Wunsch: "Deine innere Landkarte"/"Mehr als
   Bewegung"[mein-yoga.html] Bilder, die quer sind, nicht so hoch") –
   eigener Modifier statt die .portrait-split__media-Basisregel
   anzufassen: .portrait-split wird auf mein-yoga.html noch für eine
   dritte Section ("Sicherheit ist mehr als Wissen") verwendet, die hier
   ausdrücklich NICHT gemeint war (reales Kathrin-Foto, kein Stockfoto-
   Ersatzkandidat) – nur die beiden markierten Sections (siehe
   mein-yoga.html) bekommen den Querformat-Zuschnitt. */
@media (max-width: 900px) {
  .portrait-split--wide .portrait-split__media {
    aspect-ratio: 16 / 9;
  }
  /* IMG_3888.jpeg: Klangschale mit Lichtreflexen, Motiv leicht rechts
     der Mitte. */
  .portrait-split--wide img[src*="IMG_3888"] {
    object-position: 58% 50%;
  }
  /* "bild neuer raum 1.jpeg": Dachbalken/Fenster oben im Bild, unten
     v.a. leerer Boden – Zuschnitt näher an der oberen Bildhälfte. */
  .portrait-split--wide img[src*="bild neuer raum 1"] {
    object-position: 50% 28%;
  }
  /* "photo-output-2.jpeg": Hochformat-Foto, die beiden scharfen
     Fußabdrücke mit Lichtreflex liegen in der unteren Bildhälfte, oben
     nur verblassende Spuren Richtung Horizont – Zuschnitt nach unten
     verschoben, damit die deutlichen Abdrücke im schmalen 16:9-Streifen
     bleiben. */
  .portrait-split--wide img[src*="photo-output-2"] {
    object-position: 45% 62%;
  }
  /* "Steinturm.jpg": Steinstapel leicht links der Mitte, Schatten fällt
     weiter nach links aus – Zuschnitt etwas nach rechts und leicht nach
     oben, damit der oberste Stein im schmalen 16:9-Streifen mittig
     bleibt statt an den Bildrand zu rücken. */
  .portrait-split--wide img[src*="Steinturm"] {
    object-position: 58% 42%;
  }
  /* "insta herz.jpg": quadratisch, das Herz füllt fast die ganze Höhe,
     leicht nach oben betont (die beiden oberen Lobe-Rundungen sind am
     deutlichsten erkennbar) – Zuschnitt etwas über der Bildmitte. */
  .portrait-split--wide img[src*="insta herz"] {
    object-position: 50% 40%;
  }
}

/* ---------- Leitsatz-Zitat (Unterseite mein-yoga.html, auch Homepage-Teaser) ----------
   Große, ruhige Zitat-Zeile für die kurzen Leitsätze aus dem
   Sprachprofil (Priorität 2 – ergänzt das Hauptmotto auf der
   Startseite, ersetzt es nicht, deshalb bewusst kein Outline-Effekt
   wie beim .motto-reveal, der bleibt einzigartig fürs Hauptmotto). */
/* padding-block QUALITY-VARIANTE (15.09.2026, auf Wunsch: "das Banner
   etwas kleiner machen") reduziert – Folge des längeren Ersatztextes
   (siehe .leitsatz__text unten), der die Section ohnehin schon durch
   mehr Zeilen etwas höher macht als der vorherige Dreiwort-Leitsatz. */
.leitsatz {
  position: relative;
  isolation: isolate; /* eigener Stapelkontext, damit .ambient-gold (z-index:-1) zuverlaessig hinter dem Text bleibt */
  /* overflow:clip (23.09.2026, mit dem Von-den-Seiten-Fliegen-Effekt
     ergänzt) – verhindert horizontales Scrollen, während die beiden
     Zeilen beim Reinscrollen von außen hereinfliegen, gleiche Technik
     wie .motto-reveal. */
  overflow: clip;
  padding-block: clamp(2.5rem, 6vw, 4rem) clamp(1.5rem, 4vw, 2.5rem);
  padding-inline: var(--space-section-x);
  text-align: center;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: clamp(0.25rem, 1vw, 0.5rem);
}

/* .method direkt danach (mein-yoga.html) hat selbst schon großzügiges
   Top-Padding (var(--space-section-y)) – zusammen mit dem Bottom-
   Padding von .leitsatz ergab das zu viel Leerfläche über "Meine
   Methodik". Nur der obere Anteil wird hier gezielt verkleinert. */
.leitsatz + .method {
  padding-top: clamp(1.5rem, 4vw, 2.5rem);
}

.leitsatz__rule {
  width: 3rem;
  height: 1px;
  background: var(--gold-500);
  margin: 0 auto 1.5rem;
}

/* Einziger Schnörkelschrift-Akzent der ganzen Website – passend zur
   feinen Schreibschrift "Auf dem Alpakahof" unten auf dem Flyer.
   Bewusst nur hier: eine einzelne, kurze Zeile ("Lauschen statt
   Leisten."), die auf der Seite kein zweites Mal vorkommt – die
   Wortmarke im Header bleibt bewusst Bebas Neue, weil sie im mobilen
   Header (Baustein 1) neben Logo/Burger nur sehr wenig Breite hat und
   eine Schreibschrift dort schnell umbrechen/überlaufen würde.
   Kein font-style: italic: Alex Brush ist als fließende Schreibschrift
   von sich aus schon "kursiv genug", ein zusätzliches Schrägstellen
   würde nur unnötig verzerren. --ink statt der Fließtext-Farbe:
   dunklerer, bewusst hervorgehobener Akzent statt nur normaler
   Textfarbe in groß. */
/* QUALITY-VARIANTE (19.09.2026, auf Wunsch: "eine geschwungenere,
   ganzere Schriftart, wie das Gold im Logo"): --font-script (Instrument
   Serif italic) zurück auf --font-flourish (Alex Brush, siehe
   tokens.css/fonts/fonts.css) getauscht – nur an dieser einen Stelle,
   die schon vorher als "der einzige Schnörkelschrift-Akzent der
   Website" gedacht war (siehe Kommentar oben) und jetzt wieder eine
   echte Handschrift statt der kursiven Serifen-Ersatzlösung bekommt.
   Kein font-style:italic mehr nötig (Alex Brush hat keinen Kursiv-
   Schnitt und ist als Handschrift von sich aus schon "kursiv genug",
   gleiche Logik wie beim früheren Alex-Brush-Einsatz hier). Deutlich
   größer als die vorherige Instrument-Serif-Variante: Schreibschriften
   wie Alex Brush haben bei gleicher Schriftgröße eine spürbar kleinere
   x-Höhe/Strichstärke als eine Serife, ohne Vergrößerung hätte der Satz
   dünn/zaghaft statt wie eine bewusste Signatur gewirkt. line-height
   entsprechend großzügiger, damit die hohen Ober-/Unterlängen (das "l"
   in "fühlen", das "K" in "Körper") nicht an die Nachbarzeile stoßen. */
.leitsatz__text {
  /* Font-Familie/-Größe/-Farbe (23.09.2026 auf Wunsch) exakt wie
     .motto-reveal__block (siehe dort) – war --font-flourish (Alex
     Brush)/--ink, jetzt dieselbe Instrument-Serif-Kursiv/Gold-
     Kombination wie "Erfahrung statt Erwartung, Präsenz statt
     Performance" auf der Startseite. white-space:nowrap bewusst NICHT
     übernommen – jede der beiden Zeilen ist inzwischen kürzer als der
     ganze Satz (am Komma aufgeteilt, siehe HTML), muss auf schmalen
     Screens aber weiterhin umbrechen können. will-change:transform aus
     demselben Grund wie .motto-reveal__block (ruckelfreier erster
     Animations-Frame beim Von-außen-Hereinfliegen). */
  will-change: transform;
  font-family: var(--font-script);
  font-style: italic;
  font-size: clamp(2.35rem, 7vw, 4.85rem);
  letter-spacing: 0.04em;
  color: var(--gold-600);
  line-height: 1.3;
  max-width: 34ch;
  margin-inline: auto;
}

/* --left fliegt beim Reinscrollen von links herein, --right von rechts
   – exakt dieselbe Idee wie .motto-reveal__block--left/--right, siehe
   js/main.js. Ruhezustand (ohne JS/GSAP oder bei reduzierter Bewegung)
   ist bereits die normale, zentrierte Endposition, keine eigene Regel
   hier nötig. */
.leitsatz__text--left,
.leitsatz__text--right {
  text-align: center;
}

/* Gleiche mobile Schriftgröße wie .motto-reveal__block (24.09.2026, auf
   Wunsch: "beides soll die Schriftgröße von Erfahrung statt Erwartung,
   Präsenz statt Performance haben") – .leitsatz__text hatte bisher gar
   keine eigene Mobile-Regel und blieb dadurch bei der (auf Handy viel
   zu großen) Basis-Untergrenze von 2.35rem hängen. */
@media (max-width: 640px) {
  .leitsatz__text {
    font-size: clamp(1.15rem, 7vw, 1.75rem);
  }
}

/* Desktop-Schriftgröße exakt wie .motto-reveal__block (24.09.2026, auf
   Wunsch: "soll beides gleich groß sein" – die erste, engere Verkleinerung
   hier war zu klein geraten, während .motto-reveal__block gleichzeitig
   unverändert "riesig" blieb; jetzt sind beide auf denselben Wert
   angeglichen, siehe die @media(min-width:901px)-Regel dort). */
@media (min-width: 901px) {
  .leitsatz__text {
    font-size: clamp(1.9rem, 3.3vw, 2.9rem);
    /* max-width:34ch (Basisregel oben) bricht "Wir können uns nicht in
       unseren Körper denken," (46 Zeichen) auf Desktop in zwei Zeilen um
       (auf Wunsch, 24.09.2026: "in eine Zeile, das passt") – hier bricht
       jede der beiden Zeilen bereits selbst am Komma um (siehe HTML,
       zwei <p>), pro Zeile ist also auf Desktop normalerweise genug Platz
       für eine einzige Zeile. Bewusst OHNE white-space:nowrap (anders als
       .motto-reveal__block): bei größerer Schrift + schmalerem
       Desktop-Fenster (knapp über 900px) bricht der Satz dann sauber in
       zwei Zeilen um, statt am Sectionrand abgeschnitten zu werden. */
    max-width: none;
  }
}

/* Bewusst ohne Padding: .yoga-band muss direkt an die Divider-Linien
   von #ueberblick oben und .ablauf unten anschließen, ganz ohne
   Cream-Puffer dazwischen. .yoga-band selbst hat inzwischen (siehe
   dort) auch eine eigene Linie oben, seit die Section ihren eigenen
   Sprenkel-Hintergrund bekommen hat. */
.mein-yoga-teaser {
  padding: 0;
}

/* ---------- Mein Yoga: Bild-Band, strikt an die Section gebunden ----------
   War background-attachment:fixed (Bild blieb beim Scrollen optisch an
   derselben Bildschirmstelle stehen) – auf Wunsch (12.09.2026) entfernt,
   jetzt ein ganz normales, mitscrollendes Hintergrundbild wie überall
   sonst auf der Seite. .yoga-band ist weiterhin ein normales
   In-Flow-Element mit fester Höhe (unabhängig vom Bild), die Karte hat
   eine feste, kleine Maximalbreite und liegt mittig darüber. */
/* Echtes Raumfoto statt Gold-Sprenkel-Textur (14.09.2026, großer Umbau,
   auf Wunsch: "diese goldenen Punkte... sieht oft nicht gut aus"): die
   bisherige "Background Lauschen statt leisten.png" war selbst nur ein
   abstraktes Gold-Konfetti-Bild auf Weiß (derselbe Sprenkel-Trick wie
   bei .contact-section, background-blend-mode:multiply ließ nur die
   Sprenkel die Cream-Fläche antönen) – kein tatsächliches Foto des
   Raums, wie das aria-label auf dem <div> ("Heller Dachgeschossraum
   mit freiliegenden Holzbalken und ausgelegten Yogamatten") es
   eigentlich verspricht. mein-yoga-raum.jpg lag bereits unverwendet im
   Bilder-Ordner und zeigt exakt das: passt inhaltlich perfekt und ist
   ein echtes Foto statt einer Deko-Textur. Kein
   background-blend-mode mehr nötig (das war nur für den
   Sprenkel-Antönungs-Trick gedacht), dafür ein dezentes Abdunkeln
   direkt aufs Foto (brightness), damit die Cream-Karte oben drauf
   sicher genug Kontrast hat. */
/* QUALITY-VARIANTE (15.09.2026, auf Wunsch): Hintergrundbild erneut
   getauscht – jetzt "hintergrund lauschen statt lernen.png" (ruhiges
   Zen-Garten-Motiv, geharkter Sand + glatte Steine in warmen Sand-/
   Steintönen, passt farblich sehr gut zur vertieften Gold-/Cream-
   Palette) statt des echten Raumfotos (mein-yoga-raum.jpg, bleibt
   unverwendet im Ordner liegen, falls später wieder gebraucht).
   background-size:cover sorgt dafür, dass es die ganze Section groß/
   randlos ausfüllt. aria-label auf dem <div> in index.html entsprechend
   mit angepasst. */
.yoga-band {
  position: relative;
  isolation: isolate; /* eigener Stapelkontext, falls hier künftig .ambient-gold dazukommt */
  height: calc(100vh - 138px);
  background-color: var(--cream);
  background-image: url("../images/hintergrund lauschen statt lernen.png");
  background-size: cover;
  background-position: center;
  border-top: 1px solid var(--gold-500);
}

/* ::before statt ::after, damit die Abdunklung HINTER .yoga-band__card
   liegt (::before wird als erstes Kind eingefügt und liegt bei
   gleichem z-index:auto dadurch unter später im DOM stehenden
   Elementen wie der Karte) statt sie zu überdecken. */
.yoga-band::before {
  content: "";
  position: absolute;
  inset: 0;
  background: rgba(43, 33, 24, 0.08);
  pointer-events: none;
}

/* Modifier nur für den "Mehr als Bewegung"-Teaser auf mein-yoga.html
   (13.09.2026 auf Wunsch: "das Foto im Hintergrund weg, suchen wir
   nochmal ein neues") – .yoga-band selbst bleibt unverändert, weil die
   Klasse auch auf index.html ("Lauschen statt Leisten") mit Foto
   verwendet wird. Bis ein neues Bild feststeht, einfach eine ruhige
   Flächenfarbe statt des Fotos. */
.yoga-band--no-photo {
  background-image: none;
  background-color: var(--surface-b);
}

@media (max-width: 1024px) {
  /* Nav-Zeile im Header fällt weg (Hamburger-Menü), Header wird
     niedriger – siehe .site-header__row--nav weiter oben. */
  .yoga-band { height: calc(100vh - 80px); }
}

/* Kürzeres Band auf Touch-Geräten – war ursprünglich auch wegen der
   iOS-Unzuverlässigkeit von background-attachment:fixed gedacht, das
   Argument ist mit "fixed" jetzt weg, die kürzere Höhe an sich passt
   aber weiterhin besser zu schmalen Handy-Bildschirmen. */
@media (hover: none) and (pointer: coarse) {
  .yoga-band {
    height: 60vh;
  }
}

/* QUALITY-VARIANTE (15.09.2026, auf Wunsch: "zeig das ganze
   Originalbild, nichts oben/unten abschneiden, Section darf gerne
   höher sein"): löst bei "Lauschen statt Leisten" (index.html) die
   feste, viewport-abhängige Höhe komplett ab, indem ein echtes <img>
   statt eines CSS-Hintergrundbilds verwendet wird (siehe index.html)
   – die Section wird dadurch automatisch genau so hoch, wie das Bild
   bei voller Breite tatsächlich ist, kein object-fit/background-size,
   das beschneiden könnte. Bewusst NACH den beiden Media Queries oben
   platziert, damit dieser Modifier auf jeder Bildschirmbreite
   gewinnt (gleiche Spezifität, spätere Regel zählt) – betrifft nur
   diese eine .yoga-band-Instanz, "Mehr als Bewegung" auf
   mein-yoga.html (--bewegung) und der Platzhalter (--no-photo)
   behalten ihre feste Höhe unverändert. */
.yoga-band--full-image {
  height: auto;
  background-image: none;
}

.yoga-band--full-image .yoga-band__img {
  display: block;
  width: 100%;
  height: auto;
}

.yoga-band__card {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: 100%;
  /* War 560px, auf Wunsch (12.09.2026) größer. */
  max-width: 680px;
  background: var(--cream);
  padding: clamp(2.5rem, 4vw, 3.5rem);
  box-shadow: 0 12px 32px -14px rgba(43, 33, 24, 0.25);
}

/* Eigene Textfarbe #2B2420 statt der sonst hier üblichen Graubraun-
   Fließtext-Farbe (--graubraun), auf Wunsch (12.09.2026) – gilt für
   Fließtext und den Link in der Karte. Die Überschrift (h2) ist davon
   seit 13.09.2026 ausgenommen: die soll wieder die normale, goldene
   h2-Farbe der Website haben statt der dunklen Sonderfarbe. */
.yoga-band__card .yoga-band__text,
.yoga-band__card .link-arrow {
  color: #2B2420;
}

/* Überschrift und Fließtext auf die gleiche Größe wie bei den anderen
   Sections (--step-titel/--step-lead, siehe z.B. .split__text) statt
   der kleineren Browser-Standardgröße – auf Wunsch (13.09.2026): "soll
   nicht einfach eine kleine Section sein". */
.yoga-band__card h2 {
  font-size: var(--step-titel);
  margin-bottom: 1rem;
}

.yoga-band__card .eyebrow {
  margin-bottom: 0.75rem;
}

.yoga-band__text {
  font-size: var(--step-lead);
  margin-bottom: 1.25rem;
}

/* Linksbündig auf Desktop statt zentriert (14.09.2026, großer Umbau
   "wie die Hero-Section") – passt besser zur restlichen, jetzt
   überwiegend linksbündigen Textsprache der Seite als eine mittig
   zentrierte Karte mitten im Bild. */
@media (min-width: 901px) {
  .yoga-band__card {
    text-align: left;
  }
}

@media (max-width: 700px) {
  .yoga-band__card {
    max-width: 88%;
    padding: 1.5rem;
  }
}

/* --plain: keine Kartenbox mehr (13.09.2026 auf Wunsch) – für "Lauschen
   statt Leisten" auf index.html. Text steht jetzt direkt, ohne Cream-
   Fläche/Schatten darunter, "blank" auf dem Hintergrundfoto. Betrifft
   nur diese eine Instanz, nicht die Methodik-Karte (--left) auf
   mein-yoga.html, die weiterhin ihre Box behält. Überschrift bekommt
   wieder die normale, goldene h2-Farbe/-Größe statt der dunklen
   Sonderfarbe, die es nur wegen der Cream-Box gab. Ein dezenter,
   cremefarbener Schlagschatten sorgt trotz direktem Foto-Hintergrund
   weiterhin für Lesbarkeit, ohne wie ein Kasten auszusehen. */
.yoga-band__card--plain {
  background: none;
  box-shadow: none;
  padding: 0;
}

.yoga-band__card--plain h2 {
  color: var(--gold-700);
  font-size: var(--step-titel);
  text-shadow: 0 2px 16px rgba(250, 249, 247, 0.85), 0 1px 4px rgba(250, 249, 247, 0.85);
}

.yoga-band__card--plain .yoga-band__text,
.yoga-band__card--plain .link-arrow {
  text-shadow: 0 2px 16px rgba(250, 249, 247, 0.85), 0 1px 4px rgba(250, 249, 247, 0.85);
}

@media (max-width: 700px) {
  .yoga-band__card--plain {
    padding: 0;
  }
}

/* --left (Methodik-Intro-Karte für "Mehr als Bewegung" auf
   mein-yoga.html) ist seit 16.09.2026 hinfällig – die Section nutzt
   dort jetzt .portrait-split statt .yoga-band, siehe mein-yoga.html.
   .yoga-band--left bleibt als Wert ungenutzt, .yoga-band(--full-image)
   selbst bleibt aktiv (index.html, "Lauschen statt Leisten"). */

/* ---------- Methodik-Container (Unterseite mein-yoga.html) ----------
   Die sechs Punkte aus Kathrins Methodik-Text sind auf zwei kurze
   Zweier-Grids verteilt statt einer langen Reihe gleich aussehender
   Kästen (siehe .method__card weiter unten) – dazwischen liegen zwei
   .portrait-split-Sections (Bild+Text) für die zwei konzeptionell
   dichtesten Punkte. So bricht die Seite den vorher sehr gleichförmigen
   Rhythmus auf, ohne dass an den Aussagen selbst etwas geändert wird. */
.method {
  padding-block: var(--space-section-y);
  padding-inline: var(--space-section-x);
}

.method__intro {
  max-width: 40rem;
  margin-inline: auto;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.85rem;
}

.method__intro h2 {
  font-size: var(--step-titel);
}

.method__grid {
  max-width: 56rem;
  margin-inline: auto;
  margin-top: clamp(2.5rem, 6vw, 4rem);
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  align-items: start;
  gap: clamp(1.5rem, 4vw, 2.5rem);
}

/* --grid-only: zweites .method-Vorkommen weiter unten auf der Seite
   enthält nur noch das Grid, kein .method__intro mehr darüber – der
   große Abstand von .method__grid wäre dort nur Leerraum am
   Section-Anfang. */
.method--grid-only .method__grid {
  margin-top: 0;
}

/* Bewusst keine umrandeten Kästen mehr (frühere Version, sah bei sechs
   gleichen Boxen in Reihe zu gleichförmig aus) – stattdessen nur eine
   dünne Haarlinie oben, gleiche Sprache wie .credentials/.price-list. */
.method__card {
  border-top: 1px solid var(--gold-500);
  padding-top: 1.5rem;
  text-align: left;
  display: flex;
  flex-direction: column;
  gap: 0.6rem;
}

.method__card h3 {
  font-size: var(--step-card-title);
}

.method__card p {
  font-size: 1rem;
  line-height: 1.65;
}

@media (max-width: 700px) {
  .method__grid {
    grid-template-columns: 1fr;
  }
}

/* ---------- Preisliste (formate.html) ----------
   Gleiche Trennlinien-Optik wie .credentials/.workshops__item, aber
   mit Label+Preis nebeneinander statt gestapelt. Linksbündig als
   bewusste Ausnahme vom sonst zentrierten Seitentext – bei einer
   Preistabelle liest sich das klarer. */
.price-list {
  width: 100%;
  max-width: 34rem;
  margin-top: 0.5rem;
  text-align: left;
}

.price-list li {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: 1rem;
  padding-block: 0.9rem;
  border-top: 1px solid var(--gold-500);
}

.price-list li:last-child {
  border-bottom: 1px solid var(--gold-500);
}

.price-list__label {
  font-size: 1.1875rem;
}

.price-list__label small {
  display: block;
  font-family: var(--font-mono);
  font-weight: 700;
  font-size: 0.75rem;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--gold-700);
  margin-top: 0.25rem;
}

.price-list__value {
  font-family: var(--font-mono);
  font-weight: 700;
  font-size: 1.1875rem;
  color: var(--gold-700);
  white-space: nowrap;
}

/* ---------- FAQ (formate.html) ----------
   Natives <details>/<summary> statt eigenem JS-Accordion – funktioniert
   auch ganz ohne CSS/JS (Browser-Default), hier nur nachgestylt. Gleiche
   Trennlinien-Optik wie .credentials/.price-list. Linksbündig als
   bewusste Ausnahme vom sonst zentrierten Seitentext, aus demselben
   Grund wie dort: eine Frage-Antwort-Liste liest sich so klarer. */
.faq-list {
  width: 100%;
  max-width: 40rem;
  margin-top: 0.5rem;
  text-align: left;
}

.faq-list details {
  border-top: 1px solid var(--gold-500);
  padding-block: 1rem;
}

.faq-list details:last-child {
  border-bottom: 1px solid var(--gold-500);
}

.faq-list summary {
  cursor: pointer;
  font-size: 1.1875rem;
  font-weight: 500;
  list-style: none;
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 1rem;
}

.faq-list summary::-webkit-details-marker {
  display: none;
}

.faq-list summary::after {
  content: "+";
  font-family: var(--font-mono);
  color: var(--gold-700);
  flex-shrink: 0;
}

.faq-list details[open] summary::after {
  content: "-";
}

.faq-list details p {
  margin-top: 0.75rem;
  font-size: 1rem;
}

/* Etwas kleiner auf Handy (19.09.2026, auf Wunsch: "FAQ-Schrift etwas
   kleiner, generell zu große Content-Schrift kleiner"). */
@media (max-width: 700px) {
  .faq-list summary {
    font-size: 1.0625rem;
  }
  .faq-list details p {
    font-size: 0.9375rem;
  }
}

/* ---------- Einzelner Blog-Artikel (blog/*.html) ----------
   Struktur (Fortschrittsbalken, Meta/Titel/Lead, Fließtext, Vor-/
   Zurück-Nav) angelehnt an das Muster aus dem separaten "Blog
   Website"-Demoprojekt, aber komplett im Goldenroom-Designsystem neu
   gebaut (eigene Tokens/Fonts/Farben statt fremdem Google-Fonts-CDN-
   Stil). */

.post-progress {
  position: fixed;
  top: 0;
  left: 0;
  height: 2px;
  width: 0%;
  background: var(--gold-500);
  z-index: 300; /* über Header (--z-header: 100) und Mobile-Menü (--z-mobile-menu: 200) */
}

.post-article {
  padding-block: clamp(3rem, 7vw, 5rem) var(--space-section-y);
  padding-inline: var(--space-section-x);
  /* --surface (28.09.2026), siehe Kommentar bei .btn--primary in dieser
     Datei – kein eigenes background hier (zeigt Cream durch). */
  --surface: var(--surface-a);
}

.post-article__inner {
  max-width: 38rem;
  margin-inline: auto;
}

.post-header {
  text-align: center;
  margin-bottom: clamp(2rem, 5vw, 3rem);
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.6rem;
}

.post-meta {
  display: flex;
  justify-content: center;
  gap: 0.75rem;
}

.post-header h1 {
  font-size: var(--step-titel);
}

.post-lead {
  font-size: var(--step-lead);
  max-width: 46ch;
}

/* Fließtext bewusst linksbündig statt zentriert wie der Rest der Seite
   – bei einem längeren Lesetext liest sich eine Spalte klarer, gleiche
   Begründung wie schon beim Kontaktformular/der Workshop-Terminliste. */
.post-body {
  text-align: left;
}

.post-body p {
  font-size: 1.1875rem;
  line-height: 1.75;
  margin-bottom: 1.5rem;
}

.post-body h2 {
  font-size: 1.5rem;
  margin: 2.5rem 0 1rem;
}

.post-nav {
  display: flex;
  justify-content: space-between;
  gap: 1rem;
  flex-wrap: wrap;
  margin-top: clamp(2.5rem, 6vw, 4rem);
  padding-top: 2rem;
  border-top: 1px solid var(--gold-500);
}

/* Scroll-Reveal, site-weit (Text UND Bilder). Ruhezustand (ohne
   .is-armed) ist immer voll sichtbar – .is-armed wird erst per JS
   gesetzt, bevor der IntersectionObserver beobachtet, siehe js/main.js.
   Ohne JS oder bei reduzierter Bewegung bleibt daher alles normal
   sichtbar, nie ein kaputter Halbzustand. Drei Richtungen:
   .fade-up (von unten, Standard für Text), .fade-left (von links),
   .fade-right (von rechts, meist für Bilder passend zur Bildseite).
   .reveal-stagger auf einem gemeinsamen Elternelement verzögert die
   direkten Kinder nacheinander (siehe nth-child-Regeln unten). */
.fade-up.is-armed,
.fade-left.is-armed,
.fade-right.is-armed {
  opacity: 0;
  transition: opacity 1.2s ease, transform 1.2s cubic-bezier(0.22, 0.61, 0.36, 1);
}

.fade-up.is-armed { transform: translateY(28px); }
.fade-left.is-armed { transform: translateX(-48px); }
.fade-right.is-armed { transform: translateX(48px); }

.fade-up.is-armed.is-visible,
.fade-left.is-armed.is-visible,
.fade-right.is-armed.is-visible {
  opacity: 1;
  transform: none;
}

/* Bild-Container: das seitliche Reinrutschen (fade-left/fade-right) ist
   bewusst nur ein Desktop-Effekt. Auf Handy-Breiten wirkt das Slide bei
   den eher kleinen, schmalen Bildspalten unruhig/beengt – dort sollen
   die Bilder einfach erscheinen (nur Opacity, kein Transform), genau
   wie .fade-in. Text-Fade-left/right (z.B. Kontakt-Formular/Kanäle)
   bleibt unangetastet, das betrifft hier nur die Bild-Selektoren. */
@media (max-width: 700px) {
  .hero__media.fade-left.is-armed,
  .hero__media.fade-right.is-armed,
  .split__media.fade-left.is-armed,
  .split__media.fade-right.is-armed,
  .portrait-split__media.fade-left.is-armed,
  .portrait-split__media.fade-right.is-armed,
  .formate__photo.fade-left.is-armed,
  .formate__photo.fade-right.is-armed {
    transform: none;
  }
}

/* Reines Ein-/Ausblenden ohne transform – für Elemente, die transform
   schon fürs eigene Layout brauchen (z.B. zentrierte Karten mit
   translate(-50%,-50%)). Die Slide-Varianten oben würden diese
   Positionierung überschreiben. */
.fade-in.is-armed { opacity: 0; transition: opacity 1.2s ease; }
.fade-in.is-armed.is-visible { opacity: 1; }

/* Gestaffeltes Erscheinen für Gruppen (Karten-Reihen, Bildergalerien):
   jedes direkte Kind bekommt eine minimal spätere Verzögerung, dadurch
   "läuft" die Reveal-Welle statt dass alles gleichzeitig aufploppt.
   Auf 6 Kinder gedeckelt (danach alle gleich), reicht für die
   Karten-/Bilderreihen dieser Seite. */
.reveal-stagger > :nth-child(1) { transition-delay: 0s; }
.reveal-stagger > :nth-child(2) { transition-delay: 0.08s; }
.reveal-stagger > :nth-child(3) { transition-delay: 0.16s; }
.reveal-stagger > :nth-child(4) { transition-delay: 0.24s; }
.reveal-stagger > :nth-child(5) { transition-delay: 0.32s; }
.reveal-stagger > :nth-child(n+6) { transition-delay: 0.4s; }

@media (prefers-reduced-motion: reduce) {
  .fade-up.is-armed,
  .fade-left.is-armed,
  .fade-right.is-armed,
  .fade-in.is-armed {
    opacity: 1;
    transform: none;
    transition: none;
  }
}

/* ---------- Footer ---------- */
/* Redesign 11.09.2026: vorher nur eine Zeile (Copyright + Impressum/
   Datenschutz). Jetzt mit Logo/Tagline, den echten Kontaktdaten
   (Telefon/E-Mail/Instagram, siehe .contact-section) und einer
   vollständigen Seiten-Nav – wichtig, seit die Kopfzeile nur noch
   Logo+Burger zeigt (siehe .site-header__row--nav, display:none),
   die Fußzeile ist dadurch die einzige Stelle, an der alle Unterseiten
   auf einen Blick als Linkliste stehen. --taupe-dark statt --espresso,
   dieselbe (hellere) dunkle Fläche wie beim Menü, damit beide dunklen
   Flächen der Seite zusammenpassen. */
.site-footer {
  position: relative; /* Ankerpunkt für .ambient-gold, siehe Dateiende */
  isolation: isolate; /* eigener Stapelkontext, damit .ambient-gold (z-index:-1) zuverlaessig hinter dem Text bleibt statt hinter den Section-Hintergrund zu rutschen */
  /* 05.10.2026, auf Wunsch: Footer "ungefähr so wie das Drop-Down-Menü,
     dieses dunklere Grau" – eigener, grauerer Ton statt des braunen
     --taupe-dark, auf allen Breiten. */
  background: var(--footer-grau);
  color: var(--cream);
  padding: clamp(3rem, 6vw, 4.5rem) var(--space-section-x) 0;
}

.site-footer__inner {
  max-width: var(--container-max);
  margin-inline: auto;
  display: grid;
  grid-template-columns: 1.3fr 1fr 1fr;
  gap: 2.5rem;
  text-align: left;
  padding-bottom: clamp(2.5rem, 5vw, 3.5rem);
}

.site-footer__brand {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 0.75rem;
}

/* War ein eng zugeschnittener Kreis mit cremefarbenem Hintergrund um
   das komplette quadratische Logo (final header 600x600.png) herum,
   weil die helle "YOGA"-Schrift sonst auf dem dunklen Footer-
   Hintergrund kaum zu sehen war. Auf Wunsch (13.09.2026) wieder
   entfernt: der Kreis nahm dem eigentlichen Schriftzug zu viel Raum
   weg (das Logo selbst füllt im 600×600-Original nur einen schmalen
   Streifen in der Mitte, drumherum ist alles transparent) – dadurch
   wirkte "goldenroom yoga" winzig und kaum lesbar. Jetzt stattdessen
   footer-logo-crop.png: derselbe Schriftzug, aber eng auf seine
   eigene Bounding-Box zugeschnitten (577×240px statt 600×600px) –
   dadurch füllt er bei gleicher Höhe die Fläche viel besser aus und
   ist direkt auf dem dunklen Grund lesbar, ganz ohne Kreis. */
.site-footer__logo {
  /* 05.10.2026, auf Wunsch: Header-Logo (mit Goldschweif) statt des
     zugeschnittenen Schriftzugs, groß. */
  width: auto;
  height: clamp(14rem, 24vw, 21rem);
  max-width: none;
  object-fit: contain;
}

/* Desktop: das Logo-PNG hat oben viel transparente Fläche – nach oben
   ziehen, damit zwischen Footer-Rand und sichtbarem Logo weniger Leerraum
   bleibt (05.10.2026). Größe unverändert. */
@media (min-width: 701px) {
  .site-footer__logo {
    /* 05.10.2026: leicht nach links unten – linker Rand des sichtbaren
       Logos bündig mit dem Seitenrand (das PNG hat links transparenten
       Rand), minimal weniger hoch gezogen als zuvor. */
    margin-top: calc(-1 * clamp(1.75rem, 4vw, 3.75rem));
    margin-left: calc(-1 * clamp(1rem, 2.2vw, 2.25rem));
  }
}

/* QUALITY-VARIANTE: font-style:italic ergänzt (siehe Kommentar bei
   .hero__intro-kicker). */
.site-footer__tagline {
  font-family: var(--font-script);
  font-style: italic;
  font-size: 1.375rem;
  color: var(--gold-500);
  max-width: 18ch;
}

/* Eigene Klasse statt .eyebrow – .eyebrow ist seit 11.09.2026 site-weit
   ausgeblendet (siehe base.css), hier soll das Spalten-Label aber
   sichtbar bleiben. */
.site-footer__heading {
  font-family: var(--font-mono);
  font-weight: 700;
  /* War 0.8125rem, auf Wunsch (13.09.2026) etwas größer. */
  font-size: 0.875rem;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--gold-500);
  margin-bottom: 1rem;
}

.site-footer__nav ul,
.site-footer__contact ul {
  display: flex;
  flex-direction: column;
  gap: 0.65rem;
  /* War 1rem, auf Wunsch (13.09.2026) etwas größer. */
  font-size: 1.0625rem;
}

.site-footer a { transition: color 0.2s ease; }
.site-footer a:hover,
.site-footer a:focus-visible { color: var(--gold-500); }

.site-footer__bottom {
  max-width: var(--container-max);
  margin-inline: auto;
  border-top: 1px solid rgba(250, 249, 247, 0.18);
  padding-block: 1.5rem;
  display: flex;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 1rem;
  /* War 0.8125rem, auf Wunsch (13.09.2026) etwas größer. */
  font-size: 0.875rem;
  color: rgba(250, 249, 247, 0.75);
}

@media (max-width: 700px) {
  /* --taupe statt --taupe-dark (19.09.2026, auf Wunsch: "Footer bei der
     Mobile-Ansicht nicht so dunkel, wirkt zu aggressiv, passt nicht") –
     siehe Token-Kommentar in tokens.css. Nur mobil, Desktop bleibt beim
     dunkleren --taupe-dark. */
  .site-footer__inner {
    grid-template-columns: 1fr;
    text-align: center;
  }
  .site-footer__brand { align-items: center; }
  .site-footer__tagline { max-width: none; }
}

/* ---------- 404 (404.html) ----------
   Riesige Hintergrund-Ziffer im Umriss-Stil, gleiche text-stroke-
   Technik wie .motto-reveal__block – bewusst dieselbe Formsprache statt
   etwas komplett Neues, damit es sich trotz eigener Seite wie ein Teil
   der Website anfühlt. Inhalt liegt zentriert darüber. */
.error-page {
  position: relative;
  min-height: calc(100vh - 138px);
  display: flex;
  align-items: center;
  justify-content: center;
  padding-block: clamp(4rem, 10vw, 6rem);
  padding-inline: var(--space-section-x);
  overflow: clip;
  /* --surface (28.09.2026), siehe Kommentar bei .btn--primary in dieser
     Datei – kein eigenes background hier (zeigt Cream durch). */
  --surface: var(--surface-a);
}

@media (max-width: 1024px) {
  .error-page { min-height: calc(100vh - 80px); }
}

.error-page__digits {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  margin: 0;
  font-family: var(--font-display);
  /* QUALITY-VARIANTE: 400 statt 700 – Instrument Serif hat keinen
     Fett-Schnitt, bei dieser Größe würde synthetisiertes Fett auf der
     Textumriss-Technik (siehe @supports unten) ungleichmäßig wirken. */
  font-weight: 400;
  font-size: clamp(6rem, 22vw, 17rem);
  line-height: 1;
  letter-spacing: -0.01em;
  color: var(--greige);
  z-index: 0;
  user-select: none;
}

@supports (-webkit-text-stroke: 1px black) or (text-stroke: 1px black) {
  .error-page__digits {
    color: transparent;
    -webkit-text-stroke: 1px var(--gold-500);
    text-stroke: 1px var(--gold-500);
  }
}

/* Bewusst KEIN eigener Hintergrund/Kasten mehr: die Ziffer dahinter ist
   ja nur ein dünner Umriss (transparent gefüllt), kein flächiges Bild –
   eine blickdichte Karte hätte sie in der Mitte einfach abgedeckt statt
   sie als Ganzes im Hintergrund zu zeigen. */
.error-page__content {
  position: relative;
  z-index: 1;
  max-width: 34rem;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 1rem;
}

.error-page__title {
  font-size: var(--step-titel);
}

.error-page__lead {
  font-size: var(--step-lead);
  max-width: 46ch;
}

.error-page__cta {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 1rem;
  margin-top: 0.75rem;
}

/* ============================================================
   Ambiente: Gold-Deko in leeren Flächen (nur Desktop)
   ============================================================
   Rein dekorative Dateien aus images/gold*.png (Nebel, Punkte,
   Schlieren, Wellen). Bewusst groß und HINTER dem Text platziert statt
   als kleiner Eckakzent davor: jede tragende Section bekommt weiter
   unten `isolation: isolate` (eigener, abgeschotteter Stapelkontext),
   darin liegt .ambient-gold auf z-index:-1 – das lässt es zuverlässig
   hinter der normalen Section-Schrift/-Karten verschwinden (die ja
   nicht positioniert sind und daher immer über z-index:-1-Kindern
   liegen), aber sichtbar VOR dem Section-Hintergrund selbst. Dadurch
   dürfen die Bilder großzügig in Richtung Sectionmitte bzw. unter den
   Content hineinreichen, ohne je etwas zu verdecken – reine
   Hintergrund-Atmosphäre statt Vordergrund-Sticker.

   Nie im Header (der bleibt komplett bildfrei, eigene Ebene mit
   z-index:var(--z-header) sowieso immer zuoberst) und nie im Footer
   (auf Wunsch 13.09.2026 wieder entfernt – dort sollte bewusst kein
   Goldpartikel-Muster laufen).

   13.09.2026 (2. Runde) auf Wunsch "mehr, unterschiedlich groß,
   schöner, nicht alle gerade": deutlich mehr Platzierungen als vorher,
   spürbar größerer Größenkorridor (das vorher kleinste Format ist jetzt
   spürbar größer), unregelmäßigere Rotationswinkel statt der vorher
   engen ±4–8°-Spanne, und ein Teil der Bilder zusätzlich horizontal
   gespiegelt (scaleX(-1)) – dieselben sechs Dateien wirken dadurch an
   verschiedenen Stellen nie wie exakte Wiederholungen. */
.ambient-gold {
  display: none;
  position: absolute;
  z-index: -1;
  pointer-events: none;
  user-select: none;
}

/* QUALITY-VARIANTE (15.09.2026): Die Freischalt-Regel, die
   .ambient-gold--tier1/--tier2 ab 1024px sichtbar machte, ist entfernt
   (auf Wunsch, sinngemäß wie schon auf der Original-Site: "diese
   goldenen Punkte... sieht oft nicht gut aus"). .ambient-gold bleibt
   dadurch überall bei seiner Basis-Regel (display:none, siehe oben) –
   site-weit, ohne dass jede einzelne <img class="ambient-gold …">-Stelle
   in den HTML-Dateien angefasst werden musste. Ursprüngliche Regel:

   @media (min-width: 1024px) {
     .ambient-gold--tier1,
     .ambient-gold--tier2 {
       display: block;
     }
   }
*/

/* ---- Motto-Reveal (index.html): die beiden Textzeilen hängen in
   entgegengesetzten Ecken (oben links / unten rechts) – die Bilder
   sitzen in der jeweils anderen Ecke und reichen als Glow weit in die
   Section hinein. */
/* ---- "Was ist der goldenroom?" (index.html, #ueberblick/.split):
   .ambient-gold--ueberblick (goldschlieren.png, unten rechts) wurde
   13.09.2026 wieder entfernt – der harte, rechteckige Bildrand des
   Assets war bei der nötigen Größe deutlich sichtbar und wirkte kantig
   statt wie eine weiche Deko. Regel bewusst nicht gelöscht, sondern nur
   auskommentiert, falls später ein Asset mit weicherem Rand genutzt
   werden soll. */
/*
.ambient-gold--ueberblick {
  bottom: 1rem;
  right: -3vw;
  width: clamp(300px, 22vw, 540px);
  opacity: 0.3;
  transform: rotate(-8deg);
}
*/

/* ---- Formate-Teaser (index.html): früher eine große links neben dem
   Text zusätzlich zur kleineren rechts hinter der Foto-Galerie – die
   linke (goldpunkte.png, Punktstreuung) wurde 13.09.2026 auf Wunsch
   entfernt ("störender Gold-Nebel"), Regel nur auskommentiert. */
/*
.ambient-gold--formate-l {
  top: 45%;
  left: -5vw;
  width: clamp(380px, 27vw, 680px);
  opacity: 0.35;
  transform: translateY(-50%) rotate(-11deg);
}
*/

.ambient-gold--formate-r {
  bottom: -2rem;
  right: -4vw;
  width: clamp(320px, 22vw, 560px);
  opacity: 0.3;
  transform: rotate(19deg) scaleX(-1);
}

/* ---- Workshops-Teaser (index.html) ---- */
.ambient-gold--workshops-l {
  bottom: 1.5rem;
  left: -4vw;
  width: clamp(360px, 25vw, 620px);
  opacity: 0.32;
  transform: rotate(-16deg);
}

/* ---- Workshops-Anmeldeformular (workshops.html, .workshops--alt) ---- */
.ambient-gold--workshops-alt {
  top: 2rem;
  left: -4vw;
  width: clamp(340px, 24vw, 580px);
  opacity: 0.3;
  transform: rotate(9deg) scaleX(-1);
}

/* ---- Kundenstimmen (index.html) ---- */
.ambient-gold--testimonials-r {
  top: 1.5rem;
  right: -4vw;
  width: clamp(380px, 27vw, 680px);
  opacity: 0.35;
  transform: rotate(13deg);
}

/* ---- Ablauf: "Wie eine Stunde abläuft" (index.html) ---- */
.ambient-gold--ablauf-l {
  top: 2rem;
  left: -4vw;
  width: clamp(340px, 24vw, 580px);
  opacity: 0.3;
  transform: rotate(-15deg);
}

/* ---- Leitsatz: "Lauschen statt Leisten." (mein-yoga.html) ---- */
.ambient-gold--leitsatz {
  top: 50%;
  right: -3vw;
  width: clamp(320px, 22vw, 540px);
  opacity: 0.32;
  transform: translateY(-50%) rotate(10deg) scaleX(-1);
}

/* ---- Kontakt-Section (index.html + kontakt.html): links groß, rechts
   klein, damit auch dieser große Bereich auf beiden Seiten lebt. */
.ambient-gold--contact-l {
  top: 2rem;
  left: -4vw;
  width: clamp(400px, 28vw, 700px);
  opacity: 0.32;
  transform: rotate(-9deg);
}

.ambient-gold--contact-r {
  bottom: -1.5rem;
  right: -3vw;
  width: clamp(320px, 22vw, 560px);
  opacity: 0.28;
  transform: rotate(15deg) scaleX(-1);
}

/* ---- Instagram-Section (index.html) ---- */
.ambient-gold--instagram-r {
  top: 1.5rem;
  right: -4vw;
  width: clamp(380px, 27vw, 680px);
  opacity: 0.35;
  transform: rotate(12deg);
}

/* ---- Page-Intro (Unterseiten): die Section selbst ist bereits auf
   46rem gedeckelt und zentriert – negative Offsets holen das Bild aus
   der schmalen Box heraus in die Leerfläche links/rechts daneben und
   darüber hinaus (z-index:-1 macht das unproblematisch, auch wenn es
   dabei den Content optisch unterläuft). Anker bewusst mit positivem
   top, damit auch bei sehr großen Bildern nichts nach oben in Richtung
   Header ausbricht. */
.ambient-gold--page-intro-l {
  top: 1rem;
  left: -15vw;
  width: clamp(360px, 25vw, 600px);
  opacity: 0.3;
  transform: rotate(-13deg);
}

/* Variante für ueber-mich.html (13.09.2026 auf Wunsch: "weiter nach
   links, ganz am Rand, sodass sie da erst beginnen") – gleiche Karte,
   nur deutlich weiter nach links Richtung Bildschirmkante geschoben,
   statt in der Mitte der Leerfläche zu schweben. Eigene Klasse statt
   den Wert direkt in .ambient-gold--page-intro-l zu ändern, weil die
   auch auf mein-yoga.html verwendet wird und dort unverändert bleiben
   soll. */
.ambient-gold--page-intro-l-edge {
  top: 1rem;
  left: -22vw;
  width: clamp(360px, 25vw, 600px);
  opacity: 0.3;
  transform: rotate(-13deg);
}

.ambient-gold--page-intro-r {
  top: 1rem;
  right: -15vw;
  width: clamp(360px, 25vw, 600px);
  opacity: 0.3;
  transform: rotate(16deg) scaleX(-1);
}

/* ---- Bio-Section (Unterseiten: ueber-mich, mein-yoga, formate, kontakt) ---- */
.ambient-gold--bio-r {
  top: 1.5rem;
  right: -4vw;
  width: clamp(360px, 25vw, 620px);
  opacity: 0.3;
  transform: rotate(-10deg);
}

.ambient-gold--bio-l {
  bottom: 1.5rem;
  left: -4vw;
  width: clamp(360px, 25vw, 620px);
  opacity: 0.3;
  transform: rotate(14deg) scaleX(-1);
}

/* Zweite Kopie von .ambient-gold--bio-r, direkt darunter gestapelt (nur
   "Selbstbestimmt praktizieren" auf mein-yoga.html, auf Wunsch
   13.09.2026: "zweimal direkt untereinander"). Der top-Versatz ist
   bewusst in vw statt rem, damit er mit der ebenfalls vw-basierten
   Bildbreite mitskaliert und auf jeder Bildschirmgröße direkt an die
   erste Kopie anschließt statt bei kleinen/großen Breiten zu weit weg
   oder zu stark überlappend zu wirken. */
.ambient-gold--bio-r-stack {
  top: calc(1.5rem + 22vw);
  right: -4vw;
  width: clamp(360px, 25vw, 620px);
  opacity: 0.3;
  transform: rotate(-10deg);
}

/* ---- Portrait-Split (ueber-mich.html, mein-yoga.html): -r für die
   erste, normale Ausrichtung, -l für die gespiegelte (--reverse)
   Variante, damit das Bild jeweils auf der freien Seite neben dem Foto
   liegt statt darunter. */
.ambient-gold--portrait-r {
  top: 2rem;
  right: -4vw;
  width: clamp(360px, 25vw, 600px);
  opacity: 0.3;
  transform: rotate(11deg);
}

.ambient-gold--portrait-l {
  bottom: 2rem;
  left: -4vw;
  width: clamp(340px, 24vw, 580px);
  opacity: 0.3;
  transform: rotate(-17deg) scaleX(-1);
}

/* ---- Workshops-Übersicht (workshops.html) ---- */
.ambient-gold--workshops-r {
  top: 2rem;
  right: -4vw;
  width: clamp(360px, 25vw, 600px);
  opacity: 0.3;
  transform: rotate(-12deg);
}

/* ---- Format-Detail (formate.html): .format-detail ist selbst auf
   --container-max gedeckelt und zentriert (wie .page-intro), braucht
   also denselben vw-Escape-Trick, um wirklich in die Leerfläche neben
   der Box zu kommen. Nur bei der ersten (Kleingruppen, rechts neben
   dem Text war "sehr viel Freifläche") und der dritten Section (1:1,
   links unter dem Bild) – nicht bei allen drei, sonst wird's zu viel
   auf einer Seite. */
/* War oben rechts (right:-6vw, gespiegelt) – auf Wunsch (13.09.2026)
   auf die linke Seite gewechselt, seit der Info-Kasten/CTA-Button
   jetzt links stehen (siehe .format-detail--split) und dort oben etwas
   Freifläche über den Bildern frei wurde. */
.ambient-gold--formatdetail-1 {
  top: -1rem;
  left: -6vw;
  width: clamp(320px, 23vw, 560px);
  opacity: 0.3;
  transform: rotate(9deg);
}

.ambient-gold--formatdetail-3 {
  bottom: -1rem;
  left: -5vw;
  width: clamp(280px, 20vw, 480px);
  opacity: 0.3;
  transform: rotate(-11deg);
}

/* ---------- Sanftes Bild-Einblenden (site-weit) ----------
   Gegenstück zu window.armFadeReveal in js/main.js (25.09.2026, auf
   Wunsch: "manche Bilder erscheinen sehr abgehakt") – .img-fade-in wird
   nur per JS gesetzt (nie im HTML/CSS als Ruhezustand), startet bei
   opacity:0 und wechselt beim load-Event des Bildes auf .is-loaded.
   Unabhängig vom scroll-getriggerten Fade-Up-System (das ist unter
   700px Breite komplett aus, siehe js/main.js) – läuft auf jeder
   Bildschirmbreite. */
.img-fade-in {
  opacity: 0;
  transition: opacity 0.35s ease;
}
.img-fade-in.is-loaded {
  opacity: 1;
}

/* 05.10.2026, auf Wunsch: bei den kleinen Bildern (Kleingruppen = Pose A,
   1:1 = Pose C) war oben zu viel abgeschnitten (Hand bzw. kaum Luft über
   dem Kopf). Oben bündig ausrichten und die Formate an die Motive
   anpassen, damit nichts Wichtiges angeschnitten wird. */
.format-detail__accent[src*="yoga_pose_a"] {
  aspect-ratio: 2 / 3;
  object-position: top;
}
.format-detail__accent[src*="yoga_pose_c"] {
  aspect-ratio: 4 / 5;
  object-position: top;
}

/* ---------- Rechtstexte (impressum.html, datenschutz.html) ----------
   05.10.2026: Impressum/Datenschutz als echte Seiten im Seitendesign
   statt PDF. Schmale Lesespalte, h2 gold (wie überall), h3 = kleinere
   Zwischenüberschrift. Bewusst ruhig und ohne Animation. */
.legal {
  padding: 0 var(--space-section-x) clamp(3rem, 7vw, 5rem);
}
.legal__inner {
  max-width: 46rem;
  margin-inline: auto;
}
/* Überschriften bewusst klein gehalten (05.10.2026, auf Wunsch: nicht
   so groß-klein), eigene Stufen statt --step-titel. */
.page-intro__title--legal {
  font-size: clamp(1.9rem, 3.6vw, 2.4rem);
}
.legal h2 {
  font-size: clamp(1.35rem, 2.2vw, 1.6rem);
  margin-top: clamp(1.75rem, 4vw, 2.5rem);
  margin-bottom: 0.6rem;
}
.legal h2:first-child { margin-top: 0; }
.legal h3 {
  font-size: 1.1rem;
  margin-top: 1.4rem;
  margin-bottom: 0.5rem;
}
.legal p,
.legal li {
  font-size: 1rem;
  line-height: 1.7;
  overflow-wrap: anywhere;
}
.legal p { margin-block: 0 0.9rem; }
.legal__address { font-style: normal; }
.legal__list {
  margin: 0 0 1rem;
  padding-left: 1.25rem;
}
.legal__list li { margin-bottom: 0.4rem; }
.legal__note {
  border-left: 2px solid var(--gold-500);
  padding-left: 1rem;
}
.legal a {
  color: var(--gold-700);
  text-decoration: underline;
  text-underline-offset: 0.15em;
}

/* ---------- Zwischenbanner, einheitlich (05.10.2026) ----------
   Auf Wunsch überall gleich: .motto-static (Formate, Über mich) und
   .leitsatz (Mein Yoga) teilen sich Schriftart, -größe, -farbe,
   Zeichenabstand und Bannerhöhe. Steht bewusst am Dateiende, damit es
   die älteren Einzelregeln (inkl. Media Queries) überschreibt. */
.motto-static,
.leitsatz {
  padding-block: clamp(2.5rem, 6vw, 4.5rem);
}
.motto-static__text,
.leitsatz__text {
  font-family: var(--font-script);
  font-style: italic;
  font-size: clamp(1.5rem, 5.6vw, 4.6rem);
  letter-spacing: 0.04em;
  line-height: 1.2;
  color: var(--gold-600);
  text-align: center;
  white-space: normal;
  max-width: 24ch;
  margin-inline: auto;
}
.leitsatz__text { max-width: none; }
/* Kurze Banner-Sätze immer einzeilig (05.10.2026) */
.motto-static__text { white-space: nowrap; max-width: none; }

/* ---------- Rezension + QR-Codes (05.10.2026) ---------- */
.review-box {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 1.5rem;
  max-width: 34rem;
  margin: clamp(2.5rem, 6vw, 3.5rem) auto 0;
  text-align: left;
}
.review-box__qr { flex: none; width: 7.5rem; height: 7.5rem; }
.review-box__title {
  font-family: var(--font-display);
  font-size: 1.35rem;
  color: var(--gold-700);
  margin-bottom: 0.35rem;
}
.review-box__text p { margin-block: 0 0.9rem; }
@media (max-width: 520px) {
  .review-box { flex-direction: column; text-align: center; }
}

/* Footer: kleine QR-Kacheln auf Creme, damit sie auf dem dunklen Grund
   zuverlässig scanbar sind. */
.site-footer__qr {
  display: flex;
  gap: 1rem;
  margin-top: 1.25rem;
}
.site-footer__qr a {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.35rem;
  font-size: 0.8125rem;
}
.site-footer__qr img {
  background: var(--cream);
  padding: 0.35rem;
  width: 5.25rem;
  height: 5.25rem;
}
@media (max-width: 700px) {
  .site-footer__qr { justify-content: center; }
}

/* Handy: Zwischenbanner so groß wie möglich, aber kurze Sätze in EINER
   Zeile bis zum Rand (06.10.2026). Die Schriftgröße (--banner-fs) misst
   js/main.js so, dass "Erfahrung statt Erwartung" genau die verfügbare
   Breite füllt; alle Banner nutzen dieselbe Größe. Zu lange Sätze (Mein
   Yoga) brechen wie gewünscht in zwei Zeilen um. */
@media (max-width: 700px) {
  .motto-static__text,
  .leitsatz__text {
    font-size: var(--banner-fs, clamp(1.6rem, 7.5vw, 2.2rem));
    line-height: 1.15;
    max-width: none;
  }
  .motto-static__text { white-space: nowrap; }
  .leitsatz__text { white-space: normal; }
  .motto-static,
  .leitsatz {
    padding-block: clamp(2rem, 8vw, 3rem);
  }
}

/* ---------- Kontaktformular: Honeypot, Einwilligung, Status (09.10.2026) ---------- */
.contact-section__hp {
  position: absolute;
  left: -10000px;
  width: 1px;
  height: 1px;
  overflow: hidden;
}
.contact-section__consent {
  display: flex;
  align-items: flex-start;
  gap: 0.6rem;
  font-size: 0.9375rem;
  line-height: 1.45;
}
.contact-section__consent input {
  flex: none;
  margin-top: 0.2rem;
  accent-color: var(--gold-700);
}
.contact-section__consent a {
  color: var(--gold-700);
  text-decoration: underline;
  text-underline-offset: 0.15em;
}
.contact-section__status {
  margin: 0;
  font-size: 0.9375rem;
  line-height: 1.45;
  text-align: center;
}
.contact-section__status.is-ok { color: var(--gold-700); }
.contact-section__status.is-error { color: var(--rose); }
.contact-section__submit:disabled { opacity: 0.6; cursor: wait; }
