/* ==========================================================================
   Der Workshop-Tag — Optima Solutions
   Design-System & statisches Layout (Task 3)
   Anmutung: editorial, viel Weißraum, große Poppins-Headlines,
   Optima-Blau ausschließlich als gezielter Akzent.
   ========================================================================== */

/* --- 1. Tokens ----------------------------------------------------------- */

:root{
  --blue:#298DCC; --blue-deep:#1B6EA3; --ink:#0B1215; --offwhite:#EDF3F4;
  /* --blue (#298DCC) auf Weiß liegt bei ~3,6:1 — zu wenig für normalen
     Text/Interaktionsflächen (WCAG AA verlangt 4,5:1 für Text < 24px).
     --blue-deep (~5,5:1 auf Weiß) übernimmt daher alle Buttons/Badges/
     kleinen blauen Texte; --blue bleibt für große Schrift (Timer),
     dekorative Hairlines/Icons (≥3:1 reicht dort) und den Uhr-Punkt.
     --blue-hover ist eine weiter abgedunkelte Hover-Stufe für Flächen,
     deren Ruhezustand bereits --blue-deep nutzt (sonst wäre Hover ==
     Ruhezustand, kein sichtbares Feedback mehr). */
  --blue-hover:color-mix(in srgb, var(--blue-deep) 80%, black);
  --bg-morning:#F7FAFB; --bg-noon:#FDF9F2; --bg-evening:#E9EEF2;
  --font:'Poppins',system-ui,-apple-system,'Segoe UI',sans-serif;
  --step-0:clamp(1rem,.95rem + .3vw,1.125rem);
  --step-2:clamp(1.5rem,1.2rem + 1.5vw,2.25rem);
  --step-4:clamp(2.4rem,1.8rem + 3vw,4.5rem);

  /* Ergänzungen */
  --step--1:clamp(.75rem,.72rem + .12vw,.8125rem);
  --step-1:clamp(1.125rem,1.05rem + .45vw,1.375rem);
  --step-3:clamp(1.75rem,1.35rem + 1.9vw,2.875rem);
  /* Obergrenze von 5rem auf 4rem. Das Markup gibt drei <span class="line">
     vor, also drei gesetzte Zeilen. Bei 80px brauchte jede davon zwei bis
     drei Umbrüche: "Ein Workshop-" / "Tag." trennte das Kernversprechen am
     Bindestrich, "Danach" stand allein. Bei 64px (zusammen mit der
     breiteren Textspalte in Block 10) beginnt jede Copy-Zeile auf einer
     eigenen Zeile, nur die längste bricht noch einmal -- und der komplette
     Hero inklusive CTA passt bei 900px Viewporthöhe über die Falz. */
  --step-5:clamp(2.2rem,1.5rem + 3.4vw,4rem);

  --paper:#FFFFFF;
  --ink-70:rgba(11,18,21,.68);
  /* War rgba(11,18,21,.46) — Lighthouse/axe (Task 9) maß dafür nur
     3,1:1 auf den hellen Section-Hintergründen (Sektions-Eyebrow,
     .objektdaten dt, Timer-Einheit, Paket-Preis; alle < 14px). Auf .6
     angehoben: ≥4,7:1 auf allen --bg-*/--paper/--offwhite-Flächen, WCAG
     AA erfüllt. Der Name "ink-45" bleibt (viele Stellen referenzieren
     ihn), der tatsächliche Alpha-Wert weicht seit diesem Fix bewusst ab. */
  --ink-45:rgba(11,18,21,.6);
  --ink-15:rgba(11,18,21,.15);
  --line:rgba(11,18,21,.12);
  --blue-soft:rgba(41,141,204,.42);

  --gutter:clamp(1.25rem,5vw,4rem);
  --maxw:72rem;

  /* Header-Metrik als Token: Das Logo ist der Markenanker und bestimmt die
     Headerhöhe (es ist stets höher als der Header-CTA). --header-h leitet
     sich daraus ab, damit alles, was unter dem Header beginnt (Tagesuhr,
     Hero-Oberkante), rechnerisch an ihm hängt statt per Augenmaß gesetzter
     Einzelwerte -- sonst kollidiert die Uhr mit dem Header, sobald die
     Logohöhe geändert wird (genau das war vor der Vergrößerung der Fall). */
  --logo-h:clamp(2.25rem,3.5vw,3.125rem);
  --header-pad-y:clamp(1rem,2.2vw,1.6rem);
  --header-h:calc(var(--logo-h) + var(--header-pad-y) * 2);

  --shadow-paper:0 28px 60px -40px rgba(11,18,21,.45),0 2px 8px -6px rgba(11,18,21,.25);
  --ease:cubic-bezier(.2,.7,.3,1);
}

/* --- 2. Reset & Basis ---------------------------------------------------- */

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

/* Kein scroll-behavior:smooth — kollidiert mit ScrollTrigger (Tasks 4–7). */

/* overflow-x:clip auf BEIDEN Ebenen (html UND body) nötig: Chrome
   propagiert overflow von body auf den Viewport nur, wenn html selbst
   keinen eigenen overflow-Wert setzt (UA-Regel, siehe CSSOM-View). Da
   html hier keinen Wert hatte (Default: visible), blieb der Viewport
   scrollbar, obwohl body allein bereits clip gesetzt hatte — .rail.rail-
   gsap (overflow-x:visible, nötig für die GSAP-Fahrt in Block 13) reicht
   dadurch bis zur Dokumentbreite (scrollWidth 1944 bei 1440 Viewport) und
   ließ sich per Shift+Wheel/Trackpad seitlich scrollen. Root-Cause-Fix:
   clip auf html UND body — GSAP-Rail-Fahrt (transform:x, nicht scroll)
   und alle Pins bleiben unberührt, da diese über transform statt Scroll
   laufen (verifiziert: scrollTo(500,0) bleibt bei x=0).
*/
html{overflow-x:clip}
body{
  margin:0;
  overflow-x:clip;
  background:var(--bg-morning);
  color:var(--ink);
  font-family:var(--font);
  font-size:var(--step-0);
  font-weight:400;
  line-height:1.62;
  text-rendering:optimizeLegibility;
  -webkit-font-smoothing:antialiased;
  -moz-osx-font-smoothing:grayscale;
}

h1,h2,h3,p,ul,dl,dd,figure{margin:0}
ul{padding:0}
img,svg{display:block;max-width:100%}
a{color:inherit}

[hidden]{display:none !important}

::selection{background:var(--blue);color:#fff}

:focus-visible{
  outline:2px solid var(--blue);
  outline-offset:4px;
  border-radius:1px;
}

/* Skip-Link: erster Fokusstopp der Seite (steht vor <header> im Markup).
   Visuell ausgeblendet, bis er per Tab fokussiert wird -- dann fest
   positioniert über allem (z-index höher als Header 100/.sticky-cta 120),
   damit Tastatur-Nutzer den kompletten Header/.dayclock/Rail-Setup
   überspringen und direkt bei <main id="main"> landen können. */
.skip-link{
  position:fixed;
  top:-100%;
  left:1rem;
  z-index:200;
  padding:.85em 1.25em;
  background:var(--blue-deep);
  color:#fff;
  font-size:var(--step-0);
  font-weight:600;
  text-decoration:none;
  border-radius:2px;
}
.skip-link:focus-visible{
  top:1rem;
  outline-color:#fff;
}

/* Feine Papierkörnung — Textur statt Farbverlauf-Slop.
   z-index bewusst UNTER allen interaktiven Ebenen (Header 100, .dayclock
   90, .sticky-cta 120) statt darüber -- sonst läge das Korn (auch wenn
   pointer-events:none es nicht klickbar macht) optisch vor Header/Sticky-
   CTA/Uhr und würde ihre Kanten/Schatten überzeichnen. 50 reicht, um
   weiterhin über dem gesamten Seiteninhalt (kein anderes Element nutzt
   einen z-index zwischen 2 und 90) zu liegen. */
body::after{
  content:"";
  position:fixed;
  inset:0;
  z-index:50;
  pointer-events:none;
  opacity:.035;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='140' height='140'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='3'/%3E%3C/filter%3E%3Crect width='140' height='140' filter='url(%23n)'/%3E%3C/svg%3E");
}

/* --- 3. Sektions-Raster -------------------------------------------------- */
/* Jede Sektion: volle Viewporthöhe, Inhaltsspalte max. 72rem zentriert,
   Randspalten für Vollbreiten-Elemente (Rail).
   Bewusst "main section" (Nachfahre) statt "main>section" (Direktkind, Task
   3-Original): ScrollTrigger.create({pin:true}, Task 5) verpackt die
   gepinnte Section in einen zusätzlichen ".pin-spacer"-Wrapper-Div, der
   zwischen <main> und <section> eingefügt wird. Mit dem Direktkind-
   Kombinator würden dadurch #problem und ihr ::before-Label (Sektions-
   Eyebrow) beim Pinning aus der Selektor-Kette fallen und ihr komplettes
   Grid-Layout verlieren — experimentell verifiziert. */

main section{
  display:grid;
  grid-template-columns:
    [full-start] minmax(var(--gutter),1fr)
    [content-start] min(100% - var(--gutter) * 2,var(--maxw)) [content-end]
    minmax(var(--gutter),1fr) [full-end];
  align-content:center;
  min-height:100svh;
  padding-block:clamp(5rem,11vh,8.5rem);
}

main section>*,
main section::before{grid-column:content}

/* Tageszeit-Marke als Sektions-Eyebrow (Design-Element, keine Copy) */
main section::before{
  content:var(--label,"");
  display:block;
  margin-bottom:clamp(1.75rem,4vw,2.75rem);
  padding-bottom:.9rem;
  border-bottom:1px solid var(--line);
  color:var(--ink-45);
  letter-spacing:.24em;
  font-variant-numeric:tabular-nums;
}

#hero{--label:"01 · 08:45"}
#problem{--label:"02 · 09:00"}
#demo{--label:"03 · 10:30"}
#ablauf{--label:"04 · 13:00"}
#gruender{--label:"05 · 15:00"}
#pakete{--label:"06 · 16:00"}
#abschluss{--label:"07 · 17:00"}

/* --- 4. Typografie ------------------------------------------------------- */

h1{
  font-size:var(--step-5);
  font-weight:700;
  line-height:.98;
  letter-spacing:-.035em;
}
h1 .line{display:block}

h2{
  font-size:var(--step-3);
  font-weight:700;
  line-height:1.08;
  letter-spacing:-.025em;
  max-width:24ch;
  text-wrap:balance;
}

h3{font-weight:600;letter-spacing:-.015em}

.abbinder{color:var(--ink-70)}

/* Label-Typografie (Eyebrow-System): font-size/font-weight/text-transform
   sind über Sektions-Eyebrows, Pillen und kleine Meta-Labels hinweg
   identisch (var(--step--1), 600, uppercase) -- hier zentral gehalten,
   statt in jeder Einzelregel dupliziert. letter-spacing bleibt lokal
   (variiert je Stelle zwischen .06em und .24em). Stellen ohne uppercase
   (z.B. .dayclock, .zeitfresser::before, .station .t, .linkedin-link) sind
   bewusst NICHT Teil dieser Gruppe -- ebenso .badge, dessen font-size
   (.6875rem) von var(--step--1) abweicht. */
main section::before,
.cta-header,
.founder-hero,
.founder-portrait,
.objektdaten dt,
.demo-timer .unit,
.paket-preis{
  font-size:var(--step--1);
  font-weight:600;
  text-transform:uppercase;
}

/* Risk-Reversal-Zeile direkt unter einem CTA-Button ("Kostenlos · 30
   Minuten · danach Fixpreis-Angebot"): nimmt die Kosten-/Aufwandsfrage,
   bevor sie den Klick verhindert.
   Bewusst NICHT im Eyebrow-System (uppercase + weites letter-spacing):
   Das ist Hilfstext in Satzform, kein Label -- in Versalien brach die
   Zeile auf 375px zweizeilig um und las sich als Kategorie statt als
   Zusicherung. Satzsatz bleibt auf einer Zeile und liest sich schneller. */
.cta-note{
  margin-top:.85rem;
  color:var(--ink-70);
  font-size:var(--step--1);
  font-weight:400;
  letter-spacing:.01em;
  line-height:1.45;
}

/* Button + Note als Einheit, damit die Note im weiten Grid von
   .abschluss-cta (gap bis 2.5rem) am Button klebt statt frei zu schweben. */
.cta-stack{
  display:grid;
  gap:0;
  justify-items:start;
}

/* --- 5. Buttons ---------------------------------------------------------- */

.cta-button{
  display:inline-flex;
  align-items:center;
  gap:.85em;
  align-self:start;
  justify-self:start;
  padding:.95em 1.5em;
  border:1px solid var(--blue-deep);
  border-radius:2px;
  background:var(--blue-deep);
  color:#fff;
  font:inherit;
  font-size:var(--step-0);
  font-weight:600;
  letter-spacing:.005em;
  line-height:1.2;
  text-decoration:none;
  transition:background .25s var(--ease),border-color .25s var(--ease),
             transform .25s var(--ease),box-shadow .25s var(--ease),color .25s var(--ease);
}
.cta-button::after{
  content:"";
  flex:0 0 auto;
  width:.45em;height:.45em;
  border-top:1.5px solid currentColor;
  border-right:1.5px solid currentColor;
  transform:translateY(-.05em) rotate(45deg);
  transition:transform .25s var(--ease);
}
.cta-button:hover{
  background:var(--blue-hover);
  border-color:var(--blue-hover);
  transform:translateY(-2px);
  box-shadow:0 14px 26px -14px color-mix(in srgb, var(--blue-deep) 65%, transparent);
}
.cta-button:hover::after{transform:translate(3px,-.05em) rotate(45deg)}
.cta-button:active{transform:translateY(0)}

/* Padding von .6em/1.15em auf .8em/1.35em angehoben: Der Header-CTA ist das
   optische Gegengewicht zum Logo auf der anderen Seite. Mit dem grösseren
   Logo (Task "Markenanker") wirkte der schmale Rahmen daneben zu leicht --
   die Zeile war rechts unterbelichtet. */
.cta-header{
  display:inline-flex;
  align-items:center;
  padding:.8em 1.35em;
  border:1px solid var(--blue-soft);
  border-radius:2px;
  color:var(--blue-deep);
  letter-spacing:.06em;
  text-decoration:none;
  white-space:nowrap;
  transition:background .25s var(--ease),color .25s var(--ease),border-color .25s var(--ease);
}
.cta-header:hover{background:var(--blue-deep);border-color:var(--blue-deep);color:#fff}

/* --- 6. Header ----------------------------------------------------------- */

header{
  position:absolute;
  inset:0 0 auto;
  z-index:100;
  display:flex;
  align-items:center;
  justify-content:space-between;
  gap:clamp(1rem,3vw,2rem);
  padding:var(--header-pad-y) max(var(--gutter),calc((100% - var(--maxw))/2));
}
/* align-items:center auf dem <a> selbst (nicht nur auf dem Header): Der Link
   ist die Flexbox um das SVG -- ohne inline-flex sässe das Logo auf der
   Textbaseline des Links und trüge dessen line-height als Unterlänge mit,
   der Header wäre dadurch bei grossem Logo minimal aus der Mitte. */
header a{display:inline-flex;align-items:center;text-decoration:none}
.logo{height:var(--logo-h);width:auto}

/* --- 7. Tagesuhr --------------------------------------------------------- */

.dayclock{
  position:fixed;
  top:calc(var(--header-h) + clamp(.75rem,2vh,1.25rem));
  right:var(--gutter);
  z-index:90;
  display:inline-flex;
  align-items:center;
  gap:.5rem;
  padding:.35rem .75rem .35rem .65rem;
  border:1px solid var(--ink-15);
  border-radius:999px;
  background:rgba(255,255,255,.72);
  backdrop-filter:blur(6px);
  color:var(--ink-70);
  font-size:var(--step--1);
  font-weight:600;
  letter-spacing:.12em;
  line-height:1;
  font-variant-numeric:tabular-nums;
}
.dayclock::before{
  content:"";
  width:.375rem;height:.375rem;
  border-radius:50%;
  background:var(--blue);
}

/* --- 8. Sticky-CTA ------------------------------------------------------- */

.sticky-cta{
  position:fixed;
  z-index:120;
  bottom:clamp(1rem,3vh,2rem);
  left:var(--gutter);
  right:var(--gutter);
  display:flex;
  align-items:center;
  justify-content:center;
  gap:.75rem;
  padding:1em 1.5em;
  border-radius:2px;
  background:var(--blue-deep);
  color:#fff;
  font-size:var(--step-0);
  font-weight:600;
  text-align:center;
  text-decoration:none;
  box-shadow:0 18px 40px -18px rgba(11,18,21,.55);
  opacity:0;
  transform:translateY(.75rem);
  pointer-events:none;
  transition:background .25s var(--ease),box-shadow .25s var(--ease),
    opacity .3s var(--ease),transform .3s var(--ease);
}
/* Sichtbarkeits-Zustand (Task 6): main.js entfernt zuerst "hidden" (siehe
   [hidden]{display:none!important} in Block 2) und setzt danach diese
   Klasse — erst dadurch greift der Opacity/Y-Übergang oben. */
.sticky-cta.is-visible{
  opacity:1;
  transform:translateY(0);
  pointer-events:auto;
}
.sticky-cta:hover{background:var(--blue-hover);box-shadow:0 22px 44px -18px var(--ink-45)}
@media (min-width:48rem){
  .sticky-cta{left:auto;right:var(--gutter);padding:.9em 1.5em}
}

/* --- 9. Bild-/Embed-Platzhalter ------------------------------------------ */

.founder-hero,
.founder-portrait{
  position:relative;
  display:grid;
  place-items:center;
  padding:2rem;
  border:1px solid var(--line);
  background-color:var(--offwhite);
  background-image:repeating-linear-gradient(135deg,
    rgba(11,18,21,.035) 0 1px,transparent 1px 10px);
  color:var(--ink-45);
  letter-spacing:.14em;
  line-height:1.6;
  text-align:center;
}
.founder-hero::before,.founder-portrait::before,
.founder-hero::after,.founder-portrait::after{
  content:"";
  position:absolute;
  width:14px;height:14px;
  border:0 solid var(--blue);
  opacity:.5;
}
.founder-hero::before,.founder-portrait::before{
  top:10px;left:10px;border-top-width:1px;border-left-width:1px;
}
.founder-hero::after,.founder-portrait::after{
  right:10px;bottom:10px;border-bottom-width:1px;border-right-width:1px;
}

/* .has-media: Figures, die inzwischen ein echtes Foto tragen (Hero-,
   Gründer-Portrait). Die Platzhalter-Deko oben (Schraffur, Padding,
   Ecken-Marker, zentrierter Label-Text) war ausschließlich für den
   leeren Text-Zustand gedacht -- mit Bild wird sie deaktiviert, damit
   Schraffur/Ecken-Marker nicht über dem Foto liegen. */
.founder-hero.has-media,
.founder-portrait.has-media{
  padding:0;
  background:none;
  color:inherit;
  letter-spacing:normal;
  text-align:initial;
}
.founder-hero.has-media::before,.founder-portrait.has-media::before,
.founder-hero.has-media::after,.founder-portrait.has-media::after{
  content:none;
}

.founder-hero{aspect-ratio:4/5}
/* Bühnenfoto: Person steht rechts der Bildmitte im Querformat --
   object-position rückt den Ausschnitt nach rechts (60%) und etwas
   oberhalb der Mitte (25%), damit Gesicht/Gestik im 4:5-Frame sitzen
   statt mittig beschnitten zu werden (siehe iteriertes Screenshot-
   Verifikationsergebnis). */
.founder-hero img{
  width:100%;
  height:100%;
  object-fit:cover;
  object-position:60% 25%;
}

/* founder-portrait bekommt zusätzlich zur gemeinsamen Platzhalter-Regel
   oben ein Clip-Frame: main.js animiert NICHT mehr die Figure selbst
   (das würde Rahmen + Ecken-Marker als Ganzes über die Seite schieben),
   sondern nur noch .founder-portrait-media darin (yPercent-Parallax,
   siehe main.js). overflow:hidden auf der Figure sorgt dafür, dass das
   <img> bei der Parallax-Bewegung sauber am Rahmen beschnitten wird,
   statt über ihn hinauszuragen. */
.founder-portrait{aspect-ratio:3/4;overflow:hidden}
/* .founder-portrait-media ist jetzt das <img> selbst. height:112% +
   top:-6% geben dem Bild vertikal mehr Fläche als der Rahmen (100%) --
   der yPercent-Parallax in main.js (±6% der Elementhöhe) bewegt das Bild
   dadurch innerhalb dieser Überhang-Reserve, sodass beim Scrubben nie
   der Bildrand (weißer Rand) im Rahmen sichtbar wird, egal ob am oberen
   oder unteren Ende des Pins (mit Screenshot verifiziert). */
.founder-portrait-media{
  display:block;
  width:100%;
  height:112%;
  position:relative;
  top:-6%;
  object-fit:cover;
}

/* --- 10. Hero (01) ------------------------------------------------------- */

#hero{padding-top:calc(var(--header-h) + clamp(3rem,10vh,6.5rem))}

.hero-inner{
  display:grid;
  gap:clamp(2.5rem,7vw,4.5rem);
  align-items:center;
}
.hero-copy{display:flex;flex-direction:column;align-items:flex-start}
.hero-copy .sub{
  margin-top:clamp(1.5rem,3vw,2rem);
  max-width:36ch;
  color:var(--ink-70);
  font-size:var(--step-1);
  line-height:1.5;
}
.hero-copy .cta-button{margin-top:clamp(2rem,4vw,2.75rem)}

@media (min-width:64rem){
  /* 1.3fr statt 1.12fr: Die Textspalte braucht mit der H1-Grösse aus
     Block 1 rund 700px, damit die längsten Segmente ("Ihr Team. Ihre
     Objekte.", "Danach übernimmt KI") ungebrochen stehen. Das Bühnenfoto
     verliert dabei Breite, bleibt aber durch sein 4:5-Format hoch genug,
     um die Spalte zu tragen.
     Der frühere margin-top am Foto ist entfallen: .hero-inner zentriert
     beide Spalten ohnehin vertikal, der zusätzliche Versatz machte diese
     Zentrierung nur unsauber (Foto sass 40px tiefer als die optische
     Mitte). */
  .hero-inner{grid-template-columns:minmax(0,1.3fr) minmax(0,.7fr)}
}

/* --- 11. Problem (02) ---------------------------------------------------- */

.zeitfresser-liste{
  margin-top:clamp(2.5rem,6vw,4rem);
  list-style:none;
  counter-reset:zf;
  border-top:1px solid var(--line);
}
.zeitfresser{
  counter-increment:zf;
  display:grid;
  grid-template-columns:2.75rem 1fr;
  gap:1rem;
  padding-block:clamp(1.25rem,3.2vw,2rem);
  border-bottom:1px solid var(--line);
  font-size:var(--step-2);
  font-weight:600;
  line-height:1.24;
  letter-spacing:-.015em;
  text-wrap:pretty;
}
.zeitfresser::before{
  content:counter(zf,decimal-leading-zero);
  padding-top:.5em;
  color:var(--blue-deep);
  font-size:var(--step--1);
  font-weight:600;
  letter-spacing:.14em;
  line-height:1;
}

#problem .abbinder{
  margin-top:clamp(2.5rem,6vw,3.75rem);
  padding-left:clamp(1rem,2vw,1.5rem);
  border-left:2px solid var(--blue);
  max-width:46ch;
  color:var(--ink);
  font-size:var(--step-1);
  font-weight:600;
  line-height:1.45;
  letter-spacing:-.01em;
}

/* --- 12. Live-Demo (03) -------------------------------------------------- */

.demo-grid{
  display:grid;
  gap:clamp(1.75rem,4vw,3rem);
  margin-top:clamp(2.5rem,6vw,4rem);
  align-items:start;
}
@media (min-width:64rem){
  .demo-grid{grid-template-columns:minmax(0,.82fr) minmax(0,1.18fr)}
}

/* Rohdaten — bewusst „unfertig“: Hairlines, keine Fläche */
.objektdaten{
  display:grid;
  grid-template-columns:auto 1fr;
  border-top:2px solid var(--ink);
}
.objektdaten dt,
.objektdaten dd{
  display:flex;
  align-items:center;
  min-height:3.25rem;
  padding-block:.6rem;
  border-bottom:1px solid var(--line);
}
.objektdaten dt{
  padding-right:1.5rem;
  color:var(--ink-45);
  letter-spacing:.14em;
}
.objektdaten dd{
  justify-content:flex-end;
  padding-left:1.5rem;
  text-align:right;
  font-weight:600;
  font-variant-numeric:tabular-nums;
}

/* Ergebnis — „Papier“: Fläche, Schatten, Ruhe */
.expose-out{
  min-height:28rem;
  padding:clamp(1.5rem,4vw,2.75rem);
  border:1px solid var(--line);
  background:var(--paper);
  box-shadow:var(--shadow-paper);
}
@media (min-width:64rem){.expose-out{min-height:26rem}}

#expose-text{
  max-width:48ch;
  font-size:var(--step-0);
  line-height:1.72;
  text-wrap:pretty;
}
#expose-text::after{
  content:"";
  display:inline-block;
  width:2px;height:1.05em;
  margin-left:.08em;
  vertical-align:-.2em;
  background:var(--blue);
}
/* Blinkt nur, solange der Text noch unvollständig ist (Task 6: main.js
   setzt "typing" auf .expose-out bei progress<1). Fertiger Text: Klasse
   entfernt, Caret bleibt der statische Strich von oben. Unter reduced
   motion greift diese Klasse ohnehin nie (main.js zeigt dort sofort den
   vollen Text), Block 18 kappt die Animation zusätzlich sicherheitshalber. */
@keyframes caret-blink{0%,49%{opacity:1}50%,100%{opacity:0}}
.expose-out.typing #expose-text::after{
  animation:caret-blink 1s step-end infinite;
}

.demo-timer{
  display:flex;
  align-items:baseline;
  gap:.85rem;
  margin-top:clamp(2rem,4vw,3rem);
  padding-top:clamp(1rem,2vw,1.5rem);
  border-top:1px solid var(--line);
}
#timer{
  color:var(--ink);
  font-size:clamp(2.75rem,1.9rem + 4vw,5rem);
  font-weight:700;
  line-height:1;
  letter-spacing:-.035em;
  font-variant-numeric:tabular-nums;
  transition:color .3s var(--ease);
}
/* Ab < 15:00 (Task 6: main.js setzt "urgent" auf #timer) */
#timer.urgent{color:var(--blue)}
.demo-timer .unit{
  color:var(--ink-45);
  letter-spacing:.2em;
}
@media (min-width:64rem){.demo-timer{justify-content:flex-end}}

#demo .abbinder{
  margin-top:clamp(2rem,4vw,2.75rem);
  max-width:52ch;
  font-size:var(--step-0);
}

/* --- 13. Ablauf / Rail (04) ---------------------------------------------- */

/* Abgrenzungs-Lead unter der H2: die Kernaussage gegen den "0815-KI-Kurs"
   (bisher nur in der Meta-Description) steht jetzt sichtbar am Ablauf. */
#ablauf .abbinder{
  margin-top:clamp(1rem,2.5vw,1.5rem);
  max-width:52ch;
  font-size:var(--step-1);
  line-height:1.55;
  text-wrap:pretty;
}

/* Establishing Shot: das grosse Workshop-Bild zwischen Lead und Rail. Es
   sitzt bewusst exakt auf der Inhaltsspalte (kein Bleed) -- die Rail
   darunter bricht als einziges Element nach rechts aus, dadurch bleibt der
   Ausbruch eine Aussage ("es geht noch weiter") statt eine Gewohnheit.
   Der blaue Eckstrich ist derselbe wie auf den Stationskarten und
   verklammert Bild und Rail optisch. */
.ablauf-shot{
  position:relative;
  margin-top:clamp(2.25rem,5vw,3.25rem);
  border:1px solid var(--line);
  background:var(--offwhite);
}
.ablauf-shot::before{
  content:"";
  position:absolute;
  z-index:2;
  top:-1px;left:-1px;
  width:4.5rem;height:2px;
  background:var(--blue);
}
/* height:auto ist hier nicht kosmetisch, sondern Pflicht: Die width/height-
   Attribute am <img> (gegen CLS gesetzt) landen als Presentational Hint in
   den CSS-Kaskade -- ohne ein Author-`height` bliebe die Pixelhöhe aus dem
   Attribut stehen und würde aspect-ratio komplett aushebeln (das Bild
   rendert dann in Originalhöhe). Gilt genauso für .station-shot img. */
.ablauf-shot img{
  width:100%;
  height:auto;
  aspect-ratio:16/10;
  object-fit:cover;
  object-position:center 45%;
}

.rail-stage{margin-top:clamp(2.5rem,6vw,4rem)}

.rail{
  --rail-gap:clamp(1rem,2.5vw,1.25rem);
  --station-pad:clamp(1.35rem,3.2vw,1.85rem);
  display:flex;
  flex-direction:column;
  gap:var(--rail-gap);
  counter-reset:st;
}
/* Karte = Bildkopf + Textkörper. Das Padding liegt seit dem Bildeinbau auf
   .station-body statt auf .station selbst, damit der Bildkopf randlos bis
   an die Hairline der Karte läuft; flex-column + flex:1 auf dem Textkörper
   hält alle Karten im Flex-Band (align-items:stretch) auf gleicher Höhe,
   obwohl die Texte unterschiedlich lang sind. */
.station{
  position:relative;
  overflow:hidden;
  display:flex;
  flex-direction:column;
  border:1px solid var(--line);
  background:var(--paper);
  counter-increment:st;
}
/* Blauer Eckstrich: lag früher auf der Kartenoberkante. Dort liegt seit
   dem Bildeinbau das Foto, und je nach Motiv (helles Fenster, dunkler
   Glasrahmen) verschwand er darin. Er sitzt jetzt auf der Hairline
   zwischen Bild und Text: immer derselbe ruhige Untergrund, und er
   markiert genau die Stelle, an der das Foto in den Inhalt übergeht. */
.station-shot{
  position:relative;
  border-bottom:1px solid var(--line);
  background:var(--offwhite);
}
.station-shot::after{
  content:"";
  position:absolute;
  z-index:2;
  left:0;bottom:-1px;
  width:3rem;height:2px;
  background:var(--blue);
}
.station-shot img{
  width:100%;
  height:auto;
  aspect-ratio:3/2;
  object-fit:cover;
}
.station-body{
  position:relative;
  flex:1;
  padding:var(--station-pad);
}
/* Stationsnummer: früher eine grosse Geisterziffer hinter dem Fliesstext --
   mit Bildkopf wurde die Karte dadurch unruhig, und beim längsten Text
   (Station 03) lag die Ziffer direkt unter der letzten Zeile. Sie sitzt
   jetzt als kleine Tabellenziffer rechts auf der Höhe der Uhrzeit und
   bildet mit ihr eine Meta-Zeile, die den Sektions-Eyebrow ("04 · 13:00")
   auf Kartenebene wiederholt. */
.station-body::after{
  content:counter(st,decimal-leading-zero);
  position:absolute;
  top:var(--station-pad);
  right:var(--station-pad);
  margin-right:-.14em;
  color:var(--ink-45);
  font-size:var(--step--1);
  font-weight:600;
  letter-spacing:.14em;
  line-height:1;
  font-variant-numeric:tabular-nums;
}
.station h3{
  margin-bottom:.7rem;
  font-size:var(--step-1);
  font-weight:700;
  line-height:1.22;
}
.station .t{
  display:block;
  margin-bottom:.45rem;
  color:var(--blue-deep);
  font-size:var(--step--1);
  font-weight:600;
  letter-spacing:.14em;
  line-height:1;
  font-variant-numeric:tabular-nums;
}
.station p{
  position:relative;
  z-index:1;
  max-width:36ch;
  color:var(--ink-70);
}

@media (min-width:64rem){
  /* #ablauf ist die einzige Sektion, die höher als der Viewport ist: H2 und
     Establishing Shot laufen normal durch, erst .rail-stage wird gepinnt.
     padding-bottom:0 ist dafür konstitutiv -- der ScrollTrigger pinnt mit
     start:'bottom bottom' (siehe main.js), das gepinnte Fenster ist also
     exakt das letzte 100svh der Sektion. Nur wenn .rail-stage bündig am
     Sektionsende sitzt und selbst genau 100svh hoch ist, deckt sich dieses
     Fenster mit der Rail-Bühne. */
  #ablauf{align-content:start;padding-bottom:0}

  /* Breiter Ausschnitt statt 16:10: Auf Desktop soll das Bild als Band
     wirken, nicht als Kachel. object-fit:cover schneidet dafür oben/unten
     ab, max-height deckelt es zusätzlich auf hohen Viewports -- sonst
     würde die Sektion vor der Rail unnötig lang. */
  .ablauf-shot img{aspect-ratio:2.35;max-height:58svh}

  .rail-stage{
    grid-column:content-start/full-end;
    display:grid;
    align-content:center;
    min-height:100svh;
    margin-top:0;
    padding-block:clamp(2rem,7vh,4rem);
  }

  /* min-width:0 ist konstitutiv für die Fahrmechanik: .rail ist seit dem
     Bildeinbau ein Grid-Item in .rail-stage und hätte damit den Default
     min-width:auto -- das Grid-Item würde also auf die Gesamtbreite seiner
     Karten (max-content) aufgehen statt auf die Spaltenbreite. scrollWidth
     wäre dann identisch mit clientWidth, distance() in main.js käme auf 0
     und die Rail stünde still (experimentell verifiziert). */
  .rail{
    --rail-gap:1.5rem;
    min-width:0;
    flex-direction:row;
    padding-bottom:1.75rem;
    scrollbar-width:thin;
    scrollbar-color:var(--ink-15) transparent;
  }
  /* Endabstand als echtes Flex-Element statt padding-right: Chrome zählt
     End-Padding eines überlaufenden Flex-Containers NICHT in scrollWidth,
     die Fahrdistanz in main.js (scrollWidth - clientWidth) hätte den
     Abstand also ignoriert und die letzte Karte wäre exakt bündig mit der
     Viewport-Kante stehen geblieben statt auf dem rechten Gutter (mit
     Screenshot verifiziert). Breite = Gutter minus Rail-Gap, weil vor dem
     Spacer noch ein gap liegt -- so endet Karte 04 genau auf der
     Gutter-Linie, auf der auch der Header-CTA endet. */
  .rail::after{
    content:"";
    flex:0 0 calc(var(--gutter) - var(--rail-gap));
  }
  .station{
    flex:0 0 clamp(22rem,29vw,27rem);
  }
  .rail::-webkit-scrollbar{height:5px}
  .rail::-webkit-scrollbar-track{background:rgba(11,18,21,.06);border-radius:99px}
  .rail::-webkit-scrollbar-thumb{background:var(--blue-soft);border-radius:99px}

  /* Rail-Scoping (C3): overflow-x/scroll-snap-type/scroll-snap-align nur
     an der nativen Task-3-Zwischenlösung (.rail OHNE "rail-gsap") gesetzt,
     statt sie generell zu setzen und per .rail.rail-gsap-Override wieder
     zurückzunehmen -- die zurückgenommenen Werte (overflow-x:visible,
     scroll-snap-type:none, scroll-snap-align:none) waren ohnehin exakt die
     Browser-Defaults, der Override war damit reine Symptombekämpfung einer
     zu weit gefassten Basisregel.
     GSAP-Modus (Task 7): main.js pinnt #ablauf und fährt die Rail per
     transform:x. Die native Zwischenlösung (overflow-x:auto + scroll-snap
     unten) würde dabei mit der GSAP-Translation kollidieren (doppelte
     Scroll-Mechanik auf derselben Achse) — main.js setzt daher ".rail-gsap"
     auf .rail, sobald matchMedia (≥64rem UND !reduced) zuschlägt, und
     entfernt sie wieder, sobald die Bedingung nicht mehr zutrifft (z.B.
     Resize auf Mobile-Breite oder reduced motion); die :not(.rail-gsap)-
     Basisregeln unten greifen dadurch automatisch nur, wenn die GSAP-Fahrt
     inaktiv ist. */
  .rail:not(.rail-gsap){
    overflow-x:auto;
    scroll-snap-type:x proximity;
  }
  .rail:not(.rail-gsap) .station{scroll-snap-align:start}
}

/* Fortschrittslinie unter dem Band (Task 7, Schritt 2): dünner Track +
   Füll-Element. scaleX statt width, damit main.js beim Scrubben rein
   compositor-seitig animiert (kein Layout-Thrash) — transform-origin
   links, damit die Füllung von links nach rechts wächst. Nur ab 64rem
   sichtbar, da die Rail-Mechanik selbst nur dort läuft (siehe oben);
   darunter bleibt die vertikale Kartenliste ohne Fortschrittsanzeige. */
.rail-progress{
  display:none;
}
@media (min-width:64rem){
  .rail-progress{
    display:block;
    margin-top:-.75rem;
    height:2px;
    background:var(--line);
  }
  .rail-progress .rail-progress-fill{
    width:100%;
    height:100%;
    background:var(--blue);
    transform:scaleX(0);
    transform-origin:left center;
  }
}

/* --- 14. Gründer (05) ---------------------------------------------------- */

.gruender-inner{
  display:grid;
  gap:clamp(2rem,5vw,4rem);
  margin-top:clamp(2.5rem,6vw,4rem);
  align-items:start;
}
@media (min-width:64rem){
  /* align-items:start statt center: Der Textblock beginnt mit einer 2px
     starken Oberlinie -- vertikal zentriert lag diese Linie 92px unter der
     Oberkante des Portraits und wirkte wie ein Ausrichtungsfehler, weil
     zwei klare Kanten knapp nebeneinander sassen, ohne sich zu treffen.
     Oben ausgerichtet fallen Portraitkante und Textlinie exakt zusammen;
     der Weissraum sammelt sich stattdessen unter dem Text, wo er als
     Atempause liest statt als Versatz. */
  .gruender-inner{
    grid-template-columns:minmax(0,.78fr) minmax(0,1.22fr);
    align-items:start;
  }
}
.gruender-copy h3{
  padding-top:1.25rem;
  border-top:2px solid var(--ink);
  font-size:var(--step-2);
  font-weight:700;
  letter-spacing:-.025em;
  line-height:1.15;
}
.gruender-copy p{
  margin-top:1.25rem;
  max-width:54ch;
  color:var(--ink-70);
  line-height:1.75;
  text-wrap:pretty;
}
/* inline-flex + min-height:44px statt inline-block: Der Link ist ein
   eigenständiges Ziel (kein Inline-Link im Fließtext, für die WCAG 2.5.5
   die Ausnahme vorsieht) und maß zuvor nur 25px Höhe. align-items:flex-end
   hält den Unterstrich direkt an der Schrift, während die Trefferfläche
   nach oben auf 44px wächst. */
.linkedin-link{
  display:inline-flex;
  align-items:flex-end;
  min-height:44px;
  margin-top:1.75rem;
  padding-bottom:.2rem;
  border-bottom:1px solid var(--blue-soft);
  color:var(--blue-deep);
  font-size:var(--step--1);
  font-weight:600;
  letter-spacing:.06em;
  text-decoration:none;
  word-break:break-word;
  transition:border-color .25s var(--ease),color .25s var(--ease);
}
/* Hover behält --blue-deep als Textfarbe (nur der Unterstrich wird
   kräftiger) — ein Wechsel auf --blue würde die Textfarbe ausgerechnet im
   Hover-Zustand unter 4,5:1 auf Weiß drücken. */
.linkedin-link:hover{border-color:var(--blue-deep);color:var(--blue-deep)}

/* --- 15. Pakete (06) ----------------------------------------------------- */

.pakete-grid{
  display:grid;
  gap:clamp(1.5rem,3vw,1.75rem);
  margin-top:clamp(2.5rem,6vw,4.5rem);
}
.paket{
  position:relative;
  display:flex;
  flex-direction:column;
  padding:clamp(1.75rem,3.5vw,2.25rem);
  border:1px solid var(--line);
  background:var(--paper);
}
/* Eigene Stufe statt var(--step-2): Bei 36px passte "Der Workshop-Tag"
   (302px) nicht mehr in die Textbreite der Karte (293px) und brach am
   Bindestrich um -- ausgerechnet beim Kernprodukt stand "Tag" allein in
   Zeile zwei. Bei max. 32px steht der Name geschlossen, und die Kartentitel
   bleiben trotzdem deutlich über der H3-Stufe der Stationen. */
.paket h3{
  font-size:clamp(1.35rem,1.05rem + 1.1vw,2rem);
  font-weight:700;
  letter-spacing:-.03em;
  line-height:1.1;
}
.paket-sub{
  margin-top:.65rem;
  color:var(--ink-70);
  font-size:var(--step-0);
  line-height:1.5;
}
.paket-bullets{
  margin-top:clamp(1.5rem,3vw,1.85rem);
  padding-top:clamp(1.5rem,3vw,1.85rem);
  border-top:1px solid var(--line);
  list-style:none;
  display:grid;
  gap:.8rem;
  font-size:var(--step-0);
  line-height:1.45;
}
.paket-bullets li{position:relative;padding-left:1.4rem}
.paket-bullets li::before{
  content:"";
  position:absolute;
  left:0;top:.55em;
  width:.4rem;height:.4rem;
  background:var(--blue);
}
.paket-preis{
  margin-top:auto;
  padding-top:clamp(1.75rem,3.5vw,2.25rem);
  color:var(--ink-45);
  letter-spacing:.16em;
}
.paket .cta-button{
  width:100%;
  margin-top:1rem;
  justify-content:space-between;
  border-color:var(--blue-soft);
  background:transparent;
  color:var(--blue-deep);
  box-shadow:none;
}
.paket .cta-button:hover{
  border-color:var(--blue-deep);
  background:var(--blue-deep);
  color:#fff;
}

.paket.featured{
  border-color:var(--blue);
  box-shadow:0 34px 70px -46px color-mix(in srgb, var(--blue-deep) 75%, transparent);
}
@media (min-width:64rem){
  .paket.featured{transform:scale(1.035);z-index:2}
}
.featured .cta-button{
  border-color:var(--blue-deep);
  background:var(--blue-deep);
  color:#fff;
}
.featured .cta-button:hover{border-color:var(--blue-hover);background:var(--blue-hover)}

/* Ab 64rem: Subgrid richtet Titel, Sub, Bullets, Preis und CTA
   über alle drei Karten hinweg auf einer Linie aus. */
@media (min-width:64rem){
  .pakete-grid{
    grid-template-columns:repeat(3,minmax(0,1fr));
    grid-template-rows:auto auto 1fr auto auto;
    row-gap:0;
    align-items:stretch;
  }
  .paket{
    display:grid;
    grid-row:span 5;
    grid-template-rows:subgrid;
  }
}

.badge{
  position:absolute;
  top:0;left:clamp(1.75rem,3.5vw,2.25rem);
  transform:translateY(-50%);
  padding:.4rem .7rem;
  background:var(--blue-deep);
  color:#fff;
  font-size:.6875rem;
  font-weight:600;
  letter-spacing:.16em;
  line-height:1;
  text-transform:uppercase;
}

/* --- 16. FAQ & Abschluss (07) -------------------------------------------- */

.faq-liste{
  margin-top:clamp(2.5rem,6vw,4rem);
  border-top:1px solid var(--line);
}
.faq-liste details{border-bottom:1px solid var(--line)}

.faq-liste summary{
  display:flex;
  align-items:center;
  justify-content:space-between;
  gap:1.5rem;
  padding-block:clamp(1rem,2.4vw,1.35rem);
  cursor:pointer;
  list-style:none;
  font-size:var(--step-1);
  font-weight:600;
  letter-spacing:-.01em;
  line-height:1.35;
  transition:color .25s var(--ease);
}
.faq-liste summary::-webkit-details-marker{display:none}
.faq-liste summary:hover{color:var(--blue-deep)}

/* Plus / Minus aus zwei Hairlines */
.faq-liste summary::after{
  content:"";
  flex:0 0 auto;
  width:.875rem;height:.875rem;
  background:
    linear-gradient(var(--blue),var(--blue)) center/100% 1.5px no-repeat,
    linear-gradient(var(--blue),var(--blue)) center/1.5px 100% no-repeat;
  transition:transform .3s var(--ease);
}
.faq-liste details[open] summary::after{
  background:linear-gradient(var(--blue),var(--blue)) center/100% 1.5px no-repeat;
  transform:rotate(180deg);
}

.faq-liste details p{
  max-width:64ch;
  padding-right:2.5rem;
  padding-bottom:clamp(1.25rem,2.6vw,1.6rem);
  color:var(--ink-70);
  line-height:1.7;
  text-wrap:pretty;
}

.abschluss-cta{
  display:grid;
  gap:clamp(1.75rem,4vw,2.5rem);
  margin-top:clamp(3rem,7vw,5rem);
  justify-items:start;
}
/* Cal.com-Slot: min-height fest reserviert, damit das Nachladen des
   Embeds (Netzwerk-Request an app.cal.com) das Layout nicht springen
   lässt -- der Container hat vom ersten Render an bereits Platz für den
   Kalender. #cal-inline füllt die reservierte Höhe; der Fallback-Link
   bleibt unabhängig vom Embed-Ladezustand sichtbar (Offline/Blocker-Fall). */
.cal-slot{
  width:100%;
  max-width:44rem;
  min-height:clamp(26rem,55vw,38.75rem);
  display:flex;
  flex-direction:column;
  gap:1rem;
}
/* Ladezustand: Der reservierte Platz allein blieb bis zum Eintreffen des
   Embeds eine leere Fläche ohne jedes Feedback (UX-Regel "loading-states":
   ab ~300ms Wartezeit gehört eine sichtbare Rückmeldung hin, und der
   Request geht an einen Fremdhost). Das Shimmer liegt als
   background-image auf #cal-inline selbst und verschwindet automatisch,
   sobald Cal.com seinen iframe hineinrendert -- der füllt den Container
   deckend, es braucht also kein JS, das den Zustand zurücksetzt. */
#cal-inline{
  width:100%;
  min-height:clamp(22rem,48vw,33rem);
  border:1px solid var(--line);
  background:
    linear-gradient(90deg,
      transparent 0%,
      rgba(255,255,255,.65) 50%,
      transparent 100%) 0 0/38% 100% no-repeat,
    var(--offwhite);
  animation:cal-shimmer 1.6s var(--ease) infinite;
}
@keyframes cal-shimmer{
  from{background-position:-45% 0}
  to{background-position:145% 0}
}
/* Ohne Animation (reduced motion greift über Block 18 nur auf die
   Laufzeit, nicht auf die Fläche) bleibt eine ruhige, klar als
   "reserviert" lesbare Fläche stehen. */
@media (prefers-reduced-motion:reduce){
  #cal-inline{background:var(--offwhite)}
}
.cal-fallback{
  color:var(--ink-70);
  font-size:var(--step-0);
}
.cal-fallback a{
  color:var(--blue-deep);
  font-weight:600;
  text-decoration:none;
  border-bottom:1px solid var(--blue-soft);
  transition:border-color .25s var(--ease);
}
.cal-fallback a:hover{border-color:var(--blue-deep)}

/* --- 17. Footer ---------------------------------------------------------- */

footer{
  position:relative;
  z-index:2;
  display:flex;
  flex-wrap:wrap;
  align-items:center;
  gap:1rem 2rem;
  padding:clamp(2.5rem,6vw,3.5rem) max(var(--gutter),calc((100% - var(--maxw))/2));
  background:var(--ink);
  color:rgba(255,255,255,.62);
  font-size:var(--step--1);
  letter-spacing:.02em;
}
.logo-footer{height:clamp(1.85rem,3vw,2.35rem);width:auto}
footer p{margin-right:auto}
.footer-link{
  color:rgba(255,255,255,.82);
  text-decoration:none;
  border-bottom:1px solid rgba(255,255,255,.24);
  padding-bottom:.15rem;
  transition:color .25s var(--ease),border-color .25s var(--ease);
}
.footer-link:hover{color:#fff;border-color:var(--blue)}

/* Nur die DIREKTEN Footer-Kinder (Impressum, Datenschutz) sind
   eigenständige Ziele und maßen zuvor ~24px Höhe. Bewusst über den
   Kind-Kombinator statt über .footer-link selbst: Die E-Mail-Adresse trägt
   dieselbe Klasse, steht aber als Inline-Link mitten im Adress-Satz (im
   <p>) -- inline-flex würde sie dort aus dem Textfluss heben. Inline-Links
   in einem Textblock sind von der 44px-Regel ohnehin ausgenommen
   (WCAG 2.5.5). */
footer>.footer-link{
  display:inline-flex;
  align-items:flex-end;
  min-height:44px;
}
footer :focus-visible{outline-color:#fff}

@media (max-width:47.99rem){
  footer p{width:100%;margin-right:0}
}

/* --- 18. Reduced Motion -------------------------------------------------- */

@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{
    animation-duration:.01ms !important;
    animation-iteration-count:1 !important;
    transition-duration:.01ms !important;
    scroll-behavior:auto !important;
  }
}

/* --- 19. Scroll-Engine: Reveal-Startzustände (Task 4/5) ------------------ */
/* Nur main.js setzt die Klasse "js-scroll" (und nur, wenn nicht reduced
   motion) — erst dann greifen diese opacity:0-Startzustände. Ohne JS bzw.
   bei reduced motion bleibt die Klasse aus und der gesamte Inhalt ist von
   Anfang an sichtbar (progressive enhancement). Die y-Versatz-Werte für die
   Einblend-Animation setzt GSAP selbst (siehe main.js .fromTo()-Aufrufe) —
   hier wird nur die Sichtbarkeit gesteuert, um Werte nicht zu duplizieren. */

.js-scroll #hero h1 .line,
.js-scroll .hero-copy .sub,
.js-scroll .hero-copy .cta-button,
.js-scroll .hero-copy .cta-note,
.js-scroll #problem .zeitfresser,
.js-scroll #problem .abbinder,
.js-scroll #ablauf .ablauf-shot,
.js-scroll #gruender .gruender-copy,
.js-scroll #pakete .paket{
  opacity:0;
}

/* --- 20. FAQ-Öffnen-Animation (Task 8) ------------------------------ */
/* Reines CSS, kein JS: ::details-content (Chromium 131+) ist die vom
   Browser generierte Wrapper-Box um den Inhalt von <details> (alles außer
   <summary>) und lässt sich unabhängig vom nativen Auf-/Zuklappen
   transitionieren -- damit animieren Öffnen UND Schließen gleichermaßen
   (der alte Ansatz über die Höhe des <p> animierte nur das Öffnen, weil
   das Entfernen von [open] den Inhalt sofort nativ versteckte). Der
   @supports-Guard prüft interpolate-size, da beide Features im selben
   Chromium-Release landeten und interpolate-size zuverlässig feature-
   detectable ist; ohne Unterstützung bleibt Block 16 unverändert wirksam:
   natives, sofortiges Auf-/Zuklappen ohne jede Animation (details/summary
   funktioniert immer nativ, auch ohne JS/CSS hier -- reiner Fortschritts-
   Fallback, keine Funktionseinbuße). content-visibility läuft per
   allow-discrete mit, damit der Inhalt während der block-size-Transition
   sichtbar/interaktionsfähig bleibt statt sofort auszublenden. */
@supports (interpolate-size: allow-keywords){
  .faq-liste details{interpolate-size:allow-keywords}
  .faq-liste details::details-content{
    block-size:0;
    overflow:hidden;
    transition:block-size .35s var(--ease),content-visibility .35s allow-discrete;
  }
  .faq-liste details[open]::details-content{
    block-size:auto;
  }
}
