/* ===========================================================================
   Labor-Flug  ·  Hero-Modul fuer eaproof.com
   ---------------------------------------------------------------------------
   Eigenstaendig. Wird NACH landing.css geladen, aendert dort nichts und
   benutzt nur eigene Klassen mit dem Praefix hf-. Kollidiert deshalb nicht mit
   dem, was ein anderer Chat parallel an landing.css macht.

   Farben, Radius und Schriften kommen aus den Variablen von landing.css. Wenn
   du dort etwas aenderst, zieht dieses Modul automatisch mit.

   Aufbau:
     .hf       hohe Sektion, ihre Hoehe IST die Scrollstrecke des Flugs
     .hf-pin   klebt oben fest, solange .hf durchs Bild laeuft (position:sticky)

   Bewusst sticky und nicht fixed: sticky loest sich am Ende der Sektion von
   selbst wieder, und der Rest der Seite scrollt normal weiter. Mit fixed
   muesste man diesen Moment in JavaScript nachbauen, und genau da entstehen
   die Ruckler, die man auf solchen Seiten oft sieht.
   =========================================================================== */

.hf{
  position:relative;
  /* Scrollstrecke. Die letzten 20 Prozent davon sind Standzeit vor dem Ring,
     siehe HOLD in hero-flug.js. Kuerzer = schnellerer Flug.

     16.08.2026: von 940vh auf 640vh. 940vh waren 8,4 Bildschirme Scrollweg, bevor
     ein Fremder den ersten Inhalt unter dem Flug erreicht. Jetzt sind es 5,4.

     WER DIESE ZAHL AENDERT, AENDERT HOLD MIT. Die Standzeit ist ein ANTEIL der
     Strecke, kein fester Weg: bei 940vh und HOLD 0.86 blieben 1,2 Bildschirme
     Standzeit vor dem Score-Ring, bei 640vh waeren es mit demselben HOLD nur noch
     0,75. Der Hoehepunkt der Reise faellt dann in das am schnellsten bewegte Stueck
     des Scrollwegs, und man scrollt auf die Zahl und im selben Zug daran vorbei.
     Deshalb steht HOLD jetzt auf 0.80, das ergibt wieder gut einen Bildschirm.
     tools/test-heroflug.js rechnet beides gegeneinander. */
  height:640vh;
  background:var(--bg);

  /* WICHTIG: landing.css gibt jedem <section> oben und unten Innenabstand.
     Erbt die Flugsektion den, startet die feste Ebene 76 Pixel zu tief und
     RUTSCHT waehrend der ersten 76 Scrollpixel nach oben, bevor sie andockt.
     Sieht aus, als wuerde das Gebaeude die Hoehe wechseln. */
  padding:0;

  /* Unter die Kopfzeile ziehen, damit das Bild randlos ist und die Knoepfe
     schon beim ersten Bild vollstaendig sichtbar sind.

     Der Wert entspricht immer der AKTUELLEN Hoehe der Kopfzeile, gesetzt von
     hero-flug.js. Das ist kein Schoenheitsdetail: die Kopfzeile schrumpft beim
     Andocken von 61 auf 53 Pixel, und weil sie im Fluss steht, ruckt dabei die
     ganze Seite 8 Pixel nach oben. Weil der negative Abstand mitschrumpft,
     bleibt die Oberkante der Sektion exakt stehen und das Rucken faellt weg.

     Der Rueckfallwert 61px gilt, bis das Skript laeuft. Ohne ihn wuerde die
     Seite beim Laden einmal sichtbar springen. */
  margin-top:calc(-1 * var(--hf-hdr, 61px));
}

.hf-pin{
  position:sticky; top:0;
  height:100vh; height:100svh;  /* svh: auf dem Handy ohne Sprung beim Ein- und
                                   Ausblenden der Browserleiste */
  overflow:hidden;
  background:var(--bg) center/cover no-repeat;   /* Poster wird per JS gesetzt */
}

.hf-vid{
  position:absolute; inset:0;
  width:100%; height:100%;
  object-fit:cover; display:block;
}

/* Abdunklung. Oben und unten kraeftiger, damit Ueberschrift und Karte sicher
   ueber 4.5:1 Kontrast kommen, in der Mitte zurueckhaltend, damit der Raum
   sichtbar bleibt. Die einzige Stelle mit Verlauf, und sie ist funktional. */
.hf-veil{
  position:absolute; inset:0; pointer-events:none;
  background:linear-gradient(180deg,
    rgba(6,10,14,.74) 0%, rgba(6,10,14,.26) 32%,
    rgba(6,10,14,.28) 62%, rgba(6,10,14,.82) 100%);
}

/* --- Hero: nur Frage und die beiden Knoepfe --------------------------------- */
/* Ueberschrift oben, wo im ersten Bild der leere Himmel ueber dem Gebaeude ist.
   Unten waere sie mit der Faktenkarte auf einer Hoehe und wuerde das Gebaeude
   verdecken, das im ersten Bild die Hauptsache ist. */
.hf-hero{
  position:absolute; z-index:2;
  left:clamp(24px,5vw,80px); top:clamp(96px,17vh,200px);
  /* SPANNT SEIT DEM 08.08.2026 UEBER DIE VOLLE BREITE, und das ist kein Layoutgeschmack,
     sondern die Bedingung dafuer, dass der Stoerer rechts mit ausblendet. hero-flug.js
     setzt Deckkraft und Verschiebung des Flugs auf genau EIN Element (.hf-hero). Ein
     Stoerer als Geschwister in .hf-pin haette diese Behandlung nicht bekommen und waere
     ueber die ganzen 800vh Flugstrecke ueber dem Labor stehen geblieben.
     Die Textbreite wandert dafuer auf die Kinder: h1 und .hf-cta tragen sie jetzt
     selbst. Ohne das liefe die Ueberschrift bis an den rechten Rand. */
  right:clamp(24px,5vw,80px);
  text-align:left;
  will-change:opacity,transform;
}
.hf-hero h1,.hf-hero .hf-cta{max-width:min(700px,58vw)}
.hf-hero h1{
  font-size:clamp(32px,5.2vw,64px); font-weight:700;
  letter-spacing:-.025em; line-height:1.04; margin:0 0 30px;
  text-shadow:0 2px 50px rgba(6,10,14,.95);
}
.hf-hero h1 em{font-style:normal; color:var(--acc)}
/* Der dein/sein-Wechsel aus landing.css laeuft hier unveraendert weiter: die
   Regeln .wswap sind nicht an .hero gebunden und greifen auch im Flug.
   Erster Versuch war, ihn abzuschalten. Das ging schief, weil dabei nur "sein"
   versteckt wurde, "dein" aber weiterhin ausgeblendet blieb -- ein halb
   unsichtbares Wort in der Ueberschrift. Also gar nicht eingreifen. */

.hf-cta{display:flex; gap:12px; flex-wrap:wrap}
.hf-btn{
  font:600 15px var(--sans); padding:15px 26px; border-radius:var(--r);
  text-decoration:none; border:1px solid transparent; display:inline-block;
  transition:transform .3s var(--ease), background .3s var(--ease);
}
.hf-btn-acc{background:var(--acc); color:#04120e}
.hf-btn-ghost{
  border-color:rgba(234,242,247,.28); color:var(--text);
  background:rgba(13,20,28,.4);
  backdrop-filter:blur(10px); -webkit-backdrop-filter:blur(10px);
}
.hf-btn:hover{transform:translateY(-2px)}
.hf-btn:focus-visible{outline:2px solid var(--blue); outline-offset:3px}

/* --- Stoerer Early Bird, rechts im Hero (08.08.2026) ------------------------
   Vorgaenger war eine Pille unter den Knoepfen. Alex dazu: "hab also 1h
   gewartet und sehe auf der starte eine pille.... ein stueck text." Seine
   Vorgabe war ein Stoerer rechts, und aus vier Entwuerfen hat er den mit dem
   Platzbalken gewaehlt.
   DIE PILLE IST ENTFALLEN, nicht ergaenzt. Zwei Kaesten mit derselben Aussage
   auf einem Bildschirm machen sie beliebiger, nicht dringlicher.
   Rechts und auf halber Hoehe, weil links die Ueberschrift steht und der
   Hauptknopf das lauteste Element im Hero bleiben soll: der Stoerer traegt
   deshalb KEINE gefuellte Akzentflaeche, sondern nur Rand und Schrift in der
   Akzentfarbe. Zwei ausgefuellte Aufforderungen nebeneinander waeren zwei
   Empfehlungen, und es gibt nur eine. */
.stoerer{
  /* Der negative Versatz ist gemessen, nicht geraten: mit top:100% sass die Karte
     100 px tiefer als im Entwurf, den Alex gewaehlt hat. Waagerecht kann sie
     nichts verdecken, links steht nur der Definitionssatz und der endet weit
     vor der Kartenkante. tools/test-stoerer.js prueft die Ueberlappung mit
     Ueberschrift und Hauptknopf, falls die Ueberschrift einmal drei Zeilen
     braucht. */
  position:absolute; right:0; top:calc(100% - 66px); z-index:3;
  display:block; width:272px; box-sizing:border-box;
  padding:15px 17px 14px; border-radius:16px;
  border:1px solid color-mix(in srgb, var(--acc) 40%, transparent);
  background:color-mix(in srgb, var(--acc) 11%, rgba(9,14,20,.62));
  backdrop-filter:blur(12px); -webkit-backdrop-filter:blur(12px);
  text-decoration:none; color:var(--text);
  box-shadow:0 18px 50px rgba(6,10,14,.5);
  transition:transform .3s var(--ease), border-color .3s var(--ease);
}
.stoerer:hover{transform:translateY(-3px); border-color:color-mix(in srgb, var(--acc) 70%, transparent)}
.stoerer:focus-visible{outline:2px solid var(--blue); outline-offset:3px}

/* DER SCHEIN (09.08.2026). Alex: "kann man optisch noch was beim angebot rechts
   machen? eine animation. ein leuchten oder so was?" Fuenf Varianten als Mockup
   (docs/mockup-stoerer-glanz.html), gewaehlt hat er das langsame Atmen. Die erste
   Fassung war ihm zu schwach, die Staerke hat er danach an einem Regler auf
   STUFE 8 von 10 gestellt; die Zahlen unten sind genau diese Stufe.
   Ueber Stufe 8 hinaus wird der Stoerer lauter als die Ueberschrift daneben.

   ES IST EIN PSEUDOELEMENT UND KEIN <span>. Damit bleibt public/landing.html
   unangetastet, und die Datei liegt in der anderen Sitzung -- eine Aenderung dort
   waere eine vermeidbare Kollision vier Tage vor dem Start.

   BEWEGT WIRD NUR DIE DECKKRAFT. Einen box-shadow selbst zu animieren zwingt den
   Browser, die Weichzeichnung in jedem einzelnen Bild neu zu rechnen; die Deckkraft
   eines fertigen Elements kostet praktisch nichts. Auf einer Seite, die daneben ein
   Video abspielt, ist das kein Feinschliff.

   DER 1-PIXEL-RING IST DER WICHTIGERE TEIL. In der ersten Fassung atmete nur die
   weiche Wolke aussen, und Alex sah sie fast nicht -- das Auge fasst eine scharfe
   Kante deutlich frueher als einen Verlauf. Der Ring liegt durch inset:-1px genau
   auf der Kartenkante.

   KEIN z-index:-1 und keine eigene Flaeche: das Element hat keinen Hintergrund,
   ein aeusserer Schatten wird ausserhalb des Rahmens gezeichnet. Es liegt damit
   ueber der Karte, verdeckt aber nichts. Mit z-index:-1 geriete es hinter den
   backdrop-filter der Karte, und dessen Weichzeichnung wuerde den Schein
   mitverwaschen. */
.stoerer::before{
  content:''; position:absolute; inset:-1px; border-radius:16px;
  pointer-events:none; opacity:.19;
  box-shadow:
    0 0 0 1px color-mix(in srgb, var(--acc) 84%, transparent),
    0 0 62px 11px color-mix(in srgb, var(--acc) 58%, transparent);
  animation:stoererAtmen 6s ease-in-out infinite;
}
@keyframes stoererAtmen{ 0%,100%{opacity:.19} 50%{opacity:1} }
/* Beim Ueberfahren steht der Schein still und ganz oben. Ohne das laeuft die
   Karte unter dem Zeiger weiter vor sich hin und die Beruehrung bleibt folgenlos --
   und der Randwechsel des :hover darueber ginge im Atmen unter. */
.stoerer:hover::before{animation:none; opacity:1}
.st-kopf{display:block; font:700 15.5px/1.25 var(--sans); letter-spacing:-.01em}

/* Der Balken. Bahn dunkel, Fuellung in der Akzentfarbe, Breite kommt aus dem
   Skript. Bei zwei von fuenfzig vergebenen Plaetzen sind das 4 Prozent, also
   ein Strich -- gewollt: er ist eine Messung und keine Dekoration, und er
   waechst mit den Verkaeufen. Die min-width haelt ihn sichtbar, damit "zwei
   vergeben" nicht wie "keiner" aussieht. */
.st-bahn{
  display:block; height:5px; margin:11px 0 9px; border-radius:999px;
  background:rgba(234,242,247,.14); overflow:hidden;
}
.st-bahn i{
  display:block; height:100%; width:0; border-radius:999px;
  background:var(--acc); transition:width .8s var(--ease);
}
.st-zahl{display:block; font:500 13px/1.35 var(--sans); color:var(--mut)}
.st-zahl b{color:var(--text); font-weight:700}
/* Die Aufforderung traegt den Pfeil als eigenes Zeichen im Fluss, nicht als
   ::after mit Abstand: im Entwurf B ist genau daran der Pfeil allein in die
   zweite Zeile gerutscht. Ein geschuetztes Leerzeichen davor haelt ihn am Wort. */
.st-cta{
  display:block; margin-top:11px; padding-top:11px;
  border-top:1px solid color-mix(in srgb, var(--acc) 22%, transparent);
  font:700 13px/1.3 var(--sans); color:var(--acc);
}
.st-cta::after{content:'\00a0→'}

/* Schmale Schirme: der Stoerer steht im Fluss unter dem Definitionssatz statt
   rechts daneben. Rechts waere er dort auf 390 px entweder 100 px breit oder
   ueber der Ueberschrift. Er bleibt Kind von .hf-hero und blendet damit
   weiterhin mit dem Hero aus. */
@media (max-width:900px){
  /* relative statt static: der Schein ist ein absolut gesetztes Pseudoelement. Bei
     `static` haette es keinen positionierten Vorfahren mehr und wuerde sich an
     .hf-hero ausrichten -- das Leuchten saesse dann quer ueber dem ganzen Hero
     statt auf der Karte. Am Layout aendert `relative` hier nichts. */
  .stoerer{position:relative; width:100%; max-width:340px; margin-top:20px; padding:14px 15px 13px}
  .st-kopf{font-size:15px}
}
/* Wer Bewegung abbestellt hat, bekommt keinen wachsenden Balken und kein Atmen.
   Der Stoerer bleibt vollstaendig, nur die Bewegung faellt weg.
   DER SCHEIN VERSCHWINDET NICHT, er steht still. Er ist keine Animation, sondern
   Gestaltung; ihn ganz zu entfernen naehme dieser Gruppe die Hervorhebung, statt
   ihr die Bewegung zu ersparen. Deckkraft .62 ist die Mitte des Atmens.
   `relative` statt `static`, und das ist AUSDRUECKLICH KEINE Layoutaenderung: ohne
   Versatzangaben zeichnet `relative` genau wie `static`, das `margin-top` bleibt
   stehen. Es steht nur da, weil das Pseudoelement einen positionierten Vorfahren
   braucht -- sonst richtete sich der Schein an .hf-hero aus und laege quer ueber
   dem ganzen Hero.
   OFFEN und nicht angefasst: dieser Block schiebt den Stoerer auch am Rechner in
   den Fluss unter den Hero, aendert also das Layout unter einer Bewegungsregel.
   Am 09.08.2026 beim Einbau des Scheins aufgefallen. Es hier mitzuaendern waere ein
   zweites Thema, und der Kommentar darueber ("nur die Bewegung faellt weg") sagt,
   was eigentlich gemeint war. */
@media (prefers-reduced-motion: reduce){
  .stoerer{position:relative; margin-top:24px; transition:none}
  .stoerer::before{animation:none; opacity:.62}
  .st-bahn i{transition:none}
}

/* Definitionssatz unter den Knoepfen. Bewusst klein und ruhig: er ist fuer
   Maschinen und fuer Besucher, die wissen wollen was das hier ist, aber er
   soll die Frage in der Ueberschrift nicht verwaessern. */
.hf-def{
  margin:22px 0 0; max-width:52ch;
  color:var(--mut); font-size:14.5px; line-height:1.5;
  text-shadow:0 2px 24px rgba(6,10,14,.95);
}

/* --- Zwischenzeile im Gang -------------------------------------------------
   Zwischen Eingang und Archiv ist der Gang leer und dunkel. Ohne etwas zu lesen
   wirkt die Strecke wie Wartezeit. Die Zeile sitzt mittig auf dem Fluchtpunkt. */
.hf-line{
  position:absolute; z-index:2; left:0; right:0; top:44%;
  transform:translateY(-50%); text-align:center; padding:0 24px;
  opacity:0; pointer-events:none;
}
.hf-line b{
  display:block; font-size:clamp(28px,4.1vw,52px); font-weight:700;
  letter-spacing:-.02em; line-height:1.15;
  text-shadow:0 2px 50px rgba(6,10,14,.95);
}
.hf-line b em{font-style:normal; color:var(--acc)}
/* Die drei Fragen in den Raeumen. Etwas kleiner als die Kernzeile im Gang und auf zwei
   Zeilen gedeckelt: ueber die volle Breite gesetzt liefen sie unter die Stufentafel
   rechts, und eine Frage, die man an der Tafel vorbeilesen muss, ist keine. */
.hf-frage b{font-size:clamp(24px,3.2vw,41px); max-width:22ch; margin:0 auto}
/* Zusammengehoerige Woerter mit Bindestrich duerfen nicht mittendrin umbrechen. Der
   Browser tut das am Bindestrich von selbst, und "Cent-" am Zeilenende mit "Konten" in
   der naechsten liest sich wie zwei Woerter. */
.hf-line .nb{white-space:nowrap}
/* DIREKTES KIND, nicht jedes span (23.08.2026). Diese Regel formatiert die Unterzeile
   einer Flugzeile. Sie traf auch das <span class="nb"> INNERHALB des <b> und machte
   "Cent-Konten" klein, grau und zu einem eigenen Block. Dasselbe Fehlerbild wie bei
   .alztext > span am 30.07.2026. */
.hf-line > span{
  display:block; margin-top:12px; color:var(--mut); font-size:16px;
  text-shadow:0 2px 24px rgba(6,10,14,.95);
}

/* --- Stufentafel: Milchglas, rechts, alle vier Stufen immer sichtbar -------
   Vorher tauchte je Raum eine einzelne Kachel auf und verschwand wieder. Man
   sah zwar wo man IST, aber nicht wo im Ablauf. Jetzt stehen alle vier Stufen
   da, die aktive klappt auf. Struktur nach dem Vorbild vectrfl.com, Material
   und Farben bleiben deine. */
/* Die Bullet-Listen der Stufentafel sind am 23.08.2026 entfallen (Vorgabe Alex auf fuenf
   Bildschirmfotos). Die Aussage steht seitdem als Frage IM BILD, je Raum eine. Die Tafel
   sagt nur noch, wo im Labor man gerade ist -- das war ohnehin ihr erklaerter Zweck. */
.hf-steps{
  position:absolute; z-index:2;
  right:clamp(20px,5vw,80px); bottom:clamp(80px,13vh,140px);
  width:min(400px,38vw);
  background:rgba(11,17,23,.52);
  backdrop-filter:blur(18px) saturate(1.15);
  -webkit-backdrop-filter:blur(18px) saturate(1.15);
  border:1px solid rgba(147,166,184,.20); border-radius:var(--r);
  padding:10px 22px 12px;
  opacity:0; transform:translateY(18px); pointer-events:none;
  box-shadow:0 24px 60px -30px rgba(0,0,0,.9);
}
/* Anklickbar erst, wenn die Tafel auch sichtbar ist. hero-flug.js setzt das,
   sonst faengt eine unsichtbare Tafel Klicks ab. */
.hf-steps.is-live{pointer-events:auto}

/* <button>, damit die Sprungmarken auch mit der Tastatur erreichbar sind.
   Deshalb hier die Standardgestaltung eines Knopfes zuruecksetzen. */
.hf-step{
  display:flex; gap:14px; align-items:flex-start; width:100%;
  padding:11px 0; border:0; border-bottom:1px solid rgba(147,166,184,.12);
  background:none; text-align:left; font:inherit; color:inherit;
  cursor:pointer; -webkit-appearance:none; appearance:none;
}
.hf-step:last-child{border-bottom:0}
.hf-step:hover .hf-t{color:var(--text)}
.hf-step:hover .hf-n{border-color:rgba(63,168,143,.55); color:var(--acc)}
.hf-step.is-on:hover .hf-n{color:#04120e}
.hf-step:focus{outline:none}
/* Nur bei Tastaturbedienung. Nach einem Mausklick blieb der Ring sonst stehen,
   und ein blauer Rahmen um eine Milchglaskachel sieht nach Fehler aus.
   hero-flug.js nimmt den Fokus nach einem Zeigerklick zusaetzlich wieder weg,
   weil Chrome ihn bei <button> auch nach der Maus manchmal zeigt. */
.hf-step:focus-visible{outline:2px solid var(--blue); outline-offset:4px; border-radius:6px}

/* Nummernfeld. Ausgefuellt heisst: hier bist du. */
.hf-n{
  flex:0 0 30px; height:30px; display:grid; place-items:center;
  font:500 11.5px var(--mono); letter-spacing:.06em;
  color:var(--dim); border:1px solid rgba(147,166,184,.22); border-radius:8px;
  transition:color .45s var(--ease), background .45s var(--ease),
             border-color .45s var(--ease);
}
.hf-step.is-on .hf-n{
  color:#04120e; background:var(--acc); border-color:var(--acc);
}

.hf-body{flex:1 1 auto; min-width:0}
.hf-t{
  display:block; font-size:15px; font-weight:600; letter-spacing:-.01em;
  color:var(--mut); line-height:30px;
  transition:color .45s var(--ease), font-size .45s var(--ease);
}
.hf-step.is-on .hf-t{color:var(--text); font-size:23px; letter-spacing:-.02em}

/* Aufklappen ueber grid-template-rows 0fr -> 1fr. Mit max-height muesste man
   eine Hoehe raten, und bei zu kleinem Wert wird der letzte Punkt beschnitten. */


/* Kein Zwischentext mehr zwischen Titel und Punkten. Der rote Faden steckt
   jetzt im ERSTEN Punkt jeder Stufe: Werbung, nach vorne testen, kleines Geld,
   kein Uebungskonto. Punkt zwei und drei sind die Huerde. Wer scrollt, liest
   drei Zeilen, keinen Absatz. */
.hf-steps ul{list-style:none; margin:10px 0 2px; padding:0}
.hf-steps li{
  display:flex; gap:10px; align-items:center; padding:5px 0;
  color:var(--mut); font-size:14px; line-height:1.35;
}
.hf-steps li i{
  flex:0 0 4px; width:4px; height:4px;
  background:var(--acc); border-radius:1px; font-style:normal;
}

/* --- Score. Sitzt auf dem Ring im letzten Bild, ausgemessen: 49,7 / 39,2 ---
   Ablauf am Ende des Flugs:
     1. Kamera kommt vor dem Ring zum Stehen
     2. die Zahl zaehlt in eigener Zeit von 0 auf 74
     3. erst danach erscheint das Urteil und die Zahl atmet
   Erst das Messergebnis, dann das Urteil. */
.hf-score{
  position:absolute; z-index:3; left:49.7%; top:39.2%;
  transform:translate(-50%,-50%);
  display:grid; place-items:center; opacity:0; pointer-events:none;
}
/* Bewusst NICHT reines Weiss und nicht fett. Eine 140 Pixel grosse Zahl in
   #eaf2f7 mit Gewicht 700 liegt wie ein Aufkleber vor der Szene. Gedaempft und
   etwas leichter sitzt sie IM Raum, und der Ring bleibt der hellste Punkt. */
.hf-score b{
  display:block;
  font:600 clamp(56px,9.5vw,140px)/1 var(--mono); letter-spacing:-.045em;
  color:rgba(234,242,247,.74); font-variant-numeric:tabular-nums;
  text-shadow:0 0 50px rgba(6,10,14,.9);
}

/* Atmen, bewusst kaum sichtbar: gut zwei Prozent ueber dreieinhalb Sekunden.
   Ein deutlicher Puls wuerde nach Alarm aussehen. Hier soll es wirken wie ein
   Messgeraet, das eingeschwungen ist und steht. */
.hf-score.is-done b{animation:hfAtmen 3.6s ease-in-out infinite}
@keyframes hfAtmen{
  0%,100%{transform:scale(1);     color:rgba(234,242,247,.74); text-shadow:0 0 50px rgba(6,10,14,.9)}
  50%    {transform:scale(1.022); color:rgba(234,242,247,.86); text-shadow:0 0 64px rgba(63,168,143,.26)}
}

/* Die Urteils-Pille unter der Zahl ist am 23.08.2026 entfallen (Ansage Alex: "die gruene
   pille am ende weg, die brauchen wir da nicht"). Die 74 sagt es allein, und darueber
   stand bis kurz davor die Frage -- drei Aussagen uebereinander waren eine zu viel.
   is-done bleibt: daran haengt weiterhin das Atmen der Zahl. */

/* --- Kleinkram ------------------------------------------------------------- */
.hf-bar{
  position:absolute; left:0; top:0; height:2px; width:0; z-index:4;
  background:var(--acc); opacity:.55;
}
.hf-hint{
  position:absolute; left:50%; bottom:22px; z-index:4;
  transform:translateX(-50%); transform-origin:50% 100%;
  display:flex; flex-direction:column; align-items:center; gap:8px;
  padding:10px 22px 8px; border:0; background:none; cursor:pointer;
  font:500 11px var(--mono); letter-spacing:.16em; color:var(--dim);
  text-transform:uppercase; opacity:0; pointer-events:none;
  transition:opacity .45s var(--ease), color .25s var(--ease);
}
.hf-hint.is-live{pointer-events:auto}
.hf-hint:hover{color:var(--mut)}
.hf-hint:focus-visible{outline:2px solid var(--blue); outline-offset:4px; border-radius:10px}

/* Zwei flache Winkel, deutlich breiter als hoch. Ein schmaler Pfeil wirkt bei
   dieser Bildbreite wie ein Fehler, ein breiter wie eine Richtungsangabe. */
.hf-chev{
  width:clamp(38px,4.4vw,58px); height:auto; display:block;
  fill:none; stroke:currentColor; stroke-width:5;
  stroke-linecap:round; stroke-linejoin:round;
}
.hf-chev polyline{opacity:.85; animation:hfWink 2.2s var(--ease) infinite}
.hf-chev polyline:nth-child(2){animation-delay:.16s; opacity:.5}
@keyframes hfWink{
  0%,60%,100%{transform:translateY(0);   opacity:.42}
  30%        {transform:translateY(3px); opacity:.95}
}
.hf-hint:hover .hf-chev polyline{opacity:.95}
/* Kennzeichnung des generierten Hintergrunds (08.08.2026). Unten links, spiegelbildlich
   zum Ton-Schalter, also an der Stelle, an der bei Bildern seit jeher der Nachweis steht.
   Drei Entscheidungen, die keine Kosmetik sind:
   - KEINE Ein- und Ausblendung. Der Scroll-Hinweis daneben startet auf opacity:0 und wird
     per JS gesteuert; eine Kennzeichnung, die nur zeitweise dasteht, waere keine.
   - `--mut` und nicht `--dim`. Der Verlauf der Abdunklung ist unten mit .82 am
     kraeftigsten, die Zeile steht also auf dunklem Grund und ist damit gut lesbar. Leiser
     zu werden waere hier das falsche Sparziel.
   - `pointer-events:none`, damit sie dem Flug nichts wegnimmt. Sie ist eine Angabe, kein
     Bedienelement. */
.hf-ki{
  position:absolute; left:18px; bottom:20px; z-index:4;
  margin:0; pointer-events:none;
  font:500 11px/1.2 var(--mono); letter-spacing:.10em;
  color:var(--mut); text-shadow:0 1px 3px rgba(0,0,0,.55);
}

.hf-snd{
  position:absolute; right:18px; bottom:18px; z-index:4;
  width:36px; height:36px; display:grid; place-items:center;
  border:1px solid var(--line); border-radius:var(--r);
  background:rgba(13,20,28,.6); color:var(--dim); cursor:pointer; padding:0;
  transition:color .25s var(--ease), border-color .25s var(--ease);
}
.hf-snd:hover{color:var(--mut); border-color:var(--line2)}
.hf-snd svg{width:16px; height:16px; fill:none; stroke:currentColor;
  stroke-width:1.6; stroke-linecap:round; stroke-linejoin:round}
.hf-snd[aria-pressed="true"]{color:var(--acc); border-color:rgba(63,168,143,.45)}
.hf-snd[aria-pressed="true"] .hf-off{display:none}
.hf-snd:focus-visible{outline:2px solid var(--blue); outline-offset:2px}

/* --- Schmale Bildschirme --------------------------------------------------- */
@media (max-width:900px){
  /* Auf dem Handy etwas weniger als am Schreibtisch, im selben Verhaeltnis wie
     vorher (800 zu 940). Gewischt wird schneller als gerollt, und die Strecke
     zaehlt hier doppelt: wer auf dem Handy neunmal wischt, ohne Text zu sehen,
     ist weg. */
  .hf{height:545vh}
  .hf-hero{left:20px; right:20px; max-width:none; top:12vh}
  .hf-line{top:38%}
  .hf-line b{font-size:clamp(21px,6.2vw,30px)}
  .hf-hero h1{font-size:clamp(28px,7.4vw,40px); margin-bottom:22px}
  .hf-def{font-size:13.5px; margin-top:16px}
  .hf-steps{left:20px; right:20px; width:auto; bottom:10vh; padding:6px 18px 8px}
  .hf-step{padding:9px 0; gap:11px}
  .hf-n{flex:0 0 26px; height:26px; font-size:10.5px}
  .hf-t{font-size:14px; line-height:26px}
  .hf-step.is-on .hf-t{font-size:19px}
  .hf-steps li{font-size:13px; padding:4px 0}
  .hf-veil{background:linear-gradient(180deg,
    rgba(6,10,14,.86) 0%, rgba(6,10,14,.42) 34%,
    rgba(6,10,14,.44) 60%, rgba(6,10,14,.88) 100%)}
  /* Der Scroll-Hinweis steht unten MITTIG und ist mit Chevron rund 60 px hoch. Auf 390 px
     reicht die Breite nicht fuer beide nebeneinander, gemessen im Browser und nicht
     geschaetzt -- der erste Anlauf schob die Kennzeichnung auf 62 px hoch und lag immer
     noch mittendrin.
     Deshalb weicht hier der HINWEIS aus, nicht die Kennzeichnung: "scrollen" ist eine
     Bedienhilfe, die man auch findet, wenn sie zwei Zentimeter hoeher steht. Die
     Kennzeichnung ist eine Angabe, die dauerhaft an derselben Stelle stehen soll.
     Kuerzen waere die andere Moeglichkeit gewesen und die schlechtere: an einer
     Pflichtangabe spart man nicht die Haelfte der Woerter weg. */
  .hf-ki{left:20px; bottom:18px}
  .hf-hint{bottom:74px}
}

/* --- Ruhebeduerfnis respektieren -------------------------------------------
   Kein Flug, kein Ton, keine Scrollstrecke. Stattdessen EIN Bild mit
   Ueberschrift und Knoepfen, in normaler Hero-Hoehe. Die Seite bleibt damit
   vollstaendig benutzbar. */
@media (prefers-reduced-motion:reduce){
  .hf{height:auto}
  .hf-pin{position:relative; height:auto; min-height:78vh}
  .hf-vid,.hf-bar,.hf-hint,.hf-snd{display:none}
  .hf-steps,.hf-score{display:none}
  .hf-line{display:none}
  .hf-hero{position:relative; left:auto; right:auto; top:auto; bottom:auto;
    margin:0 auto; padding:22vh clamp(24px,5vw,80px) 12vh; max-width:1200px}
}
