/* =============================================================================
   Unity Xcape — Stylesheet der gesamten Website (Baukasten K1)
   Eine Datei, kein Framework, keine externe Verbindung.
   Marke: Blau #2C7DCE → Violett #7B4397, Display-Schrift Rigelstar.

   Aufbau dieser Datei:
     01 Schriften            10 Kachel-Raster (Bento)
     02 Token                11 Spiel-Panels
     03 Basis                12 Foto und Text
     04 Typografie           13 Ablauf und Schritte
     05 Raster und Sektionen 14 Vergleich
     06 Knoepfe              15 Listen
     07 Kopfleiste           16 Tabellen
     07b Menue-Varianten 1-5  (?menue=1..5 in der Adresse)
     08 Hero und Kennzahlen  17 FAQ
     09 Karten               18 Kaesten und Hinweise
                             19 CTA-Band
                             20 Passt dazu
                             21 Fusszeile
                             22 Sticky-CTA
                             23 Fliesstext
                             24 Bewegung
                             25 Mobil
                             26 Druck

   Welcher Baustein wofuer da ist, steht in BAUKASTEN.md.
   ============================================================================= */


/* == 01 Schriften ==========================================================
   Selbst gehostet aus assets/schriften/. Keine Google Fonts, keine CDN.
   Rigelstar hat nur einen Schnitt und ist ausschliesslich fuer h1/h2 gedacht. */

/* WOFF2 zuerst, OTF als Rueckfall. Dieselbe Schrift, 39 % kleiner —
   OTF ist unkomprimiert, WOFF2 ist das Webformat. Jeder Browser, den
   diese Seite bedient, kann WOFF2; der zweite Eintrag ist nur fuer den
   Fall, dass doch einmal ein sehr alter danebensteht.

   ⚠ Rigelstar hat 240 Zeichen und KEIN ß, keine deutschen Anfuehrungs-
   zeichen „ ‚ , kein … · ° €. Das faellt nur deshalb nicht auf, weil die
   Schrift ausschliesslich mit text-transform:uppercase eingesetzt wird —
   dabei wird ß zu SS. Wer Rigelstar irgendwo OHNE uppercase setzt, muss
   vorher pruefen, ob der Text eines dieser Zeichen traegt. */
@font-face{font-family:'Rigelstar';
  src:url('schriften/rigelstar.woff2') format('woff2'),
      url('schriften/rigelstar.otf') format('opentype');
  font-weight:400;font-style:normal;font-display:swap}
@font-face{font-family:'Roboto';src:url('schriften/roboto-400.woff2') format('woff2');
  font-weight:400;font-style:normal;font-display:swap}
@font-face{font-family:'Roboto';src:url('schriften/roboto-500.woff2') format('woff2');
  font-weight:500;font-style:normal;font-display:swap}
@font-face{font-family:'Roboto';src:url('schriften/roboto-700.woff2') format('woff2');
  font-weight:700;font-style:normal;font-display:swap}
@font-face{font-family:'Roboto Condensed';src:url('schriften/roboto-condensed-700.woff2') format('woff2');
  font-weight:700;font-style:normal;font-display:swap}


/* == 02 Token ==============================================================
   Die deutschen Namen sind die gueltigen. Die kurzen Zweitnamen (--bg, --muted,
   --container …) existieren, damit direkt aus dem K1-Entwurf kopierte Regeln
   weiterlaufen. Beide zeigen auf denselben Wert. */

:root{
  /* Marke */
  --blau:#2C7DCE;
  --violett:#7B4397;
  --verlauf:linear-gradient(135deg,#2C7DCE 0%,#7B4397 100%);
  --verlauf-text:linear-gradient(90deg,#2C7DCE 0%,#7B4397 100%);
  --blau-hell:#8CC0F2;
  --gruen:#16A34A;

  /* Flaechen hell */
  --grund:#FFFFFF;
  --grund-alt:#F6F7FB;
  --karte:#FFFFFF;
  --linie:#E4E7F0;

  /* Flaechen dunkel */
  --dunkel:#12131A;
  --dunkel-alt:#1B1D28;
  --dunkel-linie:#2C2F3D;

  /* Text */
  --text:#15171F;
  --text-weich:#4A4E5E;
  --text-leise:#6E7385;
  --text-hell:#FFFFFF;
  --text-hell-weich:#B9BDCC;
  --text-hell-leise:#8B8FA3;

  /* Raster */
  --breite:1240px;
  --schmal:760px;
  --lese:660px;
  --rand:clamp(20px,5vw,32px);
  --abstand-sektion:clamp(60px,8vw,108px);
  --kopfhoehe:96px;
  --radius:14px;
  --radius-gross:20px;
  --schatten:0 1px 2px rgba(21,23,31,.04),0 10px 30px rgba(21,23,31,.06);
  --schatten-hoch:0 18px 40px rgba(44,125,206,.15);

  /* Zweitnamen aus dem K1-Entwurf */
  --bg:var(--grund);
  --bg-alt:var(--grund-alt);
  --muted:var(--text-weich);
  --container:var(--breite);
}


/* == 03 Basis ============================================================== */

*,*::before,*::after{box-sizing:border-box}
/* KEIN scroll-behavior:smooth hier — gemessen am 27.08.2026:
   Mit smooth kam von zehn Radstoessen zu je 120 Bildpunkten nur gut ein
   Drittel des Weges an (503 statt 1200), und zwar in unregelmaessigen
   Spruengen von 22 bis 73 Punkten. Grund: Jeder Radstoss startet eine
   eigene Sanft-Animation und bricht die vorige ab. Die Seite bleibt
   hinter dem Rad zurueck — das ist das Ruckeln, das der Betreiber
   gemeldet hat. Ohne smooth: exakt 1200 Punkte, jeder Schritt gleich.
   Sanft gesprungen wird trotzdem, aber nur bei Ankerlinks, und das
   erledigt ux.js gezielt fuer diese Links. */
html{-webkit-text-size-adjust:100%}
/* Der Sticky-Balken liegt fest am unteren Rand. Ohne diesen Platz verdeckte
   er die letzte Zeile der Fusszeile. */
body{padding-bottom:84px}
body{
  margin:0;background:var(--grund);color:var(--text);
  font-family:'Roboto',-apple-system,'Segoe UI',sans-serif;
  font-size:17px;line-height:1.65;-webkit-font-smoothing:antialiased;
  overflow-x:hidden;
  /* Lange URLs im Rechtstext brechen um, statt aus der Spalte zu laufen */
  overflow-wrap:break-word;
}
img{max-width:100%;height:auto;display:block}
svg{display:block}
a{color:var(--blau);text-decoration:none}
a:hover{text-decoration:underline}
:focus-visible{outline:3px solid var(--blau);outline-offset:3px;border-radius:4px}

/* Sprungziele nicht unter die klebende Kopfleiste rutschen lassen */
:where([id]){scroll-margin-top:calc(var(--kopfhoehe) + 24px)}

.nur-screenreader{position:absolute;width:1px;height:1px;overflow:hidden;
  clip:rect(0 0 0 0);white-space:nowrap}

/* Sprunglink zum Inhalt — erst sichtbar, wenn er den Fokus bekommt */
.zum-inhalt{position:absolute;left:-9999px;top:0;z-index:200;background:var(--verlauf);
  color:#fff;padding:12px 22px;border-radius:0 0 10px 0;
  font-family:'Roboto Condensed',sans-serif;font-weight:700;text-transform:uppercase;
  letter-spacing:.06em;font-size:14px}
.zum-inhalt:focus{left:0;text-decoration:none}


/* == 04 Typografie =========================================================
   h1/h2 Rigelstar in Grossbuchstaben, h3/h4 Roboto Condensed 700 in
   Grossbuchstaben, alles andere Roboto. Silbentrennung erst ab 14 Zeichen,
   damit kurze Woerter heil bleiben und lange nicht ueberlaufen. */

h1,h2,h3,h4{margin:0;text-wrap:balance;overflow-wrap:break-word}
h1,h2{font-family:'Rigelstar','Roboto Condensed',sans-serif;font-weight:400;
  text-transform:uppercase;line-height:1.06;letter-spacing:.01em;
  hyphens:auto;hyphenate-limit-chars:14 6 5;
  -webkit-hyphenate-limit-before:6;-webkit-hyphenate-limit-after:5}
h1{font-size:clamp(29px,6.4vw,60px)}
h2{font-size:clamp(24px,4.4vw,42px);line-height:1.12}
h3{font-family:'Roboto Condensed',sans-serif;font-weight:700;font-size:clamp(19px,2.1vw,23px);
  line-height:1.25;text-transform:uppercase;letter-spacing:.02em}
h4{font-family:'Roboto Condensed',sans-serif;font-weight:700;font-size:14px;
  text-transform:uppercase;letter-spacing:.09em;color:var(--blau);line-height:1.3}
p{margin:0 0 1.1em}
strong{font-weight:700}

/* Lange Fliesstext-Ueberschriften (Datenschutz, Impressum, AGB) bleiben gemischt */
.bahn-schmal > h3,.text-block h3{text-transform:none;letter-spacing:0;
  font-size:clamp(18px,2vw,21px)}

/* Auszeichnung im Verlauf. padding-block ist die Malflaeche, nicht Abstand:
   Der Hintergrund wird nur im Rahmenkasten gemalt und dann auf die Glyphen
   beschnitten; bei Rigelstar ragen Ü Ö Ä 0.19 em darueber hinaus und wurden
   ohne Polster durchsichtig — „im BÜRO" stand als „im BURO" da (gemessen
   31.08.2026, betraf 2 der 32 Auszeichnungen im Bestand).
   Bei einem INLINE-Element kostet vertikales Polster nichts: Zeilenhoehe und
   Umbruch rechnen es nicht mit, es vergroessert nur die Malflaeche. Genau
   deshalb steht hier kein Ausgleich, anders als bei h2 in Abschnitt 04b.
   ⚠ Wer .verlauf einem Block-Element gibt, macht daraus echten Abstand. */
.verlauf{background:var(--verlauf-text);-webkit-background-clip:text;background-clip:text;
  -webkit-text-fill-color:transparent;color:var(--blau);padding-block:.3em}

/* Kicker über der Ueberschrift. .augenbraue ist der Bestandsname, .kicker der
   aus dem Entwurf — beide sehen gleich aus, .kicker bringt den Strich mit. */
.augenbraue,.kicker{font-family:'Roboto Condensed',sans-serif;font-weight:700;
  text-transform:uppercase;letter-spacing:.16em;font-size:13px;color:var(--blau);
  line-height:1.4}
.augenbraue{display:block;margin:0 0 14px}
.kicker{display:inline-flex;align-items:center;gap:10px}
.kicker::before{content:"";width:24px;height:2px;background:var(--verlauf);border-radius:2px}
/* Abstand zur folgenden Ueberschrift — mit :where() ohne Spezifitaet, damit die
   Flex-Abstaende in .kopf/.section-kopf davon unberuehrt bleiben. */
:where(.kicker) + :where(h1,h2,h3){margin-top:14px}
.kicker.hell,.hero .augenbraue,.sektion-dunkel .augenbraue,.band .augenbraue{color:var(--blau-hell)}

.vorspann{font-size:clamp(17px,2vw,20px);line-height:1.6;color:var(--text-weich);max-width:62ch}
.klein{font-size:15px;color:var(--text-leise)}

/* Lesespalte: mehrere Absaetze mit gleichmaessigem Abstand */
.lese{display:flex;flex-direction:column;gap:18px;max-width:var(--lese)}
.lese p{margin:0;font-size:16.5px;line-height:1.78;color:var(--text-weich)}


/* == 04b Glanz auf Ueberschriften ==========================================
   Kommentar vom 27.08.2026: „Füge bei den Überschriften einen glanz effekt
   ein wenn man drüber geht beim hover."
   Kommentar vom 31.08.2026: „bitte nur einen glanz über die schrift und nicht
   dieser punkte der durchwandert."
   Kommentar vom 31.08.2026: „also der effekt heir ist kacke bitte raus nehemn
   und nur einen glanz der innerhalb der schrift läuft"

   Drei Sackgassen liegen hinter dieser Fassung. Alle drei bleiben hier
   beschrieben, damit sie niemand ein viertes Mal betritt.

   ── SACKGASSE 1: background-clip:text, erster Anlauf (27.08.2026) ─────────
   Ein heller Streifen lief durch die Buchstaben — genau das, was jetzt
   gewuenscht ist. Er frass aber die Umlautpunkte: „MÜNCHEN" wurde beim Zeigen
   zu „MUNCHEN". Die damalige Erklaerung: beschnitten werde auf die Zeilenbox,
   und nur eine Zeilenhoehe ab etwa 1.4 helfe — die haette jeden Umbruch
   verschoben. Daraufhin galt background-clip:text als verbrannt.
   Die Beobachtung stimmte, der Schluss daraus war falsch (siehe unten).

   ── SACKGASSE 2: Lichtschein HINTER dem Text (bis 31.08.2026) ─────────────
   Ein weicher radialer Schein wanderte mit z-index:-1 hinter den Buchstaben
   durch. Technisch unangreifbar, weil die Glyphen gar nicht angefasst wurden
   — aber der Betreiber sah einen Punkt durchs Bild wandern, waehrend die
   Schrift selbst stumpf blieb.

   ── SACKGASSE 3: Deckschicht UEBER dem Text (mix-blend-mode, 31.08.2026) ──
   Ein ::after ueber der ganzen Zeilenbox, das je nach Umgebung mit screen
   oder multiply gegen den Untergrund rechnete. Die Umlaute blieben heil, aber
   sichtbar war ein Balken ueber der Zeile, kein Glanz in der Schrift — das
   ist das „kacke" aus dem Kommentar. Dazu ein zweiter, harter Fehler: die
   Schicht waehlte ihren Blendmodus nach der SEKTION. In dunklen Sektionen
   stehen aber helle Kaesten (.kachel ist weiss, .callout ist #F6F7FB); dort
   wurde aus dem Glanz ein blauer Balken mit harten Kanten. Nachgewiesen auf
   ueber-uns, kick-off-event-planen, sommerfest-firma-planen, teamevent-ideen.

   ── WARUM SACKGASSE 1 KEINE WAR ───────────────────────────────────────────
   background-clip:text beschneidet den Hintergrund auf die Glyphen; die
   Umlautpunkte gehoeren dazu. Gemalt wird der Hintergrund aber nur im
   RAHMENKASTEN des Elements. Bei einer Zeilenhoehe knapp ueber 1 ist der
   Rahmenkasten kuerzer, als die Glyphen hoch sind; was oben herausragt,
   bekommt gar keine Farbe und wird durchsichtig. Prozente bei background-size
   aendern die GROESSE des Verlaufs, nicht die FLAECHE, auf der ueberhaupt
   gemalt wird — deshalb halfen 100 %, 300 % und gar keine Angabe gleich
   wenig. Die Zeilenhoehe war nie die einzige Stellschraube: ein Polster oben
   tut dasselbe, ohne den Umbruch anzufassen.

   Nachgemessen am 31.08.2026, zweimal unabhaengig: Canvas-TextMetrics
   (actualBoundingBoxAscent gegen fontBoundingBoxAscent plus halbe Schulter)
   und ein Pixelvergleich der gerasterten Zeile gegen dieselbe Zeile ohne
   Beschnitt:
     h2, Rigelstar, Zeilenhoehe 1.12   Ü Ö Ä ragen 0.178 em (bei 42 px) bis
                                       0.190 em (bei 24 px) nach oben heraus
     .spiel-panel h3, Rigelstar, 1.25  0.094 em
     h3, Roboto Condensed, 1.25        ragt nicht heraus, 0.077 em Luft
     h3 gemischt gesetzt (Abschnitt 4) ragt nicht heraus, 0.220 em Luft
   Alles andere bleibt drin: ß wird durch uppercase zu SS, „ und " sitzen
   tiefer als das Ü, das ! ebenso, und nach UNTEN ragt in keiner Groesse
   etwas heraus. Im Pixelvergleich fehlten ohne Polster in den obersten
   Bildzeilen alle Punkte, mit Polster 0,00 % der Tinte.

   Daher die beiden Zahlen unten: .3em Polster ist das 1,6-fache des
   schlimmsten gemessenen Falles und traegt damit auch eine spaetere
   Schriftgroesse; und das Polster sitzt nur OBEN, weil unten nichts
   herausragt. Das halbiert den Ausgleich: nur margin-top muss angefasst
   werden, jede Regel mit einem unteren Abstand (.karte h3, .text-block h2 …)
   bleibt unberuehrt.

   ── WAS JETZT PASSIERT ────────────────────────────────────────────────────
   Der Hintergrund der Ueberschrift ist ein Verlauf, der ueberall genau
   currentColor ist und nur in einem schmalen Band nach var(--blau-hell)
   aufhellt. Er wird auf die Glyphen beschnitten, die Fuellfarbe der Schrift
   wird durchsichtig. Damit steht die Schrift in ihrer normalen Farbe da, und
   beim Zeigen laeuft das Band einmal INNERHALB der Buchstaben durch. Nichts
   liegt ueber der Zeile, nichts wandert dahinter.

   Weil die Grundfarbe currentColor ist, stimmt sie in jeder Umgebung von
   selbst: dunkle Schrift auf hellem Papier, weisse Schrift in .sektion-dunkel,
   im .hero, im .band, im .cta, im .spiel-panel — und ebenso die dunkle
   Schrift einer .kachel, die in einer dunklen Sektion steht.
   DIESE FASSUNG UNTERSCHEIDET NICHT MEHR NACH UMGEBUNG. Es gibt keinen
   Blendmodus mehr, der den Untergrund treffen koennte, also auch keinen Fall,
   in dem ein heller Kasten in einer dunklen Sektion die falsche Rechnung
   bekommt. Der Sonderfall .cta faellt damit weg, die Regelblocks fuer dunkle
   Umgebungen ebenso.

   Das Band ist var(--blau-hell) #8CC0F2, relative Helligkeit 0.497. Gegen die
   Textfarbe #15171F (0.007) ist es 9,6-mal heller — das ist der Glanz auf
   hellem Grund. Gegen weisse Schrift ist es 1,9-mal dunkler und deutlich
   blau — das ist der Glanz auf dunklem Grund, denn heller als Weiss geht
   nicht. Ein weisser Bandkern statt des blauen waere auf weisser Schrift
   unsichtbar und auf weissem Papier ein Loch im Buchstaben; beides geprueft
   und verworfen.

   ── AUSZEICHNUNGEN IN DER ZEILE ───────────────────────────────────────────
   <span class="verlauf"> traegt selbst background-clip:text (Abschnitt 04).
   Der Hintergrund des Kindes liegt ueber dem der Ueberschrift, also behaelt
   die Auszeichnung ihren Blau-Violett-Verlauf und das Band laeuft an ihr
   vorbei. Das ist die bewusste Wahl unter dreien: Nimmt man ihr den eigenen
   Hintergrund, faellt sie fuer 0,9 s auf die Grundfarbe der Ueberschrift
   zurueck — die Farbe der Seite blinkt weg. Gibt man ihr ein eigenes Band, so
   richtet sich das an IHREM Kasten aus, nicht am Kasten der Ueberschrift, und
   laeuft damit zeitversetzt zum ersten. Ein Band, das die farbige Stelle
   auslaesst, ist von den drei Moeglichkeiten die einzige, die nicht nach
   Fehler aussieht.
   <span class="klein"> hat eine eigene, leisere Farbe und bekommt seine
   Fuellfarbe zurueck; sonst wuerde es beim Zeigen die Farbe der Ueberschrift
   annehmen.

   ── VIER FESTLEGUNGEN, die man leicht wieder kaputtmacht ──────────────────
   1. Das Band wandert ueber background-position, nicht ueber transform.
      Verschoebe man die Flaeche selbst, liefe sie aus der Ueberschrift heraus.
   2. Die Grundfarbe des Verlaufs ist currentColor, kein fester Wert. Sonst
      springt die Schrift beim Zeigen auf eine falsche Farbe — und genau das
      war der Grund, warum die Vorfassung nach Umgebung unterscheiden musste.
   3. Durchsichtig wird -webkit-text-fill-color, NICHT color. color muss
      stehen bleiben, weil currentColor daraus kommt.
   4. Hintergrund und Beschnitt entstehen erst beim Zeigen. Dauerhaft auf Text
      beschnitten zwingt jede Ueberschrift den Browser, sie als Maske zu
      rastern; das kostet an jeder der 859 Ueberschriften dieser Website
      etwas, ohne dass jemand hinsieht.

   ── DAS POLSTER UND SEIN AUSGLEICH ────────────────────────────────────────
   padding-top vergroessert den Rahmenkasten nach oben, margin-top zieht ihn
   um denselben Betrag zurueck. Text und alles darunter stehen exakt wie
   vorher; nachgemessen auf allen 42 Seiten und 859 Ueberschriften, groesste
   Bewegung beim Zeigen 0,00 px.
   Drei Umgebungen setzen den oberen Abstand selbst und wuerden den Ausgleich
   ueberschreiben oder von ihm ueberschrieben; dort steht er noch einmal:
     .kopf/.section-kopf/.hero-text   margin:0 auf alle Kinder (Abschnitt 05)
     .band h2                         margin:0 auto (Abschnitt 19)
     .text-block h2                   ein clamp-Wert (Abschnitt 23)
   ⚠ Wer den clamp-Wert in Abschnitt 23 aendert, muss ihn hier mitziehen. CSS
   kann einen fremden Abstand nicht addieren, nur ersetzen — deshalb steht der
   Wert zweimal da, und deshalb steht diese Warnung hier.

   NICHT in dieser Liste steht :where(.kicker) + :where(h1,h2,h3) aus
   Abschnitt 04. Die Regel sieht so aus, als setze sie 14 px vor jede
   Ueberschrift hinter einem Kicker — sie tut es nirgends. Weil beide Teile in
   :where() stehen, hat sie Spezifitaet 0-0-0 und verliert gegen
   h1,h2,h3,h4{margin:0} (0-0-1) zwei Zeilen darueber. Gemessen: der obere
   Abstand hinter einem Kicker ist auf allen Seiten 0 px. Ein Ausgleich fuer
   diese 14 px wuerde die Zeile beim Zeigen also um genau 14 px nach unten
   werfen — genau das ist beim Messen passiert, bevor diese Zeile hier stand.

   (hover:hover) haelt Beruehrbildschirme heraus — dort gibt es kein Zeigen,
   der Glanz wuerde beim Antippen zufaellig zuschlagen. Wer keine Bewegung
   will, bekommt ueber die zweite Bedingung gar keine Regel; am Ende von
   Abschnitt 25 wird zusaetzlich pauschal jede Animation gedrosselt. */

@media (hover:hover) and (prefers-reduced-motion:no-preference){

  /* 03.09.2026 — h1 kam dazu. Der Betreiber meint mit „den Ueberschriften"
     ausdruecklich auch die Zeile ganz oben im Hero. Sie steht in Rigelstar wie
     h2, also gilt fuer sie dieselbe Rechnung und dasselbe Polster. */
  h1:hover,h2:hover,h3:hover{
    background-image:linear-gradient(102deg,
      currentColor 43%,var(--blau-hell) 50%,currentColor 57%);
    background-size:300% 100%;background-repeat:no-repeat;
    -webkit-background-clip:text;background-clip:text;
    -webkit-text-fill-color:transparent;
    animation:kopf-glanz .9s linear;
  }

  /* Bei background-size 300 % liegt die helle Mitte des Bandes bei Position
     100 % eine halbe Kastenbreite LINKS neben dem Kasten und bei 0 % eine
     halbe rechts daneben. 100 % nach 0 % zieht sie also einmal von links nach
     rechts hindurch; davor und danach steht sie ausserhalb.
     linear, nicht ease-out: Die Ueberschrift steht links im Kasten, ihr Text
     fuellt selten mehr als die halbe Breite. Mit ease-out war das Band nach
     200 ms ueber den Buchstaben durch und trudelte den Rest der Zeit ueber
     leerem Papier aus, wo es niemand sieht. */
  @keyframes kopf-glanz{
    from{background-position:100% 0}
    to  {background-position:0% 0}
  }

  /* Malflaeche fuer die Umlautpunkte — Messung und Begruendung oben.
     Nur Rigelstar braucht sie: jedes h2, und von den h3 nur das im
     .spiel-panel, weil dort ebenfalls Rigelstar steht. Wer Rigelstar einer
     weiteren Ueberschrift gibt, traegt sie hier ein. */
  /* h1 hat mit 1.06 die engste Zeilenhoehe von allen und braucht das Polster
     erst recht — bei clamp(29px,6.4vw,60px) ragen Ue Oe Ae bis 0.19 em heraus,
     .3em traegt das mit Reserve. Kein unteres Polster, unten ragt nichts. */
  h1:hover,h2:hover,.spiel-panel h3:hover{padding-top:.3em;margin-top:-.3em}

  /* Ausgleich in den Umgebungen mit eigenem oberen Abstand */
  :is(.kopf,.section-kopf,.hero-text) > h2:hover{margin-top:-.3em}
  .band h2:hover{margin-top:-.3em}
  .text-block h2:hover{margin-top:calc(clamp(44px,5vw,64px) - .3em)}
  /* .hero-text h1 traegt margin-top:20px (Abschnitt 08) — CSS kann fremde
     Abstaende nicht addieren, also steht der Wert hier noch einmal. */
  .hero-text h1:hover{margin-top:calc(20px - .3em)}

  /* Die leise Auszeichnung behaelt ihre eigene Farbe, siehe oben */
  h1:hover .klein,h2:hover .klein,h3:hover .klein{-webkit-text-fill-color:currentColor}
}

/* == 05 Raster und Sektionen =============================================== */

.bahn,.wrap{width:min(var(--breite),100% - var(--rand)*2);margin-inline:auto}
.bahn-schmal{width:min(var(--schmal),100% - var(--rand)*2);margin-inline:auto}

/* Rasterspalten duerfen schmaler werden als ihr laengstes Wort. Ohne diese Regel
   sprengt ein Wort wie "Dienstagnachmittag" auf dem Handy die ganze Spalte —
   Grid-Spuren sind sonst mindestens so breit wie ihr min-content. */
.zweispalt > *,.zweispalt-schmal > *,.karten > *,.kachel-raster > *,.grid-2 > *,
.spiele-grid > *,.vergleich > *,.vergleich-grid > *,.szenario-grid > *,
.kapazitaet-grid > *,.anpassung-grid > *,.vorbed-grid > *,.raetsel-reihe > *,
.schritte > *,.passt-dazu > *,.fuss-raster > *,.schritt-inhalt,
.check-zeile p,.vergleich-punkt p,.live-hinweis p,.spiel-panel .fakten > div{min-width:0}

section{position:relative}
.sektion{padding-block:var(--abstand-sektion)}
.sektion-eng{padding-block:clamp(40px,6vw,72px)}
.sektion-alt{background:var(--grund-alt)}
.sektion-dunkel{background:var(--dunkel);color:var(--text-hell-weich)}
.sektion-dunkel h1,.sektion-dunkel h2,.sektion-dunkel h3{color:var(--text-hell)}
.sektion-dunkel h4{color:var(--text-hell-leise)}
.sektion-dunkel .vorspann,.sektion-dunkel .lese p{color:var(--text-hell-weich)}
.sektion-dunkel a{color:var(--blau-hell)}

/* Helle Kaesten in einer dunklen Sektion behalten die dunklen Textfarben.
   Die vier Regeln darueber gelten fuer die ganze Sektion — auch fuer Kaesten,
   die ihre eigene helle Flaeche mitbringen. Dort steht dann Weiss auf Weiss.
   Gemessen am 31.08.2026 ueber alle 42 Seiten (Kontrast nach WCAG gegen den
   tatsaechlichen Untergrund, nicht nach Augenmass):
     9 x  h3 in .kachel und in .vergleich, Kontrast 1.00:1 — voellig unsichtbar
          (kick-off-event-planen, sommerfest-firma-planen, ueber-uns,
           it-sicherheit-schulung-mitarbeiter)
     1 x  h3 im .callout 1.07:1 und der Link darin 1.79:1 (teamevent-ideen)
     8 x  Absatz im .hinweis 1.75:1
     4 x  Listenpunkt .haken li im .vergleich 1.87:1
     1 x  h4 in der .info-box 2.99:1
   Deshalb steht hier nicht nur die Ueberschrift, sondern alles, was Farbe
   erbt oder von der dunklen Sektion ausdruecklich gesetzt wird.

   In die Liste gehoert jeder Baustein mit eigener HELLER Flaeche.
   ⚠ Nicht hinein gehoeren: .karte und .vorlage (haben in dunklen Sektionen
   schon ihre eigene dunkle Fassung), .kachel-zahl (alle Kinder setzen ihre
   Farbe selbst, .akzent ist ausserdem dunkel), .vorbed-box und .cta-zeile
   (keine eigene helle Flaeche), .vergleich-spalte.ux (nur ein Hauch Blau
   ueber durchsichtig, in einer dunklen Sektion also dunkel).
   .vergleich steht als Container in der Liste, nicht seine Kinder: So bleibt
   diese Regel bei Spezifitaet 0-2-1 und die spaetere Sonderfarbe
   .vergleich .gut h3 (Abschnitt 14) gewinnt weiterhin ueber die Reihenfolge.
   Wer .schritte hier eintraegt, muss dasselbe fuer .schritte h3 bedenken. */
.sektion-dunkel :is(.kachel,.callout,.hinweis,.info-box,.vergleich){color:var(--text)}
.sektion-dunkel :is(.kachel,.callout,.hinweis,.info-box,.vergleich) :is(h1,h2,h3){color:var(--text)}
.sektion-dunkel :is(.kachel,.callout,.hinweis,.info-box,.vergleich) h4{color:var(--blau)}
.sektion-dunkel :is(.kachel,.callout,.hinweis,.info-box,.vergleich) a{color:var(--blau)}
.sektion-dunkel :is(.kachel,.callout,.hinweis,.info-box,.vergleich) .haken li{color:var(--text-weich)}

.zentriert{text-align:center}
.zentriert .vorspann{margin-inline:auto}

/* Sektionskopf: Kicker + Ueberschrift + Vorspann als eine Einheit */
.kopf,.section-kopf{display:flex;flex-direction:column;gap:16px;max-width:700px;
  margin-bottom:clamp(32px,4.5vw,56px)}
.kopf > *,.section-kopf > *{margin:0}
.kopf.zentriert,.section-kopf.zentriert{margin-inline:auto;align-items:center}
.section-kopf.breit,.kopf.breit{max-width:840px}


/* == 06 Knoepfe ============================================================
   .knopf ist der Bestandsname, .btn der aus dem Entwurf. Gleiches Aussehen. */

.knopf,.btn{display:inline-flex;align-items:center;justify-content:center;gap:10px;
  border-radius:999px;font-family:'Roboto Condensed',sans-serif;font-weight:700;
  text-transform:uppercase;letter-spacing:.03em;font-size:14.5px;line-height:1.2;
  border:0;cursor:pointer;white-space:nowrap;text-align:center;
  transition:transform .25s ease,box-shadow .25s ease,border-color .25s ease,background .25s ease}
.knopf,.btn-primary{padding:15px 28px;background:var(--verlauf);color:#fff;
  box-shadow:0 4px 18px rgba(44,125,206,.28)}
.knopf:hover,.btn-primary:hover{transform:translateY(-2px);color:#fff;text-decoration:none;
  box-shadow:0 10px 24px rgba(44,125,206,.4),0 20px 46px rgba(123,67,151,.26)}
.knopf-leise,.btn-sek{padding:13px 26px;background:transparent;border:2px solid var(--linie);
  color:var(--blau);box-shadow:none}
.knopf-leise:hover,.btn-sek:hover{border-color:var(--blau);color:var(--blau);
  background:rgba(44,125,206,.06);box-shadow:none;transform:translateY(-2px)}
.knopf-leise.hell,.btn-sek.hell,.hero .knopf-leise,.sektion-dunkel .knopf-leise,
.band .knopf-leise{border-color:rgba(255,255,255,.28);color:#fff}
.knopf-leise.hell:hover,.btn-sek.hell:hover,.hero .knopf-leise:hover,
.sektion-dunkel .knopf-leise:hover,.band .knopf-leise:hover{
  border-color:#fff;color:#fff;background:rgba(255,255,255,.1)}
.knopf-klein{padding:11px 20px;font-size:13.5px}
.knopf svg,.btn svg{width:18px;height:18px;flex:0 0 auto}

.knopf-reihe,.hero-cta{display:flex;flex-wrap:wrap;gap:14px;margin-top:30px}
.zentriert .knopf-reihe,.zentriert .hero-cta{justify-content:center}

/* Textlink mit Pfeil, der beim Ueberfahren wandert */
.mehr,.karte-mehr{display:inline-flex;align-items:center;gap:8px;
  font-family:'Roboto Condensed',sans-serif;font-weight:700;text-transform:uppercase;
  letter-spacing:.05em;font-size:13px;color:var(--blau);
  transition:color .2s ease}
.mehr:hover,.karte-mehr:hover{color:var(--violett);text-decoration:none}
.mehr svg,.karte-mehr svg{width:16px;height:16px;transition:transform .2s ease}
.mehr:hover svg,.karte-mehr:hover svg{transform:translateX(4px)}


/* == 07 Kopfleiste =========================================================
   96px hoch, klebt oben, milchig hinterlegt. Die Navigation liefert bauen.py
   als <ul class="hauptmenue">; Punkte mit Unterpunkten sind <button> und
   oeffnen ein Mega-Feld, das unter der Leiste ausfaehrt. */

.kopfleiste{position:sticky;top:0;z-index:100;height:var(--kopfhoehe);display:flex;
  align-items:center;background:rgba(255,255,255,.94);
  backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);
  border-bottom:1px solid var(--linie)}
/* Kein width:100% hier — .bahn setzt die Breite und zentriert sich selbst */
.kopfleiste-innen{display:flex;align-items:center;justify-content:space-between;gap:28px}

.logo{display:flex;align-items:center;gap:12px;font-family:'Rigelstar','Roboto Condensed',sans-serif;
  font-size:21px;text-transform:uppercase;letter-spacing:.03em;color:var(--text);
  white-space:nowrap;transition:opacity .2s ease}
.logo:hover{text-decoration:none;opacity:.72}
/* Das echte Logo traegt die Wortmarke bereits — deshalb Hoehe statt Quadrat,
   und daneben steht kein Schriftzug mehr. */
.logo img{height:44px;width:auto;flex:0 0 auto}
.logo svg{width:34px;height:34px;flex:0 0 auto;transition:transform .3s ease}
.logo:hover svg{transform:rotate(-6deg)}

.hauptmenue{display:flex;align-items:center;gap:4px;margin:0;padding:0;list-style:none}
.hauptmenue > li{position:static}

/* ── Mega-Menue ────────────────────────────────────────────────────────────
   Der Hauptpunkt ist ein <button>, kein Link: Er oeffnet ein Feld, er fuehrt
   nicht weg. Der Weg zur Uebersichtsseite steht im Feld selbst.

   position:static auf den <li> ist Absicht — das Feld soll sich an der
   KOPFLEISTE ausrichten und ueber die ganze Breite gehen, nicht am einzelnen
   Menuepunkt. Steht dort relative, klebt es unter dem Wort. */
.mega-punkt{background:none;border:0;cursor:pointer;font:inherit;
  font-family:'Roboto Condensed',sans-serif;font-weight:700;font-size:14.5px;
  text-transform:uppercase;letter-spacing:.04em;color:var(--text);
  padding:calc((var(--kopfhoehe) - 20px) / 2) 14px;position:relative;
  display:block;text-decoration:none;transition:color .22s ease}
.mega-punkt::after{content:"";position:absolute;left:14px;right:14px;
  bottom:calc((var(--kopfhoehe) - 20px) / 2 - 8px);height:2px;
  background:var(--verlauf);transform:scaleX(0);transform-origin:left;
  transition:transform .26s cubic-bezier(.2,.8,.3,1)}
.mega-punkt:hover,.mega-punkt[aria-expanded="true"],
.mega-punkt[data-hier="true"],.mega-punkt[aria-current="page"]{color:var(--blau);
  text-decoration:none}
.mega-punkt:hover::after,.mega-punkt[aria-expanded="true"]::after,
.mega-punkt[data-hier="true"]::after{transform:scaleX(1)}

.mega-feld{position:absolute;left:0;right:0;top:100%;z-index:99;
  background:var(--dunkel);border-bottom:1px solid var(--dunkel-linie);
  box-shadow:0 24px 48px rgba(18,19,26,.28)}
.mega-innen{display:grid;grid-template-columns:250px 1fr 320px;gap:38px;
  align-items:start;padding-block:34px}
.mega-nr{font-family:'Roboto Condensed',sans-serif;font-size:12px;
  letter-spacing:.2em;color:var(--blau)}
.mega-kurz{color:#fff;font-size:18px;line-height:1.4;margin:11px 0 18px}
.mega-alle{color:var(--blau);font-family:'Roboto Condensed',sans-serif;
  font-weight:700;font-size:13.5px;text-transform:uppercase;letter-spacing:.05em}
.mega-kinder{display:grid;grid-template-columns:1fr 1fr;gap:2px 26px;
  align-content:start;list-style:none;margin:0;padding:0}
.mega-kinder a{display:block;color:var(--text-hell-weich);text-decoration:none;
  padding:9px 0;font-size:15px;border-bottom:1px solid transparent;
  transition:color .2s ease,border-color .2s ease}
.mega-kinder a:hover,.mega-kinder a:focus-visible{color:#fff;
  border-color:var(--dunkel-linie);text-decoration:none}
.mega-kinder a[aria-current="page"]{color:var(--blau)}
.mega-bild{width:100%;height:200px;object-fit:cover;border-radius:var(--radius)}

@media (prefers-reduced-motion:no-preference){
  .mega-feld:not([hidden]){animation:mega-aus .3s cubic-bezier(.2,.8,.3,1)}
  @keyframes mega-aus{from{opacity:0;transform:translateY(-9px)}to{opacity:1;transform:none}}
}

/* Ohne Skript oeffnet niemand ein Feld. Dann stehen alle Unterpunkte
   untereinander in der Leiste — sichtbar und anklickbar. Versteckt wird nur
   unter html.js, also nur dann, wenn auch jemand da ist, der sie aufmachen
   kann. */
html:not(.js) .mega-feld[hidden]{display:block;position:static;
  box-shadow:none;border-top:1px solid var(--dunkel-linie)}
html:not(.js) .mega-bild{display:none}

@media (max-width:1180px){
  .mega-innen{grid-template-columns:210px 1fr 240px;gap:26px}
  .mega-bild{height:150px}
}
@media (max-width:1080px){
  .mega-innen{grid-template-columns:1fr 1fr}
  .mega-bild{display:none}
}

.kopf-rechts{display:flex;align-items:center;gap:20px;flex:0 0 auto}

.menue-schalter{display:none;background:none;border:1px solid var(--linie);border-radius:10px;
  width:46px;height:46px;cursor:pointer;align-items:center;justify-content:center;flex:0 0 auto}
.menue-schalter span{display:block;width:20px;height:2px;background:var(--text);position:relative}
.menue-schalter span::before,.menue-schalter span::after{content:'';position:absolute;left:0;
  width:20px;height:2px;background:var(--text)}
.menue-schalter span::before{top:-6px}
.menue-schalter span::after{top:6px}


/* == 07b Fuenf Menue-Varianten =============================================
   Kommentar des Betreibers vom 27.08.2026 (Nr. 8): „kannnst du bitte nochmal
   unterscheidlcihe menues machen? vom design? weil das hier gefaellt mir noch
   nicht so mache mal 5 versioenn die mich richtig flashen."

   SO SCHAUT MAN SIE AN: an jede Adresse ?menue=1 bis ?menue=5 anhaengen, also
   z. B. index.html?menue=3. ux.js (Abschnitt 8) liest die Zahl aus der Adresse
   und setzt am <body> die Klasse menue-1 … menue-5. Ohne Angabe bleibt alles
   wie bisher — der Standard ist keine dieser fuenf Varianten, sondern das
   Design aus Abschnitt 07. Hier wird NICHTS ueberschrieben, solange keine
   Klasse gesetzt ist.

   Alle fuenf halten sich an dieselben Regeln wie der Rest der Datei: nur
   --blau und --violett, der Verlauf nur in 135 Grad, Rigelstar ausschliesslich
   in Grossbuchstaben, keine externe Ressource. Jede Bewegung steht in einem
   @media (prefers-reduced-motion:no-preference).

   Der Umbau unter 1080 px (Abschnitt 25) steht in dieser Datei WEITER UNTEN
   und gewinnt damit gegen alles hier: Auf dem Handy klappt in jeder Variante
   dasselbe schlichte Menue auf. Das ist Absicht — fuenf verschiedene
   Handy-Menues waeren fuenf verschiedene Fehlerquellen. Nur die Farbe der
   Leiste ziehen die Varianten mit, damit der Eindruck nicht auseinanderfaellt.
   ------------------------------------------------------------------------ */

/* -- Variante 1: dunkle Glasleiste mit Verlaufslinie -----------------------
   Die Leiste wird zur dunklen Flaeche und legt sich als Glas ueber den Inhalt.
   Unten laeuft statt der grauen Trennlinie der Markenverlauf durch — ein
   Strich, kein Balken: 2 px, sonst wird die Leiste unten schwer. */
body.menue-1 .kopfleiste{background:rgba(18,19,26,.78);
  backdrop-filter:blur(18px) saturate(1.3);-webkit-backdrop-filter:blur(18px) saturate(1.3);
  border-bottom:0}
body.menue-1 .kopfleiste::after{content:"";position:absolute;left:0;right:0;bottom:0;
  height:2px;background:var(--verlauf);opacity:.9}
body.menue-1 .logo{color:#fff}
/* Das Logo ist eine dunkle Wortmarke auf Durchsichtig. Auf der dunklen Leiste
   waere sie unsichtbar; brightness(0) invert(1) macht daraus die weisse
   Fassung, ohne eine zweite Bilddatei zu brauchen. */
body.menue-1 .logo img{filter:brightness(0) invert(1)}
body.menue-1 .mega-punkt{color:var(--text-hell-weich)}
body.menue-1 .mega-punkt:hover,
body.menue-1 .mega-punkt[aria-expanded="true"],
body.menue-1 .mega-punkt[data-hier="true"]{color:#fff}
body.menue-1 .menue-schalter{border-color:var(--dunkel-linie)}
body.menue-1 .menue-schalter span,
body.menue-1 .menue-schalter span::before,
body.menue-1 .menue-schalter span::after{background:#fff}
body.menue-1 .mega-feld{background:rgba(18,19,26,.94);
  backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(18px)}

/* -- Variante 2: Mega-Feld als Vollbild-Overlay ----------------------------
   Das Feld faehrt nicht mehr unter der Leiste aus, sondern nimmt den ganzen
   Schirm. Links stehen die Unterpunkte gross in Rigelstar, rechts das Bild.
   ⚠ HIER STEHT KEIN position:fixed, und das ist der ganze Trick.
   Der erste Anlauf war position:fixed;inset:var(--kopfhoehe) 0 0 — gemessen
   am 03.09.2026 ergab das ein Feld von 0 px Hoehe. Grund: .kopfleiste traegt
   backdrop-filter (Abschnitt 07), und ein Element mit backdrop-filter wird
   zum Bezugsrahmen auch fuer position:fixed. Das Feld rechnete seine
   Unterkante damit gegen die 96 px hohe Leiste statt gegen den Schirm:
   96 von oben, 0 von unten, macht 0.
   Deshalb bleibt es absolut positioniert und bekommt seine Hoehe direkt
   gesagt. dvh und nicht vh: Auf Handys faehrt die Adressleiste ein und aus,
   mit vh wuerde das Feld dabei ueber den Schirm hinauswachsen. */
body.menue-2 .mega-feld{top:100%;left:0;right:0;bottom:auto;
  height:calc(100dvh - var(--kopfhoehe));
  background:var(--dunkel);border-bottom:0;box-shadow:none;overflow-y:auto}
body.menue-2 .mega-innen{grid-template-columns:1fr 1fr;gap:clamp(28px,5vw,72px);
  align-items:center;min-height:100%;padding-block:clamp(32px,6vh,72px)}
body.menue-2 .mega-spalte{grid-column:1;grid-row:1}
body.menue-2 .mega-kurz{font-family:'Rigelstar','Roboto Condensed',sans-serif;
  text-transform:uppercase;font-size:clamp(24px,3.4vw,40px);line-height:1.08;
  letter-spacing:.01em}
body.menue-2 .mega-kinder{grid-column:1;grid-row:2;grid-template-columns:1fr;gap:0}
/* Rigelstar traegt kein ss und keine deutschen Anfuehrungszeichen (Warnung in
   Abschnitt 01). Hier unkritisch, weil uppercase gesetzt ist: aus ss wird SS,
   und Anfuehrungszeichen kommen in Menuepunkten nicht vor. */
body.menue-2 .mega-kinder a{font-family:'Rigelstar','Roboto Condensed',sans-serif;
  text-transform:uppercase;font-size:clamp(17px,1.9vw,24px);line-height:1.12;
  letter-spacing:.01em;padding:8px 0;border-bottom:0;color:var(--text-hell-weich)}
body.menue-2 .mega-kinder a:hover{color:#fff}
body.menue-2 .mega-bild{grid-column:2;grid-row:1 / span 2;height:min(64vh,520px);
  border-radius:var(--radius-gross)}
@media (prefers-reduced-motion:no-preference){
  body.menue-2 .mega-feld:not([hidden]){animation:mega-voll .34s cubic-bezier(.2,.8,.3,1)}
  @keyframes mega-voll{from{opacity:0;transform:translateY(-18px)}to{opacity:1;transform:none}}
}

/* -- Variante 3: helle Leiste, wandernde Verlaufs-Unterstriche -------------
   Der Unterstrich aus Abschnitt 07 faehrt von links auf und faellt an
   derselben Kante wieder zusammen. Hier wandert er stattdessen durch: Beim
   Zeigen waechst er von links, beim Verlassen laeuft er nach rechts hinaus.
   Das macht allein der Wechsel der transform-origin — ein einziger Wert, aber
   genau er ist der Unterschied zwischen „geht auf" und „zieht durch". */
body.menue-3 .kopfleiste{background:rgba(255,255,255,.98);
  border-bottom:1px solid var(--linie)}
body.menue-3 .hauptmenue{gap:12px}
body.menue-3 .mega-punkt::after{height:3px;border-radius:2px;
  transform:scaleX(0);transform-origin:right}
@media (prefers-reduced-motion:no-preference){
  body.menue-3 .mega-punkt::after{transition:transform .32s cubic-bezier(.2,.8,.3,1)}
}
body.menue-3 .mega-punkt:hover::after,
body.menue-3 .mega-punkt:focus-visible::after,
body.menue-3 .mega-punkt[aria-expanded="true"]::after,
body.menue-3 .mega-punkt[data-hier="true"]::after{transform:scaleX(1);transform-origin:left}
body.menue-3 .mega-feld{background:#fff;border-bottom:1px solid var(--linie);
  box-shadow:0 24px 48px rgba(21,23,31,.1)}
body.menue-3 .mega-kurz{color:var(--text)}
body.menue-3 .mega-nr{color:var(--violett)}
body.menue-3 .mega-kinder a{color:var(--text-weich)}
body.menue-3 .mega-kinder a:hover{color:var(--blau);border-color:var(--linie)}

/* -- Variante 4: Leiste schrumpft beim Scrollen zur Pille ------------------
   ux.js setzt am <body> die Klasse .kopf-geschrumpft, sobald mehr als 40 px
   gescrollt sind. Die Klasse wird in JEDER Variante gesetzt; ausgewertet wird
   sie nur hier — so bleibt der Schalter in ux.js eine einzige Stelle.
   Die Pille schwebt, also verlaesst die Leiste den Textfluss. Damit der
   Inhalt darunter nicht um die Leistenhoehe nach oben rutscht, bekommt
   <main> denselben Betrag als oberes Polster. */
body.menue-4 .kopfleiste{position:fixed;left:0;right:0;top:0;
  background:rgba(255,255,255,.9);border-bottom:1px solid transparent;
  border-radius:0;box-shadow:none;width:auto;margin-inline:0}
body.menue-4 main{padding-top:var(--kopfhoehe)}
@media (prefers-reduced-motion:no-preference){
  body.menue-4 .kopfleiste{
    transition:height .3s cubic-bezier(.2,.8,.3,1),margin .3s cubic-bezier(.2,.8,.3,1),
      border-radius .3s cubic-bezier(.2,.8,.3,1),background .3s ease,box-shadow .3s ease}
}
body.menue-4.kopf-geschrumpft .kopfleiste{height:62px;
  margin:10px auto;left:12px;right:12px;
  width:min(var(--breite),100% - 24px);
  border-radius:999px;background:rgba(255,255,255,.86);
  backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);
  border:1px solid var(--linie);
  box-shadow:0 12px 34px rgba(21,23,31,.14)}
body.menue-4.kopf-geschrumpft .logo img{height:32px}
body.menue-4.kopf-geschrumpft .mega-punkt{padding-block:21px;font-size:13.5px}
body.menue-4.kopf-geschrumpft .mega-punkt::after{bottom:13px}
body.menue-4.kopf-geschrumpft .kopf-rechts .knopf{padding:9px 17px;font-size:13px}
/* Das Feld haengt an der Pille und uebernimmt deren Rundung nach unten. */
body.menue-4.kopf-geschrumpft .mega-feld{left:12px;right:12px;
  width:min(var(--breite),100% - 24px);margin-inline:auto;
  border-radius:0 0 var(--radius-gross) var(--radius-gross);
  top:calc(100% + 6px);overflow:hidden}

/* -- Variante 5: Mega-Feld als Kacheln -------------------------------------
   Statt zwei Spalten Links wird jeder Unterpunkt eine Kachel mit eigenem
   Kasten.
   ⚠ Der eine Satz je Kachel steht NICHT im Quelltext: bauen.py liefert aus
   dem Seitenplan nur Titel und Adresse der Unterpunkte. Statt einen Satz zu
   erfinden, traegt jede Kachel oben einen Verlaufsstreifen als Bildplatz, der
   beim Zeigen waechst. Wer echte Saetze will, muss sie im seitenplan.json
   hinterlegen und bauen.py sie ausgeben lassen — das ist eine Aenderung am
   Bau, keine an einer Designvariante. */
body.menue-5 .mega-innen{grid-template-columns:250px 1fr;gap:34px}
body.menue-5 .mega-bild{display:none}
body.menue-5 .mega-kinder{grid-template-columns:repeat(auto-fill,minmax(190px,1fr));
  gap:12px}
body.menue-5 .mega-kinder a{display:block;padding:0 14px 14px;
  border-radius:var(--radius);border:1px solid var(--dunkel-linie);
  background:var(--dunkel-alt);overflow:hidden;
  font-family:'Roboto Condensed',sans-serif;font-weight:700;text-transform:uppercase;
  letter-spacing:.03em;font-size:13.5px;line-height:1.3;color:var(--text-hell-weich)}
/* Der Verlaufsstreifen ist der Bildplatz der Kachel. 135 Grad wie ueberall.
   Die negativen Innenabstaende ziehen ihn ueber die Polsterung des <a>
   hinaus bis an den Rand der Kachel. */
body.menue-5 .mega-kinder a::before{content:"";display:block;height:56px;
  margin:0 -14px 12px;background:var(--verlauf);opacity:.55}
body.menue-5 .mega-kinder a:hover{color:#fff;border-color:var(--blau);
  background:var(--dunkel)}
@media (prefers-reduced-motion:no-preference){
  body.menue-5 .mega-kinder a{transition:border-color .2s ease,background .2s ease,
    transform .2s ease}
  body.menue-5 .mega-kinder a:hover{transform:translateY(-2px)}
  body.menue-5 .mega-kinder a::before{transition:opacity .2s ease}
  body.menue-5 .mega-kinder a:hover::before{opacity:.85}
}

/* Auf dem Handy nehmen alle fuenf nur die Leistenfarbe mit, siehe Kopf dieses
   Abschnitts. Variante 4 gibt zusaetzlich die Pille auf und Variante 2 das
   Vollbild: Ein schwebender Balken mit ausgeklapptem Menue darunter und ein
   Overlay, das ueber dem aufgeklappten Menue liegt, haetten beide keinen
   Platz. */
@media (max-width:1080px){
  body.menue-4 .kopfleiste,
  body.menue-4.kopf-geschrumpft .kopfleiste{position:sticky;left:auto;right:auto;
    width:auto;margin:0;height:var(--kopfhoehe);border-radius:0;box-shadow:none}
  body.menue-4 main{padding-top:0}
  body.menue-2 .mega-feld{position:static;inset:auto;height:auto}
  body.menue-2 .mega-innen{grid-template-columns:1fr}
  body.menue-2 .mega-kinder a{font-size:16px}
  /* Variante 5 gibt die Kacheln auf. Untereinander gestapelt waeren sie eine
     1361 px lange Rutschbahn (gemessen bei 390 px) — und der Verlaufsstreifen
     jeder Kachel traegt auf dem Handy nichts bei, weil man ohnehin nur eine
     Spalte sieht. Zurueck zur Liste wie in allen anderen Varianten. */
  body.menue-5 .mega-kinder{grid-template-columns:1fr;gap:0}
  body.menue-5 .mega-kinder a{padding:11px 0 11px 16px;border:0;
    border-bottom:1px solid var(--linie);border-radius:0;background:none;
    font-family:Roboto,sans-serif;font-weight:400;text-transform:none;
    letter-spacing:0;font-size:15.5px;color:var(--text-weich)}
  body.menue-5 .mega-kinder a::before{display:none}
}


/* == 08 Hero und Kennzahlen ================================================
   Zwei Ausbaustufen:
     .hero               dunkle Flaeche mit Farbschleier — fuer Unterseiten
     .hero.hero-foto     zusaetzlich ein Vollbild-Foto im Hintergrund */

.hero{position:relative;background:var(--dunkel);color:var(--text-hell);overflow:hidden;
  isolation:isolate;padding-block:clamp(64px,10vw,120px)}
.hero::after{content:'';position:absolute;inset:0;z-index:0;pointer-events:none;
  background:radial-gradient(120% 90% at 78% 8%,rgba(123,67,151,.42) 0%,transparent 58%),
             radial-gradient(90% 70% at 8% 92%,rgba(44,125,206,.34) 0%,transparent 60%)}
.hero > *{position:relative;z-index:2}
.hero h1{color:#fff;max-width:17ch}
.hero .vorspann,.hero .sub{color:var(--text-hell-weich);max-width:56ch}
.hero .sub{font-size:18px;line-height:1.7;margin:0}
.hero-text{max-width:680px;display:flex;flex-direction:column}
.hero-text > *{margin:0}
.hero-text h1{margin-top:20px}
.hero-text .sub{margin-top:22px}

/* Vollbild-Foto im Hintergrund */
.hero-media{position:absolute;inset:0;z-index:0}
.hero-media img,.hero-media video{width:100%;height:100%;object-fit:cover;object-position:center 42%;
  filter:contrast(1.06) saturate(1.08);transform:scale(1.06)}
/* Der Parallax laeuft ueber die Scroll-Zeitleiste des Browsers, nicht ueber ein
   Skript. Ein Skript rechnet den neuen Stand erst im Frame *nach* dem Scrollen —
   das Bild hinkt dann dauerhaft einen Frame hinterher, und genau das sieht man
   als Zittern. Die Zeitleiste laeuft im Kompositor und ist deshalb synchron.
   Wo der Browser sie nicht kennt, steht das Bild still: kein Effekt, kein Zittern. */
@supports (animation-timeline:scroll()){
  @media (prefers-reduced-motion:no-preference){
    @keyframes hero-parallax{
      from{transform:translate3d(0,0,0) scale(1.06)}
      to{transform:translate3d(0,60px,0) scale(1.06)}
    }
    .hero-media:not(.hero-film) img{animation:hero-parallax linear both;
      animation-timeline:scroll(root block);animation-range:0 333px}
  }
}
/* Der Schleier, der den Text lesbar haelt — ohne ihn kippt jeder Kontrast */
.hero-scrim{position:absolute;inset:0;z-index:1;pointer-events:none;background:
  linear-gradient(100deg,rgba(18,19,26,.94) 0%,rgba(18,19,26,.78) 34%,rgba(18,19,26,.34) 62%,rgba(18,19,26,.08) 100%),
  linear-gradient(0deg,rgba(18,19,26,.9) 0%,rgba(18,19,26,.26) 44%,rgba(18,19,26,0) 66%)}
/* Mit Film darunter reicht der Schleier fuer ein Standbild nicht mehr: Der
   Film wechselt seine Helligkeit, und was in der einen Sekunde lesbar ist,
   steht in der naechsten vor einer hell angestrahlten Wand. Ein Foto steht
   still und laesst sich einmal pruefen; ein Film muesste Bild fuer Bild
   geprueft werden, und das tut niemand. Deshalb hier eine festere Stufe — nur dort, wo wirklich ein Film
   liegt (.hero-film), damit die Fotos ihren leichteren Schleier behalten. */
.hero:has(.hero-film) .hero-scrim{background:
  linear-gradient(100deg,rgba(18,19,26,.96) 0%,rgba(18,19,26,.9) 38%,rgba(18,19,26,.6) 68%,rgba(18,19,26,.3) 100%),
  linear-gradient(0deg,rgba(18,19,26,.92) 0%,rgba(18,19,26,.4) 48%,rgba(18,19,26,.12) 100%)}

.hero-glow{position:absolute;z-index:1;width:56vw;height:56vw;max-width:820px;max-height:820px;
  right:-14vw;bottom:-18vw;background:var(--verlauf);filter:blur(120px);opacity:.42;
  mix-blend-mode:screen;border-radius:50%;animation:glowPuls 10s ease-in-out infinite alternate}
@keyframes glowPuls{0%{opacity:.32;transform:scale(1)}100%{opacity:.55;transform:scale(1.08)}}

/* Mit Foto wird der Hero gross und der Text sitzt unten */
.hero-foto{min-height:88vh;display:flex;align-items:flex-end;padding-block:0}
.hero-foto::after{display:none}
.hero-foto > .bahn,.hero-foto > .wrap{padding-top:200px;padding-bottom:52px}
/* svh statt vh: auf Handys faehrt die Adressleiste beim Scrollen ein und aus.
   Mit vh aendert die Seite dabei ihre Hoehe und ruckelt — svh bleibt fest. */
.hero:has(.hero-media){min-height:88vh;min-height:88svh;
  display:flex;align-items:flex-end;padding-block:0}
.hero:has(.hero-media)::after{display:none}
.hero:has(.hero-media) > .bahn,.hero:has(.hero-media) > .wrap{padding-top:200px;padding-bottom:52px}

/* Kennzahlen-Reihe. .zahlen ist der Bestandsname, .stat-row der aus dem Entwurf. */
.zahlen,.stat-row{display:flex;flex-wrap:wrap;gap:20px 40px;margin-top:48px;padding:32px 0 0;
  list-style:none;border-top:1px solid rgba(255,255,255,.14)}
.zahlen > div,.stat{display:flex;flex-direction:column;gap:6px}
.zahlen b,.stat .wert{font-family:'Roboto Condensed',sans-serif;font-weight:700;
  font-size:clamp(24px,2.8vw,32px);line-height:1;font-variant-numeric:tabular-nums;color:var(--text)}
.zahlen span,.stat .label{font-family:'Roboto Condensed',sans-serif;text-transform:uppercase;
  letter-spacing:.1em;font-size:11.5px;line-height:1.3;color:var(--text-leise)}
.hero .zahlen b,.hero .stat .wert,.sektion-dunkel .zahlen b{color:#fff}
.hero .zahlen span,.hero .stat .label,.sektion-dunkel .zahlen span{color:var(--text-hell-leise)}
/* Auf hellem Grund braucht die Trennlinie eine helle Farbe */
.zahlen.hell,.stat-row.hell,.sektion .zahlen,.sektion .stat-row{border-top-color:var(--linie)}
.hero .zahlen,.hero .stat-row,.sektion-dunkel .zahlen,.sektion-dunkel .stat-row,
.band .zahlen,.band .stat-row{border-top-color:rgba(255,255,255,.14)}
/* Kennzahlen ohne Trennlinie, z. B. neben einem Foto */
.mini-stats{display:flex;flex-wrap:wrap;gap:14px 36px;margin-top:6px;border:0;padding:0}


/* == 09 Karten =============================================================
   Das Arbeitspferd: gleich hohe Kaesten in 2, 3 oder 4 Spalten. */

.karten{display:grid;gap:22px}
.karten-2{grid-template-columns:repeat(2,1fr)}
.karten-3{grid-template-columns:repeat(3,1fr)}
.karten-4{grid-template-columns:repeat(4,1fr)}
.grid-2{display:grid;grid-template-columns:repeat(2,1fr);gap:22px}

.karte{background:var(--karte);border:1px solid var(--linie);border-radius:var(--radius);
  padding:26px 24px;
  transition:transform .3s ease,box-shadow .3s ease,border-color .3s ease}
.karte:hover{transform:translateY(-4px);border-color:var(--blau);box-shadow:var(--schatten-hoch)}
.karte h3{margin-bottom:10px;font-size:19px}
.karte p{font-size:15px;line-height:1.6;color:var(--text-weich)}
.karte p:last-child{margin-bottom:0}
.karte h4.fremd{color:var(--text-leise)}

/* Symbolflaeche in der Karte. .karte-symbol ist der Bestandsname, .ico der kurze. */
.karte-symbol,.karte .ico,.kachel .ico{width:48px;height:48px;border-radius:12px;
  background:var(--grund-alt);display:flex;align-items:center;justify-content:center;
  color:var(--blau);flex:0 0 auto;margin-bottom:18px;
  transition:background .3s ease,color .3s ease,transform .3s ease}
.karte-symbol svg,.karte .ico svg,.kachel .ico svg{width:24px;height:24px;fill:currentColor}
.karte:hover .karte-symbol,.karte:hover .ico,.kachel:hover .ico{
  background:var(--verlauf);color:#fff;transform:scale(1.08) rotate(-4deg)}

.karte-link{display:block;color:inherit}
.karte-link:hover{text-decoration:none}
.karte-mehr{margin-top:14px}

.sektion-dunkel .karte{background:var(--dunkel-alt);border-color:var(--dunkel-linie);
  color:var(--text-hell-weich)}
.sektion-dunkel .karte p{color:var(--text-hell-weich)}
.sektion-dunkel .karte-symbol{background:rgba(255,255,255,.06);color:var(--blau-hell)}


/* == 10 Kachel-Raster (Bento) ==============================================
   12 Spalten, jede Kachel bekommt ihre Breite ueber .s3/.s4/.s6 und optional
   .r2 fuer doppelte Hoehe. Fuer Seiten, die nicht wie eine Kartenreihe
   aussehen sollen. */

.kachel-raster{display:grid;grid-template-columns:repeat(12,1fr);gap:22px}
.s3{grid-column:span 3}
.s4{grid-column:span 4}
.s6{grid-column:span 6}
.s8{grid-column:span 8}
.s12{grid-column:span 12}
.r2{grid-row:span 2}

.kachel{background:var(--karte);border:1px solid var(--linie);border-radius:var(--radius);
  padding:28px 26px;display:flex;flex-direction:column;gap:14px;
  transition:transform .3s ease,border-color .3s ease,box-shadow .3s ease}
.kachel:hover{transform:translateY(-4px);border-color:var(--blau);box-shadow:var(--schatten-hoch)}
.kachel > *{margin:0}
.kachel .ico{margin-bottom:0;width:44px;height:44px}
.kachel .ico svg{width:22px;height:22px}
.kachel p{font-size:15px;line-height:1.6;color:var(--text-weich)}

/* Zahlkachel: eine Kennzahl gross, darunter Label und Erklaerung */
.kachel-zahl{display:flex;flex-direction:column;justify-content:center;gap:8px;
  padding:24px 26px;background:var(--grund-alt);border:1px solid var(--linie);
  border-radius:var(--radius);transition:transform .3s ease,border-color .3s ease}
.kachel-zahl:hover{transform:translateY(-3px);border-color:var(--blau)}
.kachel-zahl > *{margin:0}
.kachel-zahl .wert{font-family:'Rigelstar','Roboto Condensed',sans-serif;font-weight:400;
  text-transform:uppercase;font-size:clamp(24px,2.6vw,32px);line-height:1.1;color:var(--text)}
.kachel-zahl .label{font-family:'Roboto Condensed',sans-serif;font-weight:700;font-size:11.5px;
  text-transform:uppercase;letter-spacing:.05em;color:var(--text-weich)}
.kachel-zahl p{font-size:14px;line-height:1.55;color:var(--text-weich);margin-top:2px}
/* .spec: kein Zahlenwert, sondern eine kurze Angabe im Fliesstext */
.kachel-zahl.spec .wert{font-family:'Roboto',sans-serif;text-transform:none;font-size:15px;
  font-weight:400;color:var(--text)}
/* .akzent: dunkle Kachel mit Verlaufsziffer, hoechstens eine je Raster */
.kachel-zahl.akzent{background:var(--dunkel);border-color:var(--dunkel)}
.kachel-zahl.akzent .wert{color:transparent;background:var(--verlauf);
  -webkit-background-clip:text;background-clip:text}
.kachel-zahl.akzent .label,.kachel-zahl.akzent p{color:var(--text-hell-weich)}

/* Fotokachel: Bild randlos in der Kachel, Beschriftung unten drauf */
.kachel-foto{position:relative;border-radius:var(--radius);overflow:hidden;
  border:1px solid var(--linie);min-height:220px}
.kachel-foto img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;
  transition:transform .6s ease}
.kachel-foto:hover img{transform:scale(1.06)}
.kachel-foto::after{content:"";position:absolute;inset:0;
  background:linear-gradient(180deg,rgba(18,19,26,0) 45%,rgba(18,19,26,.62) 100%)}
.kachel-foto-label{position:absolute;left:20px;right:20px;bottom:16px;z-index:2;color:#fff;
  font-family:'Roboto Condensed',sans-serif;font-weight:700;text-transform:uppercase;
  letter-spacing:.04em;font-size:12.5px;line-height:1.35}


/* == 11 Spiel-Panels =======================================================
   Die zwei grossen Farbflaechen fuer Mission 2145 und Cyber Breach. */

.spiele-grid{display:grid;grid-template-columns:1fr 1fr;gap:28px}
.spiel-panel{position:relative;overflow:hidden;border-radius:var(--radius-gross);
  padding:44px 40px;color:#fff;display:flex;flex-direction:column;gap:18px;min-height:500px;
  transition:transform .35s ease,box-shadow .35s ease}
.spiel-panel:hover{transform:translateY(-6px);box-shadow:0 30px 64px rgba(18,19,26,.32)}
.spiel-panel > *{margin:0;position:relative}
.spiel-panel.zeit{background:linear-gradient(160deg,#12131A 0%,#173257 68%,#2C7DCE 150%)}
.spiel-panel.cyber{background:linear-gradient(160deg,#12131A 0%,#3c2148 68%,#7B4397 150%)}
.spiel-panel .muster{position:absolute;inset:0;opacity:.16;pointer-events:none}
.spiel-panel .tag{align-self:flex-start;font-family:'Roboto Condensed',sans-serif;font-weight:700;
  font-size:12px;text-transform:uppercase;letter-spacing:.12em;padding:6px 14px;border-radius:999px;
  background:rgba(255,255,255,.14);border:1px solid rgba(255,255,255,.22)}
.spiel-panel h3{font-family:'Rigelstar','Roboto Condensed',sans-serif;font-weight:400;
  font-size:clamp(24px,3vw,32px);text-transform:uppercase;color:#fff}
.spiel-panel p{color:#D7DAE6;font-size:15.5px;line-height:1.65}
.spiel-panel .fakten{display:flex;flex-wrap:wrap;gap:10px 26px;margin-top:auto;padding-top:20px;
  border-top:1px solid rgba(255,255,255,.18)}
.spiel-panel .fakten span{display:block;font-size:11px;color:#9FA3B8;text-transform:uppercase;
  letter-spacing:.06em}
.spiel-panel .fakten strong{display:block;font-family:'Roboto Condensed',sans-serif;
  font-weight:700;font-size:18px;color:#fff}
.spiel-panel .mehr{align-self:flex-start;margin-top:4px;color:#fff}
.spiel-panel .mehr:hover{color:var(--blau-hell)}


/* == 12 Foto und Text ======================================================
   Zweispalter aus Bild und Fliesstext, in mehreren Zuschnitten. */

.zweispalt{display:grid;grid-template-columns:1fr 1fr;gap:clamp(32px,5vw,64px);align-items:center}
.zweispalt-schmal{grid-template-columns:1.15fr .85fr}
.szenario-grid{display:grid;grid-template-columns:1.5fr 1fr;gap:clamp(32px,4.5vw,56px);
  align-items:start}
.kapazitaet-grid{display:grid;grid-template-columns:1.15fr .85fr;gap:clamp(32px,4.5vw,56px);
  align-items:center}
.anpassung-grid{display:grid;grid-template-columns:1fr 1fr;gap:clamp(32px,4.5vw,56px);
  align-items:start}
.zweispalt img{border-radius:var(--radius-gross);width:100%}

/* Einzelnes Foto mit Rahmen und Schatten */
.beweis-foto{border-radius:16px;overflow:hidden;border:1px solid var(--linie);
  box-shadow:0 22px 48px rgba(21,23,31,.14)}
.beweis-foto img{width:100%;height:100%;object-fit:cover;aspect-ratio:4/3;
  transition:transform .6s ease}
.beweis-foto:hover img{transform:scale(1.06)}

/* Zwei Fotos versetzt uebereinander */
.foto-collage{position:relative}
.foto-collage .gross{border-radius:16px;overflow:hidden;border:1px solid var(--linie);
  box-shadow:0 24px 50px rgba(21,23,31,.14)}
.foto-collage .gross img{width:100%;aspect-ratio:5/4;object-fit:cover;filter:saturate(1.05);
  transition:transform .6s ease}
.foto-collage .gross:hover img{transform:scale(1.06)}
.foto-collage .klein{position:absolute;width:42%;left:-8%;bottom:-11%;border-radius:12px;
  overflow:hidden;border:5px solid #fff;box-shadow:0 20px 40px rgba(21,23,31,.2);
  transition:transform .3s ease}
.foto-collage .klein:hover{transform:translateY(-4px)}
.foto-collage .klein img{width:100%;aspect-ratio:4/3;object-fit:cover;transition:transform .6s ease}
.foto-collage .klein:hover img{transform:scale(1.08)}

/* Platzhalter, solange noch kein Foto da ist */
.bild-platzhalter{aspect-ratio:4/3;border-radius:var(--radius-gross);border:2px dashed var(--linie);
  background:var(--grund-alt);display:flex;align-items:center;justify-content:center;
  text-align:center;padding:24px;color:var(--text-leise);
  font-family:'Roboto Condensed',sans-serif;text-transform:uppercase;letter-spacing:.08em;
  font-size:13px}

/* Ortsnamen und aehnliche kurze Marken */
.staedte-chips{display:flex;flex-wrap:wrap;gap:10px;margin-top:18px}
.chip{padding:8px 16px;border-radius:999px;border:1px solid var(--linie);background:#fff;
  font-family:'Roboto Condensed',sans-serif;font-weight:700;font-size:13px;color:var(--text)}
.chip.zentrum{background:var(--verlauf);color:#fff;border-color:transparent}
.radius-diagramm{aspect-ratio:1/1;border-radius:var(--radius-gross);background:var(--grund-alt);
  display:flex;align-items:center;justify-content:center;padding:20px}


/* == 12b Bilderfolge (Slideshow) ===========================================
   Mehrere Fotos an einer Stelle, mit Vorschaustreifen darunter.

   OHNE SKRIPT liegt das erste Bild oben und alle Vorschauen sind sichtbar und
   beschriftet — es geht also nichts verloren, wenn ux.js nicht laedt. Erst das
   Skript macht daraus eine echte Folge. Deshalb traegt das erste Bild im Markup
   die Klasse .ist-da; die uebrigen bekommen sie beim Umschalten.

   Warum kein Auto-Ablauf als Vorgabe: Ein Bild, das von selbst weiterspringt,
   waehrend jemand es ansieht, ist aergerlich. Wer es doch will, schreibt eine
   Zahl in data-lauf (Millisekunden je Bild) — dann laeuft sie und haelt an,
   sobald der Zeiger darauf liegt. */

.bilderfolge{position:relative}
/* Die Hoehe ist gedeckelt: mit 16/10 allein fuellt eine Folge auf einem breiten
   Schirm das ganze Fenster, und der Text darunter faengt erst nach einer vollen
   Bildschirmhoehe an. 68vh laesst immer erkennen, dass die Seite weitergeht. */
.bilderfolge-buehne{position:relative;border-radius:var(--radius-gross);overflow:hidden;
  border:1px solid var(--linie);box-shadow:0 22px 48px rgba(21,23,31,.14);
  aspect-ratio:16/10;max-height:68vh;background:var(--dunkel)}
.bilderfolge-buehne img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;
  opacity:0;transition:opacity .7s ease}
.bilderfolge-buehne img.ist-da{opacity:1}
/* Ohne Skript: das erste Bild zeigen, auch wenn keine Klasse gesetzt wurde. */
.bilderfolge-buehne img:first-child{opacity:1}
.js .bilderfolge-buehne img:first-child:not(.ist-da){opacity:0}

/* Bildunterschrift, liegt unten auf dem Bild */
.bilderfolge-text{position:absolute;left:0;right:0;bottom:0;z-index:2;
  /* rechts Platz fuer den Zaehler lassen, sonst laufen beide ineinander */
  padding:26px 108px 18px 24px;color:#fff;font-size:15px;line-height:1.45;
  background:linear-gradient(0deg,rgba(12,13,18,.88),rgba(12,13,18,0))}

/* Vor und zurueck */
.bilderfolge-knopf{position:absolute;top:50%;transform:translateY(-50%);z-index:3;
  width:46px;height:46px;border-radius:50%;border:1px solid rgba(255,255,255,.3);
  background:rgba(12,13,18,.55);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);
  color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;
  transition:background .2s ease,border-color .2s ease,transform .2s ease}
.bilderfolge-knopf:hover{background:var(--verlauf);border-color:transparent;
  transform:translateY(-50%) scale(1.08)}
.bilderfolge-knopf svg{width:20px;height:20px;fill:none;stroke:currentColor;stroke-width:2.2}
.bilderfolge-zurueck{left:16px}
.bilderfolge-vor{right:16px}

/* Vorschaustreifen */
.bilderfolge-streifen{display:flex;gap:10px;margin-top:14px;overflow-x:auto;
  scrollbar-width:thin;padding-bottom:4px}
.bilderfolge-streifen button{flex:0 0 96px;height:64px;padding:0;border-radius:10px;
  overflow:hidden;border:2px solid transparent;background:none;cursor:pointer;
  opacity:.55;transition:opacity .25s ease,border-color .25s ease,transform .25s ease}
.bilderfolge-streifen button img{width:100%;height:100%;object-fit:cover;display:block}
.bilderfolge-streifen button:hover{opacity:.9;transform:translateY(-2px)}
.bilderfolge-streifen button[aria-current="true"]{opacity:1;border-color:var(--blau)}

/* Zaehler „3 von 8". Unten rechts und nicht oben: oben liegt er genau dort, wo
   die klebende Kopfleiste steht, sobald man die Folge anscrollt. */
.bilderfolge-zaehler{position:absolute;bottom:16px;right:16px;z-index:3;
  padding:5px 12px;border-radius:999px;background:rgba(12,13,18,.6);
  backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);color:#fff;
  font-family:'Roboto Condensed',sans-serif;font-weight:700;font-size:12px;
  letter-spacing:.06em;font-variant-numeric:tabular-nums}

/* Auf dunklen Sektionen */
.sektion-dunkel .bilderfolge-buehne{border-color:var(--dunkel-linie)}


/* == 12c Video =============================================================
   Ein Film mit Standbild davor. Bewusst OHNE Autoplay und ohne Endlosschleife:
   das Produktvideo hat eine Aussage und einen Ton, es soll angesehen und nicht
   nebenbei abgespielt werden. preload="none" laedt vor dem Klick kein Byte.

   Neben dem Video steht immer, was darin passiert — wer es nicht abspielt
   (kein Ton am Arbeitsplatz, teures Datenvolumen, Vorleseprogramm), verliert
   damit keine Information, nur die Bewegung. */

.videoblock{display:grid;grid-template-columns:1.35fr .65fr;gap:clamp(28px,4vw,52px);
  align-items:center}
.videoblock-gedreht{grid-template-columns:.65fr 1.35fr}
.videoblock-gedreht .videofeld{order:2}
.videofeld{position:relative;border-radius:var(--radius-gross);overflow:hidden;
  border:1px solid var(--linie);box-shadow:0 24px 54px rgba(21,23,31,.18);
  background:var(--dunkel);transition:border-color .25s ease,box-shadow .25s ease}
.videofeld:hover{border-color:var(--blau);box-shadow:var(--schatten-hoch)}
.videofeld video{width:100%;height:auto;display:block;aspect-ratio:16/9;
  object-fit:cover;background:var(--dunkel)}
.videofeld-schild{display:flex;flex-wrap:wrap;gap:6px 18px;align-items:baseline;
  padding:14px 20px;background:var(--dunkel);color:var(--text-hell-weich);
  font-family:'Roboto Condensed',sans-serif;font-size:13px;text-transform:uppercase;
  letter-spacing:.07em}
.videofeld-schild b{color:#fff;font-weight:700}
.videoblock-text p:last-child{margin-bottom:0}
.sektion-dunkel .videofeld{border-color:var(--dunkel-linie)}


/* == 12d Vorher/Nachher ====================================================
   Zwei Aufnahmen desselben Raums uebereinander; der Griff gibt frei, wie viel
   vom zweiten Bild zu sehen ist. Traegt das Versprechen der ganzen Marke in
   einem Bild: leerer Raum, und danach steht der Escape Room darin.

   Bedient wird das ueber ein echtes <input type="range">. Das sieht man nicht —
   es liegt durchsichtig ueber der Flaeche — bringt aber Tastatur, Finger und
   Vorleseprogramme von sich aus mit. Ein selbstgebauter Griff aus <div> und
   Zeigerereignissen koennte nichts davon.

   Ohne Skript steht der Regler auf 50 %: beide Haelften sind zu sehen, der
   Vergleich funktioniert, nur das Ziehen nicht. Kein leerer Kasten. */

.vorher-nachher{--stand:50%;margin:clamp(28px,4vw,44px) 0}
.vn-buehne{position:relative;aspect-ratio:1600/905;border-radius:var(--radius);
  overflow:hidden;border:1px solid var(--linie);box-shadow:var(--schatten);
  background:var(--grund-alt);isolation:isolate}
.vn-buehne img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;
  display:block;-webkit-user-select:none;user-select:none;-webkit-user-drag:none}

/* Das Nachher-Bild liegt oben und wird von links her beschnitten. clip-path
   statt einer Breitenaenderung: so bleibt das Bild in voller Groesse stehen
   und wandert nicht mit dem Schnitt, sonst verrutschte der Bildinhalt. */
.vn-nachher-feld{position:absolute;inset:0;clip-path:inset(0 0 0 var(--stand));
  will-change:clip-path}

/* Die Trennlinie samt Knauf. pointer-events:none — greifen tut man den
   Regler darunter, nicht diese Anzeige. */
.vn-griff{position:absolute;top:0;bottom:0;left:var(--stand);width:2px;
  background:#fff;box-shadow:0 0 0 1px rgba(18,19,26,.28),0 0 22px rgba(0,0,0,.4);
  transform:translateX(-1px);pointer-events:none;z-index:3}
.vn-knauf{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);
  width:46px;height:46px;border-radius:50%;background:#fff;
  box-shadow:0 6px 18px rgba(18,19,26,.36);display:grid;place-items:center;
  color:var(--blau)}
.vn-knauf svg{width:26px;height:26px;display:block}

.vn-schild{position:absolute;top:14px;z-index:2;pointer-events:none;
  font-family:'Roboto Condensed',sans-serif;font-weight:700;font-size:12px;
  text-transform:uppercase;letter-spacing:.12em;color:#fff;
  background:rgba(18,19,26,.72);backdrop-filter:blur(6px);
  padding:7px 13px;border-radius:999px}
.vn-schild-links{left:14px}
.vn-schild-rechts{right:14px}

/* Der Regler selbst: unsichtbar, aber ueber allem und ueber die ganze Flaeche.
   Der eigene Daumen wird weggeblendet, weil der sichtbare Knauf oben schon
   dasteht — zwei Griffe an einer Stelle waeren nur verwirrend. */
.vn-regler{position:absolute;inset:0;z-index:4;width:100%;height:100%;margin:0;
  appearance:none;-webkit-appearance:none;background:none;cursor:ew-resize;
  opacity:0}
.vn-regler::-webkit-slider-thumb{-webkit-appearance:none;width:48px;height:100%}
.vn-regler::-moz-range-thumb{width:48px;height:100%;border:0;background:none}

/* Der Fokusring gehoert an den sichtbaren Knauf, nicht an den unsichtbaren
   Regler — sonst zeigt die Tastaturbedienung auf nichts. */
.vn-regler:focus-visible ~ .vn-griff .vn-knauf{
  box-shadow:0 0 0 3px var(--blau),0 6px 18px rgba(18,19,26,.36)}

.vorher-nachher figcaption{margin-top:14px;font-size:14.5px;color:var(--text-weich);
  line-height:1.5}

/* == 12e Einzugsgebiet-Karte ===============================================
   Gezeichnet von _werkzeug/karte/karte-bauen.py, Geometrie aus OpenStreetMap.
   Im SVG steht kein einziger Farbwert — jedes Teil traegt eine Klasse, die
   Farbe kommt von hier. Der Verkehr darauf kommt aus ux.js; ohne Skript ist
   die Karte trotzdem vollstaendig, es fehlen dann allein die Transporter.

   Die Strassen sind Struktur, keine Wegbeschreibung. Deshalb liegen sie
   leise im Hintergrund: Autobahnen kraeftiger, Bundesstrassen duenn. Wer
   hier eine Route ablesen will, ist auf der falschen Karte — wer sehen will,
   ob sein Ort im Gebiet liegt, sieht es auf einen Blick. */

.karte-feld{position:relative;margin:clamp(24px,3vw,36px) 0}
/* Die Karte traegt ein feines Strassennetz — in der halben Spalte war sie
   371 Bildpunkte breit, und davon war nichts zu erkennen. Ueber die ganze
   Bahn bekommt sie den Platz, den die Genauigkeit braucht. */
.ux-karte{display:block;width:100%;height:auto;
  max-width:min(100%,760px);margin-inline:auto}

.k-grund{fill:var(--grund-alt)}
.k-see{fill:rgba(44,125,206,.3);stroke:rgba(44,125,206,.5);stroke-width:1}

.k-strasse{fill:none;stroke-linecap:round;stroke-linejoin:round}
/* Drei Ebenen, von leise nach kraeftig. Der Unterschied liegt in Staerke und
   Deckung, nicht in der Farbe — bunte Strassen wuerden gegen die Marke
   arbeiten und vom Umkreis ablenken, der die eigentliche Aussage ist. */
/* Die Staerken gelten im 1000er-Feld der Karte. Angezeigt wird sie mit rund
   760 Bildpunkten, jede Linie erscheint also nur zu drei Vierteln so dick —
   deshalb hier eher kraeftiger, als es im Quelltext aussieht. */
.k-str-k{stroke:var(--linie);stroke-width:.5;opacity:.5}
.k-str-l{stroke:var(--linie);stroke-width:.9;opacity:.75}
.k-str-b{stroke:var(--text-weich);stroke-width:1.5;opacity:.55}
.k-str-ab{stroke:var(--text-weich);stroke-width:2.6;opacity:.8}

/* Der Umkreis ist die Aussage der Karte, deshalb traegt er die Markenfarbe. */
.k-umkreis{fill:none;stroke:var(--blau);stroke-width:2.4;
  stroke-dasharray:7 6;opacity:.75}

.k-wege{fill:none}
.k-weg{fill:none;stroke:var(--blau);stroke-width:1.6;opacity:.3;
  stroke-linecap:round}

.k-ort-punkt{fill:var(--text-weich)}
.k-ort-name{fill:var(--text-weich);font-family:'Roboto Condensed',sans-serif;
  font-size:19px;font-weight:700;text-anchor:middle;
  paint-order:stroke;stroke:var(--grund-alt);stroke-width:4;stroke-linejoin:round}

/* München, die Werkstatt in Starnberg und die Halle in Geretsried tragen
   mehr Gewicht als die uebrigen Orte — sie sind unsere Standorte, der Rest
   sind Anhaltspunkte fuer die Entfernung. */
.k-ort-mitte .k-ort-punkt{fill:var(--blau);r:8}
.k-ort-mitte .k-ort-name{fill:var(--text);font-size:26px}
.k-ort-werkstatt .k-ort-punkt,.k-ort-halle .k-ort-punkt{fill:var(--lila,#7B4397)}
.k-ort-werkstatt .k-ort-name,.k-ort-halle .k-ort-name{fill:var(--text)}
.k-ort-stamm .k-ort-punkt{fill:var(--blau)}
.k-ort-stamm .k-ort-name{fill:var(--text)}

.k-mass-linie{stroke:var(--text-weich);stroke-width:1.4;fill:none}
.k-mass-text{fill:var(--text-weich);font-family:'Roboto Condensed',sans-serif;
  font-size:17px;letter-spacing:.06em;text-transform:uppercase}

/* ── Der Verkehr (nur mit Skript) ──────────────────────────────────────── */
.k-wagen{transform-box:fill-box;transform-origin:center}
.k-wagen-leib{fill:var(--blau)}
.k-wagen-dach{fill:#fff;opacity:.9}
.k-wagen-zeichen{fill:#fff;font-family:'Roboto Condensed',sans-serif;
  font-size:7px;font-weight:700;text-anchor:middle;letter-spacing:.04em}
/* Der Ablauf am Ziel, nach dem Vorbild der Schwesterkarte:
   Zuerst steht dort das Zeichen des Anlasses — Sommerfest, Weihnachtsfeier,
   Firmenfeier, Kick-off oder Teambuilding. Dann faehrt der Transporter hin.
   Ist er da, wandelt sich das Zeichen in ein Spielmodul: aus dem Anlass ist
   ein Termin geworden. Was welches Zeichen bedeutet, steht in der Legende —
   ein Zeichen ohne Legende ist ein Raetsel, kein Hinweis. */
.k-ziel,.k-wagen{opacity:0;transition:opacity .5s ease}
.k-ziel.ist-da,.k-wagen.ist-da{opacity:1}
.k-ziel-hof{fill:var(--grund-alt);stroke:var(--blau);stroke-width:1.6}
.k-ziel-anlass,.k-ziel-modul{color:var(--blau);
  transform-box:fill-box;transform-origin:center;
  transition:opacity .48s ease,transform .48s cubic-bezier(.2,.8,.3,1)}
.k-ziel-modul{opacity:0;transform:scale(.35)}
.k-ziel.ist-fertig .k-ziel-anlass{opacity:0;transform:scale(.35)}
.k-ziel.ist-fertig .k-ziel-modul{opacity:1;transform:scale(1)}

/* transform-box:fill-box ist die Stelle, an der die Verwandlung haengt: ohne
   sie rechnet der Browser den Bezugspunkt gegen die ganze Zeichenflaeche,
   und das Modul wuechse quer ueber die Karte statt an seinem Ziel. Kennt ein
   Browser die Eigenschaft nicht, faellt die Groessenaenderung ersatzlos weg
   und es bleibt eine reine Ueberblendung — auch das ist richtig. */

@media (prefers-reduced-motion:reduce){
  .k-ziel,.k-wagen,.k-ziel-anlass,.k-ziel-modul{transition:none}
  .k-ziel-modul,.k-ziel.ist-fertig .k-ziel-anlass,
  .k-ziel.ist-fertig .k-ziel-modul{transform:none}
}

/* Legende: erklaert die drei Strassenebenen und die fuenf Anlass-Zeichen.
   Sie steht als Text unter der Karte, nicht im SVG — so ist sie lesbar,
   markierbar und wird vorgelesen. */
.karte-legende{display:flex;flex-wrap:wrap;gap:10px 22px;justify-content:center;
  margin-top:18px;padding:16px 18px;border:1px solid var(--linie);
  border-radius:var(--radius);background:var(--grund-alt);list-style:none}
.karte-legende li{display:flex;align-items:center;gap:8px;
  font-size:13.5px;color:var(--text-weich)}
.karte-legende svg{width:19px;height:19px;flex:0 0 auto;color:var(--blau)}
.karte-legende i{display:block;width:22px;height:0;flex:0 0 auto;
  border-top-style:solid}
.karte-legende .l-ab{border-top-width:2px;border-top-color:var(--text-weich);opacity:.6}
.karte-legende .l-b{border-top-width:1.4px;border-top-color:var(--linie)}
.karte-legende .l-l{border-top-width:1px;border-top-color:var(--linie);opacity:.6}
.karte-legende .l-k{border-top-width:1px;border-top-color:var(--linie);opacity:.4}
.karte-legende .l-umkreis{border-top:2px dashed var(--blau)}

.karte-quelle{margin-top:10px;font-size:12.5px;color:var(--text-weich);
  text-align:center}
.karte-quelle a{color:inherit;text-decoration:underline}

@media (prefers-reduced-motion:reduce){
  /* Die Transporter stehen dann auf ihrer Strecke. Das Bild bleibt, es
     bewegt sich nur nichts. */
  .k-wagen{animation:none!important}
}

@media (max-width:640px){
  .k-ort-name{font-size:19px}
  .k-ort-mitte .k-ort-name{font-size:24px}
  .k-mass-text{font-size:16px}
}

/* == 12f Teamfoto-Vorlagen =================================================
   Die Entwuerfe fuer das Andenken nach dem Spiel. Vier Blaetter nebeneinander,
   alle im selben Zuschnitt: nur so lassen sie sich wirklich vergleichen.
   Deshalb ein festes Seitenverhaeltnis statt frei laufender Bildhoehen. */

.vorlagen-raster{display:grid;grid-template-columns:repeat(4,1fr);gap:22px}

.vorlage{margin:0;background:var(--karte);border:1px solid var(--linie);
  border-radius:var(--radius);overflow:hidden;
  transition:transform .3s ease,box-shadow .3s ease,border-color .3s ease}
.vorlage:hover{transform:translateY(-4px);border-color:var(--blau);
  box-shadow:var(--schatten-hoch)}

/* 148 x 100 mm - das Format, in dem die Blaetter spaeter gedruckt werden. */
.vorlage img{display:block;width:100%;aspect-ratio:1748/1182;object-fit:cover;
  background:var(--grund-alt)}

.vorlage figcaption{padding:16px 18px 18px}
.vorlage p{margin:8px 0 0;font-size:14.5px;line-height:1.55;color:var(--text-weich)}

.vorlage-name{display:flex;align-items:center;gap:9px;
  font-family:'Roboto Condensed',sans-serif;font-weight:700;text-transform:uppercase;
  letter-spacing:.08em;font-size:14px;color:var(--text)}

/* Der Tupfer zeigt, wie das Blatt aussieht - beim Crew-Entwurf sind es die
   vier Spielfarben in der Reihenfolge der Spielsteuerung. */
.vorlage-name::before{content:"";width:11px;height:11px;border-radius:3px;flex:0 0 auto}
.vorlage-protokoll   .vorlage-name::before{background:var(--dunkel)}
.vorlage-zeitstempel .vorlage-name::before{background:#fff;
  box-shadow:inset 0 0 0 1px var(--linie)}
.vorlage-crew        .vorlage-name::before{background:linear-gradient(90deg,
  #D5342F 0 25%,#16A34A 0 50%,#2C7DCE 0 75%,#E8B414 0)}
.vorlage-verlauf     .vorlage-name::before{background:var(--verlauf)}

.sektion-dunkel .vorlage{background:var(--dunkel-alt);border-color:var(--dunkel-linie)}
.sektion-dunkel .vorlage-name{color:var(--text-hell)}
.sektion-dunkel .vorlage p{color:var(--text-hell-weich)}

@media (max-width:980px){
  .vorlagen-raster{grid-template-columns:repeat(2,1fr)}
}
@media (max-width:560px){
  .vorlagen-raster{grid-template-columns:1fr;gap:18px}
}

/* == 12g Teamfoto-Baustein =================================================
   Kleiner Konfigurator fuer das Andenken: links das Blatt, rechts ein
   Einstellungsmenue mit drei Reitern. Ohne Skript bleibt schlicht ein Bild
   stehen - deshalb haengt die zweite Spalte an der Klasse .js. */

.vorlagen-bau{display:grid;grid-template-columns:1fr;
  border:1px solid var(--linie);border-radius:var(--radius-gross);overflow:hidden;
  background:var(--karte)}
.js .vorlagen-bau{grid-template-columns:minmax(0,1fr) 292px}

.vb-buehne{display:flex;align-items:center;justify-content:center;min-width:0;
  padding:clamp(18px,2.6vw,34px);background:var(--grund-alt)}
.vb-buehne img,.vb-buehne canvas{display:block;max-width:100%;max-height:430px;
  width:auto;height:auto;border-radius:4px;box-shadow:0 6px 24px rgba(21,23,31,.16)}
.vb-buehne canvas{cursor:pointer;touch-action:manipulation}
.vb-buehne.zieht{outline:2px dashed var(--blau);outline-offset:-10px}

.vb-menue{border-top:1px solid var(--linie);padding:14px 16px 16px;min-width:0;
  display:flex;flex-direction:column;gap:13px}

/* Reiter -------------------------------------------------------------- */
.vb-reiter{display:flex;gap:2px;border-bottom:1px solid var(--linie)}
.vb-reiter button{flex:1;background:none;border:0;padding:8px 4px 10px;cursor:pointer;
  position:relative;color:var(--text-leise);
  font-family:'Roboto Condensed',sans-serif;font-weight:700;font-size:12px;
  text-transform:uppercase;letter-spacing:.07em}
.vb-reiter button:hover{color:var(--text)}
.vb-reiter button[aria-selected="true"]{color:var(--text)}
.vb-reiter button[aria-selected="true"]::after{content:"";position:absolute;
  left:6px;right:6px;bottom:-1px;height:2px;border-radius:2px;background:var(--verlauf)}

.vb-blatt{display:flex;flex-direction:column;gap:11px}
.vb-blatt[hidden]{display:none}
.vb-titel{font-family:'Roboto Condensed',sans-serif;font-weight:700;font-size:11.5px;
  text-transform:uppercase;letter-spacing:.07em;color:var(--text-leise)}

/* Vorlagen-Miniaturen -------------------------------------------------- */
.vb-vorlagen{display:grid;grid-template-columns:1fr 1fr;gap:8px}
.vb-vorlagen button{padding:0;border:1.5px solid var(--linie);border-radius:9px;
  background:var(--karte);cursor:pointer;overflow:hidden;text-align:left;
  transition:border-color .2s ease,box-shadow .2s ease}
.vb-vorlagen button:hover{border-color:var(--blau)}
.vb-vorlagen button[aria-pressed="true"]{border-color:var(--blau);
  box-shadow:0 0 0 3px rgba(44,125,206,.18)}
.vb-vorlagen img{display:block;width:100%;aspect-ratio:1748/1182;object-fit:cover;
  background:var(--grund-alt)}
.vb-vorlagen span{display:block;padding:5px 8px 7px;color:var(--text);
  font-family:'Roboto Condensed',sans-serif;font-weight:700;font-size:11px;
  text-transform:uppercase;letter-spacing:.04em;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}

/* Segmentierte Wahl ---------------------------------------------------- */
.vb-wahl{display:grid;gap:6px}
.vb-wahl-4{grid-template-columns:repeat(4,1fr)}
.vb-wahl-2{grid-template-columns:repeat(2,1fr);max-width:164px}
.vb-wahl button{padding:8px 2px;border:1.5px solid var(--linie);border-radius:8px;
  background:var(--karte);cursor:pointer;color:var(--text-weich);
  font-family:'Roboto Condensed',sans-serif;font-weight:700;font-size:12.5px;
  transition:border-color .18s ease,background .18s ease,color .18s ease}
.vb-wahl button:hover{border-color:var(--blau);color:var(--text)}
.vb-wahl button[aria-pressed="true"]{border-color:var(--blau);color:var(--blau);
  background:rgba(44,125,206,.08)}
.vb-wahl-2 button{aspect-ratio:16/10;display:flex;padding:7px}
.vb-wahl-2 button i{width:34%;height:38%;border-radius:3px;background:currentColor;
  opacity:.65}
.vb-ecke-ol{align-items:flex-start;justify-content:flex-start}
.vb-ecke-or{align-items:flex-start;justify-content:flex-end}
.vb-ecke-ul{align-items:flex-end;justify-content:flex-start}
.vb-ecke-ur{align-items:flex-end;justify-content:flex-end}

/* Fotoliste ------------------------------------------------------------ */
.vb-slots{display:flex;flex-direction:column;gap:6px}
.vb-slot{display:flex;align-items:center;gap:9px;width:100%;padding:6px;
  border:1px solid var(--linie);border-radius:9px;background:var(--karte);
  cursor:pointer;text-align:left;transition:border-color .18s ease}
.vb-slot:hover{border-color:var(--blau)}
.vb-slot i{width:44px;height:30px;flex:0 0 44px;border-radius:5px;
  border:1px solid var(--linie);background:var(--grund-alt) center/cover no-repeat}
.vb-slot b{font-family:'Roboto Condensed',sans-serif;font-weight:700;font-size:12px;
  text-transform:uppercase;letter-spacing:.05em;color:var(--text)}

/* Regler und Schalter -------------------------------------------------- */
.vb-regler{display:flex;align-items:center;gap:10px}
.vb-regler input[type=range]{flex:1;accent-color:var(--blau);min-width:0}
.vb-regler output{width:40px;text-align:right;font-size:12px;color:var(--text-leise);
  font-variant-numeric:tabular-nums}
.vb-schalter{display:flex;align-items:center;gap:9px;cursor:pointer;
  font-size:13.5px;color:var(--text-weich)}
.vb-schalter input{accent-color:var(--blau);width:15px;height:15px;flex:0 0 auto}

.vb-fuss{margin-top:auto;display:flex;flex-direction:column;gap:9px}
.vb-fuss .knopf{width:100%;justify-content:center}
.vb-hinweis{font-size:12px;line-height:1.45;color:var(--text-leise);margin:0}

@media (min-width:861px){
  .js .vb-menue{border-top:0;border-left:1px solid var(--linie)}
}
@media (max-width:860px){
  .js .vorlagen-bau{grid-template-columns:1fr}
  .vb-buehne img,.vb-buehne canvas{max-height:340px}
}

/* == 13 Ablauf und Schritte ================================================
   Zwei Formen: .ablauf-liste untereinander (mit Text), .schritte als Reihe. */

.ablauf-liste{display:flex;flex-direction:column}
.schritt{display:grid;grid-template-columns:56px 1fr;gap:24px;padding:28px 0;
  border-top:1px solid var(--linie)}
.schritt:first-child{border-top:none}
.schritt .num{width:52px;height:52px;border-radius:50%;background:var(--verlauf);color:#fff;
  display:flex;align-items:center;justify-content:center;
  font-family:'Roboto Condensed',sans-serif;font-weight:700;font-size:18px}
.schritt-inhalt h3{margin-bottom:8px}
.schritt-inhalt p{font-size:15.5px;line-height:1.65;max-width:64ch;color:var(--text-weich);margin:0}
.schritt-inhalt .dauer{display:inline-block;margin-top:12px;
  font-family:'Roboto Condensed',sans-serif;font-weight:700;font-size:12px;letter-spacing:.06em;
  text-transform:uppercase;color:var(--blau)}

.schritte{display:grid;grid-template-columns:repeat(5,1fr);gap:20px;counter-reset:schritt;
  list-style:none;padding:0;margin:0}
.schritte li{background:var(--karte);border:1px solid var(--linie);border-radius:var(--radius);
  padding:26px 22px;transition:transform .3s ease,box-shadow .3s ease,border-color .3s ease}
.schritte li:hover{transform:translateY(-4px);border-color:var(--blau);box-shadow:var(--schatten-hoch)}
.schritte li::before{counter-increment:schritt;content:counter(schritt);display:flex;
  align-items:center;justify-content:center;width:46px;height:46px;border-radius:50%;
  background:var(--verlauf);color:#fff;font-family:'Roboto Condensed',sans-serif;font-weight:700;
  font-size:19px;margin-bottom:16px}
.schritte h3{font-size:15px;margin-bottom:7px;color:var(--blau)}
.schritte p{font-size:15px;color:var(--text-weich);margin:0}

/* Kurzsteckbriefe nebeneinander, ohne Kasten */
.raetsel-reihe{display:grid;grid-template-columns:repeat(5,1fr);gap:24px}
.raetsel-item{padding-top:20px;border-top:2px solid var(--linie)}
.raetsel-item .zahl{font-family:'Rigelstar','Roboto Condensed',sans-serif;text-transform:uppercase;
  font-size:26px;color:var(--blau)}
.raetsel-item h4{margin-top:10px;font-size:13px}
.raetsel-item p{margin:8px 0 0;font-size:13.5px;line-height:1.5;color:var(--text-weich)}


/* == 14 Vergleich ==========================================================
   Zwei Spalten, die Unity-Xcape-Seite blau getoent. Zwei Bauformen:
   .vergleich (zwei Kaesten) und .vergleich-grid (ein geteilter Block). */

.vergleich{display:grid;grid-template-columns:1fr 1fr;gap:20px}
.vergleich > div{border:1px solid var(--linie);border-radius:var(--radius);padding:28px;
  background:var(--karte)}
.vergleich .gut{border-color:rgba(44,125,206,.35);
  background:linear-gradient(180deg,rgba(44,125,206,.06),transparent)}
.vergleich h3{margin-bottom:16px}
.vergleich .gut h3{color:var(--blau)}

.vergleich-grid{display:grid;grid-template-columns:1fr 1fr;border:1px solid var(--linie);
  border-radius:16px;overflow:hidden}
.vergleich-spalte{padding:36px 34px}
.vergleich-spalte.klassisch{background:#fff}
.vergleich-spalte.ux{background:rgba(44,125,206,.06);border-left:1px solid rgba(44,125,206,.25)}
.vergleich-spalte h3{margin-bottom:22px}
.vergleich-spalte h3.ux-titel{color:var(--blau)}
.vergleich-punkt{display:flex;gap:12px;padding:14px 0;border-top:1px solid var(--linie)}
.vergleich-punkt:first-of-type{border-top:none}
.vergleich-spalte.ux .vergleich-punkt{border-top-color:rgba(44,125,206,.18)}
.vergleich-punkt svg{width:18px;height:18px;flex:0 0 auto;margin-top:3px;color:var(--gruen)}
.vergleich-spalte.klassisch .vergleich-punkt svg{color:#9096A8}
.vergleich-punkt p{margin:0;font-size:15px;color:var(--text)}


/* == 15 Listen ============================================================= */

/* Haken- und Kreuzliste. Das Symbol sitzt absolut statt als Flex-Element —
   sonst waere der Text ein anonymes Flex-Element mit min-width:auto und
   sprengte auf schmalen Schirmen die Zeile. */
.haken{list-style:none;padding:0;margin:22px 0}
.haken li{position:relative;padding:7px 0 7px 34px;color:var(--text-weich)}
.haken li::before{content:'';position:absolute;left:0;top:10px;width:22px;height:22px;border-radius:50%;
  background:rgba(22,163,74,.12);
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%2316A34A'%3E%3Cpath d='M9 16.2 4.8 12l-1.4 1.4L9 19 21 7l-1.4-1.4z'/%3E%3C/svg%3E");
  background-size:16px;background-repeat:no-repeat;background-position:center}
.haken-nein li::before{background:rgba(168,72,27,.12);
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%23A8481B'%3E%3Cpath d='M19 6.4 17.6 5 12 10.6 6.4 5 5 6.4 10.6 12 5 17.6 6.4 19 12 13.4 17.6 19 19 17.6 13.4 12z'/%3E%3C/svg%3E")}
.sektion-dunkel .haken li{color:var(--text-hell-weich)}

/* Punktliste in einer Zeile, fuer kurze Nebenbedingungen */
.hinweis-liste{display:flex;flex-wrap:wrap;gap:14px 32px;margin:24px 0 0;padding:0;list-style:none}
.hinweis-liste li{font-size:14.5px;color:var(--text-weich);padding-left:20px;position:relative}
.hinweis-liste li::before{content:"";position:absolute;left:0;top:9px;width:6px;height:6px;
  border-radius:50%;background:var(--blau)}

/* Abhakliste mit Trennlinien */
.check-liste{display:flex;flex-direction:column;border-top:1px solid var(--linie)}
.check-zeile{display:flex;gap:14px;align-items:flex-start;padding:18px 4px;
  border-bottom:1px solid var(--linie)}
.check-zeile svg{width:20px;height:20px;flex:0 0 auto;margin-top:3px;color:var(--gruen)}
.check-zeile p{margin:0;color:var(--text);font-size:15.5px;line-height:1.55}


/* == 16 Tabellen ===========================================================
   Immer in .tabelle-rahmen wickeln, sonst laeuft sie auf dem Handy ueber. */

.tabelle-rahmen,.tabelle-wrap{overflow-x:auto;border:1px solid var(--linie);
  border-radius:var(--radius);background:var(--karte)}
table{border-collapse:collapse;width:100%;font-size:15.5px}
/* Kein pauschales min-width: schmale Tabellen sollen sich auf dem Handy
   zusammenschieben duerfen. Wo eine Tabelle wirklich Breite braucht, sorgt
   .datentabelle dafuer — dann schiebt man sie im Rahmen seitlich. */
table.datentabelle{min-width:520px}
th,td{padding:15px 20px;border-bottom:1px solid var(--linie);text-align:left;vertical-align:top}
th{font-family:'Roboto Condensed',sans-serif;font-weight:700;text-transform:uppercase;
  letter-spacing:.06em;font-size:12.5px;color:var(--text-weich);background:var(--grund-alt);
  white-space:nowrap}
td{font-variant-numeric:tabular-nums;color:var(--text-weich)}
tbody tr{transition:background .2s ease}
tbody tr:hover{background:var(--grund-alt)}
tbody tr:last-child td{border-bottom:0}
td.zahl{font-family:'Roboto Condensed',sans-serif;font-weight:700;color:var(--blau)}
tbody tr:hover td.zahl{color:var(--violett)}


/* == 17 FAQ ================================================================
   <details>/<summary>. Das Plus dreht sich beim Oeffnen zum Kreuz. */

.faq,.faq-liste{border-top:1px solid var(--linie)}
.faq details,.faq-item{border-bottom:1px solid var(--linie)}
.faq summary,.faq-item summary{display:flex;align-items:center;justify-content:space-between;
  gap:20px;padding:22px 4px;cursor:pointer;list-style:none;
  font-family:'Roboto Condensed',sans-serif;font-weight:700;font-size:18px;line-height:1.35;
  color:var(--text);transition:color .2s ease}
.faq summary::-webkit-details-marker,.faq-item summary::-webkit-details-marker{display:none}
.faq summary:hover,.faq-item summary:hover{color:var(--blau)}
/* Plus als Pseudoelement, wenn im Markup kein <span class="plus"> steht */
.faq summary::after{content:'';flex:0 0 22px;height:22px;
  background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%232C7DCE'%3E%3Cpath d='M11 5h2v14h-2z'/%3E%3Cpath d='M5 11h14v2H5z'/%3E%3C/svg%3E") center/22px no-repeat;
  transition:transform .3s ease}
.faq details[open] summary::after{transform:rotate(45deg)}
.faq summary:has(.plus)::after{display:none}
/* Plus als eigenes Element */
.plus{width:26px;height:26px;flex:0 0 auto;position:relative;transition:transform .3s ease}
.plus::before,.plus::after{content:"";position:absolute;background:var(--blau);border-radius:2px;
  transition:background .2s ease}
.plus::before{width:16px;height:2px;top:12px;left:5px}
.plus::after{width:2px;height:16px;left:12px;top:5px}
summary:hover .plus::before,summary:hover .plus::after{background:var(--violett)}
details[open] > summary .plus{transform:rotate(45deg)}

.faq-inhalt,.faq-item .antwort{padding:0 30px 24px 4px;max-width:70ch;color:var(--text-weich);
  font-size:16px;line-height:1.65}
.faq-inhalt p:last-child{margin-bottom:0}


/* == 18 Kaesten und Hinweise =============================================== */

/* Randnotiz im Fliesstext */
.hinweis{border-left:3px solid var(--blau);background:var(--grund-alt);padding:20px 24px;
  border-radius:0 var(--radius) var(--radius) 0;margin:28px 0}
.hinweis p:last-child{margin-bottom:0}

/* Abgesetzter Kasten neben dem Fliesstext */
.info-box{border:1px solid var(--linie);border-radius:var(--radius);padding:28px 26px;
  background:var(--grund-alt)}
.info-box h4{margin-bottom:12px}
.info-box p{font-size:15px;line-height:1.6;color:var(--text-weich)}
.info-box p:last-child{margin-bottom:0}

/* Kasten mit Weiterverweis */
.callout{border:1px solid var(--linie);border-radius:16px;padding:32px 30px;
  background:var(--grund-alt);display:flex;flex-direction:column;gap:14px;margin-top:28px;
  transition:border-color .25s ease,transform .25s ease}
.callout:hover{border-color:var(--blau);transform:translateY(-3px)}
.callout > *{margin:0}
.callout p{font-size:15.5px;line-height:1.6;color:var(--text-weich)}
.callout .mehr{align-self:flex-start}

/* Einzeiler mit Symbol, unter einem Absatz */
.live-hinweis{display:flex;align-items:center;gap:12px;margin-top:28px;padding-top:28px;
  border-top:1px solid var(--linie)}
.live-hinweis svg{width:24px;height:24px;flex:0 0 auto;color:var(--violett)}
.live-hinweis p{margin:0;font-size:15.5px;line-height:1.55;color:var(--text)}

/* Voraussetzungen in zwei Kaesten */
.vorbed-grid{display:grid;grid-template-columns:1fr 1fr;gap:22px}
.vorbed-box{border:1px solid var(--linie);border-radius:var(--radius);padding:28px 26px}
.vorbed-box h4{margin-bottom:16px}
.vorbed-box ul{display:flex;flex-direction:column;gap:10px;list-style:none;padding:0;margin:0}
.vorbed-box li{font-size:15px;color:var(--text-weich);padding-left:20px;position:relative}
.vorbed-box li::before{content:"";position:absolute;left:0;top:9px;width:6px;height:6px;
  border-radius:50%;background:var(--blau)}


/* == 19 CTA-Band ===========================================================
   .band  = dunkle Sektion ueber die volle Breite (Standard, in der Vorlage)
   .cta   = Verlaufskasten innerhalb einer Sektion */

.band{position:relative;background:var(--dunkel);color:#fff;padding-block:clamp(64px,8vw,92px);
  overflow:hidden;isolation:isolate;text-align:center}
.band::before{content:"";position:absolute;inset:-40px;z-index:-1;
  animation:blobdrift 20s ease-in-out infinite;
  background:radial-gradient(700px 400px at 50% 0%,rgba(44,125,206,.35),transparent 65%),
             radial-gradient(600px 400px at 100% 100%,rgba(123,67,151,.3),transparent 60%)}
@keyframes blobdrift{0%{transform:translate3d(0,0,0)}50%{transform:translate3d(-16px,12px,0)}
  100%{transform:translate3d(0,0,0)}}
.band h2{color:#fff;max-width:22ch;margin:0 auto}
.band p{color:var(--text-hell-weich);max-width:56ch;margin:18px auto 0;font-size:17px;
  line-height:1.65}
.band .knopf-reihe,.band .hero-cta{justify-content:center;margin-top:34px}

.cta{background:var(--verlauf);color:#fff;border-radius:var(--radius-gross);
  padding:clamp(36px,5vw,64px);text-align:center}
.cta h2{color:#fff}
.cta p{color:rgba(255,255,255,.9);max-width:56ch;margin-inline:auto}
.cta .knopf{background:#fff;color:var(--blau);box-shadow:0 6px 24px rgba(0,0,0,.18)}
.cta .knopf:hover{color:var(--violett)}


/* == 19b CTA-Zeile =========================================================
   Ein schmaler Streifen zum Einstreuen mitten im Text. Das grosse CTA-Band
   und der Anfrage-Block am Seitenende bleiben, wie sie sind — diese Zeile
   ist der leise Zwischenruf auf halbem Weg, nicht ihr Ersatz.

   Bewusst ohne eigene Farbflaeche im hellen Bereich: Wer alle zwei Absaetze
   einen bunten Kasten setzt, bekommt keine hoehere Aufmerksamkeit, sondern
   Bannerblindheit. Der Rahmen genuegt, der Knopf traegt die Farbe. */

/* Die CTA-Zeile steht in einer eigenen Sektion. Deren normales Hochformat
   ist fuer einen vollen Abschnitt gedacht — um eine 120 px hohe Zeile stuenden
   sonst 320 px Luft. */
.sektion-cta{padding-block:clamp(10px,1.4vw,20px)}
.sektion-cta .cta-zeile{margin:0}

.cta-zeile{display:flex;align-items:center;justify-content:space-between;
  gap:20px 28px;flex-wrap:wrap;margin:clamp(34px,4.5vw,52px) 0;
  padding:20px clamp(18px,2.5vw,26px);border-radius:var(--radius);
  border:1px solid var(--linie);background:var(--grund-alt)}
.cta-zeile > div{flex:1 1 30ch;min-width:0}
.cta-zeile p{margin:0;max-width:64ch;color:var(--text-weich);font-size:15.5px;line-height:1.5}
.cta-zeile strong{display:block;color:var(--text);
  font-family:'Roboto Condensed',sans-serif;font-weight:700;font-size:17px;
  text-transform:uppercase;letter-spacing:.02em;margin-bottom:5px}
.cta-zeile .knopf{flex:0 0 auto}

/* In dunklen Abschnitten traegt der helle Rahmen nicht. */
.sektion-dunkel .cta-zeile,.band .cta-zeile{
  border-color:var(--dunkel-linie);background:rgba(255,255,255,.04)}
.sektion-dunkel .cta-zeile strong,.band .cta-zeile strong{color:#fff}
.sektion-dunkel .cta-zeile p,.band .cta-zeile p{color:var(--text-hell-weich)}

@media (max-width:640px){
  .cta-zeile{flex-direction:column;align-items:stretch;text-align:left}
  .cta-zeile .knopf{width:100%;justify-content:center}
}

/* == 19c Anfrage-Formular ==================================================
   Kommentar vom 27.08.2026: „Bitte baue ein Anfrage formular das auf allen
   seiten zu sehen ist immer im footer und das man auch hier auf der Seite
   sieht."

   Es steht in vorlagen/seite.html und damit auf jeder Seite ueber dem Fuss —
   auch auf /kontakt/. Bis dahin war dort nur ein Knopf, der auf die
   Kontaktseite zeigte; jetzt kann man die Anfrage abschicken, wo man gerade
   ist. Ein Klick weniger auf dem Weg zur Anfrage ist der ganze Sinn.

   ⚠ NOCH NICHT ANGESCHLOSSEN: Das Formular traegt vorlaeufig action="/kontakt/".
   Wohin es tatsaechlich geht, entscheidet sich beim Umzug nach WordPress —
   dort laeuft der bestehende Lead-Motor (Snippet 5, /wp-json/unity-xcape/v1/).
   Der Punkt steht in 00-BAUPLAN.md unter den offenen Sachen. */

/* Das CTA-Band zentriert seinen Text. Fuer zwei Saetze und einen Knopf ist
   das richtig, fuer ein Formular nicht: zentrierte Beschriftungen zwingen
   das Auge bei jedem Feld auf eine neue Anfangskante. */
.anfrage-raster{display:grid;grid-template-columns:1fr 1fr;gap:clamp(28px,4vw,56px);
  align-items:start;text-align:left}
.anfrage-raster h2,.anfrage-raster h3{text-align:left}
.anfrage-text .anfrage-punkte{list-style:none;padding:0;margin:22px 0 0;
  display:grid;gap:9px}
.anfrage-text .anfrage-punkte li{position:relative;padding-left:26px;
  color:var(--text-hell-weich);font-size:15.5px}
.anfrage-text .anfrage-punkte li::before{content:"";position:absolute;left:0;top:.52em;
  width:13px;height:2px;border-radius:2px;background:var(--verlauf)}

.anfrage-form{background:rgba(255,255,255,.05);border:1px solid var(--dunkel-linie);
  border-radius:var(--radius);padding:clamp(20px,2.6vw,30px)}
.anfrage-form-titel{margin:0 0 16px;color:#fff;font-size:19px;
  font-family:'Roboto Condensed',sans-serif;text-transform:uppercase;
  letter-spacing:.04em}
.feld-paar{display:grid;grid-template-columns:1fr 1fr;gap:0 14px}
.anfrage-form .feld{margin:0 0 13px}
.anfrage-form label{display:block;margin-bottom:5px;font-size:13px;
  font-family:'Roboto Condensed',sans-serif;font-weight:700;
  text-transform:uppercase;letter-spacing:.05em;color:var(--text-hell-weich)}
.anfrage-form input,.anfrage-form select,.anfrage-form textarea{
  width:100%;padding:11px 13px;border-radius:10px;
  border:1px solid var(--dunkel-linie);background:rgba(18,19,26,.55);
  color:#fff;font:inherit;font-size:15px;
  transition:border-color .2s ease,box-shadow .2s ease}
.anfrage-form textarea{resize:vertical;min-height:76px}
.anfrage-form input::placeholder,.anfrage-form textarea::placeholder{
  color:rgba(255,255,255,.38)}
.anfrage-form input:focus-visible,.anfrage-form select:focus-visible,
.anfrage-form textarea:focus-visible{
  outline:none;border-color:var(--blau);box-shadow:0 0 0 3px rgba(44,125,206,.3)}
/* Der Kalender- und Auswahlpfeil ist auf dunklem Grund sonst schwarz auf schwarz. */
.anfrage-form input[type="date"]::-webkit-calendar-picker-indicator{filter:invert(1);opacity:.6}
.anfrage-form select{appearance:none;-webkit-appearance:none;
  background-image:linear-gradient(45deg,transparent 50%,rgba(255,255,255,.6) 50%),
    linear-gradient(135deg,rgba(255,255,255,.6) 50%,transparent 50%);
  background-position:calc(100% - 18px) 50%,calc(100% - 13px) 50%;
  background-size:5px 5px,5px 5px;background-repeat:no-repeat;padding-right:36px}

.anfrage-form .knopf{width:100%;justify-content:center;margin-top:6px}
.anfrage-hinweis{margin:13px 0 0;font-size:12.5px;line-height:1.5;
  color:var(--text-hell-weich)}
.anfrage-hinweis a{color:#fff;text-decoration:underline}

/* Die Spam-Falle. Nicht display:none — manche Skripte pruefen darauf und
   lassen das Feld dann aus. So steht es im Quelltext, ist aber ausserhalb
   des Bildes und aus der Tastaturreihenfolge heraus. */
.feld-falle{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}

@media (max-width:980px){
  .anfrage-raster{grid-template-columns:1fr}
}
@media (max-width:520px){
  .feld-paar{grid-template-columns:1fr}
}

/* == 20 Passt dazu =========================================================
   Erzeugt bauen.py am Seitenende aus dem Feld "passt_dazu" im seitenplan. */

.passt-dazu{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:16px;
  list-style:none;padding:0;margin:0}
.passt-dazu a{display:block;padding:20px 22px;border:1px solid var(--linie);
  border-radius:var(--radius);background:var(--karte);color:var(--text);
  font-family:'Roboto Condensed',sans-serif;font-weight:700;text-transform:uppercase;
  letter-spacing:.02em;font-size:15px;line-height:1.3;
  transition:border-color .25s ease,transform .25s ease,box-shadow .25s ease}
.passt-dazu a:hover{border-color:var(--blau);transform:translateY(-3px);text-decoration:none;
  color:var(--blau);box-shadow:var(--schatten-hoch)}
.passt-dazu span{display:block;margin-top:8px;font-family:'Roboto',sans-serif;font-weight:400;
  text-transform:none;letter-spacing:0;font-size:14.5px;line-height:1.5;color:var(--text-leise)}


/* == 21 Fusszeile ========================================================== */

.fussleiste{background:var(--dunkel);color:var(--text-hell-weich);padding:clamp(56px,7vw,80px) 0 0}
.fuss-raster{display:grid;grid-template-columns:1.5fr 1fr 1fr 1fr;gap:40px;
  padding-bottom:clamp(40px,5vw,60px);border-bottom:1px solid var(--dunkel-linie)}
.fuss-marke{display:flex;align-items:center;gap:12px;
  font-family:'Rigelstar','Roboto Condensed',sans-serif;font-size:22px;text-transform:uppercase;
  letter-spacing:.03em;color:#fff;margin-bottom:16px}
.fuss-marke svg,.fuss-marke img{width:32px;height:32px;flex:0 0 auto}
.fussleiste h4{color:var(--text-hell-leise);margin-bottom:18px;font-size:12.5px;letter-spacing:.08em}
.fussleiste ul{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:11px}
.fussleiste a{display:inline-block;color:#D7DAE6;font-size:15px;
  transition:color .2s ease,transform .2s ease}
.fussleiste a:hover{color:var(--blau-hell);transform:translateX(3px);text-decoration:none}
.fuss-unten{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;
  gap:14px 28px;padding:24px 0;font-size:13.5px;color:var(--text-hell-leise)}
.fuss-unten a{color:var(--text-hell-leise);font-size:13.5px}
.fuss-unten a:hover{color:#fff;transform:none}


/* == 22 Sticky-CTA =========================================================
   Nur auf dem Handy, blendet ux.js ein, sobald der Hero durch ist. */

/* Der Balken stand bis 27.08.2026 auf display:none und wurde nur unter 640 px
   eingeschaltet — auf Desktop und Tablet war er damit nie zu sehen. Jetzt gilt
   flex fuer alle Breiten; ux.js blendet ihn aus, solange der Hero im Bild ist,
   damit er nicht ueber dem eigenen Knopf im Kopfbereich liegt. */
.sticky-cta{position:fixed;left:0;right:0;bottom:0;z-index:90;display:flex;
  align-items:center;justify-content:space-between;gap:14px;
  background:rgba(18,19,26,.82);backdrop-filter:blur(14px);
  -webkit-backdrop-filter:blur(14px);
  border-top:1px solid var(--dunkel-linie);
  padding:8px var(--rand) calc(8px + env(safe-area-inset-bottom,0px))}

/* Der Zugang zu den Einwilligungs-Einstellungen. Er sieht bewusst nicht wie
   ein Knopf aus: er ist eine Pflichtangabe, keine Handlungsaufforderung, und
   darf dem Anfrage-Knopf daneben nicht die Aufmerksamkeit wegnehmen. Trotzdem
   muss er lesbar bleiben — ein grauer Textlink am Rand ist genau das
   Dunkelmuster, das die Aufsichtsbehoerden bei Einwilligungen ruegen. Deshalb
   var(--text-hell-weich) und nicht etwas Blasseres. */
.sticky-cookies{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;
  white-space:nowrap;background:none;border:0;padding:6px 2px;cursor:pointer;
  font-family:inherit;font-size:13px;line-height:1.3;color:var(--text-hell-weich);
  text-decoration:underline;text-underline-offset:3px;
  text-decoration-color:rgba(255,255,255,.28);transition:color .2s ease}
.sticky-cookies:hover{color:#fff;text-decoration-color:rgba(255,255,255,.7)}
.sticky-cookies:focus-visible{outline:2px solid var(--blau-hell);outline-offset:3px;
  border-radius:4px}

/* Der Knopf darf nicht schrumpfen. Schrumpft er, bricht „Jetzt anfragen" um,
   und die Leiste wird auf dem Handy wieder hoch — das Gegenteil von dezent. */
.sticky-cta .knopf{flex:0 0 auto}

/* Unter 380 px reicht die Breite fuer beides nebeneinander nicht mehr. Statt
   den Knopf zu verkleinern, wird die Beschriftung links kuerzer: Der Zugang
   bleibt erreichbar, der Knopf bleibt gross genug zum Treffen. */
@media (max-width:379px){
  .sticky-cookies{font-size:12px}
  .sticky-cta{gap:10px;padding-inline:14px}
}


/* == 23 Fliesstext ========================================================= */

.text-block{max-width:70ch}
.text-block h2{margin-top:clamp(44px,5vw,64px);margin-bottom:18px}
.text-block h3{margin-top:38px;margin-bottom:12px}
.text-block > *:first-child{margin-top:0}
.text-block ul,.text-block ol{padding-left:24px;margin:0 0 1.1em}
.text-block li{margin-bottom:8px}
.bahn-schmal > ul,.bahn-schmal > ol{padding-left:24px}
.bahn-schmal > ul li,.bahn-schmal > ol li{margin-bottom:8px}


/* == 24 Bewegung ===========================================================
   .reveal blendet beim Scrollen ein (ux.js setzt .in). Ohne JavaScript bleibt
   der Inhalt sichtbar, weil ux.js die Klasse .js am <html> setzt. */

.js .reveal{opacity:0;transform:translateY(24px);
  transition:opacity .7s ease,transform .7s ease}
.js .reveal.in{opacity:1;transform:none}


/* == 24b Leitung ===========================================================
   Ein wiederkehrendes Motiv, vom Betreiber am 31.08.2026 als Bild gegeben:
   eine duenne helle Leitung laeuft waagerecht, setzt einmal schraeg nach oben
   ab und endet in einem Punkt. Sie soll sich beim Scrollen zeichnen.

   ── WARUM DIE FORM AUS ux.js KOMMT UND NICHT AUS EINER FESTEN DATEI ───────
   Ein SVG mit fester viewBox muesste in die Breite gezogen werden. Dabei
   kippt der Winkel des Absatzes: Was bei 400 px ein sauberer 45-Grad-Knick
   ist, wird bei 1200 px eine fast waagerechte Schraege — das Motiv verliert
   genau das, was es kenntlich macht. preserveAspectRatio haelt zwar den
   Winkel, macht die Leitung dafuer aber ueberall gleich kurz.
   Deshalb misst ux.js die tatsaechliche Breite und schreibt den Pfad selbst:
   die Waagerechten wachsen mit, der Knick bleibt bei 45 Grad.

   ── WIE SIE SICH ZEICHNET ─────────────────────────────────────────────────
   Der Pfad traegt pathLength="1". Damit laesst sich die Strichelung in
   Anteilen angeben, ohne die echte Laenge zu kennen — 1 ist immer der ganze
   Weg, egal wie breit das Fenster ist. stroke-dashoffset von 1 auf 0 zieht
   die Linie einmal von links nach rechts.

   Zwei Wege, in dieser Reihenfolge:
   1. animation-timeline:view() — die Linie haengt WIRKLICH am Scrollen: wer
      zurueckrollt, sieht sie sich zurueckziehen. Das ist gemeint.
   2. Wo der Browser das nicht kennt (Stand 2026 alles ausser Chromium),
      zeichnet ux.js sie einmal, sobald sie ins Bild kommt — ueber .in, wie
      bei .reveal in Abschnitt 24. Gleiches Bild, nur ohne Rueckwaertslauf.
   Die beiden duerfen sich nicht ueberlagern, sonst laeuft eine Animation
   gegen die andere; @supports not (...) trennt sie sauber.

   ⚠ Ohne JavaScript und bei prefers-reduced-motion steht die Leitung fertig
   gezeichnet da. Sie ist Schmuck: sie darf fehlen, aber niemals halb sein. */

.leitung{display:block;width:100%;color:var(--blau-hell);pointer-events:none}
.leitung svg{display:block;width:100%;height:auto;overflow:visible}
.leitung .l-pfad{fill:none;stroke:currentColor;stroke-width:2;
  stroke-linecap:round;stroke-linejoin:round;
  stroke-dasharray:1;stroke-dashoffset:0}
.leitung .l-punkt{fill:currentColor;transform-box:fill-box;transform-origin:center}

/* Auf hellem Papier ist --blau-hell zu blass. Dort die kraeftigere Marke. */
.leitung{color:var(--blau)}
.sektion-dunkel .leitung,.hero .leitung,.band .leitung,.cta .leitung{color:var(--blau-hell)}

@keyframes leitung-zeichnen{from{stroke-dashoffset:1}to{stroke-dashoffset:0}}
@keyframes leitung-punkt{
  0%,72%{opacity:0;transform:scale(.2)}
  100%  {opacity:1;transform:scale(1)}
}

@media (prefers-reduced-motion:no-preference){
  /* 1. Der gemeinte Weg: am Scrollen haengend. */
  @supports (animation-timeline:view()){
    .leitung .l-pfad{animation:leitung-zeichnen linear both;
      animation-timeline:view();animation-range:entry 20% cover 55%}
    .leitung .l-punkt{animation:leitung-punkt linear both;
      animation-timeline:view();animation-range:entry 20% cover 60%}
  }
  /* 2. Ersatz, wo der Browser Scroll-Zeitleisten nicht kennt. */
  @supports not (animation-timeline:view()){
    .js .leitung .l-pfad{stroke-dashoffset:1}
    .js .leitung .l-punkt{opacity:0}
    .js .leitung.in .l-pfad{animation:leitung-zeichnen 1.1s ease-out both}
    .js .leitung.in .l-punkt{animation:leitung-punkt 1.1s ease-out both}
  }
}

/* Abstaende der drei ueblichen Einbauorte. Die Leitung setzt selbst keinen
   Abstand nach aussen — wer sie einbaut, entscheidet ueber ihren Platz. */
.leitung-trenner{margin-block:clamp(28px,4vw,52px)}


/* == 25 Mobil ==============================================================
   1080px  Navigation klappt zum Menue
    980px  Zweispalter werden einspaltig, Raster halbieren sich
    640px  alles einspaltig, Sticky-CTA an */

@media (max-width:1080px){
  .hauptmenue{position:fixed;inset:var(--kopfhoehe) 0 auto;display:none;flex-direction:column;
    align-items:stretch;gap:0;margin:0;padding:12px var(--rand) 28px;background:#fff;
    border-bottom:1px solid var(--linie);box-shadow:var(--schatten);
    max-height:calc(100vh - var(--kopfhoehe));overflow-y:auto}
  .hauptmenue.offen{display:flex}
  /* Auf schmalen Schirmen kein Mega-Menue: Die Felder haetten keinen Platz,
     und ein Daumen trifft keine zwei Spalten. Stattdessen klappt die Leiste
     als Liste auf, und JEDER Bereich zeigt seine Unterpunkte gleich
     darunter — ein Tippen weniger als bei einem zweistufigen Aufklappen. */
  .hauptmenue > li{width:100%}
  .mega-punkt{width:100%;text-align:left;padding:14px 4px;font-size:17px;
    border-bottom:1px solid var(--linie)}
  .mega-punkt::after{display:none}
  .mega-feld,.mega-feld[hidden]{display:block;position:static;background:none;
    border:0;box-shadow:none;animation:none}
  .mega-innen{display:block;padding:0 0 10px}
  .mega-spalte,.mega-bild{display:none}
  .mega-kinder{grid-template-columns:1fr;gap:0}
  .mega-kinder a{color:var(--text-weich);padding:11px 0 11px 16px;
    border-bottom:1px solid var(--linie);font-size:15.5px}
      .menue-schalter{display:flex;order:3}
  .kopf-rechts{order:2}
  .kopfleiste-innen{justify-content:flex-start;gap:16px}
  .kopfleiste-innen .logo{margin-right:auto}
}

@media (max-width:980px){
  :root{--kopfhoehe:84px}
  .zweispalt,.zweispalt-schmal,.vergleich,.grid-2,.vorbed-grid,
  .szenario-grid,.kapazitaet-grid,.anpassung-grid{grid-template-columns:1fr}
  .zweispalt .bild-seite{order:-1}
  /* Video: Film ueber den Text, in beiden Zuschnitten. Sonst stuende der
     erklaerende Text auf dem Handy vor dem, was er erklaert. */
  .videoblock,.videoblock-gedreht{grid-template-columns:1fr}
  .videoblock-gedreht .videofeld{order:-1}
  .spiele-grid{grid-template-columns:1fr}
  .vergleich-grid{grid-template-columns:1fr}
  .vergleich-spalte.ux{border-left:none;border-top:1px solid rgba(44,125,206,.25)}
  .kachel-raster > *{grid-column:span 6 !important;grid-row:auto !important}
  .karten-3,.karten-4{grid-template-columns:repeat(2,1fr)}
  .schritte{grid-template-columns:repeat(3,1fr)}
  .raetsel-reihe{grid-template-columns:repeat(2,1fr)}
  .foto-collage{max-width:480px;margin:0 auto 64px}
  .radius-diagramm{max-width:420px;margin:0 auto}
  .fuss-raster{grid-template-columns:1fr 1fr}
  .hero-foto{min-height:auto}
  .hero-foto > .bahn,.hero-foto > .wrap{padding-top:150px;padding-bottom:44px}
  .hero:has(.hero-media){min-height:auto}
  .hero:has(.hero-media) > .bahn,.hero:has(.hero-media) > .wrap{padding-top:150px;padding-bottom:44px}
  /* Auf schmalen Schirmen traegt der seitliche Schleier nicht mehr — von oben
     nach unten abdunkeln, sonst steht der Text stellenweise auf hellem Foto. */
  .hero-scrim{background:linear-gradient(180deg,rgba(18,19,26,.7) 0%,rgba(18,19,26,.82) 55%,
    rgba(18,19,26,.94) 100%)}
}

@media (max-width:640px){
  :root{--kopfhoehe:76px}
  /* Am Finger braucht der Knauf mehr Flaeche, die Schilder weniger. */
  .vn-knauf{width:52px;height:52px}
  .vn-schild{font-size:11px;padding:6px 11px;top:10px}
  .vn-schild-links{left:10px}
  .vn-schild-rechts{right:10px}
  body{font-size:16px;padding-bottom:96px}
  .logo{font-size:18px}
  .logo svg{width:28px;height:28px}
  .logo img{height:32px;width:auto}
  /* Der Knopf in der Kopfzeile passt hier nicht mehr neben Logo und Menue —
     ab hier uebernimmt der Sticky-CTA am unteren Rand. */
  .kopf-rechts .knopf{display:none}
  .karten-2,.karten-3,.karten-4{grid-template-columns:1fr}
  .kachel-raster > *{grid-column:1/-1 !important}
  .schritte,.raetsel-reihe{grid-template-columns:1fr}
  .schritt{grid-template-columns:44px 1fr;gap:16px}
  .schritt .num{width:40px;height:40px;font-size:15px}
  .spiel-panel{padding:32px 26px;min-height:0}
  .vergleich-spalte{padding:28px 24px}
  .zahlen,.stat-row{gap:18px 28px;margin-top:36px;padding-top:26px}
  /* Bilderfolge: hoeheres Format (Handys sind hochkant), kleinere Vorschauen,
     und die Pfeile ruecken nach innen, damit sie am Rand greifbar bleiben.
     44 px Mindestgroesse bleibt gewahrt. */
  .bilderfolge-buehne{aspect-ratio:4/3}
  .bilderfolge-knopf{width:44px;height:44px}
  .bilderfolge-zurueck{left:10px}
  .bilderfolge-vor{right:10px}
  .bilderfolge-streifen button{flex:0 0 72px;height:50px}
  .bilderfolge-text{padding:20px 16px 14px;font-size:14px}
  .fuss-raster{grid-template-columns:1fr}
  .fuss-unten{flex-direction:column;align-items:flex-start}
  .hero-foto > .bahn,.hero-foto > .wrap{padding-top:120px}
  .hero:has(.hero-media) > .bahn,.hero:has(.hero-media) > .wrap{padding-top:120px}
}

@media (max-width:430px){
  h1,h2{letter-spacing:0}
  .knopf,.btn{width:100%}
  .kopf-rechts .knopf,.sticky-cta .knopf{width:auto}
}

@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation-duration:.01ms!important;animation-iteration-count:1!important;
    transition-duration:.01ms!important}
  .js .reveal{opacity:1;transform:none}
}


/* == 26 Druck ============================================================== */

@media print{
  .kopfleiste,.sticky-cta,.fussleiste,.band,.cta,.zum-inhalt,.hero-glow,.passt-dazu{display:none}
  body{font-size:11pt;color:#000;background:#fff;padding-bottom:0}
  .sektion{padding-block:12pt}
  .hero{background:#fff;color:#000;padding-block:12pt}
  .hero::after,.hero-media,.hero-scrim{display:none}
  .hero h1,.hero .vorspann,.hero .sub{color:#000}
  .karte,.kachel,.kachel-zahl{break-inside:avoid}
  .js .reveal{opacity:1;transform:none}
}


/* == 27 V3 (03.09.2026): Verlauf-Koepfe, Icons, Glanz, Bilder, Stationen, CTA
   Auftrag des Betreibers: „mir fehlt der Farbverlauf in den Ueberschriften,
   es sind zu wenige Bilder drauf, futuristisch mit schoenen Effekten, eigene
   Icons, immer wieder sinnvolle Call-to-Action-Bereiche."

   Alles in diesem Block ist ZUSAETZLICH. Nichts oben wurde geaendert; wo eine
   Regel hier eine obere ueberschreibt, steht warum. Die HTML-Bausteine dazu
   sind in DESIGN-BAUSTEINE-V3.md beschrieben.
   ========================================================================== */

/* -- 27a Verlaufsfarben fuer dunkle Flaechen ---------------------------------
   Der Markenverlauf Blau->Violett ist auf Dunkel zu dunkel (Kontrast unter 3:1
   fuer #7B4397 auf #12131A). Auf dunklem Grund laeuft deshalb eine aufgehellte
   Fassung derselben Farben: gleiche Farbtoene, mehr Licht. */
:root{
  --verlauf-text-hell:linear-gradient(90deg,#6FB4F7 0%,#B98BDC 100%);
  --glow-blau:rgba(44,125,206,.55);
  --glow-violett:rgba(123,67,151,.5);
}
.hero .verlauf,.sektion-dunkel .verlauf,.band .verlauf,.bild-band .verlauf,
.cta-neon .verlauf,.spiel-panel .verlauf{background-image:var(--verlauf-text-hell)}


/* -- 27b Sektionskopf: mittig, zweifarbig, Verlaufslinie ----------------------
   Uebernommen aus NEUE-SEITE-ALTES-DESIGN (Block 05b), das war die alte
   Live-Seite: Ueberschrift mittig, ein Teil dunkel, ein Teil im Verlauf
   (<span class="verlauf">), darunter eine 300 px lange Verlaufslinie, die an
   beiden Enden ausblendet und beim Ueberfahren einen Lichtschein zieht.

   Trifft ueber den Kindpfad .sektion > .bahn > .kopf nur echte Sektionskoepfe.
   Koepfe in Zweispaltern bleiben linksbuendig. Wer einen Kopf ausdruecklich
   links haben will, gibt ihm .links. */
.sektion > .bahn > .kopf,.sektion > .bahn > .section-kopf,
.sektion > .bahn-schmal > .kopf,.sektion > .bahn-schmal > .section-kopf{
  align-items:center;text-align:center;margin-inline:auto;max-width:880px}
.sektion > .bahn > .kopf .vorspann,.sektion > .bahn > .section-kopf .vorspann,
.sektion > .bahn-schmal > .kopf .vorspann{max-width:700px;margin-inline:auto;
  font-size:17px;line-height:1.7;color:var(--text-leise)}
.sektion-dunkel > .bahn > .kopf .vorspann,
.sektion-dunkel > .bahn-schmal > .kopf .vorspann{color:var(--text-hell-weich)}
.sektion > .bahn > .kopf > .kicker::before,
.sektion > .bahn-schmal > .kopf > .kicker::before{display:none}

.sektion > .bahn > .kopf > h2::after,.sektion > .bahn > .section-kopf > h2::after,
.sektion > .bahn-schmal > .kopf > h2::after{
  content:"";display:block;width:300px;max-width:70%;height:4px;border-radius:2px;
  margin:22px auto 2px;
  background-image:
    linear-gradient(90deg,rgba(255,255,255,0) 0%,rgba(255,255,255,.85) 50%,rgba(255,255,255,0) 100%),
    linear-gradient(90deg,rgba(44,125,206,0) 0%,#2C7DCE 20%,#7B4397 80%,rgba(123,67,151,0) 100%);
  background-size:50% 100%,100% 100%;background-position:-70% 0,0 0;background-repeat:no-repeat;
  box-shadow:0 0 18px rgba(44,125,206,.25)}
.sektion-dunkel > .bahn > .kopf > h2::after{box-shadow:0 0 22px var(--glow-blau)}
@media (hover:hover) and (prefers-reduced-motion:no-preference){
  .sektion > .bahn > .kopf > h2:hover::after,.sektion > .bahn > .section-kopf > h2:hover::after,
  .sektion > .bahn-schmal > .kopf > h2:hover::after{animation:trenner-schein .75s ease-out}
  @keyframes trenner-schein{from{background-position:-70% 0,0 0}to{background-position:170% 0,0 0}}
}
/* Der Glanz-Hover aus 04b setzt padding-top:.3em auf h2 — die Linie sitzt
   danach unveraendert, weil sie ein ::after unterhalb des Textes ist. */

/* Ausdruecklich linksbuendig (z. B. neben einem Bild) */
.sektion > .bahn > .kopf.links,.sektion > .bahn-schmal > .kopf.links{
  align-items:flex-start;text-align:left;margin-inline:0}
.sektion > .bahn > .kopf.links > h2::after{margin-inline:0}
.sektion > .bahn > .kopf.links .vorspann{margin-inline:0}
.sektion > .bahn > .kopf.links > .kicker::before{display:inline-block}

/* Rechtstexte: Impressum, Datenschutz, Spiel-AGB bleiben nuechtern */
body.rechtstext .kopf,body.rechtstext .section-kopf{
  align-items:flex-start;text-align:left;margin-inline:0}
body.rechtstext .kopf > h2::after,body.rechtstext .section-kopf > h2::after{content:none}
body.rechtstext .kopf > .kicker::before{display:inline-block}


/* -- 27c Icons ----------------------------------------------------------------
   Ein eigener Icon-Satz in assets/icons.svg, gezeichnet auf 24er-Raster,
   Strich 1.75, runde Enden. bauen.py setzt die Datei als unsichtbaren Vorrat
   an den Anfang jeder Seite; ein Icon wird so eingesetzt:
     <svg class="icon" aria-hidden="true"><use href="#i-schild"/></svg>
   Der Strich laeuft im Markenverlauf ueber den Gradient #ux-verlauf, der im
   Vorrat mit userSpaceOnUse definiert ist — sonst verschwinden waagerechte
   Linien (Bounding-Box ohne Hoehe). */
.icon-vorrat{position:absolute;width:0;height:0;overflow:hidden}
.icon{width:24px;height:24px;flex:0 0 auto;display:inline-block;vertical-align:middle;
  fill:none;stroke:currentColor;stroke-width:1.75;stroke-linecap:round;stroke-linejoin:round}
.icon-verlauf{stroke:url(#ux-verlauf)}
.icon-gross{width:32px;height:32px}
.icon-klein{width:18px;height:18px}

/* In der Symbolflaeche (.ico) laeuft der Strich im Verlauf. Die Regel aus 09
   (fill:currentColor fuer alte Fuellicons) wird hier fuer .icon aufgehoben. */
.ico .icon,.karte .ico .icon,.kachel .ico .icon{fill:none;stroke:url(#ux-verlauf);width:26px;height:26px}
.karte:hover .ico .icon,.kachel:hover .ico .icon{stroke:#fff}
.sektion-dunkel .ico{background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.08)}
.ico.rund{border-radius:50%}

/* Iconzeile: Icon links, Text rechts — fuer Merkmale, Leistungen, Grenzen */
.icon-liste{list-style:none;padding:0;margin:0;display:grid;gap:18px 28px;
  grid-template-columns:repeat(auto-fit,minmax(260px,1fr))}
.icon-liste li{display:grid;grid-template-columns:44px 1fr;gap:16px;align-items:start}
.icon-liste .ico{width:44px;height:44px;margin:0;border-radius:12px}
.icon-liste strong{display:block;font-family:'Roboto Condensed',sans-serif;font-weight:700;
  text-transform:uppercase;letter-spacing:.03em;font-size:15px;margin-bottom:4px;color:var(--text)}
.icon-liste p{margin:0;font-size:15px;line-height:1.6;color:var(--text-weich)}
.sektion-dunkel .icon-liste strong{color:#fff}
.sektion-dunkel .icon-liste p{color:var(--text-hell-weich)}
.icon-liste.zweispaltig{grid-template-columns:repeat(2,minmax(0,1fr))}

/* Merkmal-Chips: kurze Fakten mit Icon in einer Reihe */
.merkmale{display:flex;flex-wrap:wrap;gap:10px;margin-top:22px;list-style:none;padding:0}
.merkmale li{display:inline-flex;align-items:center;gap:9px;padding:9px 16px 9px 12px;
  border-radius:999px;border:1px solid var(--linie);background:var(--karte);
  font-family:'Roboto Condensed',sans-serif;font-weight:700;font-size:13.5px;
  letter-spacing:.02em;color:var(--text)}
.merkmale .icon{width:18px;height:18px;stroke:url(#ux-verlauf)}
.hero .merkmale li,.sektion-dunkel .merkmale li,.band .merkmale li{
  background:rgba(255,255,255,.06);border-color:rgba(255,255,255,.14);color:#fff}


/* -- 27d Glanz auf Karten und Kacheln -----------------------------------------
   Beim Ueberfahren zeichnet sich ein 1 px breiter Verlaufsrahmen um Karte und
   Kachel, dazu ein weicher Schein. Der Rahmen ist ein ::before mit Maske —
   kein zweites Element, kein Umbau im HTML. */
.karte,.kachel,.kachel-zahl,.station,.statistik-kachel{position:relative}
.karte::before,.kachel::before,.station::before,.statistik-kachel::before{
  content:"";position:absolute;inset:-1px;border-radius:inherit;padding:1.5px;
  background:var(--verlauf);pointer-events:none;opacity:0;transition:opacity .35s ease;
  -webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);
  -webkit-mask-composite:xor;mask-composite:exclude}
.karte:hover::before,.kachel:hover::before,.station:hover::before,.statistik-kachel:hover::before{opacity:1}
.karte:hover,.kachel:hover{box-shadow:0 18px 44px rgba(44,125,206,.18),0 0 0 1px rgba(44,125,206,.12)}
.sektion-dunkel .karte:hover,.sektion-dunkel .kachel:hover{
  box-shadow:0 18px 48px rgba(0,0,0,.45),0 0 32px var(--glow-blau)}


/* -- 27e Dunkle Sektion mit Raster und Schein ---------------------------------
   .sektion-dunkel.raster: ein feines Linienraster, das nach unten ausblendet,
   plus zwei Farbscheine. Rein dekorativ, liegt unter dem Inhalt. */
.sektion-dunkel{position:relative;isolation:isolate;overflow:hidden}
.sektion-dunkel.raster::before{content:"";position:absolute;inset:0;z-index:-1;pointer-events:none;
  background-image:
    linear-gradient(rgba(140,192,242,.07) 1px,transparent 1px),
    linear-gradient(90deg,rgba(140,192,242,.07) 1px,transparent 1px);
  background-size:56px 56px;
  -webkit-mask-image:radial-gradient(70% 70% at 50% 40%,#000 30%,transparent 100%);
  mask-image:radial-gradient(70% 70% at 50% 40%,#000 30%,transparent 100%)}
.sektion-dunkel.raster::after{content:"";position:absolute;inset:0;z-index:-1;pointer-events:none;
  background:radial-gradient(60% 50% at 85% 10%,rgba(123,67,151,.35),transparent 70%),
             radial-gradient(50% 45% at 10% 95%,rgba(44,125,206,.3),transparent 70%)}
.sektion-dunkel .bahn{position:relative;z-index:1}

/* Leuchtende Trennlinie zwischen Sektionen (optional, <hr class="leuchtlinie">) */
.leuchtlinie{border:0;height:1px;margin:0;background:linear-gradient(90deg,transparent,
  rgba(44,125,206,.7) 30%,rgba(123,67,151,.7) 70%,transparent);
  box-shadow:0 0 16px rgba(44,125,206,.35)}


/* -- 27f Bildbausteine --------------------------------------------------------
   Drei neue Formen, damit jede Seite drei bis fuenf Fotos tragen kann, ohne
   dass es nach Galerie aussieht:
     .bildstreifen   3 bis 5 Fotos nebeneinander, Bildunterschrift auf dem Bild
     .mosaik         ein grosses Foto links, zwei kleine rechts
     .bild-band      ein Foto ueber die volle Breite mit Text darauf */

.bildstreifen{display:grid;gap:14px;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));
  margin:0;padding:0;list-style:none}
.bildstreifen figure,.mosaik figure{position:relative;margin:0;border-radius:var(--radius);
  overflow:hidden;border:1px solid var(--linie);background:var(--dunkel);
  box-shadow:0 10px 30px rgba(21,23,31,.10)}
.bildstreifen figure{aspect-ratio:4/3}
.bildstreifen img,.mosaik img{width:100%;height:100%;object-fit:cover;display:block;
  transition:transform .7s ease,filter .7s ease}
.bildstreifen figure:hover img,.mosaik figure:hover img{transform:scale(1.06)}
.bildstreifen figcaption,.mosaik figcaption{position:absolute;left:0;right:0;bottom:0;
  padding:26px 16px 12px;color:#fff;font-size:13.5px;line-height:1.4;
  background:linear-gradient(0deg,rgba(12,13,18,.82),rgba(12,13,18,0));
  font-family:'Roboto Condensed',sans-serif;font-weight:700;letter-spacing:.03em;
  text-transform:uppercase}
.bildstreifen figure::after,.mosaik figure::after{content:"";position:absolute;inset:0;
  border-radius:inherit;box-shadow:inset 0 0 0 1px rgba(255,255,255,.06);pointer-events:none}
.bildstreifen.hoch figure{aspect-ratio:3/4}
.sektion-dunkel .bildstreifen figure,.sektion-dunkel .mosaik figure{border-color:var(--dunkel-linie)}

.mosaik{display:grid;gap:14px;grid-template-columns:1.6fr 1fr;grid-template-rows:1fr 1fr}
.mosaik figure:first-child{grid-row:span 2}
.mosaik figure{min-height:200px}
.mosaik figure:first-child{min-height:420px}

.bild-band{position:relative;isolation:isolate;overflow:hidden;color:#fff;
  min-height:clamp(380px,52vh,560px);display:flex;align-items:center;
  padding-block:clamp(56px,7vw,88px)}
.bild-band > img{position:absolute;inset:0;z-index:-2;width:100%;height:100%;object-fit:cover;
  transform:scale(1.08)}
.bild-band::before{content:"";position:absolute;inset:0;z-index:-1;
  background:linear-gradient(100deg,rgba(18,19,26,.9) 0%,rgba(18,19,26,.7) 40%,rgba(18,19,26,.35) 100%)}
.bild-band .bahn{position:relative}
.bild-band h2{color:#fff;max-width:20ch}
.bild-band p{color:var(--text-hell-weich);max-width:56ch}
.bild-band .kicker{color:var(--blau-hell)}
.bild-band.mitte{text-align:center}
.bild-band.mitte h2,.bild-band.mitte p{margin-inline:auto}
.bild-band.mitte .knopf-reihe{justify-content:center}
@supports (animation-timeline:view()){
  @media (prefers-reduced-motion:no-preference){
    @keyframes band-parallax{from{transform:translate3d(0,-6%,0) scale(1.12)}to{transform:translate3d(0,6%,0) scale(1.12)}}
    .bild-band > img{animation:band-parallax linear both;animation-timeline:view();animation-range:entry 0% exit 100%}
  }
}


/* -- 27g Stationen: die Spielinhalte mit Icon -----------------------------------
   Fuer die 13 Stationen von Cyber Breach und die fuenf Raetselarten von
   Mission 2145. Jede Station: Nummer, Icon, Titel, Thema, ein Satz, Lehre. */
.stationen{display:grid;gap:18px;grid-template-columns:repeat(3,minmax(0,1fr));
  list-style:none;padding:0;margin:0}
.station{background:var(--karte);border:1px solid var(--linie);border-radius:var(--radius);
  padding:24px 22px 22px;display:flex;flex-direction:column;gap:12px;
  transition:transform .3s ease,box-shadow .3s ease,border-color .3s ease}
.station:hover{transform:translateY(-4px);border-color:var(--blau);box-shadow:var(--schatten-hoch)}
.station > *{margin:0}
.station-kopf{display:flex;align-items:center;gap:12px}
.station .ico{width:44px;height:44px;margin:0;border-radius:12px}
.station-nr{margin-left:auto;font-family:'Rigelstar','Roboto Condensed',sans-serif;
  font-size:22px;line-height:1;color:transparent;background:var(--verlauf);
  -webkit-background-clip:text;background-clip:text}
.station h3{font-size:17px;line-height:1.3}
.station .thema{align-self:flex-start;font-family:'Roboto Condensed',sans-serif;font-weight:700;
  font-size:11.5px;text-transform:uppercase;letter-spacing:.1em;padding:5px 11px;border-radius:999px;
  background:rgba(44,125,206,.1);color:var(--blau)}
.station.falle .thema{background:rgba(123,67,151,.12);color:var(--violett)}
.station p{font-size:14.5px;line-height:1.6;color:var(--text-weich)}
.station .lehre{margin-top:auto;padding-top:12px;border-top:1px solid var(--linie);
  display:grid;grid-template-columns:18px 1fr;gap:10px;align-items:start;
  font-size:14px;line-height:1.5;color:var(--text)}
.station .lehre .icon{width:18px;height:18px;stroke:url(#ux-verlauf);margin-top:2px}
.sektion-dunkel .station{background:var(--dunkel-alt);border-color:var(--dunkel-linie);color:var(--text-hell-weich)}
.sektion-dunkel .station h3,.sektion-dunkel .station .lehre{color:#fff}
.sektion-dunkel .station p{color:var(--text-hell-weich)}
.sektion-dunkel .station .lehre{border-top-color:var(--dunkel-linie)}
.sektion-dunkel .station .thema{background:rgba(140,192,242,.14);color:var(--blau-hell)}
.sektion-dunkel .station.falle .thema{background:rgba(185,139,220,.16);color:#D9B8F0}

/* Beispielkasten: ein echter Fall, ein Satz, eine Quelle */
.beispiel{border-radius:var(--radius);padding:18px 20px;background:var(--grund-alt);
  border:1px solid var(--linie);display:grid;grid-template-columns:44px 1fr;gap:14px;align-items:start}
.beispiel .ico{width:44px;height:44px;margin:0;border-radius:12px}
.beispiel strong{display:block;font-family:'Roboto Condensed',sans-serif;font-weight:700;
  text-transform:uppercase;letter-spacing:.03em;font-size:14px;margin-bottom:4px}
.beispiel p{margin:0;font-size:14.5px;line-height:1.55;color:var(--text-weich)}
.beispiel .quelle{display:block;margin-top:6px;font-size:12.5px;color:var(--text-leise)}
.sektion-dunkel .beispiel{background:rgba(255,255,255,.05);border-color:var(--dunkel-linie);color:#fff}
.sektion-dunkel .beispiel p{color:var(--text-hell-weich)}
.sektion-dunkel .beispiel .quelle{color:var(--text-hell-leise)}
.beispiele{display:grid;gap:14px;grid-template-columns:repeat(auto-fit,minmax(300px,1fr))}


/* -- 27h Statistik-Kacheln -------------------------------------------------------
   Grosse Zahl im Verlauf, Label, Quelle. Fuer belegte Zahlen (Bericht zur
   Cybersicherheit in Bayern 2026). Jede Kachel traegt ihre Quelle selbst. */
.statistik{display:grid;gap:18px;grid-template-columns:repeat(auto-fit,minmax(220px,1fr))}
.statistik-kachel{border-radius:var(--radius);padding:26px 24px;background:var(--karte);
  border:1px solid var(--linie);display:flex;flex-direction:column;gap:8px;
  transition:transform .3s ease,box-shadow .3s ease}
.statistik-kachel:hover{transform:translateY(-4px);box-shadow:var(--schatten-hoch)}
.statistik-kachel > *{margin:0}
.statistik-kachel .wert{font-family:'Rigelstar','Roboto Condensed',sans-serif;font-size:clamp(30px,3.6vw,44px);
  line-height:1;text-transform:uppercase;color:transparent;background:var(--verlauf);
  -webkit-background-clip:text;background-clip:text;padding-top:.15em}
.statistik-kachel .label{font-family:'Roboto Condensed',sans-serif;font-weight:700;font-size:14px;
  text-transform:uppercase;letter-spacing:.05em;color:var(--text)}
.statistik-kachel p{font-size:14px;line-height:1.55;color:var(--text-weich)}
.statistik-kachel .quelle{margin-top:auto;padding-top:10px;font-size:12px;color:var(--text-leise)}
.sektion-dunkel .statistik-kachel{background:rgba(255,255,255,.05);border-color:var(--dunkel-linie)}
.sektion-dunkel .statistik-kachel .wert{background:var(--verlauf-text-hell);-webkit-background-clip:text;background-clip:text}
.sektion-dunkel .statistik-kachel .label{color:#fff}
.sektion-dunkel .statistik-kachel p{color:var(--text-hell-weich)}
.sektion-dunkel .statistik-kachel .quelle{color:var(--text-hell-leise)}


/* -- 27i CTA-Neon: der leuchtende Aufruf mitten in der Seite ---------------------
   Dunkler Kasten mit umlaufendem Verlaufsrahmen, der sich langsam dreht, und
   einem Schein dahinter. Alle zwei bis drei Sektionen einer, nie zwei hinter-
   einander. Inhalt: Kicker, H3 oder H2, ein Satz, ein oder zwei Knoepfe. */
@property --cta-winkel{syntax:'<angle>';inherits:false;initial-value:0deg}
.cta-neon{position:relative;isolation:isolate;border-radius:var(--radius-gross);
  background:var(--dunkel);color:#fff;padding:clamp(30px,4.5vw,52px);
  display:grid;grid-template-columns:1.4fr auto;gap:24px 40px;align-items:center;
  overflow:hidden}
.cta-neon::before{content:"";position:absolute;inset:0;z-index:-2;border-radius:inherit;padding:1.5px;
  background:conic-gradient(from var(--cta-winkel),#2C7DCE,#7B4397,#8CC0F2,#2C7DCE);
  -webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);
  -webkit-mask-composite:xor;mask-composite:exclude;
  animation:cta-drehen 9s linear infinite}
.cta-neon::after{content:"";position:absolute;inset:0;z-index:-1;pointer-events:none;
  background:radial-gradient(60% 80% at 0% 50%,rgba(44,125,206,.32),transparent 70%),
             radial-gradient(50% 80% at 100% 50%,rgba(123,67,151,.32),transparent 70%)}
@keyframes cta-drehen{to{--cta-winkel:360deg}}
.cta-neon > *{margin:0;position:relative}
.cta-neon .kicker{color:var(--blau-hell)}
.cta-neon h2,.cta-neon h3{color:#fff;margin-top:8px}
.cta-neon h3{font-family:'Rigelstar','Roboto Condensed',sans-serif;font-weight:400;
  font-size:clamp(22px,2.6vw,30px);line-height:1.15}
.cta-neon p{color:var(--text-hell-weich);margin-top:10px;max-width:56ch;font-size:16px;line-height:1.6}
.cta-neon .knopf-reihe{margin-top:0;flex-direction:column;align-items:stretch;min-width:240px}
.cta-neon .knopf{box-shadow:0 6px 24px rgba(44,125,206,.45),0 0 40px rgba(123,67,151,.25)}
.cta-neon .knopf-leise{border-color:rgba(255,255,255,.28);color:#fff}
.cta-neon .knopf-leise:hover{border-color:#fff;background:rgba(255,255,255,.1)}
.cta-neon .merkmale{margin-top:16px;grid-column:1/-1}
.cta-neon.mitte{grid-template-columns:1fr;text-align:center}
.cta-neon.mitte p{margin-inline:auto}
.cta-neon.mitte .knopf-reihe{flex-direction:row;justify-content:center}
.sektion-cta .cta-neon{margin:0}

/* In den Hero gehoert kein zweiter Kasten; die Knoepfe dort bekommen nur den Schein. */
.hero .knopf{box-shadow:0 6px 24px rgba(44,125,206,.45),0 0 40px rgba(123,67,151,.3)}


/* -- 27j Einblenden in Folge -------------------------------------------------------
   .reveal blendet den ganzen Block ein. .reveal-folge blendet seine KINDER
   nacheinander ein (Karten, Kacheln, Stationen, Bilder). ux.js setzt .in wie
   bei .reveal — die Klasse steht in derselben Abfrage. */
.js .reveal-folge > *{opacity:0;transform:translateY(22px);
  transition:opacity .6s ease,transform .6s ease}
.js .reveal-folge.in > *{opacity:1;transform:none}
.js .reveal-folge.in > :nth-child(2){transition-delay:.08s}
.js .reveal-folge.in > :nth-child(3){transition-delay:.16s}
.js .reveal-folge.in > :nth-child(4){transition-delay:.24s}
.js .reveal-folge.in > :nth-child(5){transition-delay:.32s}
.js .reveal-folge.in > :nth-child(6){transition-delay:.4s}
.js .reveal-folge.in > :nth-child(n+7){transition-delay:.48s}
@media (prefers-reduced-motion:reduce){.js .reveal-folge > *{opacity:1;transform:none}}


/* -- 27k Hero: Zahlen mit Icon, Schein auf der H1 ----------------------------------- */
.hero .zahlen > div{position:relative}
.hero .zahlen .icon{width:20px;height:20px;stroke:var(--blau-hell);margin-bottom:2px}
.hero h1{text-shadow:0 0 40px rgba(44,125,206,.25)}


/* -- 27l Mobil fuer die neuen Bausteine ------------------------------------------------ */
@media (max-width:980px){
  .stationen{grid-template-columns:repeat(2,minmax(0,1fr))}
  .mosaik{grid-template-columns:1fr 1fr;grid-template-rows:auto}
  .mosaik figure:first-child{grid-column:span 2;grid-row:auto;min-height:260px}
  .icon-liste.zweispaltig{grid-template-columns:1fr}
  .cta-neon{grid-template-columns:1fr}
  .cta-neon .knopf-reihe{flex-direction:row}
}
@media (max-width:640px){
  .stationen{grid-template-columns:1fr}
  .bildstreifen{grid-template-columns:repeat(2,minmax(0,1fr))}
  .bildstreifen figure{aspect-ratio:1/1}
  .mosaik{grid-template-columns:1fr}
  .mosaik figure:first-child{grid-column:auto}
  .bild-band{min-height:auto}
  .cta-neon .knopf-reihe{flex-direction:column}
  .statistik{grid-template-columns:1fr 1fr}
}
@media (max-width:430px){
  .bildstreifen{grid-template-columns:1fr}
  .statistik{grid-template-columns:1fr}
}
@media print{
  .cta-neon,.bild-band > img,.sektion-dunkel.raster::before,.sektion-dunkel.raster::after{display:none}
}


/* == 28 V3: Zwei Farbwelten und die Cyber-Breach-Schriften ==================
   Betreiber, 03.09.2026: „Mission 2145 ist eher blau gehalten, Cyber Breach
   eher lila, sodass man das gut unterscheiden kann." Und: „lade dir die Cyber
   Breach Schriften aus dem Korbi-Ordner und baue sie auf der Cyber-Breach-
   Seite ein."

   Die Cyber-Breach-Dokumente (Spielablauf v3, Spielerflow, Uebersicht) sind
   durchgehend in Inter (Ueberschriften/UI) und JetBrains Mono (Codes, Zahlen,
   Terminal) gesetzt, auf Nachtblau #050816/#0a1a2e mit Violett #a78bfa, Cyan
   #22d3ee, Gruen #34d399 und Rot #f4525c als Signalfarben. Beide Schriften
   liegen selbst gehostet in assets/schriften/ (OFL-Lizenz).

   Die Farbwelt haengt an der Klasse am <body>, die bauen.py aus dem Feld
   "thema" im Seitenplan setzt: thema-zeit (Blau) oder thema-cyber (Violett).
   Die Marke selbst (Logo, Knoepfe im Verlauf) bleibt auf beiden gleich; es
   verschiebt sich nur, was Akzent ist: Kicker, Icons, Scheine, Linien. */

@font-face{font-family:'Inter';src:url('schriften/inter-400.woff2') format('woff2');
  font-weight:400;font-style:normal;font-display:swap}
@font-face{font-family:'Inter';src:url('schriften/inter-600.woff2') format('woff2');
  font-weight:600;font-style:normal;font-display:swap}
@font-face{font-family:'Inter';src:url('schriften/inter-800.woff2') format('woff2');
  font-weight:800;font-style:normal;font-display:swap}
@font-face{font-family:'JetBrains Mono';src:url('schriften/jetbrains-mono-400.woff2') format('woff2');
  font-weight:400;font-style:normal;font-display:swap}
@font-face{font-family:'JetBrains Mono';src:url('schriften/jetbrains-mono-600.woff2') format('woff2');
  font-weight:600;font-style:normal;font-display:swap}

/* -- 28a Farbwelt Zeit (Mission 2145): Blau fuehrt ------------------------------ */
body.thema-zeit{
  --akzent:#2C7DCE;--akzent-hell:#8CC0F2;
  --verlauf:linear-gradient(135deg,#2C7DCE 0%,#4F5FC9 100%);
  --verlauf-text:linear-gradient(90deg,#2C7DCE 0%,#5A55C4 100%);
  --verlauf-text-hell:linear-gradient(90deg,#8CC0F2 0%,#A9A2F0 100%);
  --glow-blau:rgba(44,125,206,.6);--glow-violett:rgba(79,95,201,.45)}
body.thema-zeit .hero::after{
  background:radial-gradient(120% 90% at 78% 8%,rgba(44,125,206,.45) 0%,transparent 58%),
             radial-gradient(90% 70% at 8% 92%,rgba(79,95,201,.3) 0%,transparent 60%)}
body.thema-zeit .hero-glow{background:linear-gradient(135deg,#2C7DCE,#4F5FC9)}
body.thema-zeit .sektion-dunkel.raster::after{
  background:radial-gradient(60% 50% at 85% 10%,rgba(44,125,206,.38),transparent 70%),
             radial-gradient(50% 45% at 10% 95%,rgba(79,95,201,.28),transparent 70%)}

/* -- 28b Farbwelt Cyber (Cyber Breach): Violett fuehrt, Nachtblau als Grund ------ */
body.thema-cyber{
  --akzent:#7B4397;--akzent-hell:#B98BDC;
  --verlauf:linear-gradient(135deg,#6D3FA0 0%,#A855F7 100%);
  --verlauf-text:linear-gradient(90deg,#7B4397 0%,#A855F7 100%);
  --verlauf-text-hell:linear-gradient(90deg,#B98BDC 0%,#D8B4FE 100%);
  --dunkel:#080A18;--dunkel-alt:#0F1226;--dunkel-linie:#262A48;
  --blau-hell:#B98BDC;
  --glow-blau:rgba(168,85,247,.5);--glow-violett:rgba(123,67,151,.6)}
body.thema-cyber .hero::after{
  background:radial-gradient(120% 90% at 78% 8%,rgba(168,85,247,.42) 0%,transparent 58%),
             radial-gradient(90% 70% at 8% 92%,rgba(34,211,238,.18) 0%,transparent 60%)}
body.thema-cyber .hero-glow{background:linear-gradient(135deg,#7B4397,#A855F7)}
body.thema-cyber .hero-scrim{background:
  linear-gradient(100deg,rgba(8,10,24,.95) 0%,rgba(8,10,24,.8) 34%,rgba(8,10,24,.38) 62%,rgba(8,10,24,.1) 100%),
  linear-gradient(0deg,rgba(8,10,24,.92) 0%,rgba(8,10,24,.3) 44%,rgba(8,10,24,0) 66%)}
body.thema-cyber .sektion-dunkel.raster::before{
  background-image:linear-gradient(rgba(168,85,247,.09) 1px,transparent 1px),
                   linear-gradient(90deg,rgba(168,85,247,.09) 1px,transparent 1px)}
body.thema-cyber .sektion-dunkel.raster::after{
  background:radial-gradient(60% 50% at 85% 10%,rgba(168,85,247,.38),transparent 70%),
             radial-gradient(50% 45% at 10% 95%,rgba(34,211,238,.18),transparent 70%)}
body.thema-cyber .kicker,body.thema-cyber .augenbraue,body.thema-cyber h4{color:var(--akzent)}
body.thema-cyber .hero .augenbraue,body.thema-cyber .sektion-dunkel .augenbraue,
body.thema-cyber .kicker.hell{color:var(--akzent-hell)}
body.thema-cyber .station .thema{background:rgba(123,67,151,.12);color:var(--violett)}
body.thema-cyber .cta-neon::before{
  background:conic-gradient(from var(--cta-winkel),#7B4397,#A855F7,#22D3EE,#7B4397)}

/* Die Cyber-Breach-Schriften: Inter fuer h3/h4 und UI-Zeilen, JetBrains Mono
   fuer Codes, Countdown, Stationsnummern und Terminalzeilen. h1/h2 bleiben
   Rigelstar — das ist die Marke Unity Xcape, die ueber beiden Spielen steht. */
body.thema-cyber h3,body.thema-cyber h4,body.thema-cyber .station .thema,
body.thema-cyber .merkmale li,body.thema-cyber .kachel-zahl .label,
body.thema-cyber .statistik-kachel .label{font-family:'Inter','Roboto Condensed',sans-serif;
  font-weight:800;letter-spacing:.01em}
body.thema-cyber h3{text-transform:none;font-size:clamp(19px,2.1vw,22px)}
body.thema-cyber .karte h3{font-size:18px}
body.thema-cyber .station-nr,body.thema-cyber .kachel-zahl .wert,
body.thema-cyber .statistik-kachel .wert,body.thema-cyber .zahlen b,
body.thema-cyber .spiel-panel .fakten strong,body.thema-cyber .mono{
  font-family:'JetBrains Mono','Consolas',monospace;font-weight:600;text-transform:none}

/* Terminal-Kasten: eine Zeile wie vom Ransom-Screen. Nur auf Cyber-Seiten. */
.terminal{font-family:'JetBrains Mono','Consolas',monospace;font-size:14px;line-height:1.7;
  background:#050816;color:#A9F0D4;border:1px solid #262A48;border-radius:var(--radius);
  padding:20px 22px;overflow:auto;box-shadow:0 0 0 1px rgba(168,85,247,.15),0 20px 50px rgba(0,0,0,.4)}
.terminal .rot{color:#F4525C}.terminal .gelb{color:#FBBF24}.terminal .cyan{color:#22D3EE}
.terminal .lila{color:#A78BFA}.terminal .grau{color:#8B95A7}
.terminal-kopf{display:flex;gap:7px;margin-bottom:12px}
.terminal-kopf span{width:10px;height:10px;border-radius:50%;background:#262A48}
.terminal-kopf span:first-child{background:#F4525C}
.terminal-kopf span:nth-child(2){background:#FBBF24}
.terminal-kopf span:nth-child(3){background:#34D399}
.terminal .cursor::after{content:"▌";animation:cursor-blink 1s steps(1) infinite;color:#A9F0D4}
@keyframes cursor-blink{50%{opacity:0}}

/* Countdown-Anzeige 90:00 als Schmuck */
.countdown{font-family:'JetBrains Mono','Consolas',monospace;font-weight:600;
  font-size:clamp(40px,7vw,84px);line-height:1;letter-spacing:.04em;color:#F4525C;
  text-shadow:0 0 24px rgba(244,82,92,.55),0 0 60px rgba(244,82,92,.25);font-variant-numeric:tabular-nums}
.countdown small{display:block;font-size:12px;letter-spacing:.2em;text-transform:uppercase;
  color:#8B95A7;margin-top:10px;text-shadow:none;font-weight:400}

/* Branding-Hinweis: das Kundenlogo im Spiel. Ein Kasten mit Platzhalter-Logo. */
.branding-demo{display:grid;grid-template-columns:1fr 1fr;gap:18px}
.branding-demo figure{margin:0;border-radius:var(--radius);overflow:hidden;
  border:1px solid var(--linie);background:var(--dunkel);position:relative;aspect-ratio:16/10}
.branding-demo img{width:100%;height:100%;object-fit:cover}
.branding-demo .logo-platz{position:absolute;right:14px;bottom:14px;padding:8px 14px;
  border-radius:8px;background:rgba(255,255,255,.92);color:var(--text);
  font-family:'Roboto Condensed',sans-serif;font-weight:700;font-size:12px;letter-spacing:.08em;
  text-transform:uppercase;border:1px dashed var(--blau)}
.branding-demo figcaption{position:absolute;left:0;right:0;top:0;padding:12px 14px;color:#fff;
  font-size:13px;font-family:'Roboto Condensed',sans-serif;font-weight:700;letter-spacing:.04em;
  text-transform:uppercase;background:linear-gradient(180deg,rgba(12,13,18,.8),rgba(12,13,18,0))}
@media (max-width:640px){.branding-demo{grid-template-columns:1fr}}

/* -- 28c Logo in der Fusszeile: Weiss-Fassung aus dem Logopaket ----------------- */
.fuss-logo{display:inline-block;margin-bottom:18px}
.fuss-logo img{width:auto;height:52px}
.fuss-logo:hover{text-decoration:none;opacity:.8}

/* -- 28d Video nie breiter als sein Kasten (Befund 03.09.: mission-2145 lief
   mit width="1920" ueber den rechten Rand, Seite bekam Querscroll) ----------- */
video{max-width:100%;height:auto}
.hero-media video{height:100%}

/* -- 28e Mosaik: feste Seitenverhaeltnisse (Befund 03.09.: auf cyber-breach
   zog ein hochformatiges Rendering das grosse Feld auf ueber 900 px) --------- */
.mosaik figure{aspect-ratio:4/3;min-height:0}
.mosaik figure:first-child{aspect-ratio:auto;min-height:0}
.mosaik img{position:absolute;inset:0}
@media (max-width:980px){.mosaik figure:first-child{aspect-ratio:16/10}}

/* -- 28f Umlautpunkte ueber der Ueberschrift (Befund 03.09.: „MÜNCHEN UND …"
   direkt unter einem Kicker ausserhalb von .kopf — die Punkte des Ü standen
   im Kicker-Text). Grund: die Regel :where(.kicker)+:where(h2) hat
   Spezifitaet 0 und verliert gegen h2{margin:0} (Abschnitt 04). Hier dieselbe
   Regel mit echter Spezifitaet. In .kopf/.section-kopf uebernimmt der
   Flex-Abstand (gap:16px) den Platz, dort bleibt margin 0. Die Hover-Regeln
   aus 04b ziehen .3em nach oben — der Ausgleich steht hier noch einmal. */
.kicker + h1,.kicker + h2,.kicker + h3,.augenbraue + h2{margin-top:16px}
.kopf > .kicker + h1,.kopf > .kicker + h2,.kopf > .kicker + h3,
.section-kopf > .kicker + h2,.hero-text > .kicker + h1{margin-top:0}
@media (hover:hover) and (prefers-reduced-motion:no-preference){
  .kicker + h1:hover,.kicker + h2:hover,.augenbraue + h2:hover{margin-top:calc(16px - .3em)}
  .kicker + h3:hover{margin-top:16px}
  .kopf > .kicker + h1:hover,.kopf > .kicker + h2:hover,.section-kopf > .kicker + h2:hover,
  .hero-text > .kicker + h1:hover{margin-top:-.3em}
}
/* Auch ohne Kicker: Rigelstar-Ueberschriften direkt unter einem Absatz oder
   einer Zahlenreihe brauchen Luft nach oben fuer Ü Ö Ä. */
p + h2,ul + h2,.zahlen + h2,.merkmale + h2{margin-top:.6em}


/* == 29 V3: Leiterbahnen (Deko) und Menuepunkte als Links ====================
   Betreiber, 03.09.2026: „Auf der aktuellen Live-Seite haben wir links und
   rechts vom Bild und unten im Footer solche Elemente (Leiterbahnen). Kannst
   du die animieren und ab und zu mit in die Seite bauen?"

   ux.js (Abschnitt 10) setzt in den Hero, in jede .sektion-dunkel.raster, in
   das CTA-Band und in die Fusszeile je zwei SVG-Leiterbahnen: links und rechts,
   gespiegelt. Sie zeichnen sich beim Sichtbarwerden einmal, danach laeuft ein
   Lichtpunkt in Dauerschleife die Bahn entlang (SMIL animateMotion, ohne
   Skript-Frames). Rein Schmuck: pointer-events:none, aria-hidden, bei
   „weniger Bewegung" steht alles still und fertig gezeichnet. */
.leiterbahn{position:absolute;z-index:0;pointer-events:none;width:min(34vw,420px);height:auto;
  color:var(--blau-hell);opacity:.55}
.leiterbahn.links{left:-2vw;bottom:8%}
.leiterbahn.rechts{right:-2vw;top:12%;transform:scaleX(-1)}
.leiterbahn path{fill:none;stroke:currentColor;stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round;
  stroke-dasharray:1;stroke-dashoffset:1}
.leiterbahn circle.knoten{fill:none;stroke:currentColor;stroke-width:1.6;opacity:0}
.leiterbahn circle.licht{fill:#fff;filter:drop-shadow(0 0 6px currentColor) drop-shadow(0 0 14px currentColor);opacity:0}
.leiterbahn.in path{animation:lb-zeichnen 1.6s ease-out forwards}
.leiterbahn.in path:nth-of-type(2){animation-delay:.25s}
.leiterbahn.in path:nth-of-type(3){animation-delay:.5s}
.leiterbahn.in circle.knoten{animation:lb-knoten .6s ease-out 1.4s forwards}
.leiterbahn.in circle.licht{animation:lb-licht 1s ease-out 1.8s forwards}
@keyframes lb-zeichnen{to{stroke-dashoffset:0}}
@keyframes lb-knoten{to{opacity:1}}
@keyframes lb-licht{to{opacity:1}}

/* Farbwelt: hell auf dunkel, Marke auf hell (Fusszeile ist dunkel) */
.hero .leiterbahn,.sektion-dunkel .leiterbahn,.band .leiterbahn,.fussleiste .leiterbahn{color:var(--blau-hell)}
body.thema-cyber .hero .leiterbahn,body.thema-cyber .sektion-dunkel .leiterbahn{color:#B98BDC}
.sektion:not(.sektion-dunkel) .leiterbahn{color:var(--blau);opacity:.22}
.fussleiste{position:relative;overflow:hidden}
.fussleiste .leiterbahn{opacity:.35}
.fussleiste .leiterbahn.links{bottom:auto;top:6%}
.fussleiste .leiterbahn.rechts{top:auto;bottom:4%}
.fussleiste > .bahn{position:relative;z-index:1}
.hero .leiterbahn{z-index:1}
.hero .leiterbahn.links{bottom:22%}
.band .leiterbahn{opacity:.4}
@media (max-width:980px){
  .leiterbahn{width:46vw;opacity:.35}
  .leiterbahn.rechts{top:4%}
}
@media (max-width:640px){.hero .leiterbahn,.band .leiterbahn{display:none}}
@media (prefers-reduced-motion:reduce){
  .leiterbahn path{stroke-dashoffset:0;animation:none}
  .leiterbahn circle.knoten{opacity:1;animation:none}
  .leiterbahn circle.licht{display:none}
}
@media print{.leiterbahn{display:none}}

/* Menuepunkte sind seit 03.09. Links (a.mega-punkt), sehen aus wie vorher. */
a.mega-punkt{text-decoration:none}
a.mega-punkt:hover{text-decoration:none}

/* Feinjustierung 03.09. nach Sichtpruefung: Fussbahn links unten statt durchs
   Logo, in dunklen Sektionen leiser, damit Chips und Tabellen lesbar bleiben. */
.fussleiste .leiterbahn.links{top:auto;bottom:10%;left:-6vw;width:min(26vw,320px)}
.fussleiste .leiterbahn.rechts{top:8%;bottom:auto;right:-6vw;width:min(26vw,320px)}
.sektion-dunkel .leiterbahn{opacity:.32}
.hero .leiterbahn.rechts{top:18%}

/* -- Social-Media-Links in der Fusszeile (Abgleich mit Live-Seite, 03.09.) --- */
.fuss-social{list-style:none;padding:0;margin:18px 0 0;display:flex;gap:10px}
.fuss-social a{display:flex;align-items:center;justify-content:center;width:40px;height:40px;
  border-radius:50%;border:1px solid var(--dunkel-linie);background:rgba(255,255,255,.04);
  color:var(--text-hell-weich);transition:border-color .25s ease,color .25s ease,transform .25s ease,box-shadow .25s ease}
.fuss-social a:hover{color:#fff;border-color:var(--blau);transform:translateY(-2px);
  box-shadow:0 0 18px var(--glow-blau);text-decoration:none}
.fuss-social .icon{width:20px;height:20px;stroke:currentColor}
/* Die Listenregel der Fusszeile (.fuss-raster ul, Raster) gewinnt sonst gegen .fuss-social. */
.fuss-raster ul.fuss-social{display:flex;flex-direction:row;gap:10px;margin-top:18px}


/* == 30 V3 (03.09. spaet): Cyber-Breach-UI-Schrift, Blitze fuer Mission 2145,
   lebendigere Leiterbahnen ================================================

   -- 30a Cyber Breach: die Schrift der Spieloberflaeche --------------------
   Betreiber: „bei Cyber Breach allgemein bitte die Schrift, die wir auch im
   Korbi-Ordner cyber breach ui verwenden." Die Oberflaeche „CyberOS"
   (fake-windows/index.html), der Spielablauf v3 und der Spielerflow sind in
   JetBrains Mono (alles Technische, Codes, Countdown, Terminal) und Inter
   (Fliesstext der Oberflaeche) gesetzt. Auf den Cyber-Seiten (body.thema-cyber)
   traegt deshalb JEDE Ueberschrift diese Schriften — auch h1 und h2, die
   sonst in Rigelstar stehen. Rigelstar bleibt dort nur im Logo. */
body.thema-cyber h1,body.thema-cyber h2{
  font-family:'JetBrains Mono','Consolas',monospace;font-weight:600;
  text-transform:none;letter-spacing:-.01em;line-height:1.08}
body.thema-cyber h1{font-size:clamp(28px,5.2vw,54px)}
body.thema-cyber h2{font-size:clamp(23px,3.6vw,38px)}
body.thema-cyber h2::after{border-radius:0}
body.thema-cyber h1 .verlauf,body.thema-cyber h2 .verlauf{padding-block:.12em}
body.thema-cyber .kicker,body.thema-cyber .augenbraue,body.thema-cyber h4,
body.thema-cyber .zahlen span,body.thema-cyber .station .thema,body.thema-cyber .tag,
body.thema-cyber .kachel-zahl .label,body.thema-cyber .statistik-kachel .label,
body.thema-cyber figcaption,body.thema-cyber .merkmale li,body.thema-cyber .knopf,
body.thema-cyber .cta-zeile strong,body.thema-cyber .mehr,body.thema-cyber .karte-mehr{
  font-family:'JetBrains Mono','Consolas',monospace;font-weight:600;letter-spacing:.04em}
body.thema-cyber .kicker::before{height:1px}
body.thema-cyber h3,body.thema-cyber .karte h3,body.thema-cyber .station h3,
body.thema-cyber .cta-neon h3,body.thema-cyber .spiel-panel h3,body.thema-cyber .icon-liste strong,
body.thema-cyber .anfrage-form-titel{font-family:'Inter','Roboto',sans-serif;font-weight:700;
  text-transform:none;letter-spacing:-.005em}
body.thema-cyber p,body.thema-cyber li,body.thema-cyber .vorspann,body.thema-cyber td,
body.thema-cyber th{font-family:'Inter','Roboto',sans-serif}
/* Umlautpolster: JetBrains Mono braucht kein Rigelstar-Polster, die Glanz-
   Regeln aus 04b (padding-top .3em bei Hover) bleiben unschaedlich. */

/* Auf allen anderen Seiten: der Cyber-Breach-Panel und die Cyber-Karten
   tragen die UI-Schrift ebenfalls, damit das Spiel ueberall gleich aussieht. */
.spiel-panel.cyber h3,.spiel-panel.cyber .tag,.spiel-panel.cyber .fakten strong{
  font-family:'JetBrains Mono','Consolas',monospace;font-weight:600;text-transform:none}
.spiel-panel.cyber p{font-family:'Inter','Roboto',sans-serif}


/* -- 30b Blitze fuer Mission 2145 (body.thema-zeit) -------------------------
   Betreiber: „bei Mission 2145 Blitze machen, die links und rechts reinlaufen,
   wie wenn man eine Zeitreise macht." ux.js Abschnitt 11 setzt in den Hero und
   in die dunklen Sektionen der Zeit-Seiten je zwei SVG-Blitze. Jeder Blitz ist
   ein gezackter Pfad, der in ~0,35 s von aussen zur Mitte laeuft, kurz
   aufflackert und verlischt; die Schleife wiederholt sich in unregelmaessigen
   Abstaenden (JS setzt die Pausen). Dazu ein weisser Kern und ein blauer
   Schein. Bei „weniger Bewegung" gibt es keine Blitze. */
.blitz{position:absolute;z-index:1;pointer-events:none;top:0;height:100%;width:min(38vw,520px);
  overflow:visible;opacity:0}
.blitz.links{left:-4vw}
.blitz.rechts{right:-4vw;transform:scaleX(-1)}
.blitz path{fill:none;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:1;stroke-dashoffset:1}
.blitz .kern{stroke:#fff;stroke-width:2.2}
.blitz .schein{stroke:#8CC0F2;stroke-width:9;opacity:.55;filter:blur(6px)}
.blitz .glut{stroke:#2C7DCE;stroke-width:22;opacity:.28;filter:blur(18px)}
.blitz.zuckt{animation:blitz-sicht 1.1s ease-out forwards}
.blitz.zuckt path{animation:blitz-lauf .32s cubic-bezier(.2,.9,.3,1) forwards}
.blitz.zuckt .schein,.blitz.zuckt .glut{animation:blitz-lauf .32s cubic-bezier(.2,.9,.3,1) forwards,blitz-flackern .9s ease-out .3s forwards}
@keyframes blitz-lauf{to{stroke-dashoffset:0}}
@keyframes blitz-sicht{0%{opacity:0}8%{opacity:1}30%{opacity:.85}38%{opacity:1}60%{opacity:.4}100%{opacity:0}}
@keyframes blitz-flackern{0%{opacity:.7}20%{opacity:.25}35%{opacity:.8}60%{opacity:.2}100%{opacity:0}}
/* Der Hero der Zeit-Seite bekommt beim Blitz einen kurzen Lichtschlag. */
.hero .blitzlicht{position:absolute;inset:0;z-index:1;pointer-events:none;background:
  radial-gradient(60% 50% at 50% 40%,rgba(140,192,242,.32),transparent 70%);opacity:0}
.hero .blitzlicht.zuckt{animation:blitzlicht .7s ease-out forwards}
@keyframes blitzlicht{0%{opacity:0}10%{opacity:1}25%{opacity:.35}40%{opacity:.8}100%{opacity:0}}
body.thema-zeit .hero h1{text-shadow:0 0 40px rgba(44,125,206,.45),0 0 90px rgba(44,125,206,.25)}
@media (max-width:640px){.blitz{width:60vw}}
@media (prefers-reduced-motion:reduce){.blitz,.blitzlicht{display:none}}


/* -- 30c Leiterbahnen, zweite Fassung: lebendiger ---------------------------
   Betreiber: „schon nicht schlecht, aber bitte noch besser, und bei Cyber
   Breach sehr viel einsetzen." Neu gegenueber Block 29:
     1. Drei Lichtpunkte je Bahn statt einem, versetzt, verschieden schnell.
     2. Die Knoten pulsieren (Ring weitet sich und verblasst), wenn ein Licht
        sie passiert — genaehert ueber eine Dauerschleife, deren Takt zur
        Laufzeit passt.
     3. Die Bahn selbst atmet: der Strich hellt langsam auf und ab.
     4. Ein Datenpaket (kurzer heller Strich) faehrt gelegentlich durch.
     5. Auf Cyber-Seiten (body.thema-cyber): mehr Bahnen (auch in hellen
        Sektionen und im CTA-Neon), violett, mit gruenem Datenpaket wie auf dem
        Terminal, zusaetzlich ein feines Raster am Rand. */
.leiterbahn.in path{animation:lb-zeichnen 1.6s ease-out forwards,lb-atmen 6s ease-in-out 2s infinite}
@keyframes lb-atmen{0%,100%{opacity:1}50%{opacity:.55}}
.leiterbahn circle.knoten{transform-box:fill-box;transform-origin:center}
.leiterbahn.in circle.knoten{animation:lb-knoten .6s ease-out 1.4s forwards,lb-puls 3.2s ease-out 2.4s infinite}
.leiterbahn.in circle.knoten:nth-of-type(2){animation-delay:1.6s,3.6s}
@keyframes lb-puls{0%{stroke-width:1.6;stroke-opacity:1}18%{stroke-width:4;stroke-opacity:.15}30%{stroke-width:1.6;stroke-opacity:1}100%{stroke-width:1.6;stroke-opacity:1}}
.leiterbahn circle.licht.zwei{fill:#8CC0F2;r:2}
.leiterbahn circle.licht.drei{fill:#fff;r:1.6;opacity:.8}
.leiterbahn .paket{stroke:#fff;stroke-width:2.6;stroke-linecap:round;fill:none;opacity:0;
  filter:drop-shadow(0 0 5px currentColor)}
.leiterbahn.in .paket{animation:lb-paket 5.5s linear 3s infinite}
@keyframes lb-paket{0%{opacity:0;stroke-dashoffset:1.06}4%{opacity:1}22%{opacity:1;stroke-dashoffset:-.06}23%,100%{opacity:0}}

/* Cyber-Seiten: violette Bahnen, gruenes Datenpaket, ueberall */
body.thema-cyber .leiterbahn{color:#A78BFA;opacity:.5}
body.thema-cyber .sektion:not(.sektion-dunkel) .leiterbahn{color:#7B4397;opacity:.16}
body.thema-cyber .leiterbahn .paket{stroke:#34D399;color:#34D399}
body.thema-cyber .leiterbahn circle.licht{fill:#22D3EE}
body.thema-cyber .cta-neon .leiterbahn{width:min(30%,260px);opacity:.35;color:#B98BDC}
body.thema-cyber .cta-neon .leiterbahn.links{left:-3%;bottom:-8%}
body.thema-cyber .cta-neon .leiterbahn.rechts{right:-3%;top:-10%}
body.thema-cyber .sektion{position:relative}
body.thema-cyber .sektion > .bahn{position:relative;z-index:1}
/* Cyber-Startseiten-Hero: Raster wie auf dem Ransom-Screen */
body.thema-cyber .hero::before{content:"";position:absolute;inset:0;z-index:1;pointer-events:none;
  background-image:linear-gradient(rgba(167,139,250,.08) 1px,transparent 1px),
                   linear-gradient(90deg,rgba(167,139,250,.08) 1px,transparent 1px);
  background-size:48px 48px;
  -webkit-mask-image:linear-gradient(180deg,transparent 0%,#000 40%,#000 70%,transparent 100%);
  mask-image:linear-gradient(180deg,transparent 0%,#000 40%,#000 70%,transparent 100%)}

.leiterbahn .paket{stroke-dasharray:.06 1}
/* Orts-Chips als Links (Locations-Seite, 03.09.) */
a.chip{text-decoration:none;transition:border-color .2s ease,color .2s ease,transform .2s ease}
a.chip:hover{border-color:var(--blau);color:var(--blau);transform:translateY(-2px);text-decoration:none}
a.chip.zentrum:hover{color:#fff}
/* Cyber-Seiten: Leiterbahnen in hellen Sektionen ragen ueber den Rand — Sektion
   beschneidet, sonst Querscroll (Befund 03.09.). */
body.thema-cyber .sektion{overflow:hidden}

/* == 31 V3 (03.09. Nacht): Cyber Breach in Chakra Petch =====================
   Betreiber: „Chakra Petch ist die richtige Schrift." Die Schrift der
   Cyber-Breach-Oberflaeche ist Chakra Petch (OFL, selbst gehostet). Sie
   uebernimmt auf den Cyber-Seiten alle Ueberschriften, Kicker, Labels,
   Knoepfe und Chips — das ueberschreibt Block 30a. Fuer den Fliesstext wurde
   eine freie, gut passende Schrift gesucht: IBM Plex Sans (OFL) — technisch,
   ruhig, mit derselben leicht eckigen Anmutung wie Chakra Petch, sehr gut
   lesbar in langen Absaetzen. JetBrains Mono bleibt nur dort, wo die
   Oberflaeche selbst Monospace ist: Terminal, Countdown, Codes, Zahlenreihen. */
@font-face{font-family:'Chakra Petch';src:url('schriften/chakra-petch-400.woff2') format('woff2');font-weight:400;font-style:normal;font-display:swap}
@font-face{font-family:'Chakra Petch';src:url('schriften/chakra-petch-500.woff2') format('woff2');font-weight:500;font-style:normal;font-display:swap}
@font-face{font-family:'Chakra Petch';src:url('schriften/chakra-petch-600.woff2') format('woff2');font-weight:600;font-style:normal;font-display:swap}
@font-face{font-family:'Chakra Petch';src:url('schriften/chakra-petch-700.woff2') format('woff2');font-weight:700;font-style:normal;font-display:swap}
@font-face{font-family:'IBM Plex Sans';src:url('schriften/ibm-plex-sans-400.woff2') format('woff2');font-weight:400;font-style:normal;font-display:swap}
@font-face{font-family:'IBM Plex Sans';src:url('schriften/ibm-plex-sans-500.woff2') format('woff2');font-weight:500;font-style:normal;font-display:swap}
@font-face{font-family:'IBM Plex Sans';src:url('schriften/ibm-plex-sans-600.woff2') format('woff2');font-weight:600;font-style:normal;font-display:swap}

body.thema-cyber{font-family:'IBM Plex Sans','Roboto',sans-serif}
body.thema-cyber p,body.thema-cyber li,body.thema-cyber .vorspann,body.thema-cyber td,body.thema-cyber th,
body.thema-cyber .lese p,body.thema-cyber input,body.thema-cyber select,body.thema-cyber textarea,
body.thema-cyber .anfrage-hinweis,body.thema-cyber .spiel-panel p{font-family:'IBM Plex Sans','Roboto',sans-serif}

body.thema-cyber h1,body.thema-cyber h2{font-family:'Chakra Petch','Roboto Condensed',sans-serif;
  font-weight:700;text-transform:uppercase;letter-spacing:.02em;line-height:1.06}
body.thema-cyber h1{font-size:clamp(30px,5.8vw,60px)}
body.thema-cyber h2{font-size:clamp(24px,4vw,42px)}
body.thema-cyber h3,body.thema-cyber .karte h3,body.thema-cyber .station h3,body.thema-cyber .cta-neon h3,
body.thema-cyber .spiel-panel h3,body.thema-cyber .icon-liste strong,body.thema-cyber .anfrage-form-titel,
body.thema-cyber .cta-zeile strong{font-family:'Chakra Petch','Roboto Condensed',sans-serif;font-weight:600;
  text-transform:uppercase;letter-spacing:.03em}
body.thema-cyber h3{font-size:clamp(19px,2.2vw,24px)}
body.thema-cyber .station h3{font-size:18px}
body.thema-cyber h4,body.thema-cyber .kicker,body.thema-cyber .augenbraue,body.thema-cyber .zahlen span,
body.thema-cyber .station .thema,body.thema-cyber .tag,body.thema-cyber .kachel-zahl .label,
body.thema-cyber .statistik-kachel .label,body.thema-cyber figcaption,body.thema-cyber .merkmale li,
body.thema-cyber .knopf,body.thema-cyber .mehr,body.thema-cyber .karte-mehr,body.thema-cyber .mega-punkt,
body.thema-cyber .chip,body.thema-cyber .anfrage-form label,body.thema-cyber .passt-dazu a{
  font-family:'Chakra Petch','Roboto Condensed',sans-serif;font-weight:600;letter-spacing:.06em;text-transform:uppercase}
body.thema-cyber .kicker::before{height:2px}
/* Monospace nur, wo die Oberflaeche selbst Monospace ist */
body.thema-cyber .station-nr,body.thema-cyber .zahlen b,body.thema-cyber .kachel-zahl .wert,
body.thema-cyber .statistik-kachel .wert,body.thema-cyber .spiel-panel .fakten strong,
body.thema-cyber .countdown,body.thema-cyber .terminal,body.thema-cyber .mono{
  font-family:'JetBrains Mono','Consolas',monospace}
/* Umlautpolster fuer Chakra Petch in Grossbuchstaben (Ue Oe Ae ragen leicht heraus) */
body.thema-cyber h1 .verlauf,body.thema-cyber h2 .verlauf{padding-block:.2em}

/* Cyber-Breach-Panel und -Karten auf allen anderen Seiten ebenfalls in Chakra Petch */
.spiel-panel.cyber h3,.spiel-panel.cyber .tag{font-family:'Chakra Petch','Roboto Condensed',sans-serif;
  font-weight:700;text-transform:uppercase;letter-spacing:.03em}
.spiel-panel.cyber .fakten strong{font-family:'JetBrains Mono','Consolas',monospace;font-weight:600}
.spiel-panel.cyber p{font-family:'IBM Plex Sans','Roboto',sans-serif}
/* Kopfleiste bleibt auf allen Seiten gleich (Roboto Condensed), auch auf Cyber-Seiten. */
body.thema-cyber .mega-punkt,body.thema-cyber .kopfleiste .knopf,body.thema-cyber .sticky-cta .knopf,
body.thema-cyber .mega-kinder a,body.thema-cyber .mega-alle{font-family:'Roboto Condensed',sans-serif;letter-spacing:.04em}

/* == 32 (03.09. Nacht): Cyber-Design nur auf der Spielseite, Rahmen bleibt ===
   Betreiber: „nur die Spielseite von Cyber Breach ändern, Menü und so soll
   gleiche Schrift bleiben und auch gleiches Design." Deshalb traegt nur
   /cyber-breach/ noch thema-cyber (Seitenplan). Und auf dieser Seite behalten
   Kopfleiste, Mega-Menue, Sticky-Leiste, Anfrage-Block, „Passt dazu" und
   Fusszeile die Schriften und Farben aller anderen Seiten. */
body.thema-cyber .kopfleiste,body.thema-cyber .kopfleiste *,body.thema-cyber .sticky-cta,
body.thema-cyber .sticky-cta *,body.thema-cyber .fussleiste,body.thema-cyber .fussleiste *,
body.thema-cyber .band p,body.thema-cyber .band li,body.thema-cyber .band label,
body.thema-cyber .band input,body.thema-cyber .band select,body.thema-cyber .band textarea,
body.thema-cyber .passt-dazu span{font-family:'Roboto',-apple-system,'Segoe UI',sans-serif}
body.thema-cyber .mega-punkt,body.thema-cyber .kopfleiste .knopf,body.thema-cyber .sticky-cta .knopf,
body.thema-cyber .band .knopf,body.thema-cyber .band label,body.thema-cyber .band .kicker,
body.thema-cyber .band h3,body.thema-cyber .fussleiste h4,body.thema-cyber .passt-dazu a,
body.thema-cyber .mega-alle,body.thema-cyber .mega-nr{
  font-family:'Roboto Condensed',sans-serif;font-weight:700;text-transform:uppercase;letter-spacing:.04em}
body.thema-cyber .band h2,body.thema-cyber .passt-dazu-titel,body.thema-cyber main > .sektion-eng h2{
  font-family:'Rigelstar','Roboto Condensed',sans-serif;font-weight:400;letter-spacing:.01em;
  text-transform:uppercase;line-height:1.12}
body.thema-cyber .band .kicker{letter-spacing:.16em;font-size:13px}
body.thema-cyber .band .kicker::before{height:2px}
body.thema-cyber .fussleiste h4{font-size:14px;letter-spacing:.09em}
/* Farben des Rahmens wie ueberall: Fusszeile und Band im Standard-Dunkel */
body.thema-cyber .fussleiste,body.thema-cyber .band{--dunkel:#12131A;--dunkel-alt:#1B1D28;--dunkel-linie:#2C2F3D;
  background:#12131A}
body.thema-cyber .band .verlauf{background-image:linear-gradient(90deg,#6FB4F7 0%,#B98BDC 100%)}
body.thema-cyber .kopfleiste .knopf{background:linear-gradient(135deg,#2C7DCE 0%,#7B4397 100%)}
body.thema-cyber .sticky-cta .knopf,body.thema-cyber .band .knopf{background:linear-gradient(135deg,#2C7DCE 0%,#7B4397 100%)}

/* == 33 (03.09. Nacht): Blitze ueber den ganzen Bildschirm, durch den Titel ==
   Ersetzt die Masse aus 30b: das SVG deckt jetzt die ganze Flaeche, Kern,
   Schein und Glut sind kraeftiger, und der getroffene Titel leuchtet auf. */
.blitz.voll{inset:0;left:0;right:0;top:0;width:100%;height:100%;transform:none;z-index:3}
.blitz.voll .kern{stroke:#fff;stroke-width:3.2}
.blitz.voll .schein{stroke:#A8D4FF;stroke-width:14;opacity:.75;filter:blur(5px)}
.blitz.voll .glut{stroke:#2C7DCE;stroke-width:44;opacity:.35;filter:blur(24px)}
.blitz.voll .ast.kern{stroke-width:2}
.blitz.voll .ast.schein{stroke-width:8}
.blitz.voll .ast.glut{stroke-width:24}
.blitz.voll.zuckt{animation:blitz-sicht-voll 1.3s ease-out forwards}
.blitz.voll.zuckt path{animation:blitz-lauf .26s cubic-bezier(.1,.9,.2,1) forwards}
.blitz.voll.zuckt .ast{animation-delay:.12s}
.blitz.voll.zuckt .schein,.blitz.voll.zuckt .glut{animation:blitz-lauf .26s cubic-bezier(.1,.9,.2,1) forwards,blitz-flackern 1.1s ease-out .26s forwards}
@keyframes blitz-sicht-voll{0%{opacity:0}5%{opacity:1}22%{opacity:.7}30%{opacity:1}45%{opacity:.35}55%{opacity:.8}100%{opacity:0}}
.hero > .blitz.voll{z-index:3}
.hero > .blitzlicht{z-index:2;background:radial-gradient(70% 60% at 50% 45%,rgba(200,225,255,.45),rgba(44,125,206,.18) 50%,transparent 75%)}
.sektion-dunkel > .blitzlicht,.bild-band > .blitzlicht,.band > .blitzlicht{position:absolute;inset:0;z-index:0;pointer-events:none;opacity:0;
  background:radial-gradient(70% 60% at 50% 45%,rgba(200,225,255,.35),rgba(44,125,206,.15) 50%,transparent 75%)}
.sektion-dunkel > .blitzlicht.zuckt,.bild-band > .blitzlicht.zuckt,.band > .blitzlicht.zuckt{animation:blitzlicht .8s ease-out forwards}
/* Der getroffene Titel leuchtet auf */
.geblitzt{animation:titel-blitz 1.2s ease-out}
@keyframes titel-blitz{
  0%{text-shadow:0 0 0 rgba(255,255,255,0)}
  8%{text-shadow:0 0 18px #fff,0 0 50px #A8D4FF,0 0 110px #2C7DCE;color:#fff}
  25%{text-shadow:0 0 10px #fff,0 0 30px #8CC0F2,0 0 70px #2C7DCE}
  35%{text-shadow:0 0 22px #fff,0 0 60px #A8D4FF,0 0 120px #2C7DCE}
  100%{text-shadow:0 0 40px rgba(44,125,206,.45),0 0 90px rgba(44,125,206,.25)}}
.geblitzt .verlauf{animation:titel-blitz-verlauf 1.2s ease-out}
@keyframes titel-blitz-verlauf{
  8%{background-image:linear-gradient(90deg,#fff,#DDEBFF)}
  35%{background-image:linear-gradient(90deg,#EAF3FF,#fff)}
  100%{background-image:linear-gradient(90deg,#8CC0F2 0%,#A9A2F0 100%)}}
.sektion-dunkel .geblitzt,.band .geblitzt,.bild-band .geblitzt{color:#fff}
@media (max-width:640px){.blitz.voll{display:block}.blitz.voll .glut{stroke-width:28}}

/* == 34 (03.09. Nacht): Die beiden Spiele im Mega-Menue als Kacheln ==========
   Betreiber: „hebe im Menue die beiden Spiele hervor, die gehen beim
   Aufklappen etwas unter." bauen.py setzt Kinder mit hervor:true als
   .mega-spiele vor die Liste. Blau fuer Mission 2145, Violett fuer Cyber
   Breach — die beiden Farbwelten der Spiele. */
.mega-mitte{min-width:0}
.mega-spiele{list-style:none;padding:0;margin:0 0 18px;display:grid;grid-template-columns:1fr 1fr;gap:14px}
.mega-spiele a{position:relative;display:grid;grid-template-columns:96px 1fr;gap:14px;align-items:center;
  padding:10px 14px 10px 10px;border-radius:var(--radius);text-decoration:none;color:#fff;
  background:linear-gradient(160deg,#1B1D28 0%,#173257 100%);border:1px solid rgba(140,192,242,.25);
  overflow:hidden;transition:transform .25s ease,box-shadow .25s ease,border-color .25s ease}
.mega-spiele .welt-cyber a{background:linear-gradient(160deg,#1B1D28 0%,#3c2148 100%);border-color:rgba(185,139,220,.3)}
.mega-spiele a::after{content:"";position:absolute;inset:-1px;border-radius:inherit;padding:1.5px;
  background:linear-gradient(135deg,#2C7DCE,#8CC0F2);opacity:0;transition:opacity .25s ease;pointer-events:none;
  -webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);-webkit-mask-composite:xor;mask-composite:exclude}
.mega-spiele .welt-cyber a::after{background:linear-gradient(135deg,#7B4397,#B98BDC)}
.mega-spiele a:hover{transform:translateY(-3px);text-decoration:none;box-shadow:0 14px 34px rgba(44,125,206,.3)}
.mega-spiele .welt-cyber a:hover{box-shadow:0 14px 34px rgba(123,67,151,.35)}
.mega-spiele a:hover::after{opacity:1}
.mega-spiele img{width:96px;height:64px;object-fit:cover;border-radius:8px;display:block}
.mega-spiele .ms-text{display:flex;flex-direction:column;gap:3px;min-width:0}
.mega-spiele .ms-titel{font-family:'Rigelstar','Roboto Condensed',sans-serif;text-transform:uppercase;
  font-size:17px;letter-spacing:.02em;line-height:1.1}
.mega-spiele .welt-cyber .ms-titel{font-family:'Chakra Petch','Roboto Condensed',sans-serif;font-weight:700}
.mega-spiele .ms-unter{font-family:'Roboto Condensed',sans-serif;font-weight:700;text-transform:uppercase;
  letter-spacing:.08em;font-size:11px;color:var(--blau-hell)}
.mega-spiele .welt-cyber .ms-unter{color:#B98BDC}
.mega-spiele a[aria-current="page"]{border-color:#fff}
@media (max-width:1080px){
  .mega-spiele{grid-template-columns:1fr;gap:8px;margin:6px 0 10px}
  .mega-spiele a{grid-template-columns:72px 1fr;padding:8px}
  .mega-spiele img{width:72px;height:48px}
}

/* == 35 (03.09. Nacht): Blitze, dritte Fassung — Lagen, Farbsaum, Nachflackern, Zittern == */
.blitz.voll .saum-c{stroke:#22D3EE;stroke-width:4;opacity:.7;transform:translate(2px,-1px);mix-blend-mode:screen}
.blitz.voll .saum-m{stroke:#FF4FD8;stroke-width:4;opacity:.55;transform:translate(-2px,1px);mix-blend-mode:screen}
.blitz.voll .ast.saum-c,.blitz.voll .ast.saum-m{stroke-width:2.4}
.blitz.voll .kern{stroke-width:3.6}
.blitz.voll .glut{stroke-width:56;opacity:.4}
.blitz.voll .schein{stroke:#BFE3FF;stroke-width:16;opacity:.8}
.blitz.voll.gegen .kern{stroke-width:2.6}.blitz.voll.gegen .glut{stroke-width:40}
.blitz.voll.nach .kern{stroke-width:2}.blitz.voll.nach .glut{stroke-width:28}.blitz.voll.nach .schein{stroke-width:10}
/* Aeste laufen kurz nach dem Hauptstrahl, Unteraeste danach — sichtbar als Wachsen */
.blitz.voll.zuckt .ast{animation-delay:.09s}
/* Nachflackern: Kern und Schein zucken nach dem Einschlag noch zwei-, dreimal */
.blitz.voll.zuckt .kern{animation:blitz-lauf .24s cubic-bezier(.1,.9,.2,1) forwards,blitz-nachzucken 1.2s steps(1,end) .24s forwards}
.blitz.voll.zuckt .saum-c,.blitz.voll.zuckt .saum-m{animation:blitz-lauf .24s cubic-bezier(.1,.9,.2,1) forwards,blitz-saum .6s ease-out .2s forwards}
@keyframes blitz-nachzucken{0%{opacity:1}30%{opacity:.35}38%{opacity:1}50%{opacity:.2}56%{opacity:.9}70%{opacity:.15}78%{opacity:.6}100%{opacity:0}}
@keyframes blitz-saum{0%{opacity:.8}100%{opacity:0}}
.blitz.voll.zuckt{animation:blitz-sicht-voll 1.5s ease-out forwards}
/* Der Hero zittert einen Moment — der Zeitriss geht durch den Raum */
.zittert{animation:zittern .42s steps(2,end)}
@keyframes zittern{0%{transform:translate(0,0)}20%{transform:translate(-3px,2px)}40%{transform:translate(3px,-2px)}60%{transform:translate(-2px,-1px)}80%{transform:translate(2px,1px)}100%{transform:translate(0,0)}}
.hero > .blitzlicht{background:radial-gradient(70% 60% at 50% 45%,rgba(220,238,255,.6),rgba(44,125,206,.22) 50%,transparent 75%)}
@keyframes blitzlicht{0%{opacity:0}6%{opacity:1}18%{opacity:.3}28%{opacity:.85}40%{opacity:.2}52%{opacity:.5}100%{opacity:0}}
.hero .blitzlicht.zuckt{animation:blitzlicht 1s ease-out forwards}
@media (prefers-reduced-motion:reduce){.zittert{animation:none}}

/* == 36 (04.09.): Bild im Spiel-Panel (Kommentare Nr. 3 und 4 der Redaktion) ==
   <div class="spiel-panel zeit"><img class="panel-bild" …> … </div>
   Das Foto liegt hinten, oben rechts, und blendet nach links unten in die
   Panelfarbe aus, damit der Text lesbar bleibt. */
.spiel-panel .panel-bild{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;
  object-position:70% 40%;opacity:.55;z-index:0;
  -webkit-mask-image:linear-gradient(200deg,#000 20%,rgba(0,0,0,.35) 55%,transparent 85%);
  mask-image:linear-gradient(200deg,#000 20%,rgba(0,0,0,.35) 55%,transparent 85%);
  transition:transform .7s ease,opacity .5s ease}
.spiel-panel:hover .panel-bild{transform:scale(1.05);opacity:.7}
.spiel-panel > *:not(.panel-bild){z-index:1}

/* == 37 (05.09.): Redaktionskommentare Nr. 10 und 11 ============================
   Nr. 10: „Wenn man hinten ueber den Hero-Bildbereich geht, den Bereich um die
   Maus heller machen, damit man das Bild hinter dem Farbverlauf besser sieht."
   ux.js (Abschnitt 12) schreibt die Mausposition als --mx/--my an den Hero;
   der Schleier bekommt dort ein Loch mit weichem Rand. Nur mit Maus. */
@media (hover:hover){
  .hero.mit-licht .hero-scrim{
    -webkit-mask-image:radial-gradient(circle 260px at var(--mx,-999px) var(--my,-999px),
      rgba(0,0,0,.08) 0%,rgba(0,0,0,.45) 45%,#000 100%);
    mask-image:radial-gradient(circle 260px at var(--mx,-999px) var(--my,-999px),
      rgba(0,0,0,.08) 0%,rgba(0,0,0,.45) 45%,#000 100%)}
  /* Dazu ein leichter Lichtschein, damit das Bild an der Stelle wirklich heller wird */
  .hero .hero-licht{position:absolute;inset:0;z-index:1;pointer-events:none;opacity:0;
    transition:opacity .35s ease;mix-blend-mode:screen;
    background:radial-gradient(circle 240px at var(--mx,-999px) var(--my,-999px),
      rgba(255,255,255,.22) 0%,rgba(140,192,242,.12) 40%,transparent 70%)}
  .hero.mit-licht:hover .hero-licht{opacity:1}
}

/* Nr. 11: „Den Strich unter den Ueberschriften bitte immer wieder mal den Glow
   drueberlaufen lassen, aber random, und bei Hover nichts machen." Der Hover-
   Ausloeser aus Block 27b faellt weg; ux.js setzt zufaellig die Klasse .schein
   auf eine sichtbare Ueberschrift. */
@media (hover:hover) and (prefers-reduced-motion:no-preference){
  .sektion > .bahn > .kopf > h2:hover::after,.sektion > .bahn > .section-kopf > h2:hover::after,
  .sektion > .bahn-schmal > .kopf > h2:hover::after{animation:none}
}
@media (prefers-reduced-motion:no-preference){
  .sektion > .bahn > .kopf > h2.schein::after,.sektion > .bahn > .section-kopf > h2.schein::after,
  .sektion > .bahn-schmal > .kopf > h2.schein::after{animation:trenner-schein .9s ease-out}
}


/* == 38 Bildausschnitt aus der Redaktion (05.09.2026) =======================
   Der Betreiber stellt den Bildausschnitt in der Redaktion am echten Bild ein
   (ziehen, Mausrad, Pfeiltasten). Gespeichert wird er als Stil AM BILD, nicht
   als neue Bilddatei:

       <img … style="object-position:38% 22%">                       ohne Zoom
       <img … data-ausschnitt="zoom"
              style="object-position:38% 22%;--ux-zoom:1.35">        mit Zoom

   object-position wirkt von sich aus, ueberall dort, wo ein Bild mit
   object-fit:cover (oder contain) in seinem Platz sitzt — dafuer braucht es
   hier nichts. Dieser Block ist NUR fuer den Zoom da.

   WARUM EINE VERGROESSERUNG UND NICHT GROESSERE MASSE
   Ein Bild ueber width/height zu vergroessern veraendert das Layout: die
   Kachel daneben rutscht, die Sektion wird hoeher. Eine Vergroesserung
   veraendert nur die Darstellung; der Platz auf der Seite bleibt Zeichen fuer
   Zeichen derselbe. Deshalb muss der Elternkasten abklemmen, sonst ragte das
   Bild darueber hinaus — das erledigt die zweite Regel mit :has().

   WARUM scale UND NICHT transform:scale — DAS IST DIE WICHTIGE ZEILE HIER
   Die Website hat an mehreren Stellen ein Hover-Zoom, und zwar als
   transform:scale(1.06) an Regeln wie „.spiel-panel:hover .panel-bild“ oder
   „.mosaik figure:hover img“. Diese Regeln sind SPEZIFISCHER als alles, was
   hier mit einem Merkmalswaehler erreichbar ist — ein transform von hier
   verloere gegen sie, und der eingestellte Zoom waere im Hover weg (gemessen
   am 05.09.2026: eingestellt 2,0, gezeigt 1,088, also nur noch das Hover).
   Die eigenstaendige Eigenschaft scale streitet mit transform gar nicht: der
   Browser rechnet erst scale, dann transform. Der Grundzoom aus der Redaktion
   und das Hover der Gestaltung multiplizieren sich also, statt einander
   auszustechen — und beides bleibt erhalten. Kein !important noetig.

   WARUM transform-origin IN DER MITTE BLEIBT
   Weil damit gerechnet wird. Bei scale(z) um die Mitte ist der sichtbare
   Ausschnitt genau ein mittiges Fenster von 1/z Groesse, und object-position
   schiebt das Bild dahinter — zwei Groessen, die sich nicht ins Gehege
   kommen. Waere der Ursprung der Fokuspunkt, haenge das Verschieben von der
   Vergroesserung ab und das Ziehen fuehlte sich bei starkem Zoom falsch an.
   Die Rechnung in _werkzeug/redaktion.js (Abschnitt 8) setzt diese Mitte
   voraus; wer sie hier aendert, muss sie dort mitaendern.

   NUR MIT data-ausschnitt="zoom"
   Der Haken sitzt am Merkmal und nicht an --ux-zoom allein, damit :has()
   einen billigen, eindeutigen Anker hat und kein Kasten ohne Not
   overflow:hidden bekommt. Ohne Zoom schreibt die Redaktion das Merkmal gar
   nicht erst — dann bleibt hier alles unberuehrt.                          */

img[data-ausschnitt="zoom"]{
  scale:var(--ux-zoom,1);
  transform-origin:50% 50%;
}

/* Der unmittelbare Elternkasten klemmt das vergroesserte Bild ab. Nur der
   direkte Elternteil (>), damit nicht eine ganze Sektion overflow:hidden
   bekommt und dabei ihre Leuchtkanten und Leiterbahnen verliert. */
:has(> img[data-ausschnitt="zoom"]){ overflow:hidden }

/* == 39 (05.09.): Redaktionskommentare 12, 13, 14 ===============================
   Nr. 12: Kreis um die Maus groesser und weicher ausblenden. */
@media (hover:hover){
  .hero.mit-licht .hero-scrim{
    -webkit-mask-image:radial-gradient(circle 420px at var(--mx,-999px) var(--my,-999px),
      rgba(0,0,0,.05) 0%,rgba(0,0,0,.2) 30%,rgba(0,0,0,.6) 65%,#000 100%);
    mask-image:radial-gradient(circle 420px at var(--mx,-999px) var(--my,-999px),
      rgba(0,0,0,.05) 0%,rgba(0,0,0,.2) 30%,rgba(0,0,0,.6) 65%,#000 100%)}
  .hero .hero-licht{background:radial-gradient(circle 400px at var(--mx,-999px) var(--my,-999px),
      rgba(255,255,255,.2) 0%,rgba(140,192,242,.1) 35%,rgba(140,192,242,.03) 65%,transparent 85%)}
}
/* Nr. 13: die CTA-Zeile (Raumcheck usw.) schmaler und mittig, auf allen Seiten. */
.sektion-cta .cta-zeile{max-width:960px;margin-inline:auto}
/* Nr. 14: keine Texte auf den Bildern — Bildunterschriften der Streifen und
   Mosaike werden nicht mehr angezeigt (alt-Texte bleiben fuer Vorleseprogramme). */
.bildstreifen figcaption,.mosaik figcaption{display:none}
/* Nr. 15: Textwechsel beim Zeigen, z. B. „ohne Zeitreise" -> „mit Zeitreise".
   ux.js tauscht den Text (data-wechsel); hier nur der weiche Uebergang. */
[data-wechsel]{transition:opacity .18s ease;cursor:default}
[data-wechsel].wechselt{opacity:.75}
/* Nr. 31: Ablaufschritte in einer halben Spalte (Zweispalter) nicht fuenfspaltig
   quetschen — dort zwei Spalten, auf schmalen Schirmen eine. */
.zweispalt .schritte,.zweispalt-schmal .schritte,.szenario-grid .schritte{grid-template-columns:repeat(2,minmax(0,1fr))}
@media (max-width:640px){.zweispalt .schritte,.zweispalt-schmal .schritte,.szenario-grid .schritte{grid-template-columns:1fr}}
/* Nr. 24: Icons in .ico-Flaechen ausserhalb von Karten/Kacheln (Iconzeilen,
   Stationen, Beispiele) standen oben links statt mittig — .ico allein hatte
   kein Flex. Gilt jetzt fuer jede .ico-Flaeche auf der ganzen Seite. */
.ico{display:flex;align-items:center;justify-content:center;flex:0 0 auto}

/* == 40 (05.09., Kommentare 34, 35, 36, 37) =========================================
   Nr. 35: Steht in einer Reihe nur eine Karte (oder zwei), soll sie mittig
   stehen. Ein Grid fuellt von links; deshalb werden Stationen, Karten,
   Beispiele, Statistik-Kacheln und Iconzeilen zu umbrechenden Flex-Reihen
   mit Zentrierung. Die Breiten entsprechen den bisherigen Spalten. */
.stationen,.karten,.beispiele,.statistik{display:flex;flex-wrap:wrap;justify-content:center}
.stationen > *{flex:0 1 calc((100% - 36px) / 3);min-width:min(100%,260px)}
.karten-3 > *{flex:0 1 calc((100% - 44px) / 3);min-width:min(100%,260px)}
.karten-2 > *{flex:0 1 calc((100% - 22px) / 2);min-width:min(100%,280px)}
.karten-4 > *{flex:0 1 calc((100% - 66px) / 4);min-width:min(100%,220px)}
.beispiele > *{flex:0 1 calc((100% - 14px) / 2);min-width:min(100%,300px)}
.statistik > *{flex:0 1 calc((100% - 54px) / 4);min-width:min(100%,220px)}
.karte,.station,.beispiel,.statistik-kachel{box-sizing:border-box}
/* Nr. 34: Iconzeilen mit ungerader Zahl (5 Eintraege in 3 Spalten) sahen
   zerrissen aus — auch hier Flex mit Zentrierung, drei je Reihe. */
.icon-liste{display:flex;flex-wrap:wrap;justify-content:center;gap:18px 28px}
.icon-liste > li{flex:0 1 calc((100% - 56px) / 3);min-width:min(100%,260px)}
.icon-liste.zweispaltig > li{flex:0 1 calc((100% - 28px) / 2)}
@media (max-width:980px){
  .stationen > *,.karten-3 > *,.karten-4 > *,.statistik > *,.icon-liste > li{flex-basis:calc((100% - 22px) / 2)}
}
@media (max-width:640px){
  .stationen > *,.karten > *,.beispiele > *,.statistik > *,.icon-liste > li,.icon-liste.zweispaltig > li{flex-basis:100%}
}
/* Nr. 36: der Countdown laeuft (ux.js Abschnitt 14): Minuten gross, Sekunden klein daneben. */
.countdown .sek{font-size:.42em;letter-spacing:.02em;vertical-align:baseline;margin-left:.08em;opacity:.85}

/* == 41 (05.09.): Links in Stationen, Beispielen und Quellen sichtbar klickbar =====
   Betreiber: „Schau, dass alle Artikel, die du verlinkst, auch klickbar sind."
   Ein Link in einer Karte sieht jetzt aus wie ein Link: unterstrichen, in der
   Akzentfarbe, mit Pfeil-Icon-Zeichen hinter externen Zielen. */
.station a,.beispiel a,.quelle a,.station .fall a{color:var(--blau-hell);text-decoration:underline;
  text-decoration-thickness:1px;text-underline-offset:3px;transition:color .2s ease}
.station a:hover,.beispiel a:hover,.quelle a:hover{color:#fff}
body.thema-cyber .station a,body.thema-cyber .beispiel a,body.thema-cyber .quelle a{color:#B98BDC}
body.thema-cyber .station a:hover,body.thema-cyber .beispiel a:hover,body.thema-cyber .quelle a:hover{color:#fff}
.sektion:not(.sektion-dunkel) .station a,.sektion:not(.sektion-dunkel) .beispiel a,
.sektion:not(.sektion-dunkel) .quelle a{color:var(--blau)}
.sektion:not(.sektion-dunkel) .station a:hover,.sektion:not(.sektion-dunkel) .beispiel a:hover,
.sektion:not(.sektion-dunkel) .quelle a:hover{color:var(--violett)}
a[target="_blank"].extern::after,.quelle a::after{content:" \2197";font-size:.85em}
/* Der Fall in der Station: eigener Absatz mit Firmenname und Jahr */
.station .fall{font-size:14px;line-height:1.55;color:var(--text-weich);padding-top:10px;
  border-top:1px dashed var(--linie);margin-top:2px}
.station .fall strong{color:var(--text);font-weight:600}
.sektion-dunkel .station .fall{color:var(--text-hell-weich);border-top-color:var(--dunkel-linie)}
.sektion-dunkel .station .fall strong{color:#fff}


/* == 41 Kopf schrumpft beim Scrollen (Betreiber 06.09.2026) ===============
   „bitte mach das menü schmaler wenn man runter scrollt". ux.js (Abschnitt 8)
   setzt ab 40 px Scrolltiefe body.kopf-geschrumpft — bisher wertete das nur
   die Menue-Variante 4 aus. Jetzt gilt es in der Standardvariante: Die Leiste
   haengt komplett an --kopfhoehe (Hoehe, Polster der Menuepunkte, Lage des
   Mega-Felds, Handy-Menue, scroll-margin), deshalb reicht es, die Variable
   umzuschalten. 96 → 64 px, Logo 44 → 32 px, Knopf eine Stufe kleiner.
   Die Leiste bleibt sticky; der Inhalt rueckt beim Umschalten um 32 px nach,
   waehrend ohnehin gescrollt wird — das faellt nicht auf und erspart die
   Fixed-Konstruktion der Variante 4. */
body.kopf-geschrumpft:not(.menue-4){--kopfhoehe:64px}
body.kopf-geschrumpft:not(.menue-4) .kopfleiste{box-shadow:0 8px 28px rgba(21,23,31,.09)}
body.kopf-geschrumpft:not(.menue-4) .logo img{height:32px}
body.kopf-geschrumpft:not(.menue-4) .mega-punkt{font-size:13.5px}
body.kopf-geschrumpft:not(.menue-4) .kopf-rechts .knopf{padding:9px 17px;font-size:13px}
@media (prefers-reduced-motion:no-preference){
  .kopfleiste{transition:height .28s cubic-bezier(.2,.8,.3,1),box-shadow .28s ease}
  .logo img{transition:height .28s cubic-bezier(.2,.8,.3,1)}
  .mega-punkt{transition:color .22s ease,padding .28s cubic-bezier(.2,.8,.3,1)}
}
@media (max-width:1080px){
  body.kopf-geschrumpft:not(.menue-4){--kopfhoehe:60px}
  body.kopf-geschrumpft:not(.menue-4) .logo img{height:30px}
}

/* == 42 Untere Leiste ohne Balken (Betreiber 06.09.2026) ===================
   „unten das anfragen und die cookieeinstellungen ohne den balken dahinter
   machen und bei den cookies nur ein icon". Der Balken (Abschnitt 22) faellt
   weg: kein Hintergrund, keine Linie, kein Blur. Die beiden Elemente schweben
   frei ueber dem Inhalt; die Leiste selbst laesst Klicks durch
   (pointer-events:none), nur Knopf und Icon fangen sie.
   Der Cookie-Zugang ist ein runder Knopf mit Keks-Icon (#i-cookie in
   icons.svg). Text steht im aria-label und im title — die Pflicht aus
   Art. 7 Abs. 3 DSGVO (Widerruf so leicht wie Einwilligung) bleibt erfuellt,
   weil der Knopf dauerhaft sichtbar, beschriftet und 44 px gross ist. */
.sticky-cta{background:none;backdrop-filter:none;-webkit-backdrop-filter:none;
  border-top:0;pointer-events:none;
  padding:0 var(--rand) calc(14px + env(safe-area-inset-bottom,0px))}
.sticky-cta > *{pointer-events:auto}
.sticky-cookies{flex:0 0 auto;width:44px;height:44px;padding:0;border-radius:50%;
  display:inline-flex;align-items:center;justify-content:center;overflow:visible;
  background:rgba(18,19,26,.86);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);
  border:1px solid rgba(255,255,255,.16);color:var(--text-hell-weich);
  text-decoration:none;box-shadow:0 8px 24px rgba(21,23,31,.28);
  transition:color .2s ease,background .2s ease,transform .2s ease}
.sticky-cookies .icon{width:22px;height:22px}
.sticky-cookies:hover{color:#fff;background:rgba(18,19,26,.96);transform:translateY(-1px)}
.sticky-cookies:focus-visible{outline:2px solid var(--blau-hell);outline-offset:3px;border-radius:50%}
.sticky-cta .knopf{box-shadow:0 10px 28px rgba(21,23,31,.3)}
@media (max-width:379px){
  .sticky-cta{gap:10px;padding-inline:14px}
}

/* ---- Block 43 (07.09.2026): Einwilligung im Anfrage- und Bewerbungsformular ----
   Pflicht-Kaestchen vor dem Absenden. Text bewusst ohne KI-Nennung, die steht in
   der Datenschutzerklaerung (Betreiber, 07.09.2026). Mindestens 44 px Zielflaeche. */
.feld-einwilligung{margin:14px 0 2px}
.einwilligung{display:flex;gap:12px;align-items:flex-start;cursor:pointer;min-height:44px;
  font-size:13.5px;line-height:1.5;color:var(--text-hell-weich,#cfd6e6);text-transform:none;letter-spacing:0}
.einwilligung input{flex:0 0 auto;width:20px;height:20px;margin:2px 0 0;accent-color:#6f5cff;cursor:pointer}
.einwilligung a{color:#fff;text-decoration:underline}
.einwilligung input:focus-visible{outline:2px solid #fff;outline-offset:2px}
/* Block 43b: das Einwilligungs-Label darf nicht wie die Feldbeschriftungen
   (Grossbuchstaben, Sperrung) aussehen — es ist ein Satz. Spezifischer als
   .anfrage-form label (Zeile ~1783) und die Cyber-Variante. */
.anfrage-form label.einwilligung,body.thema-cyber .anfrage-form label.einwilligung{
  display:flex;margin:0;font-size:13.5px;font-weight:400;line-height:1.5;
  text-transform:none;letter-spacing:0;color:var(--text-hell-weich,#cfd6e6)}

/* ---- Block 44 (07.09.2026): Teilnehmer-Rechner (.konfi) --------------------
   Betreiber: „Konfigurator, wo man seine Teilnehmer eingeben kann." Markup aus
   bauen.py konfigurator(), Rechnung in ux.js Abschnitt 12. Dunkle Karte mit
   Leuchtkante, links die Eingabe, rechts die Ergebnis-Kacheln. */
.konfi-sektion{position:relative}
.konfi{display:grid;grid-template-columns:minmax(260px,1fr) minmax(0,1.6fr);gap:28px;
  padding:34px;border-radius:24px;position:relative;isolation:isolate;
  background:linear-gradient(160deg,#0f1424 0%,#141a30 55%,#1a1236 100%);color:#fff;
  box-shadow:0 30px 70px -40px rgba(20,30,80,.7),inset 0 0 0 1px rgba(255,255,255,.06)}
.konfi::before{content:"";position:absolute;inset:0;border-radius:inherit;padding:1px;z-index:-1;
  background:linear-gradient(120deg,rgba(44,125,206,.9),rgba(123,67,151,.9) 60%,rgba(44,125,206,.4));
  -webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);mask-composite:exclude;-webkit-mask-composite:xor}
.konfi::after{content:"";position:absolute;right:-80px;top:-80px;width:280px;height:280px;border-radius:50%;z-index:-1;
  background:radial-gradient(closest-side,rgba(123,67,151,.45),transparent 70%);pointer-events:none}
.konfi-label{display:block;font-family:'Roboto Condensed',sans-serif;font-weight:700;text-transform:uppercase;
  letter-spacing:.12em;font-size:12.5px;color:var(--blau-hell);margin-bottom:10px}
.konfi-zahl{display:flex;align-items:stretch;border-radius:16px;overflow:hidden;
  background:rgba(255,255,255,.06);box-shadow:inset 0 0 0 1px rgba(255,255,255,.12)}
.konfi-zahl button{flex:0 0 56px;border:0;background:rgba(255,255,255,.06);color:#fff;font-size:26px;cursor:pointer;
  transition:background .15s}
.konfi-zahl button:hover{background:rgba(255,255,255,.14)}
.konfi-zahl input{flex:1;min-width:0;border:0;background:transparent;color:#fff;text-align:center;
  font-family:'Rigelstar','Roboto Condensed',sans-serif;font-size:44px;line-height:1;padding:12px 0;
  -moz-appearance:textfield}
.konfi-zahl input::-webkit-inner-spin-button,.konfi-zahl input::-webkit-outer-spin-button{-webkit-appearance:none}
.konfi-zahl input:focus{outline:none;background:rgba(255,255,255,.04)}
.konfi-regler{width:100%;margin:18px 0 4px;accent-color:#8CC0F2;cursor:pointer}
.konfi-marken{display:flex;justify-content:space-between;font-size:11px;color:rgba(255,255,255,.45);
  font-family:'Roboto Condensed',sans-serif;letter-spacing:.06em}
.konfi-wahl{display:flex;gap:8px;margin-top:20px;padding:4px;border-radius:14px;background:rgba(255,255,255,.06)}
.konfi-wahl button{flex:1;border:0;border-radius:11px;padding:11px 10px;background:transparent;color:rgba(255,255,255,.7);
  font-family:'Roboto Condensed',sans-serif;font-weight:700;text-transform:uppercase;letter-spacing:.08em;font-size:13px;
  cursor:pointer;transition:background .15s,color .15s}
.konfi-wahl button.aktiv{background:linear-gradient(120deg,var(--blau),var(--violett));color:#fff;
  box-shadow:0 8px 20px -8px rgba(44,125,206,.8)}
.konfi-hinweis{margin:16px 0 0;font-size:13.5px;line-height:1.5;color:rgba(255,255,255,.7);min-height:1.5em}
.konfi-ergebnis{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px;align-content:start}
.konfi-kachel{position:relative;padding:18px 18px 16px;border-radius:16px;background:rgba(255,255,255,.05);
  box-shadow:inset 0 0 0 1px rgba(255,255,255,.09);display:flex;flex-direction:column;gap:6px;min-height:118px}
.konfi-kachel .icon{width:26px;height:26px;color:var(--blau-hell)}
.konfi-kachel .kz{font-family:'Rigelstar','Roboto Condensed',sans-serif;font-size:40px;line-height:1;
  background:linear-gradient(120deg,#8CC0F2,#c9a8ff);-webkit-background-clip:text;background-clip:text;color:transparent}
.konfi-kachel .kt{font-family:'Roboto Condensed',sans-serif;font-weight:700;text-transform:uppercase;
  letter-spacing:.1em;font-size:12px;color:rgba(255,255,255,.85)}
.konfi-kachel .ku{font-size:13px;line-height:1.45;color:rgba(255,255,255,.62)}
.konfi-kachel.breit{grid-column:1/-1;flex-direction:row;align-items:center;gap:14px;min-height:0;
  background:linear-gradient(120deg,rgba(44,125,206,.22),rgba(123,67,151,.22))}
.konfi-kachel.breit .ku{color:rgba(255,255,255,.85);font-size:14px}
.konfi-kachel.warn{box-shadow:inset 0 0 0 1px rgba(255,180,80,.5);background:rgba(255,180,80,.08)}
.konfi-kachel.warn .icon{color:#ffc46b}
.konfi-cta{grid-column:1/-1;display:flex;flex-wrap:wrap;gap:12px;align-items:center;margin-top:4px}
.konfi-cta .knopf{margin:0}
.konfi-cta .konfi-klein{font-size:12.5px;color:rgba(255,255,255,.55)}
.konfi.pulsiert .konfi-kachel .kz{animation:konfi-pop .35s ease}
@keyframes konfi-pop{0%{transform:scale(.92);opacity:.5}100%{transform:none;opacity:1}}
@media (max-width:860px){.konfi{grid-template-columns:1fr;padding:22px;gap:22px}
  .konfi-zahl input{font-size:36px}.konfi-ergebnis{grid-template-columns:1fr 1fr}}
@media (max-width:520px){.konfi-ergebnis{grid-template-columns:1fr}.konfi-kachel.breit{flex-direction:column;align-items:flex-start}}


/* == Block 45 (07.09.2026): Zeitachse Firmengeschichte ==============================
   Die Stationen auf /ueber-uns/ standen als nuechterne Liste mit runden Jahres-
   scheiben untereinander. Der Betreiber wollte eine gestaltete Zeitachse.
   Aufbau: ein <ol class="zeitachse"> mit einer durchgehenden Verlaufslinie
   (Blau -> Violett) in der Mitte, je Station ein Knoten mit Icon auf der Linie
   und eine Karte, die auf dem Desktop abwechselnd links und rechts sitzt.
   Ab 700 px steht alles rechts der Linie, die Linie rutscht an den Rand.
   Es wird nichts Vorhandenes ueberschrieben; .reveal-folge blendet die <li>
   nacheinander ein wie ueberall sonst (Abschnitt 27j). Kein JavaScript. */

.zeitachse{list-style:none;margin:clamp(30px,4vw,48px) 0 0;padding:0;position:relative}

/* Die Linie. top/bottom auf 30 px, damit sie am ersten und letzten Knoten
   auslaeuft statt hart abzubrechen; die Enden werden weich ausgeblendet. */
.zeitachse::before{content:"";position:absolute;left:50%;top:26px;bottom:26px;width:3px;
  transform:translateX(-50%);border-radius:3px;
  background:linear-gradient(180deg,rgba(44,125,206,0) 0%,var(--blau) 6%,
    var(--violett) 94%,rgba(123,67,151,0) 100%)}

.za-station{position:relative;display:grid;grid-template-columns:1fr 84px 1fr;
  align-items:start;margin-bottom:clamp(18px,2.4vw,28px)}
.za-station:last-child{margin-bottom:0}

/* Knoten: Ring im Markenverlauf, innen die Flaeche der Sektion, darin das Icon.
   Der breite helle Schatten deckt die Linie hinter dem Ring ab. */
.za-knoten{grid-column:2;grid-row:1;justify-self:center;width:56px;height:56px;
  border-radius:50%;padding:3px;background:var(--verlauf);
  box-shadow:0 0 0 7px var(--grund-alt),0 10px 24px -10px rgba(44,125,206,.75)}
.za-knoten > span{display:grid;place-items:center;width:100%;height:100%;
  border-radius:50%;background:var(--karte)}
.za-knoten .icon{width:24px;height:24px;stroke:url(#ux-verlauf);fill:none}

/* Karte. Ungerade Stationen links, gerade rechts. */
.za-karte{grid-row:1;grid-column:1;position:relative;
  background:var(--karte);border:1px solid var(--linie);border-radius:var(--radius);
  padding:clamp(18px,2.2vw,24px);box-shadow:var(--schatten);
  transition:transform .25s ease,border-color .25s ease,box-shadow .25s ease}
.za-station:nth-child(even) .za-karte{grid-column:3}
.za-karte:hover{transform:translateY(-4px);border-color:var(--blau);
  box-shadow:var(--schatten-hoch)}

/* Kurzer Strich von der Karte zum Knoten. */
.za-karte::after{content:"";position:absolute;top:32px;width:15px;height:2px;
  background:linear-gradient(90deg,var(--linie),var(--blau-hell));right:-15px}
.za-station:nth-child(even) .za-karte::after{right:auto;left:-15px;
  background:linear-gradient(90deg,var(--blau-hell),var(--linie))}

.za-jahr{margin:0 0 2px;font-family:'Rigelstar','Roboto Condensed',sans-serif;
  font-size:clamp(34px,4vw,46px);line-height:1;letter-spacing:.02em;
  background:var(--verlauf-text);-webkit-background-clip:text;background-clip:text;
  -webkit-text-fill-color:transparent;color:var(--blau);padding-block:.06em}
.za-karte h3{margin:6px 0 8px;font-size:19px;line-height:1.35}
.za-karte p{margin:0;font-size:15px;line-height:1.6;color:var(--text-weich)}

/* Schild an den hervorgehobenen Stationen (Gruendung 2022, Heute 2026). */
.za-schild{display:inline-block;margin:0 0 2px;padding:5px 11px;border-radius:999px;
  background:var(--verlauf);color:#fff;font-family:'Roboto Condensed',sans-serif;
  font-weight:700;text-transform:uppercase;letter-spacing:.11em;font-size:11.5px;
  line-height:1.2}

/* Hervorgehobene Stationen: groesserer Knoten, Leuchtkante an der Karte. */
.za-marke .za-knoten{width:70px;height:70px;padding:4px;
  box-shadow:0 0 0 7px var(--grund-alt),0 0 0 9px rgba(44,125,206,.18),
    0 14px 34px -10px rgba(123,67,151,.7)}
.za-marke .za-knoten .icon{width:30px;height:30px}
.za-marke .za-karte{border-color:rgba(44,125,206,.42);
  box-shadow:0 0 0 1px rgba(44,125,206,.18),0 18px 40px -18px rgba(44,125,206,.55)}
.za-marke .za-karte::after{top:39px}

/* Die Linie laeuft sonst am letzten Knoten vorbei bis zum Fuss der letzten
   Karte. Dieser Deckel in der Sektionsfarbe schneidet sie am Knoten ab. */
.zeitachse > li:last-child::after{content:"";position:absolute;left:50%;
  transform:translateX(-50%);width:11px;top:70px;bottom:-6px;background:var(--grund-alt)}

@media (max-width:700px){
  .zeitachse::before{left:23px;top:22px;bottom:22px}
  .zeitachse > li:last-child::after{left:23px;top:46px}
  .za-station{grid-template-columns:46px minmax(0,1fr);column-gap:16px;
    margin-bottom:18px}
  .za-knoten{grid-column:1;justify-self:start;width:46px;height:46px;
    box-shadow:0 0 0 6px var(--grund-alt),0 8px 20px -10px rgba(44,125,206,.75)}
  .za-knoten .icon{width:21px;height:21px}
  .za-marke .za-knoten{width:46px;height:46px;padding:3px;
    box-shadow:0 0 0 6px var(--grund-alt),0 0 0 8px rgba(44,125,206,.18),
      0 10px 26px -10px rgba(123,67,151,.7)}
  .za-marke .za-knoten .icon{width:21px;height:21px}
  .za-karte,.za-station:nth-child(even) .za-karte{grid-column:2;grid-row:1}
  .za-karte::after,.za-station:nth-child(even) .za-karte::after{content:none}
  .za-jahr{font-size:32px}
}

/* ---- Block 46 (07.09.2026): Spielwahl im Anfrageformular (.feld-spiel) -----
   Betreiber: „dass sie das Spiel auswaehlen, das sie anfragen wollen, oder beide."
   Drei Radios als Pillen, die gewaehlte im Markenverlauf. */
.feld-spiel{border:0;padding:0;margin:0 0 14px;min-width:0}
.feld-spiel legend{display:block;margin-bottom:6px;padding:0;font-size:13px;font-family:'Roboto Condensed',sans-serif;
  font-weight:700;text-transform:uppercase;letter-spacing:.08em;color:var(--text-hell-weich,#cfd6e6)}
.spiel-pillen{display:flex;flex-wrap:wrap;gap:8px}
.spiel-pillen label{position:relative;cursor:pointer;margin:0}
.spiel-pillen input{position:absolute;opacity:0;width:1px;height:1px;pointer-events:none}
.spiel-pillen span{display:inline-flex;align-items:center;min-height:42px;padding:0 16px;border-radius:999px;
  background:rgba(255,255,255,.06);box-shadow:inset 0 0 0 1px rgba(255,255,255,.16);color:rgba(255,255,255,.85);
  font-family:'Roboto Condensed',sans-serif;font-weight:700;font-size:13.5px;letter-spacing:.05em;text-transform:uppercase;
  transition:background .15s,box-shadow .15s,color .15s}
.spiel-pillen label:hover span{background:rgba(255,255,255,.12)}
.spiel-pillen input:checked + span{background:linear-gradient(120deg,var(--blau),var(--violett));color:#fff;
  box-shadow:0 8px 20px -8px rgba(44,125,206,.8)}
.spiel-pillen input:focus-visible + span{outline:2px solid #fff;outline-offset:2px}
/* Block 44b (07.09.2026): Versandwahl im Rechner bei 6 bis 9 Paketen — der Kunde entscheidet. */
.konfi-kachel.konfi-versand{flex-wrap:wrap}
.konfi-kachel.konfi-versand .ku{flex:1 1 260px}
.konfi-versand-wahl{display:flex;gap:6px;padding:4px;border-radius:12px;background:rgba(0,0,0,.25);flex:0 0 auto}
.konfi-versand-wahl button{border:0;border-radius:9px;padding:9px 14px;background:transparent;color:rgba(255,255,255,.75);
  font-family:'Roboto Condensed',sans-serif;font-weight:700;text-transform:uppercase;letter-spacing:.07em;font-size:12px;cursor:pointer}
.konfi-versand-wahl button.aktiv{background:linear-gradient(120deg,var(--blau),var(--violett));color:#fff}


/* == Block 47 (07.09.2026): Cyber Breach – Was Sie buchen + Post-Panel =============
   Betreiber: „kannst du das hier noch schoener gestalten, und es muss mehr rauskommen,
   dass wir das Spiel auch mit der Post verschicken koennen."

   Vorher stand die Sektion als zweispaltige .icon-liste da — sechs Zeilen Text
   untereinander, der Postversand als letzter Halbsatz. Jetzt drei Teile:

     1. .leistung-raster  Kachelraster, 3 Spalten Desktop / 2 Tablet / 1 Handy.
                          Je Kachel ein Icon im Verlaufskreis (.lk-ico), Titel, Text.
                          Beim Hover hebt die Kachel an und bekommt eine Leuchtkante
                          (::before als Verlaufsrahmen, sonst unsichtbar).
     2. .post-panel       Dunkle, breite Karte im Stil des Rechners (Block 44) und des
                          Cyber-Hero: links das Rendering der versandfertigen Box,
                          rechts Kicker, Ueberschrift, vier Icon-Zeilen und zwei Knoepfe.
                          Ab 900 px steht das Bild oben, ab 560 px alles einspaltig.
     3. .merkmale-reihe   Die Chips darunter als gleichmaessiges Raster (3/2/1) statt
                          als ungleich umbrechende Flex-Zeile.

   Klassen bewusst allgemein benannt, damit derselbe Baustein spaeter auf anderen
   Seiten stehen kann. Kein JavaScript. Nichts Vorhandenes wird ueberschrieben. */

/* ---- 1. Kachelraster ------------------------------------------------------ */
.leistung-raster{list-style:none;margin:34px 0 0;padding:0;display:grid;gap:18px;
  grid-template-columns:repeat(3,minmax(0,1fr))}
.leistung-kachel{position:relative;isolation:isolate;padding:26px 24px 24px;
  border-radius:var(--radius-gross);background:var(--karte);
  box-shadow:inset 0 0 0 1px var(--linie),0 1px 2px rgba(21,23,31,.04);
  transition:transform .22s ease,box-shadow .22s ease}
.leistung-kachel::before{content:"";position:absolute;inset:0;z-index:-1;border-radius:inherit;
  padding:1.5px;opacity:0;transition:opacity .22s ease;
  background:linear-gradient(135deg,var(--blau),var(--violett) 60%,var(--blau-hell));
  -webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);
  -webkit-mask-composite:xor;mask-composite:exclude}
.leistung-kachel:hover{transform:translateY(-4px);
  box-shadow:0 22px 44px -26px rgba(44,125,206,.55),0 0 0 0 transparent}
.leistung-kachel:hover::before{opacity:1}
.lk-ico{display:inline-flex;align-items:center;justify-content:center;width:52px;height:52px;
  border-radius:16px;background:var(--verlauf);
  box-shadow:0 10px 24px -12px rgba(44,125,206,.9);margin-bottom:16px}
.lk-ico .icon{width:26px;height:26px;color:#fff;stroke:#fff}
.leistung-kachel h3{margin:0 0 8px;font-size:clamp(17px,1.6vw,20px);line-height:1.2}
.leistung-kachel p{margin:0;color:var(--text-weich);font-size:15.5px;line-height:1.6}
/* Auf dunklen Sektionen (falls der Baustein dort landet) */
.sektion-dunkel .leistung-kachel{background:rgba(255,255,255,.04);
  box-shadow:inset 0 0 0 1px rgba(255,255,255,.1)}
.sektion-dunkel .leistung-kachel p{color:var(--text-hell-weich)}
/* Cyber-Seiten: Kreis in Violett/Cyan, Kante leuchtet cyan */
body.thema-cyber .lk-ico{background:linear-gradient(135deg,#7B4397,#22D3EE);
  box-shadow:0 10px 26px -12px rgba(123,67,151,.95)}
body.thema-cyber .leistung-kachel::before{
  background:linear-gradient(135deg,#7B4397,#22D3EE 65%,#A78BFA)}
body.thema-cyber .leistung-kachel:hover{
  box-shadow:0 22px 44px -26px rgba(123,67,151,.6)}

/* ---- 2. Post-Panel -------------------------------------------------------- */
.post-panel{position:relative;isolation:isolate;margin-top:26px;overflow:hidden;
  display:grid;grid-template-columns:minmax(0,.8fr) minmax(0,1.25fr);gap:clamp(22px,3vw,44px);
  align-items:center;padding:clamp(24px,3.2vw,40px);border-radius:24px;color:#fff;
  background:linear-gradient(150deg,#0f1424 0%,#141a30 52%,#1a1236 100%);
  box-shadow:0 30px 70px -42px rgba(20,30,80,.75)}
.post-panel::before{content:"";position:absolute;inset:0;z-index:-1;border-radius:inherit;padding:1px;
  background:linear-gradient(120deg,rgba(44,125,206,.9),rgba(123,67,151,.9) 60%,rgba(44,125,206,.35));
  -webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);
  -webkit-mask-composite:xor;mask-composite:exclude}
.post-panel::after{content:"";position:absolute;left:6%;top:50%;width:min(420px,60%);aspect-ratio:1;
  transform:translateY(-50%);border-radius:50%;z-index:-1;pointer-events:none;
  background:radial-gradient(closest-side,rgba(44,125,206,.4),transparent 70%)}
.pp-bild{position:relative;display:flex;align-items:center;justify-content:center}
.pp-bild img{display:block;width:100%;height:auto;max-width:430px;object-fit:contain;
  filter:drop-shadow(0 26px 40px rgba(0,0,0,.5))}
.pp-text > *{margin:0}
.post-panel .kicker{color:var(--blau-hell)}
.post-panel h3{margin-top:10px;color:#fff;font-size:clamp(21px,2.5vw,30px);line-height:1.15}
/* Verlaufswort auf dunklem Grund hell, wie im CTA-Neon (Block 27i). */
.post-panel .verlauf{background-image:var(--verlauf-text-hell)}
.post-panel > .pp-text > p{margin-top:12px;color:var(--text-hell-weich);font-size:16px;
  line-height:1.6;max-width:52ch}
.pp-fakten{list-style:none;margin:22px 0 0;padding:0;display:grid;gap:11px}
.pp-fakten li{display:flex;align-items:flex-start;gap:12px;padding:11px 14px;border-radius:14px;
  background:rgba(255,255,255,.05);box-shadow:inset 0 0 0 1px rgba(255,255,255,.09);
  font-size:15px;line-height:1.5;color:rgba(255,255,255,.9)}
.pp-fakten .icon{flex:0 0 22px;width:22px;height:22px;margin-top:1px;color:var(--blau-hell);
  stroke:var(--blau-hell)}
.post-panel .knopf-reihe{margin-top:24px;display:flex;flex-wrap:wrap;gap:12px}
.post-panel .knopf{box-shadow:0 6px 24px rgba(44,125,206,.42),0 0 40px rgba(123,67,151,.22)}
.post-panel .knopf-leise{border-color:rgba(255,255,255,.3);color:#fff;background:transparent}
.post-panel .knopf-leise:hover{border-color:#fff;background:rgba(255,255,255,.1)}
/* Cyber-Seiten: violett/cyan statt blau */
body.thema-cyber .post-panel::before{
  background:linear-gradient(120deg,rgba(123,67,151,.95),rgba(34,211,238,.75) 60%,rgba(167,139,250,.5))}
body.thema-cyber .post-panel::after{
  background:radial-gradient(closest-side,rgba(123,67,151,.5),transparent 70%)}
body.thema-cyber .pp-fakten .icon{color:#22D3EE;stroke:#22D3EE}
body.thema-cyber .post-panel .kicker{color:#22D3EE}

/* ---- 3. Chips als gleichmaessiges Raster ---------------------------------- */
.merkmale-reihe{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;margin-top:26px}
.merkmale-reihe li{justify-content:flex-start}

/* ---- Umbrueche ------------------------------------------------------------ */
@media (max-width:1000px){
  .leistung-raster{grid-template-columns:repeat(2,minmax(0,1fr))}
}
@media (max-width:900px){
  .post-panel{grid-template-columns:1fr;text-align:left}
  .pp-bild img{max-width:260px}
  .post-panel::after{left:50%;top:22%;transform:translate(-50%,-50%)}
  .merkmale-reihe{grid-template-columns:repeat(2,minmax(0,1fr))}
}
@media (max-width:640px){
  .leistung-raster{grid-template-columns:1fr;gap:14px}
  .leistung-kachel{padding:22px 20px}
  .merkmale-reihe{grid-template-columns:1fr}
  .post-panel .knopf-reihe .knopf{flex:1 1 100%;text-align:center;justify-content:center}
}
@media (prefers-reduced-motion:reduce){
  .leistung-kachel{transition:none}
  .leistung-kachel:hover{transform:none}
}

/* == 48 (08.09.2026, Kommentare 38, 39, 40 auf /cyber-breach/) =================
   Nr. 38: „Die Icons bitte in den Cyber-Breach-Farben und ein Hover-Effekt wie
   bei den anderen." Die Kachel-Icons (.lk-ico, Block 47) standen als weisse
   Symbole auf einem Violett-Cyan-Kreis — Cyan ist keine Cyber-Breach-Farbe.
   Jetzt wie die Symbolflaechen (.ico) auf allen Seiten: helle Flaeche, Strich
   im Verlauf (hier Violett -> Purpur, #ux-verlauf-cyber in icons.svg), und beim
   Zeigen auf die Kachel Verlauf als Grund, Symbol weiss, leicht gedreht (wie
   .karte:hover .ico in 09). */
body.thema-cyber .lk-ico{background:var(--grund-alt);box-shadow:none;
  transition:background .3s ease,transform .3s ease,box-shadow .3s ease}
body.thema-cyber .lk-ico .icon{stroke:url(#ux-verlauf-cyber);color:var(--akzent)}
body.thema-cyber .sektion-dunkel .lk-ico{background:rgba(255,255,255,.06);
  border:1px solid rgba(255,255,255,.08)}
@media (hover:hover){
  body.thema-cyber .leistung-kachel:hover .lk-ico{background:var(--verlauf);
    transform:scale(1.08) rotate(-4deg);box-shadow:0 10px 26px -12px rgba(123,67,151,.95)}
  body.thema-cyber .leistung-kachel:hover .lk-ico .icon{stroke:#fff}
}
@media (prefers-reduced-motion:reduce){
  body.thema-cyber .leistung-kachel:hover .lk-ico{transform:none}
}

/* Nr. 39: „Bitte immer die Schriften unter den Bildern weg." Das Schild unter
   dem Film („Die Box faehrt aus · 12 Sekunden, ohne Ton") wird nicht mehr
   gezeigt — auf allen Seiten, wie schon die Bildunterschriften der Streifen
   und Mosaike (Nr. 14). Das Markup bleibt, der Text steht im Quelltext. */
.videofeld-schild{display:none}

/* Nr. 40: „Bei Cyber Breach das hier auch nur in dem Lila-Verlauf." Der Strich
   unter den H2 (Regel in 04b) lief Blau -> Violett, also in den Farben der
   uebrigen Seiten. Auf /cyber-breach/ jetzt wie der Text-Verlauf der Seite:
   Violett -> Purpur, ohne Blau. Der weisse Schein beim Zeigen bleibt. */
body.thema-cyber .sektion > .bahn > .kopf > h2::after,
body.thema-cyber .sektion > .bahn > .section-kopf > h2::after,
body.thema-cyber .sektion > .bahn-schmal > .kopf > h2::after{
  background-image:
    linear-gradient(90deg,rgba(255,255,255,0) 0%,rgba(255,255,255,.85) 50%,rgba(255,255,255,0) 100%),
    linear-gradient(90deg,rgba(123,67,151,0) 0%,#7B4397 20%,#A855F7 80%,rgba(168,85,247,0) 100%);
  box-shadow:0 0 18px rgba(168,85,247,.28)}
body.thema-cyber .sektion-dunkel > .bahn > .kopf > h2::after{box-shadow:0 0 22px var(--glow-blau)}

/* == 49 (08.09.2026, Kommentare 42 und 43) ======================================
   Nr. 42 (gezogener Kasten ueber „Passt dazu"): „Kannst du den Bereich so
   gestalten, dass er zu dem Footer an sich und dem Anfrageformular darueber
   passt, fuer alle Seiten." Der Block lag als heller Streifen zwischen dem
   dunklen Anfrageband (.band) und der dunklen Fusszeile. Jetzt derselbe Grund
   wie beide Nachbarn, die Karten wie die Kacheln auf dunklen Sektionen
   (rgba-Weiss mit feiner Kante), Titel und Texte hell. Der Trennstrich oben
   ist die Fusszeilen-Linie (--dunkel-linie), damit Band und Block nicht zu
   einer einzigen Flaeche verschwimmen. Auf /cyber-breach/ tragen Band und
   Fusszeile den Standard-Dunkelton (#12131A, Regel in 32), der Block also auch. */
.passt-dazu-sektion{background:var(--dunkel);color:#fff;
  padding-block:clamp(32px,4.5vw,56px);border-top:1px solid var(--dunkel-linie)}
.passt-dazu-sektion h2{color:#fff}
.passt-dazu-sektion .passt-dazu a{background:rgba(255,255,255,.04);
  border-color:rgba(255,255,255,.1);color:#fff;box-shadow:none}
.passt-dazu-sektion .passt-dazu a:hover{border-color:var(--akzent-hell,#8CC0F2);
  color:var(--akzent-hell,#8CC0F2);background:rgba(255,255,255,.07);
  box-shadow:0 18px 44px rgba(0,0,0,.35)}
.passt-dazu-sektion .passt-dazu span{color:var(--text-hell-weich)}
.passt-dazu-sektion .passt-dazu a:hover span{color:#fff}
body.thema-cyber .passt-dazu-sektion{--dunkel:#12131A;--dunkel-linie:#2C2F3D;background:#12131A}

/* Nr. 43: „Bitte immer die Texte auf den Fotos weg, fuer die gesamte Webseite."
   Dazu Nr. 39 („die Schriften unter den Bildern weg"). Nach Streifen und
   Mosaiken (Nr. 14) und dem Videoschild (Nr. 39) jetzt auch die Schriftzuege
   auf den Branding-Bildern und die Zeilen unter den Vorher-nachher-Reglern.
   Alt-Texte bleiben fuer Vorleseprogramme. */
.branding-demo figcaption,.vorher-nachher figcaption{display:none}

/* == 50 Hero am Handy: Foto als Band ueber dem Text (Betreiber 09.09.2026) =====
   „Am Handy verschwinden die Herobilder hinter den Texten." Ursache: Auf
   schmalen Schirmen wird der Hero so hoch wie sein Text (rund 1000 px), das
   Foto wird per object-fit auf diesen schmalen Hochkant-Streifen beschnitten
   und liegt ausserdem komplett unter Text und Schleier. Vom Bild bleibt nichts.
   Jetzt bis 640 px: Das Foto (oder der Film) ist kein Hintergrund mehr, sondern
   ein eigenes Band oben im Hero, 62 % der Breite hoch (hoechstens 300 px),
   ohne Parallax und ohne Vergroesserung. Der Schleier liegt nur noch auf dem
   Band und laesst es unten in die dunkle Hero-Flaeche auslaufen; der Text
   steht darunter auf dem dunklen Grund, wo er ohnehin am besten lesbar ist.
   Auf /cyber-breach/ derselbe Verlauf im Cyber-Dunkel (#080A18). Die
   Kopfleiste ist sticky und nimmt eigenen Platz ein, daher kein Abstand oben. */
@media (max-width:640px){
  .hero:has(.hero-media){display:block;min-height:auto}
  .hero:has(.hero-media) .hero-media{position:relative;inset:auto;z-index:0;
    height:min(62vw,300px);overflow:hidden}
  .hero:has(.hero-media) .hero-media img,.hero:has(.hero-media) .hero-media video{
    transform:none;animation:none;object-position:center 40%}
  .hero:has(.hero-media) .hero-scrim{top:0;bottom:auto;height:min(62vw,300px);
    background:linear-gradient(180deg,rgba(18,19,26,0) 0%,rgba(18,19,26,0) 42%,
      rgba(18,19,26,.55) 72%,#12131A 100%)}
  body.thema-cyber .hero:has(.hero-media) .hero-scrim{
    background:linear-gradient(180deg,rgba(8,10,24,0) 0%,rgba(8,10,24,0) 42%,
      rgba(8,10,24,.55) 72%,#080A18 100%)}
  .hero:has(.hero-media) > .bahn,.hero:has(.hero-media) > .wrap{padding-top:6px;padding-bottom:44px}
}
