/* ============================================================
   Helix-Lager — Gestaltung
   ------------------------------------------------------------
   Die Oberflaeche soll wie ein Geraet wirken, nicht wie ein
   Formular mit Farbe: dunkles Metall, Messingkante, Innentiefe,
   oben ein Lichtsaum, unten ein Sockelschatten. Alles rein in
   CSS — keine Bilddatei, keine Netzschrift, kein Bauwerkzeug.

   Farbwelt aus Project.md ("UI-Sprache der ersten Mockups"):
   warme Terrakotta-, Honig- und Rosttoene gegen Blattgruen,
   Wasser-Tuerkis und Solarblau. Kein Neon, kein Hochglanz.
   ============================================================ */

:root{
  color-scheme:dark;

  /* --- Grundtoene: dunkles Petrol statt Neutralgrau --------- */
  --tief:#070c0d;            /* Nischenboden, Balkenbett        */
  --grund:#0f1819;           /* tiefster Seitengrund            */
  --grund-hoch:#1a2523;      /* oberer Seitengrund (Verlauf)    */

  /* --- Metall der Bauteile ---------------------------------- */
  --flaeche:#23302b;         /* Fuellung mittig                 */
  --flaeche-hoch:#31423a;    /* Fuellung oben (Lichtseite)      */
  --flaeche-tief:#17221f;    /* Fuellung unten (Schattenseite)  */
  --rand:#48584c;            /* alte Kantenfarbe, bleibt erhalten */
  --kante:#0a1110;           /* dunkle Aussenfase               */
  --kante-licht:rgba(255,231,183,.17);

  /* --- Messing, Rost, Wasser -------------------------------- */
  --messing:#c8a24e;
  --messing-hell:#f2d79c;
  --messing-tief:#6d5527;
  --rost:#b96b3c;
  --tuerkis:#6fa8a0;

  /* --- Schrift ---------------------------------------------- */
  --schrift:#f0e8d6;
  --gedimmt:#93a394;
  --warn:#d98b8b;

  /* Keine Netzschrift: die Rangfolge kommt aus Groesse, Gewicht,
     Sperrung, Versalien und Farbe. Der Serifenstapel ist reine
     Systemware und faellt ueberall auf etwas Warmes zurueck. */
  --serif:"Iowan Old Style","Palatino Linotype",Palatino,"Book Antiqua",Georgia,"Times New Roman",serif;
  --sans:system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;

  --sicher-unten:env(safe-area-inset-bottom,0px);

  /* --- Angeschraegte Ecken ---------------------------------- */
  --fase:9px;
  --ecken:polygon(
    var(--fase) 0, calc(100% - var(--fase)) 0,
    100% var(--fase), 100% calc(100% - var(--fase)),
    calc(100% - var(--fase)) 100%, var(--fase) 100%,
    0 calc(100% - var(--fase)), 0 var(--fase));

  /* --- Das Material: einmal beschrieben, ueberall benutzt ----
     Statt "1px border + border-radius" liegen hier mehrere
     Schattenlagen uebereinander: Lichtsaum oben innen, dunkle
     Innenfase, Tiefe nach unten, Messingkante aussen, Sockel
     und ein weicher Wurf darunter. */
  --bauteil-fuellung:linear-gradient(180deg,
    var(--flaeche-hoch) 0, var(--flaeche) 46%, var(--flaeche-tief) 100%);
  --bauteil-schatten:
    inset 0 1px 0 var(--kante-licht),
    inset 0 0 0 1px rgba(0,0,0,.45),
    inset 0 -12px 16px -12px rgba(0,0,0,.75),
    0 0 0 1px var(--messing-tief),
    0 2px 0 rgba(0,0,0,.5),
    0 6px 12px -6px rgba(0,0,0,.6);
  --bauteil-gedrueckt:
    inset 0 3px 6px rgba(0,0,0,.7),
    inset 0 0 0 1px rgba(0,0,0,.55),
    0 0 0 1px var(--messing-tief);

  /* Nische: eigener Grund fuer alles, was ausgestellt wird
     (Kreatursprite, Ei). Tief eingelassen, Messingfalz. */
  --nische-grund:
    radial-gradient(78% 66% at 50% 30%,rgba(214,158,74,.17),transparent 72%),
    linear-gradient(180deg,#121c1a 0,#0a1211 62%,#0e1817 100%);
  --nische-schatten:
    inset 0 3px 7px rgba(0,0,0,.8),
    inset 0 0 0 1px rgba(0,0,0,.75),
    inset 0 0 0 2px rgba(200,162,78,.26),
    inset 0 -14px 18px -14px rgba(0,0,0,.6),
    0 1px 0 rgba(255,231,183,.10);

  /* Feine Koernung als Data-URI-SVG. Nimmt den grossen Flaechen das
     Digitale, ohne eine einzige Bilddatei zu kosten. Die Deckkraft
     steckt im Bild selbst, weil eine Hintergrundlage keine eigene
     bekommen kann — und sie muss klein bleiben: feTurbulence liefert
     mittelgraues Rauschen, das eine dunkle Flaeche sonst anhebt,
     statt sie nur aufzurauhen. */
  --koernung:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='k'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='160' height='160' filter='url(%23k)' opacity='.055'/%3E%3C/svg%3E");
}

*{box-sizing:border-box;margin:0;padding:0;}

/* Das hidden-Attribut muss staerker sein als jede eigene display-Regel.
   Der Browser gibt [hidden] nur ein display:none aus seinem eigenen
   Stylesheet — und jede Regel dieser Datei schlaegt das, unabhaengig von
   der Spezifitaet. Ohne diese Zeile blieb das zugeklappte Labor
   (#brut-labor, display:grid) vollstaendig stehen, waehrend der Knopf
   daneben "Labor oeffnen" anbot. Einmal hier statt je Element. */
[hidden]{display:none !important;}

/* --- Atmosphaere statt flachem Grund -------------------------
   Vier Lagen: Koernung, ein warmer Schein oben (das Honiglicht
   der Welt), ein kuehler Wasserschein unten und darunter der
   Petrolverlauf. Der Grund ist damit nirgends zweimal derselbe. */
body{
  background:
    var(--koernung),
    radial-gradient(120% 62% at 50% -8%,rgba(198,138,64,.20) 0,transparent 62%),
    radial-gradient(90% 55% at 50% 108%,rgba(24,74,74,.28) 0,transparent 70%),
    linear-gradient(180deg,var(--grund-hoch) 0,var(--grund) 46%,#0a1213 100%);
  background-attachment:fixed;
  color:var(--schrift);
  font:16px/1.45 var(--sans);
  min-height:100dvh;display:flex;flex-direction:column;
  -webkit-tap-highlight-color:transparent;
}
/* Vignette zu den Raendern: die Ecken sinken weg, die Mitte
   bleibt der Ort. Liegt ueber dem Grund, unter allem Inhalt. */
body::before{
  content:"";position:fixed;inset:0;z-index:0;pointer-events:none;
  background:radial-gradient(118% 88% at 50% 34%,transparent 42%,rgba(0,0,0,.55) 100%);
}
/* main liegt ausdruecklich ueber Kopf und Reiterleiste. Grund: die
   Ueberblendung des Reiterwechsels macht `.ansicht` zu einem eigenen
   Stapelkontext, und die Kreaturenkarte darin (z-index 10) reicht
   deshalb nicht mehr von sich aus ueber die Leisten hinaus. Sie
   ueberlagern einander im Fluss ohnehin nie — die Reihenfolge wirkt
   nur fuer die Vollbildblaetter. */
#kopf,#reiter{position:relative;z-index:1;}
main{position:relative;z-index:2;}

canvas,img{image-rendering:pixelated;}

/* --- Typografie: Rangfolge in vier Stufen -------------------- */
h2{font:700 1.35rem/1.2 var(--serif);letter-spacing:.01em;
   text-shadow:0 1px 0 rgba(0,0,0,.65);}
h3{font:700 1rem/1.25 var(--serif);}

/* Geraetebeschriftung: klein, gesperrt, in Versalien. Wird nur
   dort gesetzt, wo wirklich eine Beschriftung steht — nie auf
   Namen, Meldungen oder Fliesstext (der Bericht und die Titel
   der Kreaturenkarte bleiben deshalb ausdruecklich aussen vor). */
#kopf-rest,#reiter button span,.route h3,.ei-rest,#dex-zaehler,
#karte button,#dex-blatt button,#einstellungen button,#einstellungen-import-knopf,
#reise-frage button,#bericht button,#aufstieg button,
.ansicht > button,.route button,#kopf-reise{
  text-transform:uppercase;letter-spacing:.09em;font-weight:700;
}
/* Zahlen laufen mit fester Breite, damit die Restzeiten beim
   Herunterzaehlen nicht zappeln. */
#kopf-rest,.ei-rest,#dex-zaehler,#brut-vorrat,#brut-wunsch-plan,
.ergebnis,.route,#bericht li{font-variant-numeric:tabular-nums;}

/* ============================================================
   Kopfzeile — ein Blechband ueber der Welt
   ============================================================ */
#kopf{
  display:flex;align-items:center;gap:.45rem;
  padding:.55rem .7rem;
  background:linear-gradient(180deg,#2c3a35 0,#1d2825 55%,#131c1a 100%);
  border:0;
  box-shadow:
    inset 0 1px 0 rgba(255,231,183,.13),
    0 1px 0 var(--messing-tief),
    0 2px 0 rgba(0,0,0,.6),
    0 8px 18px -8px rgba(0,0,0,.7);
}
/* Der Halteplatzname darf schrumpfen und notfalls kuerzen — die
   Kopfzeile ist schmal, und "Schwarzwasserbecken" neben zwei Knoepfen
   sprengte sie sonst. Die Knoepfe schrumpfen nicht: sie sind
   Beruehrungsflaechen. */
/* Lange Namen wie "Schwarzwasserbecken" schrumpfen, statt abgeschnitten zu
   werden: der Halteplatz ist die wichtigste Angabe der Kopfzeile, und ein
   "Schwarzwa..." sagt weniger als dieselbe Zeile zwei Punkt kleiner. */
#kopf-region[data-lang="ja"]{font-size:.92rem;letter-spacing:0;}
#kopf-region{
  font:700 1.02rem/1.15 var(--serif);
  color:var(--schrift);letter-spacing:.005em;
  text-shadow:0 1px 0 rgba(0,0,0,.7),0 0 14px rgba(200,162,78,.22);
  flex:0 1 auto;min-width:0;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
/* Die Restzeit bekommt eine feste Spalte und bricht darin auf zwei
   Zeilen um — nur so bleibt daneben Platz fuer den Halteplatznamen.
   Die beiden Knoepfe schrumpfen nie: sie sind Beruehrungsflaechen. */
/* Name und Restzeit stehen uebereinander statt nebeneinander. Nebeneinander
   blieben fuer "Schwarzwasserbecken" neben Zaehler und zwei Knoepfen keine
   zwanzig Zeichen uebrig — gestapelt hat der Name die volle Breite, und die
   Kopfzeile wird davon nicht hoeher, weil sie ohnehin zwei Zeilen hoch ist. */
#kopf-ort{flex:1 1 auto;min-width:0;display:flex;flex-direction:column;gap:.1rem;}
#kopf-rest{width:auto;}
#kopf-einstellungen,#kopf-reise{flex:0 0 auto;}
/* Restzeit rechtsbuendig und klein: sie steht zwischen Halteplatz
   und den beiden Knoepfen und darf die schmale Kopfzeile nicht
   sprengen. */
#kopf-rest{
  color:var(--gedimmt);
  font-size:.6rem;line-height:1.2;text-align:left;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}

main{
  flex:1;overflow-y:auto;overscroll-behavior:contain;
  scrollbar-width:thin;scrollbar-color:var(--messing-tief) transparent;
}
/* Reiterwechsel blendet ueber. Bewusst nur `opacity`: eine
   Transformation machte die Ansicht zum Bezugsrahmen fuer die
   fest positionierte Kreaturenkarte darin — und sie ist billig
   genug fuer die 950 Helixdex-Felder. */
.ansicht{padding:.8rem;position:relative;animation:ansicht-ein .24s ease-out both;}
@keyframes ansicht-ein{from{opacity:0;}to{opacity:1;}}

/* Der warme Schein, der frueher hinter dem schmalen Biom-Band lag, ist
   an das Panorama selbst gewandert (dessen box-shadow weiter unten):
   die Szene fuellt jetzt gut zwei Fuenftel des Bildschirms und traegt
   ihr Licht selbst nach unten in die Seite. */
.ansicht > *{position:relative;z-index:1;}

/* ============================================================
   Reiterleiste — der offene Reiter leuchtet
   ============================================================ */
#reiter{
  display:grid;grid-template-columns:repeat(4,1fr);
  background:linear-gradient(180deg,#1c2724 0,#121b19 60%,#0c1413 100%);
  padding-bottom:var(--sicher-unten);
  box-shadow:
    0 -1px 0 var(--messing-tief),
    0 -2px 0 rgba(0,0,0,.6),
    0 -10px 20px -10px rgba(0,0,0,.8);
}
#reiter button,#kopf-reise{
  min-height:44px;border:0;background:transparent;color:var(--gedimmt);
  font-family:inherit;cursor:pointer;
}
/* Symbol ueber der Beschriftung. Die Hoehe von 44 Pixeln bleibt
   die Beruehrungsflaeche, das Symbol waechst nicht ueber sie
   hinaus. */
#reiter button{
  position:relative;isolation:isolate;
  display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:.15rem;padding:.35rem 0 .3rem;font-size:.58rem;
}
/* Die Schriftfarbe wechselt hart, nicht weich: sie ist der Zustand
   ("dieser Reiter ist offen"), und ein Uebergang machte ihn fuer
   ein Fuenftel einer Sekunde mehrdeutig — waehrend der Blende trugen
   zwei Reiter fast dieselbe Farbe. Die Bewegung leistet stattdessen
   der Schein darunter und der Lichtstab darueber. */
#reiter svg{
  width:21px;height:21px;fill:none;stroke:currentColor;
  stroke-width:1.35;stroke-linecap:round;stroke-linejoin:round;
  transition:transform .12s ease;
}
/* Der Schein liegt hinter dem Symbol (z-index -1 im eigenen
   Stapel), nie darueber — sonst schluckte er die Beschriftung. */
#reiter button::before{
  content:"";position:absolute;inset:0;z-index:-1;pointer-events:none;
  opacity:0;transition:opacity .25s ease;
  background:
    radial-gradient(62% 118% at 50% 118%,rgba(200,162,78,.34) 0,transparent 72%),
    linear-gradient(180deg,rgba(200,162,78,.10) 0,transparent 60%);
}
#reiter button[aria-current="true"]::before{opacity:1;}
/* Messing-Lichtstab an der Oberkante des offenen Reiters. */
#reiter button[aria-current="true"]::after{
  content:"";position:absolute;left:20%;right:20%;top:0;height:2px;
  pointer-events:none;border-radius:1px;
  background:linear-gradient(90deg,transparent,var(--messing-hell),transparent);
  box-shadow:0 0 8px rgba(200,162,78,.85);
}
#reiter button[aria-current="true"]{color:var(--messing-hell);}
#reiter button[aria-current="true"] svg{
  filter:drop-shadow(0 0 5px rgba(242,215,156,.55));
}
#reiter button:active svg{transform:translateY(1px);}

/* ============================================================
   Bauteile — Knoepfe, Felder, Kacheln
   ------------------------------------------------------------
   Eine gemeinsame Materialbeschreibung fuer alles, was gedrueckt
   oder gelesen wird. Die Selektorenliste ist lang, weil die
   Ansichten ihre Elemente ohne eigene Klassen bauen; keiner der
   vorhandenen Namen wird dabei angetastet.
   ============================================================ */
#kopf-einstellungen,#kopf-reise,
#karte button,#karte input,#dex-blatt button,
.ansicht select,.ansicht > button,
.route select,.route button,
#einstellungen button,#einstellungen input,#einstellungen-import-knopf,
#reise-frage button,#bericht button,#aufstieg button,
.ergebnis,#brut-wunsch-plan,#bericht li{
  background:var(--bauteil-fuellung);
  border:1px solid var(--kante);
  border-top-color:#44584e;
  border-radius:.35rem;
  box-shadow:var(--bauteil-schatten);
  color:var(--schrift);
  font-family:inherit;font-size:.9rem;
  transition:transform .09s ease,box-shadow .09s ease,
             background-color .15s ease,color .15s ease;
}
/* Druckfeedback: zwei Pixel Versatz, Wurf weg, Kante dunkler.
   Ohne das fuehlt sich jede Beruehrung wie ein Klick ins Leere an. */
#kopf-einstellungen:active,#kopf-reise:active,
#karte button:active,#dex-blatt button:active,
.ansicht > button:active,.route button:active,
#einstellungen button:active,#reise-frage button:active,
#bericht button:active,#aufstieg button:active{
  transform:translateY(2px);
  box-shadow:var(--bauteil-gedrueckt);
  background:linear-gradient(180deg,var(--flaeche-tief) 0,#131d1a 100%);
}
button:disabled{
  color:var(--gedimmt);opacity:.6;cursor:default;
  box-shadow:var(--bauteil-gedrueckt);transform:none;
}
:focus-visible{outline:2px solid var(--messing-hell);outline-offset:2px;}

/* Auswahlfelder tragen einen eigenen Messingpfeil statt des
   Systemdreiecks — sonst faellt genau dort die Materialsprache
   auseinander. */
.ansicht select,.route select{
  appearance:none;-webkit-appearance:none;
  padding:.55rem 2.1rem .55rem .7rem;text-align:left;
  background-image:
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 8'%3E%3Cpath d='M1 1.6 L6 6.4 L11 1.6' fill='none' stroke='%23c8a24e' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E"),
    var(--bauteil-fuellung);
  background-repeat:no-repeat,no-repeat;
  background-position:right .75rem center,0 0;
  background-size:11px auto,auto;
}
option{background:#18231f;color:var(--schrift);}

/* ============================================================
   Lager — die Szene ist der Bildschirm
   ============================================================ */
/* Die Biom-Hintergruende sind gemalte Illustrationen, keine
   Pixelgrafik. Deshalb hier ausdruecklich KEIN
   image-rendering:pixelated — hart skaliert wuerden die weichen
   Pinselflaechen krisselig. Die Pixelgrafik davor (Lagerbild und
   Kreaturen) liegt auf der Zeichenflaeche und behaelt es.

   Die Szene ist die Hauptflaeche des Bildschirms, kein Briefmarken-
   band: gut zwei Fuenftel der sichtbaren Hoehe, oben ohne Absatz an
   der Kopfzeile und ueber die volle Breite. Die negativen Raender
   heben genau die Polsterung der Ansicht auf — die Zeile wird damit
   so breit wie `main` und erzeugt keinen Querlauf. */
.ansicht[data-view="lager"]{padding-top:0;}
#lager-panorama{
  position:relative;
  height:clamp(200px,42dvh,420px);
  margin:0 -.8rem .85rem;border:0;
  /* Oben bricht die Szene glatt an der Kopfzeile ab, unten rundet sie
     sich — deshalb hier keine Fase (clip-path), sondern ein Radius.
     Ein clip-path schnitte ausserdem den Lichtwurf nach unten weg. */
  clip-path:none;border-radius:0 0 1.05rem 1.05rem;
  background-size:cover;background-position:center;
  image-rendering:auto;overflow:hidden;
  /* Das Licht der Kulisse blutet nach unten in die Seite aus, statt an
     der Kante abzubrechen. */
  box-shadow:
    0 16px 34px -16px rgba(226,163,79,.30),
    0 2px 0 rgba(8,14,13,.85);
}
/* Ein Vordergrundband als Lagerboden. Die zehn Biome sind gemalte
   Landschaften mit voellig verschiedenem unterem Rand — beim
   Schwarzwasserbecken steht dort Wasser, beim Voralpenbogen Geroell. Ohne
   eigenen Boden stuenden Lager und Kreaturen mal am Ufer, mal darin. Die
   16 % stehen als `BAND` auch in view-lager.js: die Oberkante dieses
   Bandes IST die Grundlinie, auf der das Lagerbild sitzt. Wer die eine
   Zahl aendert, aendert die andere mit. */
#lager-panorama::before{
  content:"";position:absolute;left:0;right:0;bottom:0;height:16%;z-index:1;
  background:linear-gradient(180deg,
    rgba(56,66,46,0) 0,rgba(48,58,40,.78) 34%,rgba(23,30,22,.97) 100%);
  /* Nur ein Hauch Kante: eine kraeftige Linie quer durch eine gemalte
     Landschaft liest sich als Fehler, nicht als Boden. */
  box-shadow:inset 0 1px 0 rgba(200,162,78,.09);
  pointer-events:none;
}
/* Lagerbild und Kreaturen liegen als eine Flaeche vor der gemalten
   Kulisse. Hier gilt wieder image-rendering:pixelated (geerbt), denn
   das ist echte Pixelgrafik - anders als der Hintergrund darunter. */
#lager-kreaturen{
  /* Ueber dem Lagerboden: Zelt und Tiere stehen darauf, nicht dahinter. */
  position:absolute;inset:0;width:100%;height:100%;pointer-events:none;z-index:2;
}
/* Erste Atmosphaerelage: das Feuer im Lagerbild flackert. Ein weicher
   warmer Lichtfleck, dessen Deckkraft und Groesse langsam schwanken.
   view-lager.js setzt nur den Mittelpunkt (und nur, wenn er sich wirklich
   verschoben hat) — die Bewegung leistet die CSS-Animation und kostet
   den Bildlauf deshalb nichts. */
.lager-feuer{
  position:absolute;z-index:3;pointer-events:none;
  width:118px;height:118px;margin:-59px 0 0 -59px;border-radius:50%;
  background:radial-gradient(50% 50% at 50% 50%,
    rgba(255,205,120,.62) 0,rgba(233,143,55,.34) 34%,
    rgba(184,86,28,.13) 60%,transparent 78%);
  mix-blend-mode:screen;opacity:.5;
  animation:lager-feuer 3.9s ease-in-out infinite;
}
@keyframes lager-feuer{
  0%  {opacity:.50;transform:scale(1);}
  16% {opacity:.74;transform:scale(1.06);}
  31% {opacity:.44;transform:scale(.96);}
  49% {opacity:.82;transform:scale(1.09);}
  66% {opacity:.54;transform:scale(1.01);}
  83% {opacity:.68;transform:scale(1.05);}
  100%{opacity:.50;transform:scale(1);}
}
@media (prefers-reduced-motion:reduce){
  .lager-feuer{animation:none;opacity:.6;}
}
/* Zweite Atmosphaerelage: ein Dunstschleier, der die gemalte Kulisse mit
   den Pixelfiguren davor verbindet — Licht von oben, ein kuehler Schleier
   auf halber Hoehe, Dunkel im Vordergrund. Mehr nicht: zwei gute Lagen
   schlagen fuenf mittelmaessige. */
.lager-dunst{
  position:absolute;inset:0;z-index:4;pointer-events:none;
  background:
    radial-gradient(115% 55% at 50% 2%,rgba(255,228,176,.17) 0,transparent 62%),
    linear-gradient(180deg,rgba(198,216,208,.10) 0,rgba(140,168,158,.05) 38%,transparent 58%),
    linear-gradient(0deg,rgba(9,15,13,.50) 0,rgba(9,15,13,.14) 18%,transparent 38%);
}
/* Fassung und Vignette liegen ueber allem, damit die Szene einen Rand
   hat und nicht ausfranst. */
#lager-panorama::after{
  content:"";position:absolute;inset:0;pointer-events:none;z-index:5;
  border-radius:inherit;
  box-shadow:
    inset 0 0 0 1px rgba(200,162,78,.22),
    inset 0 0 0 2px rgba(8,14,13,.6),
    inset 0 14px 26px -20px rgba(0,0,0,.55),
    inset 0 -26px 34px -26px rgba(0,0,0,.5);
}

#lager-slots{display:grid;grid-template-columns:repeat(2,1fr);gap:.5rem;}
/* Der Slot ist ein eingefasstes Bauteil: aussen die Messing-
   fassung (der Verlauf des Elements selbst), innen die Fuellung
   als ::before mit z-index -1 — es liegt damit ueber dem Rahmen,
   aber unter Sprite, Namen und Balken. `filter` traegt den
   Sockelschatten, der bei clip-path sonst verloren ginge, und
   macht das Element zugleich zum eigenen Stapelkontext.

   Flach und quer statt hoch und gestapelt: die Szene oben nimmt gut
   zwei Fuenftel des Bildschirms, der Rest muss zusammenruecken. Bild
   links, Name und die zwei Balken rechts daneben — mehr braucht ein
   Slot nicht. Die Beruehrungsflaeche bleibt mit rund 80 Punkten weit
   ueber den geforderten 44. */
.slot{
  position:relative;isolation:isolate;
  min-height:76px;display:flex;flex-direction:row;
  align-items:center;justify-content:flex-start;gap:.6rem;
  clip-path:var(--ecken);
  background:linear-gradient(180deg,#8a6d38 0,#4a3d26 38%,#1b2521 100%);
  color:var(--schrift);font-family:inherit;padding:.5rem .6rem;cursor:pointer;
  filter:drop-shadow(0 3px 5px rgba(0,0,0,.55));
  transition:transform .1s ease,filter .1s ease;
}
/* Name und die beiden Balken als eigene Spalte neben der Nische. Sie
   duerfen schrumpfen (min-width:0), sonst sprengte ein langer Name die
   Kachel, statt darin zu kuerzen. */
.slot-text{
  flex:1 1 auto;min-width:0;
  display:flex;flex-direction:column;justify-content:center;gap:.34rem;
}
.slot::before{
  content:"";position:absolute;inset:2px;z-index:-1;pointer-events:none;
  clip-path:var(--ecken);
  background:var(--bauteil-fuellung);
  box-shadow:
    inset 0 1px 0 var(--kante-licht),
    inset 0 -16px 20px -14px rgba(0,0,0,.8);
}
.slot:active{transform:translateY(2px);filter:drop-shadow(0 1px 2px rgba(0,0,0,.6));}
.slot.leer{
  justify-content:center;color:var(--gedimmt);
  font-size:.62rem;letter-spacing:.14em;text-transform:uppercase;
}
/* Ein leeres Fach ist eine leere Bucht: die Messingfassung tritt
   zurueck, der Grund liegt tiefer. */
.slot.leer{
  background:linear-gradient(180deg,#4b4028 0,#2a2c22 38%,#161e1c 100%);
  filter:drop-shadow(0 2px 3px rgba(0,0,0,.45));
}
.slot.leer::before{
  background:linear-gradient(180deg,#151f1c 0,#0f1816 100%);
  box-shadow:inset 0 3px 9px rgba(0,0,0,.7),inset 0 0 0 1px rgba(0,0,0,.55);
}
.slot.beschaeftigt{opacity:.62;}
.slot-name{
  font-size:.82rem;font-weight:600;color:var(--schrift);
  max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  text-shadow:0 1px 0 rgba(0,0,0,.7);
}

/* Die Kreatur ist der Star: eigene Nische mit Rand und eigenem
   Grund, statt im Nichts zu schweben. */
.slot-nische,.portrait,.ergebnis-nische,.route-nische,.dex-nische{
  position:relative;display:flex;align-items:center;justify-content:center;
  background:var(--nische-grund);
  box-shadow:var(--nische-schatten);
  border-radius:.28rem;
}
.slot-nische{width:64px;height:64px;flex:0 0 auto;}
.portrait{width:112px;height:112px;flex:0 0 auto;border-radius:.4rem;}
/* Dieselbe Nische, nur kleiner: in der Brut-Vorschau stehen vier davon
   untereinander, auf der Routenkarte eine neben dem Aufklappfeld. */
.ergebnis-nische{width:58px;height:58px;flex:0 0 auto;}
.route-nische{width:64px;height:64px;flex:0 0 auto;}
/* Ein Schattenteller unter der Kreatur — er setzt sie auf den
   Boden der Nische, statt sie darin schweben zu lassen. */
.slot-nische::after,.portrait::after,
.ergebnis-nische::after,.route-nische::after,.dex-nische::after{
  content:"";position:absolute;left:20%;right:20%;bottom:7%;height:9%;
  border-radius:50%;pointer-events:none;
  background:radial-gradient(50% 50% at 50% 50%,rgba(0,0,0,.6) 0,transparent 72%);
}
.slot-nische canvas,.portrait canvas,
.ergebnis-nische canvas,.route-nische canvas,
.dex-nische canvas{position:relative;z-index:1;}

/* Balken fuellen sich, sie springen nicht. Die Ansicht setzt die
   Breite erst im naechsten Bild, damit der Uebergang wirklich
   laeuft (view-lager.js). */
.balken{
  width:100%;height:7px;border-radius:3px;overflow:hidden;
  background:linear-gradient(180deg,#050908 0,#0d1412 100%);
  box-shadow:inset 0 1px 3px rgba(0,0,0,.9),
             inset 0 0 0 1px rgba(0,0,0,.6),
             0 1px 0 rgba(255,231,183,.07);
}
.balken i{
  display:block;height:100%;border-radius:3px;
  transition:width .55s cubic-bezier(.22,.61,.36,1);
}
.balken.satt i{
  background:linear-gradient(180deg,var(--messing-hell) 0,var(--messing) 55%,#8a6a2a 100%);
  box-shadow:0 0 7px rgba(200,162,78,.5);
}
.balken.laune i{
  background:linear-gradient(180deg,#9fd6cd 0,var(--tuerkis) 55%,#3d6f69 100%);
  box-shadow:0 0 7px rgba(111,168,160,.45);
}

.gedimmt{color:var(--gedimmt);font-size:.82rem;margin-top:.7rem;}
/* Die Anhaengerzeile unter dem Slotgitter und die Ueberschrift der
   Wunschliste sind Beschriftungen, kein Fliesstext — sie bekommen
   deshalb die Geraetesprache. Hinweissaetze in denselben Ansichten
   behalten ihre Kleinschreibung, sie sind zum Lesen da. */
[data-view="lager"] > .gedimmt,#brut-labor > .gedimmt{
  font-size:.6rem;letter-spacing:.14em;text-transform:uppercase;
  font-weight:700;color:#8c9a8d;
  font-variant-numeric:tabular-nums;
  padding-top:.6rem;border-top:1px solid rgba(200,162,78,.14);
}

/* Kurzes Aufleuchten des Slots nach Fuettern oder Spielen —
   sparsam und unter 600 ms, die App ist fuer kurze Besuche
   gebaut, nicht fuer eine Lightshow. */
.slot.aufleuchten::before{animation:slot-glut .52s ease-out;}
@keyframes slot-glut{
  0%  {box-shadow:inset 0 1px 0 var(--kante-licht),
                  inset 0 0 0 2px rgba(242,215,156,.85),
                  inset 0 0 22px rgba(226,163,79,.55);}
  100%{box-shadow:inset 0 1px 0 var(--kante-licht),
                  inset 0 -16px 20px -14px rgba(0,0,0,.8);}
}
/* Das aufsteigende Zeichen haengt am Koerper, nicht an der Karte:
   die Ansicht baut sich gleich darauf neu auf und raeumte es
   sonst mit weg. */
.wirkung{
  position:fixed;z-index:40;pointer-events:none;
  font:700 1.4rem/1 var(--serif);
  color:var(--messing-hell);
  text-shadow:0 0 10px rgba(226,163,79,.8),0 1px 0 rgba(0,0,0,.7);
  animation:wirkung-auf .58s ease-out both;
}
@keyframes wirkung-auf{
  0%  {opacity:0;transform:translate(-50%,-30%) scale(.7);}
  25% {opacity:1;transform:translate(-50%,-55%) scale(1.05);}
  100%{opacity:0;transform:translate(-50%,-160%) scale(1);}
}

/* ============================================================
   Kreaturenkarte — ein Blatt, das einfaehrt
   ============================================================ */
/* Die Karte ist ein Blatt, das von unten ueber das Lager faehrt und
   die Kulisse mit dem Halteplatz stehen laesst — genau das verlangt
   Project.md fuer die ganze Oberflaeche ("UI bleibt eine Ebene ueber
   der Welt und verdeckt sie nicht unnoetig"). Der Schleier darunter
   (::before) nimmt der Welt das Gewicht und faengt zugleich jeden
   Tipp ab, der sonst hinter der Karte einen Slot getroffen haette. */
/* Die vier Handlungen stehen zu zweit nebeneinander statt untereinander. Als
   Stapel schob sich der letzte Knopf unter die Reiterleiste, und man musste
   scrollen, um „Zurueck" zu erreichen — auf dem Hauptweg der Bedienung ist das
   ein Fehler, kein Feinschliff. */
#karte-aktionen{
  display:grid;grid-template-columns:1fr 1fr;gap:.5rem;
  width:100%;max-width:20rem;margin-top:.2rem;
}
#karte{
  position:fixed;z-index:10;
  inset:11.5rem .6rem calc(3.4rem + var(--sicher-unten));
  clip-path:var(--ecken);
  background:
    var(--koernung),
    radial-gradient(96% 34% at 50% 0,rgba(226,163,79,.16) 0,transparent 64%),
    linear-gradient(180deg,#7a6132 0,#3b3122 3px,#26332e 3px,
                    #1b2724 12%,#141e1c 62%,#0d1616 100%);
  padding:.8rem .8rem .9rem;
  display:flex;flex-direction:column;align-items:center;gap:.34rem;
  overflow-y:auto;overscroll-behavior:contain;
  scrollbar-width:thin;scrollbar-color:var(--messing-tief) transparent;
}
#karte::before{
  content:"";position:fixed;inset:0;z-index:-1;
  background:
    radial-gradient(120% 80% at 50% 14%,rgba(8,13,14,.26) 0,rgba(4,7,8,.66) 100%);
}
/* Nur beim Oeffnen einfahren — nach Fuettern, Spielen oder
   Umsetzen wird die Karte neu aufgebaut, und ein Blatt, das bei
   jedem Klick von unten hereinfaehrt, waere Zappeln. */
#karte.einfahrt{animation:blatt-ein .26s cubic-bezier(.2,.85,.3,1) both;}
@keyframes blatt-ein{
  from{opacity:0;transform:translateY(2.2rem);}
  to  {opacity:1;transform:translateY(0);}
}
#karte h2,#dex-blatt h2{
  margin-top:.1rem;color:var(--schrift);
  font-size:1.3rem;text-align:center;
}
#karte h2::after,#dex-blatt h2::after{
  content:"";display:block;width:4.5rem;height:2px;margin:.45rem auto 0;
  background:linear-gradient(90deg,transparent,var(--messing),transparent);
  box-shadow:0 0 6px rgba(200,162,78,.6);
}
#karte .gedimmt,#dex-blatt .gedimmt{margin-top:0;font-size:.78rem;letter-spacing:.03em;}
#karte button,#dex-blatt button{min-height:44px;width:100%;max-width:20rem;font-size:.76rem;flex:0 0 auto;}
#karte button:last-of-type{margin-top:.15rem;color:var(--gedimmt);}
/* Steckbrief und Namensfeld: eine Spalte in Kartenbreite, damit
   die Zeilen linksbuendig untereinander stehen statt mittig zu
   flattern. Beschriftung gedimmt und gesperrt, Wert hell — so ist
   der Steckbrief in einem Blick zu ueberfliegen. */
.karte-zeile{
  width:100%;max-width:20rem;color:var(--gedimmt);
  font-size:.7rem;letter-spacing:.07em;
  padding:.26rem .1rem;
  border-bottom:1px solid rgba(200,162,78,.13);
}
.karte-zeile b{
  color:var(--messing-hell);font-weight:700;
  font-size:.86rem;letter-spacing:.01em;
}
#karte label.karte-zeile{border-bottom:0;padding-bottom:0;}
#karte input{
  display:block;min-height:44px;width:100%;margin-top:.35rem;
  padding:.5rem .7rem;font-size:.95rem;
  box-shadow:var(--bauteil-gedrueckt);
  background:linear-gradient(180deg,#131d1b 0,#18231f 100%);
}
#karte input::placeholder{color:#6f7d70;}

/* ============================================================
   Brut — Ei-Faecher, Vorschau, Labor
   ============================================================ */
#brut-eier{display:flex;gap:.65rem;margin-bottom:.85rem;}
.ei-slot{
  position:relative;isolation:isolate;
  flex:1;min-height:134px;display:flex;flex-direction:column;
  align-items:center;justify-content:center;gap:.4rem;
  clip-path:var(--ecken);
  background:linear-gradient(180deg,#8a6d38 0,#4a3d26 38%,#1b2521 100%);
  color:var(--gedimmt);padding:.5rem;
  font-size:.62rem;letter-spacing:.14em;text-transform:uppercase;
  filter:drop-shadow(0 3px 5px rgba(0,0,0,.55));
}
.ei-slot::before{
  content:"";position:absolute;inset:2px;z-index:-1;pointer-events:none;
  clip-path:var(--ecken);
  background:var(--nische-grund);
  box-shadow:inset 0 3px 8px rgba(0,0,0,.75),
             inset 0 -14px 18px -14px rgba(0,0,0,.7);
}
.ei-slot canvas{position:relative;z-index:1;}
.ei-rest{font-size:.6rem;color:var(--messing);letter-spacing:.11em;}

#brut-vorrat{font-size:.76rem;margin:.2rem 0 .8rem;}
/* Elternwahl: Aufklappfeld links, Portrait rechts. Das <select> behaelt
   seine Beruehrungshoehe und gibt nur die Breite ab. */
.eltern-zeile{display:flex;align-items:center;gap:.6rem;margin-bottom:.5rem;}
.eltern-zeile select{flex:1 1 auto;width:auto;min-width:0;margin-bottom:0;}
/* Der Halteplatz ueber der Vorschau: er steuert den staerksten einzelnen
   Formbonus bei und darf deshalb nicht unsichtbar bleiben. */
#brut-ort{
  font-size:.72rem;margin:.2rem 0 .55rem;
  color:var(--messing-hell);letter-spacing:.04em;
  padding-bottom:.4rem;border-bottom:1px solid rgba(200,162,78,.2);
}
#brut-ort .brut-ort-labor{display:block;color:var(--gedimmt);letter-spacing:0;}
#brut-vorschau{display:grid;gap:.35rem;margin:.85rem 0;}
/* Ergebniskacheln: flache Platten mit einer Messingfahne links — sie sind
   Auskunft, kein Knopf, und duerfen deshalb nicht wie einer aussehen.
   Links das Sprite in seiner Nische, mittig Form und Farbe, rechts die
   Sternchen-Chance. */
.ergebnis{
  padding:.35rem .6rem .35rem .5rem;
  display:flex;align-items:center;gap:.55rem;
  font-size:.82rem;border-radius:.28rem;
  border-left:3px solid var(--messing);
  box-shadow:
    inset 0 1px 0 var(--kante-licht),
    inset 0 -8px 10px -8px rgba(0,0,0,.6),
    0 1px 0 rgba(0,0,0,.45);
}
.ergebnis-text{
  display:flex;flex-direction:column;gap:.1rem;
  flex:1 1 auto;min-width:0;
}
.ergebnis-form{
  font-weight:600;color:var(--schrift);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.ergebnis-farbe{
  font-size:.7rem;color:var(--tuerkis);letter-spacing:.08em;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.ergebnis-chance{
  flex:0 0 auto;color:var(--messing-hell);
  font-size:.8rem;letter-spacing:.05em;
}

.ansicht select,.ansicht > button{min-height:46px;width:100%;margin-bottom:.5rem;}
.ansicht > button{font-size:.78rem;}
#brut-labor{display:grid;gap:.5rem;}
/* Bauplan der Wunschliste: vier kurze Zeilen, dieselbe
   Kachelsprache wie die Vorschau daneben. */
#brut-wunsch-plan{
  padding:.65rem .75rem;display:grid;gap:.35rem;font-size:.82rem;
  border-left:3px solid var(--rost);
}
#brut-katalysatoren{display:grid;}

/* ============================================================
   Expedition — Routenkarten
   ============================================================ */
.route{
  position:relative;isolation:isolate;
  clip-path:var(--ecken);
  background:linear-gradient(180deg,#8a6d38 0,#4a3d26 34%,#1b2521 100%);
  padding:.75rem;margin-bottom:.75rem;
  filter:drop-shadow(0 3px 6px rgba(0,0,0,.55));
}
.route::before{
  content:"";position:absolute;inset:2px;z-index:-1;pointer-events:none;
  clip-path:var(--ecken);
  background:var(--bauteil-fuellung);
  box-shadow:inset 0 1px 0 var(--kante-licht),
             inset 0 -16px 20px -14px rgba(0,0,0,.8);
}
.route h3{
  font:700 .78rem/1.2 var(--sans);
  color:var(--messing-hell);
  text-shadow:0 1px 0 rgba(0,0,0,.6);
}
.route .gedimmt{margin-top:.3rem;font-size:.76rem;}
.route select,.route button{min-height:46px;width:100%;margin-top:.5rem;}
.route button{font-size:.76rem;}
.route button:disabled{color:var(--gedimmt);}

/* Aufklappfeld links, Portrait der gewaehlten Kreatur rechts — dieselbe
   Aufteilung wie bei der Elternwahl in der Brut. */
.route-wahl{display:flex;align-items:center;gap:.6rem;}
.route-wahl select{flex:1 1 auto;width:auto;min-width:0;}
/* Koerpergruppe, Abzeichen und Ertrag in einer Zeile unter der Wahl. */
.route-angaben{
  display:flex;align-items:center;flex-wrap:wrap;gap:.4rem;
  margin-top:.5rem;font-size:.72rem;
}
.route-gruppe{color:var(--schrift);}
.route-ertrag{margin-left:auto;color:var(--messing-hell);letter-spacing:.05em;}
/* Das Abzeichen ist der Kern der Auskunft: leuchtet bei Uebereinstimmung,
   bleibt sonst gedaempft. Ein Faktor 1,5, den niemand sieht, sagt nichts. */
.route-passt{
  padding:.12rem .45rem;border-radius:.7rem;
  font-size:.66rem;letter-spacing:.09em;text-transform:uppercase;
  border:1px solid var(--messing-tief);color:var(--gedimmt);
  background:rgba(0,0,0,.28);
}
.route-passt[data-passt="ja"]{
  border-color:var(--messing);color:#1b2521;font-weight:700;
  background:linear-gradient(180deg,var(--messing-hell) 0,var(--messing) 100%);
  box-shadow:0 0 8px rgba(200,162,78,.45);
}

/* ============================================================
   Helixdex — 950 Felder, deshalb bewusst billig gezeichnet
   ------------------------------------------------------------
   Kein Schatten und kein Filter je Feld: das waeren bis zu 950
   zusaetzliche Malschritte. Rahmen und Tiefe liegen einmal am
   Gitter, die Felder tragen nur Farbe, einen 1px-Rand und einen
   Verlauf. Der Reiterwechsel bleibt damit im Bereich einer
   Millisekunde (gemessen, siehe Bericht).
   ============================================================ */
#dex-zaehler{
  color:var(--messing-hell);margin-bottom:.65rem;
  font-size:.72rem;padding-bottom:.5rem;
  border-bottom:1px solid rgba(200,162,78,.22);
}
#dex-gitter{
  padding:.45rem .4rem;border-radius:.3rem;
  background:linear-gradient(180deg,#141d1b 0,#0d1514 100%);
  box-shadow:
    inset 0 2px 6px rgba(0,0,0,.7),
    inset 0 0 0 1px rgba(0,0,0,.6),
    inset 0 0 0 2px rgba(200,162,78,.18),
    0 4px 10px -6px rgba(0,0,0,.6);
}
.dex-zeile{
  display:grid;grid-template-columns:6.8rem repeat(10,1fr);
  gap:2px;align-items:center;margin-bottom:2px;
  padding:1px 2px;border-radius:2px;
}
.dex-zeile:nth-child(even){background:rgba(255,231,183,.028);}
/* Als <button> gerendert, aber ohne Knopfoptik: es ist eine Beschriftung, die
   sich antippen laesst, kein Bedienelement mit eigenem Gewicht. */
button.dex-name{
  background:none;border:0;padding:0;margin:0;font:inherit;color:inherit;
  text-align:left;cursor:pointer;min-height:44px;
}
button.dex-name:active{color:var(--messing);}
.dex-name{
  font-size:.7rem;color:var(--gedimmt);letter-spacing:.02em;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  padding-right:.35rem;
}
.dex-feld{
  aspect-ratio:1;background:#0c1413;border-radius:2px;
  border:1px solid rgba(0,0,0,.55);
  display:flex;align-items:center;justify-content:center;
}
.dex-feld.gefuellt{
  background:linear-gradient(180deg,#33443c 0,#1c2723 100%);
  border-color:rgba(200,162,78,.42);
}
.dex-feld canvas{width:100%;height:100%;}
/* Ein frisch eingetragener Fund funkelt kurz auf — erkannt am
   Zeitstempel, den recordDex ohnehin ablegt. Betrifft nie mehr
   als eine Handvoll Felder. */
.dex-feld.frisch{animation:dex-funken .29s ease-out 2;}
@keyframes dex-funken{
  0%  {border-color:rgba(242,215,156,.95);
       background:linear-gradient(180deg,#7a6a3c 0,#3a4a3e 100%);}
  100%{border-color:rgba(200,162,78,.42);
       background:linear-gradient(180deg,#33443c 0,#1c2723 100%);}
}

/* ============================================================
   Vollbildblaetter — Schlupf, Reise, Einstellungen, Bericht
   ============================================================ */
#schlupf{
  position:fixed;inset:0;z-index:20;
  background:
    var(--koernung),
    radial-gradient(58% 40% at 50% 44%,rgba(226,163,79,.22) 0,transparent 70%),
    radial-gradient(120% 90% at 50% 44%,#141f1e 0,#070c0d 72%);
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:1.1rem;
}
#schlupf canvas{
  width:192px;height:192px;border-radius:.45rem;
  background:var(--nische-grund);
  box-shadow:var(--nische-schatten);
}
#schlupf-text{
  color:var(--messing-hell);font:700 1.05rem/1.3 var(--serif);
  text-align:center;padding:0 1rem;letter-spacing:.02em;
  text-shadow:0 0 14px rgba(226,163,79,.45),0 1px 0 rgba(0,0,0,.6);
}
/* Der Blitz der Stufe "blitz" darf auch die Seite treffen. */
#schlupf[data-stufe="blitz"]{
  background:
    radial-gradient(60% 44% at 50% 44%,rgba(255,248,222,.30) 0,transparent 72%),
    radial-gradient(120% 90% at 50% 44%,#1b2624 0,#080e0f 72%);
}

/* Vollbildszene: die Leinwand IST der Bildschirm. Vorher lag ein 320 Pixel
   breiter Streifen mit Messingrahmen mitten in einem schwarzen Blatt — auf
   einem 390x844-Schirm waren damit rund vier Fuenftel der Flaeche schwarz.
   Kein Rahmen, keine Ecken, kein dunkler Verlauf mehr; den Grund setzt
   helix-travel.js auf den aus der Kulisse gelesenen Himmelston, damit auch
   das allererste Bild nicht dunkel aufblitzt. Der Wert hier ist nur der
   Stand, bis das Skript misst (Mittel der obersten Kulissenzeile). */
#reise{
  position:fixed;inset:0;z-index:15;overflow:hidden;
  background:rgb(239,224,178);
}
#reise canvas{display:block;width:100%;height:100%;}
/* Die Restzeit liegt als leise Marke ueber dem Himmel statt in einem Balken:
   keine harte Kante, kein Kasten, nur eine Spur Milchglas. Farbe und Grund
   richten sich nach der Helligkeit des Himmels (data-himmel aus dem Skript),
   damit die Angabe auch vor einer dunklen Kulisse lesbar bliebe. */
#reise-text{
  position:absolute;left:50%;transform:translateX(-50%);
  top:calc(1.15rem + env(safe-area-inset-top,0px));
  padding:.42rem .95rem;border-radius:999px;
  font:700 .68rem/1 var(--sans);
  text-transform:uppercase;letter-spacing:.17em;
  font-variant-numeric:tabular-nums;
  pointer-events:none;white-space:nowrap;
  color:#33402c;
  background:rgba(255,252,238,.42);
  box-shadow:
    inset 0 0 0 1px rgba(255,255,255,.42),
    0 2px 12px -4px rgba(104,88,48,.45);
  -webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px);
}
#reise[data-himmel="dunkel"] #reise-text{
  color:var(--messing-hell);
  background:rgba(10,17,16,.42);
  box-shadow:
    inset 0 0 0 1px rgba(242,215,156,.22),
    0 2px 12px -4px rgba(0,0,0,.5);
}
#kopf-reise{
  color:var(--messing-hell);padding:0 .6rem;min-height:44px;
  font-size:.58rem;letter-spacing:.05em;
  background:linear-gradient(180deg,#4a3a1c 0,#33280f 50%,#1d1809 100%);
  border-top-color:#7c6229;
  box-shadow:
    inset 0 1px 0 rgba(255,231,183,.28),
    inset 0 0 0 1px rgba(0,0,0,.4),
    inset 0 -10px 12px -10px rgba(0,0,0,.7),
    0 0 0 1px var(--messing-tief),
    0 2px 0 rgba(0,0,0,.5),
    0 6px 14px -6px rgba(0,0,0,.6),
    0 0 18px -6px rgba(226,163,79,.45);
}
#kopf-reise:disabled{opacity:.42;box-shadow:var(--bauteil-gedrueckt);}
/* Schublade, die von unten einfaehrt. */
#reise-frage,#meldung{
  position:fixed;left:0;right:0;bottom:0;z-index:16;
  background:linear-gradient(180deg,#2a3833 0,#1a2523 55%,#111a18 100%);
  padding:1rem;padding-bottom:calc(1rem + var(--sicher-unten));
  display:flex;flex-direction:column;gap:.55rem;
  box-shadow:
    inset 0 1px 0 rgba(255,231,183,.16),
    0 -1px 0 var(--messing),
    0 -14px 30px -12px rgba(0,0,0,.85);
  animation:schublade-ein .24s cubic-bezier(.2,.85,.3,1) both;
}
@keyframes schublade-ein{
  from{transform:translateY(100%);}
  to  {transform:translateY(0);}
}
#reise-frage p{font-size:.86rem;color:var(--schrift);}
#reise-frage button{min-height:46px;font-size:.76rem;}

#kopf-einstellungen{
  min-width:44px;min-height:44px;font-size:1.05rem;
  color:var(--messing);padding:0;
}
#einstellungen{
  position:fixed;inset:0;z-index:25;
  background:
    var(--koernung),
    radial-gradient(90% 40% at 50% 4%,rgba(226,163,79,.14) 0,transparent 66%),
    linear-gradient(180deg,#182322 0,#0f1818 52%,#080e0f 100%);
  padding:1rem;padding-bottom:calc(1rem + var(--sicher-unten));
  display:flex;flex-direction:column;gap:.8rem;overflow-y:auto;
  animation:blatt-ein .26s cubic-bezier(.2,.85,.3,1) both;
}
#einstellungen h2{color:var(--messing-hell);}
#einstellungen button,#einstellungen input{
  min-height:46px;padding:.5rem .7rem;font-size:.78rem;
}
#einstellungen input{
  font-size:.8rem;letter-spacing:normal;text-transform:none;font-weight:400;
  box-shadow:var(--bauteil-gedrueckt);
  background:linear-gradient(180deg,#131d1b 0,#18231f 100%);
}
#einstellungen input::file-selector-button{
  min-height:34px;margin-right:.6rem;padding:0 .7rem;
  background:var(--bauteil-fuellung);color:var(--messing-hell);
  border:1px solid var(--messing-tief);border-radius:.28rem;
  font:700 .7rem/1 var(--sans);text-transform:uppercase;letter-spacing:.08em;
  cursor:pointer;
}
/* Die native Dateieingabe bleibt bedienbar und auffindbar, aber unsichtbar —
   die Beschriftung uebernimmt das <label> darueber. `display:none` waere
   falsch: manche Browser verweigern dann das Setzen von Dateien. */
.datei-versteckt{
  position:absolute;width:1px;height:1px;padding:0;margin:-1px;
  overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0;
}
#einstellungen-import-knopf{
  display:flex;align-items:center;justify-content:center;
  min-height:44px;cursor:pointer;text-align:center;
}
#einstellungen-meldung{color:var(--warn);font-size:.86rem;}
#einstellungen-zu{color:var(--gedimmt);}

/* Rueckfrage zum Neuanfang: liegt im Einstellungenblatt und erbt
   dessen Knopfhoehe, braucht aber eigenen Abstand und eine
   warnende Kante. */
#einstellungen-neu-frage{
  display:flex;flex-direction:column;gap:.55rem;
  border-radius:.35rem;padding:.85rem;
  background:linear-gradient(180deg,rgba(185,107,60,.12) 0,rgba(0,0,0,.2) 100%);
  box-shadow:
    inset 0 0 0 1px rgba(0,0,0,.5),
    inset 0 0 0 2px rgba(185,107,60,.45),
    inset 0 1px 0 rgba(255,231,183,.12);
}
#einstellungen-neu-frage p{font-size:.84rem;}
#einstellungen-neu-ja{color:#f0b39a;}

/* Bericht "Waehrend du weg warst": liegt ueber dem Lager, aber
   unter den Einstellungen. Ein Tipp irgendwo schliesst ihn,
   deshalb ist die ganze Flaeche die Beruehrungsflaeche. */
#bericht{
  position:fixed;inset:0;z-index:22;
  background:
    var(--koernung),
    radial-gradient(80% 44% at 50% 18%,rgba(226,163,79,.20) 0,transparent 68%),
    linear-gradient(180deg,#182322 0,#0d1616 54%,#070d0e 100%);
  padding:1.2rem;padding-bottom:calc(1.2rem + var(--sicher-unten));
  display:flex;flex-direction:column;justify-content:center;gap:.85rem;
  overflow-y:auto;cursor:pointer;
  animation:blatt-ein .3s cubic-bezier(.2,.85,.3,1) both;
}
#bericht h2{color:var(--messing-hell);font-size:1.45rem;text-align:center;}
#bericht h2::after{
  content:"";display:block;width:5.5rem;height:2px;margin:.5rem auto 0;
  background:linear-gradient(90deg,transparent,var(--messing),transparent);
  box-shadow:0 0 6px rgba(200,162,78,.6);
}
#bericht ul{list-style:none;display:flex;flex-direction:column;gap:.5rem;}
#bericht li{
  padding:.6rem .75rem;font-size:.85rem;border-radius:.28rem;
  border-left:3px solid var(--messing-tief);
}
#bericht button{
  min-height:46px;color:var(--messing-hell);font-size:.76rem;cursor:pointer;
}

/* Startfehler und Speicherwarnung: die einzige Stelle, an der die
   App noch sprechen kann, wenn sonst nichts mehr gezeichnet wird. */
#meldung{
  z-index:30;color:var(--schrift);font-size:.86rem;
  box-shadow:
    inset 0 1px 0 rgba(255,231,183,.16),
    0 -1px 0 var(--warn),
    0 -14px 30px -12px rgba(0,0,0,.85);
}

/* ============================================================
   Helixdex-Detailblatt (Befund D)
   ------------------------------------------------------------
   Dieselbe Bauteiloptik wie die Kreaturenkarte — die Regeln oben
   fuehren `#dex-blatt` deshalb ueberall mit auf. Nur die Lage ist
   eine andere: der Helixdex hat keine Kulisse, die sichtbar
   bleiben muesste, das Blatt darf also hoeher ansetzen.
   ============================================================ */
#dex-blatt{
  position:fixed;z-index:10;
  inset:4.4rem .6rem calc(3.4rem + var(--sicher-unten));
  clip-path:var(--ecken);
  background:
    var(--koernung),
    radial-gradient(96% 34% at 50% 0,rgba(226,163,79,.16) 0,transparent 64%),
    linear-gradient(180deg,#7a6132 0,#3b3122 3px,#26332e 3px,
                    #1b2724 12%,#141e1c 62%,#0d1616 100%);
  padding:.8rem .8rem .9rem;
  display:flex;flex-direction:column;align-items:center;gap:.34rem;
  overflow-y:auto;overscroll-behavior:contain;
  scrollbar-width:thin;scrollbar-color:var(--messing-tief) transparent;
  animation:blatt-ein .26s cubic-bezier(.2,.85,.3,1) both;
}
#dex-blatt::before{
  content:"";position:fixed;inset:0;z-index:-1;
  background:
    radial-gradient(120% 80% at 50% 14%,rgba(8,13,14,.26) 0,rgba(4,7,8,.66) 100%);
}
/* Front, Ruecken, Karte nebeneinander — drei Nischen in einer Reihe.
   Die Kartenansicht ist 32x32 und wird ganzzahlig verdoppelt; ein
   gebrochener Faktor frisst die Pixelkanten. */
.dex-ansichten{display:flex;gap:.5rem;margin:.25rem 0 .4rem;}
.dex-nische{width:72px;height:72px;flex:0 0 auto;}
.dex-nische canvas{image-rendering:pixelated;}
.dex-nische canvas[data-sicht="karte"]{width:64px;height:64px;}
/* Nur gefuellte Felder oeffnen ein Blatt — leere bleiben stumm und
   zeigen deshalb auch keinen Zeiger an. */
.dex-feld[data-oeffnet]{cursor:pointer;}

/* ============================================================
   Katalysator-Marken (Befund E)
   ------------------------------------------------------------
   Der Vorrat war eine Zeile Fliesstext; die Mitte der Kernschleife
   liess sich damit nicht ueberfliegen. Jetzt: kleine Marken mit
   Anzahl, nach Biomfamilie gruppiert, im selben Metall wie alles
   andere. Kein eigener Reiter — sie stehen dort, wo gezuechtet wird.
   ============================================================ */
#brut-vorrat{
  display:flex;flex-direction:column;gap:.35rem;
}
.vorrat-gruppe{display:flex;flex-wrap:wrap;align-items:center;gap:.3rem;}
.vorrat-titel{
  flex:0 0 4.6rem;
  font-size:.6rem;letter-spacing:.13em;text-transform:uppercase;
  color:var(--messing);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.vorrat-marke{
  display:inline-flex;align-items:center;gap:.32rem;
  padding:.2rem .42rem;border-radius:.25rem;
  background:linear-gradient(180deg,#2b3831 0,#17211e 100%);
  box-shadow:inset 0 1px 0 rgba(255,231,183,.10),
             inset 0 0 0 1px rgba(0,0,0,.55),
             0 1px 2px rgba(0,0,0,.5);
}
.vorrat-marke b{color:var(--schrift);font-size:.68rem;font-weight:600;}
.vorrat-marke i{
  font-style:normal;font-size:.64rem;font-weight:700;
  min-width:1.1rem;padding:0 .18rem;text-align:center;
  color:#1a2220;background:var(--messing);border-radius:.18rem;
}
#brut-inkubator{
  font-size:.7rem;letter-spacing:.06em;color:var(--messing);
  margin:.1rem 0 .55rem;
}

/* ============================================================
   Inkubator-Aufstieg (Befund C)
   ------------------------------------------------------------
   Der staerkste Belohnungsmoment der App bekommt ein eigenes
   Blatt statt einer Textzeile. Es liegt wie der Bericht ueber
   allem und schliesst sich mit einem Tipp irgendwo.
   ============================================================ */
#aufstieg{
  position:fixed;inset:0;z-index:22;
  background:
    var(--koernung),
    radial-gradient(80% 44% at 50% 38%,rgba(226,163,79,.26) 0,transparent 66%),
    linear-gradient(180deg,#1d2724 0,#0d1616 54%,#070d0e 100%);
  padding:1.2rem;padding-bottom:calc(1.2rem + var(--sicher-unten));
  display:flex;flex-direction:column;justify-content:center;align-items:center;
  gap:.7rem;cursor:pointer;
  animation:blatt-ein .3s cubic-bezier(.2,.85,.3,1) both;
}
#aufstieg h2{color:var(--messing-hell);font-size:1.45rem;text-align:center;}
#aufstieg h2::after{
  content:"";display:block;width:5.5rem;height:2px;margin:.5rem auto 0;
  background:linear-gradient(90deg,transparent,var(--messing),transparent);
  box-shadow:0 0 6px rgba(200,162,78,.6);
}
.aufstieg-name{
  color:var(--schrift);font-size:1.05rem;text-align:center;letter-spacing:.03em;
}
.aufstieg-text{color:var(--gedimmt);font-size:.86rem;text-align:center;}
#aufstieg button{
  min-height:46px;width:100%;max-width:20rem;
  color:var(--messing-hell);font-size:.76rem;cursor:pointer;
}

/* Wer Bewegung abbestellt hat, bekommt keine. */
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{
    animation-duration:.01ms !important;animation-iteration-count:1 !important;
    transition-duration:.01ms !important;
  }
}
