/* Alle Schriftarten lokal gehostet - keine Verbindung mehr zu Google-
   Servern (siehe /lizenzen). Lizenz: SIL Open Font License 1.1.
   Inter: github.com/rsms/inter | IBM Plex Mono: github.com/IBM/plex */
@font-face{ font-family:'Inter'; font-style:normal; font-weight:400; font-display:swap; src:url('/assets/fonts/Inter-Regular.woff2') format('woff2'); }
@font-face{ font-family:'Inter'; font-style:normal; font-weight:500; font-display:swap; src:url('/assets/fonts/Inter-Medium.woff2') format('woff2'); }
@font-face{ font-family:'Inter'; font-style:normal; font-weight:600; font-display:swap; src:url('/assets/fonts/Inter-SemiBold.woff2') format('woff2'); }
@font-face{ font-family:'Inter'; font-style:normal; font-weight:700; font-display:swap; src:url('/assets/fonts/Inter-Bold.woff2') format('woff2'); }
/* IBM Plex Mono liegt NUR als Medium (500) im Projekt - es gibt keine
   zweite Datei. Ueberall auf der Seite steht an den Monospace-Stellen
   aber `font-weight:700` (Plaketten, Kennzahlen, Spaltenkoepfe).

   Stand hier `font-weight:500`, galt die Datei nur fuer genau 500 - und
   fuer 700 rechnete der Browser sich einen fetten Schnitt selbst aus
   (synthetisches Fett). Bei 9 bis 11 Pixeln laeuft das ineinander, und
   genau daran waren die kleinen Zahlen schwer zu lesen.

   `font-weight:400 700` sagt: Diese eine Datei deckt den ganzen Bereich
   ab. Der Browser nimmt sie unveraendert und rechnet nichts hinzu. Die
   Marken wirken dadurch eine Spur weniger fett - dafuer sind sie scharf.

   Besser waere eine echte IBMPlexMono-SemiBold.woff2 neben der Medium
   (OFL, github.com/IBM/plex). Liegt sie eines Tages im Ordner, kommt ein
   zweites @font-face mit `font-weight:600` dazu und diese Zeile wird
   wieder auf `400 500` eingegrenzt. */
@font-face{
  font-family:'IBM Plex Mono';
  font-style:normal;
  font-weight:400 700;
  font-display:swap;
  src:url('/assets/fonts/IBMPlexMono-Medium.woff2') format('woff2');
}

:root{
  /* =======================================================================
     DUNKLES KOMPENDIUM
     =======================================================================
     Hier stand `--akzent: var(--info)`. Das ist woertlich Tailwind-Blau 600 -
     dieselbe Farbe, die jedes zweite Dashboard im Netz benutzt. Zusammen mit
     Inter, 10px-Radien und weissen Flaechen ergab das ein kompetentes
     Admin-Panel und kein Portal, auf dem man stoebern will.

     Die neue Richtung war im Haus schon vorhanden, nur nie ausgerollt: Auf
     der Spielseite gab es einen Goldakzent (#E9C171 / #C4923A) an genau
     fuenf Stellen. Der wird jetzt zur Leitfarbe.

     -----------------------------------------------------------------------
     WARUM DUNKEL DIE VORGABE IST
     -----------------------------------------------------------------------
     Nicht aus Mode. Ein Nachschlagewerk wird lange und oft am Abend gelesen,
     und Gold traegt auf Tinte, waehrend es auf Weiss verschwindet - deshalb
     hat der helle Modus unten eine eigene, dunklere Goldstufe.

     Der Umschalter bleibt; er schreibt weiterhin `data-theme`. Geaendert hat
     sich nur, was ohne gespeicherte Wahl gilt.

     -----------------------------------------------------------------------
     WARUM DIE FARBEN NICHT NEUTRALGRAU SIND
     -----------------------------------------------------------------------
     `--text` ist #E8E4DA und nicht #FFFFFF: ein warmes Pergamentweiss. Reines
     Weiss auf fast-Schwarz ist der Kontrast, bei dem die Buchstaben zu
     flimmern anfangen, und es sieht aus wie ein Terminal. Ein halbes Grad
     Waerme macht aus einem Bildschirm eine Seite.

     Dasselbe bei den Flaechen: #12151F hat einen Blaustich, #0B0D14 einen
     staerkeren. Zwei Toene mit derselben Temperatur wirken flach; zwei mit
     leicht verschobener Temperatur wirken uebereinander gelegt.
     ======================================================================= */
  --bg: #0B0D14;
  --bg-tief: #07080D;
  --oberflaeche: #12151F;
  --oberflaeche-2: #1A1F2E;
  --text: #E8E4DA;
  --text-2: #97918A;
  --border: #242A38;

  /* Gold. Die helle Stufe traegt Text und Linien, die tiefe fuellt Flaechen
     - auf einer gefuellten Goldflaeche steht dunkler Text, nicht heller. */
  --akzent: #E9C171;
  --akzent-tief: #C4923A;

  /* Eine Goldkante, die man nicht als Linie liest, sondern als Schimmer.
     Fuer Karten, die hervorgehoben sind, ohne zu schreien. */
  --kante-gold: rgba(233,193,113,.22);

  /* Eine GARANTIERT blickdichte Flaeche - fuer Fenster, die ÜBER dem
     dynamischen Hintergrundbild schweben (Cookie-Einstellungen, News &
     Updates). `--oberflaeche` wird im dynamischen Modus absichtlich
     durchscheinend (siehe body.dynamisch-modus weiter unten), damit das
     Motiv durch normale Flaechen der Seite schimmert - ein Fenster mit
     Lesetext braucht das Gegenteil. Ausserhalb des dynamischen Modus ist
     `--oberflaeche` ohnehin schon deckend, hier passiert also nichts. */
  --oberflaeche-modal: var(--oberflaeche);

  /* ---------------------------------------------------------------------
     STATUSFARBEN - VIER TOKEN, KEINE ZWEITE PALETTE
     ---------------------------------------------------------------------
     Diese vier gab es schon; daneben standen im Stylesheet aber zwei
     weitere Saetze roher Hexwerte: Tailwind-Rot/Gruen/Blau (var(--fehler),
     var(--erfolg), var(--info)) und ein aelteres Paar (var(--fehler) / var(--erfolg)).

     Das war nicht nur Unordnung, sondern ein sichtbarer Fehler: Die
     TOKEN wechseln im hellen Modus (unten), die rohen Hexwerte nicht.
     Ein rotes var(--fehler) auf Pergament ist ein anderes Rot als --fehler -
     dieselbe Bedeutung, zwei Farben, je nach Seite.

     `--info` ist neu: Fuer "stark gegen", "magisch", Hinweise gab es bis
     jetzt kein Token, nur das Tailwind-Blau. */
  --erfolg: #4ADE9B; --warnung: #FBBF24; --fehler: #F87171; --info: #7FA8D9;

  /* -----------------------------------------------------------------------
     GRUPPENFARBEN (RPG Builder Portal, Phase 11 - 2026-09-05)
     -----------------------------------------------------------------------
     Eine Akzentfarbe je `entitaet_arten.gruppe` - dieselben fünf Werte, die
     der Katalog schon kennt (figuren/welt/sachen/koennen/aufgaben), nicht
     neu erfunden. Dient der Entity Card und dem Icon-Set als Farbcode, DAMIT
     ein Gegner auf den ersten Blick anders wirkt als ein Ort - nicht als
     zweites Farbsystem neben --akzent, sondern als Ergänzung dafür. */
  --gruppe-figuren: #E08585;
  --gruppe-welt: #6FBF9E;
  --gruppe-sachen: #7FA8D9;
  --gruppe-koennen: #B589E8;
  --gruppe-aufgaben: #E0A458;

  /* -----------------------------------------------------------------------
     SCHRIFTEN
     -----------------------------------------------------------------------
     Ueberschriften bekommen eine Serife. Das ist der einzelne Griff, der am
     meisten ausmacht: Eine Grotesk-Schlagzeile liest sich wie eine
     Benutzeroberflaeche, eine Serifen-Schlagzeile wie ein Text, den jemand
     geschrieben hat.

     ES IST EINE SYSTEMSCHRIFT, UND ZWAR ABSICHTLICH VORLAEUFIG.
     Das Projekt bindet Schriften ausschliesslich lokal ein (siehe /lizenzen)
     und laedt nichts von fremden Servern. Eine passende Serife als .woff2
     liegt nicht im Projekt, und sie laesst sich von hier aus nicht
     beschaffen. Die Kette unten trifft auf macOS Iowan Old Style, auf
     Windows Georgia - beide taugen.

     Wer spaeter eine eigene Serife einbaut (etwa Source Serif oder Spectral,
     beide OFL), legt die .woff2 nach /assets/fonts, ergaenzt ein @font-face
     und setzt hier den Namen davor. Eine Stelle, und die ganze Seite folgt.
     ----------------------------------------------------------------------- */
  --schrift-display: 'Iowan Old Style','Palatino Linotype',Palatino,
                     'Book Antiqua',Georgia,'Times New Roman',serif;
  --schrift-text: 'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;
  --schrift-mono: 'IBM Plex Mono',ui-monospace,monospace;

  /* -----------------------------------------------------------------------
     RADIEN UND ERHEBUNG
     -----------------------------------------------------------------------
     10px ueberall war die Vorgabe - und 10px ist der Radius, den man nimmt,
     wenn man sich nicht entschieden hat. Drei Stufen sagen etwas: Ein Chip
     ist fast rund, eine Karte hat eine ruhige Kante, ein Fenster eine
     weiche.
     ----------------------------------------------------------------------- */
  /* Die runde Form (Plaketten, Chips, Knoepfe) stand 99-mal als roher
     Wert im Blatt, in zwei Schreibweisen (999px und 99px). Sie bedeuten
     dasselbe - und eine Form, die zweimal geschrieben wird, wird
     irgendwann nur einmal geaendert. */
  --radius-rund: 999px;
  --radius: 12px;
  --radius-klein: 8px;
  --radius-gross: 18px;

  /* Schatten auf Dunkel funktionieren nicht ueber Schwaerze - da ist schon
     alles schwarz. Sie funktionieren ueber eine helle Oberkante: Das Auge
     liest die Lichtkante als Erhebung. */
  --erhebung: inset 0 1px 0 rgba(255,255,255,.045), 0 2px 8px rgba(0,0,0,.35);
  --erhebung-hoch: inset 0 1px 0 rgba(255,255,255,.07), 0 12px 32px rgba(0,0,0,.5);

  /* Eine Dauer, ein Verlauf - damit sich die ganze Seite gleich anfuehlt.
     Verschiedene Geschwindigkeiten an verschiedenen Stellen nimmt man nicht
     bewusst wahr; man haelt die Seite fuer unsauber gebaut. */
  --dauer: .16s;
  --kurve: cubic-bezier(.2,.6,.3,1);

  /* =======================================================================
     ZWEI BREITEN: DER KOPF BLEIBT, DER INHALT WAECHST MIT
     =======================================================================
     Hier stand EIN Wert - 1280px - fuer Kopfbanner, Navigation, Seiteninhalt
     und Fusszeile. Auf einem 1280er-Bildschirm ist das richtig. Auf einem
     Full-HD-Schirm stehen links und rechts je 320px leer, auf einem
     4K-Schirm je 1280px - dort nimmt der Inhalt ein Drittel der Flaeche ein
     und der Rest ist Hintergrund.

     --kopf-breite  bleibt fest. Das Kopfbild ist ein Bild mit fester Hoehe;
                    es auf 2400px zu ziehen macht daraus einen Streifen. Die
                    Navigationsleiste haengt daran, damit beide Kanten
                    zusammen bleiben.

     --inhalt-breite waechst mit dem Fenster: ab 1280px aufwaerts nimmt der
                    Inhalt 92% der Fensterbreite, bis 2400px. Darueber ist
                    Schluss - nicht aus Bequemlichkeit, sondern weil eine
                    Textzeile ueber 2400px niemand mehr liest; das Auge
                    verliert beim Ruecksprung die Zeile.

     Der Platz jenseits davon geht nicht verloren: Die Raster auf den Seiten
     stehen auf `auto-fill`, sie machen aus mehr Breite MEHR SPALTEN statt
     laengerer Zeilen. Das ist der Unterschied zwischen „voll genutzt" und
     „auseinandergezogen".

     Innenabstand der Container sind 32 px je Seite; --inhalt-innen ist die
     Breite, die dem Text tatsaechlich bleibt, und wird fuer die Trennlinien
     der Fusszeile gebraucht. */
  --kopf-breite: 1280px;

  /* -----------------------------------------------------------------
     ZWEI INHALTSBREITEN
     -----------------------------------------------------------------
     `--inhalt-breite` stand auf 92vw bis 2400px. Das nutzt einen grossen
     Schirm aus und ist fuer eine LESESEITE zu viel: Die Kacheln werden
     so breit, dass Bezeichnung und Wert an den entgegengesetzten Raendern
     stehen und das Auge dazwischen sucht.

     82vw bis 1760px ist die Lesebreite - immer noch deutlich mehr als die
     festen 1280px von frueher, aber ruhiger.

     Die STARTSEITE ist etwas anderes: Sie zeigt Kacheln nebeneinander,
     keine Wertetabellen. Dort ist mehr Breite mehr Inhalt, und sie
     bekommt deshalb ihre eigene Zahl.

     Der Kopf bleibt unberuehrt - `--kopf-breite` haengt an keiner der
     beiden.
     ----------------------------------------------------------------- */
  /* -----------------------------------------------------------------
     DIE OBERGRENZEN
     -----------------------------------------------------------------
     Erst 2400px (zu breit fuer Wertetabellen), dann 1760px - und das war
     auf einem sehr breiten Fenster zu wenig: Der Inhalt stand als
     schmaler Streifen in der Mitte, mit leerer Flaeche links und rechts,
     die breiter war als er selbst.

     2040px ist der Ausgleich. Auf Full HD greift ohnehin `86vw` und nicht
     die Obergrenze - dort aendert sich damit fast nichts. Sie wirkt erst
     ab etwa 2370px Fensterbreite, und genau dort war das Problem.

     `86vw` statt `82vw`: vier Prozent mehr Inhalt und entsprechend
     weniger Rand. Der Unterschied ist klein und auf einem grossen Schirm
     sichtbar.
     ----------------------------------------------------------------- */
  --inhalt-breite: clamp(1100px, 86vw, 2040px);
  --inhalt-breite-weit: clamp(1280px, 94vw, 2480px);
  --inhalt-innen: calc(var(--inhalt-breite) - 64px);

  /* Fuer Fliesstext: Auch in einer 2400px breiten Spalte darf ein Absatz
     nicht ueber die ganze Breite laufen. 78 Zeichen ist die Grenze, ab der
     das Auge beim Zeilenwechsel anfaengt zu suchen. */
  --lese-breite: 78ch;
}
/* =========================================================================
   DER HELLE MODUS - PERGAMENT, NICHT BUEROPAPIER
   =========================================================================
   Vorher war Hell die Vorgabe und Dunkel die Ausnahme; jetzt ist es
   umgekehrt. Der Umschalter und das Attribut haben sich NICHT geaendert -
   `data-theme` traegt weiterhin `dunkel` oder `hell`. Geaendert hat sich
   nur, was ohne gespeicherte Wahl gilt.

   Damit die dreizehn Regeln im Stylesheet, die auf `[data-theme="dunkel"]`
   zeigen, weiter greifen, schreibt das Skript im <head> das Attribut jetzt
   IMMER - auch beim ersten Besuch. Ohne das haetten sie beim ersten Aufruf
   nicht gegriffen und ab dem zweiten schon; ein Fehler, der sich beim
   Neuladen selbst repariert und deshalb schwer zu finden ist.

   -------------------------------------------------------------------------
   GOLD BRAUCHT HIER EINEN ANDEREN WERT
   -------------------------------------------------------------------------
   #E9C171 auf #0B0D14 ist ein Kontrast von etwa 9:1 - sehr gut lesbar.
   Dasselbe Gold auf hellem Papier kommt auf 1,6:1 und ist als Text
   unbrauchbar. Es ist also nicht dieselbe Farbe in beiden Modi, sondern
   dieselbe FUNKTION: das gedeckte #8A5D14 traegt hier, was dort das helle
   Gold traegt.

   Wer eine Marke ueber die Lesbarkeit stellt, bekommt eine Marke, die
   niemand lesen kann.
   ========================================================================= */
:root[data-theme="hell"]{
  /* -----------------------------------------------------------------
     REINES WEISS WAR DER FEHLER
     -----------------------------------------------------------------
     `--oberflaeche` stand auf #FFFFFF. Auf einem waermeren Grund ist
     eine reinweisse Flaeche kein Blatt, sondern eine Leuchtplatte - und
     der RPG Explorer, der aus lauter solchen Flaechen besteht, blendete
     entsprechend.

     Der Modus heisst „Pergament" und nicht „Bueropapier": Alle drei
     Toene tragen denselben warmen Stich, und die Karte liegt eine Spur
     HELLER als die Seite - das liest das Auge als aufliegendes Blatt.
     Reines Weiss kommt gar nicht mehr vor.
     ----------------------------------------------------------------- */
  --bg: #F4F1E8;
  --bg-tief: #EBE6D9;
  --oberflaeche: #FCFAF3;
  --oberflaeche-2: #EDE8DA;
  --text: #1C1A16;
  --text-2: #6B6558;
  --border: #E2DDD0;

  --akzent: #8A5D14;
  --akzent-tief: #6B4710;
  --kante-gold: rgba(138,93,20,.22);

  --erfolg: #15803D; --warnung: #B45309; --fehler: #B91C1C; --info: #2F5C8F;
  --gruppe-figuren: #B84A4A;
  --gruppe-welt: #2F7A5C;
  --gruppe-sachen: #3A628F;
  --gruppe-koennen: #7A4FA8;
  --gruppe-aufgaben: #A3661E;

  /* Auf Papier ist Erhebung ein Schatten, keine Lichtkante. */
  --erhebung: 0 1px 2px rgba(28,26,22,.06), 0 2px 8px rgba(28,26,22,.04);
  --erhebung-hoch: 0 12px 32px rgba(28,26,22,.12);
}

/* Die dunklen Werte gelten sowohl ohne Attribut als auch mit `dunkel`. Der
   Block ist leer bis auf diesen Hinweis: Die Werte stehen oben in `:root`,
   weil Dunkel die Vorgabe ist. Diese Regel steht hier trotzdem, damit
   jemand, der nach `data-theme="dunkel"` sucht, nicht ins Leere greift und
   glaubt, der dunkle Modus sei verschwunden. */
:root[data-theme="dunkel"]{ color-scheme: dark; 
  /* Sagt dem Browser, wie er Bildlaufleisten und Formularelemente
     zeichnen soll. Stand als zweite Regel fuer denselben Selektor
     daneben - dieselbe Sorte Doppelung, gegen die es einen Test gibt.
     Der greift nur bei Klassenselektoren, hier war also niemand
     zustaendig ausser dem Lesen. */
  color-scheme: light;
}
*{ box-sizing: border-box; }
body{
  margin:0; background:var(--bg); color:var(--text);
  font-family:var(--schrift-text);
  /* 16px und 1.65 standen bis 2026-09-12 ein zweites Mal am ENDE des
     Blattes und ueberschrieben die Werte, die hier begruendet wurden -
     wer hier etwas aenderte, sah keine Wirkung. Jetzt steht die
     Grundschrift an einer Stelle.

     16px, weil 14px die Groesse von Bedienoberflaechen ist und das Portal
     zu weiten Teilen aus Fliesstext besteht. 1.65 ist der spuerbarste
     Einzelwert fuer Lesbarkeit und der billigste - er kostet nur
     senkrechten Platz. */
  font-size:16px;
  line-height:1.65;
  transition:background .2s ease, color .2s ease;
  /* Ohne das rendert Chrome die Inter auf dunklem Grund fetter, als
     sie ist - die Buchstaben laufen zu und wirken schmutzig. */
  -webkit-font-smoothing:antialiased;
  text-rendering:optimizeLegibility;
}

/* ---------- Seitenhintergrund ------------------------------------------
   Zwei Lagen, beide selbst erstellt und ohne fremde Quellen:

     1. weiche Lichtflecken aus reinen CSS-Verläufen. Sie greifen auf die
        Akzentfarbe zurück und passen sich damit von allein an Hell- und
        Dunkelmodus an. Im dynamischen Modus wird diese Ebene komplett durch
        das Hintergrundbild ersetzt (siehe unten).
     2. hintergrund-muster.svg - ein eigens gezeichnetes, nahtlos
        wiederholtes Kartenraster mit Höhenlinien.

   Bewusst in einer eigenen Ebene hinter dem Inhalt (position:fixed, z-index
   negativ) statt als background des body: so scrollt der Hintergrund nicht
   mit, bleibt bei langen Seiten ruhig und kostet kein erneutes Zeichnen.
   pointer-events:none, damit die Ebene keine Klicks abfängt. */
body::before{
  content:''; position:fixed; inset:0; z-index:-1; pointer-events:none;
  background-color:var(--bg);
  background-image:
    radial-gradient(70rem 40rem at 12% -10%, color-mix(in srgb, var(--akzent) 12%, transparent) 0%, transparent 60%),
    radial-gradient(55rem 35rem at 88% 8%,  color-mix(in srgb, var(--akzent) 9%, transparent) 0%, transparent 62%),
    radial-gradient(60rem 45rem at 50% 108%, color-mix(in srgb, var(--akzent) 7%, transparent) 0%, transparent 65%),
    url('/assets/images/hintergrund-muster.svg');
  background-repeat:no-repeat, no-repeat, no-repeat, repeat;
  background-size:auto, auto, auto, 160px 160px;
}
/* Im Dunkelmodus darf das Muster etwas deutlicher sein - auf hellem Grund
   wirkt dieselbe Deckkraft schnell schmutzig. */
:root[data-theme="dunkel"] body::before{ opacity:1; }
:root:not([data-theme="dunkel"]) body::before{ opacity:0.75; }

/* Wer es ganz ruhig mag oder Bewegung reduziert haben will, bekommt nur die
   Grundfarbe - das Muster ist Schmuck, kein Bedeutungsträger. */
@media (prefers-reduced-motion: reduce){
  body::before{ transition:none; }
}

/* ---------- Optionaler dynamischer Hintergrund (Admin/Einstellungen) --------
   Ganzflaechiges Bild (/assets/images/ultra-wide.*) statt des
   normalen Hintergrunds. Ueberschreibt die Design-Tokens NUR innerhalb von
   body.dynamisch-modus (kaskadiert auf alle Kinder) - Komponenten selbst
   bleiben unveraendert. Wirkt unabhaengig vom Hell-/Dunkelmodus-Schalter, da
   das Motiv inhaerent dunkel ist und helle Tokens darauf unlesbar waeren.

   "Dynamisch" heisst hier dreierlei:
     1. das Bild liegt in festen Ebenen hinter dem Inhalt (body::before und
        body::after, siehe unten) - es passt sich jeder Fenstergroesse und
        jedem Seitenverhaeltnis an, scrollt nicht mit, wird nie gekachelt und
        ist dabei immer vollstaendig zu sehen;
     2. die Flaechen der Seite werden durchscheinend (--oberflaeche/--bg mit
        Alpha), damit das Motiv ueberall durchtraegt statt vom Inhalt
        zugedeckt zu werden;
     3. eine sehr langsame Bewegung auf der unscharfen Fuellebene haelt die
        Seite in Bewegung, ohne das scharfe Bild anzufassen. */
/* =========================================================================
   DER DYNAMISCHE MODUS UEBERSCHRIEB DEN AKZENT MIT BLAU
   =========================================================================
   Hier stand `--akzent: #8CC2FF` - ein helles Blau, passend zum Motiv im
   Hintergrund und zum damaligen blauen Portal.

   Seit das Portal gold ist, war das ein Schalter, der den ganzen Umbau
   zuruecknahm: Wer den dynamischen Hintergrund eingeschaltet hatte, sah
   weiterhin eine blaue Seite - und musste denken, es habe sich nichts
   geaendert.

   Was dieser Modus WIRKLICH tut, bleibt: Die Flaechen werden durchscheinend,
   damit das Motiv ueberall durchtraegt. Das ist der Zweck, und dafuer
   braucht es keine eigene Leitfarbe.

   Die Farben sind deshalb nicht mehr fest eingetragen, sondern aus den
   Tokens gemischt: `color-mix` gegen `transparent` macht aus der Flaeche
   der Seite eine durchscheinende Flaeche - in jedem Modus, mit jeder
   spaeteren Farbaenderung.
   ========================================================================= */
body.dynamisch-modus{
  /* Ein tiefer, kuehler Grund unter dem Motiv - er traegt den Schleier, der
     den Text lesbar haelt. */
  --bg: rgba(9,11,18,0.84);
  --oberflaeche: rgba(24,28,42,0.62);
  --oberflaeche-2: rgba(38,44,62,0.66);

  /* Dieselbe Tonung wie `--oberflaeche` oben, aber OHNE Alpha - siehe
     die Begruendung bei der Definition in :root. Cookie-Einstellungen
     und News & Updates sollen ueber dem Hintergrundbild lesbar bleiben,
     nicht durchscheinend werden. */
  --oberflaeche-modal: rgb(24,28,42);

  /* Etwas heller als sonst: Auf einem Bild braucht Text mehr Abstand zum
     Untergrund als auf einer ruhigen Flaeche. */
  --text: #F3EFE4;
  --text-2: #C0B8A8;

  --border: rgba(233,193,113,0.26);
  --kante-gold: rgba(233,193,113,0.34);

  /* Der Akzent bleibt Gold. Genau das war vorher anders. */
  background:transparent;
}
/* Der Hintergrund besteht in diesem Modus aus ZWEI festen Ebenen. Grund:
/* Der Hintergrund besteht aus ZWEI festen Ebenen:

     body::before  = das Bild selbst, formatfuellend (cover)
     body::after   = Schleier und Lichtakzente fuer die Textlesbarkeit

   WARUM COVER UND NICHT CONTAIN
   Frueher lag hier eine unscharfe Fuellebene unter einem contain-Bild: Das
   Motiv war dadurch immer vollstaendig zu sehen, sass aber als Rechteck in
   der Mitte, mit weichgezeichneten Raendern links und rechts. Gewuenscht ist
   eine wirklich formatfuellende Flaeche - deshalb jetzt cover. Das Bild fuellt
   damit jede Fenstergroesse und jedes Seitenverhaeltnis randlos aus, und die
   Fuellebene entfaellt ersatzlos. Nebeneffekt: Der Weichzeichner ist weg, der
   auf Mobilgeraeten der teuerste Teil der ganzen Darstellung war.

   DER ZUSCHNITT IST DAS EIGENTLICHE THEMA
   Ultra_Wide.jpg ist 3226x1382, also 2,33:1. Ein Handy im Hochformat hat rund
   0,46:1. Beides gleichzeitig - vollstaendig UND randlos - ist geometrisch
   unmoeglich: Bei cover bleiben auf dem Handy nur etwa 20 % der Bildbreite
   sichtbar.

   Entscheidend ist deshalb, WELCHE 20 %. Das Motiv hat seine Dichte an den
   Raendern - links das violette Portal, rechts die blaue Konstellation ueber
   der schwebenden Festung -, waehrend die Mitte fast leerer Nachthimmel ist.
   Ein mittiger Zuschnitt wuerde auf dem Handy also ausgerechnet die leere
   Flaeche zeigen. Bei schmalen Seitenverhaeltnissen wandert der Ausschnitt
   deshalb nach rechts (siehe Media Query weiter unten).

   BILDGROESSEN
   Ausgeliefert wird WebP mit JPEG als Rueckfallebene, und die Aufloesung
   richtet sich nach der Fensterbreite: 900 px fuer Handys (13 KB), 1600 px
   fuer Tablets (33 KB), volle Breite fuer Desktop (100 KB). Die volle Datei
   auf ein Handy zu schicken, um davon vier Fuenftel wegzuschneiden, waere
   ueber Mobilfunk die teuerste denkbare Art, einen Hintergrund zu zeigen.

   background-color #070A1A entspricht der gemessenen Randfarbe des Bildes und
   greift nur, falls die Datei nicht laedt. Der :root-Praefix hebt die
   Spezifitaet ueber die Deckkraft-Regeln oben. */
:root body.dynamisch-modus::before{
  opacity:1;
  background-color:#070A1A;
  /* Zuerst die einfache Form fuer Browser ohne image-set - sie laedt JPEG.
     Die Zeile darunter ueberschreibt sie, wo image-set verstanden wird. */
  background-image:url('/assets/images/ultra-wide.jpg');
  background-image:image-set(
    url('/assets/images/ultra-wide.webp') type('image/webp'),
    url('/assets/images/ultra-wide.jpg') type('image/jpeg')
  );
  background-repeat:no-repeat;
  background-size:cover;
  background-position:center center;
  /* Kein Weichzeichner und keine Skalierung mehr: Das Bild soll scharf und
     unveraendert zu sehen sein. Eine Animation wuerde es zusaetzlich
     vergroessern und damit weiter beschneiden - genau das Gegenteil von
     "moeglichst vollstaendig". */
  filter:none;
  transform:none;
}

/* ---- Kleinere Dateien fuer kleinere Fenster ----
   Die Breiten sind grosszuegig gewaehlt: Ein Handy mit 390 px CSS-Breite und
   dreifacher Pixeldichte braucht rechnerisch 1170 px - vom Ultra-Wide-Bild
   wird davon aber nur ein Ausschnitt gezeigt, sodass 900 px Quellbreite
   ausreichen, ohne sichtbar weich zu werden. */
@media (max-width: 700px){
  :root body.dynamisch-modus::before{
    background-image:url('/assets/images/ultra-wide-900.webp');
    background-image:image-set(
      url('/assets/images/ultra-wide-900.webp') type('image/webp'),
      url('/assets/images/ultra-wide.jpg') type('image/jpeg')
    );
  }
}
@media (min-width: 701px) and (max-width: 1400px){
  :root body.dynamisch-modus::before{
    background-image:url('/assets/images/ultra-wide-1600.webp');
    background-image:image-set(
      url('/assets/images/ultra-wide-1600.webp') type('image/webp'),
      url('/assets/images/ultra-wide.jpg') type('image/jpeg')
    );
  }
}

/* ---- Zuschnitt bei hohen, schmalen Fenstern ----
   Ab hier ist das Fenster hoeher als breit - typisch fuer ein Handy im
   Hochformat. Der sichtbare Ausschnitt wandert nach rechts auf die blaue
   Konstellation ueber der Festung; mittig laege dort nur leerer Himmel.

   82 % ist an drei Ausschnitten geprueft (68 / 82 / 90 %) und der beste
   Kompromiss: Bei 68 % bleibt die rechte Haelfte des Streifens leerer Himmel,
   bei 90 % wird die Festung vom Bildrand angeschnitten. 82 % zeigt auf einem
   Handy mit 375x812 den Bereich von 66 % bis 86 % - dort stehen die blaue
   Konstellation oben und die schwebende Festung mit ihrem Lichtstrahl unten,
   beide vollstaendig im Bild. */
@media (max-aspect-ratio: 1/1){
  :root body.dynamisch-modus::before{
    background-position:82% center;
  }
}
/* Querformat auf dem Handy: Das Seitenverhaeltnis liegt dann nahe am Bild
   selbst - hier ist mittig richtig, und es ist fast alles zu sehen. */

/* Das Bild traegt an vielen Stellen helle Punkte; ohne diesen Schleier waere
   Text darauf stellenweise unlesbar. Die beiden Radialverlaeufe setzen zwei
   sehr weiche Lichtakzente, der Linearverlauf dunkelt oben und unten ab -
   dort stehen Kopfzeile und Fusszeile. */
body.dynamisch-modus::after{
  content:''; position:fixed; inset:0; z-index:-1; pointer-events:none;
  background-image:
    radial-gradient(50rem 32rem at 22% 18%, rgba(140,194,255,0.10) 0%, transparent 62%),
    radial-gradient(42rem 28rem at 78% 72%, rgba(120,110,220,0.09) 0%, transparent 65%),
    linear-gradient(to bottom, rgba(6,7,22,0.50) 0%, rgba(6,7,22,0.10) 32%, rgba(6,7,22,0.38) 100%);
  background-repeat:no-repeat, no-repeat, no-repeat;
  background-size:100% 100%, 100% 100%, 100% 100%;
  background-position:center, center, center;
}
/* Der Kopfbereich hat sonst eine deckende Flaeche - hier wuerde sie das Bild
   oben abschneiden. */
body.dynamisch-modus .kopf-bereich{ background:transparent; }
/* Flaechen bekommen eine Milchglas-Wirkung: dahinter weichgezeichnetes Bild
   statt harter Kante. Bewusst nur auf den grossen Behaeltern - auf jedem Chip
   waere der Weichzeichner reine Rechenlast. */
body.dynamisch-modus .karte,
body.dynamisch-modus .portal-karte,
body.dynamisch-modus .portal-kasten,
body.dynamisch-modus .mein-portal-karte,
body.dynamisch-modus .bericht-karte,
body.dynamisch-modus .admin-quickstart-karte,
body.dynamisch-modus .nachricht,
body.dynamisch-modus .nav-menue,
body.dynamisch-modus .admin-nav,
body.dynamisch-modus .finder-formular,
body.dynamisch-modus .bewertung-block,
body.dynamisch-modus .fortschritt-widget,
body.dynamisch-modus .konto-info{
  backdrop-filter:blur(9px);
  -webkit-backdrop-filter:blur(9px);
}
/* Der Akzent ist in diesem Modus ein helles Blau. Ueberall dort, wo er als
   FLAECHE dient (aktiver Reiter, Knopf, Filter-Chip), waere die sonst uebliche
   weisse Schrift darauf kaum noch lesbar - dort kommt deshalb ein dunkles
   Marineblau zum Einsatz. Gilt fuer alle Menues gleichermassen: Hauptnav,
   Aufklappmenue, Spielseiten-Reiter, Admin-Nav, Portal- und Suchfilter. */
body.dynamisch-modus .btn:not(.btn-sekundaer),
body.dynamisch-modus .segment-umschalter a.aktiv,
body.dynamisch-modus .spiel-admin-tab.ist-aktiv,
body.dynamisch-modus .admin-nav-tabs a.ist-aktiv,
body.dynamisch-modus .admin-tab.ist-aktiv,
body.dynamisch-modus .builder-tab.ist-aktiv,
body.dynamisch-modus .builder-schritt.ist-aktiv,
body.dynamisch-modus .inhalt-explorer-tab.ist-aktiv,
body.dynamisch-modus .suche-filter a.aktiv,
body.dynamisch-modus .fortschritt-status-btn.ist-aktiv,
body.dynamisch-modus .consent-btn-primaer{
  color:#0A1930;
}
/* =========================================================================
   ACHT BLAUE GEGENSTUECKE, DIE ES NICHT MEHR BRAUCHT
   =========================================================================
   Hier standen acht Regeln fuer `body.dynamisch-modus .spiel-detail-neu` -
   Titelverlauf, Karten-Hover, Badge, Hauptknopf, Explorer-Reiter,
   Bewertungsbalken. Ihr eigener Kommentar sagte, warum:

     „Titelverlauf, Karten-Hover, Badge, Hauptknopf und Bewertungsbalken
      sind auf der Spielseite FEST IN GOLD eingetragen - hier die blauen
      Gegenstuecke."

   Sie waren also die Gegenrechnung zu fest verdrahteten Goldwerten. Diese
   Werte gibt es nicht mehr: Die Spielseite hat keine eigene Palette und
   keine festen Farben mehr, sie nimmt `--akzent` wie jede andere Seite.

   Damit ist die Gegenrechnung nicht nur ueberfluessig, sondern falsch - sie
   faerbte die Spielseite blau, waehrend der Rest des Portals gold ist.

   Was der dynamische Modus fuer die Spielseite noch tun muss, steht in der
   einen Regel unten: durchscheinend statt deckend, damit das Motiv
   durchtraegt.
   ========================================================================= */
body.dynamisch-modus .spiel-detail-neu{
  background:
    radial-gradient(1200px 400px at 15% -10%,
      color-mix(in srgb, var(--akzent) 12%, transparent), transparent 60%),
    rgba(10,13,22,0.55);
  border:1px solid var(--kante-gold);
  backdrop-filter:blur(9px);
  -webkit-backdrop-filter:blur(9px);
  box-shadow:0 20px 50px rgba(0,0,0,.40);
}
/* Wer Bewegung reduziert haben will, bekommt dasselbe Bild - nur still. */
@media (prefers-reduced-motion: reduce){
  :root body.dynamisch-modus::before{ animation:none; }
}
a{ color:inherit; text-decoration:none; }
/* ===========================================================================
   EINE GRUNDLAGE FUER ALLE EINGABEFELDER
   ===========================================================================
   Es gab keine. Jeder Bereich hat sein eigenes Feld gebaut - der Builder, die
   Umfragen, die News, der Eintragseditor, der Admin-Wizard. Fuenf Regeln fuer
   dieselbe Sache, jede mit eigenen Werten fuer Innenabstand, Radius und
   Fokusrahmen.

   Das faellt nicht als Fehler auf, sondern als Unruhe: Die Felder sehen fast
   gleich aus, und "fast" ist genau das, was eine Seite billig wirken laesst.

   Hier steht ein Grundzustand als ELEMENT-Selektor. Er hat die niedrigste
   Spezifitaet, die es gibt - jede vorhandene Klassenregel gewinnt weiterhin
   gegen ihn. Er aendert also nichts an dem, was schon gestaltet ist, und
   faengt alles ab, was bisher nackt war.
   =========================================================================== */
input, select, textarea{
  font-family:var(--schrift-text);
  font-size:14px;
  color:var(--text);
  background:var(--bg);
  border:1px solid var(--border);
  border-radius:var(--radius-klein);
  padding:10px 12px;
  transition:border-color var(--dauer) var(--kurve),
             box-shadow var(--dauer) var(--kurve);
}
input::placeholder, textarea::placeholder{ color:var(--text-2); opacity:.75; }

/* Kaestchen und Schalter tragen die Akzentfarbe, ohne dass jede Stelle es
   einzeln sagen muss. */
input[type="checkbox"], input[type="radio"]{
  accent-color:var(--akzent); padding:0;
}

/* ---------------------------------------------------------------------------
   DER FOKUSRAHMEN - EINMAL, UND ZWAR SICHTBAR
   ---------------------------------------------------------------------------
   `:focus-visible` und nicht `:focus`: Der Rahmen erscheint bei Tastatur-
   bedienung und nicht bei jedem Mausklick. Ein Knopf, der nach dem Anklicken
   einen Rahmen behaelt, sieht kaputt aus - und genau deshalb entfernen ihn
   viele Seiten ganz. Damit ist die Seite dann mit der Tastatur unbedienbar.

   Zwei Ringe uebereinander: aussen die Akzentfarbe, innen ein schmaler Ring
   in der Hintergrundfarbe. So bleibt der Rahmen auf JEDEM Untergrund
   sichtbar - auch auf einer goldenen Flaeche, wo ein goldener Ring
   verschwinden wuerde.
   --------------------------------------------------------------------------- */
:focus-visible{
  outline:2px solid var(--akzent);
  outline-offset:2px;
  border-radius:var(--radius-klein);
}
input:focus-visible, select:focus-visible, textarea:focus-visible{
  outline:none;
  border-color:var(--akzent);
  box-shadow:0 0 0 3px color-mix(in srgb, var(--akzent) 22%, transparent);
}

/* Markierter Text in der Akzentfarbe. Eine Kleinigkeit, die man nicht bewusst
   bemerkt - aber die blaue Standardmarkierung des Browsers auf einer goldenen
   Seite bemerkt man. */
::selection{
  background:color-mix(in srgb, var(--akzent) 30%, transparent);
  color:var(--text);
}

/* Die Bildlaufleiste. Auf einer dunklen Seite ist die helle Standardleiste
   des Browsers ein weisser Balken am Rand. */
*{ scrollbar-color:var(--border) transparent; scrollbar-width:thin; }
::-webkit-scrollbar{ width:11px; height:11px; }
::-webkit-scrollbar-track{ background:transparent; }
::-webkit-scrollbar-thumb{
  background:var(--border); border-radius:var(--radius-rund);
  border:3px solid transparent; background-clip:padding-box;
}
::-webkit-scrollbar-thumb:hover{ background:var(--text-2); background-clip:padding-box; }
/* ---------- Ueberschriften: Serife ----------------------------------------

   Der einzelne Griff, der am meisten ausmacht. Eine Grotesk-Schlagzeile
   liest sich wie eine Benutzeroberflaeche, eine Serifen-Schlagzeile wie
   ein Text, den jemand geschrieben hat.

   `letter-spacing` geht von -0.01em auf -0.015em: Serifen brauchen bei
   grossen Graden etwas mehr Zug, sonst fallen die Woerter auseinander.
   `font-weight:600` faellt weg - eine Serife im Halbfetten wirkt gedrungen,
   und die Systemserifen bringen ohnehin selten einen 600er Schnitt mit. */
h1,h2,h3{
  font-family:var(--schrift-display);
  font-weight:600; letter-spacing:-0.015em; line-height:1.22;
}

/* h4 bis h6 bleiben bei der Grotesk: Sie stehen als Kleinueberschriften in
   Kaesten und Tabellen, oft versal und klein - dort ist eine Serife nicht
   feierlich, sondern schlecht lesbar. */
h4,h5,h6{ font-family:var(--schrift-text); font-weight:600; }

/* ---------- Kopf-Header: kompaktes, randloses Hintergrundbild + Hauptnav + Suche ---------- */
.kopf-bereich{ background:var(--bg); padding:20px 24px 0; }
/* Bewusst OHNE overflow:hidden - das wuerde das Admin-Aufklappmenue in der
   oberen Leiste abschneiden. Die Rundung liegt stattdessen direkt auf den
   Bildebenen (.kopf-hintergrund / .kopf-overlay), das Ergebnis sieht
   identisch aus. */
/* Feste Breite: Das Kopfbild hat 220px Hoehe. Mitwachsen wuerde es bei
   2400px zu einem Streifen ziehen, und das Motiv haelt das nicht aus. */
.kopf-bild-rahmen{
  position:relative; border-radius:var(--radius-gross);
  max-width:var(--kopf-breite); height:220px; margin:0 auto;
  /* Die Farbe hinter dem Bild - sichtbar, solange es laedt. Sie folgt
     dem MOTIV und nicht dem Modus: Im dunklen Modus liegt dort das helle
     Bild, also ist auch der Rueckfall hell. Andersherum blitzte beim
     Laden ein schwarzer Kasten auf, der gleich darauf hell wird. */
  background-color:#F1EDE3;
  box-shadow:0 10px 30px rgba(0,0,0,0.18);
}
.kopf-hintergrund, .kopf-overlay{ border-radius:var(--radius-gross); }
:root:not([data-theme="dunkel"]) .kopf-bild-rahmen{ background-color:#0A0C12; }
/* Kopfbanner: zwei Motive, gesteuert vom Hell-/Dunkelmodus-Schalter.
   Bewusst unabhaengig vom dynamischen Hintergrund - der Header behaelt sein
   eigenes Bild, auch wenn dahinter das ganzseitige Motiv laeuft.

   ===========================================================================
   DIE ZUORDNUNG IST ABSICHTLICH ueberKREUZ
   ===========================================================================
   BGDunkel im HELLEN Modus, BGHell im DUNKLEN. Das sieht nach einem
   Vertauscher aus und ist ausdruecklich so gewollt.

   Der Grund: Der Kopf ist keine Flaeche, die sich in die Seite einfuegen
   soll, sondern ein Bild, das sich von ihr abheben soll. Ein helles Motiv
   auf hellem Grund verschwindet, ein dunkles auf dunklem ebenso - in beiden
   Faellen sieht man einen Kasten und kein Bild.

   Ueber Kreuz traegt der Kopf jedes Mal den staerkeren Kontrast zur Seite
   dahinter, und der weisse Schriftzug darauf bleibt in beiden Modi lesbar
   (das Overlay unten sorgt dafuer).

   Wer das fuer einen Fehler haelt und es "richtigstellt", dreht es zurueck -
   deshalb steht der Grund hier und nicht nur im Verlauf.
   =========================================================================== */
.kopf-hintergrund{
  position:absolute; inset:0;
  background-image:url('/assets/images/BGDunkel.jpg');
  background-size:cover; background-repeat:no-repeat; background-position:center;
}
:root[data-theme="dunkel"] .kopf-hintergrund{ background-image:url('/assets/images/BGHell.jpg'); }
/* Im dynamischen Modus bleibt das Kopfbild wie es ist - nur der Schlagschatten
   wird kraeftiger, damit sich der Rahmen vom dunklen Motiv dahinter abhebt. */
body.dynamisch-modus .kopf-bild-rahmen{
  box-shadow:0 10px 34px rgba(0,0,0,0.55);
}
.kopf-overlay{
  position:absolute; inset:0; pointer-events:none;
  background:linear-gradient(to bottom, rgba(8,9,14,0.45) 0%, rgba(8,9,14,0) 30%);
}
.kopf-inhalt{
  position:relative; z-index:1;
  display:flex; justify-content:flex-end;
  padding:14px 18px;
}

/* Login / Benutzermenue oben rechts, ueber dem Bild */
.kopf-user-nav{ display:flex; align-items:center; gap:14px; font-size:13px; flex-wrap:wrap; justify-content:flex-end; }
.kopf-user-nav a{
  color:#F0F1F6; white-space:nowrap; text-shadow:0 1px 6px rgba(0,0,0,0.6);
  opacity:.9; transition:color .15s ease, opacity .15s ease;
}
.kopf-user-nav a:hover{ color:#fff; opacity:1; }
.kopf-user-nav a.aktiv{ color:#5B9BFF; opacity:1; }

.theme-umschalter{
  display:flex; align-items:center; justify-content:center; width:32px; height:32px; flex:0 0 auto;
  border:1px solid rgba(255,255,255,0.28); border-radius:var(--radius-klein); background:rgba(255,255,255,0.12); cursor:pointer;
  color:#fff; transition:background .15s ease;
}
.theme-umschalter:hover{ background:rgba(255,255,255,0.22); }
.theme-umschalter svg{ width:15px; height:15px; }
.theme-umschalter .icon-dunkel{ display:none; }
:root[data-theme="dunkel"] .theme-umschalter .icon-hell{ display:none; }
:root[data-theme="dunkel"] .theme-umschalter .icon-dunkel{ display:block; }

/* Hauptnavigation: eigene, dezente Leiste unterhalb des Bildes */
.hauptnav{
  display:flex; align-items:center; justify-content:center;
  /* Bleibt an der Kante des Kopfbildes - eine Navigationsleiste, die
     breiter ist als das Bild darueber, sieht aus wie ein Versehen. */
  /* Enger als die frueheren 22px: Seit die Punkte selbst Innenabstand
     haben, entsteht der Abstand aus ihnen. 22px zusaetzlich riss die
     Leiste auseinander. */
  gap:4px; flex-wrap:wrap; max-width:var(--kopf-breite); margin:14px auto 0; padding:7px 10px;
  background:var(--oberflaeche);
  border:1px solid var(--border);
  border-radius:var(--radius);
  box-shadow:var(--erhebung);
  font-size:14px;
}
/* Die Punkte sind Flaechen, keine blossen Woerter.

   Vorher war ein Menuepunkt ein Link mit Hover-Farbwechsel - beim Zielen
   traf man ein Wort, und zwischen zwei Woertern war nichts. Ein Punkt mit
   Innenabstand ist ein Ziel, das man auch knapp daneben trifft. */
.hauptnav a{
  color:var(--text-2); white-space:nowrap;
  padding:7px 11px; border-radius:var(--radius-klein);
  transition:color var(--dauer) var(--kurve), background var(--dauer) var(--kurve);
}
.hauptnav a:hover{ color:var(--text); background:var(--oberflaeche-2); }

/* Der aktive Punkt traegt Gold - und eine Kante darunter statt Fettdruck.
   Fettdruck macht den Punkt breiter als seine Nachbarn, und die Leiste
   springt beim Wechseln der Seite. */
.hauptnav a.aktiv{
  color:var(--akzent);
  background:color-mix(in srgb, var(--akzent) 9%, transparent);
  box-shadow:inset 0 -2px 0 var(--akzent);
}
.hauptnav-eintrag{ display:inline-flex; align-items:center; gap:2px; }
.hauptnav-admin-plus{
  display:inline-flex; align-items:center; justify-content:center;
  width:16px; height:16px; border-radius:5px; font-size:12px; font-weight:700; line-height:1;
  background:color-mix(in srgb, var(--akzent) 14%, transparent); color:var(--akzent) !important;
}
.hauptnav-admin-plus:hover{ background:color-mix(in srgb, var(--akzent) 26%, transparent); }

/* Zweistufiges Aufklappmenü "Spiele" -> Spiel -> Inhaltstyp.
   Reines CSS: :hover für die Maus, :focus-within für die Tastatur - so
   bleibt es ohne JavaScript nutzbar. Die Menüs sind nur unsichtbar
   (visibility), nicht display:none, damit der Übergang weich bleibt. */
.nav-aufklapp{ position:relative; }
.nav-pfeil{ font-size:10px; margin-left:4px; opacity:.7; }
.nav-pfeil-rechts{ margin-left:auto; padding-left:10px; }

.nav-menue{
  position:absolute; top:100%; left:0; z-index:200; min-width:230px;
  display:flex; flex-direction:column; padding:6px; margin-top:6px;
  background:var(--oberflaeche); border:1px solid var(--border);
  border-radius:var(--radius);
  /* Die Goldkante oben: Das Menue soll wirken, als klappe eine Seite
     auf, nicht als schiebe sich ein Kasten davor. */
  border-top-color:var(--kante-gold);
  box-shadow:var(--erhebung-hoch);
  visibility:hidden; opacity:0; transform:translateY(-4px);
  transition:opacity .14s ease, transform .14s ease, visibility .14s;
  /* KEIN overflow/max-height: beides erzeugt einen Beschneidungsbereich,
     in dem das seitlich herausklappende Untermenü unsichtbar bliebe.
     Die Länge der Liste wird stattdessen serverseitig begrenzt (siehe
     kopf.php: MENUE_MAX_SPIELE + Zeile "Alle Spiele"). */
}
.nav-aufklapp:hover > .nav-menue,
.nav-aufklapp:focus-within > .nav-menue{ visibility:visible; opacity:1; transform:translateY(0); }

/* Unsichtbare Brücke: verhindert, dass das Menü zuklappt, während die
   Maus die Lücke zwischen Leiste und Menü überquert. */
.nav-aufklapp > .nav-menue::before{
  content:''; position:absolute; top:-8px; left:0; right:0; height:8px;
}

.nav-menue-zeile{ position:relative; display:flex; align-items:center; }
.nav-menue-zeile > a{
  flex:1; display:flex; align-items:center; gap:8px;
  padding:8px 10px; border-radius:7px; font-size:13.5px;
  color:var(--text-2) !important; white-space:nowrap;
}
.nav-menue-zeile > a:hover,
.nav-menue-zeile:focus-within > a{ background:var(--bg); color:var(--text) !important; }
/* `tabular-nums` ist hier nicht Kosmetik: Ohne gleich breite Ziffern
   zappelt die rechte Kante der Spalte von Zeile zu Zeile. */
.nav-zahl{
  margin-left:auto; font-family:var(--schrift-mono); font-size:10.5px;
  color:var(--text-2); font-variant-numeric:tabular-nums; opacity:.75;
}

/* ---- Das breite Menue "Entdecken" ----------------------------------------

   Die acht Inhaltsarten standen frueher einzeln in der Kopfzeile. Sie stehen
   jetzt hier, nach Gruppen sortiert und mit Zahlen.

   `auto-fit` und nicht `repeat(5, 1fr)`: Bei fuenf Gruppen stehen fuenf
   Spalten, bei zweien zwei - und nicht zwei Spalten neben drei Loechern. Was
   im Katalog steht, entscheidet die Breite; das Stylesheet raet nicht mit. */
.nav-menue-breit{
  display:grid; grid-template-columns:repeat(auto-fit, minmax(190px, 1fr));
  gap:4px 20px; padding:18px 20px; min-width:min(880px, 84vw);
}

/* Das Menue haengt am linken Rand seines Punktes. Bei einem 880px breiten
   Menue an einem Punkt weit rechts liefe es aus dem Bild - deshalb wird es
   hier mittig unter der Leiste ausgerichtet statt am Punkt.

   `translateX(-50%)` zusammen mit dem Aufklapp-Versatz: Die Bewegung beim
   Oeffnen muss dieselbe bleiben, sonst springt das Menue seitlich. */
.nav-aufklapp > .nav-menue-breit{
  left:50%; transform:translate(-50%, -4px);
}
.nav-aufklapp:hover > .nav-menue-breit,
.nav-aufklapp:focus-within > .nav-menue-breit{ transform:translate(-50%, 0); }

.nav-spalte{ display:flex; flex-direction:column; gap:1px; }

/* Die Gruppenueberschrift: klein, versal, gedaempft. Sie soll die Spalte
   benennen, nicht mit den Eintraegen um Aufmerksamkeit ringen - deshalb
   Grotesk und nicht die Serife der uebrigen Ueberschriften. */
.nav-spalte-titel{
  font-family:var(--schrift-text);
  font-size:10.5px; font-weight:700; text-transform:uppercase;
  letter-spacing:.09em; color:var(--text-2);
  padding:0 9px 8px; margin-bottom:4px;
  border-bottom:1px solid var(--border);
}

.nav-spalte-zeile{
  display:flex; align-items:baseline; gap:10px;
  padding:6px 9px; border-radius:var(--radius-klein);
  font-size:13.5px; color:var(--text-2) !important;
  transition:background var(--dauer) var(--kurve), color var(--dauer) var(--kurve);
}
.nav-spalte-zeile:hover,
.nav-spalte-zeile:focus-visible{
  background:var(--oberflaeche-2); color:var(--text) !important;
}
.nav-spalte-zeile.aktiv{ color:var(--akzent) !important; }

/* Die letzte Spalte ist ein Angebot, kein Inhalt: Wer in keiner Zeile sein
   Anliegen wiedererkennt, klickt sonst gar nicht. */
.nav-spalte-aktion{ gap:8px; }
.nav-aktion{
  display:block; padding:11px 12px;
  border:1px solid var(--border); border-radius:var(--radius-klein);
  background:var(--bg);
  transition:border-color var(--dauer) var(--kurve), background var(--dauer) var(--kurve);
}
.nav-aktion:hover{
  border-color:var(--kante-gold);
  background:var(--oberflaeche-2);
}
.nav-aktion strong{
  display:block; font-size:13.5px; color:var(--akzent); margin-bottom:2px;
}
.nav-aktion small{
  display:block; font-size:11.5px; line-height:1.45; color:var(--text-2);
  white-space:normal;   /* die Leiste setzt nowrap - hier ist es ein Satz */
}
/* ---------------------------------------------------------------------------
   Admin-Geraete (WebAuthn/Passkey)
   --------------------------------------------------------------------------- */
.geraet-banner{
  padding:14px 18px; border-radius:10px; margin-bottom:20px; font-size:13.5px; line-height:1.55;
}
.geraet-banner-info{
  background:color-mix(in srgb, var(--akzent) 8%, transparent);
  border:1px solid color-mix(in srgb, var(--akzent) 32%, transparent);
}
/* Warnung bei nur einem Geraet - das ist ein echtes Aussperrrisiko. */
.geraet-banner-warnung{
  background:color-mix(in srgb, var(--warnung) 10%, transparent);
  border:1px solid color-mix(in srgb, var(--warnung) 40%, transparent);
}

/* Leerzustaende (kein Geraet / nicht bestaetigt) - mittig, ruhig, mit
   genau einer klaren Handlung. */
.geraet-leer{
  text-align:center; padding:46px 28px;
  background:var(--oberflaeche); border:1px solid var(--border); border-radius:14px;
}
.geraet-leer-icon{
  display:inline-flex; align-items:center; justify-content:center;
  width:68px; height:68px; border-radius:50%; margin-bottom:16px;
  background:color-mix(in srgb, var(--akzent) 12%, transparent); color:var(--akzent);
}
.geraet-leer-titel{ font-size:19px; font-weight:700; margin:0 0 8px; }

.geraet-liste{ display:flex; flex-direction:column; gap:8px; }
.geraet{
  display:flex; align-items:center; gap:14px; flex-wrap:wrap;
  padding:14px 16px; border-radius:10px;
  background:var(--bg); border:1px solid var(--border);
}
.geraet.ist-widerrufen{ opacity:.6; }
.geraet-icon{
  display:flex; align-items:center; justify-content:center;
  width:38px; height:38px; border-radius:10px; flex:0 0 auto;
  background:color-mix(in srgb, var(--akzent) 12%, transparent); color:var(--akzent);
}
.geraet.ist-widerrufen .geraet-icon{ background:var(--oberflaeche); color:var(--text-2); }
.geraet-daten{ display:flex; flex-direction:column; gap:3px; flex:1; min-width:180px; }
.geraet-name{ font-size:14.5px; font-weight:600; }
.geraet-meta{ font-size:12px; color:var(--text-2); }
.geraet-status{
  font-family:'IBM Plex Mono',monospace; font-size:10px; font-weight:700;
  text-transform:uppercase; letter-spacing:.06em; padding:4px 10px; border-radius:var(--radius-rund);
  background:var(--oberflaeche); border:1px solid var(--border); color:var(--text-2); flex:0 0 auto;
}
.geraet-status.ist-aktiv{
  color:var(--erfolg); border-color:color-mix(in srgb, var(--erfolg) 40%, transparent);
  background:color-mix(in srgb, var(--erfolg) 10%, transparent);
}
/* Zurueckhaltend gestaltet: Widerrufen ist selten und soll nicht der
   auffaelligste Knopf der Seite sein - erst beim Hoverkontakt rot. */
.geraet-widerrufen{
  padding:7px 14px; border-radius:var(--radius-klein); font-size:12.5px; font-family:inherit; cursor:pointer;
  background:transparent; border:1px solid var(--border); color:var(--text-2);
  transition:color .15s ease, border-color .15s ease, background .15s ease;
}
.geraet-widerrufen:hover{
  color:var(--fehler); border-color:var(--fehler);
  background:color-mix(in srgb, var(--fehler) 10%, transparent);
}

/* Partnerlink-Knopf auf der Spielseite. Bewusst als Nebenhandlung
   gestaltet und sichtbar als Anzeige gekennzeichnet - er soll nicht
   auffaelliger sein als die eigentlichen Inhalte. */
.btn-kaufen{
  display:inline-flex; align-items:center; gap:9px;
  background:var(--oberflaeche); color:var(--text);
  border:1px solid color-mix(in srgb, var(--erfolg) 45%, var(--border));
}
.btn-kaufen:hover{ border-color:var(--erfolg); color:var(--erfolg); }
.btn-kaufen-anzeige{
  font-family:'IBM Plex Mono',monospace; font-size:9px; font-weight:700;
  text-transform:uppercase; letter-spacing:.07em;
  padding:2px 6px; border-radius:4px;
  background:color-mix(in srgb, var(--text-2) 20%, transparent); color:var(--text-2);
}
.btn-kaufen-hinweis{
  display:inline-flex; align-items:center;
  font-size:11.5px; color:var(--text-2); margin-left:4px;
}

/* Affiliate-Verwaltung im Adminbereich. */
.affiliate-liste{ display:flex; flex-direction:column; gap:10px; }
.affiliate-zeile{
  display:grid; grid-template-columns:minmax(150px,1fr) minmax(0,2.4fr) auto;
  gap:16px; align-items:end;
  padding:14px 16px; border-radius:10px;
  background:var(--bg); border:1px solid var(--border);
}
.affiliate-zeile.ist-aktiv{ border-color:color-mix(in srgb, var(--erfolg) 40%, transparent); }
.affiliate-spiel{ display:flex; flex-direction:column; gap:5px; }
.affiliate-spiel-name{ font-size:14px; font-weight:600; color:var(--text); text-decoration:none; }
.affiliate-spiel-name:hover{ color:var(--akzent); }
.affiliate-status{
  font-family:'IBM Plex Mono',monospace; font-size:9.5px; font-weight:700;
  text-transform:uppercase; letter-spacing:.05em; align-self:flex-start;
  padding:3px 8px; border-radius:5px;
  background:var(--oberflaeche); border:1px solid var(--border); color:var(--text-2);
}
.affiliate-status.ist-aktiv{
  color:var(--erfolg); border-color:color-mix(in srgb, var(--erfolg) 40%, transparent);
}
.affiliate-felder{ display:grid; grid-template-columns:2fr 1fr 1fr; gap:10px; }
.affiliate-felder label{ display:flex; flex-direction:column; gap:4px; font-size:11px; color:var(--text-2); margin:0; }
.affiliate-felder input{
  padding:8px 10px; border-radius:7px; font-size:12.5px; font-family:inherit;
  background:var(--oberflaeche); border:1px solid var(--border); color:var(--text); outline:none;
}
.affiliate-felder input:focus{ border-color:var(--akzent); }
.affiliate-aktion{ display:flex; flex-direction:column; gap:8px; align-items:flex-start; }
.affiliate-schalter{ display:flex; align-items:center; gap:6px; font-size:12px; margin:0; cursor:pointer; }
.affiliate-schalter input{ width:auto; margin:0; }
.affiliate-aktion .btn{ padding:8px 16px; font-size:13px; }
@media (max-width:1000px){
  .affiliate-zeile{ grid-template-columns:1fr; }
  .affiliate-felder{ grid-template-columns:1fr; }
}

/* Kennzahl als Link (z.B. "Noch unbearbeitet" -> gefilterte Liste). */
.dash-kennzahl-link{ text-decoration:none; transition:border-color .15s ease; }
.dash-kennzahl-link:hover{ border-color:var(--akzent); }

/* Bearbeitungsstand je Beitrag - Auswahl direkt in der Tabelle. */
.beitrag-stand-form{ display:flex; align-items:center; gap:5px; }
.beitrag-stand{
  padding:5px 8px; border-radius:7px; font-size:12px; font-family:inherit; cursor:pointer;
  background:var(--bg); border:1px solid var(--border); color:var(--text); outline:none;
  max-width:150px;
}
.beitrag-stand:focus{ border-color:var(--akzent); }
/* Farbe folgt dem Stand, damit die Spalte auf einen Blick lesbar ist. */
.beitrag-stand.stand-neu{ color:var(--warnung); border-color:color-mix(in srgb, var(--warnung) 45%, transparent); }
.beitrag-stand.stand-in_bearbeitung{ color:var(--akzent); border-color:color-mix(in srgb, var(--akzent) 45%, transparent); }
.beitrag-stand.stand-bearbeitet{ color:var(--erfolg); border-color:color-mix(in srgb, var(--erfolg) 45%, transparent); }
.beitrag-stand.stand-abgelehnt{ color:var(--text-2); }
.beitrag-stand-knopf{
  padding:5px 9px; border-radius:7px; font-size:12px; line-height:1; cursor:pointer;
  background:transparent; border:1px solid var(--border); color:var(--text-2);
}
.beitrag-stand-knopf:hover{ color:var(--akzent); border-color:var(--akzent); }

/* Filterbloecke: Art und Bearbeitungsstand getrennt beschriftet. */
.beitrag-filter-block{ display:flex; align-items:center; gap:12px; flex-wrap:wrap; margin-bottom:10px; }
.beitrag-filter-titel{
  font-family:'IBM Plex Mono',monospace; font-size:10.5px; font-weight:700;
  text-transform:uppercase; letter-spacing:.06em; color:var(--text-2);
  flex:0 0 130px;
}
.beitrag-filter-chip.stand-neu.ist-aktiv{
  color:var(--warnung); border-color:var(--warnung);
  background:color-mix(in srgb, var(--warnung) 12%, transparent);
}
.beitrag-filter-chip.stand-bearbeitet.ist-aktiv{
  color:var(--erfolg); border-color:var(--erfolg);
  background:color-mix(in srgb, var(--erfolg) 12%, transparent);
}
@media (max-width:640px){ .beitrag-filter-titel{ flex:1 1 100%; } }

/* Filterleiste der eingegangenen Beitraege (nach Art). */
.beitrag-filter{ display:flex; flex-wrap:wrap; gap:7px; margin-bottom:16px; }
.beitrag-filter-chip{
  display:inline-flex; align-items:center; gap:7px;
  padding:7px 14px; border-radius:var(--radius-rund); font-size:13px; text-decoration:none;
  background:var(--oberflaeche); border:1px solid var(--border); color:var(--text-2);
  transition:color .15s ease, border-color .15s ease;
}
.beitrag-filter-chip:hover{ color:var(--text); border-color:var(--akzent); }
.beitrag-filter-chip.ist-aktiv{
  color:var(--akzent); font-weight:600;
  border-color:var(--akzent); background:color-mix(in srgb, var(--akzent) 10%, transparent);
}
/* Arten ohne Beitraege bleiben sichtbar, damit die Leiste ihre Form
   behaelt - nur gedaempft, damit klar ist, dass dort nichts liegt. */
.beitrag-filter-chip.ist-leer{ opacity:.45; }
.beitrag-filter-zahl{
  font-family:'IBM Plex Mono',monospace; font-size:11px;
  font-variant-numeric:tabular-nums; opacity:.85;
}

/* Aufklappbarer Volltext eines Beitrags in der Tabelle. */
.beitrag-text{ margin-top:6px; font-weight:400; }
.beitrag-text > summary{
  cursor:pointer; font-size:11.5px; color:var(--akzent);
  list-style:none; display:inline-block;
}
.beitrag-text > summary::-webkit-details-marker{ display:none; }
.beitrag-text > summary::before{ content:'▸ '; font-size:10px; }
.beitrag-text[open] > summary::before{ content:'▾ '; }
.beitrag-text > p{
  margin:8px 0 0; padding:10px 12px; border-radius:var(--radius-klein);
  background:var(--bg); border:1px solid var(--border);
  font-size:12.5px; line-height:1.6; white-space:pre-wrap; max-width:60ch;
}

.beitrag-von{ display:block; font-size:13px; font-weight:600; }
.beitrag-mail{ display:block; font-size:11.5px; color:var(--text-2); text-decoration:none; }
.beitrag-mail:hover{ color:var(--akzent); }

/* Empfaengerwahl beim Versand einer Mitteilung. */
.empfaenger-wahl{ border:1px solid var(--border); border-radius:10px; padding:14px 16px; margin-bottom:16px; }
.empfaenger-wahl legend{
  font-family:'IBM Plex Mono',monospace; font-size:10.5px; font-weight:700;
  text-transform:uppercase; letter-spacing:.06em; color:var(--text-2); padding:0 6px;
}
.empfaenger-option{ display:flex; align-items:center; gap:9px; padding:6px 0; font-size:14px; cursor:pointer; }
.empfaenger-option input{ width:auto; margin:0; }

/* Die Personenliste erscheint erst, wenn "Nur an ausgewaehlte" gewaehlt ist.
   Reines CSS ueber :has() - ohne JavaScript bleibt sie sichtbar, was
   funktional voellig in Ordnung ist. */
.empfaenger-liste{
  display:none; margin-top:10px; padding-top:12px; border-top:1px solid var(--border);
  max-height:260px; overflow-y:auto;
}
.empfaenger-wahl:has(input[value="auswahl"]:checked) .empfaenger-liste{ display:block; }

.empfaenger-person{
  display:flex; align-items:center; gap:10px; padding:7px 8px;
  border-radius:7px; font-size:13.5px; cursor:pointer;
}
.empfaenger-person:hover{ background:var(--bg); }
.empfaenger-person input{ width:auto; margin:0; flex:0 0 auto; }
.empfaenger-name{ font-weight:600; }
.empfaenger-mail{ color:var(--text-2); font-size:12px; flex:1; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.empfaenger-rolle{
  font-family:'IBM Plex Mono',monospace; font-size:9.5px; font-weight:700;
  text-transform:uppercase; letter-spacing:.05em; padding:2px 7px; border-radius:5px;
  background:color-mix(in srgb, var(--akzent) 14%, transparent); color:var(--akzent);
}

/* Zaehler fuer ungelesene Nachrichten (Header und Reiter). */
.kopf-zaehler{
  display:inline-flex; align-items:center; justify-content:center;
  min-width:18px; height:18px; padding:0 5px; margin-left:6px;
  border-radius:var(--radius-rund); background:var(--fehler); color:#fff !important;
  font-size:11px; font-weight:700; font-variant-numeric:tabular-nums;
}

/* Nachrichtenboard: Mitteilungen und eigene Beitraege. */
.nachricht-liste{ display:flex; flex-direction:column; gap:14px; }
.nachricht{
  background:var(--oberflaeche); border:1px solid var(--border);
  border-radius:var(--radius); padding:18px 20px;
}
/* Ungelesenes deutlich, aber ohne Blinken oder Farbgewitter. */
.nachricht.ist-ungelesen{
  border-color:color-mix(in srgb, var(--akzent) 45%, transparent);
  background:color-mix(in srgb, var(--akzent) 5%, var(--oberflaeche));
}
.nachricht-kopf{ display:flex; align-items:center; gap:10px; flex-wrap:wrap; margin-bottom:10px; }
.nachricht-betreff{ font-size:16px; font-weight:700; margin:0; flex:1 1 auto; }
.nachricht-datum{ font-size:12px; color:var(--text-2); white-space:nowrap; }
.nachricht-text{ font-size:14px; line-height:1.65; margin:0; white-space:pre-wrap; }
.nachricht-aktion{ margin-top:12px; }

.nachricht-art{
  font-family:'IBM Plex Mono',monospace; font-size:10px; font-weight:700;
  text-transform:uppercase; letter-spacing:.06em; padding:3px 9px; border-radius:5px;
  background:var(--bg); border:1px solid var(--border); color:var(--text-2); white-space:nowrap;
}
.nachricht-art-ankuendigung{ color:var(--akzent); border-color:color-mix(in srgb, var(--akzent) 40%, transparent); }
.nachricht-art-wartung{ color:var(--warnung); border-color:color-mix(in srgb, var(--warnung) 40%, transparent); }
.nachricht-art-wichtig{ color:var(--fehler); border-color:color-mix(in srgb, var(--fehler) 40%, transparent); }

.nachricht-status{
  font-size:11px; font-weight:600; padding:3px 9px; border-radius:var(--radius-rund);
  background:var(--bg); border:1px solid var(--border); color:var(--text-2); white-space:nowrap;
}
.nachricht-status-umgesetzt{ color:var(--erfolg); border-color:color-mix(in srgb, var(--erfolg) 40%, transparent); }
.nachricht-status-abgelehnt{ color:var(--text-2); }

/* "Mein RPGPortal": Reiter ueber dem Kasten, Titel/Untertitel und der
   Inhalt des gewaehlten Reiters IM Kasten. */
.portal-kasten{
  background:var(--oberflaeche); border:1px solid var(--border);
  border-radius:0 12px 12px 12px; padding:26px 28px 30px;
}
.portal-kasten > .portal-hero-titel{ margin:0 0 6px; }
.portal-untertitel{ margin:0 0 24px; }

/* Reiter in "Mein RPGPortal" - normale Links, kein JavaScript noetig.
   Sitzen direkt auf dem Kasten auf, der aktive Reiter geht nahtlos in
   ihn ueber (deshalb unten keine Linie und dieselbe Flaechenfarbe). */
.portal-tabs{
  display:flex; flex-wrap:wrap; gap:4px; margin:0;
  padding:0;
}
.portal-tab{
  display:inline-flex; align-items:center;
  padding:10px 18px; border-radius:10px 10px 0 0; font-size:14px;
  color:var(--text-2); text-decoration:none;
  border:1px solid transparent; border-bottom:none;
  transition:color .15s ease, background .15s ease;
}
.portal-tab:hover{ color:var(--text); background:color-mix(in srgb, var(--oberflaeche) 60%, transparent); }
.portal-tab.ist-aktiv{
  color:var(--akzent); font-weight:600;
  background:var(--oberflaeche); border-color:var(--border);
}
.portal-erfolg{
  background:#DCFCE7; color:#166534; border-radius:10px;
  padding:14px 16px; margin-bottom:20px;
}

/* ---------------------------------------------------------------------------
   Admin-Dashboard: Kennzahlen, Verlauf, Ranglisten, Erkenntnisse
   --------------------------------------------------------------------------- */
.dash-titel{ font-size:17px; font-weight:700; margin:30px 0 14px; }
.dash-titel:first-of-type{ margin-top:8px; }

.dash-kennzahlen{ display:grid; grid-template-columns:repeat(auto-fit,minmax(140px,1fr)); gap:18px; margin-bottom:30px; }
.dash-kennzahl{
  display:flex; flex-direction:column; gap:4px; padding:16px 18px;
  background:var(--oberflaeche); border:1px solid var(--border); border-radius:var(--radius);
}
.dash-kennzahl-wert{ font-size:26px; font-weight:800; letter-spacing:-.02em; font-variant-numeric:tabular-nums; }
.dash-kennzahl-label{ font-size:11.5px; color:var(--text-2); text-transform:uppercase; letter-spacing:.04em; }

.dash-karte{
  background:var(--oberflaeche); border:1px solid var(--border); border-radius:var(--radius);
  padding:18px 20px; margin-bottom:20px;
}
.dash-karte-titel{ font-size:14px; font-weight:700; margin:0 0 14px; }
.dash-spalten{ display:grid; grid-template-columns:repeat(auto-fit,minmax(320px,1fr)); gap:20px; }

/* Erkenntnisse: fertig formulierte Saetze aus den Messwerten. */
.dash-erkenntnisse{ display:grid; grid-template-columns:repeat(auto-fit,minmax(300px,1fr)); gap:20px; margin-bottom:30px; }
.dash-erkenntnis{
  padding:16px 18px; border-radius:var(--radius);
  background:color-mix(in srgb, var(--akzent) 7%, transparent);
  border:1px solid color-mix(in srgb, var(--akzent) 30%, transparent);
}
.dash-erkenntnis-titel{
  font-family:'IBM Plex Mono',monospace; font-size:10.5px; font-weight:700;
  text-transform:uppercase; letter-spacing:.07em; color:var(--akzent);
}
.dash-erkenntnis-text{ font-size:14px; line-height:1.55; margin:8px 0 8px; }
.dash-erkenntnis-quelle{ font-size:11px; color:var(--text-2); }

/* Tagesverlauf als einfaches Balkendiagramm - reines CSS, keine Bibliothek. */
.dash-verlauf{ display:flex; align-items:flex-end; gap:6px; height:150px; }
.dash-balken-spalte{ flex:1; display:flex; flex-direction:column; align-items:center; justify-content:flex-end; height:100%; gap:6px; }
.dash-balken{
  width:100%; border-radius:4px 4px 0 0; min-height:2px;
  background:linear-gradient(180deg, var(--akzent), color-mix(in srgb, var(--akzent) 55%, transparent));
}
.dash-balken-tag{ font-size:9.5px; color:var(--text-2); white-space:nowrap; }

/* Ranglisten mit Anteilsbalken. */
.dash-rang{ display:flex; align-items:center; gap:10px; padding:6px 0; }
.dash-rang-name{ flex:0 0 42%; font-size:13px; color:var(--text); text-decoration:none; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
a.dash-rang-name:hover{ color:var(--akzent); }
.dash-rang-leiste{ flex:1; height:7px; border-radius:4px; background:var(--bg); overflow:hidden; }
.dash-rang-leiste > span{ display:block; height:100%; background:var(--akzent); border-radius:4px; }
.dash-rang-zahl{ flex:0 0 auto; font-size:12px; font-weight:700; font-variant-numeric:tabular-nums; min-width:32px; text-align:right; }

/* Rechts sitzende Aufklappmenues (z.B. Admin) oeffnen rechtsbuendig,
   damit sie nicht ueber den Rand der Leiste hinauslaufen. */
.nav-aufklapp-rechts{ margin-left:auto; }
.nav-aufklapp-rechts > .nav-menue{ left:auto; right:0; }
.hauptnav-admin-menue{ color:var(--akzent) !important; font-weight:600; }

.nav-menue-mehr{ border-top:1px solid var(--border); margin-top:4px; padding-top:4px; }
.nav-menue-mehr > a{ color:var(--akzent) !important; font-size:12.5px; }

/* Jede weitere Ebene klappt seitlich nach rechts auf. Bewusst generisch
   ueber die Verschachtelung formuliert (nicht je Ebene einzeln), damit
   eine zusaetzliche Ebene ohne neue Regel funktioniert. */
.nav-menue-zeile > .nav-menue{
  top:-6px; left:100%; margin-top:0; margin-left:2px; min-width:200px;
}
.nav-menue-zeile:hover > .nav-menue,
.nav-menue-zeile:focus-within > .nav-menue{ visibility:visible; opacity:1; transform:translateY(0); }
/* Bruecke nach links, damit der Weg zur naechsten Ebene nicht abreisst. */
.nav-menue-zeile > .nav-menue::before{
  content:''; position:absolute; top:0; left:-6px; width:6px; height:100%;
}

/* Zu wenig Platz nach rechts: seitliche Ebenen nach links ausklappen. */
@media (max-width:1400px){
  .nav-menue-zeile > .nav-menue{ left:auto; right:100%; margin-left:0; margin-right:2px; }
  .nav-menue-zeile > .nav-menue::before{ left:auto; right:-6px; }
  .nav-pfeil-rechts{ transform:rotate(180deg); }
}
/* Auf Touch-Geräten gibt es kein Hover - dort führt "Spiele" einfach zur
   Übersichtsseite, statt ein nicht bedienbares Menü anzubieten. */
@media (hover:none){
  .nav-menue{ display:none; }
  .nav-pfeil{ display:none; }
}

/* Zentrierte Suchleiste unter der Hauptnavigation, im Seitendesign */
.kopf-suche{
  position:relative; display:flex; align-items:center; gap:0;
  width:min(100%, 560px); margin:14px auto 20px;
  border-radius:var(--radius-rund);
  background:var(--oberflaeche); border:1px solid var(--border);
}
.kopf-suche-lupe-btn{
  display:flex; align-items:center; justify-content:center; flex:0 0 auto;
  margin-left:16px; padding:0; border:none; background:transparent; cursor:pointer;
  color:var(--text-2);
}
.kopf-suche-lupe-btn:hover{ color:var(--text); }
.kopf-suche-lupe{ width:18px; height:18px; flex:0 0 auto; pointer-events:none; }
.kopf-suche input{
  flex:1; min-width:0; padding:13px 18px; border:none; background:transparent;
  color:var(--text); font-size:15px; font-family:inherit; outline:none;
}
.kopf-suche input::placeholder{ color:var(--text-2); }
.kopf-suche input::-webkit-search-cancel-button{ -webkit-appearance:none; }
.kopf-suche-trenner{ width:1px; height:24px; background:var(--border); flex:0 0 auto; }
.kopf-suche-filter{
  flex:0 0 auto; max-width:150px; border:none; background:transparent; color:var(--text-2);
  font-size:13.5px; font-family:inherit; padding:13px 14px; cursor:pointer; outline:none;
}
.kopf-suche-filter:hover{ color:var(--text); }

.kopf-suche-live{
  position:absolute; top:calc(100% + 8px); left:0; right:0; z-index:50;
  background:var(--oberflaeche); border:1px solid var(--border); border-radius:var(--radius);
  box-shadow:0 12px 30px rgba(0,0,0,0.25); overflow:hidden; max-height:340px; overflow-y:auto;
}
.kopf-suche-live-zeile{
  display:flex; align-items:center; gap:10px; padding:10px 16px; font-size:13.5px; color:var(--text);
  border-bottom:1px solid var(--border);
}
.kopf-suche-live-zeile:last-child{ border-bottom:none; }
.kopf-suche-live-zeile:hover{ background:var(--bg); }
.kopf-suche-live-typ{
  flex:0 0 auto; font-size:10.5px; text-transform:uppercase; letter-spacing:.04em; color:var(--text-2);
  border:1px solid var(--border); border-radius:var(--radius-rund); padding:2px 8px;
}
.kopf-suche-live-leer{ padding:14px 16px; font-size:13px; color:var(--text-2); }

/* Mobile: kompakter, aber gleiches ruhiges Layout */
@media (max-width:1024px){
  .kopf-bereich{ padding:14px 14px 0; }
  .kopf-bild-rahmen{ height:150px; border-radius:14px; }
  /* Bewusst KEIN overflow-x:auto: das würde einen Beschneidungsbereich
     erzeugen und die Aufklappmenüs abschneiden. Stattdessen umbrechen. */
  .hauptnav{ justify-content:flex-start; flex-wrap:wrap; gap:16px; font-size:13px; margin-top:12px; padding:10px 16px; }
  .kopf-suche{ width:100%; }
  .kopf-suche input{ padding:12px 16px; font-size:15px; }
  .kopf-suche-filter{ max-width:108px; font-size:12.5px; padding:12px 8px; }
}
@media (max-width:560px){
  .kopf-bild-rahmen{ height:120px; }
  .hauptnav{ gap:12px; padding:10px 14px; }
}

.zurueck-leiste{ max-width:var(--inhalt-breite); margin:14px auto 0; padding:0 24px; }
.zurueck-button{
  display:inline-flex; align-items:center; gap:6px; padding:7px 14px;
  border:1px solid var(--border); border-radius:var(--radius-rund); background:var(--oberflaeche);
  color:var(--text-2); font-size:13px; font-family:inherit; cursor:pointer;
  transition:color .15s ease, border-color .15s ease;
}
.zurueck-button:hover{ color:var(--text); border-color:var(--akzent); }
@media (max-width:1024px){ .zurueck-leiste{ padding:0 14px; } }

/* Der erste Eindruck. 34px war eine Ueberschrift, keine Schlagzeile - und
   auf einem 2400px breiten Container verliert sie sich.

   `clamp` statt einer festen Groesse: auf dem Telefon 30px, auf dem
   4K-Schirm 60px, dazwischen gleitend. Mit der Serife aus
   `--schrift-display` (h1 erbt sie) ergibt das den Auftritt, den ein
   Nachschlagewerk am Anfang braucht. */
.hero{ padding:clamp(40px,6vw,84px) 32px 44px; max-width:var(--inhalt-breite); margin:0 auto; }
.hero h1{ font-size:clamp(30px,4.4vw,60px); margin:0 0 14px; }
.hero p{ color:var(--text-2); font-size:clamp(15px,1.3vw,18px); max-width:var(--lese-breite); }

.homepage-inhalt{ font-size:16px; line-height:1.7; color:var(--text); max-width:820px; }
.homepage-inhalt p{ margin:0 0 16px; }
.homepage-inhalt a{ color:var(--akzent); }
.homepage-inhalt img{ max-width:100%; border-radius:var(--radius); }

/* Spiele-Uebersicht: Toolbar mit Ansicht-/Sortier-Umschaltern */
.spiele-toolbar{ display:flex; flex-wrap:wrap; align-items:center; justify-content:space-between; gap:14px; margin-bottom:24px; }
.spiele-toolbar-controls{ display:flex; flex-wrap:wrap; gap:10px; }
.segment-umschalter{ display:flex; border:1px solid var(--border); border-radius:var(--radius-rund); overflow:hidden; }
.segment-umschalter a{ padding:8px 16px; font-size:12.5px; color:var(--text-2); background:var(--oberflaeche); white-space:nowrap; }
.segment-umschalter a:hover{ color:var(--text); }
.segment-umschalter a.aktiv{ background:var(--akzent); color:var(--bg); font-weight:600; }

.spiele-reihen-titel{ font-size:15px; color:var(--text-2); text-transform:uppercase; letter-spacing:.06em; margin:32px 0 14px; padding-bottom:8px; border-bottom:1px solid var(--border); }


/* Startseite: modernes RPG-Portal-Layout */



@media (max-width:700px){
}

.mein-portal-liste{ display:flex; flex-direction:column; gap:16px; }
.mein-portal-karte{ border:1px solid var(--border); border-radius:var(--radius); padding:16px 20px; background:var(--oberflaeche); }
.mein-portal-titel{ font-size:16px; font-weight:700; color:var(--text); }
.mein-portal-zeile{ display:flex; align-items:center; gap:10px; margin:10px 0; }
.mein-portal-zeile select{ padding:7px 10px; border:1px solid var(--border); border-radius:var(--radius-klein); background:var(--bg); color:var(--text); font-size:13px; }
.mein-portal-like{ border:1px solid var(--border); border-radius:var(--radius-klein); background:var(--bg); padding:6px 12px; font-size:15px; cursor:pointer; opacity:.55; }
.mein-portal-like:hover{ opacity:.85; }
.mein-portal-like.ist-aktiv{ opacity:1; border-color:var(--akzent); }
.mein-portal-bewertung{ display:flex; flex-wrap:wrap; gap:12px; align-items:flex-end; margin-top:10px; }
.mein-portal-bewertung label{ display:flex; flex-direction:column; gap:4px; font-size:12.5px; color:var(--text-2); }
.mein-portal-bewertung input, .mein-portal-bewertung textarea{ padding:8px 10px; border:1px solid var(--border); border-radius:var(--radius-klein); background:var(--bg); color:var(--text); font-family:inherit; font-size:13.5px; }
.mein-portal-bewertung input{ width:80px; }
.mein-portal-bewertung textarea{ width:320px; max-width:100%; }

/* Mein RPGPortal - Steuerzentrale */
.portal-hero{
  padding:32px 36px; border-radius:var(--radius-gross); margin-bottom:28px;
  background:linear-gradient(135deg, rgba(67,56,202,0.16) 0%, rgba(109,40,217,0.12) 45%, rgba(219,39,119,0.12) 100%);
  border:1px solid var(--border);
}
.portal-hero-titel{ margin:0 0 6px; font-size:28px; }
.portal-hinzufuegen{ display:flex; gap:10px; align-items:center; margin:20px 0; flex-wrap:wrap; }
.portal-hinzufuegen select{ flex:1; min-width:220px; padding:10px 12px; border:1px solid var(--border); border-radius:var(--radius-klein); background:var(--oberflaeche); color:var(--text); font-size:14px; }
.portal-stats{ display:grid; grid-template-columns:repeat(auto-fit,minmax(140px,1fr)); gap:12px; margin-top:20px; }
.portal-stat{
  display:flex; flex-direction:column; align-items:center; gap:2px; text-align:center;
  padding:14px 10px; border-radius:var(--radius); background:var(--oberflaeche); border:1px solid var(--border);
}
.portal-stat-zahl{ font-family:'IBM Plex Mono',monospace; font-size:24px; font-weight:700; color:var(--text); }
.portal-stat-label{ font-size:11.5px; color:var(--text-2); }

.portal-liste{ display:grid; grid-template-columns:repeat(auto-fill,minmax(320px,1fr)); gap:22px; }
.portal-karte{ border:1px solid var(--border); border-radius:14px; padding:16px; background:var(--oberflaeche); }
.portal-karte-kopf{ display:flex; gap:12px; margin-bottom:12px; align-items:flex-start; }
.portal-karte-entfernen{
  flex:0 0 auto; width:26px; height:26px; border:1px solid var(--border); border-radius:var(--radius-klein);
  background:var(--bg); color:var(--text-2); font-size:13px; line-height:1; cursor:pointer;
}
.portal-karte-entfernen:hover{ color:var(--fehler); border-color:var(--fehler); }

.graph-knoten-liste{ display:flex; flex-direction:column; gap:8px; margin-bottom:20px; }
.graph-knoten{ border:1px solid var(--border); border-radius:10px; padding:12px 14px; background:var(--oberflaeche); font-size:13.5px; }
.graph-knoten-kopf{ display:flex; align-items:center; gap:10px; flex-wrap:wrap; }
.graph-knoten-kinder{ display:flex; flex-direction:column; gap:2px; padding-left:4px; }
.graph-knoten-kinder a{ font-size:12.5px; color:var(--akzent); }
a.graph-knoten-klickbar{ display:flex; align-items:center; gap:10px; color:var(--text); }
a.graph-knoten-klickbar:hover{ border-color:var(--akzent); }

.elementmatrix-tabelle th, .elementmatrix-tabelle td{ white-space:nowrap; font-size:13px; font-variant-numeric:tabular-nums; }
.elementmatrix-zelle{ text-align:center; }
.elementmatrix-schwach{ background:color-mix(in srgb, var(--fehler) 15%, transparent); color:var(--fehler); font-weight:600; }
.elementmatrix-stark{ background:color-mix(in srgb, var(--info) 12%, transparent); color:var(--info); }
.elementmatrix-immun{ background:rgba(107,107,114,0.15); color:var(--text); font-weight:600; }
.elementmatrix-absorbiert{ background:color-mix(in srgb, var(--erfolg) 15%, transparent); color:var(--erfolg); font-weight:600; }
.elementmatrix-reflektiert{ background:rgba(217,119,6,0.15); color:var(--warnung); font-weight:600; }
.elementmatrix-verursacht{ background:color-mix(in srgb, var(--info) 6%, transparent); }

.admin-quickstart-karte{ border:1px solid var(--border); border-radius:14px; padding:22px 24px; background:var(--oberflaeche); }
.admin-quickstart-karte select{ width:100%; padding:10px 12px; border:1px solid var(--border); border-radius:var(--radius-klein); background:var(--bg); color:var(--text); font-size:14px; }
.admin-quickstart-typen{ display:flex; flex-wrap:wrap; gap:10px; }
.admin-quickstart-typ-btn{
  padding:10px 18px; border:1px solid var(--border); border-radius:var(--radius-rund); background:var(--bg);
  color:var(--text); font-size:13.5px; font-weight:600; transition:all .15s ease;
}
.admin-quickstart-typ-btn:hover{ border-color:var(--akzent); color:var(--akzent); transform:translateY(-1px); }

/* Stepper-Nummerierung (2026-09-05, Master-Auftrag "① Basis -> ② Typ ->
   ..."): ein CSS-Zähler statt fest eingetragener Ziffern je Vorlage -
   ein Reiter mehr oder weniger zählt sich von selbst neu durch. */
.builder-tabs{
  display:flex; flex-wrap:wrap; gap:6px; margin-bottom:20px;
  border-bottom:1px solid var(--border); padding-bottom:12px;
  counter-reset:builder-schritt;
}
.builder-tab{
  display:inline-flex; align-items:center; gap:7px;
  padding:8px 14px; border-radius:var(--radius-rund); font-size:13px; color:var(--text-2);
  background:var(--oberflaeche); border:1px solid var(--border);
  counter-increment:builder-schritt;
}
.builder-tab::before{
  content:counter(builder-schritt);
  display:inline-flex; align-items:center; justify-content:center; flex:none;
  width:17px; height:17px; border-radius:50%; font-size:10px; font-weight:700;
  background:var(--oberflaeche-2); color:var(--text-2);
}
.builder-tab:hover{ color:var(--text); }
.builder-tab.ist-aktiv{ background:var(--akzent); border-color:var(--akzent); color:var(--bg); font-weight:600; }
.builder-tab.ist-aktiv::before{ background:var(--bg); color:var(--akzent); }
.builder-tab-zaehler{ opacity:.75; font-size:11.5px; }
.builder-tab-warnung{ color:var(--warnung); margin-left:2px; }
.builder-tab-pruefen{ background:color-mix(in srgb, var(--erfolg) 12%, transparent); border-color:color-mix(in srgb, var(--erfolg) 40%, transparent); color:var(--erfolg); font-weight:600; }

.builder-stepper-nav{ display:flex; justify-content:space-between; gap:10px; margin-top:22px; padding-top:14px; border-top:1px solid var(--border); }

/* ---- Beziehungen: eine Zeile je Typ (2026-09-05, Nutzer-Mockup) ---- */
.builder-beziehungszeilen{ display:flex; flex-direction:column; gap:6px; }
.builder-beziehung-zeile{
  display:flex; align-items:center; gap:8px; flex-wrap:wrap;
  padding:8px 10px; border-radius:var(--radius-klein); background:var(--oberflaeche); border:1px solid var(--border);
}
.builder-beziehung-zeile-label{ font-size:13px; font-weight:600; color:var(--text); flex:0 0 150px; }
.builder-beziehung-zeile-label small{ font-weight:400; color:var(--text-2); }
.builder-beziehung-zeile-auswahl{
  flex:1 1 140px; min-width:0; font-size:12.5px; padding:6px 8px;
  border-radius:6px; border:1px solid var(--border); background:var(--bg); color:var(--text);
}
.builder-beziehung-zeile-name{ flex:1 1 140px; min-width:0; font-size:12.5px; padding:6px 8px; }
.builder-beziehung-zeile-menge{ flex:0 1 70px; font-size:12.5px; padding:6px 8px; }
.builder-beziehung-zeile-bedingung{ flex:1 1 100px; min-width:0; font-size:12.5px; padding:6px 8px; }
/* Sortiment je Ort: Orte ankreuzen (2026-09-11). Klappt in der Zeile auf -
   kein schwebendes Menü, das ein Panel mit overflow abschneiden könnte. */
.builder-ort-auswahl{ flex:1 1 150px; min-width:0; font-size:12.5px; }
.builder-ort-auswahl[open]{ flex-basis:100%; }
.builder-ort-auswahl > summary{
  cursor:pointer; list-style:none; padding:6px 26px 6px 8px; border-radius:6px; position:relative;
  border:1px solid var(--border); background:var(--bg); color:var(--text);
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}
.builder-ort-auswahl > summary::-webkit-details-marker{ display:none; }
.builder-ort-auswahl > summary::after{ content:"▾"; position:absolute; right:9px; top:50%; transform:translateY(-50%); color:var(--text-2); }
.builder-ort-auswahl[open] > summary::after{ content:"▴"; }
.builder-ort-auswahl-kopf{ display:flex; gap:6px; margin:6px 0; }
.builder-ort-auswahl-filter{ flex:1 1 auto; min-width:0; font-size:12.5px; padding:5px 8px; }
.builder-ort-auswahl-liste{
  max-height:260px; overflow:auto; padding:4px; border-radius:6px;
  border:1px solid var(--border); background:var(--bg);
}
.builder-ort-auswahl-zeile{
  display:flex; align-items:center; gap:6px; padding:3px 6px;
  padding-left:calc(6px + var(--tiefe, 0) * 16px); border-radius:4px; cursor:pointer;
}
.builder-ort-auswahl-zeile:hover{ background:var(--oberflaeche); }
.builder-ort-auswahl-zeile small{ margin-left:auto; color:var(--text-2); }
/* Orte markierter „Verkauft"-Zeilen setzen (2026-09-11). */
.builder-sortiment-haken{ margin:0 6px 0 0; vertical-align:middle; }
.builder-plakette-ueberall{
  display:inline-block; margin-left:4px; padding:0 7px; border-radius:var(--radius-rund);
  border:1px dashed var(--border); color:var(--text-2); font-size:11px;
}
.builder-sortiment-orte{ margin-top:10px; }
.builder-sortiment-alle{ display:inline-flex; align-items:center; gap:5px; font-size:12.5px; color:var(--text-2); }
.builder-sortiment-hinweis{ flex-basis:100%; margin:0; }
/* Beziehungen gesammelt speichern (2026-09-11). */
.builder-beziehungen-alle{
  display:flex; align-items:center; gap:10px; flex-wrap:wrap;
  margin-top:10px; padding-top:10px; border-top:1px solid var(--border);
}
.builder-beziehungen-alle .hinweis{ margin:0; }
@media (max-width: 640px){
  .builder-beziehung-zeile-label{ flex-basis:100%; }
}

/* ---- Speicherstatus (2026-09-05) ---- */
.builder-formular-aktionen{ display:flex; align-items:center; gap:12px; margin-top:6px; }
.builder-speicherstatus{ font-size:12px; color:var(--text-2); }
.builder-speicherstatus.ist-gespeichert{ color:var(--erfolg); }
.builder-speicherstatus.ist-ungespeichert{ color:var(--warnung); font-weight:600; }

.builder-schritte{ display:flex; align-items:center; gap:8px; margin-bottom:20px; flex-wrap:wrap; font-size:13px; }
.builder-schritt{ padding:6px 12px; border-radius:var(--radius-rund); color:var(--text-2); background:var(--oberflaeche); border:1px solid var(--border); }
.builder-schritt.ist-fertig{ color:var(--erfolg); border-color:color-mix(in srgb, var(--erfolg) 40%, transparent); }
.builder-schritt.ist-aktiv{ color:var(--bg); background:var(--akzent); border-color:var(--akzent); font-weight:600; }
.builder-schritt-pfeil{ color:var(--text-2); }

/* ---------- Gamebuilder-Studio (Auftrag "Gamebuilder Visual & UX", Phase 1) ----------
   Eigenstaendiges, "ruhiges" Dark-Knowledge-Studio-Layout fuer den Builder -
   erweitert die bestehenden Design-Tokens (--bg/--oberflaeche/--text/--akzent),
   ersetzt sie nicht. Nutzt weiterhin dieselben :root[data-theme="dunkel"]-Werte
   wie der Rest der Seite statt eines erzwungenen Dauer-Dark-Modes. */
.studio-kopf{ max-width:var(--inhalt-breite); margin:0 auto; }
.studio-fortschritt{ display:flex; align-items:center; gap:0; max-width:var(--inhalt-breite); margin:0 auto 24px; flex-wrap:wrap; }
.studio-fortschritt-schritt{ display:flex; flex-direction:column; align-items:center; gap:4px; text-align:center; min-width:70px; }
.studio-fortschritt-symbol{ font-family:'IBM Plex Mono',monospace; font-size:13px; font-weight:600; color:var(--text-2); }
.studio-fortschritt-label{ font-size:10.5px; text-transform:uppercase; letter-spacing:.06em; color:var(--text-2); }
.studio-fortschritt-fertig .studio-fortschritt-symbol,
.studio-fortschritt-fertig .studio-fortschritt-label{ color:var(--erfolg); }
.studio-fortschritt-aktiv .studio-fortschritt-symbol,
.studio-fortschritt-aktiv .studio-fortschritt-label{ color:var(--akzent); font-weight:700; }
.studio-fortschritt-linie{ flex:1; height:1px; background:var(--border); margin:0 6px; align-self:flex-start; margin-top:9px; min-width:20px; }
.studio-fortschritt-linie-fertig{ background:var(--erfolg); opacity:.5; }

/* Die 1400px hier waren die letzte feste Breite im Stylesheet - sie
   stammt aus der Zeit vor dem Token und liess das Studio auf einem grossen
   Schirm schmaler stehen als jede andere Seite. */
.studio-layout{
  display:grid; grid-template-columns:clamp(220px, 15vw, 320px) minmax(0,1fr) clamp(220px, 15vw, 320px);
  gap:24px; max-width:var(--inhalt-breite); margin:0 auto; align-items:start;
}
.studio-sidebar, .studio-statspanel{
  position:sticky; top:16px;
  background:var(--oberflaeche); border:1px solid var(--border); border-radius:var(--radius);
  padding:18px; font-size:13px;
}
.studio-sidebar-titel{
  font-family:'IBM Plex Mono',monospace; font-size:11px; font-weight:600; color:var(--text-2);
  text-transform:uppercase; letter-spacing:.06em; margin:18px 0 8px;
}
.studio-sidebar-titel:first-child{ margin-top:0; }
.studio-sidebar-schritte{ display:flex; flex-direction:column; gap:2px; }
.studio-sidebar-schritt{
  display:flex; align-items:center; gap:8px; padding:7px 8px; border-radius:var(--radius-klein); color:var(--text-2); font-size:13px;
}
.studio-sidebar-schritt:hover{ background:var(--bg); color:var(--text); }
.studio-sidebar-schritt.ist-aktiv{ background:color-mix(in srgb, var(--akzent) 14%, transparent); color:var(--akzent); font-weight:600; }
.studio-sidebar-symbol{ font-family:'IBM Plex Mono',monospace; width:14px; flex:0 0 auto; text-align:center; }
.studio-sidebar-zaehler{ margin-left:auto; opacity:.7; font-size:11.5px; }
.studio-sidebar-warnung{ color:var(--warnung); }
.studio-sidebar-schritt-pruefen{ margin-top:6px; border-top:1px solid var(--border); padding-top:10px; }
.studio-sidebar-kennzahlen{ display:flex; flex-direction:column; gap:6px; font-size:13px; color:var(--text-2); }
.studio-sidebar-kennzahlen strong{ color:var(--text); font-weight:700; }
.studio-qualitaet-balken{ height:6px; border-radius:var(--radius-rund); background:var(--bg); overflow:hidden; }
.studio-qualitaet-fuellung{ height:100%; background:var(--akzent); transition:width .3s ease; }
.studio-sidebar-qualitaet-wert{ margin:6px 0 0; font-size:12px; color:var(--text-2); }

.studio-workspace{ min-width:0; }
.studio-card{
  background:var(--oberflaeche); border:1px solid var(--border); border-radius:var(--radius);
  padding:20px 22px; margin-bottom:0;
}
.studio-card-kicker{
  font-family:'IBM Plex Mono',monospace; font-size:11px; font-weight:600; color:var(--akzent);
  text-transform:uppercase; letter-spacing:.06em; margin:0;
}

.studio-stat-kachel{
  background:var(--bg); border:1px solid var(--border); border-radius:10px;
  padding:12px 14px; margin-bottom:10px; display:flex; flex-direction:column; gap:2px;
}
.studio-stat-zahl{ font-size:22px; font-weight:700; color:var(--akzent); line-height:1.1; }
.studio-stat-label{ font-size:11px; color:var(--text-2); text-transform:uppercase; letter-spacing:.04em; }

/* Admin-Wizard-Fortschritt (Basis-Schritt), eingebettet in .studio-sidebar
   statt als eigene horizontale Kopfzeile - siehe spiel-formular.php. */
.studio-sidebar .admin-wizard-progress{ flex-direction:column; align-items:flex-start; gap:10px; }
.studio-sidebar .admin-wizard-progress-track,
.studio-sidebar .admin-wizard-progress-bar{ display:none; }
.studio-sidebar .admin-wizard-step{ flex-direction:row; align-items:center; gap:8px; width:100%; }
.studio-sidebar .admin-wizard-step-circle{ width:22px; height:22px; font-size:11px; border-width:2px; flex:0 0 auto; }
.studio-sidebar .admin-wizard-step-label{ margin-top:0; text-align:left; font-size:12px; white-space:normal; }

@media (max-width:1100px){
  .studio-layout{ grid-template-columns:1fr; }
  .studio-sidebar, .studio-statspanel{ position:static; }
}
@media (prefers-reduced-motion: reduce){
  .studio-qualitaet-fuellung{ transition:none; }
}

.spiel-admin-kontext{ background:var(--oberflaeche); border-bottom:1px solid var(--border); }
.spiel-admin-kontext-name{ display:block; max-width:var(--inhalt-breite); margin:0 auto; padding:10px 24px 0; font-size:12px; color:var(--text-2); font-weight:600; text-transform:uppercase; letter-spacing:.04em; }
.spiel-admin-tabs{ display:flex; flex-wrap:wrap; justify-content:center; gap:4px; max-width:var(--inhalt-breite); margin:0 auto; padding:8px 24px 12px; }
.spiel-admin-tab{ padding:7px 14px; border-radius:var(--radius-rund); font-size:13px; color:var(--text-2); }
.spiel-admin-tab:hover{ color:var(--text); background:var(--bg); }
.spiel-admin-tab.ist-aktiv{ background:var(--akzent); color:var(--bg); font-weight:600; }
.spiel-admin-tab-extern{ margin-left:auto; }

/* Die Schrittnummer im Game Builder.
   Sie steht vor der Beschriftung und ist bewusst zurueckgenommen: Die
   Reihenfolge soll erkennbar sein, ohne dass die Zahl mit dem Namen des
   Schritts um Aufmerksamkeit ringt. Auf dem aktiven Reiter erbt sie dessen
   Farbe und bleibt nur durch die Deckkraft leiser. */
.spiel-admin-tab-nr{
  margin-right:6px; font-size:11px; font-weight:600; opacity:.55;
  font-variant-numeric:tabular-nums;
}
.spiel-admin-tab.ist-aktiv .spiel-admin-tab-nr{ opacity:.75; }

.lizenz-tabelle{ width:100%; border-collapse:collapse; margin:14px 0 20px; font-size:13.5px; }
.lizenz-tabelle th, .lizenz-tabelle td{ text-align:left; padding:8px 10px; border-bottom:1px solid var(--border); }
.lizenz-tabelle th{ color:var(--text-2); font-size:11.5px; text-transform:uppercase; letter-spacing:.04em; }

/* Consent-Banner */
.consent-banner{
  position:fixed; left:0; right:0; bottom:0; z-index:500;
  background:var(--oberflaeche); border-top:1px solid var(--border);
  box-shadow:0 -8px 30px rgba(0,0,0,0.25);
}
.consent-banner-inhalt{ max-width:var(--inhalt-breite); margin:0 auto; padding:18px 24px; display:flex; align-items:center; justify-content:space-between; gap:20px; flex-wrap:wrap; }
.consent-banner-inhalt p{ margin:0; font-size:13.5px; color:var(--text); flex:1; min-width:240px; }
.consent-banner-inhalt a{ color:var(--akzent); }
.consent-banner-buttons{ display:flex; gap:10px; flex-wrap:wrap; }
.consent-btn{ padding:9px 18px; border-radius:var(--radius-klein); font-size:13px; font-weight:600; cursor:pointer; border:1px solid var(--border); font-family:inherit; }
.consent-btn-sekundaer{ background:var(--bg); color:var(--text); }
.consent-btn-primaer{ background:var(--akzent); border-color:var(--akzent); color:var(--bg); }

/* Consent-Einstellungsdialog */
.consent-modal{ position:fixed; inset:0; z-index:501; background:rgba(0,0,0,0.6); display:flex; align-items:center; justify-content:center; padding:20px; }
.consent-modal-box{
  background:var(--oberflaeche-modal); border-radius:14px; border:1px solid var(--border);
  max-width:520px; width:100%; max-height:85vh;
  display:flex; flex-direction:column; overflow:hidden; position:relative;
}
.consent-modal-scroll{ padding:26px 26px 0; overflow-y:auto; flex:1; }
.consent-modal-box h2{ margin:0 0 8px; }
.consent-modal-schliessen-x{
  position:absolute; top:14px; right:14px; width:32px; height:32px; border-radius:var(--radius-klein);
  border:1px solid var(--border); background:var(--bg); color:var(--text); cursor:pointer; font-size:16px; line-height:1;
}
.consent-modal-footer{ padding:16px 26px 26px; flex:0 0 auto; }
.consent-kategorien{ display:flex; flex-direction:column; gap:14px; margin:18px 0; }
.consent-kategorie{ display:flex; align-items:flex-start; gap:14px; padding:12px 14px; border:1px solid var(--border); border-radius:10px; }
.consent-kategorie strong{ font-size:14px; color:var(--text); }
.consent-kategorie p{ margin:4px 0 0; font-size:12.5px; color:var(--text-2); }
.consent-kategorie input[type="checkbox"]{ margin-top:3px; width:18px; height:18px; flex:0 0 auto; }
@media (max-width:700px){ .consent-banner-inhalt{ flex-direction:column; align-items:stretch; } .consent-banner-buttons{ justify-content:stretch; } .consent-btn{ flex:1; } }
/* WICHTIG: hidden-Attribut muss die display:flex-Regeln oben zuverlaessig
   ueberschreiben - gleiche Spezifitaet wie [hidden] via Klassenselektor,
   ohne !important gewinnt sonst die spaeter stehende Klassenregel. */
.consent-modal[hidden],
.consent-banner[hidden]{ display:none !important; }
@media (max-width:1024px){ .spiel-admin-tabs{ padding:8px 14px 12px; overflow-x:auto; } .spiel-admin-kontext-name{ padding:10px 14px 0; } }

.admin-wizard-checkboxen{ display:flex; flex-wrap:wrap; gap:8px 16px; }
.admin-wizard-checkbox{ display:flex; align-items:center; gap:6px; font-size:13px; font-weight:400; width:auto; flex-direction:row; }
.admin-wizard-spielsysteme-form h4{ margin:0 0 8px; font-size:13px; color:var(--text-2); text-transform:uppercase; letter-spacing:.04em; }
/* Hier stand:
     .builder-panel{ display:none; }
     .builder-panel.ist-aktiv{ display:block; }

   Eine Altlast aus dem frueheren Reiter-Builder, bei dem immer nur ein
   Panel sichtbar war. Die Klasse `ist-aktiv` wird an einem
   `.builder-panel` seit dem Neuaufbau NIRGENDS mehr gesetzt - damit
   war jedes Panel dauerhaft ausgeblendet.

   Betroffen waren die Itemfamilien (die ganze rechte Spalte fehlte),
   der Pruefen-Bereich im Builder und die Meldung "Im Katalog steht
   keine Inhaltsart". Alle drei waren im HTML vorhanden und unsichtbar -
   die Form von Fehler, die man nicht im Fehlerprotokoll findet.

   Die Sichtbarkeit entscheidet jetzt der Server: Was nicht angezeigt
   werden soll, wird gar nicht erst gerendert. */
.builder-schnellform{ display:flex; gap:10px; flex-wrap:wrap; align-items:center; }
.builder-schnellform input[type="text"]{ flex:1; min-width:200px; padding:9px 12px; border:1px solid var(--border); border-radius:var(--radius-klein); background:var(--oberflaeche); color:var(--text); }
.builder-schnellform select{ padding:9px 12px; border:1px solid var(--border); border-radius:var(--radius-klein); background:var(--oberflaeche); color:var(--text); }
.portal-karte-cover{ width:56px; height:56px; border-radius:10px; flex:0 0 auto; background:linear-gradient(150deg, var(--cp-1) 0%, var(--cp-2) 50%, var(--cp-3) 100%); }
.portal-karte-titelblock{ flex:1; min-width:0; }
.portal-karte-titel{ display:block; font-size:15px; font-weight:700; color:var(--text); margin-bottom:6px; }
.portal-fortschritt-leiste{ height:6px; border-radius:var(--radius-rund); background:var(--bg); overflow:hidden; margin-bottom:4px; }
.portal-fortschritt-fuellung{ height:100%; background:linear-gradient(90deg, #6d28d9, #db2777); }
.portal-fortschritt-text{ font-size:11px; color:var(--text-2); }

.portal-karte-controls{ display:flex; align-items:center; justify-content:space-between; gap:10px; margin-bottom:8px; }
.portal-karte-controls select{ padding:7px 10px; border:1px solid var(--border); border-radius:var(--radius-klein); background:var(--bg); color:var(--text); font-size:12.5px; }
.portal-like-gruppe{ display:flex; gap:6px; }

.portal-bewertung-block{ margin-top:12px; padding-top:12px; border-top:1px solid var(--border); }
.portal-bewertung-titel{ margin:0 0 8px; font-size:12.5px; font-weight:600; color:var(--text-2); }
.portal-bewertung-block .mein-portal-bewertung textarea{ width:100%; }

.berichte-raster{ display:grid; grid-template-columns:repeat(auto-fill,minmax(280px,1fr)); gap:22px; }
.bericht-karte{ border:1px solid var(--border); border-radius:var(--radius); padding:16px 18px; background:var(--oberflaeche); }
.bericht-kopf{ display:flex; align-items:center; gap:10px; margin-bottom:10px; }
.bericht-avatar{
  width:36px; height:36px; border-radius:50%; flex:0 0 auto;
  display:flex; align-items:center; justify-content:center;
  background:linear-gradient(135deg, #4338ca, #db2777); color:#fff; font-weight:700; font-size:14px;
}
.bericht-name{ display:block; font-size:14px; color:var(--text); }
.bericht-datum{ display:block; font-size:11.5px; color:var(--text-2); }
.bericht-rating{ margin-left:auto; font-size:13px; font-weight:700; color:#FACC15; white-space:nowrap; }
.bericht-text{ font-size:14px; line-height:1.6; color:var(--text); margin:0; }

/* Pill-Tag-Reihe, z.B. "Verwandte Concepts" - unabhaengig vom Header-Umbau */
.hero-kategorien{
  position:relative; z-index:1; display:flex; gap:10px; flex-wrap:wrap;
  justify-content:center; max-width:100%;
}
.hero-kategorien a{
  padding:8px 16px; border:1px solid var(--border); border-radius:var(--radius-rund);
  font-size:13px; color:var(--text); background:var(--oberflaeche);
  transition:background .15s ease, border-color .15s ease;
}
.hero-kategorien a:hover{ background:var(--bg); border-color:var(--akzent); }

.abschnitt{ max-width:var(--inhalt-breite); margin:0 auto; padding:32px; }

/* Nur auf der Spielseite ein noch breiterer Inhaltskasten (Auftrag
   "inhalkasten.jpg"): Dort stehen Tabellen und Inhaltsraster nebeneinander,
   die von jeder zusaetzlichen Spalte profitieren.

   Der Abstand zur normalen Breite ist bewusst als Aufschlag geschrieben und
   nicht als feste Zahl - so bleibt die Spielseite immer um denselben Betrag
   breiter als der Rest, auch wenn --inhalt-breite spaeter noch einmal
   geaendert wird. Mit einer festen 1400 waere der Unterschied bei jeder
   Aenderung ein anderer, und irgendwann waere die "breitere" Seite die
   schmalere. */
/* Der Zuschlag von 240px stammt aus der Zeit der festen 1280px: Die
   Spielseite traegt zwei Spalten und brauchte mehr als die anderen.

   Jetzt waechst --inhalt-breite ohnehin mit dem Fenster, und ein Zuschlag
   obendrauf schoebe die Spielseite als einzige ueber den Rand der
   Fusszeile hinaus - eine Kante, die um 240px versetzt sitzt. Genau die
   Sorte Abweichung, wegen der die Breite ueberhaupt ein Token wurde. */
.abschnitt-spiel{ max-width:var(--inhalt-breite); }
.abschnitt-schmal{ max-width:420px; }

/* Volle Bildschirmbreite - fuer Arbeitstabellen mit vielen Spalten.
   ===================================================================
   Der Dateneditor zeigt ALLE Felder eines Inhaltstyps. Bei einem Gegner sind
   das ueber zwanzig Spalten. In einem auf 1280px begrenzten Kasten laesst
   sich das nicht darstellen: Man scrollt waagerecht durch eine schmale
   Roehre, waehrend rechts und links die halbe Bildschirmbreite leer bleibt.
   Auf einem breiten Monitor passen alle Spalten nebeneinander - dort soll
   auch nichts gescrollt werden muessen.

   Der Rest des Portals bleibt bei seiner Lesebreite. Ein Fliesstext ueber
   die volle Breite eines 34-Zoll-Monitors ist unlesbar; eine Tabelle ist es
   erst dann nicht mehr, wenn sie abgeschnitten wird. */
.abschnitt-voll{ max-width:none; padding-left:24px; padding-right:24px; }
.abschnitt h2{ font-size:19px; margin:32px 0 16px; }

/* Nur auf der Spielseite: dezenter Akzentbalken vor Abschnittsüberschriften
   ("Inhalte", "Ähnliche Spiele", ...) statt sitegweit auf jedem h2 (Admin,
   Guides etc. behalten ihr bisheriges, ruhigeres Erscheinungsbild). */
.spiel-abschnitt-titel{ font-size:19px; font-weight:700; letter-spacing:-.01em; margin:32px 0 16px; display:flex; align-items:center; gap:10px; }
.spiel-abschnitt-titel::before{ content:''; width:4px; height:18px; border-radius:2px; background:var(--akzent); flex:0 0 auto; }

.raster{ display:grid; grid-template-columns:repeat(auto-fill,minmax(220px,1fr)); gap:20px; }
/* ---- Das Grundsystem im Builder -------------------------------------------

   Drei Tafeln: Kampf und Entwicklung, Ressourcen, Inhaltsarten.

   Die Haken stehen in einem `<fieldset>` mit `<legend>` und nicht in einer
   Liste mit Ueberschrift daneben: Ein Vorlesegeraet meldet die Zugehoerigkeit
   damit mit, ohne dass man sie ihm sagen muss.
   --------------------------------------------------------------------------- */
.system-feld{ margin:0 0 18px; }
.system-feld label{
  display:block; margin-bottom:6px;
  font-size:12.5px; font-weight:600; color:var(--text-2);
}
.system-feld label small{ font-weight:400; }
.system-feld select,
.system-feld textarea{
  width:100%; max-width:620px;
  padding:9px 12px;
  border:1px solid var(--border); border-radius:var(--radius-klein);
  background:var(--bg); color:var(--text);
  font-family:inherit; font-size:14.5px;
  transition:border-color var(--dauer) var(--kurve);
}
.system-feld select:focus,
.system-feld textarea:focus{ outline:none; border-color:var(--akzent); }
.system-feld textarea{ line-height:1.6; resize:vertical; }

.system-haken{
  border:none; padding:0; margin:0 0 20px;
}
.system-haken legend{
  padding:0; margin:0 0 10px;
  font-family:var(--schrift-mono); font-size:10.5px; font-weight:700;
  text-transform:uppercase; letter-spacing:.07em; color:var(--text-2);
}

/* Ein Raster und keine Spalte: Bei einundzwanzig Inhaltsarten waere eine
   Spalte einundzwanzig Zeilen lang, und das Formular passte auf keinen
   Bildschirm. */
.system-arten{
  display:grid; grid-template-columns:repeat(auto-fill, minmax(210px, 1fr));
  gap:8px 18px;
}
.system-arten legend{ grid-column:1 / -1; }

.system-haken label{
  display:flex; align-items:flex-start; gap:9px;
  font-size:14px; line-height:1.45; cursor:pointer;
  padding:5px 0;
}
.system-haken input[type="checkbox"]{ margin-top:3px; flex:0 0 auto; }
.system-haken label small{
  display:block; margin-top:2px;
  font-size:11.5px; color:var(--text-2); line-height:1.5;
}

/* Was schon Eintraege hat, laesst sich nicht abwaehlen. Der Haken bleibt
   bedienbar - er wird beim Speichern wieder gesetzt und der Grund gesagt.
   Ihn zu sperren waere ehrlicher und waere schlechter: Ein gesperrtes Feld
   sagt nicht, WARUM es gesperrt ist. */
.system-arten label.ist-belegt small{ color:var(--akzent); }

@media (max-width: 560px){
  .system-arten{ grid-template-columns:1fr; }
}
/* ---- Tafel ----------------------------------------------------------------

   DIE KACHEL ALS BAUSTEIN.

   Es gab sechs Klassen mit fast derselben Flaeche: `.karte`, `.stat-karte`,
   `.spiel-panel`, `.woche-karte`, `.rand-block`, `.umfrage-karte`. Fast -
   nicht ganz: verschiedene Radien, mal `--oberflaeche` und mal `--bg`, mal
   mit Erhebung und mal ohne. Wer eine neue Kachel brauchte, schrieb die
   siebte, weil keine der sechs so hiess, dass man sie gesucht haette.

   `.tafel` ist die Flaeche. Was darin steht, regelt die Vorlage; wie sie
   aussieht, steht hier - einmal.

   ---------------------------------------------------------------------------
   ZWEI STUFEN, UND DER UNTERSCHIED IST EINE AUSSAGE
   ---------------------------------------------------------------------------
   `.tafel`          ruhig. Der Normalfall - ein Block, den man liest.
   `.tafel-gehoben`  mit Goldkante und Verlauf. Der Hauptgegenstand der
                     Seite, und davon gibt es genau einen.

   Traegt jede Kachel Gold, traegt keine mehr etwas bei: Auszeichnung, die
   ueberall steht, ist Hintergrund.
   --------------------------------------------------------------------------- */
.tafel{
  padding:20px 22px;
  border:1px solid var(--border); border-radius:var(--radius);
  background:var(--oberflaeche);
  box-shadow:var(--erhebung);
}

/* Auf `--bg` statt `--oberflaeche` sinkt eine Kachel HINTER die Seite,
   waehrend die Kacheln daneben davor liegen. Das ist im Portal schon
   zweimal passiert (Neuigkeiten, Umfragekarte im Admin) und sah beide Male
   nicht falsch aus - nur flach. */
.tafel-gehoben{
  padding:24px; border-radius:var(--radius-gross);
  border:1px solid var(--kante-gold);
  background:linear-gradient(165deg,
    var(--oberflaeche-2) 0%,
    var(--oberflaeche) 60%,
    color-mix(in srgb, var(--oberflaeche) 88%, var(--akzent) 8%) 100%);
  box-shadow:var(--erhebung);
}

/* Die Ueberschrift einer Tafel: versal, schmal, mit goldener Haarlinie -
   dieselbe wie im Panel auf der Spielseite. Sie benennt die Tafel und
   ringt nicht mit dem Inhalt um Aufmerksamkeit. */
.tafel-titel{
  display:flex; align-items:baseline; justify-content:space-between; gap:12px;
  margin:0 0 14px; padding-bottom:12px;
  font-family:var(--schrift-mono); font-size:11.5px; font-weight:700;
  text-transform:uppercase; letter-spacing:.1em; color:var(--text);
  border-bottom:1px solid var(--kante-gold);
}
/* Eine Zahl rechts im Titel („24 Vorschläge"). Tabellenziffern, damit sie
   ueber mehrere Tafeln hinweg untereinander stehen. */
.tafel-titel-zahl{
  font-size:11px; font-weight:600; letter-spacing:.04em; color:var(--akzent);
  text-transform:none; flex:0 0 auto; font-variant-numeric:tabular-nums;
}
.tafel > :last-child{ margin-bottom:0; }

/* Mehrere Tafeln untereinander. Als eigene Klasse und nicht als Rand an der
   Tafel selbst: Eine Tafel in einem Raster braucht keinen Aussenrand, und
   ihn dort wieder abzuziehen ist die Sorte Regel, die man spaeter sucht. */
.tafel-stapel{ display:flex; flex-direction:column; gap:18px; }
/* ---- Karten ---------------------------------------------------------------

   `box-shadow:0 1px 2px rgba(0,0,0,0.04)` war auf Weiss ein feiner Rand.
   Auf #0B0D14 ist er unsichtbar - man kann Schwarz nicht abdunkeln.

   Auf dunklem Grund entsteht Erhebung ueber eine helle OBERKANTE: Das Auge
   liest die Lichtkante als "weiter vorn". Genau das macht `--erhebung`. */
.karte{
  display:block; padding:18px;
  border:1px solid var(--border); border-radius:var(--radius);
  background:var(--oberflaeche);
  box-shadow:var(--erhebung);
  transition:border-color var(--dauer) var(--kurve),
             box-shadow var(--dauer) var(--kurve),
             transform var(--dauer) var(--kurve);
}
.karte:hover{
  border-color:color-mix(in srgb, var(--akzent) 55%, var(--border));
  box-shadow:0 10px 28px -14px color-mix(in srgb, var(--akzent) 35%, rgba(0,0,0,0.3)), 0 2px 6px -2px rgba(0,0,0,0.08);
  transform:translateY(-2px);
}
.karte h3{ font-size:15px; margin:0 0 6px; }
.karte p{ font-size:13px; color:var(--text-2); margin:0; }
.karte-klein{ padding:12px 16px; }
.karte-klein h4{ font-size:13.5px; margin:2px 0 0; }
.beziehungstyp{ font-family:'IBM Plex Mono',monospace; font-size:10.5px; color:var(--text-2); text-transform:uppercase; letter-spacing:.03em; }

/* #EFF4FF war ein blasses Blau - passend zum alten blauen Akzent und auf
   Tinte ein weisser Fleck. */
.tag{
  display:inline-flex; align-items:center; gap:5px;
  font-family:var(--schrift-mono); font-size:11px;
  color:var(--akzent);
  background:color-mix(in srgb, var(--akzent) 13%, transparent);
  border:1px solid var(--kante-gold);
  padding:3px 10px; border-radius:var(--radius-rund); margin-bottom:10px;
}
.tag svg{ flex:0 0 auto; }
:root[data-theme="dunkel"] .tag{ background:color-mix(in srgb, var(--akzent) 16%, transparent); }

.karte-mit-icon{ display:flex; align-items:center; gap:14px; }
.karte-mit-icon-badge{
  display:flex; align-items:center; justify-content:center; flex:0 0 auto;
  width:44px; height:44px; border-radius:11px;
  background:color-mix(in srgb, var(--akzent) 12%, transparent);
  color:var(--akzent); transition:background .15s ease;
}
.karte:hover .karte-mit-icon-badge{ background:color-mix(in srgb, var(--akzent) 20%, transparent); }
.karte-mit-icon svg{ flex:0 0 auto; color:var(--akzent); }
.karte-mit-icon h3{ margin:0 0 2px; }
.karte-mit-icon p{ margin:0; font-family:'IBM Plex Mono',monospace; font-size:12px; letter-spacing:.02em; }
.element-liste{ display:flex; gap:8px; flex-wrap:wrap; margin:14px 0 4px; }

/* "Ähnliche Inhalte" (Entity-Detailseite) - spielübergreifende Verbindungen
   über ein gemeinsames Element. Bewusst ruhig gehalten: eine dezente
   Kopfzeile pro Element statt grosser Grafiken, damit der Wissensgraph-
   Gedanke ("alles ist verknüpft") ohne Spielerei transportiert wird. */
.aehnliche-section{ margin-top:40px; padding-top:28px; border-top:1px solid var(--border); }
.aehnliche-section h2{ margin-top:0; }
.aehnliche-element-kopf{
  display:flex; align-items:center; gap:8px; margin:20px 0 10px;
  font-size:13px; color:var(--text-2);
}
.aehnliche-element-kopf strong{ color:var(--text); font-weight:600; }

.kampfdaten{
  background:linear-gradient(165deg, var(--oberflaeche) 0%, color-mix(in srgb, var(--oberflaeche) 92%, var(--akzent) 4%) 100%);
  border:1px solid var(--border); border-radius:14px; padding:22px 24px; margin:18px 0;
  box-shadow:0 1px 2px rgba(0,0,0,0.04);
}

/* Die Abschnittsmarke ist der kleine Text ueber einer Ueberschrift. Sie
   traegt jetzt Gold: Zusammen mit der Serifen-Ueberschrift darunter ergibt
   das den Rhythmus, den ein Nachschlagewerk braucht - Marke, Titel, Text. */
.abschnitt-label{
  font-family:var(--schrift-mono); font-size:11px; font-weight:700;
  color:var(--akzent); text-transform:uppercase; letter-spacing:.11em;
  margin:28px 0 8px;
}
.abschnitt-label:first-child{ margin-top:0; }

/* Ruhige Trennlinie zwischen grossen Seitenabschnitten (z.B. vor "Inhalte",
   vor "Erfahrungsberichte") - läuft zu beiden Seiten aus, damit sie nicht
   wie eine harte Tabellenlinie wirkt. */
.abschnitt-trenner{ border:none; height:1px; margin:36px 0 28px; background:linear-gradient(90deg, transparent, var(--border) 15%, var(--border) 85%, transparent); }
/* Der Verlauf ging von der Flaeche zu einem Hauch Akzent - auf Weiss ein
   sanfter Schimmer, auf Dunkel praktisch unsichtbar. Auf dunklem Grund
   muss der Verlauf HELLER werden, nicht farbiger. */
.stat-karte{
  background:linear-gradient(165deg,
    var(--oberflaeche-2) 0%,
    var(--oberflaeche) 62%,
    color-mix(in srgb, var(--oberflaeche) 88%, var(--akzent) 7%) 100%);
  border:1px solid var(--border); border-radius:var(--radius-gross);
  padding:22px 24px; margin:18px 0;
  box-shadow:var(--erhebung);
}
/* minmax bewusst grosszuegiger als vorher (220 statt 180px): bei kurzen
   Werten ("50 Std.") bleibt trotzdem viel Luft, bei langen ("2026 JP · 2027
   EU") oder der Community-Wertung bricht der Text nicht mehr mitten im Wort
   um - das Grid bleibt so unabhaengig von der Textlaenge ruhig. */
.stat-grid{ display:grid; grid-template-columns:repeat(auto-fill,minmax(220px,1fr)); gap:22px 28px; }
.stat-zeile{ display:flex; flex-direction:column; gap:3px; min-width:0; }
/* Fuer Werte, die auch bei 220px noch eng werden koennten (z.B. "Community-
   Wertung" mit Zusatztext) - nimmt zwei Spalten ein statt zu quetschen. */
.stat-zeile-breit{ grid-column:span 2; }
@media (max-width:520px){ .stat-zeile-breit{ grid-column:span 1; } }
.stat-label{ font-family:'IBM Plex Mono',monospace; font-size:11px; color:var(--text-2); text-transform:uppercase; letter-spacing:.04em; }
.stat-wert{ font-size:15px; font-weight:600; line-height:1.4; }
.stat-wert-zahl{ font-size:22px; font-weight:800; letter-spacing:-.01em; color:var(--akzent); font-variant-numeric:tabular-nums; }
.stat-wert-zusatz{ font-size:12.5px; color:var(--text-2); }

/* "Spiel auf einen Blick"-Tabelle (abschnitt-spiel): kompakte Label|Wert-
   Zeilen statt Grid-Kacheln - besser scannbar bei vielen Datenpunkten,
   eigene Klasse statt .stat-grid global anzufassen (nur diese Seite). */
.spiel-info-tabelle{ display:flex; flex-direction:column; }
.spiel-info-zeile{ display:flex; align-items:baseline; justify-content:space-between; gap:16px; padding:9px 0; border-bottom:1px solid var(--border); }
.spiel-info-zeile:last-child{ border-bottom:none; }
.spiel-info-zeile .stat-label{ flex-shrink:0; }
.spiel-info-zeile .stat-wert{ text-align:right; }

.kategorie-tag{ font-weight:700; }
.kategorie-nahkampf, .kategorie-aktiv, .kategorie-angriff{ color:var(--fehler); border-color:var(--fehler); background:color-mix(in srgb, var(--fehler) 10%, transparent); }
.kategorie-fernkampf, .kategorie-buff, .kategorie-unterstuetzung{ color:var(--erfolg); border-color:var(--erfolg); background:color-mix(in srgb, var(--erfolg) 10%, transparent); }
.kategorie-magisch, .kategorie-verteidigung{ color:var(--info); border-color:var(--info); background:color-mix(in srgb, var(--info) 10%, transparent); }
.kategorie-passiv, .kategorie-kontrolle{ color:#7C3AED; border-color:#7C3AED; background:color-mix(in srgb, #7C3AED 10%, transparent); }
.kategorie-debuff{ color:var(--warnung); border-color:var(--warnung); background:color-mix(in srgb, var(--warnung) 10%, transparent); }
.kategorie-heilung{ color:#0D9488; border-color:#0D9488; background:color-mix(in srgb, #0D9488 10%, transparent); }
.kampfdaten-werte{ display:flex; gap:28px; margin-bottom:16px; }
.kampfdaten-wert{ display:flex; flex-direction:column; }
.kampfdaten-label{ font-family:'IBM Plex Mono',monospace; font-size:11px; color:var(--text-2); text-transform:uppercase; letter-spacing:.04em; }
.kampfdaten-zahl{ font-size:22px; font-weight:700; }
.kampfdaten-elemente{ display:flex; flex-direction:column; gap:8px; margin-bottom:14px; }
.kampfdaten-element-zeile{ display:flex; align-items:center; gap:8px; flex-wrap:wrap; }
.kampfdaten-element-label{ font-size:12.5px; color:var(--text-2); font-weight:600; min-width:150px; }
.kampfdaten-text{ font-size:13.5px; margin:6px 0; }
.kampfdaten-liste-block{ margin-top:14px; }
.raster-klein{ display:grid; grid-template-columns:repeat(auto-fill,minmax(150px,1fr)); gap:8px; margin-top:8px; }

.vergleich-kopf{ display:grid; grid-template-columns:1fr auto 1fr; align-items:center; gap:16px; margin:20px 0; }
.vergleich-vs{ font-family:'IBM Plex Mono',monospace; font-weight:700; color:var(--text-2); font-size:13px; }
.vergleich-tabelle{ width:100%; border-collapse:collapse; margin-top:20px; }
.vergleich-tabelle th{ text-align:center; padding:10px; border-bottom:2px solid var(--border); font-size:13px; }
.vergleich-tabelle th:nth-child(2){ font-family:'IBM Plex Mono',monospace; font-size:11px; color:var(--text-2); }
.vergleich-tabelle td{ padding:10px; border-bottom:1px solid var(--border); text-align:center; font-size:13.5px; }
.vergleich-label{ font-family:'IBM Plex Mono',monospace; font-size:11.5px; color:var(--text-2); text-transform:uppercase; }
.vergleich-besser{ color:var(--erfolg); font-weight:700; }
.vergleich-auswertung-zeile td{ border-bottom:1px solid var(--border); padding:4px 10px 14px; text-align:center; font-size:12.5px; color:var(--text-2); font-style:italic; }
@media (max-width:700px){
  .vergleich-kopf{ grid-template-columns:1fr; }
  .vergleich-vs{ justify-self:center; }
}
.vergleich-picker{ display:flex; gap:12px; align-items:flex-end; margin:18px 0; flex-wrap:wrap; }
.vergleich-picker select{ padding:9px 12px; border:1px solid var(--border); border-radius:var(--radius-klein); background:var(--bg); color:var(--text); font-size:13.5px; width:100%; }

/* Das Freitextfeld steht ÜBER dem Filterkasten und nicht darin.
   Es ist der Einstieg - erst tippen, dann bei Bedarf verfeinern. Im Kasten
   wäre es eines von acht Feldern und damit genauso beiläufig wie
   "Plattform". */
.finder-freitext{ display:block; margin-bottom:14px; font-size:13.5px; color:var(--text-2); }
.finder-freitext input{
  display:block; width:100%; margin-top:6px; padding:13px 16px;
  border:1px solid var(--border); border-radius:var(--radius);
  background:var(--bg); color:var(--text); font-size:15px; font-family:inherit;
}
.finder-freitext input:focus{ outline:none; border-color:var(--akzent); }
.finder-freitext small{ display:block; margin-top:6px; font-size:12px; }

.finder-formular{ display:flex; flex-wrap:wrap; gap:16px; align-items:flex-end; background:var(--oberflaeche); border:1px solid var(--border); border-radius:var(--radius); padding:20px; }
.finder-formular label{ min-width:160px; }
.finder-formular select{ padding:9px 12px; border:1px solid var(--border); border-radius:var(--radius-klein); background:var(--bg); color:var(--text); font-size:13.5px; width:100%; }
.finder-ergebnisse{ display:flex; flex-direction:column; gap:14px; }
.finder-karte{ display:block; border:1px solid var(--border); border-radius:var(--radius); padding:18px 20px; }
.finder-karte:hover{ border-color:var(--akzent); }
.finder-karte-kopf{ display:flex; justify-content:space-between; align-items:center; margin-bottom:8px; }
.finder-karte-kopf h3{ margin:0; font-size:16px; }
.finder-score{ font-family:'IBM Plex Mono',monospace; font-weight:700; font-size:16px; color:var(--akzent); }
.finder-balken{ height:6px; background:var(--border); border-radius:var(--radius-rund); overflow:hidden; margin-bottom:12px; }
.finder-balken-fuellung{ height:100%; background:var(--akzent); border-radius:var(--radius-rund); }
.finder-gruende{ list-style:none; padding:0; margin:4px 0 0; font-size:12.5px; }
.finder-gruende-plus li{ color:var(--erfolg); }
.finder-gruende-minus li{ color:var(--text-2); }

.bewertung-block{ background:var(--oberflaeche); border:1px solid var(--border); border-radius:var(--radius); padding:22px; margin:20px 0; }
.bewertung-gesamt{ display:flex; align-items:baseline; gap:6px; margin-bottom:18px; flex-wrap:wrap; }
.bewertung-gesamt-zahl{ font-size:32px; font-weight:700; color:var(--akzent); }
.bewertung-gesamt-max{ font-size:16px; color:var(--text-2); }
.bewertung-gesamt-label{ font-size:12.5px; color:var(--text-2); margin-left:8px; }
.bewertung-zeile{ display:grid; grid-template-columns:130px 1fr 32px; align-items:center; gap:10px; margin-bottom:4px; }
.bewertung-label{ font-size:12.5px; color:var(--text-2); }
.bewertung-balken{ height:6px; background:var(--border); border-radius:var(--radius-rund); overflow:hidden; }
.bewertung-balken-fuellung{ height:100%; background:var(--akzent); border-radius:var(--radius-rund); }
.bewertung-zahl{ font-family:'IBM Plex Mono',monospace; font-size:12px; text-align:right; }
.bewertung-note{ font-size:12px; color:var(--text-2); margin:0 0 10px; padding-left:140px; font-style:italic; }
@media (max-width:600px){
  .bewertung-zeile{ grid-template-columns:100px 1fr 28px; }
  .bewertung-note{ padding-left:0; }
}
.element-tag{
  font-family:'IBM Plex Mono',monospace; font-size:11px; font-weight:600; padding:5px 12px;
  border-radius:var(--radius-rund); background:var(--oberflaeche); border:1px solid var(--border); color:var(--text-2);
  display:inline-flex; align-items:center; gap:4px;
}
a.element-tag:hover{ border-color:var(--akzent); color:var(--akzent); }
.element-tag-feuer{ color:#FF6B5A; border-color:#FF6B5A; background:color-mix(in srgb, #FF6B5A 12%, transparent); }
.element-tag-eis{ color:#4FC3F7; border-color:#4FC3F7; background:color-mix(in srgb, #4FC3F7 12%, transparent); }
.element-tag-erde{ color:#C49A46; border-color:#C49A46; background:color-mix(in srgb, #C49A46 12%, transparent); }
.element-tag-wind{ color:#5BD98A; border-color:#5BD98A; background:color-mix(in srgb, #5BD98A 12%, transparent); }
.element-tag-licht{ color:#F5D76E; border-color:#F5D76E; background:color-mix(in srgb, #F5D76E 12%, transparent); }
.element-tag-schall{ color:#A78BFA; border-color:#A78BFA; background:color-mix(in srgb, #A78BFA 12%, transparent); }
.element-tag-blitz{ color:#FFC93C; border-color:#FFC93C; background:color-mix(in srgb, #FFC93C 12%, transparent); }
.element-tag-wasser{ color:#5B9BFF; border-color:#5B9BFF; background:color-mix(in srgb, #5B9BFF 12%, transparent); }
/* ---- Wirkungsliste im Admin -----------------------------------------------

   Die Balkenansicht - eine Wirkung je Zeile, mit Farbstreifen fuer die
   Richtung. Auf der Besucherseite ist sie durch das Wirkungsgitter darunter
   ersetzt; im Builder bleibt sie, und das ist kein Versehen:

   Dort geht es ums PFLEGEN. Eine Redakteurin will jede einzelne Wirkung
   sehen, wie sie in der Datenbank steht - mit ihrem vollen Satz, in der
   Reihenfolge der Sortierung, und jede fuer sich anklickbar. Das Gitter
   fasst zusammen und ist genau deshalb hier falsch.

   Die Regeln standen kurz vor dem Loeschen, weil ich sie fuer Ueberbleibsel
   der alten Ansicht hielt. Sie sind noch in Benutzung. */
.eintrag-wirkung-liste{
  list-style:none; padding:0; margin:0 0 12px;
  display:flex; flex-direction:column; gap:6px;
}
.eintrag-wirkung-liste li{
  font-size:13px; line-height:1.5; padding:7px 11px;
  border-radius:var(--radius-klein);
  background:var(--bg); border:1px solid var(--border);
  border-left-width:3px;
}
.eintrag-wirkung-liste li.ist-offensiv{ border-left-color:var(--fehler); }
.eintrag-wirkung-liste li.ist-defensiv{ border-left-color:var(--akzent); }
.eintrag-wirkung-liste li.ist-neutral{ border-left-color:var(--text-2); }

/* ---- Aehnliche Inhalte ----------------------------------------------------

   Was das Gegenelement traegt. Links und keine Plaketten: Sie fuehren
   woandershin, und das soll man sehen, bevor man klickt. */
.aehnlich-liste{ display:flex; flex-wrap:wrap; gap:6px; }
.aehnlich-liste a{
  font-size:12.5px; padding:4px 10px; border-radius:var(--radius-rund);
  border:1px solid var(--border); background:var(--bg); color:var(--text-2);
  transition:border-color var(--dauer) var(--kurve), color var(--dauer) var(--kurve);
}
.aehnlich-liste a:hover{ border-color:var(--kante-gold); color:var(--text); }
.aehnlich-mehr{ font-size:11.5px; color:var(--text-2); align-self:center; font-style:italic; }

/* ---- Wirkungsgitter -------------------------------------------------------

   „Schwach gegen  [Feuer] [Eis]" - die Ansicht aus der alten Spieleseite.

   Vorher stand jede Wirkung als eigener Balken untereinander: acht Zeilen,
   alle gleich breit, alle gleich grau. Wer wissen wollte, wogegen ein Gegner
   schwach ist, musste sie Wort fuer Wort lesen.

   Ein <dl> und kein <div>: Beschriftung und Werte sind genau das, wofuer es
   die Beschreibungsliste gibt - und ein Vorlesegeraet meldet die Zuordnung
   mit, ohne dass man sie ihm sagen muss.

   ---------------------------------------------------------------------------
   DIE BESCHRIFTUNG STEHT LINKS UND HAT EINE FESTE BREITE
   ---------------------------------------------------------------------------
   `minmax(96px, auto)`: Die Spalte richtet sich nach der laengsten Wendung
   („Resistent gegen"), und alle Plaketten beginnen dadurch an derselben
   Kante. Ohne feste Kante wandert der Anfang der Plaketten von Zeile zu
   Zeile mit der Laenge der Beschriftung - und das Auge findet die Reihe
   nicht mehr.
   --------------------------------------------------------------------------- */
.wirkungsgitter{
  display:grid;
  grid-template-columns:minmax(96px, auto) minmax(0, 1fr);
  gap:9px 16px;
  margin:0 0 4px;
  align-items:baseline;
}

/* Die Beschriftung: klein, versal, gedaempft - sie benennt die Reihe und
   soll nicht mit den Plaketten um Aufmerksamkeit ringen. */
.wirkungsgitter dt{
  font-family:var(--schrift-mono); font-size:10.5px; font-weight:700;
  text-transform:uppercase; letter-spacing:.06em;
  color:var(--text-2);
  padding-top:4px;
  white-space:nowrap;
}

/* Die Richtung als Punkt vor der Beschriftung. Offensiv ist, was der
   Eintrag TUT; defensiv, was ihm widerfaehrt. Wer nach einer Schwaeche
   sucht, findet die Reihe am Punkt, bevor er liest. */
.wirkungsgitter dt::before{
  content:''; display:inline-block;
  width:5px; height:5px; border-radius:50%;
  margin-right:7px; vertical-align:middle;
  background:var(--text-2);
}
.wirkungsgitter dt.ist-offensiv::before{ background:var(--fehler); }
.wirkungsgitter dt.ist-defensiv::before{ background:var(--akzent); }

.wirkungsgitter dd{
  margin:0;
  display:flex; flex-wrap:wrap; gap:6px;
}

/* Der Zusatz („50 %") in der Plakette: kleiner, halbdurchsichtig, mit
   einem feinen Strich abgesetzt. Er gehoert zum Element und ist doch nicht
   sein Name. */
.wirkungsgitter .element-tag small{
  font-size:10px; opacity:.75;
  padding-left:6px; margin-left:2px;
  border-left:1px solid currentColor;
}

@media (max-width: 560px){
  /* Untereinander: Bei 96px Beschriftung und Plaketten daneben bleibt auf
     einem Telefon fuer die Plaketten zu wenig. */
  .wirkungsgitter{ grid-template-columns:1fr; gap:4px 0; }
  .wirkungsgitter dt{ padding-top:8px; }
  .wirkungsgitter dd{ margin-bottom:6px; }
}
.element-tag-heilig{ color:#FFE9A8; border-color:#FFE9A8; background:color-mix(in srgb, #FFE9A8 12%, transparent); }
.element-tag-dunkel{ color:#B388FF; border-color:#B388FF; background:color-mix(in srgb, #B388FF 12%, transparent); }
.element-tag-gift{ color:#8BD450; border-color:#8BD450; background:color-mix(in srgb, #8BD450 12%, transparent); }
.element-tag-gravitation{ color:#9AA3C7; border-color:#9AA3C7; background:color-mix(in srgb, #9AA3C7 12%, transparent); }

/* Koerperliche Arten und „nicht-elementar" bleiben gedaempft: Sie sind
   Angaben und keine Elemente im Sinne von Feuer und Eis. Ein eigener Ton fuer
   jede von ihnen waere ein Regenbogen ohne Ordnung - und dann sagt die Farbe
   gar nichts mehr. */
.element-tag-hieb,
.element-tag-stich,
.element-tag-schlag,
.element-tag-neutral{
  color:var(--text-2); border-color:var(--border);
  background:color-mix(in srgb, var(--text-2) 8%, transparent);
}

/* Zustaende („Gift", „Blind", „Stumm") bekommen keine eigene Farbe - davon
   gibt es zu viele. Sie stehen in der Akzentfarbe und heben sich damit von
   den Elementen ab, ohne mit ihnen um Aufmerksamkeit zu ringen. */
.element-tag.ist-zustand{
  color:var(--akzent); border-color:var(--kante-gold);
  background:color-mix(in srgb, var(--akzent) 10%, transparent);
}

/* Die Wendung davor („Schwach gegen") und der Zusatz danach („50 %") stehen
   gedaempft - die Plakette dazwischen traegt die Auskunft. */
.wirkung-wendung{ color:var(--text-2); font-size:12.5px; }
.wirkung-zusatz{
  color:var(--text-2); font-size:11.5px; font-family:var(--schrift-mono);
}
.suche-filter{ display:flex; gap:8px; flex-wrap:wrap; margin:18px 0 28px; }
.suche-filter a{
  padding:7px 14px; border:1px solid var(--border); border-radius:var(--radius-rund); font-size:12.5px;
  color:var(--text-2); background:var(--oberflaeche); transition:all .15s ease;
}
.suche-filter a:hover{ color:var(--text); border-color:var(--akzent); }
.suche-filter a.aktiv{ background:var(--akzent); border-color:var(--akzent); color:var(--bg); }

.erweiterte-filter{ margin:0 0 28px; }
.erweiterte-filter summary{
  cursor:pointer; font-size:13.5px; font-weight:600; color:var(--text-2);
  padding:8px 0; list-style:none; display:inline-flex; align-items:center; gap:6px;
}
.erweiterte-filter summary::-webkit-details-marker{ display:none; }
.erweiterte-filter summary::before{ content:'▸'; font-size:11px; transition:transform .15s ease; }
.erweiterte-filter[open] summary::before{ transform:rotate(90deg); }
.erweiterte-filter summary:hover{ color:var(--text); }

.fortschritt-widget{ border:1px solid var(--border); border-radius:var(--radius); padding:16px 20px; margin:20px 0; background:var(--oberflaeche); }
.fortschritt-buttons{ display:flex; gap:8px; flex-wrap:wrap; margin-top:8px; }
.fortschritt-status-btn{
  padding:7px 14px; border:1px solid var(--border); border-radius:var(--radius-rund); background:var(--bg);
  color:var(--text-2); font-size:12.5px; font-family:inherit; cursor:pointer; transition:all .15s ease;
}
.fortschritt-status-btn:hover{ border-color:var(--akzent); color:var(--text); }
/* `color:#fff` war auf dem alten Blau richtig und ist auf Gold
   unlesbar - dieselbe Stelle wie beim gefuellten Knopf. */
.fortschritt-status-btn.ist-aktiv{
  background:var(--akzent); border-color:var(--akzent);
  color:var(--bg); font-weight:600;
}
.fortschritt-zeile{ display:flex; justify-content:space-between; font-size:13.5px; padding:6px 0; border-bottom:1px solid var(--border); }
.fortschritt-zeile:last-child{ border-bottom:none; }

.formular{ display:flex; flex-direction:column; gap:14px; margin-top:20px; }
.formular label{ display:flex; flex-direction:column; gap:6px; font-size:13.5px; color:var(--text-2); }
.formular input{ padding:10px 12px; border:1px solid var(--border); border-radius:var(--radius-klein); font-size:14px; font-family:inherit; }
/* ---- Knoepfe --------------------------------------------------------------

   `color:#fff` stand hier fest - und war auf dem alten Blau richtig. Auf Gold
   ist weisser Text unlesbar: #FFF auf #E9C171 ergibt 1,7:1.

   Ein gefuellter Knopf traegt jetzt DUNKLEN Text. Das ist keine Ausnahme fuer
   Gold, sondern die Regel fuer jede helle Fuellfarbe - und der Grund, warum
   `--akzent` und `--akzent-tief` zwei Werte sind statt einer Farbe mit
   Helligkeitsstufen. */
.btn{
  display:inline-block; padding:11px 22px;
  background:var(--akzent); color:var(--bg);
  border:1px solid transparent; border-radius:var(--radius-klein);
  font-family:var(--schrift-text); font-size:14px; font-weight:600;
  letter-spacing:.01em; cursor:pointer;
  transition:background var(--dauer) var(--kurve), transform var(--dauer) var(--kurve);
}
/* Nur ein Hauch heller und ein Pixel hoch. Ein Knopf, der beim Zeigen um
   4px waechst, laesst die Zeile darunter zappeln. */
.btn:hover{ background:color-mix(in srgb, var(--akzent) 88%, #FFF); }
.btn:active{ transform:translateY(1px); }

.btn-sekundaer{
  background:var(--oberflaeche); color:var(--text);
  border:1px solid var(--border);
}
.btn-sekundaer:hover{
  background:var(--oberflaeche-2);
  border-color:var(--kante-gold);
  color:var(--text);
}
.btn-sekundaer:hover{ border-color:var(--akzent); color:var(--akzent); }
.spiel-hero-aktionen{ display:flex; align-items:center; gap:10px; flex-wrap:wrap; }
/* `background:#FEF2F2` und `border:#FCA5A5` waren auf Weiss ein zartes
   Rosa. Auf #0B0D14 sind es zwei leuchtende Flaechen - und ausgerechnet
   die Fehlermeldung schreit dann am lautesten.

   `color-mix` gegen `transparent` loest das ohne zweite Regel: Der Kasten
   nimmt die Farbe des Untergrunds auf, in beiden Modi. */
.fehler-box{
  background:color-mix(in srgb, var(--fehler) 12%, transparent);
  color:var(--fehler);
  border:1px solid color-mix(in srgb, var(--fehler) 40%, transparent);
  border-radius:var(--radius-klein); padding:11px 14px;
  font-size:13.5px; margin-bottom:12px;
}

.breadcrumb{ max-width:var(--inhalt-breite); margin:20px auto 0; padding:0 32px; font-size:13px; color:var(--text-2); }
.breadcrumb a{ color:var(--text-2); }
.breadcrumb a:hover{ color:var(--text); }

/* Glattere Breadcrumb-Variante mit Chevron-Trennern statt Schrägstrich-Text
   (Auftrag: Navigation "unschön gelöst") - bislang auf Entity-Detailseiten. */
.breadcrumb-neu{
  display:flex; align-items:center; flex-wrap:wrap; gap:2px;
  max-width:var(--inhalt-breite); margin:20px auto 0; padding:0 32px;
  font-size:12.5px; color:var(--text-2);
}
.breadcrumb-neu a{
  color:var(--text-2); padding:3px 7px; border-radius:6px; transition:background .15s ease, color .15s ease;
}
.breadcrumb-neu a:hover{ color:var(--text); background:var(--oberflaeche); }
.breadcrumb-neu-trenner{ color:var(--border); font-size:13px; }
.breadcrumb-neu-aktuell{ color:var(--text); font-weight:600; padding:3px 7px; }

/* Vor-/Zurück-Slider zwischen Inhalten desselben Typs im selben Spiel. */
.entity-slider{
  display:flex; align-items:center; justify-content:space-between; gap:12px;
  max-width:var(--inhalt-breite); margin:10px auto 0; padding:0 32px;
}
.entity-slider-pfeil{
  display:inline-flex; align-items:center; gap:8px; padding:8px 14px; border-radius:var(--radius-rund);
  background:var(--oberflaeche); border:1px solid var(--border); color:var(--text-2); font-size:13px;
  transition:border-color .15s ease, color .15s ease; max-width:48%;
}
.entity-slider-pfeil:hover{ border-color:var(--akzent); color:var(--akzent); }
.entity-slider-links{ margin-right:auto; }
.entity-slider-rechts{ margin-left:auto; }
.entity-slider-name{ overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
@media (max-width:640px){ .entity-slider-name{ max-width:110px; } }

.liste{ padding-left:20px; font-size:14px; }
.liste li{ margin-bottom:6px; }

.hinweis{ color:var(--text-2); font-size:14px; }
/* Die beiden Trennlinien der Fusszeile - oben und ueber der Copyright-Zeile -
   enden buendig mit dem Inhalt, statt ueber die ganze Fensterbreite zu laufen.
   Auf einem breiten Monitor zogen sie sich sonst quer durch das Bild, waehrend
   der Text darunter bei 1100 px endete.

   Umgesetzt als Pseudo-Element statt als border-top: Ein Rahmen sitzt immer
   an der Kante seines Elements und laesst sich nicht schmaler machen als
   dieses. Die Linie braucht aber eine eigene Breite, unabhaengig vom
   Container.

   width und max-width zusammen decken beide Faelle ab: Auf breiten Fenstern
   greift max-width (1100 px Inhaltsbreite minus 2x32 px Innenabstand, damit
   die Linie genau dort beginnt, wo auch die Spaltenueberschriften beginnen);
   auf schmalen greift width und haelt denselben Abstand zum Rand. */
.fuss{ color:var(--text-2); font-size:13px; margin-top:60px; }
.fuss::before,
.fuss-zeile::before{
  content:'';
  display:block;
  height:1px;
  background:var(--border);
  max-width:var(--inhalt-innen);
  margin:0 auto;
}
/* .fuss hat selbst keinen Innenabstand - die Linie muss ihn deshalb hier
   erzeugen, damit sie auf schmalen Fenstern denselben Randabstand haelt wie
   der Text darunter. */
.fuss::before{ width:calc(100% - 64px); }
/* .fuss-zeile bringt ihre 32 px bereits mit. Hier waere derselbe Abzug ein
   zweites Mal wirksam und die Linie am Ende 96 px vom Rand entfernt - sie
   waere sichtbar schmaler als die obere. */
.fuss-zeile::before{ width:100%; }
/* Zentriert statt linksbuendig.

   `justify-items:center` ruecke die Spalten zusammen und laesst sie als
   Block in der Mitte stehen; `text-align:center` richtet ihren Inhalt
   danach aus. Beides zusammen - ohne das zweite staenden die Ueberschriften
   mittig und die Links darunter linksbuendig. */
.fuss-innen{
  max-width:var(--inhalt-breite); margin:0 auto;
  padding:40px 32px 24px;
  display:grid; grid-template-columns:repeat(3,1fr); gap:28px;
  justify-items:center; text-align:center;
}
/* Die Listen sind Flex-Spalten - `text-align` allein reicht dort nicht,
   weil die Elemente an der Flex-Achse ausgerichtet werden. */
.fuss-spalte ul{ align-items:center; }
.fuss-spalte h4{ font-family:'IBM Plex Mono',monospace; font-size:11px; text-transform:uppercase; letter-spacing:.06em; color:var(--text-2); margin:0 0 12px; }
.fuss-spalte ul{ display:flex; flex-direction:column; gap:8px; }
.fuss-spalte a{ font-size:13.5px; color:var(--text-2); }
.fuss-spalte a:hover{ color:var(--text); }
/* padding-top auf 0: Die Linie ist jetzt das erste Kind und braucht den
   Abstand UNTER sich, nicht ueber sich - sonst schwebte sie 16 px unterhalb
   der Oberkante statt an ihr. */
.fuss-zeile{ padding:0 32px 16px; text-align:center; }
.fuss-zeile::before{ margin-bottom:16px; }
.fuss-disclaimer{ max-width:700px; margin:0 auto; padding:0 32px 20px; text-align:center; }
.fuss-disclaimer p{ font-size:11.5px; color:var(--text-2); line-height:1.6; margin:0; }
/* Die Markenzeile ist laenger als das frühere „© 2026 RPG Portal" - sie
   bekommt eine Lesebreite und etwas kleinere Schrift, damit sie unter dem
   Fuss nicht wie eine zweite Navigation wirkt. */
.fuss-zeile p{
  margin:0 auto; max-width:72ch;
  font-size:12.5px; line-height:1.6; color:var(--text-2);
  text-wrap:pretty;
}
.fuss-zeile a{ color:var(--text-2); text-decoration:underline; }
.fuss-zeile a:hover, .fuss-zeile a:focus-visible{ color:var(--akzent); }
@media (max-width:600px){ .fuss-innen{ grid-template-columns:1fr; } }

@media (max-width:700px){
  .hero, .abschnitt{ padding:24px 18px; }
}

/* ---------- Karte (eigenes SVG, keine fremden Kartenbilder) ---------- */
.karten-buehne{ position:relative; width:100%; max-width:720px; border:1px solid var(--border); border-radius:var(--radius); overflow:hidden; margin-top:20px; }
.karten-buehne svg{ display:block; width:100%; height:auto; }
.karten-marker-schicht{ position:absolute; inset:0; }
.karten-marker{ position:absolute; transform:translate(-50%,-50%); display:flex; align-items:center; justify-content:center;
  width:22px; height:22px; border-radius:50%; background:var(--oberflaeche); border:2px solid var(--akzent); font-size:11px; font-weight:700; color:var(--akzent); }
.karten-marker.ist-erledigt{ background:var(--erfolg); border-color:var(--erfolg); color:#fff; }
.karten-marker .marker-label{ position:absolute; top:26px; left:50%; transform:translateX(-50%); white-space:nowrap; font-size:11px; background:var(--oberflaeche); padding:2px 6px; border-radius:4px; border:1px solid var(--border); opacity:0; transition:opacity .15s ease; pointer-events:none; }
.karten-marker:hover .marker-label{ opacity:1; }

/* ---------- Fragenbaum ---------- */
.frage-text{ font-size:17px; font-weight:500; margin:16px 0 20px; }
.btn-antwort{ display:block; width:100%; text-align:left; background:var(--oberflaeche); color:var(--text); border:1px solid var(--border); margin-bottom:8px; }
.btn-antwort:hover{ border-color:var(--akzent); }

/* ---------- Werbeflächen ---------- */
.ad-slot{ text-align:center; padding:14px; border:1px dashed var(--border); border-radius:var(--radius-klein); margin:24px 0; color:var(--text-2); font-size:11px; }
.ad-slot-label{ font-family:'IBM Plex Mono',monospace; font-size:10px; text-transform:uppercase; letter-spacing:.05em; display:block; margin-bottom:6px; }

/* ---------- Admin-Bereich ---------- */
.admin-nav{ background:var(--oberflaeche); border-bottom:1px solid var(--border); }
.admin-nav-tabs{ display:flex; align-items:center; flex-wrap:wrap; justify-content:center; gap:4px; max-width:var(--inhalt-breite); margin:0 auto; padding:10px 24px; position:relative; }
.admin-nav-tabs a{
  padding:8px 16px; border-radius:var(--radius-rund); font-size:13.5px; font-weight:600;
  color:var(--text-2); transition:background .15s ease, color .15s ease;
}
.admin-nav-tabs a:hover{ color:var(--text); background:var(--bg); }
.admin-nav-tabs a.ist-aktiv{ color:var(--bg); background:var(--akzent); }
.admin-nav-extern{ position:absolute; right:24px; font-weight:400 !important; color:var(--text-2) !important; background:none !important; }
.admin-nav-extern:hover{ color:var(--text) !important; background:none !important; }
.admin-nav-sub{ display:flex; flex-wrap:wrap; justify-content:center; gap:18px; max-width:var(--inhalt-breite); margin:0 auto; padding:0 28px 12px; font-size:13px; }
.admin-nav-sub a{ color:var(--text-2); padding-bottom:2px; border-bottom:2px solid transparent; }
.admin-nav-sub a:hover{ color:var(--text); }
.admin-nav-sub a.ist-aktiv{ color:var(--text); border-bottom-color:var(--akzent); font-weight:600; }
@media (max-width:1024px){
  .admin-nav-tabs{ padding:10px 14px; overflow-x:auto; justify-content:flex-start; }
  .admin-nav-extern{ position:static; margin-left:12px; }
  .admin-nav-sub{ padding:0 14px 12px; overflow-x:auto; justify-content:flex-start; }
}

/* Tab-Leiste innerhalb von Formularen (z.B. Inhalt bearbeiten) - gleiches Prinzip */
.admin-tabs{ display:flex; flex-wrap:wrap; gap:8px; margin-bottom:20px; border-bottom:1px solid var(--border); padding-bottom:12px; }
.admin-tab{
  display:inline-flex; align-items:center; gap:8px; padding:8px 16px; border-radius:var(--radius-rund);
  border:1px solid var(--border); background:var(--oberflaeche); color:var(--text-2);
  font-size:13.5px; font-family:inherit; cursor:pointer; transition:background .15s ease, color .15s ease, border-color .15s ease;
}
.admin-tab:hover{ color:var(--text); border-color:var(--akzent); }
.admin-tab.ist-aktiv{ background:var(--akzent); border-color:var(--akzent); color:var(--bg); }
.admin-tab-nummer{
  display:inline-flex; align-items:center; justify-content:center; width:18px; height:18px;
  border-radius:50%; background:rgba(255,255,255,0.25); font-size:11px; font-weight:700;
}
.admin-tab:not(.ist-aktiv) .admin-tab-nummer{ background:var(--border); color:var(--text-2); }
.admin-panel{ display:none; }
.admin-panel.ist-aktiv{ display:block; }
.admin-tabelle{ width:100%; min-width:480px; border-collapse:collapse; font-size:13.5px; }
.admin-tabelle-wrapper{ overflow-x:auto; -webkit-overflow-scrolling:touch; margin-bottom:16px; }
@media (max-width:700px){
  .admin-tabelle td, .admin-tabelle th{ white-space:nowrap; }
}
.admin-tabelle th{ text-align:left; padding:10px 12px; border-bottom:1px solid var(--border); color:var(--text-2); font-weight:600; font-size:12px; text-transform:uppercase; letter-spacing:.03em; }
.admin-tabelle td{ padding:10px 12px; border-bottom:1px solid var(--border); }
.admin-tabelle a{ color:var(--akzent); font-size:12.5px; }
.admin-tabelle .spalte-haken{ width:1%; padding-right:0; text-align:center; }
.admin-tabelle code{ font-family:'IBM Plex Mono',monospace; font-size:12px; color:var(--text-2); }
.status-tag{ font-family:'IBM Plex Mono',monospace; font-size:10.5px; padding:3px 9px; border-radius:var(--radius-rund); text-transform:uppercase; }
/* SECHS REGELN FUER DREI MARKEN - jetzt drei.

   Hier standen die hellen Werte und darunter noch einmal dieselben Marken
   fuer den dunklen Modus. Wer eine Farbe aenderte, musste an zwei Stellen
   denken; wer es vergass, bekam eine Marke, die in einem der beiden Modi
   nicht passte - und man sieht immer nur einen Modus gleichzeitig.

   `color-mix` gegen `transparent` braucht keine zweite Fassung: Der
   Untergrund scheint durch, die Marke passt sich von selbst an. */
.status-published{
  background:color-mix(in srgb, var(--erfolg) 15%, transparent); color:var(--erfolg);
}
.status-draft{
  background:color-mix(in srgb, var(--warnung) 15%, transparent); color:var(--warnung);
}
.status-archived{
  background:color-mix(in srgb, var(--text-2) 15%, transparent); color:var(--text-2);
}
.formular select, .formular textarea{ padding:10px 12px; border:1px solid var(--border); border-radius:var(--radius-klein); font-size:14px; font-family:inherit; background:var(--bg); color:var(--text); }
.formular textarea{ resize:vertical; }
.konto-info{ background:var(--oberflaeche); border:1px solid var(--border); border-radius:10px; padding:16px 18px; margin:20px 0 32px; font-size:13.5px; }
.konto-info p{ margin:0 0 6px; }
.konto-info p:last-child{ margin-bottom:0; }
.admin-tabelle-btn{
  padding:5px 10px; border:1px solid var(--border);
  border-radius:var(--radius-klein); background:var(--bg);
  color:var(--text-2); font-size:11.5px; cursor:pointer; font-family:inherit;
  transition:border-color var(--dauer) var(--kurve), color var(--dauer) var(--kurve);
}
.admin-tabelle-btn:hover{ border-color:var(--kante-gold); color:var(--text); }
.admin-tabelle-btn:hover{ border-color:var(--akzent); color:var(--text); }

.admin-massenaktion{
  display:flex; align-items:center; gap:14px; padding:10px 16px; margin-bottom:14px;
  background:var(--oberflaeche); border:1px solid var(--border); border-radius:10px; font-size:13px; color:var(--text-2);
}
.admin-confirm-overlay{
  position:fixed; inset:0; z-index:200; background:rgba(0,0,0,0.55);
  display:flex; align-items:center; justify-content:center; padding:20px;
}
.admin-confirm-box{
  background:var(--oberflaeche); border:1px solid var(--border); border-radius:14px;
  padding:24px 26px; max-width:480px; width:100%; box-shadow:0 20px 50px rgba(0,0,0,0.4);
}
.admin-confirm-box h3{ margin:0 0 10px; }

/* ---------- Favoriten ---------- */
.favoriten-btn{
  display:inline-flex; align-items:center; gap:7px; padding:9px 16px; border-radius:var(--radius-rund);
  border:1px solid var(--border); background:var(--oberflaeche); color:var(--text-2);
  font-size:13px; font-weight:600; cursor:pointer; font-family:inherit; transition:all .15s ease;
}
.favoriten-btn svg{ width:15px; height:15px; }
.favoriten-btn:hover{ border-color:var(--akzent); color:var(--text); }
.favoriten-btn.ist-aktiv{ background:color-mix(in srgb, var(--akzent) 12%, transparent); border-color:var(--akzent); color:var(--akzent); }

/* ---------- Spiel-Showcase: 3D-Tilt-Karten, Glaseffekt-Badges, 3D-Button ----------
   Reines CSS, keine externen Bilder/Skripte. Primaer fuers dunkle Theme entworfen,
   funktioniert aber (mit reduziertem Kontrast) auch im hellen Theme. */

.showcase-raster{ display:flex; flex-direction:column; gap:10px; }

.showcase-release-reihe{ display:flex; flex-wrap:wrap; align-items:center; gap:8px; margin-bottom:16px; }
.showcase-release-label{
  font-family:'IBM Plex Mono',monospace; font-size:11px; font-weight:700; text-transform:uppercase;
  letter-spacing:.06em; color:var(--text-2); margin-right:2px;
}
.showcase-glass-badge{
  display:inline-flex; align-items:center; gap:5px; padding:5px 11px; border-radius:var(--radius-rund);
  background:var(--oberflaeche); border:1px solid var(--border);
}
.showcase-glass-badge-flagge{ font-size:14px; line-height:1; }
.showcase-glass-badge-jahr{ font-size:12px; font-weight:600; color:var(--text); }

/* Moderne, flache Spiel-Zeile (2026-2030) - ersetzt die alte 3D-Glaskarte */
.spielzeile{
  display:flex; align-items:center; gap:16px; padding:16px 18px; border-radius:var(--radius);
  background:var(--oberflaeche); border:1px solid var(--border); color:var(--text);
  transition:border-color .15s ease, transform .15s ease;
}
.spielzeile:hover{ border-color:var(--akzent); transform:translateX(2px); }
.spielzeile-initiale{
  flex:0 0 auto; width:48px; height:48px; border-radius:10px;
  display:flex; align-items:center; justify-content:center;
  background:var(--bg); border:1px solid var(--border);
  font-family:'IBM Plex Mono',monospace; font-weight:700; font-size:18px; color:var(--akzent);
}
.spielzeile-mitte{ flex:1; min-width:0; display:flex; flex-direction:column; gap:4px; }
.spielzeile-kopf{ display:flex; align-items:center; gap:10px; flex-wrap:wrap; }
.spielzeile-titel{ font-size:16px; font-weight:700; color:var(--text); }
.spielzeile-match{ font-size:11px; font-weight:700; color:var(--erfolg); background:color-mix(in srgb, var(--erfolg) 12%, transparent); padding:2px 9px; border-radius:var(--radius-rund); }
.spielzeile-beschreibung{ font-size:13px; color:var(--text-2); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.spielzeile-meta{ display:flex; flex-wrap:wrap; gap:6px; margin-top:2px; }
.spielzeile-community-status{ display:flex; flex-direction:column; gap:2px; font-size:11.5px; color:var(--text-2); margin-top:4px; }
.spielzeile-community-status-zeile{ display:block; }

/* ---------------------------------------------------------------------------
   REITER UND LISTE (2026-09-08)
   ---------------------------------------------------------------------------
   Ein erster Versuch faerbte jeden Reiter/Listeneintrag in seiner
   Inhaltsgruppenfarbe (rot/gruen/blau/violett je nach Art) - Rueckmeldung:
   "es wird schlimmer statt besser", die Buntheit wirkte unruhiger statt
   professioneller. Zurueck auf EINEN ruhigen Akzent (Gold) fuer alle
   Gruppen - die strukturelle Politur (Icon am Reiter, Hover-Lift,
   Schatten) bleibt bestehen, nur die Vielfarbigkeit ist wieder weg. */
.inhalt-explorer-tabs{ display:flex; flex-wrap:wrap; gap:6px; margin-bottom:14px; }
.inhalt-explorer-tab{
  display:inline-flex; align-items:center; gap:6px; padding:7px 13px; border-radius:var(--radius-rund);
  background:var(--oberflaeche); border:1px solid var(--border); color:var(--text-2); font-size:13px; cursor:pointer;
  transition:border-color .15s ease, color .15s ease, background .15s ease;
}
.inhalt-explorer-tab:hover{ color:var(--text); border-color:var(--akzent); }
/* `color:#fff` auf Gold ergibt 1,7:1 - dieselbe Stelle wie beim
   gefuellten Knopf. Der aktive Reiter traegt die Hintergrundfarbe. */
.inhalt-explorer-tab.ist-aktiv{
  background:var(--akzent); border-color:var(--akzent);
  color:var(--bg); font-weight:600;
}
.inhalt-explorer-tab-zahl{ opacity:.9; font-size:12px; font-variant-numeric:tabular-nums; }

/* Klickbare Ergebnisliste innerhalb der linken Anzeige (nach Tab-Klick). */
.inhalt-explorer-liste{ display:grid; grid-template-columns:repeat(auto-fill,minmax(160px,1fr)); gap:8px; }
.inhalt-explorer-listen-eintrag{
  text-align:left; padding:9px 12px; border-radius:var(--radius-klein); background:var(--bg); border:1px solid var(--border);
  color:var(--text); font-size:13px; cursor:pointer; transition:border-color .15s ease;
}
.inhalt-explorer-listen-eintrag:hover{ border-color:var(--akzent); color:var(--akzent); }

/* Schätze je Ort (2026-09-11): „Schätze Erdschrein" aufklappen → die Truhen
   dieses Gebiets. Dieselbe Optik wie ein Listeneintrag, eingerückte Liste. */
.inhalt-explorer-gruppe{ width:100%; border:1px solid var(--border); border-radius:var(--radius-klein); background:var(--bg); }
.inhalt-explorer-gruppe > summary{
  display:flex; align-items:center; gap:8px; padding:9px 12px;
  list-style:none; cursor:pointer; font-size:13px; color:var(--text);
}
.inhalt-explorer-gruppe > summary::-webkit-details-marker{ display:none; }
.inhalt-explorer-gruppe > summary::before{
  content:'▸'; font-size:11px; color:var(--text-2); transition:transform .15s ease;
}
.inhalt-explorer-gruppe[open] > summary::before{ transform:rotate(90deg); }
.inhalt-explorer-gruppe > summary:hover{ color:var(--akzent); }
.inhalt-explorer-gruppe[open] > summary{ border-bottom:1px solid var(--border); }
.inhalt-explorer-gruppe-zahl{ margin-left:auto; font-size:12px; color:var(--text-2); font-variant-numeric:tabular-nums; }
.inhalt-explorer-gruppe-liste{ display:flex; flex-direction:column; gap:4px; padding:8px 8px 8px 22px; }
.inhalt-explorer-gruppe-liste .inhalt-explorer-listen-eintrag{ width:100%; }
@media (prefers-reduced-motion: reduce){
  .inhalt-explorer-gruppe > summary::before{ transition:none; }
}


/* Spielinhalt-Explorer: Eintragsliste links, vollstaendige Detailkarte
   rechts. Die frühere Baum-Navigation ist entfallen (die Tab-Leiste deckt
   sie ab) - der freigewordene Platz geht an die Detailspalte. */
/* Der Schatten war fest auf Weiss gerechnet (`rgba(0,0,0,0.04)`) - auf
   dunklem Grund unsichtbar, weil man Schwarz nicht abdunkeln kann.
   `--erhebung` traegt in beiden Modi das Richtige: Lichtkante auf Tinte,
   Schatten auf Papier. */
.inhalt-explorer-anzeige{
  background:var(--oberflaeche); border:1px solid var(--border);
  border-radius:var(--radius);
  padding:20px 22px; min-height:160px;
  box-shadow:var(--erhebung);
}
.inhalt-explorer-anzeige.hat-liste{ display:grid; grid-template-columns:clamp(230px, 16vw, 340px) minmax(0,1fr); gap:0; padding:0; }
.inhalt-explorer-liste-pane{
  padding:16px; border-right:1px solid var(--border); max-height:640px; overflow-y:auto;
  display:flex; flex-direction:column; gap:6px;
}
.inhalt-explorer-liste-pane .inhalt-explorer-listen-eintrag{ width:100%; }
.inhalt-explorer-listen-eintrag.ist-aktiv{ border-color:var(--akzent); color:var(--akzent); background:color-mix(in srgb, var(--akzent) 10%, var(--bg)); }
/* Höhe folgt dem Inhalt (2026-09-11, Betreiber: „wenn ich auf Rain klicke, muss
   ich scrollen, weil sich der Explorer nicht weit genug nach unten zieht").
   Vorher 640px mit eigener Scrollleiste im Explorer. Die Liste links behält
   ihre Grenze - sie scrollt für sich. */
.inhalt-explorer-detail-pane{ padding:22px 24px; min-width:0; }
@media (max-width:760px){
  .inhalt-explorer-anzeige.hat-liste{ grid-template-columns:1fr; }
  .inhalt-explorer-liste-pane{ border-right:none; border-bottom:1px solid var(--border); max-height:220px; flex-direction:row; flex-wrap:wrap; }
}

/* Ort unter dem kurzen Namen (2026-09-11): „Schatztruhe #1" / „in Mitra". */
.inhalt-karte-ort{ margin:2px 0 0; font-size:13px; color:var(--text-2); }
.inhalt-karte-ort a{ color:var(--akzent); text-decoration:none; }
.inhalt-karte-ort a:hover{ text-decoration:underline; }

/* Builder: Schätze je Ort gruppiert, Ortsauswahl für Truhen (2026-09-11). */
.builder-eintrag-gruppe{ margin:0 0 6px; border:1px solid var(--border); border-radius:var(--radius-klein); }
.builder-eintrag-gruppe > summary{
  display:flex; align-items:center; gap:8px; padding:7px 10px;
  list-style:none; cursor:pointer; font-size:13px; font-weight:600;
}
.builder-eintrag-gruppe > summary::-webkit-details-marker{ display:none; }
.builder-eintrag-gruppe > summary::before{ content:'▸'; font-size:11px; color:var(--text-2); }
.builder-eintrag-gruppe[open] > summary::before{ content:'▾'; }
.builder-eintrag-gruppe-zahl{ margin-left:auto; font-size:11px; font-weight:500; color:var(--text-2); }
.builder-eintrag-gruppe-liste{ padding:0 6px 6px 16px; }
.builder-beziehung-zeile-truhenort{
  flex:1 1 150px; min-width:0; font-size:12.5px; padding:6px 8px;
  border-radius:6px; border:1px solid var(--border); background:var(--bg); color:var(--text);
}

/* ---------------------------------------------------------------------------
   DETAILKARTE IM EXPLORER (2026-09-08, Nutzerkorrektur: "das muss jetzt
   noch professioneller dargestellt werden ... noch sieht es so 0815
   aus")
   ---------------------------------------------------------------------------
   Vorher hatte `.inhalt-karte` selbst gar keine eigene Flaeche - sie
   sass als reiner Inhalt im Innenabstand ihres Rahmens
   (`.inhalt-explorer-detail-pane`), ohne Kante, ohne Tiefe. Jetzt hat
   sie eine eigene Flaeche mit Kante.

   2026-09-11 zurueckgenommen (Betreiberwunsch): die Farbe JE GRUPPE
   (Farbstreifen oben, `.ist-figuren` usw.) - ein Zauber violett, ein Ort
   gruen, ein Gegenstand blau. Die Karte traegt jetzt durchgehend den
   Akzent des Portals (`--gruppen-farbe` ist hier nirgends gesetzt, jede
   Regel faellt auf `--akzent` zurueck). Entity Card und Builder-Typ-Hero
   behalten ihre Gruppenfarben. */
.inhalt-karte{
  position:relative; background:var(--oberflaeche); border:1px solid var(--border);
  border-radius:var(--radius-gross); padding:22px 24px 24px; overflow:hidden;
}

.inhalt-karte-kopf{ margin-bottom:16px; }
/* „Schon gesehen?" oben rechts in der Karte (2026-09-11, Betreiber) - der Kurztext folgt direkt unter dem Namen. */
.inhalt-karte-kopf .karte-haken{ position:absolute; top:22px; right:24px; margin-top:0; }
.inhalt-karte-kopf:has(.karte-haken) .inhalt-karte-name{ padding-right:150px; }
@media (max-width:560px){ .inhalt-karte-kopf:has(.karte-haken) .inhalt-karte-name{ padding-right:0; margin-top:18px; } }
.inhalt-karte-typ{
  display:inline-flex; align-items:center; gap:6px; padding:3px 10px; border-radius:var(--radius-rund);
  background:color-mix(in srgb, var(--gruppen-farbe, var(--akzent)) 16%, transparent);
  color:var(--gruppen-farbe, var(--akzent));
  font-size:11.5px; font-weight:700; letter-spacing:.02em;
}
.inhalt-karte-name{ font-size:24px; font-weight:800; letter-spacing:-.01em; margin:10px 0 4px; }
.inhalt-karte-kurz{ font-size:13.5px; color:var(--text-2); margin:0; line-height:1.55; }
.inhalt-karte-block{ padding-top:18px; margin-top:18px; border-top:1px solid var(--border); }
.inhalt-karte-block:first-of-type{ border-top:none; padding-top:0; margin-top:0; }
.inhalt-karte-block-titel{
  font-family:'IBM Plex Mono',monospace; font-size:10.5px; font-weight:700;
  text-transform:uppercase; letter-spacing:.08em; color:var(--text-2); margin:0 0 10px;
  display:flex; align-items:center; gap:7px;
}
.inhalt-karte-text{ font-size:13.5px; line-height:1.65; margin:0; color:var(--text-2); }
.inhalt-karte-taxo{ display:flex; align-items:baseline; gap:12px; margin-bottom:8px; flex-wrap:wrap; }
.inhalt-karte-taxo .element-liste{ display:flex; flex-wrap:wrap; gap:5px; }

/* Verweise auf andere Inhalte: laden in derselben Ansicht nach (kein Link). */
.inhalt-verweis-liste{ display:flex; flex-direction:column; gap:5px; }
.inhalt-verweis{
  display:flex; align-items:center; gap:9px; width:100%; text-align:left;
  padding:8px 11px; border-radius:var(--radius-klein); cursor:pointer;
  background:var(--bg); border:1px solid var(--border); color:var(--text);
  font-family:inherit; font-size:13px; transition:border-color .15s ease, color .15s ease;
}
.inhalt-verweis:hover{ border-color:var(--akzent); color:var(--akzent); }
.inhalt-verweis-icon{ display:flex; color:var(--akzent); flex:0 0 auto; }
.inhalt-verweis-name{ flex:1; min-width:0; }
.inhalt-verweis-zusatz{
  font-family:'IBM Plex Mono',monospace; font-size:10.5px; color:var(--text-2);
  background:var(--oberflaeche); border:1px solid var(--border); border-radius:5px;
  padding:2px 7px; flex:0 0 auto; white-space:nowrap;
}
.spielzeile-chip{ font-size:11px; padding:3px 10px; border-radius:var(--radius-rund); background:var(--bg); border:1px solid var(--border); color:var(--text-2); transition:border-color .15s ease, color .15s ease; }
.spielzeile-chip-plattform{ font-family:'IBM Plex Mono',monospace; }
.spielzeile-rechts{ flex:0 0 auto; display:flex; align-items:center; gap:14px; }
.spielzeile-rating{ font-size:13px; font-weight:600; color:#FACC15; white-space:nowrap; }
.spielzeile-pfeil{ color:var(--text-2); flex:0 0 auto; }
.spielzeile:hover .spielzeile-pfeil{ color:var(--akzent); }

/* Spiel-Detailseite: kein umschliessender Hero-Kasten mehr - der Titel
   sitzt direkt unter dem "ÜBERBLICK"-Label, wie eine normale Seiten-
   überschrift. Bewusst ohne Box/Schatten/3D: bei einem kurzen Testeintrag
   wie bei einem datenreichen Spiel sieht die Kopfzeile gleich aufgeräumt
   aus, weil hier nichts mehr "abgefüllt" werden muss. */
.spiel-ueberblick-kopf{ display:flex; align-items:flex-start; justify-content:space-between; gap:16px; flex-wrap:wrap; margin-bottom:14px; }
.spiel-titel{ font-size:32px; font-weight:800; letter-spacing:-.02em; line-height:1.15; margin:0 0 12px; color:var(--text); }
.spiel-hero-chips{ display:flex; flex-wrap:wrap; gap:6px; }
.spiel-hero-beschreibung{ font-size:14.5px; color:var(--text-2); line-height:1.65; margin:0 0 22px; max-width:68ch; }
.spiel-plattform-zeile{ display:flex; align-items:center; gap:12px; flex-wrap:wrap; background:var(--oberflaeche); border:1px solid var(--border); border-radius:var(--radius); padding:14px 18px; margin:0 0 18px; box-shadow:0 1px 2px rgba(0,0,0,0.04); }
.spiel-plattform-label{ font-family:'IBM Plex Mono',monospace; font-size:11px; font-weight:600; color:var(--text-2); text-transform:uppercase; letter-spacing:.04em; flex:0 0 auto; }
.spiel-plattform-chips{ display:flex; flex-wrap:wrap; gap:6px; }

@media (max-width:640px){
  .showcase-raster{ grid-template-columns:1fr; }
  .showcase-titel-hero{ font-size:22px; }
}

/* ============================================================
   Admin-Wizard (Spiel anlegen/bearbeiten - Schritt "Basis" des
   Gamebuilder-Studios, siehe auch .studio-* oben).
   Nutzt jetzt dieselben Design-Tokens wie der Rest der Seite
   (folgt also Hell-/Dunkelmodus) statt eines eigenen, fest
   verdrahteten Indigo/Purple-Themes - Auftrag "Gamebuilder Visual
   & UX": /admin/games/neu soll sich wie derselbe Studio-Builder
   anfuehlen, nicht wie ein Fremdkoerper.
   Alle Klassen mit Praefix admin-wizard-.
   ============================================================ */
.admin-wizard-section{ max-width:760px; margin:0 auto; padding:32px 24px 48px; }

.admin-wizard-page-title{
  color:var(--text); font-size:22px; font-weight:700; margin:0 0 16px;
}

/* Container-Karte */
.admin-wizard-container{
  background:var(--oberflaeche); border:1px solid var(--border); border-radius:var(--radius);
  overflow:hidden; box-shadow:0 20px 50px rgba(0,0,0,0.12);
  color:var(--text);
}
:root[data-theme="dunkel"] .admin-wizard-container{ box-shadow:0 20px 50px rgba(0,0,0,0.45); }

/* Header + Fortschrittsanzeige */
.admin-wizard-header{
  background:var(--bg); padding:24px 28px; border-bottom:1px solid var(--border);
}
.admin-wizard-title{
  font-size:22px; font-weight:700; margin:0 0 20px; color:var(--text);
}

/* Progress Steps mit Verbindungslinie - dieselbe Symbolsprache
   (Nummer statt reiner Farbcode) wie .studio-fortschritt im Builder. */
.admin-wizard-progress{
  position:relative; display:flex; justify-content:space-between; align-items:flex-start;
}
.admin-wizard-progress-track{
  position:absolute; left:0; top:16px; width:100%; height:2px;
  background:var(--border); border-radius:var(--radius-rund); z-index:0;
}
.admin-wizard-progress-bar{
  position:absolute; left:0; top:16px; width:0%; height:2px;
  background:var(--akzent); border-radius:var(--radius-rund); z-index:0;
  transition:width .3s ease;
}
.admin-wizard-step{
  position:relative; z-index:1; display:flex; flex-direction:column; align-items:center;
  flex:1;
}
.admin-wizard-step-circle{
  width:32px; height:32px; border-radius:50%;
  background:var(--oberflaeche); color:var(--text-2);
  display:flex; align-items:center; justify-content:center;
  font-weight:700; font-size:13px; font-family:'IBM Plex Mono',monospace;
  border:3px solid var(--bg);
  transition:background-color .25s ease, color .25s ease;
}
.admin-wizard-step-circle.is-active{
  background:var(--akzent); color:var(--bg);
}
.admin-wizard-step-label{
  margin-top:6px; font-size:10.5px; color:var(--text-2); text-align:center;
  text-transform:uppercase; letter-spacing:.05em;
  transition:color .25s ease; white-space:nowrap;
}
.admin-wizard-step-label.is-active{ color:var(--akzent); font-weight:600; }

/* Schritt-Inhalt ein-/ausblenden */
.admin-wizard-step-content{ display:none; }
.admin-wizard-step-content.active{
  display:block; animation:admin-wizard-fadeIn .4s ease-in-out;
}
@keyframes admin-wizard-fadeIn{
  from{ opacity:0; transform:translateY(10px); }
  to{ opacity:1; transform:translateY(0); }
}
@media (prefers-reduced-motion: reduce){
  .admin-wizard-step-content.active{ animation:none; }
}

.admin-wizard-body{ padding:28px; }
.admin-wizard-step-heading{
  font-size:18px; font-weight:700; color:var(--text); margin:0 0 20px;
}

/* Hilfsklassen */
.admin-wizard-is-hidden, .admin-wizard .is-hidden{ display:none !important; }
.admin-wizard-container .is-hidden{ display:none !important; }
.is-hidden{ display:none !important; }
.admin-wizard-sr-only{
  position:absolute; width:1px; height:1px; padding:0; margin:-1px;
  overflow:hidden; clip:rect(0,0,0,0); white-space:nowrap; border:0;
}

/* Sektionen innerhalb eines Schritts */
.admin-wizard-section{
  padding-top:20px; margin-top:20px; border-top:1px solid var(--border);
}
.admin-wizard-section:first-child{ border-top:none; margin-top:0; padding-top:0; }
.admin-wizard-label{
  display:block; font-size:13px; font-weight:500; color:var(--text-2); margin-bottom:10px;
}
.admin-wizard-hint{
  font-size:12.5px; color:var(--text-2); margin:8px 0 0;
}

/* Grid-Layouts */
.admin-wizard-grid{
  display:grid; grid-template-columns:1fr 1fr; gap:16px;
}
.admin-wizard-grid-3{ grid-template-columns:repeat(3,1fr); }
.admin-wizard-grid-2{ grid-template-columns:1fr 1fr; }
.admin-wizard-field{ display:flex; flex-direction:column; gap:6px; }
.admin-wizard-field > span{
  font-size:13px; font-weight:500; color:var(--text-2);
}
.admin-wizard-field-full{ grid-column:1 / -1; }
.admin-wizard-field-row{
  flex-direction:row; align-items:center; gap:8px;
}
.admin-wizard-field-row > span{ font-size:14px; color:var(--text); }

/* Eingabefelder */
.admin-wizard-input{
  width:100%; padding:11px 14px;
  background:var(--bg); border:1px solid var(--border); border-radius:var(--radius-klein);
  color:var(--text); font-size:14px; font-family:inherit;
  transition:border-color .15s ease, box-shadow .15s ease;
}
.admin-wizard-input::placeholder{ color:var(--text-2); opacity:.7; }
.admin-wizard-input:focus{
  outline:none; border-color:var(--akzent);
  box-shadow:0 0 0 3px color-mix(in srgb, var(--akzent) 20%, transparent);
}
textarea.admin-wizard-input{ resize:vertical; min-height:90px; }

/* Selects */
.admin-wizard-select{
  width:100%; padding:11px 14px;
  background:var(--bg); border:1px solid var(--border); border-radius:var(--radius-klein);
  color:var(--text); font-size:14px; font-family:inherit; cursor:pointer;
  transition:border-color .15s ease, box-shadow .15s ease;
  appearance:none;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='none' stroke='%238B90A3' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
  background-repeat:no-repeat; background-position:right 12px center; padding-right:36px;
}
.admin-wizard-select:focus{
  outline:none; border-color:var(--akzent);
  box-shadow:0 0 0 3px color-mix(in srgb, var(--akzent) 20%, transparent);
}
.admin-wizard-select option{ background:var(--bg); color:var(--text); }

/* Custom-Input (fuer "Anderes"-Option) */
.admin-wizard-custom-input{
  width:100%; margin-top:8px; padding:10px 14px;
  background:var(--oberflaeche); border:1px solid var(--akzent); border-radius:var(--radius-klein);
  color:var(--text); font-size:14px; font-family:inherit;
  transition:border-color .15s ease;
}
.admin-wizard-custom-input:focus{
  outline:none;
  box-shadow:0 0 0 3px color-mix(in srgb, var(--akzent) 25%, transparent);
}

/* Glass-Badges fuer Releases */
.admin-wizard-badges{
  display:flex; flex-wrap:wrap; gap:8px; margin-bottom:12px;
}
.admin-wizard-glass-badge{
  display:inline-flex; align-items:center; gap:6px;
  padding:6px 12px; border-radius:var(--radius-rund);
  background:var(--oberflaeche);
  border:1px solid var(--border);
  color:var(--text); font-size:13px; font-weight:500;
}
.admin-wizard-badge-remove{
  background:none; border:none; color:var(--text-2); cursor:pointer;
  font-size:16px; line-height:1; padding:0 0 0 2px;
  transition:color .15s ease;
}
.admin-wizard-badge-remove:hover{ color:var(--fehler); }

/* Release hinzufuegen Zeile */
.admin-wizard-release-add{
  display:flex; flex-wrap:wrap; gap:8px; align-items:center; margin-top:4px;
}
.admin-wizard-release-add .admin-wizard-select,
.admin-wizard-release-add .admin-wizard-input{ flex:1 1 120px; min-width:120px; }
.admin-wizard-release-add .admin-wizard-btn-secondary{ flex:0 0 auto; }

/* Buttons */
.admin-wizard-btn-secondary{
  padding:10px 16px; background:var(--bg); color:var(--text);
  border:1px solid var(--border); border-radius:var(--radius-klein);
  font-size:13.5px; font-weight:500; cursor:pointer; font-family:inherit;
  transition:background-color .15s ease, border-color .15s ease;
}
.admin-wizard-btn-secondary:hover{ border-color:var(--akzent); color:var(--akzent); }

.admin-wizard-btn-ghost{
  padding:10px 18px; background:transparent; color:var(--text-2);
  border:1px solid var(--border); border-radius:var(--radius-klein);
  font-size:14px; font-weight:500; cursor:pointer; font-family:inherit;
  transition:background-color .15s ease, color .15s ease;
}
.admin-wizard-btn-ghost:hover{ background:var(--bg); color:var(--text); }

.admin-wizard-btn-next{
  padding:11px 22px; background:var(--akzent); color:var(--bg);
  border:1px solid var(--akzent); border-radius:var(--radius-klein);
  font-size:14px; font-weight:600; cursor:pointer; font-family:inherit;
  transition:filter .15s ease;
}
.admin-wizard-btn-next:hover{ filter:brightness(0.92); }

/* Speichern-Button - klar erkennbare Primäraktion, ohne 3D-/Glow-Gimmick */
.admin-wizard-btn-3d{
  display:inline-flex; align-items:center; justify-content:center; gap:8px;
  padding:12px 26px; border-radius:var(--radius-klein);
  background:var(--akzent); color:var(--bg);
  border:1px solid var(--akzent);
  font-size:15px; font-weight:700; cursor:pointer; font-family:inherit;
  transition:filter .15s ease;
}
.admin-wizard-btn-3d:hover{ filter:brightness(0.92); }

/* Footer / Navigation */
.admin-wizard-footer{
  display:flex; justify-content:space-between; align-items:center; gap:12px;
  background:var(--bg); padding:20px 28px; border-top:1px solid var(--border);
}
.admin-wizard-footer-right{ margin-left:auto; display:flex; gap:12px; }

/* Tags-Grid (Checkbox-Grid, 3 Spalten) */
.admin-wizard-tag-add{
  display:flex; gap:8px; margin-bottom:16px;
}
.admin-wizard-tag-add .admin-wizard-input{ flex:1 1 auto; }
.admin-wizard-tag-add .admin-wizard-btn-secondary{ flex:0 0 auto; }

.admin-wizard-tags-grid{
  display:grid; grid-template-columns:repeat(3,1fr); gap:10px;
}
.admin-wizard-tag-item{
  display:flex; align-items:center; gap:8px;
  background:var(--bg); padding:9px 11px; border-radius:var(--radius-klein);
  border:1px solid var(--border); cursor:pointer;
  font-size:13px; color:var(--text);
  transition:border-color .15s ease, background-color .15s ease;
}
.admin-wizard-tag-item:hover{ border-color:var(--akzent); }
.admin-wizard-tag-item input[type="checkbox"]{
  width:16px; height:16px; accent-color:var(--akzent); cursor:pointer; flex:0 0 auto;
}
.admin-wizard-tag-item input[type="checkbox"]:checked + span{ color:var(--akzent); font-weight:500; }

/* Dynamisch hinzugefuegte Tags (akzentuiert) */
.admin-wizard-tag-custom{
  background:color-mix(in srgb, var(--akzent) 12%, transparent);
  border-color:color-mix(in srgb, var(--akzent) 50%, transparent);
  animation:admin-wizard-fadeIn .3s ease-in-out;
}
.admin-wizard-tag-custom span{ color:var(--akzent); font-weight:500; }
@media (prefers-reduced-motion: reduce){
  .admin-wizard-tag-custom{ animation:none; }
}

/* Externe Formulare unter dem Wizard (Bewertung, SEO) */
.admin-wizard-extra{
  background:var(--oberflaeche); border:1px solid var(--border); border-radius:var(--radius);
  padding:24px 28px; margin-top:28px; color:var(--text);
}
.admin-wizard-extra-title{
  font-size:18px; font-weight:700; color:var(--text); margin:0 0 8px;
}
.admin-wizard-extra-form{
  display:flex; flex-direction:column; gap:14px; margin-top:16px;
}

/* Responsive */
@media (max-width:640px){
  .admin-wizard-grid,
  .admin-wizard-grid-2,
  .admin-wizard-grid-3,
  .admin-wizard-tags-grid{ grid-template-columns:1fr; }
  .admin-wizard-tags-grid{ grid-template-columns:1fr 1fr; }
  .admin-wizard-footer{ flex-direction:column; align-items:stretch; }
  .admin-wizard-footer-right{ margin-left:0; flex-direction:column-reverse; }
  .admin-wizard-btn-next, .admin-wizard-btn-3d{ width:100%; }
  .admin-wizard-step-label{ font-size:10px; }
}

/* ==========================================================================
   Spiel-Detailseite: eigenstaendige dunkle "RPG-Hub"-Optik mit warmen Gold-/
   Bronze-Akzenten statt der Standard-Markenfarbe Blau - nur auf dieser
   Seite (Klasse .spiel-detail-neu), unabhaengig vom Hell/Dunkel-Toggle des
   restlichen Portals. Ueberschreibt nur die Design-Tokens; alle bereits
   bestehenden Komponenten (.karte, .stat-karte, .btn, .spiel-abschnitt-titel,
   .inhalt-explorer* usw.) nutzen intern var(--akzent)/var(--oberflaeche)/...
   und uebernehmen die neue Optik dadurch automatisch, ohne dass jede Regel
   einzeln dupliziert werden muss. Reine Eigenkreation (kein Referenzbild-
   Layout, keine fremden Farben/Assets uebernommen), keine Bilder noetig.
   Hoehere Spezifitaet als die :root[data-theme] Bloecke oben, damit die
   Seite immer dunkel+gold bleibt, egal welches Seiten-Theme aktiv ist. ---- */
/* =========================================================================
   DIE SPIELSEITE IST KEINE INSEL MEHR
   =========================================================================
   Hier stand eine ZWEITE Palette: `--bg:#15110B`, `--akzent:#D7A34C`,
   `--border:#3C3120` - eigene Braun-Gold-Werte, die die Tokens der Seite
   ueberschrieben, und zwar mit hoeherer Spezifitaet als die
   :root[data-theme]-Bloecke. Der Kommentar dazu sagte offen, warum: "damit
   die Seite immer dunkel+gold bleibt, egal welches Seiten-Theme aktiv ist".

   Das war richtig, solange das Portal blau war. Die Spielseite sollte etwas
   Besonderes sein, und sie war die einzige Stelle mit Gold.

   Jetzt ist das ganze Portal dunkel und gold. Damit dreht sich die Wirkung
   um, gleich zweifach:

     1. #15110B (Braun) neben #0B0D14 (Tinte) sind ZWEI dunkle Toene mit
        verschiedener Temperatur. Wer von der Startseite auf ein Spiel
        klickt, sieht nicht eine besondere Seite - er sieht eine andere
        Website.

     2. Die Ueberschreibung hebelte den Hell-Umschalter aus. Wer auf Hell
        stellt, bekam ueberall Papier und auf der Spielseite Braun. Das ist
        kein Kunstgriff, das ist ein Schalter, der nicht tut, was draufsteht.

   Was bleibt, ist die Atmosphaere: der Lichtschein oben links, der Rahmen,
   der Schatten. Was geht, sind die Farben - die kommen jetzt von der Seite.
   Die Spielseite ist damit weiterhin die aufwendigste Seite des Portals,
   aber sie gehoert dazu.
   ========================================================================= */
.spiel-detail-neu{
  background:
    /* Ein Lichtschein oben links, als faele Licht auf eine aufgeschlagene
       Seite. `--akzent` statt eines festen Goldes: Im hellen Modus wird
       daraus derselbe Schein in gedecktem Gold, statt eines braunen Flecks
       auf Papier. */
    radial-gradient(1200px 400px at 15% -10%,
      color-mix(in srgb, var(--akzent) 10%, transparent), transparent 60%),
    linear-gradient(180deg, var(--oberflaeche) 0%, var(--bg) 100%);
  color:var(--text);
  border:1px solid var(--kante-gold);
  border-radius:var(--radius-gross);
  padding:clamp(22px,3.5vw,40px) clamp(18px,4vw,44px) 48px;
  box-shadow:var(--erhebung-hoch);
}

/* Ueberschrift-Bereich: groesser, mit dezentem Gold-Farbverlauf im Titel
   statt reiner Textfarbe - wirkt hochwertiger, bleibt aber Text (kein Bild). */
/* Der Titel traegt einen Goldverlauf. Die drei festen Stufen waren auf
   dunklen Grund gerechnet; auf Papier waere der hellste (#F3E6C8) fast
   unsichtbar. `color-mix` gegen die Textfarbe des Modus loest das: dunkel
   wird der Verlauf heller, hell wird er tiefer. */
.spiel-detail-neu .spiel-titel{
  font-size:clamp(30px,3.6vw,46px);
  background:linear-gradient(135deg,
    color-mix(in srgb, var(--akzent) 45%, var(--text)) 0%,
    var(--akzent) 55%,
    var(--akzent-tief) 100%);
  -webkit-background-clip:text; background-clip:text; color:transparent;
}
.spiel-detail-neu .abschnitt-label{ color:var(--akzent); letter-spacing:.08em; }

/* Karten/Panels: minimal transparente Flaechen auf dem dunklen Hintergrund
   statt deckendem Grau, mit gedaempftem Gold-Rand statt neutralem Grau. */
.spiel-detail-neu .karte,
.spiel-detail-neu .stat-karte,
.spiel-detail-neu .bewertung-block,
.spiel-detail-neu .fortschritt-widget,
.spiel-detail-neu .spiel-plattform-zeile,
/* `rgba(255,255,255,.025)` hellt auf - auf Papier waere das ein weisser
   Fleck auf Weiss, also nichts. `--oberflaeche-2` ist in beiden Modi die
   naechste Stufe ueber der Flaeche. */
.spiel-detail-neu .inhalt-explorer-anzeige{
  background:var(--oberflaeche-2);
  border-color:var(--border);
}
.spiel-detail-neu .karte:hover{
  border-color:color-mix(in srgb, var(--akzent) 45%, var(--border));
  box-shadow:var(--erhebung-hoch);
}
.spiel-detail-neu .karte-mit-icon-badge{
  background:color-mix(in srgb, var(--akzent) 12%, transparent);
}
.spiel-detail-neu .karte:hover .karte-mit-icon-badge{
  background:color-mix(in srgb, var(--akzent) 22%, transparent);
}

/* Primaerer Button: Gold-Verlauf statt Flaechenfarbe, dunkler Text fuer
   ausreichend Kontrast auf hellem Gold (WCAG-tauglicher als weiss auf Gold). */
.spiel-detail-neu .btn:not(.btn-sekundaer){
  background:linear-gradient(135deg, var(--akzent), var(--akzent-tief));
  color:var(--bg); font-weight:700;
}
.spiel-detail-neu .btn-sekundaer:hover{ border-color:var(--akzent); color:var(--akzent); }

.spiel-detail-neu .spielzeile-chip{ background:var(--oberflaeche-2); }
.spiel-detail-neu .spielzeile-chip-plattform{ color:var(--text-2); }
.spiel-detail-neu .showcase-glass-badge{ background:var(--oberflaeche-2); border-color:var(--border); }
.spiel-detail-neu .inhalt-explorer-tab.ist-aktiv{
  background:linear-gradient(135deg, var(--akzent), var(--akzent-tief));
  border-color:transparent; color:var(--bg);
}
.spiel-detail-neu .inhalt-explorer-listen-eintrag.ist-aktiv{
  background:color-mix(in srgb, var(--akzent) 14%, transparent);
}
.spiel-detail-neu .abschnitt-trenner{ background:linear-gradient(90deg, transparent, var(--border) 15%, var(--border) 85%, transparent); }
.spiel-detail-neu .stat-wert-zahl{ color:var(--akzent); }
.spiel-detail-neu a{ color:var(--akzent); }
.spiel-detail-neu .hinweis{ color:var(--text-2); }

/* --- HERO (rein typografisch, ohne Coverart/Hintergrundbild) ------------ */
/* =========================================================================
   DIE BEGRENZUNG GEHOERT AN DEN TEXT, NICHT AN DEN BEHAELTER
   =========================================================================
   Hier stand `max-width:900px` am ganzen Hero. Sinnvoll war das fuer den
   TEXT darin: Titel und Beschreibung sollen nicht ueber die halbe Seite
   laufen.

   Seit die Eckdaten im Hero stehen, deckelt dieselbe Zahl auch sie - und
   damit stand der komplette Block mit Entwickler, Spielzeit, Plattformen
   und Beschreibung in der linken Haelfte der Seite, waehrend rechts daneben
   nichts war. Bei einem breiten Fenster war das der groessere Teil.

   Die Begrenzung sitzt jetzt an den einzelnen Textstuecken. Der Behaelter
   nimmt die volle Breite, und was darin breit sein darf, entscheidet jedes
   Element fuer sich.
   ========================================================================= */
/* =========================================================================
   DER HERO IST ZWEISPALTIG - LINKS DER KOPF, RECHTS DER TEXT
   =========================================================================
   Links alles, was das Spiel benennt: Reihe, Titel, Einleitung, Hinweise,
   Knoepfe und die Eckdaten. Rechts die Beschreibung, von oben an - auf
   Hoehe des Titels.

   Die Teilung sass vorher eine Ebene tiefer, in den Eckdaten. Das hatte
   zwei Folgen: Die Beschreibung begann erst auf halber Hoehe der Seite,
   und die Werteliste musste sich die linke Haelfte mit ihr teilen.

   `minmax(0, 1.15fr) minmax(0, 1fr)`: Links etwas mehr, weil dort die
   Plattform-Plaketten stehen und in zwei Zeilen umbrechen sollen statt in
   vier. Nicht viel mehr - der Text rechts soll keine Randspalte werden.
   ========================================================================= */
.spiel-detail-neu .spiel-hero{
  margin-bottom:28px;
  display:grid;
  grid-template-columns:minmax(0, 1.15fr) minmax(0, 1fr);
  gap:0 clamp(32px, 4vw, 64px);
  align-items:start;
}

.spiel-hero-links{ min-width:0; }

/* ---- Die Beschreibung rechts ----------------------------------------------

   ---------------------------------------------------------------------------
   DIE LINIE LAEUFT DURCH, DER TEXT STEHT MITTIG
   ---------------------------------------------------------------------------
   Zwei Dinge, die sich widersprechen wuerden, wenn man sie am selben Element
   loest:

     - Die Trennlinie soll die volle Hoehe des Kopfes haben - von der
       Ueberzeile bis unter die Plattform-Plaketten.
     - Der Text soll darin mittig stehen, weil er kuerzer ist als die
       Spalte links.

   `align-self:stretch` zieht die Spalte auf die volle Hoehe (dort sitzt die
   Linie), und `display:flex` mit `align-items:center` zentriert den Text
   DARIN. Ein einzelnes Element mit `align-items:center` am Raster haette
   die Spalte auf Texthoehe geschrumpft - und die Linie mit ihr.
   --------------------------------------------------------------------------- */
.spiel-hero-rechts{
  min-width:0;
  align-self:stretch;

  display:flex;

  /* -----------------------------------------------------------------
     OBEN VERANKERT STATT MITTIG
     -----------------------------------------------------------------
     Hier stand `align-items:center`. Mittig ist eine Position, die vom
     INHALT abhaengt: Ein kurzer Text rutscht tief, ein langer fuellt die
     Spalte. Zwei Spiele nebeneinander haetten ihre Beschreibung auf
     verschiedener Hoehe - und beim Blaettern springt sie.

     Oben verankert mit einem festen Abstand ist die Hoehe immer
     dieselbe. Der Abstand bringt die erste Zeile etwa auf die Hoehe des
     Titels, nicht der Ueberzeile darueber - der Text soll neben dem
     Namen beginnen, nicht neben der Reihe.
     ----------------------------------------------------------------- */
  align-items:flex-start;
  padding-top:clamp(20px, 2.6vw, 48px);

  padding-left:clamp(28px, 3.4vw, 56px);
  border-left:1px solid var(--kante-gold);
}

/* ---- Der Text --------------------------------------------------------------

   Etwas groesser und luftiger als der Fliesstext sonst: Er steht neben einem
   grossen Titel und wuerde daneben gedrungen wirken, haette er dieselbe
   Groesse wie ein Absatz in einer Kachel.

   `text-wrap:pretty` verhindert einzelne Woerter in der letzten Zeile. Wo
   der Browser es nicht kennt, aendert sich nichts.
   --------------------------------------------------------------------------- */
.spiel-hero-rechts .spiel-beschreibung{
  font-size:15.5px; line-height:1.8; color:var(--text-2);
  text-wrap:pretty;
}
.spiel-hero-rechts .spiel-beschreibung p{ margin:0 0 1.15em; }
.spiel-hero-rechts .spiel-beschreibung p:last-child{ margin-bottom:0; }

/* Der erste Absatz traegt die Hauptaussage - er steht heller und eine Spur
   groesser. Das ist der ganze Unterschied zwischen „ein Textblock" und
   „ein Text, den jemand gesetzt hat".

   Erst jetzt greift diese Regel: Vorher erzeugte `nl2br()` nur <br>-Paare,
   und ein `p:first-child` fand nichts vor. */
.spiel-hero-rechts .spiel-beschreibung p:first-child{
  color:var(--text); font-size:16.5px; line-height:1.7;
}

@media (max-width: 1100px){
  /* Untereinander: Zwei Spalten unter 1100px sind zwei zu schmale Spalten.
     Die Linie wandert nach oben - senkrecht zwischen zwei gestapelten
     Bloecken waere sie ein Strich ins Leere. */
  .spiel-detail-neu .spiel-hero{ grid-template-columns:1fr; gap:28px 0; }
  .spiel-hero-rechts{
    align-self:auto; display:block;
    padding-left:0; padding-top:24px;
    border-left:none; border-top:1px solid var(--kante-gold);
  }
}

/* Titel und Einleitung behalten ihre Lesebreite - sie ist der Grund, aus
   dem die 900px ueberhaupt dastanden. */
.spiel-detail-neu .spiel-hero > .spiel-titel,
.spiel-detail-neu .spiel-hero > .abschnitt-label,
.spiel-detail-neu .spiel-hero > .spiel-hero-beschreibung{
  max-width:900px;
}
.spiel-hero-kicker{
  /* Traegt jetzt die Reihe statt der Genres - siehe die Vorlage. */
  display:flex; align-items:center; gap:10px; margin:0 0 8px;
  font-family:'IBM Plex Mono',monospace; font-size:11.5px; font-weight:600;
  color:var(--akzent); text-transform:uppercase; letter-spacing:.1em;
}
.spiel-detail-neu .spiel-hero-beschreibung{ margin:14px 0 18px; }
.spiel-hero-meta{ display:flex; flex-wrap:wrap; gap:20px; margin-bottom:18px; }
.spiel-hero-meta-eintrag{ display:inline-flex; align-items:center; gap:7px; font-size:13px; color:var(--text-2); }
.spiel-hero-meta-eintrag svg{ color:var(--akzent); flex:0 0 auto; }
.spiel-hero-firmen{ display:flex; flex-wrap:wrap; gap:36px; margin-bottom:18px; }
.spiel-hero-firmen > div{ display:flex; flex-direction:column; gap:3px; }
.spiel-hero-pills{ display:flex; flex-wrap:wrap; gap:8px; margin-bottom:22px; }
/* Pills farblich nach Bedeutung differenziert (eigene Palette, aus den
   vorhandenen Tokens abgeleitet) - macht die Kernmerkmale auf einen Blick
   unterscheidbar, statt vier identische graue Chips zu zeigen. */
.spiel-pill{
  font-size:12px; font-weight:600; padding:5px 13px; border-radius:var(--radius-rund);
  border:1px solid; background:transparent;
}
.spiel-pill-genre{ color:var(--akzent); border-color:color-mix(in srgb, var(--akzent) 45%, transparent); background:color-mix(in srgb, var(--akzent) 10%, transparent); }
.spiel-pill-welt{ color:var(--erfolg); border-color:color-mix(in srgb, var(--erfolg) 45%, transparent); background:color-mix(in srgb, var(--erfolg) 10%, transparent); }
.spiel-pill-story{ color:var(--text); border-color:var(--border); background:rgba(255,255,255,.04); }
.spiel-pill-schwer{ color:var(--fehler); border-color:color-mix(in srgb, var(--fehler) 45%, transparent); background:color-mix(in srgb, var(--fehler) 10%, transparent); }
.spiel-detail-neu .spiel-hero-aktionen{ display:flex; flex-wrap:wrap; gap:10px; }

/* --- Panels: jeder Abschnitt sitzt in einem eigenen Kasten mit
   Kapitaelchen-Titel (Struktur wie in der Bildvorlage, eigene Optik). --- */
.spiel-panel{
  background:var(--oberflaeche);
  border:1px solid var(--border); border-radius:var(--radius);
  box-shadow:var(--erhebung);
  padding:20px 22px; margin-bottom:20px;
}
/* Die Trennlinie unter dem Titel bekommt einen Goldstich - sie ist die
   einzige Linie, die auf jeder Kachel vorkommt, und traegt deshalb das
   meiste Wiedererkennen bei geringstem Aufwand. */
.spiel-panel-titel{
  font-family:var(--schrift-mono); font-size:11.5px; font-weight:700;
  text-transform:uppercase; letter-spacing:.1em; color:var(--text);
  margin:0 0 14px; padding-bottom:12px;
  border-bottom:1px solid var(--kante-gold);
}
.spiel-panel-unterzeile{ font-size:12.5px; color:var(--text-2); margin:-8px 0 14px; }
/* Gesamtzahl rechts im Panel-Titel (z.B. "600 Einträge" im RPG Explorer). */
.spiel-panel-titel{ display:flex; align-items:baseline; justify-content:space-between; gap:12px; }
.spiel-panel-titel-zahl{
  font-size:11px; font-weight:600; letter-spacing:.04em; color:var(--akzent);
  text-transform:none; flex:0 0 auto; font-variant-numeric:tabular-nums;
}
.spiel-panel-btn{ display:block; width:100%; text-align:center; margin-top:14px; }
.spiel-panel-breit{ margin-top:8px; }

/* Zwei-Spalten-"Hub": breite Hauptspalte (Profil, Bewertung, Explorer,
   Inhalte) links, schmale Sidebar (Spielwelt, Wissensgraph, Vergleichen)
   rechts - Anordnung wie in der Bildvorlage, eigene Gestaltung. */
/* ---------------------------------------------------------------------
   SEITENSPALTEN WACHSEN MIT, ABER LANGSAMER
   ---------------------------------------------------------------------
   Die Spalte stand fest auf 300px. Solange der Container 1280px breit war,
   stimmte das Verhaeltnis. Waechst er auf 2200px, ist die Seitenspalte
   ploetzlich ein Siebtel der Seite - die Fassungsliste bricht dort um,
   waehrend daneben eine Tabelle in einem sehr weiten Feld steht.

   `clamp(300px, 20vw, 460px)`: unten die bisherige Breite, damit sich auf
   einem 1280er-Schirm nichts aendert; oben eine Grenze, weil eine
   Seitenspalte ab einem gewissen Punkt keine Seitenspalte mehr ist. */
.spiel-hub-grid{
  display:grid; gap:24px; align-items:start;
  grid-template-columns:minmax(0,1fr) clamp(300px, 20vw, 460px);
}
.spiel-hub-spalte{ min-width:0; }
/* Obere Reihe der Hauptspalte: Profil-Tabelle und Bewertung nebeneinander. */
.spiel-hub-oben{ display:grid; grid-template-columns:repeat(auto-fit,minmax(300px,1fr)); gap:20px; }
.spiel-hub-oben > .spiel-panel{ margin-bottom:20px; }
@media (max-width:960px){
  .spiel-hub-grid{ grid-template-columns:1fr; }
}

/* Menge, Wahrscheinlichkeit, Wert - die Zahlen an einer Beziehung.

   Monospace und gedaempft: Sie stehen NEBEN dem Namen, nicht statt seiner.
   „Elixier 12,5 %" soll sich lesen wie ein Name mit einer Fussnote, nicht
   wie zwei gleichwertige Angaben. */
.inhalt-karte-angabe{
  font-family:'IBM Plex Mono',monospace; font-size:12.5px;
  color:var(--text-2); white-space:nowrap; font-variant-numeric:tabular-nums;
}

/* ---- Admin: Meldungen ----------------------------------------------------- */
.meldung-reiter{ display:flex; gap:4px; flex-wrap:wrap; margin-bottom:20px; }
.meldung-reiter a{
  padding:8px 14px; border-radius:var(--radius-klein);
  font-size:13px; color:var(--text-2);
  border:1px solid transparent;
}
.meldung-reiter a:hover{ background:var(--oberflaeche-2); color:var(--text); }
.meldung-reiter a.ist-aktiv{
  color:var(--akzent); border-color:var(--kante-gold);
  background:color-mix(in srgb, var(--akzent) 9%, transparent);
}
.meldung-zahl{
  font-family:var(--schrift-mono); font-size:11px;
  margin-left:5px; padding:1px 6px; border-radius:var(--radius-rund);
  background:var(--akzent); color:var(--bg);
}

.meldung-karte{
  padding:16px 18px; margin-bottom:12px;
  border:1px solid var(--border); border-radius:var(--radius);
  background:var(--oberflaeche);
}
.meldung-kopf{
  display:flex; align-items:baseline; gap:10px; flex-wrap:wrap;
  margin:0 0 10px; font-size:12.5px; color:var(--text-2);
}
.meldung-art{
  padding:2px 9px; border-radius:var(--radius-rund); font-size:10.5px; font-weight:700;
  text-transform:uppercase; letter-spacing:.05em;
  border:1px solid var(--border);
}
/* „Stimmt nicht" ist der dringlichste Fall - dort steht etwas Falsches auf
   der Seite. „Fehlt" ist eine Luecke und kann warten. */
.meldung-art.ist-falsch{
  color:var(--fehler);
  border-color:color-mix(in srgb, var(--fehler) 45%, var(--border));
}
.meldung-art.ist-fehlt{ color:var(--warnung); }

.meldung-feld{
  font-family:var(--schrift-mono); font-size:11.5px; color:var(--akzent);
}
/* Der Eintrag ist geloescht, die Meldung nicht - das ist eine Auskunft, kein
   Fehler. Durchgestrichen sagt das ohne einen Satz. */
.meldung-weg{ text-decoration:line-through; }
.meldung-konto{ font-family:var(--schrift-mono); font-size:11.5px; }

.meldung-text{ margin:0 0 12px; font-size:14px; line-height:1.6; }
.meldung-notiz{
  margin:0 0 12px; padding:8px 12px; font-size:13px;
  border-left:2px solid var(--kante-gold); color:var(--text-2);
}
.meldung-form{ display:flex; gap:8px; flex-wrap:wrap; align-items:center; }
.meldung-form input[type="text"]{ flex:1 1 240px; min-width:0; }

/* ---- Melden: der Weg von aussen nach innen -------------------------------

   Ein leeres Feld ist ein Mangel. Eine benannte Luecke ist eine Aufgabe. */
.melden{ margin-top:32px; padding-top:20px; border-top:1px solid var(--border); }

/* Die Luecke wird beim Namen genannt - in Gold, nicht in Rot. Es ist keine
   Fehlermeldung, sondern eine Einladung. */
.melden-luecke{
  margin:0 0 12px; padding:11px 14px;
  border:1px solid var(--kante-gold); border-radius:var(--radius-klein);
  background:color-mix(in srgb, var(--akzent) 7%, transparent);
  font-size:13.5px;
}

/* Zugeklappt kostet es eine Zeile. Die allermeisten Besucher wollen lesen,
   nicht melden - ein offenes Textfeld unter jedem Eintrag waere eine
   Aufforderung an alle fuer die Wenigen, die etwas zu sagen haben. */
.melden-klapp > summary{
  cursor:pointer; font-size:13.5px; color:var(--text-2);
  padding:8px 0; list-style:none;
  display:flex; align-items:center; gap:10px; flex-wrap:wrap;
}
.melden-klapp > summary::-webkit-details-marker{ display:none; }
.melden-klapp > summary::before{ content:'+'; color:var(--akzent); font-weight:700; }
.melden-klapp[open] > summary::before{ content:'−'; }
.melden-klapp > summary:hover{ color:var(--text); }

/* Wie viele Hinweise schon vorliegen. Das ist die Frage, die sonst jeder
   zweite Melder stellt - sie hier zu beantworten spart Doppelmeldungen. */
.melden-offen{
  font-family:var(--schrift-mono); font-size:11px;
  color:var(--akzent);
  padding:2px 8px; border-radius:var(--radius-rund);
  border:1px solid var(--kante-gold);
}

.melden-form{ display:flex; flex-direction:column; gap:4px; margin-top:12px; max-width:640px; }
.melden-form label{ font-size:12.5px; color:var(--text-2); margin-top:8px; }
.melden-fuss{ display:flex; align-items:center; gap:14px; flex-wrap:wrap; margin-top:14px; }

.melden-antwort{
  margin:0 0 12px; padding:10px 14px; border-radius:var(--radius-klein);
  font-size:13.5px; border:1px solid var(--border);
}
.melden-antwort.ist-gut{
  color:var(--erfolg);
  border-color:color-mix(in srgb, var(--erfolg) 35%, var(--border));
  background:color-mix(in srgb, var(--erfolg) 8%, transparent);
}
.melden-antwort.ist-schwer{
  color:var(--fehler);
  border-color:color-mix(in srgb, var(--fehler) 35%, var(--border));
  background:color-mix(in srgb, var(--fehler) 8%, transparent);
}
.melden-antwort.ist-neutral{ color:var(--text-2); }

/* ---- Seit deinem letzten Besuch ------------------------------------------

   Der woechentliche Anstoss ohne Postfach: Es gibt keinen Cron auf diesem
   Webspace, und eine Mail braechte Einwilligung, Abmeldung und Zustellung
   als dauerhaften Betrieb mit sich.

   Die Goldkante links macht den Kasten zur Ansprache statt zu einem
   weiteren Block - er redet den Leser an, die anderen berichten. */
/* Der Kasten stand nur an einer Goldkante. Er ist der Grund, aus dem
   jemand ueberhaupt wiederkommt - er darf eine Flaeche haben. */
.seit-besuch{
  border:1px solid var(--kante-gold); border-left-width:3px;
  border-radius:var(--radius);
  background:color-mix(in srgb, var(--akzent) 5%, var(--oberflaeche));
  box-shadow:var(--erhebung);
}
/* Das Polster steht hier und nicht in der Kurzform oben: `.gemeinde-block`
 setzt `padding-top:30px` und steht spaeter in der Datei - bei gleicher
 Staerke gewinnt der spaetere. Oben waeren 20px oben und 22px seitlich
 geworden zu 30px oben und 22px seitlich. Zwei Klassen schlagen eine. */
.gemeinde-block.seit-besuch{
  border-top:1px solid var(--kante-gold);
  padding:20px 22px;
}
.seit-besuch-liste{ list-style:none; padding:0; margin:0; }
.seit-besuch-liste li{
  display:flex; align-items:baseline; gap:10px; flex-wrap:wrap;
  padding:9px 0; border-bottom:1px solid var(--border); font-size:14px;
}
.seit-besuch-liste li:last-child{ border-bottom:none; }
.seit-besuch-liste small{ font-size:12px; color:var(--text-2); }
.seit-besuch-liste small.hinweis{ margin-left:auto; }

/* ---- Bauplan --------------------------------------------------------------

   Zutaten, und deren Zutaten. Die Verschachtelung ist eine <ul> in einer
   <ul> - die Einrueckung zeigt, was ein Vorlesegeraet als Ebene meldet.

   Die senkrechte Linie links macht aus zwei Listen einen Baum. Ohne sie
   sind es zwei eingerueckte Aufzaehlungen, und wo die eine aufhoert und die
   andere weitergeht, muss man abzaehlen. */
.bauplan-liste{ list-style:none; padding:0; margin:0; }
.bauplan-liste li{
  padding:5px 0; font-size:13.5px;
  display:flex; align-items:baseline; gap:8px; flex-wrap:wrap;
}
.bauplan-liste .bauplan-liste{
  flex:0 0 100%;
  margin:4px 0 2px 4px; padding-left:14px;
  border-left:1px solid var(--kante-gold);
}

/* Der abgeschnittene Ast sagt, dass es weiterginge - sonst saehe er aus wie
   ein Grundstoff. Kursiv und gedaempft: Es ist ein Hinweis ueber die Daten,
   keine Angabe aus ihnen. */
.bauplan-tiefer{
  font-size:11.5px; color:var(--text-2); font-style:italic;
}

/* ---- Gleicher Name in anderen Spielen -------------------------------------

   Cloud gibt es zehnmal, jedes Mal fuer sich. Diese Liste ist die Bruecke -
   und sie sieht bewusst anders aus als die Beziehungen darueber: Das sind
   Verbindungen INNERHALB eines Spiels, das hier fuehrt hinaus. */
.auch-in-liste{ list-style:none; padding:0; margin:0; }
.auch-in-liste li{
  display:flex; align-items:baseline; gap:9px; flex-wrap:wrap;
  padding:6px 0; font-size:13.5px;
}
.auch-in-liste small{ color:var(--text-2); font-size:11.5px; }

/* ---- Eckdaten im Kopf der Spielseite --------------------------------------

   Frueher ein Panel mit der Ueberschrift „Alle Infos zu <Spielname>“ -
   direkt unter dem <h1>, das denselben Namen trug. Der Titel stand zweimal
   da.

   Jetzt steht der Block ohne Ueberschrift im Kopf, und er sieht anders aus
   als eine Kachel: keine gefuellte Flaeche, sondern zwei feine Linien ueber
   und unter den Angaben. Er gehoert zum Titel und ist nicht der erste von
   mehreren Kaesten. */
/* ---- Eckdaten im Kopf der Spielseite --------------------------------------

   Entwickler, Publisher, Spielzeit, Sprachen, Plattformen - ohne Ueberschrift
   und ohne Kachel, nur mit einer feinen Goldlinie darueber. Sie gehoeren zum
   Titel und sind nicht der erste von mehreren Kaesten.

   EINSPALTIG. Sie waren zwischenzeitlich selbst zweigeteilt, mit der
   Beschreibung rechts daneben - das drueckte die Werteliste in die halbe
   Breite und liess die Beschreibung erst auf halber Hoehe beginnen. Die
   Teilung sitzt jetzt eine Ebene hoeher, am Hero (siehe `.spiel-hero-links`
   weiter unten). Hier laeuft die Liste wieder ueber die volle Breite ihrer
   Spalte.
   --------------------------------------------------------------------------- */
.spiel-eckdaten{
  margin:28px 0 8px; padding:22px 0 4px;
  border-top:1px solid var(--kante-gold);
}
}
/* Der Innenabstand der frueheren Kachel faellt weg - die Abschnitte darin
   bringen ihren eigenen mit. */
.spiel-eckdaten .spiel-blick-abschnitt:first-child{ margin-top:0; }

/* ---- Der Hintergrundschalter ----------------------------------------------

   Steht neben der Besucheranzeige in der Kopfleiste. Er nennt seinen
   Zustand: \u201EHintergrund an\u201C sagt vorher, was ein Klick tut - \u201EHintergrund\u201C
   allein verlangt, dass man es ausprobiert. */
.hintergrund-schalter{
  display:inline-flex; align-items:center; gap:7px;
  padding:5px 11px; margin-left:12px;
  border:1px solid var(--border); border-radius:var(--radius-rund);
  background:transparent; color:var(--text-2);
  font-family:inherit; font-size:12px; cursor:pointer;
  transition:border-color var(--dauer) var(--kurve), color var(--dauer) var(--kurve);
}
.hintergrund-schalter:hover{ border-color:var(--kante-gold); color:var(--text); }
.hintergrund-schalter[hidden]{ display:none; }

/* Der Punkt zeigt den Zustand, bevor man den Text liest - dieselbe Sprache
   wie der Punkt an der Besucheranzeige daneben. */
.hintergrund-punkt{
  width:7px; height:7px; border-radius:50%;
  background:var(--text-2); opacity:.5;
  transition:background var(--dauer) var(--kurve), opacity var(--dauer) var(--kurve);
}
.hintergrund-schalter[aria-pressed="true"]{
  border-color:var(--kante-gold); color:var(--akzent);
}
.hintergrund-schalter[aria-pressed="true"] .hintergrund-punkt{
  background:var(--akzent); opacity:1;
}
.hintergrund-stand{
  font-family:var(--schrift-mono); font-size:10.5px;
  text-transform:uppercase; letter-spacing:.06em;
}

@media (max-width: 600px){
  /* In der schmalen Kopfzeile ist \u201EHintergrund\u201C das erste, was weichen
     darf - der Punkt und der Zustand sagen genug. */
  .hintergrund-text{ display:none; }
  .hintergrund-schalter{ margin-left:6px; }
}

/* ---- Der Haken an der Eintragskarte ---------------------------------------

   Ein <button> und kein Kaestchen: Hier wird sofort gespeichert, es gibt
   nichts abzusenden. Ein Kaestchen ohne Formular laesst auf einen
   Speichern-Knopf warten, den es nicht gibt.

   Ungesetzt ist er zurueckhaltend - er soll die Karte nicht anfuehren. Erst
   gesetzt traegt er Gold: Das ist der Zustand, den man beim Ueberfliegen
   einer Liste erkennen will. */
.karte-haken{
  display:inline-flex; align-items:center; gap:7px;
  margin-top:10px; padding:6px 12px;
  border:1px solid var(--border); border-radius:var(--radius-rund);
  background:var(--bg); color:var(--text-2);
  font-family:inherit; font-size:12.5px; cursor:pointer;
  transition:border-color var(--dauer) var(--kurve),
             color var(--dauer) var(--kurve),
             background var(--dauer) var(--kurve);
}
.karte-haken:hover{ border-color:var(--kante-gold); color:var(--text); }

/* Waehrend gespeichert wird. Nicht ausgrauen - der Knopf hat sein Aussehen
   schon geaendert, und ein zweiter Wechsel im selben Moment wirkt wie ein
   Fehler. */
.karte-haken[disabled]{ cursor:default; opacity:.75; }

.karte-haken-zeichen{
  display:inline-flex; align-items:center; justify-content:center;
  width:15px; height:15px; border-radius:50%;
  border:1px solid var(--border);
  font-size:9px; line-height:1;
  color:transparent;            /* das Haekchen ist da, aber unsichtbar */
  transition:all var(--dauer) var(--kurve);
}
.karte-haken.ist-erledigt{
  border-color:var(--kante-gold);
  background:color-mix(in srgb, var(--akzent) 10%, transparent);
  color:var(--akzent);
}
.karte-haken.ist-erledigt .karte-haken-zeichen{
  background:var(--akzent); border-color:var(--akzent); color:var(--bg);
}

/* ---- Sammelstand ----------------------------------------------------------

   „6 von 9 Waffen" auf der Spielseite. Die Einzelhaken gab es laengst; sie
   wurden nur nie zusammengezaehlt - und damit war jeder Haken ein Haekchen
   statt eines Zaehlers.

   Eigene Namen statt `.fortschritt-*`: Dort gibt es bereits eine
   `.fortschritt-zeile` als WAAGERECHTE Zeile. Denselben Namen zweimal mit
   verschiedener Bedeutung zu belegen ist der Anfang jeder
   Kaskadenverwirrung. `.fortschritt-balken` wird dagegen wiederverwendet -
   er passt genau. */
.sammelstand{
  display:flex; flex-direction:column; gap:12px;
  margin:0 0 18px; padding-bottom:16px;
  border-bottom:1px solid var(--border);
}
.sammelstand-zeile{ display:flex; flex-direction:column; gap:5px; }

.sammelstand-kopf{
  display:flex; align-items:baseline; justify-content:space-between;
  gap:10px; margin:0; font-size:13px; color:var(--text-2);
}
/* Monospace mit `tabular-nums`: Bei drei Zeilen untereinander soll die
   Zahlenspalte eine Kante haben und nicht zappeln. */
.sammelstand-zahl{
  font-family:var(--schrift-mono); font-size:12px;
  color:var(--text); font-variant-numeric:tabular-nums;
}
.sammelstand-hinweis{ margin:2px 0 0; font-size:12px; color:var(--text-2); }

/* Die uebrigen Kategorien (2026-09-12). Geschlossen ist es eine Zeile,
   offen dieselbe Zeilenform wie oben - deshalb nur Abstand und ein
   Trennstrich, keine zweite Gestaltung. */
.sammelstand-mehr{ margin:2px 0 0; }
.sammelstand-mehr > summary{
  cursor:pointer; font-size:12px; font-weight:600; color:var(--text-2);
  list-style:none;
}
.sammelstand-mehr > summary::-webkit-details-marker{ display:none; }
.sammelstand-mehr > summary::before{ content:'+ '; color:var(--akzent); }
.sammelstand-mehr[open] > summary::before{ content:'– '; }
.sammelstand-mehr > summary:hover{ color:var(--text); }
.sammelstand-mehr[open]{
  display:flex; flex-direction:column; gap:12px;
  padding-top:12px; margin-top:8px; border-top:1px solid var(--border);
}

/* Die Summe ueber alle Kategorien - die Zahl, nach der gefragt wird. */
.sammelstand-summe{
  margin:4px 0 0; font-size:12.5px; color:var(--text-2);
  font-variant-numeric:tabular-nums;
}
.sammelstand-summe strong{ color:var(--akzent); font-family:var(--schrift-mono); }
/* ---- Neues zu diesem Spiel ------------------------------------------------

   Die Beitraege sind Knoepfe, keine Links: Sie fuehren nirgendwohin, sondern
   oeffnen den Dialog auf derselben Seite. Ein <a href> waere hier eine
   Luege - die Statusleiste des Browsers zeigte ein Ziel an, das es nicht
   gibt, und ein Klick mit gedrueckter Strg-Taste taete nichts.

   Dass sie trotzdem anklickbar AUSSEHEN, macht dieses Stylesheet: Der
   Browser gibt einem Knopf sonst Rahmen, Hintergrund und mittigen Text. */
.news-knopf-liste{ list-style:none; padding:0; margin:0; }
.news-knopf-liste li + li{ margin-top:8px; }

.news-knopf{
  display:block; width:100%; text-align:left; cursor:pointer;
  padding:11px 13px; border:1px solid var(--border); border-radius:10px;
  background:var(--bg); color:var(--text);
  font-family:inherit; font-size:inherit;
  transition:border-color .15s ease, background .15s ease;
}
.news-knopf:hover{
  border-color:color-mix(in srgb, var(--akzent) 40%, var(--border));
  background:color-mix(in srgb, var(--akzent) 5%, transparent);
}
.news-knopf:focus-visible{
  outline:2px solid var(--akzent); outline-offset:2px;
}

.news-knopf-kopf{
  display:flex; align-items:center; gap:8px; flex-wrap:wrap;
  margin:0 0 5px; font-size:11.5px; color:var(--text-2);
}
.news-knopf-titel{
  display:block; font-size:14px; font-weight:600; line-height:1.35;
}

/* ---- Der Dialog ----------------------------------------------------------

   Aufbau und Masse wie beim Cookie-Dialog: fester Ueberzug, mittige Box,
   feste Hoehenbegrenzung mit eigenem Scrollbereich. Nur breiter - dort
   stehen Kaestchen, hier steht ein Fliesstext, und 520px waeren dafuer eine
   sehr schmale Spalte. */
.portal-dialog{
  position:fixed; inset:0; z-index:501; background:rgba(0,0,0,.6);
  display:flex; align-items:center; justify-content:center; padding:20px;
}
.portal-dialog[hidden]{ display:none; }

.portal-dialog-box{
  position:relative; display:flex; flex-direction:column; overflow:hidden;
  width:100%; max-width:680px; max-height:85vh;
  background:var(--oberflaeche-modal); border:1px solid var(--border);
  border-radius:14px;
}
.portal-dialog-scroll{ padding:30px 30px 0; overflow-y:auto; flex:1; }
.portal-dialog-fuss{
  padding:16px 30px 24px; flex:0 0 auto;
  display:flex; justify-content:flex-end;
}
/* Der Knopf sass frueher frei ueber dem Inhalt (`position:absolute`),
   weil die Huelle keinen Kopf hatte. Jetzt sitzt er in der Kopfzeile
   und teilt sie sich mit dem Titel - `flex-shrink:0`, damit ein langer
   Titel ihn nicht zusammendrueckt. */
.portal-dialog-x{
  flex:0 0 auto; width:32px; height:32px;
  border-radius:var(--radius-klein); border:1px solid var(--border);
  background:var(--bg); color:var(--text); cursor:pointer;
  font-size:15px; line-height:1;
}

/* Der Titel steht jetzt im Kopf des Fensters. Die Ueberschrift im Text
   bleibt fuer Vorlesegeraete stehen und ist deshalb nur unsichtbar, nicht
   weg - `visuell-versteckt` erledigt das, hier braucht sie keine Regel. */
.news-voll-kopf{ margin:0 0 12px; }

/* Seit 2026-09-06 kein reiner, mit `pre-wrap` erhaltener Text mehr,
   sondern echtes HTML aus `App\Core\Markdown::zuHtml()` (siehe deren
   Kopfkommentar: der Text wird vollstaendig escaped, bevor daraus
   Ueberschriften/Listen/Tabellen entstehen - "HTML in der Datenbank
   halten" trifft deshalb weiterhin nicht zu, es entsteht erst beim
   Anzeigen). `pre-wrap` faellt weg, echte Absaetze/Listen brauchen
   keine erhaltenen Zeilenumbrueche mehr - sie wuerden sonst zusaetzliche
   Luecken zwischen den Blockelementen erzeugen. */
.news-voll-text{ font-size:15px; line-height:1.7; color:var(--text); }
.news-voll-text > *:first-child{ margin-top:0; }
.news-voll-text > *:last-child{ margin-bottom:0; }
.news-voll-text p{ margin:0 0 14px; }
.news-voll-text h3, .news-voll-text h4, .news-voll-text h5{
  margin:22px 0 10px; color:var(--text); line-height:1.3;
}
.news-voll-text h3{ font-size:19px; }
.news-voll-text h4{ font-size:17px; }
.news-voll-text h5{ font-size:15px; text-transform:uppercase; letter-spacing:.03em; color:var(--text-2); }
.news-voll-text hr{ border:none; border-top:1px solid var(--border); margin:20px 0; }
.news-voll-text strong{ color:var(--text); font-weight:700; }
.news-voll-text code{
  font-family:var(--schrift-mono); font-size:.9em; background:var(--oberflaeche-2);
  padding:1px 5px; border-radius:4px;
}
.news-voll-text ul{ margin:0 0 14px; padding-left:0; list-style:none; }
.news-voll-text ul li{
  position:relative; padding-left:20px; margin:4px 0;
}
.news-voll-text ul:not(.markdown-checkliste) li::before{
  content:'—'; position:absolute; left:0; color:var(--akzent);
}
.news-voll-text ul.markdown-checkliste li{ padding-left:26px; }
.news-voll-text ul.markdown-checkliste li span{ position:absolute; left:0; }
.news-voll-text ul.markdown-checkliste li.ist-erledigt{ color:var(--text); }

/* Die Checkliste aus dem Auftrag ("Kapitel 1 zu 100 % abgeschlossen")
   war der Anlass fuer die Markdown-Umstellung - eine Tabelle gehoert
   dazu, dieselbe optische Sprache wie die uebrigen Tabellen im Portal
   (Zebra-Zeilen, dezente Linien statt harter Kasten). */
.news-voll-text table.markdown-tabelle{
  width:100%; border-collapse:collapse; margin:0 0 16px; font-size:14px;
}
.news-voll-text table.markdown-tabelle th, .news-voll-text table.markdown-tabelle td{
  padding:7px 10px; text-align:left; border-bottom:1px solid var(--border);
}
.news-voll-text table.markdown-tabelle th{
  color:var(--text-2); font-size:12px; text-transform:uppercase; letter-spacing:.03em;
  border-bottom:1px solid var(--kante-gold, var(--border));
}
.news-voll-text table.markdown-tabelle tbody tr:nth-child(even){ background:var(--oberflaeche-2); }

@media (max-width:600px){
  .portal-dialog-scroll{ padding:26px 20px 0; }
  .portal-dialog-fuss{ padding:14px 20px 20px; }
}

/* ---- Kopfzeile des Fensters ----

   Die Huelle hat jetzt einen eigenen Kopf mit Titel und Schliessknopf.
   Vorher schwebte das X frei ueber dem Inhalt, und jede Vorlage musste
   selbst daran denken, ihre Ueberschrift daneben nicht anstossen zu lassen
   (daher die `padding-right:36px`, die hier standen). Ein Kopf, der die
   Zeile teilt, loest das ein fuer alle Mal. */
.portal-dialog-kopf{
  display:flex; align-items:center; justify-content:space-between; gap:16px;
  padding:20px 24px 14px; border-bottom:1px solid var(--border);
  flex:0 0 auto;
}
.portal-dialog-kopf h2{ margin:0; font-size:19px; line-height:1.3; }

/* Editionen und Termine brauchen mehr Breite als ein Beitragstext - der
   liest sich in einer schmalen Spalte besser, eine Tabelle nicht. */
.portal-dialog.ist-weit .portal-dialog-box{ max-width:840px; }

/* Fast bildschirmbreit (2026-09-11, Level-Übersicht: „man muss ziemlich viel
   die Scrollbar benutzen"). Viele Wertespalten nebeneinander - die Breite
   nutzen statt quer zu scrollen; der Tabellenrahmen folgt der Fensterhöhe. */
.portal-dialog.ist-voll .portal-dialog-box{ max-width:min(1400px, 96vw); max-height:92vh; }
.portal-dialog.ist-voll .portal-dialog-scroll{ padding:20px 24px 0; }
.portal-dialog.ist-voll .karte-level-rahmen{ max-height:calc(92vh - 230px); }

/* Drei Teile in einem Fenster: Editionen, Sprachen, Termine. Die Linie
   dazwischen sagt, dass eine neue Sorte Auskunft beginnt. */
.ausgaben-teil + .ausgaben-teil{
  margin-top:28px; padding-top:24px; border-top:1px solid var(--border);
}
.ausgaben-teil h3{
  margin:0 0 14px; font-size:12px; font-weight:700;
  text-transform:uppercase; letter-spacing:.06em; color:var(--text-2);
}

/* Der Knopf zur Kachel: die Zahlen darunter sagen, ob sich das Oeffnen
   lohnt. Ein Knopf mit „Oeffnen" allein verlangt einen Klick, um das
   herauszufinden. */
.ausgaben-knopf{
  display:flex; flex-direction:column; align-items:flex-start; gap:3px;
  width:100%; text-align:left;
}
.ausgaben-knopf small{
  font-size:11.5px; font-weight:400; color:var(--text-2);
  font-family:'IBM Plex Mono',monospace;
}

/* ---- Flaggen -------------------------------------------------------------

   Selbst gezeichnete SVG (siehe templates/komponenten/flagge.php) - keine
   fremden Dateien, also keine Lizenzfrage.

   Feste Groesse statt einer relativen: Zwoelf Flaggen nebeneinander muessen
   gleich gross sein, sonst sieht die Reihe aus wie ein Setzfehler. */
.flagge{
  display:block; width:26px; height:auto; flex:0 0 auto;
  border-radius:3px;
}
.flaggen-reihe{
  display:flex; flex-wrap:wrap; gap:7px; align-items:center;
}
/* In der Sprachliste im Fenster steht die Flagge vor dem Namen und darf
   etwas kleiner sein - dort traegt der Name die Auskunft, nicht das Bild. */
.spiel-sprachen .flagge{ width:22px; }

/* Spielinhalte-Kacheln: Icon-Kreis + Label + Zahl, dichtes Raster. */
.spiel-inhalte-kacheln{ display:grid; grid-template-columns:repeat(auto-fill,minmax(104px,1fr)); gap:16px; }
.spiel-inhalte-kachel{
  display:flex; flex-direction:column; align-items:center; text-align:center; gap:5px;
  padding:16px 10px 14px; border-radius:var(--radius); background:var(--bg); border:1px solid var(--border);
  color:var(--text); transition:border-color .15s ease, transform .15s ease;
}
.spiel-inhalte-kachel:hover{ border-color:color-mix(in srgb, var(--akzent) 50%, transparent); transform:translateY(-2px); }
.spiel-inhalte-kachel-icon{
  display:flex; align-items:center; justify-content:center; width:44px; height:44px; border-radius:var(--radius);
  background:color-mix(in srgb, var(--akzent) 12%, transparent); color:var(--akzent); margin-bottom:3px;
}
.spiel-inhalte-kachel:hover .spiel-inhalte-kachel-icon{ background:color-mix(in srgb, var(--akzent) 22%, transparent); }
.spiel-inhalte-kachel-label{ font-size:11.5px; color:var(--text-2); }
.spiel-inhalte-kachel-zahl{ font-size:20px; font-weight:800; font-variant-numeric:tabular-nums; line-height:1.1; }

/* Spielwelt-Liste (Sidebar): kompakte Zeilen mit Icon-Kachel. */
.spielwelt-liste{ display:flex; flex-direction:column; gap:6px; }
.spielwelt-eintrag{
  display:flex; align-items:center; gap:11px; padding:9px 11px; border-radius:9px;
  color:var(--text); transition:background .15s ease;
}
.spielwelt-eintrag:hover{ background:var(--bg); }
.spielwelt-eintrag-icon{
  display:flex; align-items:center; justify-content:center; width:34px; height:34px; border-radius:var(--radius-klein);
  background:color-mix(in srgb, var(--akzent) 12%, transparent); color:var(--akzent); flex:0 0 auto;
}
.spielwelt-eintrag-name{ font-size:13.5px; font-weight:600; }

/* Vergleichen-Panel: reiner Einstiegspunkt, keine erfundenen Werte. */
.spiel-vergleichen-panel{ text-align:center; }
.spiel-vergleichen-panel .spiel-panel-titel{ text-align:left; }
.spiel-vergleichen-icon{
  display:inline-flex; align-items:center; justify-content:center; width:52px; height:52px; border-radius:50%;
  background:color-mix(in srgb, var(--akzent) 12%, transparent); color:var(--akzent); margin-top:4px;
}

/* Suchergebnisse nach Spiel gruppiert (z.B. /suche?typ=spell). */
.such-spielgruppe{ margin-bottom:36px; }
.such-spielgruppe-kopf{
  display:flex; align-items:baseline; gap:12px; flex-wrap:wrap;
  padding-bottom:10px; margin-bottom:16px; border-bottom:1px solid var(--border);
}
.such-spielgruppe-titel{ font-size:19px; font-weight:700; letter-spacing:-.01em; margin:0; }
.such-spielgruppe-titel a{ color:var(--text); text-decoration:none; }
.such-spielgruppe-titel a:hover{ color:var(--akzent); }
.such-spielgruppe-zahl{
  font-family:'IBM Plex Mono',monospace; font-size:11px; font-weight:600;
  color:var(--text-2); background:var(--oberflaeche); border:1px solid var(--border);
  border-radius:var(--radius-rund); padding:2px 9px; font-variant-numeric:tabular-nums;
}
.such-spielgruppe-link{ margin-left:auto; font-size:12.5px; white-space:nowrap; }

/* Datentabelle der Kategorie-Uebersicht (z.B. alle Zauber eines Spiels).
   Breite Tabellen scrollen INNERHALB ihres Rahmens - die Seite selbst
   bekommt nie einen horizontalen Scrollbalken. */
.daten-tabelle-rahmen{ overflow-x:auto; margin:0 -4px; }
.daten-tabelle{ width:100%; border-collapse:collapse; font-size:13.5px; }
.daten-tabelle th, .daten-tabelle td{ padding:11px 14px; text-align:left; vertical-align:top; }
.daten-tabelle thead th{
  font-family:'IBM Plex Mono',monospace; font-size:10.5px; font-weight:700;
  text-transform:uppercase; letter-spacing:.07em; color:var(--text-2);
  white-space:nowrap; border-bottom:1px solid var(--border);
}
.daten-tabelle tbody tr{ border-bottom:1px solid var(--border); transition:background .12s ease; }
.daten-tabelle tbody tr:last-child{ border-bottom:none; }
.daten-tabelle tbody tr:hover{ background:color-mix(in srgb, var(--akzent) 6%, transparent); }
.daten-tabelle-name{ font-weight:600; min-width:170px; }
.daten-tabelle-name a{ color:var(--text); text-decoration:none; }
.daten-tabelle-name a:hover{ color:var(--akzent); }
.daten-tabelle-unterzeile{ display:block; font-weight:400; font-size:12px; color:var(--text-2); margin-top:3px; line-height:1.45; }
.daten-tabelle-zahl{ font-variant-numeric:tabular-nums; font-weight:600; white-space:nowrap; }
.daten-tabelle .element-tag{ margin:0 4px 3px 0; display:inline-block; }

/* Automatisch abgeleitete Verbindungen. Bewusst optisch von erfassten
   Daten unterscheidbar (gestrichelter Rahmen), damit jederzeit klar ist,
   was gepflegt und was gefolgert wurde. */
.abgeleitet-block{
  display:flex; align-items:baseline; gap:12px; flex-wrap:wrap;
  padding:11px 14px; margin-bottom:8px; border-radius:10px;
  border:1px dashed var(--border); background:color-mix(in srgb, var(--akzent) 4%, transparent);
}
.abgeleitet-label{
  font-family:'IBM Plex Mono',monospace; font-size:10.5px; font-weight:700;
  text-transform:uppercase; letter-spacing:.06em; color:var(--text-2);
  flex:0 0 auto; min-width:150px;
}
.abgeleitet-werte{ display:flex; flex-wrap:wrap; gap:5px; flex:1; min-width:0; }
@media (max-width:640px){ .abgeleitet-label{ flex:1 1 100%; min-width:0; } }

/* Ortsuebersicht: was haengt an diesem Ort, nach Typ gruppiert. */
.ort-gruppe{ margin-bottom:30px; }
.ort-gruppe-kopf{ display:flex; align-items:center; gap:9px; margin-bottom:12px; }
.ort-gruppe-icon{ display:flex; color:var(--akzent); }
.ort-gruppe-titel{ font-size:15px; font-weight:700; margin:0; }
.ort-gruppe-zahl{
  font-family:'IBM Plex Mono',monospace; font-size:11px; color:var(--text-2);
  background:var(--oberflaeche); border:1px solid var(--border);
  border-radius:var(--radius-rund); padding:2px 9px; font-variant-numeric:tabular-nums;
}
.ort-karten{ display:grid; grid-template-columns:repeat(auto-fill,minmax(280px,1fr)); gap:20px; }
.ort-karte{
  background:var(--oberflaeche); border:1px solid var(--border); border-radius:var(--radius);
  padding:16px 18px; display:flex; flex-direction:column; gap:9px;
}
.ort-karte-titel{ font-size:15px; font-weight:700; color:var(--text); text-decoration:none; }
.ort-karte-titel:hover{ color:var(--akzent); }
.ort-karte-kontext{ display:flex; flex-wrap:wrap; gap:5px; }
.ort-karte-kontext-tag{
  font-family:'IBM Plex Mono',monospace; font-size:10px; text-transform:uppercase; letter-spacing:.05em;
  color:var(--akzent); background:color-mix(in srgb, var(--akzent) 12%, transparent);
  border-radius:5px; padding:3px 8px;
}
.ort-karte-text{ font-size:12.5px; color:var(--text-2); line-height:1.55; margin:0; }
.ort-karte-werte{ display:flex; flex-wrap:wrap; gap:6px; align-items:center; }
.ort-karte-wert{
  display:inline-flex; align-items:baseline; gap:5px; font-size:13.5px; font-weight:600;
  background:var(--bg); border:1px solid var(--border); border-radius:6px; padding:3px 9px;
  font-variant-numeric:tabular-nums;
}
.ort-karte-wert-label{ font-family:'IBM Plex Mono',monospace; font-size:11px; text-transform:uppercase; letter-spacing:.05em; color:var(--text-2); font-weight:700; }
.ort-karte-verweise{ display:flex; flex-wrap:wrap; align-items:baseline; gap:5px; }
.ort-karte-verweise-label{
  font-family:'IBM Plex Mono',monospace; font-size:9.5px; font-weight:700;
  text-transform:uppercase; letter-spacing:.06em; color:var(--text-2);
  flex:0 0 100%; margin-bottom:2px;
}

/* Graph-Chips in den Tabellenzellen (Fundort, Beute, Quelle, Verknuepfungen).
   Jeder Chip ist ein echter Sprung zur verknuepften Entity. */
.graph-chip{
  display:inline-flex; align-items:baseline; gap:6px; margin:0 4px 4px 0;
  padding:3px 9px; border-radius:7px; font-size:12.5px; text-decoration:none;
  background:var(--bg); border:1px solid var(--border); color:var(--text);
  transition:border-color .15s ease, color .15s ease;
}
.graph-chip:hover{ border-color:var(--akzent); color:var(--akzent); }
.graph-chip-zusatz{
  font-family:'IBM Plex Mono',monospace; font-size:11.5px; color:var(--text-2);
  white-space:nowrap; font-variant-numeric:tabular-nums;
}
.daten-tabelle td:has(.graph-chip){ min-width:180px; }

/* Abgeleitete Verbindungen: gestrichelt und zurueckhaltender als erfasste
   Angaben - auf einen Blick unterscheidbar, was gepflegt wurde und was das
   System selbst gefolgert hat. */
.graph-chip.ist-abgeleitet{
  border-style:dashed; color:var(--text-2);
  background:color-mix(in srgb, var(--akzent) 4%, transparent);
}
.graph-chip.ist-abgeleitet:hover{ color:var(--akzent); border-color:var(--akzent); }

/* Qualitaetsuebersicht (Admin -> Inhalte -> Qualitaet) */
.qualitaet-liste{ list-style:none; margin:0; padding:0; }
.qualitaet-liste li{
  padding:8px 0; border-top:1px solid var(--border); font-size:14px;
  display:flex; align-items:baseline; gap:8px; flex-wrap:wrap;
}
.qualitaet-liste li:first-child{ border-top:none; }
.qualitaet-typen{
  font-family:'IBM Plex Mono',monospace; font-size:10.5px; color:var(--text-2);
  padding:2px 7px; border-radius:6px; border:1px solid var(--border);
}

/* Elementbloecke innerhalb einer Kategorie: deutlich Luft dazwischen, damit
   z.B. Feuer- und Eiszauber klar getrennt wahrgenommen werden. */
.element-block + .element-block{ margin-top:38px; padding-top:30px; border-top:1px dashed var(--border); }
.element-block-kopf{ display:flex; align-items:center; gap:10px; margin-bottom:12px; }
.element-block-name{
  display:inline-flex; align-items:center; font-size:15px; font-weight:800;
  letter-spacing:.02em; padding:5px 14px; border-radius:var(--radius-klein);
  color:var(--akzent); background:color-mix(in srgb, var(--akzent) 14%, transparent);
  border:1px solid color-mix(in srgb, var(--akzent) 40%, transparent);
}
.element-block-name-ohne{ font-weight:600; color:var(--text-2); background:transparent; border-color:var(--border); }
.element-block-zahl{
  font-family:'IBM Plex Mono',monospace; font-size:11px; color:var(--text-2);
  font-variant-numeric:tabular-nums;
}

/* Element-Eigenfarben. Elemente sind frei erweiterbar - unbekannte Slugs
   behalten schlicht die Akzentfarbe von .element-block-name. */
.element-farbe-feuer{ color:#E8703A; background:rgba(232,112,58,.14); border-color:rgba(232,112,58,.45); }
.element-farbe-eis{ color:#5AB7E8; background:rgba(90,183,232,.14); border-color:rgba(90,183,232,.45); }
.element-farbe-blitz{ color:#E8C84A; background:rgba(232,200,74,.14); border-color:rgba(232,200,74,.45); }
.element-farbe-wasser{ color:#4A9BE8; background:rgba(74,155,232,.14); border-color:rgba(74,155,232,.45); }
.element-farbe-wind{ color:#6FC79B; background:rgba(111,199,155,.14); border-color:rgba(111,199,155,.45); }
.element-farbe-erde{ color:#B08A5A; background:rgba(176,138,90,.14); border-color:rgba(176,138,90,.45); }
.element-farbe-licht{ color:#EBDCA8; background:rgba(235,220,168,.14); border-color:rgba(235,220,168,.45); }
.element-farbe-dunkelheit{ color:#A98ACF; background:rgba(169,138,207,.14); border-color:rgba(169,138,207,.45); }
.element-farbe-gift{ color:#8FBF5A; background:rgba(143,191,90,.14); border-color:rgba(143,191,90,.45); }
.element-farbe-heilig{ color:#EBDCA8; background:rgba(235,220,168,.14); border-color:rgba(235,220,168,.45); }

/* Querverweise des Wissensgraphen zu diesem Element. */
.element-graph{
  display:flex; flex-direction:column; gap:8px;
  padding:12px 14px; margin-bottom:14px; border-radius:10px;
  background:color-mix(in srgb, var(--akzent) 5%, transparent);
  border:1px solid var(--border);
}
.element-graph-zeile{ display:flex; align-items:baseline; gap:12px; flex-wrap:wrap; }
.element-graph-label{
  font-family:'IBM Plex Mono',monospace; font-size:10.5px; font-weight:700;
  text-transform:uppercase; letter-spacing:.06em; color:var(--text-2);
  flex:0 0 auto; min-width:190px;
}
.element-graph-werte{ display:flex; flex-wrap:wrap; gap:6px; flex:1; min-width:0; }
.element-graph-verweis{
  font-size:12.5px; padding:3px 10px; border-radius:var(--radius-rund);
  background:var(--bg); border:1px solid var(--border); color:var(--text);
  text-decoration:none; transition:border-color .15s ease, color .15s ease;
}
.element-graph-verweis:hover{ border-color:var(--akzent); color:var(--akzent); }
@media (max-width:640px){
  .element-graph-label{ min-width:0; flex:1 1 100%; }
}

/* Spielvergleich (eigene Funktion, unabhaengig vom Entity-/compare):
   erscheint anstelle der Spieldaten in derselben Spalte. */
.spiel-vergleich-auswahl{ display:flex; flex-direction:column; gap:6px; margin-top:12px; text-align:left; }
.spiel-vergleich-select{
  width:100%; padding:10px 12px; border-radius:var(--radius-klein); cursor:pointer;
  background:var(--bg); border:1px solid var(--border); color:var(--text);
  font-family:inherit; font-size:13.5px; outline:none;
}
.spiel-vergleich-select:focus{ border-color:var(--akzent); }

.spiel-vergleich-kopf{ display:flex; align-items:flex-start; justify-content:space-between; gap:16px; flex-wrap:wrap; margin-bottom:18px; }
.spiel-vergleich-titel{ display:flex; align-items:baseline; flex-wrap:wrap; gap:10px; font-size:22px; font-weight:800; letter-spacing:-.01em; margin:4px 0 0; }
.spiel-vergleich-gegen{ font-family:'IBM Plex Mono',monospace; font-size:12px; font-weight:600; color:var(--text-2); text-transform:uppercase; letter-spacing:.08em; }

.spiel-vergleich-tabelle{ display:flex; flex-direction:column; }
.spiel-vergleich-zeile{
  display:grid; grid-template-columns:minmax(120px,1.1fr) minmax(0,1fr) minmax(0,1fr);
  gap:14px; align-items:baseline; padding:9px 0; border-bottom:1px solid var(--border);
}
.spiel-vergleich-zeile:last-child{ border-bottom:none; }
.spiel-vergleich-kopfzeile{ padding-bottom:12px; }
.spiel-vergleich-spiel{ font-size:12.5px; font-weight:700; color:var(--text); }
.spiel-vergleich-wert{ font-size:14px; font-weight:600; }
/* Hervorhebung des hoeheren Zahlenwerts - rein informativ, keine Wertung
   darueber, welches Spiel "besser" ist (siehe Hinweis unter der Tabelle). */
.spiel-vergleich-wert.ist-hoeher{ color:var(--akzent); }
.spiel-vergleich-wert.ist-ja{ color:var(--erfolg); }
.spiel-vergleich-wert.ist-nein{ color:var(--text-2); font-weight:500; }
/* Wertungsbalken je Kategorie (Story, Kampfsystem, ...) */
.spiel-vergleich-balken{
  display:block; height:6px; border-radius:3px; overflow:hidden;
  background:color-mix(in srgb, var(--text-2) 22%, transparent); margin-bottom:4px;
}
.spiel-vergleich-balken-fuellung{ display:block; height:100%; background:var(--akzent); }
.spiel-vergleich-balken-zahl{ font-size:12px; font-variant-numeric:tabular-nums; }
@media (max-width:620px){
  .spiel-vergleich-zeile{ grid-template-columns:1fr 1fr; }
  .spiel-vergleich-zeile > .stat-label{ grid-column:1 / -1; }
}

/* Aehnliche RPGs: Textkarten (keine Cover - RPGPortal nutzt keine
   offiziellen Spielgrafiken) und bewusst ohne "% Aehnlichkeit". */
.spiel-aehnlich-raster{ display:grid; grid-template-columns:repeat(auto-fill,minmax(200px,1fr)); gap:20px; }
.spiel-aehnlich-karte{
  padding:16px 18px; border-radius:var(--radius); background:var(--bg); border:1px solid var(--border);
  color:var(--text); transition:border-color .15s ease, transform .15s ease;
}
.spiel-aehnlich-karte:hover{ border-color:color-mix(in srgb, var(--akzent) 50%, transparent); transform:translateY(-2px); }
.spiel-aehnlich-karte h3{ font-size:14.5px; margin:0 0 6px; }
.spiel-aehnlich-karte p{ font-size:12.5px; color:var(--text-2); margin:0; line-height:1.5; }

/* Aehnlichkeitswert und Begruendung (§29).
   Der Wert steht in der Ueberschrift rechts und nimmt ihr keinen Platz weg;
   die Gruende stehen darunter in zwei getrennten Listen. Getrennt und nicht
   in einer gemischten Liste, weil "+" und "-" sonst nur am Zeichen zu
   unterscheiden waeren - beim Ueberfliegen genau der Unterschied, auf den
   es ankommt. */
.spiel-aehnlich-karte h3{ display:flex; align-items:baseline; justify-content:space-between; gap:8px; }
.aehnlich-wert{
  flex:0 0 auto; font-size:11.5px; font-weight:600; letter-spacing:.02em;
  color:var(--akzent); font-variant-numeric:tabular-nums;
}
.aehnlich-gruende{ list-style:none; margin:8px 0 0; padding:0; font-size:11.5px; line-height:1.45; }
.aehnlich-gruende li{ margin:0; }
.aehnlich-gruende-plus{ color:var(--text-2); }
.aehnlich-gruende-minus{ color:var(--text-2); opacity:.75; }

/* Verknuepfungen im Dateneditor.
   Die Zahl ist die Aussage ("Beute 3"), die Namen stehen im title-Attribut -
   sie alle auszuschreiben machte die Spalte breiter als die gesamte uebrige
   Tabelle. */
.vk-gruppe{
  display:inline-block; margin:0 4px 3px 0; padding:1px 6px; border-radius:9px;
  background:transparent; border:1px solid var(--border);
  font-size:11px; color:var(--text-2); white-space:nowrap; cursor:help;
}
.vk-gruppe b{ color:var(--text); font-variant-numeric:tabular-nums; }

/* Der Dateneditor zeigt alle Felder eines Typs - bei Gegnern sind das ueber
   zwanzig Spalten. Die Zellen duerfen deshalb nicht mitwachsen, sonst
   entstuende aus zwanzig schmalen Zahlen eine Tabelle von mehreren
   Bildschirmbreiten. Gescrollt wird im Umschlag, nicht in der Seite. */
.admin-tabelle .inline-feld-zahl{ width:72px; }
.admin-tabelle .inline-zelle{ padding:4px 6px; }

/* ===================================================================
   DIE ARBEITSTABELLE DES DATENEDITORS
   ===================================================================
   Sie zeigt alle Felder eines Typs - bei Gegnern über zwanzig Spalten. Drei
   Dinge entscheiden darüber, ob das benutzbar ist:

   1. PLATZ. Jede Spalte so schmal wie ihr Inhalt. Eine Zahlenspalte braucht
      keine 72 Pixel, wenn nie mehr als vier Ziffern darin stehen.
   2. ORIENTIERUNG. Beim Scrollen nach rechts verliert man sonst aus dem
      Blick, WELCHEN Gegner man gerade bearbeitet. Spiel und Name bleiben
      deshalb stehen.
   3. KEIN UMBRUCH IN DEN ÜBERSCHRIFTEN. "Z-Reflex (Zauber-Ausweichen)" auf
      drei Zeilen umgebrochen macht die Kopfzeile höher als der halbe
      Bildschirm. */
/* Der Rahmen scrollt in BEIDE Richtungen und hat eine Höhe.
   Nur so kann die Kopfzeile stehen bleiben: Ohne eigene Höhe scrollt die
   Tabelle mit der Seite, und "position:sticky; top:0" hat nichts, woran es
   haften könnte. Mit Höhe wird die Tabelle zu ihrem eigenen Arbeitsbereich -
   Kopfzeile oben, Spiel und Name links, alles andere bewegt sich. */
.dateneditor-wrapper{ max-height:72vh; overflow:auto; }

.dateneditor-tabelle{ font-size:12.5px; }
.dateneditor-tabelle th{ white-space:nowrap; padding:8px; font-size:11px; }
.dateneditor-tabelle td{ padding:3px 6px; }
.dateneditor-tabelle .inline-feld-zahl{ width:58px; }
.dateneditor-tabelle .inline-feld-name{ min-width:150px; }
.dateneditor-tabelle select.inline-feld{ max-width:150px; }

/* Die Kopfzeile bleibt oben. */
.dateneditor-tabelle thead th{
  position:sticky; top:0; z-index:3;
  background:var(--oberflaeche);
  /* border-bottom scrollt bei sticky mit weg - deshalb als Schatten. */
  box-shadow:0 1px 0 var(--border);
}

/* Spiel und Name bleiben links stehen. Beim Scrollen nach rechts verliert
   man sonst aus dem Blick, WELCHEN Gegner man gerade bearbeitet.
   Die feste Breite der ersten Spalte ist zwingend: Der Versatz der zweiten
   rechnet mit ihr. */
.dateneditor-tabelle th:first-child,
.dateneditor-tabelle td:first-child{
  width:132px; min-width:132px; max-width:132px;
  overflow:hidden; text-overflow:ellipsis;
}
.dateneditor-tabelle th:first-child,
.dateneditor-tabelle th:nth-child(2),
.dateneditor-tabelle td:first-child,
.dateneditor-tabelle td:nth-child(2){
  position:sticky;
  /* Ohne eigenen Hintergrund scrollt der Rest der Zeile sichtbar darunter
     hindurch. */
  background:var(--oberflaeche);
}
.dateneditor-tabelle th:first-child,
.dateneditor-tabelle td:first-child{ left:0; }
.dateneditor-tabelle th:nth-child(2),
.dateneditor-tabelle td:nth-child(2){ left:132px; }
/* Die Kante macht sichtbar, wo der feststehende Teil endet - sonst sieht es
   beim Scrollen aus, als überlagerten sich zwei Tabellen. */
.dateneditor-tabelle th:nth-child(2),
.dateneditor-tabelle td:nth-child(2){ box-shadow:1px 0 0 var(--border); }
/* Die Ecke oben links liegt über beidem. */
.dateneditor-tabelle thead th:first-child,
.dateneditor-tabelle thead th:nth-child(2){ z-index:4; }
.dateneditor-tabelle tbody td:first-child,
.dateneditor-tabelle tbody td:nth-child(2){ z-index:2; }

/* Auf schmalen Geräten bringt das Feststellen nichts - dort ist ohnehin
   fast alles außerhalb des Bildes, und zwei stehende Spalten nähmen den
   letzten Platz weg. Die Höhenbegrenzung fällt mit: Auf einem Telefon ist
   ein Kasten mit eigenem Bildlauf innerhalb der Seite unangenehm zu
   bedienen. */
@media (max-width:900px){
  .dateneditor-wrapper{ max-height:none; }
  .dateneditor-tabelle th:first-child,
  .dateneditor-tabelle th:nth-child(2),
  .dateneditor-tabelle td:first-child,
  .dateneditor-tabelle td:nth-child(2){ position:static; box-shadow:none; }
  .dateneditor-tabelle thead th{ position:static; box-shadow:none; }
}

/* Wissensgraph in der schmalen Sidebar: das SVG skaliert ueber seine
   viewBox herunter, dadurch waeren die 10px-Labels effektiv unlesbar -
   in diesem Kontext daher groessere SVG-Schrift. */
.spiel-hub-rechts .spiel-panel svg text{ font-size:16px; }

/* Bewertungsbalken im Panel etwas kompakter als global. */
.spiel-detail-neu .bewertung-zeile{ margin-bottom:9px; }
.spiel-detail-neu .bewertung-balken-fuellung{ background:linear-gradient(90deg, var(--akzent-tief), var(--akzent)); }

/* ==========================================================================
   Besucher-Live-Anzeige (unten rechts im Kopfbereich)
   ==========================================================================
   Sitzt absolut im .kopf-bild-rahmen und nimmt damit keinen Platz im
   Textfluss ein - der bestehende Kopfbereich behaelt sein Layout
   unveraendert. Bewusst ohne Kasten und ohne Flaeche: Ueber dem Kopfbild
   wuerde jede gefuellte Box wie ein Fremdkoerper wirken. Getragen wird die
   Lesbarkeit stattdessen vom Textschatten, genau wie bei der Benutzer-
   navigation darueber.
*/
.besucher-anzeige{
  position:absolute; right:18px; bottom:12px; z-index:1;
  display:flex; align-items:center; gap:7px;
  font-size:12.5px; line-height:1; white-space:nowrap;

  /* LESBARKEIT GEHT VOR ZURUECKHALTUNG.
     Hier stand heller Text mit blossem Textschatten. Ueber dem dunklen
     Kopfbild las sich das gut - ueber dem hellen war es weiss auf weiss und
     kaum zu erkennen. Ein Schatten kann das nicht retten: Er verstaerkt den
     Kontrast zum Hintergrund nur dort, wo dieser ohnehin dunkel ist.

     Deshalb jetzt eine eigene, sehr zurueckhaltende Flaeche. Sie ist dunkel
     und halbdurchsichtig, damit das Bild durchscheint, und sie bringt ihren
     eigenen Kontrast mit - unabhaengig davon, was hinter ihr liegt. Damit
     funktioniert dieselbe Anzeige auf dem hellen wie auf dem dunklen
     Kopfbild. */
  color:#FFFFFF;
  background:rgba(12,14,20,0.52);
  border:1px solid rgba(255,255,255,0.14);
  border-radius:var(--radius-rund);
  padding:6px 12px 6px 10px;
  text-shadow:0 1px 2px rgba(0,0,0,0.55);
  backdrop-filter:blur(6px);
  -webkit-backdrop-filter:blur(6px);
  opacity:1;
  pointer-events:none; /* darf keinen Klick abfangen, der dem Kopfbild gilt */
  transition:background .15s ease, border-color .15s ease;
}

/* Wo der Weichzeichner nicht zur Verfuegung steht, muss die Flaeche allein
   tragen - dann etwas kraeftiger, damit der Kontrast auch ueber einem hellen
   Bild reicht. */
@supports not ((backdrop-filter:blur(6px)) or (-webkit-backdrop-filter:blur(6px))){
  .besucher-anzeige{ background:rgba(12,14,20,0.72); }
}

/* Fuer Admins ist die Anzeige eine Schaltflaeche: ein Klick zeigt die
   Besucherzahlen im Zeitverlauf. Nur dann faengt sie auch Klicks ab - fuer
   alle anderen bleibt sie reine Anzeige und laesst den Klick zum Kopfbild
   durch. */
a.besucher-anzeige{
  pointer-events:auto;
  text-decoration:none;
  cursor:pointer;
}
a.besucher-anzeige:hover,
a.besucher-anzeige:focus-visible{
  background:rgba(12,14,20,0.74);
  border-color:rgba(255,255,255,0.30);
}
a.besucher-anzeige:focus-visible{
  outline:2px solid #FFFFFF;
  outline-offset:2px;
}

/* Der Punkt pulsiert dezent - er zeigt, dass die Zahl lebt, ohne dass dafuer
   Text noetig waere. Zwei Ringe statt eines Farbwechsels, damit er auch auf
   hellen Bildbereichen erkennbar bleibt. */
.besucher-punkt{
  width:8px; height:8px; border-radius:50%;
  background:#3FD07A;
  box-shadow:0 0 0 2px rgba(63,208,122,0.28), 0 0 6px rgba(63,208,122,0.75);
  flex:0 0 auto;
  animation:besucher-puls 2.6s ease-in-out infinite;
}
@keyframes besucher-puls{
  0%,100%{ opacity:1;   transform:scale(1); }
  50%    { opacity:.55; transform:scale(.86); }
}

.besucher-zahl{
  font-weight:600;
  /* Ziffern gleicher Breite: Ohne das springt die Anzeige bei jedem Wechsel
     von z.B. 9 auf 10 seitlich - genau der sichtbare Sprung, der hier nicht
     entstehen soll. */
  font-variant-numeric:tabular-nums;
  min-width:1.4em; text-align:right;
}

/* Auf schmalen Geraeten nur Punkt und Zahl. Der Text "Aktuelle Besucher:"
   waere dort der erste Kandidat fuer einen Zeilenumbruch ueber dem Bild -
   und eine zweizeilige Anzeige in der Ecke sieht nach Panne aus. */
@media (max-width: 560px){
  .besucher-anzeige{ right:12px; bottom:8px; font-size:11.5px; gap:5px; padding:5px 10px 5px 9px; }
  .besucher-text{ display:none; }
}

/* Wer Bewegung im Betriebssystem abbestellt hat, bekommt hier keine. */
@media (prefers-reduced-motion: reduce){
  .besucher-punkt{ animation:none; }
}

/* ==========================================================================
   "Mein RPG Portal" -> Meine Spiele
   ==========================================================================
   Ergaenzt die bestehenden portal-*-Klassen um Statistik, Filterleiste,
   Suche, Leerzustaende und die persoenliche Bewertung. Bewusst mit den
   vorhandenen Design-Tokens (--oberflaeche, --border, --akzent) statt mit
   eigenen Farben: Der Bereich soll aussehen wie der Rest des Portals und
   nicht wie ein angebautes Modul.
*/

/* ---- Kennzahlen der Sammlung ---- */
.portal-statistik{
  display:grid; grid-template-columns:repeat(auto-fit,minmax(120px,1fr));
  gap:10px; margin:4px 0 20px;
}
.portal-stat{
  background:var(--oberflaeche); border:1px solid var(--border); border-radius:var(--radius);
  padding:12px 14px; text-align:center;
}
.portal-stat-zahl{
  display:block; font-size:22px; font-weight:700; line-height:1.15;
  /* Gleich breite Ziffern: Ohne das springen die Kacheln, sobald aus einer
     9 eine 10 wird. */
  font-variant-numeric:tabular-nums;
}
.portal-stat-name{ display:block; font-size:11.5px; color:var(--text-2); margin-top:3px; }

/* ---- Filter, Suche, Sortierung ---- */
.portal-werkzeuge{
  display:flex; flex-wrap:wrap; align-items:center; justify-content:space-between;
  gap:12px; margin-bottom:18px;
}
.portal-filter{ display:flex; flex-wrap:wrap; gap:6px; }
.portal-filter-knopf{
  display:inline-flex; align-items:center; gap:6px;
  padding:6px 12px; border:1px solid var(--border); border-radius:var(--radius-rund);
  font-size:13px; color:var(--text-2); background:var(--oberflaeche);
  transition:border-color .15s ease, color .15s ease, background .15s ease;
}
.portal-filter-knopf:hover{ color:var(--text); border-color:var(--akzent); }
.portal-filter-knopf.ist-aktiv{
  background:var(--akzent); border-color:var(--akzent); color:var(--bg); font-weight:600;
}
.portal-filter-zahl{
  font-size:11px; font-variant-numeric:tabular-nums; opacity:.75;
  /* Der Zaehler soll die Kapselbreite nicht bei jedem Wert aendern. */
  min-width:1.2em; text-align:center;
}
.portal-filter-knopf.ist-aktiv .portal-filter-zahl{ opacity:.9; }

.portal-suchzeile{ display:flex; align-items:center; gap:10px; flex-wrap:wrap; }
.portal-suchzeile input[type="search"]{ min-width:200px; }
.portal-sortierung{ display:flex; align-items:center; gap:6px; font-size:13px; color:var(--text-2); }
.portal-sortierung select{ font-size:13px; }
.portal-treffer{ margin:-6px 0 12px; font-size:12.5px; }

/* ---- Leerzustaende ---- */
.portal-leer{
  text-align:center; padding:40px 20px;
  border:1px dashed var(--border); border-radius:var(--radius); margin-top:16px;
}
.portal-leer-titel{ font-size:16px; font-weight:600; margin:0 0 6px; }
.portal-leer .btn{ margin-top:14px; display:inline-block; }

/* ---- Persoenliche Bewertung ---- */
.portal-meine-wertung{
  display:flex; align-items:baseline; gap:10px; flex-wrap:wrap;
  padding-bottom:10px; margin-bottom:10px; border-bottom:1px solid var(--border);
}
.portal-meine-wertung-label{
  font-size:11px; text-transform:uppercase; letter-spacing:.06em;
  color:var(--text-2); font-family:'IBM Plex Mono',monospace;
}
.portal-meine-wertung-zahl{ font-size:24px; font-weight:700; line-height:1; font-variant-numeric:tabular-nums; }
.portal-meine-wertung-max{ font-size:14px; font-weight:400; color:var(--text-2); }
.portal-meine-wertung-leer{ font-size:13px; color:var(--text-2); font-style:italic; }

.portal-feld{ display:flex; flex-direction:column; gap:4px; }
.portal-feld > span:first-child{ font-size:12.5px; color:var(--text-2); }
.portal-feld-hinweis{ font-size:11px; opacity:.75; }

.portal-bewertung-aktionen{ display:flex; align-items:center; gap:12px; flex-wrap:wrap; }
/* Der Entfernen-Knopf soll erreichbar, aber nicht gleichrangig mit
   "Speichern" sein - deshalb als stiller Textknopf statt als zweiter
   Vollknopf. */
.portal-knopf-still{
  background:none; border:none; padding:4px 2px; cursor:pointer;
  font-size:12.5px; color:var(--text-2); text-decoration:underline;
  text-underline-offset:2px;
}
.portal-knopf-still:hover{ color:var(--fehler); }

/* ---- Private Notiz ---- */
.portal-notiz{ margin-top:12px; border-top:1px solid var(--border); padding-top:10px; }
.portal-notiz > summary{
  cursor:pointer; font-size:12.5px; color:var(--text-2);
  list-style:none; user-select:none;
}
.portal-notiz > summary::-webkit-details-marker{ display:none; }
.portal-notiz > summary::before{ content:'▸ '; }
.portal-notiz[open] > summary::before{ content:'▾ '; }
.portal-notiz > summary:hover{ color:var(--text); }
.portal-notiz textarea{ width:100%; margin:8px 0; }

/* ---- Fehlermeldung ---- */
.portal-fehler{
  background:color-mix(in srgb, var(--fehler) 8%, transparent); border:1px solid var(--fehler); color:var(--fehler);
  border-radius:var(--radius); padding:10px 14px; margin-bottom:16px; font-size:13.5px;
}

/* ---- Schmale Bildschirme ----
   Die Kennzahlen duerfen zweispaltig umbrechen statt auf Briefmarkengroesse
   zu schrumpfen, und die Werkzeugleiste stapelt sich, damit Filter und
   Suche jeweils die volle Breite bekommen. */
@media (max-width:640px){
  .portal-statistik{ grid-template-columns:repeat(2,1fr); }
  .portal-werkzeuge{ flex-direction:column; align-items:stretch; }
  .portal-suchzeile{ justify-content:space-between; }
  .portal-suchzeile input[type="search"]{ flex:1 1 100%; min-width:0; }
  .portal-filter{ /* waagerecht scrollbar statt in fuenf Zeilen umbrechen */
    flex-wrap:nowrap; overflow-x:auto; padding-bottom:4px;
    scrollbar-width:thin;
  }
  .portal-filter-knopf{ flex:0 0 auto; }
}

/* ==========================================================================
   Admin -> Marketing (SEO, Werbeflaechen, Affiliate)
   ========================================================================== */

/* ---- Reiterleiste ---- */
.marketing-reiter{
  display:flex; flex-wrap:wrap; gap:4px;
  border-bottom:1px solid var(--border); margin:0 0 24px;
}
.marketing-reiter-knopf{
  padding:9px 16px; font-size:13.5px; color:var(--text-2);
  border:1px solid transparent; border-bottom:none;
  border-radius:var(--radius) var(--radius) 0 0;
  /* Der aktive Reiter ueberdeckt die Trennlinie darunter - so wirkt er
     verbunden mit dem Inhalt statt darueber zu schweben. */
  margin-bottom:-1px;
}
.marketing-reiter-knopf:hover{ color:var(--text); background:var(--oberflaeche); }
.marketing-reiter-knopf.ist-aktiv{
  color:var(--text); font-weight:600;
  background:var(--bg); border-color:var(--border); border-bottom-color:var(--bg);
}

/* ---- SEO-Kopf mit Gesamtwert ---- */
.seo-kopf{ display:flex; align-items:flex-start; gap:22px; flex-wrap:wrap; margin-bottom:28px; }
.seo-score{
  flex:0 0 auto; width:104px; height:104px; border-radius:50%;
  display:flex; flex-direction:column; align-items:center; justify-content:center;
  border:3px solid var(--border);
}
.seo-score-zahl{ font-size:32px; font-weight:700; line-height:1; font-variant-numeric:tabular-nums; }
.seo-score-label{ font-size:11px; color:var(--text-2); margin-top:2px; }
/* Die Schwellen sind streng gewaehlt: 80 bedeutet, dass jede fuenfte
   Pruefung anschlaegt - das ist kein "gut". */
.seo-score.ist-gut{ border-color:var(--erfolg); }
.seo-score.ist-gut .seo-score-zahl{ color:var(--erfolg); }
.seo-score.ist-mittel{ border-color:var(--warnung); }
.seo-score.ist-mittel .seo-score-zahl{ color:var(--warnung); }
.seo-score.ist-schlecht{ border-color:var(--fehler); }
.seo-score.ist-schlecht .seo-score-zahl{ color:var(--fehler); }
.seo-kopf-text{ flex:1 1 320px; min-width:0; }
.seo-kopf-titel{ font-size:16px; font-weight:600; margin:0; }

/* ---- Bloecke ---- */
.seo-block{ margin-bottom:34px; }
.seo-block h2{ font-size:17px; margin:0 0 10px; }
.seo-erklaerung{ font-size:12.5px; color:var(--text-2); max-width:75ch; margin:0 0 14px; }
.seo-klein{ font-size:11.5px; color:var(--text-2); }
.seo-wert{ font-size:12px; max-width:44ch; overflow-wrap:anywhere; }

/* ---- Befund-Kacheln ---- */
.seo-befund-gitter{
  display:grid; grid-template-columns:repeat(auto-fill,minmax(150px,1fr));
  gap:10px; margin-bottom:20px;
}
.seo-befund-kachel{
  border:1px solid var(--border); border-radius:var(--radius);
  padding:12px 14px; text-align:center;
}
.seo-befund-zahl{ display:block; font-size:22px; font-weight:700; font-variant-numeric:tabular-nums; }
.seo-befund-name{ display:block; font-size:11.5px; color:var(--text-2); margin-top:3px; }
/* Kacheln ohne Befund treten zurueck - der Blick soll auf dem haengen
   bleiben, was zu tun ist, nicht auf dem, was in Ordnung ist. */
.seo-befund-kachel.ist-leer{ opacity:.45; }

/* ---- Aufklappbare Befundlisten ---- */
.seo-befund-liste{ border-top:1px solid var(--border); padding:10px 0; }
.seo-befund-liste > summary{
  cursor:pointer; font-size:14px; font-weight:600;
  display:flex; align-items:center; gap:10px; list-style:none;
}
.seo-befund-liste > summary::-webkit-details-marker{ display:none; }
.seo-befund-liste > summary::before{ content:'▸'; color:var(--text-2); }
.seo-befund-liste[open] > summary::before{ content:'▾'; }
.seo-befund-marke{
  font-size:12px; font-weight:600; padding:1px 8px; border-radius:var(--radius-rund);
  background:var(--oberflaeche); border:1px solid var(--border); color:var(--text-2);
}

.seo-vorschau{ margin:10px 0 16px; }
.seo-vorschau > summary{ cursor:pointer; font-size:13px; color:var(--text-2); }
.seo-vorschau > summary:hover{ color:var(--text); }
.seo-aktion{ display:flex; align-items:center; gap:14px; flex-wrap:wrap; }

@media (max-width:640px){
  .seo-kopf{ gap:14px; }
  .seo-score{ width:80px; height:80px; }
  .seo-score-zahl{ font-size:26px; }
  .seo-befund-gitter{ grid-template-columns:repeat(2,1fr); }
  .marketing-reiter{ flex-wrap:nowrap; overflow-x:auto; }
  .marketing-reiter-knopf{ flex:0 0 auto; white-space:nowrap; }
}

/* ---- SEO: Einzelvorschlaege ---- */
.seo-sammelaktion{
  display:flex; align-items:center; gap:12px; flex-wrap:wrap;
  margin:10px 0 14px; padding:10px 12px;
  background:var(--oberflaeche); border:1px solid var(--border); border-radius:var(--radius);
}
.seo-vorschlag-wert{
  font-size:12.5px; overflow-wrap:anywhere;
  /* Der vorgeschlagene Text ist das, worueber entschieden wird - er darf
     nicht wie eine Nebenbemerkung aussehen. */
  color:var(--text);
}
.btn-klein{ padding:5px 10px; font-size:12.5px; white-space:nowrap; }

/* ==========================================================================
   Auswahlfeld mit Suche und "neu anlegen"
   ==========================================================================
   Ein Baustein fuer alle Auswahlfelder des Adminbereichs. Bewusst schlicht
   und mit den vorhandenen Tokens - das Feld soll aussehen wie die uebrigen
   Formularfelder und nicht wie ein Fremdkoerper.
*/
.auswahlfeld{ position:relative; }

.auswahlfeld-marken{ display:flex; flex-wrap:wrap; gap:6px; margin-bottom:6px; }
.auswahlfeld-marken:empty{ margin-bottom:0; }
.auswahlfeld-marke{
  display:inline-flex; align-items:center; gap:6px;
  padding:4px 6px 4px 10px; border-radius:var(--radius-rund);
  background:var(--oberflaeche); border:1px solid var(--border); font-size:13px;
}
.auswahlfeld-marke-weg{
  background:none; border:none; cursor:pointer; padding:0 4px;
  font-size:15px; line-height:1; color:var(--text-2);
}
.auswahlfeld-marke-weg:hover{ color:var(--fehler); }

.auswahlfeld-eingabe{ width:100%; }

.auswahlfeld-liste{
  position:absolute; left:0; right:0; z-index:30;
  max-height:280px; overflow-y:auto;
  background:var(--bg); border:1px solid var(--border);
  border-radius:var(--radius); box-shadow:0 8px 24px rgba(0,0,0,.12);
  margin-top:2px;
}
.auswahlfeld-treffer{
  display:block; width:100%; text-align:left;
  padding:8px 12px; border:none; background:none; cursor:pointer;
  font-size:13.5px; color:var(--text);
}
.auswahlfeld-treffer:hover{ background:var(--oberflaeche); }

/* Der Anlege-Knopf hebt sich ab und sitzt am Ende der Liste: Er soll
   auffindbar sein, aber nicht der erste Griff - sonst entstehen
   Doppeleintraege, obwohl der richtige Treffer daruebersteht. */
.auswahlfeld-anlegen{
  display:block; width:100%; text-align:left;
  padding:9px 12px; border:none; border-top:1px solid var(--border);
  background:none; cursor:pointer; font-size:13px; color:var(--akzent); font-weight:600;
}
.auswahlfeld-anlegen:hover{ background:var(--oberflaeche); }

.auswahlfeld-hinweis{ padding:8px 12px; font-size:12.5px; color:var(--text-2); }

.auswahlfeld-meldung{
  margin-top:6px; padding:6px 10px; border-radius:var(--radius);
  font-size:12.5px; background:color-mix(in srgb, var(--erfolg) 10%, transparent); color:var(--erfolg);
  border:1px solid var(--erfolg);
}
.auswahlfeld-meldung.ist-warnung{
  background:rgba(217,119,6,.10); color:var(--warnung); border-color:var(--warnung);
}

/* ==========================================================================
   SEO-Ampel im Adminformular
   ==========================================================================
   Die Farbe ist NIE der einzige Traeger der Aussage: Neben dem Punkt steht
   immer ein Satz im Klartext. Rot und Gruen sind die haeufigste Form der
   Farbfehlsichtigkeit - eine Ampel ohne Text waere fuer einen Teil der
   Bearbeiter schlicht bedeutungslos. */

.seo-lampe-zeile {
  display: flex;
  align-items: center;
  gap: .5rem;
  margin: -.4rem 0 .9rem;
  font-size: .85rem;
  line-height: 1.4;
}

.seo-lampe-punkt {
  flex: 0 0 auto;
  width: .7rem;
  height: .7rem;
  border-radius: 50%;
  background: #888;
}

.seo-lampe-punkt[data-stufe="gruen"] { background: var(--erfolg); }
.seo-lampe-punkt[data-stufe="gelb"]  { background: #c98a00; }
.seo-lampe-punkt[data-stufe="rot"]   { background: var(--fehler); }

.seo-lampe-text { flex: 1 1 auto; }

.seo-lampe-zaehler {
  flex: 0 0 auto;
  font-variant-numeric: tabular-nums;
  opacity: .65;
}

.seo-lampe-zeile.ist-rot .seo-lampe-text { color: var(--fehler); }
.seo-lampe-zeile.ist-gelb .seo-lampe-text { color: #a06d00; }

.seo-lampe-gesamt {
  display: inline-block;
  margin-left: .6rem;
  padding: .1rem .55rem;
  border-radius:var(--radius-rund);
  font-size: .72rem;
  font-weight: 600;
  vertical-align: middle;
  color: #fff;
  background: #888;
}

.seo-lampe-gesamt[data-stufe="gruen"] { background: var(--erfolg); }
.seo-lampe-gesamt[data-stufe="gelb"]  { background: #c98a00; }
.seo-lampe-gesamt[data-stufe="rot"]   { background: var(--fehler); }

@media (prefers-color-scheme: dark) {
  .seo-lampe-zeile.ist-rot .seo-lampe-text { color: #ff8a80; }
  .seo-lampe-zeile.ist-gelb .seo-lampe-text { color: #ffc766; }
}

.seo-lampe-hinweis {
  display: block;
  margin-top: -.5rem;
  margin-bottom: .6rem;
  font-size: .78rem;
  opacity: .7;
  line-height: 1.4;
}

/* ==========================================================================
   Wissensgraph-Dashboard
   ========================================================================== */

.wg-befund {
  border: 1px solid var(--border, #ccc);
  border-radius:var(--radius-klein);
  padding: 1rem 1.1rem;
  margin-bottom: 1rem;
}

.wg-befund h3 {
  margin: 0 0 .5rem;
  display: flex;
  align-items: center;
  gap: .6rem;
  font-size: 1rem;
}

.wg-befund.ist-behebbar { border-left: 4px solid var(--erfolg); }

.wg-marke {
  display: inline-block;
  padding: .05rem .5rem;
  border-radius:var(--radius-rund);
  background: var(--fehler);
  color: #fff;
  font-size: .75rem;
  font-variant-numeric: tabular-nums;
}

.wg-wirkung {
  font-size: .87rem;
  opacity: .8;
  margin: .4rem 0 .8rem;
}

/* Sammelzuweisung im Wissensgraphen */

.wg-filter {
  display: flex;
  gap: 1rem;
  align-items: flex-end;
  flex-wrap: wrap;
  margin: 1rem 0;
}

.wg-filter label {
  display: flex;
  flex-direction: column;
  gap: .25rem;
  font-size: .85rem;
}

.wg-sammel {
  display: flex;
  gap: .75rem;
  align-items: center;
  flex-wrap: wrap;
  padding: .8rem 1rem;
  margin: 1rem 0;
  border: 1px solid var(--border, #ccc);
  border-radius:var(--radius-klein);
}

.wg-auswahl { width: 100%; }

.wg-klein { font-size: .8rem; opacity: .7; }

.wg-blaettern {
  display: flex;
  gap: 1.5rem;
  align-items: center;
  justify-content: center;
  margin: 1.5rem 0;
}

/* ==========================================================================
   Inline-Bearbeitung in den Builder-Listen
   ==========================================================================
   Die Felder sollen wie Text aussehen, solange niemand sie anfasst - eine
   Tabelle mit hundert sichtbaren Eingaberahmen ist unruhig und schwer zu
   lesen. Erst beim Ueberfahren und beim Bearbeiten treten sie hervor. */

.builder-liste .inline-zelle {
  position: relative;
  padding: 2px 6px;
}

.inline-feld {
  width: 100%;
  min-width: 5rem;
  padding: .3rem .4rem;
  border: 1px solid transparent;
  border-radius: 4px;
  background: transparent;
  color: inherit;
  font: inherit;
  font-size: .88rem;
}

.inline-feld:hover { border-color: var(--border, #ccc); }

.inline-feld:focus {
  border-color: #4a7fd0;
  background: var(--bg, #fff);
  outline: none;
}

.inline-feld-name { min-width: 11rem; font-weight: 600; }
.inline-feld-zahl { max-width: 6.5rem; text-align: right; }
.inline-feld-status { max-width: 9rem; }

.inline-zustand {
  position: absolute;
  top: 50%;
  right: -2px;
  transform: translateY(-50%);
  font-size: .8rem;
  line-height: 1;
  pointer-events: none;
}

.inline-zustand[data-art="ok"]     { color: var(--erfolg); }
.inline-zustand[data-art="laeuft"] { color: #888; }
.inline-zustand[data-art="fehler"] { color: var(--fehler); cursor: help; pointer-events: auto; }

.builder-liste kbd {
  padding: .05rem .3rem;
  border: 1px solid var(--border, #ccc);
  border-radius: 3px;
  font-size: .8em;
}

/* ==========================================================================
   Fundorte / Quellen
   ========================================================================== */

.quellen-block {
  border: 1px solid var(--border, #ccc);
  border-radius:var(--radius-klein);
  padding: 1rem 1.1rem;
  margin-bottom: 1.5rem;
}

.quellen-block h2 { margin-top: 0; }

.quellen-liste {
  list-style: none;
  margin: .8rem 0;
  padding: 0;
}

.quellen-liste li {
  display: flex;
  align-items: center;
  gap: .6rem;
  padding: .4rem .2rem;
  border-bottom: 1px solid var(--border, #eee);
}

.quellen-liste li:last-child { border-bottom: none; }

.quellen-art {
  flex: 0 0 auto;
  min-width: 10rem;
  font-size: .82rem;
  opacity: .75;
}

.quellen-ziel { flex: 1 1 auto; font-weight: 600; }

.quellen-weg {
  flex: 0 0 auto;
  border: none;
  background: transparent;
  color: var(--fehler);
  font-size: 1.2rem;
  line-height: 1;
  cursor: pointer;
  padding: 0 .4rem;
}

.quellen-weg:hover { color: #8e1616; }

.quellen-neu {
  display: flex;
  gap: .8rem;
  align-items: flex-end;
  flex-wrap: wrap;
  margin-top: .8rem;
  padding-top: .8rem;
  border-top: 1px solid var(--border, #eee);
}

.quellen-neu label {
  display: flex;
  flex-direction: column;
  gap: .25rem;
  font-size: .85rem;
  min-width: 14rem;
}

.quellen-leer { font-style: italic; }

/* Itemfamilien: Hierarchie und Anlegen aus der Tabelle */

.familie-einrueckung {
  display: inline-block;
  width: 1.4rem;
  opacity: .45;
  text-align: center;
}

.familie-neu-oben {
  display: flex;
  gap: .6rem;
  align-items: center;
  flex-wrap: wrap;
  margin-bottom: 1.2rem;
}

.familie-neu-oben input[type="text"] { min-width: 18rem; }

.familie-plus { margin-left: .8rem; }

.familie-eingabe {
  min-width: 18rem;
  margin-right: .6rem;
}

tr[data-familie-eingabe] td { background: rgba(74, 127, 208, .08); }

.familie-frisch {
  font-size: .75rem;
  padding: .05rem .45rem;
  border-radius:var(--radius-rund);
  background: var(--erfolg);
  color: #fff;
}

/* Werte aus der Detailtabelle von freien Merkmalen unterscheiden */
.status-tag.wert-detail {
  border-left: 3px solid #4a7fd0;
}

/* ==========================================================================
   Besucherverlauf im Adminbereich
   ==========================================================================
   Ein Balken je Stunde. Bewusst ohne Diagrammbibliothek: Es sind
   vierundzwanzig Werte auf einer Achse - dafuer eine Bibliothek zu laden
   waere mehr Uebertragung als der Rest der Seite.

   Die Hoehe bezieht sich auf den Hoechstwert des Zeitraums und nicht auf
   eine feste Zahl. Sonst waere die Kurve an einem ruhigen Tag ein flacher
   Strich und an einem starken abgeschnitten. */
.besucher-verlauf{
  display:flex; align-items:flex-end; gap:4px;
  height:180px; padding:12px 12px 0;
  border:1px solid var(--rand, rgba(255,255,255,.12));
  border-radius:10px;
  background:rgba(255,255,255,.02);
  overflow-x:auto;
}
.besucher-balken{
  flex:1 1 0; min-width:14px;
  display:flex; flex-direction:column; justify-content:flex-end; align-items:center;
  height:100%; gap:6px;
}
.besucher-balken-fuellung{
  width:100%;
  background:linear-gradient(180deg, #4FA3FF 0%, #2C6ED5 100%);
  border-radius:3px 3px 0 0;
  min-height:2px;
}
.besucher-balken-zeit{
  font-size:10.5px; opacity:.65; font-variant-numeric:tabular-nums;
  flex:0 0 auto;
}
@media (max-width: 700px){
  .besucher-verlauf{ height:140px; }
  /* Auf schmalen Geraeten nur jede zweite Stundenbeschriftung - sonst
     ueberlappen die Zahlen und keine ist mehr lesbar. */
  .besucher-balken:nth-child(even) .besucher-balken-zeit{ visibility:hidden; }
}

/* ---------------------------------------------------------------------------
   Kennzahlenkarten im Adminbereich
   ---------------------------------------------------------------------------
   Werden von /admin/besucher und /admin/wissen benutzt. Sie standen in den
   Vorlagen, bevor es sie hier gab - die Seiten sahen deshalb aus wie eine
   Aufzaehlung. */
.admin-karten{
  display:grid;
  grid-template-columns:repeat(auto-fit, minmax(180px, 1fr));
  gap:12px;
}
.admin-karte{
  padding:16px 18px;
  border:1px solid var(--border);
  border-radius:var(--radius);
  background:var(--oberflaeche);
  box-shadow:var(--erhebung);
}
.admin-karte-zahl{
  display:block;
  /* Die Zahl ist hier die Aussage, nicht die Beschriftung - sie darf die
     Auszeichnungsschrift tragen. */
  font-family:var(--schrift-display);
  font-size:28px;
  font-weight:700;
  line-height:1.1;
}
.admin-karte-text{
  display:block;
  margin-top:2px;
  font-size:13px;
  color:var(--text-2);
}

/* ---------------------------------------------------------------------------
   Fortschritt im RPG Builder
   ---------------------------------------------------------------------------
   Der Balken zeigt GEZAEHLTE Daten, keine gesetzten Haken - deshalb bekommt
   er dieselbe Farbe wie andere Messwerte und nicht die Erfolgsfarbe. Gruen
   wuerde "fertig" behaupten, wo nur "es steht etwas drin" gemeint ist. */
.fortschritt-balken{
  height:8px;
  border-radius:var(--radius-rund);
  background:var(--border);
  overflow:hidden;
  min-width:90px;
}
.fortschritt-balken > span{
  display:block;
  height:100%;
  background:var(--akzent);
  /* Auch bei 0 % ein Rest sichtbar - sonst sieht ein leerer Balken aus wie
     ein fehlender. */
  min-width:2px;
}

.wissen-schritt{
  padding:14px 16px;
  margin-bottom:12px;
  border:1px solid var(--border);
  border-left:3px solid var(--border);
  border-radius:10px;
  background:var(--oberflaeche);
}
.wissen-schritt h3{
  margin:0 0 6px;
  display:flex;
  align-items:baseline;
  gap:10px;
  flex-wrap:wrap;
}
.wissen-schritt h3 small{
  font-size:12px;
  font-weight:400;
  color:var(--text-2);
}
.wissen-schritt p{ margin:4px 0; }

/* Der Zustand steht links als Kante, nicht als Flaeche: Eine eingefaerbte
   Karte je Schritt waere bei zehn Schritten ein Farbteppich. */
.wissen-erledigt{ border-left-color:var(--erfolg); }
.wissen-uebersprungen{ border-left-color:var(--warnung); }
.wissen-entfaellt{ border-left-color:var(--text-2); opacity:0.72; }

.wissen-markieren{
  display:flex;
  gap:8px;
  flex-wrap:wrap;
  margin-top:10px;
}
.wissen-markieren input[type="text"]{
  flex:1 1 240px;
  min-width:0;
}

@media (max-width:600px){
  .admin-karte-zahl{ font-size:22px; }
  .wissen-markieren{ flex-direction:column; }
}

/* ---------------------------------------------------------------------------
   Schnellanlegen
   --------------------------------------------------------------------------- */
.schnell-formular textarea{
  width:100%;
  min-height:220px;
  font-family:ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
  font-size:13px;
  line-height:1.5;
  /* Kein Zeilenumbruch: Wer eine Tabelle einfuegt, muss die Spalten
     untereinander sehen. Umgebrochene Zeilen sehen aus wie zusaetzliche
     Eintraege. */
  white-space:pre;
  overflow-x:auto;
}
.schnell-spalten{
  border:1px solid var(--border);
  border-radius:10px;
  padding:12px 14px;
  margin:0 0 16px;
}
.schnell-spalten legend{ padding:0 6px; font-size:13px; }
.schnell-spalten label{
  display:inline-block;
  margin:0 14px 8px 0;
  font-size:13px;
}

/* Der schreibende Knopf sieht anders aus als der zeigende. Beide gleich zu
   gestalten hiesse, sich auf das Lesen der Beschriftung zu verlassen - und
   gelesen wird sie beim dreihundertsten Mal nicht mehr. */
.knopf-warnung{
  background:var(--akzent);
  color:var(--bg);
  font-weight:600;
}

/* Die Zeilenfarbe sagt, was passiert - links als Kante, damit die Tabelle
   nicht zum Farbteppich wird. */
.schnell-wird_angelegt td:first-child,
.schnell-angelegt td:first-child{ box-shadow:inset 3px 0 0 var(--erfolg); }
.schnell-vorhanden td:first-child{ box-shadow:inset 3px 0 0 var(--text-2); }
.schnell-doppelt td:first-child{ box-shadow:inset 3px 0 0 var(--warnung); }
.schnell-leer td:first-child,
.schnell-unbekannte_art td:first-child{ box-shadow:inset 3px 0 0 var(--fehler); }

/* Dieselben Statusfarben, fuer die Massenbearbeitung (§24) - eigene
   Statuswoerter, aber derselbe linke Rahmen wie beim Schnellanlegen. */
.schnell-geaendert td:first-child{ box-shadow:inset 3px 0 0 var(--erfolg); }
.schnell-unveraendert td:first-child{ box-shadow:inset 3px 0 0 var(--text-2); }
.schnell-fehler td:first-child{ box-shadow:inset 3px 0 0 var(--fehler); }

/* ---------------------------------------------------------------------------
   RPG Finder
   --------------------------------------------------------------------------- */
.finder-formular{
  display:flex;
  gap:8px;
  margin:0 0 18px;
}
.finder-formular input[type="search"]{
  flex:1 1 auto;
  min-width:0;
  font-size:16px;   /* unter 16px zoomt iOS beim Antippen hinein */
  padding:10px 12px;
}

/* Was verstanden wurde, steht ueber der Antwort - zurueckhaltend, aber
   lesbar. Wer eine unerwartete Antwort bekommt, muss sehen koennen, wo sie
   herkommt. */
.finder-verstanden{
  font-size:13px;
  color:var(--text-2);
  margin:0 0 16px;
}
.finder-verstanden small{ opacity:0.8; }

.finder-antwort{
  padding:14px 16px;
  margin-bottom:12px;
  border:1px solid var(--border);
  border-radius:10px;
  background:var(--oberflaeche);
}
.finder-antwort h2{ margin:0 0 6px; font-size:15px; }
.finder-antwort p{ margin:0; }
.finder-pfeil{ color:var(--text-2); padding:0 2px; }

/* Der Grund fuer eine leere Antwort ist selbst eine Antwort - er steht
   deshalb wie eine. */
.finder-leer{
  padding:14px 16px;
  border:1px solid var(--border);
  border-left:3px solid var(--text-2);
  border-radius:10px;
  background:var(--oberflaeche);
}

.finder-vorschlaege{ list-style:none; padding:0; }
.finder-vorschlaege li{ padding:6px 0; border-bottom:1px solid var(--border); }
.finder-vorschlaege small{ color:var(--text-2); }

@media (max-width:600px){
  .finder-formular{ flex-direction:column; }
}

/* Nur fuer Screenreader sichtbar.
   Ein Formularfeld ohne Beschriftung wird dort als "Eingabefeld" angesagt -
   die Platzhalterschrift zaehlt nicht als Beschriftung und verschwindet
   beim Tippen. */
.visuell-versteckt{
  position:absolute;
  width:1px; height:1px;
  padding:0; margin:-1px;
  overflow:hidden;
  clip:rect(0 0 0 0);
  white-space:nowrap;
  border:0;
}

/* ---------------------------------------------------------------------------
   Oeffentliche Seiten des Knowledge Core
   --------------------------------------------------------------------------- */
/*
  Vorher eine einzige Spalte ueber die volle Breite von .abschnitt (bis zu
  2040px, siehe --inhalt-breite) - eine Zeile mit vielleicht vierzig Zeichen
  Text in einem Kasten, der zwei Bildschirmdrittel breit war. Jetzt ein
  Raster: gleich breite Karten, so viele nebeneinander, wie Platz haben.
  Ein langer Titel bricht in der Karte um, statt die Karte zu sprengen -
  eine feste Breite ist hier richtiger als eine, die dem Namen folgt: Bei
  fuenfzig Karten nebeneinander in Zeilen wechselnder Breite verliert das
  Auge die Spalte, der es gerade folgt.
*/
.spiele-liste{
  list-style:none; padding:0; margin:0;
  display:grid; grid-template-columns:repeat(auto-fill, minmax(280px, 1fr));
  gap:12px;
}

/* ---------------------------------------------------------------------------
   JEDER EINTRAG AUF EIGENER FLAECHE
   ---------------------------------------------------------------------------
   Vorher trennte die Eintraege nur eine Haarlinie - der Kurztext des einen
   klebte am Namen des naechsten, und man musste lesen, wo einer aufhoert.

   Das ist KEIN Widerspruch zu „Liste statt Kacheln" oben in der Vorlage:
   Gemeint waren dort BILDkacheln, die Bilder gross und Text klein zeigen.
   Eine Flaeche unter einer Textzeile macht daraus keine Bildergalerie - sie
   gibt dem Eintrag einen Rahmen, in dem Name, Jahr, Zahl und Kurztext
   zusammengehoeren. Auf einem Bildschirm stehen weiter zwanzig Namen.
   --------------------------------------------------------------------------- */
.spiele-liste li{
  padding:16px 20px;
  border:1px solid var(--border); border-radius:var(--radius);
  background:var(--oberflaeche);
  box-shadow:var(--erhebung);
  transition:border-color var(--dauer) var(--kurve),
             transform var(--dauer) var(--kurve);
  /* Der Abstand zwischen den Karten kommt jetzt vom Grid-`gap`, nicht mehr
     von margin-bottom - sonst verdoppelte sich die Luecke zwischen zwei
     Karten in derselben Zeile (Grid-Gap UND Aussenabstand). */
}
/* Anheben statt einfaerben - dieselbe Bewegung wie bei `.karte`. */
.spiele-liste li:hover{
  border-color:var(--kante-gold);
  transform:translateY(-1px);
}
.spiele-liste li a{ font-size:17px; font-weight:600; }
.spiele-liste small, .art-liste small{ color:var(--text-2); margin-left:8px; }
.spiele-liste p{
  margin:6px 0 0; color:var(--text-2); font-size:14px; line-height:1.6;
  max-width:var(--lese-breite);
}

/* Die Zwischenueberschrift bei „Nach Spielreihe" - der Abstand nach oben
   steht bei der Regel selbst, nicht als zweite daneben. */
.spiele-reihen-titel:first-of-type{ margin-top:0; }

.einleitung{ font-size:17px; line-height:1.55; }

.spiel-gruppe{ margin-bottom:18px; }
.spiel-gruppe h3{
  margin:0 0 8px;
  font-size:13px;
  text-transform:uppercase;
  letter-spacing:0.04em;
  color:var(--text-2);
}
.art-liste{
  list-style:none; padding:0; margin:0;
  display:flex;
  flex-wrap:wrap;
  gap:8px;
}
.art-liste li{
  padding:8px 14px;
  border:1px solid var(--border);
  border-radius:var(--radius-rund);
  background:var(--oberflaeche);
}

/* Die Tabelle scrollt in sich, nicht die Seite. Eine Seite, die sich
   seitwaerts schieben laesst, verliert auf dem Telefon ihren Anfang. */
.inhalt-tabelle{
  width:100%;
  border-collapse:collapse;
  display:block;
  overflow-x:auto;
}
.inhalt-tabelle th, .inhalt-tabelle td{
  padding:8px 12px;
  text-align:left;
  border-bottom:1px solid var(--border);
  white-space:nowrap;
}
.inhalt-tabelle th{
  font-size:12px;
  text-transform:uppercase;
  letter-spacing:0.03em;
  color:var(--text-2);
}
/* Die Namensspalte darf umbrechen - sie ist die einzige, bei der es auf den
   ganzen Text ankommt. */
.inhalt-tabelle td:first-child{ white-space:normal; min-width:180px; }
.inhalt-tabelle small{ color:var(--text-2); }

/* Die Herkunft steht oben und sieht auch so aus: Sie ist der Grund, warum
   die Seite aufgerufen wurde. */
.eintrag-herkunft{
  padding:14px 16px;
  margin:0 0 20px;
  border:1px solid var(--border);
  border-left:3px solid var(--akzent);
  border-radius:10px;
  background:var(--oberflaeche);
}
.eintrag-herkunft h2{ margin:0 0 6px; font-size:15px; }
.eintrag-herkunft p{ margin:4px 0; }

.werte-liste{
  display:grid;
  grid-template-columns:repeat(auto-fit, minmax(220px, 1fr));
  gap:4px 18px;
  margin:0 0 20px;
}
.werte-liste dt{ font-size:13px; color:var(--text-2); }
.werte-liste dd{ margin:0 0 8px; font-weight:600; }
.werte-liste small{ font-weight:400; color:var(--text-2); }

/* `.wirkungs-liste` und `.wirkung-offensiv/-defensiv` sind entfallen.
   Sie gehoerten zur alten Darstellung auf der Eintragsseite - einer flachen
   grauen Liste mit dem fertigen Satz je Zeile.

   Beide Seiten teilen sich jetzt `komponenten/wissen/elemente.php` mit dem
   Wirkungsgitter. Die Farben darin waren ausserdem auf Weiss gerechnet
   (var(--fehler), var(--info)) - auf Tinte dunkle Flecken. */

.beziehungs-gruppe{ margin-bottom:16px; }
.beziehungs-gruppe h3{ margin:0 0 6px; font-size:14px; }
.beziehungs-gruppe ul{ list-style:none; padding:0; }
.beziehungs-gruppe li{ padding:5px 0; }
.beziehungs-gruppe small{ color:var(--text-2); margin-left:8px; }

.blaettern{
  display:flex;
  align-items:center;
  justify-content:space-between;
  gap:12px;
  margin-top:18px;
  font-size:14px;
}
.blaettern span{ color:var(--text-2); }

@media (max-width:600px){
  .werte-liste{ grid-template-columns:1fr 1fr; }
  .art-liste li{ padding:6px 12px; font-size:14px; }
}

/* ---------------------------------------------------------------------------
   Suche und Ersteinrichtung
   --------------------------------------------------------------------------- */
.such-spiel{ margin-bottom:20px; }
.such-spiel h3{
  margin:0 0 6px;
  font-size:14px;
  padding-bottom:4px;
  border-bottom:1px solid var(--border);
}
.such-spiel h3 small{ color:var(--text-2); font-weight:400; margin-left:8px; }
.such-treffer{ list-style:none; padding:0; margin:0; }
.such-treffer li{ padding:5px 0; }
.such-treffer small{ color:var(--text-2); margin-left:8px; }

.finder-formular select{ flex:0 1 auto; }

.einrichtung-formular{ max-width:420px; }
.einrichtung-formular input{ width:100%; padding:8px 10px; font-size:16px; }
.einrichtung-formular label{ font-size:13px; color:var(--text-2); }

/* Eine Fehlermeldung im Formular muss auffallen, ohne die Seite zu uebertoenen -
   sie sagt, was zu tun ist, nicht dass etwas kaputt ist. */
.fehlermeldung{
  padding:10px 14px;
  border:1px solid color-mix(in srgb, var(--fehler) 40%, transparent);
  border-left:3px solid var(--fehler);
  border-radius:0 8px 8px 0;
  background:var(--oberflaeche);
}

@media (max-width:600px){
  .finder-formular select{ width:100%; }
}

/* ---------------------------------------------------------------------------
   Lesebreite auf den Wissensseiten
   ---------------------------------------------------------------------------
   Der Inhaltskasten ist 1280 px breit, weil dort Tabellen und Raster stehen.
   Fuer Fliesstext ist das zu viel: Bei 1280 px werden Zeilen mit ueber
   zweihundert Zeichen daraus, und das Auge findet den Anfang der naechsten
   Zeile nicht mehr.

   Sechzig bis achtzig Zeichen sind die Spanne, in der man gut liest -
   deshalb `ch` als Einheit und nicht Pixel: Sie misst in Zeichenbreiten und
   bleibt richtig, wenn jemand die Schriftgroesse aendert. */
.abschnitt > p,
.abschnitt > .hinweis,
/* Die 78ch standen hier als Zahl und sind jetzt `--lese-breite`. Der Grund
   ist derselbe wie bei der Inhaltsbreite: Seit der Container mitwaechst,
   entscheidet diese Grenze, wie lang eine Zeile wirklich wird - und wer sie
   anfassen will, soll sie an einer Stelle finden. */
.abschnitt > .einleitung,
.abschnitt > ul,
.abschnitt > ol,
.spiel-beschreibung,
.eintrag-beschreibung{
  max-width:var(--lese-breite);
}

/* Ausgenommen: Alles, was in Spalten oder Kaesten steht. Dort ist die Breite
   schon durch das Raster begrenzt, und eine zweite Grenze liesse den Kasten
   halb leer aussehen. */
.abschnitt > .admin-karten,
.abschnitt > .spiele-liste,
.abschnitt > .art-liste,
.abschnitt > table{
  max-width:none;
}

/* Ueberschriften brauchen Luft nach oben, aber nicht die erste - sonst
   klafft zwischen Kopfzeile und Seitentitel eine Luecke. */
.abschnitt h2{ margin-top:32px; }
.abschnitt h3{ margin-top:22px; }
.abschnitt > :first-child{ margin-top:0; }

/* Die Brotkrume ueber dem Titel: klein und ruhig, sie ist ein Weg zurueck
   und keine Ueberschrift. */
.abschnitt > p:first-of-type > a[href^="/spiel"],
.abschnitt > p:first-of-type > a[href^="/spiele"],
.abschnitt > p:first-of-type > a[href^="/admin/wissen"]{
  font-size:14px;
  color:var(--text-2);
}

/* Auf schmalen Fenstern nimmt der Kasten weniger Rand - jedes Pixel Rand
   fehlt sonst dem Inhalt. */
@media (max-width:700px){
  .abschnitt{ padding:20px 16px; }
  .abschnitt h2{ margin-top:24px; }
}

/* =======================================================================
   STARTSEITE
   =======================================================================
   Sie hat eine Aufgabe: In fünf Sekunden klarmachen, was das hier ist -
   und danach jemandem, der weiterliest, den Weg nicht verstellen.

   Deshalb der Aufbau von oben nach unten: Kernsatz, zwei Wege hinein,
   Zahlen, drei Säulen, Fließtext. Wer nach dem zweiten Block wegklickt,
   hat trotzdem verstanden, worum es geht.

   Die alte Fassung stand unter .startseite-hero und verwies auf /games,
   /rpg-finder und /compare - drei Adressen, die es seit dem Neuaufbau
   nicht mehr gibt. Ein Blickfang, der ins Leere führt, ist schlimmer als
   keiner.
   ----------------------------------------------------------------------- */

/* ===========================================================================
   STARTSEITE
   ---------------------------------------------------------------------------
   Ein Blickfang, ein Statushinweis, drei Textabschnitte. Mehr nicht.

   Hier standen einmal drei Kennzahlen, drei Karten und eine Kachelreihe mit
   Spielen. Alles davon war Selbstdarstellung - das Portal erzaehlte, wie
   gross es ist und was man damit tun kann, bevor jemand gesagt hatte, dass
   er das wissen will.

   Was bleibt, ist die Frage, die ein Besucher tatsaechlich hat: Worum geht
   es hier, und wo fange ich an.
   =========================================================================== */

/* Die Startseite bekommt die weite Breite - sie zeigt Kacheln
   nebeneinander und keine Wertetabellen. `.abschnitt` steht davor in der
   Datei, deshalb gewinnt diese Regel ohne zusaetzliche Spezifitaet. */
/* =========================================================================
   `max-width` OHNE `margin:0 auto` IST KEIN ZENTRIEREN
   =========================================================================
   Hier stand nur `max-width`. `.abschnitt` hat sein `margin:0 auto` in der
   eigenen Regel und war deshalb weiter mittig - `.start-blickfang` nicht.

   Ein Block mit Breitenbegrenzung und ohne Aussenabstand klebt am LINKEN
   Rand. Auf einem 1280er-Schirm faellt das kaum auf, weil die Begrenzung
   ohnehin nicht greift. Auf einem sehr breiten Fenster stand der Blickfang
   der Startseite dann weit links, waehrend Kopf und Inhalt mittig sassen.
   ========================================================================= */
.seite-start .abschnitt,
.seite-start .start-blickfang{
  max-width:var(--inhalt-breite-weit);
  margin-left:auto; margin-right:auto;
}

.start-blickfang{
  /* Fliessende Groessen statt fester Sprungpunkte: Zwischen Handy und
     grossem Bildschirm liegen zwoelf Geraeteklassen, und drei Medienabfragen
     treffen davon drei. */
  padding:clamp(56px, 11vw, 128px) 24px clamp(40px, 6vw, 72px);
  text-align:center;
  position:relative;
  overflow:hidden;
}

/* Ein weicher Schein hinter der Ueberschrift. Er ersetzt das Bild, das hier
   nicht steht: Das Portal verwendet grundsaetzlich keine offiziellen
   Spielgrafiken, und eine rein typografische Flaeche braucht trotzdem eine
   Tiefe, damit sie nicht wie ein Fehler aussieht. */
.start-blickfang::before{
  content:'';
  position:absolute; inset:-40% 0 auto 50%;
  transform:translateX(-50%);
  width:min(900px, 120%); aspect-ratio:2 / 1;
  background:radial-gradient(
    ellipse at center,
    color-mix(in srgb, var(--akzent) 16%, transparent) 0%,
    transparent 70%
  );
  pointer-events:none;
  z-index:0;
}
.start-blickfang-inhalt{ position:relative; z-index:1; max-width:760px; margin:0 auto; }

.start-blickfang h1{
  /* 2,4rem bis 4,2rem, fliessend. Enger Zeilenabstand und negative
     Laufweite - grosse Schrift wirkt sonst auseinandergefallen. */
  font-size:clamp(2.4rem, 6vw, 4.2rem);
  line-height:1.06;
  letter-spacing:-.035em;
  font-weight:800;
  margin:0 0 24px;
  text-wrap:balance;
}
.start-hervor{
  background:linear-gradient(
    100deg,
    var(--akzent) 0%,
    color-mix(in srgb, var(--akzent) 55%, #A855F7) 100%
  );
  -webkit-background-clip:text; background-clip:text;
  -webkit-text-fill-color:transparent; color:transparent;
}

.start-einstieg{
  font-size:clamp(1rem, 1.5vw, 1.15rem);
  line-height:1.65;
  color:var(--text-2);
  /* Kurze Zeilen. Ueber 70 Zeichen verliert das Auge beim Ruecksprung die
     naechste Zeile. */
  max-width:56ch;
  margin:0 auto;
  text-wrap:pretty;
}

/* ---------------------------------------------------------------------------
   Die zwei Wege
   ---------------------------------------------------------------------------
   Bewusst UNGLEICH: Wer weiss, was er sucht, geht zu den Spielen. Wer es
   nicht weiss, zum Finder. Zwei gleich aussehende Knoepfe waeren keine Wahl,
   sondern eine Verdopplung - und man klickt den linken.
   --------------------------------------------------------------------------- */
.start-wege{
  display:flex; flex-wrap:wrap; align-items:center; justify-content:center;
  gap:14px 24px;
  margin-top:36px;
}
.btn-gross{
  padding:14px 30px; font-size:15.5px; font-weight:600;
  border-radius:11px;
}
.start-weg-zwei{
  display:inline-flex; align-items:center; gap:7px;
  font-size:14.5px; color:var(--text-2);
  transition:color .15s ease;
}
.start-weg-zwei span{ transition:transform .15s ease; }
.start-weg-zwei:hover{ color:var(--akzent); }
.start-weg-zwei:hover span{ transform:translateX(3px); }

/* ---------------------------------------------------------------------------
   Der Aufbauhinweis
   ---------------------------------------------------------------------------
   Er stand als grosser Kasten mit Ueberschrift mitten im Text und war damit
   das Auffaelligste auf der Seite. Ein Portal, dessen sichtbarste Aussage
   "hier ist noch nicht viel fertig" lautet, wirbt gegen sich selbst.
   --------------------------------------------------------------------------- */
/* ---------------------------------------------------------------------------
   DER AUFBAUHINWEIS
   ---------------------------------------------------------------------------
   Er war eine schmale graue Zeile im Fliesstext - dieselbe Schriftgroesse
   und dieselbe Farbe wie die Hinweise darum herum, und damit nicht zu
   finden.

   Jetzt ein Band ueber die Inhaltsbreite, mit Goldkante. Sichtbar, weil es
   eine Aussage ueber den Zustand des Portals ist - und ruhig, weil es
   keine Warnung ist. Ein roter Kasten waere das andere Extrem und stuende
   dann auf jeder Startseite als Fehlermeldung.
   --------------------------------------------------------------------------- */
/* ---------------------------------------------------------------------------
   ZENTRIERT UND IN ZWEI ZEILEN

   Der Kasten lief ueber die volle Inhaltsbreite - auf einem breiten
   Bildschirm ein Band von zweitausend Pixeln mit einem Satz darin, linksbuendig
   am Rand klebend.

   `max-width` in Zeichen statt in Pixeln: Die Breite soll sich nach dem TEXT
   richten, nicht nach dem Bildschirm. Der Satz bricht damit an derselben
   Stelle, gleich wie gross das Fenster ist.
   --------------------------------------------------------------------------- */
.start-status{
  max-width:min(560px, 90vw);
  /* Steht jetzt VOR der Ueberschrift, nicht mehr danach - der Abstand
     zur Ueberschrift darf deshalb kleiner sein als vorher zum Textblock. */
  margin:0 auto clamp(32px, 5vw, 56px);
  padding:18px 28px 20px;
  text-align:center;
  border:1px solid var(--kante-gold); border-radius:var(--radius-gross);
  background:color-mix(in srgb, var(--akzent) 6%, var(--oberflaeche));
  box-shadow:var(--erhebung);
}

/* Die erste Zeile ist die Aussage - Auszeichnungsschrift, wie jede
   Ueberschrift im Portal. Der Punkt sitzt DAVOR und nicht darueber: Er
   gehoert zum Satz, nicht zum Kasten. */
.start-status-kopf{
  display:flex; align-items:center; justify-content:center; gap:10px;
  margin:0 0 6px;
  font-family:var(--schrift-display);
  font-size:clamp(17px, 2vw, 19px); font-weight:600;
  line-height:1.35; color:var(--text);
  letter-spacing:-.005em;
}

/* Die zweite erklaert und tritt zurueck. Zwei Saetze im selben Gewicht
   waeren zwei Ansagen; hier ist einer die Ansage und einer die Erlaeuterung. */
.start-status-text{
  margin:0;
  font-size:14px; line-height:1.6; color:var(--text-2);
  text-wrap:balance;
}

/* Der Punkt pulsiert - er sagt „hier passiert gerade etwas", und genau
   das ist die Aussage. `prefers-reduced-motion` schaltet ihn ab: Eine
   dauernde Bewegung auf der Startseite ist fuer manche Menschen keine
   Nebensache. */
.start-status-punkt{
  flex:0 0 auto; width:8px; height:8px; border-radius:50%;
  background:var(--erfolg);
  box-shadow:0 0 0 3px color-mix(in srgb, var(--erfolg) 20%, transparent);
  animation:start-puls 2.4s var(--kurve) infinite;
}
@keyframes start-puls{
  0%, 100% { box-shadow:0 0 0 3px color-mix(in srgb, var(--erfolg) 20%, transparent); }
  50%      { box-shadow:0 0 0 6px color-mix(in srgb, var(--erfolg)  6%, transparent); }
}
@media (prefers-reduced-motion: reduce){
  .start-status-punkt{ animation:none; }
}

/* ---------------------------------------------------------------------------
   Der Text
   ---------------------------------------------------------------------------
   Ueberschrift links, Text rechts. Beim Ueberfliegen steht die Gliederung
   damit in einer senkrechten Linie; darueber gesetzt muesste man jeden
   Absatz anlesen, um zur naechsten Ueberschrift zu kommen.
   --------------------------------------------------------------------------- */
.start-text{
  max-width:880px;
  margin:0 auto;
  padding:0 24px clamp(56px, 8vw, 96px);
}

/* ---------------------------------------------------------------------------
   DER TEXT STEHT AUF EINER FLAECHE
   ---------------------------------------------------------------------------
   Die drei Abschnitte standen als blosse Textbloecke mit einer Trennlinie
   dazwischen. Auf dem dunklen Sternenhintergrund schwebte der Text damit im
   Nichts - lesbar, aber ohne Halt, und jeder Absatz sah aus wie eine
   Bildunterschrift.

   Dieselbe Flaeche wie ueberall sonst (`.tafel`). Die Trennlinie entfaellt:
   Zwei Kacheln trennen sich selbst, und eine Linie zwischen zwei Flaechen
   ist eine Trennung zu viel.
   --------------------------------------------------------------------------- */
.start-block{
  display:grid;
  grid-template-columns:150px minmax(0, 1fr);
  gap:0 40px;
  padding:30px 32px;
  margin-bottom:18px;
  border:1px solid var(--border); border-radius:var(--radius);
  background:var(--oberflaeche);
  box-shadow:var(--erhebung);
}
.start-block:last-child{ margin-bottom:0; }

.start-block h2{
  margin:0;
  font-size:13px; font-weight:700;
  text-transform:uppercase; letter-spacing:.09em;
  color:var(--akzent);
  /* Nicht mehr klebend: In einer Kachel klebt `sticky` nur INNERHALB
     der Kachel, und die ist so hoch wie ihr Text. Der Effekt waere
     keiner mehr - nur eine Zeile, die kurz mitwandert und dann
     stehenbleibt, was wie ein Fehler aussieht. */
  align-self:start; padding-top:3px;
}

.start-block-text p{
  font-size:16.5px; line-height:1.72;
  margin:0 0 18px;
  max-width:62ch;
  text-wrap:pretty;
}
.start-block-text p:last-child{ margin-bottom:0; }
.start-block-text strong{ font-weight:650; }
.start-block-tat{ margin-top:24px; }

@media (max-width:760px){
  .start-block{
    grid-template-columns:1fr;
    gap:14px;
    padding:22px 20px;
  }
  .start-block-text p{ font-size:16px; }
  .start-blickfang{ padding-left:18px; padding-right:18px; }
  .start-status{ padding-left:20px; padding-right:20px; margin-bottom:44px; }
  .start-text{ padding-left:18px; padding-right:18px; }
  .start-wege{ gap:12px; }
  .btn-gross{ padding:13px 24px; font-size:15px; }
}


/* =======================================================================
   LESBARKEIT ALLGEMEIN
   =======================================================================
   Der Bestand ist über die Zeit auf 13 bis 13.5px gewachsen. Das ist die
   Größe von Bedienoberflächen - für Fließtext ist sie zu klein, und das
   Portal besteht zu weiten Teilen aus Fließtext.

   Diese Regeln heben die Grundschrift an und begrenzen die Zeilenlänge.
   Sie stehen am ENDE des Stylesheets, damit sie die früheren Werte
   überschreiben, ohne dass an neunzehn Stellen etwas geändert werden
   muss.
   ----------------------------------------------------------------------- */

/* Die Grundschrift steht jetzt oben in der einen `body`-Regel - siehe
   dort. Hier stand sie ein zweites Mal. */

/* Fließtext in Inhaltsbereichen. Bewusst nicht auf jedes <p> - in Tabellen
   und Karten ist eine kurze Zeile richtig. */
.abschnitt > p,
.abschnitt li,
.homepage-inhalt p,
.statisch-seite p,
.statisch-seite li{
  font-size:16px;
  line-height:1.72;
  max-width:70ch;
}

.abschnitt h1{ font-size:30px; line-height:1.2; letter-spacing:-.015em; }
.abschnitt h2{ font-size:23px; line-height:1.25; letter-spacing:-.01em; }
.abschnitt h3{ font-size:18px; line-height:1.3; }

/* Links im Fließtext müssen als Link erkennbar sein, ohne den Absatz zu
   zerreißen: Unterstreichung mit Abstand statt Farbe allein. Farbe allein
   ist für rund acht Prozent der männlichen Leser kein Unterschied. */
.abschnitt > p a,
.start-block a:not(.btn),
.statisch-seite p a{
  color:var(--akzent);
  text-decoration:underline;
  text-underline-offset:.18em;
  text-decoration-thickness:1px;
}

/* Der Fokusrahmen steht WEITER OBEN, an einer Stelle (Suche nach
   ":focus-visible{"). Hier stand er ein zweites Mal - mit einem anderen
   Radius (4px statt --radius-klein). Gewirkt hat immer dieser, also der
   spaetere; Aenderungen an der oberen, ausfuehrlich begruendeten Regel
   verpufften lautlos. Genau die Sorte Fehler, wegen der es
   tests/doppelt-test.php gibt - nur greift die dort auf Klassen, nicht
   auf Pseudoklassen. tests/designsystem-test.php prueft jetzt auch das. */

/* Wer im Betriebssystem "Bewegung reduzieren" eingestellt hat, hat dafür
   einen Grund - meist Schwindel oder Migräne. */
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{
    animation-duration:.01ms !important;
    animation-iteration-count:1 !important;
    transition-duration:.01ms !important;
    scroll-behavior:auto !important;
  }
}

/* =======================================================================
   RPG BUILDER - Arbeitsfläche
   =======================================================================
   Links die Inhaltsarten mit ihrer Zahl, rechts die gewählte Art. Das ist
   der Aufbau des alten Builders, und er war richtig: Man sieht auf einen
   Blick, wo noch nichts steht, und tippt ohne Seitenwechsel weiter.

   Der Unterschied liegt darunter: Die Leiste kommt aus dem Katalog, nicht
   aus einer Liste im Quelltext.
   ----------------------------------------------------------------------- */

.builder{
  max-width:var(--inhalt-breite);
  margin:0 auto;
  padding:28px 32px 60px;
}

.builder-kopf{ margin-bottom:26px; }

.builder-kopf-weg{
  margin:0 0 6px;
  font-size:13px;
  color:var(--text-2);
}
.builder-kopf-weg a{ color:var(--text-2); }
.builder-kopf-weg a:hover{ color:var(--akzent); }

.builder-kopf h1{
  margin:0 0 10px;
  font-size:30px;
  letter-spacing:-.015em;
}

/* Die Zahlen als Zeile, nicht als vier Kacheln: Vier Kacheln nehmen die
   halbe Höhe des Bildschirms für Angaben, die man im Vorbeigehen liest. */
.builder-kopf-zahlen{
  display:flex;
  align-items:center;
  flex-wrap:wrap;
  gap:16px;
  margin:0 0 10px;
  font-size:14px;
  color:var(--text-2);
}
.builder-kopf-zahlen strong{
  font-family:'IBM Plex Mono',ui-monospace,monospace;
  font-size:20px;
  color:var(--text);
}

.builder-kopf-wege{
  display:flex;
  flex-wrap:wrap;
  gap:18px;
  margin:0;
  font-size:14px;
}

.builder-status{
  display:inline-block;
  padding:2px 9px;
  border-radius:var(--radius-rund);
  font-size:11.5px;
  font-weight:600;
  letter-spacing:.02em;
  background:var(--oberflaeche);
  border:1px solid var(--border);
  color:var(--text-2);
}
.builder-status-veroeffentlicht{ color:var(--erfolg); border-color:var(--erfolg); }
.builder-status-entwurf{ color:var(--warnung); border-color:var(--warnung); }


/* ---------- Zweispaltig ------------------------------------------------ */

.builder-flaeche{
  display:grid;
  grid-template-columns:260px 1fr;
  gap:28px;
  align-items:start;
}


/* ---------- Seitenleiste ----------------------------------------------- */

.builder-leiste{
  position:sticky;
  top:20px;
  padding:14px 10px;
  background:var(--oberflaeche);
  border:1px solid var(--border);
  border-radius:var(--radius);
  /* Bei vielen Inhaltsarten wird die Leiste länger als der Bildschirm.
     Dann scrollt sie für sich, statt die Seite zu strecken. */
  max-height:calc(100vh - 40px);
  overflow-y:auto;
}

.builder-leiste-gruppe{
  margin:12px 10px 4px;
  font-size:11px;
  font-weight:700;
  letter-spacing:.08em;
  text-transform:uppercase;
  color:var(--text-2);
}
.builder-leiste-gruppe:first-child{ margin-top:0; }

.builder-leiste-eintrag{
  display:flex;
  align-items:center;
  gap:9px;
  padding:7px 10px;
  border-radius:var(--radius-klein);
  font-size:14px;
  color:var(--text);
  text-decoration:none;
}
.builder-leiste-eintrag:hover{ background:var(--bg); }
.builder-leiste-eintrag.ist-aktiv{
  background:var(--akzent);
  color:var(--bg);
  font-weight:600;
}
.builder-leiste-eintrag.ist-aktiv .builder-leiste-zahl{ color:#fff; opacity:.85; }

/* Der Punkt sagt in einem Zeichen, ob hier schon etwas steht. Farbe allein
   reichte nicht - gefüllt gegen hohl ist auch ohne Farbsehen erkennbar. */
.builder-leiste-punkt{
  flex:0 0 auto;
  width:8px; height:8px;
  border-radius:50%;
  border:1.5px solid currentColor;
  opacity:.45;
}
.builder-leiste-punkt.ist-gefuellt{ background:currentColor; opacity:1; }

/* §99.34: ein Symbol je Inhaltsart, siehe datenbank-4-symbole.sql. Schmal
   und mit fester Breite, damit die Namen daneben trotzdem bündig stehen. */
.builder-leiste-symbol{
  flex:0 0 auto; width:16px; text-align:center;
  color:var(--text-2); font-size:13px;
}
.builder-leiste-eintrag.ist-aktiv .builder-leiste-symbol{ color:inherit; opacity:.85; }

.builder-leiste-name{ flex:1; }

.builder-leiste-zahl{
  font-family:'IBM Plex Mono',ui-monospace,monospace;
  font-size:12.5px;
  color:var(--text-2);
}

.builder-leiste-pruefen{
  margin-top:14px;
  border-top:1px solid var(--border);
  padding-top:14px;
  border-radius:0 0 8px 8px;
}


/* ---------- Arbeitsbereich --------------------------------------------- */

/* War bis 2026-09-04 nur `min-width:0` fuer das Grid - die Katalogseiten
   (Familien/Merkmale/Backup) und die Arbeitsflaeche rechts standen dadurch
   ohne jede Flaeche neben der `.builder-leiste`, die schon immer eine
   Karte war. Dieselbe Fläche wie `.tafel` (siehe deren Kommentar), direkt
   an der bestehenden Klasse statt an einer zweiten. */
.builder-panel{
  min-width:0;
  background:var(--oberflaeche); border:1px solid var(--border);
  border-radius:var(--radius); box-shadow:var(--erhebung);
  padding:20px 22px;
}

.builder-panel h2{
  margin:0 0 16px;
  font-size:22px;
  letter-spacing:-.01em;
}

/* Das Anlegen-Feld steht GANZ OBEN und ist breit. Wer dreissig Gegner
   abtippt, verbringt hier seine Zeit - nicht in der Liste darunter. */
.builder-anlegen{
  display:flex;
  flex-wrap:wrap;
  gap:10px;
  margin-bottom:12px;
}
.builder-anlegen input[type="text"]{
  flex:1;
  min-width:0;
  padding:11px 14px;
  font-size:15px;
  border:1px solid var(--border);
  border-radius:var(--radius-klein);
  background:var(--bg);
  color:var(--text);
}
/* Familien-Auswahl beim Anlegen (2026-09-06) - eigene Zeile, danach
   Name+Knopf wie zuvor. */
.builder-anlegen select{
  flex:1 1 100%;
  padding:10px 12px;
  font-size:14px;
  border:1px solid var(--border);
  border-radius:var(--radius-klein);
  background:var(--oberflaeche);
  color:var(--text);
}
.builder-anlegen input[type="text"]:focus{
  border-color:var(--akzent);
  outline:none;
}

/* ---- Sektioniertes Formular + Live-Vorschau (RPG Builder Portal,
   Phase 13, 2026-09-05) ---- */
.builder-feldgruppe{
  border:1px solid var(--border); border-radius:10px; padding:14px 16px 6px;
  margin:0 0 14px;
}
.builder-feldgruppe legend{
  padding:0 6px; font-size:12px; text-transform:uppercase; letter-spacing:.04em;
  color:var(--text-2);
}
.builder-feldgruppe .builder-feld{
  display:block; margin-bottom:12px; font-size:13px; font-weight:600; color:var(--text);
}
.builder-feldgruppe .builder-feld input,
.builder-feldgruppe .builder-feld textarea{
  display:block; width:100%; margin-top:5px; padding:9px 11px; font-size:13.5px;
  font-weight:400; border:1px solid var(--border); border-radius:var(--radius-klein);
  background:var(--bg); color:var(--text);
}
.builder-feldgruppe .builder-feld input:focus,
.builder-feldgruppe .builder-feld textarea:focus{ border-color:var(--akzent); outline:none; }
.builder-feld-nebenlink{ float:right; font-size:11.5px; font-weight:400; text-decoration:none; }
.builder-feld-nebenlink:hover{ text-decoration:underline; }

/* ---- Mehrfachauswahl aus einem Katalog (Auftrag 3, Phase A, 2026-09-06):
   Genres/Plattformen/Firmen je Spiel - Kästchen statt Multi-Select, weil
   ein `<select multiple>` bei zwanzig Plattformen entweder riesig sein
   muss oder scrollt, ohne dass man sieht, was schon angehakt ist. ---- */
.builder-mehrfachauswahl{ display:flex; flex-wrap:wrap; gap:6px 16px; margin:6px 0 4px; }
.builder-mehrfachauswahl-punkt{
  display:flex; align-items:center; gap:6px; font-size:13px; font-weight:400; color:var(--text-2);
}
.builder-mehrfachauswahl-punkt input{ width:auto; margin:0; }
.builder-feld-breit{ display:block; margin-bottom:16px; }
.builder-feld-breit > span{ display:block; font-size:13px; font-weight:600; color:var(--text); margin-bottom:2px; }
.builder-feld-breit input[type="text"]{
  display:block; width:100%; max-width:360px; margin-top:6px; padding:8px 10px;
  font-size:13px; border:1px solid var(--border); border-radius:var(--radius-klein);
  background:var(--bg); color:var(--text);
}

/* ---- Sprachen (Auftrag 3, Phase C, 2026-09-06): Name + Auswahl je
   Zeile, in Spalten umbrechend statt einer langen Liste - zwölf
   Sprachen im Katalog wären untereinander eine lange Bildlaufstrecke. ---- */
.builder-sprachen-tabelle{
  display:grid; grid-template-columns:repeat(auto-fill, minmax(220px, 1fr)); gap:8px 16px;
}
.builder-sprachen-zeile{ display:flex; align-items:center; justify-content:space-between; gap:10px; font-weight:400; }
.builder-sprachen-name{ font-size:13px; color:var(--text); }

/* ---- Versionen & Releases (Auftrag 3, Phase A Teil 2, 2026-09-06):
   kompakte Formularzeilen statt einer Tabelle - eine Fassung hat wenige,
   gemischte Felder (Text/Auswahl/Zahl), eine Tabellenspalte je Feld wäre
   auf schmalen Bildschirmen sofort zu breit. ---- */
.builder-mehrfachauswahl-form{
  display:flex; flex-wrap:wrap; gap:8px; align-items:center; margin:10px 0;
}
.builder-mehrfachauswahl-form input[type="text"],
.builder-mehrfachauswahl-form input[type="number"]{
  padding:7px 10px; font-size:13px; border:1px solid var(--border); border-radius:var(--radius-klein);
  background:var(--bg); color:var(--text);
}
.builder-mehrfachauswahl-form input[type="text"]{ flex:1 1 200px; min-width:0; }
.builder-mehrfachauswahl-form select{
  padding:7px 10px; font-size:13px; border:1px solid var(--border); border-radius:var(--radius-klein);
  background:var(--bg); color:var(--text);
}
.builder-fassung-karte{ margin-bottom:16px; }
.builder-fassung-kopf{ display:flex; align-items:center; justify-content:space-between; gap:10px; }
.builder-fassung-kopf .builder-seite-titel{ margin:0; }

#builder-vorschau-karte{ max-width:280px; margin-bottom:16px; }
#builder-vorschau-karte .entity-karte{ pointer-events:none; }

.builder-leer{
  padding:26px;
  background:var(--oberflaeche);
  border:1px dashed var(--border);
  border-radius:var(--radius);
  color:var(--text-2);
}

.builder-liste{ margin-top:18px; }

/* Der gerade angelegte Eintrag wird kurz hervorgehoben - sonst sucht man
   ihn in einer Liste mit hundert Namen. */
.builder-liste tr.ist-neu{
  background:color-mix(in srgb, var(--akzent) 12%, transparent);
}


/* ---------- Prüfen ------------------------------------------------------ */

.builder-schritt{
  padding:18px 20px;
  margin-bottom:14px;
  background:var(--oberflaeche);
  border:1px solid var(--border);
  border-left:3px solid var(--border);
  border-radius:10px;
}
.builder-schritt-erledigt{ border-left-color:var(--erfolg); }
.builder-schritt-offen{ border-left-color:var(--warnung); }
.builder-schritt-entfaellt{ border-left-color:var(--text-2); opacity:.72; }

.builder-schritt h3{
  margin:0 0 8px;
  font-size:17px;
  display:flex;
  align-items:baseline;
  gap:10px;
}
.builder-schritt h3 small{
  font-size:12px;
  font-weight:400;
  color:var(--text-2);
}
.builder-schritt p{ margin:0 0 8px; font-size:14px; }

.builder-markieren{
  display:flex;
  flex-wrap:wrap;
  gap:8px;
  margin-top:10px;
}
.builder-markieren input[type="text"]{
  flex:1;
  min-width:200px;
  padding:8px 12px;
  font-size:13.5px;
  border:1px solid var(--border);
  border-radius:var(--radius-klein);
  background:var(--bg);
  color:var(--text);
}


/* ---------- Eintragsformular ------------------------------------------- */

/* Zwei Spalten für die Werte: Bei zwanzig Merkmalen wäre eine Spalte eine
   Bildschirmlänge Scrollen für Felder, die je zwei Zeichen aufnehmen. */
.eintrag-werte{
  display:grid;
  grid-template-columns:repeat(auto-fit,minmax(230px,1fr));
  gap:16px 20px;
  margin-bottom:8px;
}
.eintrag-wert label{ display:block; font-size:13.5px; font-weight:600; margin-bottom:4px; }
.eintrag-wert label small{ font-weight:400; color:var(--text-2); }
.eintrag-wert input[type="text"],
.eintrag-wert input[type="number"],
.eintrag-wert textarea{
  width:100%;
  padding:9px 12px;
  font-size:14px;
  border:1px solid var(--border);
  border-radius:var(--radius-klein);
  background:var(--bg);
  color:var(--text);
}
.eintrag-wert .hinweis{ margin:4px 0 0; font-size:12px; }

.eintrag-wert-schalter{
  display:flex !important;
  align-items:center;
  gap:8px;
  font-weight:500 !important;
}
.eintrag-wert-schalter input{ width:auto; }

/* `.eintrag-beziehungen` stand hier als Einrueckung fuer eine <ul> mit
   Listenpunkten. Die Uebersicht ist keine Liste mehr, sondern Reihen mit
   Plaketten - die Regel dazu steht weiter unten, bei den anderen
   Plakettenregeln. Zwei Regeln fuer dieselbe Klasse an zwei Stellen sind
   genau die Doppelung, gegen die es hier einen Test gibt. */

.eintrag-beziehung-zeile{
  display:flex;
  gap:10px;
  margin-bottom:10px;
  flex-wrap:wrap;
}
.eintrag-beziehung-zeile select{
  flex:0 0 auto;
  min-width:150px;
  padding:9px 12px;
  font-size:14px;
  border:1px solid var(--border);
  border-radius:var(--radius-klein);
  background:var(--bg);
  color:var(--text);
}
.eintrag-beziehung-zeile input[type="text"]{
  flex:1;
  min-width:200px;
  padding:9px 12px;
  font-size:14px;
  border:1px solid var(--border);
  border-radius:var(--radius-klein);
  background:var(--bg);
  color:var(--text);
}

.hinweis-erfolg{
  padding:12px 16px;
  margin-bottom:16px;
  background:color-mix(in srgb, var(--erfolg) 10%, transparent);
  border:1px solid var(--erfolg);
  border-radius:var(--radius-klein);
  font-size:14px;
  color:var(--text);
}
.hinweis-erfolg p{ margin:0 0 6px; font-weight:600; }
.hinweis-erfolg ul{ margin:0; padding-left:20px; }


/* ---------- Schmale Fenster -------------------------------------------- */

@media (max-width:900px){
  .builder{ padding:20px 16px 40px; }
  .builder-flaeche{ grid-template-columns:1fr; }

  /* Auf dem Handy wird aus der Leiste eine waagerechte Reihe - sonst
     scrollt man an zwanzig Einträgen vorbei, bevor der Inhalt kommt. */
  .builder-leiste{
    position:static;
    max-height:none;
    display:flex;
    flex-wrap:wrap;
    gap:6px;
  }
  .builder-leiste-gruppe{ width:100%; margin:6px 0 0; }
  .builder-leiste-eintrag{ padding:6px 12px; }
  .builder-leiste-punkt{ display:none; }
}

/* =======================================================================
   RPG EXPLORER - Ergänzungen
   =======================================================================
   Das Stylesheet der Spielseite hat den Neuaufbau überlebt; die Klassen
   heissen deshalb wie zuvor. Hier stehen nur die Stücke, die es damals
   noch nicht gab.
   ----------------------------------------------------------------------- */

/* Eine Handvoll Namen neben jeder Kategorie. Eine Kachel "Gegner 214" sagt,
   dass etwas da ist - nicht, ob es das ist, wonach jemand sucht. */
.art-vorschau{
  display:block;
  margin-top:3px;
  font-size:12.5px;
  line-height:1.6;
  color:var(--text-2);
}
.art-vorschau a{ color:var(--text-2); }
.art-vorschau a:hover{ color:var(--akzent); }


.inhalt-karte-block ul{ margin:0; padding-left:20px; font-size:13.5px; }
.inhalt-karte-block p{ margin:0 0 6px; font-size:13.5px; line-height:1.6; }

.spiel-fassungen{ margin:0; padding-left:18px; font-size:14px; }
.spiel-fassungen small{ color:var(--text-2); margin-left:6px; }

/* =======================================================================
   RPG BUILDER - drei Spalten im Aufbau des Explorers
   =======================================================================
   Links die Inhaltsarten, in der Mitte die Einträge, rechts der Datensatz.
   Genau das Bild, das der Besucher später auf der Spielseite sieht - nur
   mit Eingabefeldern statt Text.

   Wer etwas einträgt, sieht dabei, wie es hinterher aussieht. Ein Formular
   auf einer eigenen Seite lässt einen raten und danach nachsehen.
   ----------------------------------------------------------------------- */

/* 230 / 260 / Rest stand hier - und 260 Pixel waren zu wenig.

   In diese Spalte gehoert das Anlegen-Feld, und es teilte sie sich mit
   dem Plus-Knopf: Vom Namen blieben rund 180 Pixel sichtbar. Wer
   "Bravely Default: Flying Fairy" tippt, sieht ab der Haelfte nicht
   mehr, was er schreibt - und tippt Fehler, die er nicht bemerkt.

   320 statt 260, und das Feld bekommt eine eigene Zeile. Die Liste
   darunter gewinnt dabei mit: Eintragsnamen wurden vorher abgeschnitten. */
.builder-flaeche-drei{
  grid-template-columns:210px 320px minmax(0,1fr);
}

.builder-panel-breit{ grid-column:2 / -1; }


/* ---------- Mittlere Spalte: die Einträge ------------------------------ */

.builder-eintraege{
  /* Weniger Kante: Der Builder ist EINE Arbeitsflaeche, keine drei. */
  min-width:0;
  background:var(--oberflaeche);
  border:1px solid var(--border);
  border-radius:var(--radius);
  padding:12px;
  /* Eigener Bildlauf: Bei zweihundert Gegnern soll die Liste scrollen und
     nicht die ganze Seite - sonst verliert man den Datensatz rechts aus
     dem Blick, während man in der Liste sucht. */
  max-height:calc(100vh - 40px);
  overflow-y:auto;
  position:sticky;
  top:20px;
}

/* DAS FELD BEKOMMT DIE GANZE BREITE, DER KNOPF STEHT DARUNTER.

   Hier stand `padding:8px 10px; font-size:14px` neben einem Knopf in
   derselben Zeile - beides sparte Platz an der Stelle, an der jemand
   dreissig Gegner abtippt und deshalb am meisten Platz braucht.

   `flex-wrap` mit einem Feld auf 100 %: Das Feld nimmt die Zeile, der
   Knopf rutscht in die naechste. Er ist ohnehin selten noetig - die
   Eingabetaste tut dasselbe. */
.builder-eintraege .builder-anlegen{
  flex-wrap:wrap;
  gap:8px;
  margin-bottom:14px;
}
.builder-eintraege .builder-anlegen input[type="text"]{
  flex:1 1 100%;
  padding:11px 13px;
  font-size:15px;
}
.builder-eintraege .builder-anlegen .btn{
  flex:1 1 auto;
  padding:9px 14px;
  font-size:14px;
}
/* Das Vorbild darunter, ueber die ganze Breite - es gehoert zum
   Anlegen und nicht in eine eigene Ecke. */
.builder-eintraege .builder-vorbild{ flex:1 1 100%; margin-top:0; }

.builder-eintragsliste{ display:flex; flex-direction:column; gap:2px; }

.builder-eintragszeile{
  display:flex;
  align-items:center;
  gap:8px;
  padding:7px 10px;
  border-radius:7px;
  font-size:14px;
  color:var(--text);
}
.builder-eintragszeile:hover{ background:var(--bg); }
.builder-eintragszeile.ist-aktiv{
  background:var(--akzent);
  color:var(--bg);
  font-weight:600;
}

/* Der Zeileninhalt bleibt ein Link (Navigation zur Spalte 3); das
   Häkchen davor gehört nicht mehr hinein - ein Kontrollkästchen in
   einem <a> ist kein gültiges Verschachteln und je nach Browser
   unzuverlässig anklickbar. Siehe §24, Massenbearbeitung. */
.builder-eintrag-checkbox{ flex:none; margin:0; }
.builder-eintragslink{
  display:flex; align-items:center; justify-content:space-between;
  gap:8px; flex:1; min-width:0; color:inherit; text-decoration:none;
}

.builder-eintragsname{ min-width:0; overflow-wrap:anywhere; }

.builder-eintragsstatus{
  flex:0 0 auto;
  font-size:10.5px;
  padding:1px 7px;
  border-radius:var(--radius-rund);
  border:1px solid currentColor;
  opacity:.7;
}


/* ---------- Rechte Spalte: der Datensatz ------------------------------- */

.builder-datensatz{
  min-width:0;
  background:var(--oberflaeche);
  border:1px solid var(--border);
  border-radius:var(--radius);
  padding:24px 26px;
  box-shadow:var(--erhebung);
}

/* Der Name ist die Überschrift der Karte - also sieht das Feld auch so aus
   und nicht wie ein Formularfeld unter vielen. */
/*
   DAS NAMENSFELD IST DIE UEBERSCHRIFT DES DATENSATZES.

   Es soll auch so aussehen und nicht wie ein Eingabefeld unter
   vielen: keine Umrandung, nur eine Linie darunter, und in der
   Groesse einer Ueberschrift.

   Diese Regel stand einmal zweimal in der Datei - hier und noch
   einmal am Ende. Gewirkt hat die spaetere; Aenderungen an dieser
   waren wirkungslos.

   Beim Aufraeumen ist sie dann versehentlich ganz verschwunden: Ich
   habe die eine geloescht und die andere beim Zusammenfuehren
   mitgenommen. Aufgefallen ist es nur, weil eine Pruefung auf ihre
   Anzahl bestand - `> 1` UND `< 1` sind beide falsch. */
.builder-namensfeld{
  width:100%;
  background:transparent;
  border:none; border-bottom:2px solid var(--border);
  border-radius:0;
  padding:4px 0 8px; margin:0 0 20px;
  font-size:26px; font-weight:700; letter-spacing:-.01em;
  color:var(--text); font-family:inherit;
}
.builder-namensfeld:focus{ outline:none; border-bottom-color:var(--akzent); }

.builder-feldreihe{
  display:grid;
  grid-template-columns:repeat(auto-fit,minmax(200px,1fr));
  gap:14px;
  margin-bottom:4px;
}
.builder-feldreihe label{ display:block; font-size:13px; font-weight:600; }
.builder-feldreihe input,
.builder-feldreihe select{
  width:100%;
  margin-top:4px;
  padding:8px 11px;
  font-size:14px;
  font-weight:400;
  border:1px solid var(--border);
  border-radius:var(--radius-klein);
  background:var(--bg);
  color:var(--text);
}

.builder-formular .inhalt-karte-block{
  padding-top:18px;
  margin-top:18px;
  border-top:1px solid var(--border);
}

.builder-datensatz .builder-leer{
  border:none;
  background:transparent;
  padding:40px 0;
  text-align:center;
}


/* ---------- Schmale Fenster -------------------------------------------- */

@media (max-width:1100px){
  /* Zwei Spalten: Arten und Einträge nebeneinander, der Datensatz darunter.
     Drei Spalten auf einem Laptop hiessen drei zu schmale Spalten. */
  .builder-flaeche-drei{ grid-template-columns:210px minmax(0,1fr); }
  .builder-datensatz{ grid-column:1 / -1; }
  .builder-panel-breit{ grid-column:1 / -1; }
}

@media (max-width:900px){
  .builder-flaeche-drei{ grid-template-columns:1fr; }
  .builder-eintraege{
  /* Weniger Kante: Der Builder ist EINE Arbeitsflaeche, keine drei. */ position:static; max-height:none; }
  .builder-namensfeld{ font-size:20px; }
}

/* ===========================================================================
   LÖSCHEN IM BUILDER
   ---------------------------------------------------------------------------
   Zugeklappt, weil ein dauerhaft sichtbarer Löschknopf neben einem
   Speichern-Knopf eine Frage der Zeit ist. Aufgeklappt rot umrandet: Der
   Bereich soll aussehen wie das, was er tut.
   =========================================================================== */
.builder-loeschen{ margin-top:28px; border-top:1px solid var(--border); padding-top:16px; }
.builder-loeschen > summary{
  cursor:pointer; font-size:13px; color:var(--text-2);
  padding:6px 0; list-style:none; user-select:none;
}
.builder-loeschen > summary::-webkit-details-marker{ display:none; }
.builder-loeschen > summary::before{ content:'▸ '; }
.builder-loeschen[open] > summary::before{ content:'▾ '; }
.builder-loeschen > summary:hover{ color:var(--fehler); }
.builder-loeschen[open]{
  border:1px solid color-mix(in srgb, var(--fehler) 45%, transparent);
  border-radius:10px; padding:14px 16px;
  background:color-mix(in srgb, var(--fehler) 6%, transparent);
}
.builder-loeschen[open] > summary{ color:var(--fehler); font-weight:600; margin-bottom:10px; }
.builder-loeschen p, .builder-loeschen ul{ font-size:13px; color:var(--text-2); margin:0 0 12px; }
.builder-loeschen ul{ padding-left:20px; }
.builder-loeschen li{ margin-bottom:4px; }
.builder-loeschen label{ display:block; font-size:13px; margin-bottom:12px; }
.builder-loeschen input[type="text"]{
  display:block; width:100%; max-width:420px; margin-top:6px;
  padding:8px 10px; border:1px solid var(--border); border-radius:var(--radius-klein);
  background:var(--oberflaeche); color:var(--text);
}

/* Der einzige Knopf im Portal, der rot ist. Genau deshalb wirkt er. */
.btn-warnung{
  background:var(--fehler); color:#fff; border-color:var(--fehler);
}
.btn-warnung:hover{ filter:brightness(1.08); }

/* ===========================================================================
   WERTE UND WIRKUNGEN IM RPG EXPLORER
   ---------------------------------------------------------------------------
   Vorher war das eine Liste: „Verkaufspreis 5000 / Angriffswert 125 /
   Trefferquote 100 % / Waffenart Schwert" - lesbar, aber nichts, worauf
   das Auge landet. Wer eine Waffe nachschlägt, sucht EINEN Wert, und in
   einer gleichförmigen Liste muss er dafür alles lesen.

   Deshalb ein Raster aus Kacheln: Die Zahl gross, die Bezeichnung klein
   darüber. Das Auge springt zur Zahl, findet die Bezeichnung daneben und
   ist fertig, ohne die anderen sechs Zeilen anzusehen.
   =========================================================================== */
/* DETAILS (2026-09-11) - ersetzt die Kacheln (Betreiber: „muss wesentlich
   besser aussehen und professioneller"). Vorbild Charaktermenü: Angaben in
   Worten oben, Zahlen als ruhige Liste - Name links, Wert rechtsbündig, feine
   Linien. Mehrere Spalten, wenn Platz ist. */
.karte-details-angaben{ display:flex; flex-wrap:wrap; gap:10px 36px; margin:0 0 14px; }
.karte-details-angaben div{ min-width:0; }
.karte-details-angaben dt{
  margin:0 0 3px; font-size:11px; font-weight:600;
  letter-spacing:.08em; text-transform:uppercase; color:var(--text-2);
}
.karte-details-angaben dd{ margin:0; font-size:15px; font-weight:600; color:var(--text); font-variant-numeric:tabular-nums; }
.karte-details-werte{
  display:grid; grid-template-columns:repeat(auto-fill, minmax(210px, 1fr));
  column-gap:36px; margin:0;
}
.karte-details-wert{
  display:flex; align-items:baseline; justify-content:space-between; gap:12px;
  padding:7px 2px; border-bottom:1px solid var(--border);
}
.karte-details-wert dt{
  margin:0; min-width:0; font-size:13.5px; color:var(--text-2);
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}
.karte-details-wert dd{
  margin:0; font-size:15px; font-weight:600; color:var(--text);
  font-variant-numeric:tabular-nums; white-space:nowrap;
}
.karte-details-wert dd small{ margin-left:2px; font-size:12px; font-weight:500; color:var(--text-2); }

/* Level-Übersicht (2026-09-11): kleiner Knopf, Fenster wie die Cookie-Einstellungen. */
.karte-level-leiste{ margin:12px 0 0; }
.karte-level-knopf{
  display:inline-flex; align-items:center; gap:6px; padding:5px 13px;
  border-radius:var(--radius-rund); border:1px solid var(--border); background:var(--bg);
  color:var(--text); font:inherit; font-size:12.5px; font-weight:600; cursor:pointer;
  transition:border-color var(--dauer) var(--kurve), color var(--dauer) var(--kurve);
}
.karte-level-knopf:hover, .karte-level-knopf:focus-visible{ border-color:var(--kante-gold); color:var(--akzent); }
.karte-level-wahl{ position:absolute; opacity:0; pointer-events:none; }
.karte-level-umfang{
  display:inline-flex; gap:4px; margin:0 0 12px; padding:3px;
  border:1px solid var(--border); border-radius:var(--radius-rund);
}
.karte-level-umfang label{ padding:4px 13px; border-radius:var(--radius-rund); font-size:12.5px; color:var(--text-2); cursor:pointer; }
.karte-level-hinweis{ margin:0 0 10px; font-size:13px; color:var(--text-2); }
.karte-level-rahmen{ max-height:68vh; overflow:auto; border:1px solid var(--border); border-radius:10px; }
.karte-level-tabelle{ width:100%; border-collapse:collapse; font-size:14px; font-variant-numeric:tabular-nums; }
.karte-level-tabelle th, .karte-level-tabelle td{
  padding:6px 12px; text-align:right; white-space:nowrap; border-bottom:1px solid var(--border);
}
.karte-level-tabelle thead th{
  position:sticky; top:0; z-index:1; background:var(--oberflaeche-2);
  font-size:11.5px; font-weight:600; letter-spacing:.06em; text-transform:uppercase; color:var(--text-2);
}
.karte-level-tabelle th[scope="row"]{
  position:sticky; left:0; background:var(--oberflaeche-2); text-align:left; font-weight:700; color:var(--text);
}
.karte-level-tabelle tbody tr:not(.hat-werte) td{ color:var(--text-2); opacity:.75; }
.karte-level-tabelle .karte-level-gelernt{ text-align:left; white-space:normal; min-width:160px; color:var(--akzent); font-variant-numeric:normal; }

/* Fähigkeitsbaum einer Vision (2026-09-11): Stufe links, Fähigkeiten rechts, ruhige Linien wie „Details". */
.karte-baum-stufen{ margin:0; }
.karte-baum-stufe{
  display:grid; grid-template-columns:minmax(120px, 170px) 1fr; gap:4px 18px;
  padding:8px 2px; border-bottom:1px solid var(--border);
}
.karte-baum-stufe dt{ margin:0; font-size:13.5px; font-weight:600; color:var(--text-2); white-space:nowrap; }
.karte-baum-stufe dd{ margin:0; font-size:14px; color:var(--text); line-height:1.55; }
.karte-baum-stufe dd a{ color:var(--text); text-decoration:none; border-bottom:1px solid var(--border); }
.karte-baum-stufe dd a:hover, .karte-baum-stufe dd a:focus-visible{ color:var(--akzent); border-color:var(--akzent); }
.karte-baum-sterne{ display:inline-block; min-width:3.2em; margin-right:4px; color:var(--akzent); letter-spacing:1px; }
.karte-baum-trenner{ margin:0 6px; color:var(--text-2); }
.builder-beziehung-zeile-baumstufe{ min-width:9.5em; }
@media (max-width:560px){ .karte-baum-stufe{ grid-template-columns:1fr; } }

/* ---------------------------------------------------------------------------
   ELEMENTE UND ZUSTÄNDE
   ---------------------------------------------------------------------------
   Als Plaketten, nicht als Aufzählung. „Schwach gegen Feuer" ist die
   Antwort, wegen der jemand einen Gegner nachschlägt - sie gehoert nicht
   in eine Liste mit allem anderen.

   Die Farbe kommt aus dem Katalog (elemente.farbe) und wird als
   Inline-Stil gesetzt, weil sie Daten sind und keine Gestaltung: Ein neues
   Element im Katalog bringt seine Farbe mit, ohne dass jemand CSS anfasst.
   Fehlt sie, gilt die neutrale Darstellung darunter.
   --------------------------------------------------------------------------- */
.element-liste{ display:flex; flex-wrap:wrap; gap:6px; }
.element-plakette{
  display:inline-flex; align-items:center; gap:5px;
  font-size:12px; font-weight:600; line-height:1;
  padding:5px 10px; border-radius:var(--radius-rund);
  border:1px solid var(--border); background:var(--bg); color:var(--text);
}
.element-plakette-symbol{ font-size:13px; }

/* Die Richtung als Farbstreifen links: Offensiv, defensiv, neutral. Wer
   nach einer Schwäche sucht, findet sie ohne zu lesen. */

.eintrag-wirkung-zeile{ display:flex; flex-wrap:wrap; gap:8px; margin-bottom:6px; }
.eintrag-wirkung-zeile select{ flex:1 1 150px; min-width:0; }
.eintrag-wirkung-zeile .builder-wirk-bedingung{ flex:1 1 200px; min-width:0; }
.builder-wirk-hilfe{ font-size:11.5px; color:var(--text-2); margin:0 0 12px; min-height:1em; }

/* ---------------------------------------------------------------------------
   HERKUNFT UND VERBINDUNGEN OHNE SAMMELÜBERSCHRIFT
   ---------------------------------------------------------------------------
   Über „Zu finden in: Ultima Weapon" stand einmal „WO ZU FINDEN". Die
   Überschrift wiederholte, was die Zeile darunter schon sagte. Jetzt ist
   die Bezeichnung der Beziehung selbst die Überschrift - genauer, weil sie
   zum einzelnen Fall passt.
   --------------------------------------------------------------------------- */
/* ---- Herkunft und Verbindungen in der Eintragskarte ------------------------

   „Zu finden in: Krypto, DownTown"

   VORHER stand je Weg eine eigene Zeile mit eigener Überschrift. Ein
   Gegenstand an zwei Orten, geführt von zwei Händlern, ergab vier
   Überschriften für zwei Auskünfte - bei einer Waffe aus zwanzig Truhen
   wären es zwanzig, und die Karte bestünde aus Überschriften.

   ---------------------------------------------------------------------------
   BESCHRIFTUNG LINKS, ZIELE DANEBEN
   ---------------------------------------------------------------------------
   `minmax(108px, auto)`: Die Spalte richtet sich nach der längsten
   Beschriftung, und alle Plaketten beginnen an derselben Kante. Ohne feste
   Kante wandert der Anfang von Zeile zu Zeile mit der Länge der Beschriftung
   mit - und das Auge findet die Reihe nicht mehr.

   Dieselbe Form wie das Wirkungsgitter darüber. Beide beantworten dieselbe
   Sorte Frage, und sie sollen deshalb gleich aussehen.
   --------------------------------------------------------------------------- */
.inhalt-karte-herkunft,
.inhalt-karte-verbindungen{
  display:flex; flex-direction:column; gap:10px;
}

.karte-reihe{
  display:grid;
  grid-template-columns:minmax(108px, auto) minmax(0, 1fr);
  gap:4px 16px;
  align-items:baseline;
}

.karte-reihe-titel{
  font-family:var(--schrift-mono); font-size:10.5px; font-weight:700;
  text-transform:uppercase; letter-spacing:.06em;
  color:var(--text-2);
  white-space:nowrap;
  padding-top:4px;
}

.karte-reihe-ziele{ display:flex; flex-wrap:wrap; gap:6px; }

/* Je Ort gebündelt (2026-09-11): „Verkauft" einmal, darunter je Ort eine
   Zeile - Ort als ruhige Beschriftung, Plaketten daneben. Ohne Kästen
   (Betreiber: die schlichte Reihe sieht besser aus). `display:contents`
   legt alle Orte in EIN Raster - die Plaketten beginnen an derselben Kante. */
.karte-orte{
  display:grid;
  grid-template-columns:fit-content(220px) minmax(0, 1fr);
  gap:8px 14px;
  align-items:baseline;
  min-width:0;
}
.karte-ort{ display:contents; }
.karte-ort-name{ font-size:13px; font-weight:500; line-height:1.4; color:var(--text-2); padding-top:4px; }
.karte-ort-name a{ color:inherit; text-decoration:none; }
.karte-ort-name a:hover{ color:var(--akzent); text-decoration:underline; }
@media (max-width: 560px){
  .karte-orte{ grid-template-columns:1fr; gap:3px 0; }
  .karte-ort-name{ padding-top:6px; }
}

/* Jede Plakette ist EIN Weg. Ein Weg kann mehrere Stationen haben
   („Truhe → Thronsaal"); mit Kommas getrennt müsste man raten, wo der eine
   aufhört und der nächste anfängt. */
.karte-ziel{
  display:inline-flex; align-items:baseline; gap:5px;
  padding:4px 11px; border-radius:var(--radius-rund);
  border:1px solid var(--border);
  background:var(--bg);
  font-size:13px; line-height:1.45;
  transition:border-color var(--dauer) var(--kurve);
}
.karte-ziel:hover{ border-color:var(--kante-gold); }
.karte-ziel a{ color:var(--akzent); text-decoration:none; }
.karte-ziel a:hover{ text-decoration:underline; }

/* Der Pfeil zwischen zwei Stationen bleibt ruhig - er ist Satzzeichen,
   nicht Inhalt. */
.karte-ziel span[aria-hidden]{ color:var(--text-2); }

/* Menge, Wahrscheinlichkeit, Bedingung: klein, mit feinem Strich abgesetzt.
   „12,5 %" gehört zu diesem einen Drop und nicht zur ganzen Reihe. */
.karte-ziel .inhalt-karte-angabe{
  font-size:12px; color:var(--text-2);
  padding-left:6px;
  border-left:1px solid var(--border);
}

@media (max-width: 560px){
  /* Untereinander: Bei 108px Beschriftung bleibt auf einem Telefon für die
     Plaketten zu wenig. */
  .karte-reihe{ grid-template-columns:1fr; gap:3px 0; }
  .karte-reihe-titel{ padding-top:6px; }
}

/* ===========================================================================
   „ALLE INFOS ZU …" AUF DER SPIELSEITE
   ---------------------------------------------------------------------------
   Drei Formen, weil es drei Arten von Angaben sind:

     Zeilen     für Eins-zu-eins-Angaben (Entwickler, Genre, Spielzeit)
     Plaketten  für Aufzählungen ohne Ordnung (Plattformen)
     Liste      für Termine, die Region, Datum und Gerät zugleich tragen

   Alles drei in dieselbe Zeilentabelle zu zwingen hiesse, „PS1, PC, Switch,
   PS4, Xbox One" als Satz zu schreiben - lesbar, aber nichts, worauf das
   Auge landet.
   =========================================================================== */
.spiel-blick-abschnitt{ margin-top:18px; }
.spiel-blick-titel{
  font-family:'IBM Plex Mono',monospace; font-size:10.5px; font-weight:700;
  text-transform:uppercase; letter-spacing:.07em; color:var(--text-2);
  margin:0 0 8px;
}
.spiel-blick-text{ font-size:14px; margin:0; }

.spiel-erscheinungen{ list-style:none; padding:0; margin:0; display:flex; flex-direction:column; gap:5px; }
.spiel-erscheinungen li{
  display:flex; align-items:center; gap:10px; flex-wrap:wrap;
  padding:7px 11px; border-radius:var(--radius-klein);
  background:var(--bg); border:1px solid var(--border);
  font-size:13px;
}
/* Die Region als feste Breite, damit die Daten darunter untereinander
   stehen. Ohne sie springt jede Zeile an eine andere Stelle, und die
   Liste liest sich als Fließtext statt als Tabelle. */
.spiel-erscheinung-region{
  font-family:'IBM Plex Mono',monospace; font-size:10.5px; font-weight:700;
  letter-spacing:.05em; color:var(--bg); background:var(--akzent);
  border-radius:5px; padding:3px 7px; flex:0 0 auto; min-width:34px; text-align:center;
}
.spiel-erscheinung-datum{ font-weight:600; font-variant-numeric:tabular-nums; }
.spiel-erscheinung-plattform{
  font-size:11.5px; color:var(--text-2); margin-left:auto;
  font-family:'IBM Plex Mono',monospace;
}

/* ===========================================================================
   KATALOGSEITE IM ADMIN
   ---------------------------------------------------------------------------
   Einundzwanzig Inhaltsarten mit je einer Tabelle wären eine Wand. Deshalb
   zugeklappt: Man öffnet die eine Art, wegen der man hier ist.
   =========================================================================== */
.katalog-art{ border:1px solid var(--border); border-radius:10px; margin-bottom:8px; }
.katalog-art > summary{
  cursor:pointer; padding:11px 14px; display:flex; align-items:center;
  gap:12px; flex-wrap:wrap; user-select:none; list-style:none;
}
.katalog-art > summary::-webkit-details-marker{ display:none; }
.katalog-art > summary::before{ content:'▸'; color:var(--text-2); flex:0 0 auto; }
.katalog-art[open] > summary::before{ content:'▾'; }
.katalog-art[open] > summary{ border-bottom:1px solid var(--border); }
.katalog-art > *:not(summary){ margin-left:14px; margin-right:14px; }
.katalog-art > *:last-child{ margin-bottom:14px; }
.katalog-zahl{
  font-family:'IBM Plex Mono',monospace; font-size:10.5px; color:var(--text-2);
  background:var(--bg); border:1px solid var(--border); border-radius:5px;
  padding:2px 7px; margin-left:auto;
}
.katalog-zahl + .katalog-zahl{ margin-left:0; }

.katalog-tabelle{ width:100%; border-collapse:collapse; font-size:13px; margin:10px 0 18px; }
.katalog-tabelle th{
  text-align:left; font-family:'IBM Plex Mono',monospace; font-size:10.5px;
  text-transform:uppercase; letter-spacing:.06em; color:var(--text-2);
  padding:6px 10px; border-bottom:1px solid var(--border); font-weight:700;
}
.katalog-tabelle td{ padding:7px 10px; border-bottom:1px solid var(--border); vertical-align:top; }
.katalog-tabelle tr:last-child td{ border-bottom:none; }
/* Die Richtung schmal und einfarbig: Sie ist eine Markierung, keine Angabe,
   die man liest. */
.katalog-richtung{
  font-family:'IBM Plex Mono',monospace; font-size:11px; color:var(--text-2);
  white-space:nowrap;
}
.katalog-untertitel{
  font-family:'IBM Plex Mono',monospace; font-size:10.5px; font-weight:700;
  text-transform:uppercase; letter-spacing:.07em; color:var(--text-2);
  margin:18px 0 8px;
}
.katalog-familien{ list-style:none; padding:0; margin:0 0 14px; font-size:13px; }
.katalog-familien li{ padding:3px 0; }

/* ---------------------------------------------------------------------------
   SPIELZEIT: DREI ZAHLEN NEBENEINANDER
   ---------------------------------------------------------------------------
   Der Abstand zwischen den Zahlen ist die eigentliche Auskunft: Ein Spiel
   mit 37 zu 80 Stunden ist ein anderes Angebot als eines mit 37 zu 42.
   Untereinander liest man eine und überspringt die anderen - und genau der
   Vergleich geht dabei verloren.
   --------------------------------------------------------------------------- */
.spiel-zeiten{ display:flex; flex-wrap:wrap; gap:8px; }
.spiel-zeit{
  flex:1 1 120px; min-width:0;
  background:var(--bg); border:1px solid var(--border); border-radius:10px;
  padding:10px 13px; display:flex; flex-direction:column; gap:2px;
}
.spiel-zeit-zahl{
  font-size:22px; font-weight:800; line-height:1.15; letter-spacing:-.02em;
  font-variant-numeric:tabular-nums; color:var(--akzent);
  display:flex; align-items:baseline; gap:4px;
}
.spiel-zeit-einheit{ font-size:12px; font-weight:600; color:var(--text-2); letter-spacing:0; }
.spiel-zeit-label{
  font-family:'IBM Plex Mono',monospace; font-size:10px; font-weight:600;
  text-transform:uppercase; letter-spacing:.05em; color:var(--text-2);
}

/* ===========================================================================
   STAMMDATEN
   ---------------------------------------------------------------------------
   Anlegen oben, Liste darunter. Bei achtundzwanzig Plattformen waere das
   Eingabefeld unter der Liste zwei Bildschirmhoehen entfernt - und man
   scrollt an dem vorbei, wofuer man gekommen ist.
   =========================================================================== */
.stammdaten-block{ margin-bottom:40px; }
.stammdaten-block h2{ display:flex; align-items:center; gap:10px; }
.stammdaten-anlegen{
  display:flex; flex-wrap:wrap; gap:8px; align-items:center;
  padding:12px 14px; margin-bottom:14px;
  background:var(--bg); border:1px solid var(--border); border-radius:10px;
}
.stammdaten-anlegen input[type="text"]{ flex:1 1 260px; min-width:0; }
.stammdaten-anlegen input[type="number"]{ width:120px; }

.stammdaten-tabelle td{ vertical-align:middle; }
.stammdaten-aktionen{ display:flex; flex-wrap:wrap; gap:8px; align-items:center; }
.stammdaten-aktionen form{ display:flex; gap:6px; align-items:center; margin:0; }
.stammdaten-aktionen input[type="text"]{ width:200px; }
/* Kleiner als sonst: Das sind Werkzeuge in einer Tabellenzeile, keine
   Hauptknoepfe einer Seite. */
.stammdaten-aktionen .btn{ padding:5px 11px; font-size:12px; }

/* ===========================================================================
   RPG FINDER - EMPFEHLUNG NACH KRITERIEN
   =========================================================================== */
/*
  Etwas mehr Abstand zur Suchleiste des Kopfbereichs darueber - sonst
  klebt "RPG Finder" fast an ihr. Nur auf dieser Seite (.finder-seite),
  nicht an der globalen .zurueck-leiste, die auf jeder Seite gleich sitzt.
*/
.finder-seite{ padding-top:48px; }
.finder-seite > h1{ text-align:center; }

.finder-vorspann{
  font-size:15px; color:var(--text-2); max-width:60ch; margin:0 auto 24px;
  text-align:center;
}

/*
  Ohne diesen Rahmen liefe das Formular UND die Ergebnisliste bis an den
  Rand von .abschnitt (--inhalt-breite, bis zu 2040px) - deutlich breiter
  als der Kopfbereich (--kopf-breite: 1280px) darueber, und wirkte dadurch
  schief statt zentriert. Etwas breiter als der Kopf, damit es nicht wie
  eine zufaellige Uebereinstimmung aussieht, aber erkennbar zu ihm gehoert.
*/
.finder-mitte{ max-width:calc(var(--kopf-breite) + 40px); margin:0 auto; }

.finder-wunsch{
  display:grid; gap:18px; margin:0 0 32px;
  grid-template-columns:repeat(auto-fit, minmax(230px, 1fr));
}
.finder-gruppe{
  background:var(--bg); border:1px solid var(--border); border-radius:var(--radius);
  padding:14px 16px;
}
.finder-gruppe-titel{
  font-family:'IBM Plex Mono',monospace; font-size:10.5px; font-weight:700;
  text-transform:uppercase; letter-spacing:.07em; color:var(--text-2);
  margin:0 0 12px;
}
/* ---- Die Satzleiste -------------------------------------------------------

   „Spiele mit über 50 Std und vielen Bossen" - ein Satz statt vier Felder.

   Sie sieht aus wie eine Suchleiste, weil sie eine ist. Alles darunter ist
   Feineinstellung; wer nur eine Frage hat, soll sie hier loswerden und den
   Rest der Seite gar nicht ansehen muessen.

   Deshalb steht sie ausserhalb der Kriteriengruppen und nicht als erste
   davon: Eine Gruppe unter fuenfen wuerde man zwischen ihnen uebersehen.
   --------------------------------------------------------------------------- */
.finder-satzleiste{
  grid-column:1 / -1; margin:0 0 26px;
}

/* Lupe, Feld und Knopf sitzen in EINEM Rahmen. Drei getrennte Kaesten
   nebeneinander lesen sich als drei Bedienelemente; ein Rahmen liest sich
   als eine Suchleiste - und genau das soll es sein. */
.finder-satz-feld{
  display:flex; align-items:center; gap:10px;
  padding:6px 6px 6px 16px;
  border:1px solid var(--kante-gold); border-radius:var(--radius-rund);
  background:var(--oberflaeche);
  box-shadow:var(--erhebung);
  transition:border-color var(--dauer) var(--kurve),
             box-shadow var(--dauer) var(--kurve);
}
.finder-satz-feld:focus-within{
  border-color:var(--akzent);
  box-shadow:0 0 0 3px color-mix(in srgb, var(--akzent) 16%, transparent);
}
.finder-satz-feld svg{ flex:0 0 auto; color:var(--akzent); }

/* `background:none` und `border:none`: Das Feld hat schon einen Rahmen -
   den der Leiste. Ein zweiter darin ist ein Kasten im Kasten. */
.finder-satz-feld input[type="search"]{
  flex:1 1 auto; min-width:0;
  padding:11px 0; border:none; background:none;
  color:var(--text); font-family:inherit; font-size:16px;
}
.finder-satz-feld input[type="search"]:focus{ outline:none; }
.finder-satz-feld input::placeholder{ color:var(--text-2); }
.finder-satz-feld .btn{ flex:0 0 auto; border-radius:var(--radius-rund); padding:10px 22px; }

/* Die Rueckuebersetzung: „Gelesen als: mindestens 50 Stunden, viele Bosse".
   Ohne sie ist der Finder eine Blackbox, die manchmal das Richtige tut. */
.finder-gelesen{
  display:flex; align-items:center; flex-wrap:wrap; gap:7px;
  margin:12px 0 0; padding-left:16px;
  font-size:13.5px; color:var(--text-2); line-height:1.6;
}
.finder-gelesen.ist-offen{ color:var(--text-2); }
.finder-gelesen em{ color:var(--text); font-style:normal; font-weight:600; }

@media (max-width: 560px){
  /* Der Knopf unter das Feld: Bei 360px bleibt neben „Finden" kein Platz
     zum Tippen, und ein Suchfeld, in das drei Zeichen passen, ist keins. */
  .finder-satz-feld{
    flex-wrap:wrap; border-radius:var(--radius); padding:12px 14px;
  }
  .finder-satz-feld input[type="search"]{ flex:1 1 100%; order:2; padding:8px 0; }
  .finder-satz-feld .btn{ order:3; width:100%; margin-top:8px; }
}
/* ---- Die Freitextsuche ----------------------------------------------------

   Sie steht ueber den Kriteriengruppen und traegt deshalb Gold: Sie ist
   der Einstieg, nicht eine Gruppe unter fuenfen. Waere sie gleich
   gestaltet, uebersaehe man sie zwischen ihnen.
   --------------------------------------------------------------------------- */
/* ---- Die Begruendung ------------------------------------------------------

   Ein Satz je Treffer, direkt unter dem Namen. Er ist die Antwort auf
   „warum steht das hier" - deshalb steht er VOR dem Kurztext des Spiels
   und traegt eine Goldkante links, an der das Auge ihn in einer langen
   Liste wiederfindet.

   Kursiv waere die naheliegende Auszeichnung und hier falsch: Der Satz
   ist keine Nebenbemerkung, sondern das Ergebnis.
   --------------------------------------------------------------------------- */
.finder-begruendung{
  margin:10px 0 0; padding:9px 0 9px 14px;
  border-left:2px solid var(--kante-gold);
  font-size:14px; line-height:1.6; color:var(--text);
  max-width:var(--lese-breite);
}

/* Das Stichwort-Feld steht allein in "Eingrenzen", nicht in .finder-felder
   (das würde es auf 100px zusammenstauchen wollen wie Zahl-/Auswahlfelder). */
.finder-gruppe > label{ display:flex; flex-direction:column; gap:4px; font-size:13px; margin-bottom:12px; }
.finder-gruppe > label input[type="search"]{ width:100%; }

.finder-felder{ display:flex; flex-wrap:wrap; gap:12px; }
.finder-felder label{ display:flex; flex-direction:column; gap:4px; font-size:13px; flex:1 1 100px; }
.finder-felder input, .finder-felder select{ width:100%; }
.finder-felder small{ font-size:11px; color:var(--text-2); }

.finder-haken{ display:flex; flex-direction:column; gap:9px; }
.finder-haken label{ display:flex; align-items:center; gap:8px; font-size:13.5px; cursor:pointer; }
.finder-haken small{ color:var(--text-2); font-size:11.5px; }

.finder-absenden{ grid-column:1 / -1; display:flex; gap:10px; margin:0; }
.finder-zusammenfassung{ font-size:14px; margin:0 0 18px; }

/* ---------------------------------------------------------------------------
   Die Trefferliste
   ---------------------------------------------------------------------------
   Der erste Treffer wird hervorgehoben: Bei einer Empfehlung ist die
   Reihenfolge die Aussage, und ein Kasten, der aussieht wie die anderen,
   verschenkt sie.
   --------------------------------------------------------------------------- */
.finder-treffer{ list-style:none; padding:0; margin:0; display:flex; flex-direction:column; gap:12px; }
.finder-treffer-zeile{
  background:var(--oberflaeche); border:1px solid var(--border);
  border-radius:var(--radius); padding:16px 18px;
}
.finder-treffer-zeile.ist-erster{
  border-color:color-mix(in srgb, var(--akzent) 55%, var(--border));
  box-shadow:0 0 0 1px color-mix(in srgb, var(--akzent) 25%, transparent);
}
.finder-treffer-kopf{ display:flex; align-items:flex-start; gap:12px; }
.finder-treffer-kopf h2{ margin:0; font-size:17px; flex:1; }
.finder-treffer-kopf h2 small{ font-weight:400; color:var(--text-2); font-size:13px; margin-left:6px; }
/* Die Punktzahl erklaert die Reihenfolge. Ohne sie wirkt die Liste willkuerlich. */
.finder-punkte{
  flex:0 0 auto; font-family:'IBM Plex Mono',monospace; font-weight:700;
  font-size:13px; color:var(--bg); background:var(--akzent);
  border-radius:var(--radius-rund); min-width:26px; height:26px;
  display:flex; align-items:center; justify-content:center;
}
.finder-reihe{ font-size:11.5px; color:var(--text-2); margin:2px 0 0;
  font-family:'IBM Plex Mono',monospace; text-transform:uppercase; letter-spacing:.05em; }
.finder-kurztext{ font-size:13.5px; color:var(--text-2); margin:8px 0 0; line-height:1.6; }

.finder-zeiten{ display:flex; flex-wrap:wrap; gap:14px; margin-top:10px; font-size:12.5px; color:var(--text-2); }
.finder-zeiten strong{ color:var(--text); font-variant-numeric:tabular-nums; }

.finder-passt, .finder-fehlt{ display:flex; flex-wrap:wrap; gap:6px; margin:10px 0 0; }
.finder-marke{
  font-size:11.5px; font-weight:600; padding:4px 9px; border-radius:var(--radius-rund);
  border:1px solid var(--border);
}
.finder-marke-ja{
  color:var(--erfolg); border-color:color-mix(in srgb, var(--erfolg) 40%, transparent);
  background:color-mix(in srgb, var(--erfolg) 8%, transparent);
}
/* Was fehlt, wird nicht rot: Es ist keine Warnung, sondern eine Auskunft. */
.finder-marke-nein{ color:var(--text-2); }

/* ---------------------------------------------------------------------------
   Die Antwort in der Suchleiste
   --------------------------------------------------------------------------- */
.suche-antwort{
  background:var(--bg); border:1px solid color-mix(in srgb, var(--akzent) 40%, var(--border));
  border-radius:var(--radius); padding:16px 18px; margin-bottom:24px;
}
.suche-antwort-verstanden{ font-size:12px; color:var(--text-2); margin:0 0 10px; }
.suche-antwort-liste{ list-style:none; padding:0; margin:0 0 10px; display:flex; flex-direction:column; gap:7px; }
.suche-antwort-liste li{ display:flex; flex-wrap:wrap; gap:8px; align-items:baseline; font-size:14px; }
.suche-antwort-titel{
  font-family:'IBM Plex Mono',monospace; font-size:10.5px; font-weight:700;
  text-transform:uppercase; letter-spacing:.06em; color:var(--text-2);
  flex:0 0 auto; min-width:110px;
}
.suche-antwort-text{ flex:1; min-width:0; }

/* ===========================================================================
   SUCHFELD IM RPG EXPLORER
   ---------------------------------------------------------------------------
   Wer "Ultima" sucht, weiss nicht, ob es eine Waffe oder ein Zauber ist -
   genau deshalb sucht er. Das Feld steht deshalb ueber den Kategorien und
   nicht in einer davon.
   =========================================================================== */
/* DIE SUCHE WAR DA - SIE SAH NUR NICHT DANACH AUS.

   Ein 13,5-Pixel-Feld in der Farbe des Hintergrunds, mit einem
   duennen Rahmen und ohne Lupe: Es las sich wie eine Ueberschrift.
   Sie wurde deshalb als fehlend gemeldet, obwohl sie funktionierte.

   Groesser, mit Lupe, und beim Tippen faerbt sich der Rahmen. */
.inhalt-explorer-suche{ position:relative; margin-bottom:14px; }
.inhalt-explorer-suche input{
  width:100%; padding:12px 38px 12px 40px;
  border:1px solid var(--border); border-radius:10px;
  background:var(--oberflaeche); color:var(--text); font-size:15px;
  transition:border-color .15s, background .15s;
}
/* Die Lupe als Hintergrundbild - ein zusaetzliches Element im Markup
   waere ein Element, das jede Vorlage mitschleppen muesste. */
.inhalt-explorer-suche::before{
  content:""; position:absolute; left:14px; top:50%;
  width:15px; height:15px; margin-top:-7px; pointer-events:none;
  background:currentColor; color:var(--text-2); opacity:.65;
  -webkit-mask:var(--lupe) center/contain no-repeat;
  mask:var(--lupe) center/contain no-repeat;
}
.inhalt-explorer-suche input::placeholder{ color:var(--text-2); opacity:.9; }
.inhalt-explorer-suche input:focus{
  outline:none; border-color:var(--akzent); background:var(--bg);
  box-shadow:0 0 0 3px color-mix(in srgb, var(--akzent) 18%, transparent);
}
#inhalt-suche-leeren{
  position:absolute; right:6px; top:50%; transform:translateY(-50%);
  border:none; background:none; color:var(--text-2);
  font-size:19px; line-height:1; cursor:pointer; padding:2px 7px;
}
#inhalt-suche-leeren:hover{ color:var(--text); }

/* Die Art am Treffer: Ohne sie stuenden "Ultima" und "Ultima Waffe"
   untereinander, ohne dass man sieht, was davon was ist. */
.inhalt-explorer-listen-art{
  display:block; font-family:'IBM Plex Mono',monospace;
  font-size:10px; text-transform:uppercase; letter-spacing:.05em;
  color:var(--text-2); margin-top:2px;
}

/* ---------------------------------------------------------------------------
   ALLE KATEGORIEN - ZUGEKLAPPT
   ---------------------------------------------------------------------------
   Der Inhalt steht im HTML (Suchmaschinen und Zugriffe ohne JavaScript
   brauchen ihn), nimmt aber keinen Platz, solange ihn niemand aufklappt.
   --------------------------------------------------------------------------- */
.spiel-alle-kategorien > summary{
  cursor:pointer; font-size:13px; color:var(--text-2);
  list-style:none; user-select:none; padding:2px 0;
}
.spiel-alle-kategorien > summary::-webkit-details-marker{ display:none; }
.spiel-alle-kategorien > summary::before{ content:'▸ '; }
.spiel-alle-kategorien[open] > summary::before{ content:'▾ '; }
.spiel-alle-kategorien > summary:hover{ color:var(--text); }
.spiel-alle-kategorien[open] > summary{ margin-bottom:14px; }

/* ===========================================================================
   BUILDER-DASHBOARD
   ---------------------------------------------------------------------------
   Oben der Bestand, darunter die Luecken, darunter die Spiele. Die
   Reihenfolge ist die Antwort auf "wo mache ich weiter": erst wo stehe ich,
   dann was fehlt, dann woran arbeite ich.
   =========================================================================== */
.builder-dash-kopf{
  display:flex; flex-wrap:wrap; align-items:center; justify-content:space-between;
  gap:14px; margin-bottom:22px;
}
.builder-dash-kopf h1{ margin:0; }
.builder-dash-kopf p{ margin:0; display:flex; gap:8px; flex-wrap:wrap; }

.builder-dash-zahlen{
  display:grid; gap:10px; margin-bottom:32px;
  grid-template-columns:repeat(auto-fit, minmax(130px, 1fr));
}
.builder-dash-kachel{
  background:var(--bg); border:1px solid var(--border); border-radius:var(--radius);
  padding:14px 16px; display:flex; flex-direction:column; gap:3px;
  color:var(--text); transition:border-color .15s ease;
}
a.builder-dash-kachel:hover{ border-color:var(--akzent); }
.builder-dash-zahl{
  font-size:26px; font-weight:800; letter-spacing:-.02em; line-height:1.1;
  font-variant-numeric:tabular-nums;
}
.builder-dash-label{
  font-family:'IBM Plex Mono',monospace; font-size:10px; font-weight:600;
  text-transform:uppercase; letter-spacing:.06em; color:var(--text-2);
}

.builder-dash-titel{
  font-family:'IBM Plex Mono',monospace; font-size:11px; font-weight:700;
  text-transform:uppercase; letter-spacing:.08em; color:var(--text-2);
  margin:0 0 12px; padding-bottom:8px; border-bottom:1px solid var(--border);
}

/* Die Luecken sind eine Anzeige, kein Vorwurf - deshalb kein Rot. Ein
   Eintrag ohne Familie ist nicht falsch, viele brauchen keine. */
.builder-dash-luecken{ list-style:none; padding:0; margin:0 0 32px; display:flex; flex-direction:column; gap:8px; }
.builder-dash-luecken li{
  display:flex; align-items:flex-start; gap:14px;
  background:var(--bg); border:1px solid var(--border); border-radius:10px;
  padding:11px 14px;
}
.builder-dash-luecke-zahl{
  font-size:18px; font-weight:700; font-variant-numeric:tabular-nums;
  color:var(--warnung); flex:0 0 auto; min-width:60px; text-align:right;
}
.builder-dash-luecke-text{ display:flex; flex-direction:column; gap:2px; min-width:0; }
.builder-dash-luecke-text strong{ font-size:13.5px; font-weight:600; }
.builder-dash-luecke-text small{ font-size:12px; color:var(--text-2); line-height:1.5; }

/* ===========================================================================
   REITER IN "MEIN RPG PORTAL"
   ---------------------------------------------------------------------------
   Meine Spiele, Nachrichten, Konto. Drei getrennte Seiten, fuer den
   Besucher ein Bereich.

   Sie waren es vorher nicht: Im Kopf war "Mein Konto" entfernt worden, weil
   es "als Reiter in Mein RPGPortal" liegen sollte - nur gab es die Reiter
   nie. /konto war damit aus dem gesamten Portal nicht verlinkt.
   =========================================================================== */
.mein-reiter{
  display:flex; flex-wrap:wrap; gap:2px;
  border-bottom:1px solid var(--border);
  margin:0 0 26px;
}
.mein-reiter a{
  padding:9px 16px; font-size:13.5px; color:var(--text-2);
  border-bottom:2px solid transparent; margin-bottom:-1px;
  transition:color .15s ease, border-color .15s ease;
}
.mein-reiter a:hover{ color:var(--text); }
.mein-reiter a.ist-aktiv{
  color:var(--text); font-weight:600; border-bottom-color:var(--akzent);
}

/* Der Loeschweg in der Spieleliste: eine Farbe, kein Knopf. Ein roter Knopf
   in einer Tabellenzeile, zwei Pixel neben "bearbeiten", ist eine Frage der
   Zeit - der Verweis fuehrt deshalb erst auf die Angabenseite, wo der Name
   getippt werden muss. */
.uebersicht-loeschweg{ color:var(--text-2); }
.uebersicht-loeschweg:hover{ color:var(--fehler); }

/* Ueber die Sprungmarke aufgerufen: aufgeklappt, damit man nicht noch einmal
   klicken muss. Der Name ist trotzdem zu tippen. */
.builder-loeschen:target{
  border:1px solid color-mix(in srgb, var(--fehler) 45%, transparent);
  border-radius:10px; padding:14px 16px;
  background:color-mix(in srgb, var(--fehler) 6%, transparent);
}

/* ===========================================================================
   BUILDER: ARBEITEN STATT SUCHEN
   ---------------------------------------------------------------------------
   Was hier steht, macht den Builder nicht huebscher, sondern schneller. Die
   drei Spalten und ihre Farben standen schon; es fehlten die Kleinigkeiten,
   an denen man beim taeglichen Eintragen haengenbleibt.
   =========================================================================== */

/* ---------------------------------------------------------------------------
   Der Kopf bleibt stehen
   ---------------------------------------------------------------------------
   Bei zweihundert Gegnern scrollt man weit. Ohne klebenden Kopf weiss man
   nach dreissig Zeilen nicht mehr, in welchem Spiel man ist - und der Weg
   zurueck ist ein Griff zum Zurueck-Knopf.
   --------------------------------------------------------------------------- */
.builder-kopf{
  position:sticky; top:0; z-index:20;
  background:var(--bg);
  padding:14px 0 12px;
  margin-bottom:18px;
  border-bottom:1px solid var(--border);
}
.builder-kopf h1{ margin:2px 0 6px; font-size:26px; letter-spacing:-.02em; }
.builder-kopf-weg{ margin:0; font-size:12px; }
.builder-kopf-weg a{ color:var(--text-2); }
.builder-kopf-weg a:hover{ color:var(--akzent); }

.builder-kopf-zahlen{
  display:flex; flex-wrap:wrap; align-items:center; gap:14px;
  margin:0 0 8px; font-size:12.5px; color:var(--text-2);
}
.builder-kopf-zahlen strong{
  font-size:17px; color:var(--text); font-variant-numeric:tabular-nums;
}
.builder-kopf-wege{ display:flex; flex-wrap:wrap; gap:14px; margin:0; font-size:13px; }

/* ---------------------------------------------------------------------------
   Filter ueber der Eintragsliste
   ---------------------------------------------------------------------------
   Die Liste steht schon im HTML. Ein Feld, das nur ausblendet, ist deshalb
   schneller als jede Suche, die nachlaedt.
   --------------------------------------------------------------------------- */
.builder-filter{ position:relative; margin-bottom:10px; }
.builder-filter input{
  width:100%; padding:7px 10px; font-size:13px;
  border:1px solid var(--border); border-radius:var(--radius-klein);
  background:var(--bg); color:var(--text);
}
.builder-filter input:focus{
  outline:none; border-color:var(--akzent);
  box-shadow:0 0 0 3px color-mix(in srgb, var(--akzent) 18%, transparent);
}
.builder-filter-zahl{
  position:absolute; right:10px; top:50%; transform:translateY(-50%);
  font-family:'IBM Plex Mono',monospace; font-size:10.5px; color:var(--text-2);
  background:var(--bg); padding-left:6px; pointer-events:none;
}

/* "Alle auswaehlen" ueber der Eintragsliste, fuer die Massenbearbeitung
   bei hunderten Eintraegen - selbe Zeilenhoehe wie eine einzelne Zeile
   darunter, damit es wie deren Kopf wirkt, nicht wie ein eigener Block. */
.builder-alle-auswaehlen{
  display:flex; align-items:center; gap:6px;
  padding:4px 2px 8px; font-size:12.5px; color:var(--text-2);
  cursor:pointer; user-select:none;
}

/* ---------------------------------------------------------------------------
   Der Datensatz: Bloecke, die man auseinanderhalten kann
   ---------------------------------------------------------------------------
   Vorher war die rechte Spalte eine lange Kette gleich aussehender Felder.
   Wer den Angriffswert sucht, liest dabei die Verknuepfungen mit.
   --------------------------------------------------------------------------- */
.builder-datensatz .inhalt-karte-block{
  padding-top:18px; margin-top:18px;
  border-top:1px solid var(--border);
}
.builder-datensatz .inhalt-karte-block:first-of-type{ border-top:none; margin-top:8px; }

.builder-feldreihe{ display:flex; flex-wrap:wrap; gap:14px; margin-bottom:14px; }
.builder-feldreihe > label{ flex:1 1 190px; min-width:0; display:flex; flex-direction:column; gap:5px; font-size:13px; }
.builder-feldreihe input[type="text"],
.builder-feldreihe input[type="number"],
.builder-feldreihe select,
.builder-feldreihe textarea{
  width:100%; padding:8px 11px; font-size:13.5px;
  border:1px solid var(--border); border-radius:var(--radius-klein);
  background:var(--bg); color:var(--text);
}
.builder-feldreihe input:focus,
.builder-feldreihe select:focus,
.builder-feldreihe textarea:focus{
  outline:none; border-color:var(--akzent);
  box-shadow:0 0 0 3px color-mix(in srgb, var(--akzent) 18%, transparent);
}
.builder-feldreihe small{ font-size:11px; color:var(--text-2); }

/* ---------------------------------------------------------------------------
   Zeilen mit Beziehungen und Wirkungen
   --------------------------------------------------------------------------- */
.eintrag-beziehung-zeile{
  display:flex; flex-wrap:wrap; gap:8px; margin-bottom:7px;
}
.eintrag-beziehung-zeile select{ flex:1 1 150px; min-width:0; }
.eintrag-beziehung-zeile input[type="text"]{ flex:2 1 220px; min-width:0; }
/* Freiwillig und selten ausgefuellt - tritt deshalb schmaler auf als das
   Namensfeld, nicht gleichrangig daneben. */
.eintrag-beziehung-zeile .eintrag-beziehung-bedingung{ flex:1 1 170px; }
/* Menge und Chance - zwei Zahlen, deshalb schmal genug fuer eine Zeile
   nebeneinander statt eine ganze Formularbreite fuer eine Ziffer. */
.eintrag-beziehung-zeile .eintrag-beziehung-menge,
.eintrag-beziehung-zeile .eintrag-beziehung-chance{ flex:0 1 90px; }

/* "+ weitere Zeile" - unter dem letzten Feld, nicht daneben: Es gehoert
   zum ganzen Block der Zeilen, nicht zu einer einzelnen. */
.eintrag-beziehung-mehr{ margin-top:2px; margin-bottom:10px; }

/* ---- Vorhandenes waehlen statt tippen -------------------------------------

   Das vierte Feld in der Verknuepfungszeile. Es schreibt in das Textfeld
   daneben und sendet nichts Eigenes - zwei Felder, die dasselbe meinen,
   braeuchten eine Vorrangregel, die niemand sieht.

   Es steht zuletzt und schmaler als das Textfeld: Es ist die Abkuerzung,
   nicht der Hauptweg. Der Hauptweg bleibt das Tippen, weil er auch das
   anlegt, was fehlt.
   --------------------------------------------------------------------------- */
.eintrag-beziehung-zeile .eintrag-beziehung-vorhanden{
  flex:1 1 200px; color:var(--text-2);
}
.eintrag-beziehung-zeile .eintrag-beziehung-vorhanden:focus{ color:var(--text); }

/* ---- Vermutungen beurteilen -----------------------------------------------

   Zwei Knoepfe nebeneinander. Der zweite traegt die Gefahrenfarbe - nicht
   weil er zerstoert, sondern weil er eine Entscheidung festschreibt.

   „Stimmt nicht" loescht die Zeile NICHT: Sie bleibt als verworfen stehen,
   sonst schluege die Ableitung dieselbe Vermutung beim naechsten Lauf
   wieder vor.
   --------------------------------------------------------------------------- */
.vermutung-urteil{ display:flex; gap:6px; margin:0; flex-wrap:wrap; }

/* ---- Die Pruefungsseite ---------------------------------------------------

   Fehler und Warnungen stehen als Zeilen in ihrer Tabellenzelle - mehrere
   je Eintrag moeglich, deshalb keine einzelne Zeile, sondern gestapelt.
   Die Farbe traegt den Unterschied: Rot ist verpflichtend, Bernstein nicht.
   --------------------------------------------------------------------------- */
.pruefung-zeile{
  font-size:13px; line-height:1.6; margin-bottom:4px;
  padding-left:14px; position:relative;
}
.pruefung-zeile:last-child{ margin-bottom:0; }
.pruefung-zeile::before{
  content:''; position:absolute; left:0; top:7px;
  width:6px; height:6px; border-radius:50%;
}
.pruefung-zeile.ist-fehler{ color:var(--text); }
.pruefung-zeile.ist-fehler::before{ background:var(--fehler); }
.pruefung-zeile.ist-warnung{ color:var(--text-2); }
.pruefung-zeile.ist-warnung::before{ background:var(--warnung); }

/* ---------------------------------------------------------------------------
   Loeschdialog: was auf den Eintrag zeigt (§22, App\Wissen\Loeschen::
   abhaengigkeiten()). Bernstein wie jede andere Warnung, die nicht
   blockiert - loeschen laesst sich trotzdem, aber informiert.
   --------------------------------------------------------------------------- */
.builder-loeschen p.warnung{
  color:var(--warnung); font-weight:600; margin:0 0 6px;
}
.loesch-abhaengigkeiten{
  margin:0 0 12px; padding-left:20px; font-size:13px; color:var(--text-2);
}
.loesch-abhaengigkeit-art{ color:var(--text-3, var(--text-2)); }

/* ---------------------------------------------------------------------------
   Massenbearbeitung (§24, App\Wissen\BulkBearbeitung). Vier Radios mit
   ihrem jeweiligen Auswahlfeld daneben - eine Zeile je Aktion, damit klar
   bleibt, welches Feld zu welchem Radio gehoert.
   --------------------------------------------------------------------------- */
.builder-masse{ margin-top:10px; }
.builder-masse-zeile{
  display:flex; align-items:center; gap:8px;
  padding:4px 0; font-size:13px; cursor:pointer;
}
.builder-masse-zeile select{ margin-left:auto; max-width:60%; }

/* ---------------------------------------------------------------------------
   Weltbaum (§14, Beziehungen::weltbaum()): Welt → Region → Dungeon → Raum
   aus den vorhandenen Ortsbeziehungen, verschachtelt statt als Kette.
   --------------------------------------------------------------------------- */
.weltbaum{ margin:14px 0 20px; }
.weltbaum-liste{
  list-style:none; margin:6px 0 0; padding-left:18px;
  border-left:1px solid var(--border);
}
.weltbaum > .weltbaum-liste{ border-left:none; padding-left:0; }
.weltbaum-liste li{ margin:4px 0; }


/* ---- Die Uebersicht der Verknuepfungen im Builder --------------------------

   Sie zeigte nur Namen - und die fehlten, weil die falsche Spalte gelesen
   wurde. Jetzt steht dabei, WAS das Ziel ist, welche Angaben daran haengen
   und ob es ueberhaupt oeffentlich ist.

   Das Letzte ist der Grund fuer die Kennzeichnung: Eine Vermutung steht in
   dieser Liste, aber nicht auf der Spielseite. Ohne den Hinweis suchte man
   den Fehler an der falschen Stelle.
   --------------------------------------------------------------------------- */
.eintrag-beziehungen{
  display:flex; flex-direction:column; gap:10px;
  margin:0 0 20px; padding:0; list-style:none;
}

/* Die Art des Ziels: „Kyros" allein sagt nicht, ob es ein Ort oder ein
   Charakter ist - und beides kann so heissen. */
.eintrag-beziehungen .karte-ziel small{
  font-size:10.5px; color:var(--text-2);
  text-transform:uppercase; letter-spacing:.05em;
}

/* Eine Vermutung sieht anders aus, weil sie etwas anderes ist. Gestrichelt
   und nicht rot: Sie ist kein Fehler, sie ist unfertig. */
.karte-ziel.ist-vermutung{
  border-style:dashed;
  border-color:color-mix(in srgb, var(--warnung) 45%, var(--border));
}
.ist-vermutung-marke{
  color:var(--warnung) !important;
  text-transform:none !important; letter-spacing:0 !important;
}

/* Das Kreuz zum Entfernen. Es steht AN der Zeile und nicht in einer
   zweiten Liste: Wer eine falsche Verknuepfung sieht, will sie dort
   loswerden, wo er sie sieht.

   Ruhig, bis man darauf zeigt - ein dauerhaft rotes Kreuz an jeder Zeile
   macht aus einer Uebersicht eine Warnliste. */
.karte-ziel-weg{
  background:none; border:none; padding:0 0 0 4px; margin-left:2px;
  color:var(--text-2); cursor:pointer;
  font-family:inherit; font-size:14px; line-height:1;
  transition:color var(--dauer) var(--kurve);
}
.karte-ziel-weg:hover{ color:var(--fehler); }
.eintrag-beziehung-zeile select,
.eintrag-beziehung-zeile input[type="text"]{
  padding:7px 10px; font-size:13px;
  border:1px solid var(--border); border-radius:var(--radius-klein);
  background:var(--bg); color:var(--text);
}

@media (max-width:900px){
  /* Klebende Elemente auf einem schmalen Bildschirm fressen die halbe
     Hoehe. Dort ist Scrollen das kleinere Uebel. */
  .builder-kopf{ position:static; }
  .builder-formular-fuss{ position:static; background:none; }
}

/* Der Block "Schon im Portal" stand hier - sechs Spielkacheln unter dem
   Blickfang. Er ist mit den Kennzahlen und den drei Karten von der
   Startseite verschwunden: Sie sagt jetzt in einem Satz, worum es geht,
   statt vorzurechnen, wie gross sie ist. */

/* Der Farbpunkt am Element. Die Farbe kommt aus dem Katalog, nicht aus dem
   Stylesheet - ein neues Element bringt sie mit. */
.stammdaten-farbe{
  display:inline-block; width:11px; height:11px; border-radius:50%;
  margin-right:7px; vertical-align:baseline;
  border:1px solid color-mix(in srgb, var(--text) 25%, transparent);
}
.stammdaten-anlegen input[type="color"]{
  width:44px; height:34px; padding:2px; cursor:pointer;
  border:1px solid var(--border); border-radius:var(--radius-klein); background:var(--oberflaeche);
}

/* ===========================================================================
   MERKMALE - die Felder, die im Builder erscheinen
   ---------------------------------------------------------------------------
   Sie entstanden bisher nur ueber SQL. "Feuerbonus, Prozent, bei Waffen" ist
   aber eine fachliche Entscheidung und keine technische.
   =========================================================================== */
.merkmal-anlegen{
  border:1px solid var(--border); border-radius:var(--radius);
  padding:0 16px; margin-bottom:22px; background:var(--bg);
}
.merkmal-anlegen > summary{
  cursor:pointer; padding:13px 0; font-size:14px; font-weight:600;
  list-style:none; user-select:none; color:var(--akzent);
}
.merkmal-anlegen > summary::-webkit-details-marker{ display:none; }
.merkmal-anlegen[open] > summary{ border-bottom:1px solid var(--border); margin-bottom:16px; }
.merkmal-anlegen form{ padding-bottom:16px; }

.merkmal-schalter{ display:flex; flex-direction:column; gap:9px; margin:4px 0 16px; }
.merkmal-schalter label{
  display:flex; align-items:baseline; gap:8px; font-size:13.5px; cursor:pointer;
}
.merkmal-schalter small{ color:var(--text-2); font-size:11.5px; }

.merkmal-tabelle td{ vertical-align:top; }
/* Der Schluessel steht klein dabei: Er laesst sich nicht mehr aendern, und
   wer ihn in einer Abfrage braucht, findet ihn hier statt in phpMyAdmin. */
.merkmal-schluessel{
  font-family:'IBM Plex Mono',monospace; font-size:10.5px;
  color:var(--text-2); background:var(--bg);
  padding:1px 5px; border-radius:4px;
}
/* Ein allgemeines Merkmal gilt bei JEDER Inhaltsart - wer es hier aendert,
   aendert es ueberall. Das darf nicht aussehen wie die anderen Zeilen. */
.merkmal-tabelle tr.ist-allgemein{
  background:color-mix(in srgb, var(--akzent) 4%, transparent);
}
.merkmal-pflicht{
  display:flex; align-items:center; gap:5px;
  font-size:12px; color:var(--text-2); white-space:nowrap;
}
.merkmal-tabelle .stammdaten-aktionen form{ flex-wrap:wrap; }
.merkmal-tabelle .stammdaten-aktionen input[type="text"]{ width:150px; }

/* Die Vorbildauswahl steht neben dem Anlegen-Feld, nicht darunter: Sie ist
   eine Variante desselben Vorgangs und keine zweite Handlung. */
.builder-vorbild{
  flex:1 1 100%; margin-top:6px; padding:6px 9px; font-size:12.5px;
  border:1px solid var(--border); border-radius:var(--radius-klein);
  background:var(--bg); color:var(--text-2);
}
.builder-vorbild:focus{ color:var(--text); }


/* ===========================================================================
   COMMUNITY UND SPIELVERGLEICH
   ===========================================================================
   Beide Seiten leben davon, dass zwei Dinge NEBENEINANDER stehen und man
   sie in einem Blick erfasst. Untereinander waeren sie zwei Listen, und
   der Vergleich passierte im Kopf des Lesers statt auf dem Bildschirm.

   Auf schmalen Bildschirmen geht das nicht - dort wird gestapelt. Ein
   Vergleich in zwei 140-Pixel-Spalten ist keiner.
   --------------------------------------------------------------------------- */

/* Fuer Bildschirmleser da, fuer Augen nicht. Es gab bisher nur eine
   Sonderform im Einrichtungs-Assistenten; hier steht sie allgemein. */
.sr-only{
  position:absolute; width:1px; height:1px; padding:0; margin:-1px;
  overflow:hidden; clip:rect(0,0,0,0); white-space:nowrap; border:0;
}

/* ---- Spiel der Woche ----------------------------------------------------- */

/* Die Schlagzeile der Seite - und sie sah aus wie jede andere Kachel:
   derselbe Rand, dieselbe Flaeche, keine Erhebung. Jetzt traegt sie den
   Verlauf mit Goldstich, der im Portal „das hier ist der Hauptgegenstand"
   bedeutet (`.stat-karte`). */
/* Flaeche, Radius und Kante kommen aus `.tafel-gehoben` - die Vorlage
   setzt beide Klassen. Hier bleibt nur, was wirklich nur diese Kachel
   betrifft: die Aufteilung in Bild und Text. */
.woche-karte{ display:flex; gap:26px; align-items:flex-start; }

/* Die Frist rechts neben der Belegzahl. Auf der Startseite steht sie
   dort, weil es keinen Blockkopf gibt, der sie tragen koennte. */
.woche-karte-frist{
  float:right; color:var(--akzent); font-weight:600;
}
/* `contain` statt `cover` (2026-09-12): Ein Spiellogo ist breit, der
   Kasten hochkant - `cover` schnitt ihm links und rechts die Haelfte ab.
   Die Kastengroesse bleibt, damit die Karte nicht springt; das Bild passt
   sich hinein und bekommt etwas Luft. */
.woche-karte img{
  width:168px; flex:0 0 168px; aspect-ratio:3/4; object-fit:contain;
  padding:10px; border-radius:var(--radius); background:var(--bg);
  border:1px solid var(--border);
  box-shadow:var(--erhebung);
}
.woche-karte-text{ min-width:0; }
/* Auszeichnungsschrift: Der Titel ist hier ein Eigenname und kein Feldname. */
.woche-karte h3{
  margin:0 0 8px; font-size:clamp(22px, 2vw, 27px);
  font-family:var(--schrift-display); font-weight:600; line-height:1.2;
}
.woche-karte h3 a{
  color:var(--text); text-decoration:none;
  transition:color var(--dauer) var(--kurve);
}
.woche-karte h3 a:hover{ color:var(--akzent); }
.woche-karte-zeile{
  margin:0 0 12px; font-family:var(--schrift-mono);
  font-size:11.5px; color:var(--text-2);
  text-transform:uppercase; letter-spacing:.06em;
}
.woche-karte-text p{
  margin:0 0 14px; font-size:15px; line-height:1.65;
  max-width:var(--lese-breite);
}
/* Die Zahl ist Beleg, nicht Aussage - sie steht klein und zuletzt, jetzt
   durch eine Haarlinie vom Text abgesetzt statt einfach darunter. */
.woche-karte-zahl{
  margin:0; padding-top:12px; border-top:1px solid var(--kante-gold);
  font-family:var(--schrift-mono); font-size:11.5px; color:var(--text-2);
  font-variant-numeric:tabular-nums;
}

/* ---- Das Paar der Woche -------------------------------------------------- */

.paar-karte{
  display:grid; grid-template-columns:1fr auto 1fr; gap:18px;
  align-items:center; margin-bottom:18px;
}
.paar-seite{
  display:flex; flex-direction:column; align-items:center; gap:10px;
  padding:18px; text-align:center; text-decoration:none; color:var(--text);
  border:1px solid var(--border); border-radius:var(--radius);
  background:var(--oberflaeche);
  transition:border-color .15s, color .15s;
}
.paar-seite:hover{
  border-color:var(--kante-gold); color:var(--akzent);
  box-shadow:var(--erhebung); transform:translateY(-2px);
}
.paar-seite img{
  width:118px; aspect-ratio:3/4; object-fit:contain;
  padding:8px; border-radius:var(--radius-klein); background:var(--bg);
}
.paar-seite span{ font-weight:600; font-size:15px; }
/* „oder" stand als graues Woertchen dazwischen. Gemeint ist eine
   Entscheidung - als Medaillon ist es der Punkt, an dem sich die beiden
   Seiten treffen, statt ein Fueller im Abstand. */
.paar-gegen{
  display:flex; align-items:center; justify-content:center;
  width:44px; height:44px; border-radius:50%;
  font-family:var(--schrift-mono); font-size:10.5px; font-weight:700;
  color:var(--akzent); text-transform:uppercase; letter-spacing:.06em;
  border:1px solid var(--kante-gold);
  background:color-mix(in srgb, var(--akzent) 10%, var(--oberflaeche));
  box-shadow:var(--erhebung);
}

/* ---- Umfrage ------------------------------------------------------------- */

.umfrage-rest{
  margin-left:8px; font-family:'IBM Plex Mono',monospace;
  font-size:12px; color:var(--text-2);
}
.umfrage fieldset{ border:none; padding:0; margin:0 0 18px; }

/* Die ganze Zeile ist anklickbar und nicht nur der kleine Kreis: Wer auf
   einem Telefon abstimmt, trifft einen Kreis von 14 Pixeln nicht. */
.umfrage-option{
  display:grid; grid-template-columns:auto 1fr 110px auto;
  gap:12px; align-items:center;
  padding:12px 15px; margin-bottom:8px; cursor:pointer;
  border:1px solid var(--border); border-radius:var(--radius);
  background:var(--oberflaeche);
  box-shadow:var(--erhebung);
  transition:border-color var(--dauer) var(--kurve),
             background var(--dauer) var(--kurve);
}
.umfrage-option:hover{ border-color:var(--kante-gold); }
.umfrage-option.ist-gewaehlt{
  border-color:var(--akzent);
  background:color-mix(in srgb, var(--akzent) 7%, transparent);
}
.umfrage-name{ font-size:15px; min-width:0; }
/* Woher der fuenfte Vorschlag kommt, gehoert dazu - sonst sieht er aus wie
   eine Auswahl der Redaktion. */
.umfrage-herkunft{
  display:block; font-size:11.5px; color:var(--akzent); font-weight:600;
}
/* Der Balken lag flach auf der Kachel und war kaum vom Rand zu
   unterscheiden. Eine eingelassene Rinne mit einem Verlauf darin macht
   aus zwei Grautoenen eine ablesbare Laenge. */
.umfrage-balken{
  display:block; height:8px; border-radius:var(--radius-rund);
  background:var(--bg); overflow:hidden;
  border:1px solid var(--border);
}
.umfrage-balken > span{
  display:block; height:100%; border-radius:var(--radius-rund);
  background:linear-gradient(90deg, var(--akzent-tief), var(--akzent));
  transition:width .45s var(--kurve);
}
/* Tabellenziffern: Ohne sie tanzen die Prozentzahlen von Zeile zu Zeile,
   weil eine 1 schmaler ist als eine 8 - und eine Umfrage soll man
   untereinander vergleichen koennen. */
.umfrage-zahl{
  font-family:var(--schrift-mono); font-size:14px;
  text-align:right; white-space:nowrap;
  font-variant-numeric:tabular-nums;
}
.umfrage-zahl small{ display:block; font-size:11px; color:var(--text-2); }

.umfrage-fuss{ display:flex; align-items:center; gap:14px; margin:0 0 34px; }
.umfrage-fuss small{ color:var(--text-2); font-size:13px; }

.umfrage-wunsch{
  padding:22px 24px; border-radius:var(--radius-gross);
  border:1px solid var(--kante-gold);
  background:linear-gradient(165deg,
    var(--oberflaeche) 0%,
    color-mix(in srgb, var(--oberflaeche) 90%, var(--akzent) 6%) 100%);
  box-shadow:var(--erhebung);
}
.umfrage-wunsch h3{ margin:0 0 6px; font-size:16px; }
.umfrage-wunsch > p{ margin:0 0 14px; font-size:14px; color:var(--text-2); }
.umfrage-wunsch label{
  display:block; margin-bottom:6px; font-size:13px; font-weight:600;
}
.umfrage-wunsch input[type="text"]{
  width:100%; max-width:340px; padding:8px 11px; margin-bottom:12px;
  border:1px solid var(--border); border-radius:var(--radius-klein);
  background:var(--bg); color:var(--text); font-size:14px;
}
.umfrage-wunsch .hinweis{ margin:12px 0 0; font-size:12.5px; }

/* ---- Was gesucht wurde --------------------------------------------------- */

.such-wolke{ display:flex; flex-wrap:wrap; gap:8px; list-style:none; padding:0; margin:0; }
.such-wolke li{
  display:flex; align-items:center; gap:7px;
  padding:6px 12px; border:1px solid var(--border); border-radius:var(--radius-rund);
  background:var(--bg); font-size:13.5px;
  transition:border-color var(--dauer) var(--kurve);
}
/* Die Wolke sitzt IN einer Kachel - auf `--oberflaeche` waere sie darauf
   nicht zu sehen gewesen. Deshalb hier `--bg`: eingelassen statt
   aufgelegt. */
.such-wolke li:hover{ border-color:var(--kante-gold); }
.such-wolke a{
  color:var(--text); text-decoration:none;
  transition:color var(--dauer) var(--kurve);
}
.such-wolke a:hover{ color:var(--akzent); }
.such-wolke small{
  font-family:var(--schrift-mono); font-size:11px; color:var(--text-2);
  font-variant-numeric:tabular-nums;
}

/* ---- Der Hinweis in der Spieleliste -------------------------------------- */

/* Klein, in Akzentfarbe, ohne Kasten. Ein Abzeichen mit Hintergrund wuerde
   in einer Liste aus dreissig Zeilen das Auge an genau eine binden - und
   die Liste ist zum Durchgehen da, nicht zum Hinschauen. */
.spiel-der-woche-hinweis{
  font-size:11px; font-weight:600; letter-spacing:.04em;
  text-transform:uppercase; color:var(--akzent); text-decoration:none;
  white-space:nowrap;
}
.spiel-der-woche-hinweis:hover{ text-decoration:underline; }

/* ---- Vergleichsseite ----------------------------------------------------- */

.vergleich-ueberzeile{
  font-family:'IBM Plex Mono',monospace; font-size:11.5px; font-weight:600;
  color:var(--text-2); text-transform:uppercase; letter-spacing:.08em;
  margin:0 0 8px;
}
.vergleich h1{ margin:0 0 28px; }
.vergleich-gegen{ color:var(--text-2); font-weight:400; }

.vergleich-koepfe{
  display:grid; grid-template-columns:1fr 1fr; gap:20px; margin-bottom:28px;
}
.vergleich-kopf{
  display:flex; gap:14px; align-items:flex-start;
  padding:16px; border:1px solid var(--border); border-radius:var(--radius);
  background:var(--oberflaeche);
}
.vergleich-kopf img{
  width:84px; flex:0 0 84px; aspect-ratio:3/4; object-fit:contain;
  padding:6px; border-radius:6px; background:var(--bg);
}
.vergleich-kopf h2{ margin:0 0 6px; font-size:17px; }
.vergleich-kopf h2 a{ color:var(--text); text-decoration:none; }
.vergleich-kopf h2 a:hover{ color:var(--akzent); }
.vergleich-kopf p{ margin:0; font-size:13.5px; color:var(--text-2); }

.vergleich-tabelle{
  width:100%; border-collapse:collapse; margin-bottom:20px; font-size:14.5px;
}
.vergleich-tabelle th,
.vergleich-tabelle td{
  padding:11px 14px; text-align:left; vertical-align:top;
  border-bottom:1px solid var(--border);
}
.vergleich-tabelle thead th{
  font-size:12px; text-transform:uppercase; letter-spacing:.05em;
  color:var(--text-2);
}
.vergleich-tabelle tbody th{
  width:190px; font-weight:600; color:var(--text-2); font-size:13.5px;
}
/* Uebereinstimmung, nicht Sieg: eine ruhige Tönung ueber die ganze Zeile,
   keine Markierung an einer der beiden Spalten. */
.vergleich-tabelle tr.ist-gleich{
  background:color-mix(in srgb, var(--akzent) 5%, transparent);
}

/* ---- Schmale Bildschirme ------------------------------------------------- */

@media (max-width: 760px){
  .woche-karte{ flex-direction:column; }
  .woche-karte img{ width:120px; flex:none; }

  /* Aus dem Nebeneinander wird ein Untereinander - mit dem "oder"
     dazwischen, damit die Beziehung der beiden erhalten bleibt. */
  .paar-karte{ grid-template-columns:1fr; }
  .paar-gegen{ text-align:center; }

  .vergleich-koepfe{ grid-template-columns:1fr; }

  .umfrage-option{
    grid-template-columns:auto 1fr auto;
    grid-template-areas:"radio name zahl" ". balken balken";
  }
  .umfrage-option input{ grid-area:radio; }
  .umfrage-name{ grid-area:name; }
  .umfrage-zahl{ grid-area:zahl; }
  .umfrage-balken{ grid-area:balken; }

  /* Die Tabelle bleibt eine Tabelle und wird nicht zu Kaertchen umgebaut:
     Der Vergleich lebt davon, dass beide Werte auf einer Zeile stehen.
     Schmaler ja, umgestellt nein. */
  .vergleich-tabelle{ font-size:13.5px; }
  .vergleich-tabelle th,
  .vergleich-tabelle td{ padding:9px 8px; }
  .vergleich-tabelle tbody th{ width:auto; }
}
/* Das Vergleichsfeld auf der Spielseite: eine Zeile, kein Kasten. Es ist
   eine Nebenhandlung neben "Zum RPG Explorer" - und darf deshalb nicht
   aussehen wie ein eigener Abschnitt. */
.spiel-vergleich-wahl{
  display:flex; align-items:center; gap:8px; flex-wrap:wrap;
}
.spiel-vergleich-wahl label{
  font-size:13px; color:var(--text-2); white-space:nowrap;
}
.spiel-vergleich-wahl select{
  padding:7px 10px; max-width:220px;
  border:1px solid var(--border); border-radius:var(--radius-klein);
  background:var(--bg); color:var(--text); font-size:14px;
}


/* ===========================================================================
   ADMIN -> COMMUNITY
   ===========================================================================
   Zwei Spalten, weil beide Seiten dieselbe Form haben: links das Ergebnis
   oder die Liste, rechts die Herkunft oder die Bearbeitung. Untereinander
   muesste man scrollen, um zwei Dinge zu vergleichen, die
   zusammengehoeren.
   --------------------------------------------------------------------------- */

.gemeinschaft-zwei{
  display:grid; grid-template-columns:1fr 1fr; gap:20px; margin-bottom:8px;
}
.gemeinschaft-block{
  padding:18px 20px; border:1px solid var(--border);
  border-radius:var(--radius); background:var(--oberflaeche);
}
.gemeinschaft-block h3{ margin:0 0 8px; font-size:14px; }
.gemeinschaft-block > .hinweis{ margin:0 0 12px; }

/* Das Ergebnis gross - es ist die Antwort auf die Frage, wegen der man die
   Seite geoeffnet hat. */
.gemeinschaft-gross{
  margin:0 0 6px; font-size:19px; font-weight:600; line-height:1.3;
}
.gemeinschaft-gross a{ color:var(--text); text-decoration:none; }
.gemeinschaft-gross a:hover{ color:var(--akzent); }
.gemeinschaft-gegen{
  font-size:13px; font-weight:400; color:var(--text-2);
  margin:0 4px;
}

.gemeinschaft-form{
  display:flex; align-items:center; gap:8px; flex-wrap:wrap; margin-top:14px;
}
.gemeinschaft-form label{
  font-size:12.5px; color:var(--text-2); white-space:nowrap;
}
.gemeinschaft-form select,
.gemeinschaft-form input[type="text"]{
  flex:1 1 160px; min-width:0; padding:7px 10px;
  border:1px solid var(--border); border-radius:var(--radius-klein);
  background:var(--bg); color:var(--text); font-size:13.5px;
}

/* Steht der Beitrag draussen oder nicht? Die Frage stellt sich jedes Mal
   beim Oeffnen, nicht nur nach dem Speichern - also steht die Antwort am
   Formular und nicht in einer Meldung, die beim naechsten Klick weg ist. */
.news-sichtbarkeit{
  margin:18px 0 0; padding:10px 13px; border-radius:9px;
  font-size:13px; line-height:1.45;
  border:1px solid var(--border); background:var(--oberflaeche);
}
.news-sichtbarkeit.ist-sichtbar{
  color:var(--erfolg);
  border-color:color-mix(in srgb, var(--erfolg) 35%, var(--border));
  background:color-mix(in srgb, var(--erfolg) 7%, transparent);
}
/* Bernstein, nicht Rot: Ein Entwurf ist kein Fehler, sondern ein Zustand,
   den man kennen muss. */
.news-sichtbarkeit.ist-verborgen{
  color:var(--warnung);
  border-color:color-mix(in srgb, var(--warnung) 35%, var(--border));
  background:color-mix(in srgb, var(--warnung) 7%, transparent);
}

/* ---- Umfragen ------------------------------------------------------------ */

.umfragen-flaeche{
  display:grid; grid-template-columns:clamp(360px, 24vw, 520px) minmax(0, 1fr); gap:24px;
}
.umfragen-liste h2,
.umfragen-offen h2{ margin:0 0 12px; font-size:16px; }

/* Die gerade geoeffnete Zeile bleibt sichtbar, wenn die Liste laenger wird -
   sonst sucht man nach jedem Speichern, wo man war. */
.admin-tabelle tr.ist-offen{
  background:color-mix(in srgb, var(--akzent) 7%, transparent);
}
.admin-tabelle tr.ist-offen a{ font-weight:600; }
.admin-tabelle small.hinweis{
  display:block; font-size:11.5px; margin-top:2px;
}

.umfrage-zustand{
  display:inline-block; padding:2px 8px; border-radius:var(--radius-rund);
  font-size:11px; font-weight:600; text-transform:uppercase;
  letter-spacing:.04em; border:1px solid var(--border); color:var(--text-2);
}
/* "laeuft" gruen, "abgeschaltet" rot - der Rest bleibt neutral. Ein
   beendeter Zeitraum ist kein Fehler, sondern der Normalfall. */
.umfrage-zustand.ist-laeuft{
  color:var(--erfolg);
  border-color:color-mix(in srgb, var(--erfolg) 45%, var(--border));
}
.umfrage-zustand.ist-abgeschaltet{
  color:var(--fehler);
  border-color:color-mix(in srgb, var(--fehler) 45%, var(--border));
}

.umfrage-frage-form{
  display:flex; align-items:center; gap:8px; flex-wrap:wrap;
  margin:0 0 24px;
}
.umfrage-frage-form label{
  flex:0 0 100%; font-size:12.5px; color:var(--text-2); font-weight:600;
}
.umfrage-frage-form input[type="text"],
.umfrage-frage-form select{
  flex:1 1 220px; min-width:0; padding:8px 11px;
  border:1px solid var(--border); border-radius:var(--radius-klein);
  background:var(--bg); color:var(--text); font-size:14px;
}

/* In der Karte sitzt die Ueberschrift oben - der alte Aussenabstand von
   24px stammt aus der Zeit, als alles in einer Flaeche durchlief. */
.umfragen-offen h3{
  margin:0 0 12px; font-size:12px; font-weight:700;
  text-transform:uppercase; letter-spacing:.06em; color:var(--text-2);
}
.umfragen-offen .admin-tabelle form{ margin:0; }

/* ---- Die offene Umfrage: Kopf und Karten ----

   Vier Aufgaben - Frage, Auswahl, Vorschlaege, Schalter - standen als eine
   ununterbrochene Spalte untereinander. Jede bekommt jetzt ihre eigene
   Flaeche; das Auge findet den Anfang der naechsten, ohne zu lesen. */
.umfrage-kopf{
  display:flex; align-items:flex-start; justify-content:space-between;
  gap:16px; flex-wrap:wrap; margin:0 0 20px;
}
.umfrage-kopf h2{ margin:0; }
.umfrage-kopf p{ margin:2px 0 0; }

.umfrage-kennzahlen{
  display:flex; align-items:center; gap:8px; flex-wrap:wrap;
}
/* Die Zahl gross, das Wort klein - so liest man den Stand im Vorbeigehen. */
.umfrage-kennzahl{
  padding:5px 11px; border:1px solid var(--border); border-radius:var(--radius-klein);
  background:var(--oberflaeche); font-size:11.5px; color:var(--text-2);
  white-space:nowrap;
}
.umfrage-kennzahl strong{
  font-family:'IBM Plex Mono',monospace; font-size:14px; color:var(--text);
  margin-right:3px;
}

/* Lag auf `--bg` und sank damit hinter die Seite. Dieselben Werte wie
   `.tafel` - der Aussenrand ist das Einzige, was hinzukommt. */
.umfrage-karte{
  padding:20px 22px; margin:0 0 16px;
  border:1px solid var(--border); border-radius:var(--radius);
  background:var(--oberflaeche);
  box-shadow:var(--erhebung);
}
/* Der letzte Abstand faellt weg, sonst haengt die Seite unten durch. */
.umfrage-karte > .umfrage-frage-form:last-child,
.umfrage-karte > .wunsch-liste:last-child,
.umfrage-karte > .admin-tabelle:last-child{ margin-bottom:0; }

/* Loeschen ist der einzige Schritt auf dieser Seite, der sich nicht
   zuruecknehmen laesst. Die Karte sagt das, bevor der Knopf es tut. */
.umfrage-gefahr{
  border-color:color-mix(in srgb, var(--fehler) 30%, var(--border));
  background:color-mix(in srgb, var(--fehler) 4%, transparent);
}
.admin-tabelle-btn.ist-gefahr{
  color:var(--fehler);
  border-color:color-mix(in srgb, var(--fehler) 45%, var(--border));
}
.admin-tabelle-btn.ist-gefahr:hover{
  background:color-mix(in srgb, var(--fehler) 12%, transparent);
}

.wunsch-liste{ list-style:none; padding:0; margin:0 0 24px; }
.wunsch-liste li{
  display:flex; align-items:center; gap:10px; flex-wrap:wrap;
  padding:8px 0; border-bottom:1px solid var(--border); font-size:14px;
}
.wunsch-liste small{
  font-family:'IBM Plex Mono',monospace; font-size:12px; color:var(--text-2);
}
/* Der erste Platz ist der einzige, der zaehlt - deshalb wird nur er
   ausgezeichnet. */
.wunsch-gesetzt{
  font-size:11px; font-weight:600; text-transform:uppercase;
  letter-spacing:.04em; color:var(--akzent);
}

.umfrage-schalter{
  display:flex; gap:10px; flex-wrap:wrap;
}

@media (max-width: 900px){
  .gemeinschaft-zwei{ grid-template-columns:1fr; }
  .umfragen-flaeche{ grid-template-columns:1fr; }
}
/* Neue Umfrage anlegen. Zugeklappt, solange schon eine laeuft - dann ist
   Bearbeiten die haeufigere Aufgabe. Ohne jede Umfrage steht es offen. */
.umfrage-neu{
  margin-bottom:28px; padding:0 20px;
  border:1px solid var(--border); border-radius:var(--radius);
  background:var(--oberflaeche);
}
.umfrage-neu > summary{
  padding:14px 0; cursor:pointer; font-weight:600; font-size:15px;
  list-style:none;
}
.umfrage-neu > summary::-webkit-details-marker{ display:none; }
.umfrage-neu > summary::before{ content:"+ "; color:var(--akzent); }
.umfrage-neu[open] > summary{
  border-bottom:1px solid var(--border); margin-bottom:18px;
}
.umfrage-neu[open] > summary::before{ content:"– "; }
.umfrage-neu form{ padding-bottom:20px; }
.umfrage-neu label{
  display:block; margin:0 0 6px; font-size:12.5px;
  font-weight:600; color:var(--text-2);
}
.umfrage-neu label small{ font-weight:400; }
.umfrage-neu input[type="text"],
.umfrage-neu select{
  width:100%; max-width:520px; margin-bottom:16px; padding:8px 11px;
  border:1px solid var(--border); border-radius:var(--radius-klein);
  background:var(--bg); color:var(--text); font-size:14px;
}
/* Das Mehrfachfeld braucht Hoehe - eine Liste mit drei sichtbaren Zeilen
   sieht aus wie ein Einfachfeld und wird auch so bedient. */
.umfrage-neu select[multiple]{ padding:6px; }
.umfrage-neu select option:disabled{ color:var(--text-2); }

.umfrage-wunschtipp{
  padding:16px 0 20px; border-top:1px solid var(--border);
}
.umfrage-wunschtipp h4{ margin:0 0 4px; font-size:13px; }
.umfrage-wunschtipp .wunsch-liste{ margin-bottom:0; }


/* ===========================================================================
   COMMUNITY-SEITE
   ===========================================================================
   Zwei Spalten: links, was zu lesen ist, rechts, was gerade passiert.

   Die rechte Spalte ist schmal und klebt beim Scrollen - sie ist eine
   Randnotiz, kein zweiter Hauptstrang. Waere sie gleich breit, laese man
   die Seite als zwei Artikel nebeneinander und wuesste nicht, wo man
   anfaengt.
   --------------------------------------------------------------------------- */

.gemeinde-kopf{
  margin-bottom:34px; padding-bottom:24px;
  border-bottom:1px solid var(--kante-gold);
}
/* Die Ueberzeile trug Grau. Ueberall sonst im Portal steht sie in Gold
   (`.abschnitt-label`) - Marke, Titel, Text ist der Dreiklang, an dem
   man ein Nachschlagewerk erkennt. Hier fehlte er als einziges. */
.gemeinde-ueberzeile{
  font-family:var(--schrift-mono); font-size:11px; font-weight:700;
  color:var(--akzent); text-transform:uppercase; letter-spacing:.11em;
  margin:0 0 10px;
}
.gemeinde-kopf h1{ margin:0 0 12px; font-size:clamp(30px, 3.4vw, 42px); }
.gemeinde-einstieg{
  color:var(--text-2); font-size:16px; margin:0; line-height:1.65;
  max-width:var(--lese-breite);
}

/* Sie steht jetzt AM Formular, nicht mehr oben auf der Seite - und damit
 zwischen anderem Text statt allein unter der Ueberschrift. Die Kante
 links trennt sie davon ab, ohne dass sie schreien muss. */
.gemeinde-meldung{
  margin:14px 0 18px; padding:12px 16px;
  border-radius:var(--radius-klein);
  font-size:14px; line-height:1.55;
  border:1px solid var(--border); border-left-width:3px;
}
.gemeinde-meldung.ist-gut{
  border-color:color-mix(in srgb, var(--erfolg) 45%, var(--border));
  background:color-mix(in srgb, var(--erfolg) 8%, transparent);
}
.gemeinde-meldung.ist-schwer{
  border-color:color-mix(in srgb, var(--fehler) 45%, var(--border));
  background:color-mix(in srgb, var(--fehler) 8%, transparent);
}

.gemeinde-flaeche{
  display:grid; grid-template-columns:minmax(0, 1fr) clamp(300px, 20vw, 460px); gap:48px;
  align-items:start;
}

/* ---- Linke Spalte -------------------------------------------------------- */

.gemeinde-block{
  padding-top:30px; margin-top:30px; border-top:1px solid var(--border);
}
.gemeinde-block:first-child{ padding-top:0; margin-top:0; border-top:none; }

/* Ueberschrift und Restlaufzeit auf einer Linie: Die Frist gehoert zur
   Ueberschrift, nicht in eine eigene Zeile darunter. */
.gemeinde-block-kopf{
  display:flex; align-items:baseline; justify-content:space-between;
  gap:12px; flex-wrap:wrap; margin-bottom:14px;
}
.gemeinde-block-kopf h2{
  margin:0; font-size:20px; letter-spacing:-.01em;
  display:flex; align-items:center; gap:10px;
}
/* Derselbe Balken wie auf der Spielseite. Vorher sah jeder Block aus wie
   der naechste - eine graue Linie darueber, eine Ueberschrift daneben -
   und wo ein Abschnitt anfaengt, musste man lesen statt sehen. */
.gemeinde-block-kopf h2::before{
  content:''; flex:0 0 auto;
  width:4px; height:19px; border-radius:2px; background:var(--akzent);
}
/* Die Restlaufzeit als Plakette: Sie ist eine Frist und keine Beschriftung -
   als blosser grauer Text ging sie neben der Ueberschrift unter. */
.gemeinde-rest{
  font-family:var(--schrift-mono); font-size:10.5px; font-weight:600;
  color:var(--akzent); white-space:nowrap;
  padding:3px 10px; border-radius:var(--radius-rund);
  border:1px solid var(--kante-gold);
  background:color-mix(in srgb, var(--akzent) 10%, transparent);
}
.gemeinde-vorspann{ color:var(--text-2); font-size:14.5px; margin:0 0 18px; max-width:var(--lese-breite); }
.gemeinde-frage{ font-size:16.5px; font-weight:600; margin:0 0 18px; }

/* ---- Neuigkeiten --------------------------------------------------------- */

/* ---------------------------------------------------------------------------
   VOM TRENNSTRICH ZUR KARTE

   Die Beitraege standen als Liste mit Trennstrichen untereinander - fuer eine
   Aufzaehlung richtig, fuer Texte mit Ueberschrift und Absatz zu wenig. Wo
   ein Beitrag anfaengt und der naechste aufhoert, musste man lesen.

   Jetzt hat jeder Beitrag eine eigene Flaeche und links eine schmale Kante in
   der Farbe seiner Art: News neutral, Update in der Akzentfarbe, Hinweis in
   Bernstein. Die Art steht damit zweimal da - als Schild und als Kante - und
   die Kante liest man schon aus dem Augenwinkel.
   --------------------------------------------------------------------------- */
/* Ein <button>, kein <article> mehr - deshalb muessen hier die Vorgaben
   des Browsers zurueckgenommen werden: Ein Knopf ist von Haus aus mittig
   ausgerichtet, hat eine eigene Schrift und wird nicht so breit wie sein
   Platz. Ohne diese vier Zeilen saehe der Beitrag aus wie ein Formularknopf
   mit einem Aufsatz darin. */
/* `background:var(--bg)` liess die Beitraege HINTER die Seite sinken,
   waehrend die Kacheln rechts auf `--oberflaeche` davor liegen: Das
   Wichtigere lag tiefer als die Randnotiz. */
.neuigkeit{
  position:relative; display:block; width:100%;
  text-align:left; font:inherit; color:inherit; cursor:pointer;
  padding:18px 20px 18px 22px; margin:0 0 26px;
  border:1px solid var(--border); border-radius:var(--radius);
  background:var(--oberflaeche);
  box-shadow:var(--erhebung);
  transition:border-color var(--dauer) var(--kurve),
             box-shadow var(--dauer) var(--kurve),
             transform var(--dauer) var(--kurve);
}
.neuigkeit:focus-visible{ outline:2px solid var(--akzent); outline-offset:2px; }

/* „Ganzen Beitrag lesen" steht am Fuss jedes Beitrags. Ohne diesen Hinweis
   sieht die Karte aus wie ein abgeschnittener Text - man erkennt nicht, dass
   sie sich oeffnen laesst, und der Anriss endet einfach mit „...". */
.neuigkeit-mehr{
  display:inline-block; margin-top:8px;
  font-size:12.5px; font-weight:600; color:var(--akzent);
}
.neuigkeit:hover .neuigkeit-mehr{ text-decoration:underline; }
.neuigkeit:last-child{ margin-bottom:0; }
/* Anheben statt einfaerben: Dieselbe Bewegung wie bei `.karte`. Ein
   Farbwechsel auf der Flaeche sah bei acht Beitraegen untereinander aus,
   als waere einer davon ausgewaehlt. */
.neuigkeit:hover{
  border-color:color-mix(in srgb, var(--akzent) 45%, var(--border));
  box-shadow:0 10px 28px -14px color-mix(in srgb, var(--akzent) 35%, rgba(0,0,0,.3)),
             0 2px 6px -2px rgba(0,0,0,.08);
  transform:translateY(-2px);
}

/* Die Kante. `currentColor` waere hier falsch - die Farbe haengt an der Art,
   und die steht am Schild im Inneren, nicht am Beitrag. */
.neuigkeit::before{
  content:''; position:absolute; left:0; top:14px; bottom:14px; width:3px;
  border-radius:0 3px 3px 0; background:var(--border);
}
.neuigkeit:has(.neuigkeit-art.ist-update)::before{ background:var(--akzent); }
.neuigkeit:has(.neuigkeit-art.ist-hinweis)::before{ background:var(--warnung); }
.neuigkeit-kopf{
  display:flex; align-items:center; gap:10px; margin:0 0 6px;
  font-size:12px; color:var(--text-2);
}
.neuigkeit-art{
  padding:2px 8px; border-radius:var(--radius-rund); font-size:10.5px; font-weight:600;
  text-transform:uppercase; letter-spacing:.05em;
  border:1px solid var(--border);
}
/* Ein Hinweis betrifft den Betrieb - er darf auffallen. News und Updates
   sind Alltag und bleiben ruhig. */
.neuigkeit-art.ist-hinweis{
  color:var(--warnung);
  border-color:color-mix(in srgb, var(--warnung) 45%, var(--border));
}
.neuigkeit-art.ist-update{ color:var(--akzent); }
.neuigkeit h3{
  margin:0 0 8px; font-size:18px; line-height:1.3;
  font-family:var(--schrift-display); font-weight:600;
}
.neuigkeit p{ margin:0 0 6px; font-size:14.5px; line-height:1.6; }
.neuigkeit-bezug{ font-size:13px; color:var(--text-2); }

.news-voll-bezug{ margin:18px 0 0; font-size:13.5px; color:var(--text-2); }

/* ---- Rechte Spalte ------------------------------------------------------- */

.gemeinde-rand{
  display:flex; flex-direction:column; gap:40px;
  /* Sie bleibt beim Scrollen stehen: Die Chronik ist das, was man immer
     wieder streift, waehrend man links liest. */
  position:sticky; top:20px;
}
.rand-block{
  padding:20px 22px; border:1px solid var(--border);
  border-radius:var(--radius); background:var(--oberflaeche);
  box-shadow:var(--erhebung);
}
/* Dieselbe Kachelueberschrift wie auf der Spielseite
   (`.spiel-panel-titel`): versal, schmal, mit goldener Linie darunter.
   Hier standen bisher gewoehnliche h2 - zwei Bauweisen fuer dasselbe
   Ding, und die aeltere sah nach weniger aus. */
.rand-block h2{
  margin:0 0 14px; padding-bottom:12px;
  font-family:var(--schrift-mono); font-size:11.5px; font-weight:700;
  text-transform:uppercase; letter-spacing:.1em; color:var(--text);
  border-bottom:1px solid var(--kante-gold);
}
.rand-block p{ font-size:13.5px; line-height:1.6; margin:0 0 12px; }
.rand-block p:last-child{ margin-bottom:0; }
.rand-fuss{ margin-top:14px !important; font-size:13px; }
.rand-nebenweg{ font-size:13px; color:var(--text-2); margin-left:8px; }

/* ---- Die Chronik --------------------------------------------------------- */

.chronik{ list-style:none; padding:0; margin:0; }
.chronik-eintrag{
  position:relative; padding:0 0 14px 16px; margin-bottom:2px;
}
/* Eine durchgehende Linie mit Punkten: Sie macht aus einzelnen Meldungen
   einen Verlauf - und genau das ist eine Chronik. */
.chronik-eintrag::before{
  content:""; position:absolute; left:0; top:5px;
  width:7px; height:7px; border-radius:50%;
  background:var(--border);
}
/* Der Faden blendet nach unten aus, statt hart aufzuhoeren: Eine Chronik
   hat kein Ende, sie hat nur einen Rand. */
.chronik-eintrag::after{
  content:""; position:absolute; left:3px; top:14px; bottom:0;
  width:1px;
  background:linear-gradient(180deg, var(--kante-gold), var(--border));
}
.chronik-eintrag:last-child{ padding-bottom:0; }
.chronik-eintrag:last-child::after{ display:none; }

/* Ein neues Spiel ist die groessere Nachricht - sein Punkt traegt die
   Akzentfarbe, der Rest bleibt ruhig. */
.chronik-eintrag.ist-spiel::before{
  background:var(--akzent);
  box-shadow:0 0 0 3px color-mix(in srgb, var(--akzent) 18%, transparent);
}

.chronik-eintrag time{
  display:block; font-family:var(--schrift-mono);
  font-size:10.5px; color:var(--text-2); margin-bottom:3px;
  text-transform:uppercase; letter-spacing:.06em;
}
.chronik-eintrag p{ margin:0 !important; font-size:13.5px; line-height:1.5; }
.chronik-eintrag.ist-spiel p{ font-weight:600; }

/* ---- Sammlung auf der Spielseite ----------------------------------------- */

.spiel-panel-sammlung .sammlung-form{ margin-top:12px; }
.spiel-panel-sammlung label{
  display:block; margin:10px 0 4px; font-size:12px;
  font-weight:600; color:var(--text-2);
}
.spiel-panel-sammlung label small{ font-weight:400; }
.spiel-panel-sammlung select,
.spiel-panel-sammlung textarea{
  width:100%; padding:7px 10px;
  border:1px solid var(--border); border-radius:var(--radius-klein);
  background:var(--bg); color:var(--text); font-size:13.5px;
  font-family:inherit;
}
.spiel-panel-sammlung button[type="submit"]{ margin-top:14px; }
.spiel-panel-nebenweg{
  background:none; border:none; padding:0; cursor:pointer;
  font-family:inherit; font-size:12.5px; color:var(--text-2);
  text-decoration:underline;
}
.spiel-panel-nebenweg:hover{ color:var(--fehler); }
.sammlung-entfernen{ margin-top:10px; }
.spiel-panel-fuss{ margin-top:14px; font-size:13px; }

/* ---- Admin: News --------------------------------------------------------- */

.news-flaeche{
  display:grid; grid-template-columns:minmax(0, 1fr) clamp(380px, 24vw, 520px); gap:28px;
  align-items:start;
}
.news-schreiben h2,
.news-bestand h2{ margin:0 0 14px; font-size:16px; }
.news-schreiben label{
  display:block; margin:14px 0 5px; font-size:12.5px;
  font-weight:600; color:var(--text-2);
}
.news-schreiben label small{ font-weight:400; }
.news-schreiben input[type="text"],
.news-schreiben input[type="datetime-local"],
.news-schreiben select,
.news-schreiben textarea{
  width:100%; padding:8px 11px;
  border:1px solid var(--border); border-radius:var(--radius-klein);
  background:var(--bg); color:var(--text); font-size:14px;
  font-family:inherit;
}
.news-schreiben textarea{ line-height:1.6; resize:vertical; }
.news-knoepfe{ display:flex; align-items:center; gap:12px; margin-top:20px; }

.news-zustand{
  display:inline-block; padding:2px 8px; border-radius:var(--radius-rund);
  font-size:11px; font-weight:600; text-transform:uppercase;
  letter-spacing:.04em; border:1px solid var(--border); color:var(--text-2);
  white-space:nowrap;
}
/* Nur "veroeffentlicht" ist gruen. "Geplant" ist noch nichts, "Entwurf"
   erst recht nicht - beide neutral zu lassen ist ehrlicher, als sie mit
   Farbe wichtiger zu machen, als sie sind. */
.news-zustand.ist-veroeffentlicht{
  color:var(--erfolg);
  border-color:color-mix(in srgb, var(--erfolg) 45%, var(--border));
}
.news-zustand.ist-geplant{
  color:var(--akzent);
  border-color:color-mix(in srgb, var(--akzent) 45%, var(--border));
}
.news-bestand .admin-tabelle form{ margin:0; }

@media (max-width: 900px){
  /* Die Chronik rutscht unter den Hauptstrang - und hoert auf zu kleben:
     Ein klebender Kasten auf einem Telefon nimmt den halben Bildschirm. */
  .gemeinde-flaeche{ grid-template-columns:1fr; gap:32px; }
  .gemeinde-rand{ position:static; }
  .news-flaeche{ grid-template-columns:1fr; }
}
/* "neu" heisst: gibt es hier noch nicht - und genau darueber soll
   abgestimmt werden. Das ist die wichtigere Haelfte der Auskunft und
   bekommt deshalb Farbe, waehrend "gibt es schon" still bleibt. */
.wunsch-neu{
  font-size:11px; font-weight:600; text-transform:uppercase;
  letter-spacing:.04em; color:var(--akzent);
}


/* ===========================================================================
   FASSUNGEN
   ===========================================================================
   Ein Spiel, mehrere Ausgaben. Der Umschalter steht direkt unter dem Titel:
   Wer auf der falschen Fassung landet, soll das sofort sehen und nicht erst,
   nachdem er sich durch Werte gearbeitet hat, die fuer seine Ausgabe nicht
   gelten.
   --------------------------------------------------------------------------- */

.fassung-umschalter{
  display:flex; flex-wrap:wrap; gap:8px; margin:14px 0 6px;
}
.fassung-umschalter a{
  display:flex; flex-direction:column; gap:2px;
  padding:8px 14px; border-radius:10px; text-decoration:none;
  border:1px solid var(--border); background:var(--oberflaeche);
  color:var(--text-2); transition:border-color .15s, color .15s;
}
.fassung-umschalter a:hover{ border-color:var(--akzent); color:var(--text); }
/* Die offene Fassung traegt die Akzentfarbe voll - ein Umschalter, bei dem
   man raten muss, wo man steht, ist keiner. */
.fassung-umschalter a.ist-aktiv{
  border-color:var(--akzent); background:var(--akzent); color:var(--bg);
}
.fassung-umschalter .fassung-name{ font-weight:600; font-size:14.5px; }
.fassung-umschalter small{ font-size:11.5px; opacity:.85; }

.fassung-hinweis{
  margin:2px 0 0; font-size:13.5px; color:var(--text-2); font-style:italic;
}
.fassung-vergleich-weg{ margin:8px 0 0; font-size:13px; }

/* ---- Die Fassungsliste auf der Spielseite -------------------------------- */

.spiel-fassungen{ list-style:none; padding:0; margin:0; }
.spiel-fassungen li{
  display:grid; grid-template-columns:1fr auto; gap:4px 12px;
  padding:10px 0; border-bottom:1px solid var(--border);
}
.spiel-fassungen li:last-child{ border-bottom:none; padding-bottom:0; }
.fassung-zeile-name{ font-weight:600; font-size:14.5px; }
.fassung-art{
  display:block; font-weight:400; font-size:11.5px; color:var(--text-2);
  text-transform:uppercase; letter-spacing:.04em;
}
.fassung-plattformen{
  grid-column:1 / -1; display:flex; flex-wrap:wrap; gap:6px;
}
.fassung-plattform{
  padding:2px 8px; border-radius:var(--radius-rund); font-size:12px;
  border:1px solid var(--border); color:var(--text-2);
}
.fassung-plattform small{
  font-family:'IBM Plex Mono',monospace; font-size:11px; opacity:.8;
}
/* "gleiche Daten" ist die haeufigere und beruhigende Auskunft - sie bleibt
   still. "abweichende Angaben" ist der Grund, genauer hinzusehen. */
.fassung-abweichung{
  grid-column:1 / -1; font-size:12px; color:var(--text-2);
}
.spiel-fassungen li.ist-abweichend .fassung-abweichung{
  color:var(--akzent); font-weight:600;
}

/* ---- Der oeffentliche Fassungsvergleich ---------------------------------- */

.fassung-karten{
  display:grid; grid-template-columns:repeat(auto-fit, minmax(240px, 1fr));
  gap:16px; margin-bottom:36px;
}
.fassung-karte{
  padding:18px 20px; border:1px solid var(--border);
  border-radius:var(--radius); background:var(--oberflaeche);
}
.fassung-karte.ist-abweichend{ border-color:var(--akzent); }
.fassung-karte h2{ margin:0 0 4px; font-size:17px; }
.fassung-karte h2 a{ color:var(--text); text-decoration:none; }
.fassung-karte h2 a:hover{ color:var(--akzent); }
.fassung-karte-art{
  margin:0 0 10px; font-size:11.5px; color:var(--text-2);
  text-transform:uppercase; letter-spacing:.05em;
}
.fassung-karte-plattformen{ margin:0 0 8px; font-size:13.5px; }
.fassung-karte-hinweis{
  margin:0 0 8px; font-size:13px; color:var(--text-2); font-style:italic;
}
.fassung-karte-stand{ margin:0; font-size:12.5px; color:var(--text-2); }
.fassung-karte.ist-abweichend .fassung-karte-stand{
  color:var(--akzent); font-weight:600;
}
/* "nur hier" ist die Antwort auf die Frage, wegen der jemand die Seite
   geoeffnet hat - sie darf nicht wie eine Fussnote aussehen. */
.nur-hier{
  display:block; font-size:11.5px; color:var(--akzent); font-weight:600;
}

/* ---- Fassungen im Builder ------------------------------------------------ */

.fassung-verwaltung{ display:flex; flex-direction:column; gap:20px; }
.fassung-block{
  padding:20px 22px; border:1px solid var(--border);
  border-radius:var(--radius); background:var(--oberflaeche);
}
.fassung-block.ist-abweichend{ border-left:3px solid var(--akzent); }
.fassung-block-kopf{
  display:flex; align-items:baseline; justify-content:space-between;
  gap:12px; flex-wrap:wrap; margin-bottom:6px;
}
.fassung-block-kopf h2{ margin:0; font-size:17px; }
.fassung-marke{
  font-size:11.5px; color:var(--text-2); text-transform:uppercase;
  letter-spacing:.04em; white-space:nowrap;
}
.fassung-block.ist-abweichend .fassung-marke{ color:var(--akzent); font-weight:600; }
.fassung-block h3{ margin:22px 0 10px; font-size:13px; }
.fassung-block code{
  font-family:'IBM Plex Mono',monospace; font-size:12px;
  background:var(--bg); padding:1px 5px; border-radius:4px;
}

.fassung-form, .fassung-plattform-form{ margin:14px 0 0; }
.fassung-form-zeile{ display:flex; gap:12px; flex-wrap:wrap; }
.fassung-form label, .fassung-plattform-form label{
  display:flex; flex-direction:column; gap:4px; flex:1 1 180px;
  margin-bottom:12px; font-size:12.5px; font-weight:600; color:var(--text-2);
}
.fassung-form label.ist-schmal,
.fassung-plattform-form label.ist-schmal{ flex:0 0 110px; }
.fassung-form input, .fassung-form select,
.fassung-plattform-form input, .fassung-plattform-form select{
  padding:8px 11px; border:1px solid var(--border); border-radius:var(--radius-klein);
  background:var(--bg); color:var(--text); font-size:14px;
  font-weight:400; font-family:inherit;
}
.fassung-plattform-form{
  display:flex; gap:12px; flex-wrap:wrap; align-items:flex-end;
  padding-top:14px; border-top:1px solid var(--border);
}
.fassung-plattform-form button{ margin-bottom:12px; }

.fassung-plattformliste{ list-style:none; padding:0; margin:0; }
.fassung-plattformliste li{
  display:flex; align-items:center; gap:10px; flex-wrap:wrap;
  padding:7px 0; border-bottom:1px solid var(--border); font-size:14px;
}
.fassung-plattform-name{ font-weight:600; }
.fassung-plattform-jahr{
  font-family:'IBM Plex Mono',monospace; font-size:12.5px; color:var(--text-2);
}
.fassung-plattformliste form{ margin:0 0 0 auto; }

.fassung-loeschen{
  margin-top:18px; padding-top:14px; border-top:1px solid var(--border);
}

.fassung-neu{
  margin-top:24px; padding:0 22px;
  border:1px solid var(--border); border-radius:var(--radius);
  background:var(--oberflaeche);
}
.fassung-neu > summary{
  padding:16px 0; cursor:pointer; font-weight:600; font-size:15px;
  list-style:none;
}
.fassung-neu > summary::-webkit-details-marker{ display:none; }
.fassung-neu > summary::before{ content:"+ "; color:var(--akzent); }
.fassung-neu[open] > summary{
  border-bottom:1px solid var(--border); margin-bottom:18px;
}
.fassung-neu[open] > summary::before{ content:"\2013 "; }
.fassung-neu form{ padding-bottom:8px; }
.fassung-neu label{
  display:flex; flex-direction:column; gap:4px; flex:1 1 180px;
  margin-bottom:14px; font-size:12.5px; font-weight:600; color:var(--text-2);
}
.fassung-neu label.ist-schmal{ flex:0 0 110px; }
.fassung-neu label small{ font-weight:400; }
.fassung-neu input, .fassung-neu select{
  padding:8px 11px; border:1px solid var(--border); border-radius:var(--radius-klein);
  background:var(--bg); color:var(--text); font-size:14px;
  font-weight:400; font-family:inherit;
}
.fassung-neu > p{ padding-bottom:20px; }

@media (max-width: 700px){
  /* Der Umschalter wird zur Spalte - nebeneinander waeren die Plattformen
     darunter abgeschnitten, und die sind die halbe Auskunft. */
  .fassung-umschalter{ flex-direction:column; }
  .fassung-form-zeile{ flex-direction:column; }
  .fassung-plattform-form label.ist-schmal,
  .fassung-neu label.ist-schmal{ flex:1 1 100%; }
}

/* ===========================================================================
   BUILDER: DIE EINGABEMASKE
   ===========================================================================
   Ein Gegner hat sechs Merkmalsgruppen, dazu Wirkungen und Verknuepfungen -
   zusammen ueber zwei Bildschirme. Vorher stand alles offen untereinander,
   und der Speichern-Knopf ganz unten.

   Jetzt: aufklappbare Abschnitte mit Zaehler, und ein Speichern-Balken, der
   unten klebt.
   --------------------------------------------------------------------------- */

.builder-abschnitt{
  margin-bottom:10px;
  border:1px solid var(--border);
  border-radius:10px;
  background:var(--oberflaeche);
}
.builder-abschnitt > summary{
  display:flex; align-items:center; gap:10px;
  padding:12px 16px; cursor:pointer; list-style:none;
  font-size:14px; font-weight:600;
  border-radius:10px;
}
.builder-abschnitt > summary::-webkit-details-marker{ display:none; }
/* Ein Dreieck, das sich dreht. Ohne Zeichen sieht eine zugeklappte
   Ueberschrift wie eine Ueberschrift ohne Inhalt aus - und dann sucht
   jemand die Felder, statt zu klicken. */
.builder-abschnitt > summary::before{
  content:"▸"; color:var(--text-2); font-size:12px;
  transition:transform .15s; display:inline-block;
}
.builder-abschnitt[open] > summary::before{ transform:rotate(90deg); }
.builder-abschnitt > summary:hover{ color:var(--akzent); }
.builder-abschnitt[open] > summary{
  border-bottom:1px solid var(--border);
  border-radius:10px 10px 0 0;
}
.builder-abschnitt-titel{ flex:1; }

/* Der Zaehler ist die halbe Auskunft: Er sagt, ob sich das Aufklappen
   lohnt. "0/6" bleibt still, "3/6" traegt die Akzentfarbe. */
.builder-abschnitt-zahl{
  font-family:'IBM Plex Mono',monospace; font-size:11.5px; font-weight:600;
  padding:2px 8px; border-radius:var(--radius-rund);
  background:color-mix(in srgb, var(--akzent) 12%, transparent);
  color:var(--akzent);
}
.builder-abschnitt-zahl.ist-leer{
  background:var(--bg); color:var(--text-2); font-weight:400;
}

.builder-abschnitt-inhalt{ padding:16px; }
/* Die Merkmalsgruppen sind die haeufigsten - sie duerfen enger sitzen. */
.builder-abschnitt.ist-merkmale > summary{ padding:10px 14px; font-size:13.5px; }
.builder-abschnitt.ist-merkmale .builder-abschnitt-inhalt{ padding:12px 14px 14px; }

/* ---- Der Speichern-Balken ------------------------------------------------ */
/*
   ES GAB DAVON DREI.

   Eine alte mit Trennlinie, eine mit `position:sticky` und einem
   Verlauf nach durchsichtig, und diese. Gewirkt hat immer nur die
   letzte - die beiden anderen lagen daneben und liessen jede Aenderung
   an ihnen wirkungslos.

   Der Verlauf war ausserdem falsch: Unter dem Balken laufen
   Eingabefelder durch, und halbdurchsichtig macht beide unlesbar.
   Deshalb hier eine volle Flaeche mit Schatten. */

.builder-formular-fuss{
  display:flex; align-items:center; justify-content:space-between;
  gap:16px; flex-wrap:wrap;
  /* Klebt am unteren Rand: Wer oben den Namen korrigiert, soll nicht an
     dreissig Feldern vorbeiscrollen, um zu speichern - und danach wieder
     zurueck. */
  position:sticky; bottom:0; z-index:5;
  margin:20px 0 0; padding:12px 16px;
  border:1px solid var(--border); border-radius:var(--radius);
  /* Nicht durchscheinend: Darunter laufen Eingabefelder durch, und ein
     halbdurchsichtiger Balken macht beide unlesbar. */
  background:var(--oberflaeche);
  box-shadow:0 -4px 16px rgba(0,0,0,.10);
}
.builder-fuss-name{
  min-width:0; font-weight:600; font-size:15px;
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
}
.builder-fuss-name small{
  display:block; font-weight:400; font-size:11.5px; color:var(--text-2);
  text-transform:uppercase; letter-spacing:.04em;
}
.builder-fuss-knoepfe{ display:flex; gap:10px; flex-shrink:0; }

@media (max-width: 700px){
  /* Auf einem Telefon nimmt ein klebender Balken zu viel Platz - dort
     steht er einfach am Ende. */
  .builder-formular-fuss{ position:static; box-shadow:none; }
}

/* ===========================================================================
   SPIELSEITE UND BUILDER - OPTIK
   ===========================================================================
   Der Kopf traegt jede Angabe genau einmal: Reihe als Ueberzeile, Genres als
   Plaketten, alles Weitere im Infofeld darunter. Vorher standen Genres
   dreimal, Entwickler dreimal, Plattformen und Jahr je zweimal.

   HIER STEHEN NUR KLASSEN, DIE ES SONST NIRGENDS GIBT.

   Der erste Entwurf dieses Blocks definierte `.spiel-hero-kicker`,
   `.builder-eintraege` und vier weitere ein zweites Mal - Klassen, die
   weiter oben schon Regeln haben. Gewirkt haette die spaetere, und jede
   spaetere Aenderung an der frueheren waere wirkungslos verpufft.

   Genau der Fehler, wegen dem `.builder-formular-fuss` dreimal dastand.
   Aenderungen an bestehenden Klassen gehoeren an ihre Regel, nicht ans
   Dateiende.
   --------------------------------------------------------------------------- */

:root{
  /* Die Lupe - einmal definiert, ueberall benutzbar. */
  --lupe: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round'><circle cx='11' cy='11' r='7'/><line x1='21' y1='21' x2='16.65' y2='16.65'/></svg>");
}

/* Plattform UND Jahr in einer Plakette: "SNES 1993". Das Jahr in der
   Schreibmaschinenschrift, damit es sich vom Namen abhebt, ohne eine
   eigene Zeile zu brauchen. */
.element-plakette small{
  font-family:'IBM Plex Mono',monospace; font-size:11px;
  opacity:.7; margin-left:5px;
}

/* Der Builder bleibt, wie er ist - er bekommt nur weniger Kanten. Vorher
   hatte jede Ebene ihren eigenen Rahmen: Leiste, Liste, Datensatz, und
   darin noch einmal jeder Abschnitt. Vier Rahmen ineinander lesen sich als
   vier getrennte Dinge, obwohl es eine Arbeitsflaeche ist. */
.builder-abschnitt[open]{ background:var(--oberflaeche); }

/* Die aktive Zeile deutlicher: Wer in einer Liste von zweihundert Gegnern
   arbeitet, muss auf einen Blick sehen, welchen er offen hat. */
.builder-eintragszeile.ist-aktiv{
  box-shadow:inset 2px 0 0 var(--akzent);
}

/* Woher die Angaben stammen.

   In Warnfarbe und nicht in Fehlerfarbe: Eine Vorabangabe ist kein
   Fehler, sie ist eine Einschraenkung. Rot hiesse "hier stimmt etwas
   nicht", und das waere die falsche Auskunft ueber ein Spiel, das
   schlicht noch nicht erschienen ist. */
.datenstand-hinweis{
  display:inline-flex; align-items:center; gap:7px;
  margin:0 0 16px; padding:6px 12px;
  border:1px solid color-mix(in srgb, var(--warnung) 40%, var(--border));
  border-radius:var(--radius-rund);
  background:color-mix(in srgb, var(--warnung) 8%, transparent);
  color:var(--text-2); font-size:12.5px;
}
.datenstand-hinweis::before{
  content:""; width:6px; height:6px; border-radius:50%;
  background:var(--warnung); flex-shrink:0;
}

/* ===========================================================================
   SPRACHEN UND EDITIONEN
   ===========================================================================
   Beide Angaben gab es bisher nirgends. Sie stehen im Hauptstrang der
   Spielseite unter dem Infofeld - nicht in der Randspalte: Wer wissen will,
   ob es das Spiel auf Deutsch gibt, sucht nicht am Rand.
   --------------------------------------------------------------------------- */

.spiel-sprachen{ list-style:none; padding:0; margin:0; }
.spiel-sprachen li{
  display:flex; align-items:baseline; gap:10px; flex-wrap:wrap;
  padding:8px 0; border-bottom:1px solid var(--border); font-size:14px;
}
.spiel-sprachen li:last-child{ border-bottom:none; padding-bottom:0; }
.spiel-sprache-name{ font-weight:600; min-width:9em; }
.spiel-sprache-form{ color:var(--text-2); font-size:13px; }
/* "nur PC, Xbox" ist die eigentliche Auskunft dieser Zeile - alles andere
   gilt ohnehin ueberall. */
.spiel-sprache-nur{
  font-size:12px; color:var(--warnung);
  padding:1px 8px; border-radius:var(--radius-rund);
  border:1px solid color-mix(in srgb, var(--warnung) 40%, var(--border));
}

.spiel-edition{
  padding:14px 0; border-bottom:1px solid var(--border);
}
.spiel-edition:last-child{ border-bottom:none; padding-bottom:0; }
.spiel-edition-kopf{
  display:flex; align-items:baseline; gap:10px; flex-wrap:wrap; margin:0 0 6px;
}
.spiel-edition-name{ font-weight:600; font-size:15.5px; }
.spiel-edition-art{
  font-size:11px; text-transform:uppercase; letter-spacing:.05em;
  color:var(--text-2);
}
.spiel-edition-preis{
  margin-left:auto; font-family:'IBM Plex Mono',monospace;
  font-size:14px; font-weight:600;
}
.spiel-edition-text{ margin:0 0 8px; font-size:14px; color:var(--text-2); }
.spiel-edition-inhalte{
  list-style:none; padding:0; margin:0;
  display:flex; flex-wrap:wrap; gap:6px;
}
.spiel-edition-inhalte li{
  padding:3px 10px; border-radius:var(--radius-rund); font-size:13px;
  border:1px solid var(--border); background:var(--bg);
}
.spiel-edition-inhalte small{ color:var(--text-2); font-size:11.5px; margin-left:4px; }
.spiel-edition-hinweis{ display:block; margin-left:0 !important; }


/* ===========================================================================
   BUILDER: SPRACHEN UND EDITIONEN
   ===========================================================================
   Formulare mit vielen kurzen Feldern. Sie liegen in einem Raster statt
   untereinander: „Preis", „Waehrung" und „Datenstand" sind zusammen kuerzer
   als eine Zeile, und drei eigene Zeilen daraus zu machen macht das Formular
   dreimal so hoch, ohne etwas klarer zu machen.
   --------------------------------------------------------------------------- */

.veroeff-form{
  display:flex; flex-wrap:wrap; gap:0 14px;
  align-items:flex-end; margin:16px 0 0;
}
.veroeff-form label{
  display:flex; flex-direction:column; gap:4px;
  flex:1 1 190px; margin-bottom:14px;
  font-size:12.5px; font-weight:600; color:var(--text-2);
}
.veroeff-form label.ist-schmal{ flex:0 0 130px; }
.veroeff-form label.ist-breit{ flex:1 1 100%; }
.veroeff-form label small{ font-weight:400; }
.veroeff-form input,
.veroeff-form select,
.veroeff-form textarea{
  padding:8px 11px; border:1px solid var(--border); border-radius:var(--radius-klein);
  background:var(--bg); color:var(--text); font-size:14px;
  font-weight:400; font-family:inherit;
}
.veroeff-form textarea{ line-height:1.5; resize:vertical; }
.veroeff-form button{ margin-bottom:14px; }

/* „nur PC, Xbox" ist die Auskunft, wegen der es diese Spalte gibt - alles
   andere gilt ohnehin ueberall und bleibt still. */
.sprache-nur{
  font-size:12px; color:var(--warnung);
  padding:1px 8px; border-radius:var(--radius-rund);
  border:1px solid color-mix(in srgb, var(--warnung) 40%, var(--border));
  white-space:nowrap;
}

.veroeff-editionen{ display:flex; flex-direction:column; gap:18px; }
.veroeff-edition{
  padding:18px 20px; border:1px solid var(--border);
  border-radius:var(--radius); background:var(--oberflaeche);
}
.veroeff-edition-kopf{
  display:flex; align-items:baseline; justify-content:space-between;
  gap:12px; flex-wrap:wrap;
}
.veroeff-edition-kopf h3{ margin:0; font-size:16px; }
.veroeff-edition-art{
  font-size:11.5px; color:var(--text-2);
  text-transform:uppercase; letter-spacing:.04em;
}
.veroeff-edition h4{ margin:22px 0 8px; font-size:13px; }

.veroeff-inhalte{ list-style:none; padding:0; margin:0; }
.veroeff-inhalte li{
  display:flex; align-items:center; gap:10px; flex-wrap:wrap;
  padding:8px 0; border-bottom:1px solid var(--border); font-size:14px;
}
.veroeff-inhalte li:last-child{ border-bottom:none; }
.veroeff-inhalte form{ margin:0 0 0 auto; }
.veroeff-inhalt-name{ font-weight:600; }
.veroeff-inhalt-art{ font-size:12px; color:var(--text-2); }
.veroeff-inhalt-hinweis{ font-size:12.5px; color:var(--text-2); font-style:italic; }
/* Ein Inhalt, der auf einen Eintrag zeigt: Von dort kommt man zu seinen
   Werten. Das ist der Unterschied zwischen einer Liste und einer Datenbank. */
.veroeff-verknuepft{
  font-size:10.5px; font-weight:600; text-transform:uppercase;
  letter-spacing:.04em; color:var(--akzent); margin-left:6px;
}

.veroeff-loeschen{
  margin-top:16px; padding-top:14px; border-top:1px solid var(--border);
}

.veroeff-neu{
  margin-top:20px; padding:0 20px;
  border:1px solid var(--border); border-radius:var(--radius);
  background:var(--oberflaeche);
}
.veroeff-neu > summary{
  padding:16px 0; cursor:pointer; font-weight:600; font-size:15px;
  list-style:none;
}
.veroeff-neu > summary::-webkit-details-marker{ display:none; }
.veroeff-neu > summary::before{ content:"+ "; color:var(--akzent); }
.veroeff-neu[open] > summary{
  border-bottom:1px solid var(--border); margin-bottom:6px;
}
.veroeff-neu[open] > summary::before{ content:"\2013 "; }
.veroeff-neu > p{ padding-bottom:20px; }

@media (max-width: 700px){
  .veroeff-form label,
  .veroeff-form label.ist-schmal{ flex:1 1 100%; }
}

/* ===========================================================================
   MOBIL: EIN DURCHGANG STATT VERSTREUTER AUSNAHMEN
   ===========================================================================
   Im Stylesheet stehen ueber zwanzig @media-Bloecke, jeder bei der Regel, zu
   der er gehoert - das ist richtig so und bleibt. Was fehlte, waren die
   Dinge, die NICHT zu einer einzelnen Regel gehoeren, sondern zur ganzen
   Seite. Sie standen deshalb nirgends.

   Vier Punkte, alle auf einem Telefon nachweisbar:

     1. Die Seite rollte nach rechts. Eine Tabelle ohne Scrollrahmen ist
        breiter als der Bildschirm, und dann wandert die ganze Seite mit -
        einschliesslich der Navigation. Die Rahmen sind in den Vorlagen
        nachgetragen; hier steht die Sperre, die verhindert, dass der
        naechste Fall wieder die ganze Seite mitnimmt.

     2. Antippbare Flaechen waren zu klein. Ein Knopf mit 28px Hoehe ist mit
        der Maus bequem und mit dem Daumen Gluecksache.

     3. Zwei Spalten blieben zwei Spalten, bis die jeweilige Regel es
        einzeln zurueckgenommen hat - und mehrere hatten keine solche Regel.

     4. Dialoge standen mittig mit 20px Rand. Auf einem Telefon ist ein
        Dialog, der als Karte in der Mitte schwebt, eine Karte, die man
        kaum lesen kann.
   =========================================================================== */

@media (max-width: 900px){
  /* --- 1. Nichts darf die Seite nach rechts ziehen --------------------- */

  /* `clip` statt `hidden`: `hidden` macht aus dem Body einen Scrollcontainer
     und bricht damit `position:sticky` bei allem, was darin steht. `clip`
     schneidet nur ab. */
  html, body{ max-width:100%; overflow-x:clip; }

  /* Bilder und eingebettete Inhalte sprengen den Rahmen sonst als Erstes. */
  img, video, iframe, svg, pre{ max-width:100%; height:auto; }

  /* Lange Adressen und Kuerzel ohne Leerzeichen - sie brechen nicht von
     selbst und schieben die Spalte auf. */
  .abschnitt, .gemeinde-block, .spiel-panel{ overflow-wrap:anywhere; }

  /* --- 2. Der Daumen braucht Flaeche ----------------------------------- */

  /* 44px ist die Zahl, die Apple und Google seit Jahren nennen, und sie
     stimmt: Darunter steigt die Fehlerquote sichtbar.

     Nur `min-height`, nicht `height` - ein Knopf mit zwei Zeilen Text darf
     weiterhin hoeher werden. */
  .btn,
  .admin-tabelle-btn,
  .consent-btn,
  .news-knopf,
  button[type="submit"]{
    min-height:44px;
  }

  /* 16px ist die Grenze, unterhalb derer iOS beim Antippen eines Feldes in
     die Seite hineinzoomt - und danach steht die Seite verschoben da. */
  input, select, textarea{ font-size:16px; min-height:44px; }
  textarea{ min-height:120px; }

  /* --- 3. Eine Spalte, ueberall ---------------------------------------- */

  /* Die Zwei-Spalten-Raster hatten ihre eigenen Rueckfall-Regeln bei
     verschiedenen Breiten - 900px, 960px, 1100px - und einige gar keine.
     Hier stehen sie zusammen. */
  .spiel-hub-grid,
  .gemeinde-flaeche,
  .news-flaeche,
  .umfragen-flaeche,
  .studio-layout,
  .inhalt-explorer-anzeige.hat-liste{
    grid-template-columns:1fr;
  }

  /* Die Seitenspalte steht auf dem Telefon UNTER dem Inhalt - dort gehoert
     sie hin. `order` sagt das, ohne dass die Vorlage umgebaut werden muss;
     im HTML bleibt die Reihenfolge, die fuer Vorlesegeraete richtig ist. */
  .spiel-hub-seite{ order:2; }
  .spiel-hub-haupt{ order:1; }

  /* --- 4. Dialoge nehmen den Bildschirm ------------------------------- */

  /* Kein Rand, keine abgerundete Karte in der Mitte: Der Dialog steht unten
     auf und fuellt bis oben, wie es Telefone seit Jahren machen. Das ist
     nicht Mode - es haelt den Schliessen-Knopf in Daumennaehe. */
  .portal-dialog, .consent-modal{ padding:0; align-items:flex-end; }

  .portal-dialog-box, .consent-modal-box{
    max-width:none; max-height:92vh;
    border-radius:16px 16px 0 0; border-bottom:none;
  }
  .portal-dialog-scroll{ padding:24px 20px 0; }
  .portal-dialog-fuss{ padding:14px 20px calc(16px + env(safe-area-inset-bottom)); }

  /* Der Schliessen-Knopf im Fuss wird breit: Er ist auf dem Telefon der
     Weg zurueck, und ein 90px breiter Knopf in der Ecke ist ihn zu suchen. */
  .portal-dialog-fuss .btn{ width:100%; }
}

@media (max-width: 600px){
  /* Die Hauptnavigation bricht hier auf zwei bis drei Zeilen um. Ein
     waagerechter Rollbereich waere die uebliche Loesung und ist hier
     ausgeschlossen: `.hauptnav` enthaelt das Admin-Aufklappmenue, und
     `overflow-x` schnitte es ab (die Regel weiter oben sagt das auch).

     Also ein gleichmaessiges Raster statt eines ausgefransten Umbruchs.
     Drei Spalten, jeder Eintrag gleich breit und mittig - das liest sich
     als Block und nicht als Unfall. */
  .hauptnav{
    display:grid; grid-template-columns:repeat(3, 1fr);
    gap:2px; padding:6px; justify-content:stretch;
  }
  .hauptnav-eintrag,
  .hauptnav > a{
    justify-content:center; text-align:center;
    padding:10px 4px; border-radius:var(--radius-klein); min-height:44px;
    display:inline-flex; align-items:center;
  }
  .hauptnav > a:active{ background:var(--bg); }

  /* Die Fusszeile wird zur Liste - drei Spalten mit je vier Links sind auf
     375px drei Spalten mit je vier umgebrochenen Woertern. */
  .fuss-innen{ grid-template-columns:1fr; gap:20px; }

  /* Karten und Kacheln: Der Innenabstand von 20-30px frisst auf einem
     schmalen Schirm ein Sechstel der Breite. */
  .spiel-panel, .umfrage-karte, .gemeinde-block{ padding:16px 14px; }
}
/* ===========================================================================
   RPG BUILDER - EIGENE HUELLE (templates/layout/builder-basis.php)
   ===========================================================================
   Der Builder ist ein Werkzeug, kein Aushaengeschild - deshalb keine neue
   Designsprache, sondern dieselben Tokens (--bg/--oberflaeche/--border/
   --text/--akzent) wie im Rest des Portals, nur ohne Titelbild, Hauptnav,
   Werbung und Cookie-Banner. Wer im Builder arbeitet, soll sich auf die
   Tabelle konzentrieren, nicht auf die Seite drumherum.
*/
.builder-shell{ min-height:100vh; display:flex; flex-direction:column; background:var(--bg); }

.builder-shell-kopf{
  display:flex; align-items:center; gap:24px; flex-wrap:wrap;
  padding:12px 24px; background:var(--oberflaeche); border-bottom:1px solid var(--border);
  position:sticky; top:0; z-index:20;
}
.builder-shell-marke{
  font-weight:700; font-size:15px; color:var(--text); white-space:nowrap;
  padding:6px 4px;
}
.builder-shell-nav{ display:flex; flex-wrap:wrap; justify-content:center; gap:2px; flex:1; }
.builder-shell-nav a{
  padding:8px 12px; border-radius:var(--radius-klein); font-size:13.5px; color:var(--text-2);
  white-space:nowrap; transition:background .15s ease, color .15s ease;
}
.builder-shell-nav a:hover{ color:var(--text); background:var(--oberflaeche-2); }
.builder-shell-nav a.ist-aktiv{ color:var(--akzent); background:color-mix(in srgb, var(--akzent) 12%, transparent); }

.builder-shell-nutzer{ display:flex; gap:4px; align-items:center; }
.builder-shell-nutzer a{
  padding:7px 10px; border-radius:var(--radius-klein); font-size:12.5px; color:var(--text-2); white-space:nowrap;
}
.builder-shell-nutzer a:hover{ color:var(--text); background:var(--oberflaeche-2); }

.builder-shell-inhalt{ flex:1; max-width:var(--inhalt-breite-weit); width:100%; margin:0 auto; padding:24px; }

/* ---- Schnellsuche-Knopf in der Kopfleiste ---- */
.builder-shell-suche{
  display:flex; align-items:center; gap:6px; margin-right:6px;
  padding:6px 10px; border-radius:var(--radius-klein); font-size:12.5px; color:var(--text-2);
  background:var(--bg); border:1px solid var(--border); cursor:pointer;
  transition:color var(--dauer) var(--kurve), border-color var(--dauer) var(--kurve);
}
.builder-shell-suche:hover{ color:var(--text); border-color:var(--akzent); }
.builder-shell-suche kbd{
  padding:1px 5px; border-radius:4px; font-size:10.5px; font-family:inherit;
  background:var(--oberflaeche-2); border:1px solid var(--border); color:var(--text-2);
}

/* ---- Projekt-Umschalter in der Kopfleiste (2026-09-05) ---- */
.builder-projekt-waehler{
  display:flex; align-items:center; gap:6px; margin-right:6px;
  padding:5px 10px; border-radius:var(--radius-klein);
  background:var(--bg); border:1px solid var(--border);
}
.builder-projekt-waehler-label{ font-size:11px; color:var(--text-2); white-space:nowrap; }
.builder-projekt-waehler select{
  border:none; background:transparent; color:var(--text); font-size:12.5px;
  max-width:160px; cursor:pointer;
}
@media (max-width: 860px){
  .builder-projekt-waehler-label{ display:none; }
  .builder-projekt-waehler select{ max-width:100px; }
}

/* ---- Echt zentrierte Topbar des Builder Portals (2026-09-06) ----
   Eigene Klassen statt `.dash-shell-kopf` zu erweitern: Diese Klasse
   ist mit `admin-dashboard-basis.php` GETEILT (siehe dessen eigener
   Header) - eine Zentrierungsregel dort haette auch das unbeteiligte
   Haupt-Admin-Dashboard veraendert. Optisch identisch zu `.dash-shell-
   kopf`, nur mit einer echten Mitte.

   `position:relative` auf dem Container + `position:absolute;
   left:50%; transform:translateX(-50%)` auf der Mitte zentriert
   bezogen auf die GESAMTE Topbar-Breite - unabhaengig davon, wie breit
   links (Marke) oder rechts (Umschalter/Aktionen) gerade ist. Ein
   `flex:1`-Mittelfeld waere KEINE Loesung gewesen: Es zentriert sich
   nur im Rest zwischen beiden Seiten und rutscht bei jeder
   Breitenaenderung einer Seite sichtbar hin und her. */
.builder-topbar{
  position:sticky; top:0; z-index:20; display:flex; align-items:center; justify-content:space-between; gap:16px;
  padding:12px 24px; background:var(--oberflaeche); border-bottom:1px solid var(--border);
}
.builder-topbar-links, .builder-topbar-rechts{ display:flex; align-items:center; gap:10px; min-width:0; }
.builder-topbar-links{ flex:0 1 auto; }
.builder-topbar-rechts{ flex:0 1 auto; justify-content:flex-end; }
.builder-topbar-mitte{
  position:absolute; left:50%; top:50%; transform:translate(-50%, -50%);
  display:flex; justify-content:center; pointer-events:none;
}
.builder-topbar-mitte > *{ pointer-events:auto; }

.builder-topbar-suche{
  display:flex; align-items:center; gap:8px;
  padding:7px 14px; border-radius:var(--radius-rund); font-size:12.5px; color:var(--text-2);
  background:var(--bg); border:1px solid var(--border); cursor:pointer;
  max-width:min(46vw, 360px);
  transition:color var(--dauer) var(--kurve), border-color var(--dauer) var(--kurve);
}
.builder-topbar-suche:hover{ color:var(--text); border-color:var(--akzent); }
.builder-topbar-suche-kontext{ overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.builder-topbar-suche kbd{
  padding:1px 5px; border-radius:4px; font-size:10.5px; font-family:inherit;
  background:var(--oberflaeche-2); border:1px solid var(--border); color:var(--text-2); flex-shrink:0;
}

/* Unter ~860px waere links+Mitte+rechts zu eng fuer drei echte Zonen -
   die Mitte faellt wieder in den normalen Fluss zurueck (nach der
   Marke, vor den Aktionen), bevor sie irgendetwas ueberlappt. Dieselbe
   Schwelle wie die (geteilte) `.dash-sidebar`-Umschaltung weiter unten
   (2026-09-06 angeglichen) - Topbar und Sidebar wechseln jetzt am
   selben Punkt in die mobile Ansicht, statt in einer schmalen Zone
   dazwischen unterschiedlich weit umgebrochen zu sein. */
@media (max-width: 860px){
  .builder-topbar{ flex-wrap:wrap; }
  .builder-topbar-mitte{ position:static; transform:none; order:3; width:100%; }
  .builder-topbar-suche{ max-width:none; width:100%; }
}

/* ---- Schnellsuche / Command Palette (§99.9) ---- */
/* DER EIGENTLICHE FEHLER STAND HIER: Eigene CSS-Regeln haben Vorrang vor
   der Browser-eigenen Versteckregel fuer [hidden] - "display:flex" auf
   `.builder-palette` allein bedeutete, das Attribut `hidden` wurde zwar
   von JavaScript korrekt gesetzt, blieb aber wirkungslos, weil diese Regel
   es ueberstimmte. `×`, Escape und Strg+K setzten `hidden` also richtig -
   nur sichtbar war das nie. Die zweite Regel darunter macht [hidden]
   wieder wirksam, mit hoeherer Spezifitaet (Klasse + Attribut). */
.builder-palette{
  position:fixed; inset:0; z-index:200; background:rgba(0,0,0,.5);
  display:flex; align-items:flex-start; justify-content:center; padding-top:12vh;
}
.builder-palette[hidden]{ display:none; }
.builder-palette-fenster{
  width:min(560px, 92vw); background:var(--oberflaeche); border:1px solid var(--border);
  border-radius:var(--radius-gross); box-shadow:var(--erhebung-hoch); overflow:hidden;
}
.builder-palette-kopfzeile{
  display:flex; align-items:center; border-bottom:1px solid var(--border);
}
.builder-palette-feld{
  flex:1; min-width:0; border:none; background:transparent;
  color:var(--text); font-size:16px; padding:16px 18px; outline:none;
}
.builder-palette-schliessen{
  flex:0 0 auto; width:36px; height:36px; margin-right:8px; border-radius:var(--radius-klein);
  background:transparent; border:none; color:var(--text-2); font-size:20px;
  line-height:1; cursor:pointer;
}
.builder-palette-schliessen:hover{ background:var(--oberflaeche-2); color:var(--text); }
.builder-palette-liste{ list-style:none; margin:0; padding:6px; max-height:50vh; overflow-y:auto; }
.builder-palette-eintrag{
  padding:10px 12px; border-radius:var(--radius-klein); font-size:14px; color:var(--text-2); cursor:pointer;
}
.builder-palette-eintrag.ist-markiert{ background:var(--akzent); color:var(--bg); font-weight:600; }
.builder-palette-eintrag.ist-leer{ color:var(--text-2); cursor:default; }
.builder-palette-fuss{
  margin:0; padding:8px 14px; border-top:1px solid var(--border);
  font-size:11.5px; color:var(--text-2); display:flex; gap:10px;
}
.builder-palette-fuss kbd{
  padding:1px 5px; border-radius:4px; font-size:10.5px;
  background:var(--oberflaeche-2); border:1px solid var(--border);
}

@media (max-width: 780px){
  .builder-shell-kopf{ flex-direction:column; align-items:stretch; gap:8px; position:static; }
  .builder-shell-nav{ overflow-x:auto; flex-wrap:nowrap; }
  .builder-shell-nutzer{ justify-content:flex-end; }
  .builder-shell-suche{ display:none; }
}

/* ===========================================================================
   RPG BUILDER 2026 — DESIGN SYSTEM
   ===========================================================================
   Aufbauend auf den bestehenden Bausteinen - `.tafel`/`.tafel-titel` als
   Karte (siehe deren eigener Kommentar: "sechs Klassen mit fast derselben
   Flaeche" war der Fehler, den dieser Baustein beheben sollte), `.builder-
   tab`/`.builder-tabs` als Umschalter, `.builder-dash-kachel`/`.builder-leer`
   fuers Dashboard. Hier stehen nur die Bausteine, fuer die es noch KEINE
   Entsprechung gab.
*/

.builder-seite{ max-width:1180px; margin:0 auto; }
.builder-seite-titel{ font-size:14px; text-transform:uppercase; letter-spacing:.04em; color:var(--text-2); margin:24px 0 12px; }
.builder-formular-abschnitt{
  font-size:12px; text-transform:uppercase; letter-spacing:.06em; color:var(--akzent);
  margin:18px 0 8px; font-weight:700;
}
.builder-formular-abschnitt:first-child{ margin-top:0; }
.builder-spiel-anzeige{ font-size:13px; color:var(--text-2); margin:0 0 12px; }
.builder-spiel-anzeige strong{ color:var(--text); }

/* ---- Portal-Hero + Pipeline-Grafik (Phase 12, 2026-09-05) ------------- */
/* ---- Kopfbild des Builder Portals (2026-09-10, Nutzervorgabe: "als
   Header BGHell benutzen").

   ZUORDNUNG WIE AUF DER WEBSEITE, ueber KREUZ (siehe den langen Kommentar
   bei `.kopf-hintergrund`): BGHell im DUNKLEN Modus, BGDunkel im hellen.
   Der Builder startet standardmaessig dunkel - sichtbar ist hier also
   BGHell, genau wie verlangt. Wer auf Hell umschaltet, bekommt BGDunkel,
   weil ein helles Motiv auf hellem Grund verschwindet.

   Das Overlay davor ist kein Schoenheitsmittel: ohne es haengt die
   Lesbarkeit der weissen Schrift davon ab, welcher Bildausschnitt gerade
   unter der Ueberschrift liegt - und der wechselt mit der Fensterbreite. ---- */
.builder-hero{
  position:relative; overflow:hidden;
  margin-bottom:18px; padding:26px 26px 24px;
  border:1px solid var(--border); border-radius:var(--radius-gross, 14px);
  background-image:
    linear-gradient(90deg, rgba(8,10,14,.86) 0%, rgba(8,10,14,.62) 55%, rgba(8,10,14,.30) 100%),
    url('/assets/images/BGDunkel.jpg');
  background-size:cover; background-position:center;
}
:root[data-theme="dunkel"] .builder-hero{
  background-image:
    linear-gradient(90deg, rgba(8,10,14,.86) 0%, rgba(8,10,14,.62) 55%, rgba(8,10,14,.30) 100%),
    url('/assets/images/BGHell.jpg');
}
.builder-hero h1{ margin:0; font-size:26px; color:#fff; }
.builder-hero-claim{
  margin:4px 0 0; font-size:13.5px; letter-spacing:.02em;
  color:rgba(255,255,255,.78);
}
@media (max-width: 700px){
  .builder-hero{ padding:20px 18px; }
  .builder-hero h1{ font-size:21px; }
}

.builder-pipeline{
  display:flex; flex-wrap:wrap; align-items:center; gap:6px;
  padding:16px; margin-bottom:20px;
  background:var(--oberflaeche); border:1px solid var(--border); border-radius:var(--radius);
}
.builder-pipeline-schritt{
  display:inline-flex; align-items:center; gap:6px; padding:7px 12px;
  border-radius:var(--radius-rund); background:var(--oberflaeche-2); color:var(--text);
  font-size:12.5px; white-space:nowrap;
  transition:background var(--dauer) var(--kurve), transform var(--dauer) var(--kurve);
}
.builder-pipeline-schritt:hover{ background:color-mix(in srgb, var(--akzent) 16%, var(--oberflaeche-2)); transform:translateY(-1px); }
@media (prefers-reduced-motion: reduce){ .builder-pipeline-schritt:hover{ transform:none; } }
.builder-pipeline-symbol{ color:var(--akzent); }
.builder-pipeline-pfeil{ color:var(--text-2); font-size:12px; }
@media (max-width:720px){ .builder-pipeline{ flex-direction:column; align-items:stretch; } .builder-pipeline-pfeil{ display:none; } }

.builder-raster-2{ display:grid; grid-template-columns:repeat(auto-fit, minmax(320px, 1fr)); gap:16px; }
.builder-raster-3{ display:grid; grid-template-columns:repeat(auto-fit, minmax(240px, 1fr)); gap:16px; }

/* Die Dashboard-Spielkarten (`.builder-spielkarte*`) sind seit Phase 11
   (2026-09-05) durch die wiederverwendbare Entity Card ersetzt - siehe
   `templates/komponenten/entity-karte.php` und `.entity-karte*` unten. */

/* ---- Live-Vorschau: Bearbeiten/Vorschau nebeneinander in der Arbeitsflaeche.
   Der Umschalter selbst ist `.builder-tabs`/`.builder-tab` (siehe Vorlage) -
   hier steht nur die Vorschau-Flaeche, die es noch nicht gab. ---- */
.builder-vorschau-flaeche{
  border:1px solid var(--border); border-radius:var(--radius); background:var(--bg-tief);
  padding:20px; min-height:120px;
}
.builder-vorschau-hinweis{ font-size:12px; color:var(--text-2); margin:8px 2px 0; }

/* ---------- Knowledge Graph View (Phase 9b, interaktiv seit Phase 14) --- */
.builder-graph-wrapper{
  border:1px solid var(--border); border-radius:var(--radius);
  background:var(--oberflaeche); padding:8px; overflow:hidden; cursor:grab;
}
.builder-graph-wrapper.ist-am-ziehen{ cursor:grabbing; }
.builder-graph{ display:block; width:100%; height:auto; }
#builder-graph-inhalt{ transition:transform .12s var(--kurve); transform-origin:center; }
@media (prefers-reduced-motion: reduce){ #builder-graph-inhalt{ transition:none; } }
.builder-graph-linie{ stroke:var(--border); stroke-width:1.5; transition:opacity .15s var(--kurve); }
.builder-graph-linie.ist-ausgehend{ stroke:var(--akzent-tief); }
.builder-graph-linie.ist-eingehend{ stroke:var(--text-2); stroke-dasharray:4 3; }
.builder-graph-kantentext{ font-size:11px; fill:var(--text-2); transition:opacity .15s var(--kurve); }
.builder-graph-knoten{
  fill:var(--oberflaeche-2); stroke:var(--border); stroke-width:1.5;
  transition:stroke .15s var(--kurve), opacity .15s var(--kurve);
}
.builder-graph-knoten.ist-mittelpunkt{ fill:var(--akzent); stroke:var(--akzent-tief); }
.builder-graph-knotengruppe:hover .builder-graph-knoten{ stroke:var(--akzent); }
.builder-graph-knotentext{
  font-size:12px; fill:var(--text); font-weight:600; pointer-events:none;
  transition:opacity .15s var(--kurve);
}
.builder-graph-knotentext.ist-mittelpunkt{ fill:var(--oberflaeche); }
.builder-graph-knotenart{ font-size:10px; fill:var(--text-2); pointer-events:none; transition:opacity .15s var(--kurve); }

/* Hover-Hervorhebung (Phase 14): der Rest tritt zurück, der markierte
   Knoten samt Kante bleibt normal. `pointer-events:none` verhindert
   nicht das Hover selbst (das läuft über JS-Listener), nur nichts
   Zusätzliches. */
@media (prefers-reduced-motion: reduce){
  .builder-graph-linie, .builder-graph-kantentext, .builder-graph-knoten,
  .builder-graph-knotentext, .builder-graph-knotenart{ transition:none; }
}
[data-knoten].ist-gedaempft .builder-graph-linie,
[data-knoten].ist-gedaempft .builder-graph-kantentext,
[data-knoten].ist-gedaempft .builder-graph-knoten,
[data-knoten].ist-gedaempft .builder-graph-knotentext,
[data-knoten].ist-gedaempft .builder-graph-knotenart{ opacity:.25; }
[data-knoten].ist-hervorgehoben .builder-graph-linie{ stroke-width:2.5; }

.builder-graph-reset-knopf{
  margin-left:8px; padding:3px 10px; font-size:12px; border-radius:var(--radius-rund);
  border:1px solid var(--border); background:var(--oberflaeche); color:var(--text-2); cursor:pointer;
}
.builder-graph-reset-knopf:hover{ color:var(--text); border-color:var(--akzent); }


/* ===========================================================================
   NEUE ADMIN-DASHBOARD-HÜLLE MIT SIDEBAR (2026-09-05, nach Mockup)
   ===========================================================================
   Gilt fuer den GESAMTEN Admin-Bereich ausser dem RPG Builder (eigenes
   Portal, siehe .builder-shell oben) - dieselben Tokens (--bg/
   --oberflaeche/--border/--text/--akzent) wie ueberall im Portal, nur in
   einem Sidebar- statt Reiterleisten-Gerüst.
*/
.dash-shell{ min-height:100vh; display:flex; flex-direction:column; background:var(--bg); }

.dash-shell-kopf{
  display:flex; align-items:center; justify-content:space-between; gap:16px;
  padding:12px 24px; background:var(--oberflaeche); border-bottom:1px solid var(--border);
  position:sticky; top:0; z-index:20;
}
.dash-shell-marke{ font-weight:700; font-size:15px; color:var(--text); white-space:nowrap; }
.dash-shell-nutzer{ display:flex; align-items:center; gap:10px; }

.dash-glocke{
  display:inline-flex; align-items:center; gap:4px; padding:6px 10px;
  border-radius:var(--radius-klein); border:1px solid var(--border); background:var(--bg);
  color:var(--text-2); font-size:13px; text-decoration:none;
  transition:color var(--dauer) var(--kurve), border-color var(--dauer) var(--kurve);
}
.dash-glocke:hover{ color:var(--text); border-color:var(--akzent); }
.dash-glocke-zahl{ font-variant-numeric:tabular-nums; font-weight:700; color:var(--text); }

.dash-nutzermenue{ position:relative; }
.dash-nutzermenue summary{
  list-style:none; cursor:pointer; padding:6px 10px; border-radius:var(--radius-klein);
  font-size:13px; color:var(--text); white-space:nowrap;
}
.dash-nutzermenue summary::-webkit-details-marker{ display:none; }
.dash-nutzermenue summary:hover{ background:var(--oberflaeche-2); }
.dash-nutzermenue-liste{
  position:absolute; right:0; top:calc(100% + 6px); z-index:30;
  display:flex; flex-direction:column; min-width:180px;
  background:var(--oberflaeche); border:1px solid var(--border); border-radius:10px;
  padding:6px; box-shadow:0 8px 24px rgba(0,0,0,.28);
}
.dash-nutzermenue-liste a{ padding:8px 10px; border-radius:7px; font-size:13px; color:var(--text); }
.dash-nutzermenue-liste a:hover{ background:var(--oberflaeche-2); color:var(--akzent); }

.dash-shell-rumpf{ flex:1; display:flex; min-height:0; }

.dash-sidebar{
  width:220px; flex-shrink:0; background:var(--oberflaeche);
  border-right:1px solid var(--border); padding:14px 10px;
  display:flex; flex-direction:column; gap:2px;
  transition:width var(--dauer) var(--kurve), padding var(--dauer) var(--kurve);
}
@media (prefers-reduced-motion: reduce){
  .dash-sidebar{ transition:none; }
}
.dash-sidebar-punkt{
  display:flex; align-items:center; gap:10px; padding:9px 12px; border-radius:9px;
  font-size:13.5px; color:var(--text-2); white-space:nowrap;
  transition:background var(--dauer) var(--kurve), color var(--dauer) var(--kurve);
}
.dash-sidebar-punkt:hover{ color:var(--text); background:var(--oberflaeche-2); }
.dash-sidebar-punkt.ist-aktiv{ color:var(--akzent); background:color-mix(in srgb, var(--akzent) 12%, transparent); }
.dash-sidebar-icon{ font-size:15px; line-height:1; width:18px; text-align:center; }

/* ---- RPG Builder Portal (Phase 12, 2026-09-05): Themengruppen ohne
   Akkordeon - alle Punkte einer Gruppe stehen immer da, nur mit einem
   kleinen Gruppentitel getrennt statt in einzelne Fenster geklappt. ---- */
.dash-sidebar-gruppe{
  font-size:11px; text-transform:uppercase; letter-spacing:.05em; color:var(--text-2);
  padding:14px 12px 4px; font-weight:600;
}
.dash-sidebar-punkt-klein{ padding-left:22px; font-size:12.5px; }

/* ---- Builder Portal, Phase 2 (2026-09-10): Setup-Modus, Breadcrumbs,
   Statusanzeige. ---- */

/* Hinweis unter der verkuerzten Setup-Navigation. Beim eingeklappten
   Zustand ausgeblendet - in 60px Breite ist ein Satz nicht lesbar,
   sondern nur ein Zeichenbrei. */
.dash-sidebar-hinweis{
  margin:10px 12px 0; padding:9px 10px; font-size:11.5px; line-height:1.45;
  color:var(--text-2); background:var(--oberflaeche-2, var(--oberflaeche));
  border:1px solid var(--border); border-radius:var(--radius-klein);
}
html[data-sidebar="eingeklappt"] #builder-sidebar .dash-sidebar-hinweis{ display:none; }

/* Breadcrumbs. Bewusst sehr ruhig: sie sollen den Weg zeigen, nicht mit
   dem Seitentitel darunter um Aufmerksamkeit ringen. Der letzte Eintrag
   ist kein Link (siehe `Brotkrumen::letztenEntkoppeln()`) und deshalb
   auch optisch nicht als einer gesetzt. */
.builder-brotkrumen{ margin:0 0 14px; }
.builder-brotkrumen ol{
  display:flex; flex-wrap:wrap; align-items:center; gap:6px;
  margin:0; padding:0; list-style:none; font-size:12.5px; color:var(--text-2);
}
.builder-brotkrumen li{ display:flex; align-items:center; gap:6px; }
.builder-brotkrumen li + li::before{ content:"›"; color:var(--border); }
.builder-brotkrumen a{ color:var(--text-2); text-decoration:none; }
.builder-brotkrumen a:hover{ color:var(--akzent); text-decoration:underline; }
.builder-brotkrumen [aria-current="page"]{ color:var(--text); font-weight:600; }

/* Statusanzeige in der Topbar: drei Zahlen in Monospace, damit sie beim
   Wechsel der Seite nicht springen (Ziffern gleicher Breite). */
.builder-topbar-status{
  display:inline-flex; align-items:center; gap:5px;
  padding:4px 9px; border:1px solid var(--border); border-radius:var(--radius-rund);
  font-family:var(--schrift-mono, monospace); font-size:11.5px; color:var(--text-2);
  white-space:nowrap;
}
.builder-status-zahl{ color:var(--text); font-variant-numeric:tabular-nums; }
.builder-status-trenner{ color:var(--border); }
@media (max-width: 900px){
  .builder-topbar-status{ display:none; }
}

/* ---- Sidebar einklappen (2026-09-06, Builder Portal - Master-Prompt:
   "collapsible icon+tooltip sidebar"). Zustand steht als `data-sidebar`
   am <html>-Element (siehe Inline-Script im Layout), nicht an dieser
   Klasse selbst - `#builder-sidebar` ist nur im Builder Portal
   vorhanden, `admin-dashboard-basis.php`s eigene `.dash-sidebar` bleibt
   deshalb unberuehrt, auch wenn dort irgendwann derselbe Zustand am
   <html>-Element stehen sollte. `.dash-sidebar-label` existiert nur in
   den `$navPunkt()`-Punkten des Builder Portals - die Regel wirkt daher
   ohnehin nur dort. `title` auf jedem Punkt ist das Tooltip - kein
   eigenes JS-Tooltip noetig. ---- */
.dash-sidebar-toggle{
  display:flex; align-items:center; justify-content:center; align-self:flex-end;
  width:26px; height:26px; margin:0 4px 6px; border-radius:7px; flex-shrink:0;
  background:transparent; border:1px solid var(--border); color:var(--text-2);
  font-size:13px; cursor:pointer;
  transition:color var(--dauer) var(--kurve), border-color var(--dauer) var(--kurve), transform var(--dauer) var(--kurve);
}
.dash-sidebar-toggle:hover{ color:var(--text); border-color:var(--akzent); }
html[data-sidebar="eingeklappt"] #builder-sidebar{ width:60px; padding-left:6px; padding-right:6px; }
html[data-sidebar="eingeklappt"] #builder-sidebar .dash-sidebar-label,
html[data-sidebar="eingeklappt"] #builder-sidebar .dash-sidebar-gruppe{ display:none; }
html[data-sidebar="eingeklappt"] #builder-sidebar .dash-sidebar-punkt{ justify-content:center; padding:9px 0; gap:0; }
html[data-sidebar="eingeklappt"] #builder-sidebar .dash-sidebar-punkt-klein{ padding-left:0; }
html[data-sidebar="eingeklappt"] #builder-sidebar .dash-sidebar-toggle{ align-self:center; transform:rotate(180deg); }
@media (prefers-reduced-motion: reduce){
  .dash-sidebar-toggle{ transition:none; }
}

/* ---- Baumstruktur (zweites Mockup, 2026-09-05): Zweige mit Kindern ---- */
.dash-sidebar-zweig{ display:flex; flex-direction:column; }
.dash-sidebar-zweig summary{ list-style:none; cursor:pointer; }
.dash-sidebar-zweig summary::-webkit-details-marker{ display:none; }
.dash-sidebar-zweig summary::after{
  content:'▸'; margin-left:auto; font-size:10px; color:var(--text-2);
  transition:transform var(--dauer) var(--kurve);
}
.dash-sidebar-zweig[open] summary::after{ transform:rotate(90deg); }
.dash-sidebar-kinder{ display:flex; flex-direction:column; padding-left:30px; gap:1px; }
.dash-sidebar-kind{
  padding:6px 10px; border-radius:7px; font-size:12.5px; color:var(--text-2);
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}
.dash-sidebar-kind:hover{ color:var(--text); background:var(--oberflaeche-2); }
.dash-sidebar-kind.ist-aktiv{ color:var(--akzent); background:color-mix(in srgb, var(--akzent) 12%, transparent); }

.dash-shell-inhalt{ flex:1; min-width:0; padding:24px; max-width:var(--inhalt-breite-weit); margin:0 auto; width:100%; }

.admin-log{
  background:var(--oberflaeche); border:1px solid var(--border); border-radius:var(--radius);
  padding:14px; font-family:var(--schrift-mono, monospace); font-size:12px; line-height:1.5;
  color:var(--text-2); overflow-x:auto; max-height:70vh; overflow-y:auto;
}

.dash-statusleiste{
  display:flex; flex-wrap:wrap; gap:18px; padding:10px 24px;
  background:var(--oberflaeche); border-top:1px solid var(--border);
  font-size:12.5px; color:var(--text-2);
}

/* ===========================================================================
   ENTITY CARD (RPG Builder Portal, Phase 11 - 2026-09-05)
   ===========================================================================
   Eine Karte statt einer Tabellenzeile, wo mehr auf einen Blick zaehlt als
   ein Name: Icon+Farbe der Gruppe, Titel, Untertitel, bis zu drei
   Kennzahlen. `prefers-reduced-motion` haelt den Hebe-Effekt beim Hover
   zurueck, wer das so eingestellt hat.
*/
.entity-karte{
  display:flex; flex-direction:column; gap:4px; padding:16px;
  background:var(--oberflaeche); border:1px solid var(--border); border-radius:var(--radius);
  border-left:3px solid var(--gruppen-farbe, var(--border));
  color:inherit; text-decoration:none; position:relative;
  transition:transform var(--dauer) var(--kurve), border-color var(--dauer) var(--kurve);
}
a.entity-karte:hover{
  border-color:var(--gruppen-farbe, var(--akzent));
  transform:translateY(-2px);
}
@media (prefers-reduced-motion: reduce){
  a.entity-karte:hover{ transform:none; }
}
.entity-karte.ist-figuren{ --gruppen-farbe:var(--gruppe-figuren); }
.entity-karte.ist-welt{ --gruppen-farbe:var(--gruppe-welt); }
.entity-karte.ist-sachen{ --gruppen-farbe:var(--gruppe-sachen); }
.entity-karte.ist-koennen{ --gruppen-farbe:var(--gruppe-koennen); }
.entity-karte.ist-aufgaben{ --gruppen-farbe:var(--gruppe-aufgaben); }

/* ---- Detail-Panel: Eintrittsanimation statt Drawer-Umbau (2026-09-06,
   Master-Prompt "detail-drawer") - siehe Kommentar in
   `arbeitsflaeche.php` beim `.builder-detail-panel`-Element: ein echter
   AJAX-Drawer haette bestehende Formular-/Schreiblogik anfassen müssen,
   das war dem Betreiber zu riskant. Reines CSS `@keyframes` statt einer
   `transition` - eine Transition braucht zwei Zustände auf demselben
   Element, hier entsteht das Element aber bei jeder Navigation frisch
   (kein JS-Swap), eine Animation spielt beim Erscheinen von selbst. ---- */
@keyframes builder-detail-einsetzen{
  from{ opacity:0; transform:translateX(14px); }
  to{ opacity:1; transform:translateX(0); }
}
.builder-detail-panel{ animation:builder-detail-einsetzen .28s var(--kurve); }
@media (prefers-reduced-motion: reduce){
  .builder-detail-panel{ animation:none; }
}

.entity-karte-icon{
  display:inline-flex; align-items:center; justify-content:center;
  width:34px; height:34px; border-radius:9px; font-size:16px; font-weight:700;
  background:color-mix(in srgb, var(--gruppen-farbe, var(--text-2)) 18%, transparent);
  color:var(--gruppen-farbe, var(--text-2));
  margin-bottom:4px;
}
.entity-karte-titel{ font-size:15px; font-weight:700; color:var(--text); }
.entity-karte-untertitel{ font-size:12.5px; color:var(--text-2); }
.entity-karte-status{
  position:absolute; top:14px; right:14px; font-size:11px; padding:2px 8px;
  border-radius:var(--radius-rund); background:var(--oberflaeche-2); color:var(--text-2);
}
.entity-karte-kennzahlen{ font-size:12px; color:var(--text-2); margin-top:6px; }
.entity-karte-kennzahlen strong{ color:var(--text); font-variant-numeric:tabular-nums; }

.entity-karten{ display:grid; grid-template-columns:repeat(auto-fill, minmax(220px, 1fr)); gap:14px; }

/* Spiel direkt aus der Übersicht löschen (2026-09-07) - die Karte
   selbst ist ein `<a>` (siehe `entity-karte.php`), der Löschen-Knopf
   sitzt deshalb als eigenes, absolut positioniertes Element in der
   Ecke statt darin verschachtelt zu sein. Unsichtbar bis Hover/Fokus -
   sonst würde jede Spielkarte staendig eine rote Flaeche zeigen, auch
   wenn niemand löschen will. */
.builder-spielkarte-wrapper{ position:relative; }
.builder-spielkarte-loeschen{
  position:absolute; top:8px; right:8px; z-index:1;
  opacity:0; transition:opacity .15s ease;
}
.builder-spielkarte-wrapper:hover .builder-spielkarte-loeschen,
.builder-spielkarte-wrapper:focus-within .builder-spielkarte-loeschen{ opacity:1; }
@media (prefers-reduced-motion: reduce){
  .builder-spielkarte-loeschen{ transition:none; }
}

/* ---------- Builder-Typ-Hero (Phase 14b, eigene Builder-Seite je Typ) --

   Dieselben Gruppenfarben wie die Entity Card (`--gruppen-farbe`) - kein
   zweites Farbsystem für dieselbe Unterscheidung. Steht anstelle der
   frueheren, fuer alle Typen gleichen Ueberschrift. */
/* ---- Spiel-Übersicht: Datenstatus + Kennzahlen-Kacheln + Release-
   Timeline (Auftrag 3, Phase B, 2026-09-06). Ausschliesslich bestehende
   Tokens (`--akzent`/`--erfolg`/`--schrift-mono`) - keine neue
   Farbpalette neben dem Dark-/Light-Theme, wie im Plan festgehalten. ---- */
.builder-uebersicht-status{ margin-bottom:20px; }
.builder-datenstatus{ display:flex; align-items:center; gap:12px; margin-bottom:16px; }
.builder-datenstatus-balken{
  flex:1; height:10px; border-radius:var(--radius-rund); background:var(--bg);
  border:1px solid var(--border); overflow:hidden;
}
.builder-datenstatus-balken > div{
  height:100%; border-radius:var(--radius-rund); background:var(--erfolg, var(--akzent));
  transition:width var(--dauer) var(--kurve);
}
@media (prefers-reduced-motion: reduce){
  .builder-datenstatus-balken > div{ transition:none; }
}
.builder-datenstatus-zahl{
  font-family:var(--schrift-mono); font-size:13px; font-weight:700; color:var(--text);
  flex:none; width:48px; text-align:right;
}
.builder-kennzahlen-kacheln{ display:flex; flex-wrap:wrap; gap:22px; }
.builder-kennzahl{ display:flex; flex-direction:column; gap:2px; }
.builder-kennzahl strong{
  font-family:var(--schrift-mono); font-size:20px; color:var(--text); font-variant-numeric:tabular-nums;
}
.builder-kennzahl span{ font-size:11.5px; color:var(--text-2); text-transform:uppercase; letter-spacing:.03em; }

.builder-release-timeline{ list-style:none; margin:0 0 20px; padding:0; display:flex; flex-direction:column; gap:2px; }
.builder-release-timeline li{
  display:flex; align-items:center; gap:14px; padding:8px 12px; border-radius:var(--radius-klein);
  background:var(--oberflaeche); border:1px solid var(--border); font-size:13px;
}
.builder-release-jahr{
  font-family:var(--schrift-mono); font-weight:700; color:var(--akzent); flex:none; width:48px;
}
.builder-release-fassung{ flex:1; min-width:0; color:var(--text); }
.builder-release-plattform{ color:var(--text-2); }
.builder-release-region{
  font-family:var(--schrift-mono); font-size:11px; color:var(--text-2);
  padding:2px 7px; border-radius:5px; background:var(--bg); border:1px solid var(--border);
}

.builder-typ-hero{
  display:flex; align-items:center; gap:16px;
  padding:20px 22px; margin-bottom:20px;
  background:var(--oberflaeche); border:1px solid var(--border); border-radius:14px;
  border-left:4px solid var(--gruppen-farbe, var(--akzent));
}
.builder-typ-hero.ist-figuren{ --gruppen-farbe:var(--gruppe-figuren); }
.builder-typ-hero.ist-welt{ --gruppen-farbe:var(--gruppe-welt); }
.builder-typ-hero.ist-sachen{ --gruppen-farbe:var(--gruppe-sachen); }
.builder-typ-hero.ist-koennen{ --gruppen-farbe:var(--gruppe-koennen); }
.builder-typ-hero.ist-aufgaben{ --gruppen-farbe:var(--gruppe-aufgaben); }
.builder-typ-hero-icon{
  display:inline-flex; align-items:center; justify-content:center; flex:none;
  width:52px; height:52px; border-radius:14px; font-size:26px; font-weight:700;
  background:color-mix(in srgb, var(--gruppen-farbe, var(--text-2)) 18%, transparent);
  color:var(--gruppen-farbe, var(--text-2));
}
.builder-typ-hero-spiel{ font-size:12.5px; color:var(--text-2); margin:0 0 2px; }
.builder-typ-hero h1{ margin:0; font-size:22px; letter-spacing:.01em; }

/* ---------- Zweispaltige Builder-Flaeche (Phase 14b, ersetzt die alte
   generische Drei-Spalten-Flaeche mit dem Projekt-Explorer aller Typen) */
.builder-flaeche-zwei{ grid-template-columns:340px 1fr; }
@media (max-width: 1100px){
  .builder-flaeche-zwei{ grid-template-columns:280px 1fr; }
}
@media (max-width: 720px){
  .builder-flaeche-zwei{ grid-template-columns:1fr; }
}

/* ---- Äussere Fläche: Hauptspalte + Live-Ansicht im RPG Explorer
   (2026-09-06) - umschliesst JEDEN Zustand der Arbeitsfläche
   (Spiel-Übersicht, Inhaltsart-Liste, Eintrag), nicht nur die
   Eintragsansicht wie zuerst gebaut. Zweite Nutzerkorrektur: "mit RPG
   Explorer als LIVE ANSICHT meine ich auch die Spielübersicht" - die
   Vorlage waehlt die passende Explorer-Adresse (Startseite/Kategorie/
   Eintrag) selbst, hier nur EINE Spalten-Aufteilung dafuer noetig.

   Breite grosszuegig (Nutzerangabe: 40"-Monitor, "es ist Platz genug") -
   deutlich mehr als eine schmale Randspalte, waechst auf sehr breiten
   Bildschirmen zusaetzlich mit (siehe `minmax()` unten), bleibt aber
   nach oben begrenzt, damit die Hauptspalte nicht zu schmal wird.

   Korrektur (2026-09-06, dritte Nutzerkorrektur): "es wird immer noch
   nicht der RPG EXPLORER RECHTS ANGEZEIGT ER ÜBERDECKT ALLES". Der
   alte Umbruch bei 1500px war zu hoch angesetzt - die Sidebar der
   `builder-portal-basis.php`-Hülle und der Seiteninnenabstand ziehen
   davon schon einiges ab, auf vielen reellen Fenstergrössen (auch auf
   breiten Monitoren, sobald das Fenster nicht randlos-maximiert oder
   der Browser-Zoom über 100% ist) griff der Umbruch VIEL frueher als
   gedacht - dann stand die 85vh hohe Vorschau nicht rechts, sondern
   direkt unter dem noch kurzen Seiteninhalt und wirkte wie eine
   Ueberdeckung der ganzen Seite. Mindestbreite der Spalte und
   Umbruchpunkt beide gesenkt, damit die Zweispaltigkeit auf realistisch
   breiten Fenstern bestehen bleibt; zusaetzlich schrumpft die
   Vorschauhoehe im (jetzt selteneren) Einspalten-Fall, damit sie dort
   nie den ganzen sichtbaren Bereich fuellt.

   Fuenfte Korrektur, jetzt der eigentliche Kern des Problems
   (2026-09-06, Nutzer hat den Seitenquelltext selbst geprueft - die
   Struktur war die ganze Zeit korrekt): `34vw` bezieht sich auf die
   BILDSCHIRMBREITE - aber `.builder-seite` (der gemeinsame Vorfahre
   von Haupt- und Explorer-Spalte) ist auf `max-width:1180px`
   begrenzt. Auf jedem normal breiten Monitor ist 34vw laengst groesser
   als die Haelfte von 1180px; das Grid gibt der Explorer-Spalte dann
   fast den GESAMTEN 1180px-Rahmen und druecht die Hauptspalte auf
   praktisch 0 - ihr Inhalt (Titel, Kennzahlen, Links) passt dort nicht
   mehr hin und lief sichtbar unter das Explorer-Panel statt sauber
   daneben zu stehen. Das erklaert die Ueberlappung unabhaengig von
   Zoom, Aufloesung oder Cache - alles vorherige war zwar je ein echter
   Fehler, aber keiner von ihnen war DIESER.
   Ein Prozentwert (`%`) bezieht sich in `grid-template-columns` auf
   die Breite des Grid-CONTAINERS selbst (hier durch `.builder-seite`
   effektiv auf maximal 1180px begrenzt), nicht auf den Bildschirm -
   genau das war gemeint. */
.builder-aussenflaeche{
  display:grid; grid-template-columns:minmax(0,1fr) minmax(380px, 38%);
  gap:28px; align-items:start;
}
.builder-hauptspalte{ min-width:0; }
@media (max-width: 1020px){
  .builder-aussenflaeche{ grid-template-columns:1fr; }
  .builder-explorer-vorschau-rahmen{ height:60vh; min-height:380px; }
}

/* Vierte Korrektur zum selben Thema (2026-09-06): "wenn ich ganz nah
   reinzoome verschiebt es sich nach rechts" - bei Bildschirm-Zoom
   (Nutzer meldet 3440x1440, also kein zu schmaler Umbruchpunkt) hat
   sich das Panel sichtbar von seiner Spalte geloest und verschoben.
   Genau dieses Fehlbild ist ein bekanntes Verhalten von
   `position:sticky` bei Nicht-100%-Zoom in Chromium - die Spalte
   klebt dann nicht an ihrem Platz im Grid, sondern an der (beim Zoomen
   verschobenen) Visual-Viewport-Kante. `position:sticky` war hier ohnehin
   nur ein "bleibt beim Scrollen sichtbar"-Komfort, kein Teil der
   eigentlichen Anforderung ("rechts, nicht ueberdeckend") - im Zweifel
   lieber ganz normal im Grid-Fluss (`static`) als layoutbrechend bei
   Zoom. */
.builder-explorer-vorschau{ position:static; display:flex; flex-direction:column; gap:8px; }
.builder-explorer-vorschau-kopf{ display:flex; align-items:center; justify-content:space-between; gap:8px; }
.builder-explorer-vorschau-kopf .builder-seite-titel{ margin:0; }
.builder-explorer-vorschau-rahmen{
  width:100%; height:85vh; min-height:520px; border:1px solid var(--border);
  border-radius:var(--radius-gross); background:var(--bg);
}

/* ---------- Level-Übersicht je Charakter (2026-09-07) ------------------
   Level 1-99 x mehrere Merkmale - lang und breit, deshalb ein eigener
   Rollbereich innerhalb des `dialog`-Fensters statt das ganze Fenster
   sprengen zu lassen. Kopfzeile bleibt beim Scrollen stehen (`position:
   sticky`), damit man bei Zeile 80 noch weiss, welche Spalte welches
   Merkmal ist. */
.builder-level-scroll{ max-height:60vh; overflow:auto; margin:12px 0; }
.builder-level-tabelle{ border-collapse:collapse; width:100%; font-size:12.5px; }
.builder-level-tabelle th, .builder-level-tabelle td{
  padding:4px 6px; border:1px solid var(--border); text-align:left; white-space:nowrap;
}
.builder-level-tabelle thead th{
  position:sticky; top:0; background:var(--oberflaeche-2); z-index:1;
}
.builder-level-tabelle th[scope="row"]{
  position:sticky; left:0; background:var(--oberflaeche-2); font-variant-numeric:tabular-nums;
}
.builder-level-tabelle input[type="text"]{
  width:64px; padding:2px 4px; font-size:12.5px; font-family:var(--schrift-mono);
}
.builder-level-gelernt{ color:var(--akzent); white-space:normal; min-width:160px; }

/* ---------- Itemfamilien Builder (2026-09-05) -------------------------- */

.familien-anlegen{ display:flex; flex-direction:column; gap:10px; }
.familien-anlegen select,
.familien-anlegen input[type="text"]{ width:100%; }

/* "+ Kategorie hinzufügen" (2026-09-10): zugeklappt unter "Neue Familie" -
   eine neue Inhaltsart legt man selten an, eine Familie oft. */
.familien-kategorie{ margin-top:22px; padding-top:16px; border-top:1px solid var(--border); }
.familien-kategorie > summary{
  cursor:pointer; font-weight:600; color:var(--akzent); list-style:none;
  padding:4px 0; user-select:none;
}
.familien-kategorie > summary::-webkit-details-marker{ display:none; }
.familien-kategorie > summary:hover{ text-decoration:underline; }
.familien-kategorie[open] > summary{ margin-bottom:12px; }

/* Familien direkt im Baum anlegen (2026-09-10). Das Wurzel-Feld steht unter
   jeder Kategorie-Überschrift; das "+" je Zeile klappt ein kleines Feld für
   eine Unterfamilie auf. Beides bewusst unaufdringlich - der Baum soll
   lesbar bleiben, auch wenn hundert Familien darin stehen. */
.familien-plus-wurzel,
.familien-plus-unter form{ display:flex; gap:6px; align-items:center; margin:4px 0 8px; }
.familien-plus-wurzel input[type="text"],
.familien-plus-unter input[type="text"]{ flex:1; min-width:0; font-size:12.5px; padding:5px 8px; }
.familien-plus-unter{ display:inline-block; margin-left:6px; }
.familien-plus-unter > summary{
  display:inline-flex; align-items:center; justify-content:center;
  width:20px; height:20px; border:1px solid var(--border); border-radius:5px;
  cursor:pointer; list-style:none; color:var(--text-2); font-size:13px; line-height:1;
}
.familien-plus-unter > summary::-webkit-details-marker{ display:none; }
.familien-plus-unter > summary:hover{ color:var(--akzent); border-color:var(--akzent); }
.familien-plus-unter[open]{ display:block; margin:6px 0 4px 0; }

/* ---- Setup-Assistent (Phase 4, 2026-09-10) ---- */
.setup-schritte{
  display:flex; flex-wrap:wrap; gap:8px; list-style:none; margin:0 0 18px; padding:0;
}
.setup-schritt a{
  display:flex; align-items:center; gap:8px; padding:8px 12px;
  border:1px solid var(--border); border-radius:var(--radius-rund);
  color:var(--text-2); text-decoration:none; font-size:13px; background:var(--oberflaeche);
}
.setup-schritt a:hover{ border-color:var(--akzent); color:var(--text); }
.setup-schritt-nummer{
  display:inline-flex; align-items:center; justify-content:center;
  width:22px; height:22px; border-radius:50%; border:1px solid var(--border);
  font-size:12px; font-weight:600;
}
.setup-schritt-anzahl{ font-family:var(--schrift-mono, monospace); font-size:11px; opacity:.7; }
.setup-schritt.ist-erledigt .setup-schritt-nummer{ background:var(--akzent); border-color:var(--akzent); color:#111; }
.setup-schritt.ist-aktiv a{ border-color:var(--akzent); color:var(--text); font-weight:600; }
.setup-inhalt p{ max-width:72ch; }
.setup-uebersicht{ margin:12px 0; padding-left:18px; line-height:1.9; }
.setup-ok{ margin-left:6px; font-size:12px; color:var(--akzent); }
.setup-schnell{
  display:flex; flex-wrap:wrap; align-items:flex-end; gap:12px; margin:16px 0 20px;
}
.setup-schnell label{ display:flex; flex-direction:column; gap:4px; font-size:12.5px; min-width:180px; }
.setup-liste{ margin:14px 0; }
.setup-liste h3{ font-size:13px; color:var(--text-2); margin:0 0 6px; }
.setup-chips{ display:flex; flex-wrap:wrap; gap:6px; margin:0; }
.setup-chip{
  padding:3px 10px; border:1px solid var(--border); border-radius:var(--radius-rund); font-size:12.5px;
}
.setup-matrix select{ font-size:12px; padding:3px 4px; max-width:110px; }
.setup-matrix-form .btn{ margin-top:14px; }
.setup-navigation{ display:flex; align-items:center; gap:10px; margin-top:18px; }
.setup-navigation .setup-spaeter{ margin:0 auto 0 0; }
.setup-navigation > a.btn:last-child{ margin-left:auto; }
@media (max-width: 700px){
  .setup-schnell label{ min-width:100%; }
}

.familien-artueberschrift{ font-size:13px; color:var(--text-2); margin:18px 0 6px; }
.familien-artueberschrift:first-child{ margin-top:0; }
.familien-baum{ list-style:none; margin:0 0 4px; padding:0; display:flex; flex-direction:column; gap:2px; }
.familien-zeile{
  display:flex; align-items:center; gap:10px; flex-wrap:wrap;
  padding:7px 10px; border-radius:7px;
}
.familien-zeile:hover{ background:var(--oberflaeche-2); }
.familien-umbenennen-form{ display:flex; align-items:center; gap:6px; flex:1 1 220px; min-width:0; }
.familien-umbenennen-form input[type="text"]{
  flex:1 1 auto; min-width:0; border:1px solid transparent; background:transparent;
  padding:4px 6px; border-radius:6px; color:var(--text); font-size:14px;
}
.familien-umbenennen-form input[type="text"]:hover,
.familien-umbenennen-form input[type="text"]:focus{
  border-color:var(--border); background:var(--oberflaeche);
}
.familien-kennzahlen{ font-size:12px; color:var(--text-2); white-space:nowrap; }
.familien-loeschen-form{ display:inline; }
.familien-loeschen-gesperrt{ color:var(--text-2); opacity:.4; font-size:13px; }

/* ---- Familien-Detailansicht: Spielausprägungen im Vergleich (2026-09-06) ---- */
.familien-vergleich-wrapper{ overflow-x:auto; }
.familien-vergleichstabelle{ width:100%; border-collapse:collapse; font-size:13.5px; }
.familien-vergleichstabelle th{
  text-align:left; padding:8px 12px; font-size:11.5px; text-transform:uppercase;
  letter-spacing:.03em; color:var(--text-2); border-bottom:1px solid var(--border);
  white-space:nowrap;
}
.familien-vergleichstabelle td{
  padding:9px 12px; border-bottom:1px solid var(--border); white-space:nowrap;
  font-variant-numeric:tabular-nums;
}
.familien-vergleichstabelle tbody tr:hover{ background:var(--oberflaeche-2); }

.btn-gefahr{ color:var(--text-2); }
.btn-gefahr:hover{ border-color:var(--fehler); color:var(--fehler); }

/* ---------- Elemente-/Statuseffekte-Builder (2026-09-05) --------------- */

.katalog-formular{ display:flex; flex-direction:column; gap:10px; }
.katalog-formular input[type="text"]{ width:100%; }

.katalog-liste{ list-style:none; margin:0; padding:0; display:flex; flex-direction:column; gap:4px; }
.katalog-zeile{ display:flex; align-items:center; gap:8px; flex-wrap:wrap; padding:6px 8px; border-radius:7px; }
.katalog-zeile:hover{ background:var(--oberflaeche-2); }
.katalog-zeilenformular{ display:flex; align-items:center; gap:6px; flex:1 1 auto; min-width:0; flex-wrap:wrap; }
.katalog-zeilenformular input[type="text"]{
  border:1px solid transparent; background:transparent; color:var(--text);
  padding:4px 6px; border-radius:6px; font-size:13.5px;
}
.katalog-zeilenformular input[type="text"]:hover,
.katalog-zeilenformular input[type="text"]:focus{ border-color:var(--border); background:var(--oberflaeche); }
.katalog-feld-schluessel{ width:90px; }
.katalog-feld-name{ width:130px; }
.katalog-feld-symbol{ width:60px; }
.katalog-feld-farbe{ width:90px; }
.katalog-nur-spiel{ font-size:11px; color:var(--text-2); white-space:nowrap; }
.katalog-loeschen-form{ display:inline; }

/* ---------- "Spiel zusammenstellen" (Phase 15, 2026-09-05) ------------- */

.zusammenstellen-kacheln{
  display:grid; grid-template-columns:repeat(auto-fit, minmax(140px, 1fr)); gap:12px;
  margin-bottom:24px;
}
.zusammenstellen-kachel{
  display:flex; flex-direction:column; gap:4px; padding:14px 16px;
  background:var(--oberflaeche); border:1px solid var(--border); border-radius:var(--radius);
}
.zusammenstellen-kachel strong{ font-size:24px; font-variant-numeric:tabular-nums; }
.zusammenstellen-kachel span{ font-size:12px; color:var(--text-2); }
.zusammenstellen-kachel.ist-warnung strong{ color:var(--warnung); }
.zusammenstellen-kachel.ist-erfolg strong{ color:var(--erfolg); }

.zusammenstellen-baum{ display:grid; grid-template-columns:repeat(auto-fill, minmax(240px, 1fr)); gap:14px; margin-bottom:24px; }
.zusammenstellen-gruppe h3{ margin:0 0 8px; font-size:14px; }
.zusammenstellen-artenliste{ list-style:none; margin:0; padding:0; display:flex; flex-direction:column; gap:4px; }
.zusammenstellen-artzeile{
  display:flex; align-items:center; gap:8px; flex-wrap:wrap;
  padding:5px 8px; border-radius:7px; font-size:13.5px;
}
.zusammenstellen-artzeile.ist-luecke{ background:color-mix(in srgb, var(--warnung) 8%, transparent); }
.zusammenstellen-artsymbol{ opacity:.8; }
.zusammenstellen-artzahl{ margin-left:auto; font-size:12px; color:var(--text-2); font-variant-numeric:tabular-nums; }
.zusammenstellen-auswahl{
  margin-left:auto; max-width:190px; font-size:12px; padding:3px 6px;
  border-radius:6px; border:1px solid var(--border); background:var(--oberflaeche); color:var(--text);
}
.builder-typ-hero-aktion{ margin-left:auto; white-space:nowrap; }
.zusammenstellen-artluecke{ margin-left:auto; font-size:12px; color:var(--warnung); }
.zusammenstellen-erstellen{ font-size:12px; white-space:nowrap; }

.zusammenstellen-pruefliste{ list-style:none; margin:0; padding:0; display:flex; flex-direction:column; gap:6px; }
.zusammenstellen-pruefliste li{
  padding:8px 12px; border-radius:var(--radius-klein); background:var(--oberflaeche); border:1px solid var(--border);
  display:flex; flex-wrap:wrap; align-items:center; gap:8px; font-size:13.5px;
}

/* ---- Validation Engine: Fehler/Warnung/Hinweis (Phase 6, bisher ohne
   eigene CSS - benutzt seit Phase 15 auch die Zusammenstellen-Seite) ---- */
.builder-pruefung{ list-style:none; margin:0 0 16px; padding:0; display:flex; flex-direction:column; gap:4px; }
.builder-pruefung li{ font-size:13px; padding:6px 10px; border-radius:7px; }
.builder-pruefung-fehler{ color:var(--fehler); background:color-mix(in srgb, var(--fehler) 10%, transparent); }
.builder-pruefung-warnung{ color:var(--warnung); background:color-mix(in srgb, var(--warnung) 10%, transparent); }
.builder-pruefung-hinweis{ color:var(--text-2); }

/* ---- Qualitäts-Dashboard auf der Übersicht (2026-09-06, Master-Prompt
   "quality dashboard") - dieselben Farben wie `.builder-pruefung-*`
   (Fehler/Warnung), aber als kompakte Pillen statt Listenzeilen, da hier
   mehrere Zahlen nebeneinander stehen statt einzeln untereinander. ---- */
.builder-qualitaet-summe{ display:flex; align-items:center; gap:12px; flex-wrap:wrap; margin-bottom:10px; }
.builder-qualitaet-zahl{
  font-size:13px; font-weight:600; padding:4px 10px; border-radius:var(--radius-rund);
}
.builder-qualitaet-zahl.ist-fehler{ color:var(--fehler); background:color-mix(in srgb, var(--fehler) 12%, transparent); }
.builder-qualitaet-zahl.ist-warnung{ color:var(--warnung); background:color-mix(in srgb, var(--warnung) 12%, transparent); }
.builder-qualitaet-liste{ list-style:none; margin:0; padding:0; display:flex; flex-direction:column; gap:2px; }
.builder-qualitaet-liste li{
  display:flex; align-items:center; justify-content:space-between; gap:10px;
  padding:7px 4px; font-size:13px; border-top:1px solid var(--border);
}
.builder-qualitaet-liste li:first-child{ border-top:none; }
.builder-qualitaet-liste-zahlen{ display:flex; gap:10px; font-size:12px; flex-shrink:0; }
.builder-qualitaet-liste-zahlen .ist-fehler{ color:var(--fehler); }
.builder-qualitaet-liste-zahlen .ist-warnung{ color:var(--warnung); }

/* ---------- Breadcrumb (2026-09-05, "eigenständige App"-Gefühl) --------
   Ersetzt den blossen "<- Übersicht"-Link auf den Builder-Seiten durch
   eine Pfadleiste - zeigt auf einen Blick, wo man ist, nicht nur, wie
   man zurückkommt. */
.builder-breadcrumb{
  display:flex; align-items:center; flex-wrap:wrap; gap:6px;
  font-size:12.5px; color:var(--text-2); margin-bottom:10px;
}
.builder-breadcrumb a{ color:var(--text-2); text-decoration:none; }
.builder-breadcrumb a:hover{ color:var(--akzent); text-decoration:underline; }
.builder-breadcrumb-trenner{ opacity:.5; }
.builder-breadcrumb-aktuell{ color:var(--text); font-weight:600; }
.builder-breadcrumb-nebenlink{ margin-left:auto; color:var(--akzent) !important; text-decoration:none; }
.builder-breadcrumb-nebenlink:hover{ text-decoration:underline; }

@media (max-width: 860px){
  .dash-shell-rumpf{ flex-direction:column; }
  .dash-sidebar{
    width:100%; flex-direction:row; flex-wrap:wrap; border-right:none;
    border-bottom:1px solid var(--border);
  }
  .dash-sidebar-punkt{ font-size:12.5px; padding:7px 10px; }

  /* Das Einklappen (siehe oben, `#builder-sidebar`) ist ein Desktop-
     Konzept - schmale Sidebar neben breitem Inhalt. Auf dieser Breite
     ist die Sidebar bereits eine volle Zeile ueber dem Inhalt; "auf
     60px einklappen" ergaebe hier eine Mini-Leiste ohne erkennbaren
     Vorteil. Der Knopf verschwindet, ein evtl. am Desktop gemerkter
     `data-sidebar="eingeklappt"`-Zustand wird auf dieser Breite
     ignoriert statt eine zweite, mobile Ansicht des Einklappens zu
     erfinden. */
  .dash-sidebar-toggle{ display:none; }
  html[data-sidebar="eingeklappt"] #builder-sidebar{ width:100%; padding:14px 10px; }
  html[data-sidebar="eingeklappt"] #builder-sidebar .dash-sidebar-label{ display:inline; }
  html[data-sidebar="eingeklappt"] #builder-sidebar .dash-sidebar-gruppe{ display:block; }
  html[data-sidebar="eingeklappt"] #builder-sidebar .dash-sidebar-punkt{ justify-content:flex-start; padding:7px 10px; gap:10px; }
}

/* ---------- Inhalt des neuen Dashboards selbst ("dash2") --------------- */
.dash2-kopf h1{ margin-bottom:2px; }
.dash2-gruss{ font-weight:600; color:var(--text); margin:0; }
.dash2-trenner{ border:none; border-top:1px solid var(--border); margin:22px 0; }
.dash2-titel{ font-size:14px; text-transform:uppercase; letter-spacing:.04em; color:var(--text-2); margin:0 0 14px; }

.dash2-kacheln{ display:grid; grid-template-columns:repeat(auto-fit, minmax(170px, 1fr)); gap:14px; }
.dash2-kachel{
  display:flex; flex-direction:column; gap:4px; padding:16px;
  background:var(--oberflaeche); border:1px solid var(--border); border-radius:var(--radius);
}
.dash2-kachel-wert{ font-size:24px; font-weight:700; color:var(--text); font-variant-numeric:tabular-nums; }
.dash2-kachel-label{ font-size:12.5px; color:var(--text-2); }
.dash2-kachel-trend{ font-size:12px; color:var(--akzent); font-variant-numeric:tabular-nums; }

.dash2-aufgaben{
  display:flex; flex-direction:column; gap:8px; padding:16px;
  background:var(--oberflaeche); border:1px solid var(--border); border-radius:var(--radius);
}
.dash2-aufgabe{
  display:flex; align-items:center; gap:8px; font-size:13.5px; color:var(--text);
  padding:4px 0;
}
a.dash2-aufgabe:hover{ color:var(--akzent); }
.dash2-aufgabe-punkt{ font-size:11px; }

.dash2-spalten{ display:grid; grid-template-columns:repeat(auto-fit, minmax(220px, 1fr)); gap:14px; }
.dash2-karte{
  padding:16px; background:var(--oberflaeche); border:1px solid var(--border); border-radius:var(--radius);
}
.dash2-karte-titel{ font-size:12.5px; text-transform:uppercase; letter-spacing:.04em; color:var(--text-2); margin:0 0 8px; }
.dash2-karte-name{ font-size:13px; color:var(--text-2); margin:0; }
.dash2-karte-zahl{ font-size:19px; font-weight:700; color:var(--text); margin:2px 0; }
.dash2-karte-trend{ font-size:12.5px; color:var(--akzent); margin:0; }

.dash2-inhalte-kopf{
  display:flex; justify-content:space-between; font-size:12px; text-transform:uppercase;
  letter-spacing:.04em; color:var(--text-2); padding:0 4px 6px;
}
.dash2-inhalte{ display:flex; flex-direction:column; gap:10px; }
.dash2-inhalte-zeile{
  display:grid; grid-template-columns:120px 70px 1fr 44px; align-items:center; gap:12px;
  font-size:13.5px;
}
.dash2-inhalte-label{ color:var(--text); }
.dash2-inhalte-zahl{ color:var(--text-2); font-variant-numeric:tabular-nums; text-align:right; }
.dash2-inhalte-balken{
  display:block; height:8px; border-radius:4px; background:var(--oberflaeche-2); overflow:hidden;
}
.dash2-inhalte-balken span{ display:block; height:100%; background:var(--akzent); }
.dash2-inhalte-prozent{ color:var(--text-2); font-variant-numeric:tabular-nums; text-align:right; }

@media (max-width: 640px){
  .dash2-inhalte-zeile{ grid-template-columns:90px 50px 1fr 38px; gap:8px; font-size:12.5px; }
}

/* ===========================================================================
   ELEMENTMATRIX (spielindividuell)
   ===========================================================================
   Sticky Kopfzeile UND sticky erste Spalte, damit bei vielen Elementen
   noch erkennbar bleibt, welche Zeile/Spalte man gerade liest - genau die
   Anforderung aus dem Auftrag ("bei grossen Matrizen ... Sticky Header,
   Sticky erste Spalte"). Farbe ist nur eine von drei Kennzeichnungen:
   dazu ein Kürzel als Text und der volle Name im title-Tooltip - keine
   Zelle verlässt sich allein auf Farbe.
*/
.element-matrix-wrapper{ overflow-x:auto; max-width:100%; }
.element-matrix{ border-collapse:collapse; font-size:12.5px; }
.element-matrix th, .element-matrix td{
  border:1px solid var(--border); padding:6px 8px; text-align:center; white-space:nowrap;
}
.element-matrix thead th{
  position:sticky; top:0; background:var(--oberflaeche-2); z-index:2;
  font-weight:600; color:var(--text-2);
}
.element-matrix tbody th{
  position:sticky; left:0; background:var(--oberflaeche-2); z-index:1;
  text-align:right; font-weight:600; color:var(--text-2);
}
.element-matrix .element-matrix-ecke{ z-index:3; }
.element-matrix-zelle{ min-width:64px; color:var(--text-2); }
.element-matrix-zelle.ist-diagonale{ background:var(--bg); }
.element-matrix-neutral{ opacity:.35; }
.element-matrix-kurz{ display:block; font-weight:600; }
.element-matrix-zelle small{ display:block; color:var(--text-2); font-size:10.5px; }

/* Wirkungsart als Farbe UND Text - nie nur Farbe. */
.element-matrix-zelle.ist-stark_gegen{ background:color-mix(in srgb, #E85D3D 18%, transparent); color:#E85D3D; }
.element-matrix-zelle.ist-schwach_gegen{ background:color-mix(in srgb, var(--text-2) 12%, transparent); }
.element-matrix-zelle.ist-resistenz{ background:color-mix(in srgb, #4FB6E8 16%, transparent); color:#4FB6E8; }
.element-matrix-zelle.ist-immunitaet{ background:color-mix(in srgb, #9AA0AE 22%, transparent); color:var(--text); font-weight:700; }
.element-matrix-zelle.ist-absorption{ background:color-mix(in srgb, #7FBF3F 18%, transparent); color:#7FBF3F; }
.element-matrix-zelle.ist-reflektion{ background:color-mix(in srgb, #E9C171 18%, transparent); color:var(--akzent-tief); }
.element-matrix-zelle.ist-heilung{ background:color-mix(in srgb, #5FD07A 18%, transparent); color:#5FD07A; }

/* Rückfrage "Ein ähnlicher Eintrag existiert bereits" (Builder Portal, Phase 6, 2026-09-11) */
.builder-rueckfrage { border: 1px solid var(--akzent); border-radius:var(--radius-klein); padding: .75rem 1rem; margin: .5rem 0 1rem; background: color-mix(in srgb, var(--akzent) 10%, transparent); }
.builder-rueckfrage p { margin: 0 0 .5rem; }
.builder-rueckfrage-vorschlaege { list-style: none; margin: 0 0 .5rem; padding: 0; }
.builder-rueckfrage-vorschlaege li + li { margin-top: .35rem; }
.builder-rueckfrage form { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem; }
.builder-rueckfrage-name { font-weight: 600; }

/* Elementmatrix global und je Spiel (2026-09-11): Abweichungen eines Spiels sichtbar machen */
.element-matrix-zelle.ist-eigen { box-shadow: inset 0 0 0 2px var(--akzent); }
.matrix-spiele { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; gap: .5rem 1.25rem; }

/* Datenqualität (Builder Portal, Phase 8, 2026-09-11) */
.dq-filter { display: flex; flex-wrap: wrap; gap: .5rem; margin: .75rem 0 1rem; }
.dq-filter a { padding: .2rem .75rem; border: 1px solid var(--border); border-radius:var(--radius-rund); text-decoration: none; }
.dq-filter a.ist-aktiv { border-color: var(--akzent); color: var(--akzent); }
.dq-kategorie { margin: 0 0 1rem; }
.dq-kategorie summary { cursor: pointer; font-weight: 600; }
.dq-liste { list-style: none; margin: .5rem 0 0; padding: 0; }
.dq-liste li { display: flex; flex-wrap: wrap; gap: .4rem .75rem; align-items: baseline; padding: .35rem 0; border-top: 1px solid var(--border); }
.dq-stufe { font-size: .75rem; font-weight: 700; text-transform: uppercase; letter-spacing: .04em; min-width: 5.5rem; }
.dq-stufe.ist-fehler { color: #ff7a6b; }
.dq-stufe.ist-warnung { color: var(--akzent); }
.dq-stufe.ist-hinweis { opacity: .7; }
.dq-text { flex: 1 1 20rem; }
.dq-oeffnen { white-space: nowrap; }
.dq-tabelle { width: 100%; border-collapse: collapse; }
.dq-tabelle th, .dq-tabelle td { text-align: left; padding: .4rem .6rem; border-top: 1px solid var(--border); }

/* Desktop-App (2026-09-11): Die Live-Vorschau steht rechts im App-Fenster -
   im Builder keine zweite Explorer-Spalte, und die Inhalte nutzen die volle Breite. */
.builder-aussenflaeche.ist-ohne-vorschau{ grid-template-columns:minmax(0,1fr); }
.ist-desktop-app .builder-seite{ max-width:none; }

/* Eigene Elemente je Spiel auf der Matrix-Seite (2026-09-11) */
.matrix-eigene { list-style: none; margin: .75rem 0 0; padding: 0; display: flex; flex-wrap: wrap; gap: .5rem 1rem; }
.matrix-eigene li { display: flex; align-items: center; gap: .35rem; }
.matrix-eigene form { margin: 0; }

/* Sprachen je Fassung (2026-09-11) */
.builder-fassung-sprachen{ margin-top:.75rem; }
.builder-fassung-sprachen > summary{ cursor:pointer; font-weight:600; }
.builder-fassung-sprachen form{ margin-top:.5rem; }

/* Familien-Builder: Gruppenreiter und Gesamtansicht (2026-09-11) */
.familien-gruppen{ display:flex; flex-wrap:wrap; gap:6px; margin:0 0 18px; }
.familien-gruppe{ padding:6px 12px; border-radius:var(--radius-rund); font-size:13px; color:var(--text-2); background:var(--oberflaeche); border:1px solid var(--border); text-decoration:none; }
.familien-gruppe:hover{ color:var(--text); }
.familien-gruppe.ist-aktiv{ background:var(--akzent); border-color:var(--akzent); color:var(--bg); font-weight:600; }
.familien-gruppe small{ opacity:.75; }
.familien-gruppenueberschrift{ font-size:15px; margin:26px 0 4px; padding-top:14px; border-top:1px solid var(--border); }
.builder-seite-titel + .familien-gruppenueberschrift{ margin-top:8px; padding-top:0; border-top:0; }

/* Weltstruktur (2026-09-11) */
.weltstruktur-baum{ list-style:none; margin:0; padding-left:0; }
.weltstruktur-baum .weltstruktur-baum{ margin-left:8px; padding-left:20px; border-left:1px dashed var(--border); }
.weltstruktur-baum li{ margin:5px 0; }
.weltstruktur-zeile{ display:flex; align-items:center; gap:8px; flex-wrap:wrap; }
.weltstruktur-knoten{ font-weight:600; }
.weltstruktur-knoten.ist-welt{ font-size:15px; }
.weltstruktur-knoten.ist-dungeon .weltstruktur-typ{ color:var(--warnung); }
.weltstruktur-typ{ text-transform:uppercase; font-size:11.5px; letter-spacing:.04em; color:var(--akzent); }
.weltstruktur-objekte{ list-style:none; margin:2px 0 4px 26px; padding:0; font-size:13px; }
.weltstruktur-objekte li{ display:flex; align-items:center; gap:6px; flex-wrap:wrap; margin:2px 0; }
.weltstruktur-objekte .weltstruktur-objekte{ flex-basis:100%; margin-left:22px; }
.weltstruktur-objekt .weltstruktur-typ{ color:var(--text-2); }
.weltstruktur-objekte small{ color:var(--text-2); }
.weltstruktur-loesen{ display:inline; }
.weltstruktur-plus{ display:inline-block; }
.weltstruktur-plus > summary{ cursor:pointer; list-style:none; padding:0 7px; border:1px solid var(--border); border-radius:6px; color:var(--text-2); }
.weltstruktur-plus > summary::-webkit-details-marker{ display:none; }
.weltstruktur-plus[open]{ display:block; flex-basis:100%; margin:6px 0; }
.weltstruktur-form{ display:flex; gap:6px; flex-wrap:wrap; align-items:center; margin:4px 0; }

/* Spiele suchen und blättern (Phase 11, 2026-09-11) */
.spiele-suche{ display:flex; gap:6px; flex-wrap:wrap; align-items:center; margin:0 0 14px; }
.spiele-suche input[type="search"]{ flex:1; min-width:200px; max-width:420px; }
.spiele-blaettern{ display:flex; gap:6px; flex-wrap:wrap; align-items:center; justify-content:center; margin:16px 0; }
.spiele-blaettern a, .spiele-blaettern span{ padding:5px 10px; border-radius:var(--radius-klein); border:1px solid var(--border); font-size:13px; }
.spiele-blaettern .ist-aktiv{ background:var(--akzent); border-color:var(--akzent); color:var(--bg); font-weight:600; }
.spiele-blaettern .ist-luecke{ border:0; }

/* Luft zwischen Kurztext und erstem Block der Karte (2026-09-11) */
.inhalt-karte-kurz + .inhalt-karte-block:first-of-type{ margin-top:34px; }

/* ===========================================================================
   AUFBAUHINWEIS AUF DER STARTSEITE (2026-09-12)
   ---------------------------------------------------------------------------
   Der Kasten sagte bisher nur, DASS gebaut wird. Jetzt sagt er auch, was das
   fuer den Besucher heisst - und bietet die zwei Wege an, auf denen er
   mitreden kann. Die drei Schritte stehen als Kette und nicht als Liste:
   Sie sind ein Zustand, keine Aufzaehlung von Aufgaben.
   =========================================================================== */
.start-status-schritte{
  list-style:none; margin:14px 0 0; padding:0;
  display:flex; flex-wrap:wrap; justify-content:center; gap:8px 10px;
}
.start-status-schritte li{
  display:inline-flex; align-items:center; gap:7px;
  padding:5px 12px; border-radius:var(--radius-rund);
  border:1px solid var(--border);
  background:var(--bg);
  font-size:12.5px; color:var(--text-2);
}
.start-status-schritte li::before{
  content:''; width:5px; height:5px; border-radius:50%;
  background:var(--akzent); opacity:.75;
}
.start-status-wege{
  margin:14px 0 0;
  display:flex; flex-wrap:wrap; justify-content:center; gap:6px 18px;
  font-size:13.5px;
}
.start-status-wege a{
  color:var(--text); text-decoration:none;
  border-bottom:1px solid var(--kante-gold);
  padding-bottom:1px;
}
.start-status-wege a:hover, .start-status-wege a:focus-visible{ color:var(--akzent); }
@media (max-width:560px){
  .start-status-schritte li{ font-size:12px; padding:4px 10px; }
}

/* ===========================================================================
   MEIN RPG PORTAL (2026-09-12)
   ---------------------------------------------------------------------------
   Eigene Klassen (mp-) statt der alten portal-/admin-Klassen: Der persoenliche
   Bereich ist keine Verwaltungsmaske und soll auch nicht so aussehen. Die
   Kennzahlen stehen oben, die Sammlung als Karten darunter, das Formular
   weggeklappt hinter „Aendern".
   =========================================================================== */
.mp-kopf{
  display:flex; align-items:flex-start; justify-content:space-between;
  gap:20px; flex-wrap:wrap; margin-bottom:18px;
}
.mp-ueberzeile{
  margin:0 0 4px; font-family:var(--schrift-mono);
  font-size:11px; font-weight:700; letter-spacing:.1em;
  text-transform:uppercase; color:var(--text-2);
}
.mp-kopf h1{ margin:0 0 8px; }
.mp-einstieg{ margin:0; color:var(--text-2); font-size:15px; max-width:56ch; }
.mp-wer{
  display:inline-flex; align-items:center; gap:10px; margin:4px 0 0;
  padding:7px 14px 7px 7px; border:1px solid var(--border); border-radius:var(--radius-rund);
  background:var(--oberflaeche); font-size:13.5px; color:var(--text);
}
.mp-wer-zeichen{
  display:inline-flex; align-items:center; justify-content:center;
  width:28px; height:28px; border-radius:50%;
  background:color-mix(in srgb, var(--akzent) 18%, transparent);
  color:var(--akzent); font-weight:700; font-size:13px;
}

/* ---- Kennzahlen und Fortschritt ---- */
.mp-kennzahlen{
  display:grid; grid-template-columns:repeat(auto-fit, minmax(150px, 1fr));
  gap:18px; margin:26px 0 24px;
}
.mp-zahl{
  padding:16px 18px; border:1px solid var(--border); border-radius:var(--radius-gross);
  background:var(--oberflaeche);
}
.mp-zahl-wert{
  display:block; font-family:var(--schrift-mono); font-size:26px; font-weight:700;
  line-height:1.1; color:var(--text); font-variant-numeric:tabular-nums;
}
.mp-zahl-text{ display:block; margin-top:4px; font-size:12.5px; color:var(--text-2); }

.mp-fortschritt{ margin:0 0 30px; }
.mp-fortschritt-leiste{
  height:8px; border-radius:var(--radius-rund); background:var(--bg);
  border:1px solid var(--border); overflow:hidden;
}
.mp-fortschritt-leiste > span{
  display:block; height:100%;
  background:linear-gradient(90deg, color-mix(in srgb, var(--akzent) 70%, transparent), var(--akzent));
}
.mp-fortschritt-text{ margin:8px 0 0; font-size:13px; color:var(--text-2); }
.mp-fortschritt-text strong{ color:var(--text); font-variant-numeric:tabular-nums; }

/* ---- Faecher und Karten ---- */
.mp-fach{ margin:0 0 34px; }
.mp-fach h2{
  display:flex; align-items:center; gap:10px;
  margin:0 0 14px; padding-bottom:10px;
  border-bottom:1px solid var(--border);
  font-size:20px;
}
.mp-anzahl{
  font-family:var(--schrift-mono); font-size:11.5px; font-weight:700;
  padding:2px 8px; border-radius:var(--radius-rund);
  background:var(--bg); border:1px solid var(--border); color:var(--text-2);
}
.mp-karten{
  list-style:none; margin:0; padding:0;
  display:grid; grid-template-columns:repeat(auto-fill, minmax(280px, 1fr)); gap:20px;
}
.mp-karte{
  padding:16px 18px; border:1px solid var(--border); border-radius:var(--radius-gross);
  background:var(--oberflaeche);
  transition:border-color var(--dauer) var(--kurve), transform var(--dauer) var(--kurve);
}
.mp-karte:hover{ border-color:var(--kante-gold); transform:translateY(-1px); }
.mp-karte-kopf{ display:flex; align-items:baseline; gap:10px; justify-content:space-between; }
.mp-karte-titel{
  font-family:var(--schrift-display); font-size:17px; font-weight:600;
  color:var(--text); text-decoration:none; line-height:1.3;
}
.mp-karte-titel:hover{ color:var(--akzent); }
.mp-karte-jahr{ font-family:var(--schrift-mono); font-size:11.5px; color:var(--text-2); }
.mp-bewertung{ display:flex; align-items:center; gap:8px; margin:10px 0 0; }
.mp-bewertung-wert{ font-family:var(--schrift-mono); font-size:15px; font-weight:700; color:var(--text); }
.mp-bewertung-max{ font-size:11.5px; color:var(--text-2); }
.mp-bewertung-balken{
  flex:1; height:5px; border-radius:var(--radius-rund); background:var(--bg);
  border:1px solid var(--border); overflow:hidden;
}
.mp-bewertung-balken > span{ display:block; height:100%; background:var(--akzent); }
.mp-notiz{
  margin:10px 0 0; padding-left:10px; border-left:2px solid var(--border);
  font-size:13.5px; color:var(--text-2); line-height:1.55;
}
.mp-aendern{ margin-top:12px; }
.mp-aendern > summary{
  display:inline-block; cursor:pointer; list-style:none;
  font-size:12.5px; color:var(--text-2);
  border-bottom:1px dashed var(--border); padding-bottom:1px;
}
.mp-aendern > summary::-webkit-details-marker{ display:none; }
.mp-aendern > summary:hover{ color:var(--akzent); border-color:var(--kante-gold); }
.mp-form{ display:grid; gap:6px; margin-top:12px; }
.mp-form label{ font-size:11.5px; color:var(--text-2); }
.mp-form select, .mp-form input[type="text"]{
  width:100%; padding:8px 10px; border:1px solid var(--border); border-radius:var(--radius-klein);
  background:var(--bg); color:var(--text); font-family:inherit; font-size:13.5px;
}
.mp-form button{ justify-self:start; margin-top:4px; }

/* ---- Merkliste ---- */
.mp-chips{ list-style:none; margin:0 0 16px; padding:0; display:flex; flex-wrap:wrap; gap:8px; }
.mp-chips li{
  display:inline-flex; align-items:baseline; gap:8px;
  padding:7px 12px; border:1px solid var(--border); border-radius:var(--radius-rund);
  background:var(--oberflaeche); font-size:13.5px;
}
.mp-chips a{ color:var(--text); text-decoration:none; }
.mp-chips a:hover{ color:var(--akzent); }
.mp-chips small{ color:var(--text-2); font-size:11.5px; }
.mp-merk h3{ margin:0 0 10px; font-size:13px; color:var(--text-2); font-weight:600; }

/* ---- Leerzustand ---- */
.mp-leer{
  margin-top:24px; padding:28px; border:1px solid var(--border);
  border-radius:var(--radius-gross); background:var(--oberflaeche);
}
.mp-leer-titel{ margin:0 0 6px; font-family:var(--schrift-display); font-size:20px; }
.mp-leer-text{ margin:0 0 20px; color:var(--text-2); max-width:60ch; }
.mp-schritte{
  list-style:none; margin:0 0 26px; padding:0;
  display:grid; grid-template-columns:repeat(auto-fit, minmax(220px, 1fr)); gap:20px;
}
.mp-schritte li{
  padding:16px; border:1px solid var(--border); border-radius:var(--radius); background:var(--bg);
  display:grid; gap:5px;
}
.mp-schritt-nr{
  display:inline-flex; align-items:center; justify-content:center;
  width:24px; height:24px; border-radius:50%;
  background:color-mix(in srgb, var(--akzent) 16%, transparent);
  color:var(--akzent); font-family:var(--schrift-mono); font-size:12px; font-weight:700;
}
.mp-schritte strong{ font-size:14.5px; }
.mp-schritte span:last-child{ font-size:13px; color:var(--text-2); line-height:1.5; }
.mp-leer-wege{ display:flex; flex-wrap:wrap; align-items:center; gap:12px 18px; margin:0; }
.mp-nebenweg, .mp-ausklang a{ color:var(--text); border-bottom:1px solid var(--kante-gold); text-decoration:none; }
.mp-nebenweg:hover, .mp-ausklang a:hover{ color:var(--akzent); }
.mp-ausklang{ margin:6px 0 0; font-size:13.5px; color:var(--text-2); }
@media (max-width:640px){
  .mp-kopf{ gap:12px; }
  .mp-karten{ grid-template-columns:1fr; }
}

/* ===========================================================================
   COMMUNITY: KARTEN STATT TRENNLINIEN (2026-09-12)
   ---------------------------------------------------------------------------
   Die Bloecke waren durch eine Linie oben getrennt. Das liest sich wie ein
   langer Text mit Zwischenueberschriften - richtig fuer einen Artikel, zu
   wenig Halt fuer eine Seite, auf der sechs verschiedene Dinge nebeneinander
   stehen (Spiel der Woche, Neuigkeiten, Umfrage, Vorschlag ...). Jeder Block
   ist jetzt eine eigene Flaeche mit Rand: Man sieht auf einen Blick, wo eines
   aufhoert und das naechste anfaengt.
   =========================================================================== */
.gemeinde-aufbau{
  display:flex; flex-wrap:wrap; align-items:center; gap:6px 12px;
  margin:16px 0 0; padding:12px 16px;
  border:1px solid var(--kante-gold); border-radius:var(--radius);
  background:color-mix(in srgb, var(--akzent) 6%, var(--oberflaeche));
  font-size:13.5px; color:var(--text-2); line-height:1.55;
}
.gemeinde-aufbau-punkt{
  width:7px; height:7px; border-radius:50%; background:var(--akzent); flex:0 0 auto;
}
.gemeinde-aufbau a{
  color:var(--text); text-decoration:none;
  border-bottom:1px solid var(--kante-gold); padding-bottom:1px;
}
.gemeinde-aufbau a:hover, .gemeinde-aufbau a:focus-visible{ color:var(--akzent); }

.gemeinde-haupt > .gemeinde-block{
  margin:0 0 56px; padding:26px 26px;
  border:1px solid var(--border); border-top:1px solid var(--border);
  border-radius:var(--radius-gross);
  background:var(--oberflaeche);
}
.gemeinde-haupt > .gemeinde-block:first-child{ padding-top:22px; margin-top:0; }
.gemeinde-haupt > .gemeinde-block:last-child{ margin-bottom:0; }


/* „Mein RPG Portal" ist der persoenliche Einstieg und darf sich als einziger
   Block in der Randspalte hervortun. */
#meins{
  border-color:var(--kante-gold);
  background:color-mix(in srgb, var(--akzent) 5%, var(--oberflaeche));
}

@media (max-width:900px){
  .gemeinde-haupt > .gemeinde-block{ padding:18px 16px; margin-bottom:36px; }
}


/* ===========================================================================
   MEIN RPG (2026-09-12)

   Der persoenliche Bereich als eigener Ort im Portal - sieben Seiten, eine
   Reiterleiste, eine Formensprache. Er benutzt ausschliesslich die
   bestehenden Gestaltungsgroessen (--oberflaeche, --border, --akzent,
   --radius-gross, --schrift-mono); eine zweite Farbpalette daneben waere
   genau das, was ein Portal uneinheitlich macht.

   EINE UNTERSCHEIDUNG TRAEGT DIESEN BEREICH: Was global ist (Spielname,
   Jahr, Inhalte), steht in der gewohnten Textfarbe. Was PERSOENLICH ist
   (Stand, Fortschritt, Note, Favorit), traegt Gold - die Leitfarbe des
   Portals. Damit ist auf jeder Karte ohne Beschriftung sichtbar, welche
   Angabe aus der Datenbank kommt und welche vom Leser selbst.
   =========================================================================== */

.mrpg{ max-width:1180px; }

.mrpg-kopf{
  display:flex; align-items:flex-start; justify-content:space-between;
  gap:24px; flex-wrap:wrap; margin:0 0 22px;
}
.mrpg-ueberzeile{
  margin:0 0 6px; font-family:var(--schrift-mono); font-size:11px;
  letter-spacing:.14em; text-transform:uppercase; color:var(--akzent);
}
.mrpg-kopf h1{ margin:0 0 8px; font-size:clamp(28px, 3vw, 38px); }
.mrpg-einstieg{ margin:0; color:var(--text-2); font-size:15px; max-width:60ch; }
.mrpg-wer{
  display:flex; align-items:center; gap:10px; margin:0;
  font-size:14px; color:var(--text-2);
}
.mrpg-wer-zeichen{
  display:inline-flex; align-items:center; justify-content:center;
  width:34px; height:34px; border-radius:50%;
  border:1px solid var(--kante-gold); color:var(--akzent);
  font-weight:700; font-size:15px;
}

/* Die Reiterleiste scrollt auf schmalen Geraeten seitwaerts, statt
   umzubrechen: Sieben umgebrochene Reiter sehen aus wie eine Liste und
   verlieren dabei genau die Eigenschaft, die eine Leiste hat - man sieht,
   wo man ist. */
.mrpg-reiter{
  display:flex; gap:4px; overflow-x:auto; margin:0 0 28px;
  border-bottom:1px solid var(--border); scrollbar-width:thin;
}
.mrpg-reiter a{
  flex:0 0 auto; padding:10px 14px; text-decoration:none;
  color:var(--text-2); font-size:14px; font-weight:600;
  border-bottom:2px solid transparent; white-space:nowrap;
}
.mrpg-reiter a:hover{ color:var(--text); }
.mrpg-reiter a.ist-aktiv{ color:var(--akzent); border-bottom-color:var(--akzent); }
.mrpg-reiter-rand{ margin-left:auto; }

.mrpg-block{ margin:0 0 40px; }
.mrpg-block-titel{
  display:flex; align-items:center; gap:10px; margin:0 0 16px;
  font-size:19px; letter-spacing:-.01em;
}
.mrpg-block-titel::before{
  content:''; flex:0 0 auto;
  width:4px; height:18px; border-radius:2px; background:var(--akzent);
}
.mrpg-block-titel a{ color:inherit; text-decoration:none; }
.mrpg-block-titel a:hover{ color:var(--akzent); }
.mrpg-unter{ margin:24px 0 12px; font-size:15px; color:var(--text-2); }

.mrpg-anzahl{
  font-family:var(--schrift-mono); font-size:11.5px; font-weight:600;
  color:var(--text-2); padding:2px 8px; border-radius:var(--radius-rund);
  border:1px solid var(--border);
}
.mrpg-plakette{
  font-family:var(--schrift-mono); font-size:10.5px; font-weight:600;
  color:var(--akzent); padding:3px 9px; border-radius:var(--radius-rund);
  border:1px solid var(--kante-gold);
  background:color-mix(in srgb, var(--akzent) 10%, transparent);
  white-space:nowrap;
}
.mrpg-ruhig{ color:var(--text-2); font-size:14.5px; max-width:var(--lese-breite); }
.mrpg-hinweis{ color:var(--text-2); font-size:12.5px; margin:8px 0 0; }
.mrpg-mehr{ margin:14px 0 0; font-size:13.5px; }

/* ---- Kennzahlen ---------------------------------------------------------- */

.mrpg-zahlen{
  display:grid; grid-template-columns:repeat(auto-fit, minmax(150px, 1fr));
  gap:18px; margin:0 0 36px;
}
.mrpg-zahl{
  padding:16px 18px; border:1px solid var(--border);
  border-radius:var(--radius-gross); background:var(--oberflaeche);
}
.mrpg-zahl-wert{
  display:block; font-family:var(--schrift-mono); font-size:26px;
  font-weight:700; color:var(--akzent); font-variant-numeric:tabular-nums;
}
.mrpg-zahl-text{ display:block; margin-top:4px; font-size:12.5px; color:var(--text-2); }

/* ---- Die Leiste: eine Form fuer jeden Fortschritt ------------------------ */

.mrpg-leiste{
  display:block; position:relative; height:6px; border-radius:3px; overflow:hidden;
  background:var(--oberflaeche-2); border:1px solid var(--border);
}
.mrpg-leiste > span{
  display:block; height:100%; background:var(--akzent);
  transition:width var(--dauer) var(--kurve);
}
@media (prefers-reduced-motion: reduce){
  .mrpg-leiste > span{ transition:none; }
}

/* ---- Weiterspielen ------------------------------------------------------- */

.mrpg-weiter{
  list-style:none; margin:0; padding:0;
  display:grid; grid-template-columns:repeat(auto-fill, minmax(260px, 1fr)); gap:20px;
}
.mrpg-weiter-karte{
  display:flex; flex-direction:column; gap:8px;
  padding:18px 20px; border:1px solid var(--border);
  border-radius:var(--radius-gross); background:var(--oberflaeche);
}
.mrpg-weiter-stand{
  margin:0; font-family:var(--schrift-mono); font-size:10.5px;
  letter-spacing:.1em; text-transform:uppercase; color:var(--akzent);
}
.mrpg-weiter-titel{
  font-size:17px; font-weight:700; color:var(--text); text-decoration:none;
}
.mrpg-weiter-titel:hover{ color:var(--akzent); }
.mrpg-weiter-zahl{ margin:0; font-size:13px; color:var(--text-2); font-variant-numeric:tabular-nums; }
.mrpg-weiter-datum{ margin:0; font-size:12.5px; color:var(--text-2); }
.mrpg-weiter-knopf{
  margin-top:auto; align-self:flex-start; font-size:13px; font-weight:600;
  color:var(--akzent); text-decoration:none;
  border-bottom:1px solid var(--kante-gold); padding-bottom:1px;
}

/* ---- Bibliothek ---------------------------------------------------------- */

.mrpg-werkzeuge{
  display:flex; flex-wrap:wrap; align-items:center; gap:10px;
  padding:14px 16px; margin:0 0 16px;
  border:1px solid var(--border); border-radius:var(--radius-gross);
  background:var(--oberflaeche);
}
.mrpg-werkzeuge input[type="search"]{ flex:1 1 220px; min-width:0; }
.mrpg-ansicht{ display:flex; gap:6px; margin-left:auto; }
.mrpg-ansicht a{
  font-size:12.5px; text-decoration:none; color:var(--text-2);
  padding:6px 10px; border-radius:var(--radius-rund); border:1px solid var(--border);
}
.mrpg-ansicht a.ist-aktiv{ color:var(--akzent); border-color:var(--kante-gold); }
.mrpg-treffer{ margin:0 0 18px; font-size:13.5px; color:var(--text-2); }

/* Die haeufigsten Staende als ein Klick (2026-09-12). Die Zahl gehoert
   dazu: ein Filter ohne Zahl ist eine Wette. */
.mrpg-chipfilter{
  list-style:none; margin:0 0 14px; padding:0;
  display:flex; flex-wrap:wrap; gap:8px;
}
.mrpg-chipfilter a{
  display:inline-flex; align-items:baseline; gap:7px;
  padding:7px 13px; border-radius:var(--radius-rund);
  border:1px solid var(--border); background:var(--oberflaeche);
  color:var(--text-2); text-decoration:none; font-size:13px; font-weight:600;
}
.mrpg-chipfilter a span{
  font-family:var(--schrift-mono); font-size:11.5px; font-weight:600;
  color:var(--text-2); font-variant-numeric:tabular-nums;
}
.mrpg-chipfilter a:hover{ color:var(--text); border-color:var(--kante-gold); }
.mrpg-chipfilter a.ist-aktiv{
  color:var(--akzent); border-color:var(--kante-gold);
  background:color-mix(in srgb, var(--akzent) 10%, var(--oberflaeche));
}
.mrpg-chipfilter a.ist-aktiv span{ color:var(--akzent); }

.mrpg-bibliothek{ list-style:none; margin:0; padding:0; display:grid; gap:20px; }
.mrpg-bibliothek.ist-raster{ grid-template-columns:repeat(auto-fill, minmax(280px, 1fr)); }
.mrpg-bibliothek.ist-liste{ grid-template-columns:1fr; }

.mrpg-karte{
  padding:16px 18px; border:1px solid var(--border);
  border-radius:var(--radius-gross); background:var(--oberflaeche);
  transition:border-color var(--dauer) var(--kurve), transform var(--dauer) var(--kurve);
}
.mrpg-karte:hover{ border-color:var(--kante-gold); transform:translateY(-1px); }
@media (prefers-reduced-motion: reduce){
  .mrpg-karte{ transition:none; }
  .mrpg-karte:hover{ transform:none; }
}
.mrpg-karte-kopf{
  display:flex; align-items:baseline; justify-content:space-between; gap:10px;
}
.mrpg-karte-titel{ font-size:16px; font-weight:700; color:var(--text); text-decoration:none; }
.mrpg-karte-titel:hover{ color:var(--akzent); }
.mrpg-karte-zeile{
  display:flex; flex-wrap:wrap; align-items:center; gap:8px;
  margin:10px 0; font-size:12.5px; color:var(--text-2);
}
.mrpg-karte-jahr, .mrpg-karte-zeit{ font-family:var(--schrift-mono); font-size:11.5px; }
.mrpg-karte-notiz{ margin:10px 0 0; font-size:13.5px; color:var(--text-2); }
.mrpg-note{ display:flex; align-items:baseline; gap:4px; margin:10px 0 0; }
.mrpg-note-wert{
  font-family:var(--schrift-mono); font-size:16px; font-weight:700; color:var(--akzent);
}
.mrpg-note-max{ font-size:11.5px; color:var(--text-2); }

.mrpg-stern{ color:var(--akzent); font-size:15px; }
.mrpg-stern-knopf{
  background:none; border:none; padding:0 0 0 6px; cursor:pointer;
  color:var(--akzent); font-size:14px; line-height:1;
}
.mrpg-weg{
  background:none; border:none; cursor:pointer; color:var(--text-2);
  font-size:13px; padding:0 4px;
}
.mrpg-weg:hover{ color:var(--akzent); }
.mrpg-inline{ display:inline; }

/* ---- Formulare hinter "Ändern" ------------------------------------------- */

.mrpg-aendern{ margin-top:14px; }
.mrpg-aendern > summary{
  cursor:pointer; font-size:13px; font-weight:600; color:var(--text-2);
  list-style:none;
}
.mrpg-aendern > summary::-webkit-details-marker{ display:none; }
.mrpg-aendern > summary:hover{ color:var(--text); }

.mrpg-form{
  display:grid; gap:6px; margin:14px 0 0;
  padding:14px 16px; border:1px solid var(--border);
  border-radius:var(--radius); background:var(--bg-tief);
}
.mrpg-form label{ font-size:12px; color:var(--text-2); }
.mrpg-form button{ justify-self:start; margin-top:8px; }
.mrpg-form-breit{ max-width:560px; }
.mrpg-teilfelder{
  display:grid; grid-template-columns:repeat(auto-fit, minmax(170px, 1fr));
  gap:6px 16px; margin-bottom:10px;
}

/* ---- Listen und Merkliste ------------------------------------------------ */

.mrpg-chips{ list-style:none; margin:0; padding:0; display:flex; flex-wrap:wrap; gap:10px; }
.mrpg-chips li{
  display:inline-flex; align-items:baseline; gap:8px;
  padding:7px 12px; border:1px solid var(--border); border-radius:var(--radius-rund);
  background:var(--oberflaeche); font-size:13.5px;
}
.mrpg-chips a{ color:var(--text); text-decoration:none; }
.mrpg-chips a:hover{ color:var(--akzent); }
.mrpg-chips small{ color:var(--text-2); font-size:11.5px; }

.mrpg-merkliste, .mrpg-notizen, .mrpg-ziele, .mrpg-listenliste{
  list-style:none; margin:0; padding:0; display:grid; gap:18px;
}
.mrpg-merkliste > li, .mrpg-notizen > li, .mrpg-ziele > li, .mrpg-listenliste > li{
  padding:16px 18px; border:1px solid var(--border);
  border-radius:var(--radius-gross); background:var(--oberflaeche);
}
.mrpg-listenliste > li.ist-offen{ border-color:var(--kante-gold); }
.mrpg-listenliste a{ color:var(--text); text-decoration:none; font-weight:600; }
.mrpg-listenliste a:hover{ color:var(--akzent); }
.mrpg-listen-text{ margin:8px 0 0; font-size:13.5px; color:var(--text-2); }
.mrpg-merk-kopf{ display:flex; align-items:baseline; justify-content:space-between; gap:10px; }
.mrpg-merk-kopf a{ color:var(--text); text-decoration:none; font-weight:600; }
.mrpg-merk-kommentar{ margin:8px 0 0; font-size:13.5px; color:var(--text-2); }

.mrpg-listen-eintraege{ margin:0; padding-left:20px; display:grid; gap:10px; font-size:14px; }
.mrpg-listen-eintraege a{ color:var(--text); text-decoration:none; }
.mrpg-listen-eintraege a:hover{ color:var(--akzent); }
.mrpg-listen-eintraege small{ color:var(--text-2); margin-left:8px; font-size:12px; }

/* ---- Fortschritt, Notizen, Bewertungen, Ziele ---------------------------- */

.mrpg-fortschritt{ list-style:none; margin:0; padding:0; display:grid; gap:14px; }
.mrpg-fortschritt-name{
  display:flex; justify-content:space-between; gap:12px;
  margin:0 0 6px; font-size:13.5px;
}
.mrpg-fortschritt-name span{
  font-family:var(--schrift-mono); font-size:12px; color:var(--text-2);
  font-variant-numeric:tabular-nums;
}

.mrpg-notiz-bezug{ margin:0 0 8px; display:flex; align-items:baseline; gap:8px; flex-wrap:wrap; }
.mrpg-notiz-bezug a{ color:var(--text); text-decoration:none; font-weight:600; }
.mrpg-notiz-bezug a:hover{ color:var(--akzent); }
.mrpg-notiz-text{ margin:0; font-size:14px; line-height:1.65; }

.mrpg-bewertung{
  padding:18px 20px; margin:0 0 20px; border:1px solid var(--border);
  border-radius:var(--radius-gross); background:var(--oberflaeche);
}
.mrpg-teilnoten{ list-style:none; margin:16px 0 0; padding:0; display:grid; gap:10px; }
.mrpg-teilnoten li{ display:grid; grid-template-columns:140px 32px 1fr; align-items:center; gap:10px; }
.mrpg-teil-name{ font-size:13px; color:var(--text-2); }
.mrpg-teil-wert{
  font-family:var(--schrift-mono); font-size:13px; color:var(--akzent);
  font-variant-numeric:tabular-nums;
}
.mrpg-review{
  margin:16px 0 0; padding:14px 16px; border-left:2px solid var(--kante-gold);
  background:var(--bg-tief); border-radius:0 var(--radius) var(--radius) 0;
}
.mrpg-review h3{ margin:0 0 8px; font-size:15px; }
.mrpg-review p{ margin:0; font-size:14px; line-height:1.7; }

.mrpg-ziele-kurz{ list-style:none; margin:0; padding:0; display:grid; gap:16px; }
.mrpg-ziel-titel{ margin:0 0 8px; font-weight:600; font-size:14.5px; }
.mrpg-ziel-text{ margin:8px 0; font-size:13.5px; color:var(--text-2); }
.mrpg-ziel-zahl{
  margin:8px 0 0; font-family:var(--schrift-mono); font-size:12.5px;
  color:var(--text-2); font-variant-numeric:tabular-nums;
}
.mrpg-ziel-zahl strong{ color:var(--akzent); }
.mrpg-ziel-zeit{ margin-left:10px; }
.mrpg-ziel.ist-erreicht{ border-color:var(--kante-gold); }

/* ---- Ziele: die zweite Zahl (2026-09-12) ---------------------------------
   Ein Balken sagt "65 %". Ob das gut ist, haengt an der Zeit - deshalb
   sitzt auf derselben Leiste eine Marke, wo der Balken stehen MUESSTE, um
   im Plan zu liegen. Zwei Balken untereinander waeren dieselbe Auskunft
   mit doppeltem Platz und halber Deutlichkeit. */
.mrpg-zeitmarke{
  position:absolute; top:-2px; bottom:-2px; width:2px;
  background:var(--text-2); opacity:.75;
}
.mrpg-ziel-rest{
  margin-left:10px; padding:2px 8px; border-radius:var(--radius-rund);
  border:1px solid var(--border); color:var(--text);
  font-family:var(--schrift-text); font-size:11.5px; font-weight:600;
}
.mrpg-ziel-rest.ist-gut{
  color:var(--akzent); border-color:var(--kante-gold);
  background:color-mix(in srgb, var(--akzent) 10%, transparent);
}
.mrpg-ziel-lage{
  display:flex; flex-wrap:wrap; align-items:center; gap:6px 14px;
  margin:8px 0 0; font-size:12.5px; color:var(--text-2);
}
.mrpg-lage{ font-weight:600; }
.mrpg-lage.ist-vor{ color:var(--erfolg); }
.mrpg-lage.ist-hinter{ color:var(--warnung); }
.mrpg-lage.ist-im_plan{ color:var(--text-2); }

/* Vorschlaege: der erste Klick, ohne sich etwas ausdenken zu muessen. */
.mrpg-vorschlaege{
  list-style:none; margin:0 0 18px; padding:0;
  display:flex; flex-wrap:wrap; gap:10px;
}
.mrpg-vorschlaege a{
  display:inline-block; padding:7px 13px;
  border:1px dashed var(--kante-gold); border-radius:var(--radius-rund);
  color:var(--text); text-decoration:none; font-size:13px;
}
.mrpg-vorschlaege a:hover, .mrpg-vorschlaege a:focus-visible{
  color:var(--akzent); border-style:solid;
  background:color-mix(in srgb, var(--akzent) 8%, transparent);
}
.mrpg-ziel.ist-abgebrochen{ opacity:.6; }

/* ---- Statistik ----------------------------------------------------------- */

.mrpg-verteilung{ list-style:none; margin:0; padding:0; display:grid; gap:10px; }
.mrpg-verteilung li{
  display:grid; grid-template-columns:minmax(120px, 190px) 1fr 44px;
  align-items:center; gap:12px;
}
.mrpg-verteilung-name{ font-size:13.5px; overflow-wrap:anywhere; }
.mrpg-verteilung-zahl{
  font-family:var(--schrift-mono); font-size:12.5px; color:var(--text-2);
  text-align:right; font-variant-numeric:tabular-nums;
}

/* ---- Spalten und Leerzustand -------------------------------------------- */

.mrpg-spalten{
  display:grid; grid-template-columns:repeat(auto-fit, minmax(300px, 1fr)); gap:40px;
}
.mrpg-schnell{
  display:flex; flex-wrap:wrap; align-items:center; gap:16px;
  margin:32px 0 0; padding-top:24px; border-top:1px solid var(--border);
  font-size:13.5px;
}
.mrpg-leer{
  padding:32px 28px; border:1px solid var(--border);
  border-radius:var(--radius-gross); background:var(--oberflaeche);
  max-width:var(--lese-breite);
}
.mrpg-leer-titel{ margin:0 0 10px; font-size:18px; font-weight:700; }
.mrpg-leer-text{ margin:0 0 20px; color:var(--text-2); font-size:14.5px; line-height:1.7; }
.mrpg-leer-wege{ display:flex; flex-wrap:wrap; align-items:center; gap:18px; margin:0; }
.mrpg-nebenweg{ font-size:13.5px; color:var(--text-2); text-decoration:none; }
.mrpg-nebenweg:hover{ color:var(--akzent); }

@media (max-width:720px){
  .mrpg-werkzeuge{ flex-direction:column; align-items:stretch; }
  .mrpg-ansicht{ margin-left:0; }
  .mrpg-teilnoten li{ grid-template-columns:1fr 32px; }
  .mrpg-teilnoten li > .mrpg-leiste{ grid-column:1 / -1; }
  .mrpg-verteilung li{ grid-template-columns:1fr 44px; }
  .mrpg-verteilung li > .mrpg-leiste{ grid-column:1 / -1; }
}

/* Der Favoriten-Schalter auf der Spielseite (2026-09-12). Er sitzt unter
   dem Sammlungsformular und traegt dieselbe Nebenweg-Optik wie
   "Aus der Sammlung nehmen" - beides sind kleine Entscheidungen neben der
   grossen, und keine davon soll wie ein Hauptknopf aussehen. */
.sammlung-favorit{ margin:10px 0 0; }

/* ===========================================================================
   DER WEG DURCH EINE QUEST (2026-09-12)

   Start, Stationen, Abschluss als Kette statt als drei Aufzaehlungen. Die
   Marke links traegt die Rolle (START / 1 / 2 / ZIEL) - ohne sie waere die
   Kette von einer Liste nicht zu unterscheiden. Die Linie dazwischen ist
   ein Rahmen, kein Bild: Sie soll sich mit der Schriftgroesse mitbewegen.
   =========================================================================== */
.karte-questweg{ margin-top:18px; }
.questweg{ list-style:none; margin:12px 0 0; padding:0; }
.questweg-halt{
  position:relative; display:grid;
  grid-template-columns:auto 1fr; align-items:baseline;
  gap:4px 12px; padding:0 0 16px 0;
}
.questweg-halt::before{
  content:''; position:absolute;
  left:13px; top:22px; bottom:0; width:1px; background:var(--border);
}
.questweg-halt:last-child{ padding-bottom:0; }
.questweg-halt:last-child::before{ display:none; }
.questweg-marke{
  grid-row:1 / span 2; align-self:start;
  display:inline-flex; align-items:center; justify-content:center;
  min-width:27px; height:22px; padding:0 7px;
  border:1px solid var(--border); border-radius:var(--radius-rund);
  background:var(--oberflaeche);
  font-family:var(--schrift-mono); font-size:10.5px; font-weight:700;
  letter-spacing:.04em; text-transform:uppercase; color:var(--text-2);
}
.questweg-halt.ist-start > .questweg-marke,
.questweg-halt.ist-abschluss > .questweg-marke{
  color:var(--akzent); border-color:var(--kante-gold);
  background:color-mix(in srgb, var(--akzent) 10%, var(--oberflaeche));
}
.questweg-ort{ font-size:14.5px; }
.questweg-ort a{ color:var(--text); text-decoration:none; font-weight:600; }
.questweg-ort a:hover{ color:var(--akzent); }
.questweg-art{ margin-left:8px; color:var(--text-2); font-size:11.5px; }
.questweg-text{
  grid-column:2; font-size:12.5px; color:var(--text-2); line-height:1.5;
}

/* ===========================================================================
   DAS SPIELCOVER IM KOPF (2026-09-12)

   Es steht in der rechten Spalte des Hero - der Stelle, die bei einem Spiel
   ohne Beschreibung leer blieb. Bewusst ohne Rahmen und ohne Schlagschatten:
   Ein Cover ist selbst schon ein Bild mit Rand; ein zweiter Rahmen darum
   sieht nach Bilderrahmen aus, nicht nach Spiel.

   `object-fit:contain` statt `cover`: Ein beschnittenes Cover verliert genau
   das, wofuer es da ist - den Titel oben und das Motiv in der Mitte.
   =========================================================================== */
/* ---------------------------------------------------------------------------
   DAS COVER STEHT MITTIG (2026-09-12, Betreiberwunsch „das Logo noch mittig
   zentrieren")
   ---------------------------------------------------------------------------
   Zwei Dinge muessen dafuer zusammenkommen:

     1. Die rechte Spalte ist ein `flex`-Kasten in ZEILENrichtung - sie trug
        bisher nur die Beschreibung. Mit Cover UND Text stuenden beide
        nebeneinander. Sobald ein Cover da ist, laeuft sie deshalb in
        Spaltenrichtung.
     2. Das Cover selbst bekommt `margin-inline:auto`. `align-items:center`
        am Kasten waere der naheliegende Weg und der falsche: Es wuerde auch
        den Text zusammenschieben, und ein Absatz, der nur so breit ist wie
        seine laengste Zeile, liest sich schlechter als einer mit fester
        Breite.
   --------------------------------------------------------------------------- */
.spiel-hero-rechts:has(.spiel-cover){ flex-direction:column; align-items:stretch; }

.spiel-cover{
  margin:0 auto 20px; width:100%; max-width:660px;
}
.spiel-cover img{
  display:block; width:100%; height:auto; max-height:700px;
  object-fit:contain;
  /* -----------------------------------------------------------------
     KEINE FLAECHE HINTER DEM BILD (2026-09-12)
     -----------------------------------------------------------------
     Hier standen `background:var(--bg-tief)` und ein Radius. Beides war
     fuer ein rechteckiges Cover gedacht - bei einem freigestellten Logo
     mit Alphakanal machte es genau das kaputt, wofuer der Alphakanal da
     ist: Es stand ein dunkler Kasten hinter dem Schriftzug.

     Ohne Flaeche zeigt ein transparentes PNG den Seitenhintergrund, und
     ein deckendes Bild sieht aus wie vorher. Der Radius faellt mit weg:
     Abgerundete Ecken an einem freigestellten Motiv beschneiden es.
     ----------------------------------------------------------------- */
}
.spiel-hero-rechts:has(.spiel-cover) .spiel-beschreibung{ margin-top:0; }

@media (max-width:900px){
  /* Auf dem Telefon steht das Cover ueber dem Text und darf nicht die
     halbe erste Bildschirmseite fuellen. */
  .spiel-cover{ max-width:360px; }
  .spiel-cover img{ max-height:420px; }
}

/* Der Rechtehinweis unter dem Cover (2026-09-12).

   Klein, aber nicht versteckt: Eine Nennung, die man nur mit der Lupe
   findet, ist keine. Deshalb 11.5px und `--text-2` statt einer noch
   blasseren Farbe - lesbar, ohne dem Bild die Aufmerksamkeit zu nehmen.
   Mittig, weil das Cover darueber mittig steht. */
.spiel-cover-quelle{
  margin:10px auto 0; max-width:52ch;
  font-size:11.5px; line-height:1.5; color:var(--text-2); text-align:center;
  text-wrap:pretty;
}

/* ===========================================================================
   ADMIN: LIZENZEN & QUELLEN (2026-09-12)

   Eintragen links, Ergebnis rechts. Wer hier arbeitet, tut zwei Dinge - eine
   Nennung erfassen und nachsehen, ob die Seite danach stimmt. Beides
   nebeneinander spart den zweiten Tab.
   =========================================================================== */
.lizenz-flaeche{
  display:grid; grid-template-columns:minmax(0, 1.35fr) minmax(0, 1fr);
  gap:40px; align-items:start;
}
.lizenz-liste h2{
  display:flex; align-items:center; gap:10px;
  margin:32px 0 14px; font-size:18px;
}
.lizenz-liste h2:first-child{ margin-top:0; }
.lizenz-anzahl{
  font-family:var(--schrift-mono); font-size:11.5px; color:var(--text-2);
  padding:2px 8px; border-radius:var(--radius-rund); border:1px solid var(--border);
}
.lizenz-karte{
  padding:16px 18px; margin:0 0 14px;
  border:1px solid var(--border); border-radius:var(--radius-gross);
  background:var(--oberflaeche);
}
.lizenz-karte.ist-still{ opacity:.6; }
.lizenz-karte-kopf{ display:flex; align-items:baseline; gap:10px; margin:0; }
.lizenz-marke{
  font-family:var(--schrift-mono); font-size:10.5px; color:var(--text-2);
  padding:2px 8px; border-radius:var(--radius-rund); border:1px solid var(--border);
}
.lizenz-karte > details > summary{
  margin-top:10px; cursor:pointer; font-size:13px; color:var(--text-2);
}
.lizenz-felder{
  display:grid; grid-template-columns:repeat(auto-fit, minmax(210px, 1fr));
  gap:12px 16px; margin:14px 0 0;
}
.lizenz-felder label{ display:flex; flex-direction:column; gap:5px; font-size:12.5px; color:var(--text-2); }
.lizenz-felder label small{ font-weight:400; opacity:.8; }
.lizenz-breit{ grid-column:1 / -1; }
.lizenz-schmal{ max-width:160px; }
.lizenz-haken{ flex-direction:row !important; align-items:center; gap:8px; }
.lizenz-knoepfe{ margin-top:14px; }
.lizenz-loeschen{ margin-top:10px; }

/* Das Ergebnis: erst wie es aussieht, darunter der Text zum Kopieren. */
.lizenz-ergebnis{
  position:sticky; top:20px;
  padding:20px 22px; border:1px solid var(--border);
  border-radius:var(--radius-gross); background:var(--oberflaeche);
}
.lizenz-ergebnis h2{ margin:0 0 14px; font-size:17px; }
.lizenz-ergebnis h3{ margin:22px 0 8px; font-size:14px; color:var(--text-2); }
.lizenz-vorschau{ font-size:14px; line-height:1.65; }
.lizenz-vorschau h2{ margin:22px 0 8px; font-size:16px; }
.lizenz-vorschau h2:first-child{ margin-top:0; }
.lizenz-vorschau p{ margin:0 0 10px; }
.lizenz-markdown{
  width:100%; font-family:var(--schrift-mono); font-size:11.5px;
  line-height:1.6; resize:vertical;
}
.lizenz-eintraege h2{ margin-top:28px; }

@media (max-width:1000px){
  .lizenz-flaeche{ grid-template-columns:1fr; gap:32px; }
  .lizenz-ergebnis{ position:static; }
}

/* Eine Sprache nachtragen - im Stammdaten-Formular unter der Sprachliste
   (2026-09-14). Zugeklappt kostet es nichts; offen stehen die drei Felder
   nebeneinander, weil sie zusammen EINE Angabe sind. */
.builder-sprache-neu{ margin-top:14px; }
.builder-sprache-neu > summary{
  cursor:pointer; font-size:13px; font-weight:600; color:var(--text-2);
}
.builder-sprache-neu > summary:hover{ color:var(--text); }
.builder-felder-reihe{
  display:grid; grid-template-columns:repeat(auto-fit, minmax(170px, 1fr));
  gap:12px 16px; margin:12px 0;
}

/* Sprachkatalog pflegen (2026-09-14). Eine Zeile je Sprache: vier schmale
   Felder und der Knopf daneben - so weit möglich in EINER Zeile, weil es
   eine Zeile Daten ist. Wird sie zu eng, bricht sie um, statt zu scrollen. */
.builder-sprachkatalog{ margin-top:22px; }
.builder-sprachkatalog > summary{
  cursor:pointer; font-size:13.5px; font-weight:600; color:var(--text-2);
}
.builder-sprachkatalog > summary:hover{ color:var(--text); }
.builder-sprachzeile{
  display:flex; flex-wrap:wrap; align-items:flex-end; gap:10px 14px;
  padding:12px 0; border-top:1px solid var(--border);
}
.builder-sprachform{
  display:flex; flex-wrap:wrap; align-items:flex-end; gap:10px 12px; margin:0;
}
.builder-sprachform label{
  display:flex; flex-direction:column; gap:4px;
  font-size:11.5px; color:var(--text-2);
}
.builder-sprachform input[type="text"]{ width:130px; }
.builder-sprachform input[type="number"]{ width:88px; }
.builder-sprachnutzung{ margin:0; align-self:center; }

/* Schwierigkeitsgrade pflegen (2026-09-14): eine Zeile je Grad, Felder
   nebeneinander - dasselbe Muster wie der Sprachkatalog daneben. */
.builder-gradform{
  display:flex; flex-wrap:wrap; align-items:center; gap:10px 12px;
  margin:0; padding:10px 0; border-top:1px solid var(--border);
}
.builder-gradform input[type="text"]{ width:220px; }
.builder-gradform input[type="number"]{ width:88px; }
.builder-gradform label{
  display:flex; align-items:center; gap:6px;
  font-size:11.5px; color:var(--text-2);
}

/* Werte je Schwierigkeitsgrad in der Eintragskarte (2026-09-14). Schmale
   Tabelle, Zahlen in der Monospace-Schrift wie überall bei Messwerten. */
.karte-schwierigkeit-scroll{ overflow-x:auto; }
.karte-schwierigkeit-tabelle{
  border-collapse:collapse; font-size:14px; min-width:100%;
  font-variant-numeric:tabular-nums;
}
.karte-schwierigkeit-tabelle th,
.karte-schwierigkeit-tabelle td{
  padding:6px 12px; border-bottom:1px solid var(--border); text-align:right;
  white-space:nowrap;
}
.karte-schwierigkeit-tabelle thead th{
  color:var(--text-2); font-size:11.5px; font-weight:600;
}
.karte-schwierigkeit-tabelle tbody th{
  text-align:left; font-weight:600; color:var(--text-2);
}
.karte-schwierigkeit-tabelle td{ font-family:var(--schrift-mono); }

/* Sammelbelohnungen im Builder (2026-09-14): „ab 3 Tafelfragmente gibt es
   das hier". Eine schmale Eingabetabelle, Felder so breit wie ihr Inhalt. */
.builder-sammel-tabelle{
  width:100%; border-collapse:collapse; font-size:13px; margin:10px 0 18px;
}
.builder-sammel-tabelle th,
.builder-sammel-tabelle td{
  padding:6px 8px; border-bottom:1px solid var(--border); text-align:left;
  vertical-align:middle;
}
.builder-sammel-tabelle thead th{
  color:var(--text-2); font-size:11.5px; font-weight:600;
}
.builder-sammel-tabelle input[type="number"]{ width:72px; }
.builder-sammel-tabelle input[type="text"]{ width:100%; min-width:120px; }
.builder-sammel-weg{ display:flex; align-items:center; gap:6px; }

/* Sammelbelohnungen auf der Ortskarte (2026-09-14): „ab 3 Tafelfragmenten
   gibt es das hier". Die Schwelle links, die Belohnung daneben. */
.sammel-stufen{ list-style:none; margin:0; padding:0; }
.sammel-stufe{
  display:flex; flex-wrap:wrap; align-items:baseline; gap:6px 12px;
  padding:6px 0; border-bottom:1px solid var(--border);
}
.sammel-stufe:last-child{ border-bottom:0; }
.sammel-schwelle{
  min-width:9.5rem; font-family:var(--schrift-mono); font-size:13.5px;
  color:var(--text); font-weight:600; font-variant-numeric:tabular-nums;
}
.sammel-lohn{ flex:1 1 12rem; }
