@import url("https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,500;0,700;1,500&family=Cormorant+Garamond:ital,wght@0,400;0,500;0,600;1,400&family=Lora:ital,wght@0,400;0,500;1,400&family=Baloo+2:wght@500;600;700&family=Alex+Brush&display=swap");

:root {
  --color-ink: #1b1420;
  --color-ink-deep: #120d16;
  --color-ink-light: #2c2032;
  --color-parchment: #f3e9d8;
  --color-parchment-dim: #d8c9ae;
  --color-gold: #c9a24d;
  --color-gold-light: #e3c583;
  --color-burgundy: #7a2e3a;
  --color-gold-rgb: 201, 162, 77;
  --surface-rgb: 255, 255, 255;
  --surface-alpha: 0.03;
  --font-heading: "Playfair Display", serif;
  --font-body: "Cormorant Garamond", serif;
}

/* Startseite: zartes Pastellrosa-Thema (klares Rosa, kein Mauve/Lila-Unterton) */
body.theme-pastel-pink {
  --color-ink: #fbd7e3;
  --color-ink-deep: #7a1440;
  --color-ink-light: #fff0f5;
  --color-parchment: #5c1030;
  --color-parchment-dim: #9c6478;
  --color-gold: #e8799e;
  --color-gold-light: #c2185b;
  --color-burgundy: #b23a6b;
  --color-gold-rgb: 194, 24, 91;
  --surface-rgb: 255, 255, 255;
  --surface-alpha: 0.6;
  background: var(--color-ink);
}

/* Lumaria-Seite: klares Pastellgrün-Thema */
body.theme-pastel-green {
  --color-ink: #c8ecd0;
  --color-ink-deep: #1d5c34;
  --color-ink-light: #eaf7ec;
  --color-parchment: #1f4a2c;
  --color-parchment-dim: #5f8a6b;
  --color-gold: #6fbf7f;
  --color-gold-light: #1d5c34;
  --color-burgundy: #3f8a5b;
  --color-gold-rgb: 111, 191, 127;
  --surface-rgb: 255, 255, 255;
  --surface-alpha: 0.6;
  background: var(--color-ink);
}

/* Lumarias Marktplatz (Shop-Seite): warmes Cremeweiß mit Lavendel/Violett-Schatten und Gold-Akzent */
body.theme-marketplace {
  --color-ink: #faf6ec;
  --color-ink-deep: #3f3550;
  --color-ink-light: #fffdf8;
  --color-parchment: #4a3f5c;
  --color-parchment-dim: #8c7f9c;
  --color-gold: #c9a24d;
  --color-gold-light: #8a6a24;
  --color-burgundy: #a488c9;
  --color-gold-rgb: 154, 118, 46;
  --color-lavender: #e4d9f5;
  --color-lavender-rgb: 170, 140, 205;
  --color-violet: #a488c9;
  --color-leaf: #7c9a6c;
  --surface-rgb: 255, 255, 255;
  --surface-alpha: 0.6;
  background: var(--color-ink);
}

/* Über mich: sehr helles Pastell-Lila, dezenter Verlauf (explizit gewuenscht) */
body.theme-pastel-lilac {
  --color-ink: #f7f2fc;
  --color-ink-deep: #2f2547;
  --color-ink-light: #faf7fd;
  --color-parchment: #4a3f66;
  --color-parchment-dim: #8b7fa3;
  --color-gold: #c9a24d;
  --color-gold-light: #6a3fa0;
  --color-burgundy: #a98fd1;
  --color-gold-rgb: 201, 162, 77;
  --surface-rgb: 255, 255, 255;
  --surface-alpha: 0.6;
  background: linear-gradient(180deg, #faf7fd 0%, #f7f2fc 100%);
}

/* Nur "Meine Werkstatt": bereitgestelltes Vollbild statt der einzeln
   programmierten Blueten/Sterne-Elemente. background-size:100% auto
   skaliert die Bildbreite exakt auf die Seitenbreite ohne das
   Seitenverhaeltnis zu veraendern (kein Strecken/Verzerren);
   background-repeat:repeat-y setzt es bei Bedarf nahtlos nach unten
   fort, da die Seite hoeher ist als ein einzelnes Bild. Die eigentliche
   Randdekoration (Blueten, Graeser, Sterne, Lichtpunkte) ist bereits
   Teil dieser Bilddatei. */
/* background-attachment:fixed statt repeat-y: die Seite waechst mit
   jedem neuen Abschnitt weiter (zuletzt der Kachelbereich) und
   irgendwann reicht ein einzelnes Bild per background-size:100% auto
   nicht mehr fuer die volle Seitenhoehe -- an der Stelle, an der sich
   das Bild dann per repeat-y wiederholt, trifft Bildunterkante auf
   Bildoberkante und erzeugt eine sichtbare Naht (genau das vom
   Nutzer gemeldete Problem, diesmal direkt unterhalb der Kacheln).
   Eine einzelne, am Viewport fixierte, nicht wiederholte Ebene kann
   diese Naht grundsaetzlich nicht mehr erzeugen, unabhaengig davon,
   wie lang die Seite noch waechst -- behebt die Ursache dauerhaft
   statt die Position der Naht nur zu verschieben. */
body.werkstatt-page {
  background-color: #f6e6c9;
  background-image: url("../img/werkstatt-bg.jpg?v=4");
  background-repeat: no-repeat;
  background-size: cover;
  background-position: top center;
  background-attachment: fixed;
}

/* Eigener, alleiniger Seitenhintergrund NUR fuer "Ein Blick auf meinen
   Schreibtisch" -- bewusst ruhiges, cremefarbenes Pergament ohne
   grosse Motive (Buecher/Feder/Tasse folgen spaeter separat als
   freigestellte PNGs), das exakt auf die Seitenhoehe gestreckt wird
   (background-size:100% 100%, scroll statt fixed). So entsteht
   unabhaengig von der tatsaechlichen Seitenlaenge IMMER eine einzige,
   nicht wiederholte Flaeche ohne Naht. Ueberschreibt gezielt nur die
   Hintergrund-Eigenschaften von body.werkstatt-page, alle anderen
   Werkstatt-Seiten bleiben beim bisherigen floralen Hintergrund. */
body.werkstatt-page.werkstatt-schreibtisch-page {
  background-color: #f8ebcb;
  background-image: url("../img/werkstatt-schreibtisch-bg-plain.png?v=1");
  background-repeat: no-repeat;
  background-position: top center;
  background-size: 100% 100%;
  background-attachment: scroll;
}

/* Eigener, alleiniger Seitenhintergrund NUR fuer "Wenn Magie mehrere
   Anlaeufe braucht" -- bewusst neutrales, dekofreies Pergament
   (Tintenkleckse/Fussspuren/Skizzen folgen spaeter separat). Gleiches
   Streckungsverfahren wie bei der Schreibtisch-Seite: no-repeat,
   100% 100%, scroll statt fixed, damit unabhaengig von der
   tatsaechlichen Seitenlaenge nie eine Wiederholungsnaht entstehen
   kann. Ueberschreibt gezielt nur body.werkstatt-page, andere
   Werkstatt-Seiten bleiben unveraendert. */
body.werkstatt-page.werkstatt-anlaeufe-page {
  background-color: #fbedce;
  background-image: url("../img/werkstatt-anlaeufe-bg-plain.png?v=1");
  background-repeat: no-repeat;
  background-position: top center;
  background-size: 100% 100%;
  background-attachment: scroll;
}

/* Eigener, alleiniger Seitenhintergrund NUR fuer "Von der ersten Idee
   zum fertigen Bild" -- gleiches Streckungsverfahren wie bei den
   anderen Werkstatt-Unterseiten (no-repeat, 100% 100%, scroll statt
   fixed), damit unabhaengig von der tatsaechlichen Seitenlaenge nie
   eine Wiederholungsnaht entstehen kann. Ueberschreibt gezielt nur
   body.werkstatt-page, andere Werkstatt-Seiten bleiben unveraendert. */
body.werkstatt-page.werkstatt-idee-page {
  background-color: #f7e9c4;
  background-image: url("../img/werkstatt-idee-bg-plain.png?v=1");
  background-repeat: no-repeat;
  background-position: top center;
  background-size: 100% 100%;
  background-attachment: scroll;
}

/* Für Eltern & Pädagogen: helles, ruhiges Editorial-Theme statt des
   frueheren dunklen Violetts (Standard-:root-Theme) &mdash; soll
   vertrauenswuerdig, hochwertig und freundlich wirken, nicht verspielt
   wie eine Kinderseite. --color-ink/-deep/-light bleiben schlichte
   Volltoene fuer einzelne Komponenten (Buttons, Badges etc.); die
   eigentliche, mehrfarbige "Aquarellnebel"-Flaeche kommt separat ueber
   background-image auf body selbst (weiche, grossflaechige radiale
   Verlaeufe in Creme/Salbei/Flieder/Roseacute; -- bewusst KEIN Streifen-
   Verlauf, jede Farbe blendet einzeln in Transparenz aus und ueber-
   lappt die naechste). Ein einziges, extrem dezentes Ranken-Wasser-
   zeichen (5% Deckkraft, direkt in die SVG gebacken) sorgt fuer eine
   kaum wahrnehmbare Lumaria-Atmosphaere, ohne wie eine zusaetzliche
   Illustration zu wirken. Ausschliesslich body.theme-sage-parents,
   also nur auf fuer-eltern-paedagogen.html -- kein anderes Theme/keine
   andere Seite nutzt diese Klasse. */
body.theme-sage-parents {
  --color-ink: #fbf7ee;
  --color-ink-deep: #f2ebdc;
  --color-ink-light: #fffdf9;
  --color-parchment: #3f4a3f;
  --color-parchment-dim: #6b7a6b;
  --color-gold: #d8b45a;
  --color-gold-light: #7a5aa6;
  --color-burgundy: #9b7bc0;
  --color-gold-rgb: 216, 180, 90;
  --surface-rgb: 255, 255, 255;
  --surface-alpha: 1;
  background-color: #fbf7ee;
  background-image:
    url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNDAgMjQwJz4KICA8ZyBmaWxsPSdub25lJyBzdHJva2U9JyM2YjdhNmInIHN0cm9rZS13aWR0aD0nMicgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBvcGFjaXR5PScwLjA1Jz4KICAgIDxwYXRoIGQ9J00yMCAyMjAgQyA2MCAxNjAsIDQwIDEwMCwgOTUgNDAnIC8+CiAgICA8cGF0aCBkPSdNNDUgMTY1IEMgNjUgMTU1LCA4NSAxNDUsIDk4IDEyMicgLz4KICAgIDxwYXRoIGQ9J00zMiAxOTUgQyA1MiAxODUsIDY4IDE3OCwgODQgMTYyJyAvPgogIDwvZz4KICA8ZyBmaWxsPScjYzlhMjRkJyBvcGFjaXR5PScwLjA1Jz4KICAgIDxlbGxpcHNlIGN4PScxMDAnIGN5PSc0NCcgcng9JzE0JyByeT0nNycgdHJhbnNmb3JtPSdyb3RhdGUoLTQwIDEwMCA0NCknLz4KICAgIDxlbGxpcHNlIGN4PSc3NScgY3k9JzE0OCcgcng9JzEyJyByeT0nNicgdHJhbnNmb3JtPSdyb3RhdGUoLTIwIDc1IDE0OCknLz4KICAgIDxlbGxpcHNlIGN4PSc2MicgY3k9JzE3OCcgcng9JzEwJyByeT0nNScgdHJhbnNmb3JtPSdyb3RhdGUoLTEwIDYyIDE3OCknLz4KICA8L2c+Cjwvc3ZnPg=="),
    radial-gradient(900px 650px at 8% 2%, rgba(192, 216, 192, 0.28), transparent 68%),
    radial-gradient(820px 620px at 96% 10%, rgba(216, 201, 232, 0.20), transparent 68%),
    radial-gradient(900px 700px at 100% 55%, rgba(241, 211, 214, 0.18), transparent 70%),
    radial-gradient(880px 660px at 0% 62%, rgba(192, 216, 192, 0.20), transparent 70%),
    radial-gradient(820px 620px at 25% 100%, rgba(216, 201, 232, 0.15), transparent 68%),
    radial-gradient(820px 620px at 85% 100%, rgba(241, 211, 214, 0.14), transparent 68%);
  background-repeat: no-repeat;
  background-position: top right, 0 0, 0 0, 0 0, 0 0, 0 0, 0 0;
  background-size: 560px 560px, auto, auto, auto, auto, auto, auto;
}

/* Buttons in Tuerkis statt Gold, mit dezentem goldenem Hover-Akzent
   (Gold bleibt die allgemeine Akzentfarbe fuer Rahmen/Trenner). */
body.theme-sage-parents .btn-primary {
  background: #3fa8a4;
  border-color: #3fa8a4;
  color: #ffffff;
}

body.theme-sage-parents .btn-primary:hover {
  background: var(--color-gold);
  border-color: var(--color-gold);
  color: #3f2f10;
}

body.theme-sage-parents .btn-outline {
  color: #3fa8a4;
  border-color: #3fa8a4;
}

body.theme-sage-parents .btn-outline:hover {
  background: rgba(216, 180, 90, 0.14);
  border-color: var(--color-gold);
  color: var(--color-parchment);
}

/* Kontakt: uebernimmt die Farbwelt der Hintergrundillustration (Lavendel,
   Creme, Gold); die eigentliche Flaeche kommt ueber .kontakt-bg (ein
   fixiertes <img>, siehe unten), daher hier bewusst kein eigener
   Verlaufshintergrund. */
body.theme-kontakt {
  --color-ink: #f7f2fc;
  --color-ink-deep: #2f2547;
  --color-ink-light: #faf7fd;
  --color-parchment: #4a3f66;
  --color-parchment-dim: #8b7fa3;
  --color-gold: #c9a24d;
  --color-gold-light: #6a3fa0;
  --color-burgundy: #a98fd1;
  --color-gold-rgb: 201, 162, 77;
  --surface-rgb: 255, 250, 240;
  --surface-alpha: 0.6;
  background: none;
}

/* "Lumarias Marktplatz" (shop.html): Das Header-Video steht im HTML
   als erstes Element, direkt gefolgt vom ganz normalen .site-header
   (keine Sonderklasse mehr -- ein frueherer Versuch, die Navigation
   per negativem margin-top + position:sticky ALS OVERLAY auf das
   Video zu legen, zog dabei unbeabsichtigt auch den kompletten
   nachfolgenden Seiteninhalt mit nach oben in den Videobereich hinein,
   siehe Korrektur weiter unten bei .site-header). Da das runde Logo
   im Header dieser Seite komplett aus dem HTML entfernt ist, bleibt
   die Zeile ohnehin schon kompakt -- kein Zusatzabstand noetig, damit
   sie direkt am unteren Rand des Videos beginnt. */
.marktplatz-header-video-wrap {
  width: 100%;
  height: 460px;
  overflow: hidden;
  line-height: 0;
}

.marktplatz-header-video {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
}

@media (max-width: 900px) {
  .marktplatz-header-video-wrap {
    height: 380px;
  }
}

@media (max-width: 640px) {
  .marktplatz-header-video-wrap {
    height: 300px;
  }
}

/* "Karte von Lumaria" (lumaria-karte.html): identische Technik wie
   .marktplatz-header-video-wrap oben -- Video als normaler Block VOR
   der Navigation (kein Overlay), Rundlogo + "Tintenzauber Verlag"-
   Schriftzug sind auf dieser Seite komplett aus dem HTML entfernt
   (nicht nur ausgeblendet), die Navigation (unveraendert, keine
   Sonderklasse) beginnt dadurch direkt am unteren Videorand, ohne
   Leerraum. object-fit:contain (statt cover) KORRIGIERT einen
   Beschnitt-Bug: cover fuellte die feste Containerhoehe/-breite ohne
   Ruecksicht auf das Video-Seitenverhaeltnis und schnitt dadurch Kopf/
   Geweih des Zauberwaldwaechters ab. contain zeigt das komplette Video
   unverzerrt (Seitenverhaeltnis erhalten), notfalls etwas kleiner
   dargestellt -- der dadurch bei abweichendem Seitenverhaeltnis
   entstehende Leerraum (meist seitlich, da das Video breiter als hoch
   ist) wird von background:var(--color-ink) auf dem Wrapper mit
   demselben hellgruenen Ton wie Seite/Navigation aufgefangen (kein
   dunkler Farbton mehr -- siehe Korrektur unten zu .lumaria-karte-
   header-video-bg). */
.lumaria-karte-header-video-wrap {
  position: relative;
  width: 100%;
  height: 460px;
  overflow: hidden;
  line-height: 0;
  background: var(--color-ink);
}

/* Vormals eine kraeftig weichgezeichnete/abgedunkelte Hintergrundebene
   (object-fit:cover + filter:blur+brightness) zur Auffuellung der
   seitlichen Leerraeume -- wirkte dort wie ein dunkler, unscharfer
   Schatten und wurde deshalb ausdruecklich entfernt/deaktiviert. Die
   Leerraeume werden jetzt stattdessen von der einfachen, hellgruenen
   Wrapper-Flaeche (background:var(--color-ink) oben) gefuellt, exakt
   im selben Farbton wie Seite und Navigation. display:none statt
   Entfernen aus dem HTML, um am Markup nichts aendern zu muessen. */
.lumaria-karte-header-video-bg {
  display: none;
}

/* Scharfes Hauptvideo: Groesse/Position bewusst unveraendert (weiterhin
   object-fit:contain, siehe Kommentar oben zum Beschnitt-Fix). mask-
   image wird zur Laufzeit per JS gesetzt (updateFade in lumaria-karte.
   html) und laesst NUR das Video selbst an seiner tatsaechlichen
   sichtbaren Kante weich in Transparenz auslaufen -- kein Overlay, kein
   Blur, kein dunkler Farbverlauf. Darunter wird jetzt direkt die
   hellgruene Wrapper-Flaeche sichtbar (background:var(--color-ink)
   oben), exakt derselbe Ton wie Seite/Navigation. */
.lumaria-karte-header-video {
  position: relative;
  display: block;
  width: 100%;
  height: 100%;
  object-fit: contain;
  object-position: center;
  z-index: 1;
}

@media (max-width: 900px) {
  .lumaria-karte-header-video-wrap {
    height: 380px;
  }
}

@media (max-width: 640px) {
  .lumaria-karte-header-video-wrap {
    height: 300px;
  }
}

/* Bewohner Lumarias (bewohner-lumarias.html): identische Zwei-Ebenen-/
   Fade-Technik wie .lumaria-karte-header-video-wrap oben, nur mit
   eigenen Klassennamen fuer diese Seite. Sitzt VOR der Navigation
   (Reihenfolge: Video, dann Nav, dann Erzaehlbereich). */
/* Nutzerkorrektur: Video-Header durch ein einzelnes statisches Bild
   ersetzt (die_magischen_bewohner_lumarias.png, enthaelt den Titel
   bereits eingebrannt). Bewusst KEIN fester Container mit object-fit
   (wie zuvor beim Video) -- width:100%+height:auto laesst die Bild-
   hoehe strikt aus dem eigenen Seitenverhaeltnis folgen, dadurch immer
   vollstaendig, unverzerrt und unbeschnitten bei jeder Viewportbreite,
   ganz ohne Breakpoint-Sondermasse. */
.bewohner-header-image-wrap {
  width: 100%;
  line-height: 0;
}

.bewohner-header-image {
  display: block;
  width: 100%;
  height: auto;
}

/* "Meine Tintenzauberwerkstatt" (werkstatt.html): neuer, separater
   Header-Videobereich NACH der Navigation (anders als bei .marktplatz-
   header-video-wrap/.lumaria-karte-header-video-wrap, die VOR der Nav
   sitzen) -- Reihenfolge auf dieser Seite: Navigation, dann dieses
   Video, dann das urspruengliche "Willkommen..."-Bild im bestehenden
   Erzaehlbereich weiter unten (unveraendert). Gleiche Technik/Hoehen
   wie die anderen Header-Videos. object-fit:cover ist hier unbedenklich:
   das Container-Seitenverhaeltnis ist auf allen drei Breakpoints breiter
   als das Video (1280x688, 1.86:1), wodurch cover ausschliesslich oben/
   unten beschneidet, nie seitlich -- der KI-Geist (links) und das
   Zauberbuch (rechts) bleiben dadurch auf voller Breite sichtbar. */
.werkstatt-header-video-wrap {
  width: 100%;
  height: 460px;
  overflow: hidden;
  line-height: 0;
}

.werkstatt-header-video {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
}

@media (max-width: 900px) {
  .werkstatt-header-video-wrap {
    height: 380px;
  }
}

@media (max-width: 640px) {
  .werkstatt-header-video-wrap {
    height: 300px;
  }
}

body.theme-pastel-pink .hero::before {
  background-image: url("../img/ink-splash-pink.svg?v=2");
}

* {
  box-sizing: border-box;
}

html {
  scroll-behavior: smooth;
}

body {
  margin: 0;
  background: radial-gradient(ellipse at top, var(--color-ink-light) 0%, var(--color-ink) 45%, var(--color-ink-deep) 100%);
  color: var(--color-parchment);
  font-family: var(--font-body);
  font-size: 1.15rem;
  line-height: 1.7;
  min-height: 100vh;
  display: flex;
  flex-direction: column;
}

h1, h2, h3 {
  font-family: var(--font-heading);
  font-weight: 700;
  color: var(--color-gold-light);
  letter-spacing: 0.02em;
  margin: 0 0 0.6em;
}

a {
  color: var(--color-gold-light);
  text-decoration: none;
  transition: color 0.2s ease;
}

a:hover {
  color: var(--color-parchment);
}

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

/* Header / Navigation */

.brand-banner {
  display: flex;
  justify-content: center;
  padding: 2.5rem 1.5rem 0.5rem;
}

.logo-wordmark {
  height: 150px;
  width: auto;
  display: block;
}

.site-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 1rem 2rem 1.5rem;
  border-bottom: 1px solid rgba(var(--color-gold-rgb), 0.25);
}

/* Home-Header (Nutzerkorrektur): das grosse Text-Logo "Tintenzauber
   Verlag" (.brand-banner/.logo-wordmark) wurde entfernt, das bereits
   vorhandene runde Bildlogo (.logo-badge, Foto von Martina) uebernimmt
   jetzt allein dessen Platz -- daher hier zentriert (statt der
   Basisregel justify-content:space-between, die fuer ein einzelnes
   Kind zu einer linksbuendigen Position fuehren wuerde) und ohne die
   sonst ueberall sichtbare untere Trennlinie, damit das Foto frei und
   ruhig ueber dem Video schwebt -- gleiche Wirkung wie zuvor der
   zentrierte Schriftzug. Nur diese eine Kopie von .site-header (die
   Logo-Zeile im Home-Header) betroffen, die echte Navigation
   (.main-nav) bleibt unangetastet. */
.home-header-logo {
  justify-content: center;
  padding: 2.5rem 1.5rem 0.5rem;
  border-bottom: none;
}

/* Mobile (Nutzerkorrektur): kein zusaetzliches Logo im Home-Header, da
   die mobile Navigationszeile bereits ihr eigenes Tintenzauber-Verlag-
   Logo mitbringt (siehe .mobile-nav-logo-link/-img, von main.js in
   JEDE Seite eingefuegt) -- ein zweites Logo (das runde Foto) direkt
   darueber waere doppelt. Nur diese eine Zeile betroffen.

   Nutzerkorrektur (Folgefehler): .home-header-wrap selbst hat KEINE
   eigene Hoehe (nur position:relative, siehe oben) -- auf Desktop kommt
   die Hoehe allein aus dem Platz, den .home-header-logo im normalen
   Fluss einnimmt (Padding + 144px-Rundfoto). Sobald dieses Logo hier
   per display:none verschwindet, hat der Wrapper KEIN Kind mehr im
   normalen Fluss (Video/Overlay sind position:absolute, tragen nicht
   zur Hoehe bei) und faellt auf 0px Hoehe zusammen -- der komplette
   Home-Header (Video/Szene) verschwand dadurch auf dem Handy, obwohl
   nichts direkt auf display:none stand. Feste Mobile-Hoehe stellt die
   Szene wieder her, gestuft wie beim gleichartigen
   .autorin-header-wrap oben. */
@media (max-width: 767px) {
  .home-header-logo {
    display: none;
  }

  .home-header-wrap {
    height: 260px;
  }
}

@media (max-width: 480px) {
  .home-header-wrap {
    height: 210px;
  }
}

.logo-badge {
  height: 144px;
  width: 144px;
  object-fit: cover;
  border-radius: 50%;
  display: block;
  box-shadow: 0 0 0 3px rgba(var(--color-gold-rgb), 0.4);
}

/* Nur auf der Startseite (body.theme-pastel-pink ist ausschliesslich
   dort gesetzt) rund 30% groesser; Breite und Hoehe bleiben gleich,
   damit der Kreis (object-fit:cover) unverzerrt bleibt. */
body.theme-pastel-pink .logo-badge {
  height: 187px;
  width: 187px;
}

/* HOME-Header-Video-Hintergrund -- NUR auf der Startseite: .home-
   header-wrap fasst .brand-banner (goldener Schriftzug) UND .site-
   header (Rundlogo + Navigation) zu EINEM gemeinsamen Video-Hinter-
   grundbereich zusammen, statt nur den unteren Nav-Teil abzudecken.
   .brand-banner/.site-header haben bereits site-weit eigenes
   position:relative + z-index:1 (siehe weiter unten, wegen der fixen
   Sparkle-Ebene) -- dieses z-index:1 wird NICHT von einem neuen
   Stapelkontext auf .home-header-wrap isoliert, da dieser Wrapper
   bewusst KEIN eigenes z-index bekommt (nur position:relative als
   Anker fuers Video). Video/Aufhellung (z-index:0) liegen dadurch
   zuverlaessig dahinter, ganz ohne die Logo/Nav-Regeln anzufassen.
   Bewusst kein overflow:hidden auf dem Wrapper: die Dropdown-Panels
   der Navigation ragen unterhalb des Headers heraus (position:
   absolute, top:calc(100% + 14px) relativ zu .nav-dropdown) und
   wuerden sonst abgeschnitten -- top/left/width/height:100% reicht
   fuers Video, um exakt auf die Wrapper-Box begrenzt zu bleiben.
   Sehr dezente helle Aufhellung (kein dunkler Kasten) fuer Lesbarkeit
   von Logo-Schriftzug/Navigation vor dem bewegten Hintergrund. */
.home-header-wrap {
  position: relative;
}

.site-header-bg-video {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
  z-index: 0;
  pointer-events: none;
}

.site-header-bg-overlay {
  position: absolute;
  inset: 0;
  background: rgba(255, 240, 245, 0.3);
  z-index: 0;
  pointer-events: none;
}

/* Die generische, dezent aufhellende .site-header-bg-overlay
   (rgba(255,240,245,0.3), oben) liess die Header-Videos milchig/
   ausgewaschen wirken. Auf HOME entfernt, damit das Video wieder
   kraeftig/farbecht erscheint -- .home-header-wrap kommt
   ausschliesslich in index.html vor (siehe Kommentar oben). */
.home-header-wrap .site-header-bg-overlay {
  background: none;
}

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

/* Autorin-Header-Video-Hintergrund -- gleiches Prinzip wie
   .home-header-wrap oben, nur fuer "Ueber die Autorin". Schriftlogo
   und Rundlogo wurden hier entfernt (sitewide Header-Ueberarbeitung --
   das Rundlogo lebt seitdem nur noch im Erzaehlbereich von HOME
   weiter, siehe .home-story-seal). Ohne die frueher hier verschachtelten
   Logo-Elemente braucht der Wrapper jetzt eine explizite Hoehe, sonst
   wuerde das (weiterhin absolut positionierte, z-index:0) Video keine
   Flaeche mehr zum Fuellen haben -- dieselben Werte wie beim bereits
   bestehenden .marktplatz-header-video-wrap (460/380/300px). */
.autorin-header-wrap {
  position: relative;
  width: 100%;
  height: 460px;
  overflow: hidden;
}

@media (max-width: 900px) {
  .autorin-header-wrap {
    height: 380px;
  }
}

@media (max-width: 640px) {
  .autorin-header-wrap {
    height: 300px;
  }
}

/* Wie bei HOME (.home-header-wrap .site-header-bg-overlay oben):
   dieselbe geteilte .site-header-bg-overlay liess das Header-Video
   auch hier auf "Ueber mich" milchig/ausgewaschen wirken statt
   kraeftig. Nur ueber diesen seiteneigenen Wrapper entfernt --
   .autorin-header-wrap kommt ausschliesslich in ueber-mich.html vor
   (siehe grep-Bestaetigung), Lumaria (.lumaria-header-wrap) bleibt
   unangetastet. */
.autorin-header-wrap .site-header-bg-overlay {
  background: none;
}

/* Nur auf "Ueber die Autorin" (body.theme-pastel-lilac ist
   ausschliesslich dort gesetzt) rund 30% groesser. */
body.theme-pastel-lilac .logo-badge {
  height: 187px;
  width: 187px;
}

.main-nav {
  display: flex;
  align-items: center;
  gap: 1.8rem;
  font-family: var(--font-heading);
  font-size: 1.05rem;
}

.main-nav a.active {
  color: var(--color-parchment);
  border-bottom: 1px solid var(--color-gold);
}

/* Dropdown-Menues der Hauptnavigation (Autorin/Lumaria/Lumarias
   Marktplatz/Kids Club): auf Desktop per Hover/Tastaturfokus
   eingeblendet, auf Mobil per Antippen (siehe main.js, das dafuer
   .is-open auf .nav-dropdown togglet -- die Hover-Regel unten
   funktioniert unabhaengig davon rein ueber CSS). Bewusst zurueckhaltend
   gehalten: kein Standard-Browser-Dropdown-Look, sondern eine kleine
   abgerundete Karte im bestehenden Kachel-Stil der Website (gleiche
   Radien/Schatten/Gold-Rahmen-Sprache wie z.B. .lumaria-tile), mit
   sanftem Fade+Slide statt eines harten Ein-/Ausblendens. */
.nav-dropdown {
  position: relative;
}

.nav-dropdown-trigger {
  font: inherit;
  color: inherit;
  background: none;
  border: none;
  padding: 0;
  margin: 0;
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  gap: 0.35em;
}

.nav-dropdown-trigger::after {
  content: "▾";
  font-size: 0.65em;
  color: rgba(var(--color-gold-rgb), 0.85);
  transition: transform 0.25s ease;
}

.nav-dropdown:hover .nav-dropdown-trigger::after,
.nav-dropdown:focus-within .nav-dropdown-trigger::after,
.nav-dropdown.is-open .nav-dropdown-trigger::after {
  transform: rotate(180deg);
}

.nav-dropdown-trigger.active {
  color: var(--color-parchment);
  border-bottom: 1px solid var(--color-gold);
}

/* "Tintenzauber"-Dropdown-Karte (ab 1024px, Hover/Fokus-gesteuert):
   warmes Creme statt der frueheren, themenunabhaengig weissen
   rgba(var(--surface-rgb)) Flaeche -- feste, sitewide einheitliche
   Palette (Creme/Violett-Text) analog zur neuen mobilen Navigation
   (siehe .main-nav.is-open weiter unten), nur der Gold-Ton bleibt via
   --color-gold-rgb je Seitenthema leicht unterschiedlich. */
.nav-dropdown-panel {
  position: absolute;
  top: calc(100% + 14px);
  left: 50%;
  min-width: 210px;
  display: flex;
  flex-direction: column;
  gap: 0;
  padding: 0.5rem;
  background: #fdf6ea;
  border: 1px solid rgba(var(--color-gold-rgb), 0.45);
  border-radius: 14px;
  box-shadow: 0 14px 30px rgba(47, 37, 71, 0.18);
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
  transform: translate(-50%, -6px);
  transition: opacity 0.18s ease, transform 0.18s ease, visibility 0.18s;
  z-index: 5;
}

/* Sternchen-Deko nur fuer die frei schwebende Desktop-Karte gedacht
   (position:absolute) -- auf Tablet/Mobil wird .nav-dropdown-panel
   weiter unten zu position:static (Teil des Akkordeon-Menues), dort
   waere das Sternchen fehlplatziert, deshalb hier standardmaessig
   ausgeblendet und erst ab 1024px wieder eingeblendet. */
.nav-dropdown-panel::before {
  display: none;
  content: "\2726";
  position: absolute;
  top: -8px;
  left: 50%;
  transform: translateX(-50%);
  font-size: 0.7rem;
  line-height: 1;
  color: var(--color-gold-light);
  background: #fdf6ea;
  padding: 0 6px;
}

.nav-dropdown-panel a {
  display: block;
  padding: 0.5rem 0.85rem;
  border-radius: 8px;
  font-size: 0.94rem;
  white-space: nowrap;
  color: #6a5c8a;
  text-decoration: none;
  transition: background 0.18s ease, color 0.18s ease;
}

.nav-dropdown-panel a:not(:last-child) {
  border-bottom: 1px solid rgba(var(--color-gold-rgb), 0.16);
}

.nav-dropdown-panel a:hover,
.nav-dropdown-panel a:focus-visible {
  background: rgba(var(--color-gold-rgb), 0.14);
  color: #4a3f66;
  font-weight: 600;
}

.nav-dropdown-panel a.active {
  color: var(--color-gold-light);
  font-weight: 600;
}

/* Hover/Fokus oeffnet die Dropdown-Karte nur noch ab 1024px (echter
   Desktop mit Maus). 768-1023px (Tablet, kein zuverlaessiger Hover)
   hat eine eigene, per Tap gesteuerte Optik weiter unten. */
@media (min-width: 1024px) {
  .nav-dropdown-panel::before {
    display: block;
  }

  .nav-dropdown:hover .nav-dropdown-panel,
  .nav-dropdown:focus-within .nav-dropdown-panel {
    opacity: 1;
    visibility: visible;
    pointer-events: auto;
    transform: translate(-50%, 0);
  }
}

/* Drei per main.js zur Laufzeit ergaenzte Elemente der mobilen
   Navigation (Logo-Link vor .main-nav, Abdunklungs-Overlay, Deko-
   Grafik am Menue-Ende, siehe main.js) -- ausserhalb von
   @media(max-width:767px) (Regeln dort) standardmaessig unsichtbar,
   damit sie Desktop/Tablet in keinem Fall beeinflussen. */
.mobile-nav-logo-link,
.mobile-nav-backdrop,
.mobile-nav-menu-deco {
  display: none;
}

/* Hamburger-Menue (nur Mobil, siehe @media weiter unten). Auf Desktop
   unsichtbar; main.js togglet .is-active fuer die X-Verwandlung der
   drei Balken und .is-open auf .main-nav fuer das Ein-/Ausklappen. */
.nav-toggle {
  display: none;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  gap: 5px;
  width: 42px;
  height: 42px;
  padding: 0;
  background: none;
  border: 1px solid rgba(var(--color-gold-rgb), 0.4);
  border-radius: 10px;
  cursor: pointer;
  flex-shrink: 0;
}

.nav-toggle-bar {
  display: block;
  width: 20px;
  height: 2px;
  background: var(--color-gold);
  border-radius: 2px;
  transition: transform 0.25s ease, opacity 0.25s ease;
}

.nav-toggle.is-active .nav-toggle-bar:nth-child(1) {
  transform: translateY(7px) rotate(45deg);
}

.nav-toggle.is-active .nav-toggle-bar:nth-child(2) {
  opacity: 0;
}

.nav-toggle.is-active .nav-toggle-bar:nth-child(3) {
  transform: translateY(-7px) rotate(-45deg);
}

/* Hero */

.hero {
  position: relative;
  text-align: center;
  padding: 0 0 5rem;
  overflow: hidden;
}

.hero::before {
  content: "";
  position: absolute;
  inset: 0;
  background: url("../img/ink-splash.svg?v=2") no-repeat center / 900px;
  opacity: 0.18;
  pointer-events: none;
}

/* Neue maerchenhafte Erzaehl-Illustration (ersetzt die vorherige reine
   Text-/Grafik-Ueberschrift): Seitenverhaeltnis erhalten, kein Rahmen/
   Schatten/Box. Der untere (und leicht der obere) Bildbereich wird per
   mask-image weich transparent ausgeblendet, damit die (im Bild bereits
   sehr aehnliche) helle Rosa-Flaeche nahtlos in den echten Seiten-
   hintergrund (body.theme-pastel-pink) uebergeht, statt eine harte
   Bildkante zu zeigen.
   Bewusst NICHT mehr volle Breite: width:82% (Prozent, keine feste
   Pixelbreite -- skaliert responsiv mit) plus max-width:1100px als
   Obergrenze fuer sehr breite Bildschirme, damit links/rechts/oben
   durchgaengig der rosa Seitenhintergrund sichtbar bleibt. margin-top
   schafft zusaetzlichen ruhigen Abstand zum Header darueber. */
.home-hero-illustration {
  position: relative;
  width: 82%;
  max-width: 1100px;
  margin: 60px auto 0;
  line-height: 0;
}

/* "Glow"-Ebene: dieselbe Bilddatei (keine neue Grafik, keine Bearbeitung
   des Originals), nur per CSS 2x vergroessert (inset:-33% dehnt Breite
   UND Hoehe um denselben Faktor, das Seitenverhaeltnis bleibt exakt
   erhalten -- background-size:cover verzerrt hier nichts), stark
   weichgezeichnet und mit reduzierter Deckkraft hinter der scharfen
   Grafik platziert. Ein zusaetzlicher radialer mask-image-Verlauf
   sorgt dafuer, dass die Glow-Ebene selbst keine eigene harte Kante
   hat, sondern schon deutlich vor ihrem eigenen Rand komplett
   ausgeblendet ist -- reine Farbfortsetzung, keine sichtbare Box.
   Nur die kleine 640w-Variante als Quelle, da der starke
   Weichzeichner ohnehin jedes Detail aufloest -- spart Ladezeit. */
.home-hero-illustration-glow {
  position: absolute;
  inset: -33%;
  z-index: 0;
  background-image: url("../img/home-hero-illustration-640.png?v=1");
  background-size: cover;
  background-position: center;
  filter: blur(65px) saturate(112%);
  opacity: 0.65;
  -webkit-mask-image: radial-gradient(ellipse 62% 62% at 50% 50%, black 35%, transparent 90%);
  mask-image: radial-gradient(ellipse 62% 62% at 50% 50%, black 35%, transparent 90%);
  pointer-events: none;
}

@media (max-width: 640px) {
  .home-hero-illustration-glow {
    filter: blur(36px) saturate(112%);
  }
}

/* Die scharfe Grafik selbst faedet jetzt an allen VIER Seiten aus
   (nicht mehr nur oben/unten): zwei sich ueberschneidende
   mask-image-Verlaeufe (horizontal + vertikal), per mask-composite:
   intersect kombiniert, damit jede Kante unabhaengig weich bis 0
   ausblendet. Links/rechts bewusst breit (18%) wie gewuenscht, nicht
   nur wenige Pixel -- die floralen Randmotive der Grafik (Feder,
   Baumkrone) reichen im Original ohnehin fast bis an den Bildrand,
   sollen dort also bewusst zunehmend transparent werden statt hart
   abzuschneiden. */
.home-hero-illustration-img {
  position: relative;
  z-index: 1;
  display: block;
  width: 100%;
  height: auto;
  mask-image:
    linear-gradient(to right, transparent 0%, black 18%, black 82%, transparent 100%),
    linear-gradient(to bottom, transparent 0%, black 14%, black 76%, transparent 100%);
  mask-composite: intersect;
  -webkit-mask-image:
    linear-gradient(to right, transparent 0%, black 18%, black 82%, transparent 100%),
    linear-gradient(to bottom, transparent 0%, black 14%, black 76%, transparent 100%);
  -webkit-mask-composite: source-in;
}

.hero-content {
  position: relative;
  max-width: 640px;
  margin: 0 auto;
}

.hero-eyebrow {
  font-family: var(--font-heading);
  text-transform: uppercase;
  letter-spacing: 0.25em;
  font-size: 0.85rem;
  color: var(--color-gold);
}

.hero h1 {
  font-size: 3rem;
  margin-top: 0.6rem;
}

.hero p {
  font-size: 1.3rem;
  color: var(--color-parchment-dim);
  margin-bottom: 2.2rem;
}

/* Drei vom Nutzer gelieferte Sticker-Illustrationen (goldener Keim,
   Lumi-Baum, Goldene Feder) -- zuvor am Videobereich auf "Ursprung
   von Lumaria", jetzt stattdessen hier als kleine Randillustrationen im
   laengeren Erzaehltext auf "Entdecke Lumaria" (der vierte, der
   Lichtfunke/-kreisel am ersten Absatz, wurde auf Wunsch ersatzlos
   entfernt -- keine neue Dekoration an seiner Stelle, der Absatz war
   dank der absoluten, ausserhalb der Textspalte haengenden Positionierung
   ohnehin nie von seiner Anwesenheit abhaengig). Jeder verbleibende Sticker haengt an
   genau einem Absatz (position:relative direkt auf dem betreffenden <p>,
   .lumaria-story-sticker-anchor) und wird position:absolute knapp
   AUSSERHALB der linken/rechten Kante der 640px breiten Textspalte
   platziert (right:100%/left:100% + Aussenabstand -- dadurch komplett
   ausserhalb der Lesebreite, kann den Text nie ueberdecken, unabhaengig
   von der vertikalen top-Position). .hero hat zwar overflow:hidden, ist
   aber randlos ueber die volle Viewport-Breite gespannt (kein max-width
   auf main/body), wodurch ab 1024px ausreichend freie Flaeche links/
   rechts der Textspalte bleibt (mind. ~190px pro Seite bei 1024px
   Viewport-Breite). Unterhalb 1024px komplett ausgeblendet, da dort kein
   sauberer Platz neben der schmaleren Textspalte waere und der Text nie
   schmaler werden soll. Loomus-Flugbereich, das grosse Wordmark-Bild oben
   und der Feder-Schreibeffekt am Schlusssatz bleiben unberuehrt, da die
   Sticker gezielt an anderen, eigenen Absaetzen haengen. */
.lumaria-story-sticker {
  display: none;
}

@media (min-width: 1024px) {
  .lumaria-story-sticker-anchor {
    position: relative;
  }

  .lumaria-story-sticker {
    display: block;
    position: absolute;
    height: auto;
    pointer-events: none;
    opacity: 0.97;
  }

  .lumaria-story-sticker-keim {
    width: 68px;
    top: 10%;
    right: 100%;
    margin-right: 26px;
  }

  .lumaria-story-sticker-feder {
    width: 66px;
    top: 38%;
    left: 100%;
    margin-left: 28px;
  }
}

.button-row {
  display: flex;
  gap: 1rem;
  justify-content: center;
  flex-wrap: wrap;
}

.btn {
  display: inline-block;
  padding: 0.75rem 1.8rem;
  border-radius: 999px;
  font-family: var(--font-heading);
  font-size: 1rem;
  border: 1px solid var(--color-gold);
}

.btn-primary {
  background: var(--color-gold);
  color: var(--color-ink-deep);
}

.btn-primary:hover {
  background: var(--color-gold-light);
  color: var(--color-ink-deep);
}

.btn-outline {
  color: var(--color-gold-light);
}

.btn-outline:hover {
  background: rgba(var(--color-gold-rgb), 0.12);
  color: var(--color-parchment);
}

/* Sections */

.section {
  max-width: 900px;
  margin: 0 auto;
  padding: 3.5rem 1.5rem;
}

.section-narrow {
  max-width: 700px;
}


.divider {
  width: 60px;
  height: 2px;
  background: var(--color-gold);
  margin: 1.2rem auto 2rem;
  border: none;
}

.divider.left {
  margin-left: 0;
}

.lumaria-map-image {
  display: block;
  max-width: 900px;
  width: 100%;
  height: auto;
  margin: 0 auto;
  border-radius: 14px;
  box-shadow: 0 12px 32px rgba(0, 0, 0, 0.15);
}

/* Neue Ueberschrift-Grafik ersetzt den bisherigen einfachen Text-H1 +
   Trennstrich; deutlich groesser als vorher, mittig, viel Luft zum
   oberen Rand. */
.lumaria-karte-heading-img {
  display: block;
  width: 82%;
  max-width: 720px;
  height: auto;
  margin: 0.4rem auto 1.8rem;
}

@media (max-width: 640px) {
  .lumaria-karte-heading-img {
    width: 94%;
  }
}

/* "Reise-Komposition" zwischen Einfuehrungstext und der grossen
   Lumaria-Karte -- nutzt den bereits vorhandenen Section-Zwischenraum
   (keine zusaetzliche Hoehe erzeugt). .lumaria-karte-journey ist der
   zentrale, schmalere Anker (680px) fuer Route + Einladungssatz in
   normalem Textfluss; die drei Kartografie-Sticker haengen mit der
   gleichen "Hanging-Margin"-Technik wie an anderer Stelle im Projekt
   (position:absolute + left/right:calc(100% + Xpx)) an diesem Anker,
   landen dadurch in einem MODERATEN Abstand zur Mitte (nicht am
   aeussersten Seitenrand, da .lumaria-karte-journey selbst schon
   schmaler ist als die 900px breite Section). Bewusst asymmetrisch:
   unterschiedliche Seiten, Hoehen und Groessen statt einer Reihe.
   Kein overflow/clip-path auf .lumaria-karte-journey -- Sicherheit
   kommt aus der Section-Trennung (Text/Ueberschrift liegen in einer
   eigenen Section DAVOR, die Karte in einer eigenen Section DANACH)
   und aus moderaten top-Werten innerhalb dieses Abschnitts. */
.lumaria-karte-journey {
  position: relative;
  max-width: 680px;
  margin: 0 auto;
}

.lumaria-karte-sticker {
  position: absolute;
  display: block;
  pointer-events: none;
  z-index: 1;
}

.lumaria-karte-sticker img {
  display: block;
  width: 100%;
  height: auto;
}

.lumaria-karte-sticker-compass {
  left: calc(100% + 20px);
  top: -15px;
  width: 88px;
}
.lumaria-karte-sticker-compass img {
  animation: lumaria-karte-glow-pulse 4.5s ease-in-out infinite;
}

.lumaria-karte-sticker-scroll {
  right: calc(100% + 26px);
  top: 75px;
  width: 104px;
}

.lumaria-karte-sticker-telescope {
  left: calc(100% + 34px);
  top: 210px;
  width: 92px;
}
.lumaria-karte-sticker-telescope img {
  animation: lumaria-karte-glint-pulse 5.5s ease-in-out infinite;
}

.lumaria-karte-sticker-spark {
  position: absolute;
  color: #f3d998;
  font-size: 0.7rem;
  animation-duration: 2.8s;
}

@keyframes lumaria-karte-glow-pulse {
  0%, 100% { filter: drop-shadow(0 0 0 rgba(168, 123, 238, 0)); }
  50% { filter: drop-shadow(0 0 7px rgba(168, 123, 238, 0.55)); }
}

@keyframes lumaria-karte-glint-pulse {
  0%, 100% { filter: brightness(1); }
  50% { filter: brightness(1.12); }
}

@media (max-width: 900px) {
  .lumaria-karte-sticker {
    display: none;
  }
}

/* Goldene Reiseroute: klassische mask-image-linear-gradient-Reveal-
   Technik (dieselbe wie beim Loomus-Entdeckungspfad) -- -18%/118%
   als Start-/Endwert garantieren dank monotoner Clamping-Regel bei
   CSS-Gradient-Stops vollstaendig unsichtbar bei 0% und vollstaendig
   sichtbar bei 100%, ganz ohne SVG-Maske. --karte-reveal wird per JS
   ueber IntersectionObserver + requestAnimationFrame animiert (siehe
   Script vor </body>), sobald der Abschnitt in den Viewport kommt. */
.lumaria-karte-route {
  position: relative;
  display: block;
  width: 100%;
  margin: 0 auto 1.6rem;
}

.lumaria-karte-route-img {
  display: block;
  width: 100%;
  height: auto;
  mask-image: linear-gradient(90deg, #000 0%, #000 var(--karte-reveal, 0%), transparent calc(var(--karte-reveal, 0%) + 18%), transparent 100%);
  -webkit-mask-image: linear-gradient(90deg, #000 0%, #000 var(--karte-reveal, 0%), transparent calc(var(--karte-reveal, 0%) + 18%), transparent 100%);
}

.lumaria-karte-route-spark {
  color: #e9c77c;
  font-size: 0.85rem;
  animation-duration: 2.6s;
}

@media (prefers-reduced-motion: reduce) {
  .lumaria-karte-route-img {
    mask-image: none;
    -webkit-mask-image: none;
  }
}

/* Kleiner Entdecker-Satz zwischen Route und Karte. */
.lumaria-karte-invite {
  text-align: center;
  font-family: var(--font-heading);
  font-style: italic;
  color: var(--color-parchment);
  font-size: 1.05rem;
  margin: 0 0 0.3rem;
}

.lumaria-karte-invite-mark {
  display: block;
  margin-top: 0.5rem;
  color: #caa356;
  font-size: 0.8rem;
  letter-spacing: 0.15em;
}

/* Schwebender Papierfetzen: JS-gesteuerter reiner Vorwaertsflug
   (gleiche Technik wie die Eule/der Schmetterling auf "Der Ursprung
   von Lumaria" -- mehrere feste Bahnen, ein durchgehender Ease-
   Verlauf, einmalige Spiegelung je Flugrichtung, kein Zurueckspulen).
   Bleibt innerhalb von .lumaria-karte-journey (0-100% Breite/Hoehe),
   beruehrt dadurch nie Ueberschrift/Text (eigene Section davor) oder
   die grosse Karte (eigene Section danach). */
.lumaria-karte-scrap-flyer {
  position: absolute;
  top: 0;
  left: 0;
  width: 15%;
  max-width: 130px;
  display: none;
  pointer-events: none;
  opacity: 0;
  z-index: 2;
  will-change: transform, opacity, left, top;
}

.lumaria-karte-scrap-flyer img {
  display: block;
  width: 100%;
  height: auto;
}

@media (min-width: 640px) {
  .lumaria-karte-scrap-flyer {
    display: block;
  }
}

@media (prefers-reduced-motion: reduce) {
  .lumaria-karte-scrap-flyer {
    display: none;
  }
}

.map-placeholder {
  aspect-ratio: 16 / 9;
  max-width: 800px;
  margin: 0 auto;
  border: 1px dashed var(--color-gold);
  border-radius: 14px;
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
  padding: 1rem;
  color: var(--color-parchment-dim);
  font-family: var(--font-heading);
  font-style: italic;
  font-size: 1rem;
  background: rgba(var(--color-gold-rgb), 0.06);
}

/* Barrierefreiheit: visuell versteckt, aber für Screenreader/SEO vorhanden */

.visually-hidden {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

/* Lumaria: Bild-Überschrift "Tritt ein in Lumaria" -- breakout-and-
   center-Technik (dieselbe wie .lumaria-hint-image weiter unten):
   bewusst breiter als .hero-content (max-width:640px), damit die
   sehr breite Banner-Grafik (Seitenverhaeltnis ca. 3:1) gross und
   hochwertig wirkt statt auf 640px gestaucht zu werden. left:50% +
   translateX(-50%) zentriert sie unabhaengig von der schmalen
   Elternspalte; width:min(...) verhindert Ueberbreite auf sehr breiten
   Bildschirmen. AUSGETAUSCHTE Grafik (v2): die neue Datei hat rundum
   mehr Leerraum im Canvas selbst (die vorherige Version war oben/
   seitlich bereits innerhalb der Bilddatei angeschnitten), dadurch
   wirkt dieselbe angezeigte Breite bereits kleiner/luftiger als vorher
   -- height:auto + object-fit:contain erhalten das Seitenverhaeltnis
   garantiert verzerrungsfrei. */
/* Deutlich schmaler als die Vorgaengergrafik, obwohl der Schriftzug
   dadurch NICHT kleiner wird als frueher -- im Gegenteil, er bleibt
   gleich gross.
   Der Grund steckt im Bild selbst: Bei "Tritt ein in Lumaria" nahm der
   Schriftzug nur die mittleren 54 Prozent der Bildbreite ein, der Rest
   waren Ranken, Laternen und die Waldszene. Beim neuen Schriftband sind
   es nachgemessen 93 Prozent. Bei gleicher Breite waere die Schrift
   also fast doppelt so gross erschienen -- und genau so sah es auch
   aus.
   72vw mal 54 Prozent ergibt 39vw Schrift. Damit die Schrift wieder
   diese Groesse hat, braucht das neue Band 39 geteilt durch 0,93,
   also rund 42vw. Die Obergrenze folgt derselben Rechnung. */
.lumaria-tritt-ein-heading {
  display: block;
  position: relative;
  left: 50%;
  transform: translateX(-50%);
  max-width: none;
  width: min(790px, 42vw);
  height: auto;
  object-fit: contain;
  margin: 0.6rem auto 1.6rem;
}

/* Mobile (<=767px): das Bild-Canvas hat links/rechts breite dekorative
   Ranken/Laternen/den kleinen Drachen -- der eigentliche Schriftzug
   "Tritt ein in Lumaria" nimmt davon nur die mittleren ca. 54% ein.
   Statt proportional mit dem Viewport zu schrumpfen (vorher 72vw ohne
   eigene Mobile-Regel), wird die Grafik hier bewusst deutlich breiter
   als der Viewport dargestellt (Breakout ueber left:50%+translateX,
   wie bereits auf Desktop) -- die dekorativen Raender duerfen dabei
   ausserhalb des sichtbaren Bereichs liegen, der zentrale Schriftzug
   bleibt dadurch gross und gut lesbar statt zum Miniaturbanner zu
   schrumpfen. Kein overflow-x auf der Seite, da body/section-weit
   bereits Breakouts dieser Art sitewide unterstuetzt werden. */
/* Auf dem Handy stand die alte Grafik bewusst breiter als der
   Bildschirm (168vw), damit ihr schmaler Schriftzug nicht zum
   Miniaturbanner schrumpfte -- die Ranken am Rand durften dabei
   ausserhalb liegen.
   Das neue Band braucht diesen Kunstgriff nicht mehr: Seine Schrift
   fuellt es fast ganz aus. Nach derselben Rechnung wie oben
   (168vw mal 54 Prozent = 91vw Schrift, geteilt durch 0,93) genuegen
   rund 98vw -- es passt also praktisch genau auf den Bildschirm. */
@media (max-width: 767px) {
  .lumaria-tritt-ein-heading {
    width: 98vw;
    margin: 0.3rem auto 0.9rem;
  }
}

/* Loomus-Fluegelschlag: wird von .hero-loomus-img (Lumaria-Erklaerbereich,
   siehe weiter unten) wiederverwendet, deshalb bleibt dieses Keyframe
   trotz Entfernung der frueheren einmaligen Quer-Flug-Animation
   erhalten. */
@keyframes loomus-wingbeat {
  0%, 100% { transform: translateY(0) scaleX(1) scaleY(1) rotate(0deg); }
  25%      { transform: translateY(-2px) scaleX(0.94) scaleY(1.03) rotate(1.2deg); }
  50%      { transform: translateY(0.5px) scaleX(1.02) scaleY(0.98) rotate(0deg); }
  75%      { transform: translateY(-1.5px) scaleX(0.96) scaleY(1.02) rotate(-1.2deg); }
}

/* Ueberschrift-Grafik "Entdecke Lumaria" (Nutzergrafik) ersetzt die
   vorherige einfache Text-Ueberschrift; sitzt weiterhin innerhalb des
   <h2> (semantische Ueberschrift bleibt erhalten, nur der sichtbare
   Inhalt wird zur Grafik). Bewusst zurueckhaltende max-width, damit
   sie elegante Seitenueberschrift bleibt statt den Bildschirm zu
   dominieren; Abstand zum folgenden Inhalt ergibt sich bereits aus dem
   bestehenden h2- und .divider-Margin, daher hier keine zusaetzlichen
   Werte noetig. */
/* Kleines "magisches Fenster nach Lumaria": eigenstaendiger Video-Block
   zwischen Willkommenstext und "Entdecke Lumaria"-Ueberschrift. Bewusst in
   echtem Warmgold (nicht ueber var(--color-gold), das auf dieser Seite fuer
   das gruene Theme umdefiniert ist -- siehe Kommentar bei
   .lumaria-heart-ambient-spark), damit Rahmen/Glow tatsaechlich golden statt
   gruenlich wirken. Kein Kasten/Hintergrund: nur duenner Rahmen + weicher
   Schatten direkt um das Video, dadurch fuegt es sich in den mintgruenen
   Seitenhintergrund ein statt als Flaeche davor zu stehen. aspect-ratio
   haelt das Originalseitenverhaeltnis (700/576) und reserviert den Platz
   schon vor dem Laden der Metadaten, object-fit:contain verhindert
   jeglichen Bildausschnitt-Verlust, falls die tatsaechlichen Pixelmasse
   minimal abweichen. */
.lumaria-video-feature {
  padding: 1.5rem 1.5rem 0.5rem;
  text-align: center;
}

/* Bewusst klein wie ein eingebettetes Fenster (max-width 520px) statt
   eines grossen Hauptbereichs. Weder .lumaria-video-feature (nur Padding)
   noch <main> (keine eigene Breiten-/Flex-Regel) erzwingen irgendeine
   Mindest-/Vollbreite -- .lumaria-video-frame ist der einzige Ort, an dem
   die Breite dieses Videos entsteht, kann also durch margin:0 auto +
   max-width nicht wieder aufgezogen werden. aspect-ratio uebernimmt die
   Rolle von height:auto (identisches Ergebnis: Hoehe folgt IMMER exakt
   dem echten Seitenverhaeltnis, object-fit:contain auf .lumaria-video-el
   verhindert zusaetzlich jeglichen Zuschnitt/Zoom). Rahmen/runde Ecken
   unveraendert. */
.lumaria-video-frame {
  position: relative;
  width: 100%;
  max-width: 520px;
  margin: 0.75rem auto 1.25rem;
  aspect-ratio: 700 / 576;
  border-radius: 16px;
  overflow: hidden;
  border: 1.5px solid rgba(217, 169, 79, 0.7);
  box-shadow:
    0 0 0 1px rgba(217, 169, 79, 0.1),
    0 12px 34px rgba(217, 169, 79, 0.22);
  background: rgba(217, 169, 79, 0.05);
}

.lumaria-video-el {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: contain;
  background: transparent;
}

.lumaria-video-play {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: 62px;
  height: 62px;
  border-radius: 50%;
  border: 1.5px solid rgba(217, 169, 79, 0.85);
  background: rgba(255, 255, 255, 0.22);
  backdrop-filter: blur(3px);
  -webkit-backdrop-filter: blur(3px);
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  box-shadow: 0 6px 20px rgba(217, 169, 79, 0.35);
  transition: opacity 0.4s ease, transform 0.2s ease;
}

.lumaria-video-play:hover {
  transform: translate(-50%, -50%) scale(1.06);
}

.lumaria-video-play-icon {
  width: 22px;
  height: 22px;
  fill: #b8863a;
  margin-left: 3px;
}

.lumaria-video-frame.is-playing .lumaria-video-play {
  opacity: 0;
  pointer-events: none;
}

/* Reduziertes Top-Padding NUR fuer diese eine ".section"-Instanz (eigene
   Zusatzklasse, .section selbst bleibt sitweit unveraendert): direkt
   darueber liegt jetzt das Video-Fenster statt eines leeren Hero-Endes,
   das urspruengliche 3.5rem-Padding wuerde zusammen mit dessen eigenem
   Abstand zu viel Leerraum ergeben. */
.lumaria-entdecke-section {
  padding-top: 1.5rem;
  /* Nutzerkorrektur: Dropdown-Eintrag "Entdecke Lumaria" verlinkt jetzt
     auf lumaria.html#entdecke-lumaria -- scroll-margin-top gibt der
     Sprungmarke etwas Luft nach oben, damit die Ueberschrift beim
     Ansprung nicht exakt an der Viewport-Oberkante klebt (bzw. unter
     einer eventuell ueberlappenden Navigation verschwindet). */
  scroll-margin-top: 1.5rem;
}

@media (prefers-reduced-motion: reduce) {
  .lumaria-video-play {
    transition: opacity 0.2s ease;
  }
}

.lumaria-entdecke-heading-img {
  display: block;
  width: 100%;
  max-width: 700px;
  height: auto;
  margin: 0 auto;
}

/* Mobile (<=767px): das Canvas ist bereits knapp zugeschnitten (kaum
   Leerraum), daher genuegt hier ein einfacher, deutlicher Breakout
   statt der zusaetzlichen 640px-Regel -- macht die Schrift merklich
   groesser statt nur proportional zum Viewport zu schrumpfen. */
@media (max-width: 767px) {
  .lumaria-entdecke-heading-img {
    position: relative;
    left: 50%;
    transform: translateX(-50%);
    width: 122vw;
    max-width: none;
  }
}

@media (max-width: 640px) {
  .lumaria-video-play {
    width: 52px;
    height: 52px;
  }

  .lumaria-video-play-icon {
    width: 18px;
    height: 18px;
  }
}

/* Lumaria: gemalte Begruessungsszene (Emma, Loomus, Fina auf dem
   Baumstamm) im Bereich "Entdecke Lumaria". Ersetzt die vorherige
   Figurengruppe aus drei einzelnen Freistellern. Das Bild soll wirken,
   als sei es direkt Teil der Seite, nicht wie ein eingesetztes Foto --
   deshalb kein Rahmen, kein Schatten, keine Card-Flaeche, sondern ein
   weicher mask-image-Verlauf auf allen vier Seiten. .lumaria-welcome-
   scene-frame hat overflow:hidden UND keine eigene Hoehe (die ergibt
   sich aus dem Bild); .lumaria-welcome-scene-img wird per
   transform:scale(1.08) rein optisch ca. 8% groesser dargestellt als
   ihre Layout-Box, wodurch der tatsaechliche, harte Rand der PNG-Datei
   IMMER ausserhalb des sichtbaren Rahmens liegt -- sichtbar wird also
   nur der bereits laengst ausgeblendete (fast transparente) Teil des
   Verlaufs, nie eine echte Bildkante. Die Maske selbst blendet zur
   Bildmitte hin voll sichtbar (bis 65% des Ellipsen-Radius bleibt
   deckend, das deckt Emma/Loomus/Fina inkl. Rand komfortabel ab) und
   faellt danach weich bis 97% auf 0 ab. Da .section KEINE eigene
   Hintergrundfarbe hat (siehe .section weiter oben), scheint an den
   transparenten Stellen direkt der normale Seitenhintergrund (body,
   selbes Gruen wie der Rest der Seite) durch -- dadurch entsteht die
   Farbangleichung von selbst, ganz ohne zusaetzliche Tönungs-Ebene. */
.lumaria-welcome-scene {
  max-width: 600px;
  margin: 2rem auto 2.5rem;
  padding: 0 1rem;
  text-align: center;
}

/* .lumaria-welcome-frame-wrap traegt das Seitenverhaeltnis der vom
   Nutzer gelieferten floralen Rahmengrafik (1672x941); die Video-Box
   sitzt per Prozentwerten exakt in deren freier Mitte (aus der
   Originalgrafik vermessen). Bewusst dezenter als der Lumi-Baum-
   Rahmen auf "Ursprung von Lumaria" -- die Grafik selbst hat ein
   grosszuegigeres Fenster (Rahmen wirkt duenner/leichter). Die
   Rahmengrafik liegt als reines Overlay (pointer-events:none) darueber. */
.lumaria-welcome-frame-wrap {
  position: relative;
  width: 100%;
  aspect-ratio: 1672 / 941;
}

.lumaria-welcome-scene-frame {
  position: absolute;
  left: 6%;
  top: 8.3%;
  width: 87.3%;
  height: 83.2%;
  overflow: hidden;
}

.lumaria-welcome-scene-img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: contain;
  transform: scale(1.08);
  transform-origin: 50% 50%;
  mask-image: radial-gradient(ellipse 70% 60% at 50% 50%, black 0%, black 65%, transparent 97%);
  -webkit-mask-image: radial-gradient(ellipse 70% 60% at 50% 50%, black 0%, black 65%, transparent 97%);
}

.lumaria-welcome-frame-overlay {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  z-index: 1;
  pointer-events: none;
}

/* Schlussteil des Willkommenstextes ("dass in jedem Kind ein
   einzigartiges Leuchten steckt.") wird beim Sichtbarwerden einmalig
   von der bekannten Signatur-Feder (img/signature-feather.png,
   dieselbe Datei wie bei "Deine Martina" auf HOME) nachgezeichnet --
   exakt dieselbe Technik/Logik wie beim Schlusssatz auf "Ursprung von
   Lumaria" (Buchstaben-Spans, Federposition per getBoundingClientRect
   am letzten geschriebenen Zeichen gemessen, folgt dadurch automatisch
   dem tatsaechlichen, responsiven Zeilenumbruch). Anders als auf HOME
   verschwindet diese kleine Feder am Ende wieder vollstaendig. */
.lumaria-welcome-final-line {
  position: relative;
  display: inline-block;
}

.lumaria-welcome-final-char {
  opacity: 0;
  transition: opacity 0.05s linear;
}

.lumaria-welcome-final-char.is-written {
  opacity: 1;
}

.lumaria-welcome-final-feather {
  position: absolute;
  top: 0;
  left: 0;
  width: 32px;
  height: auto;
  pointer-events: none;
  filter: drop-shadow(0 2px 5px rgba(90, 70, 30, 0.28));
  will-change: transform, left, top;
}

@media (max-width: 900px) {
  .lumaria-welcome-final-feather {
    width: 28px;
  }
}

@media (max-width: 640px) {
  .lumaria-welcome-final-feather {
    width: 24px;
  }
}

.lumaria-welcome-final-sparks {
  position: absolute;
  inset: 0;
  pointer-events: none;
}

.lumaria-welcome-final-spark {
  position: absolute;
  width: 4px;
  height: 4px;
  border-radius: 50%;
  background: radial-gradient(circle, #fff6da 0%, #d9a94f 70%, transparent 100%);
  opacity: 0;
  transform: translate(-50%, -50%) scale(0.4);
  animation: lumaria-welcome-final-spark-pop 800ms ease-out forwards;
}

@keyframes lumaria-welcome-final-spark-pop {
  0% {
    opacity: 0;
    transform: translate(-50%, -50%) scale(0.4);
  }
  30% {
    opacity: 1;
    transform: translate(-50%, -50%) scale(1);
  }
  100% {
    opacity: 0;
    transform: translate(-50%, -60%) scale(0.3);
  }
}

.lumaria-welcome-final-flourish-mark {
  position: absolute;
  width: 70px;
  height: 16px;
  transform: translate(0, -50%);
  pointer-events: none;
  opacity: 0;
  transition: opacity 0.35s ease;
}

.lumaria-welcome-final-flourish-mark path {
  stroke-dasharray: 140;
  stroke-dashoffset: 140;
  transition: stroke-dashoffset 0.7s ease-out;
}

.lumaria-welcome-final-flourish-mark.is-drawing {
  opacity: 0.85;
}

.lumaria-welcome-final-flourish-mark.is-drawing path {
  stroke-dashoffset: 0;
}

.lumaria-welcome-final-flourish-mark.is-fading {
  opacity: 0;
}

@media (prefers-reduced-motion: reduce) {
  .lumaria-welcome-final-char {
    transition: none;
  }
}

@media (max-width: 640px) {
  .lumaria-welcome-scene {
    padding: 0 0.5rem;
  }
}

/* ================================================================ */
/* Lumaria: BattyFluffs in der "Bewohner Lumarias"-Kachel            */
/* (Rosa, Gruen, Gelb, Lila)                                         */
/* ================================================================ */

/* Gemeinsamer Rahmen fuer das Lumaria-Hintergrundvideo (dieselben
   generischen .site-header-bg-video/-overlay-Klassen wie bei HOME/
   Autorin). Die vier BattyFluffs sind von hier in die "Bewohner
   Lumarias"-Kachel weiter unten auf der Seite umgezogen (siehe
   .lumaria-tile-bewohner). Schriftlogo und Rundlogo wurden hier
   entfernt (sitewide Header-Ueberarbeitung, siehe Kommentar bei
   .autorin-header-wrap) -- dieselbe explizite Hoehe wie dort. */
.lumaria-header-wrap {
  position: relative;
  width: 100%;
  height: 460px;
  overflow: hidden;
}

@media (max-width: 900px) {
  .lumaria-header-wrap {
    height: 380px;
  }
}

@media (max-width: 640px) {
  .lumaria-header-wrap {
    height: 300px;
  }
}

/* Wie bei HOME/Autorin (siehe .home-header-wrap/.autorin-header-wrap
   .site-header-bg-overlay oben): dieselbe geteilte .site-header-bg-
   overlay liess das Header-Video auch hier auf "Entdecke Lumaria"
   milchig/ausgewaschen wirken statt kraeftig. Nur ueber diesen
   seiteneigenen Wrapper entfernt -- .lumaria-header-wrap kommt
   ausschliesslich in lumaria.html vor. */
.lumaria-header-wrap .site-header-bg-overlay {
  background: none;
}

/* Lumaria-Geschichte ("Ursprung von Lumaria") -- eigenes Header-Video
   NUR auf dieser Unterseite, gleiches Prinzip wie bei HOME/Autorin/
   Lumaria (dieselben generischen .site-header-bg-video/-overlay-
   Klassen). Diese Seite hat bewusst KEIN .brand-banner mit dem grossen
   Schriftlogo (das div ist in dieser HTML-Datei komplett entfernt,
   nicht nur ausgeblendet -- kein Leerraum, keine globale CSS-/Logo-
   Aenderung, andere Seiten behalten ihr eigenes .brand-banner
   unveraendert). Der Wrapper enthaelt dadurch nur noch .site-header
   (rundes Foto-Logo + Navigation), der Header wird dadurch kompakter. */
.lumaria-geschichte-header-wrap {
  position: relative;
  width: 100%;
  height: 460px;
  overflow: hidden;
}

@media (max-width: 900px) {
  .lumaria-geschichte-header-wrap {
    height: 380px;
  }
}

@media (max-width: 640px) {
  .lumaria-geschichte-header-wrap {
    height: 300px;
  }
}

/* Wie bei HOME/Autorin/Lumaria (siehe .site-header-bg-overlay-
   Ueberschreibungen oben): dieselbe geteilte .site-header-bg-overlay
   liess das Header-Video auch hier auf "Ursprung von Lumaria"
   milchig/ausgewaschen wirken statt kraeftig. Nur ueber diesen
   seiteneigenen Wrapper entfernt -- .lumaria-geschichte-header-wrap
   kommt ausschliesslich in lumaria-geschichte.html vor. */
.lumaria-geschichte-header-wrap .site-header-bg-overlay {
  background: none;
}

/* "Songs aus Lumaria" -- eigenes Header-Video NUR auf dieser Unterseite,
   exakt dieselbe Technik/Groesse wie .lumaria-geschichte-header-wrap
   (generische .site-header-bg-video/-overlay-Klassen, gleiche Hoehen-
   Staffelung ueber die Breakpoints). */
.lumaria-songs-header-wrap {
  position: relative;
  width: 100%;
  height: 460px;
  overflow: hidden;
  background: var(--color-ink);
}

@media (max-width: 900px) {
  .lumaria-songs-header-wrap {
    height: 380px;
  }
}

@media (max-width: 640px) {
  .lumaria-songs-header-wrap {
    height: 300px;
  }
}

.lumaria-songs-header-wrap .site-header-bg-overlay {
  background: none;
}

/* Nutzerkorrektur: weicher Ausblend-Uebergang am unteren Videorand,
   dieselbe Technik wie .zuckerstern-hero-video/.eltern-header-img (mask-
   image auf dem Video-Element selbst) -- darunter scheint die farblich
   passende Wrapper-Flaeche (background:var(--color-ink) oben, identisch
   zum Seitenhintergrund) durch, statt eines harten Rechteckschnitts zur
   Navigation/zum Erzaehlbereich. Nur ueber den page-eigenen Wrapper
   gebunden, betrifft also ausschliesslich lumaria-songs.html. */
.lumaria-songs-header-wrap .site-header-bg-video {
  -webkit-mask-image: linear-gradient(to bottom, #000 0%, #000 calc(100% - 110px), transparent 100%);
  mask-image: linear-gradient(to bottom, #000 0%, #000 calc(100% - 110px), transparent 100%);
}

@media (max-width: 640px) {
  .lumaria-songs-header-wrap .site-header-bg-video {
    -webkit-mask-image: linear-gradient(to bottom, #000 0%, #000 calc(100% - 60px), transparent 100%);
    mask-image: linear-gradient(to bottom, #000 0%, #000 calc(100% - 60px), transparent 100%);
  }
}

/* Ueberschrift-Grafik "Hoer hin - wie Lumaria klingt!" -- exakt dieselbe
   Groessen-/Abstands-Logik wie .lumaria-karte-heading-img (720px Deckel,
   responsive Breite, kein Verzerren durch height:auto). Nutzerkorrektur:
   die floralen Randmotive (Schmetterlinge, Federn) reichten in der
   Original-Grafik bis an den harten Bildrand -- exakt dieselbe Zwei-
   Verlaufs-mask-image-Technik wie .home-hero-illustration-img faedet
   jetzt alle vier Kanten weich aus, statt sie rechteckig abzuschneiden. */
.lumaria-songs-heading-img {
  display: block;
  width: 82%;
  max-width: 720px;
  height: auto;
  margin: 0.4rem auto 1.8rem;
  mask-image:
    linear-gradient(to right, transparent 0%, black 18%, black 82%, transparent 100%),
    linear-gradient(to bottom, transparent 0%, black 14%, black 76%, transparent 100%);
  mask-composite: intersect;
  -webkit-mask-image:
    linear-gradient(to right, transparent 0%, black 18%, black 82%, transparent 100%),
    linear-gradient(to bottom, transparent 0%, black 14%, black 76%, transparent 100%);
  -webkit-mask-composite: source-in;
}

@media (max-width: 640px) {
  .lumaria-songs-heading-img {
    width: 94%;
  }
}

/* --- Ueberschrift der Mitsing-Seite ----------------------------------
   Sieht aus wie die der Songs-Seite, braucht aber ANDERE Behandlung:
   Beim Songs-Titel fuellt das Motiv die gesamte Bildflaeche bis in die
   Ecken; dort sorgt die weich auslaufende Maske dafuer, dass es nicht
   wie ein aufgeklebter Kasten wirkt. Dieses Bild hat schon von sich aus
   durchsichtige Raender -- das Motiv sitzt nur im mittleren Band
   (senkrecht etwa zwischen 22 und 86 Prozent). Dieselbe Maske
   darueberzulegen hat den Schriftzug deshalb fast vollstaendig
   weggeblendet.
   Hier genuegt ein schmaler seitlicher Verlauf, der allein den harten
   Saum am linken und rechten Bildrand aufloest. */
.lumaria-singen-heading-img {
  display: block;
  width: 86%;
  max-width: 760px;
  height: auto;
  margin: 0.2rem auto 1.4rem;
  mask-image: linear-gradient(to right, transparent 0%, black 6%, black 94%, transparent 100%);
  -webkit-mask-image: linear-gradient(to right, transparent 0%, black 6%, black 94%, transparent 100%);
}

@media (max-width: 640px) {
  .lumaria-singen-heading-img {
    width: 96%;
  }
}

/* Nutzerkorrektur: Container/Layout komplett neu gefasst, da der Text
   vorher "abgeschnitten" wirkte -- Ursache war clip-path auf einem
   display:inline-Span. Bei mehrzeiligem Umbruch zerfaellt ein inline-
   Element in mehrere Fragmente, und clip-path bezieht sich dann nur auf
   die (unzuverlaessige) Gesamt-Bounding-Box statt auf jede Zeile einzeln
   -- das liess Teile des Textes verschwinden. Jetzt display:block auf
   dem Textelement: clip-path wirkt auf die GESAMTE Textbox inkl. aller
   Zeilen gleichzeitig (ein weicher Vorhang-Effekt von links nach
   rechts), der Endzustand zeigt garantiert den kompletten Satz. Eigener
   Container mit expliziter max-width/padding/line-height, damit auf
   Mobile ausreichend Platz zum Umbrechen bleibt. Statt des Notenschluessel-
   Icons jetzt die bereits sitewide verwendete goldene Feder
   (img/feather-gold.png, siehe z.B. lumaria.html). Nur innerhalb von
   @media (prefers-reduced-motion:no-preference) aktiv -- sonst ist der
   Text von Anfang an vollstaendig sichtbar/statisch. */
.lumaria-songs-write-on {
  position: relative;
  max-width: 620px;
  margin: 0 auto;
  padding: 0 1rem;
}

.lumaria-songs-write-on-text {
  display: block;
  line-height: 1.65;
}

.lumaria-songs-write-on-feather,
.lumaria-songs-write-on-sparkle {
  display: none;
}

@media (prefers-reduced-motion: no-preference) {
  .lumaria-songs-write-on-text {
    clip-path: inset(0 100% 0 0);
    animation: lumaria-songs-write-reveal 3.6s ease-out forwards;
  }

  @keyframes lumaria-songs-write-reveal {
    to {
      clip-path: inset(0 0 0 0);
    }
  }

  .lumaria-songs-write-on-feather {
    display: block;
    position: absolute;
    top: -0.6rem;
    left: 0;
    width: 24px;
    height: auto;
    filter: drop-shadow(0 0 3px rgba(201, 162, 77, 0.85)) drop-shadow(0 0 7px rgba(201, 162, 77, 0.5));
    pointer-events: none;
    animation: lumaria-songs-write-cursor 3.6s ease-out forwards;
  }

  @keyframes lumaria-songs-write-cursor {
    0% {
      left: 0%;
      opacity: 1;
      transform: rotate(-12deg);
    }
    90% {
      left: 96%;
      opacity: 1;
      transform: rotate(-12deg);
    }
    100% {
      left: 100%;
      opacity: 0;
      transform: rotate(-12deg);
    }
  }

  .lumaria-songs-write-on-sparkle {
    display: block;
    position: absolute;
    top: -0.3rem;
    width: 8px;
    height: 8px;
    border-radius: 50%;
    background: #e3c583;
    filter: drop-shadow(0 0 3px rgba(227, 197, 131, 0.9)) drop-shadow(0 0 7px rgba(227, 197, 131, 0.6));
    opacity: 0;
    pointer-events: none;
    animation: lumaria-songs-write-sparkle 0.9s ease-out forwards;
  }

  @keyframes lumaria-songs-write-sparkle {
    0% {
      opacity: 0;
      transform: scale(0.4);
    }
    40% {
      opacity: 0.9;
      transform: scale(1);
    }
    100% {
      opacity: 0;
      transform: scale(0.5);
    }
  }
}

/* Songkarten-Grundgeruest (Nutzervorgabe): 1 Spalte mobil, 2 Spalten ab
   640px -- vier Karten ergeben so zwei Reihen zu je zwei Karten. Karten
   uebernehmen bewusst dieselbe Creme-Flaeche/Gold-Rahmen/Schatten-Sprache
   wie .lumaria-tile (gleiche --surface-rgb/--color-gold-rgb-Variablen),
   damit sie sich "maerchenhaft" nahtlos einfuegen, ohne einen neuen
   Kartenstil zu erfinden. Noch KEINE Audiofunktion/kein Player -- der
   "Anhoeren"-Button ist der bereits bestehende, generische .btn.btn-
   primary (wie an anderer Stelle der Seite), nur sichtbar/klickbar,
   ohne Handler. */
.lumaria-songs-list {
  display: grid;
  grid-template-columns: 1fr;
  gap: 1.75rem;
}

@media (min-width: 640px) {
  .lumaria-songs-list {
    grid-template-columns: 1fr 1fr;
  }
}

/* Nutzerkorrektur: Karten optisch hochwertiger/"maerchenhafter" --
   Cover deutlich groesser, echtes Gold (fester Hex-Ton, NICHT die
   theme-eigene --color-gold-Variable, die auf dieser Pastellgruen-Seite
   auf Gruen umdefiniert ist) fuer Cover-Rahmen/Glow, Notenzeile und
   Button-Umrandung, wie vom Nutzer ausdruecklich gewuenscht. Breite/
   Spaltenraster (.lumaria-songs-list oben) bleiben unveraendert, nur
   die Karten-INNENHOEHE waechst moderat mit dem groesseren Cover und
   der neuen Notenzeile. */
.lumaria-song-card {
  position: relative;
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
  gap: 0.4rem;
  padding: 1.5rem 1.4rem 1.7rem;
  background: rgba(var(--surface-rgb), var(--surface-alpha));
  border: 1px solid rgba(var(--color-gold-rgb), 0.35);
  border-radius: 18px;
  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.07);
  overflow: hidden;
}

/* Sehr dezentes, transparentes Notenschluessel-Wasserzeichen im
   Kartenhintergrund -- liegt per z-index HINTER allen echten Inhalten,
   stoert daher nirgends die Lesbarkeit. */
.lumaria-song-card::before {
  content: "";
  position: absolute;
  right: -18px;
  bottom: -22px;
  width: 150px;
  height: 150px;
  background-color: #c9a24d;
  opacity: 0.07;
  -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M14 3v10.55A4 4 0 1 0 16 17V7h4V3h-6Z'/%3E%3C/svg%3E");
  mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M14 3v10.55A4 4 0 1 0 16 17V7h4V3h-6Z'/%3E%3C/svg%3E");
  -webkit-mask-repeat: no-repeat;
  mask-repeat: no-repeat;
  -webkit-mask-size: contain;
  mask-size: contain;
  pointer-events: none;
  z-index: 0;
}

.lumaria-song-card > * {
  position: relative;
  z-index: 1;
}

.lumaria-song-cover {
  width: 220px;
  max-width: 100%;
  height: 220px;
  margin-bottom: 0.3rem;
  overflow: hidden;
  background: rgba(201, 162, 77, 0.12);
  border: 2px solid #c9a24d;
  border-radius: 16px;
  box-shadow: 0 0 0 4px rgba(201, 162, 77, 0.14), 0 6px 18px rgba(201, 162, 77, 0.22);
  transition: transform 0.3s ease, box-shadow 0.3s ease;
}

.lumaria-song-card:hover .lumaria-song-cover {
  transform: translateY(-3px);
  box-shadow: 0 0 0 4px rgba(201, 162, 77, 0.2), 0 10px 22px rgba(201, 162, 77, 0.3);
}

.lumaria-song-cover-img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
}

@media (max-width: 480px) {
  .lumaria-song-cover {
    width: 180px;
    height: 180px;
  }
}

/* Nutzerkorrektur: Notenzeile/Titel/Beschreibung/Badge komplett durch
   eine einzelne Titel-/Textgrafik pro Song ersetzt (Songtitel, goldene
   Notenschluessel-/Notenverzierung und Kurztext sind bereits Teil der
   PNGs) -- daher keine der vorherigen HTML-Textelemente mehr, um keine
   doppelten Inhalte zu erzeugen. Zweite, dezentere Grafik-Generation
   (lumaria-song-title2-*, breiteres Querformat statt der frueheren
   Plakette/Wolke-Form) loest die erste Generation ab; beide Saetze
   wurden vorab auf ihren tatsaechlichen Alpha-Inhalt zugeschnitten (die
   Originaldateien hatten viel ungenutzten transparenten Rand), damit
   sie bei width:100% gross/lesbar erscheinen statt winzig in einer
   grossen leeren Flaeche. Etwas breitere max-width als zuvor, damit der
   freie Platz in der Kachel besser genutzt wird. */
.lumaria-song-title-img {
  display: block;
  width: 100%;
  max-width: 330px;
  height: auto;
  margin: 0.5rem auto;
  object-fit: contain;
}

.lumaria-song-btn {
  margin-top: 0.2rem;
  background: linear-gradient(160deg, #6b3fa0, #4a1f6b);
  border: 1.5px solid #c9a24d;
  color: #fdf6ea;
}

.lumaria-song-btn:hover,
.lumaria-song-btn:focus-visible {
  background: linear-gradient(160deg, #7c4bb5, #5a2680);
  border-color: #e3c583;
  color: #fdf6ea;
}

/* Nutzerkorrektur: schwebende Musik-Deko -- main wird zum Positionier-
   Kontext fuer die absolut positionierten Deko-Bilder (Prozentwerte in
   top/left/right der einzelnen Items loesen dadurch gegen die
   tatsaechliche Gesamthoehe von <main> auf, verteilen sich also ueber
   die ganze Seite statt nur den sichtbaren Viewport). Ausschliesslich
   ueber .lumaria-songs-page gebunden -- betrifft also garantiert keine
   andere Seite. Die beiden <section>-Kinder bekommen bewusst
   position:relative + z-index:1, damit sie (trotz spaeterer Position im
   Stacking-Kontext) ÜBER der zuerst im Quelltext stehenden .lumaria-
   songs-deco liegen -- ohne diese explizite Regel wuerden positionierte
   Elemente (auch mit z-index:auto) grundsaetzlich NACH normalen
   Blockkindern gemalt und damit ueber Titel/Karten/Buttons liegen. */
/* --- Lumarias Klangwiese: Hintergrund der beiden Lieder-Seiten --------
   Beide Seiten -- "Lieder zum Mitsingen" im Kids Club und "Songs aus
   Lumaria" -- bekommen dasselbe Bild, damit man auf den ersten Blick
   sieht, dass die Bereiche zusammengehoeren.

   Er liegt auf <main>, nicht auf <body>: So bleibt die Kopfleiste mit
   Logo und Navigation frei, genau wie bei den Spieleseiten.

   Und er ist bewusst leise: Darueber liegt ein cremeweiss-fliederner
   Schleier, der rund drei Viertel deckt. Vom Bild bleiben so etwa
   dreissig Prozent stehen -- Notenlinien, Laternen und Blueten sind
   noch zu ahnen, treten aber hinter Ueberschrift, Songkarten und
   Knoepfen zurueck. WICHTIG: Der Schleier liegt auf dem BILD, nicht auf
   der Seite. Die Inhalte darueber bleiben voll deckend; eine
   verringerte Deckkraft des ganzen Containers haette auch sie
   ausgeblichen. */
body.singen-page main,
body.lumaria-songs-page main {
  position: relative;
  background-image: url("../img/klangwiese-hintergrund.jpg?v=1");
  background-size: cover;
  background-position: center top;
  background-attachment: fixed;
  background-repeat: no-repeat;
}

body.singen-page main::before,
body.lumaria-songs-page main::before {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(180deg, rgba(253, 250, 246, 0.75), rgba(246, 241, 250, 0.71));
  pointer-events: none;
  z-index: 0;
}

/* Nur fuer die Kids-Club-Seite: Auf der Songs-Seite regelt das die
   bestehende Regel fuer main > section weiter unten -- dort haengt
   ausserdem die schwebende Musik-Deko drin, die ihre eigene Lage
   behalten muss. */
body.singen-page main > * {
  position: relative;
  z-index: 1;
}

/* Auf dem Handy ist background-attachment:fixed unzuverlaessig -- viele
   Browser ignorieren es oder ruckeln beim Scrollen. Dort scrollt das
   Bild deshalb bewusst mit. */
@media (max-width: 900px) {
  body.singen-page main,
  body.lumaria-songs-page main {
    background-attachment: scroll;
  }
}

.lumaria-songs-page main {
  position: relative;
}

.lumaria-songs-page main > section {
  position: relative;
  z-index: 1;
}

.lumaria-songs-deco {
  position: absolute;
  inset: 0;
  overflow: hidden;
  pointer-events: none;
  z-index: 0;
}

.lumaria-song-deco-item {
  position: absolute;
  display: block;
  height: auto;
  opacity: 0.85;
  animation-name: lumaria-song-deco-float;
  animation-timing-function: ease-in-out;
  animation-iteration-count: infinite;
}

@keyframes lumaria-song-deco-float {
  0% {
    transform: translate(0, 0) rotate(0deg);
  }
  25% {
    transform: translate(6px, -14px) rotate(4deg);
  }
  50% {
    transform: translate(-5px, -4px) rotate(-3deg);
  }
  75% {
    transform: translate(-9px, 9px) rotate(3deg);
  }
  100% {
    transform: translate(0, 0) rotate(0deg);
  }
}

/* Mobile-Items sind horizontal zentriert (kein seitlicher Freiraum neben
   den Karten vorhanden), die Basis-transform der Animation kommt daher
   ueber ein zusaetzliches translateX(-50%) auf dem Element selbst nicht
   in Konflikt, da die Animation nur ADDITIV kleine Verschiebungen ueber
   die bereits per left:50% gesetzte Grundposition legt -- der Bezugs-
   punkt bleibt links oben am Element, das zentrierende translateX(-50%)
   wird deshalb separat auf einen Wrapper-losen Trick verzichtet und
   stattdessen die Breite selbst zur Zentrierung genutzt (margin-left
   negativ = halbe Breite), damit die Keyframes unveraendert bleiben. */
.lumaria-song-deco-mobile {
  display: none;
}

@media (min-width: 900px) {
  .lumaria-song-deco-side {
    display: block;
  }

  .lumaria-song-deco-wide-only {
    display: none;
  }
}

@media (min-width: 1300px) {
  .lumaria-song-deco-wide-only {
    display: block;
  }
}

@media (max-width: 899px) {
  .lumaria-song-deco-side {
    display: none;
  }

  .lumaria-song-deco-mobile {
    display: block;
  }
}

/* Nutzerkorrektur: drei tanzende Figuren (Emma/Loomus/Fina) -- duerfen im
   Gegensatz zur Musik-Deko frei ueber den gesamten Kartenbereich verteilt
   sein, auch zwischen/ueber den Audiokacheln (liegen trotzdem per
   Stacking-Reihenfolge HINTER dem eigentlichen Kartentext, siehe Kommentar
   im HTML). Deutlich schnellere, lebendigere Tanzbewegung als die
   Musik-Deko (Wippen + kleine Seitwaertsbewegung + Drehung + Bounce statt
   nur sanftes Schweben), jeweils eigene animation-delay je Figur fuer
   einen natuerlichen, unsynchronisierten Eindruck. */
/* Dritte Nutzerkorrektur: die Bewegung wirkte "mechanisch/starr", weil die
   fruehere Animation aus wenigen, weit auseinanderliegenden Wegpunkten
   (bis zu 120px Sprung) mit ease-in-out PRO Segment bestand -- an jedem
   Keyframe-Stopp bremst ease-in-out auf Geschwindigkeit 0 ab und
   beschleunigt neu, was sich bei so grossen Spruengen wie ein kurzes
   Anhalten/Ruckeln anfuehlt. Die Keyframes unten sind stattdessen an
   echten Sinuskurven abgetastet (alle 10%, sin/cos mit unterschiedlicher
   Frequenz/Phase je Achse und Figur) -- dadurch ist die Distanz zwischen
   benachbarten Stopps immer aehnlich klein UND die Kurve ist von Natur aus
   bereits weich/beschleunigt-verzoegert. animation-timing-function:linear
   verbindet die Stopps deshalb bewusst geradlinig statt mit zusaetzlichem
   ease-in-out, da dieses sonst die bereits im Kurvenverlauf enthaltene
   sanfte Beschleunigung erneut ueberlagern und wieder ruckeln lassen
   wuerde. Amplituden sind bewusst klein (max. ~20px, kein 120px-Sprung
   mehr), damit die Figuren an ihrem neuen, naeher an Ueberschrift/Text
   gerueckten Platz sanft schweben/wippen statt grossflaechig zu wandern. */
/* Nutzerkorrektur: eigener, auf den oberen Erzaehlbereich begrenzter
   Positionier-Kontext -- .lumaria-songs-intro-wrap umschliesst NUR
   Ueberschrift+Einleitungstext (nicht mehr ganz <main>), die Tanz-Ebene
   ist relativ dazu inset:0 UND overflow:hidden, damit die Figuren den
   Kartenbereich weder erreichen noch dort hinein "ausschlagen" koennen.
   z-index:1 haelt den Wrapper auf gleicher Stapelebene wie die spaeter
   im Quelltext stehende Karten-Section (ebenfalls z-index:1), beide
   liegen dadurch sauber ueber der seitenweiten Musik-Deko (z-index:0). */
.lumaria-songs-intro-wrap {
  position: relative;
  z-index: 1;
}

/* Vierte Nutzerkorrektur: die Figuren sollen frei ueber Ueberschrift und
   Einleitungstext hinwegtanzen duerfen und dabei IMMER sichtbar vor
   diesen Flaechen liegen, nie dahinter verschwinden. .lumaria-songs-
   dancers bekommt dafuer einen deutlich hoeheren z-index (999) als der
   Text-/Inhaltscontainer direkt darunter (siehe naechste Regel, z-index
   5) -- beide sind Kinder desselben position:relative-Story-Bereichs
   (.lumaria-songs-intro-wrap), wodurch die Reihenfolge unabhaengig von
   eventuellen eigenen Stacking-Contexts innerhalb des Textblocks
   (z.B. durch clip-path/transform auf .lumaria-songs-write-on-text)
   garantiert eingehalten wird.
   Fuenfte Nutzerkorrektur: das bisherige overflow:hidden auf DIESEM
   Element war die eigentliche Ursache, warum Emma beim Tanzen sichtbar
   "hinter" dem oberen Bereich verschwand -- ihre Sway-Animation bewegt
   sie bis zu 25px ueber ihre top:4%-Basisposition hinaus nach oben, was
   bei einer ca. 400-450px hohen .lumaria-songs-intro-wrap oft schon
   ueber deren Oberkante hinausragt und dort hart abgeschnitten wurde
   (sichtbar wie ein Verschwinden, obwohl es tatsaechlich Clipping und
   kein z-index-Problem war). overflow:visible entfernt dieses Clipping
   komplett. Die Eingrenzung auf den gruenen Erzaehlbereich (kein
   Erreichen von Navigation/Headervideo/Kartenbereich) kommt seitdem
   nicht mehr aus overflow:hidden, sondern strukturell daraus, dass
   .lumaria-songs-intro-wrap im Dokumentfluss ohnehin erst NACH Header
   und Navigation beginnt und lange VOR dem Kartenbereich endet -- die
   Animationsamplituden aller drei Figuren (max. ~38px) sind bewusst
   klein genug, dass selbst der Ueberstand ueber die Wrapper-Kanten
   hinaus nirgendwo in die Naehe von Navigation oder Karten reicht. */
.lumaria-songs-dancers {
  position: absolute;
  inset: 0;
  overflow: visible;
  pointer-events: none;
  z-index: 999;
}

.lumaria-songs-intro-wrap > section {
  position: relative;
  z-index: 5;
}

/* Unter 900px gibt es neben dem 700px breiten .section-narrow-Textblock
   keinen freien Rand mehr (Text nimmt praktisch die volle Breite ein) --
   ohne Rand wuerden die Figuren zwangslaeufig den Einleitungstext
   ueberlagern, gemessen z.B. bei 375px. Deshalb dort ausgeblendet.
   Schwelle bewusst hoeher als bei der Musik-Deko (.lumaria-song-deco-
   side, 900px): die Ankerpositionen der Figuren sind seit der
   Nutzerkorrektur "naeher an Text" ueber calc(50% - 495px) fest an den
   700px breiten Textblock gebunden statt an einen Prozentwert vom
   Wrapper -- unter ca. 990px Viewportbreite wuerde das rechnerisch zu
   einer negativen/linksueberlaufenden Position fuehren (Emma wuerde am
   linken Rand abgeschnitten). 1023px liegt sicher darueber. Die
   Ankerpositionen sind seit der vierten Nutzerkorrektur wieder
   Prozentwerte (kein calc(50% - Xpx) mehr) -- die Schwelle bleibt
   trotzdem bei 1023px, da unter 900px ohnehin kein sinnvoller
   Bewegungsspielraum neben dem dann fast vollbreiten Text existiert. */
@media (max-width: 1023px) {
  .lumaria-songs-dancers {
    display: none;
  }
}

.lumaria-song-dancer {
  position: absolute;
  display: block;
  height: auto;
  opacity: 0.92;
  pointer-events: none;
  animation-timing-function: linear;
  animation-iteration-count: infinite;
}

/* Vierte Nutzerkorrektur: die Figuren duerfen jetzt frei ueber den
   gesamten Erzaehlbereich wandern (auch ueber Ueberschrift/Text hinweg,
   siehe z-index-Regeln weiter oben) statt nur eng neben dem Textblock
   zu schweben -- Amplituden daher deutlich groesser als zuvor (bis
   ~38px statt ~15-20px), Grundprinzip (Sinuskurven alle 10% abgetastet,
   linear zwischen den Stopps verbunden) bleibt unveraendert, da genau
   das die "ruckelfreie" Wirkung erzeugt. */
/* Emma: sanftes, kreisendes Schweben (einfache Seitwaerts-Frequenz,
   doppelt so schnelle Auf-Ab-Bewegung ergibt einen natuerlichen kleinen
   Bogen pro Schritt) mit leicht nacheilender Drehung. */
.lumaria-song-dancer-emma {
  animation-name: lumaria-song-sway-emma;
  animation-duration: 7.2s;
}

@keyframes lumaria-song-sway-emma {
  0% {
    transform: translate(0, 0) rotate(8deg);
  }
  10% {
    transform: translate(19px, 25px) rotate(6deg);
  }
  20% {
    transform: translate(30px, 15px) rotate(2deg);
  }
  30% {
    transform: translate(30px, -15px) rotate(-2deg);
  }
  40% {
    transform: translate(19px, -25px) rotate(-6deg);
  }
  50% {
    transform: translate(0, 0) rotate(-8deg);
  }
  60% {
    transform: translate(-19px, 25px) rotate(-6deg);
  }
  70% {
    transform: translate(-30px, 15px) rotate(-2deg);
  }
  80% {
    transform: translate(-30px, -15px) rotate(2deg);
  }
  90% {
    transform: translate(-19px, -25px) rotate(6deg);
  }
  100% {
    transform: translate(0, 0) rotate(8deg);
  }
}

/* Loomus: froehliches Huepfen -- staerkerer vertikaler Ausschlag als
   Emma, mit dezentem "Squash & Stretch" (scale wird beim Hochschweben
   minimal groesser, beim Landen minimal kleiner). */
.lumaria-song-dancer-loomus {
  animation-name: lumaria-song-sway-loomus;
  animation-duration: 6s;
}

@keyframes lumaria-song-sway-loomus {
  0% {
    transform: translate(0, 0) rotate(0deg) scale(1);
  }
  10% {
    transform: translate(12px, -36px) rotate(5deg) scale(1.05);
  }
  20% {
    transform: translate(19px, -22px) rotate(8deg) scale(1.03);
  }
  30% {
    transform: translate(19px, 22px) rotate(8deg) scale(0.97);
  }
  40% {
    transform: translate(12px, 36px) rotate(5deg) scale(0.95);
  }
  50% {
    transform: translate(0, 0) rotate(0deg) scale(1);
  }
  60% {
    transform: translate(-12px, -36px) rotate(-5deg) scale(1.05);
  }
  70% {
    transform: translate(-19px, -22px) rotate(-8deg) scale(1.03);
  }
  80% {
    transform: translate(-19px, 22px) rotate(-8deg) scale(0.97);
  }
  90% {
    transform: translate(-12px, 36px) rotate(-5deg) scale(0.95);
  }
  100% {
    transform: translate(0, 0) rotate(0deg) scale(1);
  }
}

/* Fina: leichtes, schmetterlingshaftes Flattern -- zieht sich sanft
   nach oben und wieder zurueck, mit staerkerem Fluegel-Kippwinkel als
   Emma/Loomus, bleibt aber genauso ruckelfrei/sinusfoermig. */
.lumaria-song-dancer-fina {
  animation-name: lumaria-song-sway-fina;
  animation-duration: 6.6s;
}

@keyframes lumaria-song-sway-fina {
  0% {
    transform: translate(0, 0) rotate(-13deg);
  }
  10% {
    transform: translate(16px, -11px) rotate(-11deg);
  }
  20% {
    transform: translate(27px, -29px) rotate(-4deg);
  }
  30% {
    transform: translate(27px, -29px) rotate(4deg);
  }
  40% {
    transform: translate(16px, -11px) rotate(11deg);
  }
  50% {
    transform: translate(0, 0) rotate(13deg);
  }
  60% {
    transform: translate(-16px, -11px) rotate(11deg);
  }
  70% {
    transform: translate(-27px, -29px) rotate(4deg);
  }
  80% {
    transform: translate(-27px, -29px) rotate(-4deg);
  }
  90% {
    transform: translate(-16px, -11px) rotate(-11deg);
  }
  100% {
    transform: translate(0, 0) rotate(-13deg);
  }
}

@media (max-width: 640px) {
  .lumaria-song-dancer {
    max-width: 78px;
  }

  .lumaria-song-dancer-emma,
  .lumaria-song-dancer-loomus,
  .lumaria-song-dancer-fina {
    animation-duration: 4s;
  }
}

/* Alle vier BattyFluffs: absolut positioniert, mit pointer-events:none,
   damit sie nie Klicks blockieren, egal wo sie eingesetzt werden. */
.battyfluff-wrap {
  position: absolute;
  z-index: 3;
  pointer-events: none;
}

/* Drei verschachtelte Ebenen pro Figur, damit sich mehrere Bewegungen
   ueberlagern koennen, ohne sich gegenseitig zu ueberschreiben (eine
   einzelne .transform-Eigenschaft kann pro Element immer nur einen
   Endzustand haben -- deshalb NICHT mehrere animation-Werte mit
   ueberlappenden transform-Keyframes auf demselben Element mischen,
   sondern verschachteln, wie an anderen Stellen der Website bereits
   etabliert):
   1. .battyfluff-X-wrap  -- die grosse Flugbahn/Position (rein
      translate-basiert, bewusst OHNE rotate: die Figuren sollen
      aufrecht bleiben statt sich beim Richtungswechsel zu neigen).
   2. .battyfluff-X-body  -- Koerper-Wippen, in EINEM gemeinsamen
      Keyframe (battyfluff-body-sway) kombiniert, damit es nicht mit
      dem Blinzeln auf der naechsten Ebene kollidiert. AUSSCHLIESSLICH
      translateY/translateX -- bewusst ohne rotate(), skew() oder
      scaleX/scaleY: jede Form von Skalierung mit ungleichmaessigen
      X/Y-Werten liess die Figuren (mangels separater Bild-Ebene fuer
      Koerper/Fluegel) wie ein kurzes Einknicken/Verbeugen wirken,
      selbst ohne echte Rotation -- reine Verschiebung kann die Form
      dagegen prinzipiell nicht verzerren, die Figur bleibt so bei
      jedem Bewegungsschritt garantiert aufrecht.
   3. .battyfluff-X-img   -- das Blinzeln, ueber ein kurzes
      Abdunkeln (opacity) simuliert statt ueber scaleY: da es keine
      separate Bild-Ebene nur fuer die Augen gibt, wuerde ein
      geometrisches Zusammenziehen der GANZEN Abbildung ebenfalls wie
      ein Zusammensacken aussehen. Opacity veraendert dagegen nur die
      Sichtbarkeit, nie die Form.
   Alle vier haben unterschiedliche Taktung fuer die Wippen- und
   Blinzel-Ebene, damit keine zwei Figuren gleichzeitig dieselbe
   Bewegung machen -- das war der eigentliche Kritikpunkt ("bewegen
   sich fast nur als komplette Figur"). Aermchen/Fuesschen lassen sich
   ohne separate Bild-Ebenen fuer diese Koerperteile nicht einzeln
   ansteuern; sie bewegen sich zusammen mit dem Koerper-Wippen mit. */
.battyfluff-body {
  display: block;
}

.battyfluff-img {
  display: block;
  width: 100%;
  height: auto;
}

@keyframes battyfluff-body-sway {
  0%, 100% { transform: translate(0, 0); }
  25%      { transform: translate(-1px, -2px); }
  50%      { transform: translate(1px, 1px); }
  75%      { transform: translate(-1px, -1.5px); }
}

@keyframes battyfluff-blink {
  0%, 90%, 100% { opacity: 1; }
  94%           { opacity: 0.55; }
}

/* Alle vier Moosfluffs fliegen jetzt ausschliesslich innerhalb der
   "Bewohner Lumarias"-Kachel (.lumaria-tile-bewohner, geerbtes
   position:relative von .lumaria-tile), nicht mehr im Header. Sie
   bleiben bewusst im oberen, gemalten Szenenbereich der Kachel (bis
   ca. 40% Hoehe) und meiden damit die cremefarbene Textflaeche mit
   Titel/Beschreibung/Button darunter. Bewegungsdistanzen sind in
   Pixeln statt vw/vh angegeben, da die Kachel viel schmaler als ein
   Seiten-Header ist -- so bleiben die Flugwege bei jeder Kachelgroesse
   (230px bis groesserer Grid-Spalte) sicher innerhalb der Karte, ohne
   zu ueberlaufen. Jede Figur behaelt ihr eigenes Tempo, ihre eigene
   Wegform und ihren eigenen Start-Zeitversatz aus der Header-Version. */

/* Rosa Moosfluff (verspielt): oben links in der Kachel. Schnellere,
   lebhaftere Wippen-/Blinzel-Taktung passt zu seiner verspielten Art. */
.lumaria-tile-bewohner .battyfluff-pink-wrap {
  top: 6%;
  left: 12%;
  width: 15%;
  max-width: 46px;
  animation: battyfluff-pink-fly 30s ease-in-out infinite;
  animation-delay: 0s;
}

@keyframes battyfluff-pink-fly {
  0%    { transform: translate(0, 0); }
  20%   { transform: translate(14px, -9px); }
  40%   { transform: translate(22px, 4px); }
  55%   { transform: translate(10px, 13px); }
  58%   { transform: translate(11px, 13px); }  /* neugierig umsehen */
  75%   { transform: translate(-5px, 8px); }
  90%   { transform: translate(5px, -5px); }
  100%  { transform: translate(0, 0); }
}

.battyfluff-pink-body {
  animation: battyfluff-body-sway 2.4s ease-in-out infinite;
  animation-delay: 0.2s;
}

.battyfluff-pink-img {
  animation: battyfluff-blink 5.2s ease-in-out infinite;
  animation-delay: 0.6s;
}

/* Gruener Moosfluff (ruhiger Gastgeber): oben rechts in der Kachel.
   Traegste, ruhigste Wippen-/Blinzel-Taktung von allen vieren. */
.lumaria-tile-bewohner .battyfluff-green-wrap {
  top: 8%;
  left: 72%;
  width: 13%;
  max-width: 40px;
  animation: battyfluff-green-hover 25s ease-in-out infinite;
  animation-delay: 2s;
}

@keyframes battyfluff-green-hover {
  0%   { transform: translate(0, 0); }
  25%  { transform: translate(-11px, -7px); }
  50%  { transform: translate(-4px, 5px); }
  75%  { transform: translate(-14px, -2px); }
  100% { transform: translate(0, 0); }
}

.battyfluff-green-body {
  animation: battyfluff-body-sway 4.2s ease-in-out infinite;
  animation-delay: 1s;
}

.battyfluff-green-img {
  animation: battyfluff-blink 6.4s ease-in-out infinite;
  animation-delay: 0s;
}

/* Gelber Moosfluff (neugierig): mittig im oberen Szenenbereich der
   Kachel. Schnellste Wippen-/Blinzel-Taktung von allen vieren. */
.lumaria-tile-bewohner .battyfluff-yellow-wrap {
  top: 22%;
  left: 42%;
  width: 12%;
  max-width: 36px;
  animation: battyfluff-yellow-fly 24s ease-in-out infinite;
  animation-delay: 5s;
}

@keyframes battyfluff-yellow-fly {
  0%    { transform: translate(0, 0); }
  20%   { transform: translate(9px, -9px); }
  42%   { transform: translate(-8px, -4px); }
  46%   { transform: translate(-9px, -4px); }  /* kurzes Innehalten */
  64%   { transform: translate(5px, 9px); }
  82%   { transform: translate(-6px, 2px); }
  100%  { transform: translate(0, 0); }
}

.battyfluff-yellow-body {
  animation: battyfluff-body-sway 2s ease-in-out infinite;
  animation-delay: 1.4s;
}

.battyfluff-yellow-img {
  animation: battyfluff-blink 4.6s ease-in-out infinite;
  animation-delay: 1.1s;
}

/* Lila Moosfluff (traeumerisch): links, etwas tiefer im Szenenbereich,
   bleibt aber klar oberhalb der Textflaeche. Langsamste Wippen-Taktung
   und seltenstes Blinzeln von allen vieren. */
.lumaria-tile-bewohner .battyfluff-purple-wrap {
  top: 32%;
  left: 22%;
  width: 12%;
  max-width: 36px;
  animation: battyfluff-purple-fly 27s ease-in-out infinite;
  animation-delay: 3.5s;
}

@keyframes battyfluff-purple-fly {
  0%    { transform: translate(0, 0); }
  22%   { transform: translate(13px, -9px); }
  46%   { transform: translate(-9px, 7px); }
  70%   { transform: translate(9px, 9px); }
  100%  { transform: translate(0, 0); }
}

.battyfluff-purple-body {
  animation: battyfluff-body-sway 4.8s ease-in-out infinite;
  animation-delay: 2.1s;
}

.battyfluff-purple-img {
  animation: battyfluff-blink 8.5s ease-in-out infinite;
  animation-delay: 1.8s;
}

@media (prefers-reduced-motion: reduce) {
  .lumaria-tile-bewohner .battyfluff-pink-wrap,
  .lumaria-tile-bewohner .battyfluff-green-wrap,
  .lumaria-tile-bewohner .battyfluff-yellow-wrap,
  .lumaria-tile-bewohner .battyfluff-purple-wrap,
  .battyfluff-pink-body,
  .battyfluff-green-body,
  .battyfluff-yellow-body,
  .battyfluff-purple-body,
  .battyfluff-pink-img,
  .battyfluff-green-img,
  .battyfluff-yellow-img,
  .battyfluff-purple-img {
    animation: none;
  }
}

/* Lumaria: dezente statische Glitzersterne im Hero */

.lumaria-static-sparkle {
  color: var(--color-gold);
  font-size: 1rem;
  animation-duration: 3.2s;
}

/* Lumaria-Aura-Grafik: dient jetzt als magischer Uebergang MITTEN im
   Erzaehltext (zwischen dem "paedagogische Einrichtungen"-Absatz und
   dem abschliessenden "Willkommen in Lumaria"-Absatz), nicht mehr
   direkt unter dem Wordmark. Sie darf weiterhin deutlich breiter sein
   als die 640px schmale .hero-content-Spalte, in der sie liegt --
   position:relative + left:50% + translateX(-50%) ist die klassische
   Technik, um ein Element aus einem schmaleren Elternelement
   "ausbrechen" und dabei trotzdem zur Seite zentrieren zu lassen (der
   urspruengliche Platz in .hero-content bleibt fuer den Textfluss
   reserviert, nur die Darstellung wird versetzt). Funktioniert nur,
   weil .lumaria-hero (siehe unten) das overflow:hidden der geteilten
   .hero-Basisklasse fuer diese eine Seite gezielt aufhebt -- sonst
   wuerde die breitere Grafik links/rechts abgeschnitten. margin-top
   bewusst 0: der vorangehende Absatz traegt bereits margin-bottom:
   2.2rem (.hero p), das mit dem margin-top der Grafik kollabieren
   wuerde (Block-Margin-Collapsing) -- so bleibt der obere Abstand
   exakt der bereits vorhandene Absatz-Abstand statt eines groesseren,
   addierten Wertes. */
.lumaria-hint-image {
  display: block;
  position: relative;
  left: 50%;
  transform: translateX(-50%);
  width: min(1100px, 88vw);
  height: auto;
  margin: 0 0 1.8rem;
}

/* Mobile (<=767px): gleiche Logik wie .lumaria-tritt-ein-heading oben
   -- der Satz "Klicke auf eine der magischen Seiten ..." nimmt nur
   die mittleren ca. 58% des Canvas ein, Feder/Kristalle/Schmetterling
   an den Raendern duerfen auf kleinen Screens ausserhalb des
   sichtbaren Bereichs liegen, damit der Text selbst gross und lesbar
   bleibt statt (vorher: 95vw ohne echten Groessengewinn) proportional
   mitzuschrumpfen. */
@media (max-width: 767px) {
  .lumaria-hint-image {
    width: 158vw;
    max-width: none;
    margin-bottom: 1rem;
  }
}

/* .hero ist die GETEILTE Basisklasse (auch auf index.html verwendet,
   dort overflow:hidden absichtlich noetig) -- .lumaria-hero ist eine
   zusaetzliche, nur auf dieser Seite vorhandene Klasse auf demselben
   Element, die ausschliesslich hier overflow wieder freigibt, damit
   .lumaria-hint-image (und ihre Feder/Kristalle am Rand) nicht
   abgeschnitten wird. Betrifft dadurch technisch nicht index.html. */
.lumaria-hero {
  overflow: visible;
  padding-top: 90px;
  /* Reduziert gegenueber dem geerbten .hero-Wert (5rem), weil direkt
     danach jetzt das Video-Fenster folgt -- verhindert doppelten
     Leerraum (Hero-Bottom-Padding + Video-Section-Padding). */
  padding-bottom: 1.5rem;
}

/* Die beiden Laternen ragen absichtlich ueber den Browserrand hinaus
   (siehe .lumaria-lantern weiter unten); ohne diese Bremse wuerde das
   zusaetzliche Bild-Overflow rechts/links eine echte horizontale
   Scrollbar auf der Seite erzeugen (die "unsichtbare" Restbreite waere
   dann per Scrollen doch komplett einsehbar, was den gewuenschten
   "waechst von aussen herein"-Effekt zunichtemacht). WICHTIG:
   overflow-x:hidden (fruehere Fassung) hat das Scroll-Problem zwar
   geloest, aber dabei das position:sticky der Laternen kaputt gemacht:
   'hidden' auf einer Achse macht die jeweils andere Achse laut CSS-
   Overflow-Spec automatisch zu 'auto', wodurch <html>/<body>
   ungewollt zu echten Scroll-Containern wurden -- sticky-Elemente
   binden sich dann an DIESEN Container statt normal an den Viewport
   zu scrollen, und blieben beim Scrollen nicht mehr sichtbar (per
   Scroll-Test im Browser nachgewiesen: die Laternen liefen beim
   Scrollen einfach mit dem Inhalt nach oben weg statt zu "kleben").
   overflow-x:clip loest dasselbe Problem (schneidet Overflow ab), OHNE
   einen Scroll-Container zu erzeugen -- explizites overflow-y:visible
   stellt zusaetzlich sicher, dass die Y-Achse dabei nicht ungewollt
   mitgekoppelt wird. Ausschliesslich ueber eine Klasse, die (wie
   body.lumaria-entdecke-page) nur in lumaria.html vorkommt -- nicht
   global, um andere Seiten nicht anzufassen. */
html.lumaria-entdecke-page,
body.lumaria-entdecke-page {
  overflow-x: clip;
  overflow-y: visible;
}

/* Zwei Laternen-Grafiken haengen links/rechts am Rand von .lumaria-hero,
   so als wuechsen ihre Ranken von ausserhalb der Seite herein. Technik:
   .lumaria-lantern-col ist ein 0px breiter, absolut positionierter
   "Anker" auf ganzer Sektionshoehe direkt an der linken/rechten Kante
   von .lumaria-hero (bereits position:relative, overflow:visible s.o.).
   top:90px (statt 0) WICHTIG: absolut positionierte Kindelemente
   orientieren sich am PADDING-Rand des Elternelements, nicht an dessen
   Content-Rand -- das eigene padding-top:90px von .lumaria-hero (s.o.)
   verschiebt also NUR normale Flusselemente wie .hero-content nach
   unten, nicht diesen Anker. top:90px hier gleicht das explizit an,
   damit die Laternen (inkl. oberer Ranken/Blaetter/Schmetterlinge)
   genauso weit unter der Navigation starten wie die Ueberschrift, statt
   weiterhin an der Sektionsoberkante zu kleben und dort oben
   angeschnitten zu wirken. bottom:0 bleibt unveraendert -- dadurch
   bekommt die Laterne darin per
   position:sticky einen Scroll-Bereich, der EXAKT auf die Hoehe dieser
   Section begrenzt ist: sie scrollt zunaechst normal mit, "haengt" ab
   top:Xpx im Viewport fest, solange die Section noch darunter/darueber
   weiterlaeuft, und wird am Sektionsende ganz normal wieder vom
   Dokumentfluss weitergescrollt -- kein JS noetig, garantiert an
   .lumaria-hero gebunden (nicht global an Viewport/Body), da die Section
   selbst der einzige Bezugsrahmen ist. transform:translateX schiebt die
   Grafik NUR noch zu einem kleinen Teil (20%) ueber die Seitenkante
   hinaus (Effekt: "ein Ast waechst von aussen herein"), waehrend der
   groesste Teil des Astes inkl. Laterne, Blaetter, Bluete, Schmetterling
   und Kristallanhaenger unten vollstaendig sichtbar bleibt -- KORRIGIERT
   gegenueber der vorherigen Fassung, die per -48%/-52% nur etwa die
   Haelfte zeigte und zu viel von der Dekoration abschnitt. Unterschiedliche
   top-Werte links/rechts sorgen fuer die gewuenschte leichte vertikale
   Versetzung. pointer-events:none, damit die Grafiken nie Klicks auf
   Text/Links blockieren. Ab 1400px volle Groesse; darunter schrittweise
   kleiner und staerker angeschnitten, auf sehr kleinen Screens deutlich
   reduziert (nicht ausgeblendet), damit Ueberschrift/Text nie verdeckt
   werden. */
.lumaria-lantern-col {
  position: absolute;
  top: 90px;
  bottom: 0;
  width: 0;
  z-index: 2;
  pointer-events: none;
}

.lumaria-lantern-col-left {
  left: 0;
}

.lumaria-lantern-col-right {
  right: 0;
}

.lumaria-lantern {
  position: sticky;
  display: block;
  max-width: none;
  width: 200px;
  height: auto;
  pointer-events: none;
}

.lumaria-lantern-left {
  top: 140px;
  transform: translateX(-20%);
}

.lumaria-lantern-right {
  top: 230px;
  transform: translateX(-80%);
}

@media (max-width: 1400px) {
  .lumaria-lantern {
    width: 160px;
  }
}

@media (max-width: 1100px) {
  .lumaria-lantern {
    width: 128px;
  }

  .lumaria-lantern-left {
    top: 120px;
  }

  .lumaria-lantern-right {
    top: 190px;
  }
}

@media (max-width: 780px) {
  .lumaria-lantern {
    width: 88px;
  }
}

@media (max-width: 520px) {
  .lumaria-lantern {
    width: 62px;
  }

  .lumaria-lantern-left {
    top: 90px;
  }

  .lumaria-lantern-right {
    top: 150px;
  }
}

/* Smartphone-Korrektur: .hero-content (geerbt, sitewide auf vielen
   Seiten verwendet, max-width:640px ohne eigenes Innen-Padding) reicht
   auf Schmalseiten bis an den Bildschirmrand -- dort ragten die
   Laternen (siehe .lumaria-lantern oben, ca. 80% ihrer Breite sichtbar)
   direkt in Ueberschrift/Fliesstext hinein. Fix ausschliesslich hier
   ueber .lumaria-hero .hero-content (Nachfahren-Selektor, betrifft
   NUR diese Seite/Sektion, nicht das globale .hero-content). Text
   bekommt Innenabstand, die Laternen selbst werden zusaetzlich
   nochmal kleiner. Die vollflaechig ausbrechende Ueberschriftgrafik
   (.lumaria-tritt-ein-heading, eigene left:50%/translateX(-50%)-
   Zentrierung) wird mit einem passenden negativen Rand kompensiert,
   damit sie weiterhin randlos/unveraendert wirkt wie zuvor. */
@media (max-width: 640px) {
  .lumaria-hero {
    padding-top: 32px;
  }

  .lumaria-lantern-col {
    top: 32px;
  }

  .lumaria-hero .hero-content {
    padding: 0 44px;
  }

  .lumaria-hero .hero-content .lumaria-tritt-ein-heading {
    margin-left: -44px;
    margin-right: -44px;
  }

  .lumaria-lantern {
    width: 44px;
  }

  .lumaria-lantern-left {
    top: 70px;
  }

  .lumaria-lantern-right {
    top: 110px;
  }
}

@media (max-width: 400px) {
  .lumaria-lantern-col {
    display: none;
  }
}

/* Lumaria: "leuchtendes Herz"-Videomoment zwischen den Textabsaetzen im
   Hero. Reiner Block innerhalb von .hero-content (max-width:640px), kein
   eigener Rahmen/Hintergrund-Kasten, damit er wie eine lebendige
   Illustration und nicht wie ein eingesetzter Videoplayer wirkt.
   position:relative, damit die Aura (.lumaria-heart-aura) und die
   Umgebungsfunken absolut dazu positioniert werden koennen. padding
   verhindert, dass die margin der Caption (.lumaria-heart-caption) nach
   aussen "durchschlaegt" (Eltern-Kind-Margin-Collapsing) -- der aeussere
   Abstand zu den Nachbar-Absaetzen bleibt dadurch beim urspruenglich
   festgelegten margin:50px 0, das weiterhin mit den umliegenden .hero p
   (margin-bottom:2.2rem/35px) zu rund 50px auf jeder Seite kollabiert. */
.lumaria-heart-moment {
  position: relative;
  margin: 50px 0;
  padding: 24px 0;
}

/* Weicher, unregelmaessiger "Lumaria"-Schimmer hinter Video und Text:
   mehrere ueberlagerte, stark geblurte Gold-/Gruen-Flecken deuten Licht
   und Blattwerk nur an, ohne eine erkennbare Illustration zu sein. Die
   Flaeche reicht bewusst deutlich ueber den Video-Wrap hinaus (inset
   negativ), damit der anschliessende mask-image-Verlauf genug Raum hat,
   um VOR dem eigenen Rand der Flaeche bereits vollstaendig auf
   transparent auszublenden -- so entsteht nirgends eine harte Kante,
   und die Flaeche geht auf allen Seiten weich in den hellgruenen
   Seitenhintergrund ueber. */
.lumaria-heart-aura {
  position: absolute;
  inset: -20% -12%;
  z-index: 0;
  pointer-events: none;
  background:
    radial-gradient(ellipse 46% 40% at 50% 46%, rgba(217, 169, 79, 0.24) 0%, transparent 72%),
    radial-gradient(ellipse 38% 34% at 28% 22%, rgba(230, 195, 120, 0.18) 0%, transparent 70%),
    radial-gradient(ellipse 40% 36% at 20% 78%, rgba(29, 92, 52, 0.14) 0%, transparent 72%),
    radial-gradient(ellipse 40% 36% at 82% 74%, rgba(29, 92, 52, 0.13) 0%, transparent 72%);
  filter: blur(30px);
  mask-image: radial-gradient(ellipse 50% 46% at 50% 50%, black 0%, black 35%, transparent 74%);
  -webkit-mask-image: radial-gradient(ellipse 50% 46% at 50% 50%, black 0%, black 35%, transparent 74%);
}

/* Wenige, dezente Umgebungsfunken rund um Video und Aura -- bewusst in
   echtem Warmgold (nicht ueber var(--color-gold), das auf dieser Seite
   fuer das gruene Theme umdefiniert ist), damit sie tatsaechlich als
   goldenes Licht wirken statt gruenlich. Nutzt die bereits vorhandene
   .sparkle-Basisklasse (Twinkle-Animation) aus dem Hero. */
.lumaria-heart-ambient-spark {
  color: #d9a94f;
  font-size: 0.85rem;
  z-index: 1;
  animation-duration: 4.4s;
}

.lumaria-heart-video-wrap {
  position: relative;
  z-index: 1;
  max-width: 420px;
  margin: 0 auto;
  /* Weicher Maskenverlauf: die Videoflaeche selbst bleibt technisch ein
     Rechteck, wird aber zu den Raendern/Ecken hin unsichtbar, sodass nie
     eine sichtbare rechteckige Videoflaeche oder harte Bildkante
     entsteht. Emma bleibt in der Bildmitte voll sichtbar, nur der
     aeussere Rand blendet weich aus. */
  mask-image: radial-gradient(ellipse 58% 58% at 50% 50%, black 0%, black 62%, transparent 97%);
  -webkit-mask-image: radial-gradient(ellipse 58% 58% at 50% 50%, black 0%, black 62%, transparent 97%);
}

/* Kein Rahmen, kein Hintergrund, keine sichtbaren Bedienelemente (keine
   controls/poster) -- object-fit:contain plus width:100%/height:auto
   sorgen zusammen dafuer, dass Emma unter keinen Umstaenden angeschnitten
   wird, unabhaengig vom Seitenverhaeltnis der Videodatei. Startet mit
   opacity:0 und blendet erst beim tatsaechlichen "playing"-Event sanft
   ein (siehe Script in lumaria.html) -- das kaschiert den kurzen
   schwarzen Moment, den Browser beim ersten Dekodieren eines Videos
   ohne Poster-Bild zeigen koennen, sodass niemals ein harter schwarzer
   Rahmen aufblitzt. */
.lumaria-heart-video {
  display: block;
  width: 100%;
  height: auto;
  object-fit: contain;
  opacity: 0;
  transition: opacity 0.5s ease;
}

.lumaria-heart-video.is-playing {
  opacity: 1;
}

.lumaria-heart-sparkle-layer {
  position: absolute;
  inset: 0;
  z-index: 1;
  pointer-events: none;
}

/* Dezente goldene Lichtfunken, farblich identisch zum bereits an anderer
   Stelle verwendeten Gold-Glanz (siehe .schatztruhe-particle.is-gold).
   Weiches Aufleuchten, leichtes Aufsteigen, dann wieder Verblassen. */
.lumaria-heart-spark {
  position: absolute;
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: radial-gradient(circle, #fff7e0 0%, #d9a94f 70%, transparent 100%);
  opacity: 0;
  animation: lumaria-heart-spark-glow 2.1s ease-in-out forwards;
}

@keyframes lumaria-heart-spark-glow {
  0%   { opacity: 0;    transform: translateY(0)     scale(0.4); }
  25%  { opacity: 0.9;  transform: translateY(-4px)   scale(1); }
  60%  { opacity: 0.75; transform: translateY(-8px)   scale(1.05); }
  100% { opacity: 0;    transform: translateY(-14px)  scale(0.7); }
}

/* Einziger erlaubter Text unterhalb der Animation. */
.lumaria-heart-caption {
  position: relative;
  z-index: 1;
  text-align: center;
  font-family: var(--font-heading);
  font-style: italic;
  font-size: 1.1rem;
  color: var(--color-gold-light);
  margin: 18px 0 0;
}

@media (max-width: 640px) {
  .lumaria-heart-moment {
    margin: 40px 0;
  }

  .lumaria-heart-video-wrap {
    max-width: 280px;
  }
}

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

  .lumaria-heart-spark {
    display: none;
  }

  .lumaria-heart-ambient-spark {
    animation-duration: 6s;
  }
}

/* Lumaria: "Entdecke Lumaria"-Kacheln */

.lumaria-tiles {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));
  gap: 2.2rem;
  margin-top: 1rem;
}

.lumaria-tile {
  display: block;
  position: relative;
  background: rgba(var(--surface-rgb), 0.55);
  border: 1px solid rgba(var(--color-gold-rgb), 0.35);
  border-radius: 18px;
  padding: 2.4rem 1.6rem 2rem;
  text-align: center;
  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.07);
  text-decoration: none;
  color: inherit;
  transition: transform 0.35s ease, box-shadow 0.35s ease, border-color 0.35s ease;
}

.lumaria-tile h3 {
  color: var(--color-gold-light);
}

.lumaria-tile::after {
  content: "✦";
  position: absolute;
  top: 14px;
  right: 18px;
  font-size: 0.9rem;
  color: rgba(var(--color-gold-rgb), 0.55);
}

.lumaria-tile:hover {
  transform: translateY(-8px) scale(1.03);
  box-shadow: 0 18px 40px rgba(var(--color-gold-rgb), 0.4);
  border-color: rgba(var(--color-gold-rgb), 0.75);
}

.lumaria-tile-icon {
  display: block;
  font-size: 2.6rem;
  margin-bottom: 0.9rem;
}

.lumaria-tile-full {
  padding: 0;
  background: none;
  border: none;
  box-shadow: none;
  overflow: hidden;
}

.lumaria-tile-full::after {
  content: none;
}

.lumaria-tile-full:hover {
  transform: none;
  box-shadow: 0 14px 30px rgba(0, 0, 0, 0.18);
  border-color: transparent;
}

.lumaria-tile-full::before {
  content: "";
  position: absolute;
  top: 0;
  left: -60%;
  width: 40%;
  height: 100%;
  background: linear-gradient(120deg, transparent, rgba(255, 245, 214, 0.65), transparent);
  transform: skewX(-20deg);
  z-index: 2;
  pointer-events: none;
  transition: left 0.9s ease;
}

.lumaria-tile-full:hover::before {
  left: 120%;
}

.lumaria-tile-full-image {
  display: block;
  width: 100%;
  aspect-ratio: 3 / 5;
  object-fit: cover;
  object-position: center top;
  border-radius: 16px;
  box-shadow: 0 10px 24px rgba(0, 0, 0, 0.15);
  transition: transform 0.5s ease;
}

.lumaria-tile-full:hover .lumaria-tile-full-image {
  transform: scale(1.025);
}

.lumaria-tile h3 {
  font-size: 1.2rem;
  margin-bottom: 0.5rem;
}

.lumaria-tile p {
  font-size: 1rem;
  color: var(--color-parchment-dim);
  margin: 0;
}

/* ============================================================
   Für Eltern & Pädagogen -- vollstaendiger Neuaufbau.
   Ruhiger/erwachsener als die Kinderbereiche: nutzt weiterhin
   body.theme-sage-parents (helles Salbeigruen, Gold, Tuerkis-Buttons)
   und die vorhandenen .section/.section-narrow/.divider-Klassen als
   gemeinsamen Rhythmus, damit sich neue Abschnitte nahtlos in die
   bestehende Typografie/Abstaende einfuegen. Alle neuen Klassen tragen
   bewusst das Praefix .eltern- (bereits durch .eltern-topic-filter*
   etabliert), um Kollisionen mit anderen Seiten zu vermeiden. */

/* Neuer Bild-Header: Ueberschrift + Illustration stecken bereits im
   Bild selbst -- deshalb kein zusaetzlicher Text/Overlay, festes
   Seitenverhaeltnis (keine Beschneidung, kein Zerren, kein Zoom). */
.eltern-header {
  max-width: 760px;
  margin: 1.75rem auto;
  padding: 0 1.5rem;
}

/* Weicher Ausblend-Uebergang am unteren Bildrand (~100px) -- laesst
   den neuen Seitenhintergrund direkt darunter durchscheinen, statt
   einer harten Kante/rechteckigen Bildwirkung. mask-image betrifft
   nur den tatsaechlichen Bildinhalt, kein Overlay/keine zusaetzliche
   Ebene. */
/* Der Kopfbereich ist jetzt ein schmales Banner (Verhaeltnis rund
   3,9 : 1) statt des frueheren fast quadratischen Bildes. Die weiche
   Kante nach unten faellt deshalb kuerzer aus: 100 px haetten von einem
   knapp 500 px hohen Banner ein Fuenftel weggenommen. */
.eltern-header-img {
  display: block;
  width: 100%;
  height: auto;
  border-radius: 18px;
  -webkit-mask-image: linear-gradient(to bottom, #000 0%, #000 calc(100% - 38px), transparent 100%);
  mask-image: linear-gradient(to bottom, #000 0%, #000 calc(100% - 38px), transparent 100%);
}

/* Einstiegsbereich: Lumaria-Bild (55%) + zwei kurze Textbloecke (45%). */
.eltern-intro-split {
  display: grid;
  grid-template-columns: 55fr 45fr;
  gap: 2.5rem;
  align-items: stretch;
}

/* Hoehe folgt bewusst der Textspalte (align-items:stretch oben), nicht
   einem festen Seitenverhaeltnis -- so wirkt das Bild nie deutlich
   hoeher/niedriger als der Text daneben (siehe Vorgabe). */
.eltern-intro-media {
  display: block;
  width: 100%;
  height: 100%;
  min-height: 260px;
  object-fit: cover;
  object-position: center 45%;
  border-radius: 18px;
  border: 1px solid rgba(var(--color-gold-rgb), 0.4);
  box-shadow: 0 6px 18px rgba(139, 105, 60, 0.1);
}

.eltern-intro-text {
  display: flex;
  flex-direction: column;
  gap: 1.75rem;
}

.eltern-intro-block h3 {
  margin: 0 0 0.5rem;
  font-size: 1.15rem;
  color: var(--color-parchment);
}

.eltern-intro-block p {
  margin: 0;
  color: var(--color-parchment-dim);
  line-height: 1.65;
}

@media (max-width: 900px) {
  .eltern-intro-split {
    grid-template-columns: 1fr;
    gap: 1.75rem;
  }

  .eltern-intro-media {
    height: auto;
    min-height: 0;
    aspect-ratio: 5 / 4;
  }
}

@media (max-width: 620px) {
  .eltern-header {
    margin: 1.25rem auto;
  }

  .eltern-header-img {
    -webkit-mask-image: linear-gradient(to bottom, #000 0%, #000 calc(100% - 55px), transparent 100%);
    mask-image: linear-gradient(to bottom, #000 0%, #000 calc(100% - 55px), transparent 100%);
  }

  .eltern-intro-text {
    gap: 1.4rem;
  }
}

/* Orientierungsbereich: bewusst schlichte Textlinks statt Buttons/Pills
   mit Icon -- soll wie eine leise Einladung wirken, nicht wie ein
   technisches Seitenmenue. */
.eltern-jumpnav {
  max-width: 700px;
  margin: 0 auto;
  padding: 0 1.5rem 2.5rem;
  text-align: center;
}

.eltern-jumpnav-label {
  display: block;
  font-family: var(--font-heading);
  font-size: 0.95rem;
  font-weight: 600;
  color: var(--color-parchment-dim);
  margin-bottom: 0.9rem;
}

.eltern-jumpnav-links {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 0.5rem 1.6rem;
}

.eltern-jumpnav-links a {
  font-family: var(--font-heading);
  font-size: 0.92rem;
  font-weight: 600;
  color: var(--color-gold-light);
  text-decoration: none;
  border-bottom: 1px solid rgba(var(--color-gold-rgb), 0.4);
  padding-bottom: 0.1rem;
  transition: color 0.2s ease, border-color 0.2s ease;
}

.eltern-jumpnav-links a:hover,
.eltern-jumpnav-links a:focus-visible {
  color: var(--color-parchment);
  border-color: var(--color-gold);
}

.eltern-section-intro {
  max-width: 620px;
  margin: 0 auto 2rem;
  text-align: center;
  color: var(--color-parchment-dim);
}

/* Werte-Karten: sechs dezent unterschiedlich eingefaerbte Karten statt
   sechs identischer weisser Kaesten (siehe Vorgabe). Illustration ist
   ein neutraler SVG-Platzhalter (kein Emoji) -- wird pro Karte spaeter
   gegen eine echte Illustration ausgetauscht. */
.eltern-values-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 1.75rem;
  margin-top: 1rem;
}

.eltern-value-card {
  display: flex;
  flex-direction: column;
  min-height: 480px;
  background: linear-gradient(165deg, #ffffff 0%, var(--eltern-card-tint, #f4f9f4) 100%);
  border: 1px solid rgba(var(--color-gold-rgb), 0.3);
  border-radius: 16px;
  overflow: hidden;
  text-align: left;
  box-shadow: 0 4px 16px rgba(139, 105, 60, 0.06);
  transition: box-shadow 0.3s ease, border-color 0.3s ease, transform 0.3s ease;
}

.eltern-value-card:hover {
  box-shadow: 0 10px 24px rgba(139, 105, 60, 0.12);
  border-color: rgba(var(--color-gold-rgb), 0.6);
  transform: translateY(-3px);
}

.eltern-value-card-mut { --eltern-card-tint: #fdf1f0; }
.eltern-value-card-friendship { --eltern-card-tint: #eef4ec; }
.eltern-value-card-feelings { --eltern-card-tint: #f3ecf7; }
.eltern-value-card-fantasy { --eltern-card-tint: #fbf3e2; }
.eltern-value-card-confidence { --eltern-card-tint: #fdf0e4; }
.eltern-value-card-hope { --eltern-card-tint: #eaf2f0; }

/* Bild fuellt die Kartenbreite vollstaendig, einheitliches
   Seitenverhaeltnis (passend zu den gelieferten 3:2-Bildern) ueber alle
   sechs Karten hinweg, object-fit:cover schneidet sauber zu, ohne die
   Bilder zu verzerren. Duenne goldene Linie trennt Bild und Text. */
.eltern-value-card-media {
  display: block;
  aspect-ratio: 3 / 2;
  overflow: hidden;
  border-bottom: 1px solid rgba(var(--color-gold-rgb), 0.25);
}

.eltern-value-card-media img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.eltern-value-card h3 {
  font-size: 1.1rem;
  margin: 1.3rem 1.4rem 0.5rem;
}

.eltern-value-card p {
  font-size: 0.96rem;
  color: var(--color-parchment-dim);
  margin: 0 1.4rem 1.4rem;
  flex: 1;
}

@media (max-width: 900px) {
  .eltern-values-grid {
    grid-template-columns: repeat(2, 1fr);
  }
}

@media (max-width: 620px) {
  .eltern-values-grid {
    grid-template-columns: 1fr;
  }

  .eltern-value-card {
    min-height: 0;
  }
}

/* "Unsere Botschaft": fertige, vom Nutzer gelieferte Illustration
   (Lumaria-Weg mit goldener Feder und viel ruhiger heller Flaeche in
   der Mitte) als vollstaendig sichtbares Bild -- width:100%;height:auto
   erhaelt das Seitenverhaeltnis exakt, kein Zuschneiden/Verzerren. Der
   Zitat-Text liegt als echter HTML-Text ueber der hellen Flaeche;
   bewusst KEIN Hintergrundkasten, da die Illustration dort bereits sehr
   hell/gleichmaessig ist und der Text ohne Kasten gut lesbar bleibt.
   Schriftgroessen sind bewusst mit vw an die Bildbreite gekoppelt, da
   Bild und Textzone gemeinsam (im selben Seitenverhaeltnis) skalieren. */
.eltern-message {
  position: relative;
  max-width: 1000px;
  margin: 3rem auto;
  padding: 0 1.5rem;
}

.eltern-message-media {
  display: block;
  width: 100%;
  height: auto;
  box-shadow: 0 8px 22px rgba(139, 105, 60, 0.08);
}

.eltern-message-panel {
  position: absolute;
  left: 50%;
  top: 41%;
  transform: translate(-50%, -50%);
  width: min(58%, 580px);
  text-align: center;
}

.eltern-message-quote {
  font-family: var(--font-heading);
  font-size: 1.3rem;
  font-weight: 600;
  line-height: 1.55;
  color: var(--color-parchment);
  margin: 0 0 0.5em;
}

.eltern-message-sub {
  font-size: 0.92rem;
  font-style: italic;
  color: var(--color-parchment-dim);
  margin: 0;
}

/* Bei sehr schmalen Breiten wird das Bild (festes Seitenverhaeltnis)
   proportional so niedrig, dass der volle Zitattext bei lesbarer
   Schriftgroesse nicht mehr sicher in die helle Bildmitte passt --
   deshalb hier ausnahmsweise die vom Auftrag ausdruecklich erlaubte,
   sehr dezente halbtransparente Cremeflaeche hinter dem Text, statt
   die Schrift auf unlesbare Groessen zu schrumpfen. */
@media (max-width: 640px) {
  .eltern-message-panel {
    width: min(84%, 420px);
    top: 42%;
    padding: 0.55rem 0.75rem;
    background: rgba(253, 247, 237, 0.6);
    border-radius: 10px;
  }

  .eltern-message-quote {
    font-size: 0.86rem;
    line-height: 1.42;
    margin-bottom: 0.4em;
  }

  .eltern-message-sub {
    font-size: 0.72rem;
  }
}

/* Gespraechsimpulse: kleine Sprechblasen-Karten statt eines
   Ratgeber-/Therapieleitfaden-Looks. */
.eltern-talk-grid {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 1.5rem;
  margin: 0 auto;
  max-width: 700px;
}

.eltern-talk-bubble {
  position: relative;
  margin: 0;
  padding: 1.4rem 1.5rem;
  background: #ffffff;
  border: 1px solid rgba(var(--color-gold-rgb), 0.3);
  border-radius: 16px 16px 16px 4px;
  font-family: var(--font-body);
  font-style: italic;
  font-size: 0.98rem;
  line-height: 1.5;
  color: var(--color-parchment);
}

.eltern-talk-note {
  max-width: 500px;
  margin: 2rem auto 0;
  text-align: center;
  font-size: 0.9rem;
  color: var(--color-parchment-dim);
}

@media (max-width: 620px) {
  .eltern-talk-grid {
    grid-template-columns: 1fr;
  }
}

/* Emma in Kita & Grundschule */
.eltern-education-list {
  max-width: 560px;
  margin: 0 auto 1.75rem;
  padding: 0;
  list-style: none;
  display: grid;
  gap: 0.75rem;
}

.eltern-education-list li {
  position: relative;
  padding-left: 1.5rem;
  color: var(--color-parchment);
}

.eltern-education-list li::before {
  content: "";
  position: absolute;
  left: 0;
  top: 0.5em;
  width: 7px;
  height: 7px;
  border-radius: 50%;
  background: var(--color-gold);
}

.eltern-education-note {
  max-width: 620px;
  margin: 0 auto;
  text-align: center;
  font-size: 0.92rem;
  color: var(--color-parchment-dim);
}

/* "Ideen fuer nach dem Vorlesen": drei kleine, freiwillige Impulskarten
   innerhalb von .eltern-education -- bewusst zurueckhaltend gestaltet
   (keine Nummerierung, kein Schulbuch-Look), damit es wie ein Angebot
   statt einer Aufgabe wirkt. */
.eltern-practice {
  max-width: 900px;
  margin: 2.5rem auto 0;
  padding-top: 2.25rem;
  border-top: 1px solid rgba(var(--color-gold-rgb), 0.25);
  text-align: center;
}

.eltern-practice-heading {
  font-size: 1.2rem;
  margin: 0 0 0.4rem;
}

.eltern-practice-intro {
  font-size: 0.9rem;
  font-style: italic;
  color: var(--color-parchment-dim);
  margin: 0 0 1.5rem;
}

.eltern-practice-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 1.5rem;
  text-align: left;
}

.eltern-practice-card {
  background: rgba(var(--surface-rgb), var(--surface-alpha));
  border: 1px solid rgba(var(--color-gold-rgb), 0.28);
  border-radius: 14px;
  padding: 1.4rem 1.3rem;
}

.eltern-practice-card h4 {
  font-family: var(--font-heading);
  font-size: 1rem;
  color: var(--color-parchment);
  margin: 0 0 0.5rem;
}

.eltern-practice-card p {
  font-size: 0.92rem;
  line-height: 1.55;
  color: var(--color-parchment-dim);
  margin: 0;
}

@media (max-width: 760px) {
  .eltern-practice-grid {
    grid-template-columns: 1fr;
  }
}

/* Kleiner Impulsbereich nach den Gespraechsfragen: verlinkt bewusst
   dezent (kein Button) auf den bereits vorhandenen Magazinartikel. */
.eltern-impulse-link {
  display: inline-block;
  font-family: var(--font-heading);
  font-size: 0.92rem;
  font-weight: 600;
  color: var(--color-gold-light);
  text-decoration: none;
  border-bottom: 1px solid rgba(var(--color-gold-rgb), 0.4);
  padding-bottom: 0.1rem;
  transition: color 0.2s ease, border-color 0.2s ease;
}

.eltern-impulse-link:hover,
.eltern-impulse-link:focus-visible {
  color: var(--color-parchment);
  border-color: var(--color-gold);
}

/* Barrierearmes FAQ-Accordion auf Basis von <details>/<summary> --
   funktioniert ohne JavaScript, ist per Tastatur bedienbar und von
   Screenreadern nativ unterstuetzt. Nur die Pfeil-Rotation wird
   animiert (transform, keine Layout-Eigenschaft). */
.eltern-faq-list {
  display: flex;
  flex-direction: column;
  gap: 0.85rem;
  margin-bottom: 2rem;
}

.eltern-faq-item {
  background: rgba(var(--surface-rgb), var(--surface-alpha));
  border: 1px solid rgba(var(--color-gold-rgb), 0.3);
  border-radius: 14px;
  padding: 0.3rem 1.3rem;
}

.eltern-faq-item summary {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
  padding: 1rem 0;
  font-family: var(--font-heading);
  font-weight: 600;
  color: var(--color-parchment);
  cursor: pointer;
  list-style: none;
}

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

.eltern-faq-item summary::after {
  content: "+";
  flex-shrink: 0;
  font-size: 1.3rem;
  font-weight: 400;
  color: var(--color-gold-light);
  transition: transform 0.25s ease;
}

.eltern-faq-item[open] summary::after {
  transform: rotate(45deg);
}

.eltern-faq-item p {
  margin: 0 0 1.1rem;
  color: var(--color-parchment-dim);
  font-size: 0.96rem;
}

.eltern-faq-links {
  text-align: center;
}

/* "Kinder verstehen & begleiten" (fuer-eltern-paedagogen.html): nutzt
   bewusst die vorhandenen .section/.section-narrow/.divider-Klassen
   wie jeder andere Abschnitt dieser Seite (kein neuer Kasten, kein
   eigener Hintergrund). Themen-Pills sind jetzt echte Links auf die
   Unterkategorie-Filter der Magazin-Uebersicht (siehe
   js/magazin-render.js) -- fuehren bereits heute auf eine echte Seite
   (nie ins Leere), auch wenn fuer eine Unterkategorie noch kein
   Artikel vorliegt: die Zielseite zeigt dann automatisch alle Artikel
   der Kategorie, sobald neue Beitraege mit dieser Unterkategorie
   erscheinen, greift der Filter automatisch. */
.eltern-topic-filters {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 0.75rem;
  margin-top: 1.5rem;
}

.eltern-topic-filter {
  display: inline-block;
  font-family: var(--font-heading);
  font-size: 0.88rem;
  font-weight: 600;
  color: var(--color-parchment);
  background: var(--color-ink-deep);
  border: 1px solid rgba(var(--color-gold-rgb), 0.3);
  border-radius: 999px;
  padding: 0.55rem 1.15rem;
  text-decoration: none;
  transition: background 0.2s ease, border-color 0.2s ease, color 0.2s ease;
}

.eltern-topic-filter:hover,
.eltern-topic-filter:focus-visible {
  background: rgba(var(--color-gold-rgb), 0.16);
  border-color: rgba(var(--color-gold-rgb), 0.7);
}

.eltern-magazine-btn {
  display: inline-block;
  margin-top: 2rem;
}

/* Werke / Bücher */

.works-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
  gap: 2rem;
}

.work-card {
  background: rgba(var(--surface-rgb), var(--surface-alpha));
  border: 1px solid rgba(var(--color-gold-rgb), 0.2);
  border-radius: 10px;
  padding: 1.4rem;
  display: flex;
  flex-direction: column;
  gap: 0.8rem;
  transition: transform 0.2s ease, border-color 0.2s ease;
}

.work-card:hover {
  transform: translateY(-4px);
  border-color: var(--color-gold);
}

.cover-placeholder {
  aspect-ratio: 2 / 3;
  border-radius: 6px;
  background: linear-gradient(160deg, var(--color-ink-light), var(--color-burgundy));
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--color-gold-light);
  font-family: var(--font-heading);
  font-size: 0.9rem;
  text-align: center;
  padding: 1rem;
}

.work-card h3 {
  font-size: 1.25rem;
  margin-bottom: 0;
}

.work-status {
  font-size: 0.85rem;
  text-transform: uppercase;
  letter-spacing: 0.1em;
  color: var(--color-gold);
}

/* Kontakt */

label {
  font-family: var(--font-heading);
  font-size: 0.95rem;
  color: var(--color-gold-light);
  margin-bottom: 0.4rem;
  display: block;
}

input, textarea {
  width: 100%;
  padding: 0.7rem 0.9rem;
  background: rgba(255, 255, 255, 0.04);
  border: 1px solid rgba(var(--color-gold-rgb), 0.35);
  border-radius: 6px;
  color: var(--color-parchment);
  font-family: var(--font-body);
  font-size: 1.05rem;
}

input:focus, textarea:focus {
  outline: none;
  border-color: var(--color-gold);
}

/* KORREKTUR (Rueckmeldung): die vorherigen beiden Fassungen (fixiertes
   Vollbild-Hintergrundbild, danach ein fixierter Header mit auf eine
   feste Bildschirmhoehe begrenzter Szene) waren beide nicht gewuenscht.
   Die Seite verhaelt sich jetzt wieder genauso wie alle anderen Seiten:
   Header ganz normal im Dokumentfluss oben (siehe .kontakt-header-wrap
   weiter unten, kein position:fixed/sticky mehr), direkt danach beginnt
   .kontakt-scene als ganz normaler, mitscrollender Block OHNE eigene
   Hoehenbegrenzung (kein height:100vh, kein overflow-y:auto, kein
   separater Scrollcontainer) -- sie umschliesst jetzt sowohl den oberen
   Baum-/Loomus-/Ueberschriftsbereich ALS AUCH das Formular, damit das
   Hintergrundmotiv nicht mehr nach dem oberen Abschnitt endet (vorher
   entstand dahinter eine grosse weisse Flaeche).

   Da ein einzelnes, gemaltes Bild nicht beliebig in die Hoehe gestreckt
   werden kann, ohne sichtbar zu verzerren (siehe .kontakt-bg-blur
   unten), zeigt eine ZWEITE, unscharfe Vollflaechen-Ebene (dieselbe
   Datei, nur weichgezeichnet+gezoomt, KEINE Abdunklung -- exakt
   dieselbe bereits an anderer Stelle dieser Website etablierte Technik
   wie .home-faq-bg-video-blur) durchgehend dieselben Farben/Stimmung
   des Motivs hinter dem KOMPLETTEN Bereich (Baum/Loomus-Zone UND
   Formular) -- keine weisse Flaeche mehr, kein Strecken/Verzerren des
   scharfen Bilds. Das scharfe, unveraenderte Bild (.kontakt-bg,
   weiterhin object-fit:cover auf denselben Ausschnitt/Zoom wie zuvor)
   bleibt auf die obere .kontakt-scene-top-Zone begrenzt, in der Baum
   und Loomus unveraendert gut erkennbar sichtbar sind. */
.kontakt-scene {
  position: relative;
}

.kontakt-bg-blur {
  position: absolute;
  inset: 0;
  z-index: -3;
  overflow: hidden;
  pointer-events: none;
}

.kontakt-bg-blur img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: 20% 15%;
  transform: scale(1.15);
  filter: blur(38px);
}

.kontakt-scene-top {
  position: relative;
  overflow: hidden;
  min-height: min(65vh, 620px);
}

@media (max-width: 1023px) {
  .kontakt-scene-top {
    min-height: min(55vh, 480px);
  }
}

@media (max-width: 767px) {
  .kontakt-scene-top {
    min-height: min(48vh, 380px);
  }
}

.kontakt-bg {
  position: absolute;
  inset: 0;
  z-index: -2;
  overflow: hidden;
}

.kontakt-bg img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: 20% 15%;
}

/* Eigener Kontakt-Header: ruhiger cremefarbener Streifen statt der
   Lumaria-Landschaft im Navigationsbereich. Zwei Zeilen -- oben
   mittig der Tintenzauber-Verlag-Schriftzug (eigene Grafik statt des
   sonst hier verwendeten .logo-wordmark/.logo-badge-Paars, das auf
   dieser Seite nie vorhanden war), darunter die unveraendert
   uebernommene Hauptnavigation, jetzt zentriert statt per
   justify-content:space-between links/rechts verteilt. Ausschliesslich
   ueber die seiteneigene .kontakt-header-wrap-Huelle gescopet (nicht
   ueber body.theme-kontakt, das sich u.a. auch kids-galerie.html/
   post-nach-lumaria.html teilt) -- betrifft dadurch garantiert nur
   diese eine Seite, die globale .site-header-Regel bleibt unangetastet.
   Ganz normal im Dokumentfluss (kein position:fixed/sticky mehr) --
   scrollt wie der Rest der Seite mit. */
.kontakt-header-wrap {
  background: #faf6ec;
}

.kontakt-header-brand {
  display: flex;
  justify-content: center;
  padding: 1.75rem 1.5rem 0.5rem;
}

.kontakt-header-wordmark {
  display: block;
  width: 320px;
  max-width: 78%;
  height: auto;
  margin: 0 auto;
}

.kontakt-header-wrap .site-header {
  justify-content: center;
  padding-top: 0.25rem;
}

@media (max-width: 767px) {
  /* Nutzerkorrektur: kein zusaetzliches Logo auf dem Handy, auch nicht
     auf Kontakt -- die mobile Navigationszeile bringt bereits ihr
     eigenes Tintenzauber-Verlag-Logo mit (siehe .mobile-nav-logo-link/
     -img, von main.js in JEDE Seite eingefuegt), ein zweites Logo
     direkt darueber waere doppelt. Vereinheitlicht Kontakt damit mit
     dem sitewide .top-brand-bar-Verhalten (dort ebenfalls per
     display:none unter 768px ausgeblendet). */
  .kontakt-header-brand {
    display: none;
  }

  .kontakt-header-wordmark {
    width: 220px;
    max-width: 72%;
  }
}

/* Einheitliche obere Logo-Leiste (Home/Autorin/Lumaria/Marktplatz/Kids
   Club/Eltern & Paedagogen/Magazin) -- exakt derselbe Stil, dieselbe
   Positionierung und dieselbe Wirkung wie die bereits bestehende
   Kontaktseite (siehe .kontakt-header-brand/-wordmark oben): dieselbe
   Grafik (img/kontakt-header-wordmark.png), derselbe cremefarbene
   Streifen (#faf6ec), dieselben Masse/Abstaende. Kontakt selbst bringt
   dieses Muster schon eigenstaendig mit (.kontakt-header-wrap) und
   bleibt unangetastet.

   Nur ab 768px (Tablet+Desktop) sichtbar -- "Mobile nicht aendern":
   darunter bleibt .top-brand-bar per display:none komplett unsichtbar,
   die Seite verhaelt sich exakt wie zuvor. */
.top-brand-bar {
  display: none;
}

@media (min-width: 768px) {
  .top-brand-bar {
    display: flex;
    justify-content: center;
    padding: 1.75rem 1.5rem 0.5rem;
    background: #faf6ec;
  }

  .top-brand-bar-logo {
    display: block;
    width: 320px;
    max-width: 78%;
    height: auto;
    margin: 0 auto;
  }
}

/* .page-top-frame buendelt die Logo-Leiste, die bereits bestehende
   Navigation (<header class="site-header">) und den individuellen,
   unveraenderten Seiten-Header (Video/Bild, jeweils mit zusaetzlicher
   Markierklasse .page-top-hero) zu einer gemeinsamen Flex-Spalte, und
   stellt per CSS "order" auf JEDER Breite die einheitliche Reihenfolge
   her -- Nutzerkorrektur: anfangs nur ab 768px aktiv, Mobile blieb bei
   der alten Quellreihenfolge (Header zuerst, Navigation danach). Jetzt
   gilt ueberall Navigation VOR dem individuellen Header:
   - ab 768px (Tablet+Desktop): Logo-Leiste -> Navigation -> Header
   - unter 768px (Mobile): .top-brand-bar bleibt per display:none
     unsichtbar (das Logo steckt dort schon in der von main.js
     eingefuegten mobilen Navigationszeile), sichtbar bleibt daher nur
     Navigation -> Header.
   OHNE die bestehende HTML-Reihenfolge im Quelltext zu aendern und OHNE
   die Navigation selbst neu zu bauen. Kein position:fixed/sticky, kein
   mitscrollender Hintergrund -- ganz normaler Dokumentfluss, es wird
   nur die visuelle Reihenfolge der Bloecke getauscht. */
.page-top-frame {
  display: flex;
  flex-direction: column;
}

.page-top-frame > .top-brand-bar {
  order: 1;
}

.page-top-frame > header.site-header {
  order: 2;
}

/* z-index:0 ist hier notwendig, nicht nur kosmetisch: als Flex-Item mit
   gesetztem "order" gilt fuer .page-top-hero die Flexbox-Sonderregel
   "z-index-Werte ungleich auto erzeugen einen Stapelkontext, auch bei
   position:static" -- OHNE explizites z-index blieb der Video-/Bild-
   Header (jetzt visuell NACH der Navigation, direkt unter ihr) trotz
   .site-header.z-index:20 oben drauf liegen und hat die Dropdown-Panels
   der Hauptnavigation verdeckt UND deren Klicks abgefangen (per
   elementFromPoint bestaetigt: an der Panel-Position lag .page-top-hero
   oben, nicht das Panel/dessen Links -- daher liessen sich Autorin/
   Lumaria/Lumarias Marktplatz/Kids Club nicht mehr oeffnen). z-index:0
   liegt eindeutig unter .site-header (20), macht die Stapelreihenfolge
   explizit statt sich auf die mehrdeutige "auto"-Aufloesung im
   Flex-Kontext zu verlassen. */
.page-top-frame > .page-top-hero {
  order: 3;
  z-index: 0;
}

/* Kompakter Kontakt-Hero: steht frei auf dem hellen Bereich des
   vorhandenen Hintergrundbilds (.kontakt-bg, unveraendert), KEINE
   eigene Karte/Box mehr -- ersetzt den vormaligen h1+Intro-Absatz, die
   beide in der grossen Formular-Karte steckten und den Bereich dadurch
   zu einem hohen, scrollbaren Block statt einem echten Header machten.
   Sehr dezenter transparenter Creme-Glow hinter dem Text (::before,
   radial, kein hartes Rechteck) sichert die Lesbarkeit auf dem
   gemalten Hintergrund. */
.kontakt-hero {
  max-width: 640px;
  margin: 0 auto;
  padding: 3.25rem 1.5rem 0.5rem;
  text-align: center;
}

.kontakt-hero-inner {
  position: relative;
  z-index: 1;
}

/* Grafische Ueberschrift ersetzt die vormalige Text-Ueberschrift +
   Unterzeile vollstaendig (beides bereits Teil der gelieferten Grafik,
   inkl. eigenem goldenem Schein/Rahmen) -- deshalb kein zusaetzlicher
   CSS-Glow/Box mehr dahinter, nur Breite/Zentrierung. Ausschliesslich
   width gesetzt, height:auto erhaelt automatisch garantiert das
   Seitenverhaeltnis (kein Strecken/Verzerren moeglich). */
.kontakt-hero-heading-img {
  display: block;
  width: 100%;
  max-width: 560px;
  height: auto;
  margin: 0 auto;
}

@media (max-width: 900px) {
  .kontakt-hero {
    padding-top: 2.5rem;
  }
}

/* Mobile (<=767px): eigene, kompakte Komposition statt einer reinen
   proportionalen Verkleinerung -- spuerbar weniger oberer Abstand,
   damit der Hero nicht mit Loomus (position:fixed, siehe
   .kontakt-loomus-wrap) in Platznot geraet und darunter zuegig der
   Kontaktbereich beginnt. Die Grafik selbst bleibt dieselbe Datei,
   nur ihre Breite wird fuer den schmaleren Bereich angepasst --
   height:auto haelt sie weiterhin unverzerrt. */
@media (max-width: 767px) {
  .kontakt-hero {
    padding: 3.5rem 1.25rem 0.25rem;
  }

  .kontakt-hero-heading-img {
    max-width: 400px;
  }
}

.kontakt-section {
  padding-top: 1.5rem;
  padding-bottom: 5rem;
}

/* Ehemals zweispaltig (Formular + "Post nach Lumaria"-Kachel); die
   Kachel wurde entfernt (siehe HTML), daher jetzt nur noch ein einfacher
   Container um das Formular -- .kontakt-card zentriert sich ueber seine
   eigene max-width+margin:auto, kein Flex-Layout/keine leere Spalte
   mehr noetig. */
.kontakt-layout {
  max-width: 1040px;
}

.kontakt-card {
  position: relative;
  z-index: 1;
  max-width: 640px;
  margin: 0 auto;
  padding: 2.6rem 2.2rem 2.4rem;
  background: rgba(var(--surface-rgb), 0.82);
  border: 1px solid rgba(var(--color-gold-rgb), 0.4);
  border-radius: 22px;
  box-shadow: 0 18px 44px rgba(74, 63, 102, 0.18);
  text-align: center;
}

.kontakt-form {
  display: flex;
  flex-direction: column;
  gap: 1.3rem;
  text-align: left;
}

.kontakt-field input,
.kontakt-field textarea {
  background: rgba(255, 255, 255, 0.6);
  border: 1px solid rgba(var(--color-gold-rgb), 0.4);
  border-radius: 10px;
}

.kontakt-field input:focus,
.kontakt-field textarea:focus {
  box-shadow: 0 0 0 3px rgba(var(--color-gold-rgb), 0.18);
}

.kontakt-field-checkbox {
  display: flex;
  align-items: flex-start;
  gap: 0.6rem;
}

.kontakt-field-checkbox input {
  margin-top: 0.35rem;
  width: auto;
  accent-color: var(--color-gold);
}

.kontakt-field-checkbox label {
  margin: 0;
  font-family: var(--font-body);
  font-size: 0.92rem;
  color: var(--color-parchment-dim);
}

.kontakt-submit-row {
  text-align: center;
  margin-top: 0.4rem;
}

.kontakt-submit {
  box-shadow: 0 10px 24px rgba(var(--color-gold-rgb), 0.28);
}

/* ================================================================ */
/* Post nach Lumaria (getrennt vom normalen Kontaktformular)         */
/* ================================================================ */

/* Nutzt bewusst dasselbe theme-kontakt (fliederfarbene Farbwelt), aber
   ohne die fest positionierte .kontakt-bg-Waldillustration -- der
   Lumaria-Briefkasten uebernimmt hier die Rolle des zentralen
   Gestaltungselements. */

/* Header-Video (nur auf post-nach-lumaria.html, ersetzt dort die sonst
   hier stehenden Logos -- rundes Bildlogo + goldenes Schriftlogo --
   vollstaendig): aspect-ratio statt object-fit-Zuschnitt, damit die
   Box-Form IMMER exakt der Video-Form entspricht -- dadurch rechnerisch
   garantiert kein Zuschnitt/Zoom/Verzerrung und keine Balken, ganz ohne
   object-fit-Tricks. max-width 1040px (Video ist 1280x512, also 2.5:1)
   ergibt ca. 416px Hoehe -- angelehnt an die kompakte ~460px-
   Headerhoehe, die auf anderen Seiten (Marktplatz, Gratis-Schatztruhe)
   bereits etabliert ist, damit der Header schmal/elegant wirkt statt
   den Bildschirm zu fuellen. */
/* Seitenhintergrund dieser Seite: derselbe Creme-Ton wie Navigation/
   Hauptbereich (#f8debf) statt des Browser-Standard-Weiss von <body>.
   Wird nur ausserhalb des max-width:1040px-Videos sichtbar (auf breiten
   Bildschirmen links/rechts vom Header-Video) -- eigene Klasse statt
   body.post-lumaria-page, weil LETZTERE auch an kids-galerie.html
   haengt (gemeinsame Altlast beider Seiten); post-lumaria-video-page
   ist neu und ausschliesslich auf post-nach-lumaria.html gesetzt. */
body.post-lumaria-video-page {
  background-color: #f8debf;
}

.post-lumaria-hero-video-wrap {
  position: relative;
  width: 100%;
  max-width: 1040px;
  margin: 0 auto;
  overflow: hidden;
  line-height: 0;
}

.post-lumaria-hero-video {
  display: block;
  width: 100%;
  aspect-ratio: 1280 / 512;
  height: auto;
  object-fit: contain;
}

/* Weicher Uebergang Video -> Navigation: ueberlagert nur die unteren
   ~28px des Videos mit einem sanften Verlauf zum selben Creme-Ton wie
   die Navigation/der Seitenhintergrund (#f8debf, siehe
   body.post-lumaria-page main weiter unten). Der Verlauf endet bei
   voll deckendem Creme (kein Transparent-Ende), dadurch wird nie das
   weisse Browser-Grundcanvas sichtbar -- nur ein rein optischer
   Farbwasch direkt auf dem Video, kein Schatten/Rahmen/keine Linie. */
.post-lumaria-hero-video-wrap::after {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  height: 28px;
  background: linear-gradient(to bottom, rgba(248, 222, 191, 0) 0%, rgba(248, 222, 191, 0.92) 100%);
  pointer-events: none;
}

/* Gleicher weicher Uebergang links/rechts: die Video-Box selbst ist
   max-width:1040px begrenzt, auf breiten Bildschirmen liegt der neu
   cremefarbene Seitenhintergrund (siehe body.post-lumaria-video-page
   oben) direkt daneben -- ein zarter Farbwasch an den Video-Kanten
   sorgt dafuer, dass auch dieser Uebergang weich statt hart wirkt. */
.post-lumaria-hero-video-wrap::before {
  content: "";
  position: absolute;
  inset: 0;
  background:
    linear-gradient(to right, rgba(248, 222, 191, 0.85) 0%, rgba(248, 222, 191, 0) 6%),
    linear-gradient(to left, rgba(248, 222, 191, 0.85) 0%, rgba(248, 222, 191, 0) 6%);
  pointer-events: none;
}

/* Navigation auf dieser Seite bekommt denselben warmen Creme-Ton wie
   der Seitenhintergrund (#f8debf) statt des sonst ueblichen reinen
   Weiss -- dadurch verschwindet die harte weisse Kante zwischen
   Header-Video und dem cremefarbenen Inhaltsbereich. Selektor bewusst
   ueber den direkt vorangehenden Geschwister-Node .post-lumaria-hero-
   video-wrap statt ueber body.post-lumaria-page beschraenkt: LETZTERE
   Klasse haengt auch an kids-galerie.html (gemeinsame Altlast beider
   Seiten), .post-lumaria-hero-video-wrap existiert dagegen
   ausschliesslich im HTML von post-nach-lumaria.html -- dadurch bleibt
   diese Regel garantiert auf genau diese eine Seite beschraenkt, keine
   andere Seite/keine globale .site-header-Regel betroffen. Nur die
   Hintergrundfarbe aendert sich -- Position, Hoehe, Schrift, Abstaende,
   Dropdowns und Funktion der Navigation bleiben unangetastet (keine
   dieser Eigenschaften wird hier gesetzt). */
.post-lumaria-hero-video-wrap + header.site-header {
  background-color: #f8debf;
}

/* Neuer heller Erzaehl-/Inhaltsbereich-Hintergrund (dezente Wasserzeichen:
   Pinsel, Stifte, Farbpalette, Sterne, Herzen, Loomus, Fina, Lumaria-
   Elemente). Bewusst auf <main> statt <body> gesetzt, damit Navigation
   und der allgemeine Website-Header (beide liegen im DOM VOR <main>,
   ausserhalb davon) garantiert unberuehrt bleiben -- der Hintergrund
   beginnt dadurch strukturell zwingend erst im Inhaltsbereich. Gleiche
   bewaehrte Technik wie bei den Werkstatt-Unterseiten (siehe
   body.werkstatt-page.werkstatt-*-page weiter oben): background-
   size:100% 100% + no-repeat + scroll verhindert JEDE sichtbare
   Wiederholungsnaht, unabhaengig davon, wie hoch der Inhalt spaeter
   wird. background-color als Sicherheits-Unterlage in dergleichen
   cremig-beigen Bildfarbe, falls durch Rundungen ein Hauch Rand
   sichtbar wird -- dadurch wirkt der Uebergang zur restlichen Seite
   immer weich statt hart abgeschnitten. */
body.post-lumaria-page main {
  position: relative;
  background-color: #f8debf;
  background-image: url("../img/post-lumaria-bg.png?v=1");
  background-repeat: no-repeat;
  background-position: top center;
  background-size: 100% 100%;
}

/* Neue fertige Ueberschrift-Grafik ("Schick dein Kunstwerk nach Lumaria"
   mit Emma/Loomus/Fina/Brief) ersetzt die vorherige textliche
   Ueberschrift komplett -- kein zusaetzliches <h1>/<h2> an dieser
   Stelle. Eigener Alpha-Kanal (echte Transparenz) bleibt erhalten, kein
   weisser Kasten/Hintergrund dahinter. max-width 920px haelt sie auf
   Desktop grosszuegig, aber nicht ueberdimensioniert -- freistehend
   statt wie ein rechteckiges Standardbild. */
.post-lumaria-heading-wrap {
  padding: 2rem 1.5rem 0.5rem;
  text-align: center;
}

.post-lumaria-heading-img {
  display: block;
  width: 100%;
  max-width: 920px;
  height: auto;
  margin: 0 auto;
}

@media (max-width: 640px) {
  .post-lumaria-heading-wrap {
    padding: 1.25rem 1rem 0.25rem;
  }
}

/* Ueberschreibt gezielt nur die geerbten .section-Abstaende (3.5rem
   oben/unten) fuer diesen einen Bereich -- Text und Briefkasten sollen
   als EIN kompakter, harmonischer Abschnitt wirken statt durch grosse
   Leerraeume von der Ueberschrift-Grafik darueber und dem Formular
   darunter getrennt zu sein. */
.post-lumaria-hero {
  position: relative;
  padding-top: 1.25rem;
  padding-bottom: 1.5rem;
  text-align: center;
}

/* Divider dieses Bereichs bewusst kompakter als der globale Standard-
   abstand (siehe .divider weiter oben, dort unveraendert fuer alle
   anderen Seiten). */
.post-lumaria-hero .divider {
  margin: 0.5rem auto 0.9rem;
}

.post-lumaria-intro-row {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 2.5rem;
  flex-wrap: wrap;
  max-width: 900px;
  margin: 0 auto 0.75rem;
  text-align: left;
}

.post-lumaria-greeting {
  flex: 1 1 320px;
  max-width: 420px;
  text-align: left;
}

/* Weniger kursiv/verspielt, dafuer gut lesbar: normale Schrift statt
   durchgaengigem Italic. */
.post-lumaria-greeting p {
  margin: 0 0 0.65rem;
  font-size: 1rem;
  line-height: 1.55;
  color: var(--color-parchment);
}

.post-lumaria-greeting p:last-child {
  margin-bottom: 0;
}

/* Neue Briefkasten-Grafik hat ein etwas breiteres Seitenverhaeltnis als
   die vorherige (naeher an 1:1 statt hochformatig) -- max-width leicht
   von 260px auf 300px angehoben, damit sie bei gleicher ungefaehrer
   Bildhoehe wie zuvor sichtbar etwas breiter wirkt, wie gewuenscht.
   .post-lumaria-greeting behaelt ihre eigene max-width:420px, der
   Textbereich wird durch die zusaetzlichen 40px daher nicht verdraengt
   (siehe Kommentar bei .post-lumaria-intro-row). */
.post-lumaria-mailbox-wrap {
  flex: 0 1 300px;
  display: flex;
  justify-content: center;
}

.post-lumaria-mailbox-img {
  width: 100%;
  max-width: 300px;
  height: auto;
}

/* "So funktioniert's": fertige, bereits vollstaendig gestaltete
   Illustration (ersetzt den vorherigen HTML-Kachel-/Text-Aufbau
   komplett) -- nur zentrieren und Abstand geben, keine eigene Box/
   kein Rahmen/kein Schatten, da die Grafik selbst schon ein fertiges
   Gestaltungselement ist. */
.post-lumaria-howto {
  max-width: 1100px;
  margin: 2rem auto 2.2rem;
  text-align: center;
}

.post-lumaria-howto-img {
  display: block;
  width: 100%;
  height: auto;
  margin: 0 auto;
}

/* Dezente freundliche Elternorientierung statt sachlichem Hinweistext --
   bewusst kein Rahmen/keine Box/kein grosser Kontrast, damit es NICHT
   wie ein rechtlicher Hinweis wirkt. */
.post-lumaria-separate-note {
  max-width: 640px;
  margin: 0.5rem auto 0;
  text-align: center;
}

.post-lumaria-separate-note-main {
  margin: 0 0 0.3rem;
  font-family: var(--font-heading);
  font-size: 1.05rem;
  color: var(--color-parchment);
}

.post-lumaria-separate-note-sub {
  margin: 0;
  font-size: 0.85rem;
  line-height: 1.5;
  color: var(--color-parchment-dim);
}

.post-lumaria-upload-card {
  position: relative;
  max-width: 560px;
  margin: 0 auto;
  padding: 2.4rem 2.2rem;
  background: rgba(var(--surface-rgb), 0.82);
  border: 1px solid rgba(var(--color-gold-rgb), 0.4);
  border-radius: 22px;
  box-shadow: 0 18px 44px rgba(74, 63, 102, 0.18);
}

.post-lumaria-form {
  display: flex;
  flex-direction: column;
  gap: 1.2rem;
  text-align: left;
}

.post-lumaria-field label {
  display: block;
  margin-bottom: 0.4rem;
  font-family: var(--font-heading);
  color: var(--color-gold-light);
}

.post-lumaria-field input[type="text"],
.post-lumaria-field input[type="email"],
.post-lumaria-field input[type="number"],
.post-lumaria-field input[type="file"] {
  width: 100%;
  padding: 0.65rem 0.9rem;
  background: rgba(255, 255, 255, 0.6);
  border: 1px solid rgba(var(--color-gold-rgb), 0.4);
  border-radius: 10px;
  font-family: var(--font-body);
  font-size: 0.98rem;
  color: var(--color-parchment);
}

.post-lumaria-field input:focus {
  outline: none;
  box-shadow: 0 0 0 3px rgba(var(--color-gold-rgb), 0.18);
}

.post-lumaria-field-checkbox {
  display: flex;
  align-items: flex-start;
  gap: 0.6rem;
}

.post-lumaria-field-checkbox input {
  margin-top: 0.35rem;
  width: auto;
  accent-color: var(--color-gold);
}

.post-lumaria-field-checkbox label {
  margin: 0;
  font-family: var(--font-body);
  font-size: 0.92rem;
  color: var(--color-parchment-dim);
}

.post-lumaria-submit-row {
  text-align: center;
  margin-top: 0.4rem;
}

.post-lumaria-submit {
  box-shadow: 0 10px 24px rgba(var(--color-gold-rgb), 0.28);
}

.post-lumaria-note {
  text-align: center;
  font-size: 0.85rem;
  color: var(--color-parchment-dim);
  margin: 0.8rem 0 0;
}

/* Zustellungs-Animation: fliegender Brief + Funken + Dankesmeldung.
   Position/Ziel werden per JS aus den tatsaechlichen Bildschirm-
   koordinaten von Formular und Briefkasten berechnet (siehe
   post-nach-lumaria.html), damit es bei jeder Bildschirmgroesse passt.
   Bewusst KEIN echter Upload -- solange keine Server-Anbindung
   existiert, ersetzt diese Animation nur die Rueckmeldung. */
.post-lumaria-anim-layer {
  position: fixed;
  inset: 0;
  z-index: 500;
  pointer-events: none;
  opacity: 0;
  visibility: hidden;
}

.post-lumaria-anim-layer.is-active {
  opacity: 1;
  visibility: visible;
}

.post-lumaria-letter {
  position: fixed;
  font-size: 2.2rem;
  filter: drop-shadow(0 0 10px rgba(217, 180, 90, 0.7));
}

.post-lumaria-spark {
  position: fixed;
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: radial-gradient(circle, #fff7e0 0%, #d9a94f 70%, transparent 100%);
  z-index: 501;
  pointer-events: none;
  animation: post-lumaria-spark-burst 1.4s ease-out forwards;
}

@keyframes post-lumaria-spark-burst {
  0%   { opacity: 0; transform: translate(-50%, -50%) scale(0.5); }
  30%  { opacity: 1; }
  100% { opacity: 0; transform: translate(calc(-50% + var(--dx)), calc(-50% + var(--dy))) scale(1.1); }
}

.post-lumaria-success {
  text-align: center;
  padding: 1rem 0.5rem 0;
  font-size: 1.1rem;
}

@media (max-width: 640px) {
  .post-lumaria-intro-row {
    flex-direction: column;
    /* flex-basis:320px (siehe .post-lumaria-greeting, Basiswert fuer die
       Zeilen-Anordnung) wird in flex-direction:column ploetzlich zur
       HOEHEN-Vorgabe statt zur Breiten-Vorgabe -- der Textblock bekam
       dadurch eine erzwungene Mindesthoehe von 320px, obwohl der
       eigentliche Text viel kuerzer ist. Das erzeugte genau die grosse
       leere Flaeche vor dem Briefkasten. auto+0 hier gezielt nur auf
       Mobile ueberschrieben. */
    gap: 1.75rem;
  }

  .post-lumaria-greeting {
    flex-basis: auto;
    min-height: 0;
  }

  .post-lumaria-upload-card {
    padding: 1.8rem 1.4rem;
  }
}

@media (prefers-reduced-motion: reduce) {
  .post-lumaria-letter {
    transition: none !important;
  }

  .post-lumaria-spark {
    animation-duration: 0.4s;
  }
}

/* Galerie der kleinen Kuenstler */

.gallery-greeting {
  font-style: italic;
  font-size: 1.1rem;
  max-width: 560px;
  margin: 0 auto;
}

.kuenstler-galerie-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
  gap: 1.6rem;
  max-width: 1000px;
  margin: 0 auto;
}

.kuenstler-galerie-empty {
  grid-column: 1 / -1;
  text-align: center;
  padding: 2.4rem 1.6rem;
  background: rgba(var(--surface-rgb), 0.6);
  border: 1px dashed rgba(var(--color-gold-rgb), 0.4);
  border-radius: 18px;
  color: var(--color-parchment-dim);
}

/* ================================================================ */
/* Kids-Galerie                                                      */
/* ================================================================ */

/* Seitenhintergrund dieser Seite: sehr helles warmes Creme (#f8debf,
   derselbe Ton wie der bereits vorhandene <main>-Hintergrund via
   body.post-lumaria-page main) statt reinem Weiss -- eigene Klasse
   statt der geteilten post-lumaria-page-Klasse (haengt auch an
   post-nach-lumaria.html), damit diese Regel garantiert nur auf
   kids-galerie.html wirkt. */
body.kids-galerie-video-page {
  background-color: #f8debf;
}

/* Header-Video (nur auf kids-galerie.html, ersetzt dort die sonst hier
   stehenden Logos -- rundes Bildlogo + goldenes Schriftlogo --
   vollstaendig): aspect-ratio statt object-fit-Zuschnitt, damit die
   Box-Form IMMER exakt der Video-Form entspricht -- dadurch rechnerisch
   garantiert kein Zuschnitt/Zoom/Verzerrung und keine Balken. max-width
   920px (Video ist 1280x640, also 2:1) ergibt ca. 460px Hoehe -- exakt
   die kompakte Headerhoehe, die auf anderen Seiten (Marktplatz,
   Gratis-Schatztruhe) bereits etabliert ist. */
.kids-galerie-hero-video-wrap {
  position: relative;
  width: 100%;
  max-width: 920px;
  margin: 0 auto;
  overflow: hidden;
  line-height: 0;
  background-color: #f8debf;
}

/* mask-image blendet die aeusseren ~10% links/rechts weich aus (wie
   gewuenscht: 8-12%), die Mitte bleibt bei 100% deckend. Die dadurch
   "verschwindenden" Randbereiche geben den Blick auf den
   background-color:#f8debf des Wraps frei (siehe oben) -- dadurch
   verschmilzt die Videokante nahtlos mit der Seitenfarbe, ganz ohne
   Farbwasch-Overlay, Schatten oder Rahmen. */
.kids-galerie-hero-video {
  display: block;
  width: 100%;
  aspect-ratio: 1280 / 640;
  height: auto;
  object-fit: contain;
  -webkit-mask-image: linear-gradient(to right, transparent 0%, black 10%, black 90%, transparent 100%);
  mask-image: linear-gradient(to right, transparent 0%, black 10%, black 90%, transparent 100%);
}

/* Navigation auf dieser Seite bekommt denselben warmen Creme-Ton wie
   der Seitenhintergrund statt reinem Weiss -- Selektor ueber den
   direkt vorangehenden Geschwister-Node .kids-galerie-hero-video-wrap
   (existiert ausschliesslich im HTML von kids-galerie.html) statt
   ueber body.post-lumaria-page (haengt auch an post-nach-lumaria.html)
   beschraenkt, dadurch bleibt diese Regel garantiert auf genau diese
   eine Seite begrenzt. Nur die Hintergrundfarbe aendert sich --
   Position, Hoehe, Schrift, Abstaende, Dropdowns und Funktion der
   Navigation bleiben unangetastet. */
.kids-galerie-hero-video-wrap + header.site-header {
  background-color: #f8debf;
}

.kids-gallery-sparkle {
  color: var(--color-gold);
  font-size: 1rem;
  animation-duration: 3s;
}

/* Fertige Ueberschrift-Grafik ersetzt H1 + Untertitel komplett -- soll
   wie eine schoene Seitenueberschrift wirken, aber nicht riesig werden.
   Eigene Transparenz bleibt erhalten, kein Kasten/Hintergrund dahinter. */
.kids-gallery-heading-img {
  display: block;
  width: min(90%, 850px);
  max-width: 850px;
  height: auto;
  margin: 0.3rem auto 1.2rem;
}

.kids-gallery-intro {
  font-size: 1.1rem;
  max-width: 560px;
  margin: 0 auto;
}

.kids-gallery-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
  gap: 2rem;
  max-width: 1000px;
  margin: 0 auto;
}

/* Kachel-Aufbau bewusst an .lumaria-tile angelehnt (gleiche Radien,
   Rahmenfarbe, Schatten, Hover-Anhebung) -- eigener Klassenname, da
   .lumaria-tile visuell speziell auf die "Entdecke Lumaria"-Kacheln
   (mit Icon/Titel) zugeschnitten ist und hier stattdessen ein
   Bildrahmen + Bildunterschrift gebraucht wird. */
.kids-gallery-card {
  display: block;
  background: rgba(var(--surface-rgb), 0.55);
  border: 1px solid rgba(var(--color-gold-rgb), 0.35);
  border-radius: 18px;
  padding: 0.9rem 0.9rem 1.1rem;
  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.07);
  transition: transform 0.35s ease, box-shadow 0.35s ease, border-color 0.35s ease;
}

.kids-gallery-card.has-image {
  cursor: pointer;
}

.kids-gallery-card.has-image:hover,
.kids-gallery-card.has-image:focus-visible {
  transform: translateY(-6px) scale(1.02);
  box-shadow: 0 16px 34px rgba(var(--color-gold-rgb), 0.32);
  border-color: rgba(var(--color-gold-rgb), 0.7);
}

.kids-gallery-frame {
  position: relative;
  aspect-ratio: 4 / 3;
  border-radius: 14px;
  overflow: hidden;
  background: rgba(255, 255, 255, 0.35);
  border: 1px dashed rgba(var(--color-gold-rgb), 0.45);
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
}

.kids-gallery-card.has-image .kids-gallery-frame {
  border-style: solid;
}

.kids-gallery-img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: transform 0.5s ease;
}

.kids-gallery-card.has-image:hover .kids-gallery-img {
  transform: scale(1.04);
}

.kids-gallery-placeholder-icon {
  display: block;
  font-size: 2rem;
  margin-bottom: 0.4rem;
  opacity: 0.6;
}

.kids-gallery-placeholder-text {
  margin: 0;
  padding: 0 0.8rem;
  font-size: 0.92rem;
  color: var(--color-parchment-dim);
  opacity: 0.75;
}

.kids-gallery-caption {
  display: block;
  margin-top: 0.8rem;
  text-align: center;
  min-height: 2.6em;
}

.kids-gallery-caption-name {
  display: block;
  font-family: var(--font-heading);
  font-size: 1rem;
  color: var(--color-gold-light);
}

.kids-gallery-caption-title {
  display: block;
  font-size: 0.9rem;
  color: var(--color-parchment-dim);
  font-style: italic;
}

@media (max-width: 640px) {
  .kids-gallery-grid {
    gap: 1.4rem;
  }
}

/* Lightbox: nur Kacheln mit echtem Bild (.has-image) sind klickbar --
   Platzhalter oeffnen nichts, da es noch nichts zu vergroessern gibt.
   Generisch per data-Attribut gesteuert (siehe kids-galerie.html),
   damit spaeter eingefuegte echte Kunstwerke ohne JS-Aenderung
   funktionieren. */
.kids-lightbox {
  position: fixed;
  inset: 0;
  z-index: 900;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 2rem;
  background: rgba(42, 30, 58, 0.82);
  opacity: 0;
  visibility: hidden;
  transition: opacity 0.3s ease, visibility 0s linear 0.3s;
}

.kids-lightbox.is-active {
  opacity: 1;
  visibility: visible;
  transition: opacity 0.3s ease, visibility 0s linear 0s;
}

.kids-lightbox-img {
  display: block;
  max-width: min(90vw, 700px);
  max-height: 78vh;
  width: auto;
  height: auto;
  border-radius: 16px;
  box-shadow: 0 20px 50px rgba(0, 0, 0, 0.4);
}

.kids-lightbox-caption {
  position: absolute;
  bottom: 2rem;
  left: 50%;
  transform: translateX(-50%);
  color: #fff7e0;
  text-align: center;
  font-size: 1rem;
}

.kids-lightbox-close {
  position: absolute;
  top: 1.2rem;
  right: 1.5rem;
  width: 40px;
  height: 40px;
  border-radius: 50%;
  border: 1px solid rgba(255, 247, 224, 0.5);
  background: rgba(255, 255, 255, 0.08);
  color: #fff7e0;
  font-size: 1.3rem;
  line-height: 1;
  cursor: pointer;
}

.kids-lightbox-close:hover {
  background: rgba(255, 255, 255, 0.18);
}

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

/* Fliegender Loomus mit Pinsel: rein dekoratives, wiederverwendbares
   Detail, per Skript (siehe HTML von kids-galerie.html und
   post-nach-lumaria.html) in einer sanften, organischen Bahn bewegt.
   position:fixed statt absolute, damit er beim Scrollen sichtbar
   "mitfliegt" statt an einer festen Stelle im Seiteninhalt zu bleiben.
   WICHTIG: das HTML-Element MUSS ein direktes Kind von <body> sein
   (siehe HTML) -- jede [data-reveal]-Sektion traegt fuer ihre Scroll-
   Einblendung transform:translateY(...), und JEDER transform-Wert
   ungleich none erzeugt einen neuen Containing Block fuer position:
   fixed-Nachfahren (auch bei translateY(0)). Waere Loomus innerhalb
   einer solchen Sektion verschachtelt, wuerde er relativ zu DIESER
   Sektion statt zum Viewport "fixiert" -- er wuerde also NICHT
   mitfliegen. Containment ist daher NICHT mehr strukturell (wie bei
   der frueheren position:absolute-Variante), sondern das Flugscript
   blendet ihn per IntersectionObserver aus, sobald Navigation ODER
   Footer im Sichtfenster stehen, damit er sie nie ueberdeckt (siehe
   Skript ganz unten). pointer-events:none stellt zusaetzlich sicher,
   dass Buttons/Links IMMER anklickbar bleiben. z-index bewusst unter
   dem der Navigation (20, siehe .site-header weiter oben) als zweite
   Absicherung. Groesse gestaffelt: 135px Desktop, 110px Tablet, 80px
   Smartphone. Klasse bewusst OHNE Seitenpraefix, da identisch auf
   beiden Seiten verwendet. */
.loomus-flying-brush {
  position: fixed;
  top: 0;
  left: 0;
  z-index: 15;
  /* 143 statt 135: Die Bilderreihe ist enger beschnitten als die
     frühere Einzelgrafik. Nachgemessen füllte Loomus dort 82 % der
     Bildbreite, hier sind es 77 % — bei gleicher CSS-Breite wäre er
     also geschrumpft. So bleibt er in beiden Fällen rund 110 Bild-
     punkte breit zu sehen. */
  width: 143px;
  pointer-events: none;
  transition: opacity 0.35s ease, transform 0.5s ease;
  will-change: transform;
}

.loomus-flying-brush-img {
  display: block;
  width: 100%;
  height: auto;
}

@media (max-width: 900px) {
  .loomus-flying-brush {
    width: 117px;
  }
}

@media (max-width: 640px) {
  .loomus-flying-brush {
    width: 85px;
  }
}

/* Nur "Post nach Lumaria" (nicht kids-galerie.html, dieselbe Klasse
   ohne Seitenpraefix wird dort weiterverwendet): auf Mobile ist der
   Abstand zwischen Text und Briefkasten jetzt sehr kompakt (siehe
   .post-lumaria-intro-row weiter oben) -- der grossflaechig ueber die
   ganze obere Bildschirmhaelfte schwebende Loomus wuerde darin nicht
   mehr wirken wie ein kleiner Begleiter, sondern wie ein ueberdimen-
   sionierter Fremdkoerper im knappen Raum. Auf dieser Seite deshalb
   auf Smartphone ausgeblendet, auf kids-galerie.html unveraendert. */
@media (max-width: 640px) {
  body.post-lumaria-video-page .loomus-flying-brush {
    display: none;
  }
}

/* Loomus: dieselbe Zwei-Sekunden-verzoegerte Emergenz wie beim
   Waldwaechter auf der Marktplatz-Seite, hier per @keyframes statt per
   scroll-getriggertem is-visible, da Loomus direkt beim Laden der Seite
   erscheinen soll (nicht erst beim Scrollen). Der clip-path blendet die
   zweite (untere) Hand und den Schwanz aus, sodass nur Kopf, eine Hand,
   ein Teil des Koerpers und ein Fluegel sichtbar sind.

   KORREKTUR: nicht mehr viewport-fixiert, sondern position:absolute
   innerhalb der neuen .kontakt-scene-Huelle (siehe dort) -- scrollt
   dadurch ganz normal mit dem Seiteninhalt. Der Header ist stattdessen
   jetzt selbst fest (siehe .kontakt-header-wrap), der Abstand dazu
   entsteht ueber main.kontakt-main padding-top -- Loomus braucht daher
   keinen eigenen Header-Versatz mehr und nutzt wieder seine
   urspruenglichen, unveraenderten Prozentwerte. */
.kontakt-loomus-wrap {
  position: absolute;
  top: 7%;
  /* Er steht so weit rechts, dass die Kante des Baumstamms durch sein
     linkes Viertel laeuft -- genau dort wird er abgeschnitten und lugt
     dadurch HINTER dem Stamm hervor. Gemessen: Weil seine Lage und
     seine Groesse in Prozent der Buehne stehen und der Hintergrund per
     cover mit derselben Buehne skaliert, sitzt die Stammkante bei jeder
     Fensterbreite an derselben Stelle seiner Breite. */
  left: 6.6%;
  width: 13.5%;
  max-width: 168px;
  min-width: 78px;
  z-index: 0;
  pointer-events: none;
  opacity: 0;
  transform: translate(-22px, 16px);
  /* Frueher wartete er zwei Sekunden und brauchte dann noch einmal
     knapp zwei zum Hervorkommen -- wer die Seite nur ueberflog, hat ihn
     nie gesehen. Jetzt ist er nach nicht einmal einer Sekunde
     vollstaendig da und winkt dabei schon. */
  animation: loomus-emerge 0.8s cubic-bezier(0.22, 1, 0.36, 1) 0.15s forwards;
}

@keyframes loomus-emerge {
  to {
    opacity: 1;
    transform: translate(0, 0);
  }
}

/* Loomus winkt ohne Unterlass.

   WIE DAS GEHT: img/loomus-winkt.png enthaelt vier Haltungen in einer
   Reihe. Die Flaeche ist genau so breit wie EINE Haltung; der Streifen
   dahinter ist viermal so breit (background-size: 400%) und wird per
   background-position taktweise weitergeschoben. Weil alle vier schon
   im selben Bild stecken, gibt es beim Wechsel kein Nachladen und kein
   Flackern -- anders als beim Austausch der Bildquelle.

   Die vier Haltungen sind deckungsgleich zugeschnitten (gemeinsamer
   Ausschnitt aus der Vorlage), der Kopf bleibt beim Wechsel also genau
   an seinem Platz und nur die Hand bewegt sich.

   Der Takt laeuft 2-3-4-3: Die Hand schwingt hin und wieder zurueck,
   statt nach der letzten Haltung an den Anfang zu springen. */
.loomus {
  display: block;
  width: 100%;
  aspect-ratio: 380 / 374;
  background: url("../img/loomus-winkt.png?v=1") no-repeat 33.333% 0 / 400% 100%;
  /* HINTER DEM STAMM: Sein linkes Viertel wird weggeschnitten, die
     Schnittkante liegt bei jeder Fensterbreite ein Stueck INNERHALB des
     gemalten Stammes. Dadurch lugt er hervor, statt davor zu schweben.

     WARUM DER SCHNITT FAST SENKRECHT IST: Der Stamm hat oben Aeste,
     seine sichtbare Kante springt je nach Bildausschnitt zwischen etwa
     175 und 240 Punkten der Vorlage hin und her. Ein Schnitt, der ihr
     genau folgt, passt deshalb nur bei einer Fensterbreite -- bei 834px
     klaffte eine Luecke von 25 Punkten helles Bild zwischen Stamm und
     Loomus. Die fast senkrechte Kante liegt dagegen bei 1280, 834 und
     375 Punkten sicher auf dem dunklen Stamm.
     Nach unten laeuft er zusaetzlich weich aus: Die Vorlage endet dort
     mit einer geraden Kante, die sonst wie abgeschnitten aussaehe. */
  clip-path: polygon(26% 0, 100% 0, 100% 100%, 30% 100%);
  -webkit-mask-image: linear-gradient(to bottom, #000 73%, rgba(0, 0, 0, 0) 98%);
          mask-image: linear-gradient(to bottom, #000 73%, rgba(0, 0, 0, 0) 98%);
  animation: loomus-winken 1.04s steps(1, end) infinite;
}

@keyframes loomus-winken {
  0%   { background-position-x: 33.333%; }
  25%  { background-position-x: 66.667%; }
  50%  { background-position-x: 100%; }
  75%  { background-position-x: 66.667%; }
  100% { background-position-x: 33.333%; }
}

.loomus-spark {
  position: absolute;
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--color-gold);
  box-shadow: 0 0 8px 2px rgba(var(--color-gold-rgb), 0.7);
  opacity: 0;
  pointer-events: none;
  animation: loomus-spark-rise 1s ease-in-out forwards;
}

@keyframes loomus-spark-rise {
  0% { opacity: 0; transform: translateY(0) scale(0.6); }
  35% { opacity: 0.9; }
  100% { opacity: 0; transform: translateY(-14px) scale(1.15); }
}

@media (max-width: 900px) {
  .kontakt-loomus-wrap {
    width: 18%;
    /* Gemessen bei 834px: so laeuft die Stammkante wieder durch sein
       linkes Viertel. */
    left: 5.4%;
    top: 6%;
  }
}

@media (max-width: 640px) {
  .kontakt-loomus-wrap {
    width: 20%;
    max-width: 84px;
    top: 4%;
    left: 2%;
  }

}

@media (prefers-reduced-motion: reduce) {
  .kontakt-loomus-wrap {
    animation: loomus-fade-only 1s ease 0.3s forwards;
    transform: none;
  }

  .loomus {
    /* Kein Winken, aber die freundliche Haltung mit erhobener Hand. */
    animation: none;
    background-position-x: 33.333%;
  }

  .loomus-spark {
    display: none;
  }
}

@keyframes loomus-fade-only {
  from { opacity: 0; }
  to { opacity: 1; }
}

/* Footer */

.site-footer {
  margin-top: auto;
  text-align: center;
  padding: 2rem 1.5rem;
  border-top: 1px solid rgba(var(--color-gold-rgb), 0.2);
  color: var(--color-parchment-dim);
  font-size: 0.9rem;
}

.site-footer-copyright {
  margin: 0 0 0.9rem;
}

/* Rechtliche Links (Impressum/Datenschutz/AGB): bewusst als schlichte
   Textlinks mit duennem goldenem Trenner statt Buttons -- passend zu
   "dezent und hochwertig, keine auffaelligen Buttons". flex-wrap sorgt
   dafuer, dass sie auf sehr schmalen Bildschirmen notfalls umbrechen,
   ohne dass etwas abgeschnitten wird. */
.site-footer-legal {
  display: flex;
  justify-content: center;
  flex-wrap: wrap;
  font-family: var(--font-heading);
}

.site-footer-legal a {
  color: var(--color-parchment-dim);
  text-decoration: none;
  padding: 0.2rem 0.9rem;
  border-right: 1px solid rgba(var(--color-gold-rgb), 0.3);
  transition: color 0.2s ease;
}

.site-footer-legal a:last-child {
  border-right: none;
}

.site-footer-legal a:hover,
.site-footer-legal a:focus-visible {
  color: var(--color-gold-light);
}

/* Glitzersterne (nur Startseite) */

.sparkle-layer {
  position: fixed;
  inset: 0;
  overflow: hidden;
  pointer-events: none;
  z-index: 0;
}

/* Positionierte Elemente stapeln sich immer über nicht-positionierten Inhalten,
   darum brauchen Header/Main/Footer einen eigenen Stapelkontext über der fixen Sparkle-Ebene. */
.brand-banner,
.site-header,
main,
.site-footer {
  position: relative;
  z-index: 1;
}

/* .site-header braucht einen hoeheren Stapelkontext als <main>: beide
   haben sonst dasselbe z-index:1, wodurch <main> (spaeter im DOM)
   bei jeder Ueberschneidung gewinnen wuerde -- das Dropdown-Menue der
   Hauptnavigation (siehe .nav-dropdown-panel) ragt aber bewusst unter
   den Header in die Seite hinein und muss dort zuverlaessig ueber dem
   Seiteninhalt liegen. */
.site-header {
  z-index: 20;
}

/* "Lumarias Marktplatz" (shop.html), KORRIGIERTE Fassung: ein
   frueherer Versuch legte die Navigation per negativem margin-top +
   position:sticky als Overlay AUF das Video. Das margin-top zog dabei
   zwar den <header> selbst nach oben ueber das Video, entzog dem
   nachfolgenden Seiteninhalt (insbesondere .marketplace-hero mit dem
   Holzschild-Bild "Lumarias Marktplatz") aber ebenfalls die gesamte
   Videohoehe aus dem normalen Fluss -- der Inhalt rutschte dadurch
   ungewollt selbst mit ins Video hinein. Jetzt bleibt der <header>
   ganz ohne Sonderklasse: normaler Fluss direkt nach dem Video,
   dieselbe Gestaltung wie auf jeder anderen Seite (Schrift, Farben,
   Abstaende, Dropdowns, aktive Unterstreichung, Hover unveraendert).
   Da das runde Bildlogo auf dieser Seite komplett aus dem HTML entfernt
   ist (nicht nur unsichtbar gehalten), bleibt die Zeile von selbst
   kompakt -- kein grosser cremefarbener Leerraum vor dem naechsten
   Seiteninhalt. */

/* ================================================================ */
/* Kleiner KI-Geist im Header (nur "Meine Werkstatt")                */
/* ================================================================ */

/* Fliegt NICHT mehr frei ueber Header/Navigation (fruehere position:
   fixed-Variante ueberlagerte dort Menuepunkte, sobald sich der
   Seitenaufbau aenderte) -- position:absolute relativ zu .werkstatt-
   scene (position:relative, siehe dort), dadurch nur noch innerhalb
   des eigentlichen Erzaehlbereichs sichtbar und scrollt normal mit
   der Seite statt dauerhaft im Viewport zu haengen. top/left werden
   direkt in Prozent animiert (statt transform:translate in px) --
   Prozentwerte bei top/left orientieren sich am Container, dadurch
   skaliert die Flugbahn automatisch mit der tatsaechlichen Groesse von
   .werkstatt-scene (auf Desktop mehrere hundert Pixel hoch), statt auf
   einen kleinen, immer gleich grossen Pixel-Ausschnitt oben links
   begrenzt zu sein (fruehere, zu kleine Fassung). Ab 801px (zweispaltig,
   siehe .werkstatt-geist-layout) bleibt die Bahn im freien linken Rand
   links von der Textspalte (Textspalte beginnt bei ca. 22% der
   Sektionsbreite, die Bahn unten haelt sich durchgaengig darunter) --
   dadurch fliegt der Geist ueber weite Teile der Sektionshoehe, ohne je
   Text zu ueberdecken. pointer-events:none auf allen Ebenen, damit
   Klicks im Textbereich nie blockiert werden. Nur auf body.werkstatt-
   page (das Markup existiert ausserdem nur in werkstatt.html). */
body.werkstatt-page .ki-geist-fly-wrap {
  position: absolute;
  top: 4%;
  left: 2%;
  width: 100px;
  z-index: 2;
  pointer-events: none;
  animation: ki-geist-fly 52s ease-in-out infinite;
}

body.werkstatt-page .ki-geist-fly-body {
  display: block;
  animation: ki-geist-wingbeat 1.6s ease-in-out infinite;
}

@keyframes ki-geist-wingbeat {
  0%, 100% { transform: translateY(0) scaleY(1) rotate(0deg); }
  25%      { transform: translateY(-2px) scaleY(1.02) rotate(1deg); }
  50%      { transform: translateY(0.6px) scaleY(0.98) rotate(0deg); }
  75%      { transform: translateY(-1.2px) scaleY(1.01) rotate(-1deg); }
}

body.werkstatt-page .ki-geist-fly-img {
  display: block;
  width: 100%;
  height: auto;
  transform-origin: 50% 50%;
  animation: ki-geist-sway 3.8s ease-in-out infinite, ki-geist-shimmer 2.2s ease-in-out infinite;
}

@keyframes ki-geist-sway {
  0%, 100% { transform: rotate(0deg); }
  50%      { transform: rotate(-3deg); }
}

@keyframes ki-geist-shimmer {
  0%, 100% { filter: brightness(1); }
  45%      { filter: brightness(1.08); }
  55%      { filter: brightness(0.96); }
  80%      { filter: brightness(1.05); }
}

/* Wandert durch den freien linken Rand von .werkstatt-scene (links
   von der Textspalte, die auf >=801px bei ca. 22% der Sektionsbreite
   beginnt, siehe .werkstatt-geist-layout) -- top/left in Prozent
   bleiben so immer sicher darunter (max. 13%), waehrend die Bahn
   ueber einen grossen Teil der Sektionshoehe (2%-70%) streift, mit
   zwei kurzen Innehalte-Punkten (31%/34% und 67%/70%) fuer ein
   natuerlicheres Innehalten mitten im Flug. */
@keyframes ki-geist-fly {
  0%    { top: 4%;    left: 2%;    transform: rotate(-3deg); }
  14%   { top: 1%;    left: 7%;    transform: rotate(2deg); }
  28%   { top: 16%;   left: 11%;   transform: rotate(-2deg); }
  31%   { top: 16.5%; left: 11.3%; transform: rotate(-2deg); }
  48%   { top: 38%;   left: 6%;    transform: rotate(3deg); }
  64%   { top: 56%;   left: 12%;   transform: rotate(-1deg); }
  67%   { top: 56.5%; left: 12.3%; transform: rotate(-1deg); }
  84%   { top: 70%;   left: 4%;    transform: rotate(2deg); }
  100%  { top: 4%;    left: 2%;    transform: rotate(-3deg); }
}

body.werkstatt-page .ki-geist-fly-spark {
  position: absolute;
  width: 4px;
  height: 4px;
  border-radius: 50%;
  background: radial-gradient(circle, #fff2ff 0%, #a670d6 70%, transparent 100%);
  opacity: 0;
  pointer-events: none;
  animation: ki-geist-spark-rise 2.4s ease-in-out infinite;
}

@keyframes ki-geist-spark-rise {
  0%   { opacity: 0; transform: translateY(0) scale(0.6); }
  30%  { opacity: 0.85; }
  100% { opacity: 0; transform: translateY(-14px) scale(1.2); }
}

@media (max-width: 1300px) {
  body.werkstatt-page .ki-geist-fly-wrap {
    width: 86px;
  }

  /* Kein eigener Keyframe-Block noetig: top/left sind Prozentwerte
     (siehe @keyframes ki-geist-fly oben) und skalieren automatisch mit
     der schmaleren Sektionsbreite -- die zweispaltige Anordnung bleibt
     bis 800px bestehen, der linke Frei-Rand bleibt also gueltig. */
}

/* Ab hier faellt .werkstatt-geist-layout auf eine Spalte zusammen
   (Text ueber dem Bild, siehe media max-width:800px dort) -- Ueber-
   schrift, Absaetze UND das Portraitbild nehmen dann alle die volle
   Spaltenbreite ein, es gibt seitlich keinen freien Rand mehr. Der
   EINZIGE zuverlaessig freie Bereich ist der obere Innenabstand von
   .werkstatt-scene (padding-top:3rem = 48px, siehe dort) -- die
   Ueberschrift beginnt exakt danach. top wird deshalb hier bewusst in
   PX statt Prozent animiert (4px-16px, die Figur selbst nur noch
   28px hoch/breit): dadurch bleibt die Unterkante immer bei maximal
   ca. 44px, sicher oberhalb der bei 48px beginnenden Ueberschrift,
   unabhaengig von der (bei viel Text sehr grossen) Gesamthoehe der
   Sektion. left bleibt in Prozent fuer ein leichtes seitliches
   Wandern -- da vertikal ohnehin keine Ueberlappung entstehen kann,
   ist die horizontale Position dafuer unkritisch. */
@media (max-width: 800px) {
  body.werkstatt-page .ki-geist-fly-wrap {
    width: 28px;
    top: 8px;
    animation-duration: 34s;
  }

  @keyframes ki-geist-fly {
    0%   { top: 6px;  left: 1%; transform: rotate(-3deg); }
    25%  { top: 14px; left: 6%; transform: rotate(2deg); }
    50%  { top: 9px;  left: 10%; transform: rotate(-2deg); }
    75%  { top: 15px; left: 4%; transform: rotate(1deg); }
    100% { top: 6px;  left: 1%; transform: rotate(-3deg); }
  }
}

@media (prefers-reduced-motion: reduce) {
  body.werkstatt-page .ki-geist-fly-wrap {
    animation: ki-geist-fade-in 1.4s ease 0.2s both;
    top: 4%;
    left: 2%;
  }

  body.werkstatt-page .ki-geist-fly-img {
    animation: none;
  }

  body.werkstatt-page .ki-geist-fly-body {
    animation: none;
  }

  body.werkstatt-page .ki-geist-fly-spark {
    animation-duration: 3.2s;
  }
}

@keyframes ki-geist-fade-in {
  from { opacity: 0; }
  to   { opacity: 1; }
}

.sparkle {
  position: absolute;
  line-height: 1;
  filter: drop-shadow(0 0 3px currentColor) drop-shadow(0 0 8px currentColor) drop-shadow(0 0 16px currentColor);
  animation-name: sparkle-twinkle;
  animation-timing-function: ease-in-out;
  animation-iteration-count: infinite;
}

@keyframes sparkle-twinkle {
  0%, 100% {
    opacity: 0;
    transform: scale(0.35) rotate(0deg);
  }
  45% {
    opacity: 0.9;
    transform: scale(1) rotate(15deg);
  }
  55% {
    opacity: 1;
    transform: scale(1.25) rotate(20deg);
  }
  70% {
    opacity: 0.75;
    transform: scale(0.9) rotate(25deg);
  }
}

@media (prefers-reduced-motion: reduce) {
  .sparkle {
    animation: none;
    opacity: 0.35;
  }
}

/* Rechter Bilderrahmen (nur Startseite) */

.frame-right {
  position: absolute;
  top: 0;
  right: 0;
  width: auto;
  max-width: 45%;
  height: 100%;
  object-fit: cover;
  object-position: top right;
  z-index: 0;
  pointer-events: none;
  -webkit-mask-image: url("../img/frame-mask.svg?v=3");
  mask-image: url("../img/frame-mask.svg?v=3");
  -webkit-mask-size: 100% 100%;
  mask-size: 100% 100%;
}

@media (max-width: 640px) {
  .frame-right {
    display: none;
  }
}

/* Lumaria ("Entdecke Lumaria"): kleine "Entdeckungsreise"-Szene im
   sichtbaren freien Zwischenraum zwischen den beiden ersten Absaetzen
   im Erklaertext ("...Schritt fuer Schritt wachsen lassen." und
   "Jede Begegnung..."). .hero-loomus-zone ist ein ganz normales
   Element IM Textfluss selbst (siehe lumaria.html), dadurch sitzt der
   Container automatisch an der richtigen Stelle, egal wie der Text bei
   anderen Bildschirmgroessen umbricht. aspect-ratio entspricht exakt
   der Nutzer-Pfadgrafik (1500x843), damit sie nie gestreckt/beschnitten
   wird. position:relative + overflow:hidden machen die Zone zur
   alleinigen, klar begrenzten Positionierungsbasis -- Loomus (und die
   Pfadgrafik) koennen sich rechnerisch nur innerhalb dieser Box
   bewegen, niemals relativ zum restlichen Dokument.

   Einfache, robuste Reveal-Technik (ersetzt die fruehere SVG-Masken-
   Loesung): .hero-loomus-path ist ein ganz normales <img>, dessen
   CSS mask-image ein einzelner diagonaler Verlauf ist (unten-links
   nach oben-rechts, passend zur Grundrichtung der Pfadkurve). Die
   --reveal-Variable wird per JS animiert (siehe Script in
   lumaria.html) und schiebt die weiche Kante des Verlaufs ueber die
   Grafik -- dadurch wird sie in EINEM zusammenhaengenden, weich
   auslaufenden Zug sichtbar (kein Rechteck, keine harte Kante, kein
   Fragment).

   WICHTIG: das Clipping (overflow:hidden) fuer die Pfadgrafik liegt
   AUSSCHLIESSLICH auf .hero-loomus-path-layer, einer eigenen inneren
   Ebene, NICHT mehr auf .hero-loomus-zone selbst. .hero-loomus-wrap
   (Loomus) ist ein direktes Geschwister-Element dieser Ebene, liegt
   per z-index DARUEBER und wird von deren overflow:hidden nicht
   beruehrt -- er darf dadurch bei Bedarf (grosse Darstellung + Idle-
   Flatterbewegung) leicht ueber den Rand der Pfadgrafik hinausragen,
   ohne angeschnitten zu werden. .hero-loomus-zone selbst bleibt bei
   overflow:visible, ist aber weiterhin die alleinige
   Positionierungsbasis (offset-path-Koordinaten kommen aus
   zone.getBoundingClientRect(), nicht aus dem Dokumentfluss) --
   Loomus' Flugkurve ist zusaetzlich bewusst auf einen sicheren
   vertikalen Korridor gestaucht (siehe JS), wodurch er trotz
   overflow:visible auf der Zone praktisch nie in benachbarte
   Textabschnitte reicht. Loomus (.hero-loomus-wrap) bewegt sich
   synchron zum Reveal per CSS offset-path (Motion Path) entlang einer
   eigenen Kurve mit denselben Ankerpunkten; offset-path-Koordinaten
   sind IMMER relativ zur aktuellen Pixelgroesse der Zone (siehe Script),
   nicht zur Seite. Ablauf einmalig beim Sichtbarwerden
   (IntersectionObserver + kurze Pause): Pfad und Loomus starten
   unsichtbar/unten links bei 0%, der Reveal folgt Loomus mit kurzer
   Verzoegerung (er bleibt dadurch sichtbar VOR der Kante), bis Loomus
   oben rechts ankommt -- danach uebernimmt .has-landed eine dezente
   Dauer-Schwebebewegung (kein erneuter Flug, keine Wiederholung). Die
   Fluegelschlag-Animation (loomus-wingbeat) ist weiter oben definiert
   und laeuft unveraendert dauerhaft weiter. Auf der ganzen Seite gibt
   es ausschliesslich diesen einen Loomus -- kein zweites Vorkommen
   irgendwo sonst auf der Seite. */
.hero-loomus-zone {
  position: relative;
  width: 100%;
  aspect-ratio: 1500 / 843;
  margin: 0.5rem 0 1.5rem;
  overflow: visible;
  pointer-events: none;
}

.hero-loomus-path-layer {
  position: absolute;
  inset: 0;
  overflow: hidden;
  z-index: 0;
}

.hero-loomus-path {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: contain;
  -webkit-mask-image: linear-gradient(55deg, #000 0%, #000 var(--reveal, 0%), transparent calc(var(--reveal, 0%) + 22%), transparent 100%);
  mask-image: linear-gradient(55deg, #000 0%, #000 var(--reveal, 0%), transparent calc(var(--reveal, 0%) + 22%), transparent 100%);
}

.hero-loomus-wrap {
  position: absolute;
  top: 0;
  left: 0;
  z-index: 1;
  width: 134px;
  pointer-events: none;
  opacity: 0;
  offset-rotate: 0deg;
  offset-anchor: 50% 68%;
}

.hero-loomus-zone.is-active .hero-loomus-wrap {
  opacity: 1;
}

/* Idle-Flatterbewegung nach der Ankunft: mehrere unregelmaessige
   Zwischenpositionen statt einfachem Hoch-Runter, damit es wirkt, als
   wuerde Loomus frei in seinem Endbereich herumschweben statt an einem
   Punkt zu haengen. Bewusst asymmetrisch (mehr Bewegungsspielraum nach
   oben als nach unten); Loomus liegt auf der ungeclippten Zonen-Ebene
   (siehe .hero-loomus-path-layer weiter oben), ragt also selbst bei
   dieser Bewegung nie ueber den Rand der Pfadgrafik hinausgeschnitten
   heraus -- die eigentliche Flugkurve (offset-path) bleibt davon
   unberuehrt, nur dieses zusaetzliche transform wird obendrauf
   animiert. animation-delay haelt Loomus nach der Ankunft kurz (~1.7s)
   voellig still, bevor die Flatterbewegung einsetzt -- dadurch bleibt er
   beim normalen Scrollen erst einmal ruhig und gut wahrnehmbar sichtbar,
   statt sofort weiterzuzappeln. */
.hero-loomus-wrap.has-landed {
  animation: hero-loomus-idle-bob 9.5s ease-in-out infinite;
  animation-delay: 1.7s;
}

@keyframes hero-loomus-idle-bob {
  0%   { transform: translate(0, 0) rotate(0deg); }
  14%  { transform: translate(-25px, -18px) rotate(-2deg); }
  30%  { transform: translate(-40px, 8px) rotate(1.5deg); }
  46%  { transform: translate(-11px, 15px) rotate(2deg); }
  62%  { transform: translate(25px, 5px) rotate(-1.5deg); }
  78%  { transform: translate(32px, -25px) rotate(-2deg); }
  90%  { transform: translate(11px, -12px) rotate(1deg); }
  100% { transform: translate(0, 0) rotate(0deg); }
}

.hero-loomus-img {
  display: block;
  width: 100%;
  height: auto;
  transform-origin: 50% 55%;
  animation: loomus-wingbeat 1.1s ease-in-out infinite;
}

/* Sobald es eine echte Bilderreihe fuer Loomus gibt, setzt
   js/lumaria-tanz.js diese Klasse. Dann faellt das vorgetaeuschte
   Stauchen weg: Es hat den Fluegelschlag nur angedeutet, indem es das
   ganze Bild leicht verzerrt hat. Zusammen mit echten Fluegelbildern
   saehe das verwackelt aus -- der Koerper wuerde zappeln, waehrend die
   Fluegel schlagen. */
.hero-loomus-img.hat-reihe {
  animation: none;
}

/* Dezenter goldener Zauberstaub, der langsam verblasst -- Position
   relativ zum Schwanz der Illustration (unten links). Jeder Punkt
   blendet einzeln weich ein, driftet kurz und verschwindet wieder --
   in Dauerschleife, wie an anderen Stellen der Website bereits
   etabliert (siehe .wuzifluff-spark / .lumaria-heart-spark). */
.hero-loomus-dust {
  position: absolute;
  width: 5px;
  height: 5px;
  border-radius: 50%;
  background: radial-gradient(circle, #fff7e0 0%, #d9a94f 70%, transparent 100%);
  opacity: 0;
  pointer-events: none;
  animation: hero-loomus-dust-rise 2.4s ease-in-out infinite;
}

@keyframes hero-loomus-dust-rise {
  0%   { opacity: 0;   transform: translate(0, 0)       scale(0.6); }
  25%  { opacity: 0.8; }
  100% { opacity: 0;   transform: translate(-14px, 10px) scale(1.2); }
}

@media (max-width: 900px) {
  .hero-loomus-wrap {
    width: 107px;
  }

  @keyframes hero-loomus-idle-bob {
    0%   { transform: translate(0, 0) rotate(0deg); }
    14%  { transform: translate(-20px, -14px) rotate(-2deg); }
    30%  { transform: translate(-32px, 6px) rotate(1.5deg); }
    46%  { transform: translate(-9px, 12px) rotate(2deg); }
    62%  { transform: translate(20px, 4px) rotate(-1.5deg); }
    78%  { transform: translate(26px, -20px) rotate(-2deg); }
    90%  { transform: translate(9px, -10px) rotate(1deg); }
    100% { transform: translate(0, 0) rotate(0deg); }
  }
}

@media (max-width: 640px) {
  .hero-loomus-wrap {
    width: 80px;
  }

  @keyframes hero-loomus-idle-bob {
    0%   { transform: translate(0, 0) rotate(0deg); }
    14%  { transform: translate(-14px, -10px) rotate(-2deg); }
    30%  { transform: translate(-23px, 4px) rotate(1.5deg); }
    46%  { transform: translate(-6px, 9px) rotate(2deg); }
    62%  { transform: translate(14px, 3px) rotate(-1.5deg); }
    78%  { transform: translate(18px, -14px) rotate(-2deg); }
    90%  { transform: translate(6px, -7px) rotate(1deg); }
    100% { transform: translate(0, 0) rotate(0deg); }
  }
}

@media (prefers-reduced-motion: reduce) {
  .hero-loomus-wrap {
    opacity: 1;
    transform: none;
  }

  .hero-loomus-wrap.has-landed {
    animation: none;
  }

  .hero-loomus-img {
    animation: none;
  }

  .hero-loomus-dust {
    display: none;
  }
}

/* Fuenf frei fliegende Figuren (drei Lumifluffs + zwei Knuffelwuschel)
   durchstreifen den GESAMTEN Erklaerbereich der Seite "Der Ursprung von
   Lumaria" (lumaria-geschichte.html, erreichbar als Unterseite/Kachel
   vom Reiter "Lumaria"). .lumifluffs-zone ist ein absolut positionierter
   Layer, der seinen unmittelbaren Elterncontainer exakt ausfuellt.
   Dieser Elterncontainer -- auf dieser Seite .geschichte-lumifluffs-host
   (siehe dort) -- hat position:relative + overflow:hidden, wodurch die
   Figuren strukturell niemals in Header, Navigation oder andere
   Abschnitte gelangen koennen, unabhaengig von ihrer Flugbahn. Die
   Klasse .lumifluffs-zone selbst traegt keine Seiten-Abhaengigkeit und
   kann daher bei Bedarf auch auf einer anderen Seite in einem ebenso
   vorbereiteten Container verwendet werden.

   Damit sie dabei NIE Text oder Bilder verdecken, liegt dieser Layer
   bewusst UNTER dem Inhalt (z-index:1 vs. z-index:2 auf den direkten
   Kindern von .geschichte-lumifluffs-host): wo sich ein Flugweg
   zufaellig mit einer Textzeile ueberschneidet, verschwindet die Figur
   optisch kurz dahinter, statt sie zu verdecken. Die zugehoerige
   pointer-events-Anpassung sorgt dafuer, dass Hover/Tap auf den Figuren
   trotzdem ueberall funktioniert.

   Positionierung laeuft ueber top/left in Prozent (nicht ueber
   transform:translate), weil das automatisch relativ zur tatsaechlichen
   Groesse von .lumifluffs-zone skaliert -- unabhaengig davon, wie hoch
   der Erklaerbereich durch unterschiedlich viel Text auf verschiedenen
   Bildschirmgroessen wird. Wie bei den BattyFluffs/Loomus zuvor:
   AUSSCHLIESSLICH translate/opacity fuer die laufende Animation, keine
   Rotation und keine ungleichmaessige Skalierung -- beides hatte bei
   den BattyFluffs zu einem Verbeugen/Einknicken gefuehrt (siehe
   battyfluff-body-sway weiter oben). Der kurze "Winken"-Moment des
   rosa Lumifluffs nutzt daher bewusst nur eine GLEICHMAESSIGE, zentrale
   Skalierung (kein rotate), um dieses Risiko konsequent zu vermeiden. */
.geschichte-lumifluffs-host {
  position: relative;
  overflow: hidden;
  pointer-events: none;
}

.geschichte-lumifluffs-host > * {
  position: relative;
  z-index: 2;
  pointer-events: auto;
}

.lumifluffs-zone {
  position: absolute;
  inset: 0;
  overflow: hidden;
  pointer-events: none;
  z-index: 1;
}

.lumifluff-wrap {
  position: absolute;
  pointer-events: auto;
  cursor: default;
}

.lumifluff-body {
  display: block;
  animation: lumifluff-bob 3.6s ease-in-out infinite;
}

.lumifluff-img {
  display: block;
  width: 100%;
  height: auto;
  animation: battyfluff-blink 6s ease-in-out infinite;
}

@keyframes lumifluff-bob {
  0%, 100% { transform: translateY(0); }
  50%      { transform: translateY(-5px); }
}

/* Rosa Lumifluff mit Herz: neugierig-herzlich, links/mittig, etwas
   verspielter getaktet als die anderen beiden. */
.lumifluff-pink-wrap {
  width: 92px;
  left: 6%;
  top: 12%;
  animation: lumifluff-pink-fly 32s ease-in-out infinite;
  animation-delay: 0s;
}

@keyframes lumifluff-pink-fly {
  0%   { left: 6%;  top: 12%; }
  12%  { left: 22%; top: 30%; }
  25%  { left: 40%; top: 18%; }
  38%  { left: 46%; top: 45%; }
  50%  { left: 28%; top: 62%; }
  62%  { left: 10%; top: 50%; }
  75%  { left: 30%; top: 75%; }
  88%  { left: 44%; top: 60%; }
  100% { left: 6%;  top: 12%; }
}

.lumifluff-pink-body {
  animation-duration: 3s;
  animation-delay: 0.3s;
}

.lumifluff-pink-img {
  animation-duration: 5.4s;
  animation-delay: 0.8s;
}

.lumifluff-pink-wrap.is-interacting .lumifluff-pink-body {
  animation: lumifluff-pink-interact 1s ease-in-out 1;
}

@keyframes lumifluff-pink-interact {
  0%   { transform: translateY(0)    scale(1); }
  30%  { transform: translateY(-7px) scale(1.1); }
  55%  { transform: translateY(-2px) scale(1.04); }
  75%  { transform: translateY(-6px) scale(1.08); }
  100% { transform: translateY(0)    scale(1); }
}

/* Gelber Lumifluff mit Gaensebluemchen: ruhig, gemuetlich, mittig/
   rechts, deutlich langsamer als die anderen beiden mit zwei kurzen
   Schwebemomenten (Doppel-Keyframes an gleicher Position). */
.lumifluff-yellow-wrap {
  width: 86px;
  left: 88%;
  top: 15%;
  animation: lumifluff-yellow-fly 48s ease-in-out infinite;
  animation-delay: 4s;
}

@keyframes lumifluff-yellow-fly {
  0%    { left: 88%; top: 15%; }
  10%   { left: 70%; top: 22%; }
  10.5% { left: 70%; top: 22%; }
  24%   { left: 52%; top: 35%; }
  38%   { left: 60%; top: 55%; }
  38.5% { left: 60%; top: 55%; }
  55%   { left: 82%; top: 65%; }
  70%   { left: 92%; top: 45%; }
  85%   { left: 68%; top: 78%; }
  100%  { left: 88%; top: 15%; }
}

.lumifluff-yellow-body {
  animation-duration: 4.6s;
  animation-delay: 1.1s;
}

.lumifluff-yellow-img {
  animation-duration: 7.2s;
  animation-delay: 0.4s;
}

.lumifluff-yellow-wrap.is-interacting .lumifluff-yellow-body {
  animation: lumifluff-yellow-interact 1.3s ease-in-out 1;
}

@keyframes lumifluff-yellow-interact {
  0%   { transform: translateY(0); }
  40%  { transform: translateY(6px); }
  70%  { transform: translateY(5px); }
  100% { transform: translateY(0); }
}

/* Lila Lumifluff mit Feder und Papier: zielgerichteter, durchquert den
   gesamten Bereich mit wenigen, groesseren Etappen statt vieler kleiner
   Schlenker, mit einem kurzen "Innehalten" mittendrin. */
.lumifluff-purple-wrap {
  width: 88px;
  left: 10%;
  top: 85%;
  animation: lumifluff-purple-fly 38s ease-in-out infinite;
  animation-delay: 8s;
}

@keyframes lumifluff-purple-fly {
  0%   { left: 10%; top: 85%; }
  18%  { left: 55%; top: 20%; }
  19%  { left: 55%; top: 20%; }
  40%  { left: 88%; top: 55%; }
  60%  { left: 45%; top: 80%; }
  80%  { left: 15%; top: 30%; }
  100% { left: 10%; top: 85%; }
}

.lumifluff-purple-body {
  animation-duration: 3.3s;
  animation-delay: 1.6s;
}

.lumifluff-purple-img {
  animation-duration: 6.3s;
  animation-delay: 1.2s;
}

.lumifluff-purple-wrap.is-interacting .lumifluff-purple-body {
  animation: lumifluff-purple-interact 1.2s ease-in-out 1;
}

@keyframes lumifluff-purple-interact {
  0%   { transform: translateY(0); }
  35%  { transform: translateY(-6px); }
  65%  { transform: translateY(-6px); }
  100% { transform: translateY(0); }
}

/* Blauer Knuffelwuschel: besonders neugierig/verspielt, roamt (anders
   als die drei Lumifluffs oben) frei ueber den KOMPLETTEN
   Erklaerbereich statt einer bevorzugten Zone, mit zwei kurzen
   "schaut sich um"-Schwebemomenten. */
.knuffelwuschel-blue-wrap {
  width: 84px;
  left: 20%;
  top: 10%;
  animation: knuffelwuschel-blue-fly 29s ease-in-out infinite;
  animation-delay: 2s;
}

@keyframes knuffelwuschel-blue-fly {
  0%    { left: 20%; top: 10%; }
  14%   { left: 55%; top: 25%; }
  14.5% { left: 55%; top: 25%; }
  30%   { left: 85%; top: 15%; }
  46%   { left: 70%; top: 50%; }
  46.5% { left: 70%; top: 50%; }
  62%   { left: 35%; top: 68%; }
  78%   { left: 8%;  top: 45%; }
  90%   { left: 25%; top: 78%; }
  100%  { left: 20%; top: 10%; }
}

.knuffelwuschel-blue-body {
  animation-duration: 3.2s;
  animation-delay: 0.6s;
}

.knuffelwuschel-blue-img {
  animation-duration: 5.8s;
  animation-delay: 1.4s;
}

.knuffelwuschel-blue-wrap.is-interacting .knuffelwuschel-blue-body {
  animation: knuffelwuschel-blue-interact 1s ease-in-out 1;
}

@keyframes knuffelwuschel-blue-interact {
  0%   { transform: translateY(0); }
  25%  { transform: translateY(-8px); }
  45%  { transform: translateY(-1px); }
  70%  { transform: translateY(-7px); }
  100% { transform: translateY(0); }
}

.knuffelwuschel-blue-wrap.is-interacting .knuffelwuschel-blue-img {
  animation: battyfluff-blink 0.5s ease-in-out 2;
}

/* Rosafarbener Knuffelwuschel mit leuchtendem Herz: ruhig, herzlich,
   ebenfalls frei ueber den gesamten Bereich, langsamste Taktung von
   allen fuenf Figuren. Die Interaktion nutzt einen sanften
   Leuchtimpuls (drop-shadow) statt einer neuen Bildebene, um das
   "Herz zeigen" ohne zusaetzliche Grafikressource umzusetzen. */
.knuffelwuschel-pink-wrap {
  width: 82px;
  left: 75%;
  top: 78%;
  animation: knuffelwuschel-pink-fly 44s ease-in-out infinite;
  animation-delay: 6s;
}

@keyframes knuffelwuschel-pink-fly {
  0%   { left: 75%; top: 78%; }
  16%  { left: 45%; top: 60%; }
  32%  { left: 15%; top: 72%; }
  48%  { left: 30%; top: 40%; }
  64%  { left: 62%; top: 22%; }
  80%  { left: 88%; top: 42%; }
  100% { left: 75%; top: 78%; }
}

.knuffelwuschel-pink-body {
  animation-duration: 4.2s;
  animation-delay: 2.2s;
}

.knuffelwuschel-pink-img {
  animation-duration: 6.8s;
  animation-delay: 0.2s;
}

.knuffelwuschel-pink-wrap.is-interacting .knuffelwuschel-pink-body {
  animation: knuffelwuschel-pink-interact 1.2s ease-in-out 1;
}

@keyframes knuffelwuschel-pink-interact {
  0%   { transform: translateY(0); filter: drop-shadow(0 0 0 rgba(255, 154, 200, 0)); }
  40%  { transform: translateY(-5px); filter: drop-shadow(0 0 10px rgba(255, 154, 200, 0.85)); }
  100% { transform: translateY(0); filter: drop-shadow(0 0 0 rgba(255, 154, 200, 0)); }
}

/* Goldene Zauberstaub-Spur hinter jeder Figur -- nutzt bewusst
   dieselbe .hero-loomus-dust/@keyframes hero-loomus-dust-rise wie
   Loomus, statt eigene Partikel zu definieren (leichtgewichtig,
   konsistent). Der blaue Knuffelwuschel bekommt eine eigene, blau
   eingefaerbte Variante fuer seine Spur. */
.lumifluff-wrap .hero-loomus-dust {
  animation-duration: 2.6s;
}

.knuffelwuschel-blue-wrap .hero-loomus-dust {
  background: radial-gradient(circle, #eaf7ff 0%, #6ab6e6 70%, transparent 100%);
}

@media (max-width: 900px) {
  .lumifluff-pink-wrap     { width: 74px; }
  .lumifluff-yellow-wrap   { width: 70px; }
  .lumifluff-purple-wrap   { width: 72px; }
  .knuffelwuschel-blue-wrap { width: 68px; }
  .knuffelwuschel-pink-wrap { width: 66px; }
}

@media (max-width: 640px) {
  .lumifluff-pink-wrap      { width: 58px; }
  .lumifluff-yellow-wrap    { width: 54px; }
  .lumifluff-purple-wrap    { width: 56px; }
  .knuffelwuschel-blue-wrap { width: 52px; }
  .knuffelwuschel-pink-wrap { width: 50px; }
}

@media (prefers-reduced-motion: reduce) {
  .lumifluff-pink-wrap,
  .lumifluff-yellow-wrap,
  .lumifluff-purple-wrap,
  .knuffelwuschel-blue-wrap,
  .knuffelwuschel-pink-wrap {
    animation: none;
  }

  .lumifluff-pink-wrap       { left: 8%;  top: 16%; }
  .lumifluff-yellow-wrap     { left: 78%; top: 22%; }
  .lumifluff-purple-wrap     { left: 40%; top: 38%; }
  .knuffelwuschel-blue-wrap  { left: 62%; top: 64%; }
  .knuffelwuschel-pink-wrap  { left: 20%; top: 74%; }

  .lumifluff-body,
  .lumifluff-img {
    animation: none;
  }

  .lumifluff-wrap .hero-loomus-dust {
    display: none;
  }
}

/* Kurzer Funkenschauer bei Hover/Tap auf einer der fuenf Figuren --
   nutzt dieselbe Burst-Mechanik wie .post-lumaria-spark (radialer
   Farbverlaufspunkt, der per --dx/--dy nach aussen driftet und
   verblasst), aber unter eigenem Namen, da es ein eigener, unabhaengiger
   Interaktionsmoment auf einer anderen Seite ist. Farbvarianten je nach
   Figur; ohne Zusatzklasse (gelber Lumifluff) bleibt es golden. */
.creature-spark {
  position: fixed;
  width: 5px;
  height: 5px;
  border-radius: 50%;
  z-index: 5;
  pointer-events: none;
  background: radial-gradient(circle, #fff7e0 0%, #d9a94f 70%, transparent 100%);
  animation: creature-spark-burst 1s ease-out forwards;
}

@keyframes creature-spark-burst {
  0%   { opacity: 0; transform: translate(-50%, -50%) scale(0.5); }
  30%  { opacity: 1; }
  100% { opacity: 0; transform: translate(calc(-50% + var(--dx)), calc(-50% + var(--dy))) scale(1.1); }
}

.creature-spark-pink {
  background: radial-gradient(circle, #fff0f6 0%, #ff8fc0 70%, transparent 100%);
}

.creature-spark-blue {
  background: radial-gradient(circle, #eaf7ff 0%, #6ab6e6 70%, transparent 100%);
}

.creature-spark-purple {
  background: radial-gradient(circle, #f5ecff 0%, #b98af0 70%, transparent 100%);
}

/* Charaktere am Bildrand (nur Startseite) */

.character-peek {
  position: fixed;
  bottom: 0;
  width: 260px;
  height: auto;
  z-index: 0;
  pointer-events: none;
  opacity: 0.92;
}

.character-peek.left {
  left: -50px;
}

.character-peek.right {
  right: -50px;
}

@media (max-width: 900px) {
  .character-peek {
    width: 150px;
  }
}

@media (max-width: 600px) {
  .character-peek {
    display: none;
  }
}

/* Begrüßungsbereich (Startseite): eigene Typografie nur für diesen Textbereich */

/* Text sitzt jetzt in der freien Rosa-Flaeche der neuen Illustration:
   zentriert statt linksbuendig, schmalere max-width fuer angenehme
   Zeilenlaengen, negativer margin-top zieht den Textblock in die
   (bereits per mask-image ausgeblendete) untere Bildzone hinein, damit
   kein harter Schnitt zwischen Bild und Text entsteht. Der Prozentwert
   bezieht sich (CSS-Spezifikation) auf die Breite des Containers
   (.hero), NICHT auf die Illustration selbst -- seit die Illustration
   nur noch 82% von .hero einnimmt (statt 100%), ist der urspruengliche
   Wert (-13%, kalibriert fuer volle Breite) um denselben Faktor 0.82
   auf -10.7% reduziert, damit der Textblock weiterhin exakt in die
   ausgeblendete untere Bildzone der jetzt kleineren Illustration greift
   und nicht zu weit in ihren noch deckenden Inhalt hinein. */
.welcome-text {
  position: relative;
  z-index: 1;
  max-width: 640px;
  margin: -10.7% auto 0;
  padding: 0 1.5rem 2.5rem;
  text-align: center;
}

.welcome-eyebrow {
  font-family: "Cormorant Garamond", serif;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  font-size: 0.45rem;
  color: var(--color-parchment);
  opacity: 0.55;
  margin: 0 0 0.8rem;
}

.welcome-text h1 {
  font-family: "Baloo 2", cursive;
  font-weight: 700;
  font-size: 2.7rem;
  line-height: 1.25;
  color: var(--color-parchment);
  letter-spacing: 0;
  margin: 0 0 1.6rem;
}

.welcome-text p {
  font-family: "Lora", serif;
  font-size: 1.15rem;
  line-height: 1.9;
  color: var(--color-parchment);
  margin: 0 0 1.5rem;
}

.welcome-text .button-row {
  margin-top: 2.5rem;
}

/* "Keine Heldin, die alles von Anfang an kann" (HOME): neue
   maerchenhafte Schriftzug-Grafik anstelle des reinen Textes im h2,
   transparenter Hintergrund erhalten (kein Container/Box/Rahmen),
   bewusst zurueckhaltend skaliert (55%, max 460px), damit sie nicht
   mit den aufwendigeren Bereichen weiter oben auf HOME konkurriert.
   Mehr Luft zwischen Ueberschrift und dem emotionalen Kerntext,
   zweite Zeile bewusst kleiner/gedaempfter gesetzt. */
.home-heldin-heading-img {
  display: block;
  width: 55%;
  max-width: 460px;
  height: auto;
  margin: 0 auto;
}

@media (max-width: 640px) {
  .home-heldin-heading-img {
    width: 75%;
  }
}

.home-heldin-lede {
  margin-top: 2.2rem;
  font-size: 1.2rem;
  line-height: 1.7;
}

.home-heldin-sub {
  margin-top: 0.9rem;
  font-size: 1rem;
  color: var(--color-parchment-dim);
}

/* Sehr dezenter goldener Uebergang anstelle des frueheren, einzeln
   stehenden Buch-Dekoelements: ersetzt keinen Inhalt, markiert nur den
   Wechsel zum Buchbereich. */
.home-light-trail {
  width: 140px;
  height: 3px;
  margin: 2.6rem auto 0;
  background: linear-gradient(90deg, transparent, rgba(var(--color-gold-rgb), 0.7), transparent);
  border-radius: 999px;
  box-shadow: 0 0 12px rgba(var(--color-gold-rgb), 0.45);
}

@media (prefers-reduced-motion: reduce) {
  .home-light-trail {
    box-shadow: none;
  }
}

/* Buchpraesentation "Emmas geheime Welt, Band 1" (HOME): die
   bereitgestellte Grafik (Buch + Lumaria-Landschaft bereits Bestandteil
   des Bildes) bildet die volle Hintergrundebene; Text/Button liegen
   als echtes HTML in der bewusst freigelassenen hellen Flaeche rechts
   im Bild. mask-image blendet oben UND unten weich aus, damit die
   Landschaft nahtlos zwischen "Keine Heldin" und "Ehrlich gefragt"
   uebergeht (keine Bildkante, keine Box). Auf Desktop liegt der Text
   absolut ueber dem freien Bildbereich (Position/Breite an der
   tatsaechlichen freien Flaeche der Grafik ausgerichtet); auf Mobil
   faellt er in den normalen Textfluss unterhalb des Bildes zurueck. */
.aktuell-book-section {
  position: relative;
  max-width: 1100px;
  margin: 0 auto;
  padding: 0;
  text-align: left;
}

.home-book-illustration {
  position: relative;
  width: 100%;
  line-height: 0;
}

/* Faedet alle VIER Kanten weich aus (nicht nur oben/unten): zwei
   Verlaufs-Ebenen (horizontal + vertikal) werden per mask-composite
   ueberschnitten (intersect), dadurch ergibt sich an jeder Kante
   unabhaengig ein echtes Aussblenden bis 0, ohne dass sich die vier
   Seiten gegenseitig beeinflussen. Die Prozentwerte sind bewusst
   asymmetrisch: das Buch sitzt im Bild recht nah an der linken Kante
   (~12% vom Rand), daher faedet links etwas knapper (9%) als rechts/
   oben/unten (15%), damit das Buch selbst dabei nicht mit ausfaedet. */
.home-book-illustration-img {
  display: block;
  width: 100%;
  height: auto;
  pointer-events: none;
  mask-image:
    linear-gradient(to right, transparent 0%, black 9%, black 85%, transparent 100%),
    linear-gradient(to bottom, transparent 0%, black 15%, black 85%, transparent 100%);
  mask-composite: intersect;
  -webkit-mask-image:
    linear-gradient(to right, transparent 0%, black 9%, black 85%, transparent 100%),
    linear-gradient(to bottom, transparent 0%, black 15%, black 85%, transparent 100%);
  -webkit-mask-composite: source-in;
}

.home-book-layout {
  position: absolute;
  z-index: 1;
  top: 50%;
  left: 51%;
  width: 30%;
  max-width: 320px;
  transform: translateY(-50%);
}

.home-book-layout .hero-eyebrow {
  margin: 0 0 0.4rem;
}

.home-book-layout h2 {
  margin: 0 0 0.3rem;
}

/* Grafische Ueberschrift ersetzt den bisherigen Text-h2 (der bleibt als
   visually-hidden fuer SEO/Screenreader bestehen). width:100% des
   ohnehin schon schmalen .home-book-layout (Desktop 30%/max 320px,
   Mobile 100%/max 460px, siehe unten) + height:auto genuegt fuer beide
   Breakpoints automatisch, ganz ohne eigene Mobile-Breite -- dadurch
   garantiert kein Strecken/Verzerren/Beschneiden. */
.home-book-heading-img {
  display: block;
  width: 100%;
  height: auto;
  margin: 0 0 0.4rem;
}

.home-book-subtitle {
  font-family: var(--font-heading);
  font-style: italic;
  color: var(--color-gold-light);
  font-size: 1.15rem;
  margin: 0 0 1.2rem;
}

.home-book-desc {
  margin: 0 0 1rem;
}

.home-book-meta {
  font-size: 0.9rem;
  color: var(--color-parchment-dim);
  margin: 0 0 1.6rem;
}

@media (max-width: 900px) {
  .home-book-layout {
    left: 48%;
    width: 34%;
  }
}

@media (max-width: 760px) {
  .home-book-layout {
    position: static;
    transform: none;
    width: 100%;
    max-width: 460px;
    margin: 1.6rem auto 0;
    padding: 0 1rem;
    text-align: center;
  }
}

/* Ruhiger Kapitel-Trenner zwischen "Aktuell" (Buchbereich) und
   "Ehrlich gefragt" (HOME). Bewusst dieselbe Zierlinie wie
   .ursprung-story-divider (Linie/Raute/Linie), aber als EIGENE Klasse
   nachgebaut statt die geteilte Klasse zu benutzen -- .ursprung-story-
   divider wird bereits mehrfach im Erzaehlbereich dieser Seite UND auf
   lumaria-geschichte.html verwendet, eine Aenderung dort haette also
   Seiteneffekte gehabt. Kein eigener Hintergrund/keine Box: beide
   Nachbarbereiche (Buch-Bild-Maske oben, Ehrlich-gefragt-Video-Maske
   unten) blenden bereits an ihren eigenen Kanten zum echten Seiten-
   Hintergrund aus -- der Trenner braucht dadurch selbst keinerlei
   Farbverlauf, um weich zu wirken: er zeigt schlicht denselben Rosé-
   Seitenhintergrund, in den beide Nachbarn ohnehin bereits ausblenden. */
.home-section-divider {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 12px;
  max-width: 200px;
  margin: 0 auto;
  padding: 4rem 1.5rem;
}

@media (max-width: 900px) {
  .home-section-divider {
    padding: 3rem 1.5rem;
  }
}

@media (max-width: 640px) {
  .home-section-divider {
    padding: 2.25rem 1.5rem;
  }
}

.home-section-divider-line {
  flex: 1;
  height: 1px;
}

.home-section-divider-line:first-child {
  background: linear-gradient(to right, transparent, #caa356 100%);
}

.home-section-divider-line:last-child {
  background: linear-gradient(to left, transparent, #caa356 100%);
}

.home-section-divider-mark {
  width: 9px;
  height: 9px;
  flex-shrink: 0;
  opacity: 0.85;
}

/* Neuer animierter Video-Hintergrund fuer den kompletten "Ehrlich
   gefragt"-Abschnitt (HOME). "Ehrlich gefragt" ist bereits fest im
   Video eingebrannt (oben mittig), die bisherige Grafik-Ueberschrift
   wurde deshalb durch eine visuell verborgene, aber weiterhin
   vorhandene <h2> ersetzt (Barrierefreiheit/SEO bleibt erhalten, keine
   doppelte Anzeige). Keine zusaetzliche Abdunklung/Farbflaeche ueber
   dem Video -- die Karten (.home-faq-card) haben bereits ihren eigenen
   halbtransparenten Untergrund und bleiben dadurch weiterhin gut
   lesbar.

   KORREKTUR: wirkte zuvor als harter rechteckiger Block (volle
   Viewport-Breite, feste Fallback-Hintergrundfarbe, scharfe Kanten).
   Jetzt an dieselbe Breitenwirkung wie .aktuell-book-section (Buch-
   Bereich) angeglichen -- max-width:1100px statt 100vw -- UND mit
   derselben 4-seitigen Weichzeichen-Maske wie .home-book-illustration-
   img (mask-composite:intersect aus zwei Verlaufs-Ebenen) versehen,
   direkt auf dem Wrapper, damit BEIDE Video-Ebenen (Blur+scharf)
   gemeinsam an allen vier Kanten zu Transparenz ausblenden. Dahinter
   erscheint dadurch nicht mehr eine angenaeherte Fallback-Farbe,
   sondern der tatsaechliche Seiten-/Body-Hintergrund selbst -- Uebergang
   zum Buch-Bereich darueber und zu den Seitenraendern ist dadurch
   garantiert nahtlos (keine Farbabweichung, keine harte Kante, kein
   braunes/anderfarbiges Durchscheinen der Video-Ecken moeglich, da dort
   schlicht nichts mehr sichtbar ist). */
.home-faq-bg-wrap {
  position: relative;
  width: 100%;
  max-width: 1100px;
  margin: 0 auto;
  min-height: 680px;
  overflow: hidden;
  mask-image:
    linear-gradient(to right, transparent 0%, black 6%, black 94%, transparent 100%),
    linear-gradient(to bottom, transparent 0%, black 18%, black 82%, transparent 100%);
  mask-composite: intersect;
  -webkit-mask-image:
    linear-gradient(to right, transparent 0%, black 6%, black 94%, transparent 100%),
    linear-gradient(to bottom, transparent 0%, black 18%, black 82%, transparent 100%);
  -webkit-mask-composite: source-in;
}

@media (max-width: 900px) {
  .home-faq-bg-wrap {
    min-height: 640px;
  }
}

@media (max-width: 640px) {
  .home-faq-bg-wrap {
    min-height: 560px;
  }
}

/* Zwei-Ebenen-Technik (dieselbe wie bei .lumaria-karte-header-video-
   bg/-video an anderer Stelle): der Kartenstapel darunter macht diesen
   Abschnitt gerade auf Mobil sehr hoch/schmal -- ein einzelnes cover-
   Video wuerde in so einem Format das Buch links und den Lumaria-Weg
   rechts komplett wegschneiden (nur die schmale Mitte bliebe sichtbar).
   Die Hintergrundebene (cover, volle Flaeche, weichgezeichnet, KEINE
   Abdunklung -- nur blur, keine Helligkeits-/Farbaenderung, wie
   ausdruecklich gefordert) sorgt fuer einen vollflaechigen, farbigen
   Untergrund unabhaengig vom Seitenverhaeltnis. Die scharfe Ebene
   darueber (contain) zeigt IMMER die komplette, unbeschnittene Szene --
   Buch, Weg, Herz und Lichtspur bleiben dadurch bei jeder
   Bildschirmgroesse vollstaendig erhalten. */
.home-faq-bg-video-blur {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
  transform: scale(1.15);
  filter: blur(30px);
  z-index: 0;
  pointer-events: none;
}

.home-faq-bg-video {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: contain;
  object-position: center;
  z-index: 1;
  pointer-events: none;
}

/* Grosszuegiger oberer Abstand: "Ehrlich gefragt" ist im Video
   eingebrannt (oben mittig) -- die Karten sollen erst deutlich darunter
   beginnen, nicht direkt daran ankleben. */
.home-faq-bg-wrap > .section {
  position: relative;
  z-index: 2;
  max-width: 980px;
  padding-top: 9rem;
  padding-bottom: 5rem;
}

@media (max-width: 900px) {
  .home-faq-bg-wrap > .section {
    padding-top: 7rem;
  }
}

@media (max-width: 640px) {
  .home-faq-bg-wrap > .section {
    padding-top: 5.5rem;
  }
}

/* Ehrlich-gefragt-FAQ (HOME): drei einzelne "schwebende" Pergament-
   Karten statt eines durchgehenden Kastens -- bewusst deutlicher
   Abstand zwischen ihnen, damit der Hintergrund dazwischen sichtbar
   bleibt. auto-fit/minmax sorgt fuer die gewuenschte 3 / 2+1 / 1-Spalten-
   Abfolge rein ueber die verfuegbare Breite, ohne zusaetzliche
   Breakpoints pflegen zu muessen. */
.home-faq-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));
  gap: 2.6rem;
  margin-top: 2.5rem;
}

@media (max-width: 640px) {
  .home-faq-grid {
    grid-template-columns: 1fr;
    gap: 1.85rem;
  }
}

/* Karten deutlich schmaler als der Viewport (statt fast randvoll),
   damit die Videoszene links/rechts UND zwischen den Karten sichtbar
   bleibt, statt auf einen schmalen Streifen zusammenzuschrumpfen
   (siehe Vorgabe: Hintergrund muss auf Mobile deutlich sichtbar
   bleiben, Karten duerfen den Bereich nicht ueberdecken). */
@media (max-width: 640px) {
  .home-faq-card {
    max-width: 78%;
    margin: 0 auto;
    padding: 1.25rem 1.1rem;
  }
}

@media (max-width: 430px) {
  .home-faq-card {
    max-width: 84%;
    padding: 1.1rem 1rem;
  }
}

/* Leichte Transparenz (statt eines deckenden Kastens), damit die
   Lumaria-Szene im Hintergrund hinter jeder Karte noch erkennbar
   bleibt -- "schwebende Pergamentkarte" statt FAQ-Box. Reveal-
   Basiszustand (opacity/transform) unsichtbar/leicht versetzt, bis
   die Karte per JS (staggered, siehe index.html) die Klasse
   .is-visible bekommt. Bewusst NUR opacity/transform in dieser
   Transition-Liste -- die Hover-Transition unten deklariert transform/
   box-shadow/border-color komplett neu (eigene, kurze Dauer), damit
   ein spaeteres Hover NICHT die urspruengliche Stagger-Verzoegerung
   dieser Transition erbt. */
.home-faq-card {
  background: rgba(255, 250, 240, 0.5);
  border: 1px solid rgba(224, 168, 128, 0.45);
  border-radius: 18px;
  padding: 1.5rem 1.35rem;
  text-align: center;
  box-shadow: 0 6px 18px rgba(122, 20, 64, 0.08);
  opacity: 0;
  transform: translateY(18px);
  transition: opacity 0.7s ease, transform 0.7s ease;
}

.home-faq-card.is-visible {
  opacity: 1;
  transform: translateY(0);
}

.home-faq-card:hover {
  transition: transform 0.25s ease, box-shadow 0.3s ease, border-color 0.3s ease;
  transform: translateY(-4px);
  border-color: rgba(224, 168, 128, 0.75);
  box-shadow: 0 10px 26px rgba(122, 20, 64, 0.14), 0 0 20px rgba(var(--color-gold-rgb), 0.2);
}

@media (prefers-reduced-motion: reduce) {
  .home-faq-card,
  .home-faq-card.is-visible,
  .home-faq-card:hover {
    opacity: 1;
    transform: none;
    transition: none;
  }
}

.home-faq-card h3 {
  font-family: var(--font-heading);
  font-size: 1.4rem;
  font-weight: 700;
  line-height: 1.25;
  color: var(--color-gold-light);
  margin: 0 0 0.6rem;
}

.home-faq-card p {
  font-size: 1.02rem;
  line-height: 1.6;
  margin: 0;
  color: var(--color-parchment-dim);
}

/* Hervorgehobener Schlusssatz je Karte -- deutlich erkennbar, aber
   bewusst nicht riesig (keine groessere Schriftgroesse als die
   Ueberschrift, nur Stil/Farbe unterscheiden). */
.home-faq-card-highlight {
  margin: 0.9rem 0 0;
  font-family: var(--font-heading);
  font-style: italic;
  font-size: 1.02rem;
  line-height: 1.55;
  color: var(--color-burgundy);
}

/* Karte 3: sehr dezentes, sanft pulsierendes Herzlicht direkt neben
   dem emotionalen Schlussgedanken. */
.home-faq-card-highlight-heart::after {
  content: "\2665";
  display: inline-block;
  margin-left: 0.35em;
  color: rgba(var(--color-gold-rgb), 0.9);
  text-shadow: 0 0 5px rgba(var(--color-gold-rgb), 0.55);
  animation: home-faq-heart-glow 2.6s ease-in-out infinite;
}

@keyframes home-faq-heart-glow {
  0%, 100% { text-shadow: 0 0 3px rgba(var(--color-gold-rgb), 0.35); }
  50% { text-shadow: 0 0 9px rgba(var(--color-gold-rgb), 0.85); }
}

@media (prefers-reduced-motion: reduce) {
  .home-faq-card-highlight-heart::after {
    animation: none;
  }
}

/* Ruhiger emotionaler Abschluss unterhalb der Karten -- bewusst OHNE
   eigenen Karten-Hintergrund (keine "vierte Karte"), steht frei auf
   dem Video-Hintergrund; das vorhandene Herzlicht/die Lichtspur im
   Video bleibt darunter sichtbar. Reveal-Timing per JS analog zu den
   Karten (siehe index.html). */
.home-faq-closing {
  margin-top: 3.5rem;
  text-align: center;
  opacity: 0;
  transform: translateY(14px);
  transition: opacity 0.8s ease, transform 0.8s ease;
}

.home-faq-closing.is-visible {
  opacity: 1;
  transform: translateY(0);
}

@media (prefers-reduced-motion: reduce) {
  .home-faq-closing {
    opacity: 1;
    transform: none;
    transition: none;
  }
}

.home-faq-closing-quote {
  font-family: var(--font-heading);
  font-style: italic;
  font-size: 1.15rem;
  line-height: 1.75;
  color: var(--color-gold-light);
  max-width: 540px;
  margin: 0 auto;
}

.home-faq-closing-brand {
  margin: 1rem 0 0;
  font-size: 0.78rem;
  letter-spacing: 0.07em;
  text-transform: uppercase;
  color: var(--color-parchment-dim);
}

/* Signatur-Abschluss im Erzaehl-Bereich (HOME): "Deine Martina" als
   bereitgestellte Grafik, die per clip-path synchron zur Bewegung der
   ebenfalls bereitgestellten Feder-Grafik sichtbar wird. Beide Grafiken
   bleiben unveraendert, nur die Sichtbarkeit der Signatur wird per CSS-
   Variable (--martina-reveal, von JS gesetzt) animiert. Ausschliesslich
   fuer den Erzaehl-Bereich der Startseite, keine anderen Bereiche. */
.martina-signature {
  position: relative;
  width: min(400px, 84%);
  margin: 1.8rem 0 0;
}

.martina-signature-img {
  display: block;
  width: 76%;
  height: auto;
  --martina-reveal: 0%;
  clip-path: inset(0 calc(100% - var(--martina-reveal)) 0 0);
  -webkit-clip-path: inset(0 calc(100% - var(--martina-reveal)) 0 0);
}

.martina-signature-feather {
  position: absolute;
  width: 20%;
  height: auto;
  left: 0%;
  top: 42%;
  transform-origin: 30% 85%;
  transform: translate(-30%, -85%) rotate(-8deg);
  pointer-events: none;
  filter: drop-shadow(0 3px 7px rgba(90, 50, 130, 0.28));
}

.martina-signature-sparks {
  position: absolute;
  inset: 0;
  pointer-events: none;
}

.martina-signature-spark {
  position: absolute;
  width: 5px;
  height: 5px;
  border-radius: 50%;
  background: radial-gradient(circle, #fff3d6 0%, #d9a94f 70%, transparent 100%);
  opacity: 0;
  transform: translate(-50%, -50%) scale(0.4);
  animation: martina-signature-spark-pop 900ms ease-out forwards;
}

@keyframes martina-signature-spark-pop {
  0% {
    opacity: 0;
    transform: translate(-50%, -50%) scale(0.4);
  }
  30% {
    opacity: 1;
    transform: translate(-50%, -50%) scale(1);
  }
  100% {
    opacity: 0;
    transform: translate(-50%, -60%) scale(0.3);
  }
}

/* Kleine Schreibfeder loest sich nach dem Schreiben in Zauberstaub auf
   (die GROSSE Feder ist Teil der Signatur-Grafik selbst und bleibt
   davon unberuehrt). transition wird bewusst erst per JS im Moment des
   Aufloesens auf das Element gesetzt (siehe Skript), nicht hier als
   Dauerregel -- sonst wuerde sie waehrend der eigentlichen
   Schreibbewegung (jeder rAF-Frame setzt eine neue transform-Position)
   jede Positionsaenderung ungewollt weich nachlaufen lassen, statt
   praezise Frame fuer Frame zu folgen. */
.martina-signature-dissolve-spark {
  position: absolute;
  width: 5px;
  height: 5px;
  border-radius: 50%;
  opacity: 0;
  pointer-events: none;
  animation: martina-signature-dissolve-spark-rise 550ms ease-out forwards;
}

.martina-signature-dissolve-spark--gold {
  background: radial-gradient(circle, #fff3d6 0%, #d9a94f 70%, transparent 100%);
}

.martina-signature-dissolve-spark--violet {
  background: radial-gradient(circle, #f2e4ff 0%, #a97fd1 70%, transparent 100%);
}

@keyframes martina-signature-dissolve-spark-rise {
  0% {
    opacity: 0;
    transform: translate(-50%, -50%) scale(0.4);
  }
  25% {
    opacity: 1;
    transform: translate(-50%, -50%) scale(1);
  }
  100% {
    opacity: 0;
    transform: translate(-50%, -220%) scale(0.3);
  }
}

@media (prefers-reduced-motion: reduce) {
  .martina-signature-img {
    clip-path: none;
    -webkit-clip-path: none;
  }

  .martina-signature-dissolve-spark {
    display: none;
  }
}

/* Intro-Video-Overlay */

html.intro-locked,
html.intro-locked body {
  overflow: hidden;
}

.intro-overlay {
  position: fixed;
  inset: 0;
  z-index: 1000;
  background: var(--color-ink-deep);
  display: flex;
  align-items: center;
  justify-content: center;
  overflow: hidden;
  transition: opacity 0.8s ease;
}

.intro-overlay.is-hidden {
  opacity: 0;
  pointer-events: none;
}

#intro-video {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.intro-skip-btn {
  position: absolute;
  top: 1.5rem;
  right: 1.5rem;
  opacity: 0;
  transform: translateY(-6px);
  transition: opacity 0.5s ease, transform 0.5s ease;
}

.intro-skip-btn.is-visible {
  opacity: 1;
  transform: translateY(0);
}

/* Startseiten-Intro: der Skip-Button soll 1:1 wie der Lumaria-Intro-
   Button aussehen (gleiche Rahmen-/Textfarbe), unabhaengig vom eigenen
   rosa Farbschema der Startseite (body.theme-pastel-pink definiert
   --color-gold usw. auf Pink um, waehrend body.theme-pastel-green sie
   auf ein Gruen-Gold umdefiniert -- hier fest die Lumaria-Werte). Nur
   dieser eine Button auf der Startseite ist betroffen, .btn/.btn-
   outline bleiben ueberall sonst unveraendert. */
body.theme-pastel-pink #intro-skip.intro-skip-btn {
  border-color: #6fbf7f;
  color: #1d5c34;
}

body.theme-pastel-pink #intro-skip.intro-skip-btn:hover {
  background: rgba(111, 191, 127, 0.12);
  color: #1f4a2c;
}

/* Kurzer Partikelschwarm (Gold/Rosa) waehrend der Ueberblendung, ca. 1s
   sichtbar, dann wird die ganze Ebene per JS wieder entfernt. */
.intro-particle-layer {
  position: fixed;
  inset: 0;
  z-index: 1001;
  pointer-events: none;
}

.intro-particle {
  position: absolute;
  width: 6px;
  height: 6px;
  border-radius: 50%;
  opacity: 0;
  animation: intro-particle-rise 1.1s ease-out forwards;
}

.intro-particle.is-gold {
  background: radial-gradient(circle, #fff7e0 0%, #d9a94f 70%, transparent 100%);
}

.intro-particle.is-pink {
  background: radial-gradient(circle, #ffe6f2 0%, #e68cc8 70%, transparent 100%);
}

@keyframes intro-particle-rise {
  0%   { opacity: 0; transform: translateY(0) scale(0.6); }
  25%  { opacity: 0.9; }
  100% { opacity: 0; transform: translateY(-40px) scale(1.2); }
}

@media (prefers-reduced-motion: reduce) {
  .intro-particle {
    animation: none;
    display: none;
  }
}

/* Scroll-Reveal (cinematische Animation beim Scrollen) */

[data-reveal] {
  opacity: 0;
  transform: translateY(24px);
  transition: opacity 0.8s ease, transform 0.8s ease;
}

[data-reveal].is-visible {
  opacity: 1;
  transform: translateY(0);
}

@media (prefers-reduced-motion: reduce) {
  [data-reveal] {
    opacity: 1;
    transform: none;
    transition: none;
  }
}

/* Hero-Zitat (emotionaler Einstiegssatz) */

.hero-quote {
  font-family: var(--font-heading);
  font-style: italic;
  font-size: 1.6rem;
  color: var(--color-parchment);
  max-width: 560px;
  margin: 0.4rem auto 1.2rem;
  line-height: 1.4;
}

.hero-quote::before,
.hero-quote::after {
  color: var(--color-gold);
}

.hero-quote::before {
  content: "\201E";
}

.hero-quote::after {
  content: "\201C";
}

/* Responsive */

@media (max-width: 700px) {
  .site-header {
    flex-wrap: wrap;
    gap: 1rem;
  }

  .logo-wordmark {
    height: 90px;
  }

  .logo-badge {
    height: 108px;
    width: 108px;
  }

  body.theme-pastel-pink .logo-badge {
    height: 140px;
    width: 140px;
  }

  body.theme-pastel-lilac .logo-badge {
    height: 140px;
    width: 140px;
  }

  .hero h1 {
    font-size: 2.2rem;
  }

  /* Hamburger-Menue: unter 700px ersetzt der Toggle-Button die direkt
     sichtbare Navigation. .main-nav ist standardmaessig ausgeblendet
     und klappt beim Antippen als volle Breite UNTER die Logo-Zeile
     (kein Overlay/Backdrop, bewusst schlicht). Die Dropdown-Panels
     verhalten sich hier als Akkordeon (max-height-Uebergang) statt als
     abgesetzte Karte, da auf Touch-Geraeten kein Hover existiert. */
  .nav-toggle {
    display: flex;
  }

  .main-nav {
    display: none;
    width: 100%;
    order: 3;
    flex-direction: column;
    align-items: stretch;
    gap: 0;
    font-size: 1rem;
  }

  .main-nav.is-open {
    display: flex;
  }

  .main-nav > a {
    padding: 0.75rem 0.2rem;
    border-bottom: 1px solid rgba(var(--color-gold-rgb), 0.15);
  }

  .nav-dropdown {
    width: 100%;
  }

  .nav-dropdown-trigger {
    width: 100%;
    justify-content: space-between;
    padding: 0.75rem 0.2rem;
    border-bottom: 1px solid rgba(var(--color-gold-rgb), 0.15);
  }

  .nav-dropdown-panel {
    position: static;
    min-width: 0;
    max-height: 0;
    overflow: hidden;
    opacity: 1;
    visibility: visible;
    pointer-events: auto;
    transform: none;
    padding: 0;
    margin: 0;
    background: rgba(var(--color-gold-rgb), 0.06);
    border: none;
    border-radius: 0;
    box-shadow: none;
    transition: max-height 0.3s ease;
  }

  .nav-dropdown.is-open .nav-dropdown-panel {
    max-height: 300px;
    padding: 0.3rem 0 0.3rem 1rem;
  }

  .nav-dropdown-panel a {
    white-space: normal;
  }
}

/* Sitewide, seiteneigenschaftsunabhaengige Luecke geschlossen: die
   sieben Hauptnav-Punkte brauchen in einer Zeile ca. 820-830px, der
   Hamburger-Umschaltpunkt oben lag aber bei nur 700px -- im gesamten
   Tablet-Bereich (768-1023px) blieb dadurch die volle Desktop-Navi
   aktiv, war zu breit fuer den Header und drueckte die ganze Seite
   ueber die Viewport-Breite hinaus (horizontales Scrollen). Wiederholt
   deshalb exakt dieselbe, bereits bewaehrte Hamburger-Mechanik aus dem
   700px-Block oben zusaetzlich fuer 768-1023px -- betrifft NUR main-
   nav/nav-toggle/Dropdown-Akkordeon, keine der uebrigen im 700px-Block
   gebuendelten Regeln (Hero-Ueberschrift/Logo-Groesse bleiben dort
   unangetastet). Ab 1024px (Desktop) komplett unveraendert. Untere
   Grenze bewusst bei 768px (statt frueher 701px): 701-767px wird
   inzwischen von der neuen sitewide Mobile-Navigation (siehe
   @media max-width:767px weiter unten) abgedeckt, die dort dank
   spaeterer Quellreihenfolge ohnehin gewinnt -- die Grenze hier nur
   noch zur Klarheit an den tatsaechlichen Tablet-Bereich angepasst. */
@media (min-width: 768px) and (max-width: 1023px) {
  .nav-toggle {
    display: flex;
  }

  .main-nav {
    display: none;
    width: 100%;
    order: 3;
    flex-direction: column;
    align-items: stretch;
    gap: 0;
    font-size: 1rem;
  }

  .main-nav.is-open {
    display: flex;
  }

  .main-nav > a {
    position: relative;
    padding: 0.75rem 0.2rem;
    border-bottom: 1px solid rgba(var(--color-gold-rgb), 0.15);
  }

  .nav-dropdown {
    width: 100%;
  }

  .nav-dropdown-trigger {
    position: relative;
    width: 100%;
    justify-content: space-between;
    padding: 0.75rem 0.2rem;
    border-bottom: 1px solid rgba(var(--color-gold-rgb), 0.15);
  }

  /* Aktiver Hauptmenuepunkt + Hover (Nutzerkorrektur "Variante 2",
     analog zu Desktop weiter unten): dieselbe kleine SVG-Verzierung
     (zwei sanft geschwungene Linien, die zur Mitte hin auf ein Herz
     zulaufen) statt der vorherigen vollen geraden Goldlinie aus der
     Basis-Regel .main-nav a.active -- die faerbt hier weiterhin die
     Zeilen-Trennlinie ein (border-bottom), wird fuer .active aber auf
     dieselbe dezente rgba-Linie wie alle anderen Zeilen zurueckgesetzt,
     damit nicht zwei Linien uebereinanderliegen. ::before ist absolut
     positioniert, aendert also nie die Zeilenhoehe/das padding. */
  .main-nav > a::before,
  .main-nav > .nav-dropdown > .nav-dropdown-trigger::before {
    content: "";
    position: absolute;
    left: 6%;
    right: 6%;
    bottom: -1px;
    height: 13px;
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 16'%3E%3Cdefs%3E%3ClinearGradient id='h' x1='0' y1='0' x2='0' y2='1'%3E%3Cstop offset='0' stop-color='%23d8b45a'/%3E%3Cstop offset='1' stop-color='%237c4fa0'/%3E%3C/linearGradient%3E%3C/defs%3E%3Cpath d='M2 5C15 5,25 11,38 11C42 11,44 9,46 7' fill='none' stroke='%23c9a24d' stroke-width='1.1' stroke-linecap='round'/%3E%3Cpath d='M98 5C85 5,75 11,62 11C58 11,56 9,54 7' fill='none' stroke='%23c9a24d' stroke-width='1.1' stroke-linecap='round'/%3E%3Cpath d='M50 13.5C47 10.5,43 8.3,43 5.1C43 3,44.8 1.7,46.7 2.6C48.2 3.3,50 5.1,50 5.1C50 5.1,51.8 3.3,53.3 2.6C55.2 1.7,57 3,57 5.1C57 8.3,53 10.5,50 13.5Z' fill='url(%23h)'/%3E%3C/svg%3E");
    background-repeat: no-repeat;
    background-position: center;
    background-size: 100% 100%;
    opacity: 0;
    pointer-events: none;
    transition: opacity 0.3s ease;
  }

  .main-nav > a.active,
  .main-nav > .nav-dropdown > .nav-dropdown-trigger.active {
    border-bottom-color: rgba(var(--color-gold-rgb), 0.15);
  }

  .main-nav > a.active::before,
  .main-nav > .nav-dropdown > .nav-dropdown-trigger.active::before {
    opacity: 1;
  }

  .main-nav > a:not(.active):hover::before,
  .main-nav > a:not(.active):focus-visible::before,
  .main-nav > .nav-dropdown > .nav-dropdown-trigger:not(.active):hover::before,
  .main-nav > .nav-dropdown > .nav-dropdown-trigger:not(.active):focus-visible::before {
    opacity: 0.5;
  }

  /* Tablet-Dropdown: bleibt Teil des per Tap aufgeklappten Akkordeon-
     Menues (kein frei schwebendes Panel wie am Desktop -- auf
     schmaleren Tablets reicht die Breite fuer die volle Nav in einer
     Zeile nicht, siehe Kommentar oben), bekommt aber dieselbe
     Creme/Gold-Kartenoptik wie die neue Desktop-Dropdown-Karte und die
     neue mobile Navigation, statt der frueheren schlichten,
     rahmenlosen Flaeche. Aufklappen bleibt Tap-gesteuert (main.js
     togglet .is-open beim Klick auf den Trigger, unabhaengig von
     Hover) -- Hover greift ab 1024px ohnehin nicht mehr hier hinein. */
  .nav-dropdown-panel {
    position: static;
    min-width: 0;
    max-height: 0;
    overflow: hidden;
    opacity: 1;
    visibility: visible;
    pointer-events: auto;
    transform: none;
    padding: 0;
    margin: 0.35rem 0 0;
    background: #fdf6ea;
    border: 1px solid rgba(var(--color-gold-rgb), 0.35);
    border-radius: 14px;
    box-shadow: 0 6px 16px rgba(47, 37, 71, 0.14);
    transition: max-height 0.3s ease;
  }

  .nav-dropdown.is-open .nav-dropdown-panel {
    max-height: 320px;
    padding: 0.55rem 0.65rem;
  }

  .nav-dropdown-panel a {
    white-space: normal;
    padding: 0.75rem 0.9rem;
    border-radius: 9px;
    color: #6a5c8a;
  }

  .nav-dropdown-panel a:not(:last-child) {
    border-bottom: 1px solid rgba(var(--color-gold-rgb), 0.16);
  }

  .nav-dropdown-panel a:hover,
  .nav-dropdown-panel a:focus-visible,
  .nav-dropdown-panel a.active {
    background: rgba(var(--color-gold-rgb), 0.14);
    color: #4a3f66;
  }

  .site-header {
    flex-wrap: wrap;
    gap: 1rem;
  }
}

/* Startseite: fliegende Goldfeder über dem Schriftzug (nur .has-feather) */

.has-feather {
  overflow: hidden;
}

.has-feather .wordmark-link {
  position: relative;
  display: inline-block;
}

.has-feather .wordmark-shimmer {
  position: absolute;
  inset: 0;
  pointer-events: none;
  background: linear-gradient(100deg, transparent 35%, rgba(255, 244, 214, 0.9) 50%, transparent 65%);
  background-size: 300% 100%;
  background-position: 300% 0;
  mix-blend-mode: screen;
  opacity: 0;
}

.has-feather.is-flying .wordmark-shimmer {
  animation: wordmark-shine 9.5s ease-in-out 1;
}

@keyframes wordmark-shine {
  0%   { background-position: 300% 0; opacity: 0; }
  30%  { opacity: 0; }
  40%  { opacity: 1; }
  55%  { opacity: 1; }
  68%  { background-position: -60% 0; opacity: 0; }
  100% { background-position: -60% 0; opacity: 0; }
}

.feather-flyby {
  position: absolute;
  top: 30%;
  left: -14%;
  width: 100px;
  height: auto;
  z-index: 3;
  pointer-events: none;
  opacity: 0;
  transform: translate(0, 0) rotate(-74deg);
  transform-origin: 50% 50%;
  filter: drop-shadow(0 0 9px rgba(240, 200, 105, 0.55));
}

.has-feather.is-flying .feather-flyby {
  animation: feather-flight 9.5s linear 1 forwards;
  will-change: transform, opacity;
}

/* Sanfte, geschwungene Wellenbahn von links nach rechts &mdash; die Feder gleitet
   waagerecht (Spitze voran) mit leichtem Kippen, keine vollen Umdrehungen.
   Konstante lineare Geschwindigkeit während des Fluges (nur Start/Ende easen),
   damit sich die Bewegung durchgehend flüssig statt ruckartig anfühlt. */
@keyframes feather-flight {
  0%   { transform: translate(0vw, 0px) rotate(-74deg); opacity: 0; animation-timing-function: ease-out; }
  6%   { transform: translate(6.8vw, 18.1px) rotate(-78.6deg); opacity: 1; }
  10%  { transform: translate(11.4vw, 19px) rotate(-84.5deg); }
  20%  { transform: translate(22.8vw, -11.8px) rotate(-88.5deg); }
  30%  { transform: translate(34.2vw, -11.8px) rotate(-75.5deg); }
  40%  { transform: translate(45.6vw, 19px) rotate(-79.5deg); }
  50%  { transform: translate(57vw, 0px) rotate(-90deg); }
  60%  { transform: translate(68.4vw, -19px) rotate(-79.5deg); }
  70%  { transform: translate(79.8vw, 11.8px) rotate(-75.5deg); }
  80%  { transform: translate(91.2vw, 11.8px) rotate(-88.5deg); }
  90%  { transform: translate(102.6vw, -19px) rotate(-84.5deg); }
  94%  { transform: translate(107.2vw, -18.1px) rotate(-78.6deg); opacity: 1; animation-timing-function: ease-in; }
  100% { transform: translate(114vw, 0px) rotate(-74deg); opacity: 0; }
}

.feather-dust-layer {
  position: absolute;
  inset: 0;
  pointer-events: none;
  z-index: 2;
}

.feather-dust {
  position: absolute;
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: radial-gradient(circle, #fff7e0 0%, #f0c869 70%, transparent 100%);
  box-shadow: 0 0 6px rgba(240, 200, 105, 0.7);
  opacity: 0;
  animation: feather-dust-fade 2.6s ease-out forwards;
}

@keyframes feather-dust-fade {
  0%   { opacity: 0; transform: translate(0, 0) scale(0.6); }
  16%  { opacity: 0.85; }
  45%  { opacity: 0.55; }
  100% { opacity: 0; transform: translate(6px, 24px) scale(0.25); }
}

@media (max-width: 700px) {
  .feather-flyby {
    width: 64px;
    top: 24%;
  }
}

@media (prefers-reduced-motion: reduce) {
  .has-feather.is-flying .feather-flyby,
  .has-feather.is-flying .wordmark-shimmer,
  .feather-dust {
    animation: none !important;
    opacity: 0 !important;
  }
}

/* Lumaria: neue maerchenhafte Schriftzug-Grafik anstelle der bisherigen
   Text-Ueberschrift + Feder-Divider auf "Der Ursprung von Lumaria".
   Transparenter Hintergrund erhalten (kein Container/Box/Rahmen),
   bewusst dezent skaliert. */
/* padding-bottom ueberschreibt gezielt nur die untere Seite des
   geerbten .section-paddings (3.5rem), damit die Ueberschrift naeher
   an den Waldwaechter/Erzaehlbereich darunter heranrueckt, ohne den
   oberen Abstand zum Header anzutasten. */
.lumaria-geschichte-heading-section {
  max-width: 1200px;
  padding-bottom: 2rem;
}

.lumaria-geschichte-heading-img {
  display: block;
  width: 88%;
  max-width: 1260px;
  height: auto;
  margin: 1.7rem auto 0.8rem;
}

@media (max-width: 900px) {
  .lumaria-geschichte-heading-img {
    width: 95%;
  }
}

/* Mobile (<=767px): der Schriftzug "Der Ursprung von Lumaria" fuellt
   bereits ca. 87,5% der vollen Canvasbreite (nur ein schmaler
   Pergament-Rand drumherum, keine grossen seitlichen Dekorelemente
   wie bei den beiden Headern auf lumaria.html) -- reicht deshalb ein
   klassischer Breakout ueber den Viewport hinaus (statt vorher 95%
   der bereits gepolsterten Sektionsbreite), damit der Text deutlich
   groesser als vorher wirkt, ohne dass am Bildrand nennenswerter
   Inhalt verloren geht. */
@media (max-width: 767px) {
  .lumaria-geschichte-heading-img {
    position: relative;
    left: 50%;
    transform: translateX(-50%);
    width: 135vw;
    max-width: none;
    margin: 1rem auto 0.3rem;
  }

  /* Abstand Ueberschrift -> Waldwaechter -> Text auf Mobile deutlich
     verkleinert (geerbtes .section-padding-bottom hier 32px->8px,
     .ursprung-content-section-padding-top 80px->16px) -- Desktop/
     Tablet (>=768px) bleiben bei den bisherigen, bereits mit dem
     Nutzer abgestimmten Werten (siehe Kommentar bei .ursprung-content-
     section). */
  .lumaria-geschichte-heading-section {
    padding-bottom: 0.5rem;
  }
}

/* "Der Ursprung von Lumaria": Text und Video stehen GESTAPELT
   untereinander (nicht mehr nebeneinander) -- die Maerchenbuchseite
   soll als eigene, unabhaengig zentrierte und auf Desktop grosszuegig
   breite Einheit wirken (bis 1200px), unabhaengig von der Breite des
   Videos darunter. .ursprung-content-section deckelt daher direkt auf
   die Zielbreite der Maerchenbuchseite; .ursprung-video-col bekommt
   eine eigene, schmalere Breite und zentriert sich innerhalb desselben
   Containers. */
/* padding-top ueberschreibt gezielt nur die obere Seite des geerbten
   .section-paddings (3.5rem), Gegenstueck zum reduzierten
   padding-bottom von .lumaria-geschichte-heading-section darueber.
   Der Gesamtabstand (Ueberschrift-Bild-margin + beide Section-
   Paddings) liegt bei ca. 125px -- innerhalb der vom Nutzer selbst
   als akzeptabel genannten Spanne von 80-140px, bewusst am oberen
   Ende, damit die Waldanimation (.ursprung-forest-fx) ueber die
   volle Bildbreite genug Hoehe hat, ohne ueber die Ueberschrift zu
   fliegen. */
.ursprung-content-section {
  max-width: 1200px;
  padding-top: 5rem;
}

@media (max-width: 767px) {
  .ursprung-content-section {
    padding-top: 1rem;
  }
}

.ursprung-content-grid {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 2.4rem;
}

.ursprung-storybook-col {
  width: 100%;
  min-width: 0;
}

.ursprung-video-col {
  width: 100%;
  max-width: 640px;
  min-width: 0;
}

/* "Der Ursprung von Lumaria": die KOMPLETTE Geschichte (Anfang bis
   Schlusssatz) als eine zusammenhaengende, hochgewachsene Maerchenbuch-
   seite DIREKT auf dem pastellgruenen Seitenhintergrund -- keine eigene
   Flaeche/Box, keine Papiertextur. Die frueheren seitlichen floralen
   Ranken (::before/::after mit ursprung-vine-left/right.png) wurden
   entfernt, der Bereich zeigt dort bewusst wieder den einfachen
   hellgruenen Seitenhintergrund (Bilddateien bleiben im Projekt
   erhalten, nur die Verwendung wurde entfernt). Die Hoehe des gesamten
   Bereichs ergibt sich automatisch aus dem echten Text (kein fester
   Wert). max-width:1200px + margin:auto zentrieren die komplette
   Maerchenbuchseite (Text+Initiale+Trenner gemeinsam, da sie alle
   Kind-Elemente dieses einen Containers sind) als EINE Einheit auf der
   Seite; das Padding liess urspruenglich Platz fuer die Ranke und
   bleibt unveraendert bestehen, damit sich die Lesebreite des
   Fliesstexts (~700-850px auf Desktop) nicht veraendert. */
.ursprung-storybook {
  position: relative;
  max-width: 1200px;
  margin: 0 auto;
  --ursprung-gutter: 20px;
  padding: 0 var(--ursprung-gutter);
}

@media (min-width: 480px) {
  .ursprung-storybook {
    --ursprung-gutter: 46px;
  }
}

@media (min-width: 640px) {
  .ursprung-storybook {
    --ursprung-gutter: 68px;
  }
}

@media (min-width: 1024px) {
  .ursprung-storybook {
    --ursprung-gutter: clamp(155px, 13vw, 210px);
  }
}

.ursprung-storybook p {
  position: relative;
  font-family: "Lora", serif;
  font-size: 1.08rem;
  line-height: 1.95;
  color: #2a4435;
  margin: 0 0 1.7rem;
  clear: both;
}

.ursprung-storybook p:last-child {
  margin-bottom: 0;
}

@media (max-width: 640px) {
  .ursprung-storybook p {
    font-size: 1.02rem;
  }
}

/* Grosse Initiale "M" -- die vom Nutzer gelieferte Illustration ersetzt
   sichtbar den ersten Buchstaben von "Man erzaehlt sich"; der echte
   Textknoten beginnt technisch mit "an erzaehlt sich" (siehe HTML),
   das Bild traegt alt="M" -- fuer Screenreader ergibt das zusammen
   wieder den korrekten Wortlaut "M" + "an erzaehlt sich...". Klassische
   float-Drop-Cap-Technik, Seitenverhaeltnis der Grafik bleibt erhalten
   (height fix, width:auto). */
.ursprung-storybook-initial {
  float: left;
  height: 3.4rem;
  width: auto;
  margin: 0.1rem 0.6rem 0.2rem 0;
}

@media (min-width: 640px) {
  .ursprung-storybook-initial {
    height: 4.2rem;
  }
}

@media (min-width: 1024px) {
  .ursprung-storybook-initial {
    height: 5.2rem;
  }
}

/* Lumaris-Waldwaechter (Nutzer-Grafik): sitzt oben links im freien
   Bereich vor dem Erzaehltext. Unter 1024px (Smartphone/Tablet)
   eigenstaendiges Blockelement VOR dem ersten Absatz -- der Text
   beginnt dort ruhig darunter, kein Textumlauf noetig, da wenig
   Breite fuer eine Zweispaltigkeit vorhanden ist. display:block +
   kein margin:auto verhindert Zentrierung ab 640px, dadurch bleibt
   die Grafik am linken Rand der Textspalte; auf dem kleinsten
   Breakpoint (<640px, Smartphone) bewusst zentriert -- das ist die vom
   Nutzer explizit erlaubte Ausnahme fuer sehr schmale Displays.
   Ab 1024px (echtes Desktop-Layout mit ausreichend Breite) wird die
   Grafik stattdessen float:left -- der nachfolgende Absatz (inkl. der
   ebenfalls float:left gesetzten Initial-M) umfliesst sie automatisch
   rechts daneben, wie ein klassischer Buchseiten-Dropcap nur groesser.
   Der erste goldene Trenner (.ursprung-story-divider) traegt bereits
   clear:both, wodurch der Text automatisch wieder auf volle Breite
   zurueckkehrt, sobald die Legende ueber die Hoehe der Grafik
   hinauswaechst -- kein zusaetzliches clear noetig. Der Waldwaechter
   selbst bleibt Groesse/Position/float exakt wie zuvor. */
.ursprung-waldwaechter-wrap {
  position: relative;
  z-index: 4;
  display: block;
  width: 58%;
  max-width: 240px;
  margin: 0 auto 1.6rem;
}

/* Auf Smartphone (<640px, siehe naechster Breakpoint) wirkte der
   Waldwaechter neben dem jetzt kompakteren Abstand zu klein/verloren
   -- ca. 25% groesser (58%->72%, 240px->300px). */
@media (max-width: 639px) {
  .ursprung-waldwaechter-wrap {
    width: 72%;
    max-width: 300px;
    margin: 0 auto 1rem;
  }
}

.ursprung-waldwaechter-image {
  display: block;
  width: 100%;
  height: auto;
  margin: 0;
}

@media (min-width: 640px) {
  .ursprung-waldwaechter-wrap {
    width: 38%;
    max-width: 320px;
    margin: 0 0 1.8rem;
  }
}

@media (min-width: 1024px) {
  .ursprung-waldwaechter-wrap {
    display: block;
    float: left;
    width: 410px;
    max-width: 32vw;
    margin: 0 2.2rem 1.8rem 0;
  }
}

/* Waldanimation: bewegt sich durch den freien hellgruenen Streifen
   zwischen Ueberschrift und Waldwaechter/Erzaehltext. .ursprung-forest-fx
   liegt als GESCHWISTER von .ursprung-waldwaechter-wrap direkt in
   .ursprung-storybook, damit sie ueber die VOLLE Breite reichen kann.
   Kein overflow:hidden, kein clip-path -- beides hatte fliegende
   Elemente zuvor an einer harten Rechteckkante sichtbar abgeschnitten.
   Die Architektur wurde bewusst radikal vereinfacht (zwei vorherige
   Fassungen hatten noch eine schmale "linke Spalte" neben dem
   Waldwaechter genutzt, deren Sicherheit von einer GESCHAETZTEN
   Boxbreite abhing -- diese Fehlerquelle ist jetzt eliminiert):
   .ursprung-forest-fx ist nur noch ein einziges, einfaches Rechteck,
   dessen Hoehe so gewaehlt ist, dass seine UNTERKANTE exakt an der
   Oberkante des Waldwaechters endet (top-Erweiterung == height, siehe
   Werte unten) -- die Box endet damit VOR jedem Kontakt mit ihm,
   unabhaengig von der tatsaechlichen Breite. Alle Keyframes duerfen
   dadurch die GESAMTE Flaeche dieser Box nutzen (0-100% Breite UND
   Hoehe), ohne jede Sub-Bereichs-Beschraenkung -- kein Element kann
   ihn dadurch je erreichen, solange es innerhalb der Box bleibt.
   Sicherheit kommt aus zwei Mechanismen:
   1) Geometrie: die Box selbst beruehrt ihn nie (s.o.).
   2) z-index: die Animationsebene liegt vor Hintergrund/Containern
      (z-index:3), der Waldwaechter noch eine Stufe davor
      (.ursprung-waldwaechter-wrap, z-index:4) -- als zusaetzliche
      Absicherung, falls ein Element trotzdem an den Rand der Box
      geraet, kann er dadurch nie von ihm verdeckt werden. */
.ursprung-forest-fx {
  position: absolute;
  z-index: 3;
  pointer-events: none;
  top: -95px;
  left: -10px;
  right: -10px;
  height: 95px;
}

@media (min-width: 640px) {
  .ursprung-forest-fx {
    left: -34px;
    right: -18px;
  }
}

@media (min-width: 1024px) {
  .ursprung-forest-fx {
    left: -140px;
    right: 0;
  }
}

.ursprung-forest-item {
  position: absolute;
  display: none;
  height: auto;
  pointer-events: none;
  opacity: 0;
  will-change: transform, opacity;
}

/* Gestaffelte Sichtbarkeit nach Breakpoint: Smartphone zeigt nur den
   Schmetterling + ein Blatt + Lichtfunken; Tablet ergaenzt zweites
   Blatt und das Bluetenblatt; die Eule erscheint erst ab Desktop, wo
   genug Breite fuer ihren langen, ruhigen Flugbogen ist. Nur EIN
   Schmetterling insgesamt. */
.ursprung-forest-leaf-1 {
  display: block;
}

.ursprung-forest-leaf-2,
.ursprung-forest-petal {
  display: none;
}

@media (min-width: 640px) {
  .ursprung-forest-leaf-2,
  .ursprung-forest-petal {
    display: block;
  }
}

.ursprung-forest-leaf {
  width: 6%;
}

.ursprung-forest-leaf-1 {
  animation: ursprung-forest-leaf-drift-a 15s ease-in-out infinite;
  animation-delay: 2s;
}

.ursprung-forest-leaf-2 {
  animation: ursprung-forest-leaf-drift-b 18s ease-in-out infinite;
  animation-delay: 9s;
}

.ursprung-forest-petal {
  width: 5%;
  animation: ursprung-forest-petal-drift 24s ease-in-out infinite;
  animation-delay: 4s;
}

.ursprung-forest-spark {
  font-size: 0.6rem;
  animation-duration: 3s;
}

@media (min-width: 640px) {
  .ursprung-forest-spark {
    font-size: 0.72rem;
  }
}

/* Schmetterling und Eule: JS-gesteuerter Vorwaertsflug statt CSS-
   Loop (siehe Skript vor </body>). Grund: reine CSS-@keyframes
   spielen bei jedem Durchlauf zwangslaeufig DIESELBE Bahn, und
   mehrere eng aufeinanderfolgende Keyframe-Stopps mit ease-in-out
   erzeugten an jedem Stopp ein leichtes Abbremsen/Neubeschleunigen,
   das zusammen mit wechselndem rotate()-Vorzeichen wie ein kurzes
   Rueckwaertsfliegen wirkte. Das Skript waehlt stattdessen bei jedem
   Flug eine von mehreren fest definierten Bahnen (siehe CSS/JS-
   Kommentar im Script), bewegt sich darauf STRENG vorwaerts (nie
   umgekehrt) mit einer einzigen durchgehenden Ease-Kurve, spiegelt
   die Grafik je nach Flugrichtung EINMALIG zu Beginn des Fluges
   (nie mitten im Flug) und setzt links/top/opacity/transform per
   Inline-Style. .ursprung-forest-flyer ist daher bewusst ohne eigene
   CSS-Positions-/Animationswerte -- nur Basis-Absolutpositionierung
   und Sichtbarkeit nach Breakpoint. */
.ursprung-forest-flyer {
  position: absolute;
  top: 0;
  left: 0;
  display: none;
  pointer-events: none;
  opacity: 0;
  will-change: transform, opacity, left, top;
}

/* Die Breiten sind gestiegen, obwohl die Figuren gleich gross bleiben
   sollen. Grund: Die Bilderreihen haben ringsum mehr Luft als die
   frueheren Einzelgrafiken. Nachgemessen fuellte die Eule dort 97
   Prozent der Bildbreite, in der Reihe sind es 75 -- bei gleicher
   Prozentangabe waere sie also geschrumpft. Beim Schmetterling ist der
   Unterschied noch groesser (96 gegen 62 Prozent), weil sein Rahmen
   symmetrisch um sein Auge liegt und deshalb auf einer Seite viel
   Leerraum hat. */
.ursprung-forest-flyer-butterfly {
  display: block;
  width: 14%;
}

.ursprung-forest-flyer-owl {
  width: 19.4%;
}

@media (min-width: 1024px) {
  .ursprung-forest-flyer-owl {
    display: block;
  }
}

.ursprung-forest-flyer img {
  display: block;
  width: 100%;
  height: auto;
}

/* Sehr dezenter, rein dekorativer "Fluegelschlag": die vorhandenen
   Grafiken sind flache Einzel-PNGs ohne separate Fluegelebene, echte
   Fluegelanimation ist damit nicht moeglich. Simuliert wird
   stattdessen ein minimaler, gleichmaessiger vertikaler Stauch-Puls
   (scaleY) auf einem eigenen inneren Wrapper -- unabhaengig von der
   JS-gesteuerten Positionsanimation, laeuft durchgehend (auch wenn
   unsichtbar, dann folgenlos). Schmetterling schneller/leichter,
   Eule langsamer/kraeftiger, beide mit sehr kleiner Amplitude, um
   kein Wackeln/Pumpen zu erzeugen. */
.ursprung-forest-flutter {
  display: block;
  transform-origin: 50% 45%;
}

.ursprung-forest-flutter-butterfly {
  animation: ursprung-forest-flutter-quick 0.62s ease-in-out infinite;
}

.ursprung-forest-flutter-owl {
  animation: ursprung-forest-flutter-slow 1.1s ease-in-out infinite;
}

@keyframes ursprung-forest-flutter-quick {
  0%, 100% { transform: scaleY(1); }
  50% { transform: scaleY(0.93); }
}

@keyframes ursprung-forest-flutter-slow {
  0%, 100% { transform: scaleY(1); }
  50% { transform: scaleY(0.9); }
}

@keyframes ursprung-forest-leaf-drift-a {
  0% { left: 15%; top: 5%; opacity: 0; transform: rotate(0deg); }
  10% { opacity: 0.85; }
  50% { left: 35%; top: 75%; transform: rotate(90deg); }
  88% { opacity: 0; left: 50%; top: 40%; transform: rotate(160deg); }
  100% { left: 55%; top: 20%; opacity: 0; transform: rotate(170deg); }
}

@keyframes ursprung-forest-leaf-drift-b {
  0% { left: 70%; top: 10%; opacity: 0; transform: rotate(15deg); }
  12% { opacity: 0.8; }
  55% { left: 45%; top: 80%; transform: rotate(-100deg); }
  88% { opacity: 0; left: 25%; top: 35%; transform: rotate(-190deg); }
  100% { left: 20%; top: 15%; opacity: 0; transform: rotate(-200deg); }
}

@keyframes ursprung-forest-petal-drift {
  0%, 15% { left: 40%; top: 8%; opacity: 0; transform: rotate(-8deg); }
  35% { opacity: 0.75; left: 30%; top: 40%; }
  55% { left: 20%; top: 70%; transform: rotate(35deg); }
  75% { left: 12%; top: 50%; opacity: 0.5; transform: rotate(70deg); }
  90%, 100% { left: 8%; top: 25%; opacity: 0; transform: rotate(100deg); }
}

@media (prefers-reduced-motion: reduce) {
  .ursprung-forest-leaf,
  .ursprung-forest-petal {
    animation: none;
    opacity: 0;
  }

  .ursprung-forest-flutter {
    animation: none;
  }

  /* Schmetterling/Eule: das Script prueft prefers-reduced-motion
     selbst und startet in diesem Fall gar keinen Flug (.ursprung-
     forest-flyer bleibt bei opacity:0 aus der Basisregel). */

  /* .ursprung-forest-spark braucht keine eigene Regel: es nutzt die
     bestehende .sparkle-Klasse, die bereits siteweit auf reduzierte
     Bewegung reagiert (animation:none, opacity:0.35). */
}

/* Kleine goldene Abschnittstrenner an den grossen erzaehlerischen
   Uebergaengen der Legende (nicht nach jedem Absatz). clear:both
   stellt sicher, dass ein Trenner nie durch ein noch "aktives" Sticker-
   Float aus dem Absatz davor seitlich verschoben wird. */
.ursprung-story-divider {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 12px;
  max-width: 200px;
  margin: 2.1rem auto;
  clear: both;
}

.ursprung-story-divider-line {
  flex: 1;
  height: 1px;
}

.ursprung-story-divider-line:first-child {
  background: linear-gradient(to right, transparent, #caa356 100%);
}

.ursprung-story-divider-line:last-child {
  background: linear-gradient(to left, transparent, #caa356 100%);
}

.ursprung-story-divider-mark {
  width: 9px;
  height: 9px;
  flex-shrink: 0;
  opacity: 0.85;
}

/* Feiner ornamentaler Abschluss nach dem Schlusssatz -- geschwungene
   Goldlinien, ein kleines Herz, wenige Funkelsterne. Danach endet der
   florale Geschichtenbereich (die Ranken-Hintergruende von
   .ursprung-storybook enden exakt hier, da der Bereich seine Hoehe vom
   Inhalt bezieht). */
.ursprung-story-closing {
  clear: both;
  display: flex;
  justify-content: center;
  margin: 2.6rem 0 0.4rem;
}

.ursprung-story-closing-svg {
  width: 150px;
  height: auto;
  opacity: 0.85;
}

.ursprung-story-closing-spark {
  animation: ursprung-story-closing-twinkle 3.4s ease-in-out infinite;
}

@keyframes ursprung-story-closing-twinkle {
  0%, 100% { opacity: 0.3; }
  50%      { opacity: 1; }
}

@media (prefers-reduced-motion: reduce) {
  .ursprung-story-closing-spark {
    animation: none;
    opacity: 0.6;
  }
}

/* Schlusssatz der Ursprungsgeschichte: wird beim ersten Sichtbarwerden
   einmalig von der bekannten Signatur-Feder (img/signature-feather.png,
   dieselbe Datei wie bei "Deine Martina" auf HOME) nachgezeichnet. Die
   Feder-Position wird pro Frame per getBoundingClientRect() am jeweils
   zuletzt geschriebenen Buchstaben gemessen (siehe Inline-Script) --
   dadurch folgt sie automatisch dem tatsaechlichen, responsiven
   Zeilenumbruch statt festen Koordinaten. Anders als bei HOME verschwindet
   diese kleine Feder am Ende vollstaendig wieder. */
.ursprung-final-line {
  position: relative;
}

.ursprung-final-char {
  opacity: 0;
  transition: opacity 0.05s linear;
}

.ursprung-final-char.is-written {
  opacity: 1;
}

.ursprung-final-feather {
  position: absolute;
  top: 0;
  left: 0;
  width: 30px;
  height: auto;
  pointer-events: none;
  filter: drop-shadow(0 2px 5px rgba(90, 70, 30, 0.28));
  will-change: transform, left, top;
}

@media (max-width: 900px) {
  .ursprung-final-feather {
    width: 26px;
  }
}

@media (max-width: 640px) {
  .ursprung-final-feather {
    width: 22px;
  }
}

.ursprung-final-sparks {
  position: absolute;
  inset: 0;
  pointer-events: none;
}

.ursprung-final-spark {
  position: absolute;
  width: 4px;
  height: 4px;
  border-radius: 50%;
  background: radial-gradient(circle, #fff6da 0%, #d9a94f 70%, transparent 100%);
  opacity: 0;
  transform: translate(-50%, -50%) scale(0.4);
  animation: ursprung-final-spark-pop 800ms ease-out forwards;
}

@keyframes ursprung-final-spark-pop {
  0% {
    opacity: 0;
    transform: translate(-50%, -50%) scale(0.4);
  }
  30% {
    opacity: 1;
    transform: translate(-50%, -50%) scale(1);
  }
  100% {
    opacity: 0;
    transform: translate(-50%, -60%) scale(0.3);
  }
}

.ursprung-final-flourish-mark {
  position: absolute;
  width: 70px;
  height: 16px;
  transform: translate(0, -50%);
  pointer-events: none;
  opacity: 0;
  transition: opacity 0.35s ease;
}

.ursprung-final-flourish-mark path {
  stroke-dasharray: 140;
  stroke-dashoffset: 140;
  transition: stroke-dashoffset 0.7s ease-out;
}

.ursprung-final-flourish-mark.is-drawing {
  opacity: 0.85;
}

.ursprung-final-flourish-mark.is-drawing path {
  stroke-dashoffset: 0;
}

.ursprung-final-flourish-mark.is-fading {
  opacity: 0;
}

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

/* Sehr dezenter goldener Uebergang zwischen Geschichte und Videorahmen. */
.ursprung-gold-divider {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 1rem;
  max-width: 320px;
  margin: 0 auto;
}

.ursprung-gold-divider-line {
  flex: 1 1 auto;
  height: 1.5px;
  background: linear-gradient(90deg, transparent, #caa356 50%, transparent);
}

.ursprung-gold-divider-ornament {
  flex: 0 0 auto;
  width: 22px;
  height: 22px;
}

/* "Magisches Filmfenster im Lumi-Baum": das bestehende, unveraenderte
   Video sitzt in .ursprung-video-box, exakt positioniert auf die freie
   Mitte der vom Nutzer gelieferten Lumi-Baum-Rahmengrafik (per Prozent-
   werten, aus dem tatsaechlichen Seitenverhaeltnis der Grafik
   1672x941 vermessen). .ursprung-video-frame traegt selbst das
   Seitenverhaeltnis der Rahmengrafik (aspect-ratio) -- dadurch bleiben
   Rahmen UND Videofenster bei jeder Groesse exakt deckungsgleich und
   verkleinern sich als eine Einheit, ohne feste Pixelwerte. Die
   Rahmengrafik liegt als reines Overlay (pointer-events:none) ueber
   dem Video, sodass Aeste/Blueten optisch ueber den Videorand greifen
   koennen, ohne die Bedienbarkeit zu blockieren. */
.ursprung-video-frame {
  position: relative;
  width: 100%;
  aspect-ratio: 1672 / 941;
}

.ursprung-video-box {
  position: absolute;
  left: 19.5%;
  top: 16.8%;
  width: 61.1%;
  height: 61.5%;
  overflow: hidden;
  border-radius: 4px;
  background: #16110d;
}

.ursprung-video-box video {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: contain;
}

.ursprung-video-frame-tree {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  z-index: 1;
  pointer-events: none;
}

/* ================================================================ */
/* Lumarias Marktplatz (Shop-Seite)                                  */
/* ================================================================ */

.marketplace-hero {
  position: relative;
  max-width: 900px;
  margin: 0 auto;
  padding: 3rem 1.5rem 0.5rem;
  text-align: center;
}

.market-sign {
  position: relative;
  max-width: 620px;
  margin: 0 auto;
  filter: drop-shadow(0 12px 16px rgba(63, 53, 80, 0.18));
}

.market-sign-image {
  display: block;
  width: 100%;
  height: auto;
}

.marketplace-intro {
  margin: 1.6rem auto 0;
  max-width: 520px;
  color: var(--color-parchment-dim);
  font-size: 1.15rem;
}

.marketplace-scene {
  position: relative;
  max-width: 1100px;
  margin: 0 auto;
  padding: 0.5rem 1.5rem 5rem;
}

.storybook {
  position: relative;
  z-index: 1;
  width: 97%;
  max-width: 1200px;
  margin: 0 auto;
}

.storybook-shadow {
  position: absolute;
  left: 50%;
  bottom: -3%;
  width: 78%;
  height: 8%;
  transform: translateX(-50%);
  background: radial-gradient(ellipse, rgba(var(--color-lavender-rgb), 0.38), transparent 72%);
  filter: blur(4px);
  z-index: 0;
}

/* Einzelner Mooni (links) und zwei Moonis (rechts) flankieren das
   Holzschild "Lumarias Marktplatz" -- KORRIGIERTE Fassung, naeher an
   der Seitenmitte: Bezugsrahmen ist jetzt .market-sign selbst (bereits
   position:relative, fix 620px breit, unabhaengig vom breiteren
   .marketplace-hero darum herum), nicht mehr .marketplace-hero. Die
   Moonis sind dafuer als Kindelemente in .market-sign verschachtelt
   (siehe shop.html). right/left:calc(100% + 20px) haengt beide
   GARANTIERT ausserhalb der Schildgrafik selbst (keine Ueberlappung
   moeglich), aber nur mit kleinem, harmonischem Abstand direkt daneben
   -- vorher haengten sie stattdessen am breiteren .marketplace-hero
   (900px), wodurch durch dessen eigenes Padding + den Leerraum
   zwischen Hero- und Schildrand ca. 140px zusaetzlicher, ungewollter
   Abstand entstand. top:80px ist relativ zur Schildgrafik selbst
   (ca. 310px hoch bei voller 620px-Breite), trifft also weiterhin
   ungefaehr deren obere Bildmitte. .market-sign hat kein
   overflow:hidden (nur filter:drop-shadow, das clippt nicht). Ab
   1024px sichtbar, Tablet zeigt eine kleinere Fassung (Schildbreite
   bleibt bei 620px konstant, daher gleicher Abstand/gleiches top wie
   Desktop -- nur die Moonis selbst werden kleiner), Smartphone
   blendet beide aus. */
.marktplatz-figure {
  position: absolute;
  display: none;
  height: auto;
  pointer-events: none;
  z-index: 1;
}

.marktplatz-mooni-single {
  right: calc(100% + 20px);
  top: 80px;
  width: 190px;
}

.marktplatz-mooni-duo {
  left: calc(100% + 20px);
  top: 80px;
  width: 215px;
}

/* Buecherstapel: haengt weiterhin an .marketplace-hero (nicht an
   .market-sign wie die Moonis), unveraendert gegenueber der vorigen
   Fassung -- deutlich weiter unten (top:300px) und kleiner (130px)
   als die Moonis, damit er als dezentes Zusatzelement wirkt und nicht
   mit dem Schild konkurriert. */
.marktplatz-book-stack {
  right: calc(100% + 40px);
  top: 300px;
  width: 130px;
}

@media (min-width: 1024px) {
  .marktplatz-figure {
    display: block;
  }
}

@media (min-width: 1024px) and (max-width: 1280px) {
  .marktplatz-mooni-single {
    width: 150px;
  }

  .marktplatz-mooni-duo {
    width: 170px;
  }

  .marktplatz-book-stack {
    right: calc(100% + 20px);
    top: 240px;
    width: 100px;
  }
}

/* Lichtmotte bleibt (anders als die beiden Moonis) im freien Bereich
   ZWISCHEN Schild und Buch, in einem eigenen kleinen Dekorations-
   Container (.marktplatz-lichtmotte-zone) OBERHALB von .storybook --
   bewusst NICHT per margin-top/transform innerhalb des Buch-
   Containers nach oben verschoben, sondern ein echtes eigenstaendiges
   Element davor im normalen Fluss, mit eigener Hoehe + margin-bottom.
   Die Zonenhoehe selbst dient NUR der Layout-Reservierung im
   normalen Fluss -- .marketplace-scene hat kein overflow:hidden,
   die Motte (position:absolute, siehe .marktplatz-figure) fliegt
   also unveraendert exakt entlang derselben top/left-Keyframes wie
   zuvor, auch wenn die Box selbst jetzt niedriger ist. Trotzdem
   bleibt garantiert sichtbarer Abstand zur Buchoberkante -- auch zum
   kurzen Stueck des Waldwaechter-Kopfes, der bei .storybook selbst
   nur bis top:-8% (rechnerisch ca. 50-90px, je nach Buchbreite) ueber
   die Buchkante hinausragt: die 5.25rem margin-bottom dieser Zone
   liegen weiterhin klar darueber, keine Beruehrung moeglich. left/top
   (nicht transform:translate) animiert, da diese Prozentwerte sich
   auf die eigene, kleine Zone beziehen -- transform:translate()
   wuerde sich stattdessen auf die winzige eigene Groesse der Motte
   beziehen und kaum sichtbar wandern. */
.marktplatz-lichtmotte-zone {
  position: relative;
  width: 97%;
  max-width: 1200px;
  margin: 0 auto 5.25rem;
  height: 10px;
  display: none;
}

@media (min-width: 1024px) {
  .marktplatz-lichtmotte-zone {
    display: block;
  }
}

.marktplatz-lichtmotte {
  /* Die Bilderreihe ist eng um die Motte beschnitten, die frühere
     Einzelgrafik hatte viel leeren Raum ringsum. Bei gleicher Breite
     wäre sie dadurch schlagartig doppelt so groß geworden. */
  width: 44px;
  left: 46%;
  top: 10px;
  animation: marktplatz-lichtmotte-drift 16s ease-in-out infinite;
}

@keyframes marktplatz-lichtmotte-drift {
  0% { left: 46%; top: 10px; transform: rotate(0deg); }
  25% { left: 52%; top: 0px; transform: rotate(4deg); }
  50% { left: 56%; top: 20px; transform: rotate(-3deg); }
  75% { left: 50%; top: 30px; transform: rotate(3deg); }
  100% { left: 46%; top: 10px; transform: rotate(0deg); }
}

@media (prefers-reduced-motion: reduce) {
  .marktplatz-lichtmotte {
    animation: none;
  }
}

/* Waldwaechter: kleines Easter Egg, schaut mittig hinter dem oberen Buchrand
   hervor. Faengt erst an, wenn .marketplace-scene sichtbar wird (per
   data-reveal), und ist absichtlich VOR .storybook-image im Markup, damit
   das Buch den ueberlappenden (unteren) Teil von ihm verdeckt. */

.waldwaechter-spark {
  position: absolute;
  z-index: 1;
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: radial-gradient(circle, #fff7e0 0%, #d9a94f 70%, transparent 100%);
  box-shadow: 0 0 6px rgba(217, 169, 79, 0.7);
  opacity: 0;
  pointer-events: none;
}

.marketplace-scene.is-visible .waldwaechter-spark {
  animation: waldwaechter-spark-rise 1s ease-in-out forwards;
  animation-delay: 2s;
}

@keyframes waldwaechter-spark-rise {
  0%   { opacity: 0; transform: translateY(0) scale(0.6); }
  35%  { opacity: 0.9; }
  100% { opacity: 0; transform: translateY(-14px) scale(1.15); }
}

.waldwaechter {
  position: absolute;
  left: 66%;
  top: -8%;
  width: 23.5%;
  height: auto;
  opacity: 0;
  transform: translate(-50%, 22px);
  pointer-events: none;
  transition: opacity 1s ease-in-out 3s, transform 1s ease-in-out 3s;
}

/* Hände liegen VOR dem Buch, Kopf/Schultern bleiben DAHINTER: dieselbe
   Grafik wird zweimal uebereinander gelegt und an derselben Stelle
   gegensaetzlich beschnitten (clip-path), einmal unter und einmal ueber
   dem Buchbild &mdash; dadurch entsteht kein Versatz/keine Luecke. Direkte
   Pixelmessung zeigt: sein Umhang ist genau an der 85%-Schnittkante recht
   dunkel (dunkles Braun, keine sanfte Ausblendung zu transparent) &mdash;
   eine groesszuegigere Box zeigt dadurch NUR MEHR von diesem dunklen
   Rand auf der hellen Buchseite, was den Balken verstaerkt statt ihn zu
   beheben (durch Test bestaetigt). Die eigentliche Ursache ist also eine
   harte Kante am unteren Sichtbereich der Hinter-Ebene, kein Groessen-
   oder Positionsproblem &mdash; daher hier stattdessen ein weicher
   mask-image-Verlauf, der genau in den letzten Prozentpunkten vor dem
   clip-path sanft ausblendet statt hart abzuschneiden. */
.waldwaechter-back {
  z-index: 1;
  clip-path: inset(0 0 15% 0);
  mask-image: linear-gradient(to bottom, black 0%, black 70%, transparent 84%);
  -webkit-mask-image: linear-gradient(to bottom, black 0%, black 70%, transparent 84%);
}

.waldwaechter-front {
  /* Hoeher als .storybook-pages (z-index:2), damit die Haende nicht vom
     halbtransparenten Karten-Hintergrund (.book-page) verdeckt werden,
     der genau an der Kartenspalten-Oberkante (top:15%) einen sichtbaren
     Balken erzeugt hatte, sobald die Karte (spaeter im DOM, gewinnt bei
     gleichem z-index) ueber die Haende gemalt wurde. */
  z-index: 3;
  clip-path: inset(85% 0 0 0);
}

.marketplace-scene.is-visible .waldwaechter {
  opacity: 1;
  transform: translate(-50%, 0);
}

@media (max-width: 900px) {
  .waldwaechter {
    width: 19%;
  }
}

@media (max-width: 640px) {
  .waldwaechter,
  .waldwaechter-spark {
    display: none;
  }
}

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

  .waldwaechter-spark {
    animation: none;
  }
}

.storybook-image {
  display: block;
  width: 100%;
  height: auto;
  position: relative;
  z-index: 1;
  transform: scaleX(0.94);
  transform-origin: 50% 50%;
  transition: transform 1.4s cubic-bezier(0.22, 1, 0.36, 1);
}

.marketplace-scene.is-visible .storybook-image {
  transform: scaleX(1);
}

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

/* Produkte liegen als eigenstaendige HTML-Elemente auf den beiden
   Buchseiten, ohne die Mittelfalz zu verdecken oder ueber den Buchrand
   hinauszuragen. */

.storybook-pages {
  position: absolute;
  inset: 0;
  z-index: 2;
  pointer-events: none;
  perspective: 2200px;
}

.storybook-pages a {
  pointer-events: auto;
}

/* Eigene mobile Ein-Seiten-Buchdarstellung, siehe @media(max-width:767px)
   weiter unten -- per Default (Desktop/Tablet) unsichtbar. */
.storybook-mobile {
  display: none;
}

.storybook-page-set {
  position: absolute;
  inset: 0;
  backface-visibility: hidden;
}

.storybook-page-set:not(.is-active) {
  opacity: 0;
  pointer-events: none;
  transform: rotateY(90deg);
}

.storybook-page-set.is-active {
  opacity: 1;
  pointer-events: auto;
  transform: rotateY(0deg);
}

@media (prefers-reduced-motion: reduce) {
  .storybook-page-set {
    transition: none !important;
  }
}

.page-turn {
  position: absolute;
  z-index: 3;
  width: 34px;
  height: 34px;
  padding: 0;
  border: none;
  background: none;
  cursor: pointer;
  opacity: 0.55;
  transition: opacity 0.25s ease, transform 0.25s ease;
  pointer-events: auto;
}

.page-turn svg {
  width: 100%;
  height: 100%;
  fill: var(--color-gold-light);
  filter: drop-shadow(0 2px 3px rgba(63, 53, 80, 0.3));
}

.page-turn:hover {
  opacity: 0.95;
  transform: scale(1.08);
}

.page-turn-next {
  right: 22%;
  bottom: 31%;
}

.page-turn-prev {
  left: 22%;
  bottom: 31%;
}

.storybook-page-col {
  position: absolute;
  top: 15%;
  bottom: 30%;
  display: flex;
  flex-direction: column;
  gap: 0.6rem;
  overflow: hidden;
}

.storybook-page-col-left {
  left: 21%;
  right: 54%;
}

.storybook-page-col-right {
  left: 55%;
  right: 21%;
  justify-content: space-between;
}

/* "Brettspiel" ist vorerst aus dem Bestellbuch entfernt (Markup nur
   auskommentiert, siehe shop.html) -- die rechte Spalte auf dieser
   Doppelseite faellt dadurch komplett weg. Damit dort keine sichtbare
   Luecke bleibt, spannt sich die linke Spalte auf genau dieser
   Doppelseite (.storybook-page-set-solo) stattdessen ueber die volle
   Buchbreite, sodass Band 3 mittig und ausgewogen wirkt, statt einseitig
   an der Buchmitte zu kleben. Betrifft ausschliesslich page-set-2, alle
   anderen Doppelseiten (.storybook-page-col-left/-right) bleiben
   unveraendert zweispaltig. */
.storybook-page-set-solo .storybook-page-col-left {
  left: 21%;
  right: 21%;
}

/* Nutzerkorrektur: die halbtransparente Creme-Flaeche komplett entfernt
   (vorher ein weicher rgba-Verlauf, siehe Git-Historie) -- die Inhalte
   liegen jetzt direkt auf der echten Pergamentstruktur des Buchbilds,
   kein weisser/transparenter Kasten mehr darueber. */
.book-page {
  position: relative;
  text-align: center;
  padding: 0.5rem 0.6rem;
  border-radius: 8px;
}

.book-page-feature {
  padding: 0.7rem 0.7rem 0.6rem;
}

.book-page-compact {
  flex: 1 1 0;
  display: flex;
  flex-direction: column;
  justify-content: center;
  padding: 0.4rem 0.5rem;
}

.book-page-status {
  display: inline-block;
  font-family: var(--font-heading);
  font-size: 0.6rem;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--color-gold-light);
  border: 1px solid rgba(var(--color-gold-rgb), 0.5);
  border-radius: 999px;
  padding: 0.1rem 0.5rem;
  margin-bottom: 0.35rem;
}

.book-page-cover {
  width: 44px;
  height: 44px;
  margin: 0 auto 0.4rem;
  border-radius: 4px;
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
  font-family: var(--font-heading);
  font-size: 0.6rem;
  line-height: 1.1;
  color: var(--color-parchment-dim);
  background: linear-gradient(160deg, var(--color-lavender), var(--color-ink-light));
  border: 1px dashed rgba(var(--color-gold-rgb), 0.45);
}

/* Nutzerkorrektur: echtes Coverbild (Band 1) statt Platzhalter -- deutlich
   groesser als die alte 44px-Box, damit es auf der Buchseite als
   richtiges Cover wahrgenommen wird, aber innerhalb der verfuegbaren
   Spaltenhoehe (.storybook-page-col, oben/unten via top/bottom% begrenzt)
   bleibt, damit nichts durch das dortige overflow:hidden abgeschnitten
   wird. */
.book-page-cover-img {
  display: block;
  width: 34%;
  max-width: 62px;
  height: auto;
  margin: 0 auto 0.25rem;
  border-radius: 4px;
  box-shadow: 0 3px 10px rgba(0, 0, 0, 0.22);
}

/* Zwischen 768px (Umschaltpunkt zur mobilen Ein-Seiten-Ansicht, dort
   greift eine komplett eigene, grosszuegige .storybook-mobile-stage-
   Darstellung mit eigener Groessenregel weiter unten) und ~1000px ist
   die Buchseiten-Spalte (feste Prozentwerte der Buchgrafik) selbst mit
   einem kleinen Cover zu knapp: die Schrift skaliert nicht mit (feste
   rem-Groessen), dadurch frisst Text bei kleineren Buchgroessen einen
   wachsenden Anteil der schrumpfenden Spaltenhoehe -- gemessen wuerde
   selbst ein 50px-Cover in diesem schmalen Band noch Text abschneiden.
   Cover/Tagline bleiben dort deshalb ausgeblendet (Titel/Beschreibung/
   Preis/Button bleiben immer sichtbar), ab 1000px ist genug Puffer fuer
   ein deutlich groesseres, echtes Cover samt Tagline vorhanden. */
@media (max-width: 1239px) {
  .book-page-cover-img,
  .book-page-tagline {
    display: none;
  }
}

@media (min-width: 1240px) {
  .book-page-cover-img {
    width: 52%;
    max-width: 100px;
  }
}

.book-page-tagline {
  font-family: var(--font-heading);
  font-style: italic;
  font-size: 0.68rem;
  color: var(--color-gold-light);
  margin: -0.15rem 0 0.25rem;
}

.book-page-release-note {
  font-size: 0.74rem;
  font-style: italic;
  color: var(--color-parchment-dim);
  margin: 0.3rem 0 0;
}

/* Nutzerkorrektur: der neue Status "Erscheint im Dezember 2026" und der
   laengere Lumarin-Stein-Text brauchen etwas mehr Platz als vorher --
   nur bei dieser einen Karte (.book-page-band1) minimal engere
   Abstaende zwischen den Elementen, damit nichts abgeschnitten wird.
   Bewusst KEINE Schriftgroessen-/Farbaenderung, nur margin/line-height,
   und ausschliesslich ueber diese Zusatzklasse gebunden -- betrifft
   also weder Band 2 noch Band 3. */
.book-page-band1 .book-page-status {
  margin-bottom: 0.2rem;
}

.book-page-band1 p {
  line-height: 1.25;
  margin-bottom: 0.18rem;
}

.book-page-band1 h2 {
  margin-bottom: 0.15rem;
}

.book-page-band1 .book-page-price {
  margin: 0.15rem 0;
}

.book-page-band1 .book-page-tagline {
  margin-bottom: 0.15rem;
}

.book-page-band1.book-page-feature {
  padding-bottom: 0.1rem;
}

/* Band 2 nutzt jetzt allein die komplette rechte Buchseite (XXL Malbuch
   entfernt) -- .book-page-feature-solo zentriert den verbleibenden
   Inhalt vertikal in der Spalte statt am oberen Rand zu kleben. */
.storybook-page-col-right {
  justify-content: center;
}

.book-page h2 {
  font-size: 1rem;
  margin: 0 0 0.3rem;
  line-height: 1.15;
}

.book-page-compact h2 {
  font-size: 0.85rem;
}

.book-page p {
  font-size: 0.78rem;
  color: var(--color-parchment);
  line-height: 1.35;
  margin: 0 0 0.3rem;
}

.book-page-price {
  font-family: var(--font-heading);
  color: var(--color-gold-light);
  font-weight: 700;
  font-size: 0.78rem;
  letter-spacing: 0.01em;
  margin: 0.3rem 0;
}

.book-buy-btn {
  display: inline-block;
  margin-top: 0.3rem;
  padding: 0.4rem 0.9rem;
  font-size: 0.78rem;
  background: var(--color-ink-light);
  border: 1.5px solid var(--color-gold-light);
  color: var(--color-parchment);
  position: relative;
  overflow: hidden;
  transition: box-shadow 0.35s ease, border-color 0.35s ease;
}

.book-buy-btn::after {
  content: "";
  position: absolute;
  top: 0;
  left: -75%;
  width: 45%;
  height: 100%;
  background: linear-gradient(120deg, transparent, rgba(255, 250, 235, 0.85), transparent);
  transform: skewX(-20deg);
  transition: left 0.7s ease;
  pointer-events: none;
}

.book-buy-btn:hover {
  border-color: var(--color-gold);
  box-shadow: 0 4px 16px rgba(var(--color-gold-rgb), 0.3);
}

.book-buy-btn:hover::after {
  left: 130%;
}

/* Unter <=767px ersetzt ein eigenes Ein-Seiten-Blaetterbuch (siehe
   .storybook-mobile in shop.html) die Doppelseiten-Darstellung: das
   grosse magische Buch bleibt die Verkaufsflaeche, es zeigt auf Mobile
   nur jeweils eine grosse, aktive Buchseite statt zweier kleiner Seiten.
   Die vorhandenen .book-page-Artikel werden dafuer per JS aus den
   Doppelseiten hierher verschoben (nicht kopiert), Desktop/Tablet bleiben
   dadurch komplett unveraendert. */
@media (max-width: 767px) {
  .storybook {
    width: 100%;
    max-width: 430px;
  }

  .storybook-image,
  .storybook-shadow,
  .waldwaechter,
  .waldwaechter-spark {
    display: none;
  }

  .storybook-pages {
    display: none;
  }

  .storybook-mobile {
    display: block;
    position: relative;
    width: 100%;
    margin: 0.5rem auto 0;
  }

  .storybook-mobile-frame {
    position: relative;
    width: 100%;
    aspect-ratio: 560 / 870;
    background-image: url("../img/storybook-mobile-page.png");
    background-size: contain;
    background-repeat: no-repeat;
    background-position: center;
    filter: drop-shadow(0 14px 28px rgba(63, 53, 80, 0.3));
  }

  /* Prozentwerte sind exakt auf den freien Pergamentbereich DIESES
     zugeschnittenen Buchbilds abgestimmt (per Sharp-Raster vermessen) --
     bei einem neuen Zuschnitt muessen sie neu vermessen werden. */
  .storybook-mobile-stage {
    position: absolute;
    top: 19%;
    right: 21%;
    bottom: 33%;
    left: 15%;
    perspective: 900px;
  }

  .storybook-mobile-stage .book-page {
    position: absolute;
    inset: 0;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    width: 100%;
    height: 100%;
    margin: 0;
    padding: 0;
    text-align: center;
    background: none;
    border: none;
    box-shadow: none;
    backface-visibility: hidden;
  }

  .storybook-mobile-stage .book-page-feature,
  .storybook-mobile-stage .book-page-compact {
    padding: 0;
    flex: none;
  }

  .storybook-mobile-stage .book-page-status {
    font-size: 0.68rem;
  }

  .storybook-mobile-stage .book-page-cover {
    width: 54px;
    height: 54px;
    font-size: 0.65rem;
  }

  .storybook-mobile-stage .book-page-cover-img,
  .storybook-mobile-stage .book-page-tagline {
    display: block;
  }

  .storybook-mobile-stage .book-page-cover-img {
    width: 55%;
    max-width: 190px;
    margin: 0 auto 0.5rem;
  }

  .storybook-mobile-stage .book-page-tagline {
    font-size: 0.95rem;
    margin: -0.2rem 0 0.5rem;
  }

  .storybook-mobile-stage .book-page h2,
  .storybook-mobile-stage .book-page-compact h2 {
    font-size: 1.2rem;
    margin: 0.1rem 0 0.4rem;
  }

  .storybook-mobile-stage .book-page p {
    font-size: 0.92rem;
    max-width: 30ch;
  }

  .storybook-mobile-stage .book-page-price {
    font-size: 0.92rem;
  }

  .storybook-mobile-stage .book-buy-btn {
    font-size: 0.9rem;
    padding: 0.55rem 1.3rem;
    min-height: 44px;
    display: inline-flex;
    align-items: center;
  }

  /* Dezenter Seitenwechsel: leichte Drehung + seitlicher Versatz statt
     einer wilden 3D-Animation, respektiert prefers-reduced-motion weiter
     unten. */
  .sbm-enter-next,
  .sbm-enter-prev {
    opacity: 0;
  }

  .sbm-enter-next {
    transform: translateX(26px) rotateY(-10deg);
  }

  .sbm-enter-prev {
    transform: translateX(-26px) rotateY(10deg);
  }

  .sbm-enter-active {
    opacity: 1;
    transform: none;
    transition: transform 0.4s cubic-bezier(0.22, 1, 0.36, 1), opacity 0.32s ease;
  }

  .sbm-exit-next,
  .sbm-exit-prev {
    opacity: 0;
    transition: transform 0.32s ease, opacity 0.28s ease;
    pointer-events: none;
  }

  .sbm-exit-next {
    transform: translateX(-26px) rotateY(10deg);
  }

  .sbm-exit-prev {
    transform: translateX(26px) rotateY(-10deg);
  }

  .storybook-mobile-nav {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.75rem;
    max-width: 340px;
    margin: 1.1rem auto 0;
    padding: 0 0.5rem;
  }

  .storybook-mobile-btn {
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
    background: rgba(255, 253, 248, 0.4);
    border: 1px solid rgba(var(--color-gold-rgb), 0.5);
    border-radius: 999px;
    color: var(--color-gold-light);
    font-family: var(--font-heading);
    font-size: 0.72rem;
    letter-spacing: 0.02em;
    padding: 0.5rem 0.9rem;
    min-height: 44px;
    cursor: pointer;
    transition: opacity 0.25s ease, transform 0.25s ease, box-shadow 0.25s ease;
  }

  .storybook-mobile-btn svg {
    width: 16px;
    height: 16px;
    flex: none;
    stroke: currentColor;
  }

  .storybook-mobile-btn:hover:not(:disabled) {
    box-shadow: 0 0 12px rgba(var(--color-gold-rgb), 0.35);
    transform: scale(1.03);
  }

  .storybook-mobile-btn:disabled {
    opacity: 0.35;
    cursor: default;
  }

  .storybook-mobile-counter {
    font-family: var(--font-heading);
    font-size: 0.72rem;
    color: var(--color-gold-light);
    opacity: 0.75;
    white-space: nowrap;
  }
}

@media (max-width: 767px) and (prefers-reduced-motion: reduce) {
  .sbm-enter-next,
  .sbm-enter-prev,
  .sbm-enter-active,
  .sbm-exit-next,
  .sbm-exit-prev {
    transition: none !important;
    transform: none !important;
  }
}

@media (max-width: 640px) {
  .market-sign {
    max-width: 92%;
  }
}

.extra-tiles {
  padding-top: 0;
}

.extra-tiles-grid {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 2rem;
  max-width: 900px;
  margin: 0 auto;
}

.extra-tile {
  display: block;
  border-radius: 18px;
  overflow: hidden;
  box-shadow: 0 10px 26px rgba(47, 37, 71, 0.12);
  transition: transform 0.3s ease, box-shadow 0.3s ease;
}

.extra-tile:hover,
.extra-tile:focus-visible {
  transform: scale(1.02);
  box-shadow: 0 16px 34px rgba(47, 37, 71, 0.18);
}

.extra-tile img {
  display: block;
  width: 100%;
  height: auto;
}

@media (max-width: 640px) {
  .extra-tiles-grid {
    grid-template-columns: 1fr;
    gap: 1.4rem;
  }
}

/* ================================================================ */
/* Über mich                                                          */
/* ================================================================ */

.about-hero {
  padding-top: 3.5rem;
  text-align: center;
}

.about-lower {
  position: relative;
}

.about-frame-left {
  position: absolute;
  top: 950px;
  left: 12px;
  width: 210px;
  pointer-events: none;
  z-index: -1;
}

.about-frame-left img {
  display: block;
  width: 100%;
  height: auto;
}

@media (max-width: 1300px) {
  .about-frame-left {
    width: 150px;
  }
}

@media (max-width: 900px) {
  .about-frame-left {
    display: none;
  }
}

.about-heading-image {
  display: block;
  width: 100%;
  max-width: 820px;
  height: auto;
  margin: 0 auto 1.6rem;
}

.about-overview-heading-image {
  display: block;
  width: 76%;
  max-width: 760px;
  height: auto;
  margin: 1rem auto 1.4rem;
}

@media (max-width: 640px) {
  .about-overview-heading-image {
    width: 92%;
  }
}

.about-heading-star {
  color: var(--color-gold);
  font-size: 0.65em;
  vertical-align: middle;
}

/* Kein object-fit:cover mehr -- das Foto behaelt sein natuerliches
   Hochformat (kein Zuschnitt an Kopf/Haaren/Haenden), der Rahmen
   folgt einfach der tatsaechlichen Bildhoehe (height:auto). */
.about-portrait-placeholder {
  width: 100%;
  max-width: 320px;
  margin: 0 auto 2.2rem;
  border-radius: 18px;
  overflow: hidden;
  box-shadow: 0 10px 26px rgba(47, 37, 71, 0.1);
}

.about-portrait-img {
  display: block;
  width: 100%;
  height: auto;
}

@media (max-width: 560px) {
  .about-portrait-placeholder {
    max-width: 240px;
  }
}

.about-intro {
  max-width: 640px;
  margin: 0 auto;
}

/* Persoenlicher Herzstueck-Abschnitt (kompletter Autorinnentext):
   warme, sehr helle Creme-/Flieder-Flaeche ohne harte Kachel-/Rahmen-
   Optik (kein Rand, kein Schatten), viel Weissraum zwischen den
   Absaetzen. Die drei zentralen Saetze (.about-heart-quote) heben sich
   per Alex-Brush-Schreibschrift (bereits sitewide fuer Signatur-
   Momente verwendet) vom Fliesstext ab. Sehr helle Hintergrund-Opazitaet
   (0.5/0.22 statt vorher 0.7/0.35), damit die inzwischen deutlich
   laengere Flaeche nicht wie ein schwerer Block wirkt.

   ::before/::after-Verlaufsstreifen (statt mask-image auf die ganze
   Box) lassen nur den LEEREN Hintergrund oben/unten weich in den
   Seitenhintergrund auslaufen -- eine Opacity-Maske auf die komplette
   Box wuerde auch Text (z.B. den emotionalen Hoehepunkt mit der
   schreibenden Feder) mit ausblenden, genau das darf nicht passieren.
   Grosszuegiges padding oben/unten haelt jeglichen Text sicher
   oberhalb/unterhalb der beiden Verlaufsstreifen (je 56px hoch), damit
   die Verlaeufe ausschliesslich auf freier Flaeche sichtbar werden. */
.about-heart-story {
  position: relative;
  margin-top: 1.8rem;
  padding: 3.6rem 1.8rem 4rem;
  border-radius: 28px;
  background: linear-gradient(160deg, rgba(253, 248, 241, 0.5) 0%, rgba(228, 217, 245, 0.22) 100%);
  text-align: center;
  overflow: hidden;
}

.about-heart-story::before,
.about-heart-story::after {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  height: 56px;
  pointer-events: none;
}

.about-heart-story::before {
  top: 0;
  background: linear-gradient(to top, rgba(250, 247, 253, 0) 0%, rgba(250, 247, 253, 0.9) 100%);
}

.about-heart-story::after {
  bottom: 0;
  background: linear-gradient(to bottom, rgba(247, 242, 252, 0) 0%, rgba(247, 242, 252, 0.95) 100%);
}

/* Zarter Trenner zwischen dem emotionalen Abschnitt und "Professionell
   & Offiziell" -- feine goldene Linien mit der bereits verwendeten
   Signatur-Feder mittig, bewusst zurueckhaltend (keine grosse Grafik,
   keine Animation). */
.about-heart-divider {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 0.9rem;
  max-width: 320px;
  margin: 0.4rem auto 1.6rem;
}

.about-heart-divider-line {
  flex: 1 1 auto;
  height: 1px;
  background: linear-gradient(90deg, transparent, rgba(var(--color-gold-rgb), 0.55), transparent);
}

.about-heart-divider-feather {
  display: block;
  width: 22px;
  height: auto;
  opacity: 0.8;
  transform: rotate(-8deg);
}

.about-heart-story-deco {
  display: block;
  width: 34px;
  height: auto;
  margin: 0 auto 1rem;
  transform: rotate(-10deg);
  opacity: 0.85;
}

.about-heart-story-title {
  font-family: var(--font-heading);
  font-size: 1.55rem;
  color: var(--color-gold-light);
  margin: 0 0 1.6rem;
}

.about-heart-story p {
  margin: 0 0 1.3rem;
  line-height: 1.7;
  color: var(--color-parchment);
}

.about-heart-story p:last-child {
  margin-bottom: 0;
}

/* Zwei-Klassen-Selektoren (.about-heart-story .xyz statt nur .xyz) sind
   bewusst noetig: .about-heart-story p hat selbst schon Spezifitaet
   (0,1,1) -- ein einzelner Klassenselektor wie .about-heart-quote
   allein (0,1,0) wuerde dagegen bei ueberschneidenden Eigenschaften
   (hier: margin) verlieren, unabhaengig von der Position im Quelltext. */
.about-heart-story .about-heart-quote {
  font-family: "Alex Brush", cursive;
  font-size: 1.7rem;
  line-height: 1.5;
  color: var(--color-gold);
  margin: 1.8rem 0;
}

.about-heart-story .about-heart-whisper {
  font-family: var(--font-heading);
  font-style: italic;
  font-size: 1.15rem;
  line-height: 1.9;
  color: var(--color-parchment);
  margin: 1.6rem 0;
}

.about-heart-story .about-heart-final-line {
  font-family: var(--font-heading);
  font-size: 1.25rem;
  color: var(--color-gold-light);
  margin: 1.6rem 0 1.4rem;
}

.about-heart-story .about-heart-signature {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.2rem;
  margin: 0.4rem 0 0;
}

.about-heart-signature-name {
  font-family: "Alex Brush", cursive;
  font-size: 2rem;
  color: var(--color-gold);
}

.about-heart-signature-role {
  font-size: 0.85rem;
  color: var(--color-parchment-dim);
}

/* Emotionaler Hoehepunkt des Abschnitts -- zusaetzlich groesser als
   die beiden anderen Zitate und traegt weiterhin die bereits
   bestehende schreibende Federanimation (.about-final-*, JS am
   Seitenende unveraendert): NUR Text/Typografie wurden angepasst, der
   Animationsmechanismus (Buchstaben-Spans, live per
   getBoundingClientRect positionierte Feder, IntersectionObserver-
   Trigger) bleibt exakt derselbe wie zuvor. Kein manueller <br> im
   animierten Text (siehe HTML) -- die Feder-Logik liest den Satz als
   EINE fortlaufende Zeichenkette und muss dem tatsaechlichen,
   responsiven Zeilenumbruch folgen koennen, das wuerde ein fest
   codierter Umbruch verhindern. */
.about-heart-story .about-heart-quote--climax {
  position: relative;
  font-size: 2.1rem;
  margin: 2.2rem 0;
}

.about-heart-quote-glow {
  position: absolute;
  inset: -20% -8%;
  background: radial-gradient(ellipse at center, rgba(var(--color-gold-rgb), 0.16) 0%, transparent 70%);
  z-index: -1;
  pointer-events: none;
}

@media (max-width: 640px) {
  .about-heart-story {
    padding: 3rem 1.2rem 3.2rem;
  }

  .about-heart-story::before,
  .about-heart-story::after {
    height: 44px;
  }

  .about-heart-story .about-heart-quote {
    font-size: 1.4rem;
  }

  .about-heart-story .about-heart-whisper {
    font-size: 1.05rem;
  }

  .about-heart-story-title {
    font-size: 1.3rem;
  }

  .about-heart-quote--climax {
    font-size: 1.65rem;
  }
}

/* Schreibende Federanimation fuer den letzten Satz -- Technik
   unveraendert (Buchstaben-Spans, Federposition per
   getBoundingClientRect am jeweils letzten geschriebenen Zeichen
   gemessen, folgt dadurch automatisch dem tatsaechlichen, responsiven
   Zeilenumbruch, IntersectionObserver-Trigger, Feder verschwindet am
   Ende wieder vollstaendig), nur der Text und die Einbettung
   (.about-heart-quote--climax, siehe oben) wurden angepasst. */
.about-final-line {
  position: relative;
}

.about-final-char {
  opacity: 0;
  transition: opacity 0.05s linear;
}

.about-final-char.is-written {
  opacity: 1;
}

.about-final-feather {
  position: absolute;
  top: 0;
  left: 0;
  width: 32px;
  height: auto;
  pointer-events: none;
  filter: drop-shadow(0 2px 5px rgba(90, 70, 30, 0.28));
  will-change: transform, left, top;
}

@media (max-width: 900px) {
  .about-final-feather {
    width: 28px;
  }
}

@media (max-width: 640px) {
  .about-final-feather {
    width: 24px;
  }
}

.about-final-sparks {
  position: absolute;
  inset: 0;
  pointer-events: none;
}

.about-final-spark {
  position: absolute;
  width: 4px;
  height: 4px;
  border-radius: 50%;
  background: radial-gradient(circle, #fff6da 0%, #d9a94f 70%, transparent 100%);
  opacity: 0;
  transform: translate(-50%, -50%) scale(0.4);
  animation: about-final-spark-pop 800ms ease-out forwards;
}

@keyframes about-final-spark-pop {
  0% {
    opacity: 0;
    transform: translate(-50%, -50%) scale(0.4);
  }
  30% {
    opacity: 1;
    transform: translate(-50%, -50%) scale(1);
  }
  100% {
    opacity: 0;
    transform: translate(-50%, -60%) scale(0.3);
  }
}

.about-final-flourish-mark {
  position: absolute;
  width: 70px;
  height: 16px;
  transform: translate(0, -50%);
  pointer-events: none;
  opacity: 0;
  transition: opacity 0.35s ease;
}

.about-final-flourish-mark path {
  stroke-dasharray: 140;
  stroke-dashoffset: 140;
  transition: stroke-dashoffset 0.7s ease-out;
}

.about-final-flourish-mark.is-drawing {
  opacity: 0.85;
}

.about-final-flourish-mark.is-drawing path {
  stroke-dashoffset: 0;
}

.about-final-flourish-mark.is-fading {
  opacity: 0;
}

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

/* Ruhiger Bereich direkt unter "Auf einen Blick" (ersetzt die
   vorherigen sechs Kacheln vollstaendig) mit einem zweiten, realen
   Autorinnenfoto -- bewusst kein Kachelblock/harter Rahmen, sondern
   eine weiche Creme-Flieder-Flaeche mit viel Weissraum, passend zum
   bestehenden maerchenhaften Stil der Seite (gleiche Radien-/
   Schattensprache wie beim oberen Portraetfoto). Inhaltlich eine
   Zusammenfassung der drei zuletzt entfernten Kacheln (Kreative
   Begleitung/Inspiration/Herzensprojekt) -- Autorin/Gruenderin/Kaffee-
   Themen bleiben bewusst aussen vor, die wiederholen sich bereits im
   oberen Vorstellungstext. */
.about-photo-quote {
  max-width: 1080px;
  margin: 0 auto;
}

.about-photo-quote-inner {
  display: flex;
  align-items: center;
  gap: 3rem;
  background: linear-gradient(135deg, #fdf8f1 0%, #f7f0fa 100%);
  border: 1px solid rgba(var(--color-gold-rgb), 0.18);
  border-radius: 28px;
  padding: 2.6rem 3rem;
  box-shadow: 0 16px 40px rgba(47, 37, 71, 0.06);
}

.about-photo-quote-media {
  flex: 0 0 42%;
  max-width: 42%;
}

.about-photo-quote-img {
  display: block;
  width: 100%;
  height: auto;
  border-radius: 20px;
  box-shadow: 0 12px 28px rgba(47, 37, 71, 0.12);
}

.about-photo-quote-text {
  flex: 1;
  text-align: left;
}

.about-photo-quote-star {
  display: block;
  color: var(--color-gold);
  font-size: 1.1rem;
  margin-bottom: 0.8rem;
}

.about-photo-quote-heading {
  font-family: var(--font-heading);
  font-size: 1.5rem;
  color: var(--color-parchment);
  line-height: 1.4;
  margin: 0 0 0.9rem;
}

.about-photo-quote-sub {
  font-family: var(--font-body);
  font-size: 1.05rem;
  color: var(--color-parchment-dim);
  line-height: 1.6;
  margin: 0 0 0.9rem;
}

.about-photo-quote-sub:last-child {
  margin-bottom: 0;
}

.about-photo-quote-sub.about-photo-quote-highlight {
  font-family: var(--font-heading);
  font-style: italic;
  font-size: 1.15rem;
  color: var(--color-gold);
}

@media (max-width: 900px) {
  .about-photo-quote-inner {
    gap: 2rem;
    padding: 2.2rem;
  }

  .about-photo-quote-media {
    flex-basis: 45%;
    max-width: 45%;
  }
}

/* Nur Smartphone: die geerbte .section-Innenabstaende (padding:3.5rem
   oben/unten) summierten sich zwischen "Auf einen Blick" und dem
   Foto darunter zu einer grossen Leerflaeche (Divider-Rand + Padding-
   unten der ersten Sektion + Padding-oben der zweiten Sektion).
   Beide Werte hier gezielt nur auf Mobile reduziert -- Desktop/Tablet
   verwenden weiterhin die unveraenderten globalen .section-Werte. */
@media (max-width: 640px) {
  .about-overview-section {
    padding-bottom: 0;
  }

  .about-overview-section .divider {
    margin-bottom: 0;
  }

  .about-photo-quote {
    padding-top: 0.75rem;
  }

  .about-photo-quote-inner {
    flex-direction: column;
    padding: 1.8rem 1.4rem;
  }

  .about-photo-quote-media {
    max-width: 240px;
    flex-basis: auto;
    margin: 0 auto;
  }

  .about-photo-quote-text {
    text-align: center;
  }

  .about-photo-quote-star {
    text-align: center;
  }
}

.about-quote-section {
  max-width: 1200px;
}

.about-quote-image {
  display: block;
  width: 84%;
  max-width: 1160px;
  height: auto;
  margin: 0 auto;
}

@media (max-width: 640px) {
  .about-quote-image {
    width: 95%;
  }
}

/* Zertifikats-Grafik "Professionell & Offiziell": soll wie ein
   natuerlicher Teil der Seite wirken statt wie ein eingesetztes Bild --
   kein Rahmen, kein Schatten, sondern derselbe weiche mask-image-
   Verlauf wie bei .lumaria-welcome-scene-img. Die Maske haelt bewusst
   einen grossen, voll deckenden Kernbereich (bis 74% des Ellipsen-
   Radius), damit Ueberschrift, Icon-Zeilen und der Zitat-Kasten des
   Zertifikats niemals angeschnitten wirken -- nur die dekorativen
   Ranken/Ecken ganz aussen blenden weich aus. Wie beim Vorbild wird das
   Bild per transform:scale() etwas groesser als sein Rahmen
   dargestellt (overflow:hidden auf .about-professional-frame), wodurch
   die tatsaechliche harte PNG-Kante immer ausserhalb des sichtbaren
   Bereichs liegt. */
.about-professional-frame {
  max-width: 780px;
  margin: 1.4rem auto 0;
  padding: 0 1rem;
  overflow: hidden;
}

.about-professional-img {
  display: block;
  width: 100%;
  height: auto;
  transform: scale(1.06);
  transform-origin: 50% 50%;
  mask-image: radial-gradient(ellipse 68% 62% at 50% 50%, black 0%, black 74%, transparent 100%);
  -webkit-mask-image: radial-gradient(ellipse 68% 62% at 50% 50%, black 0%, black 74%, transparent 100%);
}

@media (max-width: 640px) {
  .about-professional-frame {
    margin-top: 1.2rem;
    padding: 0 0.5rem;
  }
}

/* ================================================================ */
/* Meine Werkstatt: KI-Geist-Vorstellung (Bild + Einstiegstext)      */
/* ================================================================ */

/* .werkstatt-intro traegt selbst keine max-width/kein Padding mehr
   (siehe .werkstatt-scene), damit die magischen Hintergrundelemente
   bis nah an den Seitenrand reichen koennen, waehrend der eigentliche
   Inhalt (.werkstatt-geist-layout) weiterhin zentriert und begrenzt
   bleibt. */
.werkstatt-intro {
  max-width: none;
  padding: 0;
}

/* Reiner Layout-Wrapper -- die magische Randdekoration kommt jetzt
   vollstaendig aus dem Seitenhintergrund (siehe body.werkstatt-page),
   nicht mehr aus einzeln programmierten CSS-Elementen. */
.werkstatt-scene {
  position: relative;
  padding: 3rem 1.5rem 2rem;
}

/* Zweispaltiges Layout: Text links, KI-Geist rechts. align-items:start
   sorgt dafuer, dass das Bild oben auf Hoehe der Ueberschrift beginnt
   statt (wie zuvor) an der Mitte der oft laengeren Textspalte
   auszurichten. Unter 800px faellt es auf eine Spalte zusammen; die
   Reihenfolge Ueberschrift -> Text -> Bild -> Botschaft ergibt sich
   automatisch aus der HTML-Reihenfolge (Text steht vor dem Bild im
   Markup), ohne eigene order-Regel. */
.werkstatt-geist-layout {
  position: relative;
  z-index: 1;
  display: grid;
  grid-template-columns: 1fr minmax(300px, 400px);
  gap: 2.5rem;
  align-items: start;
  max-width: 1080px;
  margin: 0 auto;
}

/* max-width + margin-left:auto ruecken den Text von der linken
   Bildkante weg zur Seitenmitte, damit er ueberwiegend auf dem
   ruhigen, hellen Bereich des neuen Hintergrundbilds steht statt
   ueber den floralen Randelementen. Die dunklere Grundfarbe (warmes
   Aubergine statt des helleren Theme-Fliedertons) verbessert die
   Lesbarkeit gegen den texturierten Hintergrund; Hervorhebung/
   Kursivzeilen behalten ihre eigene, explizit gesetzte Farbe. */
.werkstatt-intro-text {
  text-align: left;
  padding-top: 0.5rem;
  max-width: 480px;
  margin-left: auto;
  color: #3f285f;
}

.werkstatt-intro-text h1 {
  margin-bottom: 0.3rem;
}

/* Maerchenhafte Schwungschrift statt der site-weiten Playfair-
   Ueberschrift, NUR fuer diese eine Zeile -- deshalb per eigenem
   font-family direkt hier gesetzt statt ueber die globale h1/h2/h3-
   Regel. Etwas groesser als vorher (1.7rem -> 2.1rem), weil
   Schwungschriften bei zu kleiner Groesse gedrungen/schlecht lesbar
   wirken; Farbe unveraendert (#5c1f8f) wie ausdruecklich gewuenscht. */
.werkstatt-intro-text h2 {
  margin-top: 0;
}

/* Bereitgestellte Grafik ("Willkommen in meiner Tintenzauberwerkstatt")
   ersetzt die vorherige Text-Ueberschrift komplett -- kein eigener
   Hintergrund/Rahmen/Schatten/Filter, das Bild traegt bereits alles
   (Schrift, Farben, Feder, Verzierungen). width:100% skaliert sie
   proportional auf die Breite von .werkstatt-intro-text (max. 480px),
   height:auto verhindert jede Verzerrung. */
.werkstatt-heading-img {
  display: block;
  width: 100%;
  height: auto;
}

.werkstatt-intro-text p {
  margin: 0 0 1.05rem;
}

/* Direkt (statt nur ueber Vererbung vom Container) gesetzt, damit hier
   garantiert keine hellere/transparente Farbe greifen kann. Die
   :not()-Ausnahmen sorgen dafuer, dass Hervorhebung/Kursivzeilen/
   Signatur ihre eigene, bewusst andere Farbe/Deckkraft behalten. */
.werkstatt-intro-text p:not(.werkstatt-intro-highlight):not(.werkstatt-intro-emphasis):not(.werkstatt-signature-wrap) {
  color: #3f285f;
  opacity: 1;
}

/* Einzelne wichtige Aussagen dezent hervorgehoben statt als langer
   Fliesstext: die Kernbotschaft in Gold, die vier kurzen Klarstellungs-
   zeilen ("KI ist fuer mich ein Werkzeug...") ruhiger/kursiv abgesetzt. */
.werkstatt-intro-highlight {
  font-family: var(--font-heading);
  color: #3f285f;
  opacity: 1;
  font-weight: 700;
  background: none;
  box-shadow: none;
  border: none;
  padding: 0;
}

.werkstatt-intro-emphasis {
  font-style: italic;
  color: var(--color-parchment-dim);
  line-height: 1.8;
}

/* Persoenliche Unterschrift als Abschluss des Textblocks: schwungvolle
   Script-Schrift statt der sonstigen Ueberschriften-/Fliesstext-Fonts,
   in tiefem Violett mit einem sehr dezenten goldenen Lichtstreifen quer
   durch den Text (per background-clip:text) -- kein Farbverlauf am
   ganzen Wort, nur ein schmaler Glanzstreifen in der Mitte, wie ein
   Lichtreflex auf frischer Tinte. Kein Rahmen/Hintergrund, nur wenige
   goldene Lichtpunkte + duenne Funkenspuren als freistehende, absolut
   positionierte Elemente um die Signatur herum (Positionen per Inline-
   Style, analog zur botanischen Dekoration weiter oben). */
.werkstatt-signature-wrap {
  position: relative;
  display: inline-block;
  margin: 0.4rem 0 0;
}

.werkstatt-signature {
  display: inline-block;
  font-family: "Alex Brush", cursive;
  font-size: 2.5rem;
  line-height: 1;
  color: #4a2f7a;
  background: linear-gradient(100deg, #4a2f7a 0%, #4a2f7a 40%, #caa356 50%, #4a2f7a 60%, #4a2f7a 100%);
  -webkit-background-clip: text;
  background-clip: text;
  -webkit-text-fill-color: transparent;
}

.werkstatt-signature-dust {
  position: absolute;
  z-index: 1;
  pointer-events: none;
  width: 4px;
  height: 4px;
  border-radius: 50%;
  background: radial-gradient(circle, #fff3d6 0%, #d9a94f 70%, transparent 100%);
  animation: werkstatt-signature-twinkle 3.4s ease-in-out infinite;
}

@keyframes werkstatt-signature-twinkle {
  0%, 100% {
    opacity: 0.25;
    transform: scale(0.8);
  }
  50% {
    opacity: 1;
    transform: scale(1.2);
  }
}

.werkstatt-signature-trail {
  position: absolute;
  z-index: 1;
  pointer-events: none;
  height: 1.5px;
  border-radius: 999px;
  background: linear-gradient(90deg, transparent 0%, rgba(201, 162, 77, 0.65) 50%, transparent 100%);
}

@media (prefers-reduced-motion: reduce) {
  .werkstatt-signature-dust {
    animation: none;
    opacity: 0.7;
  }
}

.werkstatt-geist-column {
  display: flex;
  flex-direction: column;
  align-items: center;
}

.werkstatt-geist-visual {
  position: relative;
  width: 100%;
}

/* Verschwommenes lila/goldenes Leuchten HINTER dem Bild, das bewusst
   ueber dessen eigenen Rahmen hinausreicht (negatives inset) -- dadurch
   wirken die violetten/goldenen Lichtpartikel des Bildes, als wuerden
   sie tatsaechlich in die Seite hinein weiterstrahlen, statt an der
   Bildkante hart aufzuhoeren. Liegt auf einer eigenen Ebene NEBEN
   .werkstatt-geist-frame (nicht darin), damit dessen eigenes
   overflow:hidden nur das Bild selbst betrifft und dieses Leuchten frei
   nach aussen bluten kann. */
.werkstatt-geist-aura {
  position: absolute;
  inset: -20% -18% -34% -18%;
  z-index: -1;
  display: block;
  pointer-events: none;
  background:
    radial-gradient(ellipse 55% 50% at 50% 42%, rgba(154, 118, 200, 0.24) 0%, transparent 70%),
    radial-gradient(ellipse 42% 38% at 72% 68%, rgba(201, 162, 77, 0.16) 0%, transparent 72%);
  filter: blur(28px);
}

/* Im Tablet-Bereich (801-1023px) bleibt das zweispaltige Desktop-
   Layout aktiv (Umbruch erst bei 800px, siehe Media Query weiter
   unten), aber der Seiteninhalt ist hier schmaler als am Desktop --
   der grosszuegige negative Bleed des Leuchtens (-18% links/rechts)
   ragte dadurch ueber den Viewport-Rand hinaus und erzeugte
   horizontales Scrollen. Nur der seitliche Bleed wird hier verkleinert
   (oben/unten unveraendert), Desktop (ab 1024px) und das gestapelte
   Mobile-Layout (<=800px) bleiben unangetastet. */
@media (min-width: 801px) and (max-width: 1023px) {
  .werkstatt-geist-aura {
    inset: -20% -6% -34% -6%;
  }
}

/* Der KI-Geist soll wie ein natuerlicher Teil der Werkstatt-Seite
   wirken, nicht wie ein eingesetztes Foto -- kein Rahmen, kein
   Schatten, sondern ein weicher mask-image-Verlauf.

   WICHTIG zur Mathematik: bei radial-gradient() ist die Groessenangabe
   ("ellipse X% Y%") der RADIUS der Ellipse relativ zur Box, waehrend
   der Abstand von der Mitte zur eigentlichen Bildkante immer exakt 50%
   betraegt. Die vorherige Fassung nutzte X/Y-Werte UEBER 50% (70%/66%)
   -- dadurch lag die Bildkante selbst noch WEIT VOR dem "100%"-Punkt
   des Verlaufs (dem Punkt, an dem er vollstaendig transparent wird),
   und man sah entlang der geraden Kanten (oben/unten/links/rechts,
   nicht in den Ecken) weiterhin eine klar erkennbare, kaum verblasste
   Bildbegrenzung. Jetzt bewusst DEUTLICH UNTER 50% (46%/44%), damit der
   Verlauf sein Ziel "transparent 100%" garantiert VOR der echten
   Bildkante erreicht -- an der Kante selbst ist das Bild dadurch in
   jeder Richtung bereits vollstaendig unsichtbar, mit spuerbarem
   Sicherheitsabstand. Der voll deckende Kernbereich (bis 48% des
   Ellipsen-Radius) haelt den Geist selbst weiterhin komplett sichtbar
   und scharf; die Bandbreite von dort bis zum Rand ist bewusst breit
   fuer einen grosszuegigen, sehr weichen Uebergang. */
.werkstatt-geist-frame {
  overflow: hidden;
}

.werkstatt-geist-img {
  display: block;
  width: 100%;
  height: auto;
  transform: scale(1.1);
  transform-origin: 50% 50%;
  mask-image: radial-gradient(ellipse 46% 44% at 50% 50%, black 0%, black 48%, transparent 100%);
  -webkit-mask-image: radial-gradient(ellipse 46% 44% at 50% 50%, black 0%, black 48%, transparent 100%);
}

@media (max-width: 800px) {
  .werkstatt-geist-layout {
    grid-template-columns: 1fr;
    max-width: 480px;
    gap: 2.2rem;
  }

  .werkstatt-intro-text {
    text-align: center;
    padding-top: 0;
    max-width: 480px;
    margin-left: auto;
    margin-right: auto;
  }

  .werkstatt-intro-emphasis {
    text-align: left;
  }

  .werkstatt-geist-img {
    transform: scale(1.06);
  }
}

/* ================================================================ */
/* Meine Werkstatt: Timeline "Hinter den Kulissen -- in Zahlen"     */
/* ================================================================ */

/* Fertiges, bereitgestelltes Bild (Ueberschrift, alle sechs Stationen,
   Texte, Zeitangaben, Symbole, Verbindungslinie und der Abschluss "Ein
   Buch in Zahlen" sind bereits Teil des Bildes -- nichts davon wird
   zusaetzlich als HTML-Text wiederholt). Grosszuegig ueber die volle
   Inhaltsbreite dargestellt (siehe .werkstatt-timeline-section).

   Das <img> traegt KEINERLEI Effekt (keine Maske, kein Filter, kein
   Transform, keine Rundung, kein Schatten, kein Rand-Fade) -- es liegt
   zu 100% scharf auf dem durchgehenden Seitenhintergrund
   (body.werkstatt-page), der Uebergang entsteht allein dadurch, dass
   Hintergrund und Bildraender farblich zueinander passen. */
/* .werkstatt-timeline-section traegt selbst keine max-width/kein
   Padding mehr (analog zu .werkstatt-intro), damit die Hintergrund-
   Buehne (.werkstatt-timeline-scene) bis an den Seitenrand reicht --
   der eigentliche Inhalt (.werkstatt-timeline-frame) bleibt weiterhin
   zentriert und auf 1280px begrenzt. */
.werkstatt-timeline-section {
  max-width: none;
  padding: 0;
}

/* Kein eigener Section-Hintergrund mehr -- transparent, damit der neue
   Seitenhintergrund (body.werkstatt-page) ungestoert durchscheint. */
.werkstatt-timeline-scene {
  position: relative;
  padding: 1.5rem 1.5rem 4rem;
  background: transparent;
}

.werkstatt-timeline-frame {
  position: relative;
  z-index: 1;
  width: 100%;
  max-width: 1280px;
  margin: 0 auto;
}

.werkstatt-timeline-img {
  display: block;
  width: 100%;
  height: auto;
  border-radius: 0;
  border: none;
  box-shadow: none;
  filter: none;
  opacity: 1;
}

/* ================================================================ */
/* Meine Werkstatt: "Noch ein bisschen neugierig?" -- 3 Kachelplaetze */
/* ================================================================ */

/* Reine Struktur-Vorbereitung: die drei Kacheln kommen als fertige,
   bereits vollstaendig gestaltete Grafiken (Illustration + Ueber-
   schrift + Text + Button-Beschriftung sind Teil des Bildes) --
   deshalb hier bewusst KEIN eigenes Karten-Design (kein Rahmen, kein
   Hintergrund, kein Schatten, keine Rundung). Kein eigener Section-
   Hintergrund, damit der durchgehende Seitenhintergrund
   (body.werkstatt-page) ungestoert sichtbar bleibt. */
.werkstatt-more-section {
  max-width: 1280px;
  padding: 1.5rem 1.5rem 4rem;
}

.werkstatt-more-intro {
  text-align: center;
  max-width: 620px;
  margin: 0 auto 2.5rem;
}

.werkstatt-more-intro h2 {
  margin-bottom: 0.5rem;
  color: #5c1f8f;
}

.werkstatt-more-subtitle {
  font-family: var(--font-body);
  font-size: 1.05rem;
  color: #4a3568;
  margin: 0;
}

/* Freigestellte Sticker-Grafiken statt rechteckiger Kacheln: bewusst
   schmalere, feste Spaltenbreite (statt voller verfuegbarer Breite)
   mit justify-content:center, damit die Illustrationen als Gruppe
   mittig sitzen, spuerbar Luft zum Seitenrand behalten und sich nicht
   beruehren. Jede Grafik behaelt ihr eigenes natuerliches
   Seitenverhaeltnis (kein object-fit, keine erzwungene Einheitsgroesse)
   -- "gleich gross" wird ueber dieselbe maximale Spaltenbreite erreicht,
   nicht ueber Zuschnitt. Nur noch zwei Kacheln (die dritte, "Ein Blick
   auf meinen Schreibtisch", wurde entfernt) -- repeat(2, ...) statt
   repeat(3, ...), sonst wuerde justify-content:center weiterhin eine
   leere dritte Spur mittig freihalten. */
.werkstatt-more-grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 280px));
  justify-content: center;
  gap: 3rem;
  align-items: center;
}

/* Jede Kachel ist ihr eigener anklickbarer Link-/Interaktionsbereich;
   Ziel-URL wird spaeter ergaenzt (Platzhalter-href, ausser Kachel 1).
   Traegt selbst keinerlei Stil -- kein Rahmen, kein Hintergrund, kein
   Schatten, kein border-radius -- die freigestellte Grafik liegt
   direkt auf dem Werkstatt-Hintergrund. */
.werkstatt-more-tile {
  display: block;
}

.werkstatt-more-tile img {
  display: block;
  width: 100%;
  height: auto;
}

@media (max-width: 900px) {
  .werkstatt-more-grid {
    grid-template-columns: repeat(2, minmax(0, 280px));
  }
}

@media (max-width: 700px) {
  .werkstatt-more-grid {
    grid-template-columns: minmax(0, 280px);
  }
}

/* ================================================================ */
/* Unterseite "Von der ersten Idee zum fertigen Bild"                */
/* ================================================================ */

/* Gesamte Seite traegt body.werkstatt-page (siehe body.werkstatt-page
   weiter oben) fuer denselben durchgehenden floralen Hintergrund wie
   die Hauptseite -- kein eigener Seitenhintergrund hier. Alle Sections
   bleiben bewusst ohne eigenen Hintergrund/Rahmen/Schatten (keine
   "harten rechteckigen Flaechen", wie ausdruecklich gewuenscht); die
   Bild-Platzhalter (.werkstatt-idee-media) reservieren nur Platz per
   aspect-ratio, ohne selbst sichtbar zu sein, bis spaeter echte Bilder
   eingesetzt werden. */
.werkstatt-idee-hero,
.werkstatt-idee-example,
.werkstatt-idee-slider-section,
.werkstatt-idee-outro {
  max-width: 900px;
  position: relative;
}

.werkstatt-idee-journey {
  max-width: 1100px;
  position: relative;
}

.werkstatt-idee-back {
  display: inline-block;
  font-size: 0.9rem;
  color: #4a3568;
  text-decoration: none;
  border-bottom: 1px solid rgba(var(--color-gold-rgb), 0.4);
  padding-bottom: 0.1rem;
  margin-bottom: 1.5rem;
  transition: color 0.2s ease, border-color 0.2s ease;
}

.werkstatt-idee-back:hover {
  color: #5c1f8f;
  border-color: rgba(var(--color-gold-rgb), 0.9);
}

.werkstatt-idee-back-bottom {
  margin-top: 2.5rem;
  margin-bottom: 0;
}

.werkstatt-idee-hero h1 {
  color: #5c1f8f;
  font-size: 2.4rem;
  line-height: 1.25;
  margin-bottom: 0.6rem;
}

.werkstatt-idee-feather {
  display: inline-block;
  height: 0.8em;
  width: auto;
  vertical-align: -0.05em;
  margin-left: 0.3rem;
}

.werkstatt-idee-subtitle {
  font-family: var(--font-heading);
  font-style: italic;
  color: #4a3568;
  font-size: 1.15rem;
  margin: 0 0 1.5rem;
}

.werkstatt-idee-intro {
  color: #3f285f;
  font-size: 1.1rem;
  line-height: 1.9;
}

/* Neuer maerchenhafter Einstieg: grafischer Schriftzug (echter
   Alphakanal) ersetzt den bisherigen Text-H1. h1-Selektor-Spezifitaet
   bewusst nachgebildet (.werkstatt-idee-hero h1...), damit die alte
   Regel .werkstatt-idee-hero h1 (Farbe/Groesse/Zeilenabstand fuer
   Text) hier nicht mehr durchschlägt -- nur noch margin/Breite fuer
   das Bild zaehlen. Kompakt und mittig statt bildschirmfuellend. */
.werkstatt-idee-hero h1.werkstatt-idee-storybook-heading {
  display: block;
  color: inherit;
  font-size: inherit;
  line-height: inherit;
  width: min(480px, 55vw);
  max-width: 100%;
  margin: 0 auto 1.8rem;
}

.werkstatt-idee-storybook-heading img {
  display: block;
  width: 100%;
  height: auto;
}

.werkstatt-idee-storybook-intro {
  max-width: 620px;
  margin: 0 auto 5rem;
}

.werkstatt-idee-storybook-intro p {
  color: #3f285f;
  font-size: 1.1rem;
  line-height: 1.9;
  margin: 0 0 1.4rem;
}

.werkstatt-idee-storybook-intro p:last-child {
  margin-bottom: 0;
}

.werkstatt-idee-storybook-intro-highlight {
  font-family: var(--font-heading);
  font-style: italic;
  color: #5c1f8f;
  font-size: 1.2rem;
}

@media (max-width: 700px) {
  .werkstatt-idee-hero h1.werkstatt-idee-storybook-heading {
    width: 78vw;
  }

  .werkstatt-idee-storybook-intro {
    margin-bottom: 3.5rem;
  }
}

/* Schnappschussbuch -- eigenstaendige, vom Zauberpannen-Buch technisch
   unabhaengige zweite Instanz derselben Page-Flip-Technik (eigene
   Klassen/ID/JS-IIFE, eigenes Bild). Seitenbereiche links/rechts per
   Pixel-Scan der Buchgrafik ermittelt (nicht geschaetzt), damit der
   spaetere Inhalt nie den Einband, die Eckbeschlaege oder die
   Lavendel-/Feder-Deko beruehrt. Aktuell nur Platzhalter-Seitenzahlen,
   noch keine Schnappschuss-Inhalte. */
.werkstatt-idee-storybook-book {
  width: min(950px, 82vw);
  max-width: 100%;
  margin: 2.5rem auto 3rem;
}

.werkstatt-idee-storybook-book-stage {
  position: relative;
  width: 100%;
  perspective: 1800px;
}

.werkstatt-idee-storybook-book-bg {
  display: block;
  width: 100%;
  height: auto;
  pointer-events: none;
}

.werkstatt-idee-storybook-book-pages {
  position: absolute;
  inset: 0;
  overflow: hidden;
  transform-style: preserve-3d;
}

.werkstatt-idee-storybook-book-spread,
.werkstatt-idee-storybook-book-spread-flip {
  position: absolute;
  inset: 0;
  backface-visibility: hidden;
}

.werkstatt-idee-storybook-book-page-number {
  position: absolute;
  display: flex;
  align-items: center;
  justify-content: center;
  font-family: var(--font-heading);
  font-style: italic;
  color: rgba(92, 31, 143, 0.32);
  font-size: clamp(1.4rem, 3.5vw, 2rem);
}

.werkstatt-idee-storybook-book-page-number--left {
  left: 21%;
  top: 33.7%;
  width: 25.5%;
  height: 34.2%;
}

.werkstatt-idee-storybook-book-page-number--right {
  left: 55.8%;
  top: 33.7%;
  width: 25.8%;
  height: 34.2%;
}

/* Eingeklebte Schnappschuesse: max-width/height + object-fit:contain
   haelt jedes Foto vollstaendig innerhalb seines sicheren Seiten-
   bereichs (Buchfalz/Rand werden dadurch nie beruehrt), unabhaengig
   von Quadrat-, Hoch- oder Querformat -- kein Zuschneiden, keine
   Verzerrung. Leichte Rotation je Foto simuliert altes Einkleben von
   Hand statt eines cleanen Rasters; dezenter warmer Schatten statt
   eines modernen Rahmens. */
.werkstatt-idee-storybook-book-photo {
  display: block;
  max-width: 92%;
  max-height: 92%;
  width: auto;
  height: auto;
  box-shadow: 0 4px 10px rgba(70, 45, 20, 0.2);
}

.werkstatt-idee-storybook-book-photo-rot-a { transform: rotate(-2deg); }
.werkstatt-idee-storybook-book-photo-rot-b { transform: rotate(1.5deg); }
.werkstatt-idee-storybook-book-photo-rot-c { transform: rotate(-1deg); }
.werkstatt-idee-storybook-book-photo-rot-d { transform: rotate(2deg); }
.werkstatt-idee-storybook-book-photo-rot-e { transform: rotate(-2.5deg); }

.werkstatt-idee-storybook-book-arrow {
  position: absolute;
  top: 54%;
  transform: translateY(-50%);
  width: 40px;
  height: 40px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  border: 1.5px solid rgba(var(--color-gold-rgb), 0.55);
  background: rgba(253, 246, 232, 0.55);
  color: #5c1f8f;
  cursor: pointer;
  padding: 0;
  transition: transform 0.2s ease, background 0.2s ease, opacity 0.2s ease;
}

.werkstatt-idee-storybook-book-arrow svg {
  width: 18px;
  height: 18px;
}

.werkstatt-idee-storybook-book-arrow--prev {
  left: 2%;
}

.werkstatt-idee-storybook-book-arrow--next {
  right: 2%;
}

.werkstatt-idee-storybook-book-arrow:not(:disabled):hover {
  background: rgba(253, 246, 232, 0.85);
  transform: translateY(-50%) translateY(-2px);
}

.werkstatt-idee-storybook-book-arrow:disabled {
  opacity: 0.3;
  cursor: default;
}

.werkstatt-idee-storybook-book-counter {
  text-align: center;
  margin-top: 0.8rem;
  font-family: var(--font-heading);
  font-style: italic;
  color: #4a3568;
  font-size: 0.95rem;
}

@media (prefers-reduced-motion: reduce) {
  .werkstatt-idee-storybook-book-spread-flip {
    display: none;
  }
}

/* Deko-Sticker auf "Von der ersten Idee zum fertigen Bild" -- rein
   dekorativ, NIE im Buch selbst. Technik/Muster 1:1 von den
   Zauberpannen-Stickern uebernommen (eigener Wrapper pro Sticker,
   nur das img wird animiert, left/right: calc(100% + Xpx) haelt den
   Abstand zum Anker unabhaengig von Zeilenumbruch exakt gleich),
   aber ausschliesslich mit hier neuen Klassennamen/Ankern (H1,
   Intro-Absaetze, Buch-AUSSEN-Wrapper) -- betrifft dadurch technisch
   keine andere Seite, auch wenn die Regeln in derselben Datei stehen.
   Die drei buchnahen Sticker sitzen als Geschwister von .book-stage,
   also ausserhalb von Buchbild/Seiten/Pfeilen. */
.werkstatt-idee-hero h1.werkstatt-idee-storybook-heading,
.werkstatt-idee-storybook-intro-p1,
.werkstatt-idee-storybook-intro-p2,
.werkstatt-idee-storybook-intro-p3,
.werkstatt-idee-storybook-intro-highlight,
.werkstatt-idee-storybook-book {
  position: relative;
}

.werkstatt-idee-sticker {
  position: absolute;
  display: block;
  z-index: 1;
  pointer-events: none;
}

.werkstatt-idee-sticker img {
  display: block;
  width: 100%;
  height: auto;
}

/* Lockere, unregelmaessige Streuung statt zweier ordentlicher Spalten
   (siehe Kommentar oben zur Technik): jeder Sticker haengt weiterhin
   an genau einem Textanker (H1/p1/p2/p3/highlight) und bleibt dadurch
   automatisch horizontal komplett ausserhalb der 620px-Textspalte --
   das macht den TOP-Wert kollisionssicher, auch wenn er bewusst weit
   ueber die eigentliche Hoehe des Ankerabsatzes hinausreicht (der
   Sticker landet dann einfach in der Luecke zum naechsten Absatz,
   niemals ueber dem Text selbst, da Text nur INNERHALB der Spalte
   existiert). Genutzt fuer bewusst unterschiedliche Hoehen, Seiten,
   Abstaende zur Spalte (14-52px) und Groessen (62-94px, vorher
   durchgehend 68-92px). chest+book haengen beide an .highlight mit
   grossem top-Wert und landen dadurch im bisher leeren Bereich
   UNTER dem letzten Textabsatz, noch vor dem Erinnerungsbuch. Ein
   dezenter statischer transform:rotate() (-3 bis 4deg) auf dem
   AEUSSEREN Wrapper (nicht dem animierten <img>) ergaenzt den
   vorhandenen Idle-Float um eine leichte Grundschraeglage je
   Sticker, ohne mit dessen eigener Animation zu kollidieren. */
.werkstatt-idee-sticker-bulb {
  right: calc(100% + 26px);
  top: -28px;
  width: 62px;
  transform: rotate(-3deg);
}
.werkstatt-idee-sticker-bulb img {
  animation: werkstatt-idee-sticker-float-a 6.5s ease-in-out infinite alternate;
}

.werkstatt-idee-sticker-sketch {
  left: calc(100% + 52px);
  top: 80px;
  width: 94px;
  transform: rotate(2deg);
}
.werkstatt-idee-sticker-sketch img {
  animation: werkstatt-idee-sticker-float-b 8s ease-in-out infinite alternate;
  animation-delay: -2s;
}

.werkstatt-idee-sticker-pencil {
  left: calc(100% + 34px);
  top: -20px;
  width: 74px;
}
.werkstatt-idee-sticker-pencil img {
  animation: werkstatt-idee-sticker-float-c 7s ease-in-out infinite alternate;
  animation-delay: -3.5s;
}

.werkstatt-idee-sticker-palette {
  left: calc(100% + 44px);
  top: 20px;
  width: 80px;
  transform: rotate(3deg);
}
.werkstatt-idee-sticker-palette img {
  animation: werkstatt-idee-sticker-float-d 7.5s ease-in-out infinite alternate;
  animation-delay: -1s;
}

.werkstatt-idee-sticker-photos {
  right: calc(100% + 22px);
  top: -10px;
  width: 72px;
}
.werkstatt-idee-sticker-photos img {
  animation: werkstatt-idee-sticker-float-e 8.5s ease-in-out infinite alternate;
  animation-delay: -4s;
}

.werkstatt-idee-sticker-camera {
  right: calc(100% + 38px);
  top: -25px;
  width: 74px;
  transform: rotate(4deg);
}
.werkstatt-idee-sticker-camera img {
  animation: werkstatt-idee-sticker-float-f 7s ease-in-out infinite alternate;
  animation-delay: -5s;
}

.werkstatt-idee-sticker-diary {
  right: calc(100% + 14px);
  top: 95px;
  width: 88px;
  transform: rotate(-3deg);
}
.werkstatt-idee-sticker-diary img {
  animation: werkstatt-idee-sticker-float-g 9s ease-in-out infinite alternate;
  animation-delay: -1.5s;
}

.werkstatt-idee-sticker-chest {
  right: calc(100% + 30px);
  top: 140px;
  width: 90px;
  transform: rotate(-1deg);
}
.werkstatt-idee-sticker-chest img {
  animation: werkstatt-idee-sticker-float-h 8s ease-in-out infinite alternate;
  animation-delay: -3s;
}

.werkstatt-idee-sticker-book {
  left: calc(100% + 18px);
  top: 120px;
  width: 78px;
  transform: rotate(-2deg);
}
.werkstatt-idee-sticker-book img {
  animation: werkstatt-idee-sticker-float-i 7.5s ease-in-out infinite alternate;
  animation-delay: -4.5s;
}

@keyframes werkstatt-idee-sticker-float-a {
  0% { transform: translate(0, 0) rotate(0deg); }
  100% { transform: translate(0, -5px) rotate(1.5deg); }
}
@keyframes werkstatt-idee-sticker-float-b {
  0% { transform: translate(0, 0) rotate(-1deg); }
  100% { transform: translate(4px, 3px) rotate(1deg); }
}
@keyframes werkstatt-idee-sticker-float-c {
  0% { transform: translate(0, 0) rotate(0deg); }
  100% { transform: translate(3px, -4px) rotate(-1.5deg); }
}
@keyframes werkstatt-idee-sticker-float-d {
  0% { transform: translate(0, 0) rotate(1deg); }
  100% { transform: translate(-4px, 3px) rotate(-1deg); }
}
@keyframes werkstatt-idee-sticker-float-e {
  0% { transform: translate(0, 0) rotate(-0.5deg); }
  100% { transform: translate(0, 5px) rotate(1.5deg); }
}
@keyframes werkstatt-idee-sticker-float-f {
  0% { transform: translate(0, 0) rotate(0deg); }
  100% { transform: translate(-3px, -3px) rotate(1deg); }
}
@keyframes werkstatt-idee-sticker-float-g {
  0% { transform: translate(0, 0) rotate(-1deg); }
  100% { transform: translate(3px, 4px) rotate(1deg); }
}
@keyframes werkstatt-idee-sticker-float-h {
  0% { transform: translate(0, 0) rotate(1deg); }
  100% { transform: translate(-3px, -4px) rotate(-1deg); }
}
@keyframes werkstatt-idee-sticker-float-i {
  0% { transform: translate(0, 0) rotate(0deg); }
  100% { transform: translate(3px, -3px) rotate(-1.5deg); }
}

@media (max-width: 900px) {
  .werkstatt-idee-sticker {
    display: none;
  }
}

@media (prefers-reduced-motion: reduce) {
  .werkstatt-idee-sticker img {
    animation: none;
  }
}

/* "Ein Beispiel aus Lumaria" */
.werkstatt-idee-example h2 {
  color: #5c1f8f;
  margin-bottom: 0.3rem;
}

.werkstatt-idee-example-subtitle {
  font-family: var(--font-heading);
  font-style: italic;
  color: #4a3568;
  margin: 0 0 1.5rem;
}

/* Basis fuer alle kuenftigen Bild-Platzhaelter: reserviert nur Raum,
   traegt keinerlei sichtbaren Stil (kein Rahmen/Hintergrund), bis ein
   echtes <img> eingesetzt wird. */
.werkstatt-idee-media {
  width: 100%;
}

.werkstatt-idee-media img {
  display: block;
  width: 100%;
  height: auto;
}

.werkstatt-idee-example-media {
  aspect-ratio: 16 / 9;
}

/* Entstehungsreise: 4 Stationen in einer Reihe, verbunden durch eine
   duenne geschwungene Goldlinie mit Lichtpunkten (SVG, absolut hinter
   den Stationen positioniert) -- bewusst KEINE technische
   Business-Timeline (keine Balken/Kaesten/harten Linien), stattdessen
   eine handgezeichnet wirkende Kurve. Station 5 liegt als eigener,
   groesserer Block AUSSERHALB dieses Grids. */
.werkstatt-idee-journey-heading {
  text-align: center;
  color: #5c1f8f;
  margin-bottom: 2.5rem;
}

.werkstatt-idee-journey-stations {
  position: relative;
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 2.5rem;
  margin-bottom: 3rem;
}

.werkstatt-idee-journey-line {
  display: block;
  position: absolute;
  top: 44px;
  left: 0;
  width: 100%;
  height: 60px;
  z-index: 0;
  pointer-events: none;
}

.werkstatt-idee-station {
  position: relative;
  z-index: 1;
  text-align: center;
}

.werkstatt-idee-station-number {
  display: inline-block;
  font-family: var(--font-heading);
  font-weight: 700;
  font-size: 1.3rem;
  color: var(--color-gold);
  margin-bottom: 0.4rem;
}

.werkstatt-idee-station h3 {
  color: #5c1f8f;
  font-size: 1.15rem;
  margin: 0 0 0.8rem;
}

.werkstatt-idee-station .werkstatt-idee-media {
  aspect-ratio: 4 / 3;
  margin-bottom: 0.8rem;
}

.werkstatt-idee-station p {
  color: #3f285f;
  font-size: 0.95rem;
  line-height: 1.7;
  margin: 0;
}

/* Kleine handschriftlich wirkende Randnotizen bei Station 4 --
   Script-Schrift (Alex Brush, bereits fuer die Signatur geladen),
   leicht gedreht, ohne Kasten-Optik. */
.werkstatt-idee-sticky-notes {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 0.6rem 1rem;
  margin-top: 1.2rem;
}

.werkstatt-idee-sticky-note {
  font-family: "Alex Brush", cursive;
  font-size: 1.3rem;
  color: #5c1f8f;
  transform: rotate(var(--rot, 0deg));
  opacity: 0.85;
}

/* Station 5: bewusst groesser/besonderer als die vier vorherigen. */
.werkstatt-idee-station-final {
  position: relative;
  z-index: 1;
  text-align: center;
  max-width: 700px;
  margin: 0 auto;
}

.werkstatt-idee-station-final h3 {
  color: #5c1f8f;
  font-size: 1.6rem;
  margin: 0 0 1.2rem;
}

.werkstatt-idee-station-media-final {
  aspect-ratio: 16 / 10;
  margin-bottom: 1.5rem;
}

.werkstatt-idee-final-text {
  font-family: var(--font-heading);
  font-style: italic;
  color: #4a3568;
  font-size: 1.15rem;
  line-height: 1.9;
}

/* Vorher-/Nachher-Schieber: zwei vollflaechige, uebereinanderliegende
   Ebenen, die "Nachher"-Ebene per clip-path von links freigegeben --
   robust, verzerrt keine Bilder, funktioniert unabhaengig von der
   tatsaechlichen spaeteren Bildgroesse. Das eigentliche <input
   type="range"> bleibt voll funktional, aber visuell unsichtbar; der
   dekorative Griff (.werkstatt-idee-slider-handle) folgt per JS. */
.werkstatt-idee-slider-section h2 {
  color: #5c1f8f;
  text-align: center;
  margin-bottom: 1.5rem;
}

.werkstatt-idee-slider {
  position: relative;
  width: 100%;
  aspect-ratio: 16 / 9;
  overflow: hidden;
}

.werkstatt-idee-slider-media {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
}

.werkstatt-idee-slider-after {
  clip-path: inset(0 0 0 50%);
  -webkit-clip-path: inset(0 0 0 50%);
}

.werkstatt-idee-slider-label {
  position: absolute;
  top: 0.8rem;
  z-index: 2;
  font-family: var(--font-heading);
  font-size: 0.85rem;
  letter-spacing: 0.04em;
  color: #4a3568;
  pointer-events: none;
}

.werkstatt-idee-slider-label-left {
  left: 0.8rem;
}

.werkstatt-idee-slider-label-right {
  right: 0.8rem;
}

.werkstatt-idee-slider-handle {
  position: absolute;
  top: 0;
  left: 50%;
  width: 2px;
  height: 100%;
  background: rgba(var(--color-gold-rgb), 0.85);
  transform: translateX(-50%);
  z-index: 2;
  pointer-events: none;
}

.werkstatt-idee-slider-handle-grip {
  position: absolute;
  top: 50%;
  left: 50%;
  width: 34px;
  height: 34px;
  border-radius: 50%;
  background: #f8f4fb;
  border: 1.5px solid rgba(var(--color-gold-rgb), 0.9);
  transform: translate(-50%, -50%);
}

.werkstatt-idee-slider-handle-grip::before,
.werkstatt-idee-slider-handle-grip::after {
  content: "";
  position: absolute;
  top: 50%;
  width: 0;
  height: 0;
  border-top: 5px solid transparent;
  border-bottom: 5px solid transparent;
  transform: translateY(-50%);
}

.werkstatt-idee-slider-handle-grip::before {
  left: 7px;
  border-right: 6px solid #5c1f8f;
}

.werkstatt-idee-slider-handle-grip::after {
  right: 7px;
  border-left: 6px solid #5c1f8f;
}

.werkstatt-idee-slider-input {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  margin: 0;
  opacity: 0;
  cursor: ew-resize;
  z-index: 3;
  -webkit-appearance: none;
  appearance: none;
}

/* Abschluss "Was dabei von mir kommt" */
.werkstatt-idee-outro h2 {
  color: #5c1f8f;
  margin-bottom: 1rem;
}

.werkstatt-idee-outro p {
  color: #3f285f;
  font-size: 1.05rem;
  line-height: 1.8;
}

@media (max-width: 900px) {
  .werkstatt-idee-journey-line {
    display: none;
  }

  .werkstatt-idee-journey-stations {
    grid-template-columns: repeat(2, 1fr);
    gap: 2rem 1.5rem;
  }
}

@media (max-width: 700px) {
  .werkstatt-idee-hero h1 {
    font-size: 1.9rem;
  }

  .werkstatt-idee-journey-stations {
    grid-template-columns: 1fr;
    max-width: 380px;
    margin-left: auto;
    margin-right: auto;
  }
}

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

/* ================================================================ */
/* Unterseite "Wenn Magie mehrere Anlaeufe braucht ..." (Kopfbereich) */
/* ================================================================ */

/* Bewusst dieselbe Technik wie .werkstatt-signature ("Deine Martina"):
   Script-Schrift (Alex Brush, bereits geladen) mit einem schmalen
   goldenen Glanzstreifen quer durchs Wort via background-clip:text --
   das ist exakt die "Handschrift" der Seite, an der sich diese neue
   Ueberschrift laut Vorgabe orientieren soll. Position:relative traegt
   die absolut positionierten Lichtpunkte/Funkenspuren; alles davon
   sitzt an den AEUSSEREN Ecken des gesamten Ueberschriften-Blocks
   (nicht an einzelnen Buchstaben), damit es bei jedem Zeilenumbruch
   zuverlaessig funktioniert. */
.werkstatt-anlaeufe-hero,
.werkstatt-anlaeufe-content {
  max-width: 780px;
  position: relative;
}

/* Kleine Deko-Sticker im oberen Erzaehl-/Textbereich -- rein
   dekorativ, NICHT im Buch-Bereich. Drei sitzen als Kinder direkt in
   der zweiten (grafischen) Ueberschrift .werkstatt-anlaeufe-content-
   heading -- die ist nur 370px breit und zentriert, dadurch bleibt
   reichlich Platz links/rechts INNERHALB der 780px-Section, genau
   die bereits vorhandene freie Flaeche um die Ueberschrift, die
   sonst leer blieb. Die uebrigen drei sitzen weiterhin direkt im
   jeweiligen Textabsatz weiter unten (dafuer position:relative).
   Alle per left/right: calc(100% + Xpx) im Rand NEBEN ihrem Anker
   verankert -- Abstand bleibt unabhaengig von Hoehe/Zeilenumbruch
   exakt gleich. position:absolute nimmt jeden Sticker aus dem
   Textfluss, Ueberschrift/Absatz-Text werden nicht schmaler/
   verschoben. */
.werkstatt-anlaeufe-heading,
.werkstatt-anlaeufe-content-heading,
.werkstatt-anlaeufe-subtitle,
.werkstatt-anlaeufe-content-p1,
.werkstatt-anlaeufe-content-p2,
.werkstatt-anlaeufe-content-p3 {
  position: relative;
}

.werkstatt-anlaeufe-sticker {
  position: absolute;
  display: block;
  z-index: 1;
  pointer-events: none;
}

.werkstatt-anlaeufe-sticker img {
  display: block;
  width: 100%;
  height: auto;
}

.werkstatt-anlaeufe-sticker-inkpot {
  right: calc(100% + 32px);
  top: -6px;
  width: 70px;
}
.werkstatt-anlaeufe-sticker-inkpot img {
  animation: werkstatt-anlaeufe-sticker-float-a 6s ease-in-out infinite alternate;
}

.werkstatt-anlaeufe-sticker-huch {
  left: calc(100% + 30px);
  top: 6px;
  width: 55px;
}
.werkstatt-anlaeufe-sticker-huch img {
  animation: werkstatt-anlaeufe-sticker-float-b 7s ease-in-out infinite alternate;
  animation-delay: -2s;
}

.werkstatt-anlaeufe-sticker-dragon {
  right: calc(100% + 40px);
  top: 15px;
  width: 58px;
}
.werkstatt-anlaeufe-sticker-dragon img {
  animation: werkstatt-anlaeufe-sticker-float-c 8s ease-in-out infinite alternate;
  animation-delay: -1s;
}

.werkstatt-anlaeufe-sticker-quill {
  left: calc(100% + 40px);
  top: -18px;
  width: 74px;
}
.werkstatt-anlaeufe-sticker-quill img {
  animation: werkstatt-anlaeufe-sticker-float-d 7.5s ease-in-out infinite alternate;
  animation-delay: -3s;
}

.werkstatt-anlaeufe-sticker-pawtrail {
  right: calc(100% + 40px);
  top: 88px;
  width: 68px;
}
.werkstatt-anlaeufe-sticker-pawtrail img {
  animation: werkstatt-anlaeufe-sticker-float-e 9s ease-in-out infinite alternate;
  animation-delay: -1.5s;
}

.werkstatt-anlaeufe-sticker-note {
  left: calc(100% + 28px);
  top: -6px;
  width: 108px;
}
.werkstatt-anlaeufe-sticker-note img {
  animation: werkstatt-anlaeufe-sticker-float-f 6.5s ease-in-out infinite alternate;
  animation-delay: -4s;
}

/* Drei weitere Fundstuecke in den bislang noch leeren Pergament-
   flaechen: Schmetterling + Fläschchen rahmen die Hauptueberschrift
   .werkstatt-anlaeufe-heading (max-width:520px, zentriert -- auch
   hier reichlich Rand innerhalb der 780px-Section), die Laterne
   sitzt im bisher komplett stickerfreien zweiten Absatz. */
.werkstatt-anlaeufe-sticker-butterfly {
  left: calc(100% + 26px);
  top: -10px;
  width: 52px;
}
.werkstatt-anlaeufe-sticker-butterfly img {
  animation: werkstatt-anlaeufe-sticker-float-g 5s ease-in-out infinite alternate;
}

.werkstatt-anlaeufe-sticker-bottle {
  right: calc(100% + 26px);
  top: 25px;
  width: 66px;
}
.werkstatt-anlaeufe-sticker-bottle img {
  animation: werkstatt-anlaeufe-sticker-float-h 8.5s ease-in-out infinite alternate;
  animation-delay: -3.5s;
}

.werkstatt-anlaeufe-sticker-lantern {
  right: calc(100% + 38px);
  top: 10px;
  width: 74px;
}
.werkstatt-anlaeufe-sticker-lantern img {
  animation: werkstatt-anlaeufe-sticker-float-i 9.5s ease-in-out infinite alternate;
  animation-delay: -5s;
}

/* Fina-Doodle: sitzt bewusst deutlich TIEFER als der Kaefer (nicht
   mehr auf gleicher "mittlerer" Ebene) -- ungefaehr auf halber
   Strecke zwischen Kaefer (top:145px) und der Feder auf der zweiten
   Ueberschrift weiter unten, damit zwischen Fina und Kaefer sichtbar
   freie Pergamentflaeche bleibt statt einer Gruppe. */
.werkstatt-anlaeufe-sticker-fina-doodle {
  left: calc(100% + 55px);
  top: 320px;
  width: 62px;
}
.werkstatt-anlaeufe-sticker-fina-doodle img {
  animation: werkstatt-anlaeufe-sticker-float-k 8s ease-in-out infinite alternate;
  animation-delay: -4.5s;
}

/* Glitzerkaefer (2. Version): filter:drop-shadow (nicht blur/box-
   shadow) folgt der Alpha-Form des Kaefers statt eines Rechtecks und
   pulsiert zusammen mit einem sehr leichten Helligkeits-Anstieg fuers
   Funkeln; Bildfarben/-kontrast selbst bleiben unangetastet. */
.werkstatt-anlaeufe-sticker-beetle {
  left: calc(100% + 78px);
  top: 145px;
  width: 72px;
}
.werkstatt-anlaeufe-sticker-beetle img {
  animation: werkstatt-anlaeufe-sticker-beetle-glow 6.5s ease-in-out infinite;
}

@keyframes werkstatt-anlaeufe-sticker-float-a {
  0% { transform: translate(0, 0) rotate(0deg); }
  100% { transform: translate(0, -4px) rotate(1deg); }
}
@keyframes werkstatt-anlaeufe-sticker-float-b {
  0% { transform: translate(0, 0) rotate(0deg); }
  100% { transform: translate(3px, 0) rotate(-1.5deg); }
}
@keyframes werkstatt-anlaeufe-sticker-float-c {
  0% { transform: translate(0, 0) rotate(-1deg); }
  100% { transform: translate(0, 0) rotate(1deg); }
}
@keyframes werkstatt-anlaeufe-sticker-float-d {
  0% { transform: translate(0, 0) rotate(0deg); }
  100% { transform: translate(-3px, -3px) rotate(-1deg); }
}
@keyframes werkstatt-anlaeufe-sticker-float-e {
  0% { transform: translate(0, 0) rotate(0.5deg); }
  100% { transform: translate(2px, 3px) rotate(-1deg); }
}
@keyframes werkstatt-anlaeufe-sticker-float-f {
  0% { transform: translate(0, 0) rotate(0deg); }
  100% { transform: translate(0, 4px) rotate(1deg); }
}
@keyframes werkstatt-anlaeufe-sticker-float-g {
  0% { transform: translate(0, 0) rotate(-1deg); }
  100% { transform: translate(4px, -5px) rotate(2deg); }
}
@keyframes werkstatt-anlaeufe-sticker-float-h {
  0% { transform: translate(0, 0) rotate(0deg); }
  100% { transform: translate(0, -4px) rotate(1deg); }
}
@keyframes werkstatt-anlaeufe-sticker-float-i {
  0% { transform: translate(0, 0) rotate(1deg); }
  100% { transform: translate(-4px, 3px) rotate(-1.5deg); }
}
@keyframes werkstatt-anlaeufe-sticker-float-j {
  0% { transform: translate(0, 0) rotate(0deg); }
  100% { transform: translate(3px, -3px) rotate(1.5deg); }
}
@keyframes werkstatt-anlaeufe-sticker-float-k {
  0% { transform: translate(0, 0) rotate(-0.5deg); }
  100% { transform: translate(-3px, 4px) rotate(1deg); }
}
@keyframes werkstatt-anlaeufe-sticker-beetle-glow {
  0% {
    transform: translate(0, 0) rotate(0deg);
    filter: drop-shadow(0 0 4px rgba(233, 200, 120, 0.25)) brightness(1);
  }
  50% {
    transform: translate(3px, -4px) rotate(1.5deg);
    filter: drop-shadow(0 0 9px rgba(233, 200, 120, 0.5)) brightness(1.06);
  }
  100% {
    transform: translate(0, 0) rotate(0deg);
    filter: drop-shadow(0 0 4px rgba(233, 200, 120, 0.25)) brightness(1);
  }
}

@media (max-width: 1100px) {
  .werkstatt-anlaeufe-sticker-huch,
  .werkstatt-anlaeufe-sticker-inkpot,
  .werkstatt-anlaeufe-sticker-note,
  .werkstatt-anlaeufe-sticker-lantern {
    display: none;
  }
}

@media (max-width: 900px) {
  .werkstatt-anlaeufe-sticker {
    display: none;
  }
}

@media (prefers-reduced-motion: reduce) {
  .werkstatt-anlaeufe-sticker img {
    animation: none;
  }
}

/* Erster Inhaltsabschnitt unterhalb der Einleitung -- bewusst OHNE
   Card/Kasten/Rahmen/Schatten, der Text steht direkt und frei auf
   dem Pergamenthintergrund. */
/* Zwischenueberschrift als fertige Pergament-Rollen-Grafik (echter
   Alphakanal) statt HTML-Text -- deutlich schmaler als die grosse
   Bild-Hauptueberschrift, damit die Hierarchie erhalten bleibt.
   Wirkt bewusst wie eine charmante Zwischenueberschrift statt einer
   zweiten Hauptueberschrift, deshalb klein gehalten. Ganz sanftes
   Hin-und-Her-Gleiten mit mehreren Zwischenpunkten (statt einer
   starren Zwei-Punkt-Wippe) fuer eine natuerlichere, magische
   Bewegung; transform beeinflusst den Textfluss der Geschwister
   nicht. */
.werkstatt-anlaeufe-content-heading {
  display: block;
  width: min(370px, 36vw);
  max-width: 370px;
  margin: 0 auto 1.4rem;
  animation: werkstatt-anlaeufe-content-heading-drift 7s ease-in-out infinite;
}

.werkstatt-anlaeufe-content-heading img {
  display: block;
  width: 100%;
  height: auto;
}

@keyframes werkstatt-anlaeufe-content-heading-drift {
  0%, 100% {
    transform: translateX(0) rotate(0deg);
  }
  25% {
    transform: translateX(-7px) rotate(-1deg);
  }
  50% {
    transform: translateX(0) rotate(0deg);
  }
  75% {
    transform: translateX(7px) rotate(1deg);
  }
}

@media (max-width: 900px) {
  .werkstatt-anlaeufe-content-heading {
    max-width: 320px;
  }
}

@media (max-width: 700px) {
  .werkstatt-anlaeufe-content-heading {
    width: 70vw;
    max-width: 280px;
    animation-name: werkstatt-anlaeufe-content-heading-drift-small;
  }

  @keyframes werkstatt-anlaeufe-content-heading-drift-small {
    0%, 100% {
      transform: translateX(0) rotate(0deg);
    }
    25% {
      transform: translateX(-3px) rotate(-0.4deg);
    }
    50% {
      transform: translateX(0) rotate(0deg);
    }
    75% {
      transform: translateX(3px) rotate(0.4deg);
    }
  }
}

@media (prefers-reduced-motion: reduce) {
  .werkstatt-anlaeufe-content-heading {
    animation: none;
  }
}

.werkstatt-anlaeufe-content p {
  color: #3f285f;
  font-size: 1.1rem;
  line-height: 1.9;
  margin: 0 0 1.1rem;
}

.werkstatt-anlaeufe-content p:last-child {
  margin-bottom: 0;
}

.werkstatt-anlaeufe-content-emphasis {
  font-style: italic;
}

/* Lachender Loomus-Kopf direkt neben "Und die KI offenbar eine ganz
   andere." -- ersetzt das fruehere Emoji. inline-block innerhalb des
   Fliesstexts (kein Flex-Container noetig), damit er auf Desktop in
   derselben lockeren Zeile sitzt und auf schmalen Breiten wie
   normaler Inline-Inhalt in die naechste Zeile umbricht. Leicht nach
   oben versetzt und gedreht fuer den gewuenschten frechen,
   "kaputtlachenden" Sitz, ohne den Text zu dominieren. */
.werkstatt-anlaeufe-loomus {
  display: inline-block;
  width: 78px;
  height: auto;
  margin-left: 0.5rem;
  vertical-align: middle;
  transform: translateY(-6px) rotate(-8deg);
}

@media (max-width: 900px) {
  .werkstatt-anlaeufe-loomus {
    width: 60px;
  }
}

@media (max-width: 600px) {
  .werkstatt-anlaeufe-loomus {
    width: 52px;
    transform: translateY(-2px) rotate(-6deg);
  }
}

.werkstatt-anlaeufe-back {
  display: inline-block;
  font-size: 0.9rem;
  color: #4a3568;
  text-decoration: none;
  border-bottom: 1px solid rgba(var(--color-gold-rgb), 0.4);
  padding-bottom: 0.1rem;
  margin-bottom: 2rem;
  transition: color 0.2s ease, border-color 0.2s ease;
}

.werkstatt-anlaeufe-back:hover {
  color: #5c1f8f;
  border-color: rgba(var(--color-gold-rgb), 0.9);
}

/* Ueberschrift als freigestellte Bildgrafik (echter Alphakanal) --
   Container reserviert nur Platz/max-width und zentriert, das Bild
   traegt Schrift und Dekoration vollstaendig selbst. */
.werkstatt-anlaeufe-heading {
  display: block;
  max-width: 520px;
  margin: 0 auto 1rem;
}

.werkstatt-anlaeufe-heading-img {
  display: block;
  width: 100%;
  height: auto;
}

.werkstatt-anlaeufe-subtitle {
  font-family: var(--font-heading);
  font-style: italic;
  color: #4a3568;
  font-size: 1.1rem;
  line-height: 1.7;
  margin: 0;
}

/* ================================================================ */
/* Interaktives Zauberpannen-Buch                                    */
/* ================================================================ */

/* Feste Buchgrafik (echter Alphakanal) als visuelle Basis -- Emma,
   Loomus, Fina, Schild und Buchrahmen bleiben beim Blaettern immer
   unveraendert stehen. Nur der Inhalt in .werkstatt-anlaeufe-book-
   pages wechselt. max-width deutlich grosszuegiger als die alte
   Panne, da die seitlichen Randdekorationen entfernt wurden. */
.werkstatt-anlaeufe-book {
  width: min(950px, 82vw);
  max-width: 100%;
  margin: 2.5rem auto 3rem;
}

.werkstatt-anlaeufe-book-stage {
  position: relative;
  width: 100%;
  perspective: 1800px;
}

.werkstatt-anlaeufe-book-bg {
  display: block;
  width: 100%;
  height: auto;
  pointer-events: none;
}

/* Anzeigebereich = die beiden freien Pergamentseiten im Buchbild,
   als Prozentwerte der Buchgrafik ermittelt (per Pixel-Scan der
   Datei, nicht geschaetzt) und mit kleiner Sicherheitsmarge nach
   innen versehen, damit der Bildinhalt niemals Emma/Loomus/Fina,
   das Schild oder den Buchrahmen beruehrt. overflow:hidden faengt
   jede Restunschaerfe zusaetzlich ab. Die Bildmitte (Buchfalz) darf
   bewusst mitten durchs Panne-Bild laufen. */
.werkstatt-anlaeufe-book-pages {
  position: absolute;
  left: 17.5%;
  top: 37.5%;
  width: 69.5%;
  height: 32.5%;
  overflow: hidden;
  transform-style: preserve-3d;
}

/* Jede Zauberpanne = zwei einzelne Polaroid-Fotos (links/rechts), die
   wie aufgeklebt auf den beiden Buchseiten liegen -- keine gemeinsame
   Bilddatei mehr. .werkstatt-anlaeufe-book-spread traegt beide Fotos
   als eine Einheit und ist das Element, das beim Blaettern gedreht
   wird (Klon bekommt zusaetzlich die -flip-Klasse). */
.werkstatt-anlaeufe-book-spread,
.werkstatt-anlaeufe-book-spread-flip {
  position: absolute;
  inset: 0;
  backface-visibility: hidden;
}

.werkstatt-anlaeufe-book-polaroid-slot {
  position: absolute;
  top: 0;
  height: 100%;
  width: 46%;
  display: flex;
  align-items: center;
}

.werkstatt-anlaeufe-book-polaroid-slot--left {
  left: 0;
  justify-content: flex-end;
  padding-right: 3%;
}

.werkstatt-anlaeufe-book-polaroid-slot--right {
  right: 0;
  justify-content: flex-start;
  padding-left: 3%;
}

.werkstatt-anlaeufe-book-polaroid {
  display: block;
  width: 68%;
  max-width: 100%;
  height: auto;
  box-shadow: 0 4px 10px rgba(70, 45, 20, 0.16);
}

.werkstatt-anlaeufe-book-polaroid-slot--left .werkstatt-anlaeufe-book-polaroid {
  transform: rotate(-2deg);
}

.werkstatt-anlaeufe-book-polaroid-slot--right .werkstatt-anlaeufe-book-polaroid {
  transform: rotate(2deg);
}

/* Dezente gold-lila Pfeile statt rechteckiger Buttons, direkt am
   Buch verankert -- "gehoeren" zum Zauberbuch statt wie UI-Chrome zu
   wirken. [disabled] (nur 1 Panne bisher vorhanden) haelt sie sehr
   blass und nicht klickbar, ohne sie ganz zu verstecken -- signalisiert
   "hier kommen spaeter weitere Pannen". */
.werkstatt-anlaeufe-book-arrow {
  position: absolute;
  top: 54%;
  transform: translateY(-50%);
  width: 40px;
  height: 40px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  border: 1.5px solid rgba(var(--color-gold-rgb), 0.55);
  background: rgba(253, 246, 232, 0.55);
  color: #5c1f8f;
  cursor: pointer;
  padding: 0;
  transition: transform 0.2s ease, background 0.2s ease, opacity 0.2s ease;
}

.werkstatt-anlaeufe-book-arrow svg {
  width: 18px;
  height: 18px;
}

.werkstatt-anlaeufe-book-arrow--prev {
  left: 2%;
}

.werkstatt-anlaeufe-book-arrow--next {
  right: 2%;
}

.werkstatt-anlaeufe-book-arrow:not(:disabled):hover {
  background: rgba(253, 246, 232, 0.85);
  transform: translateY(-50%) translateY(-2px);
}

.werkstatt-anlaeufe-book-arrow:disabled {
  opacity: 0.3;
  cursor: default;
  pointer-events: none;
}

.werkstatt-anlaeufe-book-counter {
  text-align: center;
  margin: 0.8rem 0 0;
  font-family: var(--font-heading);
  font-style: italic;
  font-size: 0.85rem;
  color: #6b5a8a;
}

@media (max-width: 700px) {
  .werkstatt-anlaeufe-book-arrow {
    width: 32px;
    height: 32px;
  }

  .werkstatt-anlaeufe-book-arrow svg {
    width: 14px;
    height: 14px;
  }
}

/* Fussspuren-Lauf eines unsichtbaren kleinen Drachen -- an den
   VIEWPORT gekoppelt (position:fixed, inset:0) statt an die
   Dokumenthoehe, damit der Lauf im gerade sichtbaren Bildschirm
   stattfindet, egal wo auf der langen Seite gerade gescrollt wurde.
   Erzeugt keine eigene Layout-Hoehe. z-index:21 folgt derselben
   Konvention wie andere frei schwebende Begleitfiguren dieser Website
   (siehe .ki-geist-fly-wrap), knapp ueber dem Header (z-index:20),
   pointer-events:none auf allen Ebenen, damit nie ein Klick blockiert
   wird. Die einzelnen Abdruecke werden per JavaScript (siehe main.js)
   entlang wechselnder Routen erzeugt/positioniert -- hier nur das
   visuelle Erscheinungsbild und der Sichtbarkeits-Uebergang. */
.werkstatt-anlaeufe-pawtrail {
  position: fixed;
  inset: 0;
  width: 100vw;
  height: 100vh;
  pointer-events: none;
  z-index: 21;
  overflow: hidden;
}

.werkstatt-anlaeufe-paw {
  position: absolute;
  width: 36px;
  height: 72px;
  background-image: url("../img/werkstatt-anlaeufe-pawprints.png");
  background-repeat: no-repeat;
  background-size: 200% 100%;
  opacity: 0;
  transform: translate(-50%, -50%) scale(0.85) rotate(var(--paw-rot, 0deg));
  transition: opacity 0.35s ease, transform 0.35s ease;
}

.werkstatt-anlaeufe-paw.is-visible {
  opacity: 1;
  transform: translate(-50%, -50%) scale(1) rotate(var(--paw-rot, 0deg));
}

.werkstatt-anlaeufe-paw--a {
  background-position: left center;
}

.werkstatt-anlaeufe-paw--b {
  background-position: right center;
}

@media (max-width: 700px) {
  .werkstatt-anlaeufe-paw {
    width: 26px;
    height: 52px;
  }
}

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

  .werkstatt-anlaeufe-pawtrail {
    display: none;
  }
}

/* ================================================================ */
/* Unterseite "Ein Blick auf meinen Schreibtisch"                    */
/* Layout 1:1 an vorgegebenem Referenzbild ausgerichtet (Desktop      */
/* zuerst), Struktur/Reihenfolge der Bereiche bewusst NICHT           */
/* umgestellt.                                                        */
/* ================================================================ */

.werkstatt-schreibtisch-hero,
.werkstatt-schreibtisch-intro,
.werkstatt-schreibtisch-desk,
.werkstatt-schreibtisch-discoveries,
.werkstatt-schreibtisch-outro {
  max-width: 900px;
  position: relative;
}

.werkstatt-schreibtisch-hero {
  padding-right: 200px;
}

/* Kleines einladendes Begruessungs-Element oben rechts (echter
   Alphakanal) -- frei auf dem Seitenhintergrund, kein Rahmen/Card/
   Hintergrund dahinter, proportional skaliert ohne Zuschnitt. */
.werkstatt-schreibtisch-hero-decor {
  position: absolute;
  top: -0.5rem;
  right: 0;
  width: 190px;
}

.werkstatt-schreibtisch-hero-decor img {
  display: block;
  width: 100%;
  height: auto;
}

.werkstatt-schreibtisch-nav-links {
  display: flex;
  flex-wrap: wrap;
  gap: 0.4rem 1.5rem;
  margin-bottom: 2rem;
}

.werkstatt-schreibtisch-back {
  display: inline-block;
  font-size: 0.9rem;
  color: #4a3568;
  text-decoration: none;
  border-bottom: 1px solid rgba(var(--color-gold-rgb), 0.4);
  padding-bottom: 0.1rem;
  transition: color 0.2s ease, border-color 0.2s ease;
}

.werkstatt-schreibtisch-back:hover {
  color: #5c1f8f;
  border-color: rgba(var(--color-gold-rgb), 0.9);
}

/* Ueberschrift jetzt als freigestellte Bildgrafik (eigene, fertig
   gestaltete Schriftzug-Illustration) statt HTML-Text -- Container
   reserviert nur Platz/max-width, das Bild selbst traegt Farbe,
   Schrift und Dekoration. Kein Hintergrund/Rahmen/Card dahinter,
   damit es frei auf dem Seitenhintergrund schwebt. */
.werkstatt-schreibtisch-heading {
  display: block;
  max-width: 640px;
  margin: 0 auto 0.8rem;
}

.werkstatt-schreibtisch-heading-img {
  display: block;
  width: 100%;
  height: auto;
}

.werkstatt-schreibtisch-subtitle {
  font-family: var(--font-heading);
  font-style: italic;
  color: #4a3568;
  font-size: 1.1rem;
  line-height: 1.7;
  margin: 0;
}

.werkstatt-schreibtisch-intro p {
  color: #3f285f;
  font-size: 1.1rem;
  line-height: 1.9;
  margin: 0 0 1.1rem;
}

.werkstatt-schreibtisch-intro p:last-child {
  margin-bottom: 0;
}

/* Zwei kleine, freigestellte Dekorationselemente (Kaffeetasse oben
   links, Laptop unten rechts), die frei ueber den freien Bereichen
   der Section schweben -- absolut relativ zur Section positioniert,
   damit sie unabhaengig vom Flex-Layout ausserhalb der Bildkomposition
   sitzen und weder Foto noch Ueberschrift/Notiz-Dekorationen
   ueberdecken. Jede bekommt eine eigene, unabhaengige Schwebe-
   Animation (andere Amplitude/Dauer/Rotation/Startzeit), damit
   nichts synchron wirkt. */
.werkstatt-schreibtisch-desk-float {
  position: absolute;
  z-index: 2;
  pointer-events: none;
}

.werkstatt-schreibtisch-desk-float img {
  display: block;
  width: 100%;
  height: auto;
}

.werkstatt-schreibtisch-desk-float-cup {
  top: 0.2rem;
  left: 0;
  width: 82px;
  animation: werkstatt-schreibtisch-float-cup 14s ease-in-out infinite;
}

.werkstatt-schreibtisch-desk-float-laptop {
  bottom: -0.8rem;
  right: 0;
  width: 112px;
  animation: werkstatt-schreibtisch-float-laptop 18s ease-in-out infinite;
  animation-delay: -6s;
}

/* Echte geschwungene Flugroute statt reinem Auf-und-Ab-Wippen --
   mehrere Zwischenpunkte mit wechselnden X/Y-Werten ergeben einen
   weichen Bogen durch die freien Bereiche der Section. */
@keyframes werkstatt-schreibtisch-float-cup {
  0% { transform: translate(0, 0) rotate(0deg); }
  15% { transform: translate(90px, 40px) rotate(3deg); }
  32% { transform: translate(160px, 90px) rotate(-2deg); }
  50% { transform: translate(60px, 130px) rotate(2.5deg); }
  68% { transform: translate(-40px, 70px) rotate(-3deg); }
  84% { transform: translate(-70px, 20px) rotate(2deg); }
  100% { transform: translate(0, 0) rotate(0deg); }
}

@keyframes werkstatt-schreibtisch-float-laptop {
  0% { transform: translate(0, 0) rotate(0deg); }
  18% { transform: translate(-100px, -70px) rotate(-2deg); }
  38% { transform: translate(-180px, -20px) rotate(1.5deg); }
  55% { transform: translate(-90px, 40px) rotate(-1.5deg); }
  72% { transform: translate(30px, 10px) rotate(1deg); }
  88% { transform: translate(70px, -50px) rotate(-1deg); }
  100% { transform: translate(0, 0) rotate(0deg); }
}

/* Unterueberschrift als kleine, fertige Bildgrafik -- deutlich
   schmaler als die Hauptueberschrift, damit die klare Hierarchie
   (Haupt- vor Unterueberschrift) erhalten bleibt. Zentriert mit
   Abstand zum darunterliegenden Schreibtischfoto. */
.werkstatt-schreibtisch-desk-heading {
  display: block;
  max-width: 420px;
  margin: 0 auto 1.4rem;
}

.werkstatt-schreibtisch-desk-heading img {
  display: block;
  width: 100%;
  height: auto;
}

/* Schreibtischbereich: Foto in der Mitte, links/rechts je eine
   fertig gestaltete Dekorationsgrafik (echter Alphakanal) auf der
   freien Pergamentflaeche -- keine der drei Grafiken bekommt einen
   eigenen Rahmen/Card/Hintergrund. Das Foto bleibt mit deutlichem
   Abstand zu den schmalen Dekorationen das groesste, dominante
   Element (align-items:center zentriert die unterschiedlich hohen
   Grafiken zueinander, ohne sie zu ueberlappen). */
.werkstatt-schreibtisch-desk-layout {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 1.8rem;
}

.werkstatt-schreibtisch-desk-decor {
  flex: 0 1 170px;
  min-width: 0;
}

.werkstatt-schreibtisch-desk-decor img {
  display: block;
  width: 100%;
  height: auto;
}

.werkstatt-schreibtisch-desk-media {
  flex: 1 1 480px;
  max-width: 480px;
}

/* Kein harter Rechteckrand -- ein weicher radialer mask-image-
   Verlauf laesst die aeusseren Bildkanten (v.a. die Ecken) in den
   Seitenhintergrund auslaufen, waehrend die zentrale Bildflaeche
   voll deckend und scharf bleibt. Kein Overlay, kein Blur, kein
   neues Hintergrundbild -- der vorhandene Seitenhintergrund
   scheint durch die transparent werdenden Raender hindurch. */
.werkstatt-schreibtisch-desk-media img {
  display: block;
  width: 100%;
  height: auto;
  mask-image: radial-gradient(ellipse 50% 50% at 50% 50%, black 0%, black 85%, transparent 100%);
  -webkit-mask-image: radial-gradient(ellipse 50% 50% at 50% 50%, black 0%, black 85%, transparent 100%);
}

/* "Kleine Entdeckungen": fertig gestaltete Grafik mit allen vier
   Pergamentkarten (echter Alphakanal) -- reiner Inhaltscontainer,
   kein eigener Hintergrund/Rahmen/Card, damit die Grafik frei auf dem
   Seitenhintergrund liegt. */
.werkstatt-schreibtisch-discoveries-media {
  display: block;
  max-width: 900px;
  margin: 0 auto;
}

.werkstatt-schreibtisch-discoveries-media img {
  display: block;
  width: 100%;
  height: auto;
}

/* Kleine handschriftlich wirkende Randnotizen, sparsam ueber die Seite
   verteilt -- Script-Schrift, sehr gedaempfte Farbe/Deckkraft, absolut
   positioniert relativ zur jeweiligen Section, damit sie wie zufaellig
   an den Rand gekritzelt wirken statt Teil des Layoutflusses zu sein.
   Auf dieser Seite bewusst links/rechts der Section platziert statt
   zentral im Text. */
.werkstatt-schreibtisch-margin-note {
  position: absolute;
  z-index: 1;
  pointer-events: none;
  font-family: "Alex Brush", cursive;
  font-size: 1.2rem;
  color: #5c1f8f;
  opacity: 0.7;
  transform: rotate(var(--rot, 0deg));
  white-space: nowrap;
}

/* Abschluss-Ueberschrift als freigestellte Bildgrafik, analog zur
   Hauptueberschrift -- Container reserviert nur Platz/max-width, das
   Bild traegt Schrift und Dekoration vollstaendig selbst. */
.werkstatt-schreibtisch-outro-heading {
  display: block;
  max-width: 640px;
  margin: 0 auto 1.2rem;
}

.werkstatt-schreibtisch-outro-heading img {
  display: block;
  width: 100%;
  height: auto;
}

.werkstatt-schreibtisch-outro p {
  color: #3f285f;
  font-size: 1.1rem;
  line-height: 1.9;
  margin: 0 0 1.1rem;
}

.werkstatt-schreibtisch-outro-highlight {
  font-family: var(--font-heading);
  font-style: italic;
  color: #5c1f8f;
  font-size: 1.2rem;
}

/* Abschliessende Navigation: zwei Pergament-"Pillen" mit einem
   goldenen Herz-Ornament dazwischen, statt einfacher unterstrichener
   Textlinks. */
.werkstatt-schreibtisch-nav-pills {
  max-width: 900px;
  margin: 3rem auto 0;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
  gap: 1.2rem;
}

.werkstatt-schreibtisch-pill {
  display: inline-block;
  font-family: var(--font-heading);
  font-size: 0.92rem;
  color: #5c1f8f;
  text-decoration: none;
  background: rgba(253, 246, 232, 0.6);
  border: 1px solid rgba(var(--color-gold-rgb), 0.5);
  border-radius: 999px;
  padding: 0.7rem 1.5rem;
  box-shadow: 0 4px 12px rgba(74, 47, 122, 0.08);
  transition: color 0.2s ease, border-color 0.2s ease, background 0.2s ease;
}

.werkstatt-schreibtisch-pill:hover {
  color: #3f1568;
  border-color: rgba(var(--color-gold-rgb), 0.9);
  background: rgba(253, 246, 232, 0.85);
}

.werkstatt-schreibtisch-nav-ornament {
  color: #c9a24d;
  font-size: 0.9rem;
}

@media (max-width: 900px) {
  .werkstatt-schreibtisch-hero {
    padding-right: 0;
  }

  .werkstatt-schreibtisch-hero-decor {
    position: static;
    width: 100%;
    max-width: 300px;
    margin: 0 auto 1.5rem;
  }

  .werkstatt-schreibtisch-desk-layout {
    gap: 1rem;
  }

  .werkstatt-schreibtisch-desk-decor {
    flex-basis: 110px;
  }

  .werkstatt-schreibtisch-desk-media {
    flex-basis: 360px;
    max-width: 360px;
  }

  .werkstatt-schreibtisch-desk-float-cup {
    width: 64px;
  }

  .werkstatt-schreibtisch-desk-float-laptop {
    width: 88px;
  }

  /* Kleinerer, aber weiterhin geschwungener Flugweg auf Tablet
     (ca. halbe Desktop-Reichweite statt einer neuen Wipp-Animation). */
  @keyframes werkstatt-schreibtisch-float-cup {
    0% { transform: translate(0, 0) rotate(0deg); }
    15% { transform: translate(45px, 20px) rotate(3deg); }
    32% { transform: translate(80px, 45px) rotate(-2deg); }
    50% { transform: translate(30px, 65px) rotate(2.5deg); }
    68% { transform: translate(-20px, 35px) rotate(-3deg); }
    84% { transform: translate(-35px, 10px) rotate(2deg); }
    100% { transform: translate(0, 0) rotate(0deg); }
  }

  @keyframes werkstatt-schreibtisch-float-laptop {
    0% { transform: translate(0, 0) rotate(0deg); }
    18% { transform: translate(-50px, -35px) rotate(-2deg); }
    38% { transform: translate(-90px, -10px) rotate(1.5deg); }
    55% { transform: translate(-45px, 20px) rotate(-1.5deg); }
    72% { transform: translate(15px, 5px) rotate(1deg); }
    88% { transform: translate(35px, -25px) rotate(-1deg); }
    100% { transform: translate(0, 0) rotate(0deg); }
  }
}

@media (max-width: 700px) {
  .werkstatt-schreibtisch-margin-note {
    display: none;
  }

  /* Auf dem Smartphone nicht seitlich quetschen: Foto zuerst, danach
     beide Dekorationen als volle Breite untereinander. */
  .werkstatt-schreibtisch-desk-layout {
    flex-direction: column;
  }

  .werkstatt-schreibtisch-desk-media {
    order: 1;
    max-width: 420px;
  }

  .werkstatt-schreibtisch-desk-decor {
    order: 2;
    flex-basis: auto;
    width: 100%;
    max-width: 280px;
  }

  .werkstatt-schreibtisch-desk-float-cup {
    width: 50px;
    top: 0;
    left: 2px;
  }

  .werkstatt-schreibtisch-desk-float-laptop {
    width: 68px;
    bottom: 0;
    right: 2px;
  }

  /* Auf dem Smartphone deutlich kleinerer Flugweg, damit nichts
     ueberlagert wird -- weiterhin ein kleiner Bogen, kein reines
     Wippen. */
  @keyframes werkstatt-schreibtisch-float-cup {
    0% { transform: translate(0, 0) rotate(0deg); }
    15% { transform: translate(18px, 8px) rotate(2deg); }
    32% { transform: translate(32px, 18px) rotate(-1.5deg); }
    50% { transform: translate(12px, 26px) rotate(2deg); }
    68% { transform: translate(-8px, 14px) rotate(-2deg); }
    84% { transform: translate(-14px, 4px) rotate(1.5deg); }
    100% { transform: translate(0, 0) rotate(0deg); }
  }

  @keyframes werkstatt-schreibtisch-float-laptop {
    0% { transform: translate(0, 0) rotate(0deg); }
    18% { transform: translate(-20px, -14px) rotate(-1.5deg); }
    38% { transform: translate(-36px, -4px) rotate(1deg); }
    55% { transform: translate(-18px, 8px) rotate(-1deg); }
    72% { transform: translate(6px, 2px) rotate(0.8deg); }
    88% { transform: translate(14px, -10px) rotate(-0.8deg); }
    100% { transform: translate(0, 0) rotate(0deg); }
  }

  .werkstatt-schreibtisch-nav-pills {
    flex-direction: column;
  }
}

@media (prefers-reduced-motion: reduce) {
  .werkstatt-schreibtisch-back,
  .werkstatt-schreibtisch-pill {
    transition: none;
  }

  .werkstatt-schreibtisch-desk-float-cup,
  .werkstatt-schreibtisch-desk-float-laptop {
    animation: none;
  }
}

/* ================================================================ */
/* Wuzifluff (nur "Ueber die Autorin") */
/* ================================================================ */

/* Zwei getrennte Animationen auf zwei Ebenen, damit sie sich nicht
   gegenseitig ueberschreiben: der AEUSSERE Wrapper (position:fixed,
   also unabhaengig vom Scrollen) fliegt die grosse, unregelmaessige
   Bahn quer ueber die freien Seitenraender; das INNERE <img> bekommt
   zusaetzlich ein feines, schnelleres Wippen, das Ast/Laterne beim
   Tragen leicht schwingen laesst. pointer-events:none auf dem Wrapper
   sorgt dafuer, dass nie Klicks blockiert werden. */
body.theme-pastel-lilac .wuzifluff-wrap {
  position: fixed;
  top: 40vh;
  left: 50vw;
  width: 170px;
  z-index: 5;
  pointer-events: none;
  animation: wuzifluff-fly 52s ease-in-out infinite;
  animation-delay: 0s;
}

/* .wuzifluff-body: neue Zwischenebene fuer den lebendigeren Eindruck von
   Fluegelschlag + leichtem Auf-und-Ab + dezentem Mitschwingen von
   Ohren/Fuesschen &mdash; alles in EINER kurzzyklischen Animation
   kombiniert (translateY+scaleY+rotate), da die Illustration nur eine
   flache PNG ohne separate Koerperteile ist. Bewusst ein eigenes,
   schnelleres Tempo (1.4s) als die grosse Flugbahn (52s) und als das
   langsamere Laternen-Pendeln auf .wuzifluff-img (4.2s), damit sich
   beide Bewegungen nicht gegenseitig ueberlagern/auffressen. */
body.theme-pastel-lilac .wuzifluff-body {
  display: block;
  animation: wuzifluff-wingbeat 1.4s ease-in-out infinite;
}

@keyframes wuzifluff-wingbeat {
  0%, 100% { transform: translateY(0) scaleY(1) rotate(0deg); }
  25%      { transform: translateY(-1.5px) scaleY(1.015) rotate(0.6deg); }
  50%      { transform: translateY(0.5px) scaleY(0.985) rotate(0deg); }
  75%      { transform: translateY(-1px) scaleY(1.01) rotate(-0.6deg); }
}

/* Laterne pendelt sanft (wuzifluff-sway, unveraendert) UND ihr warmes
   Licht flackert ganz leicht (wuzifluff-flicker, eigene Eigenschaft
   `filter`, daher kein Konflikt mit der transform-basierten Pendel-
   Animation auf demselben Element). */
body.theme-pastel-lilac .wuzifluff-img {
  display: block;
  width: 100%;
  height: auto;
  transform-origin: 30% 15%;
  animation: wuzifluff-sway 4.2s ease-in-out infinite, wuzifluff-flicker 2.6s ease-in-out infinite;
}

@keyframes wuzifluff-flicker {
  0%, 100% { filter: brightness(1); }
  45%      { filter: brightness(1.05); }
  55%      { filter: brightness(0.97); }
  80%      { filter: brightness(1.03); }
}

/* Ruhige, weite Boegen statt vieler kurzer Richtungswechsel &mdash; der
   fliegende Wuzifluff soll bewusst der "ruhigere" der beiden Figuren
   sein (Gegenstueck zum lebhafteren, schnelleren lumifloss-two-walk
   weiter unten). Zwei bewusst nah beieinander liegende Zwischenstopps
   (30%/33% und 66%/69%) erzeugen ein kurzes Innehalten mitten im Bogen,
   bevor es weich weitergeht. Eigene Start-Verzoegerung von 0s (siehe
   .wuzifluff-wrap) plus eine komplett andere Kurvenform/Taktung als
   lumifloss-two-walk sorgen dafuer, dass sich beide Figuren nie
   synchron oder parallel zueinander bewegen. Alle Versaetze in vw/vh,
   damit die Bahn auf jeder Bildschirmgroesse proportional bleibt. */
@keyframes wuzifluff-fly {
  0%    { transform: translate(-30vw, 4vh)     rotate(-2deg); }
  16%   { transform: translate(-10vw, 18vh)    rotate(1deg); }
  30%   { transform: translate(8vw, 12vh)      rotate(2deg); }
  33%   { transform: translate(8.5vw, 12.5vh)  rotate(2deg); }
  50%   { transform: translate(26vw, -4vh)     rotate(3deg); }
  66%   { transform: translate(32vw, -16vh)    rotate(1deg); }
  69%   { transform: translate(32.3vw, -16.3vh) rotate(1deg); }
  84%   { transform: translate(12vw, -6vh)     rotate(-2deg); }
  100%  { transform: translate(-30vw, 4vh)     rotate(-2deg); }
}

@keyframes wuzifluff-sway {
  0%, 100% { transform: rotate(0deg); }
  50%      { transform: rotate(-2.2deg); }
}

body.theme-pastel-lilac .wuzifluff-spark {
  position: absolute;
  width: 5px;
  height: 5px;
  border-radius: 50%;
  background: radial-gradient(circle, #fff7e0 0%, #d9a94f 70%, transparent 100%);
  opacity: 0;
  pointer-events: none;
  animation: wuzifluff-spark-rise 2.6s ease-in-out infinite;
}

@keyframes wuzifluff-spark-rise {
  0%   { opacity: 0; transform: translateY(0) scale(0.6); }
  30%  { opacity: 0.85; }
  100% { opacity: 0; transform: translateY(-16px) scale(1.2); }
}

@media (max-width: 1300px) {
  body.theme-pastel-lilac .wuzifluff-wrap {
    width: 130px;
  }

  @keyframes wuzifluff-fly {
    0%    { transform: translate(-23vw, 3vh)     rotate(-2deg); }
    16%   { transform: translate(-8vw, 14vh)     rotate(1deg); }
    30%   { transform: translate(6vw, 9vh)       rotate(2deg); }
    33%   { transform: translate(6.3vw, 9.3vh)   rotate(2deg); }
    50%   { transform: translate(20vw, -3vh)     rotate(3deg); }
    66%   { transform: translate(24vw, -12vh)    rotate(1deg); }
    69%   { transform: translate(24.3vw, -12.3vh) rotate(1deg); }
    84%   { transform: translate(9vw, -5vh)      rotate(-2deg); }
    100%  { transform: translate(-23vw, 3vh)     rotate(-2deg); }
  }
}

@media (max-width: 640px) {
  body.theme-pastel-lilac .wuzifluff-wrap {
    width: 82px;
    top: 30vh;
    left: 84vw;
    animation-duration: 38s;
  }

  @keyframes wuzifluff-fly {
    0%    { transform: translate(0, 0)          rotate(-2deg); }
    20%   { transform: translate(-5vw, 8vh)     rotate(-1deg); }
    23%   { transform: translate(-5.3vw, 8.3vh) rotate(-1deg); }
    46%   { transform: translate(-9vw, 20vh)    rotate(1deg); }
    68%   { transform: translate(-4vw, 14vh)    rotate(0deg); }
    86%   { transform: translate(-7vw, 4vh)     rotate(-2deg); }
    100%  { transform: translate(0, 0)          rotate(-2deg); }
  }
}

@media (prefers-reduced-motion: reduce) {
  body.theme-pastel-lilac .wuzifluff-wrap {
    animation: wuzifluff-fade-in 1.4s ease 0.2s both;
    top: 14vh;
    left: 6vw;
  }

  body.theme-pastel-lilac .wuzifluff-img {
    animation: none;
  }

  body.theme-pastel-lilac .wuzifluff-body {
    animation: none;
  }

  body.theme-pastel-lilac .wuzifluff-spark {
    animation-duration: 3.4s;
  }
}

@keyframes wuzifluff-fade-in {
  from { opacity: 0; }
  to   { opacity: 1; }
}

/* ================================================================ */
/* Ueber die Autorin: zweiter, unabhaengiger Lumifloss mit Bluete */
/* ================================================================ */

/* Eigene, vom Wuzifluff komplett unabhaengige Figur (eigene Klassen,
   eigene Keyframes, eigene Position/Weg). Laeuft/huepft statt zu
   schweben, deshalb bewusst VOR Header/Main/Footer (die site-weit
   z-index:1 haben, siehe .brand-banner, .site-header, main,
   .site-footer weiter oben): z-index:6 liegt darueber, damit sie nie
   hinter Ueberschriften, Text oder Dekorationen verschwindet.
   pointer-events:none sorgt trotzdem dafuer, dass sie NIE Klicks
   abfaengt -- selbst wenn sie optisch kurz ueber einem Button oder Link
   laeuft, bleibt dieser normal bedienbar. */
body.theme-pastel-lilac .lumifloss-two-wrap {
  position: fixed;
  top: 78vh;
  left: 6vw;
  width: 150px;
  z-index: 6;
  pointer-events: none;
  animation: lumifloss-two-walk 30s ease-in-out infinite;
  animation-delay: 3.5s;
}

/* Die "Gaenge": kurze, gleichmaessige Trippelschritte (Koerper hebt
   sich ein paar Pixel, leichtes Wackeln nach links/rechts), und alle
   paar Schritte ein etwas groesserer Huepfer (60%-Marke) &mdash; simuliert
   die Fuesschen-Laufbewegung einer flachen Illustration ohne eigene
   Beinsegmente. Eigener, deutlich kuerzerer Zyklus als der grosse Weg
   ueber die Seite, damit sich beide Bewegungen nicht gegenseitig
   ueberlagern. Das Neigen nach links/rechts beim Richtungswechsel
   passiert bereits auf der Wrapper-Ebene (siehe rotate() in
   lumifloss-two-walk), hier geht es nur um den Schritt-Rhythmus selbst. */
body.theme-pastel-lilac .lumifloss-two-body {
  display: block;
  animation: lumifloss-two-steps 1.8s ease-in-out infinite;
}

@keyframes lumifloss-two-steps {
  0%   { transform: translateY(0)    rotate(0deg); }
  8%   { transform: translateY(-3px) rotate(-1deg); }
  16%  { transform: translateY(0)    rotate(0deg); }
  25%  { transform: translateY(-3px) rotate(1deg); }
  33%  { transform: translateY(0)    rotate(0deg); }
  42%  { transform: translateY(-3px) rotate(-1deg); }
  50%  { transform: translateY(0)    rotate(0deg); }
  60%  { transform: translateY(-7px) rotate(1.5deg); }
  70%  { transform: translateY(0)    rotate(0deg); }
  80%  { transform: translateY(-3px) rotate(-1deg); }
  90%  { transform: translateY(0)    rotate(0deg); }
  100% { transform: translateY(0)    rotate(0deg); }
}

/* transform-origin liegt nahe der Haende/des Stiels, nicht in der Mitte
   des Bildes: dadurch schwingt die grosse Bluete am oberen Bildrand bei
   jedem Grad Drehung sichtbar mehr mit als der Koerper selbst. Eigener,
   an den Schritt-Rhythmus angelehnter Takt, etwas lebendiger als zuvor,
   damit die Bluete beim Laufen erkennbar mitwippt. */
body.theme-pastel-lilac .lumifloss-two-img {
  display: block;
  width: 100%;
  height: auto;
  transform-origin: 55% 62%;
  animation: lumifloss-two-flower-sway 1.4s ease-in-out infinite;
}

@keyframes lumifloss-two-flower-sway {
  0%, 100% { transform: rotate(0deg); }
  50%      { transform: rotate(-2.5deg); }
}

/* Laufweg statt Flugbahn: deutlich mehr Richtungswechsel und ein
   eingebauter "neugierig umschauen"-Moment (11%-15%: nur rotate(),
   kaum Bewegung -- wirkt wie Stehenbleiben und Umschauen statt eines
   reinen Stopps) als beim ruhigeren, in weiten Boegen fliegenden
   Wuzifluff. Bewusst der "lebhaftere" der beiden Figuren: kuerzere
   Gesamtdauer (30s statt 52s) UND eine eigene Start-Verzoegerung
   (animation-delay:3.5s, siehe .lumifloss-two-wrap), damit die beiden
   niemals synchron oder parallel wirken. Ueberwiegend horizontale
   Bewegung mit wechselnden Hoehen-"Ebenen" auf der Seite und einem
   kurzen Stehenbleib-Moment bei 50%-54%. Die rotate()-Werte kippen die
   Figur je nach Laufrichtung leicht nach links/rechts, wie beim Gehen
   in eine Kurve. Alle Versaetze in vw/vh, damit der Weg auf jeder
   Bildschirmgroesse proportional bleibt. */
@keyframes lumifloss-two-walk {
  0%    { transform: translate(0, 0)          rotate(0deg); }    /* Start, untere Ebene */
  7%    { transform: translate(6vw, -1vh)     rotate(3deg); }    /* laeuft los nach rechts */
  11%   { transform: translate(6.2vw, -1vh)   rotate(-3deg); }   /* bleibt stehen, schaut sich um */
  15%   { transform: translate(6.4vw, -1vh)   rotate(2deg); }    /* laeuft weiter */
  26%   { transform: translate(17vw, -9vh)    rotate(-2deg); }   /* Weg steigt an, weiter oben */
  38%   { transform: translate(12vw, -17vh)   rotate(1deg); }    /* kleiner Bogen, noch hoeher */
  50%   { transform: translate(1vw, -8vh)     rotate(-2deg); }   /* diagonal zurueck nach unten */
  54%   { transform: translate(0.8vw, -8vh)   rotate(2deg); }    /* kurzer Stopp */
  67%   { transform: translate(-10vw, 3vh)    rotate(3deg); }    /* weiter unten, andere Richtung */
  82%   { transform: translate(-4vw, 7vh)     rotate(-2deg); }   /* Rueckweg Richtung Start */
  100%  { transform: translate(0, 0)          rotate(0deg); }
}

@media (max-width: 1300px) {
  body.theme-pastel-lilac .lumifloss-two-wrap {
    width: 115px;
  }

  @keyframes lumifloss-two-walk {
    0%    { transform: translate(0, 0)          rotate(0deg); }
    7%    { transform: translate(4.6vw, -0.8vh) rotate(3deg); }
    11%   { transform: translate(4.8vw, -0.8vh) rotate(-3deg); }
    15%   { transform: translate(4.9vw, -0.8vh) rotate(2deg); }
    26%   { transform: translate(13vw, -7vh)    rotate(-2deg); }
    38%   { transform: translate(9vw, -13vh)    rotate(1deg); }
    50%   { transform: translate(0.8vw, -6vh)   rotate(-2deg); }
    54%   { transform: translate(0.6vw, -6vh)   rotate(2deg); }
    67%   { transform: translate(-8vw, 2vh)     rotate(3deg); }
    82%   { transform: translate(-3vw, 5vh)     rotate(-2deg); }
    100%  { transform: translate(0, 0)          rotate(0deg); }
  }
}

@media (max-width: 640px) {
  body.theme-pastel-lilac .lumifloss-two-wrap {
    width: 78px;
    top: 82vh;
    left: 4vw;
    animation-duration: 22s;
  }

  @keyframes lumifloss-two-walk {
    0%    { transform: translate(0, 0)         rotate(0deg); }
    10%   { transform: translate(4vw, -1vh)    rotate(3deg); }
    14%   { transform: translate(4.2vw, -1vh)  rotate(-3deg); }
    28%   { transform: translate(10vw, -6vh)   rotate(-2deg); }
    44%   { transform: translate(8vw, -13vh)   rotate(1deg); }
    60%   { transform: translate(3vw, -8vh)    rotate(-2deg); }
    78%   { transform: translate(-3vw, -2vh)   rotate(2deg); }
    100%  { transform: translate(0, 0)         rotate(0deg); }
  }
}

@media (prefers-reduced-motion: reduce) {
  body.theme-pastel-lilac .lumifloss-two-wrap {
    animation: lumifloss-two-fade-in 1.4s ease 0.2s both;
    top: 80vh;
    left: 8vw;
  }

  body.theme-pastel-lilac .lumifloss-two-body {
    animation: none;
  }

  body.theme-pastel-lilac .lumifloss-two-img {
    animation: none;
  }
}

@keyframes lumifloss-two-fade-in {
  from { opacity: 0; }
  to   { opacity: 1; }
}

/* ================================================================ */
/* Startseite: frei fliegender Lumaria-Schmetterling (JS-gesteuert) */
/* ================================================================ */

/* Position (translate3d) wird per JS/requestAnimationFrame gesetzt,
   siehe Skript am Seitenende; CSS uebernimmt nur den dezenten
   Flatter-Effekt (scaleX/scaleY) auf dem <img> selbst, damit sich beide
   Animationen (Flugbahn vs. Fluegelschlag) nicht gegenseitig
   ueberschreiben (unterschiedliche Elemente). */
.lumaria-butterfly-wrap {
  position: fixed;
  top: 0;
  left: 0;
  width: 108px;
  z-index: 400;
  pointer-events: none;
  user-select: none;
  will-change: transform;
  transform: translate3d(-9999px, -9999px, 0);
}

/* Eine einzelne Fluegel-oeffnen/schliessen-Animation; die tatsaechliche
   Geschwindigkeit (animation-duration) wird per JS an den Flugzustand
   angepasst (schneller im Schwebe-Moment, langsamer im ruhigen Gleiten
   und beim Sitzen auf dem Buch) &mdash; siehe Skript am Seitenende. Der
   CSS-Wert hier ist nur der Startwert vor dem ersten JS-Update. */
.lumaria-butterfly-img {
  display: block;
  width: 100%;
  height: auto;
  transform-origin: 50% 45%;
  animation: lumaria-butterfly-flutter 0.95s ease-in-out infinite;
}

@keyframes lumaria-butterfly-flutter {
  0%, 100% { transform: scaleX(1) scaleY(1); }
  50%      { transform: scaleX(0.88) scaleY(1.04); }
}

@media (max-width: 1300px) {
  .lumaria-butterfly-wrap {
    width: 84px;
  }
}

@media (max-width: 640px) {
  .lumaria-butterfly-wrap {
    width: 58px;
  }
}

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

/* ================================================================ */
/* Fuer Eltern & Paedagogen: dekorativer Lumaria-Bewohner */
/* ================================================================ */

/* <main> ist bereits site-weit position:relative (siehe .brand-banner,
   .site-header, main, .site-footer weiter oben), daher kein zusaetzlicher
   Wrapper noetig: der Bewohner sitzt als direktes Kind von <main> ganz
   oben rechts, unabhaengig von der schmalen 700px-Textspalte, sofort ohne
   Scrollen sichtbar. Drei verschachtelte Ebenen, damit sich Wippen/Winken
   (Rotation+Translate auf .body), Blinzeln (scaleY auf .img) und
   Kristall-Leuchten (filter auf .img) nicht gegenseitig ueberschreiben. */
.lumaria-resident-wrap {
  position: absolute;
  top: 0;
  right: 2vw;
  width: 340px;
  pointer-events: none;
  z-index: 1;
}

/* Zweiter Bewohner (blauhaarig): exakt dieselbe Darstellung wie der
   rosa Bewohner (gleiche Groesse/Sichtbarkeit sofort oben auf der
   Seite), nur oben LINKS statt oben rechts gespiegelt, damit sich beide
   nicht ueberlappen. Nutzt dieselbe Wippen/Winken/Blinzeln-Mechanik,
   nur die Kristallfarbe (blau/tuerkis statt rosa-lila) unterscheidet
   sich. */
.lumaria-resident-wrap.is-blue {
  right: auto;
  left: 2vw;
}

.lumaria-resident-body {
  display: block;
  transform-origin: 25% 40%;
  animation: resident-wave-cycle 17s ease-in-out infinite;
}

/* 17s-Zyklus: die meiste Zeit nur sanftes Auf-und-Ab; einmal pro
   Durchlauf (bei ca. 40-48%, alle 17s) ein kurzes, weiches Hin-und-Her
   der Rotation, das wie ein kleines Winken wirkt. */
@keyframes resident-wave-cycle {
  0%   { transform: translateY(0) rotate(0deg); }
  8%   { transform: translateY(-3px) rotate(0deg); }
  16%  { transform: translateY(0) rotate(0deg); }
  24%  { transform: translateY(-2px) rotate(0deg); }
  32%  { transform: translateY(0) rotate(0deg); }
  40%  { transform: translateY(-1px) rotate(-3deg); }
  44%  { transform: translateY(-1px) rotate(4deg); }
  48%  { transform: translateY(-1px) rotate(-3deg); }
  52%  { transform: translateY(0) rotate(0deg); }
  60%  { transform: translateY(-3px) rotate(0deg); }
  68%  { transform: translateY(0) rotate(0deg); }
  76%  { transform: translateY(-2px) rotate(0deg); }
  84%  { transform: translateY(0) rotate(0deg); }
  92%  { transform: translateY(-2px) rotate(0deg); }
  100% { transform: translateY(0) rotate(0deg); }
}

.lumaria-resident-img {
  display: block;
  width: 100%;
  height: auto;
  animation: resident-blink 7.3s ease-in-out infinite, resident-glow 17s ease-in-out infinite;
}

/* Sehr kurzes, dezentes Zusammenziehen (kein isoliertes Augenlid moeglich
   bei einer flachen PNG, daher als sanfter Gesamt-Puls angenaehert). */
@keyframes resident-blink {
  0%, 94%, 100% { transform: scaleY(1); }
  96%           { transform: scaleY(0.97); }
  98%           { transform: scaleY(1); }
}

/* Dauerhaftes sanftes Kristall-Leuchten, das genau waehrend des
   Wink-Moments (40-48%, siehe oben) kurz etwas kraeftiger wird. */
@keyframes resident-glow {
  0%, 35%, 55%, 100% { filter: drop-shadow(0 0 8px rgba(230, 140, 200, 0.55)); }
  42%, 48%             { filter: drop-shadow(0 0 14px rgba(230, 140, 200, 0.8)); }
}

.lumaria-resident-img.is-blue-glow {
  animation: resident-blink 7.3s ease-in-out infinite, resident-glow-blue 17s ease-in-out infinite;
}

@keyframes resident-glow-blue {
  0%, 35%, 55%, 100% { filter: drop-shadow(0 0 8px rgba(90, 170, 220, 0.55)); }
  42%, 48%             { filter: drop-shadow(0 0 14px rgba(90, 170, 220, 0.8)); }
}

@media (max-width: 1600px) {
  .lumaria-resident-wrap {
    width: 260px;
  }
}

@media (max-width: 1300px) {
  .lumaria-resident-wrap {
    width: 200px;
  }
}

@media (max-width: 900px) {
  .lumaria-resident-wrap {
    position: static;
    display: block;
    margin: 0 auto 1.6rem;
    width: 150px;
  }
}

@media (prefers-reduced-motion: reduce) {
  .lumaria-resident-body {
    animation: resident-float-only 6s ease-in-out infinite;
  }

  .lumaria-resident-img {
    animation: resident-glow-static 4s ease-in-out infinite;
  }

  .lumaria-resident-img.is-blue-glow {
    animation: resident-glow-blue-static 4s ease-in-out infinite;
  }
}

@keyframes resident-float-only {
  0%, 100% { transform: translateY(0); }
  50%      { transform: translateY(-3px); }
}

@keyframes resident-glow-blue-static {
  0%, 100% { filter: drop-shadow(0 0 8px rgba(90, 170, 220, 0.55)); }
  50%      { filter: drop-shadow(0 0 10px rgba(90, 170, 220, 0.62)); }
}

@keyframes resident-glow-static {
  0%, 100% { filter: drop-shadow(0 0 8px rgba(230, 140, 200, 0.55)); }
  50%      { filter: drop-shadow(0 0 10px rgba(230, 140, 200, 0.62)); }
}

/* ================================================================ */
/* Gratis-Schatztruhe */
/* ================================================================ */

body.theme-schatztruhe {
  --color-ink: #f5f4fb;
  --color-ink-deep: #e8e4f2;
  --color-ink-light: #fbfaff;
  --color-parchment: #3d3a52;
  --color-parchment-dim: #756f92;
  --color-gold: #d9b45a;
  --color-gold-light: #6a4fa0;
  --color-burgundy: #7fc7c2;
  --color-gold-rgb: 217, 180, 90;
  --surface-rgb: 255, 255, 255;
  --surface-alpha: 0.55;
}

/* Header-Video (nur auf gratis-schatztruhe.html, ersetzt dort die sonst
   hier stehenden Logos): das aktuelle Video ist bereits im echten
   Banner-Seitenverhaeltnis produziert (1280x640 = 2:1), daher reicht
   aspect-ratio auf dem Video selbst -- das GARANTIERT rechnerisch, dass
   nie beschnitten wird und nie Balken entstehen (Box-Form entspricht
   immer exakt der Video-Form), ganz ohne object-fit:cover/-crop-Tricks.
   max-width 920px (= 2 x 460px, dieselbe Hoehe wie der kompakte
   Marktplatz-Header) haelt das Banner auf breiten Bildschirmen kompakt;
   auf schmaleren Viewports skaliert width:100% + margin:auto ganz
   natuerlich mit, keine Breakpoints noetig. .schatztruhe-hero-video-wrap
   bleibt als volle-Breite-Flieder-Flaeche (wie site-header/brand-banner)
   bestehen, falls durch Rundungsfehler ein Hauch Rand sichtbar wird. */
.schatztruhe-hero-video-wrap {
  width: 100%;
  overflow: hidden;
  line-height: 0;
  background-color: #f2ecf8;
  text-align: center;
}

/* mask-image blendet die aeusseren ~10% links/rechts weich aus (wie
   gewuenscht: 8-12%), die Mitte bleibt bei 100% deckend -- dadurch
   verblassen Emma/Loomus/Fina/Geschenke/Ueberschrift in der Bildmitte
   nicht. Die "verschwindenden" Randbereiche geben den Blick auf den
   background-color:#f2ecf8 von .schatztruhe-hero-video-wrap frei
   (siehe oben, identisch zur Farbe von Navigation/Kopfbereich) --
   dadurch verschmilzt die Videokante nahtlos mit dem Seitenhintergrund,
   ganz ohne Farbwasch-Overlay, Schatten oder Rahmen. */
.schatztruhe-hero-video {
  display: block;
  width: 100%;
  max-width: 920px;
  aspect-ratio: 1280 / 640;
  height: auto;
  margin: 0 auto;
  object-fit: contain;
  object-position: center;
  -webkit-mask-image: linear-gradient(to right, transparent 0%, black 10%, black 90%, transparent 100%);
  mask-image: linear-gradient(to right, transparent 0%, black 10%, black 90%, transparent 100%);
}

/* Eigener, blickdichter fliederfarbener Kopfbereich: Logo, Schriftzug und
   Navigation sollen NICHT auf dem Schatztruhen-Hintergrundbild schweben
   (das jetzt ausschliesslich auf <main> liegt, siehe weiter unten). Beide
   Elemente bekommen dieselbe Flaechenfarbe, damit sie optisch zu einer
   durchgehenden Kopfleiste verschmelzen. */
body.theme-schatztruhe .brand-banner,
body.theme-schatztruhe .site-header {
  background-color: #f2ecf8;
}

/* Tuerkis-Buttons mit goldenem Hover, analog zur Eltern&Paedagogen-Seite. */
body.theme-schatztruhe .btn-primary {
  background: #3fa8a4;
  border-color: #3fa8a4;
  color: #ffffff;
}

body.theme-schatztruhe .btn-primary:hover {
  background: var(--color-gold);
  border-color: var(--color-gold);
  color: #3f2f10;
}

body.theme-schatztruhe .btn-outline {
  color: #3fa8a4;
  border-color: #3fa8a4;
}

body.theme-schatztruhe .btn-outline:hover {
  background: rgba(216, 180, 90, 0.14);
  border-color: var(--color-gold);
  color: var(--color-parchment);
}

body.theme-schatztruhe main {
  position: relative;
}

.schatztruhe-hero {
  position: relative;
  z-index: 1;
  padding: 2.5rem 1.5rem 1rem;
  display: flex;
  justify-content: center;
}

/* Bildbuehne: feste Seitenverhaeltnis-Box (passend zur Emma-Zimmer-Grafik),
   damit Truhe und Textebene darin per Prozentwerten stabil positioniert
   werden koennen -- gleiche Technik wie beim Spielbrett auf
   spiel-und-spass.html. */
.schatztruhe-scene {
  position: relative;
  width: 100%;
  max-width: 1180px;
  margin: 0 auto;
  aspect-ratio: 1536 / 1024;
}

/* Weicher Fade an ALLEN VIER Kanten statt hartem Bildrahmen. Die vorherige
   Fassung nutzte eine einzelne radiale Ellipse -- die faedet zuverlaessig
   nur die Ecken aus (Corner-Distanz > Kanten-Distanz zur Bildmitte),
   waehrend die vier geraden Kanten (oben/links/rechts/unten) bis exakt an
   die Bildgrenze hart sichtbar blieben -- genau der gemeldete helle
   rechteckige Rand. Zwei sich ueberschneidende lineare Verlaeufe (Achse
   X + Y, per mask-composite:intersect kombiniert) faeden stattdessen alle
   vier Kanten gleichmaessig aus; die Ecken faeden dabei automatisch noch
   staerker (beide Verlaeufe wirken dort gleichzeitig), ohne dass die
   Bildmitte angetastet wird. */
/* Die Bildhuelle deckt sich auf breiten Bildschirmen genau mit der
   Buehne -- dort aendert sich durch sie nichts. Auf schmalen behaelt sie
   das Seitenverhaeltnis des Bildes, waehrend die Buehne darunter noch
   das Schluesselfeld traegt. */
.schatztruhe-bild {
  position: absolute;
  inset: 0;
}

.schatztruhe-scene-bg {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  border-radius: 28px;
  -webkit-mask-image:
    linear-gradient(to right, transparent 0%, black 10%, black 90%, transparent 100%),
    linear-gradient(to bottom, transparent 0%, black 10%, black 90%, transparent 100%);
  -webkit-mask-composite: source-in, source-in;
  mask-image:
    linear-gradient(to right, transparent 0%, black 10%, black 90%, transparent 100%),
    linear-gradient(to bottom, transparent 0%, black 10%, black 90%, transparent 100%);
  mask-composite: intersect;
}

/* Truhe (geschlossen + geoeffnet): beide Bilder stammen aus demselben
   freigestellten Grafik-Paar (echte Alpha-Transparenz, kein Wald-Rest mehr)
   und teilen sich exakt dieselbe Position/Groesse ueber diese Basis-Klasse
   -- nur so wirkt der Wechsel wie ein echtes Oeffnen. Der Zustand
   (geschlossen sichtbar / offen sichtbar) wird ausschliesslich ueber
   Opacity auf den beiden Modifier-Klassen gesteuert, siehe JS weiter unten. */
.schatztruhe-chest-visual {
  position: absolute;
  left: 54%;
  top: 87%;
  width: 32%;
  transform: translate(-50%, -100%);
  filter: drop-shadow(0 14px 10px rgba(55, 40, 20, 0.3));
  transition: opacity 0.9s ease;
}

.schatztruhe-chest-closed {
  z-index: 2;
  opacity: 1;
}

.schatztruhe-scene.is-unlocking .schatztruhe-chest-closed,
.schatztruhe-scene.is-unlocked .schatztruhe-chest-closed {
  opacity: 0;
}

.schatztruhe-chest-open {
  z-index: 2;
  opacity: 0;
}

.schatztruhe-scene.is-unlocked .schatztruhe-chest-open {
  opacity: 1;
}

/* Goldenes Schloss-Leuchten: kurzer Puls genau an der Position des
   Herzschlosses auf der geschlossenen Truhe, kurz bevor sie ausblendet. */
.schatztruhe-lock-glow {
  position: absolute;
  left: 55%;
  top: 76%;
  width: 12%;
  aspect-ratio: 1;
  transform: translate(-50%, -50%);
  z-index: 3;
  border-radius: 50%;
  background: radial-gradient(circle, rgba(255, 244, 214, 0.95) 0%, rgba(217, 180, 90, 0.65) 35%, rgba(154, 111, 209, 0.35) 60%, transparent 78%);
  opacity: 0;
  pointer-events: none;
  filter: blur(1px);
}

.schatztruhe-scene.is-unlocking .schatztruhe-lock-glow {
  animation: schatztruhe-lock-pulse 0.8s ease-out 1;
}

@keyframes schatztruhe-lock-pulse {
  0%   { opacity: 0; transform: translate(-50%, -50%) scale(0.7); }
  45%  { opacity: 1; transform: translate(-50%, -50%) scale(1.15); }
  100% { opacity: 0; transform: translate(-50%, -50%) scale(1.35); }
}

/* Warmes Licht, das nach dem Aufblenden der offenen Truhe aus ihrem Inneren
   aufsteigt. */
.schatztruhe-inner-light {
  position: absolute;
  left: 55%;
  top: 70%;
  width: 34%;
  aspect-ratio: 1;
  transform: translate(-50%, -50%) scale(0.6);
  z-index: 3;
  border-radius: 50%;
  background: radial-gradient(circle, rgba(255, 232, 180, 0.9) 0%, rgba(255, 210, 140, 0.5) 45%, transparent 75%);
  opacity: 0;
  pointer-events: none;
  filter: blur(2px);
}

.schatztruhe-scene.is-unlocked .schatztruhe-inner-light {
  animation: schatztruhe-inner-light-rise 1.6s ease-out 1;
  animation-delay: 0.15s;
}

@keyframes schatztruhe-inner-light-rise {
  0%   { opacity: 0; transform: translate(-50%, -50%) scale(0.5); }
  35%  { opacity: 0.9; transform: translate(-50%, -60%) scale(1); }
  100% { opacity: 0; transform: translate(-50%, -95%) scale(1.4); }
}

/* Kleine Lichtpartikel/Sterne: zwei getrennte Sets fuer die beiden
   Animationsphasen (rund ums Schloss / aus der offenen Truhe aufsteigend),
   erzeugt per JS als absolut positionierte Spans innerhalb der Bildbuehne. */
.schatztruhe-spark {
  position: absolute;
  z-index: 4;
  border-radius: 50%;
  pointer-events: none;
  opacity: 0;
}

.schatztruhe-spark.is-lock {
  width: 5px;
  height: 5px;
  background: radial-gradient(circle, #fff7e0 0%, #d9a94f 70%, transparent 100%);
  animation: schatztruhe-spark-lock 0.8s ease-out forwards;
}

@keyframes schatztruhe-spark-lock {
  0%   { opacity: 0; transform: translate(0, 0) scale(0.5); }
  30%  { opacity: 1; }
  100% { opacity: 0; transform: translate(var(--dx, 0), var(--dy, -18px)) scale(1.1); }
}

.schatztruhe-spark.is-rising {
  width: 4px;
  height: 4px;
  background: radial-gradient(circle, #fffaf0 0%, #f0c878 65%, transparent 100%);
  box-shadow: 0 0 6px 1px rgba(255, 224, 160, 0.7);
  animation: schatztruhe-spark-rise 2.1s ease-out forwards;
}

@keyframes schatztruhe-spark-rise {
  0%   { opacity: 0; transform: translate(0, 0) scale(0.6); }
  15%  { opacity: 0.95; }
  100% { opacity: 0; transform: translate(var(--dx, 0), -120px) scale(1); }
}

/* Kleine, transparente Zauberschluessel-Ebene oberhalb der Truhe -- ersetzt
   die vorherige grosse weisse Box. Bewusst halbtransparent mit Blur statt
   einer deckenden Flaeche, damit Emmas Zimmer dahinter sichtbar bleibt. */
/* Bewusst schmaler/kompakter als vorher (400px -> 340px) und heller/
   feiner (dueenneres Blur, cremig-violetter statt reinweisser Ton), damit
   es wie eine kleine magische Einladung wirkt statt wie ein grosses
   Formularfenster -- Emmas Zimmer soll deutlich hindurchscheinen. Zwei
   kleine Stern-Glyphen an den oberen Ecken (::before/::after, kein
   zusaetzliches Bild) verstaerken den maerchenhaften Eindruck. */
.schatztruhe-key-panel {
  position: absolute;
  z-index: 3;
  left: 50%;
  top: 3.5%;
  transform: translateX(-50%);
  width: min(78%, 340px);
  text-align: center;
  padding: 0.75rem 1.1rem 0.65rem;
  background: linear-gradient(180deg, rgba(255, 253, 248, 0.6), rgba(250, 245, 255, 0.48));
  backdrop-filter: blur(3px);
  -webkit-backdrop-filter: blur(3px);
  border: 1px solid rgba(var(--color-gold-rgb), 0.55);
  border-radius: 22px;
  box-shadow:
    0 0 0 1px rgba(255, 255, 255, 0.45) inset,
    0 0 16px rgba(var(--color-gold-rgb), 0.3),
    0 8px 20px rgba(90, 70, 130, 0.12);
  transition: opacity 0.6s ease;
}

.schatztruhe-key-panel::before,
.schatztruhe-key-panel::after {
  content: "\2726";
  position: absolute;
  top: 9px;
  font-size: 0.65rem;
  line-height: 1;
  color: rgba(var(--color-gold-rgb), 0.7);
  pointer-events: none;
}

.schatztruhe-key-panel::before {
  left: 16px;
}

.schatztruhe-key-panel::after {
  right: 16px;
}

/* Das GESAMTE Panel (Flaeche, Blur, Rahmen, Schatten) muss beim
   Freischalten mitverschwinden, nicht nur sein Text-/Formular-Inhalt --
   sonst bleibt eine leere, milchige Flaeche hinter der Geschafft-Grafik
   und den Schatzkarten stehen (genau dieser Bug wurde hier behoben). */
.schatztruhe-scene.is-unlocking .schatztruhe-key-panel,
.schatztruhe-scene.is-unlocked .schatztruhe-key-panel {
  opacity: 0;
  pointer-events: none;
}

/* --color-gold-light ist auf dieser Seite bewusst ein dunkles Lumaria-
   Violett (siehe body.theme-schatztruhe weiter oben), nicht golden -- die
   Ueberschrift nutzt also schon den richtigen Farbton, wird hier nur
   kleiner/eleganter gesetzt. */
.schatztruhe-whisper {
  font-family: var(--font-heading);
  font-style: italic;
  font-size: 1rem;
  line-height: 1.3;
  letter-spacing: 0.01em;
  color: var(--color-gold-light);
  margin: 0 0 0.3rem;
}

.schatztruhe-intro {
  color: var(--color-parchment-dim);
  font-size: 0.78rem;
  line-height: 1.35;
  margin: 0 0 0.6rem;
}

/* Formular-Inhalt (Fluesterzeile + Eingabe) und Erfolgs-Inhalt teilen sich
   dieselbe Panel-Flaeche; welcher Block sichtbar ist, steuert einzig die
   is-unlocked-Klasse auf .schatztruhe-scene -- siehe JS weiter unten. */
.schatztruhe-key-panel-form {
  transition: opacity 0.6s ease;
}

.schatztruhe-scene.is-unlocking .schatztruhe-key-panel-form,
.schatztruhe-scene.is-unlocked .schatztruhe-key-panel-form {
  opacity: 0;
  pointer-events: none;
}

/* Erfolgszustand: Geschafft-Banner + drei klickbare Schatz-Schriftrollen.
   Liegt bewusst als eigenes Element NEBEN (nicht in) .schatztruhe-key-panel,
   weil es deutlich breiter werden muss als die schmale Eingabe-Ebene.
   opacity+translateY-Uebergang mit Verzoegerung: startet erst, nachdem
   der Truhen-Wechsel/das Licht schon laufen (siehe .schatztruhe-chest-
   visual/.schatztruhe-inner-light), nicht zeitgleich mit dem ersten
   Schloss-Leuchten -- dadurch wirkt die Szene wie EINE fortlaufende
   Sequenz statt mehrerer gleichzeitiger Effekte. */
.schatztruhe-treasure-reveal {
  position: absolute;
  z-index: 4;
  top: -25px;
  left: 50%;
  width: 74%;
  max-width: 660px;
  text-align: center;
  opacity: 0;
  transform: translate(-50%, 16px);
  pointer-events: none;
  transition: opacity 1.3s ease, transform 1.3s ease;
  transition-delay: 0.5s;
}

.schatztruhe-scene.is-unlocked .schatztruhe-treasure-reveal {
  opacity: 1;
  transform: translate(-50%, 0);
  pointer-events: auto;
}

/* Banner behaelt bewusst eine eigene, vom Container entkoppelte Breite --
   ca. 20% groesser als zuvor (max-width 250px -> 300px), aber weiterhin
   deutlich kompakter als die Schatzkarten darunter. */
.schatztruhe-geschafft-banner {
  display: block;
  width: 46%;
  max-width: 300px;
  height: auto;
  object-fit: contain;
  margin: 0 auto;
}

.schatztruhe-treasure-row {
  display: flex;
  justify-content: center;
  align-items: flex-start;
  gap: 2.2%;
  margin-top: 0;
}

/* flex:0 0 auto (statt vorher 1 1 0) -- die drei Schatzrollen sollen NICHT
   automatisch auf die volle Containerbreite aufgebläht werden, sondern
   eine feste, untereinander identische Breite behalten und als Gruppe
   zentriert im Container stehen (Zielspanne lt. Vorgabe: Reihe = ca.
   75-85% der Containerbreite, siehe .schatztruhe-treasure-reveal). */
.schatztruhe-treasure-link {
  display: block;
  flex: 0 0 auto;
  width: 25%;
  /* Reset fuer den Stundenplan-Button (<button> statt <a>, oeffnet die
     Varianten-Auswahl) -- wirkt sich auf die beiden <a>-Karten nicht aus,
     da die betreffenden Eigenschaften dort ohnehin unbenutzt sind. */
  border: none;
  background: none;
  padding: 0;
  margin: 0;
  font: inherit;
  text-align: inherit;
  cursor: pointer;
  transition: transform 0.25s ease, filter 0.25s ease;
}

.schatztruhe-treasure-link:hover,
.schatztruhe-treasure-link:focus-visible {
  transform: translateY(-4px) scale(1.04);
  filter: drop-shadow(0 8px 16px rgba(217, 169, 79, 0.45));
  outline: none;
}

.schatztruhe-treasure-img {
  display: block;
  width: 100%;
  height: auto;
  object-fit: contain;
}

.schatztruhe-form label {
  display: block;
  text-align: left;
  font-family: var(--font-heading);
  font-size: 0.8rem;
  color: var(--color-gold-light);
  margin-bottom: 0.25rem;
}

.schatztruhe-input-row {
  display: flex;
  gap: 0.55rem;
  flex-wrap: wrap;
}

/* Niedriger/eleganter als vorher: weniger vertikales Padding, cremig-
   elfenbeinerner statt reinweisser Ton, feinerer Goldrand + sanfter
   Schatten statt hartem Kontrast. */
.schatztruhe-input-row input {
  flex: 1 1 160px;
  padding: 0.42rem 0.75rem;
  border-radius: 11px;
  border: 1px solid rgba(var(--color-gold-rgb), 0.45);
  background: #fdf9ee;
  color: var(--color-parchment);
  font-family: var(--font-body);
  font-size: 0.92rem;
  box-shadow: inset 0 1px 3px rgba(90, 70, 40, 0.08);
}

.schatztruhe-input-row input:focus {
  outline: none;
  border-color: var(--color-gold);
  box-shadow: 0 0 0 3px rgba(var(--color-gold-rgb), 0.2);
}

.schatztruhe-input-row input:disabled {
  opacity: 0.65;
}

.schatztruhe-input-row .btn {
  flex: 0 0 auto;
}

/* Eigener violett-goldener Button NUR fuer den Zauberschluessel-Submit --
   bewusst ueber .schatztruhe-key-panel skaliert statt die globale
   body.theme-schatztruhe .btn-primary-Regel zu aendern, damit die
   tuerkisen Stundenplan-Buttons im separaten Modal unangetastet bleiben. */
body.theme-schatztruhe .schatztruhe-key-panel .btn-primary {
  position: relative;
  background: #4a3572;
  border: 1px solid rgba(var(--color-gold-rgb), 0.75);
  color: #fbf3e2;
  border-radius: 999px;
  box-shadow: 0 0 12px rgba(var(--color-gold-rgb), 0.35), 0 4px 10px rgba(60, 40, 90, 0.25);
  transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.2s ease;
}

body.theme-schatztruhe .schatztruhe-key-panel .btn-primary:hover,
body.theme-schatztruhe .schatztruhe-key-panel .btn-primary:focus-visible {
  background: #5a4188;
  transform: scale(1.03);
  box-shadow: 0 0 18px rgba(var(--color-gold-rgb), 0.5), 0 5px 12px rgba(60, 40, 90, 0.3);
}

/* Wenige kleine goldene Lichtpunkte, die beim Hover/Fokus rund um den
   Button erscheinen -- rein dekorativ via ::after, kein zusaetzliches
   Markup/Bild. */
.schatztruhe-key-panel .btn-primary::after {
  content: "";
  position: absolute;
  inset: -10px;
  background:
    radial-gradient(circle, rgba(var(--color-gold-rgb), 0.9) 0%, transparent 70%) 4% 15% / 6px 6px no-repeat,
    radial-gradient(circle, rgba(var(--color-gold-rgb), 0.9) 0%, transparent 70%) 94% 10% / 5px 5px no-repeat,
    radial-gradient(circle, rgba(var(--color-gold-rgb), 0.9) 0%, transparent 70%) 90% 85% / 5px 5px no-repeat,
    radial-gradient(circle, rgba(var(--color-gold-rgb), 0.9) 0%, transparent 70%) 8% 88% / 4px 4px no-repeat;
  opacity: 0;
  pointer-events: none;
  transition: opacity 0.3s ease;
}

.schatztruhe-key-panel .btn-primary:hover::after,
.schatztruhe-key-panel .btn-primary:focus-visible::after {
  opacity: 1;
}

@keyframes schatztruhe-shake {
  0%, 100% { transform: translateX(0); }
  25%      { transform: translateX(-4px); }
  75%      { transform: translateX(4px); }
}

.schatztruhe-input-row input.is-shaking {
  animation: schatztruhe-shake 0.3s ease-in-out;
}

.schatztruhe-message {
  min-height: 1.1em;
  margin: 0.45rem 0 0;
  font-family: var(--font-heading);
  font-size: 0.85rem;
}

.schatztruhe-message.is-success {
  color: #3f8a5b;
}

.schatztruhe-message.is-error {
  color: #a15b3f;
}

.schatztruhe-downloads {
  position: relative;
  z-index: 1;
  max-width: 1000px;
  margin: 0 auto;
  padding: 0 1.5rem 4rem;
  opacity: 0;
  transform: translateY(12px);
  transition: opacity 0.6s ease, transform 0.6s ease;
}

.schatztruhe-downloads.is-visible {
  opacity: 1;
  transform: translateY(0);
}

.schatztruhe-downloads h2 {
  text-align: center;
  margin-bottom: 1.8rem;
}

.schatztruhe-download-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
  gap: 1.6rem;
}

.schatztruhe-download-card {
  background: rgba(255, 255, 255, 0.78);
  border: 1px solid rgba(var(--color-gold-rgb), 0.35);
  border-radius: 18px;
  padding: 1.8rem 1.4rem;
  text-align: center;
  box-shadow: 0 10px 26px rgba(60, 50, 90, 0.12);
}

.schatztruhe-download-preview {
  font-size: 2.4rem;
  margin-bottom: 0.8rem;
}

.schatztruhe-download-card h3 {
  margin-bottom: 0.4rem;
}

.schatztruhe-download-card p {
  color: var(--color-parchment-dim);
  font-size: 0.95rem;
  margin: 0 0 1.2rem;
}

/* ===================================================================
   Stundenplan-Varianten-Modal (nur auf gratis-schatztruhe.html)
   ===================================================================
   Eigenstaendiger Dialog, wird per [hidden] komplett aus dem Rendering
   entfernt, solange er nicht aktiv geoeffnet ist -- liegt also NIE als
   dauerhafte Flaeche ueber dem Kinderzimmer, nur waehrend der Nutzer ihn
   selbst geoeffnet hat. Farbwelt (Gold/Lila/Creme) folgt bewusst dem
   bereits etablierten Schriftrollen-Look dieser Seite. */
.stundenplan-modal {
  position: fixed;
  inset: 0;
  z-index: 100;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 1.5rem;
}

.stundenplan-modal[hidden] {
  display: none;
}

.stundenplan-modal-backdrop {
  position: absolute;
  inset: 0;
  background: rgba(61, 45, 82, 0.55);
  backdrop-filter: blur(3px);
  -webkit-backdrop-filter: blur(3px);
  opacity: 0;
  transition: opacity 0.3s ease;
}

.stundenplan-modal.is-open .stundenplan-modal-backdrop {
  opacity: 1;
}

.stundenplan-modal-panel {
  position: relative;
  z-index: 1;
  width: 100%;
  max-width: 720px;
  max-height: 88vh;
  overflow-y: auto;
  background: linear-gradient(180deg, #fdfaf3, #f7f0e0);
  border: 1px solid rgba(var(--color-gold-rgb), 0.5);
  border-radius: 22px;
  box-shadow: 0 24px 60px rgba(60, 45, 90, 0.35);
  padding: 2rem 1.8rem 1.8rem;
  text-align: center;
  opacity: 0;
  transform: translateY(18px) scale(0.98);
  transition: opacity 0.35s ease, transform 0.35s ease;
}

.stundenplan-modal.is-open .stundenplan-modal-panel {
  opacity: 1;
  transform: translateY(0) scale(1);
}

.stundenplan-modal-close {
  position: absolute;
  top: 0.9rem;
  right: 0.9rem;
  width: 34px;
  height: 34px;
  border-radius: 50%;
  border: 1px solid rgba(var(--color-gold-rgb), 0.4);
  background: rgba(255, 255, 255, 0.6);
  color: var(--color-gold-light);
  font-size: 1rem;
  line-height: 1;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
}

.stundenplan-modal-close:hover,
.stundenplan-modal-close:focus-visible {
  background: rgba(var(--color-gold-rgb), 0.18);
  outline: none;
}

.stundenplan-modal-heading {
  font-family: var(--font-heading);
  font-size: 1.4rem;
  color: var(--color-gold-light);
  margin: 0 0 0.4rem;
}

.stundenplan-modal-subheading {
  color: var(--color-parchment);
  font-size: 0.98rem;
  margin: 0 0 1.6rem;
}

.stundenplan-modal-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 1.4rem;
}

.stundenplan-variant {
  display: flex;
  flex-direction: column;
  align-items: center;
  background: rgba(255, 255, 255, 0.5);
  border: 1px solid rgba(var(--color-gold-rgb), 0.3);
  border-radius: 16px;
  padding: 0.9rem 0.9rem 1.1rem;
}

.stundenplan-variant-img {
  display: block;
  width: 100%;
  aspect-ratio: 4 / 3;
  object-fit: contain;
  border-radius: 10px;
  margin-bottom: 0.6rem;
}

.stundenplan-variant-name {
  font-family: var(--font-heading);
  color: var(--color-gold-light);
  font-size: 1rem;
  margin: 0 0 0.7rem;
}

.stundenplan-variant-btn {
  font-size: 0.9rem;
  padding: 0.55rem 1.2rem;
}

body.stundenplan-modal-lock {
  overflow: hidden;
}

@media (max-width: 640px) {
  .stundenplan-modal-panel {
    padding: 1.6rem 1.2rem 1.4rem;
    max-height: 92vh;
  }

  .stundenplan-modal-grid {
    grid-template-columns: 1fr;
    gap: 1.1rem;
  }

  .stundenplan-modal-heading {
    font-size: 1.2rem;
  }
}

@media (prefers-reduced-motion: reduce) {
  .stundenplan-modal-backdrop,
  .stundenplan-modal-panel {
    transition: opacity 0.15s ease;
  }

  .stundenplan-modal-panel {
    transform: none;
  }

  .stundenplan-modal.is-open .stundenplan-modal-panel {
    transform: none;
  }
}

@media (max-width: 900px) {
  /* GANZES ZIMMER AUCH AUF DEM HANDY.

     Vorher war die Buehne 720px hoch und das Bild deckte sie per
     object-fit:cover ab -- dadurch war seitlich nur der mittlere
     Streifen zu sehen, Bett, Regal und Laterne fielen weg. Jetzt behaelt
     die Buehne das Seitenverhaeltnis des Bildes, es wird also nichts
     mehr beschnitten. Das hat zwei Folgen, die hier aufgefangen werden:

     1. Das Zimmer ist auf dem Handy nur noch etwa 250px hoch. Fuer das
        Schluesselfeld ist darin kein Platz -- es sitzt jetzt UNTER dem
        Bild. Der Platz dafuer wird als Aussenabstand freigehalten, damit
        der folgende Inhalt nicht darunter rutscht.
     2. Die Truhe bekommt wieder ihre normalen Werte; die alten galten
        fuer den beschnittenen Ausschnitt.

     Nebenbei stimmen dadurch auch die vier Klickpunkte im Zimmer auf
     dem Handy, denn ihre Lage steht in Prozent des Bildes. */
  .schatztruhe-scene {
    aspect-ratio: auto;
    height: auto;
    max-width: 560px;
  }

  /* Das Bild behaelt sein Seitenverhaeltnis, wird also nicht mehr
     beschnitten. Die Buehne waechst darunter einfach um das
     Schluesselfeld -- ohne von Hand freigehaltenen Platz, der bei
     laengeren Texten nie passt. */
  .schatztruhe-bild {
    position: relative;
    inset: auto;
    aspect-ratio: 1536 / 1024;
  }

  /* Nicht mehr ueber dem Bild, sondern darunter im normalen Fluss. */
  .schatztruhe-key-panel {
    position: static;
    transform: none;
    margin: 0.9rem auto 0;
    padding: 0.85rem 1.1rem 0.75rem;
    width: min(96%, 380px);
  }

  .schatztruhe-whisper {
    font-size: 0.95rem;
  }

  /* Darf hier bewusst breiter als die normale Contentbreite wirken (bis
     knapp an den Bildschirmrand), damit die drei Schriftrollen nicht zu
     klein werden -- solange width <= 100% bleibt keine horizontale
     Scrollbar. */
  .schatztruhe-treasure-reveal {
    width: 99%;
    max-width: 527px;
    /* Ab der Oberkante des Bildes: Der Vorhang legt sich ueber Bild und
       Feldbereich. Das Feld bleibt im Fluss stehen und wird nur
       durchsichtig -- dadurch springt beim Freischalten nichts. */
    top: 0;
  }

  .schatztruhe-geschafft-banner {
    width: 61%;
    max-width: 233px;
  }

  /* Bei sehr schmalen Bildschirmen ist physisch kein Platz fuer denselben
     Vergroesserungsfaktor wie auf Desktop, ohne die drei Schriftrollen
     umbrechen zu lassen oder eine horizontale Scrollbar zu riskieren --
     Breite/Abstand hier so weit ausgereizt, wie ohne Umbruch/Overflow
     moeglich (auf breiteren Tablet-Breiten innerhalb dieses Breakpoints
     wird dadurch automatisch mehr Groesse erreicht, siehe max-width oben). */
  .schatztruhe-treasure-row {
    gap: 1%;
    margin-top: 0;
  }

  .schatztruhe-treasure-link {
    width: 32.5%;
  }

  .schatztruhe-input-row {
    flex-direction: column;
  }

  .schatztruhe-input-row .btn {
    width: 100%;
  }
}

@media (prefers-reduced-motion: reduce) {
  .schatztruhe-downloads {
    transition: opacity 0.3s ease;
    transform: none;
  }

  .schatztruhe-chest-visual {
    transition: opacity 0.3s ease;
  }

  .schatztruhe-lock-glow,
  .schatztruhe-inner-light,
  .schatztruhe-spark {
    animation: none !important;
    opacity: 0 !important;
  }

  .schatztruhe-key-panel-form {
    transition: opacity 0.3s ease;
  }

  .schatztruhe-treasure-reveal {
    transition: opacity 0.3s ease;
    transform: translate(-50%, 0);
  }

  .schatztruhe-scene.is-unlocked .schatztruhe-treasure-reveal {
    transform: translate(-50%, 0);
  }
}

/* ==========================================================================
   Spiel & Spass -- Grundgeruest (nur diese Unterseite, siehe body.spiel-page)
   ==========================================================================
   Reines Struktur-/Abstands-Grundgeruest: Platzhalter fuer Illustrationen,
   die separat geliefert werden. Alle Selektoren bewusst unter body.spiel-
   page bzw. mit spiel-* Praefix gehalten, damit keine andere Seite (auch
   nicht andere theme-marketplace-Seiten wie shop.html) beeinflusst wird. */

body.spiel-page {
  background: radial-gradient(ellipse at top, #fffdf8 0%, #faf6ec 55%, #f2ecdb 100%);
}

/* Produktdetailseiten (reise-durch-lumaria.html, lumaria-memory.html):
   bewusst nach demselben schlichten Prinzip wie die Buecher in
   shop.html -- kein Warenkorb/Checkout, nur Platzhalterinhalt + ein
   "Interesse anmelden"-Link zu kontakt.html (identischer CTA-Text wie
   .book-buy-btn dort), damit kein zweites Shopsystem entsteht. */

.spiel-product-page {
  text-align: center;
}

.spiel-product-back {
  display: inline-block;
  margin-bottom: 1.5rem;
  font-family: var(--font-heading);
  font-size: 0.95rem;
  color: var(--color-gold-light);
  text-decoration: none;
}

.spiel-product-back:hover {
  text-decoration: underline;
}

.spiel-product-image-frame {
  position: relative;
  width: 100%;
  max-width: 320px;
  aspect-ratio: 4 / 3;
  margin: 1.5rem auto;
  border-radius: 20px;
  border: 1.5px dashed rgba(var(--color-gold-rgb), 0.4);
  display: flex;
  align-items: center;
  justify-content: center;
}

.spiel-product-image-note {
  font-family: var(--font-heading);
  font-style: italic;
  font-size: 0.95rem;
  color: rgba(63, 53, 80, 0.35);
}

.spiel-product-desc {
  font-size: 1.1rem;
  color: var(--color-parchment-dim);
  max-width: 46ch;
  margin: 0 auto 0.75rem;
}

.spiel-product-price {
  font-family: var(--font-heading);
  color: var(--color-ink-deep);
  margin: 0 0 1.75rem;
}

/* ==========================================================================
   Lumarias Zauberladen (spiel-und-spass.html)
   ==========================================================================
   Header-Video (.spiel-hero-video-wrap, oben) und Navigation bleiben
   unveraendert -- alles hier ist der komplett neu aufgebaute Inhalt
   darunter. Fester Farbrahmen ueber die theme-marketplace-Variablen
   (Creme/Flieder/Gold/Violett, siehe body.theme-marketplace weiter
   oben) plus ein zusaetzlicher weicher Rosaton, keine eigenen neuen
   Farben. Alle Bild-/Produktflaechen sind bewusst nur Platzhalter
   (gestrichelter Rahmen + Hinweistext) -- keine erfundenen Produkte,
   Preise oder Verfuegbarkeiten, nur ein vorbereitetes Layout. Keine
   festen height/min-height-Werte irgendwo, alle Abschnitte wachsen mit
   ihrem Inhalt (mobile-first, siehe Breakpoints unten). */

.zauberladen-intro {
  max-width: 640px;
  margin: 0 auto;
  padding: 1.6rem 1.5rem 1.2rem;
  text-align: center;
}

.zauberladen-intro h1 {
  font-family: var(--font-heading);
  font-size: 1.7rem;
  color: var(--color-parchment);
  margin: 0 0 0.7rem;
}

.zauberladen-intro p {
  font-size: 1.05rem;
  line-height: 1.55;
  color: var(--color-parchment);
  margin: 0 0 0.5rem;
}

/* Neue Bild-Ueberschrift "Nimm ein bisschen Lumaria mit nach Hause"
   (Nutzerkorrektur, ersetzt die bisherige grosse Text-Ueberschrift +
   Einleitungsabsatz -- bewusst deutlich schmaler/leichter als vorher).
   Mittig, Breite bewusst nur ein Anteil der ohnehin schon schmalen
   .zauberladen-intro-Spalte (max-width:640px), damit die Grafik die
   Seite nicht erschlaegt -- Hoehe ergibt sich automatisch (height:auto),
   keine Verzerrung. Kein zusaetzlicher Kasten/Rahmen/Hintergrund, steht
   frei auf der bestehenden Seitenflaeche. */
.zauberladen-heading-img {
  display: block;
  width: 90%;
  height: auto;
  margin: 0 auto;
}

.zauberladen-intro-sub {
  font-size: 0.92rem;
  color: var(--color-parchment-dim);
}

.zauberladen-intro p.zauberladen-intro-sub {
  margin-top: 0.6rem;
}

@media (min-width: 640px) {
  .zauberladen-intro {
    padding: 2.4rem 1.5rem 1.8rem;
  }

  .zauberladen-intro h1 {
    font-size: 2.1rem;
  }

  .zauberladen-heading-img {
    width: 78%;
  }
}

@media (min-width: 1024px) {
  .zauberladen-heading-img {
    width: 70%;
  }
}

/* Zwei separat gelieferte Banner-Grafiken (Nutzerkorrektur: erneut
   ausgetauscht und beide nochmals schmaler skaliert, Banner 2 deutlich
   schmaler/dezenter als Banner 1, damit der gesamte Begruessungsbereich
   als dezenter, luftiger Einstieg wirkt statt als grosser Hauptblock).
   Banner 1 (Wortmarke) direkt unter der Navigation, Banner 2
   (Vorteils-/Infografik) darunter mit etwas Abstand. Beide als
   normales <img>, height:auto (keine Verzerrung), kein Zuschnitt,
   zentriert -- kein eigener Rahmen/Hintergrund/Schatten. Beide PNGs
   sind opak (kein Alpha-Kanal), ihr cremefarbener Hintergrund liegt
   aber so nah am Seitenhintergrund (--color-ink), dass keine sichtbare
   harte Kante entsteht -- daher bewusst keine CSS-Maske noetig. */
.zauberladen-banner {
  width: 100%;
  max-width: 520px;
  margin: 0 auto;
  padding: 0 1rem;
}

.zauberladen-banner-img {
  display: block;
  width: 100%;
  height: auto;
  margin: 0 auto;
}

/* Nutzerkorrektur: der Titel-Banner ("Lumaria Zauberladen") ist jetzt
   ein eigener, schmaler Seiten-Header direkt unter der Navigation
   (siehe HTML), nicht mehr Teil des .zauberladen-banner-Stapels
   innerhalb von <main>. Gedeckelte Breite statt Vollbild-Hero (Vorgabe:
   "nicht wie ein grosser Hero-Bereich"), width:100%/height:auto haelt
   das Seitenverhaeltnis exakt. Bild ist vollstaendig opak (kein Alpha-
   Kanal) -- per mask-image an allen vier Kanten weich in den
   cremefarbenen Seitenhintergrund ausgefadet (gleiche etablierte
   Technik wie u.a. bei .leseprobe-header-banner-img). */
.zauberladen-header-banner-wrap {
  /* Nutzerkorrektur: 1100px (wie beim Leseprobe-Header) war fuer DIESES
     Bild (Seitenverhaeltnis 3:1) noch zu hoch (~366px bei 1280px
     Viewport) und wirkte wie ein Hero-Bereich statt einem schmalen
     Seiten-Header -- 700px ergibt eine deutlich flachere, der Vorgabe
     "schlanke Hoehe wie bei den anderen Unterseiten" entsprechende
     Banderole (~233px bei 1280px). */
  max-width: 700px;
  margin: 0 auto;
  padding: 0.75rem 1.2rem 0;
}

.zauberladen-header-banner-video {
  display: block;
  width: 100%;
  height: auto;
  margin: 0 auto;
  mask-image:
    linear-gradient(to right, transparent 0%, black 8%, black 92%, transparent 100%),
    linear-gradient(to bottom, transparent 0%, black 18%, black 82%, transparent 100%);
  mask-composite: intersect;
  -webkit-mask-image:
    linear-gradient(to right, transparent 0%, black 8%, black 92%, transparent 100%),
    linear-gradient(to bottom, transparent 0%, black 18%, black 82%, transparent 100%);
  -webkit-mask-composite: source-in;
}

/* Banner 2 (Willkommens-/Infografik mit den vier Vorteils-Elementen)
   ist jetzt das erste Element innerhalb von <main> -- die frueheren
   grossen NEGATIVEN margin-top-Werte glichen aus, dass sie direkt
   unter Banner 1 (mit dessen eigenem eingebackenem unteren Rand) im
   selben Stapel sass. Das entfaellt jetzt strukturell (eigener
   Seiten-Header aussehalb von <main>, siehe oben), ein kleiner
   POSITIVER Abstand genuegt fuer sauberen Anschluss. Die Grafik hat
   selbst noch reichlich eingebackenen oberen Rand (~24.6%), daher
   bleibt der zusaetzliche CSS-Abstand bewusst klein. */
.zauberladen-banner-welcome {
  max-width: 320px;
  margin-top: 0.5rem;
}

@media (min-width: 640px) {
  .zauberladen-banner-welcome {
    max-width: 380px;
  }
}

@media (min-width: 1024px) {
  .zauberladen-banner-welcome {
    max-width: 420px;
  }
}

/* Vier Produktwelten im wechselnden Bild/Inhalt-Layout statt einer
   Kachelwand -- auf Mobile immer Bild zuerst, dann Inhalt (siehe
   Basis-Regeln, column ist Default); ab 860px wechselt die Reihenfolge
   abwechselnd per .zauberladen-world--reverse (row-reverse), fuer den
   gewuenschten "Lookbook"-Rhythmus. Abwechselnd sehr helle Flieder-
   bzw. Rosa-Tönung als Hintergrund je Welt statt harter Kachelgrenzen. */
.zauberladen-world {
  display: flex;
  flex-direction: column;
  gap: 1.4rem;
  max-width: 1080px;
  margin: 0 auto;
  padding: 2rem 1.5rem;
  align-items: center;
}

.zauberladen-world:nth-of-type(odd) {
  background: rgba(var(--color-lavender-rgb), 0.14);
}

.zauberladen-world:nth-of-type(even) {
  background: rgba(232, 180, 200, 0.12);
}

@media (min-width: 860px) {
  .zauberladen-world {
    flex-direction: row;
    text-align: left;
    padding: 3rem 2.5rem;
    gap: 3rem;
  }

  .zauberladen-world--reverse {
    flex-direction: row-reverse;
  }

  .zauberladen-world-media,
  .zauberladen-world-content {
    flex: 1 1 0;
    min-width: 0;
  }
}

.zauberladen-world-media {
  width: 100%;
  max-width: 380px;
}

.zauberladen-world-media-placeholder {
  width: 100%;
  aspect-ratio: 4 / 3;
  border-radius: 20px;
  border: 1.5px dashed rgba(var(--color-gold-rgb), 0.4);
  background: rgba(255, 255, 255, 0.45);
  display: flex;
  align-items: center;
  justify-content: center;
}

.zauberladen-world-media-placeholder-note {
  font-family: var(--font-heading);
  font-style: italic;
  color: rgba(74, 63, 92, 0.4);
  font-size: 0.95rem;
}

.zauberladen-world-content {
  width: 100%;
  text-align: center;
}

@media (min-width: 860px) {
  .zauberladen-world-content {
    text-align: left;
  }
}

.zauberladen-world-content h2 {
  font-family: var(--font-heading);
  font-size: 1.35rem;
  color: var(--color-parchment);
  margin: 0 0 0.5rem;
}

.zauberladen-world-content > p {
  color: var(--color-parchment-dim);
  line-height: 1.55;
  margin: 0 0 1.2rem;
}

/* Ein einzelner, klar als Platzhalter erkennbarer Produkt-Slot pro
   Welt -- bereit fuer echte Fotos/Daten, aber ohne erfundenen Namen/
   Preis/Kaufen-Button. Auf Mobile immer gestapelt (Bild ueber Text),
   ab 640px nebeneinander. */
.zauberladen-product-card {
  display: flex;
  flex-direction: column;
  gap: 0.9rem;
  max-width: 320px;
  margin: 0 auto;
  background: rgba(255, 255, 255, 0.55);
  border: 1px solid rgba(var(--color-gold-rgb), 0.25);
  border-radius: 16px;
  padding: 1rem;
  text-align: left;
}

@media (min-width: 640px) {
  .zauberladen-product-card {
    flex-direction: row;
    align-items: center;
    max-width: 380px;
    margin: 0;
  }

  .zauberladen-world--reverse .zauberladen-product-card,
  .zauberladen-world:nth-of-type(even) .zauberladen-product-card {
    margin: 0 0 0 auto;
  }
}

.zauberladen-product-image {
  width: 100%;
  aspect-ratio: 1 / 1;
  border-radius: 12px;
  border: 1.5px dashed rgba(var(--color-gold-rgb), 0.4);
  background: rgba(255, 255, 255, 0.5);
  display: flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
}

@media (min-width: 640px) {
  .zauberladen-product-image {
    width: 92px;
    height: 92px;
  }
}

.zauberladen-product-image-note {
  font-family: var(--font-heading);
  font-style: italic;
  font-size: 0.8rem;
  color: rgba(74, 63, 92, 0.4);
}

.zauberladen-product-info {
  min-width: 0;
}

.zauberladen-product-name {
  font-family: var(--font-heading);
  color: var(--color-parchment);
  margin: 0 0 0.2rem;
}

.zauberladen-product-desc {
  font-size: 0.9rem;
  color: var(--color-parchment-dim);
  margin: 0 0 0.3rem;
}

.zauberladen-product-price {
  font-size: 0.85rem;
  color: var(--color-gold-light);
  margin: 0 0 0.5rem;
}

.zauberladen-product-cta {
  display: inline-block;
  font-family: var(--font-heading);
  font-size: 0.8rem;
  color: var(--color-parchment-dim);
  border: 1px solid rgba(var(--color-gold-rgb), 0.35);
  border-radius: 999px;
  padding: 0.4rem 1rem;
}

/* Kleine, dezente Erklaerung direkt ueber den Medaillons -- keine
   eigene Box/Hintergrund, nur Textfarben aus der Theme-Palette. */
.zauberladen-medaillons-intro {
  max-width: 600px;
  margin: 0 auto;
  padding: 0.75rem 1.25rem 0;
  text-align: center;
}

.zauberladen-medaillons-intro-title {
  font-family: var(--font-heading);
  font-size: 1.2rem;
  color: var(--color-parchment);
  margin: 0 0 0.35rem;
}

.zauberladen-medaillons-intro-sub {
  font-size: 0.92rem;
  color: var(--color-parchment-dim);
  margin: 0;
}

/* Vier vom Nutzer gelieferte Medaillon-Grafiken (ersetzen die
   bisherige Kachel-/Lookbook-Struktur) -- reine Bild-Links, keine
   eigene Deko/Ornamente ergaenzt (Nutzervorgabe). Einfaches, mittig
   zentriertes Zeilen-Layout, das auf schmalen Screens umbricht. */
.zauberladen-medaillons {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  align-items: flex-start;
  gap: 1.2rem;
  max-width: 900px;
  margin: 0 auto;
  padding: 0.5rem 1.5rem 1.5rem;
}

/* Nutzerkorrektur: das neue Schreibzauber-Medaillon hat ein anderes
   Seitenverhaeltnis (hochformatig) als die drei uebrigen (quadratisch)
   -- damit trotzdem alle vier exakt dieselbe Hoehe UND denselben
   Platzbedarf in der Reihe behalten, OHNE ein einziges Bild zu
   beschneiden oder zu verzerren, bekommt .zauberladen-medaillon jetzt
   eine feste quadratische Box (Breite UND Hoehe gleich), das <img>
   darin per object-fit:contain vollstaendig eingepasst (unveraendertes
   Seitenverhaeltnis, keinerlei Zuschnitt). Bei den drei bereits
   quadratischen Medaillons aendert das optisch nichts. */
.zauberladen-medaillon {
  display: block;
  width: 150px;
  height: 150px;
  transition: transform 0.2s ease;
}

.zauberladen-medaillon:hover,
.zauberladen-medaillon:focus-visible {
  transform: translateY(-3px);
}

.zauberladen-medaillon img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: contain;
}

@media (min-width: 640px) {
  .zauberladen-medaillon {
    width: 190px;
    height: 190px;
  }
}

/* Neue Produktkategorien -- rein strukturell, noch ohne eigene
   Gestaltung (Nutzervorgabe): derselbe bereits bestehende
   .zauberladen-product-card-Baustein wie zuvor (siehe oben,
   unveraendert), nur ohne den alten .zauberladen-world-Bildrahmen. */
.zauberladen-category {
  max-width: 840px;
  margin: 0 auto;
  padding: 1.6rem 1.5rem;
  text-align: center;
  scroll-margin-top: 1.5rem;
}

.zauberladen-category h2 {
  font-family: var(--font-heading);
  font-size: 1.35rem;
  color: var(--color-parchment);
  margin: 0 0 0.5rem;
}

.zauberladen-category > p {
  color: var(--color-parchment-dim);
  line-height: 1.55;
  margin: 0 0 1.2rem;
}

.zauberladen-category-products {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 1.2rem;
}

/* Kompakte Schreibzauber-Einleitung (Nutzerkorrektur, ersetzt die
   bisherige "wird vorbereitet"-Meldung + Liste + grossen .btn.btn-
   outline-Zurueck-Button) -- eigene schlanke Klassen statt der
   sitewide .section (padding:3.5rem) bzw. .btn, damit die Abstaende
   knapp bleiben und andere Seiten unberuehrt bleiben. Farbwelt Creme/
   Gold/Lavendel/dunkles Pflaume passend zum Zauberladen, kein neues
   Bild -- nur ein kleines Gold/Pflaume-Herz als Zierelement. */
.schreibzauber-intro {
  max-width: 820px;
  margin: 0 auto;
  padding: 1.75rem 1.5rem 0.75rem;
  text-align: center;
  background: radial-gradient(ellipse at center, rgba(var(--color-lavender-rgb), 0.1) 0%, transparent 70%);
}

.schreibzauber-intro-title {
  font-family: var(--font-heading);
  font-size: 2rem;
  color: var(--color-parchment);
  margin: 0;
}

/* Nutzerkorrektur: die beiden frueheren Grafiken (Titel + separate
   Tagline/Beschreibung) sind durch einen einzigen neuen Banner
   ersetzt, der den Titel bereits vollstaendig enthaelt -- dezente
   Groesse (kein grosser Hauptheader), proportional skaliert, nie
   verzerrt/beschnitten. Bild ist vollstaendig opak (kein Alpha-Kanal)
   -- per mask-image an allen vier Kanten weich in den Seitenhintergrund
   ausgefadet (gleiche etablierte Technik wie u.a. bei
   .leseprobe-header-banner-video). Groessenstufen vom bisherigen
   Titelbild uebernommen -- bereits auf dieser Seite auf "schmal,
   nicht uebergross" abgestimmt. */
.schreibzauber-heading-banner-img {
  display: block;
  width: 100%;
  max-width: 420px;
  height: auto;
  margin: 0 auto;
  mask-image:
    linear-gradient(to right, transparent 0%, black 8%, black 92%, transparent 100%),
    linear-gradient(to bottom, transparent 0%, black 18%, black 82%, transparent 100%);
  mask-composite: intersect;
  -webkit-mask-image:
    linear-gradient(to right, transparent 0%, black 8%, black 92%, transparent 100%),
    linear-gradient(to bottom, transparent 0%, black 18%, black 82%, transparent 100%);
  -webkit-mask-composite: source-in;
}

@media (min-width: 640px) {
  .schreibzauber-heading-banner-img {
    max-width: 560px;
  }
}

@media (min-width: 1024px) {
  .schreibzauber-heading-banner-img {
    max-width: 780px;
  }
}

.schreibzauber-intro-divider {
  display: block;
  width: 44px;
  height: 14px;
  margin: 0.5rem auto 0.7rem;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 44 14'%3E%3Cdefs%3E%3ClinearGradient id='h' x1='0' y1='0' x2='0' y2='1'%3E%3Cstop offset='0' stop-color='%23d8b45a'/%3E%3Cstop offset='1' stop-color='%237c4fa0'/%3E%3C/linearGradient%3E%3C/defs%3E%3Cpath d='M2 7C10 7,15 7,17 7' stroke='%23c9a24d' stroke-width='1.2' stroke-linecap='round'/%3E%3Cpath d='M42 7C34 7,29 7,27 7' stroke='%23c9a24d' stroke-width='1.2' stroke-linecap='round'/%3E%3Cpath d='M22 12C19.5 9.8,17 8,17 5.4C17 3.6,18.4 2.5,20 3.3C21 3.8,22 5.2,22 5.2C22 5.2,23 3.8,24 3.3C25.6 2.5,27 3.6,27 5.4C27 8,24.5 9.8,22 12Z' fill='url(%23h)'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: center;
  background-size: contain;
}

.schreibzauber-intro-tagline {
  font-family: var(--font-heading);
  font-style: italic;
  font-size: 1.05rem;
  color: var(--color-gold-light);
  margin: 0 0 0.6rem;
}

.schreibzauber-intro-desc {
  font-size: 0.98rem;
  line-height: 1.5;
  color: var(--color-parchment-dim);
  max-width: 440px;
  margin: 0 auto 1.1rem;
}

/* Nutzeranfrage: Produkt-/Servicebereich "Post aus Lumaria" auf
   Schreib- & Sammelzauber. Fuer dieses Angebot liegt noch keine
   Grafik vor, daher rein struktureller Aufbau -- alle Farben,
   Schriften, Rahmen, Radien und Schatten sind unveraendert aus den
   bereits auf dieser Seite verwendeten Werten uebernommen (Karten-
   Look von .produktkarte, Hinweis-Look von .zauberladen-note), damit
   sich der Bereich einfuegt ohne eine neue Farbwelt einzufuehren.
   Layout folgt ebenfalls dem etablierten Muster: gestapelt auf
   Mobile, ab 640px Bild links / Text rechts. */
.postkarte {
  display: flex;
  flex-direction: column;
  gap: 1.1rem;
  max-width: 620px;
  margin: 0 auto;
  padding: 1.25rem;
  background: #fdf6ea;
  border: 1.5px solid rgba(var(--color-gold-rgb), 0.55);
  border-radius: 24px;
  box-shadow: 0 16px 34px rgba(74, 63, 92, 0.14);
  text-align: left;
}

@media (min-width: 640px) {
  .postkarte {
    flex-direction: row;
    align-items: flex-start;
    padding: 1.5rem;
    gap: 1.4rem;
  }
}

/* Bildbereich ist bereits vollstaendig vorbereitet: feste Flaeche mit
   Rahmen, die fertige Grafik wird spaeter nur per src eingesetzt.
   object-fit:contain haelt sie dabei automatisch unverzerrt und
   unbeschnitten, unabhaengig von ihrem Seitenverhaeltnis. */
.postkarte-media {
  flex: 0 0 auto;
  width: 100%;
  max-width: 200px;
  aspect-ratio: 4 / 5;
  margin: 0 auto;
  padding: 0.3rem;
  background: rgba(var(--color-lavender-rgb), 0.16);
  border: 1.5px solid rgba(var(--color-gold-rgb), 0.4);
  border-radius: 16px;
}

@media (min-width: 640px) {
  .postkarte-media {
    margin: 0;
  }
}

.postkarte-image {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: contain;
}

.postkarte-info {
  flex: 1 1 0;
  min-width: 0;
}

.postkarte-title {
  font-family: var(--font-heading);
  font-size: 1.3rem;
  color: var(--color-parchment);
  margin: 0 0 0.2rem;
}

.postkarte-subtitle {
  font-family: var(--font-heading);
  font-style: italic;
  font-size: 1rem;
  color: var(--color-gold-light);
  margin: 0 0 0.8rem;
}

.postkarte-desc {
  font-size: 0.9rem;
  line-height: 1.5;
  color: var(--color-parchment-dim);
  margin: 0 0 0.7rem;
}

.postkarte-hinweis {
  margin: 0.9rem 0 1.1rem;
  padding: 0.7rem 1rem;
  border-radius: 14px;
  background: radial-gradient(ellipse at center, rgba(var(--color-lavender-rgb), 0.18) 0%, rgba(201, 138, 160, 0.1) 55%, transparent 100%);
  font-family: var(--font-heading);
  font-size: 0.95rem;
  line-height: 1.4;
  color: var(--color-parchment);
  text-align: center;
}

/* Die beiden Varianten bewusst als zwei klar voneinander abgesetzte
   Boxen (eigener Rahmen + Hintergrund), damit sie auch beim schnellen
   Ueberfliegen eindeutig als getrennte Auswahl lesbar sind. */
.postkarte-varianten {
  display: flex;
  flex-direction: column;
  gap: 0.9rem;
}

@media (min-width: 900px) {
  .postkarte-varianten {
    flex-direction: row;
  }

  .postkarte-variante {
    flex: 1 1 0;
  }
}

.postkarte-variante {
  padding: 0.9rem 1rem;
  background: rgba(var(--color-lavender-rgb), 0.12);
  border: 1.5px solid rgba(var(--color-gold-rgb), 0.4);
  border-radius: 16px;
}

.postkarte-variante-name {
  font-family: var(--font-heading);
  font-size: 1rem;
  color: var(--color-parchment);
  margin: 0 0 0.3rem;
}

.postkarte-variante-takt {
  font-family: var(--font-heading);
  font-style: italic;
  font-size: 0.88rem;
  color: var(--color-gold-light);
  margin: 0 0 0.4rem;
}

.postkarte-variante-inhalt {
  font-size: 0.85rem;
  line-height: 1.45;
  color: var(--color-parchment-dim);
  margin: 0 0 0.6rem;
}

.postkarte-variante-preis {
  display: inline-block;
  font-family: var(--font-heading);
  font-size: 1.05rem;
  color: var(--color-gold-light);
  background: rgba(var(--color-lavender-rgb), 0.2);
  border-radius: 999px;
  padding: 0.2rem 0.85rem;
  margin: 0;
}

.postkarte-versandhinweis {
  font-size: 0.78rem;
  line-height: 1.4;
  color: var(--color-parchment-dim);
  margin: 0.9rem 0 0;
  text-align: center;
}

/* Nutzeranfrage: einheitlicher "Zurück zu Lumarias Zauberladen"-Button
   fuer den gesamten Zauberladen-Bereich (Druckzauber, Malen &
   Entdecken, Schreib- & Sammelzauber, Saisonzauber, Sammelzauber) --
   ersetzt die bisherigen schlichten Text-Pillen. Die vom Nutzer
   gelieferte Grafik enthaelt Rahmen, Pfeil UND Text bereits fertig
   gestaltet, daher hier NUR ein reines, klickbares <img> im <a> (kein
   zusaetzlicher Text darueber/daneben -- waere eine Dopplung). Bewusst
   NICHT die sitewide .btn/.btn-outline-Klasse angefasst, da diese auch
   auf vielen anderen, nicht vom Nutzer genannten Seiten verwendet wird
   -- stattdessen eine eigene, nur fuer diesen einen Button-Typ
   gedachte Klasse. */
/* Nutzeranfrage: der Zurueck-Button steht jetzt einheitlich als
   Seitenabschluss unterhalb von Produktkarte + Vorschau-Button (statt
   wie zuvor direkt unter der Kopfzeile) -- eigene Abschluss-Sektion
   mit grosszuegigem Abstand nach oben, damit er wie das Ende der
   Seite wirkt. Der Button selbst traegt keinen eigenen Top-Abstand
   mehr, das uebernimmt die Sektion. */
.zauberladen-back-btn-section {
  margin: 2.25rem auto 0;
  text-align: center;
}

.zauberladen-back-btn {
  display: inline-block;
  width: 100%;
  max-width: 300px;
  margin: 0 auto;
  line-height: 0;
  transition: transform 0.2s ease, filter 0.2s ease;
}

.zauberladen-back-btn:hover,
.zauberladen-back-btn:focus-visible {
  transform: translateY(-2px) scale(1.02);
  filter: brightness(1.06);
}

@media (min-width: 640px) {
  .zauberladen-back-btn {
    max-width: 340px;
  }
}

.zauberladen-back-btn-img {
  display: block;
  width: 100%;
  height: auto;
}

/* Muster-Produktkarte (Nutzervorgabe, zunaechst nur auf
   schreibzauber.html) -- Farben/Rahmen/Abstaende/Position folgen der
   vom Nutzer gelieferten Vorlagen-Grafik (Creme-Karte, goldener
   Rahmen, Lavendel-Bildflaeche, dunkelvioletter "In den Warenkorb"-
   Button, Preis in Gold). Die aufwendigen Illustrationen der Vorlage
   (Bandmotiv, Feder/Buecher, Drache, Vertrauens-Badges) wurden bewusst
   NICHT nachgebaut -- das waere eigene, neu erfundene Dekoration.
   Generischer Klassenname (kein "zauberladen-" bzw. Seitenpraefix),
   da diese Karte laut Nutzer spaeter als Vorlage fuer alle weiteren
   Produkte/Kategorien dupliziert wird. */
.produktkarte {
  display: flex;
  flex-direction: column;
  gap: 1.1rem;
  max-width: 620px;
  margin: 0 auto;
  padding: 1.25rem;
  background: #fdf6ea;
  border: 1.5px solid rgba(var(--color-gold-rgb), 0.55);
  border-radius: 24px;
  box-shadow: 0 16px 34px rgba(74, 63, 92, 0.14);
  text-align: left;
}

@media (min-width: 640px) {
  .produktkarte {
    flex-direction: row;
    align-items: flex-start;
    padding: 1.5rem;
    gap: 1.4rem;
  }
}

.produktkarte-media {
  flex: 0 0 auto;
  width: 100%;
  max-width: 200px;
  aspect-ratio: 4 / 5;
  margin: 0 auto;
  padding: 0.3rem;
  background: rgba(var(--color-lavender-rgb), 0.16);
  border: 1.5px solid rgba(var(--color-gold-rgb), 0.4);
  border-radius: 16px;
}

@media (min-width: 640px) {
  .produktkarte-media {
    margin: 0;
  }
}

.produktkarte-image {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: contain;
}

.produktkarte-info {
  flex: 1 1 0;
  min-width: 0;
}

.produktkarte-name {
  font-family: var(--font-heading);
  font-size: 1.3rem;
  color: var(--color-parchment);
  margin: 0 0 0.35rem;
}

.produktkarte-desc {
  font-size: 0.9rem;
  line-height: 1.45;
  color: var(--color-parchment-dim);
  margin: 0 0 0.8rem;
}

.produktkarte-secondary-row {
  display: flex;
  align-items: center;
  gap: 0.8rem;
  margin-bottom: 0.8rem;
}

.produktkarte-secondary-media {
  flex: 0 0 auto;
  width: 64px;
  height: 64px;
  padding: 0.3rem;
  background: rgba(var(--color-lavender-rgb), 0.16);
  border: 1.5px solid rgba(var(--color-gold-rgb), 0.4);
  border-radius: 10px;
}

.produktkarte-secondary-image {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: contain;
}

.produktkarte-price {
  display: inline-block;
  font-family: var(--font-heading);
  font-size: 1.1rem;
  color: var(--color-gold-light);
  background: rgba(var(--color-lavender-rgb), 0.16);
  border-radius: 999px;
  padding: 0.2rem 0.85rem;
  margin: 0 0 0.8rem;
}

.produktkarte-secondary-row .produktkarte-price {
  margin: 0;
}

.produktkarte-cta {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  font-family: var(--font-heading);
  font-size: 0.95rem;
  line-height: 1.2;
  color: var(--color-ink-light);
  text-align: center;
  background: linear-gradient(160deg, #6b3fa0, #4a1f6b);
  border: 1.5px solid rgba(var(--color-gold-rgb), 0.6);
  border-radius: 999px;
  padding: 0.6rem 1.4rem;
  cursor: pointer;
  transition: transform 0.2s ease, box-shadow 0.2s ease;
}

@media (min-width: 480px) {
  .produktkarte-cta {
    width: auto;
  }
}

.produktkarte-cta:hover,
.produktkarte-cta:focus-visible {
  transform: translateY(-2px);
  box-shadow: 0 8px 18px rgba(74, 31, 107, 0.3);
}

.produktkarte-status {
  font-size: 0.9rem;
  color: var(--color-parchment-dim);
  margin: 0.7rem 0 0;
}

/* Nutzerkorrektur: neue Kategorie "Druckzauber" -- fuer die zwei
   Produktkarten-Gerueste ("Schulzauber"/"Geburtstagszauber") liegt
   diesmal KEINE illustrierte Hintergrundgrafik vor, daher bewusst
   KEINE Bild-Schale, sondern die bereits bestehende, generische
   .produktkarte-Komponente von oben (unveraendert wiederverwendet --
   exakt "gleicher Aufbau wie die bisherigen Produktkarten-Vorlagen").
   Alle Texte sind normale HTML-Elemente, nichts eingebrannt, nichts
   doppelt. Ergaenzt um eine kleine 3-spaltige Vorteils-/Info-Zeile
   (druckkarte-perks) sowie einen kleinen thematischen Icon-Akzent
   ueber dem Titel -- bewusst dezent (kleine Strich-Icons in Gold),
   kein unruhiges Layout, keine grossen neuen Illustrationen. */
.druckkarte-theme-icon {
  display: block;
  width: 22px;
  height: 22px;
  margin-bottom: 0.3rem;
  background-repeat: no-repeat;
  background-size: contain;
  opacity: 0.85;
}

.druckkarte-theme-icon-schule {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M4 5c3-1.5 6-1.5 8 0v14c-2-1.5-5-1.5-8 0V5Z' fill='none' stroke='%23c9a24d' stroke-width='1.4'/%3E%3Cpath d='M20 5c-3-1.5-6-1.5-8 0v14c2-1.5 5-1.5 8 0V5Z' fill='none' stroke='%23c9a24d' stroke-width='1.4'/%3E%3C/svg%3E");
}

.druckkarte-theme-icon-geburtstag {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M4 9h16v4H4z' fill='none' stroke='%23c9a24d' stroke-width='1.4'/%3E%3Cpath d='M6 13v7h12v-7' fill='none' stroke='%23c9a24d' stroke-width='1.4'/%3E%3Cpath d='M12 9v11M12 9c-1.5-3-5-3-5 0c0 0 2.5 0 5 0Zm0 0c1.5-3 5-3 5 0c0 0-2.5 0-5 0Z' fill='none' stroke='%23c9a24d' stroke-width='1.3'/%3E%3C/svg%3E");
}

/* Nutzeranfrage: die kleine goldene Trennlinie ueber der Vorteils-
   Zeile ist entfallen -- Karten sollen ruhiger/sauberer wirken. Der
   dadurch nicht mehr benoetigte Abstand (vorher margin+padding vor der
   Linie) ist zu einem einzelnen, kleineren margin-top zusammengefasst,
   damit kein unnoetig grosser Leerraum bleibt. */
.druckkarte-perks {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 0.5rem;
  margin-top: 0.9rem;
}

.druckkarte-perk {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.25rem;
  text-align: center;
}

.druckkarte-perk span:last-child {
  font-size: 0.68rem;
  line-height: 1.25;
  color: var(--color-parchment-dim);
}

.druckkarte-perk-icon {
  display: block;
  width: 18px;
  height: 18px;
  background-repeat: no-repeat;
  background-size: contain;
  opacity: 0.85;
}

.druckkarte-perk-icon-pdf {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M6 2h9l5 5v15H6z' fill='none' stroke='%23c9a24d' stroke-width='1.5'/%3E%3Cpath d='M15 2v5h5' fill='none' stroke='%23c9a24d' stroke-width='1.5'/%3E%3Cpath d='M9 13h6M9 16h6M9 10h3' stroke='%23c9a24d' stroke-width='1.2' stroke-linecap='round'/%3E%3C/svg%3E");
}

.druckkarte-perk-icon-print {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Crect x='6' y='9' width='12' height='7' fill='none' stroke='%23c9a24d' stroke-width='1.5'/%3E%3Cpath d='M8 9V4h8v5M8 16v4h8v-4' fill='none' stroke='%23c9a24d' stroke-width='1.5'/%3E%3C/svg%3E");
}

.druckkarte-perk-icon-heart {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 20C12 20 3 14 3 8.5C3 5.5 5.5 3 8.5 3C10 3 11.3 3.8 12 5C12.7 3.8 14 3 15.5 3C18.5 3 21 5.5 21 8.5C21 14 12 20 12 20Z' fill='none' stroke='%23c9a24d' stroke-width='1.5'/%3E%3C/svg%3E");
}

.druckkarte-perk-icon-gift {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M4 9h16v4H4z' fill='none' stroke='%23c9a24d' stroke-width='1.5'/%3E%3Cpath d='M6 13v7h12v-7' fill='none' stroke='%23c9a24d' stroke-width='1.5'/%3E%3Cpath d='M12 9v11M12 9c-1.5-3-5-3-5 0c0 0 2.5 0 5 0Zm0 0c1.5-3 5-3 5 0c0 0-2.5 0-5 0Z' fill='none' stroke='%23c9a24d' stroke-width='1.3'/%3E%3C/svg%3E");
}

.druckkarte-perk-icon-book {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M4 5c3-1.5 6-1.5 8 0v14c-2-1.5-5-1.5-8 0V5Z' fill='none' stroke='%23c9a24d' stroke-width='1.5'/%3E%3Cpath d='M20 5c-3-1.5-6-1.5-8 0v14c2-1.5 5-1.5 8 0V5Z' fill='none' stroke='%23c9a24d' stroke-width='1.5'/%3E%3C/svg%3E");
}

/* Nutzerkorrektur: die vom Nutzer gelieferte Produktkarten-Schale
   (img/produktkarte-schale.png) ist eine leere Design-Grafik --
   Aussenrahmen, Hintergrund, Ornamente, beide Bildflaechen-Rahmen,
   Zierlinien, Symbolleiste und die violette Button-Flaeche sind
   bereits vollstaendig in der Grafik enthalten. Sie liegt hier NUR
   als Hintergrundebene (aria-hidden, object-fit:contain, nie
   verzerrt/beschnitten). Alle echten Inhalte (Bilder, Texte, Button)
   sind absolut positionierte, echte HTML-Elemente, die exakt in die
   dafuer vorgesehenen leeren Bereiche der Grafik gesetzt werden --
   es liegt also nirgends eine zweite, fertig gestaltete Karte ueber
   der Grafik (anders als bei den Bewohnerkarten). Alle Positionen
   sind Prozentwerte relativ zur Bildgroesse (1536x1024), daher per
   container-type/cqw auch bei jeder Kartenbreite exakt deckungsgleich
   mit der Grafik. Nur EINE Musterkarte -- Bild/Text pro Karte bleiben
   austauschbar, keine festen Produktdaten in der Grafik. */
/* Nutzerkorrektur: Hintergrundgrafik erneut ausgetauscht
   (produktkarte-schale-v3.png). Anders als v2 sind hier Produktname,
   Beschreibung, Preis und Button-Flaeche wieder LEER -- nur die untere
   Info-Leiste ist fest eingebrannt. Neues Bild hat ein anderes
   Seitenverhaeltnis (1448x1086 statt 1536x1024) und leicht andere
   Rahmenproportionen, daher wurden ALLE Positionswerte unten frisch
   am neuen Bild vermessen (Koordinatenraster, 20px-Schritte), nicht
   einfach uebernommen. Wie bei v2 hat auch dieses Bild keine
   transparenten ausgeschnittenen Ecken, sondern ein deckendes,
   fast-weisses Eckenfeld -- border-radius + overflow:hidden rundet
   die Kartenaussenkante entsprechend der gemessenen Eckenrundung
   (~4.8% der Kartenbreite). */
.produktkarte-schale {
  position: relative;
  width: 100%;
  max-width: 700px;
  margin: 0 auto;
  aspect-ratio: 1448 / 1086;
  container-type: inline-size;
  border-radius: 4.5cqw;
  overflow: hidden;
}

.produktkarte-schale-bg {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: contain;
  pointer-events: none;
  z-index: 0;
}

.produktkarte-schale-image-large,
.produktkarte-schale-image-small {
  position: absolute;
  z-index: 1;
  display: flex;
  align-items: center;
  justify-content: center;
}

/* Nutzerkorrektur: Positionen/Groessen der beiden Bildflaechen waren
   zu grosszügig gemessen und ueberdeckten den goldenen Innenrahmen.
   Neu vermessen (fein abgestuftes Koordinatenraster ueber der Grafik,
   20px-Schritte) -- beide Boxen liegen jetzt exakt innerhalb der
   jeweiligen Rahmeninnenkante. Zusaetzliches Innenpadding sorgt fuer
   sichtbaren Abstand des <img> zum Goldrahmen; die Box selbst hat
   keinen eigenen Hintergrund, daher bleibt die lavendelfarbene Flaeche
   der Grafik ringsum sichtbar. */
.produktkarte-schale-image-large {
  left: 10.36%;
  top: 18.14%;
  width: 41.3%;
  height: 55.34%;
  /* Nutzerkorrektur: Prozent-Padding auf einem absolut positionierten
     Element bezieht sich immer auf die Breite des Containing Blocks
     (hier: die ganze Karte), NICHT auf die eigene, kleinere Box-
     Groesse -- dadurch war der bisherige Prozentwert viel zu gross
     und hat das Bild fast vollstaendig verschluckt. cqw bezieht sich
     dagegen zuverlaessig auf die Kartenbreite selbst. */
  padding: 7.5cqw;
}

.produktkarte-schale-image-small {
  left: 55.25%;
  top: 45.58%;
  width: 13.81%;
  height: 20.26%;
  /* kleinere Box als das grosse Bild -- padding entsprechend geringer
     in cqw, sonst waere die Box (nur ca. 16% der Kartenbreite) durch
     das Padding komplett aufgezehrt. */
  padding: 3.2cqw;
}

.produktkarte-schale-image-large img,
.produktkarte-schale-image-small img {
  max-width: 100%;
  max-height: 100%;
  object-fit: contain;
}

.produktkarte-schale-name {
  position: absolute;
  z-index: 1;
  left: 55.25%;
  top: 13.81%;
  width: 33.84%;
  height: 8.29%;
  display: flex;
  align-items: center;
  justify-content: center;
  margin: 0;
  font-family: var(--font-heading);
  font-size: clamp(0.85rem, 2.1cqw, 1.25rem);
  line-height: 1.15;
  color: var(--color-parchment);
  text-align: center;
}

.produktkarte-schale-desc {
  position: absolute;
  z-index: 1;
  left: 57.66%;
  top: 31.77%;
  width: 31.42%;
  height: 12.89%;
  margin: 0;
  font-size: clamp(0.62rem, 1.1cqw, 0.85rem);
  line-height: 1.35;
  color: var(--color-parchment-dim);
  text-align: center;
  overflow: hidden;
}

.produktkarte-schale-price {
  position: absolute;
  z-index: 1;
  left: 73.2%;
  top: 46.04%;
  width: 13.81%;
  height: 8.29%;
  display: flex;
  align-items: center;
  justify-content: center;
  margin: 0;
  font-family: var(--font-heading);
  font-size: clamp(0.72rem, 1.6cqw, 1rem);
  color: var(--color-gold-light);
  text-align: center;
}

.produktkarte-schale-cta {
  position: absolute;
  z-index: 1;
  left: 55.11%;
  top: 64.27%;
  width: 22.24%;
  height: 9.39%;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 0;
  border: none;
  border-radius: 999px;
  background: transparent;
  cursor: pointer;
  font-family: var(--font-heading);
  font-size: clamp(0.72rem, 1.55cqw, 1rem);
  line-height: 1;
  color: #fdf6ea;
  text-align: center;
  transition: filter 0.2s ease;
}

.produktkarte-schale-cta:hover {
  filter: brightness(1.15);
}

.produktkarte-schale-cta:focus-visible {
  outline: 2px solid rgba(var(--color-lavender-rgb), 0.85);
  outline-offset: 2px;
}

.produktkarte-schale-status {
  position: absolute;
  z-index: 1;
  left: 5.86%;
  top: 4.39%;
  width: 19.53%;
  height: 6.35%;
  display: flex;
  align-items: center;
  justify-content: center;
  margin: 0;
  font-size: clamp(0.55rem, 1.05cqw, 0.75rem);
  color: var(--color-gold-light);
  text-align: center;
}

/* Muster-Produktkarte "Malen & Entdecken" (Nutzervorgabe): exakte
   Duplizierung der auf Schreibzauber funktionierenden Karten-Technik
   -- eigene, seitenspezifische Klassen (.produktkarte-malen-schale*),
   damit Aenderungen hier NICHT die Schreibzauber-Karte beeinflussen
   (jede Kategorie liefert ihre eigene Grafik mit eigenen Mass-
   verhaeltnissen, eine gemeinsame Klasse waere nicht sicher wartbar).
   Nutzerkorrektur: Hintergrundgrafik erneut ausgetauscht
   (produktkarte-schale-malen-v2.png, loest die erste Version ab).
   Anders als die erste Version sind hier alle Inhaltsbereiche wieder
   LEER (kein eingebranntes "Produktbild folgt"-Symbol, kein Name/
   Preis/Button-Text) -- daher wieder ein sichtbarer Bild-Platzhalter
   (produktbild-platzhalter.svg) statt des transparenten 1x1-Bilds.
   Neues Seitenverhaeltnis (1448x1086 statt 1536x1024) und andere
   Rahmenproportionen -- alle Positionswerte frisch am neuen Bild
   vermessen. */
/* Nutzerkorrektur: Text-Ueberschrift "Malen & Entdecken" durch die vom
   Nutzer gelieferte fertige Grafik ersetzt (Titel bereits vollstaendig
   im Bild enthalten). Dezente Groesse (kein grosser Hauptheader),
   proportional skaliert, nie verzerrt/beschnitten -- gleiche
   Groessenstufen und mask-image-Kantenausfaserung wie bereits bei
   .schreibzauber-heading-banner-img etabliert (Bild ist ebenfalls
   vollstaendig opak, kein Alpha-Kanal). */
.malen-entdecken-heading-img {
  display: block;
  width: 100%;
  max-width: 420px;
  height: auto;
  margin: 0 auto;
  mask-image:
    linear-gradient(to right, transparent 0%, black 8%, black 92%, transparent 100%),
    linear-gradient(to bottom, transparent 0%, black 18%, black 82%, transparent 100%);
  mask-composite: intersect;
  -webkit-mask-image:
    linear-gradient(to right, transparent 0%, black 8%, black 92%, transparent 100%),
    linear-gradient(to bottom, transparent 0%, black 18%, black 82%, transparent 100%);
  -webkit-mask-composite: source-in;
}

@media (min-width: 640px) {
  .malen-entdecken-heading-img {
    max-width: 560px;
  }
}

@media (min-width: 1024px) {
  .malen-entdecken-heading-img {
    max-width: 780px;
  }
}

.produktkarte-malen-schale {
  width: 100%;
  max-width: 700px;
  margin: 0 auto;
}

/* Nutzeranfrage: die neue Grafik (produktkarte-schale-malen-v3.png)
   traegt Produktname, Unterzeile, Beschreibung, Feature-Liste,
   Buchcover-Illustration und Info-Leiste bereits vollstaendig
   eingebrannt -- sie dient hier ausschliesslich als visuelle Design-
   Ebene. Nur zwei echte, funktionale HTML-Elemente liegen darueber:
   der Preis-Text und der klickbare Warenkorb-Button (transparent,
   damit das Grafik-Design durchscheint), beide per Pixel-Scan exakt
   auf die beiden absichtlich leer gelassenen Flaechen der Grafik
   vermessen (Preis-Oval bzw. violette Button-Flaeche). Kein separater
   Detail-Bereich mehr noetig, die Karte ist wieder eine einzige,
   fest-proportionierte Artwork-Flaeche. */
.produktkarte-malen-schale-artwork {
  position: relative;
  width: 100%;
  aspect-ratio: 1452 / 1083;
  container-type: inline-size;
  border-radius: 4cqw;
  overflow: hidden;
}

.produktkarte-malen-schale-bg {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: contain;
  pointer-events: none;
  z-index: 0;
}

.produktkarte-malen-schale-price {
  position: absolute;
  z-index: 1;
  left: 58%;
  top: 59%;
  width: 31%;
  height: 9%;
  display: flex;
  align-items: center;
  justify-content: center;
  margin: 0;
  font-family: var(--font-heading);
  font-size: clamp(0.72rem, 1.9cqw, 1.1rem);
  color: var(--color-gold-light);
  text-align: center;
}

.produktkarte-malen-schale-cta {
  position: absolute;
  z-index: 1;
  left: 55.1%;
  top: 70.73%;
  width: 36.85%;
  height: 9.23%;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 0;
  border: none;
  border-radius: 999px;
  background: transparent;
  cursor: pointer;
  font-family: var(--font-heading);
  font-size: clamp(0.78rem, 1.9cqw, 1.15rem);
  line-height: 1;
  white-space: nowrap;
  color: #fdf6ea;
  text-align: center;
  transition: filter 0.2s ease;
}

.produktkarte-malen-schale-cta:hover {
  filter: brightness(1.15);
}

.produktkarte-malen-schale-cta:focus-visible {
  outline: 2px solid rgba(var(--color-lavender-rgb), 0.85);
  outline-offset: 2px;
}

/* Nutzeranfrage: rein informative Ankuendigungskarte (Band 2) --
   gleiche Breite/Gewichtung wie die Band-1-Produktkarte (max-width
   700px, mittig), aber ohne jede Overlay-Logik: die Grafik traegt den
   kompletten Inhalt bereits, daher nur ein einfaches, responsives
   <img> (width:100%, height:auto -- nie verzerrt/beschnitten). Leichter
   Rahmen-Schatten passend zum generischen .produktkarte-Look, da das
   Bild selbst ein flaches Rechteck mit eigenem Innenrahmen ist. */
.produktkarte-ankuendigung {
  width: 100%;
  max-width: 700px;
  margin: 1.75rem auto 0;
}

.produktkarte-ankuendigung-img {
  display: block;
  width: 100%;
  height: auto;
  border-radius: 20px;
  box-shadow: 0 16px 34px rgba(74, 63, 92, 0.14);
}

/* Nutzerkorrektur: kompakte Textseinleitung fuer "Saisonzauber" --
   reiner Text (keine Grafik geliefert), daher schlanke eigene Klassen
   analog zum bewaehrten .schreibzauber-intro-Muster (nur ohne Bilder). */
.saisonzauber-intro {
  max-width: 620px;
  margin: 0 auto;
  padding: 1.75rem 1.5rem 0.75rem;
  text-align: center;
}

.saisonzauber-intro-title {
  font-family: var(--font-heading);
  font-size: 2rem;
  color: var(--color-parchment);
  margin: 0 0 0.5rem;
}

.saisonzauber-intro-tagline {
  font-family: var(--font-heading);
  font-style: italic;
  font-size: 1.05rem;
  color: var(--color-gold-light);
  margin: 0 0 0.6rem;
}

.saisonzauber-intro-desc {
  font-size: 0.98rem;
  line-height: 1.5;
  color: var(--color-parchment-dim);
  max-width: 480px;
  margin: 0 auto 1.1rem;
}

/* Nutzerkorrektur: kompakte Textseinleitung fuer die neue Kategorie
   "Druckzauber" -- reiner Text (keine Grafik geliefert), 1:1 dasselbe
   Muster wie .saisonzauber-intro, nur mit eigenem Klassenpraefix. */
/* Nutzerkorrektur: der Textbereich (Titel/Tagline/Beschreibung) ist
   durch eine fertige Header-Grafik ersetzt, die zugehoerigen
   Textregeln (.druckzauber-intro-title/-tagline/-desc) sind damit
   entfallen. Die Sektion selbst bleibt als schlanker, zentrierter
   Container erhalten -- Breite an die Bildstufen unten angepasst,
   damit das Banner nicht durch einen zu engen Elterncontainer
   begrenzt wird. */
.druckzauber-intro {
  max-width: 780px;
  margin: 0 auto;
  /* Abstaende bewusst auf das sitewide .section-Mass (3.5rem) gesetzt,
     das die Schwesterseiten verwenden -- der bisherige, engere Wert
     stammte noch aus der Zeit als reiner Textblock und haette den
     Banner sichtbar dichter an Navigation und Produktkarten gedrueckt
     als auf den anderen Zauberladen-Reitern (nachgemessen: 48/64px
     statt 80/112px). */
  padding: 3.5rem 1.5rem;
  text-align: center;
}

/* Die Groessenstufen waren zuvor an der Bannerhoehe der Schwesterseiten
   ausgerichtet (Malen & Entdecken rendert auf Desktop rund 163px hoch)
   und lagen bei 330 / 420 / 500. Das passte, solange die Grafik nur den
   Titel trug.
   Die neue Grafik enthaelt zusaetzlich eine Unterzeile ("Magische
   PDF-Schaetze zum Ausdrucken, Ausschneiden und Loszaubern"), und die
   war bei 500px Breite nicht mehr zu entziffern -- die Zeile ist in der
   Vorlage rund 12 Bildpunkte hoch, bei 500px Darstellung blieben davon
   etwa 5 uebrig.
   Deshalb jetzt deutlich groesser. Die Grafik wiegt dadurch optisch
   mehr als die der Schwesterseiten; das ist gewollt, weil sie auch mehr
   zu sagen hat.
   Keine mask-image-Ausblendung noetig: das Bild hat einen echten
   Alphakanal und verschmilzt von selbst mit dem Seitenhintergrund. */
.druckzauber-heading-banner-img {
  display: block;
  width: 100%;
  max-width: 460px;
  height: auto;
  margin: 0 auto;
}

@media (min-width: 640px) {
  .druckzauber-heading-banner-img {
    max-width: 640px;
  }
}

@media (min-width: 1024px) {
  .druckzauber-heading-banner-img {
    max-width: 900px;
  }
}

/* Nutzerkorrektur: Musterkarten (Schulzauber, Lernzauber, Schulalltag,
   Geburtstagszauber) -- schlanker Abstand zwischen den Karten sowie
   zur Einleitung/Abschlussgrafik, passend zum bereits etablierten
   .section-Rhythmus der anderen Unterseiten. Eigener, seitenspezifischer
   Container statt .section-narrow (nur auf dieser Seite verwendet),
   damit ab 900px zwei kompakte Karten nebeneinander passen -- auf
   Mobile bleibt es automatisch bei einer Karte pro Reihe (kein
   flex-wrap/row unterhalb der Media Query). */
.druckzauber-cards-section {
  max-width: 1300px;
}

.druckzauber-cards {
  display: flex;
  flex-direction: column;
  gap: 2rem;
}

@media (min-width: 900px) {
  .druckzauber-cards {
    flex-direction: row;
    flex-wrap: wrap;
    justify-content: center;
  }

  .druckzauber-cards .produktkarte,
  .druckzauber-cards .produktkarte-schulpaket-card,
  .druckzauber-cards .produktkarte-bildkarte {
    flex: 1 1 calc(50% - 1rem);
  }
}

/* Nutzerkorrektur: Produktkarte "Mein Schulpaket" ist jetzt eine
   fertige Design-Grafik statt einzelner HTML-Bausteine. Die Grafik
   traegt Produktbild, Titel, Beschreibung und Preis bereits selbst --
   darueber liegen nur noch die beiden echten, funktionalen Buttons.
   Beide Flaechen sind in der Grafik absichtlich ohne Text, daher
   background:transparent (das Grafik-Design bleibt sichtbar) und
   sichtbarer Button-Text ohne Dopplung. Alle Positionswerte per
   Pixel-Scan direkt am Bild vermessen (1536x1024): violette Flaeche
   left 54.36% / top 66.11% / 33.86% breit / 9.18% hoch, helle Flaeche
   Innenkante des Goldrahmens left 54.10% / 33.60% breit, oben 75.78%
   bis unten 86.33% -- letztere minimal nach innen gesetzt, damit sich
   die beiden Klickflaechen garantiert nicht ueberlappen. cqw-Einheiten
   sorgen dafuer, dass die Schrift bei jeder Kartenbreite exakt
   mitskaliert. */
.produktkarte-schulpaket-card,
.produktkarte-bildkarte {
  position: relative;
  width: 100%;
  max-width: 700px;
  margin: 0 auto;
  container-type: inline-size;
}

.produktkarte-schulpaket-card-img,
.produktkarte-bildkarte-img {
  display: block;
  width: 100%;
  height: auto;
}

.produktkarte-schulpaket-card-cta,
.produktkarte-schulpaket-card-vorschau,
.produktkarte-bildkarte-cta,
.produktkarte-bildkarte-vorschau {
  position: absolute;
  z-index: 1;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 0;
  border: none;
  border-radius: 999px;
  background: transparent;
  cursor: pointer;
  font-family: var(--font-heading);
  line-height: 1.2;
  text-align: center;
  white-space: nowrap;
  transition: filter 0.2s ease;
}

.produktkarte-schulpaket-card-cta {
  left: 54.36%;
  top: 66.11%;
  width: 33.86%;
  height: 9.18%;
  /* Untergrenze bewusst niedrig: bei sehr schmalen Screens (320px,
     Karte dann nur ~272px breit) ist die Buttonflaeche nur noch ca.
     92px breit -- ein hoeheres Minimum liess den Text dort seitlich
     ueber die violette Flaeche hinauslaufen (nachgemessen: -5.2px). */
  font-size: clamp(0.64rem, 2.45cqw, 1.15rem);
  color: #fdf6ea;
}

.produktkarte-schulpaket-card-vorschau {
  left: 54.1%;
  top: 76%;
  width: 33.6%;
  height: 10.1%;
  font-size: clamp(0.62rem, 2.25cqw, 1.05rem);
  color: var(--color-gold-light);
}

.produktkarte-schulpaket-card-cta:hover,
.produktkarte-schulpaket-card-vorschau:hover,
.produktkarte-bildkarte-cta:hover,
.produktkarte-bildkarte-vorschau:hover {
  filter: brightness(1.12);
}

.produktkarte-schulpaket-card-cta:focus-visible,
.produktkarte-schulpaket-card-vorschau:focus-visible,
.produktkarte-bildkarte-cta:focus-visible,
.produktkarte-bildkarte-vorschau:focus-visible {
  outline: 2px solid rgba(var(--color-lavender-rgb), 0.85);
  outline-offset: 2px;
}

/* Positionswerte eigens an der Schulalltag-Grafik vermessen -- sie
   weichen von der Schulpaket-Karte ab (violette Flaeche sitzt hoeher
   und ist breiter), daher bewusst NICHT die Werte der anderen Karte
   uebernommen. Violett: 53.65-89.84% breit, 61.91-70.31% hoch.
   Helle Flaeche (Innenkante Goldrahmen): 53.97-89.26% breit,
   obere Goldlinie 72.46%, untere 79.88%. Beide leicht nach innen
   gesetzt, damit sich die Klickflaechen sicher nicht ueberlappen. */
.produktkarte-schulalltag-card .produktkarte-bildkarte-cta {
  left: 53.9%;
  top: 62.1%;
  width: 35.9%;
  height: 8%;
  font-size: clamp(0.64rem, 2.45cqw, 1.15rem);
  color: #fdf6ea;
}

.produktkarte-schulalltag-card .produktkarte-bildkarte-vorschau {
  left: 54%;
  top: 72.6%;
  width: 35.3%;
  height: 7.25%;
  font-size: clamp(0.62rem, 2.25cqw, 1.05rem);
  color: var(--color-gold-light);
}

/* Nutzerkorrektur: Muster-Produktkarte "Saisonzauber" (Adventskalender)
   komplett vereinfacht -- die neue Master-Grafik hat Titel,
   Beschreibung und "Preis folgt" bereits fest eingebrannt, auf
   ausdruecklichen Nutzerwunsch daher KEINE echten HTML-Textfelder mehr
   darueber (waere eine unnoetige zweite Ebene ueber fertigem Text).
   Die Karte ist jetzt ein einfaches, responsives <img> in einem
   position:relative-Wrapper -- kein aspect-ratio-Container/keine
   container-query-Einheiten mehr noetig, da keine anderen Elemente
   mehr prozentual zur Bildgroesse positioniert werden muessen ausser
   dem Warenkorb-Button. Die violette Flaeche in der Grafik ist selbst
   leer (kein Text), daher bleibt dort ein echter, transparenter,
   klickbarer Button mit sichtbarem Text -- keine Dopplung. */
.produktkarte-saison-card {
  position: relative;
  width: 100%;
  max-width: 700px;
  margin: 0 auto;
  container-type: inline-size;
}

.produktkarte-saison-card-img {
  display: block;
  width: 100%;
  height: auto;
}

.produktkarte-saison-card-cta {
  position: absolute;
  z-index: 1;
  left: 54.91%;
  top: 65.84%;
  width: 23.83%;
  height: 9.21%;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 0;
  border: none;
  border-radius: 999px;
  background: transparent;
  cursor: pointer;
  font-family: var(--font-heading);
  font-size: clamp(0.72rem, 1.9cqw, 1rem);
  line-height: 1;
  color: #fdf6ea;
  text-align: center;
  transition: filter 0.2s ease;
}

.produktkarte-saison-card-cta:hover {
  filter: brightness(1.15);
}

.produktkarte-saison-card-cta:focus-visible {
  outline: 2px solid rgba(var(--color-lavender-rgb), 0.85);
  outline-offset: 2px;
}

/* Nutzeranfrage: "Vorschau ansehen"-Funktion fuer alle Produktkarten im
   Zauberladen (Druckzauber, Malen & Entdecken, Schreib- & Sammelzauber,
   Saisonzauber, sowie alle kuenftigen Kategorien). EIN gemeinsames,
   wiederverwendbares Overlay-System: pro Karte nur ein zusaetzlicher,
   bewusst kleinerer/dezenterer Trigger-Button (.produkt-vorschau-btn,
   ggf. in einer zentrierten .produkt-vorschau-btn-row unterhalb der
   Karte) -- die eigentliche Modal-Struktur wird von
   js/produkt-vorschau.js EINMAL pro Seite erzeugt und je nach
   angeklicktem Trigger per data-preview-images (JSON-Array, aktuell
   ueberall noch leer "[]") befuellt, nicht pro Karte dupliziert.
   Bestehende Karten-Gestaltung (Artwork, Texte, Preise, Warenkorb-
   Button) bleibt dadurch komplett unangetastet -- die Vorschau-Bilder
   erscheinen ausschliesslich im Modal, nie in der Karte selbst, daher
   koennen sie die Karten auch nicht verschieben. */
.produkt-vorschau-btn-row {
  text-align: center;
}

.produkt-vorschau-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 0.35em;
  margin-top: 0.6rem;
  font-family: var(--font-heading);
  font-size: 0.78rem;
  line-height: 1.2;
  color: var(--color-gold-light);
  text-align: center;
  background: transparent;
  border: 1px solid rgba(var(--color-gold-rgb), 0.55);
  border-radius: 999px;
  padding: 0.4rem 1.1rem;
  cursor: pointer;
  transition: background 0.2s ease, color 0.2s ease;
}

.produkt-vorschau-btn:hover,
.produkt-vorschau-btn:focus-visible {
  background: rgba(var(--color-gold-rgb), 0.14);
  color: var(--color-parchment);
}

.produkt-vorschau-backdrop {
  position: fixed;
  inset: 0;
  z-index: 2000;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 1.5rem;
  background: rgba(18, 13, 22, 0.6);
  backdrop-filter: blur(3px);
  opacity: 0;
  pointer-events: none;
  transition: opacity 0.25s ease;
}

/* Bewusst nur opacity/pointer-events statt visibility zum Ein-/
   Ausblenden: visibility:hidden wuerde ein sofortiges focus() auf den
   Schliessen-Button beim Oeffnen verhindern, solange der Uebergang
   noch nicht vom Browser aufgeloest wurde (race condition). opacity
   blockiert den Fokus nie, aria-hidden (siehe JS) haelt das Modal im
   geschlossenen Zustand trotzdem aus dem Accessibility-Baum heraus. */
.produkt-vorschau-backdrop.is-open {
  opacity: 1;
  pointer-events: auto;
}

body.produkt-vorschau-locked {
  overflow: hidden;
}

.produkt-vorschau-modal {
  position: relative;
  width: 100%;
  max-width: 620px;
  max-height: 90vh;
  overflow-y: auto;
  background: #fdf6ea;
  border-radius: 20px;
  padding: 2.4rem 1.5rem 1.75rem;
  box-shadow: 0 24px 60px rgba(18, 13, 22, 0.4);
  transform: translateY(14px) scale(0.97);
  transition: transform 0.25s ease;
}

.produkt-vorschau-backdrop.is-open .produkt-vorschau-modal {
  transform: translateY(0) scale(1);
}

@media (min-width: 640px) {
  .produkt-vorschau-modal {
    padding: 2.6rem 2.25rem 2rem;
  }
}

.produkt-vorschau-close {
  position: absolute;
  top: 0.75rem;
  right: 0.75rem;
  width: 36px;
  height: 36px;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 0;
  border: none;
  border-radius: 50%;
  background: rgba(var(--color-lavender-rgb), 0.18);
  color: var(--color-ink-deep);
  font-size: 1.4rem;
  line-height: 1;
  cursor: pointer;
  transition: background 0.2s ease;
}

.produkt-vorschau-close:hover,
.produkt-vorschau-close:focus-visible {
  background: rgba(var(--color-lavender-rgb), 0.32);
}

.produkt-vorschau-title {
  margin: 0 0 1.1rem;
  font-family: var(--font-heading);
  font-size: 1.35rem;
  text-align: center;
  color: var(--color-ink-deep);
}

/* Nutzerkorrektur: der Viewer hatte eine feste aspect-ratio von 4/3
   (Querformat). Vorschaubilder im Hochformat -- wie die Malbuch-
   Collage (1122x1402, Verhaeltnis 0.8) -- wurden dadurch zwar nicht
   beschnitten (object-fit:contain), aber stark in die Breite
   "letterboxed" und dabei auf ca. 60% der verfuegbaren Breite
   verkleinert, sodass die Beispielseiten kaum lesbar waren. Jetzt
   bestimmt das Bild selbst die Hoehe des Containers (keine feste
   aspect-ratio mehr), begrenzt nur durch max-width/max-height --
   dadurch ist jedes Bild immer vollstaendig sichtbar, mittig,
   unverzerrt und so gross wie moeglich, egal ob Hoch- oder Querformat.
   Kein overflow:hidden mehr, damit nie etwas abgeschnitten wird; das
   Modal selbst scrollt bei Bedarf (max-height:90vh). */
.produkt-vorschau-viewer {
  position: relative;
  width: 100%;
  min-height: 160px;
  padding: 0.5rem;
  border-radius: 14px;
  background: rgba(var(--color-lavender-rgb), 0.14);
  display: flex;
  align-items: center;
  justify-content: center;
}

.produkt-vorschau-viewer-img {
  display: block;
  width: auto;
  max-width: 100%;
  height: auto;
  max-height: 72vh;
  margin: 0 auto;
  object-fit: contain;
  object-position: center;
}

.produkt-vorschau-empty {
  margin: 0;
  padding: 0 1.5rem;
  text-align: center;
  font-style: italic;
  font-size: 0.9rem;
  color: var(--color-parchment-dim);
}

.produkt-vorschau-arrow {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  width: 38px;
  height: 38px;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 0;
  border: none;
  border-radius: 50%;
  background: rgba(253, 246, 234, 0.85);
  color: var(--color-ink-deep);
  font-size: 1rem;
  cursor: pointer;
  box-shadow: 0 4px 10px rgba(18, 13, 22, 0.2);
  transition: background 0.2s ease;
}

.produkt-vorschau-arrow:hover,
.produkt-vorschau-arrow:focus-visible {
  background: #fff;
}

.produkt-vorschau-arrow--prev {
  left: 0.6rem;
}

.produkt-vorschau-arrow--next {
  right: 0.6rem;
}

/* [hidden] hat dieselbe Spezifitaet wie eine Klasse -- ohne diese
   Regel wuerde unser eigenes display:flex (oben) das display:none
   der UA-Stylesheet-Regel fuer [hidden] in der Cascade ueberstimmen. */
.produkt-vorschau-arrow[hidden],
.produkt-vorschau-thumbs[hidden] {
  display: none;
}

.produkt-vorschau-thumbs {
  display: flex;
  gap: 0.5rem;
  margin-top: 0.85rem;
  padding-bottom: 0.2rem;
  overflow-x: auto;
}

.produkt-vorschau-thumb {
  flex: 0 0 auto;
  width: 56px;
  height: 56px;
  padding: 0;
  border: 2px solid transparent;
  border-radius: 8px;
  overflow: hidden;
  background: rgba(var(--color-lavender-rgb), 0.14);
  cursor: pointer;
}

.produkt-vorschau-thumb img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.produkt-vorschau-thumb.is-active {
  border-color: var(--color-violet);
}

.produkt-vorschau-note {
  margin: 1.15rem 0 0;
  font-size: 0.85rem;
  line-height: 1.5;
  text-align: center;
  color: var(--color-parchment-dim);
}

.produkt-vorschau-cart-btn {
  display: block;
  width: 100%;
  max-width: 280px;
  margin: 1rem auto 0;
  font-family: var(--font-heading);
  font-size: 0.95rem;
  color: #fdf6ea;
  background: linear-gradient(160deg, #6b3fa0, #4a1f6b);
  border: 1.5px solid rgba(var(--color-gold-rgb), 0.6);
  border-radius: 999px;
  padding: 0.65rem 1.4rem;
  cursor: pointer;
  transition: transform 0.2s ease, box-shadow 0.2s ease;
}

.produkt-vorschau-cart-btn:hover,
.produkt-vorschau-cart-btn:focus-visible {
  transform: translateY(-2px);
  box-shadow: 0 8px 18px rgba(74, 31, 107, 0.3);
}

/* Nutzerkorrektur: gemeinsame Abschlussgrafik "Hier wird noch kraeftig
   gezaubert!" fuer Schreibzauber/Malen & Entdecken/Sammelzauber/
   Saisonzauber (bewusst NICHT auf der Zauberladen-Hauptseite) --
   rein dekorativ, kein Text/Button darueber, keine eigene Box/kein
   Rahmen/Schatten. Bild hat bereits weiche transparente Aussenkanten.
   Nutzerkorrektur: deutlich verkleinert (war zu dominant) -- Mobile
   90% Breite, Tablet max. 420px, Desktop max. 500px. */
/* Nutzeranfrage: neue, schmalere Footer-Banner-Grafik (v2, 2172x724
   statt zuvor 1536x1024) -- deutlich breiter/flacher, daher die
   max-width-Stufen erhoeht, damit das Banner bei gleicher Bildhoehe
   nicht "verloren"/zu klein wirkt, sondern wie ein ruhiger, in normaler
   Groesse sitzender Seitenabschluss (Hoehe bei 700px Breite ca. 233px,
   passend zur bereits etablierten Hoehe der schmalen Header-Banner auf
   anderen Zauberladen-Seiten). Etwas mehr Luft nach oben/unten fuer
   einen ordentlichen, freistehenden Abschluss. */
.zauberladen-noch-in-arbeit {
  margin: 48px auto 24px;
  text-align: center;
}

.zauberladen-noch-in-arbeit-img {
  display: inline-block;
  width: 92%;
  height: auto;
}

@media (min-width: 640px) {
  .zauberladen-noch-in-arbeit-img {
    width: 85%;
    max-width: 600px;
  }
}

@media (min-width: 1024px) {
  .zauberladen-noch-in-arbeit-img {
    max-width: 700px;
  }
}

/* Nutzerkorrektur: "Was entsteht als Naechstes?" (Ueberschrift + zwei
   grosse Eintraege) vollstaendig entfernt und durch eine winzige,
   beilaeufige Randnotiz ersetzt -- keine Ueberschrift, keine Kacheln,
   kein eigener grosser Abschnitt. Nur ein kleiner Sternakzent, zwei
   kurze Zeilen Text, dezenter Creme-/Lavendel-Hintergrundschimmer,
   deutlich kleiner/schmaler als alle anderen Shopbereiche. */
.zauberladen-note {
  max-width: 460px;
  margin: 1.5rem auto 0;
  padding: 0.9rem 1.25rem;
  border-radius: 14px;
  background: radial-gradient(ellipse at center, rgba(var(--color-lavender-rgb), 0.14) 0%, rgba(201, 138, 160, 0.08) 55%, transparent 100%);
  text-align: center;
}

.zauberladen-note-accent {
  display: block;
  width: 14px;
  height: 14px;
  margin: 0 auto 0.4rem;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 0c0.8 4.4 2.8 6.4 7.2 7.2C14.8 8 12.8 10 12 14.4 11.2 10 9.2 8 4.8 7.2 9.2 6.4 11.2 4.4 12 0Z' fill='%23c9a24d'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-size: contain;
  opacity: 0.8;
}

.zauberladen-note-headline {
  font-family: var(--font-heading);
  font-style: italic;
  font-size: 0.88rem;
  color: var(--color-gold-light);
  margin: 0 0 0.3rem;
}

.zauberladen-note-text {
  font-size: 0.78rem;
  line-height: 1.45;
  color: var(--color-parchment-dim);
  margin: 0;
}

/* Maerchenhafter Abschluss (Nutzerkorrektur): fertiges Abschlussbild
   (Martina mit Emma, Loomus und Fina) ersetzt den bisherigen
   Platzhalter + Textzeilen vollstaendig. Das Bild selbst ist ein
   rechteckiges Foto/Illustration ohne eigene Transparenz -- die vom
   Nutzer gewuenschte weiche Randausblendung (kein sichtbarer
   rechteckiger Rand, besonders links/rechts/unten) passiert daher rein
   ueber eine CSS-Maske (mask-image, radialer Verlauf), OHNE die
   Bilddatei selbst zu veraendern: der Kern bleibt voll deckend, zu den
   Kanten hin blendet die Maske auf transparent aus, wodurch das Bild
   weich in die helle Seitenflaeche uebergeht statt in einer harten Box
   zu enden. Bewusst kein Rahmen/Schattenkasten/weisser Rand ergaenzt.
   Nutzerkorrektur: Bild deutlich verkleinert (wirkt jetzt wie eine
   kleine Abschlusskarte/Postkarte statt eines zweiten grossen Banners
   -- viel Luft aussen herum, kompakte Sektionshoehe). */
.zauberladen-closing {
  max-width: 700px;
  margin: 0 auto;
  padding: 1rem 1.5rem 2rem;
  text-align: center;
}

.zauberladen-closing-img {
  display: block;
  width: 100%;
  max-width: 420px;
  height: auto;
  margin: 0 auto;
  -webkit-mask-image: radial-gradient(ellipse 78% 82% at center 44%, #000 45%, transparent 100%);
  mask-image: radial-gradient(ellipse 78% 82% at center 44%, #000 45%, transparent 100%);
  -webkit-mask-repeat: no-repeat;
  mask-repeat: no-repeat;
  -webkit-mask-size: 100% 100%;
  mask-size: 100% 100%;
}

@media (min-width: 640px) {
  .zauberladen-closing-img {
    max-width: 520px;
  }
}

@media (min-width: 1024px) {
  .zauberladen-closing-img {
    max-width: 580px;
  }
}

/* Blog GESAMTSEITE (blog.html): durchgehender Creme-/Rose-Papierhintergrund
   fuer den kompletten Inhaltsbereich unterhalb der Navigation (Header-
   Video, Auswahlkarten, aktuelle Beitraege, Entstehungsreise, alle
   zukuenftigen Blogbeitraege) -- ersetzt die vorher sichtbaren
   salbeigruenen Seitenflaechen von body.theme-pastel-green (Navigation
   bleibt bewusst unveraendert gruen, nur <main> bekommt hier einen
   eigenen Hintergrund). Dieselben fest verdrahteten Cremeton-Werte wie
   bei den einzelnen Abschnitten weiter unten, damit alles nahtlos
   ineinander uebergeht -- keine einzelnen "Karten" mit eigenem
   Hintergrund/Rand mehr. */
.blog-page {
  position: relative;
  background:
    radial-gradient(ellipse 55% 30% at 12% 6%, rgba(232, 180, 200, 0.14) 0%, transparent 100%),
    radial-gradient(ellipse 55% 30% at 88% 40%, rgba(163, 184, 157, 0.09) 0%, transparent 100%),
    radial-gradient(ellipse 55% 30% at 15% 85%, rgba(232, 180, 200, 0.12) 0%, transparent 100%),
    linear-gradient(180deg, #fdf7ed 0%, #faf1e2 45%, #f7ecdc 100%);
}

/* Animierter Blog-Header (blog.html): gleiches Prinzip wie die uebrigen
   .site-header-bg-video-Wrapper (siehe .home-header-wrap oben) UND
   dieselbe Position im Markup -- VOR der Navigation (KORREKTUR: stand
   zwischenzeitlich faelschlich NACH der Navigation, wodurch die
   Hauptnav abweichend von Home/Autorin/Lumaria direkt am oberen
   Seitenrand begann; jetzt exakt wie dort). Dadurch auch kein Mask-
   Fade an der Unterkante mehr noetig -- direkt darunter kommt die
   (undurchsichtige) Navigation, kein Seiteninhalt zum Ausblenden mehr,
   genau wie bei Home/Autorin/Lumaria. */
.blog-header-wrap {
  position: relative;
  width: 100%;
  height: 460px;
  overflow: hidden;
}

@media (max-width: 900px) {
  .blog-header-wrap {
    height: 380px;
  }
}

@media (max-width: 640px) {
  .blog-header-wrap {
    height: 300px;
  }
}

/* Wie bei HOME/Autorin/Lumaria (siehe .site-header-bg-overlay-
   Ueberschreibungen oben): dieselbe geteilte .site-header-bg-overlay
   wuerde das Video milchig wirken lassen, daher hier deaktiviert. */
.blog-header-wrap .site-header-bg-overlay {
  background: none;
}

/* Headertext als echte HTML-Ebene ueber dem Video (NICHT ins Video
   integriert). Position/Groesse per Helligkeits-Sampling mehrerer
   Videoframes ermittelt: oben-mittig ist durchgaengig hell/ruhig,
   Schreibtisch/Feder sitzen eher links, die goldene Lichtspur und
   die Landschaft eher in der unteren Bildhaelfte -- daher bewusst NUR
   im oberen Bereich des Wrappers verankert (top, nicht vertikal
   zentriert) und schmal genug (min(620px, 80%)), um nicht bis an die
   seitlichen Bildkanten heranzureichen. Kein Hintergrundkasten: ein
   sehr sanftes helles Glow-Text-Shadow uebernimmt die Lesbarkeit auf
   wechselnd hellen/dunklen Videobereichen. */
.blog-header-text {
  position: absolute;
  z-index: 1;
  top: 9%;
  left: 50%;
  transform: translateX(-50%);
  width: min(620px, 80%);
  text-align: center;
}

.blog-header-eyebrow {
  font-family: var(--font-heading);
  font-size: 0.78rem;
  font-weight: 600;
  letter-spacing: 0.13em;
  text-transform: uppercase;
  color: #c9a26a;
  margin: 0 0 0.9rem;
  text-shadow: 0 1px 12px rgba(255, 252, 244, 0.7);
}

.blog-header-heading {
  font-family: var(--font-heading);
  font-size: 3.1rem;
  font-weight: 700;
  line-height: 1.15;
  color: #6b4226;
  margin: 0 0 0.8rem;
  text-shadow: 0 2px 22px rgba(255, 252, 244, 0.75), 0 1px 4px rgba(255, 252, 244, 0.6);
}

.blog-header-subheading {
  font-family: var(--font-body);
  font-size: 1.15rem;
  line-height: 1.5;
  color: #6b5342;
  margin: 0 0 0.85rem;
  text-shadow: 0 1px 14px rgba(255, 252, 244, 0.7);
}

.blog-header-closing {
  font-family: var(--font-body);
  font-style: italic;
  font-size: 0.92rem;
  line-height: 1.55;
  color: #b3924f;
  max-width: 440px;
  margin: 0 auto;
  text-shadow: 0 1px 12px rgba(255, 252, 244, 0.65);
}

@media (max-width: 900px) {
  .blog-header-heading {
    font-size: 2.4rem;
  }

  .blog-header-subheading {
    font-size: 1.05rem;
  }
}

@media (max-width: 640px) {
  .blog-header-text {
    top: 7%;
    width: 88%;
  }

  .blog-header-eyebrow {
    font-size: 0.66rem;
    letter-spacing: 0.09em;
    margin-bottom: 0.7rem;
  }

  .blog-header-heading {
    font-size: 1.8rem;
    margin-bottom: 0.55rem;
  }

  .blog-header-subheading {
    font-size: 0.95rem;
    margin-bottom: 0.6rem;
  }

  .blog-header-closing {
    font-size: 0.82rem;
  }
}

/* Sanftes, einmaliges Erscheinen beim Laden -- KEIN scroll-getriggertes
   [data-reveal] (siehe dort), da der Header sofort sichtbar ist und
   nicht erst beim Scrollen erscheinen soll. Reihenfolge wie gefordert:
   1) Kategoriezeile, 2) Hauptueberschrift, 3) beide unteren Zeilen
   gemeinsam. animation-delay statt transition-delay -- hier unkritisch,
   da dieser Text keine spaeteren Hover-Uebergaenge auf denselben
   Eigenschaften hat (siehe Hover-Lag-Problem bei den FAQ-Karten). */
@keyframes blog-header-text-in {
  from { opacity: 0; transform: translateY(14px); }
  to   { opacity: 1; transform: translateY(0); }
}

.blog-header-eyebrow,
.blog-header-heading,
.blog-header-subheading,
.blog-header-closing {
  opacity: 0;
  animation: blog-header-text-in 0.9s ease forwards;
}

.blog-header-eyebrow    { animation-delay: 0.2s; }
.blog-header-heading    { animation-delay: 0.65s; }
.blog-header-subheading { animation-delay: 1.1s; }
.blog-header-closing    { animation-delay: 1.1s; }

@media (prefers-reduced-motion: reduce) {
  .blog-header-eyebrow,
  .blog-header-heading,
  .blog-header-subheading,
  .blog-header-closing {
    opacity: 1;
    animation: none;
    transform: none;
  }
}

/* Kleiner goldener Trenner zwischen der Entstehungsreise und "Kinder
   verstehen & begleiten" -- bewusst dieselbe Linie-Raute-Linie-
   Zierlinie wie .home-section-divider/.ursprung-story-divider, als
   EIGENE Klasse nachgebaut (siehe Kommentar bei .home-section-divider
   zur Begruendung: keine geteilte Klasse ueber Seiten hinweg). Die
   Raute (.blog-section-divider-mark) MUSS width/height explizit
   gesetzt bekommen -- ohne das faellt das SVG auf seine eigene, viel
   groessere intrinsische Groesse zurueck (Bugfix: war hier versehentlich
   beim Entfernen der alten Timeline-CSS mitgeloescht worden). */
.blog-section-divider {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 12px;
  max-width: 200px;
  margin: 0 auto;
  padding: 3.5rem 1.5rem;
}

.blog-section-divider-line {
  flex: 1;
  height: 1px;
}

.blog-section-divider-line:first-child {
  background: linear-gradient(to right, transparent, #caa356 100%);
}

.blog-section-divider-line:last-child {
  background: linear-gradient(to left, transparent, #caa356 100%);
}

.blog-section-divider-mark {
  width: 9px;
  height: 9px;
  flex-shrink: 0;
  opacity: 0.85;
}

@media (max-width: 640px) {
  .blog-section-divider {
    padding: 2.25rem 1.5rem;
  }
}

/* "Neu im Tintenzauber-Magazin" (blog.html): jetzt direkt nach den
   beiden Auswahlkarten (siehe .blog-choice oben), damit Besucher:innen
   sofort aktuelle Inhalte sehen. Zeigt bewusst nur die zwei aktuellsten
   echten Beitraege (siehe Vorgabe -- keine erfundenen Platzhalter mehr)
   und wirkt dadurch geraeumiger als die vorherigen vier schmalen
   Karten: nur 2 Spalten, groesseres Bildformat (siehe .blog-latest-
   card-media 16:10 statt 4:3). Karten sind echte, voll anklickbare
   <a>-Elemente (siehe .blog-latest-card unten), verlinken direkt auf
   die jeweilige Artikelseite. */
.blog-latest {
  max-width: 1100px;
  margin: 3.5rem auto 0;
  padding: 0 1.75rem;
}

.blog-latest-heading {
  font-family: var(--font-heading);
  font-size: 2rem;
  font-weight: 700;
  color: #8a5a3a;
  text-align: center;
  margin: 0 0 0.6rem;
}

.blog-latest-intro {
  font-family: var(--font-body);
  font-style: italic;
  font-size: 1rem;
  color: #6b5342;
  text-align: center;
  margin: 0 0 2.5rem;
}

.blog-latest-grid {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 2rem;
}

@media (max-width: 760px) {
  .blog-latest-grid {
    grid-template-columns: 1fr;
    gap: 1.75rem;
  }
}

/* Volle Kartenflaeche anklickbar (<a> statt <article>), sehr sanftes
   Anheben beim Hover -- bewusst KEIN Bild-Zoom (siehe Vorgabe "kein
   Zoom, keine starke Animation"). text-decoration/color:inherit heben
   die Browser-Standardformatierung fuer Links auf, damit sich an der
   Optik nichts aendert. */
.blog-latest-card {
  display: flex;
  flex-direction: column;
  background: #fffdf9;
  border-radius: 18px;
  overflow: hidden;
  box-shadow: 0 8px 22px rgba(139, 105, 60, 0.09);
  text-decoration: none;
  color: inherit;
  transition: transform 0.3s ease, box-shadow 0.3s ease;
}

.blog-latest-card:hover,
.blog-latest-card:focus-visible {
  transform: translateY(-4px);
  box-shadow: 0 14px 30px rgba(139, 105, 60, 0.14);
}

.blog-latest-card-media {
  position: relative;
  display: block;
  aspect-ratio: 16 / 10;
  overflow: hidden;
}

.blog-latest-card-media img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
}

/* Neutraler Platzhalter fuer noch nicht vorhandene Beitragsbilder
   (siehe Vorgabe -- kein erfundenes/generiertes Bild). Fuellt seinen
   Elternrahmen vollstaendig (Kartenbild ODER Artikel-Hero, je nach
   Kontext bestimmt die umgebende Klasse das Seitenverhaeltnis), zeigt
   nur eine sehr dezente, halbtransparente Feder mittig. */
.blog-post-image-placeholder {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  height: 100%;
  background: linear-gradient(135deg, #f6ecf3 0%, #fdf7ed 100%);
}

.blog-post-image-placeholder img {
  width: 34px;
  height: auto;
  opacity: 0.4;
}

/* Fuer Interview-Beitraege ohne Titelbild bewusst KEIN Feder-Icon (siehe
   Vorgabe) -- nur eine ruhige, zur Interview-Farbwelt passende Flaeche,
   bis das echte Bild nachgereicht wird. */
.blog-interview-image-placeholder {
  display: block;
  width: 100%;
  height: 100%;
  background: linear-gradient(135deg, #f3ecf7 0%, #fdf7ed 100%);
}

/* Interviewkarten wirken etwas persoenlicher als normale Artikelkarten
   (zartes Violett), bleiben aber in Form/Schatten/Radius identisch zur
   bestehenden Kartenoptik. */
.blog-latest-card.is-interview,
.blog-featured-card.is-interview {
  background: linear-gradient(160deg, #fffdf9 0%, #f8f2fb 100%);
  border: 1px solid rgba(154, 122, 200, 0.18);
}

.blog-latest-card-tag {
  display: inline-block;
  align-self: flex-start;
  font-family: var(--font-heading);
  font-size: 0.68rem;
  font-weight: 700;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  padding: 0.3rem 0.7rem;
  border-radius: 999px;
  margin: 1.1rem 0 0 1.1rem;
}

.blog-latest-card-tag-diary {
  background: #f6dde2;
  color: #9c4a5a;
}

.blog-latest-card-tag-kids {
  background: #e3ece1;
  color: #4c6b4f;
}

.blog-latest-card-tag-interview {
  background: #efe6f5;
  color: #6b4f8a;
}

.blog-latest-card h3 {
  font-family: var(--font-heading);
  font-size: 1.12rem;
  font-weight: 700;
  line-height: 1.3;
  color: #8a5a3a;
  margin: 0.7rem 1.1rem 0.4rem;
}

.blog-latest-card p {
  font-family: var(--font-body);
  font-size: 0.92rem;
  line-height: 1.5;
  color: #6b5342;
  margin: 0 1.1rem 1rem;
}

.blog-latest-card-link {
  font-family: var(--font-heading);
  font-size: 0.85rem;
  font-weight: 600;
  color: #b3924f;
  margin: 0 1.1rem 1.1rem;
}

.blog-latest-card-date {
  font-family: var(--font-body);
  font-size: 0.78rem;
  color: #a68d6f;
  margin: -0.3rem 1.1rem 0.6rem;
}

@media (max-width: 640px) {
  .blog-latest {
    margin-top: 2.5rem;
  }

  .blog-latest-heading {
    font-size: 1.6rem;
  }

  .blog-latest-intro {
    margin-bottom: 1.75rem;
  }
}

/* "Neu im Tintenzauber-Magazin": 1 grosser Aufmacher (neuester Artikel)
   + 2 kleinere Beitraege daneben, statt gleich grosser Karten -- fuer
   eine redaktionellere, magazinartigere Hierarchie. Etwas breiter als
   der Standard-Magazin-Contentbereich, damit fuer den Aufmacher genug
   Platz bleibt. Karten werden automatisch aus magazin-data.js erzeugt
   (siehe js/magazin-render.js). */
.blog-latest-featured {
  max-width: 1220px;
}

.blog-featured-grid {
  display: grid;
  grid-template-columns: 1.5fr 1fr;
  gap: 2rem;
  align-items: stretch;
}

.blog-featured-side {
  display: flex;
  flex-direction: column;
  gap: 1.75rem;
}

.blog-featured-card {
  position: relative;
  display: flex;
  flex-direction: column;
  background: #fffdf9;
  border-radius: 18px;
  overflow: hidden;
  box-shadow: 0 8px 22px rgba(139, 105, 60, 0.09);
  text-decoration: none;
  color: inherit;
  transition: transform 0.3s ease, box-shadow 0.3s ease;
}

.blog-featured-card:hover,
.blog-featured-card:focus-visible {
  transform: translateY(-4px);
  box-shadow: 0 14px 30px rgba(139, 105, 60, 0.14);
}

.blog-featured-card-media {
  position: relative;
  display: block;
  overflow: hidden;
}

.blog-featured-card-media img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.blog-featured-card-main {
  height: 100%;
}

.blog-featured-card-main .blog-featured-card-media {
  aspect-ratio: 16 / 11;
}

.blog-featured-card-main h3 {
  font-family: var(--font-heading);
  font-size: 1.55rem;
  font-weight: 700;
  line-height: 1.28;
  color: #8a5a3a;
  margin: 1rem 1.5rem 0.6rem;
}

.blog-featured-card-main p {
  font-family: var(--font-body);
  font-size: 1rem;
  line-height: 1.6;
  color: #6b5342;
  margin: 0 1.5rem 0.9rem;
}

.blog-featured-card-main .blog-latest-card-tag {
  margin: 1.4rem 0 0 1.5rem;
}

.blog-featured-card-main .blog-latest-card-date {
  margin: -0.4rem 1.5rem 0.7rem;
}

.blog-featured-card-main .blog-latest-card-link {
  font-size: 0.95rem;
  margin: 0 1.5rem 1.4rem;
}

.blog-featured-card-small .blog-featured-card-media {
  aspect-ratio: 16 / 9;
}

.blog-featured-card-small h3 {
  font-family: var(--font-heading);
  font-size: 1.02rem;
  font-weight: 700;
  line-height: 1.3;
  color: #8a5a3a;
  margin: 0.85rem 1.1rem 0.35rem;
}

.blog-featured-card-small p {
  font-family: var(--font-body);
  font-size: 0.85rem;
  line-height: 1.5;
  color: #6b5342;
  margin: 0 1.1rem 0.75rem;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

.blog-featured-card-small .blog-latest-card-link {
  font-size: 0.82rem;
}

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

  .blog-featured-side {
    flex-direction: row;
  }

  .blog-featured-side .blog-featured-card-small {
    flex: 1;
  }
}

@media (max-width: 640px) {
  .blog-featured-side {
    flex-direction: column;
  }
}

/* Dezente Formatkennzeichnung fuer redaktionelle Interview-Beitraege --
   erscheint auf jeder Karte, in der ein Artikel mit format:"interview"
   gerendert wird (Neu im Magazin, Filterergebnisse, Interview-Uebersicht
   ...). Bewusst zart (Violett/Gold), keine grelle Auszeichnung. */
.blog-format-badge {
  position: absolute;
  top: 0.7rem;
  right: 0.7rem;
  z-index: 2;
  font-family: var(--font-heading);
  font-size: 0.6rem;
  font-weight: 700;
  letter-spacing: 0.07em;
  text-transform: uppercase;
  color: #6b4f8a;
  background: rgba(253, 247, 237, 0.94);
  border: 1px solid rgba(154, 122, 200, 0.4);
  padding: 0.28rem 0.65rem;
  border-radius: 999px;
}

/* Unterkategorie-Filter auf Kategorie-Uebersichten (z.B. "Kinder
   verstehen & begleiten"): wird nur mit tatsaechlich vorhandenen
   Unterkategorien befuellt (siehe js/magazin-render.js), keine leeren
   Filter fuer (noch) unbenutzte Unterkategorien. */
.magazin-listing-filters {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 0.6rem;
  margin: 0 0 2.75rem;
}

.magazin-listing-filter {
  font-family: var(--font-heading);
  font-size: 0.82rem;
  font-weight: 600;
  color: #8a5a3a;
  background: #fdf7ed;
  border: 1px solid rgba(201, 162, 77, 0.35);
  border-radius: 999px;
  padding: 0.42rem 1.05rem;
  cursor: pointer;
  transition: background 0.2s ease, color 0.2s ease, border-color 0.2s ease;
}

.magazin-listing-filter:hover {
  border-color: #c9a24d;
}

.magazin-listing-filter.is-active {
  background: #8a5a3a;
  color: #fdf7ed;
  border-color: #8a5a3a;
}

.magazin-listing-empty {
  text-align: center;
  font-family: var(--font-body);
  font-style: italic;
  color: #6b5342;
  max-width: 480px;
  margin: 1rem auto 0;
}

/* Zeitleiste "Aus einer Idee wurde Lumaria" -- lebt ausschliesslich auf
   magazin-tagebuch.html (nicht mehr auf der Magazin-Hauptseite), in
   einem deutlich kompakteren, klar umrahmten Magazin-Container statt
   der frueheren, sehr breiten Vollbild-Darstellung. Bild traegt bereits
   einen eigenen goldenen Rahmen -- daher hier ein sehr dezenter,
   zusaetzlicher Aussenrahmen statt eines starken Schattens. Bei Klick
   oeffnet js/magazin-lightbox.js dasselbe Bild gross (siehe
   .magazin-lightbox weiter unten). */
.magazin-timeline {
  max-width: 1050px;
  margin: 4rem auto 5rem;
  padding: 0 1.75rem;
  text-align: center;
}

.magazin-timeline-heading {
  font-family: var(--font-heading);
  font-size: 1.7rem;
  font-weight: 700;
  color: #8a5a3a;
  margin: 0 0 0.5rem;
}

.magazin-timeline-intro {
  font-family: var(--font-body);
  font-style: italic;
  font-size: 1rem;
  color: #6b5342;
  margin: 0 0 2.25rem;
}

.magazin-timeline-trigger {
  display: block;
  width: 100%;
  padding: 0;
  margin: 0;
  border: none;
  background: none;
  cursor: zoom-in;
}

.magazin-timeline-media {
  display: block;
  width: 100%;
  height: auto;
  border: 1px solid rgba(201, 162, 77, 0.3);
  border-radius: 14px;
  box-shadow: 0 10px 30px rgba(139, 105, 60, 0.12);
}

.magazin-timeline-caption {
  font-family: var(--font-body);
  font-style: italic;
  font-size: 0.85rem;
  color: #a68d6f;
  margin: 1rem 0 0;
}

@media (max-width: 640px) {
  .magazin-timeline {
    margin: 3rem auto 3.5rem;
  }

  .magazin-timeline-media {
    border-radius: 10px;
  }
}

/* Generische Bild-Lightbox (aktuell nur fuer die Tagebuch-Zeitleiste
   verwendet): [hidden] blendet sie komplett aus, JS schaltet das
   Attribut um (siehe js/magazin-lightbox.js). */
.magazin-lightbox {
  position: fixed;
  inset: 0;
  z-index: 999;
  display: flex;
  align-items: center;
  justify-content: center;
  background: rgba(43, 31, 20, 0.82);
  padding: 2rem;
}

.magazin-lightbox[hidden] {
  display: none;
}

.magazin-lightbox-img {
  display: block;
  max-width: 92vw;
  max-height: 88vh;
  width: auto;
  height: auto;
  border-radius: 10px;
  box-shadow: 0 20px 60px rgba(0, 0, 0, 0.4);
}

.magazin-lightbox-close {
  position: absolute;
  top: 1.25rem;
  right: 1.5rem;
  width: 42px;
  height: 42px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  background: rgba(253, 247, 237, 0.92);
  border: 1px solid rgba(201, 162, 77, 0.5);
  color: #6b5342;
  font-size: 1.6rem;
  line-height: 1;
  cursor: pointer;
}

.magazin-lightbox-close:hover,
.magazin-lightbox-close:focus-visible {
  color: #8a5a3a;
  border-color: #8a5a3a;
}

/* "Entdecke unsere Themen" (blog.html): ersetzt die beiden frueheren,
   sehr grossen Auswahlkarten durch drei deutlich kompaktere, gleich
   grosse Bildkacheln (Tagebuch/Kinder verstehen/Interviews) -- wirkt
   redaktionell statt wie ein Werbebanner. Jede Kachel behaelt einen
   dezenten, themenspezifischen Farbakzent (sehr sanfter Verlauf im
   Kartenkoerper + eingefaerbter Name/Link) statt eines harten Rands
   (der mit der abgerundeten Kartenform kollidieren wuerde), sonst
   identische Form/Schatten/Radius. Bewusst kein Bildzoom und nur ein
   sehr sanftes Anheben beim Hover. */
.magazin-themes {
  max-width: 1180px;
  margin: 4rem auto 0;
  padding: 0 1.75rem;
  text-align: center;
}

.magazin-themes-heading {
  font-family: var(--font-heading);
  font-size: 1.9rem;
  font-weight: 700;
  color: #8a5a3a;
  margin: 0 0 2.25rem;
}

.magazin-themes-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 1.75rem;
}

.magazin-theme-tile {
  display: flex;
  flex-direction: column;
  text-align: left;
  text-decoration: none;
  color: inherit;
  background: #fffdf9;
  border-radius: 16px;
  overflow: hidden;
  box-shadow: 0 8px 22px rgba(139, 105, 60, 0.09);
  transition: transform 0.25s ease, box-shadow 0.25s ease;
}

.magazin-theme-tile:hover,
.magazin-theme-tile:focus-visible {
  transform: translateY(-3px);
  box-shadow: 0 12px 28px rgba(139, 105, 60, 0.13);
}

.magazin-theme-tile-media {
  display: block;
  aspect-ratio: 16 / 10;
  overflow: hidden;
}

.magazin-theme-tile-media img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
}

.magazin-theme-tile-body {
  display: flex;
  flex-direction: column;
  flex: 1;
  padding: 1.1rem 1.3rem 1.35rem;
}

.magazin-theme-tile-name {
  font-family: var(--font-heading);
  font-size: 1.05rem;
  font-weight: 700;
  margin: 0 0 0.4rem;
}

.magazin-theme-tile-text {
  font-family: var(--font-body);
  font-size: 0.88rem;
  line-height: 1.5;
  color: #6b5342;
  margin: 0 0 0.85rem;
  flex: 1;
}

.magazin-theme-tile-link {
  font-family: var(--font-heading);
  font-size: 0.82rem;
  font-weight: 600;
}

.magazin-theme-tile-diary .magazin-theme-tile-body {
  background: linear-gradient(180deg, #fffdf9 0%, #fdf1f0 100%);
}

.magazin-theme-tile-diary .magazin-theme-tile-name {
  color: #9c4a5a;
}

.magazin-theme-tile-diary .magazin-theme-tile-link {
  color: #b3607a;
}

.magazin-theme-tile-kids .magazin-theme-tile-body {
  background: linear-gradient(180deg, #fffdf9 0%, #eef4ec 100%);
}

.magazin-theme-tile-kids .magazin-theme-tile-name {
  color: #4c6b4f;
}

.magazin-theme-tile-kids .magazin-theme-tile-link {
  color: #5c8a61;
}

.magazin-theme-tile-interview .magazin-theme-tile-body {
  background: linear-gradient(180deg, #fffdf9 0%, #f3ecf7 100%);
}

.magazin-theme-tile-interview .magazin-theme-tile-name {
  color: #6b4f8a;
}

.magazin-theme-tile-interview .magazin-theme-tile-link {
  color: #b3924f;
}

@media (max-width: 900px) {
  .magazin-themes-grid {
    grid-template-columns: repeat(2, 1fr);
  }
}

@media (max-width: 640px) {
  .magazin-themes {
    margin-top: 3rem;
  }

  .magazin-themes-heading {
    font-size: 1.55rem;
    margin-bottom: 1.75rem;
  }

  .magazin-themes-grid {
    grid-template-columns: 1fr;
  }
}

/* Kompakte Navigationsleiste zu den vollstaendigen Beitragsuebersichten
   (blog.html): bewusst KEIN Live-Filter mit Artikelkarten auf der
   Magazin-Hauptseite mehr -- jeder Punkt fuehrt auf eine eigene,
   bereits bestehende Uebersichtsseite (magazin-alle-beitraege.html,
   magazin-tagebuch.html, magazin-kinder-verstehen.html,
   magazin-interviews.html). Die Hauptseite bleibt dadurch kurz: nur
   Aufmacher, Themenkacheln und dieser Wegweiser, kein zusaetzliches
   Kartenraster. */
.magazin-archive-nav-section {
  max-width: 1220px;
  margin: 3.5rem auto 4rem;
  padding: 0 1.75rem;
}

.magazin-archive-nav {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 0.6rem;
}

.magazin-archive-nav-link {
  font-family: var(--font-heading);
  font-size: 0.85rem;
  font-weight: 600;
  color: #8a5a3a;
  background: #fdf7ed;
  border: 1px solid rgba(201, 162, 77, 0.35);
  border-radius: 999px;
  padding: 0.45rem 1.1rem;
  text-decoration: none;
  transition: background 0.2s ease, color 0.2s ease, border-color 0.2s ease;
}

.magazin-archive-nav-link:hover,
.magazin-archive-nav-link:focus-visible {
  background: #8a5a3a;
  color: #fdf7ed;
  border-color: #8a5a3a;
}

@media (max-width: 640px) {
  .magazin-archive-nav-section {
    margin-top: 2.5rem;
    margin-bottom: 3rem;
  }
}

/* Magazin-Artikelseiten (magazin-malbuch-lumaria.html, magazin-
   traurige-gefuehle.html, ...): eigenstaendige Seiten ohne Header-Video
   (schlichte "plain page" wie z.B. werkstatt.html), <main> traegt
   trotzdem .blog-page fuer denselben durchgehenden Creme-Hintergrund
   wie das Magazin. Grosszuegige Lesebreite, dezente Goldakzente, keine
   Dekoration hinter dem Fliesstext (siehe Vorgabe). */
.magazin-article {
  max-width: 760px;
  margin: 0 auto;
  padding: 4rem 1.75rem 5rem;
}

.magazin-article-eyebrow {
  font-family: var(--font-heading);
  font-size: 0.85rem;
  font-weight: 600;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: #b3924f;
  text-align: center;
  margin: 0 0 0.7rem;
}

.magazin-article-title {
  font-family: var(--font-heading);
  font-size: 2.3rem;
  font-weight: 700;
  line-height: 1.25;
  color: #8a5a3a;
  text-align: center;
  margin: 0 0 0.7rem;
}

.magazin-article-date {
  font-family: var(--font-body);
  font-style: italic;
  font-size: 0.9rem;
  color: #9c7ba8;
  text-align: center;
  margin: 0 0 1.5rem;
}

/* Vorspann (magazin-kinderaengste-zuhoeren.html und weitere): kurzer
   einleitender Absatz zwischen Datum und Beitragsbild, etwas groesser/
   kursiv gegenueber dem eigentlichen Fliesstext, um ihn als Lead
   erkennbar zu machen. */
.magazin-article-lead {
  max-width: 620px;
  margin: 0 auto 2.5rem;
  font-family: var(--font-body);
  font-style: italic;
  font-size: 1.18rem;
  line-height: 1.7;
  color: #6b5342;
  text-align: center;
}

/* Grosses Beitragsbild (magazin-malbuch-lumaria.html, magazin-
   traurige-gefuehle.html): bewusst KEIN aspect-ratio/object-fit mehr
   (KORREKTUR -- zwang das Bild vorher in eine feste 16:9-Box und haette
   es dadurch beschnitten). width:100%;height:auto erhaelt stattdessen
   das tatsaechliche Seitenverhaeltnis des jeweiligen Originalbilds
   exakt, unabhaengig von dessen genauem Format. */
.magazin-article-hero {
  margin: 0 0 3rem;
}

.magazin-article-hero img {
  display: block;
  width: 100%;
  height: auto;
  border-radius: 16px;
  box-shadow: 0 12px 36px rgba(139, 105, 60, 0.14);
}

/* Modifier ausschliesslich fuer Artikel, deren Titelbild bewusst
   zugeschnitten werden soll (object-fit:cover) -- Standardverhalten
   der beiden anderen Artikel (width:100%;height:auto, kein Cropping)
   bleibt davon unberuehrt. */
.magazin-article-hero-cover {
  aspect-ratio: 3 / 2;
  overflow: hidden;
  border-radius: 16px;
  box-shadow: 0 12px 36px rgba(139, 105, 60, 0.14);
}

.magazin-article-hero-cover img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  border-radius: 0;
  box-shadow: none;
}

.magazin-article-body {
  max-width: 620px;
  margin: 0 auto;
  font-family: var(--font-body);
  font-size: 1.1rem;
  line-height: 1.85;
  color: #4a3a2e;
}

.magazin-article-body p {
  margin: 0 0 1.3rem;
}

/* Zwischenueberschriften innerhalb laengerer Artikel (magazin-
   kinderaengste-zuhoeren.html) -- optional, nur wo im Artikeltext
   vorgesehen. */
.magazin-article-body h2 {
  font-family: var(--font-heading);
  font-size: 1.4rem;
  font-weight: 700;
  line-height: 1.3;
  color: #8a5a3a;
  margin: 2.4rem 0 1rem;
}

.magazin-article-body h2:first-child {
  margin-top: 0;
}

/* Woertliche/hervorgehobene Zitatzeilen innerhalb des Fliesstexts --
   dezent golden/kursiv abgesetzt, bewusst kein eigener Kasten. */
.magazin-article-quote {
  font-style: italic;
  color: #b3924f;
}

.magazin-article-closing {
  font-style: italic;
  color: #b3924f;
}

/* "Ein Tintenzauber-Gedanke": kleiner, sehr dezenter Abschluss-Kasten
   am Ende ausgewaehlter Artikel -- helles Salbei/Creme, weicher
   Verlauf statt harter Kante, kleine goldene Feder, KEINE schwere Box
   (kein Rahmen/Schatten). */
.magazin-article-thought {
  max-width: 560px;
  margin: 3rem auto 0;
  padding: 1.85rem 1.75rem;
  background: linear-gradient(135deg, #eef4ec 0%, #fdf7ed 100%);
  border-radius: 18px;
  text-align: center;
}

.magazin-article-thought-icon {
  display: block;
  width: 20px;
  height: auto;
  margin: 0 auto 0.7rem;
  opacity: 0.85;
}

.magazin-article-thought-heading {
  font-family: var(--font-heading);
  font-size: 1.05rem;
  font-weight: 700;
  color: #4c6b4f;
  margin: 0 0 0.7rem;
}

.magazin-article-thought-text {
  font-family: var(--font-body);
  font-style: italic;
  font-size: 1.02rem;
  line-height: 1.6;
  color: #6b5342;
  margin: 0 0 0.9rem;
}

.magazin-article-thought-signature {
  font-family: var(--font-heading);
  font-size: 0.85rem;
  color: #9c7ba8;
  margin: 0;
}

.magazin-article-nav {
  max-width: 620px;
  margin: 3rem auto 0;
  padding-top: 2rem;
  border-top: 1px solid rgba(201, 162, 77, 0.25);
  display: flex;
  flex-direction: column;
  gap: 0.6rem;
}

.magazin-article-nav a {
  font-family: var(--font-heading);
  font-size: 0.95rem;
  font-weight: 600;
  color: #8a5a3a;
  text-decoration: none;
}

.magazin-article-nav a:hover,
.magazin-article-nav a:focus-visible {
  color: #b3924f;
}

/* Interview-Artikelseiten (format:"interview"): eigenstaendige Struktur
   innerhalb des bestehenden .magazin-article-Rahmens -- Fragen/Antworten
   werden ueber Farbe/Gewicht statt schwerer Kaesten unterschieden. */
.magazin-interview-badge {
  color: #6b4f8a;
}

.magazin-interview-intro {
  max-width: 620px;
  margin: 0 auto 3rem;
  font-family: var(--font-body);
  font-size: 1.05rem;
  line-height: 1.75;
  color: #6b5342;
  text-align: center;
}

.magazin-interview-qa {
  max-width: 620px;
  margin: 0 auto 2.2rem;
}

.magazin-interview-qa:last-of-type {
  margin-bottom: 0;
}

.magazin-interview-question {
  font-family: var(--font-heading);
  font-size: 1.08rem;
  font-weight: 700;
  line-height: 1.4;
  color: #6b4f8a;
  margin: 0 0 0.6rem;
  padding-left: 1.1rem;
  border-left: 2px solid rgba(154, 122, 200, 0.4);
}

.magazin-interview-answer {
  font-family: var(--font-body);
  font-size: 1.05rem;
  line-height: 1.75;
  color: #4a3c2f;
  margin: 0 0 0 1.1rem;
}

.magazin-interview-pullquote {
  max-width: 560px;
  margin: 3rem auto;
  padding: 0;
  text-align: center;
  font-family: var(--font-heading);
  font-style: italic;
  font-weight: 600;
  font-size: 1.35rem;
  line-height: 1.5;
  color: #6b4f8a;
}

.magazin-interview-pullquote::before,
.magazin-interview-pullquote::after {
  content: "";
  display: block;
  width: 46px;
  height: 1px;
  margin: 0 auto 1.1rem;
  background: linear-gradient(to right, transparent, #c9a24d, transparent);
}

.magazin-interview-pullquote::after {
  margin: 1.1rem auto 0;
}

.magazin-interview-closing {
  max-width: 620px;
  margin: 3rem auto 0;
  font-family: var(--font-body);
  font-style: italic;
  font-size: 1.05rem;
  line-height: 1.75;
  color: #6b5342;
  text-align: center;
}

@media (max-width: 640px) {
  .magazin-article {
    padding: 3rem 1.25rem 3.5rem;
  }

  .magazin-article-title {
    font-size: 1.7rem;
  }

  .magazin-article-body {
    font-size: 1.02rem;
  }

  .magazin-article-lead {
    font-size: 1.05rem;
  }

  .magazin-article-body h2 {
    font-size: 1.2rem;
  }

  .magazin-article-thought {
    padding: 1.5rem 1.25rem;
  }

  .magazin-interview-pullquote {
    font-size: 1.15rem;
  }

  .magazin-interview-question {
    font-size: 1.02rem;
  }

  .magazin-interview-answer {
    font-size: 1rem;
  }
}

/* Magazin-Uebersichtsseiten (magazin-tagebuch.html, magazin-kinder-
   verstehen.html, magazin-alle-beitraege.html): gleiches Prinzip wie
   .magazin-article oben (plain page, .blog-page-Hintergrund). Karten
   nutzen bewusst dieselben .blog-latest-card-Klassen wie "Neu im
   Tintenzauber-Magazin" (siehe dort) fuer identische Optik --
   auto-fill statt fester Spaltenzahl, damit die Liste sauber waechst,
   sobald weitere Beitraege ergaenzt werden. */
.magazin-listing {
  max-width: 1100px;
  margin: 0 auto;
  padding: 4rem 1.75rem 5rem;
}

.magazin-listing-heading {
  font-family: var(--font-heading);
  font-size: 2.3rem;
  font-weight: 700;
  color: #8a5a3a;
  text-align: center;
  margin: 0 0 0.6rem;
}

.magazin-listing-subheading {
  font-family: var(--font-body);
  font-style: italic;
  font-size: 1.05rem;
  color: #6b5342;
  text-align: center;
  margin: 0 0 3rem;
}

.magazin-listing-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
  gap: 2rem;
}

@media (max-width: 640px) {
  .magazin-listing {
    padding: 3rem 1.25rem 3.5rem;
  }

  .magazin-listing-heading {
    font-size: 1.7rem;
  }
}

/* Newsletter-CTA (blog.html): bewusst kompakt und ruhig -- kein
   grossflaechiger Kasten, sondern eine kleine, klar begrenzte Karte
   mittig auf der Seite. Formular ist per [hidden] zunaechst
   ausgeblendet und wird erst per Klick auf den Anmelden-Button
   eingeblendet (js/magazin-newsletter.js), damit der Bereich im
   Ruhezustand so kompakt wie moeglich bleibt. */
.magazin-newsletter {
  max-width: 1220px;
  margin: 0 auto 4rem;
  padding: 0 1.75rem;
}

.magazin-newsletter-inner {
  max-width: 540px;
  margin: 0 auto;
  padding: 2.25rem 2rem;
  text-align: center;
  background: linear-gradient(150deg, #fdf7ed 0%, #fbeef2 55%, #f3ecf7 100%);
  border: 1px solid rgba(201, 162, 77, 0.25);
  border-radius: 20px;
  box-shadow: 0 10px 30px rgba(139, 105, 60, 0.08);
}

.magazin-newsletter-icon {
  display: block;
  width: 26px;
  height: auto;
  margin: 0 auto 0.85rem;
  opacity: 0.9;
}

.magazin-newsletter-heading {
  font-family: var(--font-heading);
  font-size: 1.35rem;
  font-weight: 700;
  color: #8a5a3a;
  margin: 0 0 0.5rem;
}

.magazin-newsletter-text {
  font-family: var(--font-body);
  font-size: 0.95rem;
  line-height: 1.6;
  color: #6b5342;
  margin: 0 0 1.4rem;
}

.magazin-newsletter-toggle,
.magazin-newsletter-submit {
  font-family: var(--font-heading);
  font-size: 0.92rem;
  font-weight: 600;
  color: #fdf7ed;
  background: #8a5a3a;
  border: 1px solid rgba(201, 162, 77, 0.7);
  border-radius: 999px;
  padding: 0.65rem 1.6rem;
  cursor: pointer;
  transition: background 0.2s ease;
}

.magazin-newsletter-toggle:hover,
.magazin-newsletter-toggle:focus-visible,
.magazin-newsletter-submit:hover,
.magazin-newsletter-submit:focus-visible {
  background: #734a2f;
}

.magazin-newsletter-submit[disabled] {
  opacity: 0.6;
  cursor: not-allowed;
}

.magazin-newsletter-form {
  margin: 1.5rem 0 0;
  text-align: left;
  display: flex;
  flex-direction: column;
  gap: 0.9rem;
}

.magazin-newsletter-field {
  display: flex;
  flex-direction: column;
  gap: 0.35rem;
}

.magazin-newsletter-field label {
  font-family: var(--font-heading);
  font-size: 0.8rem;
  font-weight: 600;
  color: #8a5a3a;
}

.magazin-newsletter-field input {
  font-family: var(--font-body);
  font-size: 0.95rem;
  color: #4a3c2f;
  padding: 0.6rem 0.85rem;
  border: 1px solid rgba(201, 162, 77, 0.35);
  border-radius: 10px;
  background: #fffdf9;
  width: 100%;
}

.magazin-newsletter-field input:focus {
  outline: none;
  border-color: #c9a24d;
  box-shadow: 0 0 0 3px rgba(201, 162, 77, 0.15);
}

.magazin-newsletter-field input.is-invalid {
  border-color: #c1616f;
}

.magazin-newsletter-consent {
  display: flex;
  align-items: flex-start;
  gap: 0.6rem;
  font-family: var(--font-body);
  font-size: 0.84rem;
  line-height: 1.5;
  color: #6b5342;
  cursor: pointer;
}

.magazin-newsletter-consent input {
  width: 17px;
  height: 17px;
  margin: 0.15rem 0 0;
  padding: 0;
  flex-shrink: 0;
  background: #fffdf9;
  border: 1px solid rgba(201, 162, 77, 0.5);
  border-radius: 4px;
}

.magazin-newsletter-consent a {
  color: #b3924f;
}

.magazin-newsletter-consent.is-invalid {
  color: #c1616f;
}

.magazin-newsletter-message {
  font-family: var(--font-body);
  font-size: 0.86rem;
  line-height: 1.5;
  margin: 0;
  padding: 0.65rem 0.9rem;
  border-radius: 10px;
}

.magazin-newsletter-message.is-success {
  background: #eef4ec;
  color: #4c6b4f;
}

.magazin-newsletter-message.is-error {
  background: #fbeaea;
  color: #9c4a5a;
}

.magazin-newsletter-actions {
  display: flex;
  align-items: center;
  gap: 1rem;
  justify-content: center;
  margin-top: 0.2rem;
}

.magazin-newsletter-cancel {
  font-family: var(--font-body);
  font-size: 0.85rem;
  color: #a68d6f;
  background: none;
  border: none;
  text-decoration: underline;
  cursor: pointer;
  padding: 0;
}

.magazin-newsletter-cancel:hover,
.magazin-newsletter-cancel:focus-visible {
  color: #6b5342;
}

@media (max-width: 640px) {
  .magazin-newsletter {
    margin-bottom: 3rem;
  }

  .magazin-newsletter-inner {
    padding: 1.85rem 1.4rem;
    border-radius: 16px;
  }

  .magazin-newsletter-heading {
    font-size: 1.18rem;
  }

  .magazin-newsletter-actions {
    flex-direction: column;
    gap: 0.6rem;
  }
}

/* Footer-Vorbereich (blog.html): eigener dreigeteilter Abschlussbereich
   DIREKT VOR dem bestehenden, unveraenderten <footer class="site-footer">
   (Copyright/Rechtliches wird dort weiterhin per main.js eingefuegt,
   siehe dort -- hier wird nichts davon dupliziert). Bewusst AUSSERHALB
   von .blog-page/<main> im Markup platziert, braucht daher eine eigene
   Hintergrundflaeche.
   KORREKTUR: der Hintergrund lag vorher NUR auf dem 1100px breiten
   Grid-Container -- dadurch entstand seitlich sichtbar die gruene
   Body-Themefarbe, es wirkte wie ein separater rechteckiger Kasten.
   Jetzt traegt .blog-footer-columns selbst (volle Browserbreite) den
   Verlauf, waehrend .blog-footer-columns-inner nur noch die Content-
   breite (bis 1450px) und das Grid uebernimmt. Der Verlauf beginnt
   bewusst mit demselben Cremeton wie das Ende von .blog-page (nahezu
   unsichtbarer Uebergang von oben), geht durch ein sehr zartes Flieder/
   Rose in der Mitte und endet in einem sehr hellen Salbeigruen (siehe
   Vorgabe), ohne zu Transparent zu faeden -- der bestehende Footer
   darunter hat selbst keinen Hintergrund, ein harter Farbsprung dorthin
   liesse sich ohne Aenderung des Footers ohnehin nicht vermeiden. */
.blog-footer-columns {
  position: relative;
  background: linear-gradient(180deg, #f7ecdc 0%, #f4ecf6 45%, #eef4ec 100%);
  padding: 2.75rem 1.75rem 3.75rem;
  overflow: hidden;
}

/* Kontakt-Seite (kontakt.html): anders als bei .blog-page endet der
   Seitenhintergrund hier nicht in genau diesem Cremeton -- ohne
   Anpassung koennte ein harter Farbsprung zum Footer-Vorbereich
   entstehen. Fade blendet die ersten Pixel von Transparent (zeigt den
   jeweiligen Seitenhintergrund durch) in denselben Cremeton ueber,
   betrifft ausschliesslich diese Seite. */
.kontakt-page .blog-footer-columns {
  background: linear-gradient(180deg, transparent 0%, #f7ecdc 70px, #f4ecf6 45%, #eef4ec 100%);
}

.blog-footer-columns-inner {
  position: relative;
  z-index: 1;
  display: grid;
  grid-template-columns: 1fr auto 1fr auto 1fr;
  align-items: start;
  gap: 2.5rem;
  max-width: 1420px;
  margin: 0 auto;
  text-align: center;
}

/* Sehr sparsame Eckdekoration (Zweiglein/Goldfunken) ganz aussen unten
   links/rechts -- bewusst weit ausserhalb der Spaltenbreite (siehe
   .blog-footer-columns-inner max-width) platziert, damit garantiert
   nie Text/Buttons beruehrt werden. */
.blog-footer-corner-deco {
  position: absolute;
  bottom: 0.5rem;
  width: 34px;
  height: 34px;
  pointer-events: none;
}

.blog-footer-corner-deco-left {
  left: 1rem;
}

.blog-footer-corner-deco-right {
  right: 1rem;
}

@media (max-width: 1180px) {
  .blog-footer-corner-deco {
    display: none;
  }
}

.blog-footer-column {
  display: flex;
  flex-direction: column;
  align-items: center;
}

.blog-footer-column-icon {
  display: block;
  width: 21px;
  height: auto;
  margin: 0 0 0.55rem;
  opacity: 0.85;
}

.blog-footer-star {
  margin: 0 0 0.6rem;
}

.blog-footer-column h3 {
  font-family: var(--font-heading);
  font-size: 1.1rem;
  font-weight: 700;
  color: #6b4f7a;
  margin: 0 0 0.5rem;
}

.blog-footer-column p {
  font-family: var(--font-body);
  font-size: 0.92rem;
  line-height: 1.45;
  color: #6b5342;
  margin: 0 0 0.75rem;
  max-width: 260px;
}

.blog-footer-column-note {
  margin-top: -0.4rem;
  font-style: italic;
  color: #9c7ba8;
}

/* Kuerzer und transparenter als zuvor (nicht mehr durchgehend von
   oben bis unten, siehe Vorgabe) -- feste Hoehe statt align-self:
   stretch, vertikal zentriert auf Spaltenhoehe. */
.blog-footer-column-divider {
  align-self: center;
  width: 1px;
  height: 70%;
  max-height: 130px;
  background: linear-gradient(to bottom, transparent, rgba(201, 162, 77, 0.22) 30%, rgba(201, 162, 77, 0.22) 70%, transparent);
}

/* Leichtere, weniger "pillenfoermige" Buttons in gedecktem Violett mit
   feinem Goldrand (siehe Vorgabe) -- sehr dezente Hover-Reaktion (nur
   Farbwechsel/leichtes Anheben, KEIN Vergroessern). */
.blog-footer-btn {
  display: inline-block;
  font-family: var(--font-heading);
  font-size: 0.84rem;
  font-weight: 500;
  letter-spacing: 0.01em;
  color: #f8f3fb;
  background: #7a5f8a;
  border: 1px solid rgba(201, 162, 77, 0.7);
  border-radius: 7px;
  padding: 0.4rem 1.05rem;
  text-decoration: none;
  transition: background 0.25s ease, transform 0.25s ease;
}

.blog-footer-btn:hover,
.blog-footer-btn:focus-visible {
  background: #8a6f9a;
  transform: translateY(-2px);
}

.blog-footer-social-icons {
  display: flex;
  justify-content: center;
  gap: 0.85rem;
}

/* Etwas kleiner/filigraner als zuvor (siehe Vorgabe), bleibt mit 40px
   nah am 44px-Touchziel-Richtwert. */
.blog-footer-social-icon {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 40px;
  height: 40px;
  border-radius: 50%;
  background: #fdf7ed;
  border: 1px solid rgba(201, 162, 77, 0.4);
  color: #6b4f7a;
  transition: background 0.25s ease, color 0.25s ease, transform 0.25s ease;
}

.blog-footer-social-icon svg {
  width: 16px;
  height: 16px;
}

.blog-footer-social-icon:hover,
.blog-footer-social-icon:focus-visible {
  background: #6b4f7a;
  color: #fdf7ed;
  transform: translateY(-2px);
}

@media (max-width: 760px) {
  .blog-footer-columns-inner {
    grid-template-columns: 1fr;
    gap: 2.25rem;
  }

  .blog-footer-columns {
    padding: 2.25rem 1.75rem 2rem;
  }

  .blog-footer-column-divider {
    width: 50%;
    height: 1px;
    max-height: none;
    margin: 0 auto;
    background: linear-gradient(to right, transparent, rgba(201, 162, 77, 0.22) 30%, rgba(201, 162, 77, 0.22) 70%, transparent);
  }
}

/* ============================================================
   Zuckersternbaeckerei (Lumaria) -- Grundstruktur, bewusst noch
   ohne aufwendige Animationen/Partikel/bewegte Figuren (siehe
   Vorgabe: die werden anschliessend Abschnitt fuer Abschnitt
   ergaenzt). Eigenes Theme body.theme-zuckerstern mit warmer
   Maerchen-Backstuben-Palette (Creme/Honiggold/warmes Holz/tiefes
   Violett/Rose); --color-ink* NICHT als flache Flaeche ueberschrieben
   (anders als z.B. theme-sage-parents), sondern nutzt bewusst den
   generischen body{}-radial-gradient (siehe ganz oben in dieser
   Datei) fuer ein warmes, von oben einfallendes "Backstubenlicht".
   Alle Klassen tragen das Praefix .zuckerstern-, um Kollisionen mit
   anderen Seiten auszuschliessen. */
body.theme-zuckerstern {
  --color-ink: #f7ead1;
  --color-ink-deep: #ecd3a0;
  --color-ink-light: #fff8ea;
  --color-parchment: #4a3450;
  --color-parchment-dim: #8a7480;
  --color-gold: #c9962f;
  --color-gold-light: #6b3f7a;
  --color-burgundy: #c98a95;
  --color-gold-rgb: 201, 150, 47;
  --surface-rgb: 255, 250, 240;
  --surface-alpha: 0.92;
}

body.theme-zuckerstern .btn-primary {
  background: var(--color-gold);
  border-color: var(--color-gold);
  color: #3a2410;
}

body.theme-zuckerstern .btn-primary:hover {
  background: var(--color-gold-light);
  border-color: var(--color-gold-light);
  color: #fff8ea;
}

body.theme-zuckerstern .btn-outline {
  color: var(--color-gold-light);
  border-color: var(--color-gold-light);
}

body.theme-zuckerstern .btn-outline:hover {
  background: rgba(107, 63, 122, 0.1);
  border-color: var(--color-gold-light);
  color: var(--color-parchment);
}

/* 1. HERO -- vor der Zuckersternbaeckerei. Volle Breite, grosszuegige
   Hoehe; .zuckerstern-hero-video ist das animierte Aussenansicht-
   Video der Baeckerei (object-fit:cover, kein Zerren), Text/CTA
   liegen als eigene, positionierte Ebene darueber -- aktuell nur der
   dezente Scroll-Hinweis, H1/Unterzeile sind visually-hidden (siehe
   HTML), damit der im Video bereits enthaltene Schriftzug nicht
   ueberlagert wird. background-color auf der Section selbst dient als
   Lade-/Fallback-Farbe UND als Basis fuer den weichen Ausblend-
   Uebergang am unteren Videorand (mask-image auf dem Video, siehe
   unten) -- dadurch entsteht kein harter Schnitt zur Navigation. */
.zuckerstern-hero {
  position: relative;
  width: 100%;
  min-height: 82vh;
  display: flex;
  align-items: center;
  justify-content: center;
  overflow: hidden;
  background-color: #f6e6c8;
}

.zuckerstern-hero-video {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
  -webkit-mask-image: linear-gradient(to bottom, #000 0%, #000 calc(100% - 120px), transparent 100%);
  mask-image: linear-gradient(to bottom, #000 0%, #000 calc(100% - 120px), transparent 100%);
}

.zuckerstern-hero-content {
  position: relative;
  z-index: 1;
  max-width: 680px;
  margin: 0 auto;
  padding: 2rem 1.5rem;
  text-align: center;
}

/* Weicher Farbuebergang von Video zu Navigation: dieselbe helle
   Creme-Gold-Flaeche wie .zuckerstern-hero (background-color oben),
   damit unter dem ausblendenden Video und der direkt folgenden
   Navigation keine harte Kante entsteht. Selektor ausschliesslich
   ueber den direkten Geschwister-Node .zuckerstern-hero gebunden --
   .zuckerstern-hero kommt nur auf dieser einen Seite vor, betrifft
   also garantiert keine andere Seite/keinen anderen Header. */
.zuckerstern-hero + header.site-header {
  background-color: #f6e6c8;
}

.zuckerstern-hero-content h1 {
  margin: 0 0 0.75rem;
  font-family: var(--font-heading);
  font-size: clamp(2rem, 5vw, 3.1rem);
  color: #fff8ea;
  text-shadow: 0 2px 14px rgba(58, 30, 20, 0.35);
}

.zuckerstern-hero-subtitle {
  margin: 0 0 2rem;
  font-family: var(--font-heading);
  font-size: 1.2rem;
  font-style: italic;
  color: #f6e3ba;
  text-shadow: 0 1px 8px rgba(58, 30, 20, 0.3);
}

/* 2. UEBERGANG -- wir betreten die Baeckerei. Dunkler werdender
   Verlauf (Aussenlicht -> gemuetliches Backstuben-Halbdunkel), damit
   der Uebergang von aussen nach innen auch farblich spuerbar ist. */
/* Bild traegt Schriftzug/Zitat bereits selbst -- Seitenverhaeltnis
   des Originals bleibt durch width:100%/height:auto exakt erhalten
   (kein object-fit:cover, kein Beschnitt). mask-image blendet oben
   UND unten weich aus, damit kein rechteckiges "Banner" entsteht,
   sondern das Bild direkt in den Nav-Hintergrund darueber und den
   hellen Creme-Bereich von "Meister Zimtstern" darunter uebergeht
   (beide nutzen bereits denselben warmen Creme-Ton, siehe body.theme-
   zuckerstern/-.site-header-Hintergrund weiter oben). */
.zuckerstern-eingang {
  position: relative;
  width: 100%;
  max-width: 1800px;
  margin: 0 auto;
  overflow: hidden;
}

.zuckerstern-eingang-media {
  display: block;
  width: 100%;
  height: auto;
  -webkit-mask-image: linear-gradient(to bottom, transparent 0%, #000 90px, #000 calc(100% - 90px), transparent 100%);
  mask-image: linear-gradient(to bottom, transparent 0%, #000 90px, #000 calc(100% - 90px), transparent 100%);
}

/* 3. MEISTER ZIMTSTERN FUEHRT DURCH SEINE BAECKEREI */
.zuckerstern-section-kicker {
  max-width: 1100px;
  margin: 0 auto 2rem;
  padding: 0 1.5rem;
  text-align: center;
  font-family: var(--font-heading);
  font-size: 1rem;
  letter-spacing: 0.04em;
  color: var(--color-gold-light);
}

/* align-items:stretch (Grid-Default) ist hier bewusst noetig, nicht
   nur kosmetisch: .zuckerstern-zimtstern-figure-wrap muss die volle
   Zeilenhoehe des Grids einnehmen (nicht nur die Hoehe der Figur),
   damit die sticky-positionierte Figur darin ueberhaupt einen
   Scroll-Spielraum hat -- sonst wuerde sie sofort wieder loslassen,
   sobald man zu scrollen beginnt, statt bis zum Ende des Abschnitts
   stehen zu bleiben. */
.zuckerstern-zimtstern-grid {
  max-width: 1100px;
  margin: 0 auto;
  display: grid;
  grid-template-columns: 42fr 58fr;
  gap: 3rem;
  align-items: stretch;
}

.zuckerstern-zimtstern-figure-wrap {
  position: relative;
}

/* Sticky-Figur: bleibt beim Scrollen durch die Story-Karten rechts
   stehen, bis der Grid-Bereich endet (position:sticky ist an
   .zuckerstern-zimtstern-figure-wrap als Containing Block gebunden --
   er kann daher nie ueber nachfolgende Abschnitte hinausschweben).
   Bewusst KEIN Hintergrund/Rahmen/Radius mehr auf dem Wrapper -- die
   freigestellte Figur soll frei auf dem Seitenhintergrund stehen,
   kein sichtbarer Bildcontainer. Auf Tablet/Smartphone (<=900px) wird
   daraus eine normale, nicht-sticky Flaeche (siehe Media-Query
   unten), wie in der Vorgabe gefordert. */
.zuckerstern-zimtstern-figure-sticky {
  position: sticky;
  top: 6rem;
  height: 68vh;
  max-height: 640px;
}

/* object-fit:contain haelt das natuerliche Seitenverhaeltnis exakt
   ein (kein Zerren, keine Beschneidung), unabhaengig davon, ob die
   Sticky-Hoehe schmaler oder breiter als die Spalte ist -- Bild-Box
   selbst ist bewusst 100% x 100%, NICHT width:auto + max-width, das
   bei knapper Spaltenbreite sonst Hoehe/Breite auseinanderlaufen
   laesst. object-position:center bottom stellt Meister Zimtstern "auf
   dem Boden" der Sticky-Flaeche. Sehr weicher drop-shadow (folgt der
   tatsaechlichen Figuren-Silhouette, keine rechteckige Box) sorgt nur
   fuer etwas Bodenhaftung/Praesenz, ist aber kein Rahmen/Container. */
.zuckerstern-zimtstern-figure-media {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: contain;
  object-position: center bottom;
  filter: drop-shadow(0 20px 22px rgba(60, 40, 20, 0.16));
}

.zuckerstern-story {
  display: flex;
  flex-direction: column;
  gap: 1.85rem;
}

/* Kein Karten-Look mehr: die weiche Pergament-Toenung liegt auf einem
   eigenen ::before-Layer HINTER dem Text (mask-image faedet dort die
   Kanten aus) -- der Text selbst bleibt dadurch immer voll lesbar,
   auch nah am oberen/unteren Kartenrand, statt versehentlich mit
   auszublenden. Kein Schatten, kein Rahmen, kein Radius, keine
   erkennbare Boxform. */
.zuckerstern-story-card {
  position: relative;
  padding: 1.4rem 2rem;
}

.zuckerstern-story-card::before {
  content: "";
  position: absolute;
  inset: -0.6rem -0.4rem;
  z-index: -1;
  background: radial-gradient(120% 160% at 50% 30%, rgba(255, 253, 248, 0.9) 0%, rgba(253, 245, 226, 0.7) 45%, rgba(251, 241, 220, 0) 100%);
  -webkit-mask-image: linear-gradient(to right, transparent 0%, black 6%, black 94%, transparent 100%), linear-gradient(to bottom, transparent 0%, black 12%, black 88%, transparent 100%);
  -webkit-mask-composite: source-in, source-in;
  mask-image: linear-gradient(to right, transparent 0%, black 6%, black 94%, transparent 100%), linear-gradient(to bottom, transparent 0%, black 12%, black 88%, transparent 100%);
  mask-composite: intersect;
}

.zuckerstern-story-icon {
  position: relative;
  display: inline-flex;
  margin-bottom: 0.5rem;
  color: var(--color-gold);
}

.zuckerstern-story-icon svg {
  width: 20px;
  height: 20px;
  fill: none;
  stroke: currentColor;
  stroke-width: 1.3;
  stroke-linecap: round;
  stroke-linejoin: round;
}

/* Kleine begleitende Akzente neben den Icons -- feine goldene Funken
   bzw. eine winzige violette Bluete, je nach thematischer Passung
   (Zutaten-Karte bekommt die Bluete). Rein dekorativ, sehr zurueck-
   haltend, damit der Text im Mittelpunkt bleibt. */
.zuckerstern-story-icon-spark {
  position: absolute;
  top: -4px;
  left: 16px;
  font-size: 0.6rem;
  color: rgba(var(--color-gold-rgb), 0.75);
}

.zuckerstern-story-icon-bloom {
  position: absolute;
  top: -2px;
  left: 17px;
  font-size: 0.7rem;
  color: rgba(122, 74, 138, 0.55);
}

.zuckerstern-story-card h3 {
  margin: 0 0 0.5rem;
  font-family: var(--font-heading);
  font-size: 1.15rem;
  color: var(--color-gold-light);
}

/* Feine goldene Zierlinie mit Stern statt einer dicken Trennlinie --
   dieselbe sitewide genutzte .ursprung-story-divider-Technik, hier nur
   kompakter (weniger Aussenabstand) fuer den Einsatz direkt unter
   einer h3 innerhalb einer Story-Karte statt zwischen Fliesstext-
   Absaetzen. */
.zuckerstern-story-divider {
  margin: 0 auto 0.9rem 0;
  max-width: 140px;
}

.zuckerstern-story-card p {
  margin: 0;
  color: var(--color-parchment);
  line-height: 1.75;
}

/* Verbindende Elemente zwischen den Erzaehlabschnitten statt leerer
   Zwischenraeume: duenne goldene Ranke mit einem kleinen Stern bzw.
   einer Bluete in der Mitte -- ersetzt einen Teil des vorherigen
   .zuckerstern-story-Gaps (gap bleibt kleiner, siehe unten), damit
   die Karten wie Kapitel EINER fortlaufenden Fuehrung wirken statt
   wie unabhaengige, durch Leerraum getrennte Boxen. */
.zuckerstern-story-connector {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  padding: 0 1rem;
}

.zuckerstern-story-connector-line {
  flex: 1;
  max-width: 90px;
  height: 1px;
  background: linear-gradient(to right, transparent, rgba(var(--color-gold-rgb), 0.5));
}

.zuckerstern-story-connector-line:last-child {
  background: linear-gradient(to left, transparent, rgba(var(--color-gold-rgb), 0.5));
}

.zuckerstern-story-connector-mark {
  flex-shrink: 0;
  font-size: 0.75rem;
  color: rgba(var(--color-gold-rgb), 0.8);
}

.zuckerstern-story-connector-bloom {
  color: rgba(122, 74, 138, 0.55);
}

/* Sehr kleiner, dezenter Loomus-Hinweis am Ende der Fuehrung -- nur
   zwei winzige, statische Krumen, keine Animation/kein grosser
   Auftritt (der folgt erst spaeter im Verkaufsbereich). */
.zuckerstern-story-crumb-hint {
  display: block;
  margin-top: 0.9rem;
  text-align: right;
  opacity: 0.55;
}

.zuckerstern-story-crumb {
  display: inline-block;
  font-size: 0.85rem;
  transform: rotate(-8deg);
}

.zuckerstern-story-crumb-small {
  font-size: 0.6rem;
  margin-left: 0.2rem;
  transform: rotate(12deg);
  vertical-align: text-bottom;
}

/* Sehr sanfter warmer Lichtschein hinter Meister Zimtstern, der leicht
   in die Textspalte hineinreicht -- soll ihn optisch mit den
   Erzaehlabschnitten verbinden statt wie eine unabhaengig daneben
   stehende Figur wirken zu lassen. Kein Rahmen/keine Box, nur ein
   radialer Farbschimmer. */
.zuckerstern-zimtstern-figure-glow {
  position: absolute;
  top: 15%;
  left: 30%;
  width: 100%;
  height: 70%;
  background: radial-gradient(ellipse 60% 60% at 50% 50%, rgba(255, 214, 130, 0.16) 0%, transparent 70%);
  pointer-events: none;
  z-index: 0;
}

@media (max-width: 900px) {
  .zuckerstern-zimtstern-grid {
    grid-template-columns: 1fr;
    gap: 1.75rem;
  }

  .zuckerstern-zimtstern-figure-glow {
    display: none;
  }

  .zuckerstern-zimtstern-figure-sticky {
    position: static;
    height: auto;
    max-height: none;
    padding: 0 0 0.5rem;
  }

  .zuckerstern-zimtstern-figure-media {
    height: auto;
    width: auto;
    max-height: 58vh;
    margin: 0 auto;
  }
}

/* 4. MAGISCHE VORRATSKAMMER -- wirkt als ein grosses, zusammenhaengendes
   Holzregal (.zuckerstern-shelf), nicht als sechs einzelne Produkt-
   karten: dunkles warmes Holz, feine Wasserzeichen-Ranken, goldene
   "Beschlaege" in den Ecken. Jede Zutat sitzt als .zuckerstern-
   ingredient-niche darin wie eine eingelassene Nische (Inset-Schatten
   statt Karten-Drop-Shadow). */
.zuckerstern-vorratskammer {
  max-width: 1100px;
  margin: 0 auto;
  text-align: center;
}

/* Ueberschrift + Unterzeile stecken bereits im gelieferten Bild --
   deshalb kein zusaetzlicher Text/Rahmen/Kasten, echte Transparenz
   (PNG mit Alphakanal) bleibt erhalten, der cremefarbene Seiten-
   hintergrund scheint dahinter durch. */
.zuckerstern-vorratskammer-heading-img {
  display: block;
  width: 100%;
  max-width: 1000px;
  height: auto;
  margin: 0 auto;
}

.zuckerstern-section-subtitle {
  max-width: 480px;
  margin: 0.4rem auto 0;
  font-size: 0.88rem;
  font-weight: 300;
  font-style: italic;
  letter-spacing: 0.01em;
  color: var(--color-parchment-dim);
}

/* Erlaubt horizontales Scrollen, falls .zuckerstern-shelf (min-width
   weiter unten) auf sehr schmalen Bildschirmen breiter als der
   Viewport ist -- so bleiben Regal und Glaeser immer in einer
   lesbaren Mindestgroesse sichtbar, statt auf unleserliche Miniaturen
   zu schrumpfen (siehe Vorgabe). Ohne Overflow (Desktop/Tablet)
   bleibt die Eigenschaft wirkungslos. */
.zuckerstern-shelf-scroll {
  margin-top: 1.1rem;
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
  padding-bottom: 0.5rem;
}

/* Das gelieferte Regalbild ist die alleinige Kulisse (unveraendert,
   nicht neu gezeichnet) -- .zuckerstern-shelf haelt per aspect-ratio
   exakt dessen Seitenverhaeltnis, damit die in Prozent gesetzten
   Nischen-Positionen bei jeder Breite exakt auf den gemalten Faechern
   sitzen. min-width verhindert ein Schrumpfen unter eine lesbare
   Groesse (siehe .zuckerstern-shelf-scroll oben). */
.zuckerstern-shelf {
  position: relative;
  width: 100%;
  min-width: 640px;
  max-width: 1100px;
  aspect-ratio: 1535 / 1024;
  margin: 0 auto;
}

/* Weicher Ausblend-Rand an allen vier Kanten (Opaque-Zone bewusst
   grosszuegig, damit alle sechs Nischen samt Glaesern vollstaendig
   scharf bleiben -- Nischen sitzen zwischen 14/86% horizontal und
   17/85% vertikal, siehe Inline-Positionen im HTML), damit die
   rechteckige Fotokante nicht hart gegen den cremefarbenen
   Seitenhintergrund steht. */
.zuckerstern-shelf-bg {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  -webkit-mask-image:
    linear-gradient(to right, transparent 0%, black 4%, black 96%, transparent 100%),
    linear-gradient(to bottom, transparent 0%, black 4%, black 96%, transparent 100%);
  -webkit-mask-composite: source-in, source-in;
  mask-image:
    linear-gradient(to right, transparent 0%, black 4%, black 96%, transparent 100%),
    linear-gradient(to bottom, transparent 0%, black 4%, black 96%, transparent 100%);
  mask-composite: intersect;
}

.zuckerstern-ingredients-grid {
  position: absolute;
  inset: 0;
}

/* Jede Zutat ist ueber links/oben/Breite/Hoehe (siehe Inline-Style
   im HTML) exakt auf eines der sechs gemalten Faecher des Regalbilds
   positioniert -- kein eigener Rahmen/Hintergrund mehr, das Foto
   liefert Holz/Licht/Nische bereits selbst. Glas und Beschreibung
   liegen als eigene, unabhaengige Ebenen darueber (kein Einbacken ins
   Regalbild). */
.zuckerstern-ingredient-niche {
  position: absolute;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: flex-start;
  padding-top: 3%;
}

/* object-fit:contain + width/height:auto haelt Transparenz und
   Seitenverhaeltnis jedes Glases exakt ein (kein Beschnitt, kein
   Zerren), max-width/max-height sorgen zugleich dafuer, dass alle
   sechs -- trotz unterschiedlicher Glasformen (rund, sternfoermig,
   Flasche) -- optisch aehnlich gross wirken und genug Abstand zu den
   Fachraendern behalten. transform/filter sind fuer den dezenten
   Hover unten vorbereitet. */
.zuckerstern-ingredient-media {
  display: block;
  flex-shrink: 0;
  width: auto;
  height: auto;
  max-width: 84%;
  max-height: 88%;
  object-fit: contain;
  transition: transform 0.35s ease, filter 0.35s ease;
}

/* Kleines Pergament-Schild statt grossem weissen Kasten -- sitzt am
   unteren Fachrand, Glas bleibt der Hauptdarsteller. Immer sichtbar
   (kein Hover-Reveal), damit auf Touch-Geraeten keine Information
   verloren geht; Hover hebt Rahmen/Textfarbe nur etwas staerker
   hervor. */
.zuckerstern-ingredient-label {
  margin: 0.3rem 0 0;
  width: 94%;
  max-width: 94%;
  padding: 0.22rem 0.4rem;
  background: radial-gradient(140% 160% at 50% 30%, rgba(253, 246, 230, 0.95) 0%, rgba(243, 230, 200, 0.9) 100%);
  border-radius: 6px;
  font-size: 0.6rem;
  line-height: 1.3;
  color: #7a6650;
  text-align: center;
  transition: color 0.35s ease;
}

/* Sehr dezente Hover-/Tap-Vorbereitung: Beschreibung ist bereits ohne
   Hover vollstaendig sichtbar -- Hover hebt sie nur etwas staerker
   hervor. Glas skaliert max. 4%, weiches Golden-Glow per drop-shadow
   (folgt der Glas-Silhouette, kein rechteckiger Rahmen), 2 kleine
   Lichtpunkte blenden sanft ein. Alles reine CSS-Transitions, keine
   Animation/kein JS, keine Rotation/kein Springen. */
.zuckerstern-ingredient-niche:hover .zuckerstern-ingredient-media,
.zuckerstern-ingredient-niche:focus-within .zuckerstern-ingredient-media {
  transform: scale(1.04);
  filter: drop-shadow(0 0 16px rgba(255, 214, 140, 0.55));
}

.zuckerstern-ingredient-niche:hover .zuckerstern-ingredient-label,
.zuckerstern-ingredient-niche:focus-within .zuckerstern-ingredient-label {
  color: #4a3222;
}

/* Vorbereitete Ebene fuer die zwei kleinen Lichtpunkte bei Hover/Tap
   -- aktuell rein dekorativ (opacity-Fade, keine Bewegung), spaeter
   per JS um weitere Partikel ergaenzbar. */
.zuckerstern-ingredient-sparkles {
  position: absolute;
  inset: 0;
  pointer-events: none;
}

.zuckerstern-ingredient-sparkles::before,
.zuckerstern-ingredient-sparkles::after {
  content: "";
  position: absolute;
  width: 5px;
  height: 5px;
  border-radius: 50%;
  background: #ffe9b8;
  box-shadow: 0 0 6px 2px rgba(255, 224, 150, 0.7);
  opacity: 0;
  transition: opacity 0.4s ease;
}

.zuckerstern-ingredient-sparkles::before {
  top: 22%;
  left: 24%;
}

.zuckerstern-ingredient-sparkles::after {
  top: 32%;
  right: 22%;
}

.zuckerstern-ingredient-niche:hover .zuckerstern-ingredient-sparkles::before,
.zuckerstern-ingredient-niche:hover .zuckerstern-ingredient-sparkles::after,
.zuckerstern-ingredient-niche:focus-within .zuckerstern-ingredient-sparkles::before,
.zuckerstern-ingredient-niche:focus-within .zuckerstern-ingredient-sparkles::after {
  opacity: 1;
}

@media (prefers-reduced-motion: reduce) {
  .zuckerstern-ingredient-media,
  .zuckerstern-ingredient-label,
  .zuckerstern-ingredient-sparkles::before,
  .zuckerstern-ingredient-sparkles::after {
    transition: none;
  }
}

.zuckerstern-vorratskammer-note {
  display: inline-block;
  margin: 2rem auto 0;
  padding: 1rem 1.75rem;
  max-width: 420px;
  background: radial-gradient(120% 140% at 50% 30%, #fdf6e6 0%, #f6e9cc 60%, #f3e6c8 100%);
  border-radius: 10px;
  box-shadow: 0 8px 24px rgba(90, 58, 30, 0.08);
  transform: rotate(-1deg);
}

.zuckerstern-vorratskammer-note-text {
  display: block;
  font-family: var(--font-heading);
  font-style: italic;
  font-size: 0.98rem;
  color: #4a3222;
}

.zuckerstern-vorratskammer-note-sign {
  display: block;
  margin-top: 0.4rem;
  font-family: "Alex Brush", cursive;
  font-size: 1.5rem;
  line-height: 1;
  color: var(--color-gold-light);
}

/* 5. DIE GROSSE BAECKEREIAUSLAGE -- gleiche Technik wie die Vorrats-
   kammer weiter oben: das gelieferte Thekenbild ist die alleinige
   Kulisse (unveraendert), .zuckerstern-auslage-theke haelt per
   aspect-ratio exakt dessen Seitenverhaeltnis, damit die in Prozent
   gesetzten Fach-Positionen bei jeder Breite exakt sitzen.
   .zuckerstern-auslage-scroll erlaubt horizontales Scrollen, falls
   die (per min-width gesicherte) Mindestgroesse auf sehr schmalen
   Bildschirmen breiter als der Viewport ist -- Theke/Produkte
   schrumpfen dadurch nie auf unleserliche Miniaturen. */
.zuckerstern-auslage {
  max-width: 1200px;
  margin: 0 auto;
  text-align: center;
}

.zuckerstern-auslage-scroll {
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
  padding-bottom: 0.5rem;
}

.zuckerstern-auslage-theke {
  position: relative;
  width: 100%;
  min-width: 640px;
  max-width: 1200px;
  aspect-ratio: 1535 / 1024;
  margin: 0 auto;
}

/* Weicher Ausblend-Rand an allen vier Kanten -- Opaque-Zone
   grosszuegig bemessen (Produkte reichen bis ca. 12/88% horizontal,
   25/73% vertikal, siehe vermessene Fach-Positionen), unten/seitlich
   etwas staerker als oben, da dort ohnehin schon Dekoration (Laternen/
   Bluten) bis nah an den Bildrand reicht. */
.zuckerstern-auslage-theke-bg {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  -webkit-mask-image:
    linear-gradient(to right, transparent 0%, black 3%, black 97%, transparent 100%),
    linear-gradient(to bottom, transparent 0%, black 2%, black 95%, transparent 100%);
  -webkit-mask-composite: source-in, source-in;
  mask-image:
    linear-gradient(to right, transparent 0%, black 3%, black 97%, transparent 100%),
    linear-gradient(to bottom, transparent 0%, black 2%, black 95%, transparent 100%);
  mask-composite: intersect;
}

.zuckerstern-products-grid {
  position: absolute;
  inset: 0;
}

/* Jedes Fach ist ein eigenstaendiges <button> (siehe HTML), exakt auf
   eines der sechs sichtbaren Auslagefaecher positioniert. Reset der
   Button-Basisstile, damit es rein visuell wie ein unsichtbarer
   Hotspot wirkt, kein UI-Chrome. */
.zuckerstern-product-slot {
  position: absolute;
  display: block;
  border: none;
  background: none;
  padding: 0;
  margin: 0;
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
  font: inherit;
  color: inherit;
  text-align: center;
  z-index: 1;
}

.zuckerstern-product-slot:focus-visible {
  outline: 2px solid rgba(var(--color-gold-rgb), 0.75);
  outline-offset: 6px;
  border-radius: 10px;
}

/* Warmer Lichtschein hinter dem Produkt -- nur bei Hover/Fokus/Tap
   sichtbar, keine Rotation/kein Springen, nur ein sehr sanftes
   Aufleuchten. */
.zuckerstern-product-glow {
  position: absolute;
  left: 50%;
  bottom: 6%;
  width: 92%;
  aspect-ratio: 1;
  transform: translate(-50%, 18%);
  border-radius: 50%;
  background: radial-gradient(circle, rgba(255, 214, 130, 0.55) 0%, rgba(255, 196, 110, 0.22) 45%, transparent 72%);
  opacity: 0;
  transition: opacity 0.35s ease;
  pointer-events: none;
  z-index: 0;
}

/* Produktbild: bereits auf den sichtbaren Bildinhalt zugeschnitten
   (keine Transparenzraender), daher reicht width:108%/height:auto,
   um es proportional zur Fachbreite zu skalieren. bottom:12% verankert
   es nahe der Fachunterkante, damit es wirklich "im" Fach zu stehen
   scheint statt lose zu schweben -- gegen das gelieferte Thekenbild
   per Kompositing-Vorschau vermessen, passt fuer alle sechs Faecher
   gleichermassen (unterschiedliche Bildseitenverhaeltnisse gleichen
   sich durch height:auto automatisch aus). */
.zuckerstern-product-media {
  position: absolute;
  left: 50%;
  bottom: 12%;
  width: 108%;
  transform: translateX(-50%);
  z-index: 1;
}

.zuckerstern-product-media img {
  display: block;
  width: 100%;
  height: auto;
  filter: drop-shadow(0 6px 10px rgba(50, 25, 10, 0.28));
  transition: transform 0.35s ease, filter 0.35s ease;
}

.zuckerstern-product-slot:hover .zuckerstern-product-media img,
.zuckerstern-product-slot:focus-visible .zuckerstern-product-media img,
.zuckerstern-product-slot.is-active .zuckerstern-product-media img {
  transform: scale(1.045);
  filter: drop-shadow(0 9px 16px rgba(50, 25, 10, 0.32));
}

.zuckerstern-product-slot:hover .zuckerstern-product-glow,
.zuckerstern-product-slot:focus-visible .zuckerstern-product-glow,
.zuckerstern-product-slot.is-active .zuckerstern-product-glow {
  opacity: 1;
}

/* Wenige dezente Funken -- unsichtbar im Ruhezustand, spielen ihre
   Animation nur ab, waehrend das Fach aktiv ist (Hover/Fokus/Tap). */
.zuckerstern-product-sparkles {
  position: absolute;
  inset: -14% -8% 4% -8%;
  pointer-events: none;
  z-index: 2;
}

.zuckerstern-product-sparkles span {
  position: absolute;
  display: block;
  color: rgba(var(--color-gold-rgb), 0.95);
  font-size: 0.8rem;
  line-height: 1;
  opacity: 0;
  filter: drop-shadow(0 0 4px rgba(var(--color-gold-rgb), 0.7));
}

.zuckerstern-product-sparkles span:nth-child(1) { top: 8%; left: 10%; }
.zuckerstern-product-sparkles span:nth-child(2) { top: -2%; left: 52%; font-size: 0.65rem; }
.zuckerstern-product-sparkles span:nth-child(3) { top: 22%; left: 86%; font-size: 0.7rem; }

.zuckerstern-product-slot:hover .zuckerstern-product-sparkles span,
.zuckerstern-product-slot:focus-visible .zuckerstern-product-sparkles span,
.zuckerstern-product-slot.is-active .zuckerstern-product-sparkles span {
  animation: zuckerstern-product-sparkle-pop 1.7s ease-in-out infinite;
}

.zuckerstern-product-sparkles span:nth-child(2) { animation-delay: 0.45s; }
.zuckerstern-product-sparkles span:nth-child(3) { animation-delay: 0.9s; }

@keyframes zuckerstern-product-sparkle-pop {
  0%, 100% { opacity: 0; transform: translateY(0) scale(0.6); }
  40% { opacity: 1; transform: translateY(-7px) scale(1); }
  75% { opacity: 0.55; transform: translateY(-12px) scale(0.9); }
}

/* Maerchenhafte Produktinfo -- erscheint ueber dem vorhandenen leeren
   Namensschild-Rahmen an der Fachunterkante (bereits Teil des
   Thekenbilds), nicht als moderner weisser Standardkasten. Bewusst
   etwas breiter als das kleine gravierte Schild selbst, damit Name +
   Satz lesbar bleiben. */
.zuckerstern-product-label {
  position: absolute;
  left: 50%;
  bottom: -6%;
  transform: translate(-50%, 6px) scale(0.94);
  width: max(150px, 138%);
  max-width: 210px;
  padding: 0.5em 0.7em 0.55em;
  background: linear-gradient(180deg, rgba(253, 246, 230, 0.97) 0%, rgba(245, 230, 196, 0.97) 100%);
  border: 1px solid rgba(var(--color-gold-rgb), 0.6);
  border-radius: 12px;
  box-shadow: 0 10px 22px rgba(55, 32, 14, 0.3);
  opacity: 0;
  pointer-events: none;
  transition: opacity 0.25s ease, transform 0.25s ease;
  z-index: 5;
}

.zuckerstern-product-slot:hover .zuckerstern-product-label,
.zuckerstern-product-slot:focus-visible .zuckerstern-product-label,
.zuckerstern-product-slot.is-active .zuckerstern-product-label {
  opacity: 1;
  transform: translate(-50%, 0) scale(1);
}

.zuckerstern-product-label-name {
  display: block;
  font-family: var(--font-heading);
  font-weight: 700;
  font-size: 0.8rem;
  color: #6b3f1f;
  margin-bottom: 0.2em;
}

.zuckerstern-product-label-text {
  display: block;
  font-size: 0.66rem;
  line-height: 1.35;
  color: #5a4530;
}

@media (max-width: 900px) {
  .zuckerstern-product-label {
    max-width: 175px;
  }

  .zuckerstern-product-label-text {
    font-size: 0.62rem;
  }
}

@media (prefers-reduced-motion: reduce) {
  .zuckerstern-product-sparkles span {
    animation: none !important;
  }
}

/* 6. BESONDERE KREATION */
.zuckerstern-kreation {
  max-width: 1100px;
  margin: 0 auto;
  display: grid;
  grid-template-columns: 1.1fr 0.9fr;
  gap: 3rem;
  align-items: center;
}

.zuckerstern-kreation-media {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 1.5rem 0;
}

/* Sehr dezenter warmer Goldschein hinter der Torte statt einer harten
   Karte/Box -- die Torte selbst traegt bereits einen echten Alphakanal
   (per Pixelmessung verifiziert), liegt dadurch frei auf dem
   Seitenhintergrund. */
.zuckerstern-kreation-glow {
  position: absolute;
  left: 50%;
  top: 50%;
  width: 82%;
  aspect-ratio: 1;
  transform: translate(-50%, -50%);
  border-radius: 50%;
  background: radial-gradient(circle, rgba(255, 214, 130, 0.42) 0%, rgba(255, 196, 110, 0.16) 45%, transparent 72%);
  pointer-events: none;
  z-index: 0;
}

.zuckerstern-kreation-sparkle {
  z-index: 2;
}

.zuckerstern-kreation-img {
  position: relative;
  z-index: 1;
  display: block;
  width: 100%;
  max-width: 420px;
  height: auto;
  margin: 0 auto;
  filter: drop-shadow(0 20px 34px rgba(75, 45, 20, 0.28));
}

@media (max-width: 640px) {
  .zuckerstern-kreation-img {
    max-width: 300px;
  }
}

.zuckerstern-kreation-text h2 {
  margin: 0 0 0.75rem;
  font-family: var(--font-heading);
  color: var(--color-gold-light);
}

.zuckerstern-kreation-text p {
  margin: 0;
  color: var(--color-parchment);
  line-height: 1.75;
}

@media (max-width: 900px) {
  .zuckerstern-kreation {
    grid-template-columns: 1fr;
    gap: 1.75rem;
    text-align: center;
  }
}

/* 7. KLEINER LOOMUS-MOMENT (Arbeitstitel: Loomus Cookie Surprise) --
   bewusst sehr dezent, kein visuelles Gewicht, keine Funktion (folgt
   spaeter). */
.zuckerstern-loomus-moment {
  max-width: 640px;
  margin: 0 auto;
  padding: 1.5rem 1.5rem 0;
  text-align: center;
}

.zuckerstern-loomus-panel {
  position: relative;
  display: inline-flex;
  align-items: center;
  gap: 0.7rem;
  margin: 0;
  padding: 0.75rem 2.2rem;
  background: linear-gradient(180deg, rgba(253, 246, 230, 0.92) 0%, rgba(247, 234, 202, 0.88) 100%);
  border: 1px solid rgba(var(--color-gold-rgb), 0.5);
  border-radius: 999px;
  box-shadow: 0 8px 20px rgba(75, 45, 20, 0.1);
  color: #5a4530;
  font-size: 0.92rem;
  line-height: 1.5;
  text-align: left;
}

.zuckerstern-loomus-panel-bloom {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  font-size: 1rem;
  color: rgba(122, 74, 138, 0.55);
  pointer-events: none;
}

.zuckerstern-loomus-panel-bloom-left {
  left: -0.3rem;
}

.zuckerstern-loomus-panel-bloom-right {
  right: -0.3rem;
}

.zuckerstern-loomus-panel-spark {
  z-index: 1;
}

/* 8. ABSCHLUSS MIT MEISTER ZIMTSTERN -- der Farbverlauf startet UND
   endet jetzt beim cremefarbenen Seitenhintergrund (statt hart bei
   #4a3450/#b97f52), damit sowohl der Uebergang vom Loomus-Hinweis oben
   als auch zum Footer unten weich verschmelzen statt als harte
   horizontale Kante zu wirken -- der dunkle Abendton bleibt in der
   Mitte weiterhin dominant, nur die aeussersten ~8% blenden aus. */
.zuckerstern-abschied {
  position: relative;
  width: 100%;
  padding: 5rem 1.5rem 5.5rem;
  text-align: center;
  overflow: hidden;
  background: linear-gradient(180deg, #f6e6c8 0%, #4a3450 12%, #6b4a5c 50%, #7c5566 72%, #b97f52 92%, #f6e6c8 100%);
}

.zuckerstern-abschied-media {
  position: absolute;
  inset: 0;
  background: radial-gradient(ellipse 55% 55% at 50% 30%, rgba(246, 227, 186, 0.18) 0%, transparent 68%);
}

/* Sehr dezente Sterne/Funken + zwei kleine violette Bluetenranken an
   den aeusseren Bereichen, dazu die (bereits vorhandene) Loomus-
   Pfotenspur ganz leicht am unteren Rand -- als ob er gerade aus dem
   Abschiedsbereich herausgehuscht waere. Alles pointer-events:none,
   rein dekorativ. */
.zuckerstern-abschied-deco {
  position: absolute;
  inset: 0;
  z-index: 0;
  pointer-events: none;
}

.zuckerstern-abschied-spark {
  font-size: 0.85rem;
}

.zuckerstern-abschied-bloom {
  position: absolute;
  top: 46%;
  font-size: 1.4rem;
  color: rgba(233, 201, 240, 0.4);
  filter: drop-shadow(0 0 6px rgba(233, 201, 240, 0.25));
}

.zuckerstern-abschied-bloom-left {
  left: 3%;
  transform: rotate(-12deg);
}

.zuckerstern-abschied-bloom-right {
  right: 3%;
  transform: rotate(12deg) scaleX(-1);
}

.zuckerstern-abschied-pawprints {
  position: absolute;
  bottom: 6%;
  right: 8%;
  width: 130px;
  height: auto;
  opacity: 0.3;
  transform: rotate(8deg);
}

.zuckerstern-abschied-content {
  position: relative;
  z-index: 1;
  max-width: 560px;
  margin: 0 auto;
}

.zuckerstern-abschied-content h2 {
  margin: 0 0 0.9rem;
  font-family: var(--font-heading);
  font-size: clamp(1.7rem, 3.4vw, 2.2rem);
  color: #fff8ea;
  text-shadow: 0 2px 18px rgba(246, 217, 138, 0.25);
}

.zuckerstern-abschied-divider {
  margin: 0 auto 1.4rem;
}

.zuckerstern-abschied-divider .ursprung-story-divider-line:first-child {
  background: linear-gradient(to right, transparent, rgba(246, 217, 138, 0.75) 100%);
}

.zuckerstern-abschied-divider .ursprung-story-divider-line:last-child {
  background: linear-gradient(to left, transparent, rgba(246, 217, 138, 0.75) 100%);
}

.zuckerstern-abschied-content p {
  margin: 0;
  color: #f6e3ba;
  font-size: 0.98rem;
  font-style: italic;
  letter-spacing: 0.01em;
  opacity: 0.9;
}

.zuckerstern-abschied-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 1.1rem;
  justify-content: center;
  margin-top: 2.4rem;
}

/* Beide Buttons bewusst NICHT ueber die generischen .btn-primary/
   -outline-Farben hinaus veraendert, sondern ausschliesslich innerhalb
   von .zuckerstern-abschied ueberschrieben -- betrifft dadurch
   garantiert keine anderen Buttons auf dieser oder anderen Seiten. */
.zuckerstern-abschied .btn {
  position: relative;
  padding: 0.85rem 1.9rem;
  border-radius: 999px;
  font-family: var(--font-heading);
  font-weight: 600;
  transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s ease, border-color 0.3s ease;
}

/* body.theme-zuckerstern vorangestellt: die sitewide-Regel
   body.theme-zuckerstern .btn-primary/-outline (weiter oben in dieser
   Datei) hat durch das zusaetzliche body-Element eine hoehere
   Spezifitaet als ein reines .zuckerstern-abschied .btn-primary
   ohne Element-Selektor -- ohne dieses Praefix wuerde sie hier
   weiterhin gewinnen und die eigene Gradient-Optik ueberschreiben. */
body.theme-zuckerstern .zuckerstern-abschied .btn-primary {
  background: linear-gradient(180deg, #f0cf85 0%, #d9a94f 100%);
  border: 1px solid rgba(255, 248, 234, 0.6);
  color: #4a2f12;
  box-shadow: 0 8px 22px rgba(217, 169, 79, 0.35);
}

.zuckerstern-abschied .btn-primary::before {
  content: "✦";
  margin-right: 0.4em;
  opacity: 0.7;
}

body.theme-zuckerstern .zuckerstern-abschied .btn-primary:hover {
  background: linear-gradient(180deg, #f6dda0 0%, #e3b664 100%);
  transform: translateY(-2px) scale(1.03);
  box-shadow: 0 12px 30px rgba(217, 169, 79, 0.5);
}

body.theme-zuckerstern .zuckerstern-abschied .btn-outline {
  background: rgba(255, 248, 234, 0.08);
  border: 1px solid rgba(255, 248, 234, 0.5);
  color: #fff8ea;
  box-shadow: 0 4px 14px rgba(30, 15, 10, 0.16);
}

body.theme-zuckerstern .zuckerstern-abschied .btn-outline:hover {
  background: rgba(255, 248, 234, 0.16);
  border-color: rgba(246, 217, 138, 0.85);
  color: #fff8ea;
  transform: translateY(-2px) scale(1.03);
  box-shadow: 0 8px 22px rgba(217, 169, 79, 0.28);
}

@media (max-width: 640px) {
  .zuckerstern-abschied {
    padding: 3.5rem 1.25rem 4rem;
  }

  .zuckerstern-abschied-bloom {
    font-size: 1.05rem;
    opacity: 0.7;
  }

  .zuckerstern-abschied-pawprints {
    width: 88px;
    bottom: 4%;
    right: 4%;
  }

  .zuckerstern-abschied-actions {
    flex-direction: column;
    align-items: center;
    gap: 0.85rem;
    margin-top: 1.8rem;
  }

  .zuckerstern-abschied .btn {
    width: min(280px, 82vw);
  }
}

@media (max-width: 900px) {
  .zuckerstern-eingang-media {
    -webkit-mask-image: linear-gradient(to bottom, transparent 0%, #000 55px, #000 calc(100% - 55px), transparent 100%);
    mask-image: linear-gradient(to bottom, transparent 0%, #000 55px, #000 calc(100% - 55px), transparent 100%);
  }
}

@media (max-width: 620px) {
  .zuckerstern-hero {
    min-height: 74vh;
  }

  .zuckerstern-eingang-media {
    -webkit-mask-image: linear-gradient(to bottom, transparent 0%, #000 28px, #000 calc(100% - 28px), transparent 100%);
    mask-image: linear-gradient(to bottom, transparent 0%, #000 28px, #000 calc(100% - 28px), transparent 100%);
  }
}

/* ==========================================================================
   LOOMUS-RUNNING-GAG -- derselbe Loomus taucht beim Scrollen an
   verschiedenen Stellen der Baeckerei auf, verschwindet wieder und wird
   erst deutlich spaeter an anderer Stelle erneut sichtbar. Steuerung
   komplett per JS (siehe Skript in lumaria-zuckersternbaeckerei.html):
   IntersectionObserver an den [data-loomus-trigger]-Ankern schaltet
   jeweils genau EINE .is-active-Klasse, nie mehrere gleichzeitig. Alle
   Ebenen bewusst pointer-events:none, damit nie ein Klick/Tap auf
   Produkte, Buttons oder Links blockiert wird.
   ========================================================================== */

.zuckerstern-loomus-trigger {
  height: 1px;
  pointer-events: none;
}

/* Auftritte 1+2 ("laufend"/"mit Keks"): huschen quer durch den unteren
   Sichtbereich, position:fixed (nicht an eine Dokumentstelle gebunden).
   z-index unter der Navigation (20) und ueber normalem Seiteninhalt,
   dieselbe Konvention wie .loomus-flying-brush sitewide. display:none
   im Ruhezustand verhindert jede Restflaeche/jeden Klickbereich,
   solange kein Lauf aktiv ist. */
.zuckerstern-loomus-runner {
  position: fixed;
  bottom: 8%;
  left: 0;
  width: 150px;
  height: auto;
  z-index: 18;
  pointer-events: none;
  opacity: 0;
  display: none;
}

/* Der laufende Loomus zeigt jetzt eine Bilderreihe. Sie ist enger um
   ihn beschnitten als die frueherere Einzelgrafik -- nachgemessen 92
   statt 81 Prozent Inhalt. Bei gleicher CSS-Breite waere er also
   gewachsen; 133 statt 150 haelt ihn genau gleich gross. */
.zuckerstern-loomus-runner--laufend {
  width: 133px;
}

.zuckerstern-loomus-runner--laufend.is-active {
  display: block;
  animation: zuckerstern-loomus-run-ltr 3.2s ease-in-out forwards;
}

.zuckerstern-loomus-runner--keks {
  bottom: 13%;
}

.zuckerstern-loomus-runner--keks.is-active {
  display: block;
  animation: zuckerstern-loomus-run-rtl 3.2s ease-in-out forwards;
}

@keyframes zuckerstern-loomus-run-ltr {
  0% { opacity: 0; transform: translateX(-220px) translateY(0); }
  10% { opacity: 1; }
  50% { transform: translateX(50vw) translateY(-14px); }
  90% { opacity: 1; }
  100% { opacity: 0; transform: translateX(calc(100vw + 220px)) translateY(0); }
}

@keyframes zuckerstern-loomus-run-rtl {
  0% { opacity: 0; transform: translateX(calc(100vw + 220px)) translateY(0); }
  10% { opacity: 1; }
  50% { transform: translateX(50vw) translateY(-14px); }
  90% { opacity: 1; }
  100% { opacity: 0; transform: translateX(-220px) translateY(0); }
}

/* Auftritte an einer echten Kante (Schwanz hinters Regal, Kopf ueber
   die Thekenkante, letzter Peek ueber die Notiz): jeweils absolut
   positioniert relativ zu ihrem tatsaechlichen Bezugselement (siehe
   HTML-Kommentare dort), im Ruhezustand unsichtbar UND per translateY
   hinter die Kante verschoben. */
.zuckerstern-loomus-cameo {
  position: absolute;
  pointer-events: none;
  opacity: 0;
  z-index: 4;
}

/* .zuckerstern-shelf-scroll (Elternrahmen) hat overflow-x:auto, was
   per Spezifikation overflow-y automatisch ebenfalls auf "auto" statt
   "visible" setzt -- jeder Bleed ueber .zuckerstern-shelf hinaus wuerde
   dort abgeschnitten. Groesse/Position deshalb bewusst so gewaehlt,
   dass der Schwanz komplett innerhalb des Regals bleibt, in der einzig
   freien Ecke unten rechts (die sechs Glas-Nischen fuellen 14-86%/
   17-85%, siehe Inline-Positionen im HTML) -- keine Ueberschneidung
   mit dem letzten Glas. */
.zuckerstern-loomus-cameo--schwanz {
  width: 13%;
  max-width: 130px;
  right: 1%;
  bottom: 1%;
  transform: translateY(18%);
}

.zuckerstern-loomus-cameo--schwanz.is-active {
  animation: zuckerstern-loomus-schwanz-wag 1.8s ease-in-out forwards;
}

@keyframes zuckerstern-loomus-schwanz-wag {
  0%   { opacity: 0; transform: translateY(30%) rotate(0deg); }
  14%  { opacity: 1; transform: translateY(0) rotate(-2deg); }
  30%  { transform: translateY(0) rotate(3deg); }
  46%  { transform: translateY(0) rotate(-2deg); }
  62%  { transform: translateY(0) rotate(2deg); }
  82%  { opacity: 1; transform: translateY(0) rotate(0deg); }
  100% { opacity: 0; transform: translateY(30%) rotate(0deg); }
}

/* Faecher belegen 13-87% der Thekenbreite (siehe Inline-Positionen der
   Produkt-Slots im HTML) -- links davon bleibt nur ein schmaler freier
   Rand von 0-13%, Breite/Position hier bewusst so gewaehlt, dass Loomus
   sicher darin bleibt und kein Produkt ueberlagert. */
.zuckerstern-loomus-cameo--theke-peek {
  width: 11%;
  max-width: 110px;
  left: 1%;
  top: 64%;
  transform: translateY(55%);
}

.zuckerstern-loomus-cameo--theke-peek.is-active {
  animation: zuckerstern-loomus-peek 1.7s ease-in-out forwards;
}

@keyframes zuckerstern-loomus-peek {
  0%   { opacity: 0; transform: translateY(55%) translateX(0); }
  14%  { opacity: 1; transform: translateY(0) translateX(0); }
  45%  { transform: translateY(0) translateX(0); }
  58%  { transform: translateY(0) translateX(5px); }
  72%  { transform: translateY(0) translateX(-3px); }
  86%  { opacity: 1; transform: translateY(0) translateX(0); }
  100% { opacity: 0; transform: translateY(55%) translateX(0); }
}

/* Mehlsack: eigene, in sich geschlossene kleine Szene (Sack + Loomus
   bereits Teil derselben Grafik) -- braucht keine externe Kante, nur
   ein sanftes Einwackeln/Aussteigen statt einer permanenten starken
   Wackelanimation. */
.zuckerstern-loomus-sack-stage {
  position: relative;
  max-width: 1100px;
  height: 150px;
  margin: 0 auto;
}

.zuckerstern-loomus-cameo--mehlsack {
  left: 10%;
  bottom: 0;
  width: 140px;
  transform: translateY(20%);
}

.zuckerstern-loomus-cameo--mehlsack.is-active {
  animation: zuckerstern-loomus-sack-pop 2s ease-in-out forwards;
}

@keyframes zuckerstern-loomus-sack-pop {
  0%   { opacity: 0; transform: translateY(20%) rotate(0deg); }
  12%  { opacity: 1; transform: translateY(0) rotate(-1.5deg); }
  22%  { transform: translateY(0) rotate(1.5deg); }
  32%  { transform: translateY(0) rotate(0deg); }
  80%  { opacity: 1; transform: translateY(0) rotate(0deg); }
  100% { opacity: 0; transform: translateY(20%) rotate(0deg); }
}

/* Letzter Auftritt: lugt ueber die Loomus-Hinweis-Notiz. clip-path
   deckt die Grafik anfangs komplett ab und faehrt von oben nach unten
   auf -- da das Bild von oben nach unten Hoerner -> Augen -> Pfoetchen
   zeigt, entsteht dadurch automatisch genau die gewuenschte gestaffelte
   Reihenfolge (erst Hoerner, dann Augen, dann Pfoetchen), ganz ohne
   die Grafik in einzelne Ebenen zerlegen zu muessen. */
.zuckerstern-loomus-cameo--peek-final {
  width: 84px;
  right: 6%;
  top: -34px;
  transform: translateY(15%);
  clip-path: inset(100% 0 0 0);
}

.zuckerstern-loomus-cameo--peek-final.is-active {
  animation: zuckerstern-loomus-peek-final 1.6s ease-in-out forwards;
}

@keyframes zuckerstern-loomus-peek-final {
  0%   { opacity: 0; transform: translateY(15%); clip-path: inset(100% 0 0 0); }
  10%  { opacity: 1; }
  20%  { clip-path: inset(60% 0 0 0); }
  35%  { transform: translateY(0); clip-path: inset(0% 0 0 0); }
  78%  { opacity: 1; transform: translateY(0); clip-path: inset(0% 0 0 0); }
  100% { opacity: 0; transform: translateY(15%); clip-path: inset(100% 0 0 0); }
}

/* Pfotenspuren-Verbindungsstuecke zwischen zwei Auftritten: eigene,
   kompakte Buehne mit reservierter Hoehe, damit sie zur gewuenschten
   "genuegend Scrollstrecke"-Trennung selbst beitraegt. Die Abdruecke
   werden per clip-path-Schritt-Animation nacheinander sichtbar
   ("tap - tap - tap"), bleiben kurz stehen und verblassen dann
   gemeinsam wieder -- keine hektische Bewegung. */
.zuckerstern-loomus-trail-stage {
  position: relative;
  max-width: 700px;
  height: 90px;
  margin: 0 auto;
  overflow: hidden;
}

.zuckerstern-loomus-trail {
  position: absolute;
  left: 50%;
  top: 50%;
  width: 260px;
  transform: translate(-50%, -50%);
  opacity: 0;
  pointer-events: none;
  clip-path: inset(0 100% 0 0);
}

.zuckerstern-loomus-trail.is-active {
  animation: zuckerstern-loomus-trail-reveal 1.6s ease-out forwards;
}

@keyframes zuckerstern-loomus-trail-reveal {
  0%   { opacity: 0; clip-path: inset(0 100% 0 0); }
  6%   { opacity: 0.85; }
  55%  { opacity: 0.85; clip-path: inset(0 0 0 0); }
  80%  { opacity: 0.85; clip-path: inset(0 0 0 0); }
  100% { opacity: 0; clip-path: inset(0 0 0 0); }
}

@media (max-width: 900px) {
  .zuckerstern-loomus-runner {
    width: 108px;
  }

  .zuckerstern-loomus-cameo--schwanz {
    width: 12%;
    max-width: 70px;
    right: 2%;
    bottom: 2%;
  }

  .zuckerstern-loomus-cameo--theke-peek {
    width: 13%;
    max-width: 75px;
  }

  .zuckerstern-loomus-sack-stage {
    height: 115px;
  }

  .zuckerstern-loomus-cameo--mehlsack {
    width: 108px;
  }

  .zuckerstern-loomus-cameo--peek-final {
    width: 62px;
    top: -26px;
  }

  .zuckerstern-loomus-trail-stage {
    height: 70px;
  }

  .zuckerstern-loomus-trail {
    width: 190px;
  }
}

/* Mobile (<=767px): auf dem Handy wird deutlich schneller gescrollt --
   dieselben Auftritte laufen hier spuerbar kuerzer ab (nur die
   animation-duration wird ueberschrieben, Timing-Prozente/Keyframes
   bleiben identisch, skalieren dadurch automatisch mit). Die Laufzeiten
   werden zur Laufzeit per JS aus genau diesen CSS-Werten ausgelesen
   (getComputedStyle) -- hier aendern genuegt, kein Duplikat in
   JavaScript zu pflegen. */
@media (max-width: 767px) {
  .zuckerstern-loomus-runner--laufend.is-active {
    animation-duration: 1.9s;
  }

  .zuckerstern-loomus-runner--keks.is-active {
    animation-duration: 1.9s;
  }

  .zuckerstern-loomus-cameo--schwanz.is-active {
    animation-duration: 1.5s;
  }

  .zuckerstern-loomus-cameo--theke-peek.is-active {
    animation-duration: 1.4s;
  }

  .zuckerstern-loomus-cameo--mehlsack.is-active {
    animation-duration: 1.7s;
  }

  .zuckerstern-loomus-cameo--peek-final.is-active {
    animation-duration: 1.3s;
  }

  .zuckerstern-loomus-trail.is-active {
    animation-duration: 1.3s;
  }
}

@media (prefers-reduced-motion: reduce) {
  .zuckerstern-loomus-runner.is-active {
    display: block;
    animation: zuckerstern-loomus-fade-only 1.2s ease forwards;
    left: 50%;
    bottom: 10%;
    transform: translateX(-50%);
  }

  .zuckerstern-loomus-cameo.is-active {
    animation: zuckerstern-loomus-fade-only 1.2s ease forwards;
    clip-path: none;
  }

  .zuckerstern-loomus-trail.is-active {
    animation: zuckerstern-loomus-fade-only 1.2s ease forwards;
    clip-path: inset(0 0 0 0);
  }

  @keyframes zuckerstern-loomus-fade-only {
    0%, 100% { opacity: 0; }
    20%, 75% { opacity: 0.9; }
  }
}

/* ================================================================ */
/* MOBILE-OPTIMIERUNG INTRO-/HEADER-VIDEOS (<=767px)                 */
/* Desktop/Tablet komplett unveraendert -- betrifft ausschliesslich   */
/* @media(max-width:767px), spaeter im Quelltext als die jeweils      */
/* bestehenden 900px/640px-Regeln und daher bei gleicher Spezifitaet  */
/* automatisch fuehrend in diesem Bereich.                            */
/* ================================================================ */

/* HOME-Vollbild-Intro: die Kopfzeile "Tintenzauber Verlag" ist ins
   Video eingebrannt und fuellt fast die gesamte Videobreite -- object-
   fit:cover schnitt sie auf hohen Smartphone-Screens links/rechts an
   (per Frame-Analyse bestaetigt). contain zeigt das komplette Video
   unbeschnitten; der entstehende Rand wird von der ohnehin bereits
   vorhandenen .intro-overlay-Hintergrundfarbe (--color-ink-deep, hier
   ein dunkles Beere-Lila) gefuellt, kein reines Schwarz. Das Lumaria-
   Intro (theme-pastel-green) ist rein dekorativ/mittig komponiert
   (Herz im Baum) und uebersteht denselben Test unbeschnitten -- bleibt
   deshalb bewusst bei cover (volles, randloses Bild). */
@media (max-width: 767px) {
  body.theme-pastel-pink #intro-video {
    object-fit: contain;
  }
}

/* KORREKTUR (Rueckmeldung): normale Header-/Hero-Bilder duerfen NICHT
   angefasst werden -- nur die beiden Vollbild-Intro-Videos oben. Eine
   vorherige Fassung dieses Abschnitts vergroesserte/veraenderte hier
   zusaetzlich die Header-Hintergrundvideos von Home/Autorin/Lumaria/
   Ursprung von Lumaria/Blog/Marktplatz/Spiel & Spass/Gratis-Schatztruhe/
   Kids-Galerie/Post nach Lumaria/Karte von Lumaria -- das war nicht
   gewuenscht und wurde vollstaendig zurueckgenommen. Diese Header
   verwenden wieder ausschliesslich ihre urspruenglichen, schon vor
   dieser Session bestehenden 900px/640px-Regeln (siehe jeweils weiter
   oben im Quelltext), unveraendert. */

/* ================================================================ */
/* HOME "EHRLICH GEFRAGT" -- MOBILE-LAYOUT (<=767px)                  */
/* Desktop/Tablet komplett unveraendert. Auf Desktop liegt die Szene  */
/* absolut HINTER den drei Karten (Text ueberlagert das Bild bewusst  */
/* auf freiem Raum) -- auf schmalen Mobile-Breiten fuehrte dieselbe   */
/* Technik dazu, dass Bilddetails und Kartentext sichtbar kollidierten*/
/* (siehe Vorgabe). Neue Reihenfolge nur hier: Szene (mit eingebrann- */
/* tem "Ehrlich gefragt"-Schriftzug) als eigenstaendiges, volles Bild  */
/* OBERHALB, danach die drei Karten sauber untereinander, keine        */
/* Ueberlagerung mehr. */
@media (max-width: 767px) {
  .home-faq-bg-wrap {
    display: block;
    min-height: auto;
    overflow: visible;
    mask-image: none;
    -webkit-mask-image: none;
  }

  /* Weichgezeichnete Doppel-Ebene wird auf Mobile nicht mehr
     gebraucht (kein Vollflaechen-Hintergrund mehr, sondern ein
     eigenstaendiger, unbeschnittener Bildblock) -- spart zudem ein
     komplettes, redundantes zweites Video vom Laden/Dekodieren. */
  .home-faq-bg-video-blur {
    display: none;
  }

  .home-faq-bg-video {
    position: relative;
    inset: auto;
    display: block;
    width: 100%;
    height: auto;
    aspect-ratio: 1280 / 720;
    object-fit: contain;
    margin: 0 0 1.4rem;
  }

  .home-faq-bg-wrap > .section {
    position: relative;
    z-index: auto;
    padding-top: 0;
    padding-bottom: 2.5rem;
  }

  .home-faq-grid {
    gap: 1.1rem;
    margin-top: 0;
  }

  .home-faq-card {
    max-width: 88%;
    margin: 0 auto;
    padding: 1.3rem 1.2rem;
  }

  .home-faq-closing {
    margin-top: 2rem;
  }
}

/* ================================================================ */
/* HOME -- UEBERSCHRIFTEN AUF MOBILE GROESSER (<=767px)               */
/* Desktop/Tablet unveraendert. "Emmas geheime Welt" ist inzwischen   */
/* selbst eine grafische Ueberschrift (.home-book-heading-img, siehe  */
/* oben) und skaliert dadurch bereits automatisch mit ihrer Spalte -- */
/* kein eigener Mobile-Wert mehr noetig. Der echte h1 sowie das h2 von*/
/* "Ehrlich gefragt" sind bewusst visually-hidden (nichts zu          */
/* vergroessern). Fliesstext, Buttons, Karten-Unterueberschriften     */
/* (.home-faq-card h3) bleiben unveraendert, wie gewuenscht. */
@media (max-width: 767px) {
  /* "Keine Heldin, die alles von Anfang an kann" -- grafische
     Ueberschrift (PNG), daher Groessenanpassung ueber die Breite statt
     font-size; bisheriger Mobile-Wert (75%) wird um denselben ~18%-
     Faktor wie die vormalige Textueberschrift vergroessert. */
  .home-heldin-heading-img {
    width: 88%;
  }
}

/* ================================================================ */
/* SITEWEITE MOBILE-NAVIGATION (<=767px)                              */
/* Betrifft ausschliesslich @media(max-width:767px) und drei per JS   */
/* (main.js) zur Laufzeit ergaenzte Elemente (Logo-Link/-Bild vor     */
/* .main-nav, Backdrop, Deko-Grafik am Menue-Ende -- siehe dort) --   */
/* keine der 34 HTML-Dateien wird dafuer angefasst. Ab 768px greifen  */
/* weiterhin ausschliesslich die bestehenden, unveraenderten Regeln   */
/* (Tablet-Akkordeon ab 701px, Desktop-Hover ab 1024px). Spaeter im   */
/* Quelltext als die bestehende @media(max-width:700px)-Regel und     */
/* daher bei gleicher Selektor-Spezifitaet in der Ueberlappung         */
/* (641-700px) automatisch fuehrend. */
@media (max-width: 767px) {
  /* Kompakte Leiste statt der bisherigen grossen leeren Flaeche um den
     einzelnen Hamburger-Button. position:relative dient als Anker fuer
     das spaeter per top:100% andockende Drawer-Menue UND fuer den
     kleinen Stern in der unteren Trennlinie (::after). z-index haelt
     die Leiste ueber dem Abdunklungs-Overlay, wenn das Menue offen ist. */
  .site-header {
    position: relative;
    z-index: 96;
    flex-wrap: nowrap;
    align-items: center;
    justify-content: space-between;
    gap: 0.75rem;
    padding: 0.55rem 1rem;
    background: #fdf6ea;
    border-bottom: 1px solid rgba(var(--color-gold-rgb), 0.55);
  }

  .site-header::after {
    content: "\2726";
    position: absolute;
    left: 50%;
    bottom: -7px;
    transform: translateX(-50%);
    font-size: 0.65rem;
    line-height: 1;
    color: var(--color-gold-light);
    background: #fdf6ea;
    padding: 0 5px;
    pointer-events: none;
  }

  /* Logo links: per main.js einmalig als erstes Kind von .site-header
     eingefuegt (siehe dort), auf Desktop/Tablet bereits durch die
     Standard-Regel weiter oben (kein Media-Query) unsichtbar --
     height statt width gesetzt (die Grafik ist sehr breit/flach,
     ca. 4.2:1), width:auto haelt das Seitenverhaeltnis dadurch
     garantiert unverzerrt. */
  .mobile-nav-logo-link {
    display: flex;
    align-items: center;
    flex-shrink: 0;
  }

  .mobile-nav-logo-img {
    display: block;
    height: 27px;
    width: auto;
  }

  /* Ausnahme Kontaktseite: hat bereits ihre eigene, dedizierte
     Schriftzug-Zeile (.kontakt-header-brand, aus einer frueheren
     Anpassung dieser Seite) direkt ueber der Navigationsleiste -- das
     neu eingefuegte Logo wuerde dort ein zweites Mal direkt darunter
     erscheinen. Nur hier unterdrueckt, alle anderen Seiten unveraendert. */
  body.kontakt-page .mobile-nav-logo-link {
    display: none;
  }

  /* Ausnahme Kontaktseite: die eigene .kontakt-header-wrap-Regel setzt
     bereits ein eigenes padding-top (0.25rem) mit hoeherer Spezifitaet
     als die allgemeine .site-header-Regel oben -- dadurch wurde die
     Leiste hier ein paar Pixel niedriger als auf allen anderen Seiten.
     Gleiche Selektor-Spezifitaet, aber spaeter im Quelltext, damit die
     Leistenhoehe ueberall identisch bleibt. */
  .kontakt-header-wrap .site-header {
    padding-top: 0.55rem;
    justify-content: space-between;
  }

  /* Hamburger: rund statt eckig, warmer Creme-Grund, feiner Gold-Rahmen
     + dezenter violett-goldener Schein -- kein grosser weisser
     Standardbutton mehr. Balken-Farbe/X-Verwandlung (.is-active)
     bleiben die bereits bestehenden, unveraenderten Regeln. */
  .nav-toggle {
    display: flex;
    width: 40px;
    height: 40px;
    border-radius: 50%;
    background: rgba(var(--color-gold-rgb), 0.08);
    border: 1px solid rgba(var(--color-gold-rgb), 0.55);
    box-shadow: 0 0 0 3px rgba(154, 118, 200, 0.1), 0 2px 8px rgba(122, 20, 64, 0.12);
    transition: box-shadow 0.25s ease, background 0.25s ease;
    /* margin-left:auto statt sich allein auf justify-content:space-
       between zu verlassen: auf der Kontaktseite ist das Logo links
       unterdrueckt (siehe oben), wodurch der Hamburger dort sonst der
       einzige sichtbare Flex-Child waere -- space-between richtet einen
       einzelnen Child dann am ANFANG statt am Ende aus. margin-left:auto
       haelt ihn unabhaengig davon auf allen Seiten zuverlaessig rechts. */
    margin-left: auto;
  }

  .nav-toggle.is-active {
    background: rgba(154, 118, 200, 0.12);
    box-shadow: 0 0 0 4px rgba(154, 118, 200, 0.16), 0 2px 10px rgba(122, 20, 64, 0.16);
  }

  /* Abdunklungs-Overlay hinter dem Drawer -- per main.js einmalig als
     letztes Kind von <body> eingefuegt. Ausserhalb von .is-visible
     unsichtbar UND nicht interaktiv (pointer-events:none), damit es nie
     Klicks auf der eigentlichen Seite blockiert, wenn das Menue zu ist. */
  .mobile-nav-backdrop {
    display: block;
    position: fixed;
    inset: 0;
    background: rgba(47, 37, 71, 0.45);
    z-index: 90;
    opacity: 0;
    visibility: hidden;
    pointer-events: none;
    transition: opacity 0.28s ease, visibility 0.28s;
  }

  .mobile-nav-backdrop.is-visible {
    opacity: 1;
    visibility: visible;
    pointer-events: auto;
  }

  /* Drawer: klappt nicht mehr als Akkordeon UNTER die Leiste, sondern
     legt sich als eigenstaendiges Panel darueber (position:absolute,
     top:100% relativ zu .site-header -- passt sich dadurch automatisch
     an dessen tatsaechliche Hoehe an, kein hartcodierter Pixel-Versatz
     noetig). max-height+overflow-y:auto sorgt dafuer, dass NUR das Menue
     selbst scrollt, falls der Inhalt auf sehr kleinen Displays nicht
     komplett hineinpasst -- die Seite dahinter ist waehrenddessen per
     body.mobile-nav-locked (siehe main.js) ohnehin fixiert. */
  .main-nav {
    display: none;
  }

  .main-nav.is-open {
    display: flex;
    flex-direction: column;
    position: absolute;
    top: 100%;
    left: 0;
    right: 0;
    max-height: 85vh;
    overflow-y: auto;
    order: initial;
    width: auto;
    gap: 0;
    font-size: 1rem;
    background: #fdf6ea;
    padding: 0.75rem 1.25rem 1.25rem;
    border-bottom: 1px solid rgba(var(--color-gold-rgb), 0.4);
    box-shadow: 0 18px 34px rgba(47, 37, 71, 0.22);
    z-index: 95;
  }

  .main-nav.is-open > a,
  .main-nav.is-open .nav-dropdown-trigger {
    display: flex;
    align-items: center;
    gap: 0.75rem;
    width: 100%;
    padding: 0.85rem 0.15rem;
    border-bottom: 1px solid rgba(var(--color-gold-rgb), 0.18);
    color: #4a3f66;
    font-family: var(--font-heading);
    font-size: 1.02rem;
  }

  .main-nav.is-open .nav-dropdown {
    width: 100%;
  }

  .main-nav.is-open .nav-dropdown-trigger {
    justify-content: flex-start;
  }

  .main-nav.is-open .nav-dropdown-trigger::after {
    margin-left: auto;
  }

  /* Kleine, dezent goldene Liniensymbole je Menuepunkt -- rein
     strukturell/attributbasiert zugeordnet (Reihenfolge/hrefs sind auf
     allen Seiten identisch), keine HTML-Aenderung noetig. */
  .main-nav.is-open > a::before,
  .main-nav.is-open .nav-dropdown-trigger::before {
    content: "";
    display: block;
    flex-shrink: 0;
    width: 19px;
    height: 19px;
    background-repeat: no-repeat;
    background-position: center;
    background-size: contain;
    opacity: 0.88;
  }

  .main-nav.is-open > a[href="index.html"]::before {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23a9812f' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 11.5 12 4l9 7.5'/%3E%3Cpath d='M5 10v9h14v-9'/%3E%3Cpath d='M9.5 19v-5h5v5'/%3E%3C/svg%3E");
  }

  .main-nav.is-open > .nav-dropdown:nth-of-type(1) > .nav-dropdown-trigger::before {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23a9812f' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 4c-6 0-12 4-14 12-1 3 1 5 4 4C18 18 20 10 20 4Z'/%3E%3Cpath d='M9 15l9-9'/%3E%3C/svg%3E");
  }

  .main-nav.is-open > .nav-dropdown:nth-of-type(2) > .nav-dropdown-trigger::before {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%23a9812f' stroke='none'%3E%3Cpath d='M12 3l1.8 5.6L19 10l-5.2 1.6L12 17l-1.8-5.4L5 10l5.2-1.4Z'/%3E%3C/svg%3E");
  }

  .main-nav.is-open > .nav-dropdown:nth-of-type(3) > .nav-dropdown-trigger::before {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23a9812f' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 9h16l-1.5 10a2 2 0 0 1-2 1.7H7.5a2 2 0 0 1-2-1.7Z'/%3E%3Cpath d='M8 9 9 4h6l1 5'/%3E%3Cpath d='M9 13v4M12 13v4M15 13v4'/%3E%3C/svg%3E");
  }

  .main-nav.is-open > .nav-dropdown:nth-of-type(4) > .nav-dropdown-trigger::before {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23a9812f' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 20s-7-4.4-9.5-9C.8 7.4 3 4 6.5 4 9 4 11 6 12 7.5 13 6 15 4 17.5 4 21 4 23.2 7.4 21.5 11 19 15.6 12 20 12 20Z'/%3E%3C/svg%3E");
  }

  .main-nav.is-open > a[href="fuer-eltern-paedagogen.html"]::before {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23a9812f' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='8' cy='7' r='2.3'/%3E%3Ccircle cx='16' cy='7' r='2.3'/%3E%3Cpath d='M3 20c0-3.3 2.5-5.5 5-5.5s5 2.2 5 5.5'/%3E%3Cpath d='M11 20c0-3.3 2.5-5.5 5-5.5s5 2.2 5 5.5'/%3E%3C/svg%3E");
  }

  .main-nav.is-open > a[href="blog.html"]::before {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23a9812f' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 5.5c2-.9 5-.9 8 .5v13c-3-1.4-6-1.4-8-.5Z'/%3E%3Cpath d='M20 5.5c-2-.9-5-.9-8 .5v13c3-1.4 6-1.4 8-.5Z'/%3E%3C/svg%3E");
  }

  .main-nav.is-open > a[href="kontakt.html"]::before {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23a9812f' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='6' width='18' height='13' rx='2'/%3E%3Cpath d='M4 7.5 12 13l8-5.5'/%3E%3C/svg%3E");
  }

  /* Dropdown-Akkordeon innerhalb des Drawers: bereits bestehende
     Funktionalitaet (max-height-Transition), nur farblich an das neue
     Creme/Gold/Violett-Menue angeglichen. */
  .main-nav.is-open .nav-dropdown-panel {
    background: rgba(var(--color-gold-rgb), 0.07);
  }

  .main-nav.is-open .nav-dropdown-panel a {
    color: #6a5c8a;
    padding: 0.6rem 0.8rem 0.6rem 2.35rem;
  }

  .main-nav.is-open .nav-dropdown-panel a.active,
  .main-nav.is-open .nav-dropdown-panel a:hover,
  .main-nav.is-open .nav-dropdown-panel a:focus-visible {
    color: var(--color-gold-light);
    background: rgba(var(--color-gold-rgb), 0.14);
  }

  /* Maerchenhafter Abschluss: rein dekorative Grafik (Buecher, Feder,
     Tintenfass, Brief, Laterne, Blumen, Schmetterlinge, Lichtfunken),
     per main.js einmalig als letztes Kind von .main-nav eingefuegt.
     Bewusst kompakt/zurueckhaltend, liegt nach dem letzten Menuepunkt
     im normalen Fluss -- ueberdeckt dadurch nie Links. */
  .mobile-nav-menu-deco {
    display: block;
    width: 76%;
    max-width: 300px;
    height: auto;
    margin: 1.4rem auto 0.4rem;
    opacity: 0.92;
    pointer-events: none;
  }
}

/* Scroll-Sperre der Hintergrundseite, waehrend das mobile Menue offen
   ist -- main.js setzt diese Klasse ausschliesslich, wenn die Pruefung
   window.matchMedia("(max-width:767px)") zutrifft, wirkt sich also nie
   auf Tablet/Desktop aus, selbst ohne eigene Media-Query hier. */
body.mobile-nav-locked {
  overflow: hidden;
}

/* ==========================================================================
   Bewohner Lumarias (bewohner-lumarias.html) -- ein maerchenhaftes
   Bewohner-Lexikon. Vorschaukarten wirken wie Seiten aus einem magischen
   Bestimmungsbuch (Creme/Flieder/Gold, abgerundete Ecken, feiner Schatten);
   der volle Original-Steckbrief oeffnet sich unveraendert und ungekuerzt
   in einem scrollbaren Modal (kein object-fit:cover, nichts wird
   abgeschnitten). Alle Klassen sind bewusst eigenstaendig (.bewohner-*),
   um mit keiner bestehenden Seite zu kollidieren.
   ========================================================================== */

/* Milchig-weicher Salbei-/Mint-Schleier hinter dem Intro, statt der
   bisherigen einfarbig-flachen --color-ink des Seiten-Themes. Als
   ::before statt body{background}, damit ausschliesslich der obere
   Bereich dieser Seite betroffen ist -- alle anderen Seiten mit
   body.theme-pastel-green (lumaria.html, lumaria-karte.html, ...)
   bleiben unangetastet. Die Ratio ist bewusst hoeher als 100% und der
   letzte Farbstopp transparent, damit der Schleier weich (ohne
   sichtbare Kante) in den normalen, einfarbigen Seitenhintergrund
   ausklingt, bevor die Bewohner-Karten beginnen ("Karten wachsen aus
   dem milchigen Bereich heraus"). */
.bewohner-hero {
  position: relative;
  z-index: 0;
  text-align: center;
  padding-bottom: 1.6rem;
}

.bewohner-hero::before {
  content: "";
  position: absolute;
  top: 0;
  left: 50%;
  transform: translateX(-50%);
  width: 100vw;
  height: calc(100% + 110px);
  z-index: -1;
  pointer-events: none;
  background: radial-gradient(120% 90% at 50% 0%, #eef8ec 0%, #dcefd9 38%, #c7e4ca 68%, rgba(199, 228, 202, 0) 100%);
}

/* KEIN mask-image hier: ein elliptischer/rechteckiger Alpha-Fade an den
   Raendern klingt zunaechst nach der sauberen Loesung gegen eine harte
   Bildkante, schneidet aber bei dieser Grafik zuverlaessig in echte
   Motivteile (Kristallspitzen oben links, Drachenhoerner oben rechts)
   hinein -- lokal mit genau dieser Masken-Kurve getestet und deshalb
   bewusst verworfen, um das eigentliche Problem (Motiv wird
   abgeschnitten) nicht erneut einzufuehren. Stattdessen: die Grafik
   selbst hat oben bereits einen natuerlichen Alpha-Verlauf, und ihr
   eigener blasser Hintergrund ist absichtlich auf denselben Salbei-/
   Mintton wie der Seitenverlauf abgestimmt, wodurch die rechteckige
   Kante an den uebrigen drei Seiten kaum auffaellt. */
/* Nutzerkorrektur: neue Ueberschriftgrafik "Wer lebt eigentlich in
   Lumaria?" hat einen dekorativen Bluetenrand, der bis an den harten
   Bildrand reicht -- gleiche Zwei-Verlaufs-mask-image-Technik wie
   .lumaria-songs-heading-img/.home-hero-illustration-img faedet alle
   vier Kanten weich in den mintgruenen Seitenhintergrund aus, statt sie
   rechteckig abzuschneiden. Groesse (max-width) bewusst unveraendert
   uebernommen -- bereits auf "harmonisch, nicht dominant" fuer genau
   diesen Bereich abgestimmt. */
.bewohner-hero-heading-img {
  display: block;
  width: 100%;
  max-width: 640px;
  height: auto;
  object-fit: contain;
  margin: 0 auto 1.3rem;
  mask-image:
    linear-gradient(to right, transparent 0%, black 10%, black 90%, transparent 100%),
    linear-gradient(to bottom, transparent 0%, black 14%, black 86%, transparent 100%);
  mask-composite: intersect;
  -webkit-mask-image:
    linear-gradient(to right, transparent 0%, black 10%, black 90%, transparent 100%),
    linear-gradient(to bottom, transparent 0%, black 14%, black 86%, transparent 100%);
  -webkit-mask-composite: source-in;
}

.bewohner-hero-text {
  color: var(--color-parchment-dim);
  font-size: 1.1rem;
  line-height: 1.7;
}

.bewohner-section {
  max-width: 1240px;
  padding-top: 1.2rem;
  padding-bottom: 1.2rem;
}

.bewohner-section h2 {
  text-align: center;
  margin-bottom: 2rem;
}

.bewohner-special-heading-img {
  display: block;
  width: 100%;
  max-width: 560px;
  height: auto;
  margin: 0 auto 2.2rem;
}

@media (max-width: 900px) {
  .bewohner-special-heading-img {
    max-width: 440px;
    margin-bottom: 1.8rem;
  }
}

@media (max-width: 480px) {
  .bewohner-special-heading-img {
    max-width: 320px;
    margin-bottom: 1.4rem;
  }
}

.bewohner-grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: 1.6rem;
}

@media (min-width: 640px) {
  .bewohner-grid {
    grid-template-columns: repeat(2, 1fr);
  }
}

@media (min-width: 900px) {
  .bewohner-grid {
    grid-template-columns: repeat(3, 1fr);
    gap: 2.2rem;
  }
}

.bewohner-grid-special {
  max-width: 760px;
  margin: 0 auto;
}

@media (min-width: 640px) {
  .bewohner-grid-special {
    grid-template-columns: repeat(2, 1fr);
  }
}

.bewohner-card {
  display: flex;
  flex-direction: column;
}

/* Karten-Palette bewusst als feste Hex-/rgba-Werte statt ueber
   var(--color-gold)/var(--color-parchment-dim): auf dieser Seite (theme-
   pastel-green) sind diese Variablen auf ein Salbeigruen gemuenzt (siehe
   body.theme-pastel-green weiter oben), wodurch Rahmen/Schatten/Button
   bislang ungewollt gruenlich-kuehl wirkten statt warm-maerchenhaft. Die
   Cremeton-/Gold-/Flieder-Palette hier ist dieselbe wie bei der "Emma,
   Loomus & Fina"-Kachel (.lumaria-tile-trio-*), damit beide Kartensysteme
   wie Seiten desselben Sammelalbums wirken. */
/* Jede Karte kann ueber eine .bewohner-card--{volk}-Modifierklasse (auf
   dem aeusseren .bewohner-card-div) eine eigene Farbwelt setzen -- ueber
   dieselben vier Variablen wie hier als Default definiert. Ohne
   Modifierklasse (z.B. .bewohner-card--plaetschies existiert bewusst
   noch nicht, da keine Design-Vorlage dafuer vorliegt) greifen die
   Fallback-Werte, die Karte behaelt also ihr bisheriges Creme/Gold-Design. */
.bewohner-card-trigger {
  display: flex;
  flex-direction: column;
  width: 100%;
  position: relative;
  overflow: hidden;
  background: radial-gradient(120% 100% at 50% -10%, rgba(255, 253, 246, 0.6) 0%, rgba(255, 253, 246, 0) 55%), linear-gradient(160deg, var(--card-bg-a, #fdf6ea) 0%, var(--card-bg-b, #f3e6d2) 100%);
  border: 1px solid var(--card-border, rgba(201, 162, 77, 0.32));
  border-radius: 22px;
  padding: 1.1rem 1.3rem 1.5rem;
  box-shadow: 0 16px 34px rgba(168, 124, 58, 0.15);
  cursor: pointer;
  text-align: center;
  font-family: var(--font-body);
  transition: transform 0.3s ease, box-shadow 0.3s ease, border-color 0.3s ease;
}

.bewohner-card-trigger:hover,
.bewohner-card-trigger:focus-visible {
  transform: translateY(-5px);
  box-shadow: 0 22px 44px rgba(168, 124, 58, 0.26);
  border-color: var(--card-border-hover, rgba(201, 162, 77, 0.6));
}

/* DRITTE FASSUNG (Korrektur): die zweite Fassung legte weiterhin ein
   vollflaechiges Referenzbild (img/bewohner-frame-*-ring.png, nur mit
   transparent freigestellter Mitte) hinter den echten Inhalt -- dadurch
   wirkte jede Karte wie zwei uebereinandergelegte Karten (Vorlage
   hinten, echtes HTML vorn). Die 12 Kartenvorlagen sind ausschliesslich
   Design-Referenzen fuer Farbwelt/Rahmen/Namensschild/Buttonfarbe, KEIN
   Bild-Asset mehr auf der Karte selbst -- kein background-image, kein
   <img>, keine absolute Bildebene. Die Farbwelt kommt stattdessen rein
   aus CSS-Variablen (--card-bg-a/-b, --card-border etc., siehe die
   .bewohner-card--{volk}-Bloecke weiter unten), Rahmen/Schatten kommen
   von .bewohner-card-trigger selbst. */

/* .bewohner-card-content bringt ihren eigenen Innenabstand mit (siehe
   unten) -- die Basis-Polsterung von .bewohner-card-trigger wuerde sich
   sonst dazu addieren. Nur hier ueberschrieben, emma-loomus-fina.html
   nutzt weiterhin die normale Basis-Polsterung direkt auf dem Trigger. */
.bewohner-lumarias-page .bewohner-card-trigger {
  padding: 0;
}

/* Echter Inhalt (Bild/Name/Text/Button): sauberer vertikaler
   Flex-Stack, KEINE absolute Positionierung der einzelnen Elemente
   zueinander -- jedes Element nimmt genau den Platz ein, den es
   braucht, in fester Reihenfolge (Bild -> Namensschild -> Untertitel
   -> Beschreibung -> Button). Der Innenabstand dient nur dazu, den
   echten Text nicht an den Kartenrand stossen zu lassen. */
.bewohner-card-content {
  position: relative;
  z-index: 1;
  display: flex;
  flex-direction: column;
  align-items: center;
  width: 100%;
  padding: 1.5rem 1.4rem 1.6rem;
}

.bewohner-card-media {
  display: block;
  width: 100%;
  border-radius: 14px;
  overflow: hidden;
  margin-bottom: 1rem;
  background: #efe6da;
}

/* Dezenter heller Mattenrahmen ums Vorschaubild. */
.bewohner-lumarias-page .bewohner-card-media {
  border-radius: 10px;
  margin-bottom: 0.5rem;
  background: rgba(255, 255, 255, 0.4);
  border: 2px solid rgba(255, 255, 255, 0.75);
  box-shadow: 0 2px 10px rgba(60, 40, 20, 0.12);
}

.bewohner-card-media img {
  display: block;
  width: 100%;
  height: auto;
}

/* Feste aspect-ratio (4/3, entspricht dem Seitenverhaeltnis der meisten
   neuen Vorschaubilder) + object-fit:contain statt cover: garantiert
   gleiche Bildhoehe auf allen Bewohner-Karten, OHNE dass ein Kopf oder
   wichtiger Bildinhalt abgeschnitten wird -- ein einzelnes Vorschaubild
   mit abweichendem Seitenverhaeltnis (z.B. das hochformatige Waldwaechter-
   Bild) wird dadurch lediglich dezent auf cremefarbenem Grund
   "eingerahmt" (Letterboxing) statt beschnitten. Ueber .bewohner-lumarias-
   page gescopt, damit emma-loomus-fina.html (dort volle, hochformatige
   Steckbrief-Poster als Kartenbild, keine 4:3-Vorschaubilder) bei der
   generischen .bewohner-card-media-Basisregel bleibt. */
.bewohner-lumarias-page .bewohner-card-media {
  aspect-ratio: 8 / 5;
}

.bewohner-lumarias-page .bewohner-card-media img {
  height: 100%;
  object-fit: contain;
}

.bewohner-card-name {
  display: block;
  font-family: var(--font-heading);
  font-size: 1.25rem;
  color: #5c3878;
  margin-bottom: 0.5rem;
}

/* Individuelle Namens-Plakette pro Bewohnervolk: gleiche Form/Schrift
   fuer alle (weiche, leicht geschwungene Pergament-Plakette), aber jedes
   Volk bekommt ueber drei CSS-Variablen (--plaque-bg-a/-b, --plaque-
   border, --plaque-ink) seine eigene Farbwelt + ein passendes Symbol.
   .bewohner-card-name bleibt als Basisregel unveraendert (wird u.a. auf
   emma-loomus-fina.html weiterhin OHNE Plakette verwendet) -- die
   spezifischere .bewohner-card-name-plaque .bewohner-card-name-Regel
   ueberschreibt hier gezielt nur Farbe/Abstand innerhalb der Plakette. */
.bewohner-card-name-plaque {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex-wrap: wrap;
  gap: 0.35rem;
  max-width: 100%;
  padding: 0.28rem 1.1rem;
  margin-bottom: 0.35rem;
  border-radius: 999px;
  border: 1px solid var(--plaque-border, rgba(201, 162, 77, 0.4));
  background: linear-gradient(135deg, var(--plaque-bg-a, #f7ecd9) 0%, var(--plaque-bg-b, #f0dcc0) 100%);
  box-shadow: 0 3px 10px rgba(60, 40, 20, 0.15);
}

.bewohner-card-name-symbol {
  flex: 0 0 auto;
  font-size: 0.82rem;
  line-height: 1;
  color: var(--plaque-symbol, var(--plaque-ink, #c9a24d));
}

.bewohner-card-name-plaque .bewohner-card-name {
  margin-bottom: 0;
  font-size: 0.98rem;
  color: var(--plaque-ink, #5c3878);
}

.bewohner-card--lumelis {
  --card-bg-a: #fdf6ea;
  --card-bg-b: #f1e3f7;
  --card-border: rgba(124, 91, 168, 0.35);
  --card-border-hover: rgba(124, 91, 168, 0.6);
  --frame-border: rgba(124, 91, 168, 0.4);
  --subtitle-color: #8b4fc0;
}

.bewohner-card-name-plaque--lumelis {
  --plaque-bg-a: #8a4fc0;
  --plaque-bg-b: #6b2f9c;
  --plaque-border: rgba(107, 47, 156, 0.55);
  --plaque-ink: #fdf6ff;
  --plaque-symbol: #f0dcff;
}

.bewohner-card--flowies {
  --card-bg-a: #fdf6ea;
  --card-bg-b: #fce3ea;
  --card-border: rgba(214, 68, 126, 0.32);
  --card-border-hover: rgba(214, 68, 126, 0.58);
  --frame-border: rgba(214, 68, 126, 0.38);
  --subtitle-color: #c93f72;
}

.bewohner-card-name-plaque--flowies {
  --plaque-bg-a: #e0538a;
  --plaque-bg-b: #c93f72;
  --plaque-border: rgba(201, 63, 114, 0.5);
  --plaque-ink: #fff5f8;
}

.bewohner-card--moonis {
  --card-bg-a: #fdf6ea;
  --card-bg-b: #f2e8d0;
  --card-border: rgba(42, 40, 110, 0.35);
  --card-border-hover: rgba(42, 40, 110, 0.6);
  --frame-border: rgba(42, 40, 110, 0.42);
  --subtitle-color: #2a2870;
}

.bewohner-card-name-plaque--moonis {
  --plaque-bg-a: #26244f;
  --plaque-bg-b: #17163a;
  --plaque-border: rgba(201, 162, 77, 0.5);
  --plaque-ink: #f3d870;
}

.bewohner-card--findlihus {
  --card-bg-a: #fdf6ea;
  --card-bg-b: #f2e6cc;
  --card-border: rgba(154, 108, 58, 0.4);
  --card-border-hover: rgba(154, 108, 58, 0.65);
  --frame-border: rgba(154, 108, 58, 0.5);
  --subtitle-color: #7a4a1a;
  --button-bg-a: #f3d870;
  --button-bg-b: #dba53c;
  --button-bg-a-hover: #f7e394;
  --button-bg-b-hover: #cf9530;
  --button-border: #a06a24;
  --button-text: #4a2e0d;
}

.bewohner-card-name-plaque--findlihus {
  --plaque-bg-a: #2e1c0c;
  --plaque-bg-b: #1c1006;
  --plaque-border: rgba(201, 162, 77, 0.55);
  --plaque-ink: #e8c878;
}

.bewohner-card--wuzifluffs {
  --card-bg-a: #fdf6ea;
  --card-bg-b: #fbe3ee;
  --card-border: rgba(232, 95, 150, 0.32);
  --card-border-hover: rgba(232, 95, 150, 0.55);
  --frame-border: rgba(232, 95, 150, 0.38);
  --subtitle-color: #d6447e;
  --button-bg-a: #fce0e0;
  --button-bg-b: #f8c5d4;
  --button-bg-a-hover: #fff0f0;
  --button-bg-b-hover: #f3b3c6;
  --button-border: #e88fa8;
  --button-text: #b3557f;
}

.bewohner-card-name-plaque--wuzifluffs {
  --plaque-bg-a: #ea6ea0;
  --plaque-bg-b: #d84e86;
  --plaque-border: rgba(216, 78, 134, 0.5);
  --plaque-ink: #fff5f9;
}

.bewohner-card--zeebubbles {
  --card-bg-a: #fdf6ea;
  --card-bg-b: #dff3f2;
  --card-border: rgba(47, 154, 160, 0.35);
  --card-border-hover: rgba(47, 154, 160, 0.6);
  --frame-border: rgba(47, 154, 160, 0.42);
  --subtitle-color: #1f7a80;
  --button-bg-a: #ecdea3;
  --button-bg-b: #d9c26a;
  --button-bg-a-hover: #f3e8bc;
  --button-bg-b-hover: #ccb352;
  --button-border: #b89840;
  --button-text: #1f5c60;
}

.bewohner-card-name-plaque--zeebubbles {
  --plaque-bg-a: #3aacb2;
  --plaque-bg-b: #237a80;
  --plaque-border: rgba(201, 162, 77, 0.5);
  --plaque-ink: #f3fbfb;
}

.bewohner-card--plaetschies {
  --card-bg-a: #fdf6ea;
  --card-bg-b: #dcefe2;
  --card-border: rgba(61, 139, 118, 0.35);
  --card-border-hover: rgba(61, 139, 118, 0.6);
  --frame-border: rgba(61, 139, 118, 0.42);
  --subtitle-color: #2f7a63;
}

.bewohner-card-name-plaque--plaetschies {
  --plaque-bg-a: #dcf3f8;
  --plaque-bg-b: #cfe9f6;
  --plaque-border: rgba(61, 139, 176, 0.4);
  --plaque-ink: #33718f;
}

.bewohner-card--battyfluffs {
  --card-bg-a: #fdf6ea;
  --card-bg-b: #f3e2f2;
  --card-border: rgba(74, 26, 128, 0.32);
  --card-border-hover: rgba(74, 26, 128, 0.56);
  --frame-border: rgba(74, 26, 128, 0.4);
  --subtitle-color: #6b2fa0;
}

.bewohner-card-name-plaque--battyfluffs {
  --plaque-bg-a: #6b3ab0;
  --plaque-bg-b: #4a1a80;
  --plaque-border: rgba(74, 26, 128, 0.5);
  --plaque-ink: #faf3ff;
}

.bewohner-card--lumifluffs {
  --card-bg-a: #fdf6ea;
  --card-bg-b: #f4e7f7;
  --card-border: rgba(201, 162, 77, 0.4);
  --card-border-hover: rgba(201, 162, 77, 0.65);
  --frame-border: rgba(180, 140, 220, 0.4);
  --subtitle-color: #6b3fa0;
}

.bewohner-card-name-plaque--lumifluffs {
  --plaque-bg-a: #fbf4fe;
  --plaque-bg-b: #f0def7;
  --plaque-border: rgba(201, 162, 77, 0.55);
  --plaque-ink: #6b3fa0;
}

.bewohner-card--knuffelwuschel {
  --card-bg-a: #fdf6ea;
  --card-bg-b: #fce6ee;
  --card-border: rgba(214, 68, 126, 0.32);
  --card-border-hover: rgba(214, 68, 126, 0.56);
  --frame-border: rgba(214, 68, 126, 0.38);
  --subtitle-color: #c93f72;
}

.bewohner-card-name-plaque--knuffelwuschel {
  --plaque-bg-a: #e0568a;
  --plaque-bg-b: #c93f72;
  --plaque-border: rgba(201, 63, 114, 0.5);
  --plaque-ink: #fff5f8;
}

.bewohner-card--zimtstern {
  --card-bg-a: #fdf6ea;
  --card-bg-b: #ece2ec;
  --card-border: rgba(92, 42, 116, 0.4);
  --card-border-hover: rgba(92, 42, 116, 0.6);
  --card-ring: rgba(92, 42, 116, 0.14);
  --card-ring-hover: rgba(92, 42, 116, 0.22);
  --frame-border: rgba(92, 42, 116, 0.45);
  --subtitle-color: #4a2a80;
  --button-bg-a: #a568c0;
  --button-bg-b: #6b2f80;
  --button-bg-a-hover: #b880d0;
  --button-bg-b-hover: #7c3a92;
  --button-border: #5c2a70;
  --button-text: #fff8ff;
  --button-glow: rgba(107, 47, 128, 0.4);
}

.bewohner-card-name-plaque--zimtstern {
  --plaque-bg-a: #4a2570;
  --plaque-bg-b: #341a52;
  --plaque-border: rgba(201, 162, 77, 0.55);
  --plaque-ink: #faf3ff;
  --plaque-symbol: #f3d870;
}

.bewohner-card--waldwaechter {
  --card-bg-a: #fdf6ea;
  --card-bg-b: #e9f0dc;
  --card-border: rgba(63, 122, 74, 0.4);
  --card-border-hover: rgba(63, 122, 74, 0.62);
  --card-ring: rgba(63, 122, 74, 0.12);
  --card-ring-hover: rgba(63, 122, 74, 0.2);
  --frame-border: rgba(63, 122, 74, 0.45);
  --subtitle-color: #3f7a4a;
  --button-bg-a: #d9c26a;
  --button-bg-b: #b89840;
  --button-bg-a-hover: #e6d488;
  --button-bg-b-hover: #a68a38;
  --button-border: #8a7230;
  --button-text: #2f5c3a;
}

.bewohner-card-name-plaque--waldwaechter {
  --plaque-bg-a: #ebdfc3;
  --plaque-bg-b: #ddc9a0;
  --plaque-border: rgba(63, 122, 74, 0.5);
  --plaque-ink: #2f5c3a;
}

.bewohner-card-sub {
  display: block;
  font-size: 0.98rem;
  line-height: 1.55;
  color: #6b5648;
  margin-bottom: 1.2rem;
}

/* Auf bewohner-lumarias.html steht zusaetzlich zum Untertitel noch ein
   Kurztext (.bewohner-card-desc) darunter -- deshalb hier per Body-Klasse
   (.bewohner-lumarias-page) gescopte, kompaktere/eigenstaendige Variante
   von .bewohner-card-sub, statt die Basisregel global zu aendern. Die
   Basisregel bleibt fuer emma-loomus-fina.html (dort ohne .bewohner-
   card-desc, ein einzelner, laengerer Fliesstext-Satz pro Karte)
   unveraendert. */
.bewohner-lumarias-page .bewohner-card-sub {
  font-family: var(--font-heading);
  font-style: italic;
  font-size: 0.86rem;
  line-height: 1.3;
  color: var(--subtitle-color, #8a6a24);
  margin-bottom: 0.3rem;
}

.bewohner-card-desc {
  display: block;
  font-size: 0.8rem;
  line-height: 1.4;
  color: #6b5648;
  margin-bottom: 0.6rem;
}

.bewohner-card-cta {
  display: inline-block;
  align-self: center;
  margin-top: auto;
  padding: 0.6rem 1.5rem;
  border-radius: 999px;
  background: linear-gradient(180deg, var(--button-bg-a, #fce1a1) 0%, var(--button-bg-b, #f0c878) 100%);
  border: 1px solid var(--button-border, #d98a42);
  color: var(--button-text, #5c3878);
  font-family: var(--font-heading);
  font-size: 0.92rem;
  font-weight: 600;
  letter-spacing: 0.02em;
  transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s ease;
}

/* Kompaktere Button-Groesse nur auf bewohner-lumarias.html, damit die
   Karte insgesamt naeher an der Bildproportion der Referenzgrafiken
   bleibt (siehe .bewohner-card-content weiter oben) -- auf
   emma-loomus-fina.html bleibt der Button in seiner bisherigen Groesse. */
.bewohner-lumarias-page .bewohner-card-cta {
  padding: 0.42rem 1.2rem;
  font-size: 0.82rem;
}

.bewohner-card-trigger:hover .bewohner-card-cta,
.bewohner-card-trigger:focus-visible .bewohner-card-cta {
  background: linear-gradient(180deg, var(--button-bg-a-hover, #f7d791) 0%, var(--button-bg-b-hover, #e8ba68) 100%);
  box-shadow: 0 8px 18px var(--button-glow, rgba(217, 138, 66, 0.4));
}

.bewohner-card-crosslink {
  display: block;
  width: 100%;
  margin-top: 0.7rem;
  padding: 0.55rem 0.8rem;
  background: none;
  border: none;
  border-top: 1px dashed rgba(201, 162, 77, 0.4);
  color: #8a7666;
  font-family: var(--font-body);
  font-style: italic;
  font-size: 0.92rem;
  text-align: center;
  cursor: pointer;
  transition: color 0.3s ease;
}

.bewohner-card-crosslink:hover,
.bewohner-card-crosslink:focus-visible {
  color: #5c3878;
}

/* Meister Zimtstern & Der Lumaris-Waldwaechter: keine eigene Volksgruppe,
   deshalb optisch etwas edler hervorgehoben (doppelter Goldrahmen +
   dezentes Leuchten) statt einer dritten Spalte in der Voelker-Galerie. */
.bewohner-card--special .bewohner-card-trigger {
  border: 1px solid var(--card-border, rgba(201, 162, 77, 0.55));
  box-shadow: 0 0 0 4px var(--card-ring, rgba(201, 162, 77, 0.1)), 0 16px 34px rgba(168, 124, 58, 0.22);
}

.bewohner-card--special .bewohner-card-trigger:hover,
.bewohner-card--special .bewohner-card-trigger:focus-visible {
  box-shadow: 0 0 0 4px var(--card-ring-hover, rgba(201, 162, 77, 0.16)), 0 22px 44px rgba(168, 124, 58, 0.34);
}

.bewohner-closing {
  text-align: center;
}

/* Nutzerkorrektur: bisherige Text-Ueberschrift durch eine transparente
   PNG-Grafik ersetzt (bewohner-closing-heading.png, echte Transparenz,
   kein harter Bildrand -- verifiziert per Alpha-Kanal-Pruefung, daher
   bewusst OHNE die mask-image-Kantenausfaserung der beiden anderen
   Ueberschriftgrafiken auf dieser Seite, die waere hier unnoetig).
   Groesse an die anderen Ueberschriftgrafiken dieser Seite angeglichen
   (aehnliche max-width wie .bewohner-hero-heading-img), damit sie sich
   harmonisch einfuegt statt zu dominieren. */
.bewohner-closing-heading-img {
  display: block;
  width: 100%;
  max-width: 620px;
  height: auto;
  margin: 0 auto 1.2rem;
}

.bewohner-closing p {
  color: var(--color-parchment-dim);
  line-height: 1.7;
}

/* Modal: zeigt den Original-Steckbrief vollstaendig und unveraendert.
   Bewusst KEIN object-fit:cover und keine Verkleinerung auf Bildschirm-
   hoehe -- die Grafik behaelt ihre volle Breite bis max-width, bei Bedarf
   scrollt .bewohner-modal-scroll vertikal, damit auf dem Smartphone der
   komplette Steckbrief lesbar bleibt. */
.bewohner-modal {
  position: fixed;
  inset: 0;
  z-index: 950;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 1.6rem;
  background: rgba(31, 26, 20, 0.82);
  opacity: 0;
  visibility: hidden;
  transition: opacity 0.3s ease, visibility 0s linear 0.3s;
}

.bewohner-modal.is-active {
  opacity: 1;
  visibility: visible;
  transition: opacity 0.3s ease, visibility 0s linear 0s;
}

.bewohner-modal-inner {
  position: relative;
  width: 100%;
  max-width: 900px;
  max-height: 92vh;
  background: #fdf8f1;
  border-radius: 20px;
  box-shadow: 0 24px 60px rgba(0, 0, 0, 0.4);
  overflow: hidden;
}

.bewohner-modal-scroll {
  width: 100%;
  height: 100%;
  max-height: 92vh;
  overflow-y: auto;
  -webkit-overflow-scrolling: touch;
}

.bewohner-modal-img {
  display: block;
  width: 100%;
  height: auto;
}

.bewohner-modal-close {
  position: absolute;
  top: 0.8rem;
  right: 0.8rem;
  z-index: 2;
  width: 42px;
  height: 42px;
  border-radius: 50%;
  border: 1px solid rgba(var(--color-gold-rgb), 0.5);
  background: rgba(253, 248, 241, 0.94);
  color: var(--color-gold-light);
  font-size: 1.5rem;
  line-height: 1;
  cursor: pointer;
  box-shadow: 0 6px 16px rgba(0, 0, 0, 0.25);
  transition: background 0.3s ease, transform 0.3s ease;
}

.bewohner-modal-close:hover,
.bewohner-modal-close:focus-visible {
  background: var(--color-gold);
  color: #fff;
  transform: scale(1.06);
}

body.bewohner-modal-open {
  overflow: hidden;
}

@media (prefers-reduced-motion: reduce) {
  .bewohner-modal,
  .bewohner-card-trigger {
    transition: none;
  }
}

/* "Emma, Loomus & Fina"-Kachel auf lumaria.html: fruehere Version hatte
   Ueberschrift/Text/Button fest in das Bild gemalt (lumaria-tile-trio.png),
   dadurch weder editierbar noch responsiv umbrechend und ohne echten Link.
   lumaria-tile-trio-art.jpg ist derselbe Bildausschnitt, nur um den
   unteren Textbereich beschnitten -- Ueberschrift/Text/Button sind jetzt
   echtes, barrierefreies HTML in denselben Farben wie zuvor im Bild
   (Farben direkt aus der Originalgrafik abgetastet, bewusst NICHT ueber
   die gruene --color-gold/--color-parchment dieser Seite, da diese Kachel
   ihre eigene, vom Seiten-Theme unabhaengige Cremeton-Optik hat). */
/* aspect-ratio:3/5 auf der ganzen Kachel (nicht nur dem Bild) --
   dieselbe Ratio wie .lumaria-tile-full-image bei den Bildkacheln --
   sorgt dafuer, dass diese Kachel bei gleicher Grid-Spaltenbreite exakt
   dieselbe Gesamthoehe hat wie ihre Geschwister, statt (wie zuvor)
   variabel content-hoch zu sein und dadurch die ganze Grid-Reihe zu
   verzerren (Grid-Items stretchen sich sonst per align-items:stretch
   auf die Hoehe des hoechsten Items in der Reihe). Media/Panel teilen
   sich diese feste Hoehe ueber flex-basis (53%/47%, entspricht ungefaehr
   dem Illustration/Text-Verhaeltnis der uebrigen Kacheln-Grafiken). */
/* Die Kachel ist der Bezug fuer die Schriftgroessen im Feld darunter
   (cqw): Ihre Breite haengt an der Spaltenzahl des Rasters, und der
   Text muss in die feste Hoehe passen, die das Seitenverhaeltnis
   vorgibt. Bei fester Schriftgroesse brach er auf schmalen Kacheln in
   zu viele Zeilen um und die Ueberschrift wurde oben abgeschnitten. */
.lumaria-tile-trio {
  display: flex;
  flex-direction: column;
  aspect-ratio: 3 / 5;
  container-type: inline-size;
}

.lumaria-tile-trio-media {
  display: block;
  flex: 0 0 53%;
  overflow: hidden;
}

.lumaria-tile-trio-image {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: transform 0.5s ease;
}

.lumaria-tile-trio:hover .lumaria-tile-trio-image {
  transform: scale(1.025);
}

/* Dieselbe Flaeche wie bei der Zuckersternbaeckerei: Deren Cremefeld
   ist aus der fertigen Kachelgrafik herausgeloest und der Text darin
   durch den Cremeton derselben Zeile ersetzt worden -- die goldenen
   Ranken links und rechts und die feinen Lichtpunkte sind original.
   Beide Kacheln haben dasselbe Seitenverhaeltnis (3:5) und ihr Feld
   nimmt bei beiden 47 Prozent der Hoehe ein, das Bild passt also ohne
   Verzerrung.

   WARUM KEIN border-image MEHR: Der alte Zierrahmen nahm oben und unten
   je 34px als Rahmenbreite -- zusammen 68px von rund 210px Feldhoehe.
   Dadurch blieb fuer den Inhalt so wenig Platz, dass die Ueberschrift
   oben abgeschnitten wurde. Als Hintergrundbild kostet die Flaeche
   keinen Platz. */
.lumaria-tile-trio-panel {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  text-align: center;
  background: #fdf5ec url("../img/lumaria-kachel-feld.png?v=1") no-repeat center / 100% 100%;
  border-top: 2px solid rgba(201, 154, 66, 0.5);
  flex: 1 1 auto;
  min-height: 0;
  /* Seitlich so viel Abstand, wie die Ranken breit sind. */
  padding: 0.5rem 11% 0.62rem;
  overflow: hidden;
}

.lumaria-tile-trio-heading {
  display: flex;
  align-items: center;
  gap: 0.3rem;
  font-family: var(--font-heading);
  font-size: clamp(0.66rem, 5.9cqw, 1.02rem);
  font-weight: 700;
  color: #5c3878;
  margin-bottom: 0.22rem;
  line-height: 1.18;
}

.lumaria-tile-trio-heading-feather {
  width: 14px;
  height: auto;
  transform: rotate(8deg);
}

.lumaria-tile-trio-divider {
  display: block;
  width: 48px;
  height: 1px;
  background: linear-gradient(90deg, transparent, #d9a256, transparent);
  margin-bottom: 0.4rem;
}

.lumaria-tile-trio-text {
  display: block;
  font-family: var(--font-body);
  font-size: clamp(0.56rem, 4.96cqw, 0.84rem);
  line-height: 1.34;
  color: #5f4638;
  margin-bottom: 0.45rem;
}

.lumaria-tile-trio-button {
  display: inline-block;
  padding: 0.34rem 1rem;
  border-radius: 999px;
  background: linear-gradient(180deg, #fce1a1 0%, #f0c878 100%);
  border: 1px solid #d98a42;
  color: #5c3878;
  font-family: var(--font-heading);
  font-size: clamp(0.58rem, 5.1cqw, 0.86rem);
  font-weight: 600;
  letter-spacing: 0.01em;
  transition: transform 0.3s ease, box-shadow 0.3s ease;
}

.lumaria-tile-trio:hover .lumaria-tile-trio-button {
  transform: translateY(-2px);
  box-shadow: 0 8px 18px rgba(217, 138, 66, 0.4);
}

@media (max-width: 480px) {
  .lumaria-tile-trio-heading {
    font-size: 0.98rem;
  }
  .lumaria-tile-trio-text {
    font-size: 0.82rem;
  }
}


/* ==========================================================================
   Desktop-Navigations-Overlays (ab 1024px): fuenf Farbvarianten + ein
   neutrales Creme-Standard-Overlay, gesteuert ueber eine body.nav-*-
   Klasse pro Seite. Bewusst EINE Navigation mit fuenf visuellen
   Varianten (nicht fuenf getrennte Implementierungen): Menuestruktur,
   Schrift, Hoehe, Abstaende, Dropdown-Logik und Logo-Handling bleiben
   fuer alle Varianten identisch, nur die Eck-Deko hinter der Navigation
   wechselt.

   DRITTE FASSUNG (Korrektur): die vorherigen Fassungen legten ein
   grafisches Overlay (erst Eckgrafiken, dann eine volle gestreckte
   Bannergrafik) als ::before-Hintergrundebene hinter die Navigation.
   Per Nutzerkorrektur wieder vollstaendig entfernt -- keine Bild-Ebene
   mehr, nur noch der ruhige, einfarbige, seitenthemeneigene Hintergrund
   (background-color: var(--color-ink), z.B. Mint-Gruen auf Lumaria-
   Seiten). Menuestruktur, Schriftgroesse, Abstaende, Dropdowns und
   aktive Markierung bleiben unveraendert wie zuvor, nur die
   Bild-Hintergrundebene (::before) und die dazugehoerigen
   background-image-Regeln je Seitenvariante sind entfallen.

   Schwellenwert bewusst 1024px, NICHT 900px oder 767px: der
   bestehende Code definiert 1024px bereits selbst als "echter
   Desktop mit Maus" (siehe die Hover-Dropdown-Regel weiter oben,
   @media(min-width:1024px)). Unterhalb davon existieren ZWEI eigene,
   bereits vollstaendig ausgearbeitete Navigations-Auspraegungen, die
   hier unangetastet bleiben:
   - 768-1023px ("Tablet"): eigenes Tap-Akkordeon (siehe
     @media(min-width:768px) and (max-width:1023px) weiter oben)
   - <=700px ("Mobil"): eigenes Hamburger-Menue
   Beide Bereiche werden von KEINER Regel in diesem Block beruehrt.

   .site-header:has(> nav.main-nav) statt einfach .site-header: auf
   index.html (HOME) existieren ZWEI .site-header-Elemente -- eines
   nur mit dem Rundlogo ueber dem Header-Video (.home-header-wrap),
   eines mit der eigentlichen Navigation. Nur Letzteres soll das neue
   Overlay bekommen; das erste (mit seinem eigenen Video-Hintergrund)
   bleibt dank dieses Selektors automatisch unangetastet -- "Header-
   bilder der einzelnen Seiten nicht veraendern".

   Positionierung bewusst NICHT sticky/fixed (fruehere Fassung hatte
   das versuchsweise -- per Nutzerkorrektur wieder verworfen): die
   Navigation bleibt normaler Fluss direkt unter dem jeweiligen
   Header-Bild/-Video und scrollt mit der Seite mit. */
@media (min-width: 1024px) {
  .site-header:has(> nav.main-nav) {
    position: relative;
    min-height: 72px;
    padding-top: 0.55rem;
    padding-bottom: 0.55rem;
    padding-left: 3.2rem;
    padding-right: 3.2rem;
    justify-content: center;
    background-color: var(--color-ink);
  }

  /* Etwas feinere/kleinere Schrift als vorher (1.05rem Basis). */
  .main-nav {
    font-size: 0.94rem;
  }

  /* Aktiver Hauptmenuepunkt + Hover (Nutzerkorrektur "Variante 2":
     maerchenhaft/weich geschwungen statt der vorherigen geraden
     Goldlinie): EIN gemeinsames ::before traegt eine kleine SVG-Grafik
     (zwei sanft geschwungene Linien, die von aussen zur Mitte hin auf
     ein kleines Herz zulaufen), als background-image auf 100%
     Elementbreite skaliert. Aktiv = voll sichtbar (opacity:1), Hover/
     Fokus bei nicht-aktiven Punkten = dezenter (opacity:0.5), Grund-
     zustand unsichtbar (opacity:0) -- nur die Opacity transitioniert,
     kein Breiten-/Hoehen-Sprung.

     Nutzerkorrektur (Folgefehler): urspruenglich stroke/fill='currentColor'
     im SVG, in der Annahme, das greife auf die hier gesetzte
     color:var(--color-gold) zu -- currentColor in einem SVG, das per
     background-image (Data-URI) eingebunden ist, loest sich aber
     GEGEN DAS SVG-EIGENE DOKUMENT auf, nicht gegen das color der
     Seite, und faellt mangels eigener Definition auf den CSS-
     Initialwert Schwarz zurueck. Dadurch erschien die Verzierung
     komplett schwarz statt golden. Jetzt feste, direkt im SVG
     hinterlegte Farben statt currentColor: warmes Gold (#c9a24d) fuer
     die beiden Linien, ein Gold-zu-Pflaume-Verlauf (#d8b45a ->
     #7c4fa0) fuer das Herz -- bewusst ein festes Tintenzauber-Gold/
     Pflaume-Motiv statt der je nach Seitenthema stark abweichenden
     (teils gruenen/rosa) --color-gold-Variable.

     WICHTIG (Layout): ::before ist absolut positioniert und traegt
     dadurch nie zur Boxhoehe bei -- padding-bottom bleibt unveraendert
     bei 0.4rem (wie zuvor), die Grafik sitzt within dieses bereits
     vorhandenen Freiraums plus dem ohnehin vorhandenen Rest von
     .site-header's eigenem padding-bottom (0.55rem). Nav-Hoehe/
     -Position aendern sich dadurch nicht. */
  .main-nav > a,
  .main-nav > .nav-dropdown > .nav-dropdown-trigger {
    position: relative;
    padding-bottom: 0.4rem;
  }

  .main-nav > a::before,
  .main-nav > .nav-dropdown > .nav-dropdown-trigger::before {
    content: "";
    position: absolute;
    left: 6%;
    right: 6%;
    bottom: -7px;
    height: 13px;
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 16'%3E%3Cdefs%3E%3ClinearGradient id='h' x1='0' y1='0' x2='0' y2='1'%3E%3Cstop offset='0' stop-color='%23d8b45a'/%3E%3Cstop offset='1' stop-color='%237c4fa0'/%3E%3C/linearGradient%3E%3C/defs%3E%3Cpath d='M2 5C15 5,25 11,38 11C42 11,44 9,46 7' fill='none' stroke='%23c9a24d' stroke-width='1.1' stroke-linecap='round'/%3E%3Cpath d='M98 5C85 5,75 11,62 11C58 11,56 9,54 7' fill='none' stroke='%23c9a24d' stroke-width='1.1' stroke-linecap='round'/%3E%3Cpath d='M50 13.5C47 10.5,43 8.3,43 5.1C43 3,44.8 1.7,46.7 2.6C48.2 3.3,50 5.1,50 5.1C50 5.1,51.8 3.3,53.3 2.6C55.2 1.7,57 3,57 5.1C57 8.3,53 10.5,50 13.5Z' fill='url(%23h)'/%3E%3C/svg%3E");
    background-repeat: no-repeat;
    background-position: center;
    background-size: 100% 100%;
    opacity: 0;
    pointer-events: none;
    transition: opacity 0.3s ease;
  }

  .main-nav > a.active,
  .main-nav > .nav-dropdown > .nav-dropdown-trigger.active {
    color: var(--color-parchment);
    font-weight: 600;
    border-bottom: none;
  }

  .main-nav > a.active::before,
  .main-nav > .nav-dropdown > .nav-dropdown-trigger.active::before {
    opacity: 1;
  }

  /* Dezenter Hover: Text wird kraeftiger, dieselbe Verzierung wie beim
     aktiven Punkt blendet sich weich ein, nur gedaempfter. Gilt nur
     fuer nicht-aktive Punkte, kein Sprung, kein Breitenwachstum mehr
     (ersetzt die vorherige wachsende Linie durch denselben Opacity-
     Uebergang wie oben). */
  .main-nav > a:not(.active) {
    transition: color 0.25s ease;
  }

  .main-nav > .nav-dropdown > .nav-dropdown-trigger:not(.active) {
    transition: color 0.25s ease;
  }

  .main-nav > a:not(.active):hover,
  .main-nav > a:not(.active):focus-visible,
  .main-nav > .nav-dropdown > .nav-dropdown-trigger:not(.active):hover,
  .main-nav > .nav-dropdown > .nav-dropdown-trigger:not(.active):focus-visible {
    color: var(--color-parchment);
  }

  .main-nav > a:not(.active):hover::before,
  .main-nav > a:not(.active):focus-visible::before,
  .main-nav > .nav-dropdown > .nav-dropdown-trigger:not(.active):hover::before,
  .main-nav > .nav-dropdown > .nav-dropdown-trigger:not(.active):focus-visible::before {
    opacity: 0.5;
  }

  /* Feinerer Dropdown-Pfeil + milchig-transparente Dropdown-Karte mit
     leichtem Weichzeichner ("Milchglas") statt der bisherigen
     deckenden Creme-Flaeche -- nur ab 1024px, die separate Tablet-
     Akkordeon-Optik (768-1023px, siehe weiter oben) bleibt unberuehrt. */
  .nav-dropdown-trigger::after {
    font-size: 0.58em;
    opacity: 0.85;
  }

  .nav-dropdown-panel {
    background: rgba(253, 246, 234, 0.9);
    -webkit-backdrop-filter: blur(7px);
    backdrop-filter: blur(7px);
    padding: 0.65rem;
  }

  .nav-dropdown-panel a {
    padding: 0.6rem 1rem;
  }
}

/* Nutzerkorrektur: schmaler Video-Header direkt unter der Navigation,
   VOR <main> (analog zu den Video-Headern anderer Seiten). Bewusst
   NICHT randlos/full-bleed, sondern auf eine gedeckelte, "schmale"
   Lesebreite begrenzt (max-width analog zum Buch-Viewer weiter unten
   auf dieser Seite) statt eines dominanten Vollbild-Banners. Kanten
   per zwei sich kreuzenden mask-image-Verlaeufen weich ausgefadet
   (gleiche Technik wie bereits bei .bewohner-hero-heading-img/
   .lumaria-songs-heading-img etabliert), keine Box/kein Rahmen/kein
   Schatten -- Video hat keine Alpha-Transparenz, daher uebernimmt die
   Maske komplett die weiche Einbettung in den cremefarbenen
   Seitenhintergrund. width:100%/height:auto (kein object-fit:cover)
   haelt das Seitenverhaeltnis exakt, ohne zu beschneiden. */
.leseprobe-header-banner-wrap {
  max-width: 1100px;
  margin: 0 auto;
  padding: 0.75rem 1.2rem 0;
}

.leseprobe-header-banner-video {
  display: block;
  width: 100%;
  height: auto;
  margin: 0 auto;
  mask-image:
    linear-gradient(to right, transparent 0%, black 8%, black 92%, transparent 100%),
    linear-gradient(to bottom, transparent 0%, black 18%, black 82%, transparent 100%);
  mask-composite: intersect;
  -webkit-mask-image:
    linear-gradient(to right, transparent 0%, black 8%, black 92%, transparent 100%),
    linear-gradient(to bottom, transparent 0%, black 18%, black 82%, transparent 100%);
  -webkit-mask-composite: source-in;
}

/* Interaktiver Buch-Viewer: warmer Creme-/Pergamentflaeche als
   Innenfuellung, der goldene Ornamentrahmen (.leseprobe-viewer, siehe
   unten) ist der EINZIGE sichtbare Rahmen -- .leseprobe-viewer-frame
   selbst hat bewusst keine eigene Border/keinen eigenen Schatten mehr,
   damit kein zweiter, schlichter Rahmen entsteht. Dezenter Schatten
   weiterhin unter den einzelnen Buchseiten, eine kleine goldene
   Feder als Detail. Bewusst kein fester max-width-Wert weit ueber
   1200px, damit das Buch nie den Bildschirm sprengt (Vorgabe: max. ca.
   1100-1200px Lesebreite). */
.leseprobe-viewer-section {
  /* Die generische .section-Klasse deckelt bei 900px -- die Vorgabe
     verlangt aber bis zu ca. 1100-1200px Lesebreite fuer den Viewer,
     daher hier ein eigener, groesserer max-width-Wert. */
  max-width: 1240px;
  padding-top: 0.5rem;
}

/* Nutzerkorrektur: zarter goldener Ornamentrahmen um den GESAMTEN
   aeusseren Viewer-Container (nicht um die einzelnen Buchseiten/den
   inneren Rahmen darunter, siehe .leseprobe-viewer-frame). Bewusst per
   CSS border-image statt eines abgelegten <img>-Overlays umgesetzt:
   border-image slict die vier (quadratischen) Eckmotive des Bildes
   heraus und laesst NUR die geraden Kantenstuecke dazwischen skalieren
   -- die Eckverzierungen bleiben dadurch unverzerrt, unabhaengig davon,
   wie breit/hoch der Viewer gerade ist (aendert sich staendig, je
   nachdem ob Cover allein oder eine Doppelseite gezeigt wird). Ein
   normales, gestrecktes <img>-Overlay wuerde die Ecken bei jedem
   abweichenden Seitenverhaeltnis sichtbar stauchen/verzerren.
   box-sizing:border-box (siehe *{} weiter oben) sorgt dafuer, dass der
   Rahmen INNERHALB von max-width:1180px liegt, statt den Container zu
   vergroessern. border-image ist reines Box-Rendering ohne eigene
   Hit-Flaeche -- blockiert dadurch grundsaetzlich keine Klicks auf
   Pfeile/Buttons im Inneren, ein zusaetzliches pointer-events:none ist
   hier nicht noetig. */
.leseprobe-viewer {
  max-width: 1180px;
  margin: 0 auto;
  border-style: solid;
  border-color: transparent;
  border-width: 58px;
  border-image-source: url("../img/leseprobe-ornament-frame.png?v=1");
  border-image-slice: 235;
  border-image-width: 58px;
  border-image-repeat: round;
  border-image-outset: 0;
}

@media (max-width: 640px) {
  .leseprobe-viewer {
    border-width: 30px;
    border-image-width: 30px;
  }
}

/* Nutzerkorrektur: der bisherige eigene duenne Rahmen + Schlagschatten
   sind entfernt, da sie zusammen mit dem goldenen Ornamentrahmen auf
   .leseprobe-viewer (siehe dort) wie ein doppelter Rahmen wirkten. Der
   Ornamentrahmen ist jetzt der EINZIGE sichtbare Rahmen des gesamten
   Containers -- diese Flaeche liefert nur noch die cremefarbene
   Fuellung dahinter, keine eigene Kante mehr. */
.leseprobe-viewer-frame {
  position: relative;
  background: linear-gradient(180deg, #fffdf8 0%, #f7efdc 100%);
  border-radius: 22px;
  padding: 2.4rem 1.8rem 1.6rem;
}

/* Nutzerkorrektur: die goldene Feder an dieser Stelle ist durch die
   transparente Illustration mit Emma, Loomus und Fina ersetzt (echte
   Transparenz, kein Alpha-Kanal-Trick noetig). Groesse/Zentrierung
   unveraendert uebernommen (weiterhin klein/dezent); die Drehung
   (-8deg), die nur zur Federform passte, ist entfernt, da sie bei
   drei nebeneinander sitzenden Figuren schief wirken wuerde. */
.leseprobe-viewer-feather {
  display: block;
  width: 68px;
  height: auto;
  margin: 0 auto 1rem;
  opacity: 0.92;
}

.leseprobe-viewer-stage-wrap {
  position: relative;
}

.leseprobe-viewer-stage {
  position: relative;
  width: 100%;
  margin: 0 auto;
  overflow: hidden;
  border-radius: 12px;
  transition: max-width 0.4s ease, aspect-ratio 0.4s ease;
}

.leseprobe-viewer-stage[data-mode="solo"] {
  max-width: 440px;
  aspect-ratio: 3 / 4;
}

.leseprobe-viewer-stage[data-mode="pair"] {
  max-width: 980px;
  aspect-ratio: 3 / 2;
}

.leseprobe-page-leaf {
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  opacity: 0;
  transition: transform 0.46s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.46s ease;
}

.leseprobe-page-leaf.is-active {
  opacity: 1;
  z-index: 1;
}

.leseprobe-page-pair {
  display: flex;
  width: 100%;
  height: 100%;
}

.leseprobe-page-img-wrap {
  flex: 1 1 0;
  height: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
  background: #fffdf6;
  box-shadow: 0 10px 26px rgba(120, 90, 40, 0.12);
}

.leseprobe-page-img-wrap + .leseprobe-page-img-wrap {
  border-left: 1px solid rgba(var(--color-gold-rgb), 0.22);
}

.leseprobe-page-img {
  max-width: 100%;
  max-height: 100%;
  display: block;
  object-fit: contain;
}

.leseprobe-page-pair-placeholder {
  padding: 1.5rem;
}

.leseprobe-page-placeholder-card {
  width: 100%;
  height: 100%;
  flex-direction: column;
  gap: 0.6rem;
  padding: 2rem 1.5rem;
  text-align: center;
}

.leseprobe-page-placeholder-text {
  font-family: var(--font-heading);
  font-style: italic;
  font-size: 1.15rem;
  color: var(--color-gold-light);
  margin: 0;
}

.leseprobe-page-placeholder-sub {
  font-size: 0.92rem;
  color: var(--color-parchment-dim);
  margin: 0;
  max-width: 320px;
}

.leseprobe-viewer-arrows {
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: space-between;
  pointer-events: none;
  padding: 0 0.6rem;
}

.leseprobe-viewer-arrow {
  pointer-events: auto;
  display: inline-flex;
  align-items: center;
  gap: 0.3rem;
  background: rgba(255, 253, 248, 0.92);
  border: 1px solid rgba(var(--color-gold-rgb), 0.4);
  color: var(--color-gold-light);
  border-radius: 999px;
  padding: 0.5rem 0.9rem;
  font-family: var(--font-heading);
  font-size: 0.9rem;
  cursor: pointer;
  transition: background 0.2s ease, opacity 0.2s ease;
}

.leseprobe-viewer-arrow:hover:not(:disabled) {
  background: #fffdf8;
}

.leseprobe-viewer-arrow:disabled {
  opacity: 0.32;
  cursor: default;
}

.leseprobe-viewer-counter {
  text-align: center;
  font-size: 0.88rem;
  font-style: italic;
  color: var(--color-parchment-dim);
  margin: 1rem 0 0;
}

.leseprobe-viewer-extra {
  display: flex;
  justify-content: center;
  flex-wrap: wrap;
  gap: 0.9rem;
  margin-top: 1.3rem;
}

.leseprobe-viewer-extra-btn {
  font-size: 0.92rem;
  padding: 0.6rem 1.4rem;
}

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

  .leseprobe-viewer-stage {
    transition: none;
  }
}

@media (max-width: 767px) {
  .leseprobe-viewer-frame {
    padding: 1.6rem 1rem 1.3rem;
  }

  .leseprobe-viewer-stage[data-mode="solo"],
  .leseprobe-viewer-stage[data-mode="pair"] {
    max-width: 100%;
    aspect-ratio: 3 / 4;
  }

  .leseprobe-viewer-arrows {
    position: static;
    padding: 0.9rem 0 0;
  }
}

.leseprobe-closing {
  padding-top: 1.2rem;
}

.leseprobe-closing-eyebrow {
  font-style: italic;
  color: var(--color-parchment-dim);
  margin-bottom: 0.3rem;
}

.leseprobe-closing-title {
  font-family: var(--font-heading);
  font-size: 1.15rem;
  color: var(--color-gold-light);
  margin-bottom: 0.2rem;
}

.leseprobe-closing-note {
  font-size: 0.92rem;
  font-style: italic;
  color: var(--color-parchment-dim);
  margin-bottom: 1.1rem;
}

/* ===================================================================
   LUMARIA-MEMORY (lumaria-memory-spiel.html)
   -------------------------------------------------------------------
   Das kostenlose Mitmachspiel im Kids Club. Nutzt das helle
   theme-schatztruhe (Flieder/Gold/Tuerkis), damit es optisch zur
   Gratis-Schatztruhe gehoert und sich klar vom Marktplatz absetzt --
   dort wird verkauft, hier wird gespielt.

   Die Karten sind echte <button>-Elemente: dadurch funktionieren Tab,
   Enter und Leertaste ohne eigenes Tastatur-JavaScript, und Screenreader
   kuendigen sie korrekt als bedienbar an.
   =================================================================== */

.spielseite-kopf {
  text-align: center;
  padding-bottom: 1rem;
}

.spielseite-intro {
  max-width: 34rem;
  margin: 0 auto;
  color: var(--color-parchment-dim);
}

.memory-bereich {
  padding-top: 0.5rem;
}

/* --- Schwierigkeitswahl ------------------------------------------- */

.memory-stufen {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
  gap: 0.6rem;
  margin-bottom: 1.4rem;
}

.memory-stufen-label {
  font-family: var(--font-heading);
  font-size: 1rem;
  color: var(--color-parchment-dim);
  margin-right: 0.2rem;
}

.memory-stufe-btn {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.1rem;
  padding: 0.5rem 1.1rem;
  border: 1px solid rgba(var(--color-gold-rgb), 0.45);
  border-radius: 999px;
  background: rgba(var(--surface-rgb), var(--surface-alpha));
  color: var(--color-parchment);
  font-family: var(--font-heading);
  cursor: pointer;
  transition: background 0.2s ease, border-color 0.2s ease, transform 0.15s ease;
}

.memory-stufe-btn:hover {
  border-color: var(--color-gold);
  transform: translateY(-1px);
}

.memory-stufe-btn.is-aktiv {
  background: var(--color-gold);
  border-color: var(--color-gold);
  color: var(--color-ink-deep);
}

.memory-stufe-name {
  font-size: 1rem;
  line-height: 1.2;
}

.memory-stufe-info {
  font-family: var(--font-body);
  font-size: 0.82rem;
  opacity: 0.75;
  line-height: 1.2;
}

/* --- Punktestand --------------------------------------------------- */

.memory-anzeige {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
  gap: 0.8rem 1.6rem;
  padding: 0.9rem 1.2rem;
  margin-bottom: 1.6rem;
  border: 1px solid rgba(var(--color-gold-rgb), 0.3);
  border-radius: 18px;
  background: rgba(var(--surface-rgb), var(--surface-alpha));
}

.memory-wert {
  display: flex;
  align-items: baseline;
  gap: 0.4rem;
  margin: 0;
}

.memory-wert-zahl {
  font-family: var(--font-heading);
  font-size: 1.5rem;
  line-height: 1;
  color: var(--color-gold-light);
}

.memory-wert-text {
  font-size: 0.92rem;
  color: var(--color-parchment-dim);
}

.memory-neustart-btn {
  padding: 0.45rem 1.2rem;
  border: 1px solid var(--color-gold);
  border-radius: 999px;
  background: transparent;
  color: var(--color-parchment);
  font-family: var(--font-heading);
  font-size: 0.95rem;
  cursor: pointer;
  transition: background 0.2s ease, color 0.2s ease;
}

.memory-neustart-btn:hover {
  background: var(--color-gold);
  color: var(--color-ink-deep);
}

/* --- Spielfeld ------------------------------------------------------
   Spaltenzahl haengt an data-stufe: bei 24 Karten waeren 3 Spalten ein
   endloser Streifen zum Scrollen -- und ein Memory, bei dem man nicht
   alle Karten gleichzeitig sieht, ist kein Memory mehr. Deshalb wird
   das Raster mit der Kartenzahl breiter statt laenger. */

.memory-spielfeld {
  display: grid;
  gap: 0.6rem;
  margin: 0 auto;
  max-width: 900px;
}

.memory-spielfeld[data-stufe="klein"],
.memory-spielfeld[data-stufe="mittel"] {
  grid-template-columns: repeat(3, 1fr);
}

.memory-spielfeld[data-stufe="gross"] {
  grid-template-columns: repeat(4, 1fr);
}

@media (min-width: 600px) {
  .memory-spielfeld {
    gap: 0.9rem;
  }

  .memory-spielfeld[data-stufe="klein"],
  .memory-spielfeld[data-stufe="mittel"] {
    grid-template-columns: repeat(4, 1fr);
  }

  .memory-spielfeld[data-stufe="gross"] {
    grid-template-columns: repeat(6, 1fr);
  }
}

/* --- Einzelne Karte -------------------------------------------------
   Der Umklapp-Effekt liegt auf .memory-karte-innen, nicht auf dem
   Button selbst: ein transform auf dem Button wuerde auch den
   Fokusrahmen mitdrehen, was bei Tastaturbedienung irritiert. */

.memory-karte {
  position: relative;
  aspect-ratio: 1 / 1;
  padding: 0;
  border: none;
  background: none;
  cursor: pointer;
  perspective: 900px;
  -webkit-tap-highlight-color: transparent;
}

.memory-karte:disabled {
  cursor: default;
}

.memory-karte-innen {
  display: block;
  position: relative;
  width: 100%;
  height: 100%;
  transform-style: preserve-3d;
  transition: transform 0.45s cubic-bezier(0.4, 0.1, 0.2, 1);
}

.memory-karte.is-offen .memory-karte-innen,
.memory-karte.is-gefunden .memory-karte-innen {
  transform: rotateY(180deg);
}

.memory-karte-seite {
  display: flex;
  align-items: center;
  justify-content: center;
  position: absolute;
  inset: 0;
  border-radius: 14px;
  overflow: hidden;
  backface-visibility: hidden;
  -webkit-backface-visibility: hidden;
}

/* Rueckseite: schlichtes Gold-auf-Flieder-Ornament. Bewusst KEIN Bild --
   alle Rueckseiten muessen exakt gleich aussehen, sonst verraet schon
   ein Pixelunterschied die Position einer Karte. */
.memory-karte-rueckseite {
  background:
    radial-gradient(circle at 50% 42%, rgba(var(--color-gold-rgb), 0.28), transparent 62%),
    linear-gradient(150deg, var(--color-gold-light) 0%, #8a6fbe 100%);
  border: 2px solid rgba(var(--color-gold-rgb), 0.55);
}

.memory-karte-ornament {
  font-size: clamp(1.4rem, 6vw, 2.1rem);
  color: var(--color-gold);
  text-shadow: 0 0 12px rgba(var(--color-gold-rgb), 0.5);
}

.memory-karte-vorderseite {
  transform: rotateY(180deg);
  background: rgba(var(--surface-rgb), 0.9);
  border: 2px solid rgba(var(--color-gold-rgb), 0.4);
}

.memory-karte-vorderseite img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

/* Namensschild am unteren Kartenrand: der eigentliche Lerneffekt --
   beim Aufdecken sieht das Kind Bild UND Namen des Volkes. */
.memory-karte-name {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  padding: 0.3rem 0.35rem;
  background: linear-gradient(to top, rgba(61, 58, 82, 0.92), rgba(61, 58, 82, 0.55) 70%, transparent);
  color: #fbfaff;
  font-family: var(--font-heading);
  font-size: clamp(0.6rem, 2.4vw, 0.82rem);
  line-height: 1.2;
  text-align: center;
}

.memory-karte-symbol {
  display: block;
  color: var(--color-gold);
  font-size: 0.9em;
}

/* Gefundenes Paar: ruhiges goldenes Leuchten statt Konfetti-Effekt --
   erkennbar, aber nicht ueberreizend. */
.memory-karte.is-gefunden .memory-karte-vorderseite {
  border-color: var(--color-gold);
  box-shadow: 0 0 0 3px rgba(var(--color-gold-rgb), 0.35), 0 6px 18px rgba(61, 58, 82, 0.18);
}

.memory-karte:focus-visible {
  outline: 3px solid var(--color-gold-light);
  outline-offset: 3px;
  border-radius: 16px;
}

/* --- Gewonnen-Meldung ---------------------------------------------- */

/* Die Ruhelage ist SICHTBAR, das Einblenden macht eine Animation mit
   from-Keyframe. Anders herum (Ruhelage opacity:0, Einblenden per
   transition) haengt die Sichtbarkeit daran, dass der Uebergang auch
   wirklich laeuft -- in einem Hintergrund-Tab oder bei eingefrorenen
   Animationen bliebe die Meldung sonst dauerhaft unsichtbar und wuerde
   trotzdem ihren Platz belegen. Jetzt ist die Ruhelage opacity:1 --
   sobald die Animation abgeschlossen oder per prefers-reduced-motion
   abgeschaltet ist, steht die Meldung in jedem Fall sichtbar da. */
.memory-gewonnen {
  max-width: 30rem;
  margin: 1.8rem auto 0;
  padding: 1.6rem 1.4rem;
  text-align: center;
  border: 1px solid rgba(var(--color-gold-rgb), 0.5);
  border-radius: 22px;
  background: rgba(var(--surface-rgb), 0.85);
}

.memory-gewonnen.is-sichtbar {
  animation: memory-gewonnen-auf 0.4s ease both;
}

@keyframes memory-gewonnen-auf {
  from {
    opacity: 0;
    transform: translateY(10px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

.memory-gewonnen-stern {
  display: block;
  font-size: 2rem;
  color: var(--color-gold);
  line-height: 1;
}

.memory-gewonnen-titel {
  font-family: var(--font-heading);
  font-size: 1.6rem;
  margin: 0.3rem 0 0.6rem;
  color: var(--color-gold-light);
}

.memory-gewonnen-text {
  margin: 0 0 0.4rem;
}

.memory-gewonnen-lob {
  margin: 0 0 1.2rem;
  font-style: italic;
  color: var(--color-parchment-dim);
}

.memory-gewonnen-aktionen {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.7rem;
}

.memory-gewonnen-link {
  font-size: 0.95rem;
  color: var(--color-gold-light);
}

.memory-hinweis {
  text-align: center;
  color: var(--color-parchment-dim);
}

/* --- Bruecke zum gedruckten Memory ---------------------------------- */

.memory-echtes {
  text-align: center;
}

.memory-echtes-titel {
  font-family: var(--font-heading);
  font-size: 1.3rem;
  color: var(--color-gold-light);
  margin-bottom: 0.5rem;
}

.memory-echtes-text {
  color: var(--color-parchment-dim);
  margin-bottom: 1.2rem;
}

/* --- Reduzierte Bewegung --------------------------------------------
   Karten klappen dann nicht um, sondern blenden weich durch. Der
   Spielablauf bleibt identisch. */

@media (prefers-reduced-motion: reduce) {
  .memory-karte-innen,
  .memory-stufe-btn {
    transition: none;
  }

  .memory-gewonnen.is-sichtbar {
    animation: none;
  }

  .memory-karte-innen {
    transform-style: flat;
  }

  .memory-karte.is-offen .memory-karte-innen,
  .memory-karte.is-gefunden .memory-karte-innen {
    transform: none;
  }

  .memory-karte-vorderseite {
    transform: none;
    opacity: 0;
  }

  .memory-karte.is-offen .memory-karte-vorderseite,
  .memory-karte.is-gefunden .memory-karte-vorderseite {
    opacity: 1;
  }

  .memory-karte.is-offen .memory-karte-rueckseite,
  .memory-karte.is-gefunden .memory-karte-rueckseite {
    opacity: 0;
  }
}

/* Namensschild auf sehr kleinen Karten ausblenden.
   Auf dem Handy ist eine Karte der grossen Runde nur ~75px breit. Das
   Schild belegte dort gemessen 58-73% der Kartenhoehe und verdeckte
   damit ausgerechnet das Bild, das man sich merken soll -- bei einer
   Schriftgroesse von 9,6px, die ein Kind ohnehin kaum liest. Auf der
   kleinen und mittleren Runde (Karten ab ~103px) bleibt das Schild
   sichtbar, ebenso ab Tablet-Breite auf allen Stufen. Wer die Namen
   lesen moechte, findet sie vollstaendig auf bewohner-lumarias.html. */
@media (max-width: 599px) {
  .memory-spielfeld[data-stufe="gross"] .memory-karte-name {
    display: none;
  }
}

/* ===================================================================
   APP-STARTBILDSCHIRM (app.html)
   -------------------------------------------------------------------
   Der Eingang der installierten App. Bewusst OHNE die Hauptnavigation
   der Website: Ein Kind bedient keine Aufklapp-Menues mit Punkten wie
   "Impressum" oder "Eltern & Paedagogen". Stattdessen grosse Kacheln
   mit Bild, das Spiel zuerst und ueber die volle Breite.

   Die Website selbst bleibt davon voellig unberuehrt -- diese Regeln
   greifen ausschliesslich ueber body.app-start-page.
   =================================================================== */

body.app-start-page {
  /* Eigene Farbwelt, dunkel und maerchenhaft: In der installierten App
     gibt es keine Browserleiste, die Flaeche fuellt das ganze Display.
     Dunkel wirkt dort wie ein Nachthimmel statt wie eine leere Seite. */
  --color-ink: #1b1420;
  --color-ink-deep: #120d16;
  --color-ink-light: #2c2032;
  --color-parchment: #f3e9d8;
  --color-parchment-dim: #b9a894;
  --color-gold: #c9a24d;
  --color-gold-light: #e3c583;
  --color-gold-rgb: 201, 162, 77;

  display: block;
  min-height: 100vh;
  /* 100dvh beruecksichtigt ein- und ausblendende Browserleisten auf dem
     Handy; ohne diese zweite Angabe entstuende dort ein Sprung. */
  min-height: 100dvh;
  background:
    radial-gradient(1200px 800px at 50% -10%, rgba(var(--color-gold-rgb), 0.16), transparent 62%),
    radial-gradient(900px 700px at 8% 108%, rgba(122, 90, 166, 0.20), transparent 66%),
    linear-gradient(170deg, var(--color-ink-light) 0%, var(--color-ink) 42%, var(--color-ink-deep) 100%);
  background-attachment: fixed;
  color: var(--color-parchment);
}

.app-start {
  max-width: 640px;
  margin: 0 auto;
  /* env(safe-area-inset-*) haelt Inhalte aus der Kamera-Aussparung und
     der Wischleiste heraus. Ohne das saesse die erste Kachel auf einem
     iPhone teils unter der Uhr. */
  padding:
    calc(1.6rem + env(safe-area-inset-top)) 1.1rem
    calc(1.6rem + env(safe-area-inset-bottom));
}

/* --- Kopf -------------------------------------------------------- */

.app-start-kopf {
  text-align: center;
  margin-bottom: 1.6rem;
}

.app-start-willkommen {
  margin: 0;
  font-size: 0.95rem;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--color-parchment-dim);
}

.app-start-titel {
  margin: 0.1rem 0 0.15rem;
  font-family: var(--font-heading);
  font-size: clamp(2.4rem, 11vw, 3.4rem);
  line-height: 1.05;
  color: var(--color-gold-light);
  text-shadow: 0 0 26px rgba(var(--color-gold-rgb), 0.35);
}

.app-start-unterzeile {
  margin: 0;
  font-style: italic;
  color: var(--color-parchment-dim);
}

/* --- Kacheln ------------------------------------------------------
   Zwei Spalten, die erste Kachel ueber beide. Zwei Spalten sind auf
   einem Handy das Maximum, bei dem ein Kachelbild noch etwas erkennen
   laesst; drei waeren Briefmarken. */

.app-kacheln {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 0.85rem;
}

.app-kachel {
  position: relative;
  display: block;
  aspect-ratio: 1 / 1;
  overflow: hidden;
  border-radius: 20px;
  border: 1px solid rgba(var(--color-gold-rgb), 0.35);
  background: var(--color-ink-light);
  text-decoration: none;
  color: var(--color-parchment);
  box-shadow: 0 8px 22px rgba(0, 0, 0, 0.32);
  transition: transform 0.16s ease, border-color 0.16s ease;
  -webkit-tap-highlight-color: transparent;
}

.app-kachel:active {
  /* Rueckmeldung beim Antippen. Auf dem Handy gibt es kein Hover --
     ohne diese Reaktion fuehlt sich eine Kachel "tot" an, und Kinder
     tippen dann mehrfach. */
  transform: scale(0.97);
}

.app-kachel:hover {
  border-color: var(--color-gold);
}

.app-kachel:focus-visible {
  outline: 3px solid var(--color-gold-light);
  outline-offset: 3px;
}

.app-kachel--gross {
  grid-column: 1 / -1;
  /* Ueber die volle Breite ein Quadrat waere zu hoch und schoebe alles
     Weitere aus dem Bild -- hier also ein liegendes Format. */
  aspect-ratio: 16 / 9;
}

.app-kachel-bild {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

.app-kachel-text {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  padding: 1.6rem 0.8rem 0.7rem;
  /* Verlauf statt Balken: Der Text bleibt lesbar, ohne das Bild unten
     hart abzuschneiden. */
  background: linear-gradient(
    to top,
    rgba(18, 13, 22, 0.94) 0%,
    rgba(18, 13, 22, 0.72) 55%,
    transparent 100%
  );
  text-align: center;
}

.app-kachel-titel {
  display: block;
  font-family: var(--font-heading);
  font-size: clamp(0.95rem, 4vw, 1.15rem);
  line-height: 1.2;
  color: var(--color-gold-light);
}

.app-kachel--gross .app-kachel-titel {
  font-size: clamp(1.3rem, 6vw, 1.7rem);
}

.app-kachel-unter {
  display: block;
  margin-top: 0.15rem;
  font-size: 0.88rem;
  color: var(--color-parchment-dim);
}

/* Kachel ohne Bild (z.B. Post nach Lumaria): dann traegt ein grosses
   Symbol die Flaeche, damit sie nicht leer wirkt. */
.app-kachel--schlicht {
  grid-column: 1 / -1;
  aspect-ratio: auto;
  background: rgba(var(--color-gold-rgb), 0.09);
}

.app-kachel--schlicht .app-kachel-text {
  position: static;
  background: none;
  padding: 1rem 0.8rem;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 0.6rem;
}

.app-kachel-symbol {
  font-size: 1.5rem;
  color: var(--color-gold);
}

/* --- Fuss ---------------------------------------------------------- */

.app-start-fuss {
  margin-top: 1.8rem;
  text-align: center;
}

.app-start-website-link {
  font-size: 0.92rem;
  color: var(--color-parchment-dim);
  text-decoration: underline;
}

.app-start-verlag {
  margin: 0.7rem 0 0;
  font-size: 0.8rem;
  letter-spacing: 0.06em;
  color: rgba(var(--color-gold-rgb), 0.65);
}

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

  .app-kachel:active {
    transform: none;
  }
}

/* Ab Tablet-Breite darf die grosse Kachel wieder hoeher werden, dort
   ist Platz genug. */
@media (min-width: 700px) {
  .app-kacheln {
    grid-template-columns: repeat(3, 1fr);
    gap: 1rem;
  }

  .app-kachel--gross {
    grid-column: 1 / -1;
    aspect-ratio: 21 / 9;
  }
}

/* ===================================================================
   HINWEIS AUF DIE LUMARIA-APP (Abschnitt am Ende von index.html)
   -------------------------------------------------------------------
   Erklaert, dass es die App gibt und wie man sie auf den Start-
   bildschirm bekommt. Nutzt die Farbvariablen der jeweiligen Seite,
   passt sich also automatisch an, falls die Startseite spaeter ein
   anderes Theme bekommt.
   =================================================================== */

.app-hinweis {
  text-align: center;
}

.app-hinweis-kopf {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 1rem;
  margin-bottom: 1.8rem;
}

.app-hinweis-icon {
  width: 96px;
  height: 96px;
  border-radius: 22px;
  border: 1px solid rgba(var(--color-gold-rgb), 0.5);
  /* Der Schatten laesst das Symbol wirken wie auf einem Homescreen --
     ein stiller Hinweis darauf, worum es hier geht. */
  box-shadow: 0 10px 24px rgba(0, 0, 0, 0.22);
  flex-shrink: 0;
}

.app-hinweis-eyebrow {
  margin: 0 0 0.2rem;
  font-size: 0.85rem;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--color-gold);
}

.app-hinweis-titel {
  margin: 0 0 0.6rem;
  font-family: var(--font-heading);
  font-size: clamp(1.4rem, 5vw, 1.9rem);
  color: var(--color-gold-light);
}

/* Die Ueberschrift als Schriftbild. Sie steht in einer Textspalte,
   deshalb bewusst an deren Breite gebunden statt an den Bildschirm --
   sonst waere sie breiter als der Absatz darunter und der Block wirkte
   auseinandergerissen.
   Der Schriftzug fuellt die Grafik nicht aus: Nachgemessen liegen ueber
   ihm 16 und unter ihm 17 Prozent der Bildhoehe leer. Ohne Ausgleich
   klaffte oben und unten eine Luecke, die aussaehe wie ein Fehler.
   Die negativen Aussenabstaende holen diesen Leerraum wieder heraus.
   Sie stehen bewusst in Prozent und nicht in Pixeln: Prozentwerte
   beziehen sich auf die Breite des Elternelements, wachsen und
   schrumpfen also zusammen mit der Grafik. Ein fester Pixelwert waere
   nur bei genau einer Bildschirmbreite richtig. */
.app-hinweis-titel-img {
  display: block;
  width: 100%;
  max-width: 520px;
  height: auto;
  margin: -5.3% 0 -3.8%;
}

@media (max-width: 700px) {
  .app-hinweis-titel-img {
    margin-left: auto;
    margin-right: auto;
  }
}

.app-hinweis-lede {
  margin: 0 auto 0.7rem;
  max-width: 34rem;
  color: var(--color-parchment-dim);
}

/* --- Die beiden Anleitungen ---------------------------------------
   Nebeneinander ab Tablet, untereinander auf dem Handy. Bewusst BEIDE
   sichtbar statt automatisch nach Geraet umzuschalten: Martina selbst
   und Eltern schauen oft am Computer nach, um es dem Kind danach am
   Handy zu zeigen. */

.app-hinweis-anleitung {
  display: grid;
  gap: 1rem;
  margin-bottom: 1.6rem;
  text-align: left;
}

@media (min-width: 640px) {
  .app-hinweis-anleitung {
    grid-template-columns: 1fr 1fr;
  }
}

/* Die beiden Anleitungskaesten tragen den goldenen Zierrahmen.

   WARUM border-image UND KEIN BILD IM KASTEN: Der Rahmen soll sich nach
   dem Text richten, nicht umgekehrt. Ein Bild haette ein festes
   Seitenverhaeltnis mitgebracht -- laengerer Text waere herausgelaufen,
   kuerzerer haette Leere hinterlassen. border-image behaelt die vier
   verzierten Ecken bei und zieht nur die schlichten goldenen Leisten
   dazwischen lang; die Kastenhoehe bleibt frei.

   slice 170 schneidet im Quellbild so grosszuegig, dass auch das
   Handy-Symbol oben rechts vollstaendig in der Ecke steckt. Gezeichnet
   werden die Ecken dann in 54 px -- also verkleinert, nicht
   beschnitten. "fill" fuellt die Kastenflaeche mit der cremefarbenen
   Mitte des Rahmens. */
.app-hinweis-schritte {
  padding: 0.2rem 0.6rem 0.6rem;
  border: 54px solid transparent;
  border-image-source: url("../img/app-rahmen.png?v=1");
  border-image-slice: 170 fill;
  border-image-width: 54px;
  border-image-repeat: stretch;
  border-radius: 0;
  background: none;
  /* Der Rahmen bringt eine helle Flaeche mit -- darauf braucht es
     dunkle Schrift. */
  color: #4a2a6a;
}

@media (max-width: 520px) {
  .app-hinweis-schritte {
    border-width: 38px;
    border-image-width: 38px;
  }
}

.app-hinweis-schritte-titel {
  margin: 0 0 0.6rem;
  font-family: var(--font-heading);
  font-size: 1.05rem;
  color: #6d4a12;
}

.app-hinweis-schritte .app-hinweis-liste,
.app-hinweis-schritte .app-hinweis-liste strong {
  color: #4a2a6a;
}

.app-hinweis-liste {
  margin: 0;
  padding-left: 1.2rem;
  font-size: 0.98rem;
  line-height: 1.6;
}

.app-hinweis-liste li + li {
  margin-top: 0.35rem;
}

.app-hinweis-probe {
  max-width: 30rem;
  margin: 0 auto 1rem;
  font-style: italic;
  color: var(--color-parchment-dim);
}

@media (min-width: 640px) {
  .app-hinweis-kopf {
    flex-direction: row;
    align-items: flex-start;
    text-align: left;
    gap: 1.4rem;
  }

  .app-hinweis-lede {
    margin-left: 0;
  }
}

/* --- App-Startbildschirm: die beiden Bereiche ----------------------
   "Spielen" und "Singen" sind die einzigen Bereiche der App. Die
   Ueberschriften trennen sie sichtbar, damit ein Kind auf einen Blick
   erfasst, was es hier gibt -- ohne lesen zu muessen: oben Bilder von
   Figuren, unten Plattencover. */

.app-bereich + .app-bereich {
  margin-top: 1.9rem;
}

.app-bereich-titel {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  margin: 0 0 0.8rem;
  font-family: var(--font-heading);
  font-size: 1.25rem;
  color: var(--color-parchment);
}

.app-bereich-symbol {
  color: var(--color-gold);
  font-size: 1.1em;
}

/* Liedkacheln: drei Spalten statt zwei. Plattencover sind quadratisch
   und auch klein noch unterscheidbar, anders als eine Szene mit
   Figuren. So passen alle sechs Lieder auf einen Blick aufs Display,
   ohne dass gescrollt werden muss. */
.app-kacheln--lieder {
  grid-template-columns: repeat(3, 1fr);
  gap: 0.6rem;
}

.app-kacheln--lieder .app-kachel-titel {
  font-size: clamp(0.68rem, 3vw, 0.85rem);
}

.app-kacheln--lieder .app-kachel-text {
  padding: 1.1rem 0.35rem 0.45rem;
}

/* Kachel fuer noch nicht Fertiges: gleiche Groesse wie die anderen,
   aber ohne Bild, gedaempft und nicht anklickbar. */
.app-kachel--bald {
  display: flex;
  align-items: center;
  justify-content: center;
  border-style: dashed;
  border-color: rgba(var(--color-gold-rgb), 0.35);
  background: rgba(var(--color-gold-rgb), 0.06);
  box-shadow: none;
  cursor: default;
}

.app-kachel--bald .app-kachel-text {
  position: static;
  background: none;
  padding: 0.8rem;
}

.app-kachel--bald .app-kachel-titel {
  color: var(--color-parchment-dim);
}

.app-kachel--bald .app-kachel-symbol {
  display: block;
  margin-bottom: 0.3rem;
  font-size: 1.6rem;
  color: rgba(var(--color-gold-rgb), 0.6);
}

.app-start-fuss-zeile {
  margin: 0.6rem 0 0;
  font-size: 0.82rem;
  color: var(--color-parchment-dim);
}

.app-start-fuss-zeile a {
  color: var(--color-parchment-dim);
  text-decoration: underline;
  margin: 0 0.35rem;
}

@media (min-width: 700px) {
  .app-kacheln--lieder {
    grid-template-columns: repeat(6, 1fr);
  }
}

/* ===================================================================
   MITSINGEN (lumaria-singen.html)
   -------------------------------------------------------------------
   Lied aussuchen, abspielen, Text mitlesen. Liste und Player liegen auf
   derselben Seite, das Skript blendet um -- so bricht das Lied nicht ab,
   wenn zwischen Text und Auswahl gewechselt wird.
   =================================================================== */

.singen-kopf {
  text-align: center;
  padding-bottom: 0.5rem;
}

.singen-intro {
  max-width: 32rem;
  margin: 0 auto;
  color: var(--color-parchment-dim);
}

/* --- Auswahl ------------------------------------------------------- */

/* Das hidden-Attribut blendet ein Element nur ueber eine sehr schwache
   Browser-Grundregel aus (display:none). JEDE eigene display-Angabe
   sticht sie -- die Liste blieb dadurch sichtbar UEBER dem Player, statt
   zu verschwinden. Deshalb hier ausdruecklich zuruecknehmen. */
.lieder-liste[hidden] {
  display: none;
}

.lieder-liste {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 1rem;
  max-width: 760px;
  margin: 0 auto;
}

@media (min-width: 620px) {
  .lieder-liste {
    grid-template-columns: repeat(3, 1fr);
  }
}

.lied-karte {
  display: block;
  padding: 0;
  border: none;
  background: none;
  cursor: pointer;
  text-align: center;
  -webkit-tap-highlight-color: transparent;
}

.lied-karte-cover {
  position: relative;
  display: block;
  border-radius: 16px;
  overflow: hidden;
  border: 1px solid rgba(var(--color-gold-rgb), 0.4);
  box-shadow: 0 6px 16px rgba(61, 58, 82, 0.18);
  transition: transform 0.16s ease, box-shadow 0.16s ease;
}

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

/* Abspielzeichen mitten aufs Cover: Ein Kind, das noch nicht liest,
   erkennt daran sofort, dass hier etwas zu hören ist. */
.lied-karte-play {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  display: flex;
  align-items: center;
  justify-content: center;
  width: 3rem;
  height: 3rem;
  border-radius: 50%;
  background: rgba(61, 58, 82, 0.72);
  color: var(--color-gold-light);
  font-size: 1.2rem;
  /* Optischer Ausgleich: Ein Dreieck wirkt in einem Kreis nach links
     verschoben, wenn es exakt mittig sitzt. */
  padding-left: 0.18rem;
  transition: background 0.16s ease;
}

.lied-karte:hover .lied-karte-cover,
.lied-karte:focus-visible .lied-karte-cover {
  transform: translateY(-2px);
  box-shadow: 0 10px 22px rgba(61, 58, 82, 0.26);
}

.lied-karte:hover .lied-karte-play {
  background: var(--color-gold);
  color: var(--color-ink-deep);
}

.lied-karte:focus-visible {
  outline: 3px solid var(--color-gold-light);
  outline-offset: 4px;
  border-radius: 18px;
}

.lied-karte-titel {
  display: block;
  margin-top: 0.5rem;
  font-family: var(--font-heading);
  font-size: 0.98rem;
  line-height: 1.25;
  color: var(--color-parchment);
}

/* --- Player und Text ------------------------------------------------ */

.lied-buehne {
  max-width: 640px;
  margin: 0 auto;
}

.lied-zurueck {
  padding: 0.45rem 1.1rem;
  margin-bottom: 1.2rem;
  border: 1px solid var(--color-gold);
  border-radius: 999px;
  background: transparent;
  color: var(--color-parchment);
  font-family: var(--font-heading);
  font-size: 0.95rem;
  cursor: pointer;
}

.lied-zurueck:hover {
  background: var(--color-gold);
  color: var(--color-ink-deep);
}

.lied-kopf {
  display: flex;
  align-items: center;
  gap: 1rem;
  margin-bottom: 1rem;
}

.lied-cover {
  width: 96px;
  height: 96px;
  border-radius: 16px;
  object-fit: cover;
  border: 1px solid rgba(var(--color-gold-rgb), 0.45);
  flex-shrink: 0;
}

.lied-titel {
  margin: 0;
  font-family: var(--font-heading);
  font-size: clamp(1.2rem, 5vw, 1.6rem);
  color: var(--color-gold-light);
}

.lied-spieler {
  width: 100%;
  margin-bottom: 1.4rem;
}

/* Der Songtext. Grosszuegige Zeilenhoehe, weil hier mitgelesen und
   mitgesungen wird -- eng gesetzte Zeilen verliert man beim Singen. */
.lied-text {
  padding: 1.3rem 1.4rem;
  border: 1px solid rgba(var(--color-gold-rgb), 0.3);
  border-radius: 18px;
  background: rgba(var(--surface-rgb), var(--surface-alpha));
}

.lied-abschnitt + .lied-abschnitt {
  margin-top: 1.2rem;
}

.lied-abschnitt-marke {
  margin: 0 0 0.35rem;
  font-size: 0.78rem;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--color-gold);
}

.lied-zeile {
  margin: 0;
  font-size: 1.08rem;
  line-height: 1.75;
}

.lied-text-fehlt {
  margin: 0;
  font-style: italic;
  color: var(--color-parchment-dim);
}

.singen-hinweis {
  text-align: center;
  color: var(--color-parchment-dim);
}

@media (prefers-reduced-motion: reduce) {
  .lied-karte-cover,
  .lied-karte-play {
    transition: none;
  }

  .lied-karte:hover .lied-karte-cover,
  .lied-karte:focus-visible .lied-karte-cover {
    transform: none;
  }
}

/* Das Songcover auf lumaria-songs.html ist anklickbar und fuehrt zum
   Mitsingen. Der Link MUSS die Groesse durchreichen: Das Coverbild ist
   mit height:100% bemasst, und ein Link ist von Haus aus inline und
   damit ohne eigene Hoehe -- ohne diese Regel bezieht sich das 100% auf
   nichts und das Bild klappt zusammen. */
.lumaria-song-cover-link {
  display: block;
  width: 100%;
  height: 100%;
}

/* ===================================================================
   LUMARIA-PUZZLE (lumaria-puzzle.html)
   -------------------------------------------------------------------
   Bedient wird durch Antippen zweier Teile, die dann den Platz
   tauschen -- nicht durch Ziehen. Auf einem Handy ist Ziehen fuer
   kleine Finger frustrierend, und ein Wisch scrollt versehentlich die
   Seite.
   =================================================================== */

.puzzle-bereich {
  padding-top: 0.5rem;
}

.puzzle-motiv-name {
  text-align: center;
  margin: 0 0 0.7rem;
  font-family: var(--font-heading);
  color: var(--color-gold-light);
}

/* Das Brett hat das Seitenverhaeltnis der Bilder (4:3). Die Spaltenzahl
   setzt das Skript je nach Stufe; grid-auto-rows:1fr teilt die feste
   Hoehe gleichmaessig auf die Zeilen auf. */
.puzzle-brett {
  display: grid;
  grid-auto-rows: 1fr;
  aspect-ratio: 4 / 3;
  gap: 3px;
  max-width: 620px;
  margin: 0 auto;
  padding: 6px;
  border-radius: 18px;
  border: 1px solid rgba(var(--color-gold-rgb), 0.4);
  background: rgba(var(--surface-rgb), var(--surface-alpha));
  transition: gap 0.4s ease, padding 0.4s ease;
}

/* Beim Loesen schliessen sich die Fugen -- das Bild wird sichtbar zu
   einem Ganzen. Kein zusaetzlicher Jubel noetig, das Bild selbst ist
   die Belohnung. */
.puzzle-brett.is-fertig {
  gap: 0;
  padding: 3px;
}

.puzzle-teil {
  padding: 0;
  border: 1px solid rgba(var(--color-gold-rgb), 0.25);
  border-radius: 6px;
  background-color: rgba(var(--color-gold-rgb), 0.08);
  background-repeat: no-repeat;
  cursor: pointer;
  transition: transform 0.14s ease, box-shadow 0.14s ease, border-color 0.14s ease, border-radius 0.4s ease;
  -webkit-tap-highlight-color: transparent;
  /* Verhindert, dass ein Tipp auf ein Teil als Doppeltipp-Zoom
     ausgelegt wird -- das Spiel wuerde sonst beim schnellen Tauschen
     staendig hineinzoomen. */
  touch-action: manipulation;
}

.puzzle-brett.is-fertig .puzzle-teil {
  border-color: transparent;
  border-radius: 0;
  cursor: default;
}

/* Ausgewaehltes Teil: deutlich, aber ohne Zappeln. Kinder sollen auf
   einen Blick sehen, welches Teil "in der Hand" ist. */
.puzzle-teil.is-gewaehlt {
  border-color: var(--color-gold);
  box-shadow: 0 0 0 3px var(--color-gold), 0 6px 16px rgba(61, 58, 82, 0.3);
  transform: scale(0.94);
  z-index: 2;
}

/* Richtig sitzendes Teil: ruhiger goldener Rand als stille Bestaetigung.
   Gerade juengere Kinder verlieren sonst den Ueberblick, was schon
   stimmt. */
.puzzle-teil.is-richtig {
  border-color: rgba(var(--color-gold-rgb), 0.9);
}

.puzzle-teil:focus-visible {
  outline: 3px solid var(--color-gold-light);
  outline-offset: 2px;
  z-index: 2;
}

/* --- Vorlage -------------------------------------------------------- */

.puzzle-vorlage-bereich {
  margin-top: 1.2rem;
  text-align: center;
}

/* Der Knopf unter dem Puzzle: Zierrahmen als Hintergrundbild, die
   Beschriftung mittig darauf.

   WARUM HINTERGRUNDBILD UND NICHT <img>: Das Spielskript schreibt beim
   Auf- und Zuklappen die Beschriftung dieses Knopfes neu ("Vorlage
   zuklappen" / "Wie sieht es fertig aus?"). Ein Bild im Knopf waere
   dabei jedes Mal verschwunden.

   Damit die Grafik trotzdem nie verzerrt und nie beschnitten wird:
   contain sorgt fuer das Erste, das feste Seitenverhaeltnis 700:166 --
   das der Grafik -- fuer das Zweite. */
.puzzle-vorlage-knopf {
  display: grid;
  place-items: center;
  width: 100%;
  max-width: 320px;
  min-height: 52px;
  aspect-ratio: 700 / 166;
  margin: 0 auto;
  /* In em, nicht in Prozent: Prozentwerte fuer den Innenabstand
     beziehen sich auf den Elternblock, nicht auf den Knopf selbst --
     hier waeren aus gewollten 35 px unversehens 94 px geworden. */
  padding-inline: 2.4em;
  border: none;
  border-radius: 999px;
  background-image: url("../img/puzzle-vorlage-knopf.png?v=1");
  background-size: contain;
  background-position: center;
  background-repeat: no-repeat;
  color: #4a2a6a;
  font-family: var(--font-heading);
  /* Kein Container-Query hier: Der Text steht direkt im Knopf, und ein
     Element ist nie sein eigener Bezug. Der Knopf ist ohnehin nie
     breiter als 320 px, deshalb reicht clamp(). */
  font-size: clamp(0.78rem, 3.8vw, 1.05rem);
  line-height: 1.2;
  transition: transform 0.2s ease, filter 0.2s ease;
}

@media (hover: hover) {
  .puzzle-vorlage-knopf:hover {
    transform: translateY(-2px);
    filter: drop-shadow(0 4px 8px rgba(201, 162, 39, 0.45));
    background: none;
    color: #4a2a6a;
  }
}

.puzzle-vorlage-knopf:active {
  transform: translateY(1px);
  filter: drop-shadow(0 1px 3px rgba(201, 162, 39, 0.5)) brightness(0.97);
}

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

.puzzle-vorlage {
  max-width: 320px;
  margin: 0.9rem auto 0;
}

.puzzle-vorlage img {
  width: 100%;
  height: auto;
  display: block;
  border-radius: 14px;
  border: 1px solid rgba(var(--color-gold-rgb), 0.4);
}

@media (prefers-reduced-motion: reduce) {
  .puzzle-brett,
  .puzzle-teil {
    transition: none;
  }

  .puzzle-teil.is-gewaehlt {
    transform: none;
  }
}

/* ===================================================================
   LOOMUS & DIE ZAUBERKRÜMELKEKSE (lumaria-keksfang.html)
   -------------------------------------------------------------------
   Loomus fliegt unten, von oben fallen Kekse. Alle Positionen im
   Spielfeld sind in Prozent gerechnet, nicht in Pixeln -- dadurch
   spielt es sich auf einem kleinen Handy genauso wie auf einem grossen
   Bildschirm, ohne Umrechnerei im Skript.
   =================================================================== */

.keksfang-bereich {
  padding-top: 0.5rem;
}

/* --- Meister Zimtstern schaut zu -------------------------------------
   Er steht NEBEN dem Spielfeld, nicht darin. Im Feld haette er zwei
   Nachteile: Er verdeckte fallende Kekse, und ein Kind, das ohnehin
   schon zielen und verfolgen muss, bekaeme eine dritte bewegte Sache
   mitten ins Blickfeld. Daneben bleibt er das, was er sein soll --
   jemand, der mitfiebert. */

.keksfang-buehne {
  display: flex;
  align-items: flex-end;
  justify-content: center;
  gap: clamp(0.5rem, 3vw, 2rem);
}

.keksfang-feld {
  /* Ohne das schrumpft das Spielfeld, sobald Zimtstern daneben steht --
     Flex-Kinder duerfen von sich aus kleiner werden als ihr Inhalt. */
  flex: 0 1 520px;
}

.keksfang-zimtstern {
  /* Ueber die HOEHE bemessen, nicht ueber die Breite. Beim Jubeln
     reisst er beide Arme weit auseinander -- bei fester Breite wuerde
     er in dem Moment kleiner, als traete er einen Schritt zurueck.
     Die Fusslinie sitzt in allen fuenf Bildern gleich, also bleibt er
     ueber die Hoehe bemessen ruhig stehen. */
  height: clamp(150px, 26vw, 320px);
  width: auto;
  flex: 0 0 auto;
  align-self: flex-end;
  /* Der Wechsel selbst soll nicht weich sein: Eine Regung kommt
     ploetzlich, sonst wirkt sie nicht wie eine Reaktion. Weich ist nur
     das leichte Wippen. */
  animation: zimtstern-wippen 3.4s ease-in-out infinite;
  transform-origin: 50% 100%;
  pointer-events: none;
  user-select: none;
  -webkit-user-select: none;
}

/* Ein sehr kleines Wippen, damit er nicht wie angeklebt dasteht.
   Bewusst langsam und winzig: Er soll im Augenwinkel leben, nicht
   die Aufmerksamkeit vom Spielfeld wegziehen. */
@keyframes zimtstern-wippen {
  0%, 100% { transform: rotate(-1.1deg) translateY(0); }
  50%      { transform: rotate(1.1deg) translateY(-4px); }
}

/* Waehrend er mitfiebert, wird das Wippen schneller und deutlicher --
   das traegt die Anspannung, ohne dass sich das Bild aendern muss. */
.keksfang-zimtstern.is-fiebert {
  animation-duration: 0.5s;
}

/* Beim Jubeln und Staunen ein kurzer Hupfer. */
.keksfang-zimtstern.is-jubelt {
  animation: zimtstern-hupf 0.45s ease-out;
}

@keyframes zimtstern-hupf {
  0%   { transform: translateY(0) scale(1); }
  35%  { transform: translateY(-16px) scale(1.06); }
  70%  { transform: translateY(0) scale(0.98); }
  100% { transform: translateY(0) scale(1); }
}

/* Auf schmalen Bildschirmen ist neben dem Feld kein Platz. Dort stellt
   er sich unter das Feld -- klein, rechts, ueber den Pfeiltasten. So
   sehen ihn auch Kinder am Handy, ohne dass das Spielfeld schrumpft. */
@media (max-width: 899px) {
  .keksfang-buehne {
    display: block;
    position: relative;
  }

  .keksfang-zimtstern {
    display: block;
    height: clamp(95px, 26vw, 150px);
    width: auto;
    margin: -0.75rem 0.5rem -0.5rem auto;
  }
}

@media (prefers-reduced-motion: reduce) {
  .keksfang-zimtstern,
  .keksfang-zimtstern.is-fiebert,
  .keksfang-zimtstern.is-jubelt {
    animation: none;
  }
}

.keksfang-feld {
  position: relative;
  aspect-ratio: 3 / 4;
  /* Auf dem Handy soll das Feld nicht ueber den Bildschirmrand
     hinauswachsen -- sonst faellt oben etwas herein, das man gar nicht
     sieht. */
  max-height: 68vh;
  max-width: 520px;
  margin: 0 auto;
  overflow: hidden;
  border-radius: 22px;
  border: 1px solid rgba(var(--color-gold-rgb), 0.45);
  background:
    radial-gradient(120% 70% at 50% -10%, rgba(var(--color-gold-rgb), 0.20), transparent 60%),
    linear-gradient(180deg, #2b2140 0%, #3a2a52 55%, #4a3566 100%);
  box-shadow: inset 0 -30px 60px rgba(0, 0, 0, 0.28);
  /* Verhindert, dass das Ziehen von Loomus die Seite scrollt oder
     hineinzoomt. Ohne das ist das Spiel auf dem Handy unbedienbar. */
  touch-action: none;
  user-select: none;
  -webkit-user-select: none;
  cursor: pointer;
}

.keksfang-loomus {
  position: absolute;
  bottom: 6%;
  left: 50%;
  width: 30%;
  height: auto;
  transform: translateX(-50%);
  pointer-events: none;
  /* Kein Uebergang auf left: Loomus muss dem Finger sofort folgen,
     eine Verzoegerung fuehlt sich wie Gummiband an. */
  filter: drop-shadow(0 6px 14px rgba(0, 0, 0, 0.35));
}

/* --- Die fallenden Dinge -------------------------------------------- */

.keksfang-ding {
  position: absolute;
  width: 17%;
  aspect-ratio: 1 / 1;
  transform: translateX(-50%);
  background-repeat: no-repeat;
  background-position: center;
  background-size: contain;
  pointer-events: none;
}

.keksfang-ding--stern,
.keksfang-ding--herzlicht {
  display: flex;
  align-items: center;
  justify-content: center;
}

.keksfang-form {
  width: 78%;
  height: 78%;
}

.keksfang-ding--stern .keksfang-form {
  fill: var(--color-gold-light);
  filter: drop-shadow(0 0 10px rgba(var(--color-gold-rgb), 0.9));
}

.keksfang-ding--herzlicht .keksfang-form {
  fill: #ff8fc4;
  filter: drop-shadow(0 0 10px rgba(255, 143, 196, 0.85));
}

/* Treffer: kurz aufleuchten und verschwinden. Bewusst knapp gehalten --
   ein langes Getue wuerde bei schnellem Fangen zum Dauerflimmern. */
.keksfang-ding.is-gefangen,
.keksfang-ding.is-bonus {
  animation: keksfang-treffer 0.26s ease-out forwards;
}

@keyframes keksfang-treffer {
  from { transform: translateX(-50%) scale(1); opacity: 1; }
  to   { transform: translateX(-50%) scale(1.7); opacity: 0; }
}

/* --- Schilder (Start, Ende) ----------------------------------------- */

.keksfang-schild {
  position: absolute;
  inset: 0;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 0.7rem;
  padding: 1.4rem 1.2rem;
  text-align: center;
  background: rgba(27, 20, 32, 0.86);
  color: var(--color-parchment, #f3e9d8);
  z-index: 3;
}

/* Das hidden-Attribut wird von display:flex ueberstimmt -- ohne diese
   Regel blieben Start- und Endschild dauerhaft ueber dem Spielfeld
   liegen. */
.keksfang-schild[hidden] {
  display: none;
}

.keksfang-schild-text {
  max-width: 22rem;
  margin: 0;
  color: #e9dcc6;
}

.keksfang-start-btn {
  font-size: 1.15rem;
  padding: 0.9rem 2.2rem;
}

.keksfang-ende-text {
  margin: 0;
  font-family: var(--font-heading);
  font-size: clamp(1.15rem, 5vw, 1.5rem);
  color: var(--color-gold-light);
}

.keksfang-ende-detail {
  margin: 0;
  font-size: 0.95rem;
  color: #c3b39c;
}

.keksfang-ende-lob {
  margin: 0 0 0.4rem;
  font-style: italic;
  color: #e9dcc6;
}

/* --- Countdown ------------------------------------------------------ */

.keksfang-countdown {
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  margin: 0;
  font-family: var(--font-heading);
  font-size: clamp(3.5rem, 18vw, 6rem);
  color: var(--color-gold-light);
  text-shadow: 0 0 30px rgba(var(--color-gold-rgb), 0.7);
  background: rgba(27, 20, 32, 0.55);
  z-index: 3;
  pointer-events: none;
}

.keksfang-countdown[hidden] {
  display: none;
}

.keksfang-countdown.is-schlag {
  animation: keksfang-schlag 0.5s ease-out;
}

@keyframes keksfang-schlag {
  from { transform: scale(1.5); opacity: 0.2; }
  to   { transform: scale(1); opacity: 1; }
}

/* --- Pfeilflaechen --------------------------------------------------- */

.keksfang-pfeile {
  display: grid;
  /* minmax(0, 1fr) statt 1fr: So bleiben beide Knoepfe wirklich gleich
     breit und koennen nicht ueber ihre Spalte hinauswachsen. */
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  gap: 0.8rem;
  max-width: 520px;
  margin: 0.9rem auto 0;
}

/* Der Zierrahmen ist eine Grafik, der Pfeil bleibt Text. Beides liegt
   in derselben Rasterzelle uebereinander -- so ist die ganze Flaeche
   des Knopfes klickbar und nichts muss in Pixeln ausgerechnet werden.
   Bewusst grosszuegig: Diese Flaechen sind fuer Kinderhaende gedacht,
   die noch nicht praezise zielen. */
.keksfang-pfeil {
  display: grid;
  place-items: center;
  padding: 0;
  /* Auf dem Handy wird der Rahmen nur noch knapp vierzig Pixel hoch.
     Der Knopf bleibt trotzdem so gross, dass ein Kinderdaumen ihn
     sicher trifft -- der Rahmen sitzt dann mittig darin, und die ganze
     Flaeche loest weiterhin aus. */
  min-height: 56px;
  border: none;
  border-radius: 16px;
  background: none;
  color: #4a2a6a;
  line-height: 1;
  cursor: pointer;
  touch-action: none;
  user-select: none;
  -webkit-user-select: none;
  -webkit-tap-highlight-color: transparent;
  /* Damit sich die Pfeilgroesse nach dem Rahmen richtet und nicht nach
     dem Bildschirm. */
  container-type: inline-size;
  transition: transform 0.2s ease, filter 0.2s ease;
}

.keksfang-pfeil-rahmen,
.keksfang-pfeil-zeichen {
  grid-area: 1 / 1;
  /* Den Zeiger bekommt der Knopf, nicht seine Kinder: Das Spiel haengt
     an pointerdown und pointerup genau auf dem Knopf. */
  pointer-events: none;
}

.keksfang-pfeil-rahmen {
  display: block;
  width: 100%;
  height: auto;
  object-fit: contain;
}

.keksfang-pfeil-zeichen {
  font-size: 1.6rem;
  font-weight: 700;
}

@container (min-width: 1px) {
  .keksfang-pfeil-zeichen { font-size: 15cqw; }
}

/* Dezenter Goldschimmer, nur wo es einen Mauszeiger gibt. */
@media (hover: hover) {
  .keksfang-pfeil:hover {
    transform: translateY(-2px);
    filter: drop-shadow(0 4px 8px rgba(201, 162, 39, 0.45));
  }
}

.keksfang-pfeil:active {
  transform: translateY(1px);
  filter: drop-shadow(0 1px 3px rgba(201, 162, 39, 0.5)) brightness(0.97);
}

.keksfang-pfeil:focus-visible {
  outline: 3px solid var(--color-gold-light);
  outline-offset: 3px;
}

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

@media (prefers-reduced-motion: reduce) {
  .keksfang-ding.is-gefangen,
  .keksfang-ding.is-bonus,
  .keksfang-countdown.is-schlag {
    animation: none;
  }
}

/* --- Spielfeld-Hintergrund: die Zuckersternbäckerei ------------------
   Thematisch richtig: Von dort kommen die Zauberkrümelkekse. Das Bild
   ist bereits weichgezeichnet und abgedunkelt vorgerechnet (siehe
   make-spiel-hintergrund.ps1) -- ein CSS-Weichzeichner auf dieser
   Flaeche wuerde bei jedem Bild neu berechnet und laesst aeltere Handys
   ruckeln, waehrend gleichzeitig ein Dutzend Kekse animiert wird. */
.keksfang-feld {
  background-image:
    radial-gradient(120% 70% at 50% -10%, rgba(var(--color-gold-rgb), 0.18), transparent 60%),
    url("../img/app/spiel-hintergrund.jpg");
  background-size: cover, cover;
  background-position: center, center;
}

/* Die fallenden Dinge bekommen einen Schatten: Der Hintergrund ist
   golden-warm, die Kekse sind es auch -- ohne Abhebung verschwimmen sie
   darin. */
.keksfang-ding {
  filter: drop-shadow(0 3px 6px rgba(0, 0, 0, 0.55));
}

/* ===================================================================
   LUMARIA-PASS (lumaria-pass.html)
   -------------------------------------------------------------------
   Sammelt die Bestwerte aus allen Spielen zu einer Urkunde zum
   Ausdrucken. Die Daten liegen ausschliesslich im Browser des Geraets.
   =================================================================== */

.pass-kopf {
  text-align: center;
}

.pass-name-eingabe {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
  gap: 0.6rem;
  margin-bottom: 1.4rem;
}

.pass-name-eingabe label {
  font-family: var(--font-heading);
  color: var(--color-parchment);
}

.pass-name-eingabe input {
  padding: 0.6rem 1rem;
  min-width: 14rem;
  border: 1px solid rgba(var(--color-gold-rgb), 0.5);
  border-radius: 999px;
  background: rgba(var(--surface-rgb), 0.9);
  color: var(--color-parchment);
  font-family: var(--font-body);
  font-size: 1.05rem;
}

.pass-name-eingabe input:focus-visible {
  outline: 3px solid var(--color-gold-light);
  outline-offset: 2px;
}

/* --- Die Urkunde -----------------------------------------------------
   Die Urkunde ist eine fertige Grafik mit echtem HTML darueber. Die
   Grafik selbst steht als <img> in der Seite: So behaelt sie ihr
   Seitenverhaeltnis unter allen Umstaenden, wird also weder gestreckt
   noch beschnitten. Jede Angabe liegt darueber an der Stelle, die in
   der Vorlage dafuer freigelassen ist -- die Werte in Prozent sind an
   der Grafik nachgemessen (helle Flaechen gegen Dekoration).

   Warum nicht als background-image? Weil ein Hintergrundbild die Hoehe
   des Kastens nicht bestimmt. Der Kasten muesste sie kennen, und jede
   Aenderung an der Vorlage haette dann eine Zahl im Stylesheet falsch
   gemacht. */

.pass-urkunde {
  position: relative;
  width: 100%;
  max-width: 980px;
  margin: 0 auto;
  padding: 0;
  border: none;
  border-radius: 0;
  background: none;
  box-shadow: none;
  /* Schriftgroessen richten sich nach der Breite der Urkunde, nicht
     nach dem Bildschirm: Die Urkunde ist auf einem breiten Monitor
     nicht breiter als 980 px, vw waere dort viel zu gross. */
  container-type: inline-size;
  color: #3b2a52;
}

.pass-vorlage-bild {
  display: block;
  width: 100%;
  height: auto;
}

/* Gemeinsame Grundlage aller aufgesetzten Felder. */
.pass-feld {
  position: absolute;
  margin: 0;
  text-align: center;
}

/* Das Namensfeld der Vorlage (die gepunktete Zeile unter
   "ausgestellt für"). */
.pass-feld--name {
  left: 29%;
  width: 42%;
  top: 25.3%;
  height: 6.4%;
  display: flex;
  align-items: center;
  justify-content: center;
}

/* Die grosse helle Flaeche unter "Deine gespielten Abenteuer". */
.pass-feld--ergebnisse {
  left: 28.2%;
  width: 42.2%;
  top: 42%;
  height: 38%;
  display: flex;
  flex-direction: column;
  overflow-y: auto;
  /* Ein sichtbarer, goldener Balken: Er ist der Hinweis darauf, dass
     unter der letzten sichtbaren Zeile noch etwas steht. */
  scrollbar-width: thin;
  scrollbar-color: rgba(184, 137, 28, 0.6) transparent;
  scrollbar-gutter: stable;
}

.pass-feld--ergebnisse::-webkit-scrollbar {
  width: 6px;
}

.pass-feld--ergebnisse::-webkit-scrollbar-thumb {
  border-radius: 999px;
  background: rgba(184, 137, 28, 0.6);
}

/* Datum und Unterschrift sitzen am unteren Rand der Flaeche, solange
   die Liste kurz ist -- und ruecken nach, sobald sie laenger wird. */
.pass-fuss {
  margin-top: auto;
  padding-top: 0.9em;
}

.pass-urkunde-name {
  font-family: var(--font-heading);
  font-size: 1.3rem;
  font-weight: 700;
  color: #4a2a6a;
  border: none;
  min-width: 0;
  padding: 0;
  /* Ein langer Name soll die Zeile nicht sprengen. */
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  max-width: 100%;
}

.pass-sterne {
  margin: 0 0 0.25em;
  font-size: 1.1rem;
  line-height: 1;
  letter-spacing: 0.18em;
  color: #b8891c;
}

@container (min-width: 1px) {
  .pass-urkunde-name { font-size: 3.4cqw; }
  .pass-sterne { font-size: 2.6cqw; }
}

.pass-stern.is-leer {
  opacity: 0.22;
}

/* Die Ergebnisliste. Keine feste Anzahl Zeilen: Was das Skript
   einhaengt, wird angezeigt -- kommen spaeter weitere Spiele dazu,
   waechst die Liste einfach weiter. */
.pass-liste {
  list-style: none;
  margin: 0;
  padding: 0;
  text-align: left;
}

.pass-eintrag {
  padding: 0.4em 0;
  border-top: 1px solid rgba(184, 137, 28, 0.4);
}

.pass-eintrag:first-child {
  border-top: none;
}

.pass-eintrag-titel {
  margin: 0 0 0.1em;
  font-family: var(--font-heading);
  font-size: 1.05em;
  font-weight: 700;
  color: #6d4a12;
}

.pass-eintrag-runden {
  margin: 0;
  font-size: 0.86em;
  color: #6b5a45;
}

/* Die Bestwerte stehen nebeneinander statt untereinander. Auf der
   Urkunde ist die Hoehe knapp: Drei Stufen als Aufzaehlung waren drei
   Zeilen, nebeneinander ist es meist eine. Das Skript liefert
   unveraendert dieselben Eintraege -- nur ihre Anordnung ist eine
   andere. */
.pass-bestwerte {
  display: flex;
  flex-wrap: wrap;
  gap: 0 0.75em;
  margin: 0.1em 0 0;
  padding: 0;
  list-style: none;
}

.pass-bestwerte li {
  position: relative;
  line-height: 1.45;
  color: #3b2a52;
}

.pass-bestwerte li + li::before {
  content: "·";
  position: absolute;
  left: -0.47em;
  color: #a8925f;
}

.pass-leer {
  margin: 0;
  color: #6b5a45;
}

.pass-leer a {
  color: #6d4a12;
}

.pass-urkunde-datum {
  margin: 0 0 0.1em;
  font-style: italic;
  color: #6b5a45;
}

.pass-urkunde-signatur {
  margin: 0;
  font-family: var(--font-heading);
  color: #6d4a12;
}

/* Schriftgroesse der Ergebnisflaeche: an der Breite der Urkunde, mit
   rem als Rueckfallwert. Alles darin rechnet in em und folgt mit. */
.pass-feld--ergebnisse { font-size: 0.8rem; }
.pass-fuss { font-size: 0.9em; }

@container (min-width: 1px) {
  .pass-feld--ergebnisse { font-size: 1.5cqw; }
}

.pass-aktionen {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
  gap: 0.8rem;
  margin: 1.6rem 0 1.2rem;
}

.pass-hinweis {
  max-width: 34rem;
  margin: 0 auto;
  font-size: 0.9rem;
  text-align: center;
  color: var(--color-parchment-dim);
}

/* --- Schmale Bildschirme ---------------------------------------------
   Die Vorlage ist ein Querformat. Auf einem Handy hochkant waere die
   Schrift in den aufgesetzten Feldern nur noch fuenf Pixel gross --
   lesbar ist das nicht, und die Grafik dafuer zu beschneiden kommt
   nicht in Frage. Deshalb steht die Vorlage hier vollstaendig als Bild
   oben, und die Angaben stehen darunter in lesbarer Groesse. Es geht
   nichts verloren: Es sind dieselben Elemente, nur nicht uebereinander
   gelegt. Gedruckt wird immer die aufgesetzte Fassung -- ein Blatt
   Papier ist breit genug. */
@media (max-width: 619px) {
  .pass-urkunde {
    padding-bottom: 1.2rem;
    border: 2px solid var(--color-gold);
    border-radius: 16px;
    background: rgba(var(--surface-rgb), 0.94);
    overflow: hidden;
  }

  .pass-feld {
    position: static;
    left: auto;
    top: auto;
    width: auto;
    height: auto;
    overflow: visible;
    padding: 0 1.1rem;
  }

  .pass-feld--name {
    margin-top: 1rem;
  }

  .pass-feld--ergebnisse {
    margin-top: 0.9rem;
    font-size: 0.95rem;
  }

  .pass-fuss { margin-top: 1rem; }

  .pass-urkunde-name {
    font-size: 1.4rem;
  }

  .pass-sterne {
    font-size: 1.4rem;
  }
}

/* --- Ausdruck --------------------------------------------------------
   Beim Drucken bleibt NUR die Urkunde stehen: keine Navigation, keine
   Knoepfe, kein Elternhinweis. Ein Kind soll ein Blatt in der Hand
   halten, das aussieht wie eine Urkunde -- nicht wie eine ausgedruckte
   Webseite. */

@media print {
  body.pass-page .page-top-frame,
  body.pass-page .site-footer,
  body.pass-page .pass-kopf,
  body.pass-page .pass-name-eingabe,
  body.pass-page .pass-aktionen,
  body.pass-page .pass-hinweis,
  body.pass-page .loomus-flying-brush {
    display: none !important;
  }

  body.pass-page {
    background: #fff !important;
  }

  /* Das Blatt gehoert der Urkunde: kein Innenabstand, keine Breiten-
     begrenzung der Sektion, sonst bliebe ringsum Papier frei und die
     Schrift auf dem Pergament waere kleiner als noetig. */
  body.pass-page .section {
    padding: 0;
    margin: 0;
    width: 100%;
    max-width: none;
  }

  /* Die Urkunde soll das Blatt fuellen, aber auf eines passen. Sie ist
     1,389-mal so breit wie hoch; das Blatt ist etwas breiter. Deshalb
     bestimmt hier die HOEHE des Blattes die Breite der Urkunde
     (138 vh = 138 % der Blatthoehe), begrenzt durch die Blattbreite.
     Sonst ragt der untere Rand der Vorlage auf ein zweites Blatt. */
  .pass-urkunde {
    width: min(100%, 138vh);
    max-width: none;
    margin: 0 auto;
  }

  /* Die Vorlage soll auf dem Papier genauso aussehen wie am
     Bildschirm -- Browser sparen Hintergrundfarben sonst gern ein. */
  .pass-urkunde,
  .pass-vorlage-bild {
    -webkit-print-color-adjust: exact;
    print-color-adjust: exact;
  }

  /* Auf dem Papier wird nicht gescrollt: Hier stehen alle Ergebnisse
     vollstaendig, nichts wird abgeschnitten. Etwas kleiner als am
     Bildschirm, damit auch viele Eintraege noch auf das Pergament
     passen -- auf Papier liest sich das ohne Muehe. */
  .pass-feld--ergebnisse {
    overflow: visible;
    height: auto;
    max-height: none;
    bottom: auto;
    font-size: 1.15cqw;
  }
}

/* ===================================================================
   SPIELE-ÜBERSICHT (lumaria-zauberspiele.html)
   -------------------------------------------------------------------
   Sammelt alle Spiele auf einer Seite. Frueher stand jedes Spiel
   einzeln im Kids-Club-Menue -- bei einem Dutzend Spielen waere das
   eine Liste laenger als der Bildschirm geworden. Ein Untermenue im
   Untermenue waere die naheliegende Alternative, ist auf dem Handy aber
   kaum bedienbar: Man muesste das zweite Menue treffen, ohne dass das
   erste zuklappt.
   =================================================================== */

.spiele-liste {
  display: grid;
  gap: 1rem;
  max-width: 720px;
  margin: 0 auto;
}

.spiel-kachel {
  display: flex;
  align-items: center;
  gap: 1.1rem;
  padding: 0.9rem;
  border: 1px solid rgba(var(--color-gold-rgb), 0.4);
  border-radius: 20px;
  background: rgba(var(--surface-rgb), var(--surface-alpha));
  text-decoration: none;
  color: var(--color-parchment);
  box-shadow: 0 6px 16px rgba(61, 58, 82, 0.12);
  transition: transform 0.16s ease, border-color 0.16s ease, box-shadow 0.16s ease;
  -webkit-tap-highlight-color: transparent;
}

.spiel-kachel:hover,
.spiel-kachel:focus-visible {
  transform: translateY(-2px);
  border-color: var(--color-gold);
  box-shadow: 0 10px 24px rgba(61, 58, 82, 0.2);
}

.spiel-kachel:focus-visible {
  outline: 3px solid var(--color-gold-light);
  outline-offset: 3px;
}

.spiel-kachel-bild {
  flex-shrink: 0;
  display: block;
  width: 96px;
  height: 96px;
  border-radius: 14px;
  overflow: hidden;
  border: 1px solid rgba(var(--color-gold-rgb), 0.35);
}

.spiel-kachel-bild img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

.spiel-kachel-text {
  display: block;
}

.spiel-kachel-titel {
  display: block;
  font-family: var(--font-heading);
  font-size: 1.15rem;
  line-height: 1.25;
  color: var(--color-gold-light);
}

.spiel-kachel-beschreibung {
  display: block;
  margin-top: 0.25rem;
  font-size: 0.95rem;
  line-height: 1.5;
  color: var(--color-parchment-dim);
}

/* Der Pass ist kein Spiel, sondern das Ergebnis aus allen Spielen --
   deshalb abgesetzt, ohne Bild, mit Stern statt Kachelfoto. */
.spiel-pass-kachel {
  display: flex;
  align-items: center;
  gap: 1.1rem;
  max-width: 720px;
  margin: 0 auto;
  padding: 1.1rem 1.2rem;
  border: 1px dashed rgba(var(--color-gold-rgb), 0.55);
  border-radius: 20px;
  background: rgba(var(--color-gold-rgb), 0.07);
  text-decoration: none;
  color: var(--color-parchment);
  transition: background 0.16s ease, border-color 0.16s ease;
}

.spiel-pass-kachel:hover,
.spiel-pass-kachel:focus-visible {
  border-color: var(--color-gold);
  background: rgba(var(--color-gold-rgb), 0.13);
}

.spiel-pass-kachel:focus-visible {
  outline: 3px solid var(--color-gold-light);
  outline-offset: 3px;
}

.spiel-pass-stern {
  flex-shrink: 0;
  font-size: 2rem;
  line-height: 1;
  color: var(--color-gold);
}

.spiel-pass-text {
  display: block;
}

.spiele-ausblick {
  max-width: 32rem;
  margin: 1.6rem auto 0;
  text-align: center;
  font-style: italic;
  color: var(--color-parchment-dim);
}

/* Ab Tablet zwei Spalten. Bewusst nicht mehr: Die Kacheln tragen
   Beschreibungstext, drei Spalten machten die Zeilen zu schmal. */
@media (min-width: 660px) {
  .spiele-liste {
    grid-template-columns: repeat(2, 1fr);
  }

  .spiel-kachel {
    flex-direction: column;
    align-items: flex-start;
    text-align: left;
  }

  .spiel-kachel-bild {
    width: 100%;
    height: 150px;
  }
}

@media (prefers-reduced-motion: reduce) {
  .spiel-kachel,
  .spiel-pass-kachel {
    transition: none;
  }

  .spiel-kachel:hover,
  .spiel-kachel:focus-visible {
    transform: none;
  }
}

/* ===================================================================
   FINA SUCHT DEN GLITZERKÄFER (lumaria-irrgarten.html)
   -------------------------------------------------------------------
   Das Labyrinth ist ein echtes CSS-Raster: jede Zelle ein eigenes
   Element, Wand oder Weg. Kein Hintergrundbild -- so gibt es nur eine
   Wahrheit darüber, wo eine Wand steht, und Bewegung und Kollision
   können nicht auseinanderlaufen.
   =================================================================== */

.irrgarten-bereich {
  padding-top: 0.5rem;
}

.irrgarten-buehne {
  position: relative;
  max-width: 460px;
  margin: 0 auto;
}

.irrgarten-brett {
  position: relative;
  display: grid;
  aspect-ratio: 1 / 1;
  gap: 0;
  padding: 8px;
  border-radius: 20px;
  border: 1px solid rgba(var(--color-gold-rgb), 0.45);
  /* Waldboden im Dämmerlicht, damit die leuchtenden Figuren wirken */
  /* Waldboden als Untergrund des ganzen Bretts. Bewusst EINMAL ueber
     die volle Flaeche (cover) statt gekachelt: Die Vorlage ist zwar
     nahezu nahtlos (gemessener Kantenunterschied 25 bzw. 21 von 255),
     aber "nahezu" reicht nicht -- beim Kacheln waeren die Uebergaenge
     bei genauem Hinsehen als Raster erkennbar. Einmal gross gezogen
     gibt es gar keine Naht. */
  background-image:
    radial-gradient(120% 80% at 50% 0%, rgba(var(--color-gold-rgb), 0.16), transparent 62%),
    linear-gradient(rgba(26, 20, 38, 0.42), rgba(20, 15, 30, 0.62)),
    url("../img/app/irrgarten-boden.jpg");
  background-size: cover, cover, cover;
  background-position: center, center, center;
  background-color: #241c38;
  box-shadow: inset 0 0 40px rgba(0, 0, 0, 0.35);
  /* Wischen soll die Seite nicht mitscrollen */
  touch-action: none;
  user-select: none;
  -webkit-user-select: none;
}

.irrgarten-zelle {
  display: block;
  border-radius: 3px;
}

/* Wände sind Sträucher: dichtes Grün mit einem Hauch Glanz. Bewusst
   kein hartes Schwarz -- das wirkte wie ein Computerlabyrinth, nicht
   wie ein Wald. */
.irrgarten-zelle.ist-wand {
  /* Dunkler Grund UNTER dem Strauch: Das Strauchbild ist rund, die
     Zelle eckig. Ohne diesen Grund klafften zwischen benachbarten
     Straeuchern helle Zwickel, die Hecke saehe loechrig aus. */
  background-color: #23401f;
  background-image: url("../img/app/irrgarten-strauch.png");
  /* Etwas groesser als die Zelle, damit sich die runden Straeucher an
     den Raendern ueberlappen und eine durchgehende Hecke bilden. */
  background-size: 122% 122%;
  background-position: center;
  background-repeat: no-repeat;
  box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.5);
}

/* Acht Varianten: ZWEI verschiedene Straeucher, jeder in vier
   Spiegelungen. Welche Zelle welche bekommt, entscheidet das Skript
   aus ihrer Position -- also immer gleich und nicht bei jedem
   Neuaufbau anders. So wirkt die Hecke gewachsen statt gestempelt. */
.irrgarten-zelle.ist-wand.variante-4,
.irrgarten-zelle.ist-wand.variante-5,
.irrgarten-zelle.ist-wand.variante-6,
.irrgarten-zelle.ist-wand.variante-7 {
  background-image: url("../img/app/irrgarten-strauch-2.png");
}

.irrgarten-zelle.ist-wand.variante-1,
.irrgarten-zelle.ist-wand.variante-5 { transform: scaleX(-1); }
.irrgarten-zelle.ist-wand.variante-2,
.irrgarten-zelle.ist-wand.variante-6 { transform: scaleY(-1); }
.irrgarten-zelle.ist-wand.variante-3,
.irrgarten-zelle.ist-wand.variante-7 { transform: scale(-1, -1); }

/* Wege bekommen KEINE eigene Farbe mehr -- hier soll der Waldboden
   des Bretts durchscheinen. */
.irrgarten-zelle.ist-weg {
  background: transparent;
}

/* Erfolg: das ganze Brett funkelt kurz auf. */
.irrgarten-brett.is-gefunden {
  animation: irrgarten-funkeln 1s ease-out;
}

@keyframes irrgarten-funkeln {
  0%   { box-shadow: inset 0 0 40px rgba(0, 0, 0, 0.3); }
  35%  { box-shadow: inset 0 0 90px rgba(255, 226, 150, 0.85), 0 0 40px rgba(255, 226, 150, 0.6); }
  100% { box-shadow: inset 0 0 40px rgba(0, 0, 0, 0.3); }
}

/* --- Schilder (Start, Ende) ------------------------------------------ */

.irrgarten-schild {
  position: absolute;
  inset: 0;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 0.8rem;
  padding: 1.6rem 1.3rem;
  text-align: center;
  border-radius: 20px;
  background: rgba(27, 20, 32, 0.88);
  color: #f3e9d8;
  z-index: 3;
}

/* Das hidden-Attribut wird von display:flex überstimmt -- ohne diese
   Regel bliebe das Endschild dauerhaft über dem Labyrinth liegen. */
.irrgarten-schild[hidden] {
  display: none;
}

.irrgarten-schild-text {
  max-width: 20rem;
  margin: 0;
  font-size: 1.05rem;
  line-height: 1.55;
}

.irrgarten-start-btn {
  font-size: 1.1rem;
  padding: 0.85rem 2rem;
}

.irrgarten-jubel {
  font-size: 2.4rem;
  line-height: 1;
}

.irrgarten-ende-text {
  margin: 0;
  font-family: var(--font-heading);
  font-size: clamp(1.05rem, 4.5vw, 1.35rem);
  color: var(--color-gold-light);
}

.irrgarten-ende-detail {
  margin: 0 0 0.4rem;
  font-size: 0.95rem;
  color: #c3b39c;
}

/* --- Steuerkreuz ------------------------------------------------------
   Drei Spalten, zwei Zeilen: oben mittig der Pfeil nach oben, darunter
   links, unten, rechts. Große Flächen für Kinderhände. */

.irrgarten-steuerkreuz {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 0.6rem;
  max-width: 280px;
  margin: 1.2rem auto 0;
}

/* Der Zierrahmen ist eine Grafik, der Pfeil bleibt Text. Beides liegt
   in derselben Rasterzelle uebereinander -- so ist die ganze Flaeche
   des Knopfes anklickbar und nichts muss in Pixeln ausgerechnet
   werden. */
.irrgarten-pfeil {
  display: grid;
  place-items: center;
  /* Damit ein Kinderdaumen sicher trifft, auch wenn der Rahmen im
     Steuerkreuz nur gut sechzig Pixel hoch wird. */
  min-height: 56px;
  padding: 0;
  border: none;
  border-radius: 14px;
  background: none;
  color: #4a2a6a;
  line-height: 1;
  cursor: pointer;
  touch-action: manipulation;
  -webkit-tap-highlight-color: transparent;
  container-type: inline-size;
  transition: transform 0.2s ease, filter 0.2s ease;
}

.irrgarten-pfeil-rahmen,
.irrgarten-pfeil-zeichen {
  grid-area: 1 / 1;
  /* Ausgeloest wird der Knopf selbst, nicht seine Kinder. */
  pointer-events: none;
}

.irrgarten-pfeil-rahmen {
  display: block;
  width: 100%;
  height: auto;
  object-fit: contain;
}

.irrgarten-pfeil-zeichen {
  font-size: 1.4rem;
  font-weight: 700;
}

@container (min-width: 1px) {
  .irrgarten-pfeil-zeichen { font-size: 32cqw; }
}

@media (hover: hover) {
  .irrgarten-pfeil:hover {
    transform: translateY(-2px);
    filter: drop-shadow(0 4px 8px rgba(201, 162, 39, 0.45));
  }
}

.irrgarten-pfeil:active {
  transform: translateY(1px);
  filter: drop-shadow(0 1px 3px rgba(201, 162, 39, 0.5)) brightness(0.97);
}

.irrgarten-pfeil:focus-visible {
  outline: 3px solid var(--color-gold-light);
  outline-offset: 3px;
}

.irrgarten-pfeil--oben   { grid-column: 2; grid-row: 1; }
.irrgarten-pfeil--links  { grid-column: 1; grid-row: 2; }
.irrgarten-pfeil--unten  { grid-column: 2; grid-row: 2; }
.irrgarten-pfeil--rechts { grid-column: 3; grid-row: 2; }

/* Noch nicht fertige Schwierigkeitsstufe: sichtbar, aber gedämpft und
   nicht anklickbar. So sieht man, dass etwas kommt, ohne ins Leere zu
   tippen. */
.memory-stufe-btn.is-bald {
  opacity: 0.5;
  cursor: default;
  border-style: dashed;
}

.memory-stufe-btn.is-bald:hover {
  border-color: rgba(var(--color-gold-rgb), 0.45);
  transform: none;
}

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

  .irrgarten-pfeil,
  .irrgarten-figur,
  .irrgarten-kaefer,
  .irrgarten-fina.is-blockiert,
  .irrgarten-brett.is-gefunden {
    transition: none;
    animation: none;
  }
}

/* Songtitel als Text statt als Grafik.
   Die älteren Karten tragen ihren Titel als Bild
   (lumaria-song-title2-*.png). Für die beiden neuen Lieder gibt es
   solche Grafiken noch nicht -- statt einen Platzhalter hinzustellen,
   steht der Titel hier als echter Text. Das ist auch der bessere
   Zustand: Text ist auf jedem Bildschirm scharf, lässt sich vorlesen
   und findet sich in der Suche wieder. Die Maße entsprechen den
   Titelbildern, damit die Karten gleich hoch bleiben. */
.lumaria-song-title-text {
  display: block;
  width: 100%;
  max-width: 330px;
  margin: 0.5rem auto;
  text-align: center;
}

.lumaria-song-title-name {
  display: block;
  font-family: var(--font-heading);
  font-size: 1.35rem;
  line-height: 1.25;
  color: var(--color-gold-light);
}

.lumaria-song-title-sub {
  display: block;
  margin-top: 0.35rem;
  font-size: 0.95rem;
  line-height: 1.5;
  color: var(--color-parchment-dim);
}

/* ===================================================================
   IRRGARTEN: FIGUREN UND LICHTFUNKEN
   -------------------------------------------------------------------
   DER FEHLER, DER FINA HOELZERN MACHTE: Die Figuren lagen vorher im
   Raster und wurden ueber grid-column / grid-row versetzt -- mit einer
   transition darauf. Diese beiden Eigenschaften lassen sich aber gar
   nicht weich ueberblenden, die Angabe war wirkungslos. Fina SPRANG
   also von Feld zu Feld.

   Jetzt liegen Figuren und Funken in einer eigenen Ebene ueber dem
   Raster und werden ueber left/top in Prozent gesetzt. Diese laufen
   weich -- daher gleitet Fina jetzt.
   =================================================================== */

.irrgarten-ebene {
  position: absolute;
  /* Deckt genau die Rasterflaeche ab: Das Brett hat 8px Innenabstand,
     die Ebene beginnt also 8px innerhalb. Dadurch entsprechen Prozente
     hier exakt den Rasterfeldern. */
  inset: 8px;
  pointer-events: none;
  z-index: 2;
}

.irrgarten-figur {
  position: absolute;
  display: block;
  /* Weich gleiten statt springen. Kurz genug, dass schnelles Tippen
     nicht ins Stocken geraet, lang genug, dass man die Bewegung sieht. */
  transition: left 0.16s ease-out, top 0.16s ease-out;
}

.irrgarten-figur img {
  width: 100%;
  height: 100%;
  object-fit: contain;
  display: block;
}

/* Fina schaut in ihre Laufrichtung. Die Spiegelung sitzt auf dem
   aeusseren Element, das Wippen auf dem Bild -- so kommen sich die
   beiden Bewegungen nicht in die Quere. */
.irrgarten-fina.blickt-links img {
  transform: scaleX(-1);
}

.irrgarten-fina img {
  /* Etwas groesser als das Feld, damit sie nicht verloren wirkt. Der
     Ueberstand liegt ueber den Nachbarfeldern und stoert nicht, weil
     die Ebene keine Klicks abfaengt. */
  transform-origin: center bottom;
  filter: drop-shadow(0 3px 6px rgba(0, 0, 0, 0.55));
  animation: irrgarten-fina-atmen 2.6s ease-in-out infinite;
}

/* Ruhiges Auf und Ab, wenn Fina steht. Winzig gehalten -- eine Figur,
   die staendig huepft, wirkt zappelig statt lebendig. */
@keyframes irrgarten-fina-atmen {
  0%, 100% { translate: 0 0; scale: 1 1; }
  50%      { translate: 0 -3%; scale: 1.01 0.99; }
}

/* Ein Huepfer bei jedem Schritt. Ueberlagert das Atmen kurz. */
.irrgarten-figur.is-schritt img {
  animation: irrgarten-schritt 0.22s ease-out;
}

@keyframes irrgarten-schritt {
  0%   { translate: 0 0;    scale: 1 1; }
  40%  { translate: 0 -14%; scale: 0.94 1.08; }
  100% { translate: 0 0;    scale: 1 1; }
}

/* Gegen eine Hecke gelaufen: kurzes Anstupsen, kein Fehlerton. */
.irrgarten-figur.is-blockiert img {
  animation: irrgarten-stups 0.26s ease;
}

@keyframes irrgarten-stups {
  0%, 100% { translate: 0 0; }
  30%      { translate: -8% 0; }
  70%      { translate: 6% 0; }
}

/* Der Glitzerkaefer schwebt und flackert -- auch wenn er sitzen
   bleibt, wirkt er dadurch lebendig. Beim Wandern gleitet er wie Fina. */
.irrgarten-kaefer img {
  animation: irrgarten-kaefer-schweben 2.2s ease-in-out infinite;
  filter: drop-shadow(0 0 10px rgba(216, 180, 250, 0.9));
}

@keyframes irrgarten-kaefer-schweben {
  0%, 100% { translate: 0 0;    filter: drop-shadow(0 0 8px rgba(216, 180, 250, 0.7)); }
  50%      { translate: 0 -12%; filter: drop-shadow(0 0 20px rgba(255, 225, 150, 1)); }
}

/* --- Lichtfunken auf den Wegen -------------------------------------- */

.irrgarten-funke {
  position: absolute;
  display: flex;
  align-items: center;
  justify-content: center;
  pointer-events: none;
}

.irrgarten-funke::before {
  content: "";
  width: 26%;
  aspect-ratio: 1 / 1;
  border-radius: 50%;
  background: radial-gradient(circle, #fff6d0 0%, #ffd76a 45%, rgba(255, 200, 80, 0) 72%);
  box-shadow: 0 0 8px rgba(255, 214, 120, 0.85);
  animation: irrgarten-funke-glimmen 1.8s ease-in-out infinite;
}

@keyframes irrgarten-funke-glimmen {
  0%, 100% { opacity: 0.65; scale: 0.85; }
  50%      { opacity: 1;    scale: 1.1; }
}

/* Eingesammelt: kurz aufblitzen und verschwinden. */
.irrgarten-funke.is-weg::before {
  animation: irrgarten-funke-weg 0.32s ease-out forwards;
}

@keyframes irrgarten-funke-weg {
  0%   { opacity: 1; scale: 1; }
  100% { opacity: 0; scale: 2.4; }
}

@media (prefers-reduced-motion: reduce) {
  .irrgarten-figur,
  .irrgarten-figur img,
  .irrgarten-funke::before {
    transition: none;
    animation: none;
  }
}

/* --- Mehr Leben im Keksfang -----------------------------------------
   Die Mondtorte ist Meister Zimtsterns Meisterstueck: selten, fuenf
   Punkte wert -- und deshalb auch groesser und mit eigenem Schimmer,
   damit ein Kind sie sofort von einem Keks unterscheidet. */

.keksfang-ding--mondtorte {
  width: 23%;
  filter: drop-shadow(0 0 12px rgba(255, 214, 140, 0.9)) drop-shadow(0 3px 6px rgba(0, 0, 0, 0.5));
  animation: keksfang-torte-glanz 1.6s ease-in-out infinite;
}

@keyframes keksfang-torte-glanz {
  0%, 100% { filter: drop-shadow(0 0 10px rgba(255, 214, 140, 0.7)) drop-shadow(0 3px 6px rgba(0, 0, 0, 0.5)); }
  50%      { filter: drop-shadow(0 0 22px rgba(255, 236, 170, 1))  drop-shadow(0 3px 6px rgba(0, 0, 0, 0.5)); }
}

.keksfang-ding--sternenbrot {
  width: 19%;
}

/* Die schwebende Punktzahl beim Fangen. Sie steigt auf und blendet aus
   -- so sieht man, WAS ein Stueck wert war, statt nur die Zahl oben
   schneller hochzaehlen zu sehen. */
.keksfang-punktezahl {
  position: absolute;
  transform: translate(-50%, -50%);
  font-family: var(--font-heading);
  font-size: clamp(1.1rem, 5vw, 1.6rem);
  color: #ffe9a8;
  text-shadow: 0 0 10px rgba(255, 200, 90, 0.9), 0 2px 4px rgba(0, 0, 0, 0.6);
  pointer-events: none;
  z-index: 4;
  animation: keksfang-punkte-auf 0.9s ease-out forwards;
}

@keyframes keksfang-punkte-auf {
  0%   { opacity: 0;   translate: 0 0;     scale: 0.6; }
  25%  { opacity: 1;   translate: 0 -18%;  scale: 1.15; }
  100% { opacity: 0;   translate: 0 -80%;  scale: 1; }
}

/* Kraeftigerer Treffer: aufblitzen statt nur verschwinden. */
.keksfang-ding.is-gefangen,
.keksfang-ding.is-bonus {
  animation: keksfang-treffer 0.34s ease-out forwards;
}

@keyframes keksfang-treffer {
  0%   { transform: translateX(-50%) scale(1);   opacity: 1;   filter: brightness(1); }
  30%  { transform: translateX(-50%) scale(1.35); opacity: 1;  filter: brightness(2.2); }
  100% { transform: translateX(-50%) scale(2);   opacity: 0;   filter: brightness(1.4); }
}

@media (prefers-reduced-motion: reduce) {
  .keksfang-ding--mondtorte,
  .keksfang-punktezahl {
    animation: none;
  }

  .keksfang-punktezahl {
    opacity: 1;
  }
}

/* --- Ton-Schalter -----------------------------------------------------
   Steht in der Anzeigeleiste jedes Spiels. Bewusst gut sichtbar und
   beschriftet statt nur als Symbol: Kinderspiele werden oft gespielt,
   während jemand daneben sitzt -- wer den Ton abstellen will, soll ihn
   auf Anhieb finden. Die Einstellung merkt sich das Gerät. */

.lumaria-ton-schalter {
  padding: 0.45rem 1rem;
  border: 1px solid rgba(var(--color-gold-rgb), 0.5);
  border-radius: 999px;
  background: rgba(var(--surface-rgb), var(--surface-alpha));
  color: var(--color-parchment);
  font-family: var(--font-heading);
  font-size: 0.92rem;
  cursor: pointer;
  white-space: nowrap;
  transition: background 0.2s ease, border-color 0.2s ease, opacity 0.2s ease;
}

.lumaria-ton-schalter:hover {
  border-color: var(--color-gold);
  background: rgba(var(--color-gold-rgb), 0.14);
}

.lumaria-ton-schalter:focus-visible {
  outline: 3px solid var(--color-gold-light);
  outline-offset: 3px;
}

.lumaria-ton-schalter.ist-aus {
  opacity: 0.62;
  border-style: dashed;
}


/* --- Die Lichtmotte auf der Gratis-Schatztruhe ------------------------
   Sie soll ueber die Seite fliegen, nicht an einer Stelle schweben.
   Umgesetzt rein im Stylesheet, ohne eigenes Skript: Die Bahn ist eine
   Folge von Wegpunkten, dazwischen wird weich ueberblendet.

   WARUM SIE SICH DABEI SPIEGELT: Eine Motte, die rueckwaerts fliegt,
   faellt sofort auf. An den Wendepunkten kippt deshalb scaleX -- immer
   genau dann, wenn die Bahn die Richtung wechselt, sonst saehe man sie
   mitten im Flug umschlagen.

   position:fixed statt absolute: So bleibt sie beim Scrollen im
   Sichtfeld und begleitet die Besucherin ueber die ganze Seite. */
.schatztruhe-motte {
  position: fixed;
  top: 0;
  left: 0;
  z-index: 12;
  width: 46px;
  pointer-events: none;
  animation: schatztruhe-motte-bahn 34s ease-in-out infinite;
}

.schatztruhe-motte-img {
  display: block;
  width: 100%;
  height: auto;
}

/* Die Bahn haelt sich jetzt in der Mitte auf -- dort, wo die Truhe
   steht und wo der Zauberschluessel eingegeben wird. Vorher zog sie
   ueber die ganze Fensterbreite und war die meiste Zeit irgendwo am
   Rand unterwegs, waehrend das Kind auf die Truhe schaut. */
@keyframes schatztruhe-motte-bahn {
  0%   { transform: translate(34vw, 24vh) scaleX(1); }
  14%  { transform: translate(47vw, 15vh) scaleX(1); }
  28%  { transform: translate(62vw, 22vh) scaleX(1); }
  42%  { transform: translate(70vw, 39vh) scaleX(1); }
  50%  { transform: translate(64vw, 52vh) scaleX(-1); }
  64%  { transform: translate(50vw, 62vh) scaleX(-1); }
  78%  { transform: translate(34vw, 52vh) scaleX(-1); }
  90%  { transform: translate(28vw, 36vh) scaleX(-1); }
  100% { transform: translate(34vw, 24vh) scaleX(1); }
}

/* Auf schmalen Bildschirmen ist der Platz knapp und sie wuerde staendig
   ueber dem Text stehen. Dort bleibt sie kleiner und haelt sich am
   oberen Rand. */
@media (max-width: 700px) {
  .schatztruhe-motte {
    width: 34px;
  }
}

@media (prefers-reduced-motion: reduce) {
  .schatztruhe-motte {
    animation: none;
    transform: translate(66vw, 26vh);
  }
}

/* =====================================================================
   LUMARIAS ZAUBERSPIELE -- Schriftbild, Pass-Kachel, Hintergrund
   ===================================================================== */

/* Die Ueberschrift als Grafik. Sie traegt Titel UND beide Unterzeilen,
   deshalb darf sie breiter sein als eine reine Titelzeile -- sonst
   waeren "Entdecken. Spielen. Staunen." und "Kleine Spiele - grosse
   Abenteuer!" nicht mehr zu entziffern. */
.zauberspiele-heading-img {
  display: block;
  width: 100%;
  max-width: 760px;
  height: auto;
  margin: 0.2rem auto 1.2rem;
}

@media (max-width: 640px) {
  .zauberspiele-heading-img {
    max-width: 96%;
  }
}

/* Die Pass-Kachel als Grafik. Rahmen, Hintergrund und Innenabstand der
   Textfassung fallen weg -- das Bild bringt seinen eigenen Rahmen mit,
   ein zweiter darum herum saehe aus wie ein Kasten im Kasten.
   Der Fokusrahmen bleibt: Er ist keine Zierde, sondern zeigt beim
   Bedienen mit der Tastatur, wo man gerade ist. */
.spiel-pass-kachel--bild {
  display: block;
  max-width: 760px;
  margin: 0 auto;
  padding: 0;
  border: none;
  background: none;
  border-radius: 18px;
  transition: transform 0.18s ease, filter 0.18s ease;
}

.spiel-pass-kachel--bild:hover,
.spiel-pass-kachel--bild:focus-visible {
  border: none;
  background: none;
  transform: translateY(-2px);
  filter: drop-shadow(0 6px 16px rgba(0, 0, 0, 0.22));
}

.spiel-pass-bild {
  display: block;
  width: 100%;
  height: auto;
}

@media (prefers-reduced-motion: reduce) {
  .spiel-pass-kachel--bild:hover,
  .spiel-pass-kachel--bild:focus-visible {
    transform: none;
  }
}

/* --- Seitenhintergrund ------------------------------------------------
   Er liegt auf <main>, NICHT auf <body>: Martina wollte ihn erst ab dem
   Erzaehlbereich, die Kopfleiste mit Logo und Navigation soll frei
   bleiben. Genau die stehen ausserhalb von <main>.

   background-attachment:fixed laesst das Bild beim Scrollen stehen, statt
   mitzuwandern -- sonst wuerde sich die Waldszene bei einer langen Seite
   mehrfach wiederholen oder weit nach unten gezogen.
   Darueber liegt ein heller Schleier: Ohne ihn stuende der dunkle Text
   auf einem gemusterten Grund und waere schwer zu lesen. */
body.zauberspiel-page main,
body.pass-page main {
  position: relative;
  background-image: url("../img/zauberspiele-hintergrund.jpg?v=1");
  background-size: cover;
  background-position: center top;
  background-attachment: fixed;
  background-repeat: no-repeat;
}

body.zauberspiel-page main::before,
body.pass-page main::before {
  content: "";
  position: absolute;
  inset: 0;
  background: rgba(253, 250, 244, 0.72);
  pointer-events: none;
  z-index: 0;
}

body.zauberspiel-page main > *,
body.pass-page main > * {
  position: relative;
  z-index: 1;
}

/* Auf dem Handy ist background-attachment:fixed unzuverlaessig -- viele
   Browser ignorieren es oder ruckeln beim Scrollen. Dort scrollt das
   Bild deshalb bewusst mit. */
@media (max-width: 900px) {
  body.zauberspiel-page main,
  body.pass-page main {
    background-attachment: scroll;
  }
}

/* --- Spielekacheln als fertige Grafiken --------------------------------
   Die vier Kacheln sind jetzt vollstaendige Bilder: Titel, Beschreibung
   und der Knopf "Jetzt spielen" stecken darin. Alles, was die frueheren
   Textkacheln drumherum gebaut haben -- Rahmen, Innenabstand,
   Hintergrundflaeche, Zeilenanordnung -- muss deshalb weg. Sonst laege
   ein zweiter Rahmen um einen Rahmen und ein Kasten hinter einem Bild,
   das seinen eigenen Grund schon mitbringt.

   Der Link bleibt derselbe: gleiches Ziel, gleiche Bedienung mit der
   Tastatur, gleicher Fokusrahmen. Geaendert wird ausschliesslich das
   Aussehen. */

/* Auf dem Bildschirm zwei nebeneinander, darunter untereinander.
   minmax(0, 1fr) statt 1fr: Sonst koennte ein breites Bild die Spalte
   aufblaehen, statt sich ihr anzupassen. */
@media (min-width: 720px) {
  .spiele-liste {
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 1.4rem;
    max-width: 1040px;
  }
}

.spiel-kachel:has(.spiel-kachel-bild-voll) {
  display: block;
  padding: 0;
  border: none;
  background: none;
  border-radius: 22px;
  overflow: visible;
  transition: transform 0.25s ease, filter 0.25s ease;
}

.spiel-kachel:has(.spiel-kachel-bild-voll):hover,
.spiel-kachel:has(.spiel-kachel-bild-voll):focus-visible {
  border: none;
  background: none;
  transform: translateY(-4px);
  /* Zwei Schatten uebereinander: ein warmer goldener und ein kuehler
     lavendelfarbener. Einer allein wirkt entweder zu gelb oder zu kalt
     -- zusammen ergeben sie das Leuchten, das zu diesen Kacheln passt. */
  filter:
    drop-shadow(0 8px 18px rgba(201, 162, 39, 0.34))
    drop-shadow(0 2px 10px rgba(150, 120, 200, 0.30));
}

.spiel-kachel-bild-voll {
  display: block;
  width: 100%;
  height: auto;
  /* Keine feste Hoehe und kein Beschneiden: Die Grafik ist das fertige
     Design und muss vollstaendig zu sehen sein. */
  object-fit: contain;
  border-radius: 18px;
}

@media (prefers-reduced-motion: reduce) {
  .spiel-kachel:has(.spiel-kachel-bild-voll),
  .spiel-kachel:has(.spiel-kachel-bild-voll):hover,
  .spiel-kachel:has(.spiel-kachel-bild-voll):focus-visible {
    transform: none;
    transition: none;
  }
}

/* Ueberschriften-Schriftbild auf den Spielseiten. Bewusst eine eigene
   Klasse statt der Zauberspiele-Regel: Diese Banner tragen nur den
   Titel, keine Unterzeilen, und duerfen deshalb schmaler bleiben. */
.spielseite-heading-img {
  display: block;
  width: 100%;
  max-width: 620px;
  height: auto;
  margin: 0.2rem auto 1rem;
}

/* Ueberschrift als Grafik auf gewoehnlichen Seiten. Anders als
   .bewohner-hero-heading-img ohne weiche Maske an den Raendern: Diese
   Schriftzuege laufen von sich aus aus, eine Maske wuerde ihnen die
   Laternen an den Enden abschneiden. */
.seiten-heading-img {
  display: block;
  width: 100%;
  max-width: 640px;
  height: auto;
  object-fit: contain;
  margin: 0.2rem auto 1.2rem;
}

@media (max-width: 640px) {
  .seiten-heading-img {
    max-width: 94%;
  }
}

/* Literacy: Der Bereich entsteht noch. Bis dahin steht hier nur der
   Hinweis -- mittig und in angenehmer Lesebreite.

   Dazu die Spur des kleinen Drachen: umgekipptes Tintenfass unten links
   und Pfotenabdruecke quer ueber die Seite. Die Spur liegt in einer
   eigenen Ebene UNTER dem Text (z-index 0 gegen 1) und nimmt keine
   Zeigerereignisse an -- der Hinweis bleibt bequem lesbar und
   markierbar. */
.literacy-main {
  position: relative;
  /* Damit das schraeg liegende Tintenfass am Rand keinen waagerechten
     Rollbalken ausloest. */
  overflow: hidden;
}

.literacy-spur {
  position: absolute;
  inset: 0;
  z-index: 0;
  pointer-events: none;
}

.literacy-main > .section {
  position: relative;
  z-index: 1;
}

.literacy-tintenfass {
  position: absolute;
  left: 3%;
  bottom: 7%;
  width: clamp(104px, 12vw, 176px);
  height: auto;
  transform: rotate(-6deg);
  filter: drop-shadow(0 8px 16px rgba(90, 40, 120, 0.22));
}

/* Ein Abdruck nach dem anderen: --nr ist die Nummer in der Spur, daraus
   wird die Verzoegerung. Nummer 0 ist sofort da, danach alle zwei
   Sekunden einer mehr. Sie bleiben stehen (forwards) -- er tapst ja
   nicht wieder zurueck. */
.literacy-tapse {
  position: absolute;
  left: var(--x);
  top: var(--y);
  width: clamp(30px, 3.6vw, 52px);
  height: auto;
  opacity: 0;
  transform: rotate(var(--dreh)) scale(0.72);
  animation: literacy-tapse-auf 0.65s cubic-bezier(0.22, 1, 0.36, 1) forwards;
  animation-delay: calc(var(--nr) * 2s);
}

@keyframes literacy-tapse-auf {
  from { opacity: 0;    transform: rotate(var(--dreh)) scale(0.72); }
  to   { opacity: 0.52; transform: rotate(var(--dreh)) scale(1); }
}

/* Wer Bewegung reduziert haben moechte, sieht die Spur einfach fertig. */
@media (prefers-reduced-motion: reduce) {
  .literacy-tapse {
    animation: none;
    opacity: 0.52;
    transform: rotate(var(--dreh)) scale(1);
  }
}

.literacy-baustelle {
  max-width: 44rem;
  margin: 0 auto;
  text-align: center;
}

.literacy-baustelle p {
  margin: 0 0 1rem;
}

.literacy-baustelle p:last-child {
  margin-bottom: 0;
}

@media (max-width: 640px) {
  .spielseite-heading-img {
    max-width: 94%;
  }
}

/* =====================================================================
   MEMORY -- Bedienleisten als Grafik
   =====================================================================
   Die beiden Leisten sind fertige Grafiken. Alles Funktionale liegt als
   echtes HTML darueber: die drei Schwierigkeitsknoepfe, die drei
   Zahlenwerte, "Neu mischen" und der Tonschalter. In den Grafiken steht
   keine einzige Zahl und keine Beschriftung eines Knopfes.

   WIE DIE LAGE BESTIMMT WIRD: Jede Schaltflaeche bekommt ueber
   --feld-links und --feld-breite ihre Position in PROZENT der
   Leistenbreite. Die Werte sind an der Grafik nachgemessen -- die
   goldenen Umrandungen der vorgesehenen Flaechen wurden dafuer
   ausgewertet. Prozent statt Pixel, weil die Leiste mit der Seite
   waechst und schrumpft; feste Pixelwerte saessen nur bei genau einer
   Bildschirmbreite richtig.

   Die senkrechte Lage ist bei beiden Leisten gleich aufgebaut und steht
   ebenfalls in Prozent -- diesmal der Leistenhoehe. */

.memory-leiste {
  position: relative;
  /* Die Leisten tragen zusaetzlich .memory-stufen bzw. .memory-anzeige.
     Deren Rahmen, Polster und Flex-Anordnung braucht die Grafik-Fassung
     nicht -- sie kommen erst auf schmalen Bildschirmen zum Zug, wo die
     Grafik durch die schlichte Fassung ersetzt wird. */
  display: block;
  padding: 0;
  border: none;
  background: none;
  width: 100%;
  max-width: 860px;
  margin: 0 auto 1.2rem;
  /* Damit sich die Schriftgroessen an der Leistenbreite ausrichten
     koennen und nicht am Bildschirm: Bei schmaler Leiste auf breitem
     Bildschirm waere vw sonst viel zu gross. */
  container-type: inline-size;
}

.memory-leiste-bild {
  display: block;
  width: 100%;
  height: auto;
}

/* Gemeinsame Lage aller Schaltflaechen auf einer Leiste. */
.memory-leiste-feld {
  position: absolute;
  left: var(--feld-links);
  width: var(--feld-breite);
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 0.15em;
  margin: 0;
  padding: 0;
  border: none;
  background: none;
  color: var(--color-plum, #4a2a6a);
  font-family: var(--font-heading);
  text-align: center;
  line-height: 1.1;
  cursor: pointer;
  border-radius: 999px;
  /* Etwas Luft zum Rand der Flaeche, damit lange Beschriftungen ihn
     nicht beruehren. */
  padding-inline: 0.35em;
  transition: transform 0.16s ease, filter 0.16s ease;
}

/* Senkrechte Lage, an den zugeschnittenen Grafiken nachgemessen: Die
   goldene Umrandung der Knopfflaechen laeuft dort oben und unten
   entlang. */
.memory-leiste--stufen .memory-leiste-feld {
  top: 34.4%;
  height: 40.0%;
}

.memory-leiste--anzeige .memory-leiste-feld {
  top: 35.7%;
  height: 38.2%;
}

/* Die Keksfang-Leisten sind eigene Grafiken mit etwas anderen
   Seitenverhaeltnissen. Gleiches Bauprinzip, eigene Messwerte:
   Stufenleiste Flaechen y 31,7 %..74,3 %, Anzeigeleiste y 38,1 %..71,4 %. */
.memory-leiste--keksfang-stufen .memory-leiste-feld {
  top: 33.6%;
  height: 38.3%;
}

.memory-leiste--keksfang-anzeige .memory-leiste-feld,
.memory-leiste--keksfang-anzeige .memory-leiste-wert {
  top: 39.5%;
  height: 30.5%;
}

/* "Zauberhaft schwer" ist zwei Zeichen laenger als die laengste
   Beschriftung im Memory und braucht deshalb eine Spur weniger. */
@container (min-width: 1px) {
  .memory-leiste--keksfang-stufen .memory-stufe-name { font-size: 1.8cqw; }
  .memory-leiste--keksfang-stufen .memory-stufe-info { font-size: 1.35cqw; }
}

/* Und die Leisten von "Fina sucht den Glitzerkäfer". Gemessen:
   Stufenleiste Knopfflaechen y 35,2 %..74,0 %, Anzeigeleiste
   y 36,5 %..74,0 %. */
.memory-leiste--irrgarten-stufen .memory-leiste-feld,
.memory-leiste--irrgarten-stufen .memory-leiste-beschriftung {
  top: 36%;
  height: 37%;
}

.memory-leiste--irrgarten-anzeige .memory-leiste-feld,
.memory-leiste--irrgarten-anzeige .memory-leiste-wert {
  top: 37%;
  height: 36%;
}

/* "Wie schwer?" ist in dieser Grafik nicht eingezeichnet -- links ist
   dafuer Platz gelassen. Es ist deshalb echter Text, kein Bild: kein
   Knopf, also auch kein Zeigefinger und kein Anheben beim Ueberfahren. */
.memory-leiste-beschriftung {
  position: absolute;
  left: var(--feld-links);
  width: var(--feld-breite);
  display: flex;
  align-items: center;
  justify-content: center;
  margin: 0;
  padding-inline: 0.2em;
  font-family: var(--font-heading);
  color: #4a2a6a;
  text-align: center;
  line-height: 1.1;
  font-size: 1rem;
}

@container (min-width: 1px) {
  .memory-leiste-beschriftung { font-size: 2.5cqw; }
  /* "größer, Käfer wandert" ist die laengste Zusatzzeile. */
  .memory-leiste--irrgarten-stufen .memory-stufe-info { font-size: 1.3cqw; }
}

/* Und die Leisten vom Lumaria-Puzzle. Bei diesen beiden Grafiken sitzen
   die Flaechen tiefer, weil oben die Krone Platz braucht: gemessen
   y 48,0 %..79,7 % bzw. y 48,7 %..76,5 %. */
.memory-leiste--puzzle-stufen .memory-leiste-feld,
.memory-leiste--puzzle-stufen .memory-leiste-beschriftung {
  top: 48.5%;
  height: 30.5%;
}

.memory-leiste--puzzle-anzeige .memory-leiste-feld,
.memory-leiste--puzzle-anzeige .memory-leiste-wert {
  top: 48.5%;
  height: 27.5%;
}

@container (min-width: 1px) {
  /* Die Flaechen sind hier schmaler als bei den anderen Spielen --
     "Zauberhaft groß" und "Anderes Bild" brauchen deshalb weniger. */
  .memory-leiste--puzzle-stufen .memory-stufe-name { font-size: 1.55cqw; }
  .memory-leiste--puzzle-stufen .memory-stufe-info { font-size: 1.3cqw; }
  .memory-leiste--puzzle-anzeige .memory-neustart-btn.memory-leiste-feld { font-size: 1.7cqw; }
}

/* Schriftgroessen an der LEISTENBREITE, nicht am Bildschirm.
   Fallback zuerst, damit auch aeltere Browser etwas Vernuenftiges
   zeigen; cqw ueberschreibt ihn dort, wo es unterstuetzt wird. */
.memory-stufe-name { font-size: 0.95rem; font-weight: 600; }
.memory-stufe-info { font-size: 0.7rem; opacity: 0.75; }
.memory-neustart-btn.memory-leiste-feld { font-size: 0.95rem; font-weight: 600; }

@container (min-width: 1px) {
  /* 1,95 statt 2,1: "Zauberhaft gross" ist die laengste Beschriftung
     und beruehrte sonst den Rand ihrer Flaeche. */
  .memory-stufe-name { font-size: 1.95cqw; }
  .memory-stufe-info { font-size: 1.45cqw; }
  .memory-neustart-btn.memory-leiste-feld { font-size: 2.1cqw; }
  .memory-leiste-ton .lumaria-ton-schalter { font-size: 1.9cqw; }
}

.memory-leiste-feld:hover {
  transform: translateY(-1px);
  filter: drop-shadow(0 3px 6px rgba(120, 90, 40, 0.28));
}

.memory-leiste-feld:focus-visible {
  outline: 3px solid var(--color-gold-light);
  outline-offset: 2px;
}

/* Der aktive Schwierigkeitsgrad. Er muss auf einer hellen Flaeche
   erkennbar sein, ohne die Grafik zu ueberdecken: ein warmer Schimmer
   in der Flaeche und kraeftigere Schrift, statt eines zweiten Rahmens. */
.memory-leiste--stufen .memory-stufe-btn.is-aktiv {
  background: rgba(201, 162, 39, 0.28);
  box-shadow: inset 0 0 0 0.14em rgba(150, 110, 20, 0.55);
  font-weight: 700;
  /* Ausdruecklich dunkel: Die allgemeine Regel weiter oben setzt hier
     --color-ink-deep, und das ist im Schatztruhen-Thema ein helles
     Creme -- auf dem goldenen Schimmer waere die Beschriftung des
     aktiven Knopfes dann kaum noch zu lesen. */
  color: #3a2410;
}

.memory-leiste--stufen .memory-stufe-btn.is-aktiv .memory-stufe-info {
  opacity: 1;
}

/* Der Tonschalter wird vom Skript in den Platzhalter gesetzt und soll
   die ganze Flaeche fuellen. */
.memory-leiste-ton { padding: 0; }

.memory-leiste-ton .lumaria-ton-schalter {
  width: 100%;
  height: 100%;
  border: none;
  background: none;
  padding: 0;
  color: inherit;
  font-family: inherit;
  cursor: pointer;
}

/* Die drei Zahlenwerte. Sie stehen an FESTEN Plaetzen und nicht
   gleichmaessig verteilt -- siehe die Begruendung im HTML: In der
   Grafik sitzen Sternchen, auf denen die Zahlen sonst laegen.
   Zahl ueber Text statt nebeneinander: So braucht jeder Wert nur halb
   so viel Breite und passt bequem in die Luecke zwischen zwei
   Sternchen. */
.memory-leiste-wert {
  position: absolute;
  left: var(--feld-links);
  width: var(--feld-breite);
  top: 33%;
  height: 44%;
  margin: 0;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 0.05em;
  text-align: center;
  line-height: 1.1;
  font-size: 0.68rem;
}

@container (min-width: 1px) {
  .memory-leiste-wert { font-size: 1.35cqw; }
  .memory-leiste-wert .memory-wert-zahl { font-size: 2.5cqw; }
}

.memory-leiste-wert .memory-wert-zahl {
  display: block;
  font-family: var(--font-heading);
  font-weight: 700;
  line-height: 1;
  color: var(--color-plum, #4a2a6a);
}

.memory-leiste-wert .memory-wert-text {
  display: block;
  color: #6d5a45;
}

/* Auf sehr schmalen Bildschirmen wird die Leiste so klein, dass die
   Schrift in den Flaechen nicht mehr lesbar waere. Dort steht sie
   deshalb etwas gedraengter, aber immer noch in den Flaechen -- die
   Grafik bleibt vollstaendig sichtbar und wird nicht beschnitten. */
/* Ab hier wird es eng: Der Zusatz unter dem Knopfnamen waere kleiner
   als sieben Pixel. */
@media (max-width: 719px) {
  .memory-stufe-info { display: none; }
  .memory-leiste-wert .memory-wert-text { display: none; }
}

/* --- Schmale Bildschirme ---------------------------------------------
   Die Leisten sind Querformate mit fester Aufteilung. Auf einem Handy
   sind sie rund 330 px breit -- eine Knopfflaeche waere dann 55 px
   breit, "Zauberhaft schwer" darin knapp sechs Pixel hoch. Das ist
   nicht lesbar, und kleiner setzen laesst sich die Grafik nicht, ohne
   sie zu beschneiden.

   Deshalb tritt hier die schlichte Fassung an ihre Stelle: dieselben
   Knoepfe, dieselben Werte, dieselben Funktionen -- nur ohne die
   Zierleiste darunter. Die Grafik wird ausgeblendet und nicht etwa
   gestaucht. */
@media (max-width: 619px) {
  .memory-leiste-bild {
    display: none;
  }

  .memory-leiste {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: center;
    max-width: 34rem;
  }

  .memory-leiste--anzeige {
    gap: 0.7rem 1.4rem;
    padding: 0.9rem 1.2rem;
    border: 1px solid rgba(var(--color-gold-rgb), 0.3);
    border-radius: 18px;
    background: rgba(var(--surface-rgb), var(--surface-alpha));
  }

  .memory-leiste--stufen {
    gap: 0.6rem;
  }

  /* Aus den aufgesetzten Flaechen werden wieder gewoehnliche
     Bedienelemente im Textfluss. */
  .memory-leiste-feld,
  .memory-leiste-wert,
  .memory-leiste-beschriftung {
    position: static;
    left: auto;
    top: auto;
    width: auto;
    height: auto;
  }

  .memory-leiste-beschriftung {
    font-size: 1rem;
    color: var(--color-parchment-dim);
  }

  .memory-leiste .memory-stufe-btn {
    padding: 0.5rem 1.1rem;
    border: 1px solid rgba(var(--color-gold-rgb), 0.45);
    border-radius: 999px;
    background: rgba(var(--surface-rgb), var(--surface-alpha));
    color: var(--color-parchment);
  }

  .memory-leiste .memory-stufe-btn.is-aktiv {
    background: var(--color-gold);
    border-color: var(--color-gold);
    box-shadow: none;
    color: var(--color-ink-deep);
  }

  .memory-leiste .memory-stufe-name {
    font-size: 1rem;
  }

  .memory-leiste-wert {
    flex-direction: row;
    align-items: baseline;
    gap: 0.4rem;
    font-size: 0.92rem;
  }

  .memory-leiste-wert .memory-wert-zahl {
    font-size: 1.4rem;
    color: var(--color-gold-light);
  }

  /* In der schlichten Fassung ist wieder Platz fuer die Beschriftung. */
  .memory-leiste-wert .memory-wert-text {
    display: inline;
    color: var(--color-parchment-dim);
  }

  .memory-leiste .memory-neustart-btn {
    padding: 0.45rem 1.2rem;
    border: 1px solid var(--color-gold);
    border-radius: 999px;
    color: var(--color-parchment);
    font-size: 0.95rem;
  }

  .memory-leiste-ton .lumaria-ton-schalter {
    width: auto;
    height: auto;
    font-size: 0.95rem;
    color: var(--color-parchment);
  }
}

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

/* =====================================================================
   INTERAKTIVE ZAUBERELEMENTE
   ---------------------------------------------------------------------
   Kleine anklickbare Figuren, die im Ruhezustand vollkommen still sind.
   Erst ein Klick oder Fingertipp bewegt sie einmal kurz und zeigt eine
   Botschaft. Das Geruest und die einstellbaren Werte stehen in
   js/lumaria-zauberelemente.js beschrieben.

   Einstellbar an jeder Stelle (als CSS-Eigenschaften im style-Attribut):
     --z-oben / --z-seite / --z-breite         schmale Bildschirme
     --z-oben-weit / --z-seite-weit /
     --z-breite-weit                           ab 1180 px
     --z-dreh                                  Drehpunkt der Bewegung

   WARUM ZWEI SAETZE VON WERTEN: Auf breiten Bildschirmen steht neben dem
   Textblock viel Platz frei -- dort duerfen die Figuren daneben sitzen
   und groesser sein. Auf dem Handy gibt es diesen Platz nicht; dort
   sitzen sie im oberen Innenabstand des Abschnitts, wo ohnehin nichts
   steht, und bleiben klein. So verdecken sie nirgends Text und werden
   nirgends abgeschnitten. */

.zauberelement {
  position: absolute;
  top: var(--z-oben, 4px);
  width: var(--z-breite, 62px);
  z-index: 4;
  line-height: 0;
}

.zauberelement--rechts { right: var(--z-seite, 12px); }
.zauberelement--links  { left:  var(--z-seite, 12px); }

@media (min-width: 1180px) {
  .zauberelement {
    top: var(--z-oben-weit, var(--z-oben, 4px));
    width: var(--z-breite-weit, var(--z-breite, 62px));
  }

  .zauberelement--rechts { right: var(--z-seite-weit, var(--z-seite, 12px)); }
  .zauberelement--links  { left:  var(--z-seite-weit, var(--z-seite, 12px)); }
}

/* Eine Stelle, die MITTIG IM TEXTFLUSS sitzt statt am Rand -- gedacht
   fuer den schmalen freien Streifen zwischen zwei Abschnitten. Dort ist
   auf jeder Bildschirmbreite Platz, und die Botschaft oeffnet nach
   unten in freien Grund statt ueber einen unruhigen Hintergrund.

   Die Botschaft wird ueber translate zentriert und nicht ueber
   transform: transform gehoert hier der Auf- und Zublende. */
.zauberelement--mitte {
  position: relative;
  top: auto;
  right: auto;
  left: auto;
  margin: 1.2rem auto 0;
}

.zauberelement--mitte .zauberelement-botschaft {
  left: 50%;
  right: auto;
  translate: -50%;
}

/* Eine Stelle, die eine BEREITS AUF DER SEITE VORHANDENE Abbildung
   anklickbar macht. Sie greift weder in deren Lage noch in deren
   Groesse ein: Der Knopf legt sich ohne Rand und ohne Polster genau um
   das Bild, die ganze sichtbare Figur wird dadurch zur Trefferflaeche.
   Am Bild selbst ist nichts geaendert -- was aufleuchtet, liegt als
   eigene Flaeche darueber. */
.zauberelement--flaeche {
  position: relative;
  display: block;
  top: auto;
  right: auto;
  left: auto;
  width: auto;
  margin: 0;
}

/* Die Botschaft oeffnet mittig unter der Figur -- so bleibt sie auf
   jeder Bildschirmbreite im Bild und deckt die Figur nicht zu. */
.zauberelement--flaeche .zauberelement-botschaft {
  left: 50%;
  right: auto;
  translate: -50%;
}

/* Der Lichtschein an einer bestimmten Stelle des Bildes -- etwa an der
   Spitze eines Zauberstabs. Wo genau, steht als Prozentwert am Element;
   gemessen ist er am Bild. */
.zauberelement-schein {
  position: absolute;
  left: var(--schein-links, 50%);
  top: var(--schein-oben, 50%);
  width: var(--schein-breite, 18%);
  aspect-ratio: 1;
  translate: -50% -50%;
  border-radius: 50%;
  background: radial-gradient(circle,
    rgba(255, 248, 222, 0.95) 0%,
    rgba(216, 156, 255, 0.7) 32%,
    rgba(168, 96, 232, 0) 70%);
  opacity: 0;
  pointer-events: none;
  mix-blend-mode: screen;
}

.zauberelement[data-zauber-art="stab"].ist-bewegt .zauberelement-schein {
  animation: zauber-schein 1.5s ease-in-out;
}

@keyframes zauber-schein {
  0%, 100% { opacity: 0;    transform: scale(0.55); }
  28%      { opacity: 0.9;  transform: scale(1); }
  58%      { opacity: 1;    transform: scale(1.18); }
}

/* Die Trefferflaeche ist rundum groesser als das Bild: Kinderfinger auf
   dem Handy treffen sonst daneben. Der negative Aussenabstand nimmt den
   Zuwachs wieder aus dem Layout heraus, damit die Figur trotzdem genau
   dort sitzt, wo sie soll. */
.zauberelement-knopf {
  display: block;
  /* content-box, damit das Polster die Bildbreite NICHT auffrisst:
     Sonst waere aus --z-breite 66 px ein 42 px kleines Bild geworden. */
  box-sizing: content-box;
  width: 100%;
  padding: 12px;
  margin: -12px;
  border: 0;
  background: none;
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
}

.zauberelement-knopf:focus-visible {
  outline: 3px solid var(--color-gold-light);
  outline-offset: 2px;
  border-radius: 12px;
}

/* Bei einer vorhandenen Abbildung braucht es das Polster nicht: Die
   Figur ist ohnehin gross genug zum Treffen. Wichtig ist, dass der
   Knopf GENAU so gross ist wie das Bild -- die Prozentwerte des
   Lichtscheins beziehen sich auf ihn, und die Botschaft oeffnet unter
   seiner Unterkante. */
/* Ein Bild, das die Huelle vollstaendig ausfuellt -- dort, wo Lage und
   Groesse an der Huelle stehen statt am Bild. */
.zauberelement-vollbild {
  display: block;
  width: 100%;
  height: auto;
}

/* Der Knopf muss anklickbar sein, auch wenn die Zier ringsum
   pointer-events: none traegt (Laternen, Sticker). */
.zauberelement-knopf--flaeche {
  pointer-events: auto;
  box-sizing: border-box;
  display: block;
  width: 100%;
  padding: 0;
  margin: 0;
}

.zauberelement-bild {
  display: block;
  width: 100%;
  height: auto;
  transform-origin: var(--z-dreh, 50% 60%);
}

/* --- Die beiden Bewegungen ------------------------------------------
   Beide laufen genau einmal und enden dort, wo sie begonnen haben. */

.zauberelement[data-zauber-art="schreiben"].ist-bewegt .zauberelement-bild {
  animation: zauber-schreiben 1.15s ease-in-out;
}

@keyframes zauber-schreiben {
  0%   { transform: rotate(0deg)    translate(0, 0); }
  16%  { transform: rotate(-7deg)   translate(-3%, 2%); }
  36%  { transform: rotate(4.5deg)  translate(4%, -1%); }
  56%  { transform: rotate(-4deg)   translate(-2%, 2.5%); }
  76%  { transform: rotate(2.5deg)  translate(2%, -0.5%); }
  100% { transform: rotate(0deg)    translate(0, 0); }
}

.zauberelement[data-zauber-art="flattern"].ist-bewegt .zauberelement-bild {
  animation: zauber-flattern 1.1s ease-in-out;
}

/* Ein flaches Bild kann die Fluegel nicht wirklich bewegen. Das
   Zusammenziehen in der Breite liest sich aber genau so: Der Falter
   klappt die Fluegel an und wieder auf und steigt dabei ein Stueck. */
@keyframes zauber-flattern {
  0%   { transform: translateY(0)     scaleX(1); }
  14%  { transform: translateY(-7%)   scaleX(0.8); }
  28%  { transform: translateY(-12%)  scaleX(1); }
  42%  { transform: translateY(-15%)  scaleX(0.82); }
  56%  { transform: translateY(-12%)  scaleX(1); }
  72%  { transform: translateY(-6%)   scaleX(0.88); }
  100% { transform: translateY(0)     scaleX(1); }
}

/* Lampe und Laptop sind flache Bilder -- ihre Lichter lassen sich nicht
   einzeln ansteuern. Ein kurzes Aufhellen des ganzen Bildes samt Schein
   ringsum liest sich aber genau so: Die Lampe wird waermer, der
   Bildschirm heller. */
.zauberelement[data-zauber-art="leuchten"].ist-bewegt .zauberelement-bild {
  animation: zauber-leuchten 1.5s ease-in-out;
}

@keyframes zauber-leuchten {
  0%   { filter: none; }
  22%  { filter: brightness(1.14) drop-shadow(0 0 16px rgba(255, 213, 138, 0.8)); }
  52%  { filter: brightness(1.2)  drop-shadow(0 0 28px rgba(255, 208, 128, 0.95)); }
  100% { filter: none; }
}

.zauberelement[data-zauber-art="bildschirm"].ist-bewegt .zauberelement-bild {
  animation: zauber-bildschirm 1.3s ease-in-out;
}

@keyframes zauber-bildschirm {
  0%   { filter: none; }
  20%  { filter: brightness(1.16) drop-shadow(0 0 14px rgba(198, 224, 255, 0.75)); }
  50%  { filter: brightness(1.22) drop-shadow(0 0 24px rgba(206, 228, 255, 0.9)); }
  100% { filter: none; }
}

/* --- Goldene Funken -------------------------------------------------- */

.zauberelement-funken {
  position: absolute;
  inset: 0;
  pointer-events: none;
}

.zauberelement-funken > span {
  position: absolute;
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: radial-gradient(circle, #fffaea 0%, rgba(238, 197, 92, 0.95) 42%, rgba(238, 197, 92, 0) 72%);
  opacity: 0;
}

.zauberelement-funken > span:nth-child(1) { left: 12%; top: 62%; }
.zauberelement-funken > span:nth-child(2) { left: 34%; top: 40%; }
.zauberelement-funken > span:nth-child(3) { left: 54%; top: 66%; }
.zauberelement-funken > span:nth-child(4) { left: 72%; top: 34%; }
.zauberelement-funken > span:nth-child(5) { left: 86%; top: 58%; }

/* Funken, die sich um EINEN Punkt scharen statt sich ueber die ganze
   Figur zu verteilen -- etwa um eine Zauberstabspitze oder ein Herz.
   Der Punkt steht als Prozentwert am Element, der Versatz drumherum in
   Pixeln. */
.zauberelement-funken--punkt > span {
  left: var(--funken-links, 50%);
  top: var(--funken-oben, 50%);
  width: 7px;
  height: 7px;
}

.zauberelement-funken--punkt > span:nth-child(1) { margin: -15px 0 0 -17px; }
.zauberelement-funken--punkt > span:nth-child(2) { margin: -23px 0 0 5px; }
.zauberelement-funken--punkt > span:nth-child(3) { margin: 3px 0 0 15px; }
.zauberelement-funken--punkt > span:nth-child(4) { margin: 11px 0 0 -13px; }
.zauberelement-funken--punkt > span:nth-child(5) { margin: -7px 0 0 21px; }

.zauberelement.ist-bewegt .zauberelement-funken > span {
  animation: zauber-funke 0.95s ease-out forwards;
}

.zauberelement.ist-bewegt .zauberelement-funken > span:nth-child(2) { animation-delay: 0.12s; }
.zauberelement.ist-bewegt .zauberelement-funken > span:nth-child(3) { animation-delay: 0.24s; }
.zauberelement.ist-bewegt .zauberelement-funken > span:nth-child(4) { animation-delay: 0.36s; }
.zauberelement.ist-bewegt .zauberelement-funken > span:nth-child(5) { animation-delay: 0.48s; }

@keyframes zauber-funke {
  0%   { opacity: 0;    transform: scale(0.35) translateY(5px); }
  28%  { opacity: 0.95; }
  100% { opacity: 0;    transform: scale(1.15) translateY(-15px); }
}

/* --- Die Botschaft ---------------------------------------------------
   Sie liegt ueber dem Seiteninhalt und nimmt keinen Platz im Layout ein
   -- beim Erscheinen verschiebt sich also nichts. Sie oeffnet immer zur
   Seitenmitte hin, damit sie auf schmalen Bildschirmen nicht ueber den
   Rand hinauslaeuft, und bleibt dank max-width vollstaendig sichtbar. */

.zauberelement-botschaft {
  position: absolute;
  /* Abstand nach unten, je Stelle einstellbar: Wo das Bild ueber
     seinen Knopf hinausragt, braucht die Botschaft mehr Luft. */
  top: calc(100% + var(--z-abstand, 0.6rem));
  width: max-content;
  max-width: min(74vw, 20rem);
  margin: 0;
  padding: 0.65rem 0.9rem;
  border: 1px solid rgba(var(--color-gold-rgb), 0.55);
  border-radius: 14px;
  background: rgba(255, 252, 245, 0.97);
  box-shadow: 0 10px 26px rgba(90, 60, 30, 0.18), 0 0 20px rgba(var(--color-gold-rgb), 0.2);
  color: #4a2a6a;
  font-family: var(--font-heading);
  font-size: 0.95rem;
  line-height: 1.35;
  text-align: center;
  opacity: 0;
  transform: translateY(-5px);
  pointer-events: none;
  transition: opacity 0.4s ease, transform 0.4s ease;
  z-index: 2;
}

.zauberelement--rechts .zauberelement-botschaft { right: 0; }
.zauberelement--links  .zauberelement-botschaft { left: 0; }

.zauberelement.ist-offen .zauberelement-botschaft {
  opacity: 1;
  transform: translateY(0);
  pointer-events: auto;
}

/* Bei der Feder erscheint der Satz nicht einfach, sondern schreibt sich
   von links nach rechts -- als zoege die Feder ihn gerade mit
   Zaubertinte. */
.zauberelement[data-zauber-art="schreiben"] .zauberelement-botschaft {
  clip-path: inset(0 100% 0 0 round 14px);
  transition: opacity 0.25s ease, transform 0.4s ease, clip-path 1.1s ease-out;
}

.zauberelement[data-zauber-art="schreiben"].ist-offen .zauberelement-botschaft {
  clip-path: inset(0 0 0 0 round 14px);
}

/* Beim Falter kommt der Satz als sanfter Lichtschein. */
.zauberelement[data-zauber-art="flattern"] .zauberelement-botschaft {
  transform: translateY(-5px) scale(0.96);
}

.zauberelement[data-zauber-art="flattern"].ist-offen .zauberelement-botschaft {
  transform: translateY(0) scale(1);
}

/* Wer Bewegung reduziert haben moechte, bekommt die Botschaft trotzdem
   -- nur eben ohne Flug, ohne Funken und ohne Schreibbewegung. */
@media (prefers-reduced-motion: reduce) {
  .zauberelement-bild { animation: none !important; }
  .zauberelement-funken { display: none; }

  .zauberelement .zauberelement-botschaft {
    transform: none;
    clip-path: none;
    transition: opacity 0.2s ease;
  }

  .zauberelement.ist-offen .zauberelement-botschaft { transform: none; }
}

/* Der Abschnitt, in dem die Zauberfeder am Rand sitzt, braucht einen
   Bezugspunkt fuer ihre Lage. */
.home-heldin-section {
  position: relative;
}

/* --- Spielueberschriften ----------------------------------------------
   Die vier Ueberschriftengrafiken der Spiele sind anklickbar. Beim
   Antippen leuchtet das violette Herz im Schriftzug auf, ein paar
   goldene Funken schwirren, die ganze Ueberschrift hebt sich einmal
   minimal an -- und darunter erscheint ein Mutmachsatz.

   Lage und Groesse der Ueberschrift stehen jetzt an der Huelle statt am
   Bild. Nur so beziehen sich die Prozentwerte des Herzscheins auf die
   Grafik und nicht auf die volle Seitenbreite; das Bild selbst ist
   unveraendert und wird weder beschnitten noch verzerrt. */
.zauberelement--ueberschrift {
  position: relative;
  top: auto;
  left: auto;
  right: auto;
  width: 100%;
  max-width: 620px;
  margin: 0.2rem auto 1rem;
}

.zauberelement--ueberschrift .spielseite-heading-img {
  width: 100%;
  max-width: none;
  margin: 0;
}

@media (max-width: 640px) {
  .zauberelement--ueberschrift {
    max-width: 94%;
  }
}

.zauberelement--ueberschrift .zauberelement-botschaft {
  left: 50%;
  right: auto;
  translate: -50%;
}

.zauberelement[data-zauber-art="ueberschrift"].ist-bewegt .spielseite-heading-img {
  animation: zauber-anheben 1.2s ease-in-out;
}

@keyframes zauber-anheben {
  0%, 100% { transform: translateY(0); }
  35%      { transform: translateY(-7px); }
  70%      { transform: translateY(-3px); }
}

.zauberelement[data-zauber-art="ueberschrift"].ist-bewegt .zauberelement-schein {
  animation: zauber-herzlicht 1.4s ease-in-out;
}

@keyframes zauber-herzlicht {
  0%, 100% { opacity: 0;    transform: scale(0.5); }
  30%      { opacity: 0.85; transform: scale(1); }
  62%      { opacity: 1;    transform: scale(1.2); }
}

/* --- Die drei Motive auf Lumarias Marktplatz -------------------------
   Sie sind anklickbar geworden. Lage und Groesse stehen dafuer an der
   Huelle statt am Bild -- sonst haette der Knopf keine Flaeche gehabt.
   Die Werte sind dieselben wie in den Regeln weiter oben, nur mit einer
   Klasse mehr davor, damit sie gegen die allgemeinen Werte von
   .zauberelement gewinnen. Verschoben oder veraendert wird dadurch
   nichts -- auch nicht, dass die drei erst ab 1024 px ueberhaupt
   erscheinen. */
.marktplatz-mooni-single.zauberelement { right: calc(100% + 20px); top: 80px;  width: 190px; }
.marktplatz-mooni-duo.zauberelement    { left:  calc(100% + 20px); top: 80px;  width: 215px; }
.marktplatz-book-stack.zauberelement   { right: calc(100% + 40px); top: 300px; width: 130px; }

@media (min-width: 1024px) and (max-width: 1280px) {
  .marktplatz-mooni-single.zauberelement { width: 150px; }
  .marktplatz-mooni-duo.zauberelement    { width: 170px; }
  .marktplatz-book-stack.zauberelement   { right: calc(100% + 20px); top: 240px; width: 100px; }
}

/* Die Botschaften oeffnen zur Seitenmitte hin: Die drei stehen weit
   aussen, nach draussen waere kein Platz. */
.marktplatz-figure.zauberelement .zauberelement-botschaft {
  left: auto;
  right: auto;
  translate: none;
  max-width: min(42vw, 15rem);
}

/* Die beiden linken Motive stehen links AUSSERHALB des Schildes -- ihre
   Botschaft muss deshalb nach rechts aufgehen, zur Seitenmitte hin. Beim
   rechten Motiv genau umgekehrt. */
.marktplatz-mooni-single.zauberelement .zauberelement-botschaft { left: 0; }
.marktplatz-mooni-duo.zauberelement .zauberelement-botschaft    { right: 0; }

/* Der Buecherstapel steht am weitesten aussen und ragt auf schmaleren
   Bildschirmen selbst schon ueber den linken Rand hinaus. Seine
   Botschaft geht deshalb NEBEN ihm auf statt darunter -- so bleibt sie
   auch dort vollstaendig im Bild. */
.marktplatz-book-stack.zauberelement .zauberelement-botschaft {
  left: 100%;
  right: auto;
  top: 50%;
  translate: 0 -50%;
  margin-left: 0.6rem;
}

/* Der kleine Bewohner beugt sich einmal leicht nach vorn. */
.zauberelement[data-zauber-art="beugen"].ist-bewegt .zauberelement-vollbild {
  animation: zauber-beugen 1.1s ease-in-out;
}

@keyframes zauber-beugen {
  0%, 100% { transform: rotate(0deg) translateY(0); }
  38%      { transform: rotate(-3.5deg) translateY(-1.5%); }
  70%      { transform: rotate(-1.5deg) translateY(-0.5%); }
}

/* Der Buecherstapel leuchtet als Ganzes sanft auf. */
.zauberelement[data-zauber-art="stapel"].ist-bewegt .zauberelement-vollbild {
  animation: zauber-stapellicht 1.5s ease-in-out;
}

@keyframes zauber-stapellicht {
  0%   { filter: none; }
  28%  { filter: brightness(1.12) drop-shadow(0 0 14px rgba(255, 216, 148, 0.8)); }
  58%  { filter: brightness(1.18) drop-shadow(0 0 22px rgba(255, 210, 136, 0.9)); }
  100% { filter: none; }
}

/* Das aufgeschlagene Buch der beiden leuchtet warm und golden auf. */
.zauberelement[data-zauber-art="buchlicht"] .zauberelement-schein {
  background: radial-gradient(ellipse 60% 100% at 50% 50%,
    rgba(255, 246, 214, 0.9) 0%,
    rgba(246, 206, 124, 0.6) 38%,
    rgba(232, 180, 90, 0) 74%);
}

.zauberelement[data-zauber-art="buchlicht"].ist-bewegt .zauberelement-schein {
  animation: zauber-buchlicht 1.5s ease-in-out;
}

@keyframes zauber-buchlicht {
  0%, 100% { opacity: 0;   transform: scale(0.7); }
  32%      { opacity: 0.9; transform: scale(1); }
  64%      { opacity: 1;   transform: scale(1.1); }
}

/* =====================================================================
   KLEINER HINWEIS AUS LUMARIA (nur auf der Startseite)
   ---------------------------------------------------------------------
   Er sagt den Besuchern, dass sich auf den Seiten anklickbare
   Kleinigkeiten verstecken. Einmal sanft eingeblendet, bleibt er
   stehen, bis jemand ihn schliesst -- danach ist er fuer diesen Besuch
   erledigt (js/lumaria-hinweis.js).

   Er liegt absolut IM Heldenbereich: So verschiebt sein Erscheinen
   nichts am uebrigen Inhalt, und beim Scrollen wandert er ganz normal
   mit der Seite nach oben davon, statt am Fenster zu kleben. */

.zauber-hinweis {
  /* Fuellung und Kontur stehen als Werte hier oben, weil der Zipfel
     dieselben Farben braucht -- er ist eine eigene Zeichnung und muesste
     sonst getrennt nachgepflegt werden. Der Zipfel uebernimmt den
     hellsten Ton, weil er an der Blase unten sitzt, wo der Verlauf
     bereits dunkler geworden ist -- so gibt es keine sichtbare Kante. */
  --blase-hell: #fdf2f7;
  --blase-fuellung: #fae5ee;
  --blase-tief: #f5d8e7;
  --blase-rand: #c9a45c;

  position: absolute;
  top: clamp(12px, 2.2vw, 30px);
  right: clamp(12px, 3.5vw, 40px);
  width: min(76vw, 16.5rem);
  /* Ueber der Illustration des Heldenbereichs, aber unter den frei
     fliegenden Schmetterlingen (400) und der Navigation (900+): Die
     Falter ziehen ueber die ganze Seite, das soll so bleiben. */
  z-index: 40;
  margin: 0;
  /* Reichlich Luft ringsum: In einer gerundeten Form draengt sich Text
     sonst an die Rundung. Rechts zusaetzlich Platz fuer das Kreuz. */
  /* Seitlich gleich viel Luft: Rechts war vorher zusaetzlicher Platz
     fuer das Schliessen-Kreuz reserviert, dadurch sass der Text leicht
     aus der Mitte. */
  padding: 1.55rem 2rem 1.65rem;
  border: 1.5px solid var(--blase-rand);
  /* Keine Kastenform: acht verschiedene Radien geben eine weich
     geschwungene, leicht unregelmaessige Silhouette. Die Ecke unten
     links ist bewusst enger -- dort beginnt der flache Rand, auf dem
     der Zipfel sitzt. Waere sie so rund wie die anderen, haette der
     Zipfel in der Luft gehangen. */
  border-radius: 42% 46% 42% 24% / 48% 40% 46% 28%;
  /* Von oben belichtet: heller Scheitel, tieferes Rose am Grund. Eine
     einfarbige Flaeche wirkte flach wie Papier, der Verlauf gibt der
     Blase Woelbung. */
  background: linear-gradient(168deg,
    var(--blase-hell) 0%,
    var(--blase-fuellung) 52%,
    var(--blase-tief) 100%);
  /* Zwei feine Linien innen: ein heller Lichtsaum direkt unter der
     Goldkontur und ein Hauch Gold darunter -- das liest sich wie eine
     gefasste Kante statt wie ein gezogener Strich. */
  box-shadow:
    inset 0 1.5px 0 rgba(255, 255, 255, 0.9),
    inset 0 0 0 2.5px rgba(255, 252, 246, 0.72),
    inset 0 -10px 18px -12px rgba(198, 140, 120, 0.35);
  /* drop-shadow statt box-shadow fuer AUSSEN: Der Schatten folgt der
     wirklichen Silhouette samt Zipfel, ein box-shadow haette den Zipfel
     ignoriert. Erst ein enger Kontaktschatten, dann ein weicher
     getragener -- ein einzelner Schein ohne Versatz waere Deko, keine
     Tiefe. */
  filter:
    drop-shadow(0 2px 3px rgba(150, 96, 84, 0.14))
    drop-shadow(0 12px 22px rgba(150, 96, 84, 0.2))
    drop-shadow(0 0 16px rgba(201, 164, 92, 0.22));
  color: #4a2a6a;
  text-align: center;
  /* Ein Tippen auf die Blase laesst sie verschwinden -- das Kreuz oben
     rechts ist auf Wunsch entfallen, und ein Hinweis, den man nicht
     wegbekommt, waere laestig. */
  cursor: pointer;
  opacity: 0;
  transform: translateY(-6px);
  transition: opacity 0.6s ease, transform 0.6s ease, filter 0.4s ease;
  pointer-events: none;
}

/* Beim Ueberfahren hebt sich der Goldschein leicht -- ein stiller
   Hinweis, dass man sie antippen kann. */
.zauber-hinweis.ist-sichtbar:hover {
  filter:
    drop-shadow(0 2px 3px rgba(150, 96, 84, 0.16))
    drop-shadow(0 13px 24px rgba(150, 96, 84, 0.22))
    drop-shadow(0 0 20px rgba(201, 164, 92, 0.34));
}

/* Der Sprechzipfel: eine eigene kleine Zeichnung, die schraeg nach
   links unten zeigt. Sie ist NUR an ihren beiden Aussenkanten mit Gold
   gezeichnet -- die Oberkante bleibt offen und liegt ein Stueck INNEN
   auf der Blase. Weil die Fuellung deckend ist, verdeckt sie dort die
   Randlinie der Blase, und beide Formen lesen sich als eine einzige
   Silhouette statt als Blase mit angeklebtem Dreieck.

   Er haengt unter der Blase heraus; nichts darf ihn abschneiden -- die
   Blase selbst hat deshalb kein overflow. */
.zauber-hinweis::after {
  content: "";
  position: absolute;
  left: 19%;
  top: 100%;
  width: 56px;
  height: 52px;
  /* Der Ansatz liegt so weit oben, dass er auch den hellen Innensaum
     der Blase ueberdeckt -- bei geringerer Ueberlappung blitzte an der
     Nahtstelle ein heller Streifen durch. */
  margin-top: -21px;
  /* Beide Aussenkanten kruemmen sich GEGENLAEUFIG: Die rechte zieht
     sich nach innen, die linke baucht nach aussen. Dadurch ist der
     Zipfel an der Wurzel am breitesten und wird von dort bis zur
     Spitze gleichmaessig schmaler -- so liest ihn das Auge als
     Sprechschwanz. In der ersten Fassung bogen sich beide Kanten
     gleich (ein duenner Splitter), in der zweiten bauchte er in der
     Mitte aus und sah aus wie ein Bluetenblatt.
     Ein zarter Verlauf in der Fuellung setzt den Woelbungsverlauf der
     Blase nach unten fort. */
  background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 54 50'%3E%3ClinearGradient id='z' x1='0' y1='0' x2='0.3' y2='1'%3E%3Cstop offset='0' stop-color='%23f7dceb'/%3E%3Cstop offset='1' stop-color='%23f3d2e4'/%3E%3C/linearGradient%3E%3Cpath d='M52 3C46 18 30 34 14 46C16 30 17 16 24 5Z' fill='url(%23z)'/%3E%3Cpath d='M52 3C46 18 30 34 14 46C16 30 17 16 24 5' fill='none' stroke='%23c9a45c' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat center / 100% 100%;
  filter: drop-shadow(0 3px 3px rgba(150, 96, 84, 0.1));
  pointer-events: none;
}

.zauber-hinweis.ist-sichtbar {
  opacity: 1;
  transform: translateY(0);
  pointer-events: auto;
}

/* Zwei Klassen, damit die Regel .hero p (Spezifitaet 0,1,1) sie nicht
   ueberstimmt -- die setzt sonst 1,3rem Schrift, 2,2rem Abstand nach
   unten und eine helle Pergamentfarbe, die auf dem cremefarbenen
   Blasenhintergrund kaum zu lesen waere. */
.zauber-hinweis .zauber-hinweis-text {
  margin: 0;
  font-family: var(--font-heading);
  font-size: 0.97rem;
  line-height: 1.58;
  letter-spacing: 0.006em;
  color: #4a2a6a;
  /* Gleich lange Zeilen statt einer langen und einer kurzen -- in einer
     runden Form faellt ein unruhiger Flattersatz sofort auf. */
  text-wrap: balance;
}

/* "Psst" wird gefluestert -- dieselbe kursive Handschrift wie beim
   Zauberschluessel auf der Schatztruhen-Seite. */
.zauber-hinweis-fluester {
  font-style: italic;
  color: #6b4183;
}

@media (prefers-reduced-motion: reduce) {
  .zauber-hinweis {
    transform: none;
    transition: opacity 0.2s ease;
  }

  .zauber-hinweis.ist-sichtbar { transform: none; }
}

/* Eine Stelle, die IM TEXTFLUSS SCHWEBT: Der Text fliesst um sie herum.
   So verdeckt sie nichts, schiebt nichts weg und wirkt wie eine
   Randzier des Absatzes -- kein eigener Abschnitt. Sie klebt auch
   nirgends fest, sondern scrollt ganz normal mit. */
.zauberelement--schwebend {
  position: relative;
  top: auto;
  left: auto;
  right: auto;
  float: right;
  width: var(--z-breite, 56px);
  margin: 0.1rem 0 0.7rem 1.3rem;
  shape-margin: 0.8rem;
}

@media (min-width: 1180px) {
  .zauberelement--schwebend {
    width: var(--z-breite-weit, var(--z-breite, 56px));
  }
}

/* Die Botschaft oeffnet nach links in die Textspalte hinein -- nach
   rechts waere am Rand kein Platz. */
.zauberelement--schwebend .zauberelement-botschaft {
  right: 0;
  left: auto;
  translate: none;
  max-width: min(70vw, 17rem);
}

/* Auf schmalen Bildschirmen ist die Spalte zu eng zum Umfliessen: Dort
   rueckt die Lampe mittig unter die Ueberschrift, bleibt aber im
   normalen Inhaltsfluss. */
@media (max-width: 620px) {
  .zauberelement--schwebend {
    float: none;
    margin: 0.2rem auto 0.9rem;
  }

  .zauberelement--schwebend .zauberelement-botschaft {
    right: auto;
    left: 50%;
    translate: -50%;
  }
}

/* =====================================================================
   VIER ENTDECKUNGEN AUF DER LUMARIA-SEITE
   ---------------------------------------------------------------------
   Lumi-Baum, Zauberlaterne, Traumblume und Herzlicht-Kristall. Sie
   benutzen dasselbe Bauteil wie die uebrigen anklickbaren Figuren
   (js/lumaria-zauberelemente.js) -- nur die Lage und die vier
   Bewegungen kommen hier dazu.

   WARUM SIE IM RAND HAENGEN UND NICHT IM TEXT: Ab 1180px schwimmen sie
   als float VOLLSTAENDIG AUSSERHALB der 640px breiten Lesespalte (der
   negative Aussenabstand ist so gross wie Breite + Luecke, die rechte
   Kante liegt also links der Textkante). Dadurch koennen sie keine
   Zeile verkuerzen und nichts verdecken, folgen aber trotzdem ihrem
   Absatz, wenn der Text bei anderer Fenstergroesse umbricht -- eine
   feste top-Angabe waere dabei verrutscht.

   Darunter gibt es diesen Rand nicht. Dort sitzen sie mittig im
   normalen Textfluss, kleiner, mit einem freigehaltenen Streifen
   darunter (--z-luft): Genau dort erscheint die Botschaft. Weil der
   Platz dauerhaft frei bleibt, verschiebt sich beim Aufgehen nichts,
   und die Botschaft legt sich auch auf keinen Text. */

.zauberelement--fund {
  position: relative;
  top: auto;
  right: auto;
  left: auto;
  display: block;
  width: var(--z-breite, 88px);
  margin: 1.5rem auto var(--z-luft, 8.75rem);
  z-index: 3;
}

.zauberelement--fund .zauberelement-botschaft {
  left: 50%;
  right: auto;
  translate: -50%;
  width: min(74vw, 18rem);
  max-width: min(74vw, 18rem);
}

@media (min-width: 1180px) {
  .zauberelement--fund {
    width: var(--z-breite-weit, var(--z-breite, 88px));
    margin: 0;
  }

  .zauberelement--fund.zauberelement--fund-links {
    float: left;
    margin-left: calc(-1 * (var(--z-breite-weit, 88px) + var(--z-luecke, 30px)));
  }

  .zauberelement--fund.zauberelement--fund-rechts {
    float: right;
    margin-right: calc(-1 * (var(--z-breite-weit, 88px) + var(--z-luecke, 30px)));
  }

  /* Neben einem Abschnitt ohne Textspalte (der Videoblock ist ueber die
     volle Breite gespannt): von der Mitte aus nach links gemessen, damit
     der Abstand zum Rahmen bei jeder Fensterbreite derselbe bleibt. */
  .zauberelement--fund.zauberelement--fund-mittig-links {
    position: absolute;
    float: none;
    top: var(--z-oben-weit, 34px);
    left: 50%;
    margin: 0 0 0 var(--z-versatz, -420px);
  }

  /* Am Ende eines Abschnitts: bleibt im Fluss, rueckt aber aus der
     Mitte zur Seite. Der freie Streifen darunter bleibt erhalten -- da
     steht nichts mehr, die Botschaft deckt also nichts zu. */
  .zauberelement--fund.zauberelement--fund-versatz-rechts {
    margin: 0.5rem var(--z-versatz-rechts, 6%) var(--z-luft-weit, 7rem) auto;
  }

  .zauberelement--fund .zauberelement-botschaft {
    width: var(--z-nachricht, 12.5rem);
    max-width: var(--z-nachricht, 12.5rem);
    font-size: 0.88rem;
  }

  /* VOM TEXT WEG statt mittig: Mittig unter der Figur haette die
     Botschaft mit ihrer Aussenkante in die Lesespalte hineingeragt --
     gemessen 22px ueber dem Hinweisbild. An der zur Spalte zeigenden
     Kante ausgerichtet, oeffnet sie vollstaendig in den freien Rand. */
  .zauberelement--fund.zauberelement--fund-links .zauberelement-botschaft {
    left: auto;
    right: 0;
    translate: none;
  }

  .zauberelement--fund.zauberelement--fund-rechts .zauberelement-botschaft {
    left: 0;
    right: auto;
    translate: none;
  }
}

/* Der Videoblock traegt die Laterne -- ohne position:relative haenge
   sie sonst am Seitenanfang statt neben dem Rahmen. */
.lumaria-video-feature {
  position: relative;
}

/* --- Zwei Lichtstellen an einer Figur --------------------------------
   Die Laterne hat zwei: die Flamme im Inneren und den Kristall, der
   darunter haengt. Der zweite Schein hat eigene Werte. */
.zauberelement-schein--zwei {
  left: var(--schein2-links, 50%);
  top: var(--schein2-oben, 85%);
  width: var(--schein2-breite, 14%);
}

/* Warmes Gold statt Flieder -- fuer Herz, Flamme und Bluetenmitte. */
.zauberelement-schein--gold {
  background: radial-gradient(circle,
    rgba(255, 250, 232, 0.98) 0%,
    rgba(255, 214, 130, 0.75) 34%,
    rgba(238, 175, 64, 0) 72%);
}

/* --- 1. Lumi-Baum: das Herz im Stamm schlaegt einmal ---------------- */
.zauberelement[data-zauber-art="herzbaum"].ist-bewegt .zauberelement-schein:not(.zauberelement-schein--zwei),
.zauberelement[data-zauber-art="briefkasten"].ist-bewegt .zauberelement-schein:not(.zauberelement-schein--zwei),
.zauberelement[data-zauber-art="kristall"].ist-bewegt .zauberelement-schein:not(.zauberelement-schein--zwei) {
  animation: zauber-herzschlag 1.9s ease-in-out;
}

@keyframes zauber-herzschlag {
  0%, 100% { opacity: 0;    transform: scale(0.55); }
  18%      { opacity: 0.9;  transform: scale(1.02); }
  34%      { opacity: 0.5;  transform: scale(0.9); }
  56%      { opacity: 1;    transform: scale(1.16); }
  78%      { opacity: 0.45; transform: scale(1); }
}

/* --- 2. Zauberlaterne: erst die Flamme, dann der Kristall ----------- */
.zauberelement[data-zauber-art="licht"].ist-bewegt .zauberelement-schein,
.zauberelement[data-zauber-art="laterne"].ist-bewegt .zauberelement-schein:not(.zauberelement-schein--zwei) {
  animation: zauber-flamme 1.4s ease-in-out;
}

.zauberelement[data-zauber-art="laterne"].ist-bewegt .zauberelement-schein--zwei {
  animation: zauber-kristalltropfen 1.5s ease-in-out 0.65s;
}

@keyframes zauber-flamme {
  0%, 100% { opacity: 0;    transform: scale(0.7); }
  22%      { opacity: 0.85; transform: scale(1.04); }
  55%      { opacity: 1;    transform: scale(1.14); }
}

@keyframes zauber-kristalltropfen {
  0%, 100% { opacity: 0;    transform: scale(0.6); }
  30%      { opacity: 0.9;  transform: scale(1.05); }
  62%      { opacity: 0.95; transform: scale(1.15); }
}

/* --- 3. Traumblume: die Bluete hebt sich einmal --------------------- */
.zauberelement[data-zauber-art="bluete"].ist-bewegt .zauberelement-bild {
  animation: zauber-bluete 1.5s ease-in-out;
}

/* Der Drehpunkt sitzt unten am Stiel (--z-dreh): So hebt und oeffnet
   sich die Bluete, statt als Ganzes zu wachsen. */
@keyframes zauber-bluete {
  0%   { transform: translateY(0)      scale(1); }
  30%  { transform: translateY(-2.5%)  scale(1.035); }
  55%  { transform: translateY(-3.5%)  scale(1.05); }
  80%  { transform: translateY(-1%)    scale(1.015); }
  100% { transform: translateY(0)      scale(1); }
}

.zauberelement[data-zauber-art="bluete"].ist-bewegt .zauberelement-schein {
  animation: zauber-bluetenmitte 1.4s ease-in-out 0.3s;
}

@keyframes zauber-bluetenmitte {
  0%, 100% { opacity: 0;    transform: scale(0.6); }
  35%      { opacity: 0.95; transform: scale(1.06); }
  65%      { opacity: 0.85; transform: scale(1.16); }
}

/* --- 4. Herzlicht-Kristall: ein Lichtband wandert hindurch ----------
   Das Band ist auf die Form des Kristalls MASKIERT (die PNG-Datei
   selbst dient als Maske, --z-maske). Dadurch bleibt der Schein genau
   im Stein und laeuft nicht als Rechteck darueber hinaus. Wo Masken
   fehlen, entfaellt das Band ersatzlos -- Herzschlag und Botschaft
   bleiben. */
.zauberelement-schleier {
  position: absolute;
  inset: 0;
  overflow: hidden;
  pointer-events: none;
  -webkit-mask-image: var(--z-maske);
          mask-image: var(--z-maske);
  -webkit-mask-size: 100% 100%;
          mask-size: 100% 100%;
  -webkit-mask-repeat: no-repeat;
          mask-repeat: no-repeat;
}

@supports not ((-webkit-mask-image: url("a.png")) or (mask-image: url("a.png"))) {
  .zauberelement-schleier { display: none; }
}

.zauberelement-schleier-band {
  position: absolute;
  left: -12%;
  right: -12%;
  top: 0;
  height: 62%;
  opacity: 0;
  background: linear-gradient(to bottom,
    rgba(255, 255, 255, 0) 0%,
    rgba(255, 244, 214, 0.8) 42%,
    rgba(206, 150, 255, 0.7) 66%,
    rgba(255, 255, 255, 0) 100%);
  mix-blend-mode: screen;
}

.zauberelement[data-zauber-art="kristall"].ist-bewegt .zauberelement-schleier-band {
  animation: zauber-lichtwanderung 1.6s ease-in-out 0.3s;
}

@keyframes zauber-lichtwanderung {
  0%   { opacity: 0;    transform: translateY(118%); }
  22%  { opacity: 0.95; }
  76%  { opacity: 0.9; }
  100% { opacity: 0;    transform: translateY(-108%); }
}

/* Wer Bewegung reduziert haben moechte, bekommt bei diesen vier
   Figuren nur die Botschaft -- ohne Herzschlag, Flamme, Bluetenheben
   und Lichtband. Die Bildbewegung und die Funken sind schon weiter
   oben fuer alle Figuren abgeschaltet. */
@media (prefers-reduced-motion: reduce) {
  .zauberelement[data-zauber-art="herzbaum"] .zauberelement-schein,
  .zauberelement[data-zauber-art="briefkasten"] .zauberelement-schein,
  .zauberelement[data-zauber-art="licht"] .zauberelement-schein,
  .zauberelement[data-zauber-art="laterne"] .zauberelement-schein,
  .zauberelement[data-zauber-art="bluete"] .zauberelement-schein,
  .zauberelement[data-zauber-art="kristall"] .zauberelement-schein,
  .zauberelement[data-zauber-art="kristall"] .zauberelement-schleier-band {
    animation: none !important;
  }

  .zauberelement[data-zauber-art="kristall"] .zauberelement-schleier { display: none; }
}

/* Der anklickbare Briefkasten auf "Post nach Lumaria".

   Die Huelle uebernimmt genau die Masze, die das Bild vorher allein
   hatte -- die umgebende Stelle bleibt dadurch unveraendert gross. Das
   ist wichtig, weil das Skript der Seite an ihr misst, wohin der Brief
   fliegen soll. */
.zauberelement--briefkasten {
  width: 100%;
  max-width: 300px;
}

/* Unter dem Briefkasten bleibt dauerhaft ein Streifen frei: Genau dort
   geht die Botschaft auf. Ohne ihn haette sie auf dem Hinweistext
   darunter gelegen. Weil der Platz immer da ist, verschiebt sich beim
   Aufgehen nichts -- und die Masze der Stelle selbst bleiben gleich,
   ein Aussenabstand zaehlt nicht zu ihrem Kasten (das Skript der Seite
   misst daran, wohin der Brief fliegt). */
.post-lumaria-mailbox-wrap {
  margin-bottom: 5.6rem;
}

/* =====================================================================
   VIER ENTDECKUNGEN IN EMMAS ZIMMER (Gratis-Schatztruhe)
   ---------------------------------------------------------------------
   Nachttischlampe, Mond im Fenster, Glas mit Leuchtkaefern und die
   Laterne im Regal sind in das Hintergrundbild gemalt. Sie koennen sich
   deshalb nicht bewegen -- was moeglich ist und hier passiert: Genau an
   ihrer Stelle liegt eine unsichtbare runde Flaeche; beim Antippen
   leuchtet dort ein warmer Schein auf, ein paar Funken steigen, dann
   kommt die Botschaft. Das Bild selbst bleibt unangetastet.

   Die Lage steht in Prozent der Bildbuehne. Das stimmt genau, solange
   die Buehne das Seitenverhaeltnis des Bildes hat (1536:1024) -- auf
   breiten Bildschirmen ist das so. */

.zauberelement--punkt {
  position: absolute;
  left: var(--z-links, 50%);
  top: var(--z-oben, 50%);
  /* Nie kleiner als eine Fingerkuppe: Auf dem Handy waeren 9 Prozent
     des Bildes nur 29 Punkte -- zu wenig zum Treffen. */
  width: max(var(--z-punkt, 9%), 46px);
  /* Der Punkt sitzt MIT SEINER MITTE auf dem gemalten Licht, nicht mit
     seiner Ecke -- sonst muesste man die halbe Breite von Hand
     abziehen. */
  translate: -50% -50%;
  aspect-ratio: 1;
  z-index: 3;
  line-height: 0;
}

.zauberelement-knopf--punkt {
  box-sizing: border-box;
  display: block;
  width: 100%;
  height: 100%;
  padding: 0;
  margin: 0;
  border: 0;
  border-radius: 50%;
  background: none;
  cursor: pointer;
  pointer-events: auto;
  -webkit-tap-highlight-color: transparent;
}

.zauberelement-knopf--punkt:focus-visible {
  outline: 3px solid var(--color-gold-light);
  outline-offset: 2px;
  border-radius: 50%;
}

/* Der Schein fuellt die runde Flaeche ganz aus. */
.zauberelement--punkt .zauberelement-schein {
  left: 50%;
  top: 50%;
  width: 100%;
}

.zauberelement--punkt .zauberelement-funken {
  --funken-links: 50%;
  --funken-oben: 50%;
}

/* Jede Botschaft geht dorthin auf, wo Platz ist: Schluesselfeld und
   Truhe duerfen nicht verdeckt werden. Deshalb sind Richtung und
   Ausrichtung je Stelle einstellbar. */
.zauberelement--punkt .zauberelement-botschaft {
  left: var(--bot-links, 50%);
  right: var(--bot-rechts, auto);
  translate: var(--bot-schub, -50%);
  top: var(--bot-oben, calc(100% + 0.5rem));
  bottom: var(--bot-unten, auto);
  width: var(--z-nachricht, 13rem);
  max-width: var(--z-nachricht, 13rem);
  font-size: 0.88rem;
}


/* --- Die geschlossene Truhe zum Antippen ---------------------------
   Die Stelle deckt sich genau mit dem Truhenbild (dieselbe Verankerung
   und dasselbe Seitenverhaeltnis), damit der Schein wirklich auf dem
   Herzschloss sitzt. Sie liegt VOR den Truhenbildern im Text, deshalb
   kann die Bewegung per ~ an das geschlossene Bild weitergereicht
   werden -- das Bild selbst bleibt unveraendert. */
.zauberelement--truhe {
  left: 54%;
  top: 87%;
  width: 32%;
  aspect-ratio: 1536 / 1024;
  translate: -50% -100%;
}

.zauberelement-knopf--truhe {
  border-radius: 18px;
}

.zauberelement-knopf--truhe:focus-visible {
  border-radius: 18px;
}

/* Die Botschaft geht unter der Truhe auf, auf dem Teppich -- dort steht
   nichts. */
.zauberelement--truhe .zauberelement-botschaft {
  left: 50%;
  right: auto;
  translate: -50%;
  top: calc(100% + 0.5rem);
  bottom: auto;
}

/* Ein sanftes Wiegen um die Standflaeche, kein Huepfen. Es laeuft ueber
   die Eigenschaft rotate und nicht ueber transform -- transform traegt
   hier die Verankerung der Truhe (translate -50%/-100%) und darf nicht
   ueberschrieben werden. */
.zauberelement--truhe.ist-bewegt ~ .schatztruhe-chest-closed {
  transform-origin: 50% 100%;
  animation: truhe-wiegen 1.5s ease-in-out;
}

@keyframes truhe-wiegen {
  0%, 100% { rotate: 0deg; }
  18%      { rotate: -2.1deg; }
  42%      { rotate: 1.8deg; }
  66%      { rotate: -1deg; }
  84%      { rotate: 0.5deg; }
}

/* Nach dem Freischalten gibt es nichts mehr zu wecken. */
.schatztruhe-scene.is-unlocking .zauberelement--truhe,
.schatztruhe-scene.is-unlocked .zauberelement--truhe {
  display: none;
}

.zauberelement[data-zauber-art="truhe"].ist-bewegt .zauberelement-schein {
  animation: zauber-herzschlag 1.9s ease-in-out;
}

@media (prefers-reduced-motion: reduce) {
  .zauberelement--truhe.ist-bewegt ~ .schatztruhe-chest-closed { animation: none; }
  .zauberelement[data-zauber-art="truhe"] .zauberelement-schein { animation: none !important; }
}

/* --- Die drei Schaetze nach dem Oeffnen -----------------------------
   Sie hoben sich schon beim Ueberfahren mit der Maus. Neu ist ein
   kurzes Funkeln und dieselbe Reaktion beim Antippen -- auf dem Handy
   gibt es kein "Ueberfahren", dort passierte bisher gar nichts. Der
   Klick selbst (Download bzw. Auswahl) ist unveraendert. */
.schatztruhe-treasure-link {
  position: relative;
}

.schatztruhe-treasure-link:active {
  transform: translateY(-4px) scale(1.04);
  filter: drop-shadow(0 8px 16px rgba(217, 169, 79, 0.45));
}

.schatztruhe-treasure-link::after {
  content: "";
  position: absolute;
  left: 50%;
  top: 12%;
  width: 26%;
  aspect-ratio: 1;
  translate: -50% 0;
  border-radius: 50%;
  background: radial-gradient(circle,
    rgba(255, 252, 240, 0.95) 0%,
    rgba(255, 216, 130, 0.7) 32%,
    rgba(238, 175, 64, 0) 70%);
  opacity: 0;
  pointer-events: none;
  mix-blend-mode: screen;
}

.schatztruhe-treasure-link:hover::after,
.schatztruhe-treasure-link:focus-visible::after,
.schatztruhe-treasure-link:active::after {
  animation: schatz-funkeln 0.9s ease-out;
}

@keyframes schatz-funkeln {
  0%   { opacity: 0;    transform: scale(0.5); }
  30%  { opacity: 0.95; }
  100% { opacity: 0;    transform: scale(1.35); }
}

@media (prefers-reduced-motion: reduce) {
  .schatztruhe-treasure-link::after { display: none; }
}

/* --- Wohin die Botschaften auf schmalen Bildschirmen aufgehen -------
   Das Zimmer ist dort nur noch gut 300 Punkte breit. Eine Botschaft,
   die immer mittig unter ihrer Stelle aufgeht, laeuft dann am Rand aus
   dem Bild und unten auf das Schluesselfeld. Deshalb traegt jede Stelle
   ihre Richtung bei sich:

     data-zauber-rand="links"   -> geht nach rechts auf
     data-zauber-rand="rechts"  -> geht nach links auf
     data-zauber-hoch="ja"      -> geht nach oben auf
     ohne Angabe                -> mittig darunter

   Nachgemessen bei 375 und 438 Punkten: So bleibt jede vollstaendig im
   Bild und keine beruehrt das Schluesselfeld. */
@media (max-width: 900px) {
  .zauberelement--punkt .zauberelement-botschaft,
  .zauberelement--truhe .zauberelement-botschaft {
    left: 50%;
    right: auto;
    translate: -50%;
    top: calc(100% + 0.4rem);
    bottom: auto;
    width: min(64vw, 12.5rem);
    max-width: min(64vw, 12.5rem);
    font-size: 0.84rem;
  }

  .zauberelement--punkt[data-zauber-rand="links"] .zauberelement-botschaft {
    left: 0;
    right: auto;
    translate: 0;
  }

  .zauberelement--punkt[data-zauber-rand="rechts"] .zauberelement-botschaft {
    left: auto;
    right: 0;
    translate: 0;
  }

  .zauberelement--punkt[data-zauber-hoch="ja"] .zauberelement-botschaft {
    top: auto;
    bottom: calc(100% + 0.4rem);
  }
}
