﻿/* ============================================================
   Clash Royale Stats – Clean & Modern (Light) Design System
   ============================================================ */

@font-face {
  font-family: "Clash Display";
  src: url("assets/merge-tactics/Clash_Bold.otf") format("opentype");
  font-weight: 700;
  font-style: normal;
  font-display: swap;
}

:root {
  /* Upgrade-Leiste unter der Karte im Kartendetail. Die Werte sind aus Eliass'
     Spiel-Screenshots ausgemessen (IMG_9933 blau, IMG_9934 gruen), nicht geschaetzt.
     Jede Leiste ist zweigeteilt: obere Haelfte hell, ab ~52 % dunkler. */
  /* Rahmen und Schriftkontur sind beide echtes Schwarz, wie im Spiel. */
  --cr-bar-border: #000000;
  --cr-bar-track-top: #202649;
  --cr-bar-track-bottom: #191e44;
  --cr-bar-blue-top: #69dcf7;
  --cr-bar-blue-bottom: #52b2e4;
  --cr-bar-green-top: #78f968;
  --cr-bar-green-bottom: #61d05a;

  /* Legacy-Aliase aus dem alten hellen Design. Zeigen bewusst auf das dunkle
     Panel-Schema, damit nichts mehr versehentlich weiss wird. Neuer Code
     nutzt direkt die --panel-* Tokens. */
  --bg: #0f1420;
  --surface: #151a24;
  --surface-2: rgba(9, 12, 20, 0.6);
  --border: var(--panel-border);
  /* Alle Flaechen der Seite sind dunkel (siehe --panel-*), darum ist die
     Standard-Schriftfarbe hell. --text-invert nur auf hellen Buttons nutzen. */
  --text: #f3f6ff;
  --text-invert: #16203a;
  --muted: #737b8c;
  --primary: #3b6ef5;
  --primary-d: #274bd4;
  --gold: #f5b93b;
  --win: #1aa251;
  --loss: #e0413a;
  --radius: 14px;
  --radius-sm: 9px;
  /* Merge-Tactics-Arena (Board im Best-Builds-Tab). Die Felder werden NICHT
     eingefaerbt - sichtbar bleibt das Arena-Bild. Diese Tokens gelten nur fuer
     Zustaende (Hover, belegt) und die Flaeche hinter dem Bild. */
  --mt-arena-floor: #64822f;
  --mt-arena-hex-hover: rgba(255, 255, 255, 0.24);
  --mt-arena-hex-line: rgba(255, 255, 255, 0.9);
  --mt-arena-hex-taken: rgba(59, 110, 245, 0.3);
  --mt-arena-ruler-hover: rgba(245, 185, 59, 0.3);
  --mt-modifier-card-top: #281378;
  --mt-modifier-card-mid: #5527b8;
  --mt-modifier-card-bottom: #4820a8;
  --mt-modifier-card-bg: linear-gradient(180deg, var(--mt-modifier-card-top) 0%, var(--mt-modifier-card-mid) 47%, var(--mt-modifier-card-bottom) 100%);
  --mt-modifier-card-shadow: #171025;
  --shadow-sm: 0 1px 2px rgba(20, 30, 60, 0.06);
  --shadow: 0 2px 8px rgba(20, 30, 60, 0.06), 0 8px 24px rgba(20, 30, 60, 0.05);

  /* ---- Panel-Design = STANDARD der Seite ----------------------------------
     Vorbild ist die Deckbox aus Geier (`.geier-deck-tile` / `.player-deck-box`):
     blau-lila Verlauf, blauer Rand, Glow-Linie oben, helle Schrift.
     Jede neue Flaeche nutzt diese Tokens bzw. die Klasse `.panel` – KEINE
     eigenen Hexwerte und keine hellen `--surface`-Flaechen mehr. */
  --panel-bg: linear-gradient(145deg, rgba(31, 48, 91, 0.94), rgba(18, 21, 31, 0.97) 52%, rgba(39, 22, 48, 0.94));
  --panel-border: rgba(99, 125, 215, 0.42);
  --panel-shadow: 0 8px 24px rgba(3, 6, 14, 0.24), inset 0 0 22px rgba(83, 110, 215, 0.06);
  --panel-radius: 8px;
  --panel-text: #f3f6ff;
  --panel-muted: rgba(226, 233, 248, 0.66);
  --panel-dim: rgba(226, 233, 248, 0.45);
  /* ---- Clash-Royale-Rautenmuster ----------------------------------------
     Nachbau des Spiel-Hintergrunds, am Screenshot von Eliass ausgemessen (siehe
     public/preview/pattern/index.html, dort steht die vollstaendige Messung).
     Zwei Grundtoene im Schachbrett plus eine sehr milde Schattierung je Raute
     (+/- 2 %, oben heller). Als Inline-SVG statt als Bild: keine zusaetzliche
     Anfrage, Vektor, und die Kachel wird einmal gerastert und danach nur noch
     als fertige Textur wiederholt.

     NICHT mit `background-attachment: fixed`, Animationen oder `backdrop-filter`
     kombinieren - das sind die drei Dinge, die daraus eine Dauerlast beim
     Scrollen machen wuerden. */
  --karo-fuge: #062764;
  --karo-groesse: 72px;
  --karo-kachel: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100' width='100' height='100'%3E%3Cdefs%3E%3ClinearGradient id='a' x1='0' y1='0' x2='0' y2='1' gradientTransform='rotate(-45 .5 .5)'%3E%3Cstop offset='0' stop-color='%231b64b7'/%3E%3Cstop offset='1' stop-color='%231960af'/%3E%3C/linearGradient%3E%3ClinearGradient id='b' x1='0' y1='0' x2='0' y2='1' gradientTransform='rotate(-45 .5 .5)'%3E%3Cstop offset='0' stop-color='%231752a5'/%3E%3Cstop offset='1' stop-color='%23174e9f'/%3E%3C/linearGradient%3E%3C/defs%3E%3Crect width='100' height='100' fill='%23062764'/%3E%3Crect x='15.45' y='15.45' width='69.11' height='69.11' rx='9' transform='rotate(45 50 50)' fill='url(%23a)'/%3E%3Crect x='-34.55' y='-34.55' width='69.11' height='69.11' rx='9' transform='rotate(45 0 0)' fill='url(%23b)'/%3E%3Crect x='65.44' y='-34.55' width='69.11' height='69.11' rx='9' transform='rotate(45 100 0)' fill='url(%23b)'/%3E%3Crect x='-34.55' y='65.44' width='69.11' height='69.11' rx='9' transform='rotate(45 0 100)' fill='url(%23b)'/%3E%3Crect x='65.44' y='65.44' width='69.11' height='69.11' rx='9' transform='rotate(45 100 100)' fill='url(%23b)'/%3E%3C/svg%3E");
  /* Grossflaechiges Licht wie im Spiel - liegt UEBER der Kachel, nicht in ihr,
     sonst wiederholte es sich in jeder Kachel und das Raster wuerde streifen. */
  --karo-licht: linear-gradient(180deg, rgba(255,255,255,0.07), rgba(255,255,255,0) 26%, rgba(0,0,0,0.12) 74%, rgba(0,0,0,0.24));

  /* Serienfarben des Season-End-Diagramms. Jeder Spieler hat eine eigene Farbe
     (Eliass 07.09.2026). Zehn kategoriale Toene sind grenzwertig, deshalb ist die
     Palette mit dem Validator geprueft und besteht gegen den dunklen Untergrund
     alle fuenf Tests: Helligkeitsband 0,48-0,67, Buntheit ueber dem Boden,
     Unterscheidbarkeit bei Farbfehlsichtigkeit, Normalsicht (schlechtestes Paar
     Delta-E 15,9) und Kontrast >= 3:1. Ausserdem traegt jede Linie ihren Namen am
     rechten Ende - die Identitaet haengt nie allein an der Farbe.
     Wer hier etwas aendert, prueft es erneut. */
  --series-1: #4a86e8;
  --series-2: #d9603a;
  --series-3: #1fa39a;
  --series-4: #b95bd0;
  --series-5: #b08a1a;
  --series-6: #e05a86;
  --series-7: #6f7ae0;
  --series-8: #3d9450;
  --series-9: #2b8fb8;
  --series-10: #a9701f;
  /* Glow-Linie an der Oberkante (siehe `.panel::before`). */
  --panel-line: linear-gradient(90deg, transparent, #587cff, #bd71f0, transparent);
  --panel-line-glow: 0 0 8px rgba(89, 122, 255, 0.5);
  /* Feedback bleibt absichtlich undurchsichtig. Hinter einem langen Formular
     darf die Seite weder durchscheinen noch mit dem Inhalt konkurrieren. */
  --feedback-bg: #0b0b0d;
  --feedback-backdrop: rgba(0, 0, 0, 0.88);
  --support-bg: color-mix(in srgb, var(--feedback-bg) 52%, transparent);
  --header-menu-bg: #101116;
  --header-menu-hover: #181b24;
  /* Abgesetzte Innenflaeche innerhalb eines Panels (Stat-Kacheln, Zeilen). */
  --panel-inset: linear-gradient(135deg, rgba(9, 12, 20, 0.78), rgba(20, 24, 35, 0.72));
  --panel-inset-border: rgba(123, 145, 216, 0.2);

  /* ---- Deck-Buttons (Bookmark / QR) = STANDARD ---------------------------- */
  --deck-btn-bg: #172131;
  --deck-btn-border: #344156;
  --deck-btn-fg: #a9bded;
  --deck-btn-hover-border: #5b8cff;
  --deck-btn-hover-fg: #cbd9ff;
  --deck-btn-on: #315fce;
}

@property --profile-gold-angle {
  syntax: "<angle>";
  inherits: false;
  initial-value: 0deg;
}

@property --geier-ready-angle {
  syntax: "<angle>";
  inherits: false;
  initial-value: 0deg;
}


* { box-sizing: border-box; }

body {
  margin: 0;
  min-height: 100vh;
  /* Spalte + `main { flex: 1 }`: bei kurzen Tabs (z. B. Clan ohne Suchtreffer)
     wird der Inhalt gestreckt, damit Ad-Banner und Rechtsleiste unten am
     Fensterrand stehen statt mitten auf der Seite zu haengen. */
  display: flex;
  flex-direction: column;
  /* Positionierter Vorfahre fuer #home-bg-fx (inset:0 muss sich auf die volle
     Body-Hoehe beziehen, nicht auf den Viewport - sonst reicht das Sternenfeld
     nicht bis zur Footer-/Rechtliches-Leiste runter). */
  position: relative;
  isolation: isolate;
  font-family: "Inter", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
  color: var(--text);
  background: #0f1420;
  line-height: 1.55;
}

/* Arabischer Text laeuft RTL, die etablierte Seitengeometrie bleibt jedoch LTR.
   Interaktive Shells enthalten viele feste Karten-/Deckreihenfolgen, die nicht
   semantisch gespiegelt werden duerfen. Formfelder und Fliesstext erben weiterhin RTL. */
body[data-content-direction="rtl"] :is(p, h1, h2, h3, h4, h5, label, input, textarea, select, .page-intro, .header-language-option span) { direction: rtl; text-align: right; }

/* Home ist bewusst reines Ambiente-Dunkel (siehe #view-home unten), kein Foto-Hintergrund.
   #view-home deckt aber nur die Haupt-Flaeche ab - Bereiche ausserhalb davon links/rechts
   sind selbst transparent und liessen darunter das helle body::before-Foto durchscheinen
   (sichtbarer "offener" heller Fleck unter dem dunklen Bereich). Body-Klasse wird von
   showHome()/switchTab() in app.js gesetzt. */
body.home-active { background: #0c0d12; }
/* Frueher display:none - das laesst sich nicht ueberblenden und der Wechsel Startseite
   <-> Werkzeug war ein harter Farbsprung. Jetzt bleiben BEIDE Ebenen immer im Baum und
   nur ihre Deckkraft wird gekreuzt: das Foto (body::before, z-index 0) liegt ueber dem
   Sternenfeld (#home-bg-fx, z-index -1), es blendet also uebereinander statt zu
   springen. */
body.home-active::before { opacity: 0; }

/* Die Ueberblendung ist absichtlich NICHT von Anfang an scharf: beim Direktaufruf einer
   Unterseite oder der Startseite wuerde man sonst beim ersten Bild den jeweils anderen
   Hintergrund wegblenden sehen. app.js setzt .bg-fade-ready erst zwei Frames nach dem
   ersten applyRoute() - ab da ist jeder Wechsel ein Uebergang, der Seitenaufbau selbst
   bleibt hart und damit unauffaellig.
   Die 550ms stehen als BG_FADE_MS auch in app.js (der Sternenfeld-Loop darf erst danach
   anhalten) - wer hier dreht, muss dort mitziehen. */
body.bg-fade-ready,
body.bg-fade-ready::before {
  transition: opacity .55s ease, background-color .55s ease;
}
/* visibility mit Verzoegerung: erst NACH dem Ausblenden auf hidden, damit der Browser
   die geblurrten Galaxien im Ruhezustand ganz ueberspringen kann; beim Einblenden
   sofort sichtbar, sonst faengt die Blende im Nichts an. */
body.bg-fade-ready #home-bg-fx { transition: opacity .55s ease, visibility 0s linear .55s; }
body.bg-fade-ready.home-active #home-bg-fx { transition: opacity .55s ease, visibility 0s; }
/* Die Spiralen drehen sich 110s bzw. 150s pro Umdrehung - ausserhalb der Startseite
   waere das reine Rechenlast fuer ein unsichtbares Bild. */
body:not(.home-active) .home-galaxy { animation-play-state: paused; }

/* Historische Darstellung: exakt 7px Blur, 50% Helligkeit und 8% Ueberstand.
   Der Layer liegt jetzt auf Ebene 0 statt negativ hinter der Body-Farbe. */
body::before {
  content: "";
  position: fixed;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  /* Season-Artwork. Wird ohnehin geblurrt, deshalb reicht 1920 px Breite und
     JPEG q74. Neue Season = neues komprimiertes Bild + Pfad hier.
     Vorhanden: bg-viking-journey-blurred.jpg (hell, 102 KB) - aktuell aktiv,
                bg-shocktober.jpg (dunkel/blau, 320 KB),
                bg-theme.jpg (alt, unbenutzt); die alte bg.png liegt nur noch unter assets/raw/.
     Erste Ebene ist ein Verlauf von der Navbar-Farbe (#0b0b0d) zu transparent,
     damit der Sprung Navbar -> Hintergrundbild nicht so hart wirkt. Er haengt
     am Hintergrundbild selbst (gleiches Element), nicht an der Navbar - wandert
     also mit dem Parallax-Shift unten mit statt starr an der Kopfleiste zu kleben. */
  background-image:
    /* Startfarbe ist der bereits abgedunkelte Wert (#0b0b0d mal 0.5), weil der
       frueher hier stehende brightness()-Filter auch diesen Verlauf mitgedunkelt
       hat. Ohne die Anpassung waere der Uebergang ploetzlich heller. */
    linear-gradient(to bottom, #060607, rgba(6, 6, 7, 0)),
    url("assets/bg-viking-journey-blurred.jpg");
  background-position: top, center top;
  background-size: 100% 220px, cover;
  background-repeat: no-repeat, no-repeat;
  /* KEIN filter: blur()/brightness() mehr - beides ist fest ins Bild eingebacken
     (bg-viking-journey-blurred.jpg, erzeugt aus dem Original mit Sigma 7 und
     linear(0.5, 0), also exakt den frueheren CSS-Werten).
     GRUND (Eliass, 22.08.2026, iPhone-Nutzer mit Videobeleg): Dieses Element ist
     `position: fixed`, bildschirmfuellend, und app.js verschiebt es bei JEDEM
     Scroll-Frame ueber --bg-shift. Ein bildschirmgrosser Weichzeichner, der
     dabei laufend neu berechnet wird, ist auf iOS Safari die teuerste denkbare
     Ebene: Wird der Grafikspeicher knapp, verwirft iOS genau sie - und es bleibt
     eine graue/schwarze Flaeche. Aufgetreten auf /decks/meta, der Seite mit den
     meisten Bildern (100 Decks a 8 Karten). Dieselbe Ursache steckte hinter der
     aelteren Meldung "Hintergrund folgt dem Finger nicht, springt beim Loslassen".
     Eingebacken kostet das Bild pro Frame nichts mehr - und ist als Datei zugleich
     kleiner (331 -> 102 KB), weil weichgezeichnete Flaechen sich besser packen.
     Bei einem Season-Wechsel: neues Bild MIT eingebackenem Effekt erzeugen, nicht
     den Filter wieder einbauen. */
  /* translateY kommt von app.js (Scroll-Parallax, Fortschritt ueber die ganze Seite).
     Die scale(1.2) ist der Ueberstand-Puffer dafuer - Aenderung hier IMMER mit dem
     BG_SCALE-Wert in app.js synchron halten, sonst reisst der Shift den Bildrand
     sichtbar ins Bild. */
  transform: translateY(var(--bg-shift, 0px)) scale(1.2);
}
/* `main` muss ueber dem Footer liegen: beide bilden einen eigenen Stacking-Context,
   und bei gleichem z-index gewinnt der spaetere im DOM. Sonst legt sich der
   Ad-Platzhalter im Footer ueber die Suchvorschlaege (Spieler/Clan) und schluckt
   deren Klicks – das `z-index: 30` der `.search-dropdown` wirkt nur innerhalb `main`. */
main { position: relative; z-index: 2; }
.site-footer { position: relative; z-index: 1; }

h1, h2, h3 { line-height: 1.2; }
a { color: var(--primary); text-decoration: none; }
a:hover { text-decoration: underline; }
small { color: var(--muted); font-weight: normal; }

/* ---------- Header + Tabs ---------- */
/* Nur der Seitenkopf – nicht jedes <header> im Inhalt (Builder-Ergebnisse!). */
body > header {
  position: sticky;
  top: 0;
  z-index: 10;
  background: #0b0b0d;
  border-bottom: 1px solid rgba(255, 255, 255, 0.08);
}
/* Nur solange der lange Sprachkatalog offen ist, liegt die Kopfzeile ueber der
   Cookie-Karte. Sonst koennte diese auf dem ersten Besuch die unteren Sprachen und
   den Uebersetzungs-Feedbacklink abfangen. Geschlossen bleibt der alte z-index. */
body > header:has(.header-language[open]) { z-index: 70; }
/* ?embed=1: Seite lebt als reiner Inhalt in einer fremden Huelle - eigene Kopf-Nav weg. */
body.embed-mode > header { display: none; }

/* Drei Spalten statt einer Flex-Reihe: links die Marke, mittig die Reiter, rechts eine
   LEERE Spur. Die dritte Spur braucht kein eigenes Element - `1fr auto 1fr` macht die
   beiden Randspuren gleich breit, und genau dadurch sitzt die Reiterreihe exakt in der
   Fenstermitte statt nur rechts neben dem Logo.

   BEWUSST OHNE max-width, anders als main/.site-footer/.site-legal-inner: mit den
   fruehreren 1000px + margin:0 auto sass die Marke zwar links IHRER Spalte, aber die
   Spalte schwamm bei breiten Fenstern selbst in der Mitte - vom Fensterrand war das
   Logo dann weit weg. Der Kopfbalken geht ohnehin ueber die volle Breite (Hintergrund
   und Trennlinie in body > header), also darf sein Inhalt das auch. Nebeneffekt, der
   hier den Ausschlag gab: ueber die volle Fensterbreite ist genug Platz, dass die
   Reiterreihe WIRKLICH mittig steht - im 1000px-Raster reichte es dafuer nicht, weil
   Marke links und leere Spur rechts zusammen mehr gebraucht haetten als uebrig war.
   Die Fenstermitte ist zugleich die Mitte der 1000px-Inhaltsspalte darunter, die Reiter
   fluchten also weiterhin mit dem Inhalt. */
.nav-inner {
  display: grid; grid-template-columns: 1fr auto 1fr; align-items: center;
  width: 100%; padding: 0 1.25rem; height: 58px;
}
#tabs { justify-self: center; }
/* Logo UND Name sind zusammen EIN Button (= Startseite). Zusaetzlich gibt es seit
   11.08.2026 das Haus-Icon als vollwertigen Reiter (siehe .nav-home) - nicht als
   zweiter Weg nach Hause gedacht, sondern damit die Startseite ueberhaupt einen
   Aktiv-Zustand in der Navigation bekommt; vorher war dort schlicht nichts markiert.
   justify-self MUSS hier drinstehen und nicht in einer eigenen Regel davor: `all: unset`
   setzt jede Eigenschaft zurueck, auch die Ausrichtung im Raster. */
.brand {
  all: unset; box-sizing: border-box; cursor: pointer;
  display: flex; align-items: center; justify-self: start;
  -webkit-user-drag: none; user-select: none;
}
.brand img { -webkit-user-drag: none; }
.brand .logo { width: 28px; height: 28px; border-radius: 7px; object-fit: cover; transition: box-shadow .18s ease, transform .18s ease; }
/* line-height: 0.9 wegen des Zeilenumbruchs. Zwischen rund 1160 und 1250px reicht die
   linke Rasterspalte nicht mehr fuer "Tryaz Gaming" in einer Zeile, der Schriftzug
   bricht dort um. Mit der vom Body geerbten Zeilenhoehe (1,55) standen die beiden
   Zeilen 26px auseinander und lasen sich wie zwei Woerter statt wie ein Name
   (Eliass 03.09.2026). Einzeilig aendert der Wert nichts Sichtbares: die Zeile steht
   in der Leiste ohnehin senkrecht zentriert, die Zeilenhoehe bestimmt nur die
   Kastenhoehe. Unterlängen bleiben heil, hier wird nirgends geclippt. */
.brand span { margin-left: 0.55rem; color: #fff; font-family: "Inter", sans-serif; font-weight: 800; font-size: 1.05rem; line-height: 0.9; letter-spacing: -0.01em; transition: text-shadow .18s ease; }
/* Das globale button:hover{background:var(--primary-d)} (0,1,1) schlaegt das
   all:unset der Grundregel (0,1,0) - ohne diese Zeile liegt ein blauer Kasten hinter
   Logo UND Schriftzug. Statt Flaeche jetzt Licht: dasselbe kuehle Blau-Tuerkis wie bei
   den Karussell-Pfeilen (.car-arrow), das Logo bekommt einen Leuchtring und hebt sich
   einen Pixel, der Schriftzug einen weichen Schein. Kein Kasten, keine Verschiebung
   der Nachbarn. */
.brand:hover { background: none; }
.brand:hover .logo {
  transform: translateY(-1px) scale(1.05);
  box-shadow: 0 0 0 1px rgba(140, 235, 255, .55), 0 0 12px rgba(88, 180, 255, .6), 0 0 24px rgba(88, 180, 255, .28);
}
.brand:hover span { text-shadow: 0 0 14px rgba(122, 190, 255, .6); }
.brand:focus-visible { outline: 2px solid var(--primary); outline-offset: 4px; border-radius: 10px; }
@media (prefers-reduced-motion: reduce) { .brand:hover .logo { transform: none; } }

/* Rechter Gegenpol zur Marke. Ein gemeinsamer Einstieg statt zweier Header-Knoepfe;
   Feedback und Bug Report werden erst im Fenster getrennt. Eigener Hover ist Pflicht,
   damit die globale blaue button:hover-Flaeche nicht in die schwarze Navbar greift. */
.header-feedback {
  all: unset; box-sizing: border-box; justify-self: end; cursor: pointer;
  display: inline-flex; align-items: center; gap: 0.48rem;
  min-height: 32px; padding: 0.25rem 0.7rem;
  border: 2px solid var(--panel-inset-border); border-radius: 7px;
  color: var(--panel-muted); font-size: 0.82rem; font-weight: 750;
  transition: color .15s ease, border-color .15s ease;
}
.header-feedback img { width: 22px; height: 22px; object-fit: contain; opacity: .82; }
.header-feedback:hover { background: none; color: var(--panel-text); border-color: var(--panel-border); }
.header-feedback:focus-visible { outline: 2px solid var(--primary); outline-offset: 3px; }

/* Sprache und Feedback bilden gemeinsam den rechten Gegenpol zur Marke. Der
   Sprachschalter bleibt bewusst kompakt, damit die mittige Hauptnavigation ihre
   Position nicht verliert. Die noch nicht fertigen Kataloge sind bereits sichtbar,
   aber nicht anklickbar: eine englische Seite darf keine andere Sprache vortaeuschen. */
.header-actions {
  justify-self: end; display: inline-flex; align-items: center; gap: 0.5rem;
}
.header-language { position: relative; flex: none; }
.header-language > summary {
  display: inline-flex; align-items: center; justify-content: center; gap: 0.38rem;
  min-width: 58px; min-height: 32px; padding: 0.25rem 0.55rem;
  border: 2px solid var(--panel-inset-border); border-radius: 4px;
  color: var(--panel-muted); background: transparent; cursor: pointer;
  font-size: 0.78rem; font-weight: 800; list-style: none;
  transition: color .15s ease, border-color .15s ease;
}
.header-language > summary::-webkit-details-marker { display: none; }
.header-language > summary:hover,
.header-language[open] > summary { color: var(--panel-text); border-color: var(--panel-border); }
.header-language > summary:focus-visible { outline: 2px solid var(--primary); outline-offset: 3px; }
.header-language-menu {
  position: absolute; z-index: 30; top: calc(100% + 8px); right: 0;
  width: min(310px, calc(100vw - 24px)); max-height: min(620px, calc(100vh - 78px));
  overflow-y: auto; padding: 0.45rem;
  border: 2px solid var(--panel-border); border-radius: var(--panel-radius);
  background: var(--header-menu-bg); box-shadow: var(--panel-shadow);
  scrollbar-width: thin; transform-origin: top right;
  opacity: 0; visibility: hidden; pointer-events: none;
  transform: translateY(-7px) scaleY(0.96);
  transition: opacity .16s ease, transform .18s ease, visibility 0s linear .18s;
}
@media (max-width: 680px) {
  /* Der eigentliche Mobile-Shell folgt spaeter. Bis dahin muss der Sprachkatalog
     trotzdem aus jeder sichtbaren Headerposition im Viewport bleiben. */
  .header-language-menu { position: fixed; top: 66px; right: 12px; max-height: calc(100dvh - 78px); }
}
/* Browser verstecken den Inhalt eines geschlossenen <details> normalerweise sofort
   per display:none. Das ueberschreiben wir nur fuer dieses absolut positionierte
   Panel, damit auch die Rueckwaertsanimation sichtbar zu Ende laufen kann. */
.header-language:not([open]) > .header-language-menu { display: block; }
.header-language[open] > .header-language-menu {
  opacity: 1; visibility: visible; pointer-events: auto; transform: translateY(0) scaleY(1);
  transition-delay: 0s;
}
.header-language.js-animated > .header-language-menu { transition: none; }
.header-language-head {
  display: flex; align-items: baseline; justify-content: space-between; gap: 1rem;
  padding: 0.5rem 0.6rem 0.6rem; border-bottom: 1px solid var(--panel-inset-border);
}
.header-language-head b { color: var(--panel-text); font-size: 0.82rem; }
.header-language-head small { color: var(--panel-dim); font-size: 0.64rem; }
.header-language-option {
  all: unset; box-sizing: border-box; width: 100%; min-height: 33px;
  display: flex; align-items: center; justify-content: space-between; gap: 1rem;
  padding: 0.35rem 0.6rem; border-bottom: 1px solid var(--panel-inset-border);
  color: var(--panel-muted); text-decoration: none; font-size: 0.78rem;
}
.header-language-option span { color: var(--panel-text); font-weight: 700; }
.header-language-option small { color: var(--panel-dim); font-size: 0.61rem; white-space: nowrap; }
.header-language-option.active { cursor: default; }
.header-language-option.active:disabled { opacity: 1; }
.header-language-option.active small { color: var(--gold); }
.header-language-option:disabled { cursor: not-allowed; opacity: 0.62; }
.header-language-option:not(:disabled):hover { background: var(--header-menu-hover); text-decoration: none; }
.header-language-option:disabled:hover { background: transparent; }
.header-language-note {
  margin: 0.5rem 0 0; padding: 0.55rem 0.6rem 0.35rem;
  color: var(--panel-dim); font-size: 0.66rem; line-height: 1.45;
}
.header-language-note button {
  all: unset; cursor: pointer; color: var(--gold); font-weight: 750;
}
.header-language-note button:hover { background: none; color: var(--panel-text); text-decoration: underline; }
.header-language-note button:focus-visible { outline: 2px solid var(--primary); outline-offset: 2px; }

@media (max-width: 680px) {
  .header-feedback span { display: none; }
  .header-feedback { padding-inline: 0.42rem; }
  .header-language > summary { min-width: 52px; padding-inline: 0.42rem; }
}
@media (prefers-reduced-motion: reduce) {
  .header-language-menu { transition: none; transform: none; }
}

/* overflow-x hier NICHT wieder aktivieren: eine Achse ungleich "visible" laesst den
   Browser auch die andere Achse auf "auto" berechnen - das schneidet die absolut
   positionierten .dropdown-Panels unterhalb der Tabs ab (Pfeil dreht sich noch,
   Panel bleibt unsichtbar). Falls Tabs auf schmalen Fenstern mal nicht mehr passen,
   braucht das eine eigene Loesung (z. B. Dropdown per JS aus #tabs herausrendern). */
#tabs { position: relative; display: flex; align-items: stretch; height: 100%; }
.nav-item { position: relative; display: flex; align-items: stretch; }
.nav-item .nav-link {
  all: unset; box-sizing: border-box; cursor: pointer; display: flex; align-items: center; gap: 0.3rem; height: 100%;
  padding: 0 0.85rem; color: rgba(255, 255, 255, 0.6); font-size: 0.9rem; font-weight: 600; font-family: inherit;
  white-space: nowrap; border-bottom: 2px solid transparent; transition: color 0.15s; text-decoration: none;
}
.nav-item .nav-link:hover { color: #fff; }
.nav-item .nav-link.active { color: #fff; border-bottom-color: var(--primary); }
/* Reines Icon statt Text: etwas schmaler, damit es neben "Player" nicht wie eine
   Luecke wirkt. Aktiv-Zustand und Unterstrich kommen aus den Regeln darueber, das Haus
   verhaelt sich also genau wie jeder andere Reiter.
   Das Icon ist gefuellt statt umrissen und mit 20px etwas groesser als die Schrift
   daneben - eine 2px-Kontur waere neben Text derselben Hoehe deutlich zierlicher
   erschienen als die Beschriftungen. Die Tuer ist ein Loch (fill-rule: evenodd), sie
   nimmt also die Farbe der Leiste an und faellt beim Aktiv-Zustand mit um. */
.nav-item .nav-link.nav-home { padding-inline: 0.7rem; }
.nav-item .nav-link.nav-home svg { display: block; }
.nav-caret { opacity: 0.55; transition: transform .16s ease; }
/* Der Pfeil ist ein eigenes Ziel: Name antippen oeffnet den Reiter, Pfeil antippen
   das Menue (Eliass 03.09.2026). Die Huelle ist ein <span> und bleibt damit
   nicht-interaktiv - ein <button> im <a> waere verschachtelte Interaktion. */
.nav-caret-hit { display: inline-flex; align-items: center; position: relative; }
/* Am Finger braucht der 11px-Pfeil eine echte Trefferflaeche. Unsichtbar, greift nur
   dort, wo ohnehin nichts anderes liegt. */
@media (pointer: coarse) {
  .nav-caret-hit::after {
    content: ""; position: absolute; top: 50%; left: 50%;
    width: 44px; height: 44px; transform: translate(-50%, -50%);
  }
}
.nav-item.has-dropdown:focus-within .nav-caret,
.nav-item.has-dropdown.dropdown-open .nav-caret { transform: rotate(180deg); }
@media (hover: hover) {
  .nav-item.has-dropdown:hover .nav-caret { transform: rotate(180deg); }
}

/* Buendig mit der Bar: kein Abstand, keine Rundung - wirkt wie ein Feld, das sich
   direkt unter dem Reiter aufklappt, nicht wie eine schwebende Karte. */
.dropdown {
  position: absolute; top: 100%; left: 0; z-index: 25; min-width: 210px;
  background: #0b0b0d; border: 1px solid rgba(255, 255, 255, 0.08); border-top: none;
  border-radius: 0; padding: 0.2rem 0; margin: 0;
  opacity: 0; visibility: hidden; transform: translateY(-4px);
  transition: opacity .14s ease, transform .14s ease, visibility 0s linear .14s;
}
/* Geoeffnet wird auf drei Wegen, und der erste gilt NUR fuer echte Zeigegeraete:
   Auf einem Touchscreen bleibt der emulierte :hover-Zustand nach dem Tippen kleben.
   Dadurch brauchte ein Reiter am iPad zwei Taps und das Menue liess sich nicht mehr
   schliessen (Eliass 03.09.2026). `.dropdown-open` ist der ausdrueckliche Zustand,
   den der Pfeil-Tap setzt. */
@media (hover: hover) {
  .nav-item.has-dropdown:hover .dropdown {
    opacity: 1; visibility: visible; transform: translateY(0);
    transition: opacity .14s ease, transform .14s ease;
  }
}
.nav-item.has-dropdown:focus-within .dropdown,
.nav-item.has-dropdown.dropdown-open .dropdown {
  opacity: 1; visibility: visible; transform: translateY(0);
  transition: opacity .14s ease, transform .14s ease;
}
/* Ein ausgewaehlter Unterpunkt schliesst sein Menue auch dann, wenn der Mauszeiger
   noch kurz darueber steht. Beim naechsten Pointer-/Tastatur-Einstieg entfernt JS
   den Zustand wieder; so koennen nie zwei Dropdowns gleichzeitig offen bleiben. */
.nav-item.has-dropdown.dropdown-dismissed .dropdown {
  opacity: 0; visibility: hidden; pointer-events: none; transform: translateY(-4px);
  transition: opacity .14s ease, transform .14s ease, visibility 0s linear .14s;
}
.nav-item.has-dropdown.dropdown-dismissed .nav-caret { transform: none; }
@media (prefers-reduced-motion: reduce) { .dropdown { transition: opacity .01s linear, visibility 0s linear; } }
.dropdown :is(a, button) {
  all: unset; box-sizing: border-box; cursor: pointer; display: flex; align-items: center; gap: 0.5rem;
  width: 100%; padding: 0.6rem 0.85rem; border-radius: 0; color: rgba(255, 255, 255, 0.6);
  font-size: 0.86rem; font-weight: 600; font-family: inherit; text-decoration: none;
  transition: color .12s ease, background .12s ease, transform .12s ease;
}
.dropdown :is(a, button):hover { color: #fff; background: rgba(255,255,255,.07); transform: translateX(3px); }
.dropdown button[disabled] { color: rgba(255, 255, 255, 0.35); cursor: default; }
.dropdown button[disabled]:hover { background: none; transform: none; }
.dropdown button img.lock { width: 13px; height: 13px; opacity: .75; flex: none; }
@media (prefers-reduced-motion: reduce) { .dropdown :is(a, button):hover { transform: none; } }

/* ---------- Home (Startseite) ---------- */
/* Ambiente statt Foto-Hintergrund: grosse Nebel-Glowflaechen in den Logo-Farben
   (#587cff/#bd71f0, dieselben wie die Panel-Glow-Linie ueberall sonst auf der Seite),
   ein animiertes Canvas-Sternenfeld mit Tiefen-Parallaxe und zwei rotierende
   Galaxie-Spiralen (#home-bg-fx, Body-Ebene, siehe app.js fuer den Sternenfeld-Teil).
   #view-home selbst bleibt transparent, sonst wuerde seine eigene Flaeche den
   dahinterliegenden Body-Hintergrund komplett verdecken. Bewusst KEINE .panel-Boxen hier. */
#view-home {
  position: relative; z-index: 2; display: flex; flex-direction: column; align-items: center;
  padding: 3rem 1.5rem 3.5rem; min-height: calc(100vh - 58px);
}
#view-home[hidden] { display: none; }

/* Nur sichtbar waehrend body.home-active (von showHome()/switchTab() in app.js gesetzt).
   inset:0 bezieht sich auf body (position:relative dort), deckt also die volle Seite ab -
   bis runter zu Footer/Ad-Banner/Rechtliches-Leiste, nicht nur die #view-home-Flaeche. */
#home-bg-fx {
  /* Kein display-Wechsel mehr (siehe Ueberblendung oben bei body.home-active::before):
     die Ebene bleibt immer im Baum, sichtbar wird sie ueber Deckkraft. */
  opacity: 0; visibility: hidden;
  position: absolute; inset: 0; z-index: -1; overflow: hidden;
  isolation: isolate; /* haelt mix-blend-mode der Galaxien innerhalb dieser Ebene */
  pointer-events: none;
  background-color: #0c0d12;
  background-image:
    radial-gradient(ellipse 1100px 700px at 8% 0%, rgba(88,124,255,.24), transparent 62%),
    radial-gradient(ellipse 780px 500px at 95% 10%, rgba(245,185,59,.10), transparent 60%),
    radial-gradient(ellipse 1200px 800px at 50% 100%, rgba(189,113,240,.20), transparent 62%);
  background-size: 100% 100%, 100% 100%, 100% 100%;
  background-repeat: no-repeat, no-repeat, no-repeat;
}
body.home-active #home-bg-fx { opacity: 1; visibility: visible; }
#home-starfield {
  position: absolute; inset: 0;
  width: 100%; height: 100%;
}

/* Grosse, weich verlaufende Galaxie-Spiralen - conic-gradient statt Canvas-Blur, weil
   CSS-Filter+Transform vom Compositor auf der GPU laufen (billig), ein Blur jeden Frame
   im Canvas neu zu berechnen dagegen teuer waere. Bewusst weit ueber den Rand hinaus
   positioniert und stark geblurrt: soll wie Nebel im Hintergrund wirken, keine harte Kante. */
.home-galaxy {
  position: absolute; border-radius: 50%;
  filter: blur(60px);
  mix-blend-mode: screen;
  animation: home-galaxy-spin linear infinite;
}
.home-galaxy-a {
  width: 900px; height: 900px; top: -260px; left: -220px;
  background: conic-gradient(from 0deg,
    rgba(88,124,255,0) 0deg, rgba(88,124,255,.55) 70deg, rgba(189,113,240,.42) 150deg,
    rgba(88,124,255,0) 230deg, rgba(245,185,59,.2) 300deg, rgba(88,124,255,0) 360deg);
  animation-duration: 110s;
}
.home-galaxy-b {
  width: 760px; height: 760px; bottom: -200px; right: -180px;
  background: conic-gradient(from 180deg,
    rgba(189,113,240,0) 0deg, rgba(189,113,240,.46) 90deg, rgba(88,124,255,.34) 190deg,
    rgba(189,113,240,0) 260deg, rgba(88,124,255,0) 360deg);
  animation-duration: 150s;
  animation-direction: reverse;
}
@keyframes home-galaxy-spin { to { transform: rotate(360deg); } }
@media (prefers-reduced-motion: reduce) { .home-galaxy { animation: none; } }

#view-home .home-eyebrow {
  margin: 0; color: var(--gold); font-family: "Inter", sans-serif;
  font-size: clamp(0.68rem, 1.6vw, 0.78rem); font-weight: 800;
  letter-spacing: 0.14em; line-height: 1.35; text-align: center; text-transform: uppercase;
}
#view-home .home-brand-title {
  margin: 0.45rem 0 2.2rem; color: var(--text); font-family: "Inter", sans-serif;
  font-size: clamp(2.65rem, 7vw, 4.65rem); font-weight: 850; letter-spacing: -0.045em;
  line-height: 0.98; text-align: center;
}

.home-lookup { max-width: 460px; width: 100%; }
/* Gleitende Pille wie bei .deck-sort-control/.meta-tiers (siehe .seg-indicator) -
   .home-mode steht deshalb mit in SEG_SELECTOR (app.js), moveSeg() bewegt sie. */
.home-mode { position: relative; display: flex; justify-content: center; gap: 0.15rem; padding: 0.2rem; margin-bottom: 0.6rem; background: rgba(255,255,255,.06); border-radius: 999px; width: fit-content; margin-inline: auto; }
.home-mode button {
  all: unset; box-sizing: border-box; position: relative; z-index: 1; cursor: pointer;
  display: inline-flex; align-items: center; justify-content: center; gap: 0.34rem;
  padding: 0.35rem 0.9rem; border-radius: 999px; color: rgba(255,255,255,.4);
  font-size: 0.8rem; font-weight: 700; font-family: inherit;
}
.home-mode button img { width: 17px; height: 17px; object-fit: contain; flex: none; opacity: 0.7; }
.home-mode button.active img { opacity: 1; }
.home-mode button.active { background: transparent; color: #fff; }
.home-mode button:hover:not(.active) { color: #fff; }
.home-mode .seg-indicator { border-radius: 999px; background: var(--primary); box-shadow: none; }

/* 0.25rem statt 0.5rem: Feld und Button bleiben zwei Elemente, ruecken aber so weit
   zusammen, dass sie als eine Leiste gelesen werden. */
.home-search { display: flex; gap: 0.25rem; }
.home-search-field { position: relative; flex: 1; min-width: 0; }
/* Der Selektor ist bewusst ueber die IDs geschrieben, nicht als `.home-search-field
   input`. Die globale Regel `input[type="text"]` weiter unten (ca. Zeile 570) hat
   naemlich dieselbe Spezifitaet und steht spaeter in der Datei - sie gewann damit und
   brachte `max-width: 320px` (Feld schmaler als sein Container, fette Luecke zum
   Search-Button) und `padding: 0.6rem 0.8rem` mit (Platzhaltertext lief unter die
   Lupe). Genau darum steht bei den Reiter-Feldern `#search-form #tag-input` und dort
   ausdruecklich `max-width: none`; hier braucht es dasselbe.
   Seitliches Padding macht Platz fuer die Lupe links und das X rechts (beide liegen
   absolut im Feld, siehe .search-leading-icon/.search-clear). */
#home-search-form #home-tag-input {
  width: 100%; max-width: none; min-width: 0; height: 48px;
  padding: 0.55rem 2.7rem; border-radius: 10px;
  border: 1px solid rgba(255,255,255,.14); background: rgba(255,255,255,.05); color: #f3f6ff; font-size: 0.98rem;
}
#home-search-form #home-tag-input::placeholder { color: rgba(255,255,255,.38); }
#home-search-form #home-tag-input:focus {
  outline: none; border-color: var(--primary); background: rgba(255,255,255,.08); box-shadow: none;
}
.home-search button[type="submit"] { all: unset; box-sizing: border-box; cursor: pointer; height: 48px; padding-inline: 1.3rem; border-radius: 10px; background: var(--primary); color: #fff; font-size: 0.92rem; font-weight: 700; display: flex; align-items: center; }
.home-search button[type="submit"]:hover { background: var(--primary-d); }

/* Schmale Bildschirme: der erste Bildschirm soll mehr zeigen als Titel und Suchleiste.
   Gemessen am 14.08.2026 bei 412px begann das Karussell erst bei 1300px, weil Leerraum,
   Titelblock, Umschalter, Suchleiste und die einspaltige Anleitung zusammen den ganzen
   Viewport fuellten. Zuerst schrumpft deshalb der Leerraum, erst danach die Elemente -
   und zwar nur ueber Abstaende: Schriftgroessen von Titel, Umschalter und Suchfeld
   bleiben unangetastet, damit nichts fummelig wird. Die mittige Ausrichtung aller
   Bloecke bleibt erhalten (#view-home ist eine zentrierte Flex-Spalte). */
@media (max-width: 640px) {
  #view-home { padding-top: 1.3rem; }
  /* Bewusst NICHT weiter zusammengezogen: der Umschalter braucht sichtbaren Abstand zum
     Schriftzug, sonst lesen sich Titel und Bedienelement als ein Block. */
  #view-home .home-brand-title { margin-bottom: 1.5rem; }
  /* Nur der Innenabstand wird enger. Schrift (0.8rem) und Icons (17px) bleiben gleich,
     sonst wird der Umschalter unleserlich statt nur kompakter. */
  .home-mode button { padding: 0.3rem 0.6rem; }
  /* 48px -> 36px. Die Leiste war neben dem 36px hohen Umschalter unproportioniert hoch.
     Die Schrift bleibt bei 16px: alles darunter loest auf iOS beim Antippen den
     automatischen Zoom aus, und der springt dann ueber die ganze Seite. */
  #home-search-form #home-tag-input { height: 36px; padding-inline: 2.1rem; font-size: 1rem; }
  .home-search-field .search-leading-icon { left: 0.6rem; }
  .home-search button[type="submit"] { height: 36px; padding-inline: 0.85rem; font-size: 0.82rem; }
  /* #home-status und .home-tut-title werden bewusst NICHT hier verkleinert: ihre
     Grundregeln stehen weiter unten in dieser Datei und haben dieselbe Spezifitaet,
     wuerden also gewinnen. Die Verkleinerung steht deshalb direkt hinter ihnen. */
}

/* Vorschlagsliste der Startseite: dieselben Bausteine wie in den Reitern
   (.search-suggestion & Co.), nur an die groessere, rundere Home-Leiste angepasst -
   10px Radius statt 8 wie beim Feld darueber, etwas mehr Luft und groessere Schrift,
   weil das Feld hier 48px statt 42px hoch ist. Sie liegt nur unter dem Feld, nicht
   unter dem Search-Button (das Feld ist ihr Positionierungs-Anker).
   text-align: left ist noetig, weil die ganze Startseite zentriert ist und die
   Gruppentitel das sonst erben.

   ACHTUNG Spezifitaet: die Basis .search-dropdown steht WEITER UNTEN in dieser Datei
   (ca. Zeile 660). Als Klasse gegen Klasse (beide 0-1-0) gewaenne bei Gleichstand die
   spaetere - eine Regel `.home-search-dropdown {...}` hier oben hatte deshalb keinerlei
   Wirkung auf top/border-radius/background/box-shadow/max-height. Darum laeuft der
   ganze Block ueber die ID, die schlaegt jede Klassenregel unabhaengig von der
   Reihenfolge. Gleicher Fallstrick wie beim Eingabefeld weiter oben. */
#home-search-suggestions {
  top: calc(100% + 6px); text-align: left;
  border-radius: 10px; border-color: rgba(255,255,255,.14);
  background: rgba(10,12,18,.96); backdrop-filter: blur(10px);
  box-shadow: 0 22px 54px rgba(0,0,0,.55);
}
#home-search-suggestions .search-group-title { padding: 0.6rem 0.9rem 0.4rem; }
#home-search-suggestions .search-suggestion { padding: 0.62rem 0.9rem; }
#home-search-suggestions .search-suggestion-copy strong { font-size: 0.9rem; }
#home-search-suggestions .search-suggestion-copy > span { font-size: 0.72rem; }
#home-search-suggestions .search-dropdown-message { padding: 0.95rem; }

/* Umschalter Recent/Favorites - benutzt von der Startseite UND vom Player-Reiter,
   deshalb neutrale Namen statt .home-*. Er bleibt beim Scrollen oben stehen, weil nur
   die Liste darunter scrollt (.search-dd-list), nicht der ganze Kasten. */
.search-dd-tabs {
  display: flex; gap: 0.25rem; padding: 0.45rem 0.5rem;
  border-bottom: 1px solid rgba(255,255,255,.08);
}
.search-dd-tabs button {
  all: unset; box-sizing: border-box; cursor: pointer;
  padding: 0.3rem 0.7rem; border-radius: 999px;
  color: rgba(255,255,255,.45); font-family: inherit;
  font-size: 0.66rem; font-weight: 850; letter-spacing: 0.07em; text-transform: uppercase;
  transition: background .15s ease, color .15s ease;
}
/* Zwei Klassen im Selektor - sonst gewinnt das globale button:hover mit seinem Blau. */
.search-dd-tabs button:hover { background: rgba(255,255,255,.07); color: #fff; }
.search-dd-tabs button.active { background: rgba(255,255,255,.12); color: #fff; }
.search-dd-tabs button.active:hover { background: rgba(255,255,255,.14); }
.search-dd-tabs button:focus-visible { outline: 2px solid var(--primary); outline-offset: 2px; }

/* Rund acht Zeilen sichtbar, der Rest wird gescrollt. Im Reiter ist eine Zeile ca.
   46px hoch, auf der Startseite ca. 51px (dort mehr Polster und groessere Schrift) -
   daher unten der eigene Wert fuer Home. Der Kasten selbst darf nicht scrollen, sonst
   wanderte der Umschalter mit aus dem Bild; weil .search-dropdown max-height:420px +
   overflow-y:auto setzt, braucht es dafuer die hoehere Spezifitaet. */
.search-dropdown:has(.search-dd-list) { max-height: none; overflow: hidden; }
#home-search-suggestions { max-height: none; overflow: hidden; }
.search-dd-list { max-height: 23rem; overflow-y: auto; overscroll-behavior: contain; }
#home-search-suggestions .search-dd-list { max-height: 25.5rem; }
.search-dd-list::-webkit-scrollbar { width: 10px; }
.search-dd-list::-webkit-scrollbar-track { background: transparent; }
.search-dd-list::-webkit-scrollbar-thumb {
  border: 3px solid transparent; border-radius: 999px;
  background: rgba(255,255,255,.18); background-clip: content-box;
}
.search-dd-list::-webkit-scrollbar-thumb:hover { background: rgba(255,255,255,.3); background-clip: content-box; }
.search-dd-list { scrollbar-width: thin; scrollbar-color: rgba(255,255,255,.22) transparent; }

/* Goldener Stern-Marker fuer Favoriten - gilt in beiden Listen. Zwei Klassen im
   Selektor, weil die Grundregel .search-suggestion-marker (blaue Rang-Plakette) weiter
   unten in der Datei steht und bei gleicher Spezifitaet gewinnen wuerde. */
.search-suggestion-marker.favorite-search-marker {
  border-color: rgba(244, 190, 76, .34); background: rgba(244, 190, 76, .12);
  color: var(--gold); font-size: 0.8rem; line-height: 1;
}

/* Der Hinweis steht unter der Leiste statt im Platzhalter: die Namenssuche trifft bei
   Spielern nur die Ranked-Top-1000, und das in das Feld zu schreiben machte den
   Platzhalter lang und lief unter die Lupe. Nur in der Betriebsart Player sichtbar -
   bei Clans ist die Namenssuche uneingeschraenkt, da braucht es keine Einschraenkung. */
.home-search-hint { margin: 0.5rem 0 0; text-align: center; font-size: 0.75rem; color: rgba(255,255,255,.42); }
.home-search-hint b { color: rgba(255,255,255,.66); font-weight: 700; }
/* visibility statt display/[hidden]: der Satz wird unsichtbar, behaelt seinen Platz
   aber vollstaendig. Mit display:none waere er aus dem Fluss gefallen und alles
   darunter (Status, Tag-Hilfe, Karussell) waere beim Umschalten auf Clan nach oben
   gesprungen. Aus dem Vorlesefluss verschwindet er trotzdem. */
.home-search-hint.is-blank { visibility: hidden; }

/* ---------- Cookie-Hinweis ----------
   Unten mittig statt ueber die volle Breite: eine Leiste von Rand zu Rand wirkt wie
   eine Sperre, eine Karte wie ein Hinweis - und genau das ist es hier auch, denn es
   gibt nichts einzuwilligen (nur funktionale Speicherung, siehe Text im Banner).
   Der Koenig ragt oben aus der Karte heraus; das geht ueber einen negativen oberen
   Abstand und einen Platzhalter an der Karte selbst, damit der Text nicht unter das
   Bild rutscht. */
.cookie-bar {
  position: fixed; left: 50%; bottom: 18px; z-index: 60;
  transform: translateX(-50%);
  display: grid; grid-template-columns: auto minmax(0, 1fr) auto; align-items: center; gap: 0.9rem;
  width: min(760px, calc(100vw - 32px));
  padding: 0.9rem 1.1rem;
  border: 1px solid rgba(255,255,255,.14); border-radius: 14px;
  background: rgba(14, 16, 24, .97);
  box-shadow: 0 20px 50px rgba(0,0,0,.55);
  animation: cookie-bar-in .4s cubic-bezier(.22,.61,.36,1);
}
.cookie-bar[hidden] { display: none; }
@keyframes cookie-bar-in {
  from { opacity: 0; transform: translateX(-50%) translateY(16px); }
  to { opacity: 1; transform: translateX(-50%) translateY(0); }
}
@media (prefers-reduced-motion: reduce) { .cookie-bar { animation: none; } }
/* Bewusst hoeher als die Karte und nach oben herausragend - der Koenig soll wirken,
   als reiche er den Keks ueber den Rand. margin-bottom faengt die Mehrhoehe wieder ab,
   damit die Karte nicht mitwaechst. */
.cookie-bar-art { width: 92px; height: auto; margin-top: -46px; margin-bottom: -10px; flex: none; }
.cookie-bar-copy h2 { margin: 0 0 0.2rem; font-size: 1rem; font-weight: 800; color: #f3f6ff; }
.cookie-bar-copy p { margin: 0; font-size: 0.8rem; line-height: 1.5; color: rgba(255,255,255,.6); }
.cookie-bar-copy a { color: var(--gold); }
/* Untereinander statt nebeneinander: die Karte ist schmal, und zwei gleich breite
   Knoepfe uebereinander lesen sich als gleichwertige Wahl. */
.cookie-bar-actions { display: grid; gap: 0.45rem; }
.cookie-bar-btn {
  all: unset; box-sizing: border-box; cursor: pointer;
  display: flex; align-items: center; justify-content: center;
  padding: 0.6rem 1.1rem; border-radius: 10px;
  font-family: inherit; font-size: 0.85rem; font-weight: 700;
  white-space: nowrap; border: 1px solid transparent;
  transition: background .15s ease, border-color .15s ease;
}
.cookie-bar-accept { background: var(--primary); border-color: var(--primary); color: var(--panel-text); }
/* Wie ueberall: das globale button:hover wuerde sonst mit seinem eigenen Blau dazwischenfunken. */
.cookie-bar-accept:hover { background: var(--primary-d); }
/* Gleiche Groesse und Form wie der Zusagen-Knopf, nur ohne Fuellung - deutlich
   sichtbar, nicht weggedrueckt. */
.cookie-bar-decline { background: var(--panel-inset); border-color: var(--panel-border); color: var(--panel-text); }
.cookie-bar-decline:hover { background: var(--surface); border-color: var(--deck-btn-hover-border); }
.cookie-bar-btn:focus-visible { outline: 2px solid var(--panel-text); outline-offset: 2px; }
/* Auf schmalen Fenstern untereinander, sonst quetscht der Text auf zwei Zeichen. */
@media (max-width: 640px), (max-device-width: 640px) {
  /* Auf noch nicht responsiv umgebauten Unterseiten kann der Layout-Viewport breiter
     als der sichtbare Handy-Viewport werden. `left:50%` wuerde die Datenschutzwahl
     dann ausserhalb des Bildes zentrieren. Am echten schmalen Geraet deshalb fest am
     sichtbaren linken Rand verankern; der spaetere Mobile-Umbau darf das vereinheitlichen. */
  .cookie-bar { left: 16px; top: 74px; bottom: auto; width: calc(100dvw - 32px); max-height: calc(100dvh - 90px); overflow-y: auto; transform: none; grid-template-columns: minmax(0, 1fr); row-gap: 0.7rem; animation: none; }
  .cookie-bar-art { display: none; }
  .cookie-bar-copy { min-width: 0; }
  .cookie-bar-actions { grid-column: 1 / -1; grid-template-columns: 1fr 1fr; }
}

#home-status { min-height: 1.2rem; margin-top: 0.6rem; text-align: center; font-size: 0.84rem; color: var(--gold); }
#home-result[hidden] { display: none; }
#home-result { max-width: 460px; margin: 0.6rem auto 0; display: flex; align-items: center; justify-content: space-between; gap: 0.8rem; padding: 0.65rem 0.1rem; border-top: 1px solid rgba(255,255,255,.1); }

/* Dauerhaft sichtbare, kompakte Tag-Hilfe. Titel und Raster teilen dieselbe Breite und
   sind als gemeinsamer Block mittig; dadurch sitzt nichts relativ zur Suchleiste oder
   zum breiteren Karussell versetzt. */
.home-tut-title {
  width: min(600px, calc(100vw - 3rem)); margin: 1rem auto 0;
  color: var(--panel-dim); font-size: 0.76rem; font-weight: 650; text-align: center;
}
.home-tut-title[hidden] { display: none; }
#home-tut {
  display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0.75rem;
  list-style: none; counter-reset: home-tut-step;
  width: min(600px, calc(100vw - 3rem)); margin: 0.55rem auto 0; padding: 0;
  text-align: left; font-size: 0.82rem; color: rgba(255,255,255,.62); line-height: 1.55;
}
#home-tut[hidden] { display: none; }
#home-tut li {
  counter-increment: home-tut-step;
  position: relative; min-width: 0;
}
#home-tut li::before {
  content: counter(home-tut-step);
  position: absolute; z-index: 1; top: 0.55rem; left: 0.55rem;
  display: grid; place-items: center; width: 24px; height: 24px; border-radius: 50%;
  border: 1px solid var(--panel-inset-border); background: var(--feedback-bg);
  color: var(--panel-text); font-size: 0.68rem; font-weight: 800; line-height: 1;
}
#home-tut figure { overflow: hidden; margin: 0; border: 1px solid var(--panel-inset-border); border-radius: var(--panel-radius); background: var(--panel-inset); }
#home-tut img { display: block; width: 100%; height: auto; aspect-ratio: 1468 / 888; object-fit: cover; }
#home-tut figcaption { padding: 0.65rem 0.75rem 0.75rem; color: var(--panel-muted); }
#home-tut :is(strong, b) { color: var(--panel-text); }

/* Frueher stand hier `grid-template-columns: minmax(0, 1fr)` plus feste 330px Breite,
   also beide Schritte untereinander in einer schmalen Saeule. Das kostete 539px Hoehe
   und schob Karussell und Tool-Karten komplett unter den Falz. Nebeneinander sind es
   rund 200px. `min(600px, 100%)` statt `calc(100vw - 2rem)`: 100vw ignoriert das
   seitliche Padding von #view-home und haette die Anleitung breiter als ihren Container
   gemacht - genau der seitliche Ueberlauf, den audit-mobile-layout.mjs misst.
   Bildunterschrift und Schrittziffer werden eine Stufe kleiner, sonst wird die
   Beschriftung in der halben Spalte zum Textblock. */
@media (max-width: 620px) {
  .home-tut-title, #home-tut { width: min(600px, 100%); }
  #home-tut { gap: 0.5rem; font-size: 0.72rem; }
  /* Die Beschriftung ist hier nur noch eine fette Zeile ("Open your profile."), keine
     Saetze mehr. Zentriert wirkt sie deshalb wie eine Bildunterschrift und nicht wie
     ein angebrochener Absatz - und passt zur mittigen Ausrichtung der ganzen Startseite. */
  #home-tut figcaption { padding: 0.45rem 0.4rem 0.55rem; text-align: center; }
  /* Die Beschriftung ist nicht in jeder Sprache einzeilig: Russisch braucht schon bei
     393px zwei Zeilen, bei 320px alle Sprachen. Ohne diese zwei Zeilen waere dann eine
     Kachel hoeher als die andere - Rasterfelder strecken sich zwar, das <figure> darin
     aber nicht. So bleiben beide Kacheln gleich hoch, egal wie der Text umbricht. */
  #home-tut li { display: flex; }
  #home-tut figure { flex: 1; }
  #home-tut li::before { top: 0.4rem; left: 0.4rem; width: 20px; height: 20px; font-size: 0.62rem; }
}

/* Gehoert fachlich in den Mobil-Block bei .home-search weiter oben, muss aber hier
   stehen: `#home-status` und `.home-tut-title` haben dort dieselbe Spezifitaet wie ihre
   Grundregeln (Zeile ~695/~702) - bei Gleichstand gewinnt die spaetere Regel, der
   Mobil-Block wurde also wirkungslos ueberschrieben.
   Die leere Statuszeile reservierte inklusive Standard-Absatzraendern rund 42px auf
   JEDEM Aufruf, fuer eine Meldung, die fast nie erscheint. Auf dem Handy ist der Platz
   mehr wert als die Sprungfreiheit im Fehlerfall. */
@media (max-width: 640px) {
  #home-status { min-height: 0; margin: 0.35rem 0 0; }
  /* Die Frage ist eine eigene Zwischenueberschrift und braucht sichtbaren Abstand zur
     Hinweiszeile darueber, sonst liest sie sich als deren zweite Zeile. */
  .home-tut-title { margin-top: 1rem; }
}

/* Karussell: max-width 1000px wie ueberall sonst auf der Seite (main, .nav-inner,
   .site-footer - siehe main-Regel oben). Seitlicher Puffer (44px) ist Platz fuer die
   Pfeile, damit die nicht mehr auf den Karten liegen (siehe .car-arrow unten).
   --car-visible = wie viele Karten gleichzeitig ganz zu sehen sind. Die Kartenbreite
   wird daraus in app.js berechnet (--car-card-w), damit IMMER ganze Karten im Fenster
   stehen - kein halb abgeschnittener Rest mehr am Rand. Zum Nachjustieren reicht die
   eine Zahl hier. */
.home-carousel-wrap {
  position: relative; width: 100%; max-width: 1000px; margin-top: 2.8rem; padding: 0 44px;
  --car-visible: 4;
  --car-gap: 0.9rem;
}
.home-carousel-label { font-size: 0.7rem; font-weight: 800; letter-spacing: 0.12em; text-transform: uppercase; color: rgba(255,255,255,.4); margin: 0 0 0.8rem 0.1rem; }
/* Frueher lag hier eine mask-image-Blende, die links und rechts ~20px ausgefadet hat.
   Damit war die erste und die letzte Karte NIE ganz zu sehen. Jetzt schneidet das
   Viewport hart an der Kante ab und die Karten sind so breit, dass genau
   --car-visible Stueck vollstaendig hineinpassen - es steht nie eine angeschnittene
   Karte am Rand, also gibt es auch nichts mehr zu kaschieren.
   Das Innen-Padding gibt dem :hover-Lift (translateY(-2px)) und dem Rand-Glow Platz,
   sonst wuerde overflow:hidden beides abschneiden. */
.home-carousel-viewport { overflow: hidden; padding: 6px 0 10px; }
.home-carousel {
  display: flex; gap: var(--car-gap);
  transition: transform .5s cubic-bezier(.22, .61, .36, 1);
  will-change: transform;
}
/* Beim Umsetzen der Endlos-Schleife (Sprung von Klon auf Original) muss die Bewegung
   fuer genau einen Frame aus sein, sonst sieht man das Zurueckspulen. */
.home-carousel.no-anim { transition: none; }
@media (prefers-reduced-motion: reduce) { .home-carousel { transition: none; } }
/* display:flex + column ist hier NICHT kosmetisch: ein <button> zentriert seinen Inhalt
   senkrecht. Die Karten werden als Flex-Items auf gleiche Hoehe gestreckt, und die
   Karte mit der kuerzeren Beschreibung (z.B. "Mini Games", eine Zeile) bekam dadurch
   oben einen leeren Streifen - ihr Bild started tiefer als bei "Free Rewards"
   (zwei Zeilen). Mit flex-direction:column sitzt das Bild in JEDER Karte buendig oben
   und die Restluft landet unten unter dem Text. */
.feature-card {
  all: unset; box-sizing: border-box; cursor: pointer;
  display: flex; flex-direction: column; align-items: stretch;
  flex: 0 0 var(--car-card-w, 240px); width: var(--car-card-w, 240px);
  text-align: left; color: #f3f6ff;
  background: #14161e; border: 1px solid rgba(255,255,255,.1); border-radius: 12px; overflow: hidden;
  transition: border-color .15s, transform .15s;
}
/* Die Karten selbst zeigen den Hover bereits durch Bewegung und Rand. Die globale
   Link-Unterstreichung wuerde hier die komplette Kartenbeschriftung dekorieren und
   wirkt deshalb wie ein zweites, unruhiges Hover-Signal. Normale Textlinks behalten
   ihre Unterstreichung weiterhin. */
.feature-card:hover { border-color: var(--primary); transform: translateY(-2px); text-decoration: none; }
/* flex:none - ohne das wuerde die Bildflaeche in der gestreckten Karte mitwachsen und
   waere wieder unterschiedlich hoch. 110px gilt fuer alle sechs Kacheln. */
.feature-art { flex: none; height: 110px; background: #0c0d12; display: flex; align-items: center; justify-content: center; overflow: hidden; }
.feature-art img { width: 100%; height: 100%; object-fit: cover; }
/* Logos statt Fotos: nicht randfuellend, sondern frei stehend mit Luft drumherum.
   Bewusst ueber max-* statt einer festen Hoehe - sonst haengt die Groesse am
   Seitenverhaeltnis des jeweiligen Logos. Merge Tactics (1,9:1) begrenzt die HOEHE,
   der Plug-In-Schriftzug (4,1:1) die BREITE; mit `height: 60%` waere er 271px breit
   geworden und an der 217px schmalen Kachel abgeschnitten. So passt jedes Logo, ohne
   dass man je Bild eine eigene Regel braucht. */
.feature-art.contain img {
  width: auto; height: auto;
  max-width: 68%; max-height: 60%;
  object-fit: contain;
}
.feature-art .fa-cards { display: flex; gap: 0.2rem; padding: 0 0.6rem; }
.feature-art .fa-cards img { width: 30px; height: 36px; border-radius: 4px; object-fit: cover; flex: none; }
.feature-copy { padding: 0.8rem 0.9rem 0.95rem; }
.feature-copy h3 { margin: 0; font-size: 0.95rem; }
.feature-copy p { margin: 0.25rem 0 0; font-size: 0.78rem; color: rgba(255,255,255,.4); line-height: 1.4; }

/* Punkte-Leiste unter dem Karussell: ein Punkt je ECHTER Kachel (Klone zaehlen nicht),
   der aktive ist weiss. */
.car-dots { display: flex; justify-content: center; gap: 0.45rem; margin-top: 0.3rem; }
.car-dots button {
  all: unset; box-sizing: border-box; cursor: pointer;
  width: 7px; height: 7px; border-radius: 50%;
  background: rgba(255,255,255,.22);
  transition: background .2s ease, transform .2s ease;
}
/* Wie bei .car-arrow: gegen das globale button:hover{background:var(--primary-d)}
   braucht es eine eigene :hover-Regel, sonst faerbt sich der Punkt blau. */
.car-dots button:hover { background: rgba(255,255,255,.55); transform: scale(1.25); }
.car-dots button.active { background: #f3f6ff; transform: scale(1.15); }
.car-dots button.active:hover { background: #f3f6ff; }
.car-dots button:focus-visible { outline: 2px solid var(--primary); outline-offset: 3px; }

/* Kein Kreis-Hintergrund mehr - die Form kommt komplett aus ::before: zwei schraege
   Linien, die sich zu einer Spitze treffen (wie "‹"/"›", nur groesser/kraeftiger als
   der duenne Zeichen-Glyph) - klassischer Border-Corner-Trick (nur 2 Seiten eines
   Quadrats sichtbar, 45deg gedreht), KEIN gefuelltes Dreieck. Der Button selbst ist
   nur noch Hit-Flaeche. `outline: none` + eigener Fokus-Ring unten, sonst zeigt der
   Browser-Default-Fokusrahmen trotz `all: unset` ein haessliches blaues Rechteck. */
.car-arrow {
  all: unset; box-sizing: border-box; cursor: pointer; position: absolute; top: 50%; transform: translateY(-50%);
  width: 34px; height: 48px; display: grid; place-items: center;
  color: transparent; outline: none;
  background: none;
}
/* .car-arrow (0,1,0) allein reicht nicht gegen button:hover (0,1,1) - braucht explizit
   :hover, sonst gewinnt die globale Regel trotz gleicher Deklaration hier oben. */
.car-arrow:hover { background: none; }
.car-arrow::before {
  content: "";
  width: 15px; height: 15px;
  /* Nur rechte+untere Kante sichtbar - gedreht ergibt das die Spitze. */
  border-style: solid; border-color: transparent;
  border-width: 0 4px 4px 0;
  border-radius: 0 0 2px 0;
  transform: rotate(var(--car-arrow-rot)) scale(1);
  /* Weiss mit leicht tuerkis-blauem Einschlag statt reinem Weiss - wirkt naeher am
     Laser als am schlichten Strich. drop-shadow (nicht box-shadow) folgt den beiden
     Linien selbst, kein rechteckiger Schein drumherum. */
  filter:
    drop-shadow(0 0 5px rgba(140, 235, 255, .95))
    drop-shadow(0 0 13px rgba(88, 180, 255, .6))
    drop-shadow(0 0 24px rgba(88, 180, 255, .3));
  transition: filter .18s ease, transform .18s ease;
}
.car-arrow.prev::before { --car-arrow-rot: 135deg; border-color: #eafcff; }
.car-arrow.next::before { --car-arrow-rot: -45deg; border-color: #eafcff; }
/* "Glow staerker beim Hovern/Fokus" - der Kreis ist zwar weg, aber genau an der Stelle
   waechst jetzt stattdessen der Leuchtschein um die beiden Linien selbst. */
.car-arrow:hover::before, .car-arrow:focus-visible::before {
  filter:
    drop-shadow(0 0 8px rgba(140, 235, 255, 1))
    drop-shadow(0 0 20px rgba(88, 180, 255, .85))
    drop-shadow(0 0 36px rgba(88, 180, 255, .5));
  transform: rotate(var(--car-arrow-rot)) scale(1.15);
}
@media (prefers-reduced-motion: reduce) { .car-arrow::before { transition: filter .18s ease; } }
/* Stehen im eigenen Seitenpuffer von .home-carousel-wrap (padding: 0 44px) - dadurch
   liegen sie neben statt auf den Karten, ein paar Pixel Abstand bleiben von selbst. */
.car-arrow.prev { left: 0; }
.car-arrow.next { right: 0; }

/* Karussell auf dem Handy: hier passt ohnehin nur EINE Kachel ins Fenster (app.js
   rechnet `Math.floor(verfuegbar / 170)`), das Durchblaettern per Pfeil und Punkten ist
   also der vorgesehene Weg und kein Notbehelf. Genau deshalb darf die einzelne Kachel
   kompakter sein: sie muss nicht mehr gegen Nachbarn bestehen, sondern nur noch zeigen,
   dass es weitergeht. Bildflaeche, Beschriftung und der Abstand nach oben schrumpfen,
   der Seitenpuffer geht von 44px auf exakt die Pfeilbreite (34px) zurueck - weniger
   waere zu wenig, dann lagen die Pfeile wieder auf der Karte. */
@media (max-width: 640px) {
  /* Der Seitenpuffer ist hier mehr als nur Platz fuer die Pfeile: er zieht die Kachel
     schmaler als die Anleitung darueber. Nur die Hoehe zu senken haette die Kachel
     breit und flach gelassen. Die Pfeile ruecken zusaetzlich um 0.55rem nach innen -
     sie sitzen sonst am Rand des Puffers und damit weiter aussen als die Kachel. */
  .home-carousel-wrap { margin-top: 1.7rem; padding: 0 3.2rem; }
  .car-arrow.prev { left: 0.55rem; }
  .car-arrow.next { right: 0.55rem; }
  .home-carousel-label { margin-bottom: 0.5rem; }
  .home-carousel-viewport { padding: 4px 0 7px; }
  .feature-art { height: 84px; }
  .feature-copy { padding: 0.55rem 0.7rem 0.7rem; }
  .feature-copy h3 { font-size: 0.86rem; }
  .feature-copy p { margin-top: 0.15rem; font-size: 0.72rem; }
}

/* Social Links: freie, weisse Marken-Icons statt sechs weiterer Kacheln. Die Logos
   sind lokale SVGs; keine Icon-Bibliothek und kein CDN wird im Browser geladen. */
.site-social-links { display: inline-flex; align-items: center; gap: 0.82rem; }
.site-social-links a {
  display: grid; place-items: center; flex: none; width: 22px; height: 22px; padding: 0;
  color: var(--panel-text); opacity: 0.62; text-decoration: none;
  transition: opacity .16s ease, transform .16s ease;
}
.site-social-links img { display: block; width: 18px; height: 18px; filter: invert(1); }
.site-social-links a:hover { background: none; color: var(--panel-text); opacity: 1; text-decoration: none; transform: translateY(-1px); }
.site-social-links a:focus-visible { outline: 2px solid var(--primary); outline-offset: 3px; border-radius: 3px; opacity: 1; }
.home-social-links { margin-top: 1.15rem; }
.home-social-links a { width: 28px; height: 28px; }
.home-social-links img { width: 20px; height: 20px; }
@media (prefers-reduced-motion: reduce) { .site-social-links a { transition: opacity .16s ease; } .site-social-links a:hover { transform: none; } }

/* Sliding, rectangular indicator that moves to the active tab. */
.tab-indicator {
  position: absolute;
  bottom: 0;
  left: 0;
  height: 3px;
  width: 0;
  background: var(--primary);
  transform: translateX(0);
  transition: transform 0.28s cubic-bezier(0.4, 0, 0.2, 1), width 0.28s cubic-bezier(0.4, 0, 0.2, 1);
  pointer-events: none;
}

/* ---------- Layout ---------- */
main {
  flex: 1 0 auto; /* schiebt Footer + Rechtsleiste ans Seitenende, siehe body */
  width: 100%;
  max-width: 1000px;
  margin: 0 auto;
  padding: 1.5rem 1.25rem 4rem;
}
.site-footer, .site-legal { flex: none; }
.tab-panel > h2:first-child { margin-top: 0; }
.hint { color: rgba(255, 255, 255, 0.72); font-size: 0.9rem; max-width: 60ch; }

/* Kurze Seitenidentitaet fuer Suchmaschine UND Mensch. Keine SEO-Box ueber dem Tool:
   die Ueberschrift steht frei wie die vorhandenen Bereichstitel, die ausfuehrlicheren
   Erklaerungen kommen erst nach dem eigentlichen Werkzeug. */
.page-intro { margin: 0 0 1rem; max-width: 780px; }
.page-intro > span {
  display: block; margin-bottom: 0.28rem; color: var(--gold);
  font-size: 0.72rem; font-weight: 800; letter-spacing: 0.08em; text-transform: uppercase;
}
.page-intro h1 {
  margin: 0; color: var(--text); font-family: "Inter", system-ui, sans-serif;
  font-size: clamp(1.42rem, 2.4vw, 2rem); font-weight: 800; letter-spacing: -0.025em; line-height: 1.12;
}
.page-intro p { margin: 0.55rem 0 0; max-width: 72ch; color: var(--panel-muted); line-height: 1.55; }
.page-intro-compact { margin-bottom: 1.15rem; }
.page-intro-centered { margin-inline: auto; text-align: center; }
.page-intro-centered p { margin-inline: auto; }
.mt-page-intro { margin-inline: auto; text-align: center; }
.mt-page-intro p { margin-inline: auto; }
.builder-page-summary { margin: 0.45rem 0 0; max-width: 62ch; color: var(--panel-muted); line-height: 1.45; }

/* Ein ruhiger Abschlussblock pro Werkzeug statt einer Kachel pro Aussage. Einzelne
   Funktionen werden nur durch Abstand und Trennlinien gruppiert (UI-Regel 1b).
   Der Block ist bewusst transparenter und schattenloser als das eigentliche Tool;
   die horizontale Linie im Abstand dazwischen markiert klar den Inhaltsabschluss. */
.panel.seo-guide {
  overflow: visible; margin-top: 4rem; padding: 1.35rem 1.5rem;
  border-color: var(--panel-inset-border);
  background: color-mix(in srgb, var(--feedback-bg) 68%, transparent);
  box-shadow: none;
}
.panel.no-line.seo-guide::before {
  content: ""; top: -2rem; left: 0; right: 0; height: 1px;
  background: var(--panel-inset-border); box-shadow: none;
}
.seo-guide h2 {
  margin: 0; color: var(--panel-text); font-family: "Inter", system-ui, sans-serif;
  font-size: 1.3rem; font-weight: 800; letter-spacing: -0.015em; line-height: 1.2;
}
.seo-guide > p { max-width: 78ch; color: var(--panel-muted); line-height: 1.65; }
.seo-feature-list, .seo-steps { list-style: none; margin: 1rem 0 0; padding: 0; }
.seo-feature-list li, .seo-steps li {
  display: grid; grid-template-columns: minmax(150px, 0.34fr) 1fr; gap: 1rem;
  padding: 0.82rem 0; border-top: 1px solid var(--panel-inset-border);
}
.seo-feature-list strong, .seo-steps strong { color: var(--panel-text); }
.seo-feature-list span, .seo-steps span { color: var(--panel-muted); line-height: 1.5; }
.seo-faq { margin-top: 1.05rem; padding-top: 0.1rem; }
.seo-guide h3 { margin: 1rem 0 0.25rem; color: var(--panel-text); font-size: 1rem; }
.seo-faq p { margin: 0; max-width: 78ch; color: var(--panel-muted); line-height: 1.55; }
.seo-related {
  display: flex; flex-wrap: wrap; align-items: center; gap: 0.4rem 1rem;
  margin: 1.2rem 0 0; padding-top: 0.9rem; border-top: 1px solid var(--panel-inset-border);
}
.seo-related strong { color: var(--panel-text); }
.seo-related a { color: var(--primary); font-weight: 750; text-decoration: none; }
.seo-related a:hover { color: var(--panel-text); text-decoration: underline; }
.seo-related-standalone { margin-top: 1.5rem; color: var(--panel-muted); }

@media (max-width: 640px) {
  .seo-guide { padding: 1.1rem; }
  .seo-feature-list li, .seo-steps li { grid-template-columns: 1fr; gap: 0.25rem; }
}

/* Texte, die direkt auf dem Bild-Hintergrund liegen -> hell + leichter Schatten.
   Der Schatten ist hier nicht Zierde: der Seitenhintergrund ist ein helles Artwork,
   ohne ihn verschwindet die Zeile ueber den hellen Stellen. */
.tab-panel > h2,
.tab-panel > h3 { color: #fff; text-shadow: 0 1px 4px rgba(0, 0, 0, 0.5); }
#status, #clan-status, #mt-status, #mt-info,
#decks-status, #decks-info, #streamer-note, #geier-note {
  color: rgba(255, 255, 255, 0.88);
  text-shadow: 0 1px 4px rgba(0, 0, 0, 0.75);
}
/* ---------- Panel: Standard-Flaeche der gesamten Seite ----------
   Abgeleitet aus der Geier-Deckbox. Neue Container bekommen `.panel`
   (oder uebernehmen die --panel-* Tokens), nichts Helles mehr. */
.panel {
  position: relative;
  overflow: hidden;
  border: 1px solid var(--panel-border);
  border-radius: var(--panel-radius);
  background: var(--panel-bg);
  box-shadow: var(--panel-shadow);
  color: var(--panel-text);
}
/* Glow-Linie an der Oberkante. `.panel.no-line` schaltet sie ab. */
.panel::before {
  content: "";
  position: absolute; top: 0; left: 10%; right: 10%; height: 1px;
  background: var(--panel-line);
  box-shadow: var(--panel-line-glow);
  pointer-events: none;
}
.panel.no-line::before { content: none; }
.panel small, .panel .muted { color: var(--panel-muted); }

/* Panels/Cards */
#profile, #deck, #battles {
  position: relative;
  overflow: hidden;
  background: var(--panel-bg);
  border: 1px solid var(--panel-border);
  border-radius: var(--panel-radius);
  box-shadow: var(--panel-shadow);
  color: var(--panel-text);
  padding: 1.25rem;
  margin-bottom: 1.25rem;
}
#deck::before, #battles::before {
  content: "";
  position: absolute; top: 0; left: 10%; right: 10%; height: 1px;
  background: var(--panel-line);
  box-shadow: var(--panel-line-glow);
  pointer-events: none;
}

/* ---------- Forms ---------- */
/* Nur die Suchformulare – der Builder-Wizard ist ein Block und braucht [hidden]. */
#search-form, #clan-form { display: flex; gap: 0.5rem; margin-bottom: 1rem; flex-wrap: wrap; }
input[type="text"] {
  flex: 1;
  min-width: 200px;
  max-width: 320px;
  padding: 0.6rem 0.8rem;
  border: 1px solid rgba(255, 255, 255, 0.16);
  border-radius: var(--radius-sm);
  font-size: 0.95rem;
  background: rgba(11, 13, 18, 0.92);
  color: var(--panel-text);
}
input[type="text"]::placeholder { color: var(--panel-dim); }
input[type="text"]:focus {
  outline: none;
  border-color: var(--deck-btn-hover-border);
  box-shadow: 0 0 0 3px rgba(59, 110, 245, 0.15);
}
#search-form, #clan-form { position: relative; align-items: flex-start; flex-wrap: nowrap; max-width: 570px; }
/* Player- und Clan-Suche bleiben an ihrer normalen Stelle, docken aber unter der
   58px-Navigation an, sobald diese Stelle aus dem Bild scrollt. Der Container hat
   auch im Ruhezustand dieselben Aussenmasse; nur Hintergrund und Rand werden sichtbar.
   Dadurch springt der Inhalt beim Andocken keinen Pixel. */
.profile-search-marker { display: block; width: 1px; height: 0; }
.profile-search-dock {
  position: sticky; top: 66px; z-index: 9;
  width: min(590px, calc(100% + 1rem));
  margin: -0.5rem 0 0.5rem -0.5rem; padding: 0.5rem;
  border: 2px solid transparent; border-radius: var(--panel-radius);
  background: transparent; box-shadow: none;
  transition: background-color .16s ease, border-color .16s ease, box-shadow .16s ease;
}
.profile-search-dock #search-form,
.profile-search-dock #clan-form { margin-bottom: 0; }
.profile-search-dock.is-docked {
  background: var(--feedback-bg);
  border-color: var(--panel-inset-border);
  box-shadow: var(--panel-shadow);
}
body.embed-mode .profile-search-dock { top: 0.5rem; }
.player-search-field { position: relative; flex: 1; min-width: 0; }
#search-form #tag-input, #clan-form #clan-input {
  width: 100%; max-width: none; height: 42px; min-width: 0;
  padding: 0.55rem 2.55rem; border-color: rgba(255, 255, 255, 0.16); border-radius: 8px;
  background: rgba(11, 13, 18, 0.92); color: #f4f6fb;
  box-shadow: 0 7px 20px rgba(0, 0, 0, 0.18);
}
#search-form #tag-input::placeholder, #clan-form #clan-input::placeholder { color: rgba(226, 232, 244, 0.42); }
#search-form #tag-input:focus, #clan-form #clan-input:focus {
  border-color: #587cff;
  box-shadow: 0 0 0 2px rgba(73, 110, 245, 0.2), 0 8px 22px rgba(0, 0, 0, 0.24);
}
.search-leading-icon {
  position: absolute; left: 0.85rem; top: 50%; z-index: 1; transform: translateY(-50%);
  color: rgba(225, 231, 243, 0.48); pointer-events: none;
}
.search-clear {
  position: absolute; right: 0.42rem; top: 50%; z-index: 2; transform: translateY(-50%);
  display: inline-flex; align-items: center; justify-content: center;
  width: 29px; height: 29px; padding: 0; border-radius: 6px;
  background: transparent; color: rgba(228, 233, 244, 0.54);
}
.search-clear[hidden] { display: none; }
.search-clear:hover { background: rgba(255, 255, 255, 0.08); color: #fff; }
.player-search-submit { height: 42px; padding-inline: 1.1rem; border-radius: 8px; }
.search-dropdown {
  position: absolute; top: calc(100% + 7px); left: 0; right: 0; z-index: 30;
  overflow: hidden; max-height: 420px; overflow-y: auto;
  border: 1px solid rgba(115, 137, 207, 0.3); border-radius: 8px;
  background: rgba(10, 12, 18, 0.98); color: #f3f6ff;
  box-shadow: 0 18px 42px rgba(0, 0, 0, 0.44), 0 0 18px rgba(57, 89, 190, 0.08);
}
.search-dropdown[hidden] { display: none; }
.search-suggestion-group + .search-suggestion-group { border-top: 1px solid rgba(255, 255, 255, 0.08); }
.search-group-title {
  padding: 0.55rem 0.75rem 0.35rem; color: rgba(205, 214, 234, 0.45);
  font-size: 0.64rem; font-weight: 800; text-transform: uppercase; letter-spacing: 0.08em;
}
.search-suggestion {
  display: grid; grid-template-columns: 56px minmax(0, 1fr); align-items: center; gap: 0.65rem;
  width: 100%; padding: 0.58rem 0.75rem; border-radius: 0;
  background: transparent; color: inherit; text-align: left;
}
.search-suggestion:hover, .search-suggestion.active { background: rgba(76, 109, 225, 0.15); }
.search-suggestion-marker {
  overflow: hidden; padding: 0.15rem 0.35rem; border: 1px solid rgba(100, 130, 235, 0.3); border-radius: 5px;
  background: rgba(55, 83, 176, 0.18); color: #9eb2ff;
  font-size: 0.62rem; font-weight: 800; text-align: center; text-overflow: ellipsis;
}
.clan-search-marker { display: inline-flex; align-items: center; justify-content: center; height: 31px; padding: 0; }
.clan-search-marker .clan-badge { width: 27px; height: 27px; margin: 0; vertical-align: middle; }
.search-suggestion-copy { display: flex; flex-direction: column; min-width: 0; }
.search-suggestion-copy strong { overflow: hidden; font-size: 0.84rem; text-overflow: ellipsis; white-space: nowrap; }
.search-suggestion-copy > span { overflow: hidden; color: rgba(214, 222, 240, 0.5); font-size: 0.69rem; text-overflow: ellipsis; white-space: nowrap; }
.search-dropdown-message { padding: 0.85rem; color: rgba(218, 225, 240, 0.58); font-size: 0.78rem; text-align: center; }
button {
  padding: 0.6rem 1.1rem;
  border: none;
  border-radius: var(--radius-sm);
  background: var(--primary);
  color: #fff;
  font-size: 0.95rem;
  font-weight: 600;
  cursor: pointer;
  transition: background 0.15s;
}
button:hover { background: var(--primary-d); }
/* Nur die Groesse – die Farbe kommt aus der Regel weiter oben ("auf dem Bild-Hintergrund").
   Hier stand frueher `color: var(--muted)`, ein dunkles Grau aus der Zeit vor dem
   Hintergrundbild. Es hat die helle Regel ueberschrieben und die Zeilen unlesbar gemacht. */
#status, #clan-status, #mt-status, #decks-status, #streamer-note, #geier-note {
  font-size: 0.9rem;
}
/* Der Status traegt nur noch echte Fehler, keinen fluechtigen Ladetext mehr. Leer
   nimmt er deshalb gar keinen Platz ein - sonst blieben unter der Tableiste 38px
   toter Raum stehen. Gleiches Muster wie bei .mt-assets-info. */
#mt-status { margin: 0.3rem 0 0; }
#mt-status:empty { display: none; margin: 0; }

/* ---------- Profil ---------- */
#profile {
  position: relative;
  isolation: isolate;
  overflow: hidden;
  color: #f8f4e9;
  border: 1px solid transparent;
  background:
    linear-gradient(112deg, rgba(105, 66, 10, 0.32), rgba(21, 23, 29, 0.12) 38%, rgba(21, 23, 29, 0.3) 70%, rgba(91, 55, 7, 0.3)) padding-box,
    linear-gradient(#12151c, #12151c) padding-box,
    conic-gradient(
      from var(--profile-gold-angle),
      #7c4b0c 0deg,
      #ce8f24 62deg,
      #fff2ba 86deg,
      #c47e19 108deg,
      #704208 180deg,
      #b97516 244deg,
      #ffe8a0 270deg,
      #96600f 294deg,
      #7c4b0c 360deg
    ) border-box;
  box-shadow:
    0 0 0 1px rgba(247, 190, 73, 0.13),
    0 0 9px rgba(247, 190, 73, 0.14),
    0 14px 34px rgba(0, 0, 0, 0.24),
    inset 0 0 26px rgba(238, 175, 52, 0.045);
}
#profile > * { position: relative; z-index: 1; }
#profile::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  background:
    linear-gradient(90deg, transparent, rgba(239, 179, 61, 0.75), #fff5cf, rgba(239, 179, 61, 0.65), transparent) 12% 0 / 44% 2px no-repeat,
    linear-gradient(90deg, transparent, rgba(224, 153, 30, 0.55), #ffe8a1, transparent) 86% 100% / 32% 1px no-repeat,
    linear-gradient(112deg, transparent 56%, rgba(255, 214, 112, 0.055) 62%, transparent 68%);
}
#profile::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  opacity: 0.42;
  background:
    radial-gradient(circle at 7% 24%, #ffe7a0 0 1px, transparent 1.5px),
    radial-gradient(circle at 16% 72%, #d99a31 0 1px, transparent 1.5px),
    radial-gradient(circle at 31% 18%, #ffd46c 0 1px, transparent 1.5px),
    radial-gradient(circle at 48% 79%, #f4ba4e 0 1px, transparent 1.5px),
    radial-gradient(circle at 63% 27%, #ffe9a9 0 1px, transparent 1.5px),
    radial-gradient(circle at 74% 68%, #d9972a 0 1px, transparent 1.5px),
    radial-gradient(circle at 88% 20%, #ffd66f 0 1px, transparent 1.5px),
    radial-gradient(circle at 94% 82%, #f2b744 0 1px, transparent 1.5px);
}
#profile .pname .tag,
#profile .ptag,
#profile .pline.muted,
#profile .profile-clan .tag { color: rgba(229, 220, 198, 0.62); }
#profile .profile-clan { border-top-color: rgba(244, 190, 76, 0.18); }
#profile .profile-clan a { color: #f8f4e9; }
#profile .league-name { color: #f3ca70; }

@media (prefers-reduced-motion: no-preference) {
  #profile {
    animation:
      profile-border-orbit 9s linear infinite,
      profile-border-glow 4.8s ease-in-out infinite;
  }
  #profile::before { animation: profile-light-sweep 7s ease-in-out infinite alternate; }
  #profile::after { animation: profile-particle-drift 10s ease-in-out infinite alternate; }
}

@keyframes profile-border-orbit {
  to { --profile-gold-angle: 360deg; }
}

@keyframes profile-border-glow {
  0%, 100% {
    box-shadow:
      0 0 0 1px rgba(247, 190, 73, 0.13),
      0 0 9px rgba(247, 190, 73, 0.14),
      0 14px 34px rgba(0, 0, 0, 0.24),
      inset 0 0 26px rgba(238, 175, 52, 0.045);
  }
  50% {
    box-shadow:
      0 0 0 1px rgba(255, 211, 117, 0.22),
      0 0 15px rgba(247, 190, 73, 0.24),
      0 14px 36px rgba(0, 0, 0, 0.28),
      inset 0 0 32px rgba(238, 175, 52, 0.075);
  }
}

@keyframes profile-light-sweep {
  0% { background-position: -28% 0, 128% 100%, 0 0; opacity: 0.65; }
  45% { opacity: 1; }
  100% { background-position: 118% 0, -24% 100%, 0 0; opacity: 0.78; }
}

@keyframes profile-particle-drift {
  0% { transform: translate3d(-3px, 2px, 0); opacity: 0.28; }
  38% { transform: translate3d(4px, -4px, 0); opacity: 0.48; }
  72% { transform: translate3d(-1px, 5px, 0); opacity: 0.36; }
  100% { transform: translate3d(6px, -2px, 0); opacity: 0.55; }
}

.profile-top {
  display: grid; grid-template-columns: minmax(220px, 1fr) minmax(255px, 310px) minmax(220px, 1fr);
  align-items: start; gap: 1rem;
}
.profile-main { display: flex; flex-direction: column; gap: 0.25rem; }
.pname { margin: 0 0 0.35rem; font-size: 1.5rem; letter-spacing: -0.02em; }
.pname .tag { color: var(--muted); font-size: 0.9rem; font-weight: 500; margin-left: 0.45rem; }
/* Der Spielercode stand frueher hinter dem Namen in derselben Zeile. Bei langen Namen
   wurde die Zeile dadurch umgebrochen und der Favoritenstern rutschte allein in eine
   dritte Zeile. Eigene Zeile unter dem Namen: der Name behaelt seine Groesse, der Stern
   bleibt direkt hinter ihm, und die Hoehe ist von der Namenslaenge unabhaengig. */
.ptag { margin: -0.15rem 0 0.15rem; color: var(--muted); font-size: 0.86rem; font-weight: 500; }
/* Favoriten-Stern (Eliass 09.08.2026/10.08.2026): hohl/golden schimmernd im Ruhezustand,
   hoehenpassend zum Spielernamen (em-Groesse folgt .pname), gefuellt + Glow-Pop beim
   Aktivieren. line-height:0 haelt die Kopfzeile trotz groesserem Stern exakt gleich hoch
   (Eliass: "nichts anderes soll sich verrücken") - ohne das waechst die Zeilenbox mit dem
   Icon mit, da es sonst das groesste Inline-Element in der Zeile waere. */
.favorite-star {
  display: inline-flex; align-items: center; justify-content: center; vertical-align: -0.22em;
  width: 1.5em; height: 1.5em; line-height: 0; margin-left: 0.5rem; padding: 0; border: 0; background: transparent;
  cursor: pointer; color: var(--gold);
}
.favorite-star svg { width: 100%; height: 100%; fill: none; stroke: currentColor; stroke-width: 1.6; stroke-linejoin: round; filter: drop-shadow(0 0 3px rgba(255, 200, 77, .35)); transition: filter .15s ease, transform .15s ease; }
/* Das globale button:hover{background:var(--primary-d)} (0,1,1) schlaegt das
   background:transparent der Grundregel (0,1,0) - ohne diese Zeile bekam der Stern beim
   Hovern einen blauen Kasten. Statt Hintergrund zeigt er jetzt mehr Glow und wird eine
   Spur groesser, damit trotzdem klar ist, dass er anklickbar ist. */
.favorite-star:hover { background: transparent; }
.favorite-star:hover svg { filter: drop-shadow(0 0 9px rgba(255, 210, 100, .95)) drop-shadow(0 0 18px rgba(255, 190, 60, .45)); transform: scale(1.18); }
.favorite-star.active svg { fill: currentColor; filter: drop-shadow(0 0 7px rgba(255, 200, 77, .8)); }
.favorite-star.active:hover svg { filter: drop-shadow(0 0 11px rgba(255, 214, 110, 1)) drop-shadow(0 0 22px rgba(255, 190, 60, .55)); }
@media (prefers-reduced-motion: reduce) { .favorite-star:hover svg { transform: none; } }
.favorite-star.active { animation: favorite-star-pop .38s cubic-bezier(.2, .8, .3, 1); }
.favorite-star:focus-visible { outline: 2px solid rgba(255, 222, 118, 0.9); outline-offset: 2px; border-radius: 3px; }
@keyframes favorite-star-pop { 0% { transform: scale(1); } 45% { transform: scale(1.4); } 100% { transform: scale(1); } }
@media (prefers-reduced-motion: reduce) { .favorite-star.active { animation: none; } }

/* Favorites-Tab (10.08.2026, Nachbesserung): die vorherige Version baute pro Zeile eine
   eigene helle Box mit --surface-2/--border - das ist genau das generische UI, das die
   Seite sonst nirgends nutzt (siehe .claude/skills/ui-design: "kein helles Design mehr,
   weiße Panels sind ein Fehler"). Jetzt die ganze Liste EIN .panel (Verlauf, Rand,
   Glow-Linie oben - dieselbe Sprache wie Deck-Kacheln), einzelne Spieler nur noch durch
   eine duenne Trennlinie (--panel-inset-border) getrennt, keine eigene Box pro Zeile. */
.favorites-list {
  position: relative; overflow: hidden; max-width: 460px;
  border: 1px solid var(--panel-border); border-radius: var(--panel-radius);
  background: var(--panel-bg); box-shadow: var(--panel-shadow); color: var(--panel-text);
  padding: 0.3rem 0.9rem;
}
.favorites-list::before {
  content: ""; position: absolute; top: 0; left: 10%; right: 10%; height: 1px;
  background: var(--panel-line); box-shadow: var(--panel-line-glow); pointer-events: none;
}
.favorite-row {
  display: flex; align-items: center; gap: 0.6rem; padding: 0.7rem 0;
  border-bottom: 1px solid var(--panel-inset-border);
}
.favorite-row:last-child { border-bottom: 0; }
.favorite-row .favorite-star { margin-left: 0; }
/* Name und Tag sitzen in einer gemeinsamen Spalte, sind aber getrennte Elemente: nur
   der Name ist ein Button (fuehrt zum Profil), der Tag ist reiner Text zum Markieren
   und Kopieren. Vorher steckte der Tag IM Button - damit war er nicht markierbar und
   der Klickbereich lief ueber die ganze Zeile. */
.favorite-id { display: flex; align-items: baseline; gap: 0.35rem; flex: 1; min-width: 0; }
.favorite-name {
  min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  border: 0; background: transparent; color: var(--panel-text); font-weight: 700; font-size: 0.92rem;
  text-align: left; cursor: pointer;
  /* Das Padding faengt die Ueberhaenge fetter Glyphen ab: mit padding:0 schnitt
     overflow:hidden dem ersten Buchstaben links eine Haarlinie ab. Der negative
     Aussenabstand holt die zwei Pixel wieder rein, damit nichts verrutscht. */
  padding: 0 2px; margin: 0 -2px;
}
/* Wie der Clan-Link im Profil (a:hover{text-decoration:underline}) - kein Kasten,
   nur eine Unterstreichung. Ohne das explizite background greift auch hier das globale
   button:hover und legt einen blauen Balken ueber die ganze Zeile. */
/* Nur der echte Button - in der Fehlerzeile ("Couldn't load") ist .favorite-name ein
   span und darf nicht so tun, als koenne man ihn anklicken. */
button.favorite-name:hover {
  background: transparent; text-decoration: underline; text-underline-offset: 3px;
  text-decoration-color: rgba(255, 255, 255, .45);
}
span.favorite-name { cursor: default; }
.favorite-name:focus-visible { outline: 2px solid var(--primary); outline-offset: 2px; border-radius: 3px; }
/* Statischer Text: kein Zeiger, kein Hover, aber markierbar zum Kopieren. */
.favorite-tag {
  color: var(--panel-muted); font-weight: 500; font-size: 0.78rem; white-space: nowrap;
  cursor: text; user-select: text;
}
.favorite-score { display: inline-flex; align-items: center; gap: 0.3rem; font-weight: 800; font-size: 0.82rem; white-space: nowrap; color: var(--panel-text); }
.favorite-score img { width: 17px; height: 17px; object-fit: contain; }
.favorite-row-error .favorite-error { color: var(--panel-muted); font-size: 0.8rem; font-style: italic; }
.pline { display: flex; align-items: center; gap: 0.45rem; font-size: 1.1rem; font-weight: 700; }
/* Trophaeen und Sammelstufe teilen sich eine Zeile. Der Abstand zwischen den beiden
   Paaren muss deutlich groesser sein als der zwischen Symbol und Zahl, sonst liest man
   "Zahl Symbol" als zusammengehoerig und die Zuordnung kippt.
   Der Spielercode darueber ist eine leise Nebenangabe; etwas Luft trennt ihn von den
   Kennzahlen, ohne dass daraus wieder ein eigener Block wird. */
.pline-stats { flex-wrap: wrap; column-gap: 1.15rem; row-gap: 0.15rem; margin-top: 0.28rem; }
.pstat { display: inline-flex; align-items: center; gap: 0.45rem; }
.pline.muted { color: var(--muted); font-weight: 500; font-size: 0.9rem; }
.line-icon { width: 24px; height: 24px; object-fit: contain; }

.profile-league { display: flex; flex-direction: column; align-items: center; justify-self: end; gap: 0.3rem; flex: none; text-align: center; }
.league-icon { position: relative; display: inline-flex; align-items: center; justify-content: center; width: 124px; height: 124px; }
.profile-league img { width: 124px; height: 124px; object-fit: contain; }
.league-art { transform: scale(var(--league-scale, 1)); }
.league-art-4 { --league-scale: 1.12; }
.league-art-5 { --league-scale: 1.23; }
.league-art-6 { --league-scale: 1.18; }
.league-art-7 { --league-scale: 0.82; }
.league-art-8, .league-art-9 { --league-scale: 1.1; }
.league-art-10 { --league-scale: 1.03; }
.league-rank {
  position: absolute; inset-inline: 0; bottom: 7%;
  width: max-content; margin-inline: auto;
  color: #fff; font-weight: 800; font-size: 1.2rem; letter-spacing: 0.02em;
  text-shadow:
    -1.5px -1.5px 0 #000, 1.5px -1.5px 0 #000,
    -1.5px 1.5px 0 #000, 1.5px 1.5px 0 #000,
    0 2px 3px rgba(0, 0, 0, 0.6);
  pointer-events: none;
}
.league-name { font-weight: 700; font-size: 0.9rem; }

.profile-battle-form { align-self: center; justify-self: center; width: 100%; max-width: 310px; min-width: 0; }
.profile-form-head { display: flex; align-items: baseline; justify-content: space-between; gap: 0.6rem; }
.profile-form-head > span {
  color: rgba(231, 223, 192, 0.52); font-size: 0.61rem; font-weight: 800;
  text-transform: uppercase;
}
.profile-form-head strong { display: inline-flex; gap: 0.38rem; font-size: 0.65rem; }
.profile-form-head b { font-weight: 850; }
.profile-form-head .win { color: #58dda0; }
.profile-form-head .loss { color: #f26b78; }
.profile-form-head .draw { color: #a8afbd; }
/* Ranked-Filter-Toggle (Eliass 09.08.2026, nachgebessert 10.08.2026): Ranked-Medaille als
   Button, standardmaessig mit einem diagonalen Strich unten-links nach oben-rechts
   durchgestrichen ("alle Kaempfe"). Klick entfernt den Strich und filtert die Form-Anzeige
   auf Ranked-Kaempfe. Steht rechts NEBEN dem Diagramm (siehe .profile-form-chart-row).
   Zustand jetzt ueber Farbe statt Schraegstrich (Eliass 10.08.2026: "wenn es deaktiviert
   ist, ist es schwarzweiss... wenn es aktiv ist wird es farbig, dann sparen wir uns den
   Durchstrich") - grayscale(1) im Ruhezustand, volle Farbe + Glow beim Aktivieren. */
.profile-form-chart-row { display: flex; align-items: center; gap: 0.6rem; margin-top: 0.28rem; }
.profile-form-chart-row .profile-form-chart { flex: 1; min-width: 0; margin-top: 0; }
.profile-form-toggle {
  position: relative; flex: 0 0 auto; display: grid; place-items: center;
  width: 30px; height: 30px; padding: 0; border: 0; background: transparent; cursor: pointer;
}
.profile-form-toggle img {
  width: 100%; height: 100%; object-fit: contain; opacity: 0.88;
  filter: grayscale(1); transition: opacity .15s ease, filter .15s ease;
}
.profile-form-toggle.active img { opacity: 1; filter: grayscale(0) drop-shadow(0 0 5px rgba(255, 200, 77, .6)); }
.profile-form-toggle:hover img { opacity: 1; }
.profile-form-toggle:focus-visible { outline: 2px solid rgba(255, 222, 118, 0.9); outline-offset: 2px; border-radius: 4px; }
.profile-form-chart {
  position: relative; display: flex; align-items: stretch; justify-content: center; gap: 2px;
  width: 100%; height: 48px;
}
.profile-form-chart::before {
  content: ""; position: absolute; top: 50%; left: 0; right: 0; height: 1px;
  background: linear-gradient(90deg, transparent, rgba(231, 219, 176, 0.22) 12%, rgba(231, 219, 176, 0.22) 88%, transparent);
}
.profile-form-match {
  appearance: none; position: relative; flex: 1; max-width: 8px; height: 48px;
  padding: 0; border: 0; background: transparent; cursor: pointer;
}
.profile-form-match i {
  position: absolute; left: 0; right: 0; opacity: 0;
  animation: profile-form-build 0.38s calc(0.16s + var(--form-index) * 18ms) cubic-bezier(0.22, 1, 0.36, 1) forwards;
}
.profile-form-match.win i {
  bottom: 50%; height: 19px; transform-origin: bottom;
  border-radius: 2px 2px 0 0; background: linear-gradient(180deg, #6cf0b3, #269a6a);
  box-shadow: 0 -3px 7px rgba(67, 220, 153, 0.25);
}
.profile-form-match.loss i {
  top: 50%; height: 17px; transform-origin: top;
  border-radius: 0 0 2px 2px; background: linear-gradient(180deg, #e45465, #ff7a84);
  box-shadow: 0 3px 7px rgba(237, 79, 98, 0.22);
}
.profile-form-match.draw i {
  top: calc(50% - 2px); height: 4px; border-radius: 2px;
  background: #9ca4b4; transform-origin: center;
}
/* The global button:hover rule would paint a blue block behind the bar – keep it transparent. */
.profile-form-match:hover { background: transparent; filter: brightness(1.25); transform: scaleX(1.18); }
.profile-form-match:focus-visible { outline: 2px solid rgba(255, 222, 118, 0.9); outline-offset: 2px; }
.profile-form-foot {
  display: flex; align-items: center; justify-content: space-between; margin-top: 0.22rem;
  color: rgba(230, 222, 191, 0.4); font-size: 0.55rem;
}
.profile-form-foot b { color: rgba(245, 238, 214, 0.75); font-size: 0.61rem; }
@keyframes profile-form-build {
  from { opacity: 0; transform: scaleY(0.12); }
  to { opacity: 1; transform: scaleY(1); }
}

.profile-clan {
  margin-top: 1rem; padding-top: 0.9rem; border-top: 1px solid var(--border);
  display: flex; align-items: center; gap: 0.55rem; font-size: 1.2rem; font-weight: 700;
}
.profile-clan a { color: var(--text); }
.profile-clan .clan-badge { width: 32px; height: 32px; vertical-align: middle; margin-right: 0; }

.clan-badge { width: 20px; height: 20px; object-fit: contain; vertical-align: -5px; margin-right: 3px; }
#clan-title .clan-badge { width: 34px; height: 34px; vertical-align: -8px; margin-right: 8px; }
.profile-clan .tag { color: var(--muted); font-size: 0.85rem; font-weight: 500; }

/* ---------- Player sub-tabs ---------- */
.subtabs { position: relative; display: flex; gap: 0.25rem; margin: 1.25rem 0 1rem; border-bottom: 1px solid rgba(255, 255, 255, 0.15); }
.subtabs :is(a, button) {
  padding: 0.5rem 0.9rem 0.65rem; border: none; background: none; cursor: pointer;
  font-size: 0.95rem; font-weight: 600; color: rgba(255, 255, 255, 0.6);
  transition: color 0.15s; text-decoration: none; font-family: inherit;
}
.subtabs :is(a, button):hover { color: #fff; }
.subtabs :is(a, button).active { color: #fff; }
/* Merge Tactics hat fuenf Subtabs, die auf schmalen Schirmen nicht in eine Zeile
   passen. Auf breiten Schirmen scrollt die Reihe zur Not seitlich, schmal bricht sie
   in zwei Reihen um (siehe #mt-subtabs im Mobil-Block).
   Wie die Deck-Reiterleiste bleibt sie beim Scrollen unter der Kopfzeile stehen: die
   fuenf Bereiche sind die Hauptnavigation dieses Reiters und sollen erreichbar sein,
   ohne erst wieder nach oben zu scrollen (Eliass 15.08.2026). */
/* Am Desktop bleibt die Reihe, was sie vor der Mobil-Ueberarbeitung war: eine normale
   Reiterleiste, die mitscrollt (Eliass 16.08.2026). Das Kleben, das Einklappen und die
   Uebergaenge dafuer waren eine Antwort auf kleine Schirme und stehen deshalb
   geschlossen im 1100px-Block darunter. */
.mt-subtabs { overflow-x: auto; }
.mt-subtabs [data-mtsub] { white-space: nowrap; }

@media (max-width: 1100px) {
  .mt-subtabs {
    /* Ueber der Season-Auswahl (z-index 12) und der Kapitelnavigation (9): die
       Reiterreihe ist die oberste Ebene dieses Bereichs und muss beim Scrollen vor
       allem stehen, was unter ihr durchlaeuft. Die Season-Auswahl bleibt mit ihren 12
       ueber der Kapitelnavigation, damit ihr Aufklappmenue nicht dahinter verschwindet.
       52px ist dieselbe Zahl wie `.nav-inner { height: 52px }` im 1100px-Block. */
    position: sticky; top: 52px; z-index: 20;
    background: transparent; box-shadow: none;
    /* background-color und box-shadow bewusst NICHT hier - siehe .deck-tools-tabs:
       ein Nachblenden beim Abloesen laesst den Balken losgeloest unter der Kopfzeile
       haengen. transform und opacity bleiben, die braucht .is-collapsed. */
    transition: transform 0.2s ease, opacity 0.16s ease;
    /* Beschnitt dauerhaft, nicht nur in .is-docked - dieselbe Begruendung wie bei
       .deck-tools-tabs: beim Ausdocken faellt die Klasse sofort weg, waehrend der
       Schatten noch ausblendet, und stuende dann ungeschnitten ueber dem ganzen
       Bildschirm. Ohne Schatten schneidet er nichts. */
    clip-path: inset(0 -100vmax -1px);
  }
  /* Eingeklappt, sobald die Kapitelnavigation ihren Platz uebernimmt - umgeschaltet
     in merge-tactics.mjs, wo auch steht warum.
     `visibility` statt nur `transform`: nach oben geschoben laege die Reiterreihe mit
     ihrem z-index 20 sonst UEBER der Kopfzeile statt dahinter. Die Verzoegerung von
     0.2s laesst sie erst verschwinden, wenn sie oben angekommen ist. */
  .mt-subtabs.is-collapsed {
    transform: translateY(-100%); opacity: 0; visibility: hidden;
    transition: transform 0.2s ease, opacity 0.16s ease, visibility 0s linear 0.2s;
  }
}
@media (max-width: 1100px) and (prefers-reduced-motion: reduce) {
  .mt-subtabs, .mt-subtabs.is-collapsed { transition: background-color 0.16s ease, box-shadow 0.16s ease; }
}
/* Angedockt derselbe durchgehende Balken wie bei den Deck-Reitern - Erklaerung zur
   Ausbreitung per Schatten steht dort. Nur mobil, denn nur dort dockt die Reihe
   ueberhaupt an; die Klasse setzt das Skript sonst ins Leere. */
@media (max-width: 1100px) {
  /* Gemalt wird ueber --dock wie bei .deck-tools-tabs - dort steht die Begruendung.
     Nur mobil, denn nur hier dockt die Reihe ueberhaupt an. */
  .mt-subtabs {
    --dock: 0;
    background: transparent; box-shadow: none;
    background: color-mix(in srgb, var(--feedback-bg) calc(var(--dock) * 100%), transparent);
    box-shadow:
      0 0 0 100vmax color-mix(in srgb, var(--feedback-bg) calc(var(--dock) * 100%), transparent),
      0 1px 0 100vmax color-mix(in srgb, var(--panel-inset-border) calc(var(--dock) * 100%), transparent);
  }
}

/* Decks bundles discovery and tools in one mobile-safe tab row. */
.deck-tools-tabs {
  position: sticky; top: 58px; z-index: 9;
  width: calc(100% + 1rem); margin: 0 -0.5rem 1.25rem; padding-inline: 0.5rem;
  overflow-x: auto;
  /* Die Verdunklung haengt an --dock (0 bis 1), das beim Scrollen aus der zurueckgelegten
     WEITE berechnet wird - siehe dockNavOnScroll() in app.js. Keine Transition: der
     Zustand ist an die Scrollposition gekoppelt und braucht keine eigene Zeitachse.
     Genau das war vorher der Fehler - eine Zeitdauer laeuft weiter, waehrend die Leiste
     schon wieder an ihrem normalen Platz sitzt, und der dunkle Balken haengt dann
     losgeloest unter der Kopfzeile.
     Die schlichten Werte davor sind der Rueckfall fuer Browser ohne color-mix: dort
     bleibt die Leiste durchsichtig, statt kaputt auszusehen. */
  --dock: 0;
  background: transparent; box-shadow: none;
  background: color-mix(in srgb, var(--feedback-bg) calc(var(--dock) * 100%), transparent);
  box-shadow:
    0 0 0 100vmax color-mix(in srgb, var(--feedback-bg) calc(var(--dock) * 100%), transparent),
    0 1px 0 100vmax color-mix(in srgb, var(--panel-inset-border) calc(var(--dock) * 100%), transparent);
  transition: none;
  /* Beschnitt dauerhaft: der 100vmax-Schatten wuerde sonst den ganzen Bildschirm
     bedecken. ACHTUNG: schneidet auch Kindelemente - nie ein aufklappendes Menue in
     diese Leiste. Dieselbe Falle wie beim overflow an #tabs. */
  clip-path: inset(0 -100vmax -1px);
}
.deck-tools-tabs[hidden] { display: none; }
.sticky-nav-marker { display: block; width: 1px; height: 0; }
/* Angedockt ist die Leiste ein durchgehender Balken direkt unter der Kopfzeile, kein
   schwebender Streifen mehr (Eliass 15.08.2026: "da ist zu allen Seiten Platz").
   Drei Dinge waren schuld: die Flaeche war zu 25 Prozent durchsichtig (Inhalt schien
   hindurch), sie endete 0.5rem vor dem Fensterrand, und `top: 58px` stammte von der
   Desktop-Kopfzeile - auf Mobil ist die nur 52px hoch, es blieb also ein 6px breiter
   Spalt, durch den die Seite sichtbar durchlief.
   Die seitliche Verbreiterung laeuft ueber zwei versetzte Schatten statt ueber
   `width: 100vw`: 100vw enthaelt die Scrollleiste und wuerde die Seite seitlich
   wegschieben (dieselbe Falle wie bei .home-tut-title, siehe Kommentar dort).
   Schatten erzeugen dagegen nie eine Scrollflaeche. */
/* .deck-tools-tabs.is-docked traegt bewusst keine Farben mehr: gemalt wird ueber
   --dock. Die Klasse bleibt, weil sie den angedockten Zustand fuer andere Zwecke
   markiert und in den Tests erwartet wird. */
@media (max-width: 1100px) {
  /* Gleiche Zahl wie `.nav-inner { height: 52px }` im 1100px-Block. */
  .deck-tools-tabs { top: 52px; }
}

.request-loading {
  min-height: 42px;
  display: flex;
  align-items: center;
  gap: 0.65rem;
  color: var(--panel-muted);
  font-size: 0.82rem;
  font-weight: 700;
}
.request-loading .lb-loading-ring { width: 22px; height: 22px; }
body.embed-mode .deck-tools-tabs { top: 0; }
.deck-tools-tabs :is(a, button) {
  display: inline-flex;
  flex: 1 0 auto;
  align-items: center;
  justify-content: center;
  gap: 0.32rem;
  min-height: 44px;
  white-space: nowrap;
}
.deck-tools-lock { width: 17px; height: 17px; object-fit: contain; opacity: 0.72; }
.deck-tools-tabs :is(a, button).active .deck-tools-lock { opacity: 1; }

@media (max-width: 560px) {
  .deck-tools-tabs { gap: 0.08rem; }
  .deck-tools-tabs :is(a, button) {
    flex: 0 0 auto;
    padding-inline: 0.32rem;
    font-size: 0.76rem;
  }
  .deck-tools-lock { width: 14px; height: 14px; }
}

.deck-improver-locked {
  display: flex;
  align-items: center;
  gap: 1rem;
  min-height: 190px;
  padding: 1.25rem;
}
.deck-improver-locked > img { width: 72px; height: 72px; object-fit: contain; flex: none; }
/* Die Regel stand auf `h2`, im Markup steht aber ein `h1` - sie hat also nie gegriffen.
   Die Ueberschrift lief mit Browser-Standard: 32px und je 21px Abstand oben UND unten.
   Auf dem Desktop faellt das kaum auf, auf 375px brach sie in zwei Zeilen und die
   Abstaende blaehten die Karte auf 322px auf. Mit clamp() bleibt sie auf breiten
   Schirmen bei denselben 32px und geht schmal auf 1.35rem zurueck. */
/* Am Desktop unveraendert wie vor der Mobil-Ueberarbeitung. `:is(h1, h2)` bleibt, weil
   die Ueberschrift im Markup inzwischen eine h1 sein kann - die Masse sind die alten. */
.deck-improver-locked :is(h1, h2) { margin: 0.15rem 0 0.4rem; }
.deck-improver-locked p { max-width: 56ch; margin: 0 0 0.75rem; color: var(--panel-muted); }
/* Schmal darf die Ueberschrift kleiner werden, sonst blaeht sie die Karte auf. */
@media (max-width: 1100px) {
  .deck-improver-locked :is(h1, h2) {
    margin: 0.1rem 0 0.45rem;
    font-size: clamp(1.35rem, 5vw, 2rem); line-height: 1.15;
  }
  .deck-improver-locked p { line-height: 1.5; }
}
.deck-improver-locked strong { color: var(--panel-text); font-size: 0.82rem; }
@media (max-width: 560px) {
  /* Ohne die Mindesthoehe richtet sich die Karte nach ihrem Inhalt statt Leerraum zu
     halten, und das kleinere Schloss gibt der Textspalte rund 30px zurueck (205 statt
     235px Breite waren der Grund fuer den vierzeiligen Absatz). Oben ausgerichtet,
     damit das Schloss neben der Ueberschrift steht und nicht mittig daneben schwebt. */
  .deck-improver-locked { min-height: 0; align-items: flex-start; gap: 0.85rem; padding: 1rem; }
  .deck-improver-locked > img { width: 44px; height: 44px; margin-top: 0.15rem; }
  .deck-improver-locked p { margin-bottom: 0.6rem; font-size: 0.92rem; }
}

/* Player deck history from the currently available battle log. */
#sub-decks {
  width: 100%;
}
.player-decks-toolbar {
  display: flex; align-items: center; justify-content: space-between; gap: 1rem;
  margin-bottom: 0.8rem;
}
.player-decks-summary { color: rgba(239, 243, 252, 0.7); font-size: 0.82rem; font-weight: 650; }
.deck-sort-control {
  display: inline-flex; align-items: center; padding: 3px;
  border: 1px solid rgba(255, 255, 255, 0.12); border-radius: 8px;
  background: rgba(8, 10, 15, 0.76);
}
.deck-sort-control button {
  min-height: 30px; padding: 0.25rem 0.65rem; border-radius: 5px;
  background: transparent; color: rgba(231, 236, 248, 0.58);
  font-size: 0.78rem; font-weight: 700; white-space: nowrap;
}
.deck-sort-control button:hover { background: rgba(255, 255, 255, 0.06); color: #fff; }
.deck-sort-control button.active { background: #315bd4; color: #fff; box-shadow: 0 1px 5px rgba(32, 66, 164, 0.42); }

/* ---------- Gleitende Pille der Segment-Schalter ----------
   Nur echte Auswahlgruppen (role="group") bekommen sie – Einzelknoepfe wie "Reload",
   "Filter" oder "Apply" behalten ihren eigenen Aktiv-Zustand.
   Der gefuellte Hintergrund wandert vom aktiven Knopf in die Pille, sonst leuchten
   waehrend des Gleitens kurz zwei blaue Flaechen. Bewegt wird sie in moveSeg(). */
.deck-sort-control[role="group"], .meta-tiers { position: relative; }
.deck-sort-control[role="group"] > button, .meta-tiers > button {
  position: relative; z-index: 1; /* Text ueber der Pille */
}
.deck-sort-control[role="group"] > button.active, .meta-tiers > button.active {
  background: transparent; box-shadow: none;
}
.seg-indicator {
  position: absolute; top: 0; left: 0; z-index: 0;
  width: 0; height: 0; border-radius: 5px;
  background: #315bd4; box-shadow: 0 1px 5px rgba(32, 66, 164, 0.42);
  opacity: 0; pointer-events: none;
  transition:
    transform 0.28s cubic-bezier(0.4, 0, 0.2, 1),
    width 0.28s cubic-bezier(0.4, 0, 0.2, 1),
    height 0.28s cubic-bezier(0.4, 0, 0.2, 1),
    opacity 0.18s ease;
}
/* Die Stufenauswahl traegt ihren eigenen Verlauf – der zieht mit um. */
.meta-tiers .seg-indicator {
  border-radius: 7px;
  background: linear-gradient(145deg, #3a63d8, #5b4bc4);
  box-shadow: 0 1px 6px rgba(32, 66, 164, 0.46);
}
@media (prefers-reduced-motion: reduce) {
  .seg-indicator { transition: opacity 0.18s ease; }
}

/* Geier Royale — playable draft table */
.geier-add-bot {
  width: 100%; min-height: 58px; border: 1px dashed rgba(116, 150, 205, .32); border-radius: 12px;
  background: rgba(8, 13, 25, .3); color: #93a4bf; cursor: pointer;
  display: grid; grid-template-columns: 36px 1fr; grid-template-rows: 1fr 1fr; column-gap: 10px;
  align-items: center; padding: 8px 13px; text-align: left; transition: .18s ease;
}
.geier-add-bot span { grid-row: 1 / 3; width: 34px; height: 34px; display: grid; place-items: center; border-radius: 50%; background: rgba(79, 116, 181, .15); color: #a9c8ff; font-size: 1.45rem; }
.geier-add-bot b { align-self: end; color: #cbd8ed; font-size: .82rem; }
.geier-add-bot small { align-self: start; color: #697b99; font-size: .68rem; }
.geier-add-bot:hover { border-color: rgba(126, 174, 255, .65); background: rgba(47, 83, 143, .14); transform: translateY(-1px); }

.geier-game {
  position: relative; min-height: 720px; overflow: hidden; border: 1px solid rgba(130, 160, 222, .18);
  border-radius: 24px; padding: 22px; isolation: isolate;
  background:
    radial-gradient(circle at 53% -15%, rgba(90, 73, 181, .22), transparent 43%),
    linear-gradient(145deg, rgba(8, 13, 27, .97), rgba(10, 15, 30, .94) 50%, rgba(19, 10, 27, .95));
  box-shadow: 0 25px 70px rgba(0, 0, 0, .42), inset 0 1px rgba(255, 255, 255, .04);
}
.geier-game::before {
  content: ""; position: absolute; inset: 0; z-index: -1; pointer-events: none; opacity: .35;
  background: linear-gradient(115deg, transparent 12%, rgba(59, 126, 246, .09) 35%, transparent 48%, rgba(202, 53, 111, .08) 72%, transparent 88%);
}
.geier-game-timer { height: 5px; overflow: hidden; border-radius: 99px; background: rgba(255,255,255,.075); margin: -4px 0 18px; }
.geier-game-timer i { display: block; width: 100%; height: 100%; border-radius: inherit; background: linear-gradient(90deg, #36a8ff, #8768ff 54%, #e5578c); box-shadow: 0 0 16px rgba(112, 114, 255, .75); transition: width .1s linear; }
.geier-game-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 18px; }
.geier-game-head span { color: #9b8df3; font-size: .7rem; font-weight: 900; letter-spacing: .15em; text-transform: uppercase; }
.geier-game-head h3 { color: #f4f6ff; margin: 3px 0 0; font-size: 1.38rem; }
.geier-game-head-actions { display: flex; align-items: center; gap: 15px; }
.geier-shell .geier-game-cancel {
  position: absolute; top: calc(100% + 3px); right: 0; display: grid; width: 74px; min-height: 24px;
  padding: 0 6px; place-items: center; overflow: hidden; cursor: pointer;
  border: 1px solid color-mix(in srgb, var(--loss) 58%, transparent); border-radius: 7px;
  background: color-mix(in srgb, var(--loss) 17%, transparent); color: color-mix(in srgb, var(--loss) 45%, white);
  font-family: "Inter", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
  font-size: .74rem; font-weight: 900; line-height: 1;
  letter-spacing: .09em; text-transform: uppercase; white-space: nowrap;
}
.geier-shell .geier-game-cancel:hover, .geier-shell .geier-game-cancel:focus-visible {
  border-color: var(--loss); background: color-mix(in srgb, var(--loss) 28%, transparent); color: white;
}
.geier-shell .geier-game-cancel:disabled { cursor: wait; opacity: .55; }
.geier-game-progress { position: relative; display: flex; align-items: center; gap: 13px; }
.geier-game-progress strong { color: #acb9cf; font-size: .78rem; }
.geier-game-progress span { min-width: 62px; color: #fff; font-size: 1.15rem; font-weight: 900; text-align: right; font-variant-numeric: tabular-nums; }
.geier-game-layout { display: grid; grid-template-columns: minmax(225px, 285px) minmax(0, 1fr); gap: 20px; align-items: start; }
.geier-game-decks { max-height: 635px; overflow-y: auto; display: grid; gap: 10px; padding: 1px 7px 8px 1px; scrollbar-color: rgba(114,137,190,.35) transparent; }
.geier-live-deck { padding: 10px; border: 1px solid rgba(107, 129, 176, .17); border-radius: 14px; background: rgba(8, 12, 24, .54); }
.geier-live-deck.own { padding: 13px; border-color: rgba(116, 115, 255, .48); background: linear-gradient(145deg, rgba(35, 45, 90, .5), rgba(19, 16, 48, .54)); box-shadow: inset 0 0 22px rgba(75, 88, 214, .08); }
.geier-live-deck header { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; }
.geier-live-deck header .geier-avatar { width: 29px; height: 29px; }
.geier-live-deck.own header .geier-avatar { width: 35px; height: 35px; }
.geier-live-deck header div { display: grid; }
.geier-live-deck header strong { color: #e5ebf8; font-size: .78rem; }
.geier-live-deck header small { color: #71809b; font-size: .63rem; }
.geier-live-deck > div { display: grid; grid-template-columns: repeat(4, 1fr); gap: 4px; }
.geier-live-deck-card { display: grid; place-items: center; aspect-ratio: .78; overflow: hidden; border-radius: 5px; background: #111a2d; border: 1px solid rgba(255,255,255,.08); }
.geier-live-deck-card img { width: 100%; height: 100%; object-fit: cover; }
.geier-live-deck-card.empty { border-style: dashed; color: rgba(134,151,184,.28); font-size: .65rem; }
/* Der Inhalt ist im Board zentriert - das Board sitzt aber rechts neben der Deckspalte,
   dadurch wirkte das ganze Spiel nach rechts verschoben. Rechts denselben Platz
   freihalten zieht es auf die Seitenmitte. Wird es zu breit, schrumpft die Reserve
   und der Inhalt weicht wieder nach rechts aus, statt gequetscht zu werden. */
/* Das Spielfeld darf den vorhandenen Platz besser nutzen: 10 Prozent groesser. `zoom`
   statt `transform: scale`, weil es echtes Layout macht - Klickflaechen und Schaerfe
   bleiben korrekt. Die Reserve rechts ist durch den Zoom geteilt (326/1.1, 640/1.1),
   damit sie in echten Pixeln weiterhin genau der Deckspalte entspricht. */
.geier-game-board { min-width: 0; display: flex; flex-direction: column; align-items: center; zoom: 1.1; padding-right: max(0px, min(296px, 100% - 582px)); }
.geier-game-statuses { width: 100%; display: flex; flex-wrap: wrap; justify-content: center; gap: 7px; margin: 0 0 14px; }
.geier-game-player-status { display: grid; grid-template-columns: 24px auto; grid-template-rows: 1fr 1fr; align-items: center; gap: 0 7px; min-width: 105px; padding: 6px 9px; border: 1px solid rgba(75,122,200,.44); border-radius: 10px; background: rgba(25,48,86,.28); }
.geier-game-player-status .geier-avatar { grid-row: 1 / 3; width: 24px; height: 24px; }
.geier-game-player-status b { align-self: end; color: #dce7f7; font-size: .67rem; line-height: 1; }
.geier-game-player-status i { align-self: start; color: #6f9ed7; font-size: .58rem; font-style: normal; }
.geier-game-player-status.confirmed { border-color: rgba(55, 231, 142, .66); background: rgba(16, 104, 69, .2); box-shadow: inset 0 0 14px rgba(43, 212, 129, .08); }
.geier-game-player-status.confirmed i { color: #62dda2; }
.geier-game-cards { width: 100%; display: grid; grid-template-columns: repeat(auto-fit, minmax(125px, 1fr)); gap: 12px; }
.geier-pick-card {
  position: relative; min-width: 0; min-height: 246px; padding: 10px 10px 12px; overflow: hidden; cursor: pointer;
  border: 1px solid transparent; border-radius: 17px; color: #edf2ff;
  background:
    linear-gradient(#10182c, #111224) padding-box,
    linear-gradient(140deg, #238fec, #5c5de1 43%, #ad477e 73%, #e86b76) border-box;
  box-shadow: inset 0 0 24px rgba(65, 75, 170, .09), 0 12px 24px rgba(0,0,0,.25);
  transition: transform .2s ease, filter .2s ease, box-shadow .2s ease;
}
.geier-pick-card::before { content: ""; position: absolute; inset: 0; pointer-events: none; background: linear-gradient(110deg, transparent 28%, rgba(255,255,255,.08) 45%, transparent 61%); transform: translateX(-120%); transition: transform .55s ease; }
.geier-pick-card:not(:disabled):hover { transform: translateY(-4px); filter: brightness(1.08); box-shadow: 0 17px 30px rgba(0,0,0,.34), 0 0 18px rgba(83,103,235,.15); }
.geier-pick-card:not(:disabled):hover::before { transform: translateX(120%); }
.geier-pick-card.selected { transform: translateY(-5px); border-color: transparent; background: linear-gradient(#171c38, #18122d) padding-box, linear-gradient(140deg, #64c8ff, #8b7bff 46%, #ff70aa) border-box; box-shadow: 0 0 0 2px rgba(128,127,255,.24), 0 0 26px rgba(91,102,241,.3); }
.geier-pick-card:disabled { cursor: default; opacity: 1; }
.geier-pick-card.deck-rule-locked { cursor: not-allowed; opacity: .52; }
.geier-pick-card.deck-rule-locked .geier-pick-art img { filter: grayscale(1) brightness(.42); }
.geier-pick-art { position: relative; display: block; height: 174px; overflow: hidden; border-radius: 11px; background: #0a1020; }
.geier-pick-art img { width: 100%; height: 100%; object-fit: contain; filter: drop-shadow(0 8px 10px rgba(0,0,0,.42)); }
.geier-pick-fallback { width: 100%; height: 100%; display: grid; place-items: center; color: #b7c8e7; font-size: 2rem; font-weight: 950; background: radial-gradient(circle at 50% 35%, rgba(91,104,196,.42), rgba(13,20,39,.94) 68%); }
.geier-pick-art i { position: absolute; left: 5px; top: 5px; width: 27px; height: 27px; display: grid; place-items: center; border-radius: 50%; background: linear-gradient(145deg, #d873ff, #7840e4); color: #fff; font-weight: 950; font-style: normal; box-shadow: 0 3px 8px rgba(0,0,0,.4); }
.geier-pick-card > strong { display: block; margin-top: 9px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: .78rem; }
.geier-game-bid-area { width: 100%; margin-top: 20px; text-align: center; }
.geier-game-bid-area > span { display: block; margin-bottom: 8px; color: #75849e; font-size: .69rem; font-weight: 800; letter-spacing: .04em; text-transform: uppercase; }
.geier-game-bids { display: flex; justify-content: center; flex-wrap: wrap; gap: 7px; }
/* Aussehen der Gebote steht gesammelt weiter unten (Elixier-Tropfen), hier nur das Grundlegende. */
.geier-game-bids button { cursor: pointer; }
.geier-game-confirm { min-width: 240px; min-height: 45px; margin-top: 15px; border: 1px solid rgba(122,238,183,.62); border-radius: 11px; background: linear-gradient(135deg, #128452, #0b6244); color: #edfff7; font-weight: 900; cursor: pointer; box-shadow: 0 10px 22px rgba(2,83,50,.24); }
.geier-game-confirm:disabled { opacity: .38; cursor: default; box-shadow: none; }
.geier-game-message { min-height: 1.2em; margin: 9px 0 0; color: #77869f; font-size: .72rem; text-align: center; }
.geier-reveal-bids { position: absolute; inset: 48px 7px auto; display: grid; gap: 5px; z-index: 2; }
.geier-reveal-bid { display: flex; align-items: center; justify-content: space-between; padding: 5px 7px; border-radius: 7px; background: rgba(5,8,18,.88); color: #b8c4db; font-size: .62rem; box-shadow: 0 3px 9px rgba(0,0,0,.3); animation: geierBidDrop .38s both; }
.geier-reveal-bid em { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-style: normal; }
.geier-reveal-bid b { width: 22px; height: 22px; display: grid; place-items: center; border-radius: 50%; background: #6c3eb4; color: #fff; opacity: 0; transform: scale(.35) rotate(-18deg); animation: geierRevealValue .35s calc(1s + var(--reveal-order) * .12s) cubic-bezier(.2,.9,.25,1.3) forwards; }
.geier-reveal-bid.winner { color: #8ff3bd; outline: 1px solid rgba(73,230,151,.5); }
.geier-pick-card.contested { animation: geierContestedCard .55s .25s ease-in-out 2; }
.geier-card-winner { position: absolute; inset: auto 9px 8px; z-index: 2; padding: 6px; border-radius: 7px; background: rgba(9,87,56,.94); color: #a8f4cc; font-size: .63rem; font-weight: 900; opacity: 0; transform: translateY(7px); animation: geierWinnerIn .42s 2.05s ease-out forwards; }
/* Zeilenabstand war "normal", also 0: Maskottchen, "Prepare your deck" und die Zahl
   klebten aneinander (Eliass 02.09.2026: "uebel dicht an dem Countdown dran"). Vor der
   Zahl etwas mehr Luft als vor dem Text, damit die Zeile nicht an ihr klebt. */
.geier-game-countdown { position: absolute; inset: 0; z-index: 10; display: grid; place-items: center; align-content: center; row-gap: 10px; background: radial-gradient(circle, rgba(39,35,88,.83), rgba(5,8,17,.97) 58%); backdrop-filter: blur(7px); }
.geier-game-countdown strong { margin-top: 4px; }
.geier-game-countdown[hidden] { display: none; }
.geier-game-countdown img { width: min(340px, 60vw); max-height: 285px; object-fit: contain; filter: drop-shadow(0 0 38px rgba(119,78,220,.35)); animation: geierCountdownFloat 1.2s ease-in-out infinite alternate; }
.geier-game-countdown span { color: #b9aadf; font-weight: 900; letter-spacing: .17em; text-transform: uppercase; }
.geier-game-countdown strong { color: #fff; font-family: "Clash Display", sans-serif; font-size: clamp(4rem, 10vw, 7rem); line-height: .95; text-shadow: 0 0 30px rgba(123,91,239,.75); }
@keyframes geierCountdownFloat { to { transform: translateY(-7px) scale(1.025); } }
@keyframes geierBidDrop { from { opacity: 0; transform: translateY(-8px) scale(.96); } }
@keyframes geierRevealValue { to { opacity: 1; transform: none; } }
@keyframes geierWinnerIn { to { opacity: 1; transform: none; } }
@keyframes geierContestedCard { 50% { box-shadow: 0 0 0 2px rgba(240,151,82,.38), 0 0 28px rgba(230,99,81,.3); transform: translateY(-3px) scale(1.012); } }

@media (max-width: 900px) {
  .geier-game { padding: 15px; border-radius: 17px; }
  .geier-game-layout { grid-template-columns: 1fr; }
  .geier-game-decks { grid-row: 2; max-height: none; grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); }
  .geier-live-deck.own { grid-column: 1 / -1; }
  .geier-pick-card { min-height: 220px; }
  .geier-pick-art { height: 148px; }
}
@media (max-width: 560px) {
  .geier-game-head { align-items: flex-start; }
  /* Der Cancel-Knopf ist absolut positioniert (top: calc(100% + 3px)) und zaehlt damit
     nicht zur Hoehe der Kopfzeile. Er ragt 27px darunter, die Kopfzeile reservierte aber
     nur 18px - gemessen blieben 3px bis zum eigenen Deck, es sah aus, als ueberlappe er
     es (Eliass 03.09.2026: "ein ganz grosses Problem"). Der Platz wird nur reserviert,
     wenn der Knopf wirklich sichtbar ist. */
  .geier-game-head:has(.geier-game-cancel:not([hidden])) { margin-bottom: 40px; }
  .geier-game-head-actions { align-items: flex-end; flex-direction: column-reverse; gap: 7px; }
  .geier-game-progress { align-items: flex-end; flex-direction: column-reverse; gap: 2px; }
  .geier-game-cards { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .geier-pick-card { min-height: 198px; padding: 7px; }
  .geier-pick-art { height: 132px; }
}

/* Geier Royale clarity pass: open decks, bare cards, staged clash reveal */
.geier-game { min-height: 620px; overflow-x: clip; overflow-y: visible; }
.geier-game-layout { grid-template-columns: 310px minmax(0, 1fr); gap: 16px; }
.geier-game-decks { max-height: none; overflow: visible; gap: 8px; padding: 0; align-content: start; }
.geier-live-deck,
.geier-live-deck.own {
  position: relative; overflow: hidden; width: 86%; justify-self: center; padding: 8px 9px;
  border: 1px solid rgba(99,125,215,.42); border-radius: 8px;
  background: linear-gradient(145deg, rgba(31,48,91,.94), rgba(18,21,31,.97) 52%, rgba(39,22,48,.94));
  box-shadow: 0 8px 24px rgba(3,6,14,.24), inset 0 0 22px rgba(83,110,215,.06);
}
.geier-live-deck::before {
  content: ""; position: absolute; top: 0; left: 10%; right: 10%; height: 1px; pointer-events: none;
  background: var(--panel-line); box-shadow: 0 0 8px rgba(89,122,255,.5);
}
/* Eigenes Deck bewusst groesser/prominenter als die anderen, damit klar ist: das bin ich. */
.geier-live-deck.own {
  width: 100%; padding: 13px 14px; border-width: 2px; border-color: rgba(120,145,255,.8);
  box-shadow: 0 12px 30px rgba(3,6,14,.34), inset 0 0 30px rgba(83,110,215,.14), 0 0 0 1px rgba(120,145,255,.25);
}
.geier-live-deck.own::before { left: 6%; right: 6%; height: 2px; box-shadow: 0 0 11px rgba(89,122,255,.7); }
.geier-live-deck header { gap: 7px; margin-bottom: 6px; }
.geier-live-deck header .geier-avatar { width: 26px; height: 26px; }
.geier-live-deck.own header .geier-avatar { width: 40px; height: 40px; }
.geier-live-deck header strong { font-size: .74rem; }
.geier-live-deck header small { font-size: .58rem; }
.geier-live-deck.own header strong { font-size: 1rem; }
.geier-live-deck.own header small { font-size: .72rem; }
.geier-live-deck-elixir { margin-left: auto; flex: none; }
.geier-live-deck-elixir .elixir { font-size: .72rem; font-weight: 900; color: #dfe6f5; }
.geier-live-deck.own .geier-live-deck-elixir .elixir { font-size: .9rem; }
.geier-live-deck > .geier-live-deck-cards {
  min-height: 0; display: flex; align-items: flex-end; gap: 2px; overflow: visible;
}
.geier-live-deck-cards.empty { display: none; }
.geier-live-deck-card {
  width: calc((100% - 14px) / 8); flex: 0 0 calc((100% - 14px) / 8); aspect-ratio: .76;
  overflow: visible; border: 0; border-radius: 0; background: transparent;
  filter: drop-shadow(0 3px 3px rgba(0,0,0,.48));
}
.geier-live-deck-card img { width: 100%; height: auto; max-height: 58px; object-fit: contain; }
.geier-live-deck.own .geier-live-deck-card img { max-height: 98px; }
.geier-live-deck-card .geier-pick-fallback { min-height: 32px; border-radius: 4px; font-size: .55rem; }
/* Neu zugeteilte Deckkarte poppt einmalig herein. `.is-new` setzt app.js nur auf frisch
   angehaengte Karten - bereits liegende Karten animieren beim Poll nicht erneut. */
@keyframes geierDeckPop {
  0%   { opacity: 0; transform: scale(.5) translateY(7px); }
  58%  { opacity: 1; transform: scale(1.13) translateY(0); }
  100% { opacity: 1; transform: scale(1) translateY(0); }
}
.geier-live-deck-card.is-new { animation: geierDeckPop .44s cubic-bezier(.22,.9,.3,1.3) both; }
/* Imposter-Reveal: die Original-Karte poppt aus dem Deck raus, bevor die Imposter-Karte reinpoppt. */
.geier-live-deck-card.imposter-pop-out { animation: geierDeckPopOut .21s ease forwards; }
@keyframes geierDeckPopOut { to { opacity: 0; transform: scale(.5) translateY(6px); } }
@media (prefers-reduced-motion: reduce) {
  .geier-live-deck-card.is-new { animation: none; }
  .geier-live-deck-card.imposter-pop-out { animation: none; }
}
.geier-game-statuses { margin-bottom: 5px; }
.geier-game-bid-area[hidden] { display: none; }

/* Die Kartenbreite folgt IMMER der berechneten Spaltenzahl (--geier-per-row aus
   geierKartenProReihe), nicht mehr einer festen Mindestbreite in einer Reihe ohne
   Umbruch. Vorher stand hier `flex-wrap: nowrap` mit `min-width: 90px`: acht Karten
   brauchten damit 720px und liefen auf dem Handy rechts aus dem Bild, ohne dass man sie
   noch sehen konnte (Eliass 02.09.2026). Der Umbruch ist jetzt erlaubt; welche Karte in
   welcher Reihe landet, entscheidet die Spaltenzahl - dadurch werden die Reihen
   ausgewogen und nicht 5+3. */
.geier-game-cards[data-mode="picking"] {
  --geier-karten-luecke: clamp(4px, .8vw, 11px);
  width: 100%; min-height: 276px; display: flex; flex-wrap: wrap; align-items: center;
  /* Zeilenabstand deutlich kleiner als frueher: 14px liessen die beiden Kartenreihen
     auseinanderfallen (Eliass 03.09.2026 "zu weit auseinander"). Die Karten tragen
     ohnehin einen Schlagschatten, der optisch trennt. */
  justify-content: center; gap: 4px var(--geier-karten-luecke); padding: 12px 7px 10px;
  /* align-content fehlte: bei zwei Reihen verteilt der Standardwert (normal/stretch) die
     ueberschuessige Hoehe aus min-height ZWISCHEN die Reihen - der 4px-Zeilenabstand oben
     war also wirkungslos, die Reihen standen trotzdem weit auseinander (Eliass
     03.09.2026, Runde mit 15 Karten). Zentriert bleiben beide Reihen zusammen und der
     Block sitzt weiter mittig im reservierten Platz. */
  align-content: center;
  overflow: visible;
}
.geier-game-cards[data-mode="picking"] .geier-pick-card {
  flex: 0 1 calc((100% - (var(--geier-per-row, 8) - 1) * var(--geier-karten-luecke)) / var(--geier-per-row, 8));
  /* Deckel etwas niedriger als frueher (190px): bei wenigen Spielern wirkten die Karten
     sonst erschlagend gross (Eliass 03.09.2026). Bei vielen Spielern bestimmt ohnehin
     die Spaltenzahl die Breite, dort aendert der Deckel nichts. */
  min-width: 0; max-width: 152px; min-height: 0; padding: 0;
  overflow: visible; border: 0; border-radius: 0; background: transparent; box-shadow: none;
  isolation: isolate; transform-origin: 50% 80%;
}
.geier-game-cards[data-mode="picking"] .geier-pick-card::before { display: none; }
.geier-game-cards[data-mode="picking"] .geier-pick-art {
  position: relative; height: auto; overflow: visible; border-radius: 0; background: transparent;
}
/* data-tworow sagt nur noch AUS, dass umgebrochen wird - die Breite steckt schon in der
   Regel oben. Bei zwei Reihen etwas kleiner deckeln, sonst wirken vier grosse Karten je
   Reihe neben der zweiten Reihe erschlagend. */
.geier-game-cards[data-mode="picking"][data-tworow="true"] .geier-pick-card { max-width: 124px; }
.geier-game-cards[data-mode="picking"] .geier-pick-art::before {
  content: ""; position: absolute; z-index: -1; inset: 9% 8% 5%; border-radius: 18%;
  background: radial-gradient(ellipse, rgba(0,0,0,.72), rgba(0,0,0,.22) 58%, transparent 74%);
  filter: blur(9px); transform: translateY(8px); transition: .2s ease;
}
.geier-game-cards[data-mode="picking"] .geier-pick-art img {
  display: block; width: 100%; height: auto; max-height: 258px; object-fit: contain;
  filter: drop-shadow(0 11px 9px rgba(0,0,0,.62)); transition: transform .19s ease, filter .19s ease;
}
.geier-game-cards[data-mode="picking"] .geier-pick-card:not(:disabled):hover { transform: translateY(-7px) scale(1.035); filter: none; box-shadow: none; }
.geier-game-cards[data-mode="picking"] .geier-pick-card:not(:disabled):hover .geier-pick-art img { filter: drop-shadow(0 16px 12px rgba(0,0,0,.72)) brightness(1.06); }
.geier-game-cards[data-mode="picking"] .geier-pick-card.selected { transform: translateY(-8px) scale(1.045); background: transparent; box-shadow: none; }
.geier-game-cards[data-mode="picking"] .geier-pick-card.selected .geier-pick-art::before {
  inset: 4% 1% 0; background: radial-gradient(ellipse, rgba(45,142,255,.8), rgba(62,92,255,.38) 52%, transparent 74%);
  filter: blur(14px); animation: geierSelectedBreath 1.5s ease-in-out infinite alternate;
}
.geier-game-cards[data-mode="picking"] .geier-pick-card.selected .geier-pick-art img { filter: drop-shadow(0 0 8px rgba(74,172,255,.85)) drop-shadow(0 14px 11px rgba(0,0,0,.7)); }
.geier-game-cards[data-mode="picking"] .geier-pick-fallback { min-height: 210px; border-radius: 15px; }
@keyframes geierSelectedBreath { to { opacity: .62; transform: translateY(5px) scale(.94); } }

.geier-game-cards[data-mode="reveal"] { width: 100%; display: block; overflow: visible; }
.geier-reveal-arena { width: 100%; min-width: 0; min-height: 238px; display: grid; gap: 0; overflow: visible; }
.geier-duel-list { z-index: 1; grid-area: 1 / 1; min-width: 0; display: grid; gap: 10px; overflow: clip; }
.geier-duel {
  width: min(760px, 100%); min-height: 238px; margin: 0 auto; padding: 13px 17px;
  display: grid; grid-template-columns: 135px minmax(0, 1fr); gap: 18px; align-items: center;
  border: 1px solid rgba(100,124,192,.3); border-radius: 17px;
  background: radial-gradient(circle at 18% 35%, rgba(54,77,145,.24), transparent 42%), rgba(6,10,21,.72);
  box-shadow: inset 0 1px rgba(255,255,255,.035), 0 14px 30px rgba(0,0,0,.25);
  animation: geierDuelOpen .42s ease-out both;
}
.geier-duel-card { display: grid; place-items: center; align-content: center; }
.geier-duel-card > img { width: 112px; max-height: 175px; object-fit: contain; filter: drop-shadow(0 12px 10px rgba(0,0,0,.65)); }
.geier-duel-card > .geier-pick-fallback { width: 105px; height: 142px; border-radius: 10px; }
.geier-duel-card strong { margin-top: 3px; color: #aab7cd; font-size: .67rem; }
.geier-duel-copy > span { color: #e29266; font-size: .61rem; font-weight: 950; letter-spacing: .14em; text-transform: uppercase; }
.geier-duel.is-tie .geier-duel-copy > span { color: #ffb35e; }
.geier-duel-copy h4 { margin: 2px 0 6px; color: #e9eef9; font-size: .9rem; }
.geier-duel-chart { min-height: 177px; display: flex; align-items: flex-end; justify-content: center; gap: clamp(11px, 3vw, 34px); border-bottom: 1px solid rgba(125,147,196,.22); }
.geier-duel-column { position: relative; width: 64px; min-width: 52px; display: grid; justify-items: center; align-items: end; }
.geier-duel-column > small { width: 76px; min-height: 22px; margin-top: 4px; overflow: hidden; color: #8797b2; font-size: .58rem; line-height: 1.1; text-align: center; text-overflow: ellipsis; white-space: nowrap; }
.geier-duel-number { position: relative; z-index: 5; margin: 0 0 9px; color: #fff; font-size: 1.22rem; font-weight: 950; opacity: 0; line-height: 1; text-shadow: 0 2px 6px rgba(0,0,0,.6); font-variant-numeric: tabular-nums; }
.geier-duel-rise { height: 143px; display: flex; flex-direction: column; justify-content: flex-end; align-items: center; }
.geier-duel-rise > .geier-avatar {
  z-index: 3; width: 31px; height: 31px; margin-bottom: -4px;
  transform: translateY(calc(var(--bid) * 13px));
  animation: geierAvatarRise 1.05s calc(.24s + var(--order) * .08s) cubic-bezier(.18,.75,.22,1) forwards;
}
.geier-duel-bar { width: 31px; height: calc(8px + var(--bid) * 12px); display: flex; align-items: flex-end; border-radius: 7px 7px 2px 2px; overflow: hidden; background: rgba(83,75,150,.16); }
.geier-duel-bar i {
  width: 100%; height: 100%; display: block; transform: scaleY(0); transform-origin: bottom;
  border-radius: inherit; background: linear-gradient(180deg, #ad83ff, #5844a9); box-shadow: 0 0 13px rgba(132,94,225,.35);
  animation: geierBarRise 1.05s calc(.24s + var(--order) * .08s) cubic-bezier(.18,.75,.22,1) forwards;
}
.geier-duel-column.winner .geier-duel-bar i { animation: geierBarRise 1.05s calc(.24s + var(--order) * .08s) cubic-bezier(.18,.75,.22,1) forwards, geierWinnerBar .35s 3.15s forwards; }
.geier-duel-column.loser .geier-duel-bar i { animation: geierBarRise 1.05s calc(.24s + var(--order) * .08s) cubic-bezier(.18,.75,.22,1) forwards, geierLoserBar .35s 3.15s forwards; }
.geier-duel.is-tie .geier-duel-column.top-bid .geier-duel-rise > .geier-avatar { animation: geierAvatarRise 1.05s calc(.24s + var(--order) * .08s) cubic-bezier(.18,.75,.22,1) forwards, geierTieAccel .28s 1.85s, geierWinnerAvatar .3s 3.15s forwards; }
.geier-duel.is-tie .geier-duel-column.top-bid.loser .geier-duel-rise > .geier-avatar { animation: geierAvatarRise 1.05s calc(.24s + var(--order) * .08s) cubic-bezier(.18,.75,.22,1) forwards, geierTieAccel .28s 1.85s, geierLoserAvatar .3s 3.15s forwards; }
.geier-duel:not(.is-tie) .geier-duel-column.winner .geier-duel-rise > .geier-avatar { animation: geierAvatarRise 1.05s calc(.24s + var(--order) * .08s) cubic-bezier(.18,.75,.22,1) forwards, geierWinnerAvatar .3s 2s forwards; }
.geier-duel:not(.is-tie) .geier-duel-column.loser .geier-duel-rise > .geier-avatar { animation: geierAvatarRise 1.05s calc(.24s + var(--order) * .08s) cubic-bezier(.18,.75,.22,1) forwards, geierLoserAvatar .3s 2s forwards; }
.geier-reveal-result-row { z-index: 2; grid-area: 1 / 1; align-self: center; display: grid; grid-template-columns: repeat(var(--card-count), minmax(0, 145px)); justify-content: center; gap: clamp(4px, .75vw, 10px); overflow: visible; padding: 7px 18px 10px; opacity: 0; transform: translateY(7px); animation: geierResultsIn .4s 3.58s forwards; }
/* Ab >8 Karten: Reveal-Ergebnis genau wie das Picking auf zwei zentrierte Reihen umbrechen
   (gleiche Spaltenzahl --geier-per-row -> Karten liegen deckungsgleich zum Pick). */
.geier-game-cards[data-tworow="true"] .geier-reveal-result-row {
  display: flex; flex-wrap: wrap; justify-content: center; align-content: center; row-gap: 12px;
}
.geier-game-cards[data-tworow="true"] .geier-reveal-result-row .geier-reveal-card-result {
  flex: 0 1 calc(100% / var(--geier-per-row, 8) - 12px); max-width: 145px;
}
.geier-reveal-card-result { min-width: 0; max-width: 145px; padding-bottom: 4px; display: flex; flex-direction: column; align-items: center; align-content: start; }
.geier-reveal-owner { z-index: 3; width: 100%; min-width: 0; margin-top: -20px; display: grid; justify-items: center; text-align: center; background: none; border: 0; box-shadow: none; }
.geier-reveal-owner .geier-avatar { width: 40px; height: 40px; border: 3px solid #1b2942; box-shadow: 0 4px 12px rgba(0,0,0,.62), 0 0 0 1px rgba(154,177,222,.42); }
.geier-reveal-owner b { width: 100%; margin-top: 5px; overflow: hidden; color: #f3f7ff; font-family: "Inter", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; font-size: clamp(.55rem, .75vw, .68rem); font-weight: 900; letter-spacing: .035em; line-height: 1.1; text-overflow: ellipsis; text-shadow: 0 2px 5px rgba(0,0,0,.9); white-space: nowrap; }
.geier-reveal-owner.unclaimed { margin-top: -4px; color: #8d9bb3; }
.geier-reveal-card-art { width: 100%; display: grid; place-items: center; }
.geier-reveal-card-art > img { width: 100%; max-height: 192px; object-fit: contain; filter: drop-shadow(0 9px 8px rgba(0,0,0,.6)); }
.geier-reveal-card-art > .geier-pick-fallback { min-height: 132px; border-radius: 8px; }
.geier-clean-claim { margin: 12px auto 0; color: #74dca9; font-size: .72rem; font-weight: 800; }
.geier-reveal-arena.settled .geier-duel *,
.geier-reveal-arena.settled .geier-reveal-result-row { animation-delay: 0s !important; animation-duration: .01s !important; }
.geier-game[data-phase="reveal"] .geier-game-timer i,
.geier-game[data-phase="intermission"] .geier-game-timer i { transition: width .12s linear; }
.geier-game[data-phase="reveal"] .geier-game-progress > span,
.geier-game[data-phase="intermission"] .geier-game-progress > span { color: #ac9aff; font-size: .83rem; }
@keyframes geierDuelOpen { from { opacity: 0; transform: translateY(-8px) scale(.985); } }
@keyframes geierAvatarRise { to { transform: translateY(0); } }
@keyframes geierBarRise { to { transform: scaleY(1); } }
/* Tie-Spannung: blinkt langsam an und wird immer schneller (Peaks ruecken zusammen). */
@keyframes geierTieAccel {
  0%   { filter: brightness(1);    box-shadow: 0 0 0 2px rgba(255,183,76,.28); }
  16%  { filter: brightness(1.7);  box-shadow: 0 0 0 3px rgba(255,183,76,.5), 0 0 14px rgba(255,139,59,.6); }
  32%  { filter: brightness(1);    box-shadow: 0 0 0 2px rgba(255,183,76,.28); }
  48%  { filter: brightness(1.75); box-shadow: 0 0 0 3px rgba(255,188,86,.55), 0 0 16px rgba(255,145,62,.66); }
  62%  { filter: brightness(1);    box-shadow: 0 0 0 2px rgba(255,183,76,.28); }
  74%  { filter: brightness(1.82); box-shadow: 0 0 0 3px rgba(255,196,100,.62), 0 0 18px rgba(255,152,66,.72); }
  84%  { filter: brightness(1);    box-shadow: 0 0 0 2px rgba(255,183,76,.28); }
  92%  { filter: brightness(1.92); box-shadow: 0 0 0 3px rgba(255,206,116,.72), 0 0 22px rgba(255,162,72,.82); }
  100% { filter: brightness(1);    box-shadow: 0 0 0 2px rgba(255,183,76,.3); }
}
@keyframes geierWinnerBar { to { background: linear-gradient(180deg,#62efaa,#168b5c); box-shadow: 0 0 16px rgba(54,228,144,.6); } }
@keyframes geierLoserBar { to { background: linear-gradient(180deg,#ee7180,#923347); box-shadow: 0 0 10px rgba(224,64,84,.38); opacity: .7; } }
@keyframes geierWinnerAvatar { to { box-shadow: 0 0 0 3px #42e99a, 0 0 19px rgba(48,229,146,.72); filter: brightness(1.12); } }
@keyframes geierLoserAvatar { to { box-shadow: 0 0 0 3px #e75366, 0 0 14px rgba(221,62,82,.48); filter: grayscale(.22) brightness(.78); } }
@keyframes geierResultsIn { to { opacity: 1; transform: none; } }

@media (max-width: 900px) {
  /* einspaltig: keine Deckspalte links, also auch keine Reserve rechts. Der Zoom
     entfaellt hier ebenfalls - schmale Viewports haben den Platz nicht. */
  /* padding-inline, nicht nur padding-right: .geier-game-board ist selbst ein <main>
     und erbt damit `main { padding: 1.5rem 1.25rem 4rem }`. Die alte Regel setzte nur
     rechts auf 0, links blieben 20px stehen - der gesamte Inhalt des Spielfelds sass
     dadurch 10px zu weit rechts: Karten, Gleichstand-Box und Zuteilung gleichermassen
     (Eliass 03.09.2026, "nur ein paar Pixel, aber trotzdem nach rechts"). */
  .geier-game-board { padding-inline: 0; zoom: 1; }
  /* Auf dem Handy zaehlt zuerst das EIGENE Deck: es steht ganz oben, dort wo bisher die
     Teilnehmerliste stand, damit man beim Bieten immer vor Augen hat, was man baut
     (Eliass 02.09.2026). Die Decks der anderen bleiben unter dem Spielfeld - dass man
     die auf dem Handy schlechter im Blick hat, nimmt er bewusst in Kauf.
     Umgesetzt mit `display: contents`: das loest die Deckspalte auf, sodass eigenes Deck,
     Spielfeld und fremde Decks direkt Kinder desselben Rasters werden und sich per
     `order` frei anordnen lassen - ohne Umbau des Markups. Gefahrlos, weil die Spalte
     selbst weder Grund noch Rahmen noch Innenabstand hat, nur einen Abstand von 8px.
     Zwei Spalten, damit die fremden Decks unten zu zweit nebeneinander stehen; eigenes
     Deck und Spielfeld spannen ueber beide. */
  .geier-game-layout { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; }
  .geier-game-decks { display: contents; }
  .geier-live-deck, .geier-live-deck.own { width: 100%; }
  .geier-live-deck.own { order: 1; grid-column: 1 / -1; }
  .geier-game-board { order: 2; grid-column: 1 / -1; }
  .geier-live-deck:not(.own) { order: 3; }
  /* In der halbbreiten Kachel bleiben bei 320px rund 140px. Avatar und Elixier-Chip
     schrumpfen nicht, der Textblock hatte aber min-width: auto und konnte deshalb nicht
     nachgeben - ein langer, ungetrennter Name haette Name oder Elixierwert unter dem
     overflow: hidden der Kachel abgeschnitten. Jetzt gibt der Text nach und wird
     kontrolliert mit Auslassungspunkten gekuerzt. */
  .geier-live-deck > header { min-width: 0; }
  .geier-live-deck > header > div { min-width: 0; }
  .geier-live-deck > header strong {
    display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  }
  /* Wer schon gesetzt hat, steht nicht mehr oben. Eliass: "die wuerde ich sagen blenden
     wir erst mal komplett aus" - der Platz gehoert dem eigenen Deck. Wieder relevant
     wird das erst, wenn dort steht, wer welche Karte bekommen hat.
     Ausgeblendet werden nur die Chips, NICHT der Behaelter: derselbe Behaelter traegt in
     anderen Modi Inhalte, die man braucht - bei Mega Draft die Zugreihenfolge, bei Hard
     Core waehrend der Lotto-Aufloesung den betroffenen Spieler samt Grund. Eine Regel auf
     die ID haette beides mit ausgeblendet, und die Hard-Core-Regel mit display: flex
     haette wegen geringerer Spezifitaet nicht dagegen ankommen koennen. */
  .geier-game-statuses > .geier-game-player-status { display: none; }
  /* Ohne Chips soll der Behaelter keinen Abstand mehr aufspannen. Traegt er Inhalt eines
     anderen Modus, greift dessen eigene Regel und der Abstand kommt zurueck. */
  .geier-game-statuses:not(:has(> :not(.geier-game-player-status))) { margin-bottom: 0; }
  /* Imposter Royale braucht die Zeile als PLATZHALTER: geierImposterPlayReveal setzt sein
     Banner auf deren Mitte (statusesEl.offsetTop + offsetHeight / 2) und blendet sie
     danach nur unsichtbar, nicht aus dem Layout. Ohne reservierte Hoehe waere sie 0 hoch
     und das Banner rutschte an die Oberkante des Spielfelds. Der Wert bestimmt nur, wo
     das Banner sitzt - eine Zeile Chips ist rund so hoch. */
  .geier-game[data-kind="imposter-royale"] .geier-game-statuses { min-height: 44px; }

  .geier-duel { grid-template-columns: 100px minmax(0,1fr); padding-inline: 10px; }
  .geier-duel-card > img { width: 88px; }
}
@media (max-width: 560px) {
  /* Frueher stand hier `justify-content: flex-start` mit `min-width: 112px` - aus der
     Zeit, als die Kartenreihe seitlich scrollte. Beides steht der neuen Aufteilung im
     Weg: die feste Mindestbreite ueberstimmte die berechnete Spaltenbreite, sodass statt
     zwei Reihen zu vier Karten vier Reihen zu zwei entstanden, und linksbuendig widerspricht
     der Vorgabe, dass die Karten mittig stehen (Eliass 02.09.2026). */
  /* Die Ueberlagerung liegt absolut ueber dem GANZEN Spielabschnitt - gemessen 1687px
     hoch. Mittig hiess damit: Mitte des ABSCHNITTS, nicht des sichtbaren Bereichs. Der
     Block sass dadurch rund 700px unterhalb der Abschnittskante, auf dem Handy also
     unterhalb des Bildschirms (Eliass 02.09.2026: "das kann alles insgesamt ein bisschen
     hoeher").
     position: fixed hilft hier nicht - ein Vorfahr bildet einen eigenen Bezugsrahmen,
     gemessen blieb die Ueberlagerung dann 4678px hoch. Stattdessen oben ausrichten: der
     Countdown erscheint beim Rundenstart, und da steht die Seite ohnehin am Anfang des
     Abschnitts. 17vh nach dem ersten Versuch mit 10vh, der Eliass zu hoch war. */
  .geier-game-countdown { align-content: start; padding-top: 17vh; }
  /* Die Zuteilungskacheln waren 180px hoch und standen zu dritt - drei Reihen, gemessen
     573px (Eliass 03.09.2026: "viel zu gross und nimmt viel zu viel Platz ein"). Sie
     stehen jetzt in denselben Spalten wie die Karten beim Auswaehlen, also deckungs-
     gleich zum Pick, und deutlich flacher. */
  /* Nur Abstaende und Polster: die Spaltenzahl steckt bei zwei Reihen in der
     flex-basis der Kacheln (Regel zu data-tworow weiter oben), nicht in einer
     Rastervorgabe - ein grid-template-columns liefe hier ins Leere. */
  .geier-reveal-result-row { gap: 6px; padding: 6px 4px 8px; row-gap: 6px; }
  .geier-reveal-card-result { max-width: none; }
  .geier-reveal-card-art > img { max-height: 96px; }
  .geier-reveal-owner { margin-top: -13px; }
  .geier-reveal-owner .geier-avatar { width: 27px; height: 27px; border-width: 2px; }

  /* Die Gleichstand-Box lag mit der Zuteilung in DERSELBEN Rasterzelle und wurde von ihr
     auf 573px mitgedehnt - daher der viele ungenutzte Platz darin. Beide oben ausrichten
     statt dehnen, dann ist jede nur so hoch wie ihr Inhalt. */
  .geier-reveal-arena { min-height: 0; align-items: start; }
  .geier-duel-list, .geier-reveal-result-row { align-self: start; }
  .geier-duel { min-height: 0; padding: 10px 12px; }

  .geier-game-cards[data-mode="picking"] { min-height: 230px; }
  /* Die umkaempfte Karte MUSS sichtbar bleiben. Sie stand hier auf `display: none` und
     das Duell auf eine Spalte - aus der Zeit, als am Handy jede Breite gespart wurde.
     Damit sah man aber nur noch Saeulen und Namen und nicht mehr, WORUM gerade geboten
     oder gestritten wird; genau das ist der Inhalt der Box (Eliass 03.09.2026: "sehr
     kritisch"). Betrifft Geier Royale, Imposter Royale und - ueber dieselbe
     .geier-duel-Struktur - die Duell-Einblendung von Mega Draft: Hard Core.
     Schmale Kartenspalte wie am Desktop; die Saeulenreihe daneben scrollt bei vielen
     Bietern ohnehin in sich selbst (Regel weiter unten). */
  /* Zwei Zeilen statt zwei Spalten: Ueberschrift ueber die volle Breite der Box und
     mittig, darunter erst Karte und Diagramm nebeneinander. Vorher stand der Text in
     der rechten Spalte und damit sichtbar aus der Mitte geschoben (Eliass 03.09.2026).
     `display: contents` an der Kopie loest deren Kasten auf, sodass Kicker, Titel und
     Diagramm direkt im Raster der Box liegen - ohne Markup-Umbau. */
  .geier-duel {
    grid-template-columns: 74px minmax(0, 1fr);
    grid-template-areas: "kicker kicker" "titel titel" "karte chart";
    gap: 3px 12px; padding: 12px 11px 13px; align-items: center;
  }
  .geier-duel-copy { display: contents; }
  .geier-duel-copy > span { grid-area: kicker; text-align: center; }
  .geier-duel-copy > h4 { grid-area: titel; margin: 0; text-align: center; }
  /* Die Zahlen ueber den Saeulen klebten am Titel. Der Abstand haengt an beiden Feldern
     der unteren Zeile, damit Karte und Diagramm auf derselben Kante beginnen. */
  .geier-duel-chart { grid-area: chart; padding-top: 14px; }
  /* Die Karte laeuft ueber ALLE Zeilen der linken Spalte, nicht nur ueber die untere:
     so sitzt sie mittig in der ganzen Box statt mittig neben den Saeulen (Eliass
     03.09.2026). Die Ueberschrift darueber spannt zwar auch ueber diese Spalte, steht
     aber mittig auf der Box - beides ueberlagert sich also nicht. */
  .geier-duel-card { grid-column: 1; grid-row: 1 / -1; align-self: center; }
  .geier-duel-card > img { width: 68px; max-height: 104px; }
  .geier-duel-card > .geier-pick-fallback { width: 62px; height: 84px; }
  /* Kartennamen sind laenger als die Spalte breit ist ("Electro Wizard"): umbrechen
     lassen statt abschneiden, dafuer eine Spur kleiner und eng gesetzt. */
  .geier-duel-card strong { font-size: .56rem; line-height: 1.15; text-align: center; overflow-wrap: anywhere; }
  /* Bieten viele Spieler auf dieselbe Karte, ist die Saeulenreihe breiter als das Handy
     (acht Spalten a 52px plus Luecken passen in keine 390px). Vorher schnitt
     .geier-duel-list sie mit `overflow: clip` einfach ab - die aeusseren Bieter waren
     nicht mehr zu sehen. Die Reihe scrollt jetzt in sich selbst (Eliass 03.09.2026).
     `safe center` haelt sie zentriert, solange sie passt, verhindert aber, dass bei
     Ueberlauf der linke Rand hinter den Anfang des Scrollbereichs rutscht und
     unerreichbar wird. */
  .geier-duel-chart {
    justify-content: safe center;
    overflow-x: auto; overflow-y: hidden;
    -webkit-overflow-scrolling: touch; overscroll-behavior-x: contain;
    /* Der Balken war ausgeblendet - damit sieht niemand, DASS die Reihe noch weitergeht,
       und probiert die Wischgeste gar nicht erst (Eliass 03.09.2026). Jetzt duenn und
       dezent, aber vorhanden. */
    scrollbar-width: thin; scrollbar-color: rgba(140, 162, 214, .5) transparent;
  }
  .geier-duel-chart::-webkit-scrollbar { height: 4px; }
  .geier-duel-chart::-webkit-scrollbar-track { background: transparent; }
  .geier-duel-chart::-webkit-scrollbar-thumb { border-radius: 99px; background: rgba(140, 162, 214, .5); }
  /* 96px Mindestbreite liessen trotz vier berechneter Spalten nur drei Kacheln je Zeile
     zu - und damit eine Reihe mehr als beim Auswaehlen. Die Breite kommt jetzt allein
     aus --geier-per-row, sodass Zuteilung und Pick deckungsgleich liegen. */
  .geier-reveal-card-result { min-width: 0; }
}
/* Slower sequential reveal and final-control polish */
.geier-game-cards[data-mode="picking"] { min-height: 230px; }
.geier-game-cards[data-mode="picking"] .geier-pick-card { max-width: 154px; }
.geier-game-cards[data-mode="picking"] .geier-pick-art img { max-height: 210px; }
.geier-game-cards[data-mode="picking"] .geier-pick-fallback { min-height: 174px; }

.geier-duel-list { display: grid; }
.geier-duel {
  grid-area: 1 / 1; opacity: 0; transform: translateY(-8px) scale(.985);
  animation: geierDuelSequence 5.7s calc(var(--duel-index) * 5.7s) forwards;
}
.geier-duel-rise > .geier-avatar {
  transform: translateY(calc(var(--bid) * 13px));
  animation: geierAvatarRise 1.85s calc(var(--duel-index) * 5.7s + 1.3s + var(--order) * .09s) cubic-bezier(.2,.62,.28,1) forwards;
}
.geier-duel-bar { position: relative; background: transparent; }
/* Neutraler Balken steigt fuer ALLE Spalten gleich (Sieger wie Verlierer) auf - die
   Faerbung passiert erst danach ueber das Fill-Overlay, nicht am Balken selbst. */
.geier-duel-bar i,
.geier-duel-column.winner .geier-duel-bar i,
.geier-duel-column.loser .geier-duel-bar i {
  transform: scaleY(0);
  animation: geierBarRise 1.85s calc(var(--duel-index) * 5.7s + 1.3s + var(--order) * .09s) cubic-bezier(.2,.62,.28,1) forwards;
}
/* Zahlen frueh einblenden; das Hochzaehlen 0..Gebot uebernimmt updateGeierGameClock(). */
.geier-duel-number { animation: geierNumFade .3s calc(var(--duel-index) * 5.7s + 1.05s) both; }
/* Die Farbe der GANZEN Saeule erscheint gleichzeitig mit dem gefaerbten Kreis und blinkt
   dabei zweimal kurz auf (kein Runterfahren mehr). */
.geier-duel-fill {
  position: absolute; inset: 0; z-index: 2; border-radius: inherit; pointer-events: none; opacity: 0;
  background: linear-gradient(180deg, var(--fill-a, #62efaa), var(--fill-b, #12915c));
  box-shadow: 0 0 15px var(--fill-glow, rgba(54,228,144,.5)), inset 0 0 10px rgba(255,255,255,.18);
}
.geier-duel-column.winner .geier-duel-fill { --fill-a: #62efaa; --fill-b: #12915c; --fill-glow: rgba(54,228,144,.55); }
.geier-duel-column.loser .geier-duel-fill { --fill-a: #ff6f84; --fill-b: #d61f42; --fill-glow: rgba(255,60,91,.5); }
.geier-duel:not(.is-tie) .geier-duel-fill { animation: geierColorFlash .72s calc(var(--duel-index) * 5.7s + 3.2s) forwards; }
.geier-duel.is-tie .geier-duel-fill { animation: geierColorFlash .72s calc(var(--duel-index) * 5.7s + 3.9s) forwards; }
@keyframes geierNumFade { from { opacity: 0; } to { opacity: 1; } }
@keyframes geierColorFlash { 0% { opacity: 0; } 16% { opacity: 1; } 36% { opacity: .25; } 56% { opacity: 1; } 76% { opacity: .3; } 100% { opacity: 1; } }
.geier-duel.is-tie .geier-duel-column.top-bid .geier-duel-rise > .geier-avatar {
  animation: geierAvatarRise 1.85s calc(var(--duel-index) * 5.7s + 1.3s + var(--order) * .09s) cubic-bezier(.2,.62,.28,1) forwards,
    geierTieAccel .7s calc(var(--duel-index) * 5.7s + 3.2s),
    geierWinnerAvatar .32s calc(var(--duel-index) * 5.7s + 3.9s) forwards;
}
.geier-duel.is-tie .geier-duel-column.top-bid.loser .geier-duel-rise > .geier-avatar {
  animation: geierAvatarRise 1.85s calc(var(--duel-index) * 5.7s + 1.3s + var(--order) * .09s) cubic-bezier(.2,.62,.28,1) forwards,
    geierTieAccel .7s calc(var(--duel-index) * 5.7s + 3.2s),
    geierLoserAvatar .32s calc(var(--duel-index) * 5.7s + 3.9s) forwards;
}
.geier-duel:not(.is-tie) .geier-duel-column.winner .geier-duel-rise > .geier-avatar {
  animation: geierAvatarRise 1.85s calc(var(--duel-index) * 5.7s + 1.3s + var(--order) * .09s) cubic-bezier(.2,.62,.28,1) forwards,
    geierWinnerAvatar .32s calc(var(--duel-index) * 5.7s + 3.2s) forwards;
}
.geier-duel:not(.is-tie) .geier-duel-column.loser .geier-duel-rise > .geier-avatar {
  animation: geierAvatarRise 1.85s calc(var(--duel-index) * 5.7s + 1.3s + var(--order) * .09s) cubic-bezier(.2,.62,.28,1) forwards,
    geierLoserAvatar .32s calc(var(--duel-index) * 5.7s + 3.2s) forwards;
}
/* In einem Tie-Duell sind Spieler mit NIEDRIGEREM Gebot sichere Verlierer -> schon frueh
   (direkt nach dem Aufstieg, +3.2s) rot, nicht erst nach der Tie-Entscheidung. Nur die
   gleichauf hoechsten (top-bid) warten das beschleunigte Blinken ab. */
.geier-duel.is-tie .geier-duel-column.loser:not(.top-bid) .geier-duel-fill {
  animation: geierColorFlash .72s calc(var(--duel-index) * 5.7s + 3.2s) forwards;
}
.geier-duel.is-tie .geier-duel-column.loser:not(.top-bid) .geier-duel-rise > .geier-avatar {
  animation: geierAvatarRise 1.85s calc(var(--duel-index) * 5.7s + 1.3s + var(--order) * .09s) cubic-bezier(.2,.62,.28,1) forwards,
    geierLoserAvatar .32s calc(var(--duel-index) * 5.7s + 3.2s) forwards;
}
.geier-reveal-result-row {
  opacity: 0; transform: translateY(6px);
  animation: geierResultsIn .4s calc(var(--duel-count) * 5.7s) forwards;
}
.geier-reveal-arena.no-duels .geier-reveal-result-row { animation-delay: .08s; }
.geier-reveal-arena.settled .geier-duel-list { display: none; }
.geier-reveal-arena.settled .geier-reveal-result-row { opacity: 1; transform: none; animation: none !important; }
.geier-reveal-card-result.is-mine { position: relative; isolation: isolate; }
.geier-reveal-card-result.is-mine::before { display: none; }
.geier-reveal-card-result.is-mine .geier-reveal-owner .geier-avatar { border-color: #6ff0b4; box-shadow: 0 4px 12px rgba(0,0,0,.62), 0 0 0 2px rgba(70,232,157,.34), 0 0 18px rgba(42,220,141,.5); }
.geier-reveal-card-art { position: relative; isolation: isolate; }
.geier-reveal-card-art > img { position: relative; z-index: 1; }
/* Gleicher enger Laser-Umriss in Gruen fuer die eigene finale Gewinnerkarte. */
.geier-reveal-card-result.is-mine .geier-reveal-card-art > img { animation: geierGlowGreen 1.6s ease-in-out infinite; }
@keyframes geierGlowGreen {
  0%, 100% { filter: drop-shadow(0 0 1px #eafff5) drop-shadow(0 0 4px #4ff0a6) drop-shadow(0 0 8px rgba(52,220,140,.7)) drop-shadow(0 9px 8px rgba(0,0,0,.6)); }
  50%      { filter: drop-shadow(0 0 1px #ffffff) drop-shadow(0 0 6px #82ffca) drop-shadow(0 0 13px rgba(74,235,162,.95)) drop-shadow(0 9px 8px rgba(0,0,0,.6)); }
}

/* --- Imposter Royale: Reveal-Choreografie ----------------------------------- */
.geier-game[data-kind="imposter-royale"] .geier-game-progress > span { color: #ff6fae; }
.geier-reveal-arena { position: relative; }

/* Jagd-Phase: uebrige Karten abdunkeln, die aktuell gescannte tritt hervor. */
.geier-reveal-arena.imposter-hunting .geier-reveal-card-result {
  transition: filter .25s ease, opacity .25s ease, transform .18s ease;
  filter: brightness(.6) saturate(.78);
}
.geier-reveal-arena.imposter-hunting .geier-reveal-card-result.imposter-scan {
  filter: none; transform: translateY(-4px) scale(1.05); z-index: 4;
}
.geier-reveal-card-result.imposter-scan .geier-reveal-card-art > img {
  filter: drop-shadow(0 0 2px #fff) drop-shadow(0 0 10px #ff5fae) drop-shadow(0 0 20px rgba(255,70,150,.8)) drop-shadow(0 9px 8px rgba(0,0,0,.6));
}

/* Entlarvung: harter Shake. */
.geier-reveal-card-result.imposter-scan,
.geier-reveal-card-result.imposter-shaking,
.geier-reveal-card-result.imposter-revealed { position: relative; }
.geier-reveal-card-result.imposter-shaking { animation: imposterShake .5s cubic-bezier(.36,.07,.19,.97) infinite; z-index: 5; }
.geier-reveal-card-result.imposter-shaking .geier-reveal-card-art > img {
  filter: drop-shadow(0 0 3px #fff) drop-shadow(0 0 14px #ff3f9a) drop-shadow(0 0 26px rgba(255,50,140,.95)) drop-shadow(0 9px 8px rgba(0,0,0,.6));
}
@keyframes imposterShake {
  0%, 100% { transform: translate(0,0) rotate(0deg); }
  15% { transform: translate(-3px, 1px) rotate(-3deg); }
  30% { transform: translate(3px, -1px) rotate(3deg); }
  45% { transform: translate(-4px, 0) rotate(-4deg) scale(1.03); }
  60% { transform: translate(4px, 1px) rotate(4deg) scale(1.03); }
  75% { transform: translate(-2px, -1px) rotate(-2deg); }
  90% { transform: translate(2px, 0) rotate(2deg); }
}

/* Enthuellte Imposter-Karte: Pop + dauerhaftes pinkes Glow + Badge. */
.geier-reveal-card-result.imposter-revealed { filter: none !important; animation: imposterRevealPop .55s cubic-bezier(.2,1.4,.5,1) both; z-index: 6; }
.geier-reveal-card-result.imposter-revealed .geier-reveal-card-art > img { animation: imposterGlow 1.5s ease-in-out infinite; }
.geier-reveal-card-result.imposter-revealed .geier-reveal-owner b { color: #ff9dcb; }
@keyframes imposterRevealPop { 0% { transform: scale(.72) rotate(-6deg); } 60% { transform: scale(1.12) rotate(2deg); } 100% { transform: scale(1) rotate(0); } }
@keyframes imposterGlow {
  0%,100% { filter: drop-shadow(0 0 2px #fff) drop-shadow(0 0 8px #ff5fae) drop-shadow(0 0 16px rgba(255,70,150,.7)) drop-shadow(0 9px 8px rgba(0,0,0,.6)); }
  50%     { filter: drop-shadow(0 0 3px #fff) drop-shadow(0 0 13px #ff86c4) drop-shadow(0 0 26px rgba(255,90,170,.95)) drop-shadow(0 9px 8px rgba(0,0,0,.6)); }
}

/* "WHO'S THE IMPOSTER?"-Banner: sitzt auf Hoehe der Spieler-Statuszeile (top wird per JS
   gesetzt) und ersetzt sie fuer den Moment. */
.geier-game-board { position: relative; }
/* Spieler-Statuszeile waehrend der Imposter-Jagd ausblenden (Platz bleibt erhalten). */
.geier-game-statuses { transition: opacity .25s ease; }
.geier-game-board.imposter-hunting .geier-game-statuses { opacity: 0; visibility: hidden; }
.geier-imposter-banner {
  position: absolute; left: 50%; top: 0; transform: translate(-50%, calc(-50% - 8px)); z-index: 9;
  display: flex; flex-direction: column; align-items: center; gap: 3px;
  padding: 8px 24px; border-radius: 16px; pointer-events: none; opacity: 0; text-align: center;
  background: linear-gradient(180deg, rgba(34,8,24,.96), rgba(20,4,14,.96)); border: 2px solid #ff5fae;
  box-shadow: 0 10px 28px rgba(0,0,0,.55), 0 0 24px rgba(255,80,160,.5);
  transition: opacity .28s ease, transform .28s ease;
}
.geier-imposter-banner.show { opacity: 1; transform: translate(-50%, -50%); }
.geier-imposter-q {
  display: block; color: #ffd7ec; font-family: "Inter", system-ui, sans-serif;
  font-size: clamp(.9rem, 1.7vw, 1.3rem); font-weight: 900; letter-spacing: .06em;
  text-shadow: 0 2px 8px rgba(0,0,0,.85); animation: imposterBannerPulse 1s ease-in-out infinite;
}
/* Zweite-Imposter-Warnung (nur Doppelrunde, per .warn eingeblendet). */
.geier-imposter-warn {
  display: none; color: #ffcadf; font-family: "Inter", system-ui, sans-serif;
  font-size: clamp(.6rem, 1vw, .74rem); font-weight: 850; letter-spacing: .08em;
  text-shadow: 0 1px 5px rgba(0,0,0,.85);
}
.geier-imposter-banner.warn { border-color: #ff2f8e; }
.geier-imposter-banner.warn .geier-imposter-warn { display: block; animation: imposterWarnIn .35s ease both, imposterBannerPulse .7s ease-in-out infinite .35s; }
.geier-imposter-banner.locking { border-color: #ff2f8e; box-shadow: 0 10px 28px rgba(0,0,0,.6), 0 0 34px rgba(255,60,150,.85); }
.geier-imposter-banner.locking .geier-imposter-q { animation: none; color: #ff5fae; }
@keyframes imposterBannerPulse { 0%,100% { opacity: .82; transform: scale(1); } 50% { opacity: 1; transform: scale(1.045); } }
@keyframes imposterWarnIn { from { opacity: 0; transform: translateY(4px); } }

/* Mehr Luft zwischen der Spieler-Statuszeile und dem Reveal (u.a. dem Duell-Saeulendiagramm). */
.geier-game[data-kind="imposter-royale"][data-phase="reveal"] .geier-game-statuses,
.geier-game[data-kind="imposter-royale"][data-phase="intermission"] .geier-game-statuses { margin-bottom: 30px; }

@media (prefers-reduced-motion: reduce) {
  .geier-reveal-card-result.imposter-shaking { animation: none; }
  .geier-reveal-card-result.imposter-revealed { animation: none; }
  .geier-reveal-card-result.imposter-revealed .geier-reveal-card-art > img { animation: none; }
  .geier-imposter-q { animation: none; }
  .geier-imposter-banner.warn .geier-imposter-warn { animation: none; }
}
@keyframes geierDuelSequence {
  0%, 92% { opacity: 1; transform: none; }
  100% { opacity: 0; transform: translateY(7px) scale(.985); }
}
@keyframes geierLoserBar { to { background: linear-gradient(180deg,#ff6b7e,#da2948); box-shadow: 0 0 18px rgba(255,60,91,.66); opacity: .96; } }
@keyframes geierLoserAvatar { to { box-shadow: 0 0 0 3px #ff526c, 0 0 20px rgba(255,55,88,.72); filter: brightness(.96) saturate(1.18); } }

.geier-game-bids { gap: 8px; }
/* Gebote sind Elixier-Tropfen: dasselbe Bild wie in den Elixier-Chips, die Zahl in der
   Clash-Schrift darauf. Kein eigener Button-Hintergrund mehr - der Tropfen IST der Button. */
.geier-game-bids button {
  position: relative; overflow: visible;
  display: grid; place-items: center;
  width: 54px; height: 54px; padding: 0;
  border: 0; border-radius: 50%; background: none; box-shadow: none;
  transition: transform .22s cubic-bezier(.34,1.56,.64,1), filter .2s ease;
}
.geier-game-bids button:hover { background: none; } /* globales button:hover-Blau neutralisieren */
.geier-bid-drop {
  position: absolute; inset: 0; width: 100%; height: 100%; object-fit: contain;
  filter: drop-shadow(0 3px 5px rgba(0, 0, 0, .5));
  transition: filter .2s ease;
}
.geier-game-bids button span {
  position: relative; z-index: 1;
  font-family: "Clash Display", sans-serif; font-size: 1.24rem; font-weight: 700; line-height: 1;
  color: #fff; text-shadow: 0 1px 0 rgba(58, 12, 66, .9), 0 2px 5px rgba(0, 0, 0, .62);
}
.geier-game-bids button:not(:disabled):hover { transform: translateY(-3px) scale(1.06); }
.geier-game-bids button.selected { transform: translateY(-3px) scale(1.12); }
.geier-game-bids button.selected .geier-bid-drop {
  filter: drop-shadow(0 0 9px rgba(233, 120, 255, .8)) drop-shadow(0 3px 5px rgba(0, 0, 0, .5));
}
/* verbrauchtes Gebot: ausgegraut. Nur .used - waehrend Reveal ist alles disabled, das
   soll aber nicht wie verbraucht wirken, sondern nur gedaempft. */
.geier-game-bids button.used { cursor: not-allowed; }
.geier-game-bids button.used .geier-bid-drop { filter: grayscale(1) brightness(.48) drop-shadow(0 2px 4px rgba(0, 0, 0, .45)); }
.geier-game-bids button.used span { color: #97a0b1; text-shadow: 0 1px 3px rgba(0, 0, 0, .7); }
.geier-game-bids button:disabled:not(.used):not(.selected) { opacity: .72; }
/* muss NACH dem Block oben stehen, sonst gewinnt die Desktop-Groesse (gleiche Spezifitaet) */
@media (max-width: 560px) {
  .geier-game-bids button { width: 46px; height: 46px; }
  .geier-game-bids button span { font-size: 1.06rem; }
  /* Zwei Viererreihen statt eines beliebigen Umbruchs. Acht Tropfen zu 46px brauchen
     mit den Luecken 417px und brachen deshalb 6+2 - der einzelne Achter in der zweiten
     Reihe sah aus wie ein Fehler (Eliass 02.09.2026). Alle acht nebeneinander waeren nur
     um den Preis von rund 39px je Tropfen zu haben, das ist als Tippziel zu klein.
     Es sind immer genau acht Gebote, die Vierteilung geht also stets glatt auf. */
  .geier-game-bids { display: grid; grid-template-columns: repeat(4, auto); justify-content: center; }
}
.geier-game-cards[data-mode="picking"] .geier-pick-card.selected,
.geier-game-cards[data-mode="picking"] .geier-pick-card.selected:not(:disabled):hover {
  transform: translateY(-7px) scale(1.035); filter: none; box-shadow: none;
}
.geier-game-cards[data-mode="picking"] .geier-pick-card.selected .geier-pick-art::before,
.geier-game-cards[data-mode="picking"] .geier-pick-card.selected:not(:disabled):hover .geier-pick-art::before {
  inset: 9% 8% 5%; opacity: 1; background: radial-gradient(ellipse, rgba(0,0,0,.76), rgba(0,0,0,.24) 58%, transparent 74%);
  filter: blur(9px); transform: translateY(8px); animation: none;
}
/* Auswahl-Glow: enger, heller Laser-Umriss direkt an der Kartenkontur (folgt der
   Alpha-Silhouette jeder Kartenform), leichtes Pulsieren - keine wandernde Box. */
.geier-game-cards[data-mode="picking"] .geier-pick-card.selected .geier-pick-art img,
.geier-game-cards[data-mode="picking"] .geier-pick-card.selected:not(:disabled):hover .geier-pick-art img {
  position: relative; z-index: 1; transform: translateZ(0);
  animation: geierGlowBlue 1.5s ease-in-out infinite;
}
/* ---- Mega Draft: offenes Kartenraster ---------------------------------- */
/* Spaltenzahl kommt vom Server (megaDraftGrid), damit das Raster immer rechteckig
   bleibt und nie hochkant kippt. */
/* Kompakt halten: die Zellbreite ist gedeckelt, damit auch 96 Karten ohne Scrollen
   auf den Schirm passen. Bleibt Platz uebrig, wird das Raster zentriert. */
.geier-game-cards[data-mode="draft"] {
  position: relative;
  display: grid; grid-template-columns: repeat(var(--draft-columns, 8), minmax(0, 1fr)); gap: 5px;
  width: 100%; max-width: calc(var(--draft-columns, 8) * 68px); margin-inline: auto;
}
/* Beleuchteter Orb hinter den Karten - erscheint nur, wenn man selbst am Zug ist.
   Farben aus dem Schimmer der Deckboxen (#587cff -> #bd71f0), damit es zum Rest passt. */
.geier-game-cards[data-mode="draft"]::before {
  content: ""; position: absolute; inset: -14% -8%; pointer-events: none; border-radius: 50%;
  background:
    radial-gradient(58% 68% at 27% 42%, rgba(88, 124, 255, .34), transparent 70%),
    radial-gradient(56% 66% at 73% 58%, rgba(189, 113, 240, .30), transparent 72%);
  filter: blur(44px);
  opacity: 0; transition: opacity .55s ease;
}
.geier-game-cards[data-mode="draft"][data-turn="true"]::before {
  opacity: 1; animation: geierDraftOrb 3.6s ease-in-out infinite;
}
/* Nur die Deckkraft animieren. Ein mitskaliertes Element mit blur(44px) muesste den
   Weichzeichner in JEDEM Frame neu rechnen - das war unnoetig teuer. */
@keyframes geierDraftOrb {
  0%, 100% { opacity: .7; }
  50%      { opacity: 1; }
}
.geier-draft-card {
  position: relative; display: grid; place-items: center; padding: 0;
  border: 0; border-radius: 8px; background: none; cursor: default;
  transition: transform .18s cubic-bezier(.34,1.4,.64,1), filter .2s ease, opacity .2s ease;
}
.geier-draft-art { display: block; width: 100%; }
.geier-draft-card img { display: block; width: 100%; height: auto; max-height: 82px; object-fit: contain; filter: drop-shadow(0 3px 5px rgba(0,0,0,.5)); }
.geier-draft-card:hover { background: none; }
/* Verfuegbare Karte, wenn man am Zug ist. Gestapelte drop-shadows sind hier teuer:
   jeder Filter rastert die Alpha-Silhouette neu, bei bis zu 96 Karten wird das spuerbar.
   Deshalb im Grundzustand KEIN zusaetzlicher Glow - das Signal kommt vom Orb dahinter
   und von der Reihenfolge-Leiste. Beim Hover reicht ein einzelner enger Schein. */
.geier-draft-card.pickable { cursor: pointer; }
/* Hover: ein einzelner enger drop-shadow statt vier gestapelter, dazu brightness -
   das ist deutlich guenstiger und wirkt trotzdem wie eine helle Kontur. */
.geier-draft-card.pickable:hover { transform: translateY(-2.4px) scale(1.036); z-index: 2; }
.geier-draft-card.pickable:hover img { filter: drop-shadow(0 0 2px #9fdcff) brightness(1.14); }
/* Bereits gedraftet: ausgegraut. Wer die Karte hat, steht in den Decks links - auf der
   Karte selbst braucht es kein Besitzer-Icon. */
.geier-draft-card.taken img { filter: grayscale(1) brightness(.42); }
.geier-draft-card.taken { opacity: .78; }
.geier-draft-card.deck-rule-locked img { filter: grayscale(1) brightness(.38); }
.geier-draft-card.deck-rule-locked { cursor: not-allowed; opacity: .52; }
/* Gerade gepickt: kurz gross werden, wegploppen und ausgegraut zurueckkommen.
   Die Dauer muss unter MEGA_DRAFT_HANDOVER_MS (1400 ms) bleiben. */
.geier-draft-card.just-picked { z-index: 3; }
.geier-draft-card.just-picked img { animation: geierDraftPicked 1.15s cubic-bezier(.3,.8,.4,1) 1; }
/* Nach einem Timeout erst den Hinweis zeigen, dann die Karte ziehen. */
.geier-draft-card.just-picked.after-timeout img { animation-delay: 1.1s; }
@keyframes geierDraftPicked {
  0%   { opacity: 1; transform: scale(1);    filter: drop-shadow(0 3px 5px rgba(0,0,0,.5)); }
  22%  { opacity: 1; transform: scale(1.34); filter: drop-shadow(0 0 3px #bfe6ff) drop-shadow(0 0 8px rgba(92,180,255,.9)); }
  46%  { opacity: 0; transform: scale(.46);  filter: drop-shadow(0 0 6px rgba(92,180,255,.7)); }
  47%  { opacity: 0; transform: scale(.82);  filter: grayscale(1) brightness(.42); }
  100% { opacity: 1; transform: scale(1);    filter: grayscale(1) brightness(.42); }
}
/* Timeout: kurz abdunkeln, TIMEOUT! in Rot, dann verschwindet beides und die
   zufaellig gezogene Karte laeuft ihre Pop-Animation (siehe .after-timeout). */
.geier-draft-timeout {
  position: absolute; inset: -10px -14px; z-index: 4; display: grid; place-items: center;
  pointer-events: none; border-radius: 14px;
  background: rgba(6, 10, 18, .74);
  animation: geierDraftTimeoutVeil 1.35s ease-out forwards;
}
.geier-draft-timeout span {
  color: #ff5f68; font-family: "Clash Display", sans-serif; font-size: 2.3rem; line-height: 1;
  letter-spacing: .06em; text-transform: uppercase; text-shadow: 0 3px 10px rgba(0, 0, 0, .7);
  animation: geierDraftTimeoutText 1.35s cubic-bezier(.2,.9,.3,1.15) forwards;
}
@keyframes geierDraftTimeoutVeil {
  0%   { opacity: 0; }
  18%  { opacity: 1; }
  74%  { opacity: 1; }
  100% { opacity: 0; }
}
@keyframes geierDraftTimeoutText {
  0%   { opacity: 0; transform: scale(.82); }
  22%  { opacity: 1; transform: scale(1.06); }
  32%  { opacity: 1; transform: scale(1); }
  74%  { opacity: 1; transform: scale(1); }
  100% { opacity: 0; transform: scale(.94); }
}

/* Feste Zugreihenfolge ueber dem Raster - der Spieler am Zug ist aktiv umrahmt. */
.geier-game[data-kind="mega-draft"] .geier-game-statuses { gap: 8px; margin-bottom: 22px; }
.geier-draft-turn {
  display: inline-flex; align-items: center; gap: 6px; padding: 4px 11px 4px 4px;
  border: 1px solid #26324a; border-radius: 99px; background: #0e1626;
  color: #8f9db5; font-size: .64rem; font-weight: 800; opacity: .55;
  transition: opacity .2s ease, border-color .2s ease, background .2s ease, box-shadow .2s ease;
}
.geier-draft-turn .geier-avatar { width: 22px; height: 22px; }
.geier-draft-turn.done { opacity: .3; }
.geier-draft-turn.now {
  border-color: rgba(126, 162, 255, .7); background: #16233a; color: #dbe6ff; opacity: 1;
  box-shadow: 0 0 0 1px rgba(126, 162, 255, .3), 0 0 14px rgba(91, 140, 255, .32);
}
/* Statuszeile unter dem Raster in der Typo der Room-Buttons, mit Abstand nach oben. */
.geier-game[data-kind="mega-draft"] .geier-game-message {
  margin-top: 26px; color: #75849e; font-size: .74rem; font-weight: 900; letter-spacing: .09em; text-transform: uppercase;
}
/* ---- Intro vor dem Start: Typ -> Sitzfolge -> Countdown ------------------ */
.geier-draft-intro { display: grid; justify-items: center; gap: 6px; }
.geier-draft-intro-type { display: grid; justify-items: center; gap: 4px; transition: transform .45s cubic-bezier(.2,.8,.2,1), opacity .35s ease; }
.geier-draft-intro-type span { color: #b9aadf; font-size: .8rem; font-weight: 900; letter-spacing: .17em; text-transform: uppercase; }
.geier-draft-intro-type strong { color: #fff; font-family: "Clash Display", sans-serif; font-size: clamp(2.8rem, 7vw, 4.6rem); line-height: 1.02; letter-spacing: .04em; text-transform: uppercase; text-shadow: 0 0 30px rgba(123,91,239,.7); }
.geier-draft-intro[data-stage="type"] .geier-draft-intro-type { animation: geierDraftTypeIn .4s ease-out both; }
/* Abschnitt 2: der Typ rueckt nach oben und wird kleiner, die Sitzfolge erscheint. */
.geier-draft-intro[data-stage="order"] .geier-draft-intro-type strong { font-size: clamp(1.5rem, 3vw, 2rem); }
.geier-draft-intro[data-stage="go"] .geier-draft-intro-type,
.geier-draft-intro[data-stage="type"] .geier-draft-roll,
.geier-draft-intro[data-stage="go"] .geier-draft-roll,
.geier-draft-intro[data-stage="type"] .geier-draft-go,
.geier-draft-intro[data-stage="order"] .geier-draft-go { display: none; }
/* Abschnitt 3: Countdown mit dem Modus-Artwork - bewusst so gross wie bei Geier Royale. */
.geier-draft-go { display: grid; justify-items: center; gap: 2px; animation: geierDraftTypeIn .3s ease-out both; }
.geier-draft-go img {
  width: min(340px, 60vw); max-height: 285px; height: auto; object-fit: contain;
  filter: drop-shadow(0 0 38px rgba(119, 78, 220, .35));
  animation: geierCountdownFloat 1.2s ease-in-out infinite alternate;
}
#geier-draft-roll-number { color: #ffd166; font-family: "Clash Display", sans-serif; font-size: clamp(3.4rem, 9vw, 6rem); line-height: .95; letter-spacing: .04em; text-shadow: 0 0 30px rgba(123, 91, 239, .6); }
@keyframes geierDraftTypeIn {
  from { opacity: 0; transform: scale(.94); }
  to   { opacity: 1; transform: none; }
}

/* Auswuerfeln der Reihenfolge vor dem Start */
.geier-draft-roll { display: flex; flex-wrap: wrap; justify-content: center; gap: 8px; margin-top: 6px; }
.geier-draft-roll-seat {
  display: inline-flex; align-items: center; gap: 9px; padding: 7px 16px 7px 7px;
  border: 1px solid #2c3a52; border-radius: 99px; background: #131d2c; color: #dbe6ff; font-size: .86rem; font-weight: 800;
  /* ruhig einblenden statt federn - die Staffelung allein zeigt die Reihenfolge */
  animation: geierDraftSeatIn .3s ease-out both;
  animation-delay: calc(var(--seat) * .3s);
}
.geier-draft-roll-seat .geier-avatar { width: 34px; height: 34px; }
@keyframes geierDraftSeatIn {
  from { opacity: 0; transform: scale(.92); }
  to   { opacity: 1; transform: none; }
}
@media (max-width: 560px) {
  .geier-game-cards[data-mode="draft"] { gap: 4px; max-width: 100%; }
  .geier-draft-card img { max-height: 58px; }
  .geier-draft-owner .geier-avatar { width: 16px; height: 16px; }
}
@media (prefers-reduced-motion: reduce) {
  .geier-draft-roll-seat,
  .geier-draft-go,
  .geier-draft-go img,
  .geier-draft-card.just-picked img,
  .geier-draft-timeout span,
  .geier-game-cards[data-mode="draft"][data-turn="true"]::before,
  .geier-draft-intro[data-stage="type"] .geier-draft-intro-type { animation: none; }
}

/* ---------- Mega Draft: Hard Core ----------
   Rechte Spalte mit PICK/BLOCK und der Übersicht, wer was belegt hat. Die Leiste
   nutzt das Panel-Design der Deckboxen (siehe --panel-* in :root). */
.geier-game[data-kind="mega-draft-hardcore"] .geier-game-layout {
  grid-template-columns: 310px minmax(0, 1fr) 236px;
}
/* Die Reserve rechts weicht der echten Spalte - sonst rutscht das Raster aus der Mitte. */
.geier-game[data-kind="mega-draft-hardcore"] .geier-game-board { padding-right: 0; }

.geier-hc-side {
  position: relative; overflow: hidden;
  display: grid; gap: 12px; align-content: start; padding: 11px 10px 12px;
  border: 1px solid var(--panel-border); border-radius: var(--panel-radius);
  background: var(--panel-bg); box-shadow: var(--panel-shadow); color: var(--panel-text);
}
.geier-hc-side::before {
  content: ""; position: absolute; top: 0; left: 10%; right: 10%; height: 1px;
  background: var(--panel-line); box-shadow: var(--panel-line-glow); pointer-events: none;
}

/* Moduswechsel: zwei große Schalter untereinander, immer genau einer aktiv. */
.geier-hc-modes { display: grid; gap: 8px; }
.geier-hc-mode {
  display: flex; align-items: center; justify-content: center; gap: 8px; padding: 9px 10px; cursor: pointer;
  border: 1px solid rgba(123, 145, 216, 0.28); border-radius: 7px;
  background: var(--panel-inset); color: var(--panel-muted);
  font-family: "Clash Display", "Inter", sans-serif; text-align: left;
  transition: border-color .16s ease, color .16s ease, box-shadow .16s ease, background .16s ease;
}
.geier-hc-mode:hover:not(:disabled) { border-color: rgba(139, 166, 255, 0.5); color: var(--panel-text); }
.geier-hc-mode:disabled { opacity: .45; cursor: default; }
.geier-hc-mode-icon {
  width: 24px; height: 24px; flex: none; object-fit: contain;
  filter: drop-shadow(0 1px 2px rgba(0, 0, 0, .55)); opacity: .82;
  transition: opacity .16s ease, transform .16s ease;
}
.geier-hc-mode.active .geier-hc-mode-icon { opacity: 1; transform: scale(1.06); }
/* Die Breite kommt aus --geier-hc-label-w: geierHcSyncLabelWidth() misst das laengere
   der beiden Woerter und setzt sie fuer beide. Damit steht die Karte in PICK und BLOCK
   auf derselben Hoehe, ohne dass irgendwo eine feste Zahl fuer "PICK"/"BLOCK" steht -
   in einer anderen Sprache sind die Woerter anders lang (Eliass 03.09.2026). Vorher
   stand hier `flex: 1`: das Wort wurde auf die volle Restbreite gedehnt und die Karte
   ans andere Ende geschoben - daher die grosse Luecke dazwischen. */
.geier-hc-mode-label {
  flex: none; width: var(--geier-hc-label-w, auto);
  font-size: .82rem; font-weight: 900; letter-spacing: .1em;
}
/* Rechts im Schalter die gewaehlte Karte. Feste Spur, damit beide Schalter gleich breit
   bleiben, ob eine Karte gewaehlt ist oder nur der Strich steht. */
.geier-hc-mode-card {
  flex: none; width: 26px; height: 30px; display: flex; align-items: center; justify-content: center;
  color: var(--panel-dim); font-size: .63rem; font-weight: 600;
}
/* max- statt width/height 100%: eine Karte ist hochkant (285x420). Mit `height: 100%`
   behielt sie ihr Seitenverhaeltnis aus der Breite, wurde damit hoeher als ihr Kasten
   und hing unten heraus - sie sass sichtbar zu tief (Eliass 03.09.2026). */
.geier-hc-mode-card img { display: block; max-width: 100%; max-height: 100%; width: auto; height: auto; }
.geier-hc-mode-card .geier-pick-fallback { min-height: 0; border-radius: 4px; font-size: .55rem; }
/* Aktiver Modus: PICK blau wie der Auswahl-Glow, BLOCK rot wie die Sperre. */
.geier-hc-mode.active[data-hc-mode="pick"] {
  border-color: #5b8cff; color: #eaf1ff;
  background: linear-gradient(135deg, rgba(46, 78, 176, .58), rgba(20, 28, 52, .72));
  box-shadow: inset 0 0 16px rgba(91, 140, 255, .16);
}
.geier-hc-mode.active[data-hc-mode="block"] {
  border-color: #ff5f7a; color: #ffeef1;
  background: linear-gradient(135deg, rgba(150, 34, 58, .55), rgba(38, 18, 26, .72));
  box-shadow: inset 0 0 16px rgba(255, 95, 122, .16);
}
.geier-hc-mode.active .geier-hc-mode-card { color: rgba(255, 255, 255, .78); }

/* Spielerliste: Blockpunkte offen, darunter Pick und Block der letzten Auflösung. */
.geier-hc-board { display: grid; gap: 7px; }
.geier-hc-player {
  display: grid; gap: 6px; padding: 7px 8px;
  border: 1px solid var(--panel-inset-border); border-radius: 7px;
  background: rgba(8, 11, 19, .46);
}
.geier-hc-player.is-me { border-color: rgba(116, 115, 255, .48); background: rgba(28, 33, 68, .5); }
.geier-hc-player.locked { box-shadow: inset 0 0 12px rgba(43, 212, 129, .1); }
.geier-hc-player > header { display: flex; align-items: center; gap: 6px; min-width: 0; }
.geier-hc-player .geier-avatar { width: 21px; height: 21px; flex: none; }
.geier-hc-player b {
  overflow: hidden; color: #e6ecfb; font-size: .68rem; font-weight: 700;
  text-overflow: ellipsis; white-space: nowrap;
}
/* Feste Breite statt mitwachsender Pille: die Plakette ist bei jedem Spieler gleich
   breit, damit die Zahlen in der Spielerliste untereinander auf einer Kante stehen. Die
   Breite fasst den laengsten realen Inhalt "99+5" (Punktestand plus Aenderung). Runde
   Ecken nur angedeutet, laenglich statt Kreis (Eliass 03.09.2026). Zentriert wird auf
   BEIDEN Achsen ueber place-content plus feste Hoehe und line-height: 1 - sonst zieht
   die Schriftgrundlinie die Zahl optisch nach unten. */
.geier-hc-points {
  display: inline-flex; place-content: center; align-items: center; gap: 2px;
  margin-left: auto; flex: none;
  width: 47px; height: 19px; padding: 0;
  border: 1px solid rgba(244, 190, 76, .4); border-radius: 4px;
  background: rgba(70, 52, 12, .5); color: #ffd06a;
  font-family: "Clash Display", "Inter", sans-serif; font-size: .68rem; font-weight: 900;
  /* line-height AUF die Innenhoehe (19px minus 2px Rahmen), nicht auf 1: Zahl und
     Aenderung sind unterschiedlich gross, mit line-height: 1 ist jede nur in ihrer
     eigenen, verschieden hohen Zeilenbox zentriert - sobald ab Runde 2 beide
     nebeneinander stehen, sitzt die Zahl sichtbar zu hoch (Eliass 03.09.2026). Eine
     gemeinsame Zeilenhoehe gibt beiden dieselbe Box. */
  line-height: 17px; font-variant-numeric: tabular-nums;
}
.geier-hc-delta { font-size: .58rem; font-style: normal; line-height: inherit; }
.geier-hc-delta.up { color: #62e2a0; }
.geier-hc-delta.down { color: #ff7d92; }
.geier-hc-choice { display: grid; grid-template-columns: 1fr 1fr; gap: 6px; }
.geier-hc-thumb, .geier-hc-slot-empty {
  position: relative; display: grid; place-items: center; min-height: 42px;
  border: 1px solid transparent; border-radius: 6px; background: rgba(4, 6, 12, .5);
  color: var(--panel-dim); font-size: .7rem;
}
/* Frueher trug die Miniatur einen kraeftigen blauen (Pick) bzw. roten (Block) Rahmen.
   Der kostete Platz, sah schwer aus und wiederholte nur, was die Icons ohnehin sagen
   (Eliass 03.09.2026). Jetzt ohne Rahmen, dafuer dasselbe Haken-/Kreuz-Icon wie auf den
   Karten im Raster - klein in der Ecke. */
/* Beide Marken sitzen an der LINKEN oberen Ecke ihrer eigenen Miniatur. Rechts gesetzt
   klebte der Haken der Pick-Miniatur in der Luecke unmittelbar vor der Block-Miniatur
   und sah aus, als gehoere er zu dieser. */
.geier-hc-mark {
  position: absolute; left: -4px; top: -4px; z-index: 2;
  width: 15px; height: 15px;
  background: center / contain no-repeat;
  filter: drop-shadow(0 1px 2px rgba(0, 0, 0, .7));
}
.geier-hc-thumb[data-kind="pick"] .geier-hc-mark { background-image: url("assets/icons/status/active.png"); }
.geier-hc-thumb[data-kind="block"] .geier-hc-mark { background-image: url("assets/icons/status/inactive.png"); }
.geier-hc-thumb img { display: block; width: 100%; max-height: 38px; object-fit: contain; }
.geier-hc-thumb[data-kind="block"] img { filter: grayscale(.7) brightness(.8); }

/* --- Karten im Raster --- */
/* Pick glowt grün, Block rot - farblich passend zum Haken/Kreuz. Der Glow greift
   auch im Hover-Zustand (Augment-Glow schlägt den generischen Hover-Glow). */
.geier-hc-card.is-pick img,
.geier-hc-card.is-pick.pickable:hover img {
  filter: drop-shadow(0 0 2px #eaffef) drop-shadow(0 0 9px #46e08a) drop-shadow(0 3px 5px rgba(0,0,0,.5));
}
.geier-hc-card.is-block img,
.geier-hc-card.is-block.pickable:hover img {
  filter: drop-shadow(0 0 2px #ffe3e8) drop-shadow(0 0 9px #ff5f7a) drop-shadow(0 3px 5px rgba(0,0,0,.5));
}
.geier-hc-card.is-pick.pickable:hover img { filter: drop-shadow(0 0 3px #eaffef) drop-shadow(0 0 11px #5cf0a0) brightness(1.08) drop-shadow(0 3px 5px rgba(0,0,0,.5)); }
.geier-hc-card.is-block.pickable:hover img { filter: drop-shadow(0 0 3px #ffe3e8) drop-shadow(0 0 11px #ff7d92) brightness(1.08) drop-shadow(0 3px 5px rgba(0,0,0,.5)); }
/* Eindeutiges Symbol mittig auf der gewählten Karte: Haken = Pick, Kreuz = Block,
   Schloss = für diese Iteration gesperrt. Skaliert leicht ein (kein Fehlgriff). */
.geier-hc-badge {
  position: absolute; inset: 0; z-index: 3; pointer-events: none;
  background-repeat: no-repeat; background-position: center;
  background-size: 60% auto;
  opacity: 0; transform: scale(.55);
  filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .6));
  transition: opacity .15s ease, transform .2s cubic-bezier(.34, 1.5, .6, 1);
}
.geier-hc-card.is-pick .geier-hc-badge {
  background-image: url("assets/icons/status/active.png");
  opacity: 1; transform: scale(1);
}
.geier-hc-card.is-block .geier-hc-badge {
  background-image: url("assets/icons/status/inactive.png");
  opacity: 1; transform: scale(1);
}
.geier-hc-card.self-locked .geier-hc-badge {
  background-image: url("assets/icons/lock.png");
  background-size: 50% auto;
  opacity: 1; transform: scale(1);
}
@media (prefers-reduced-motion: reduce) {
  .geier-hc-badge { transition: none; }
}
/* Selbst gesperrt: die eigene Blockkarte der Vorrunde ist einem selbst verwehrt. */
.geier-hc-card.self-locked img { filter: grayscale(.85) brightness(.5); }
.geier-hc-card.self-locked::after {
  content: "BLOCKED BY YOU";
  position: absolute; left: 4%; right: 4%; bottom: 6px;
  border-radius: 4px; padding: 1px 0; background: rgba(120, 26, 44, .82);
  color: #ffd9e0; font-size: .46rem; font-weight: 900; letter-spacing: .06em; text-align: center;
}
/* Reveal Schritt 1: rote Kreuze poppen auf den geblockten Karten auf.
   Ein Kreuz je Blocker (bis zu 6). Einzeln gross, ab zwei kleiner. */
.geier-hc-marks {
  position: absolute; inset: 0; z-index: 4;
  display: block; pointer-events: none; transition: opacity .2s ease;
  /* Fallback-Groesse; jede Anzahl setzt --sz unten selbst. */
  --sz: 34%;
}
/* Anordnung nach Anzahl (Kreuze wie Haken teilen sich diese Muster): jede Marke
   liegt absolut, mit ihrem MITTELPUNKT auf dem Anker (left/top = Prozent der Karte).
   Zentriert wird ueber negativen Margin - so bleibt transform frei fuer die Pop-
   Animation. 1 = gross mittig, 2 = nebeneinander, 3 = Dreieck (Spitze oben),
   4 = Quadrat, 5 = Quincunx (Mitte + vier Ecken), 6 = zwei Spalten, drei Reihen. */
/* --sz ist ein PROZENTWERT der Kartenbreite, keine Pixelzahl (Eliass 03.09.2026).
   Vorher standen hier feste Pixel, waehrend die Karte selbst mitwaechst: am Desktop
   ist eine Draft-Karte 64px breit, unter 560px nur noch 48px. Ein einzelner Haken
   von 34px bedeckte damit am Handy 71% der Karte statt 53% und ragte oben heraus.
   Mit Prozent sieht jede Bildschirmgroesse dasselbe Verhaeltnis.
   height kommt ueber aspect-ratio, NICHT als zweiter Prozentwert: Prozenthoehen
   beziehen sich auf die Hoehe des Halters, Prozentbreiten auf seine Breite - die
   Marke waere sonst kein Quadrat mehr. Die negativen Margins duerfen dagegen beide
   in Prozent bleiben: Margin-Prozente beziehen sich IMMER auf die Breite, also auf
   dieselbe Basis wie die Breite der Marke. */
.geier-hc-cross, .geier-hc-check {
  position: absolute; left: 50%; top: 50%;
  width: var(--sz); aspect-ratio: 1;
  margin-left: calc(var(--sz) / -2); margin-top: calc(var(--sz) / -2);
  flex: none;
}
.geier-hc-cross {
  background: url("assets/icons/status/inactive.png") center / contain no-repeat;
  filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .6));
  transform: scale(0);
  animation: geierHcCrossPop .34s cubic-bezier(.3, 1.5, .5, 1) forwards;
}
/* Groesse je Anzahl - je mehr Marken, desto kleiner. Die Draft-Karten sind schmal
   (~63px), deshalb bewusst klein gehalten, damit sich nichts ueberlappt. */
/* Jede Groesse bleibt unter dem engsten Ankerabstand ihres Musters, sonst
   ueberlappen die Marken - das taten sie vorher ab drei Stueck sogar am Desktop.
   1 mittig | 2: 42% auseinander | 3 Dreieck: 39,5% | 4 Quadrat: 34% (Zeilen)
   5 Quincunx: 30,4% (Mitte zur Ecke) | 6: 26% (Zeilen 24/50/76). */
.geier-hc-marks[data-count="1"] { --sz: 46%; }
.geier-hc-marks[data-count="2"] { --sz: 38%; }
.geier-hc-marks[data-count="3"] { --sz: 30%; }
.geier-hc-marks[data-count="4"] { --sz: 30%; }
.geier-hc-marks[data-count="5"] { --sz: 23%; }
.geier-hc-marks[data-count="6"] { --sz: 22%; }
/* 1: mittig. */
.geier-hc-marks[data-count="1"] > :nth-child(1) { left: 50%; top: 50%; }
/* 2: nebeneinander, mittig. */
.geier-hc-marks[data-count="2"] > :nth-child(1) { left: 29%; top: 50%; }
.geier-hc-marks[data-count="2"] > :nth-child(2) { left: 71%; top: 50%; }
/* 3: Spitze oben, zwei unten - insgesamt zentriert. */
.geier-hc-marks[data-count="3"] > :nth-child(1) { left: 50%; top: 32%; }
.geier-hc-marks[data-count="3"] > :nth-child(2) { left: 30%; top: 66%; }
.geier-hc-marks[data-count="3"] > :nth-child(3) { left: 70%; top: 66%; }
/* 4: Quadrat. */
.geier-hc-marks[data-count="4"] > :nth-child(1) { left: 30%; top: 33%; }
.geier-hc-marks[data-count="4"] > :nth-child(2) { left: 70%; top: 33%; }
.geier-hc-marks[data-count="4"] > :nth-child(3) { left: 30%; top: 67%; }
.geier-hc-marks[data-count="4"] > :nth-child(4) { left: 70%; top: 67%; }
/* 5: Mitte + vier Ecken. */
.geier-hc-marks[data-count="5"] > :nth-child(1) { left: 50%; top: 50%; }
.geier-hc-marks[data-count="5"] > :nth-child(2) { left: 26%; top: 25%; }
.geier-hc-marks[data-count="5"] > :nth-child(3) { left: 74%; top: 25%; }
.geier-hc-marks[data-count="5"] > :nth-child(4) { left: 26%; top: 75%; }
.geier-hc-marks[data-count="5"] > :nth-child(5) { left: 74%; top: 75%; }
/* 6: volle Karte, zwei Spalten x drei Reihen. */
.geier-hc-marks[data-count="6"] > :nth-child(1) { left: 30%; top: 24%; }
.geier-hc-marks[data-count="6"] > :nth-child(2) { left: 70%; top: 24%; }
.geier-hc-marks[data-count="6"] > :nth-child(3) { left: 30%; top: 50%; }
.geier-hc-marks[data-count="6"] > :nth-child(4) { left: 70%; top: 50%; }
.geier-hc-marks[data-count="6"] > :nth-child(5) { left: 30%; top: 76%; }
.geier-hc-marks[data-count="6"] > :nth-child(6) { left: 70%; top: 76%; }
/* Haken haben ihr EIGENES Muster: sie beginnen ganz oben und stapeln sich zeilenweise
   nach unten (zwei je Zeile). Grund: ein Haken kann auch auf einer gesperrten Karte
   liegen - dort sitzt unten mittig das Schloss, und die Haken sollen darueber laufen,
   ohne es zu verdecken. Ausserdem sieht man so auf einen Blick, wo sich mehrere Picks
   stapeln. Hoehere Spezifitaet (zwei Attribute) schlaegt das generische Kreuz-Muster. */
/* Groessen fuer das Haken-Muster. Die Zeilen liegen nur 28% auseinander (22/50/78),
   die Spalten 40% - sobald es zwei Zeilen gibt, sind die Zeilen die Grenze. Der
   einzelne Haken sitzt bei top: 22% und darf deshalb hoechstens 44% messen, sonst
   ragt er oben aus der Karte; vorher waren es 53% am Desktop und 71% am Handy. */
.geier-hc-marks[data-kind="check"][data-count="1"] { --sz: 40%; }
.geier-hc-marks[data-kind="check"][data-count="2"] { --sz: 34%; }
.geier-hc-marks[data-kind="check"][data-count="3"],
.geier-hc-marks[data-kind="check"][data-count="4"] { --sz: 25%; }
.geier-hc-marks[data-kind="check"][data-count="5"],
.geier-hc-marks[data-kind="check"][data-count="6"] { --sz: 24%; }
/* 1: oben mittig. */
.geier-hc-marks[data-kind="check"][data-count="1"] > :nth-child(1) { left: 50%; top: 22%; }
/* 2: oben nebeneinander. */
.geier-hc-marks[data-kind="check"][data-count="2"] > :nth-child(1) { left: 30%; top: 22%; }
.geier-hc-marks[data-kind="check"][data-count="2"] > :nth-child(2) { left: 70%; top: 22%; }
/* 3: zwei oben, einer mittig darunter. */
.geier-hc-marks[data-kind="check"][data-count="3"] > :nth-child(1) { left: 30%; top: 22%; }
.geier-hc-marks[data-kind="check"][data-count="3"] > :nth-child(2) { left: 70%; top: 22%; }
.geier-hc-marks[data-kind="check"][data-count="3"] > :nth-child(3) { left: 50%; top: 50%; }
/* 4: zwei Zeilen zu zwei. */
.geier-hc-marks[data-kind="check"][data-count="4"] > :nth-child(1) { left: 30%; top: 22%; }
.geier-hc-marks[data-kind="check"][data-count="4"] > :nth-child(2) { left: 70%; top: 22%; }
.geier-hc-marks[data-kind="check"][data-count="4"] > :nth-child(3) { left: 30%; top: 50%; }
.geier-hc-marks[data-kind="check"][data-count="4"] > :nth-child(4) { left: 70%; top: 50%; }
/* 5: zwei Zeilen zu zwei, der fuenfte mittig darunter. */
.geier-hc-marks[data-kind="check"][data-count="5"] > :nth-child(1) { left: 30%; top: 22%; }
.geier-hc-marks[data-kind="check"][data-count="5"] > :nth-child(2) { left: 70%; top: 22%; }
.geier-hc-marks[data-kind="check"][data-count="5"] > :nth-child(3) { left: 30%; top: 50%; }
.geier-hc-marks[data-kind="check"][data-count="5"] > :nth-child(4) { left: 70%; top: 50%; }
.geier-hc-marks[data-kind="check"][data-count="5"] > :nth-child(5) { left: 50%; top: 78%; }
/* 6: drei Zeilen zu zwei. */
.geier-hc-marks[data-kind="check"][data-count="6"] > :nth-child(1) { left: 30%; top: 22%; }
.geier-hc-marks[data-kind="check"][data-count="6"] > :nth-child(2) { left: 70%; top: 22%; }
.geier-hc-marks[data-kind="check"][data-count="6"] > :nth-child(3) { left: 30%; top: 50%; }
.geier-hc-marks[data-kind="check"][data-count="6"] > :nth-child(4) { left: 70%; top: 50%; }
.geier-hc-marks[data-kind="check"][data-count="6"] > :nth-child(5) { left: 30%; top: 78%; }
.geier-hc-marks[data-kind="check"][data-count="6"] > :nth-child(6) { left: 70%; top: 78%; }
/* Auf einer gesperrten Karte muessen die Haken gegen den abgedunkelten Grund
   ankommen - etwas kraeftigerer Schlagschatten, damit sie klar ablesbar bleiben. */
.geier-hc-card.reveal-locked .geier-hc-check {
  filter: drop-shadow(0 0 3px rgba(0, 0, 0, .95)) drop-shadow(0 2px 5px rgba(0, 0, 0, .8));
}
@keyframes geierHcCrossPop {
  0%   { transform: scale(0) rotate(-22deg); opacity: 0; }
  70%  { transform: scale(1.16) rotate(5deg); opacity: 1; }
  100% { transform: scale(1) rotate(0); opacity: 1; }
}
/* Reveal Schritt 2: geblockte Karte fuer die Iteration gesperrt - 50% ausgegraut,
   unterer Rand abgedunkelt, Schloss davor. */
.geier-hc-card.reveal-locked img { filter: grayscale(.65) brightness(.5); }
.geier-hc-card.reveal-locked::before {
  content: ""; position: absolute; left: 0; right: 0; bottom: 0; height: 48%; z-index: 2;
  border-radius: 0 0 8px 8px; pointer-events: none;
  background: linear-gradient(to top, rgba(2, 4, 9, .93) 28%, rgba(2, 4, 9, 0));
}
.geier-hc-card.reveal-locked .geier-hc-badge {
  background-image: url("assets/icons/lock.png");
  background-size: 44% auto; background-position: center 70%;
  opacity: 1; transform: scale(1); z-index: 3;
  animation: geierHcLockIn .3s cubic-bezier(.3, 1.5, .5, 1);
}
@keyframes geierHcLockIn {
  0%   { transform: scale(.35); opacity: 0; }
  100% { transform: scale(1); opacity: 1; }
}
/* Reveal Schritt 3: gruene Haken poppen nacheinander auf den Picks auf - reiner Haken
   (wie das Kreuz, nur gruen), im selben Anzahl-Muster. Ein Haken je Picker. Auf
   umkaempften Karten stapeln sich mehrere; wer welche bekommt, klaert das Duell-Popup
   bzw. der Lotto-Banner. (Die Avatar-Idee ist bewusst raus - am Icon ist nicht
   eindeutig, wer wer ist.) */
.geier-hc-check {
  background: url("assets/icons/status/active.png") center / contain no-repeat;
  filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .6));
  transform: scale(0);
  animation: geierHcCheckPop .32s cubic-bezier(.3, 1.5, .5, 1) forwards;
}
@keyframes geierHcCheckPop {
  0%   { transform: scale(0); opacity: 0; }
  70%  { transform: scale(1.14); opacity: 1; }
  100% { transform: scale(1); opacity: 1; }
}
/* Eindeutige (unumkaempfte) Karte wird zugeteilt: kurzer gruener Vergabe-Puls,
   danach ein bleibender gruener Rahmen als Besitz-Markierung. */
.geier-hc-card.assigned-unique { z-index: 3; }
.geier-hc-card.assigned-unique img { animation: geierHcAward .7s ease-out; }
.geier-hc-card.assigned-unique::after {
  content: ""; position: absolute; inset: -3px; z-index: 1; pointer-events: none;
  border: 2px solid rgba(70, 224, 138, .72); border-radius: 10px;
  box-shadow: 0 0 10px rgba(70, 224, 138, .4);
}
@keyframes geierHcAward {
  0%   { filter: drop-shadow(0 3px 5px rgba(0,0,0,.5)); transform: scale(1); }
  40%  { filter: drop-shadow(0 0 4px #eaffef) drop-shadow(0 0 15px #46e08a) brightness(1.16) drop-shadow(0 3px 5px rgba(0,0,0,.5)); transform: scale(1.08); }
  100% { filter: drop-shadow(0 0 2px #eaffef) drop-shadow(0 0 7px #46e08a) drop-shadow(0 3px 5px rgba(0,0,0,.5)); transform: scale(1); }
}
.geier-hc-card.assigned-unique img { filter: drop-shadow(0 0 2px #eaffef) drop-shadow(0 0 7px #46e08a) drop-shadow(0 3px 5px rgba(0,0,0,.5)); }
@media (prefers-reduced-motion: reduce) {
  .geier-hc-cross, .geier-hc-check, .geier-hc-card.reveal-locked .geier-hc-badge { animation: none; transform: scale(1); opacity: 1; }
  .geier-hc-card.assigned-unique img { animation: none; }
}
/* Vorlauf einer Lotto-Ziehung: die Karte, auf die der Spieler gesetzt hatte, leuchtet
   kurz warm auf und hebt sich an - erst danach erscheint sein Banner und das Rad rollt.
   Gesperrte Karten kommen dabei kurz aus dem Grau zurueck ("die wolltest du"), deshalb
   eine eigene Keyframe-Variante, die am Ende wieder ins Grau zurueckfaellt.
   Glow ueber gestapelte drop-shadow wie beim restlichen Kartenglow - folgt der
   Silhouette, keine rechteckige Aura. */
.geier-hc-card.lotto-origin { z-index: 6; }
.geier-hc-card.lotto-origin img { animation: geierHcOrigin 1.2s ease-out; }
.geier-hc-card.reveal-locked.lotto-origin img { animation: geierHcOriginLocked 1.2s ease-out; }
@keyframes geierHcOrigin {
  0%   { transform: scale(1);    filter: drop-shadow(0 3px 5px rgba(0,0,0,.5)); }
  22%  { transform: scale(1.12); filter: drop-shadow(0 0 3px #ffe6a8) drop-shadow(0 0 13px rgba(255,184,72,.95)); }
  72%  { transform: scale(1.08); filter: drop-shadow(0 0 3px #ffe6a8) drop-shadow(0 0 10px rgba(255,184,72,.8)); }
  100% { transform: scale(1);    filter: drop-shadow(0 3px 5px rgba(0,0,0,.5)); }
}
@keyframes geierHcOriginLocked {
  0%   { transform: scale(1);    filter: grayscale(.65) brightness(.5) drop-shadow(0 3px 5px rgba(0,0,0,.5)); }
  22%  { transform: scale(1.12); filter: grayscale(0) brightness(1.06) drop-shadow(0 0 3px #ffe6a8) drop-shadow(0 0 13px rgba(255,184,72,.95)); }
  72%  { transform: scale(1.08); filter: grayscale(0) brightness(1.02) drop-shadow(0 0 3px #ffe6a8) drop-shadow(0 0 10px rgba(255,184,72,.8)); }
  100% { transform: scale(1);    filter: grayscale(.65) brightness(.5) drop-shadow(0 3px 5px rgba(0,0,0,.5)); }
}
@media (prefers-reduced-motion: reduce) {
  .geier-hc-card.lotto-origin img,
  .geier-hc-card.reveal-locked.lotto-origin img { animation: none; }
}

/* Pause zwischen zwei Iterationen: der ganze Pool wird abgedunkelt und darueber
   laeuft der Countdown bis zur naechsten Pick/Block-Runde. Optik bewusst wie das
   Mega-Draft-Timeout (.geier-draft-timeout), nur bleibt der Schleier stehen statt
   einmal durchzulaufen. Liegt unter dem Duell-Overlay (z-index 20), das zu diesem
   Zeitpunkt ohnehin durch ist. */
.geier-hc-intermission {
  position: absolute; inset: -10px -14px; z-index: 12;
  display: grid; place-items: center; align-content: center; gap: 4px;
  pointer-events: none; border-radius: 14px;
  background: rgba(4, 7, 14, .82);
  animation: geierHcVeilIn .3s ease-out both;
}
.geier-hc-intermission-label {
  font-family: "Clash Display", sans-serif; font-size: .8rem; line-height: 1;
  letter-spacing: .18em; text-transform: uppercase; color: rgba(196, 214, 255, .7);
}
.geier-hc-intermission-number {
  font-family: "Clash Display", sans-serif; font-size: 4rem; line-height: 1;
  color: #eaf1ff; text-shadow: 0 3px 12px rgba(0, 0, 0, .75), 0 0 22px rgba(92, 180, 255, .4);
}
.geier-hc-intermission-number.tick { animation: geierHcTick .85s cubic-bezier(.2, .9, .3, 1.15); }
@keyframes geierHcVeilIn { from { opacity: 0; } to { opacity: 1; } }
@keyframes geierHcTick {
  0%   { transform: scale(1.55); opacity: .2; }
  20%  { transform: scale(1);    opacity: 1; }
  100% { transform: scale(1);    opacity: 1; }
}
@media (prefers-reduced-motion: reduce) {
  .geier-hc-intermission { animation: none; }
  .geier-hc-intermission-number.tick { animation: none; }
}

.geier-hc-card.in-duel { z-index: 4; }
.geier-hc-card.in-duel img { animation: geierHcDuel 1.1s ease-in-out infinite; }
@keyframes geierHcDuel {
  0%, 100% { filter: drop-shadow(0 0 3px #ffd06a) drop-shadow(0 3px 5px rgba(0,0,0,.5)); }
  50%      { filter: drop-shadow(0 0 9px #ffb02e) brightness(1.15) drop-shadow(0 3px 5px rgba(0,0,0,.5)); }
}
/* Lotto: ein echtes Fokus-Objekt faehrt ueber die Karten. Es besteht aus einem
   leuchtenden Rahmen (::before) und Fokus-Ecken (::after), rastet bei jedem Sprung
   mit einem kurzen Pop ein (geierLottoLock startet neu, weil das JS die Klasse pro
   Zelle neu setzt) und hebt die Karte leicht an. */
.geier-hc-card.lotto-scan { z-index: 6; animation: geierLottoLift .16s ease-out forwards; }
.geier-hc-card.lotto-scan img { filter: drop-shadow(0 0 6px rgba(255, 214, 120, .85)) brightness(1.12) drop-shadow(0 3px 5px rgba(0,0,0,.5)); }
.geier-hc-card.lotto-scan::before {
  content: ""; position: absolute; inset: -4px; z-index: 1; pointer-events: none;
  border-radius: 9px;
  border: 2px solid #ffe08a;
  box-shadow:
    0 0 0 1px rgba(255, 224, 138, .55),
    0 0 14px 2px rgba(255, 200, 90, .85),
    0 6px 16px rgba(120, 70, 0, .5),
    inset 0 0 14px rgba(255, 214, 120, .4);
  background: radial-gradient(120% 120% at 50% 0%, rgba(255, 224, 138, .16), transparent 60%);
  animation: geierLottoLock .17s cubic-bezier(.2, .9, .3, 1);
}
/* Fokus-Ecken (Kamera-/Scanner-Klammern) - machen aus dem Rahmen ein greifbares Objekt. */
.geier-hc-card.lotto-scan::after {
  content: ""; position: absolute; inset: -7px; z-index: 2; pointer-events: none;
  --c: #fff4d2; --s: 11px; --t: 2px;
  background:
    linear-gradient(var(--c), var(--c)) 0 0, linear-gradient(var(--c), var(--c)) 0 0,
    linear-gradient(var(--c), var(--c)) 100% 0, linear-gradient(var(--c), var(--c)) 100% 0,
    linear-gradient(var(--c), var(--c)) 0 100%, linear-gradient(var(--c), var(--c)) 0 100%,
    linear-gradient(var(--c), var(--c)) 100% 100%, linear-gradient(var(--c), var(--c)) 100% 100%;
  background-repeat: no-repeat;
  background-size: var(--s) var(--t), var(--t) var(--s);
  filter: drop-shadow(0 0 3px rgba(255, 224, 138, .9));
  animation: geierLottoLock .17s cubic-bezier(.2, .9, .3, 1);
}
@keyframes geierLottoLift {
  to { transform: scale(1.09); }
}
@keyframes geierLottoLock {
  0% { transform: scale(1.3); opacity: 0; }
  55% { opacity: 1; }
  100% { transform: scale(1); opacity: 1; }
}
/* Zielkarte: das Objekt rastet endgueltig ein - kraeftiger Gold-Puls plus der Pop. */
.geier-hc-card.lotto-won { z-index: 6; }
.geier-hc-card.lotto-won img { animation: geierDraftPicked 1.15s cubic-bezier(.3,.8,.4,1) 1; }
.geier-hc-card.lotto-won::before {
  content: ""; position: absolute; inset: -4px; z-index: 1; pointer-events: none;
  border-radius: 9px; border: 2px solid #ffe08a;
  box-shadow: 0 0 22px 4px rgba(255, 200, 90, .95), inset 0 0 16px rgba(255, 214, 120, .5);
  animation: geierLottoWin 1.15s ease-out;
}
@keyframes geierLottoWin {
  0% { transform: scale(1.18); opacity: .3; box-shadow: 0 0 34px 8px rgba(255, 210, 110, 1); }
  100% { transform: scale(1); opacity: 1; }
}
@media (prefers-reduced-motion: reduce) {
  .geier-hc-card.lotto-scan, .geier-hc-card.lotto-scan::before, .geier-hc-card.lotto-scan::after,
  .geier-hc-card.lotto-won::before { animation: none; }
}

/* ---- Etappe 4: Duell-Overlay ----
   Das ist 1:1 das Geier-Royale-Duell (.geier-duel, siehe oben) - nur als Overlay ueber
   den Kartenblock gelegt. Die Saeulen, Zahlen, Faerbung und das Tie-Blinken laufen ueber
   die vorhandenen .geier-duel-*-Regeln; --duel-index:0 startet sie relativ ab dem
   Einblenden. Hier steht deshalb nur die Overlay-Huelle. */
.geier-game[data-kind="mega-draft-hardcore"] .geier-game-cards { position: relative; }
.geier-hc-duel-overlay {
  position: absolute; inset: 0; z-index: 20; display: grid; place-items: center;
  padding: 6px; border-radius: 12px; background: rgba(6, 10, 18, .82);
  animation: geierHcDuelVeilIn .3s ease-out;
}
.geier-hc-duel-overlay.closing { animation: geierHcDuelVeilOut .34s ease forwards; }
.geier-hc-duel-overlay .geier-duel-list { width: 100%; }
@keyframes geierHcDuelVeilIn { from { opacity: 0; } }
@keyframes geierHcDuelVeilOut { to { opacity: 0; } }

/* ---- Etappe 5: Lotto-Banner ueber dem Kartenpool ----
   Steht in der Statuszeile (in der Box, oberhalb des Pools) und nennt Icon + Name des
   Spielers, fuer den gerade gezogen wird. */
.geier-game[data-kind="mega-draft-hardcore"] .geier-game-statuses { display: flex; justify-content: center; }
.geier-hc-lotto-banner {
  /* Bewusst deutlich Luft nach unten: der Banner soll klar ueber dem Pool stehen und
     nicht auf den Karten kleben. */
  display: inline-flex; align-items: center; gap: 11px; margin: 0 auto 20px;
  padding: 6px 15px 6px 6px; border: 1px solid var(--panel-border); border-radius: 99px;
  background: var(--panel-bg); box-shadow: var(--panel-shadow); color: var(--panel-text);
  animation: geierHcBannerIn .3s ease-out;
}
.geier-hc-lotto-banner .geier-avatar { width: 40px; height: 40px; border: 2px solid #ffd27a; box-shadow: 0 0 12px rgba(255, 200, 90, .5); }
.geier-hc-lotto-banner > span { display: grid; line-height: 1.15; text-align: left; }
.geier-hc-lotto-banner > span i { color: #b8a4e6; font-size: .56rem; font-weight: 900; letter-spacing: .12em; text-transform: uppercase; font-style: normal; }
.geier-hc-lotto-banner > span b { color: #fff; font-size: .95rem; font-weight: 900; }
.geier-hc-lotto-banner > em {
  margin-left: 4px; padding: 3px 9px; border-radius: 99px; background: rgba(255, 200, 90, .14);
  color: #ffd27a; font-size: .56rem; font-weight: 900; letter-spacing: .06em; text-transform: uppercase; font-style: normal;
}
@keyframes geierHcBannerIn { from { opacity: 0; transform: translateY(-6px); } }
@media (prefers-reduced-motion: reduce) {
  .geier-hc-duel-overlay, .geier-hc-lotto-banner { animation: none; }
}

@media (max-width: 1100px) {
  .geier-game[data-kind="mega-draft-hardcore"] .geier-game-layout { grid-template-columns: 1fr; }
  .geier-hc-side { grid-row: 3; grid-template-columns: minmax(0, 200px) minmax(0, 1fr); align-items: start; }
  .geier-hc-board { grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); }
}

/* --- Hard Core am Handy --------------------------------------------------- */
/* MUSS nach dem 1100px-Block stehen: dort setzt .geier-hc-side zwei Spalten, und bei
   gleicher Spezifitaet gewinnt die spaetere Regel. Steht dieser Block weiter oben,
   bleibt die Zweispaltigkeit unbemerkt bestehen.

   Zwei Aenderungen, beide von Eliass am 03.09.2026:
   1. PICK und BLOCK sitzen nicht mehr IN der Panel-Box, sondern als zwei eigene Kaesten
      nebeneinander DARUEBER. Dass es zwei getrennte Funktionen sind, ist so auf einen
      Blick zu sehen, und der knappe Platz wird besser genutzt. Umgesetzt ohne
      Markup-Umbau: die Panel-Optik wandert von .geier-hc-side auf .geier-hc-board.
   2. Dadurch bekommt die Spielerliste die volle Breite. Vorher lag sie in der schmalen
      1fr-Spalte neben den 200px der Schalter - bei 390px Bildschirm blieben rund 170px,
      also passte trotz `auto-fit, minmax(150px, …)` immer nur EIN Spieler je Zeile. */
@media (max-width: 620px) {
  .geier-hc-side {
    grid-template-columns: 1fr; gap: 9px;
    padding: 0; border: 0; border-radius: 0; background: none; box-shadow: none;
  }
  .geier-hc-side::before { display: none; }
  /* Nicht ueber die volle Breite: der Schalter ist nur eine Auswahl, keine Flaeche, die
     Platz braucht. Schmaler und mittig zusammengerueckt stehen die beiden eng
     beieinander und bekommen nach aussen Luft (Eliass 03.09.2026). */
  .geier-hc-modes { grid-template-columns: repeat(2, minmax(0, 145px)); justify-content: center; gap: 7px; }
  .geier-hc-mode { padding: 6px 8px; gap: 7px; }
  .geier-hc-mode-icon { width: 19px; height: 19px; }
  .geier-hc-mode-label { font-size: .76rem; }
  .geier-hc-mode-card { width: 24px; height: 28px; }
  .geier-hc-board {
    grid-template-columns: repeat(auto-fit, minmax(128px, 1fr)); gap: 6px;
    padding: 9px; border: 1px solid var(--panel-border); border-radius: var(--panel-radius);
    background: var(--panel-bg); box-shadow: var(--panel-shadow);
  }
  /* Kompakter, seit die Markierung ein kleines Icon statt eines Rahmens ist. */
  .geier-hc-player { gap: 5px; padding: 6px; }
  .geier-hc-choice { gap: 5px; }
  .geier-hc-thumb, .geier-hc-slot-empty { min-height: 34px; }
  .geier-hc-thumb img { max-height: 30px; }
  .geier-hc-mark { width: 13px; height: 13px; }
}

/* --- Mega Draft: "du bist am Zug" ---------------------------------------- */
/* Am Handy reichte die Hervorhebung in der Reihenfolgeleiste nicht: man sah, WER dran
   ist, aber nicht, dass man selbst gemeint war. Deshalb gluht der Bildschirm von allen
   vier Raendern nach innen rot - oben unterhalb der Kopfzeile, unten oberhalb der
   Menueleiste, links und rechts am Rand (Eliass 03.09.2026).
   Fest im Bildschirm verankert, nicht im Spielfeld: der Glow soll beim Scrollen stehen
   bleiben. Die Werte 52px (Kopfzeile) und 56px (Menue) stammen aus .nav-inner bzw.
   .mobile-nav weiter unten - aendert sich eine der Leisten, muss es hier mitgehen.
   z-index bleibt niedrig: die Leisten selbst duerfen nicht ueberglueht werden. */
.geier-turn-glow { display: none; }
@media (max-width: 1100px) {
  .geier-turn-glow:not([hidden]) {
    display: block; position: fixed; z-index: 3; pointer-events: none;
    top: 52px; right: 0; left: 0; bottom: calc(56px + env(safe-area-inset-bottom, 0px));
    box-shadow:
      inset 0 0 34px 4px rgba(255, 62, 78, .5),
      inset 0 0 96px 22px rgba(226, 32, 58, .26);
    animation: geierTurnGlow 1.6s ease-in-out infinite;
  }
}
@keyframes geierTurnGlow {
  0%, 100% { opacity: .48; }
  50% { opacity: 1; }
}
@media (prefers-reduced-motion: reduce) {
  .geier-turn-glow:not([hidden]) { animation: none; opacity: .85; }
}
@media (prefers-reduced-motion: reduce) {
  .geier-hc-card.in-duel img,
  .geier-hc-card.lotto-won img { animation: none; }
}

@keyframes geierGlowBlue {
  0%, 100% { filter: drop-shadow(0 0 1px #eaf6ff) drop-shadow(0 0 4px #5cc2ff) drop-shadow(0 0 8px rgba(66,150,255,.7)) drop-shadow(0 12px 10px rgba(0,0,0,.6)); }
  50%      { filter: drop-shadow(0 0 1px #ffffff) drop-shadow(0 0 6px #93d8ff) drop-shadow(0 0 13px rgba(92,180,255,.95)) drop-shadow(0 12px 10px rgba(0,0,0,.6)); }
}

.geier-shell .geier-game-confirm {
  min-width: 208px; min-height: 46px; margin-top: 26px; padding: .5rem 1.9rem;
  border: 1px solid rgba(150,175,255,.5); border-radius: 10px;
  background: linear-gradient(180deg, #5f7ffb, #2f52c8); color: #fff;
  font-family: "Inter", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
  font-size: .82rem; font-weight: 900; line-height: 1; letter-spacing: .09em; text-transform: uppercase;
  text-shadow: 0 1px 2px rgba(4,10,30,.42);
  box-shadow: 0 6px 16px rgba(18,40,94,.42), inset 0 1px rgba(255,255,255,.16);
  transition: transform .15s ease, filter .15s ease, box-shadow .15s ease, background .15s ease;
}
.geier-shell .geier-game-confirm:not(:disabled):hover {
  transform: translateY(-1px); filter: brightness(1.05); background: linear-gradient(180deg, #6f8dff, #3a5dd8);
  box-shadow: 0 9px 22px rgba(18,40,94,.5), inset 0 1px rgba(255,255,255,.2);
}
.geier-shell .geier-game-confirm:disabled { opacity: .42; filter: saturate(.65); box-shadow: 0 3px 9px rgba(25,43,95,.24); }
.geier-game-message:empty { display: none; }

.player-deck-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0.75rem; }
.player-deck-box {
  position: relative; overflow: hidden; min-width: 0;
  padding: 0.8rem 0.85rem 0.75rem; border: 1px solid var(--panel-border); border-radius: 8px;
  color: #f3f6ff;
  background: var(--panel-bg);
  box-shadow: var(--panel-shadow);
}
.player-deck-box::before {
  content: ""; position: absolute; top: 0; left: 10%; right: 10%; height: 1px;
  background: var(--panel-line);
  box-shadow: 0 0 8px rgba(89, 122, 255, 0.5); pointer-events: none;
}
.player-deck-head { display: flex; align-items: center; justify-content: space-between; gap: 0.65rem; min-height: 30px; }
.player-deck-mode { display: inline-flex; align-items: center; gap: 0.4rem; min-width: 0; font-size: 0.82rem; font-weight: 800; }
.player-deck-mode img { width: 32px; height: 32px; margin: -3px -2px; flex: none; object-fit: contain; }
.player-deck-box .deck-actions { flex: none; }
.player-deck-box .elixir { padding-inline: 0.38rem; }
.player-deck-cards {
  display: grid; grid-template-columns: repeat(4, 64px); justify-content: center;
  gap: 3px; margin: 0.7rem 0 0.6rem;
}
.player-deck-cards .card,
.player-deck-cards .card-img,
.player-deck-cards .card-img img { width: 64px; }
.player-deck-loadout { display: flex; align-items: center; justify-content: center; }
.player-deck-tower {
  display: flex; align-items: center; flex: none;
  margin-left: 13px; padding-left: 13px;
  border-left: 1px solid var(--panel-inset-border);
}
.player-deck-tower .card,
.player-deck-tower .card-img,
.player-deck-tower .card-img img { width: 64px; }
.card-usage {
  position: absolute; right: 1px; bottom: 2px; z-index: 1;
  min-width: 23px; padding: 1px 4px; border: 1px solid rgba(255, 255, 255, 0.34); border-radius: 5px;
  background: rgba(7, 9, 15, 0.86); color: #fff;
  font-size: 0.62rem; font-weight: 800; line-height: 1.35; text-align: center;
  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.5);
}
/* Drei feste Spuren: Siege links, Unentschieden mittig, Niederlagen rechts – genau wie
   der Balken darunter aufgeteilt ist. Als Raster statt Flex, damit die Draws wirklich
   in der Mitte stehen und nicht nur irgendwo dazwischen; fehlen sie, bleibt die Mitte
   einfach leer. */
.deck-record-labels {
  display: grid; grid-template-columns: 1fr auto 1fr; align-items: center;
  gap: 0.7rem; margin-bottom: 0.38rem;
  color: rgba(230, 235, 247, 0.64); font-size: 0.69rem; font-weight: 650;
}
.deck-record-labels span { display: inline-flex; align-items: center; gap: 0.28rem; }
.deck-record-labels .record-wins { grid-column: 1; justify-self: start; }
.deck-record-labels .record-draws { grid-column: 2; justify-self: center; }
.deck-record-labels .record-losses { grid-column: 3; justify-self: end; }
.deck-record-labels i { width: 6px; height: 6px; border-radius: 50%; background: #7c8495; box-shadow: 0 0 6px currentColor; }
.deck-record-labels b { color: #fff; font-size: 0.77rem; }
.record-wins { color: #62e2a0; }
.record-wins i { background: #53d794; }
.record-losses { color: #ff7a86; }
.record-losses i { background: #f26773; }
/* Unentschieden bleiben durchgehend grau – auch die Zahl, sonst zoege sie so viel
   Aufmerksamkeit auf sich wie Siege und Niederlagen. */
.record-draws { color: #aab2c3; }
.deck-record-labels .record-draws b { color: #aab2c3; }

/* Kleiner quadratisch-abgerundeter Button neben "Filter", oeffnet die Legende der
   lb-timeline-Charts (Ranked-Leaderboard) im bekannten Popup. Gleiche Hoehe wie die
   Filter-Box daneben (.deck-sort-control: 3px Padding + 30px Button = 36px). */
.lb-legend-btn {
  display: inline-flex; align-items: center; justify-content: center;
  width: 36px; height: 36px; padding: 0; flex: none;
  border: 1px solid rgba(255, 255, 255, 0.12); border-radius: 8px;
  background: rgba(8, 10, 15, 0.76);
}
.lb-legend-btn:hover { background: rgba(255, 255, 255, 0.06); }
.lb-legend-btn img { width: 20px; height: 20px; filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.55)); }

/* Etwas groesserer Modal als der Standard (320px), damit das rotierte "Ranked"-Label
   und die laengeren Linien-Samples genug Platz haben. */
.modal-box:has(.lb-legend-pop) { width: 360px; max-width: 360px; padding: 1.8rem; }

.lb-legend-pop { display: flex; flex-direction: column; text-align: left; }
.lb-legend-group { display: flex; gap: 0.7rem; }
/* Rotiertes Gruppenlabel: die ersten vier Zeilen (Win/Loss/Draw/Different deck) sind
   allesamt Ranked-Kaempfe (kind !== "mode"), nur die letzte Zeile nicht - siehe
   lbTimelineBlock(). Das Label macht diese Gruppierung auf einen Blick klar. Feste
   Breite (statt content-basiert), damit die "Other game mode"-Zeile unten per
   gleich breitem Spacer exakt buendig mit den vier Zeilen darueber steht. Zentriert
   sich per Flex ueber die volle Gruppenhoehe, also mittig zwischen Win und Different
   deck. */
.lb-legend-group-label {
  writing-mode: vertical-rl; transform: rotate(180deg);
  display: flex; align-items: center; justify-content: center;
  width: 20px; flex: none;
  font-size: 0.64rem; font-weight: 800; letter-spacing: 0.1em; text-transform: uppercase;
  color: rgba(230, 235, 247, 0.36);
}
.lb-legend-group-label-spacer { width: 20px; flex: none; }
.lb-legend-outer-row { display: flex; gap: 0.7rem; }
.lb-legend-group-rows { display: flex; flex-direction: column; gap: 0.6rem; flex: 1; min-width: 0; }
.lb-legend-pop-row { display: flex; align-items: center; gap: 0.7rem; flex: 1; min-width: 0; }
.lb-legend-pop-row svg { width: 52px; height: 12px; flex: none; }
/* Etwas dicker und mit ganz leichtem Glow als die winzigen Charts in den Zeilen - dort
   waeren dickere Linien zu unruhig, hier in der Legende duerfen sie deutlicher sein.
   Eigene, spezifischere Regel statt die lb-seg-*-Klassen selbst zu aendern, damit die
   echten Mini-Charts unveraendert bleiben. */
.lb-legend-pop-row svg line { stroke-width: 3; filter: drop-shadow(0 0 2px rgba(255, 255, 255, 0.22)); }
/* Die fuenfte Linie (Other game mode) ist im echten Chart bewusst blass - in der
   Legende muss sie aber genauso gut lesbar sein wie die anderen vier. */
.lb-legend-pop-row.dim svg line { stroke-width: 2.6; filter: drop-shadow(0 0 3px rgba(148, 163, 184, 0.55)); }
.lb-legend-pop-row span { font-size: 0.85rem; color: var(--panel-text); font-weight: 600; }
/* Ganz normaler Tastatur-Stern direkt hinter dem Wort, kein Abstand wie bei den
   Icon/Text-Zeilen davor. */
.lb-legend-star { font-style: normal; color: #f5b93b; margin-left: 1px; }
.lb-legend-pop-note { margin: 0.9rem 0 0; font-size: 0.7rem; color: rgba(230, 235, 247, 0.42); }
.lb-legend-divider { height: 1px; margin: 0.85rem 0; background: rgba(255, 255, 255, 0.1); }
.deck-record-bar {
  position: relative; display: flex; overflow: hidden; width: 100%; height: 11px;
  border: 1px solid rgba(255, 255, 255, 0.12); border-radius: 5px;
  background: rgba(5, 7, 13, 0.62); box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.34);
}
.deck-record-bar span { position: relative; height: 100%; min-width: 0; transition: width 0.35s ease; }
.deck-record-bar span::after {
  content: ""; position: absolute; inset: 0 0 50%;
  background: linear-gradient(180deg, rgba(255, 255, 255, 0.24), transparent);
}
.record-win-bar {
  background: linear-gradient(90deg,
    color-mix(in srgb, var(--win) 88%, white),
    color-mix(in srgb, var(--win) 68%, white));
  box-shadow: 0 0 10px color-mix(in srgb, var(--win) 28%, transparent);
}
.record-draw-bar { background: linear-gradient(90deg, #676f81, #8e97a9); }
.record-loss-bar {
  background: linear-gradient(90deg,
    color-mix(in srgb, var(--loss) 74%, white),
    color-mix(in srgb, var(--loss) 92%, white));
  box-shadow: 0 0 10px color-mix(in srgb, var(--loss) 24%, transparent);
}
.player-deck-metrics { display: flex; align-items: center; justify-content: space-between; gap: 0.6rem; margin-top: 0.45rem; color: rgba(225, 231, 245, 0.58); font-size: 0.7rem; }
.player-deck-metrics b { color: #f5f7ff; font-size: 0.78rem; }
.player-decks-empty {
  grid-column: 1 / -1; padding: 2rem; border: 1px dashed rgba(255, 255, 255, 0.2); border-radius: 8px;
  color: rgba(235, 239, 248, 0.64); text-align: center;
}

/* Player career dashboard */
.career-dashboard { display: grid; gap: 0.8rem; color: #f4f7ff; }
.stats-eyebrow {
  display: block; color: rgba(209, 220, 247, 0.5); font-size: 0.62rem;
  font-weight: 800; text-transform: uppercase; letter-spacing: 0;
}
.career-record {
  display: grid; grid-template-columns: minmax(0, 1fr) 126px; align-items: center; gap: 1rem;
  padding: 1rem 1.15rem; border: 1px solid rgba(92, 125, 225, 0.4); border-radius: 8px;
  background:
    linear-gradient(115deg, rgba(24, 47, 98, 0.96), rgba(13, 18, 31, 0.98) 58%, rgba(55, 24, 53, 0.94));
  box-shadow: 0 10px 28px rgba(2, 5, 14, 0.25), inset 0 0 26px rgba(78, 113, 225, 0.07);
}
.career-record-copy h3 { margin: 0.18rem 0 0; color: #fff; font-size: 2rem; letter-spacing: 0; }
.career-record-copy h3 span { color: #63e1a0; font-size: 0.92rem; }
.career-record-copy p { margin: 0.18rem 0 0; color: rgba(222, 229, 246, 0.58); font-size: 0.78rem; }
.career-winrate {
  position: relative; display: grid; place-items: center; width: 112px; height: 112px; justify-self: end;
  border-radius: 50%;
  background:
    radial-gradient(circle, transparent 57%, rgba(255, 255, 255, 0.14) 58%, transparent 62%),
    conic-gradient(from -90deg, #55e2a0 0 var(--win-rate), #ef6070 var(--win-rate) 360deg);
  box-shadow: 0 0 18px rgba(76, 213, 143, 0.2), 0 0 26px rgba(226, 77, 96, 0.12), inset 0 0 8px rgba(255, 255, 255, 0.13);
}
.career-winrate::before {
  content: ""; position: absolute; width: 82px; height: 82px; border-radius: 50%;
  background: radial-gradient(circle at 42% 34%, #1b2841, #0d1321 70%);
  box-shadow: inset 0 0 14px rgba(0, 0, 0, 0.58), 0 0 0 1px rgba(255, 255, 255, 0.06);
}
.career-winrate::after {
  content: ""; position: absolute; inset: -5px; border: 1px solid rgba(111, 226, 176, 0.2); border-radius: 50%;
  box-shadow: 0 0 14px rgba(82, 218, 151, 0.2), inset 0 0 10px rgba(235, 91, 108, 0.08);
  pointer-events: none;
}
.career-winrate div { position: relative; z-index: 1; display: flex; flex-direction: column; align-items: center; }
.career-winrate strong { color: #fff; font-size: 1.25rem; line-height: 1.1; }
.career-winrate span { color: rgba(219, 227, 246, 0.53); font-size: 0.61rem; font-weight: 700; }
.career-record-bar {
  position: relative; display: flex; grid-column: 1 / -1; height: 9px; overflow: hidden;
  border: 1px solid rgba(255, 255, 255, 0.13); border-radius: 5px;
  background: rgba(4, 7, 14, 0.58); box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.45), 0 0 10px rgba(72, 127, 255, 0.08);
}
.career-record-bar::after {
  content: ""; position: absolute; inset: 0 0 52%; pointer-events: none;
  background: linear-gradient(180deg, rgba(255, 255, 255, 0.25), transparent);
}
.career-record-bar > span { height: 100%; }
.career-wins { background: linear-gradient(90deg, #347eff, #54dfa0); box-shadow: 0 0 12px rgba(68, 206, 151, 0.3); }
.career-losses { background: linear-gradient(90deg, #f06b79, #b92f43); box-shadow: 0 0 12px rgba(231, 75, 94, 0.24); }
.stats-animating .career-winrate::after { animation: career-ring-glow 1.25s ease-out; }
.stats-animating .career-record-bar { animation: career-bar-glow 1.25s ease-out; }
@keyframes career-ring-glow {
  0% { opacity: 0.25; transform: scale(0.94); }
  55% { opacity: 1; box-shadow: 0 0 24px rgba(82, 218, 151, 0.38), 0 0 18px rgba(235, 91, 108, 0.2); }
  100% { opacity: 1; transform: scale(1); }
}
@keyframes career-bar-glow {
  0% { box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.45), 0 0 0 rgba(72, 127, 255, 0); }
  60% { box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.35), 0 0 15px rgba(79, 160, 255, 0.28); }
  100% { box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.45), 0 0 10px rgba(72, 127, 255, 0.08); }
}
.stats-kpi-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 0.65rem; }
.stats-kpi {
  position: relative; display: flex; align-items: center; gap: 0.65rem; min-width: 0; min-height: 82px;
  padding: 0.68rem 0.72rem; overflow: hidden;
  border: 1px solid rgba(111, 136, 211, 0.28); border-radius: 7px;
  background: linear-gradient(145deg, rgba(25, 34, 57, 0.96), rgba(12, 16, 26, 0.98));
  box-shadow: inset 0 1px rgba(255, 255, 255, 0.035);
}
.stats-kpi::before { content: ""; position: absolute; inset: 0 auto 0 0; width: 2px; background: #7599ff; }
.stats-kpi.gold::before { background: #f2c455; }
.stats-kpi.violet::before { background: #bd73ea; }
.stats-kpi.ranked::before { background: linear-gradient(180deg, #e3a1ff, #6f85ff); }
.stats-kpi.up::before { background: #56da98; }
.stats-kpi.down::before { background: #ed6673; }
.stats-kpi.flat::before { background: #8a94aa; }
.stats-kpi > img { width: 43px; height: 43px; flex: none; object-fit: contain; filter: drop-shadow(0 3px 5px rgba(0, 0, 0, 0.4)); }
.stats-kpi.ranked > img { width: 50px; height: 50px; margin: -4px; }
.stats-kpi > img.ranked-icon-muted { opacity: 0.38; filter: grayscale(1) saturate(0) drop-shadow(0 2px 4px rgba(0, 0, 0, 0.35)); }
.stats-kpi > img.three-crown-icon { transform: scale(1.28); }
.stats-kpi > span { display: flex; flex-direction: column; min-width: 0; }
.stats-kpi small { color: rgba(216, 225, 247, 0.48); font-size: 0.58rem; font-weight: 750; text-transform: uppercase; }
.stats-kpi strong { overflow: hidden; color: #fff; font-size: 1rem; line-height: 1.2; white-space: nowrap; text-overflow: ellipsis; }
.stats-kpi em { overflow: hidden; color: rgba(218, 226, 244, 0.48); font-size: 0.59rem; font-style: normal; white-space: nowrap; text-overflow: ellipsis; }
.ranked-finish-detail { display: flex; align-items: center; gap: 0.38rem; min-width: 0; }
.ranked-finish-detail > span:first-child { overflow: hidden; text-overflow: ellipsis; }
.ranked-finish-medals { display: inline-flex; align-items: center; gap: 0.12rem; flex: none; color: rgba(235, 224, 255, 0.78); font-weight: 750; }
.ranked-finish-medals img { width: 13px; height: 13px; object-fit: contain; }
.stats-detail-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0.75rem; }
.stats-detail-panel {
  padding: 0.85rem 0.95rem 0.55rem; border: 1px solid rgba(102, 128, 207, 0.32); border-radius: 8px;
  background: linear-gradient(145deg, rgba(27, 39, 70, 0.95), rgba(14, 17, 27, 0.98) 72%);
  box-shadow: 0 8px 22px rgba(3, 6, 14, 0.2);
}
.stats-panel-head { display: flex; align-items: center; justify-content: space-between; gap: 0.7rem; margin-bottom: 0.42rem; }
.stats-panel-head h3 { margin: 0.08rem 0 0; color: #fff; font-size: 0.96rem; letter-spacing: 0; }
.stats-panel-head img { width: 42px; height: 42px; object-fit: contain; }
.stats-detail-row {
  display: flex; align-items: baseline; justify-content: space-between; gap: 1rem;
  min-height: 32px; padding: 0.36rem 0; border-top: 1px solid rgba(255, 255, 255, 0.065);
  color: rgba(219, 227, 246, 0.55); font-size: 0.73rem;
}
.stats-detail-row b { overflow: hidden; color: #f6f8ff; font-size: 0.76rem; text-align: right; white-space: nowrap; text-overflow: ellipsis; }
.account-progress {
  display: flex; align-items: center; justify-content: space-between; gap: 1rem;
  min-height: 116px; padding: 0.85rem 1rem;
  border: 1px solid rgba(212, 171, 72, 0.32); border-radius: 8px;
  background: linear-gradient(120deg, rgba(47, 38, 25, 0.94), rgba(20, 21, 29, 0.98) 46%, rgba(24, 34, 61, 0.96));
}
.account-metrics { display: flex; align-items: center; gap: 1.35rem; margin-top: 0.55rem; }
.account-metric { display: flex; align-items: center; gap: 0.42rem; min-width: 0; }
.account-metric > img { width: 30px; height: 30px; flex: none; object-fit: contain; }
.account-metric > span { display: flex; min-width: 0; flex-direction: column; }
.account-metric b { color: var(--panel-text); font-size: 0.8rem; line-height: 1.15; }
.account-metric small { color: var(--panel-muted); font-size: 0.61rem; white-space: nowrap; }
.favorite-card { display: flex; align-items: center; gap: 0.55rem; min-width: 180px; justify-content: flex-end; }
.favorite-card > img { width: 64px; height: 88px; object-fit: contain; }
.favorite-card span { display: flex; flex-direction: column; }
.favorite-card small { color: rgba(221, 228, 244, 0.48); font-size: 0.6rem; }
.favorite-card b { color: #fff; font-size: 0.8rem; }

/* Curated store rewards. */
.gift-type {
  color: rgba(222, 230, 249, 0.52); font-size: 0.64rem; font-weight: 800;
  text-transform: uppercase; letter-spacing: 0;
}
.gift-section-head .hint { margin: 0.45rem 0 0; }
/* Der goldene Seitenhinweis steht allein ueber einem optionalen Giveaway. Die
   eigentliche H1 beginnt erst im allgemeinen Reward-Abschnitt darunter. */
.gift-page-kicker { margin-bottom: 0.9rem; }
.gift-page-kicker > span { margin-bottom: 0; }
.gift-rewards-intro { margin-bottom: 0; }
/* Ueberschrift, Auswahl und Zusatzzeile stehen alle mittig untereinander - der
   ganze Abschnitt ist zentriert, nicht nur seine Ueberschrift. */
.gift-toolbar {
  display: flex; flex-direction: column; align-items: center; gap: 0.75rem;
  margin: 1.1rem 0 1.1rem;
}

/* ---------- Auswahl der Belohnungsart ----------
   BEWUSST kein Segment-Schalter: Belohnungsarten sind Bilder, und ein Kasten mit
   gleitender Pille darum herum hat sie zu Knoepfen gemacht statt zu Motiven. Sie
   stehen jetzt frei nebeneinander, ohne Rahmen und ohne Fuellung.
   Der aktive Eintrag wird an drei Dingen gleichzeitig kenntlich - heller, warmer
   Schein hinter dem Motiv, weisse Schrift, gleitender Strich darunter - damit die
   Auswahl nicht allein an der Helligkeit haengt.
   Die Bilder liegen in assets/gifts/categories/ auf der 216x216-Konvention und
   werden hier auf 56 px gezeigt; deshalb reicht dort eine winzige Datei. */
.gift-filter {
  position: relative; /* Bezugsrahmen des gleitenden Strichs */
  display: flex; flex-wrap: wrap; justify-content: center; align-items: flex-end;
  gap: 0.2rem 0.5rem; max-width: 100%;
}
.gift-filter button {
  display: flex; flex-direction: column; align-items: center; justify-content: flex-end;
  gap: 0.45rem; width: 98px; padding: 0.35rem 0.2rem 0.55rem;
  border: none; border-radius: 0; background: none;
  color: rgba(231, 236, 248, 0.56); font-size: 0.88rem; font-weight: 700;
  transition: color 0.16s ease;
}
/* Der globale `button:hover` faerbt sonst die ganze Flaeche blau. */
.gift-filter button:hover { background: none; color: rgba(255, 255, 255, 0.88); }
.gift-filter button.active { background: none; color: #fff; }
.gift-filter button:focus-visible { outline: 2px solid var(--primary); outline-offset: 2px; border-radius: 8px; }

/* Derselbe gleitende Strich wie unter den Haupt- und Unterreitern, nur golden.
   Bewegt wird er in moveGiftIndicator() - inklusive Y, weil die Reihe umbrechen
   kann und der Strich dann die Zeile wechseln muss. */
.gift-filter .tab-indicator {
  top: 0; bottom: auto; height: 3px; border-radius: 2px;
  background: var(--gold); opacity: 0;
  transition:
    transform 0.28s cubic-bezier(0.4, 0, 0.2, 1),
    width 0.28s cubic-bezier(0.4, 0, 0.2, 1),
    opacity 0.18s ease;
}

.gift-filter-art {
  position: relative; display: flex; align-items: center; justify-content: center; height: 56px;
  opacity: 0.55; transition: opacity 0.18s ease, transform 0.18s ease;
}
/* Warmer Schein hinter dem Motiv - nur beim aktiven Eintrag sichtbar. */
.gift-filter-art::before {
  content: ""; position: absolute; inset: -30% -18%; z-index: 0;
  background: radial-gradient(closest-side, rgba(240, 197, 87, 0.3), rgba(240, 197, 87, 0) 72%);
  opacity: 0; transition: opacity 0.18s ease;
}
.gift-filter-art img {
  position: relative; z-index: 1; max-height: 56px; max-width: 66px; object-fit: contain;
  filter: drop-shadow(0 4px 5px rgba(0, 0, 0, 0.5));
}
/* Zwei Wild Cards, die vordere ueberlappt die hintere - wie .col-fan, nur enger. */
.gift-filter-art.is-fan img { max-width: 44px; }
.gift-filter-art.is-fan img + img { margin-left: -17px; }
/* Platzhalter, solange fuer eine Kategorie kein Bild existiert (kein Emoji). */
.gift-filter-art.is-empty::after {
  content: attr(data-glyph); position: relative; z-index: 1;
  font-size: 1.1rem; font-weight: 800; letter-spacing: 0.06em; opacity: 0.7;
}
.gift-filter button:hover .gift-filter-art { opacity: 0.85; transform: translateY(-2px); }
.gift-filter button.active .gift-filter-art { opacity: 1; transform: translateY(-2px); }
.gift-filter button.active .gift-filter-art::before { opacity: 1; }

/* Name und Anzahl in einer Zeile. Die Zahl steht blank daneben, ohne Kreis und ohne
   Pille - dieselbe Entscheidung wie bei den Zahlen der Events-Rangliste. */
.gift-filter-label { display: inline-flex; align-items: baseline; gap: 0.32rem; line-height: 1.1; }
.gift-filter button em {
  font-style: normal; font-size: 0.8rem; font-weight: 650;
  color: rgba(226, 233, 248, 0.4); transition: color 0.16s ease;
}
.gift-filter button:hover em { color: rgba(226, 233, 248, 0.6); }
.gift-filter button.active em { color: var(--gold); }

/* Leerer Filter (praktisch immer "Others"): kurze Erklaerung statt leerer Flaeche. */
.gift-empty {
  grid-column: 1 / -1; margin: 0; padding: 1.6rem 0;
  color: var(--panel-muted); font-size: 0.85rem; text-align: center;
}

@media (prefers-reduced-motion: reduce) {
  .gift-filter button:hover .gift-filter-art,
  .gift-filter button.active .gift-filter-art { transform: none; }
  .gift-filter .tab-indicator { transition: opacity 0.18s ease; }
}
#gift-status { color: rgba(255, 255, 255, 0.82); font-size: 0.9rem; }

/* Spaltenmass und Abstand des Reward-Rasters. Stehen hier als Token, weil die
   Giveaway-Box ihre Maximalbreite daraus ableitet ("so breit wie drei Rewards"). */
#tab-gifts { --gift-col: 210px; --gift-gap: 0.75rem; }
.gift-grid {
  display: grid; grid-template-columns: repeat(auto-fill, minmax(var(--gift-col), 1fr)); gap: var(--gift-gap);
}
/* Die ganze Kachel ist der Knopf, der das Claim-Fenster oeffnet - deshalb `button`
   mit padding 0 statt der globalen Knopf-Polsterung. */
.gift-card {
  position: relative; display: flex; flex-direction: column; overflow: hidden;
  width: 100%; padding: 0; text-align: left; cursor: pointer;
  border: 1px solid var(--panel-border); border-radius: var(--panel-radius);
  color: var(--panel-text);
  background: var(--panel-bg);
  box-shadow: var(--panel-shadow);
  transition: transform 0.15s ease, box-shadow 0.15s ease, border-color 0.15s ease;
}
/* Der globale `button:hover` faerbt sonst die ganze Kachel blau. */
.gift-card:hover {
  background: var(--panel-bg); transform: translateY(-2px);
  box-shadow: 0 14px 32px rgba(2, 5, 13, 0.34); border-color: var(--deck-btn-hover-border);
}
.gift-card:focus-visible { outline: 2px solid var(--primary); outline-offset: 3px; }
.gift-card::before {
  content: ""; position: absolute; top: 0; left: 8%; right: 8%; height: 1px; z-index: 2;
  background: var(--panel-line);
  box-shadow: 0 0 8px rgba(89, 122, 255, 0.5);
}
/* Die beiden Store-Belohnungen stechen golden heraus. */
.gift-card.is-featured { border-color: rgba(214, 170, 71, 0.55); }
.gift-card.is-featured::before {
  background: linear-gradient(90deg, transparent, #f0c557, #e878d6, transparent);
  box-shadow: 0 0 10px rgba(238, 194, 84, 0.38);
}

.gift-art {
  position: relative; display: grid; place-items: center; height: 150px; overflow: hidden;
  border-bottom: 1px solid rgba(255, 255, 255, 0.08);
  background: linear-gradient(145deg, rgba(108, 42, 127, 0.3), rgba(18, 24, 45, 0.45));
}
/* Strahlen drehen weiter, aber deutlich langsamer und blasser als vorher
   (22s/0.09 waren zu praesent). Sie sollen Tiefe geben, nicht Aufmerksamkeit ziehen. */
.gift-rays {
  position: absolute; width: 260px; height: 260px;
  background: repeating-conic-gradient(from 12deg, rgba(238, 190, 76, 0.05) 0 9deg, transparent 9deg 23deg);
  animation: gift-rays-turn 60s linear infinite;
}
/* Bewusst NICHT animiert: das fruehere Auf und Ab der Icons war im Raster
   mit vielen Kacheln gleichzeitig zu unruhig. */
.gift-art > img {
  position: relative; z-index: 1; max-width: 92%; max-height: 124px; object-fit: contain;
  filter: drop-shadow(0 12px 12px rgba(0, 0, 0, 0.45));
}
/* Platzhalter, solange das Bild der Belohnung fehlt: Kategorie-Kuerzel als Badge (kein Emoji). */
.gift-art.is-empty::after {
  content: attr(data-glyph); position: relative; z-index: 1;
  font-size: 1.3rem; font-weight: 800; letter-spacing: 0.06em; color: #e2e9f8;
  filter: drop-shadow(0 8px 10px rgba(0, 0, 0, 0.45));
  opacity: 0.6;
}
.gift-art.is-empty { background: linear-gradient(145deg, rgba(60, 68, 104, 0.35), rgba(18, 24, 45, 0.5)); }

.gift-body { display: flex; flex-direction: column; align-items: flex-start; gap: 0.1rem; padding: 0.75rem 0.85rem 0.85rem; flex: 1; text-align: left; }
.gift-type { color: var(--gold); }
/* Der Abstand nach unten steht am Namen, nicht am Knopf: `margin-top: auto` am Knopf
   verteilt nur UEBRIGEN Platz und garantiert deshalb gar nichts, wenn die Kachel
   knapp gefuellt ist. So gibt es einen Mindestabstand, und bei hohen Kacheln schiebt
   `auto` den Knopf zusaetzlich nach unten. */
.gift-body h3 { margin: 0.1rem 0 0.95rem; color: var(--panel-text); font-size: 0.95rem; letter-spacing: 0; line-height: 1.25; }
/* Der Knopf steht mittig und nur so breit wie sein Text - wie "Enter" im Giveaway.
   Ueber die volle Kachelbreite gezogen wirkte er wie eine Fussleiste statt wie ein
   Knopf. Flacher als der gemeinsame Grundwert: auf der Kachel ist er der kleinste
   der drei goldenen Knoepfe, nicht der Handlungsaufruf des ganzen Abschnitts. */
.gift-body .gift-cta {
  margin-top: auto; align-self: center;
  min-height: 30px; padding: 0.22rem 1rem; font-size: 0.78rem;
}

/* ---------- Goldener Knopf des Free-Gifts-Bereichs ----------
   EINE Gestalt fuer alle Handlungsaufrufe hier: "Claim" auf den Reward-Kacheln,
   "Enter" im Giveaway und "Turn on Notifications". Vorher war der CTA weiss und der
   Notify-Knopf golden - zwei Primaerknoepfe nebeneinander, die um dieselbe
   Aufmerksamkeit buhlten.
   Der Verlauf steht ausgeschrieben und nicht als var(--gold): das hier ist ein
   zweifarbiger Verlauf von Gelb nach Orange, kein einzelner Farbwert.
   Dunkle Schrift auf Gold, nicht helle - helle Schrift wirkt auf dieser Flaeche duenn. */
/* Die Farbe steckt in Variablen, NICHT direkt in den Regeln. Grund: `button:hover`
   faerbt global blau, jeder eigene Knopf muss seinen Hintergrund im :hover also erneut
   setzen - und Regeln wie `.gift-prize-panel:hover .gift-cta` sind spezifischer als
   `.gift-cta.is-green`. Mit fest eingetragenen Farben hat die gruene Ausfuehrung
   diesen Wettstreit verloren und wurde beim Ueberfahren wieder golden. Ueber
   Variablen gibt es den Wettstreit nicht: eine Zusatzklasse setzt die Variable, und
   alle Regeln lesen dieselbe. */
.gift-cta, .gift-notify-toggle, .builder-main-btn {
  --btn-face: linear-gradient(160deg, #f9cd52 0%, #f0a833 55%, #e2872a 100%);
  --btn-edge: rgba(255, 219, 133, 0.5);
  --btn-ink: #2c1d04;
  --btn-glow: rgba(214, 137, 40, 0.28);
  --btn-glow-strong: rgba(214, 137, 40, 0.38);
  display: inline-flex; align-items: center; justify-content: center; gap: 0.55rem;
  min-height: 40px; padding: 0.5rem 1.15rem; border-radius: 999px;
  border: 1px solid var(--btn-edge);
  background: var(--btn-face);
  color: var(--btn-ink); font-size: 0.82rem; font-weight: 850; text-align: center;
  box-shadow: 0 6px 18px var(--btn-glow);
  transition: transform 0.16s ease, box-shadow 0.16s ease, filter 0.16s ease;
}
/* Der Knopf reagiert NUR, wenn der Zeiger wirklich auf ihm steht - nicht schon, wenn
   die Kachel um ihn herum ueberfahren wird. Vorher stand hier zusaetzlich
   `.gift-card:hover .gift-cta` und `.gift-prize-panel:hover .gift-cta`: dadurch war
   der Knopf immer schon hervorgehoben, sobald man die Box irgendwo beruehrte, und ein
   gezieltes Ansteuern des Knopfes aenderte gar nichts mehr.
   Dieselbe Trennung gilt schon beim Giveaway-Preis (siehe `.gift-art > img:hover`):
   die BOX zeigt, dass sie anklickbar ist, das Element darin reagiert eigenstaendig. */
.gift-cta:hover, .gift-notify-toggle:hover, .gift-notify-toggle.active, .builder-main-btn:hover {
  background: var(--btn-face); border-color: var(--btn-edge);
  color: var(--btn-ink); text-decoration: none;
}
.gift-cta:hover, .gift-notify-toggle:hover, .builder-main-btn:hover {
  filter: brightness(1.06); transform: translateY(-1px);
  box-shadow: 0 9px 22px var(--btn-glow-strong);
}
.gift-cta:focus-visible, .gift-notify-toggle:focus-visible {
  outline: 2px solid var(--primary); outline-offset: 3px;
}
.gift-cta[disabled] { opacity: 0.55; transform: none; box-shadow: none; cursor: not-allowed; }
.gift-cta[disabled]:hover { filter: none; transform: none; }
/* Knopf im Claim-Fenster: dieselbe flache Groesse wie auf der Kachel, und mit echtem
   Abstand zum Text darueber. 0.2rem waren praktisch nichts - der Knopf klebte am
   letzten Satz. Der Abstand steht hier und nicht am Text darueber, weil ueber dem
   Knopf je nach Belohnung mal die Anleitung und mal die Ablaufzeile steht. */
/* Mittig steht er von allein: .modal-box hat text-align: center und der Knopf ist
   inline-flex - dafuer braucht es kein align-self. */
.gift-cta-link {
  margin-top: 1.3rem;
  min-height: 30px; padding: 0.22rem 1.1rem; font-size: 0.78rem;
}
/* Abgelaufene Belohnung: der Knopf sagt nur noch "View" und darf nicht mehr
   locken wie ein offenes Angebot. */
/* Ueber die Variablen, damit der graue Zustand auch beim Ueberfahren haelt - siehe
   den Hinweis zum Farbwettstreit weiter oben. */
.gift-card.is-over .gift-cta {
  --btn-face: var(--panel-inset);
  --btn-edge: var(--panel-inset-border);
  --btn-ink: var(--panel-muted);
  --btn-glow: transparent;
  --btn-glow-strong: transparent;
  box-shadow: none;
}
.gift-card.is-over .gift-cta:hover { filter: none; transform: none; }

/* ---------- Ecken der Reward-Kachel ----------
   Links oben "New", rechts oben die Restzeit. Zwei verschiedene Aussagen, deshalb
   zwei verschiedene Formen UND Farben: das Band ist rot und liegt schraeg in der
   Ecke, der Zeit-Chip ist bernsteinfarben und waagerecht. Wird es knapp, wechselt
   der Chip auf Rot - dann sind zwar beide rot, aber die Formen bleiben eindeutig
   unterscheidbar. */

/* Schraeges Band in der oberen linken Ecke. Der quadratische Rahmen ist nur die
   Blende: er schneidet das gedrehte Band an der Kachelkante sauber ab. */
.gift-flag-new {
  position: absolute; top: 0; left: 0; z-index: 3;
  width: 78px; height: 78px; overflow: hidden; pointer-events: none;
}
.gift-flag-new i {
  position: absolute; top: 13px; left: -25px; display: block; width: 106px;
  padding: 0.16rem 0; transform: rotate(-45deg);
  background: linear-gradient(160deg, #f2564a 0%, #d92f2f 55%, #b32222 100%);
  color: #fff; font-size: 0.6rem; font-weight: 900; font-style: normal;
  letter-spacing: 0.16em; text-align: center; text-transform: uppercase;
  box-shadow: 0 3px 10px rgba(3, 6, 14, 0.45);
}

/* Ablauf-Chip. Ohne `expires` im JSON existiert er gar nicht. Auf der Kachel steht
   nur die nackte Restzeit ("6d 3h") - das Symbol sagt schon, dass es um Zeit geht. */
.gift-expiry {
  position: absolute; top: 0.5rem; right: 0.5rem; z-index: 3;
  display: inline-flex; align-items: center; gap: 0.26rem;
  padding: 0.16rem 0.48rem; border: 1px solid rgba(240, 168, 51, 0.55); border-radius: 999px;
  background: rgba(12, 10, 6, 0.72); color: #f7c65a;
  font-size: 0.66rem; font-weight: 850; letter-spacing: 0.01em;
}
.gift-expiry-ico { width: 13px; height: 13px; object-fit: contain; flex: none; }
.gift-expiry.is-urgent { border-color: rgba(224, 65, 58, 0.6); color: #ff8a7a; }
.gift-expiry.is-expired { border-color: var(--panel-inset-border); color: var(--panel-dim); }
/* ---------- Abgelaufene Belohnungen ----------
   Eigener Abschnitt unter den aktiven. Er ist als Ganzes zurueckgenommen - eine
   duenne Trennlinie darueber statt eines eigenen Kastens, wie ueberall auf der Seite
   (ui-design/SKILL.md, Abschnitt 1b). */
.gift-expired {
  margin-top: 2.2rem; padding-top: 1.2rem;
  border-top: 1px solid var(--panel-inset-border);
}
.gift-expired[hidden] { display: none; }
.gift-expired-head { text-align: center; margin-bottom: 1rem; }
.gift-expired-head h3 { margin: 0; color: var(--panel-muted); font-size: 1.1rem; letter-spacing: 0; }
.gift-expired-head .hint { margin: 0.3rem auto 0; }

.gift-card.is-over { opacity: 0.6; }
/* Der Hover hebt eine abgelaufene Kachel nicht mehr an und laesst den Rahmen ruhig -
   sie soll sich nicht anfuehlen wie ein offenes Angebot. Anklickbar bleibt sie. */
.gift-card.is-over:hover {
  transform: none; border-color: var(--panel-border);
  box-shadow: var(--panel-shadow); opacity: 0.78;
}
.gift-card.is-over::before { background: var(--panel-inset-border); box-shadow: none; }
.gift-card.is-over .gift-art > img { filter: grayscale(0.7) drop-shadow(0 12px 12px rgba(0, 0, 0, 0.45)); }
.gift-modal-expiry { margin: 0.35rem 0 0; color: var(--panel-muted); font-size: 0.76rem; font-weight: 700; }
.gift-modal-expiry.is-urgent { color: var(--loss); }
.gift-modal-expiry.is-expired { color: var(--panel-dim); }

/* Das Bild der Belohnung im Claim-Fenster steht FREI - keine Buehne, kein Rahmen,
   kein eigener Hintergrund (ui-design/SKILL.md, Abschnitt 1b: ein einzelnes Element
   bekommt keine eigene Box). Vom Text getrennt wird es allein durch Abstand; der
   Schlagschatten setzt das freigestellte PNG vom Panel ab. */
.gift-modal-img {
  display: block; max-width: 78%; max-height: 150px; margin: 0.9rem auto 0.3rem;
  object-fit: contain;
  filter: drop-shadow(0 12px 14px rgba(0, 0, 0, 0.5));
}
/* Die Anleitung ist der wichtigste Satz im Fenster - sie sagt, was am Zielort zu tun
   ist. Deshalb heller und schwerer als die Beschreibung darueber. */
.gift-modal-how {
  margin: 0.55rem 0 0; color: var(--panel-text); font-size: 0.86rem; font-weight: 700;
}

/* "Turn on Notifications" teilt sich die Gestalt mit .gift-cta (siehe oben) und
   ergaenzt nur, was ihn davon unterscheidet: etwas groesser, und aufgeklappt sitzt
   er sichtbar "gedrueckt", damit klar ist, dass das Feld darunter zu ihm gehoert. */
.gift-notify-toggle { min-height: 42px; padding: 0.55rem 1.25rem; font-size: 0.88rem; }
.gift-notify-toggle.active {
  transform: none; filter: brightness(0.96);
  box-shadow: inset 0 2px 6px rgba(88, 50, 4, 0.35);
}
.gift-bell { flex: 0 0 auto; transform-origin: 50% 15%; }
.gift-notify-toggle:hover .gift-bell { animation: gift-bell-ring 0.75s ease; }
@keyframes gift-bell-ring {
  0%, 100% { transform: rotate(0deg); }
  20% { transform: rotate(13deg); }
  45% { transform: rotate(-10deg); }
  70% { transform: rotate(6deg); }
}
@media (prefers-reduced-motion: reduce) {
  .gift-notify-toggle:hover .gift-bell { animation: none; }
  .gift-notify-toggle:hover { transform: none; }
}
/* Steht unter einem mittigen Knopf und ist deshalb selbst mittig und schmal - ueber
   die volle Rasterbreite gezogen sah das Feld aus wie ein zweiter Abschnitt. */
.gift-notify {
  position: relative; /* Bezugsrahmen fuer das Kreuz oben rechts */
  display: flex; flex-direction: column; gap: 0.55rem;
  max-width: 520px; margin: 0 auto 1.2rem; padding: 0.85rem 0.95rem;
  border: 1px solid var(--panel-border); border-radius: var(--panel-radius);
  background: var(--panel-bg); box-shadow: var(--panel-shadow);
}
.gift-notify[hidden] { display: none; }
/* Kreuz zum Wegklicken. Sitzt absolut in der Ecke, damit es keine Zeile belegt, und
   die Ueberschrift bekommt rechts Platz, damit langer Text nicht darunter laeuft. */
.gift-notify-close {
  position: absolute; top: 0.5rem; right: 0.5rem;
  display: grid; place-items: center; width: 26px; height: 26px; min-height: 0;
  padding: 0; border-radius: 50%;
  border: 1px solid var(--panel-inset-border); background: var(--panel-inset);
  color: var(--panel-muted);
  transition: color 0.15s ease, border-color 0.15s ease;
}
.gift-notify-close:hover {
  background: var(--panel-inset); border-color: var(--deck-btn-hover-border); color: var(--panel-text);
}
.gift-notify-close:focus-visible { outline: 2px solid var(--primary); outline-offset: 2px; }
.gift-notify-copy { padding-right: 2rem; }
.gift-notify-copy h3 { margin: 0; color: var(--panel-text); font-size: 0.95rem; }
.gift-notify-copy p { margin: 0.2rem 0 0; color: var(--panel-muted); font-size: 0.76rem; }
.gift-notify-row { display: flex; align-items: center; gap: 0.5rem; flex-wrap: wrap; }
/* `display: flex` oben gewinnt sonst gegen das Browser-Standardverhalten von `hidden`
   (Autor-Regeln schlagen User-Agent-Regeln immer, unabhaengig von der Spezifitaet) -
   ohne das hier bleibt die Code-Zeile trotz `hidden`-Attribut sichtbar. */
.gift-notify-row[hidden] { display: none; }
.gift-notify-row input[type="email"] {
  flex: 1; min-width: 200px; max-width: 320px;
  padding: 0.5rem 0.7rem; border: 1px solid rgba(255, 255, 255, 0.16); border-radius: var(--radius-sm);
  background: rgba(11, 13, 18, 0.92); color: var(--panel-text); font-size: 0.85rem;
}
.gift-notify-row input[type="email"]::placeholder { color: var(--panel-dim); }
.gift-notify-row input[type="email"]:focus {
  outline: none; border-color: var(--deck-btn-hover-border); box-shadow: 0 0 0 3px rgba(59, 110, 245, 0.15);
}
.gift-notify-status:empty { display: none; }
.gift-notify-status { margin: 0; color: var(--panel-muted); font-size: 0.74rem; }

/* Vier separate Kaestchen statt eines Textfelds - jedes zeigt genau ein Zeichen, gross
   und mittig, wie bei einer Authenticator-App. Wirklich QUADRATISCH (Eliass 08.08.2026:
   "die sind so breit wie hoch, mehr ist es nicht") - `input.gift-code-box` statt nur
   `.gift-code-box`, weil sonst das globale `input[type="text"]` weiter oben (min-width
   200px!) durch die hoehere Selektor-Spezifitaet gewinnt und die Kaestchen weit ueber
   die Box hinaus aufblaeht. */
.gift-code-boxes { display: flex; gap: 0.4rem; }
input.gift-code-box {
  flex: none; width: 2.75rem; min-width: 0; max-width: none; height: 2.75rem;
  padding: 0; text-align: center;
  border: 1px solid rgba(255, 255, 255, 0.16); border-radius: var(--radius-sm);
  background: rgba(11, 13, 18, 0.92); color: var(--panel-text);
  font-size: 1.35rem; font-weight: 800; letter-spacing: 0; text-transform: uppercase;
}
input.gift-code-box:focus {
  outline: none; border-color: var(--deck-btn-hover-border); box-shadow: 0 0 0 3px rgba(59, 110, 245, 0.15);
}
.gift-notify-code-hint { margin: 0; color: var(--panel-muted); font-size: 0.76rem; }
.gift-notify-code-hint[hidden] { display: none; }

/* Erfolgsanzeige jetzt im globalen Popup (Eliass 08.08.2026: "dann kommt ein Popup und
   in diesem Popup kommt dann diese gruene Animation") statt inline im Formular - siehe
   giftNotifySuccessModalHtml() in app.js, das dieses Markup in openModal() einsetzt.
   Gruener Haken zeichnet sich einmal nach, damit "es hat geklappt" auch ohne Lesen des
   Satzes sofort erkennbar ist. */
.gift-notify-success-modal { display: flex; flex-direction: column; align-items: center;
  gap: 0.7rem; text-align: center; padding: 0.4rem 0.2rem; }
.gift-notify-success-modal p { margin: 0; color: var(--panel-text); font-size: 0.88rem; line-height: 1.45; }
.gift-notify-success-check { flex: none; overflow: visible; }
.gift-notify-success-circle {
  stroke: #3ecf6e; stroke-width: 2.5;
  stroke-dasharray: 151; stroke-dashoffset: 151;
  animation: gift-success-circle 0.45s ease-out forwards;
}
.gift-notify-success-tick {
  stroke: #3ecf6e; stroke-width: 3.5; stroke-linecap: round; stroke-linejoin: round;
  stroke-dasharray: 34; stroke-dashoffset: 34;
  animation: gift-success-tick 0.3s 0.4s ease-out forwards;
}
@keyframes gift-success-circle { to { stroke-dashoffset: 0; } }
@keyframes gift-success-tick { to { stroke-dashoffset: 0; } }
@media (prefers-reduced-motion: reduce) {
  .gift-notify-success-circle, .gift-notify-success-tick { animation: none; stroke-dashoffset: 0; }
}

/* Gelber Warnhinweis im Erfolgs-Popup - dieselbe Sprache wie .col-tap-tip (Player/
   Collection: "cards can be clicked"), damit Hinweise auf der ganzen Seite einheitlich
   aussehen. Kleines Ausrufezeichen-Icon davor macht auf einen Blick klar: das ist ein
   Hinweis, kein Fliesstext. */
.gift-notify-tip {
  display: flex; align-items: center; justify-content: center; gap: 0.4rem;
  margin: 0; color: #fbbf24; font-weight: 700; font-size: 0.8rem;
}
.gift-notify-tip-icon {
  flex: none; display: grid; place-items: center; width: 15px; height: 15px;
  border-radius: 50%; background: #fbbf24; color: #241c02;
  font-size: 0.68rem; font-weight: 800; line-height: 1;
}

/* Streamer-Setup: gleicher gelber Tip wie .gift-notify-tip/.col-tap-tip, nur linksbuendig
   statt zentriert - die Setup-Schritte sind ein Formular, kein Popup. */
.streamer-tip {
  display: flex; align-items: center; gap: 0.4rem;
  margin: 0.6rem 0 0; color: #fbbf24; font-weight: 700; font-size: 0.8rem;
}
.streamer-tip-icon {
  flex: none; display: grid; place-items: center; width: 15px; height: 15px;
  border-radius: 50%; background: #fbbf24; color: #241c02;
  font-size: 0.68rem; font-weight: 800; line-height: 1;
}

/* Giveaway-Bereich: eigener Abschnitt VOR den Rewards, mittig und hoechstens so
   breit wie DREI Reward-Kacheln - nicht ueber die volle Rasterbreite. Ist kein
   Giveaway aktiv, faellt der Abschnitt weg und die Rewards ruecken nach oben. */
.gift-giveaway {
  max-width: calc(var(--gift-col) * 3 + var(--gift-gap) * 2);
  margin: 0 auto 1.9rem;
}
.gift-giveaway[hidden] { display: none; }
.gift-section-head { margin-bottom: 0.7rem; }
.gift-section-head h3 { margin: 0.08rem 0 0; color: var(--panel-text); font-size: 1.1rem; }
/* Mittig zentrierte Abschnittskoepfe: gross die Ueberschrift, klein eine Zeile darunter. */
.gift-head-center { text-align: center; margin-bottom: 1rem; }
.gift-head-center h2 {
  margin: 0; color: #fff; font-size: 1.75rem; letter-spacing: 0; line-height: 1.15;
}
/* `.hint` ist auf 60ch begrenzt. Ohne `auto` an den Seiten bleibt dieser schmalere
   Block links kleben und der Satz steht sichtbar aus der Mitte, obwohl der Text
   selbst zentriert ist. */
.gift-head-center .hint { margin: 0.3rem auto 0; }
.gift-rewards .gift-head-center { margin-top: 0.4rem; }

.gift-giveaway-grid { display: grid; gap: var(--gift-gap); }
/* Die Kachel ist der Rahmen, das Teilnahme-Overlay legt sich deckungsgleich darueber -
   deshalb position: relative und eine gemeinsame Mindesthoehe. */
.gift-prize-panel {
  position: relative; display: block; min-height: 300px;
  border: 1px solid rgba(214, 170, 71, 0.5); border-radius: var(--panel-radius);
  background: var(--panel-bg); box-shadow: var(--panel-shadow); overflow: hidden;
  transition: border-color 0.15s ease, box-shadow 0.15s ease;
}
/* Rueckmeldung fuer die ganze Kachel, gleiche Idee wie `.gift-card:hover` - nur in
   Gold statt Blau, weil das Giveaway durchgehend golden gerahmt ist. */
.gift-prize-panel:hover {
  border-color: rgba(240, 197, 87, 0.85);
  box-shadow: 0 14px 32px rgba(2, 5, 13, 0.34), 0 0 0 1px rgba(240, 197, 87, 0.18);
}
/* Leuchtende Oberkante wie bei den hervorgehobenen Reward-Kacheln (.gift-card.is-featured) -
   das Giveaway ist das Aushaengeschild der Seite und traegt dieselbe goldene Linie. */
.gift-prize-panel::before {
  content: ""; position: absolute; top: 0; left: 8%; right: 8%; height: 1px; z-index: 4;
  background: linear-gradient(90deg, transparent, #f0c557, #e878d6, transparent);
  box-shadow: 0 0 10px rgba(238, 194, 84, 0.38);
}
.gift-prize-face {
  display: flex; flex-direction: column; width: 100%; height: 100%; min-height: 300px;
  padding: 0; border: 0; background: none; color: inherit; cursor: pointer; text-align: center;
}
.gift-prize-face:hover { background: none; }
.gift-prize-face:focus-visible { outline: 2px solid var(--primary); outline-offset: -3px; }
.gift-prize-panel .gift-art {
  height: 200px;
  background: linear-gradient(145deg, rgba(245, 185, 59, 0.18), rgba(18, 24, 45, 0.62));
}
/* Der Preis steht vor allen Lichtebenen und bekommt einen kraeftigeren Schatten,
   damit er im Scheinwerfer wirklich "steht" statt aufgeklebt zu wirken. */
.gift-prize-panel .gift-art > img {
  z-index: 3; max-height: 168px;
  filter: drop-shadow(0 16px 18px rgba(0, 0, 0, 0.62)) drop-shadow(0 0 22px rgba(255, 206, 116, 0.28));
  transition: transform 0.28s cubic-bezier(0.2, 0.8, 0.2, 1), filter 0.28s ease;
}
/* Zwei getrennte Hover-Ebenen, bewusst nicht am Button aufgehaengt:
   die BOX zeigt nur, dass sie anklickbar ist (Rahmen), der PREIS reagiert erst,
   wenn der Zeiger wirklich auf dem Bild steht. */
.gift-prize-panel .gift-art > img:hover {
  transform: translateY(-5px) scale(1.05);
  filter: drop-shadow(0 20px 22px rgba(0, 0, 0, 0.66)) drop-shadow(0 0 30px rgba(255, 206, 116, 0.46));
}
.gift-prize-art:has(> img:hover) .gift-prize-glow { opacity: 1; }
@media (prefers-reduced-motion: reduce) {
  .gift-prize-panel .gift-art > img:hover { transform: none; }
}

/* Hintergrund-Artwork, stark geblurrt. Zwei Kunstgriffe: `scale` schiebt die weichen
   Blur-Raender aus dem sichtbaren Bereich, und die Maske laesst das Bild zu beiden
   Seiten auslaufen, statt hart an der Kachelkante abzureissen. */
.gift-prize-backdrop {
  position: absolute; inset: 0; z-index: 0;
  /* Y-Position 16 % holt das goldene Himmelsband mit der Sonne in den Ausschnitt.
     Die Kachel ist sehr breit und flach, es ist also immer nur ein schmaler Streifen
     zu sehen - weiter unten kaeme nur dunkles Laub und alles wirkt braun. */
  background: url("assets/gifts/giveaway/backdrop-forbidden-city.jpg") center 16% / cover no-repeat;
  transform: scale(1.12);
  /* Blur entsaettigt spuerbar, deshalb wird die Saettigung gegengehalten. */
  filter: blur(6px) saturate(1.25);
  opacity: 0.5;
  -webkit-mask-image: linear-gradient(90deg, transparent, #000 24%, #000 76%, transparent);
  mask-image: linear-gradient(90deg, transparent, #000 24%, #000 76%, transparent);
}
/* Vignette statt gleichmaessigem Schleier: aussen deutlich dunkler, zur Mitte hin offen.
   Das dunkle Umfeld ist der eigentliche Trick - erst dadurch treten Lichtkegel und
   Partikel ueberhaupt hervor, ohne dass man sie greller machen muss. */
.gift-prize-art::before {
  content: ""; position: absolute; inset: 0; z-index: 0;
  background: radial-gradient(72% 128% at 50% 46%, rgba(8, 11, 24, 0.12), rgba(5, 8, 18, 0.82) 76%);
}
/* Warmer Lichtteppich hinter dem Preis, der zu den Seiten ausbleicht. */
.gift-prize-glow {
  position: absolute; inset: 0; z-index: 0;
  background: radial-gradient(46% 62% at 50% 54%, rgba(247, 197, 92, 0.4), rgba(247, 197, 92, 0.11) 48%, transparent 74%);
  opacity: 0.8; transition: opacity 0.25s ease;
}

/* Scheinwerfer. Gleiche Bildsprache wie `.mt-spotlight` beim Merge-Tactics-Podium:
   Kegel per clip-path (oben schmal, unten breit), warmes Licht, `screen`, damit es
   sich addiert statt zu ueberdecken. Zusaetzlich der Lichtfleck, in dem der Kegel
   auf dem Boden auftrifft - ohne den haengt der Strahl in der Luft. */
.gift-prize-beam {
  position: absolute; left: 0; right: 0; top: -18%; bottom: 0; z-index: 1; pointer-events: none;
  background:
    linear-gradient(180deg, rgba(255, 246, 206, 0.5), rgba(255, 220, 128, 0.17) 54%, transparent 88%);
  clip-path: polygon(41% 0, 59% 0, 88% 100%, 12% 100%);
  filter: blur(3px);
  mix-blend-mode: screen;
  /* Ausgangslage: zu einem senkrechten Strich in der Mitte zusammengeklappt und
     unsichtbar. Das Aufklappen loest `replayGiveawayIntro()` per `.is-lit` aus,
     jedes Mal wenn der Tab geoeffnet wird. */
  transform: scaleX(0.05); transform-origin: 50% 38%; opacity: 0;
}
/* Auftreffpunkt: flache Ellipse am Fuss des Preises. */
.gift-prize-beam::after {
  content: ""; position: absolute; left: 8%; right: 8%; bottom: -6%; height: 34%;
  background: radial-gradient(ellipse at 50% 50%, rgba(255, 238, 178, 0.26), transparent 68%);
  filter: blur(5px);
}
@media (prefers-reduced-motion: no-preference) {
  /* Zwei Animationen nacheinander: erst faehrt der Kegel auf, danach uebernimmt das
     Flackern. Das Flackern steht in der Liste hinten und gewinnt deshalb ab Sekunde 1
     die Deckkraft, waehrend `forwards` vom Aufklappen die Breite haelt. */
  .gift-prize-beam.is-lit {
    animation:
      gift-beam-open 820ms cubic-bezier(0.16, 0.9, 0.24, 1) 120ms forwards,
      gift-beam-flicker 13s linear 1s infinite;
  }
}
/* Ohne Bewegung steht der Kegel einfach offen da. */
@media (prefers-reduced-motion: reduce) {
  .gift-prize-beam.is-lit { transform: scaleX(1); opacity: 1; }
}
@keyframes gift-beam-open {
  0%   { transform: scaleX(0.05); opacity: 0; }
  55%  { opacity: 1; }
  100% { transform: scaleX(1); opacity: 1; }
}
/* Wie eine Lampe mit Wackelkontakt: lange ruhig, dann zwei kurze Aussetzer.
   `linear` statt `ease`, damit die Aussetzer hart schalten und nicht weich pumpen. */
@keyframes gift-beam-flicker {
  0%, 33%     { opacity: 1; }
  33.6%       { opacity: 0.32; }
  34.2%       { opacity: 1; }
  35.1%       { opacity: 0.5; }
  35.7%       { opacity: 0.96; }
  36.3%       { opacity: 0.4; }
  37%, 70%    { opacity: 1; }
  70.5%       { opacity: 0.28; }
  71.1%       { opacity: 1; }
  72%         { opacity: 0.55; }
  72.6%, 100% { opacity: 1; }
}

/* Grosse, weiche Lichtpunkte. Sie treiben sehr langsam nach oben und schwingen dabei
   leicht seitlich - gross und blass statt klein und schnell, damit es ruhig wirkt.
   Werte je Partikel ueber nth-child, damit kein Inline-Style noetig ist. */
/* Ueber dem Lichtkegel, aber unter dem Preis: die Partikel sollen im Strahl
   sichtbar sein, nicht vor dem Item schweben. */
.gift-prize-motes { position: absolute; inset: 0; z-index: 2; overflow: hidden; mix-blend-mode: screen; }
.gift-prize-motes i {
  --dx: 18px;          /* seitlicher Versatz auf halber Strecke, je Partikel anders */
  --travel: -230%;     /* Gesamtweg nach oben */
  position: absolute; bottom: -40%; width: 110px; height: 110px; border-radius: 50%;
  background: radial-gradient(circle, rgba(255, 238, 196, 0.62), rgba(255, 212, 128, 0.2) 45%, transparent 70%);
  opacity: 0; filter: blur(1px);
  /* Ohne eigene Compositing-Ebene rundet der Browser die Position auf ganze Pixel.
     Bei diesem langsamen Tempo bewegt sich ein Partikel weniger als 1 px pro Frame -
     dann sieht die Bewegung ruckelig aus, obwohl sie fluessig gemeint ist. */
  will-change: transform, opacity;
  backface-visibility: hidden;
}
/* Groesse, Startpunkt und Drift bewusst ungleich verteilt: gleiche Werte lassen die
   Partikel im Gleichschritt marschieren. Die unterschiedlichen `bottom` sorgen dafuer,
   dass nicht alle von der Unterkante kommen. */
.gift-prize-motes i:nth-child(1) { left:  2%; width: 150px; height: 150px; bottom: -55%; --dx:  26px; --travel: -240%; }
.gift-prize-motes i:nth-child(2) { left: 19%; width:  92px; height:  92px; bottom: -15%; --dx: -20px; --travel: -210%; }
.gift-prize-motes i:nth-child(3) { left: 31%; width: 168px; height: 168px; bottom: -70%; --dx:  14px; --travel: -260%; }
.gift-prize-motes i:nth-child(4) { left: 49%; width: 104px; height: 104px; bottom: -30%; --dx: -30px; --travel: -225%; }
.gift-prize-motes i:nth-child(5) { left: 64%; width: 156px; height: 156px; bottom: -60%; --dx:  22px; --travel: -250%; }
.gift-prize-motes i:nth-child(6) { left: 79%; width:  88px; height:  88px; bottom:  -8%; --dx: -16px; --travel: -205%; }
.gift-prize-motes i:nth-child(7) { left: 89%; width: 132px; height: 132px; bottom: -45%; --dx:  30px; --travel: -235%; }
@media (prefers-reduced-motion: no-preference) {
  /* Schneller als zuvor (war 24-44s): so langsam wirkte es nicht ruhig, sondern hakelig. */
  .gift-prize-motes i { animation: gift-mote-drift linear infinite; }
  .gift-prize-motes i:nth-child(1) { animation-duration: 21s; animation-delay:  -3s; }
  .gift-prize-motes i:nth-child(2) { animation-duration: 17s; animation-delay:  -9s; }
  .gift-prize-motes i:nth-child(3) { animation-duration: 26s; animation-delay: -14s; }
  .gift-prize-motes i:nth-child(4) { animation-duration: 19s; animation-delay:  -6s; }
  .gift-prize-motes i:nth-child(5) { animation-duration: 24s; animation-delay: -18s; }
  .gift-prize-motes i:nth-child(6) { animation-duration: 15s; animation-delay: -11s; }
  .gift-prize-motes i:nth-child(7) { animation-duration: 22s; animation-delay: -20s; }
}
/* Ein- und Ausblenden liegt in der Kurve, damit nichts an den Kanten "aufpoppt". */
@keyframes gift-mote-drift {
  0%   { transform: translate3d(0, 0, 0);                                          opacity: 0; }
  18%  { opacity: 0.5; }
  50%  { transform: translate3d(var(--dx), calc(var(--travel) / 2), 0);            opacity: 0.62; }
  82%  { opacity: 0.45; }
  100% { transform: translate3d(calc(var(--dx) * -0.6), var(--travel), 0);         opacity: 0; }
}
.gift-prize-copy {
  display: flex; flex-direction: column; align-items: center; gap: 0.7rem;
  padding: 0.95rem 1rem 1.1rem; flex: 1; justify-content: center;
}
.gift-prize-copy h3 { margin: 0; color: var(--panel-text); font-size: 1.05rem; letter-spacing: 0; }
/* Der Beschreibungstext unter dem Titel. Gedeckt und schmal gehalten: er erklaert den
   Preis, er soll ihn nicht ueberschreien. Zwei Zeilen sind das Maximum - laenger und
   die Kachel waechst ungleichmaessig gegenueber ihren Nachbarn. Der Rest wird
   abgeschnitten, statt die Kachel zu sprengen. */
.gift-prize-detail {
  color: var(--panel-muted); font-size: 0.82rem; line-height: 1.35;
  text-align: center; max-width: 46ch; margin-top: -0.25rem;
  display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2;
  overflow: hidden;
}

/* Eckdaten unter dem Preis. Kein Kasten je Wert - getrennt wird ueber duenne
   senkrechte Linien, Abstand und Schriftgewicht (ui-design/SKILL.md, Abschnitt 1b).
   Waagerechte Linie darueber, damit der Bereich unter dem Bild eine erkennbare
   Struktur bekommt statt frei im Grau zu haengen. */
/* Seit die Zahl der Sieger dazugekommen ist, koennen es bis zu fuenf Werte sein
   (Entry, Winners, Closes, Time left, Entries). Auf schmalen Schirmen passen die nicht
   mehr nebeneinander, deshalb darf die Zeile umbrechen statt die Werte zu quetschen -
   `white-space: nowrap` auf den Zahlen wuerde sonst aus der Kachel herauslaufen. */
.gift-prize-facts {
  display: flex; align-items: stretch; justify-content: center; flex-wrap: wrap;
  row-gap: 0.6rem; width: 100%; padding-top: 0.7rem;
  border-top: 1px solid var(--panel-line, rgba(255, 255, 255, 0.09));
}
.gift-prize-fact {
  display: flex; flex-direction: column; align-items: center; gap: 0.1rem;
  flex: 1 1 5.5rem; min-width: 0; padding: 0 0.6rem;
}
.gift-prize-fact + .gift-prize-fact { border-left: 1px solid rgba(255, 255, 255, 0.08); }
.gift-prize-fact strong {
  color: var(--panel-text); font-size: 1rem; font-weight: 850; line-height: 1.1;
  letter-spacing: -0.01em; white-space: nowrap;
}
.gift-prize-fact small { color: var(--panel-muted); font-size: 0.68rem; font-weight: 650; }
/* Die beiden guten Nachrichten in Gruen: dass es nichts kostet und wie viele schon
   mitmachen. Datum und Restzeit bleiben neutral - Gruen ueberall waere kein Signal
   mehr. Dasselbe Gruen wie beim erledigten Schritt und bei "Successfully entered!". */
.gift-prize-fact[data-fact="entry"] strong,
.gift-prize-fact[data-fact="entries"] strong { color: #7ede6a; }

/* ---------- Konfetti ----------
   Liegt ueber allem, auch ueber dem Teilnahme-Overlay (z-index 3) und der goldenen
   Oberkante (4). Es faengt keine Klicks ab und traegt keine Information; die
   Elemente werden nach dem Lauf aus dem DOM entfernt (burstConfetti in app.js). */
.gift-confetti {
  position: absolute; inset: 0; z-index: 6; overflow: hidden; pointer-events: none;
}
.gift-confetti i {
  position: absolute; top: -14px; left: var(--x);
  width: var(--w); height: var(--h); border-radius: 1px;
  opacity: 0;
  /* Kurz beschleunigen, dann gleichmaessig sinken - echtes Papier faellt nicht
     schneller und schneller, es erreicht seine Sinkgeschwindigkeit und behaelt sie. */
  animation: gift-confetti-fall var(--dur) cubic-bezier(0.32, 0.16, 0.5, 1) var(--delay) forwards;
  will-change: transform, opacity;
}
/* Zwei Drehachsen: `rotate` fuer den Wirbel in der Bildebene, `rotate3d` um die
   Waagerechte, damit die Schnipsel zwischendurch schmal werden und wie echte
   Papierstuecke kippen statt als flache Rechtecke zu segeln. */
@keyframes gift-confetti-fall {
  0%   { transform: translate3d(0, 0, 0) rotate(var(--tilt)); opacity: 0; }
  /* Deckkraft bleibt lange voll und geht erst zum Schluss weg. Ein Verlauf ueber die
     ganze Flugzeit liess die Schnipsel schon auf halber Strecke blass werden. */
  8%   { opacity: 1; }
  84%  { opacity: 1; }
  100% {
    transform: translate3d(var(--dx), var(--fall), 0) rotate(calc(var(--tilt) + var(--spin)))
               rotate3d(1, 0.4, 0, 720deg);
    opacity: 0;
  }
}

.gift-prize-entry {
  position: absolute; inset: 0; z-index: 3; display: flex; flex-direction: column;
  padding: 1.1rem 1.2rem; background: var(--panel-bg);
}
.gift-prize-entry[hidden] { display: none; }
.gift-prize-entry-body {
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: 0.45rem; flex: 1; text-align: center;
}
.gift-prize-entry-body h3 { margin: 0; color: var(--panel-text); font-size: 1.05rem; }
/* Nur noch das Zurueck-Zeichen, kein Wort: derselbe selbstgezeichnete Winkel wie in
   `.geier-back-ico` (Streamer-/Builder-Bereich), damit "zurueck" ueberall gleich
   aussieht. Absichtlich als SVG und nicht als Textpfeil - ein Zeichen aus der
   Schriftart sitzt je nach Font anders und laesst sich nicht sauber zentrieren.
   Steht absolut in der Ecke, damit der Inhalt darunter ganz oben anfangen kann. */
.gift-prize-back {
  position: absolute; top: 0.6rem; left: 0.6rem; z-index: 2;
  display: grid; place-items: center; width: 28px; height: 28px; min-height: 0;
  padding: 0; border-radius: 50%;
  border: 1px solid var(--panel-inset-border); background: var(--panel-inset);
  color: var(--panel-muted); cursor: pointer;
  transition: color 0.15s ease, border-color 0.15s ease, transform 0.15s ease;
}
.gift-prize-back:hover {
  background: var(--panel-inset); border-color: var(--deck-btn-hover-border);
  color: var(--panel-text); transform: translateX(-1px);
}
.gift-prize-back svg { width: 15px; height: 15px; }

/* ---------- Teilnahme in drei Schritten ----------
   Alles ist so eng gesetzt, dass die drei Schritte in die Kachel passen, OHNE dass
   man scrollen muss - deshalb faengt der Inhalt oben an (kein Zentrieren), der
   Zurueck-Knopf liegt absolut in der Ecke statt eine eigene Zeile zu belegen, und
   die Abstaende sind knapper als sonst auf der Seite. */
.gift-prize-entry { padding: 0.75rem 0.9rem 0.85rem; }
.gift-prize-entry-body { justify-content: flex-start; gap: 0.15rem; }
.gift-prize-entry-body h3 { font-size: 1rem; }
.gift-prize-entry-body > .hint { margin: 0 0 0.1rem; font-size: 0.76rem; }

.giveaway-steps {
  display: flex; flex-direction: column;
  width: 100%; margin: 0.15rem 0 0; padding: 0; list-style: none; text-align: left;
}
.giveaway-step {
  display: grid; grid-template-columns: 24px minmax(0, 1fr); align-items: start; gap: 0.55rem;
  padding: 0.45rem 0.1rem;
  transition: opacity 0.2s ease;
}
.giveaway-step + .giveaway-step { border-top: 1px solid rgba(255, 255, 255, 0.07); }
/* Gesperrte Schritte treten zurueck und nehmen keine Eingaben an - das Schloss allein
   waere nur Dekoration, die Felder sind zusaetzlich `disabled`. */
.giveaway-step.is-locked { opacity: 0.42; }
.giveaway-step.is-done { opacity: 0.72; }

.giveaway-step-mark {
  display: grid; place-items: center; width: 24px; height: 24px; border-radius: 50%;
  border: 1px solid var(--panel-inset-border); background: var(--panel-inset);
  color: var(--panel-muted); font-size: 0.74rem; font-weight: 850;
}
.giveaway-step-mark img { width: 14px; height: 14px; object-fit: contain; opacity: 0.85; }
.giveaway-step-mark.is-open { border-color: rgba(240, 197, 87, 0.6); color: var(--gold); }
.giveaway-step-mark.is-done {
  border-color: rgba(70, 194, 87, 0.6); background: rgba(70, 194, 87, 0.14); color: #7ede6a;
}

/* `align-items: flex-start` ist hier nicht kosmetisch, sondern die Regel: eine Spalte
   dehnt ihre Kinder sonst auf volle Breite, und der Knopf in Schritt 1 lief dadurch
   ueber die ganze Kachel. Knoepfe sind so breit wie ihr Text, nie breiter. */
.giveaway-step-body {
  display: flex; flex-direction: column; align-items: flex-start; gap: 0.35rem; min-width: 0; width: 100%;
}
.giveaway-step-title { margin: 0; color: var(--panel-text); font-size: 0.83rem; font-weight: 750; }
.giveaway-step-note { margin: 0; color: var(--panel-muted); font-size: 0.71rem; }
.giveaway-step-note.is-error { color: var(--loss); }
.giveaway-step-note:empty { display: none; }
.giveaway-step-row { display: flex; align-items: center; gap: 0.4rem; width: 100%; }
.giveaway-step-row input {
  flex: 1 1 auto; min-width: 0;
  padding: 0.38rem 0.6rem; border: 1px solid rgba(255, 255, 255, 0.16); border-radius: var(--radius-sm);
  background: rgba(11, 13, 18, 0.92); color: var(--panel-text); font-size: 0.8rem;
}
.giveaway-step-row input::placeholder { color: var(--panel-dim); }
.giveaway-step-row input:focus {
  outline: none; border-color: var(--deck-btn-hover-border); box-shadow: 0 0 0 3px rgba(59, 110, 245, 0.15);
}
.giveaway-step-row input:disabled { opacity: 0.6; cursor: not-allowed; }
/* Alle Knoepfe der Schrittliste: so breit wie ihr Text, flach, nicht gedehnt. */
.giveaway-step-body .gift-cta { flex: 0 0 auto; min-height: 30px; padding: 0.24rem 0.85rem; font-size: 0.76rem; }

.giveaway-entrants {
  margin: 0.35rem 0 0; color: var(--panel-muted); font-size: 0.74rem; font-weight: 700;
}
.giveaway-entrants:empty { display: none; }
.giveaway-entrants.is-success { color: #7ede6a; }

/* Der Abschluss-Knopf steht mittig unter allem und erscheint erst, wenn die drei
   Schritte durch sind - vorher nimmt der Bereich keinen Platz weg. */
.giveaway-finish { display: flex; justify-content: center; margin-top: 0.5rem; }
.giveaway-finish:empty { display: none; }

/* Gruene Ausfuehrung des goldenen Knopfes - gleiche Form, gleiches Gewicht, andere
   Bedeutung: Schritt 1 fuehrt aus der Seite heraus ins Spiel, und der Abschluss ist
   erledigt statt offen. Es werden nur die Variablen getauscht, siehe .gift-cta. */
.gift-cta.is-green {
  --btn-face: linear-gradient(160deg, #86e572 0%, #46c257 55%, #2c9a46 100%);
  --btn-edge: rgba(163, 240, 152, 0.5);
  --btn-ink: #0d2a12;
  --btn-glow: rgba(44, 154, 70, 0.3);
  --btn-glow-strong: rgba(44, 154, 70, 0.42);
}
/* Der Abschluss: einmal kurz aufpoppen, danach still stehen bleiben. */
.gift-cta.is-done { animation: giveaway-done-pop 560ms cubic-bezier(0.2, 1.5, 0.4, 1); }
.gift-cta.is-done[disabled] { opacity: 1; cursor: default; }
@keyframes giveaway-done-pop {
  0%   { transform: scale(0.86); }
  55%  { transform: scale(1.09); }
  100% { transform: scale(1); }
}
@media (prefers-reduced-motion: reduce) {
  .gift-cta.is-done { animation: none; }
}
@keyframes gift-rays-turn { to { transform: rotate(360deg); } }

/* ---------- Collection (Player-Subtab) ----------
   Layoutregel: KEINE eigene Box pro Einzelwert. Panels umfassen ganze Abschnitte,
   die Zahlen darin stehen frei und werden ueber Abstand, Ausrichtung und
   Schriftgewicht gruppiert. Siehe .claude/skills/ui-design/SKILL.md, Abschnitt 1b. */
.col-panel { padding: 1rem 1.15rem 1.15rem; margin-bottom: 0.7rem; }
.col-head { display: flex; align-items: baseline; justify-content: space-between; gap: 1rem; flex-wrap: wrap; margin-bottom: 0.9rem; }
.col-head h3 { margin: 0; color: var(--panel-text); font-size: 1.05rem; }
.col-note { color: var(--panel-dim); font-size: 0.74rem; line-height: 1.5; }
.col-intro { margin: 0 0 1.1rem; color: var(--panel-muted); font-size: 0.85rem; line-height: 1.55; max-width: 72ch; }
.col-panel > .col-note { margin: 0.8rem 0 0; max-width: 68ch; }
.col-tap-tip { margin: 0.8rem 0 0; text-align: center; color: #fbbf24; font-weight: 700; font-size: 0.8rem; }

/* Kennzahlen: Icon, Wert, Beschriftung. Frei stehend, kein Rahmen, kein Hintergrund. */
/* Kopfbereich: die eine grosse Zahl, darunter mittig die vier Kennzahlen. */
.col-hero { padding: 1.9rem 1.15rem 1.6rem; }
.col-score { position: relative; display: grid; justify-items: center; margin-bottom: 1.8rem; }
.col-score strong {
  position: relative; z-index: 1;
  color: var(--panel-text); font-size: clamp(2.6rem, 7vw, 4rem); font-weight: 850;
  line-height: 1; letter-spacing: -0.02em; font-variant-numeric: tabular-nums;
}
.col-score > span {
  position: relative; z-index: 1; margin-top: 0.3rem;
  color: var(--panel-muted); font-size: 0.82rem; font-weight: 800;
  text-transform: uppercase; letter-spacing: 0.18em;
}
/* Ruhiger, langsam atmender Schein hinter der Zahl. Kein Dauerblinken. */
.col-score-glow {
  position: absolute; top: 50%; left: 50%; width: 22rem; height: 11rem;
  transform: translate(-50%, -60%);
  background: radial-gradient(ellipse at center, rgba(59, 110, 245, 0.38), transparent 68%);
  filter: blur(18px); pointer-events: none;
  animation: col-score-pulse 5.5s ease-in-out infinite;
}
@keyframes col-score-pulse {
  0%, 100% { opacity: 0.55; transform: translate(-50%, -60%) scale(0.94); }
  50% { opacity: 1; transform: translate(-50%, -60%) scale(1.06); }
}
@media (prefers-reduced-motion: reduce) { .col-score-glow { animation: none; } }

.col-figures { display: flex; flex-wrap: wrap; gap: 1.6rem 2.4rem; }
.col-figures-center { justify-content: center; text-align: center; }
.col-figures-center .col-figure-value { justify-content: center; }
/* Platzhalter fuer ein Icon, das noch kommt. */
.col-icon-pending {
  width: 27px; height: 27px; border: 1px dashed var(--panel-inset-border);
  border-radius: 6px; background: var(--panel-inset); flex: none;
}
.col-figures-tight { gap: 1.2rem 2rem; }
.col-figure-value { display: flex; align-items: center; gap: 0.4rem; }
.col-figure-value img { width: 27px; height: 27px; object-fit: contain; }
/* Wild-Card-Faecher: fuenf Seltenheiten ueberlappend, nur der vordere Rand jeder
   Karte bleibt sichtbar. Sagt "Karten aller Seltenheiten" ohne fuenf Einzelzahlen. */
.col-fan { display: inline-flex; align-items: center; }
/* Der Schlagschatten trennt die ueberlappenden Karten voneinander, sonst verschwimmen
   sie zu einer Flaeche. Enger gestellt als zuvor. */
.col-fan img {
  width: 27px; height: 27px; object-fit: contain;
  filter: drop-shadow(-2px 1px 1.5px rgba(0, 0, 0, 0.75));
}
.col-fan img + img { margin-left: -20px; }
.col-figure-value strong { color: var(--panel-text); font-size: 1.5rem; font-weight: 850; line-height: 1.1; letter-spacing: -0.01em; }
.col-figure-value small { color: var(--panel-muted); font-size: 0.82rem; font-weight: 700; }
.col-figure > span { display: block; margin-top: 0.15rem; color: var(--panel-muted); font-size: 0.75rem; font-weight: 650; }

/* Fortschrittsbalken. Kein Kasten, nur eine Linie mit Fuellung. */
.col-bar { display: block; height: 7px; border-radius: 4px; background: var(--panel-inset); overflow: hidden; }
.col-bar > i { display: block; height: 100%; border-radius: 4px; background: var(--primary); transition: width 0.5s ease; }
.col-bar > i.is-gold { background: var(--gold); }
.col-bar > i.is-common { background: #b9c4d8; }
.col-bar > i.is-rare { background: #f2a33c; }
.col-bar > i.is-epic { background: #c264f0; }
.col-bar > i.is-legendary { background: #56d2f0; }
.col-bar > i.is-champion { background: var(--gold); }
.col-bar > i.is-evo { background: #e05ad8; }
.col-bar > i.is-hero { background: var(--gold); }
.col-bar > i.is-star { background: #f7d046; }
.col-stars { margin-top: 1.3rem; padding-top: 1.1rem; border-top: 1px solid var(--panel-inset-border); }
.col-stars h4 { margin: 0 0 0.8rem; color: var(--panel-text); font-size: 0.9rem; }

.col-progress { margin-top: 1.3rem; display: grid; gap: 0.55rem; }
.col-progress-line { display: grid; grid-template-columns: 8.5rem minmax(0, 1fr) 3rem; align-items: center; gap: 0.8rem; }
.col-progress-line > span { color: var(--panel-muted); font-size: 0.8rem; font-weight: 650; }
.col-progress-line > b { color: var(--panel-text); font-size: 0.85rem; text-align: right; font-variant-numeric: tabular-nums; }

/* Seltenheiten: eine Zeile je Seltenheit, getrennt nur durch Abstand. */
.col-rarity-list { display: grid; gap: 0.85rem; }
/* FESTE Spaltenbreiten. Vorher waren Gold- und Kartenspalte inhaltsbreit, dadurch
   begannen und endeten die Balken je nach Zahlenlaenge an anderen Stellen und die
   Werte standen versetzt. Nur die Balkenspalte darf mitwachsen. */
.col-rarity {
  display: grid;
  grid-template-columns: 40px 10.5rem minmax(0, 1fr) 3rem 8.5rem 7rem;
  align-items: center; gap: 0.9rem;
}
.col-rarity-icon { width: 38px; height: 38px; object-fit: contain; }
.col-rarity-name strong { display: block; color: var(--panel-text); font-size: 0.9rem; }
.col-rarity-name span { color: var(--panel-muted); font-size: 0.73rem; }
.col-rarity-pct { color: var(--panel-text); font-size: 0.85rem; text-align: right; font-variant-numeric: tabular-nums; }
/* Jede Zahl in ihrer eigenen Spalte, linksbuendig am Icon - sonst wandern Gold und
   Karten je nach Stellenzahl hin und her. */
.col-rarity-need { display: contents; }
.col-rarity-need span, .col-need, .col-tower-need {
  display: inline-flex; align-items: center; gap: 0.32rem;
  color: var(--panel-text); font-size: 0.82rem; font-weight: 750; font-variant-numeric: tabular-nums;
}
.col-rarity-need img, .col-need img, .col-tower-need img { width: 20px; height: 20px; object-fit: contain; }

/* Abschnitt innerhalb einer Flaeche: nur eine duenne Linie trennt, keine zweite Box. */
.col-subsection { margin-top: 1.3rem; padding-top: 1.1rem; border-top: 1px solid var(--panel-inset-border); }
.col-subsection h4 { margin: 0 0 0.9rem; color: var(--panel-text); font-size: 0.9rem; }
/* Gleiche Konvention wie `.panel.no-line`: Abschnitte, die allein ueber Abstand und
   Ueberschrift gruppieren, ohne Trennlinie. Die erste Gruppe schliesst direkt an den
   Panel-Kopf an und braucht deshalb keinen zusaetzlichen Abstand nach oben. */
.col-subsection.no-line { padding-top: 0; border-top: none; margin-top: 1.9rem; }
.col-subsection.no-line:first-of-type { margin-top: 0; }
.col-subsection h4 .col-note { margin-left: 0.5rem; font-weight: 400; }

/* Evolutionen, Heroes, Sterne */
.col-specials { display: flex; flex-wrap: wrap; gap: 1.4rem 2.6rem; }
.col-specials-center { justify-content: center; }
.col-special { display: flex; align-items: center; gap: 0.65rem; min-width: 15rem; }
.col-special > img { width: 40px; height: 40px; object-fit: contain; }
.col-special > div { min-width: 11rem; }
.col-special strong { display: block; color: var(--panel-text); font-size: 0.9rem; margin-bottom: 0.35rem; }
.col-special span { color: var(--panel-muted); font-size: 0.73rem; }

/* Untermenue der Collection: gleiche Optik wie die Player-Subtabs, nur etwas kleiner. */
.col-views { margin: 0.2rem 0 0.9rem; overflow-x: auto; }
.col-views button { font-size: 0.88rem; white-space: nowrap; }

/* Abzeichen: Icon links, Text und Balken rechts. Kein Kasten je Eintrag. */
.col-badges { display: grid; gap: 1rem 2rem; }
.col-badges-grid { grid-template-columns: repeat(auto-fill, minmax(17rem, 1fr)); }
.col-badge { display: flex; align-items: center; gap: 0.7rem; }
.col-badge > img, .col-badge > .col-icon-pending { width: 82px; height: 82px; object-fit: contain; flex: none; }
/* Die manuell gelieferten Turniergrafiken fuellen ihre Bildflaeche deutlich staerker
   als Supercells uebrige Badge-Dateien. 64px sind hier optisch das Referenzmass;
   der Rand sorgt fuer denselben 82px-Footprint und damit buendige Textspalten. */
.col-badge > img[src^="/assets/badges/ranks/"],
.col-badge > img[src^="/assets/events/chaos-s2.png"] { width: 64px; height: 64px; margin: 9px; }
/* Fehlt das Bild auf Supercells CDN, sieht die Stelle aus wie der Platzhalter
   statt wie ein kaputtes Bild. Gleiche Optik wie .col-icon-pending. */
.col-badge > img.is-missing {
  border: 1px dashed var(--panel-inset-border); border-radius: 6px;
  background: var(--panel-inset); content: ""; /* verdeckt das Browser-Bruchsymbol */
}
.col-badge > div { flex: 1; min-width: 0; display: grid; gap: 0.28rem; }
/* Die Leiste einer Abzeichenzeile ist bewusst duenner und schmaler als die in den
   Karten- und Evolutions-Listen: dort traegt sie die Aussage, hier steht die Zahl
   direkt darunter und die Leiste ist nur die Begleitung.
   6rem ist am echten Rendering gemessen, nicht geschaetzt - der laengste real
   vorkommende Wert ist "94,379 of 100,000" mit 90px (TRYAZ, Clan Donations).
   Gilt fuer Badges UND Mastery, beide bauen ihre Zeilen aus badgeRow(). */
.col-badge .col-bar { height: 4px; max-width: 6rem; border-radius: 3px; }
.col-badge .col-bar > i { border-radius: 3px; }
.col-badge strong { color: var(--panel-text); font-size: 0.85rem; transition: color 0.2s ease; }
/* Kurze Hervorhebung, wenn aus einem anderen Reiter hierher gesprungen wurde. */
.col-badge.is-active strong { color: var(--primary); }
.col-badge span { color: var(--panel-muted); font-size: 0.72rem; }

/* Mastery: zwei Levelgruppen, innerhalb davon ein kompaktes Viererraster. */
.col-mastery-grid {
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 0.95rem 1.2rem;
}
.col-mastery-badge { min-width: 0; gap: 0.65rem; }
.col-mastery-badge > div { gap: 0.22rem; }
@media (max-width: 900px) { .col-mastery-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
/* Von 4 auf 3 Spalten, danach erst wieder bei 640px auf 2 - und dort zusammen mit
   dem kleineren Abzeichen, weil zwei Spalten ohne das nicht funktionieren (siehe
   den 640px-Block weiter unten). Bis zum 03.09.2026 stand hier zusaetzlich eine
   680px-Regel, die allein die Spalten umstellte: zwischen 641 und 680px gab es
   deshalb zwei Spalten mit dem grossen 82px-Abzeichen - genau der Zustand, in dem
   "Firecracker" rechts aus der Spalte laeuft. Die Regel fuer eine einzelne Spalte
   auf sehr schmalen Geraeten stand ebenfalls hier und war wirkungslos, weil der
   spaetere 640px-Block bei gleicher Spezifitaet gewinnt; sie steht jetzt dort. */

/* Alle vier Tower Troops in EINE Zeile - der Platz reicht, und ein einzelner
   umgebrochener Eintrag sieht falsch aus. */
.col-towers { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 0.7rem 1.4rem; }
@media (max-width: 780px) { .col-towers { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
.col-tower { display: flex; align-items: flex-start; gap: 0.6rem; }
.col-tower > img { width: 34px; height: 50px; object-fit: contain; flex: none; }
.col-tower > div { flex: 1; min-width: 0; display: grid; gap: 0.1rem; justify-items: start; }
.col-tower strong { color: var(--panel-text); font-size: 0.84rem; line-height: 1.25; }
.col-tower span { color: var(--panel-muted); font-size: 0.73rem; }
.col-done { color: var(--win); font-size: 0.8rem; font-weight: 800; }

/* Deck-Rechner */
.col-deck-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem 0.9rem; margin-bottom: 0.9rem; }
.col-btn {
  min-height: 32px; padding: 0.25rem 0.75rem; border-radius: 7px;
  border: 1px solid var(--panel-inset-border); background: var(--panel-inset);
  color: var(--panel-muted); font-size: 0.78rem; font-weight: 800;
}
/* Der globale `button:hover` faerbt sonst blau. */
.col-btn:hover { background: var(--panel-inset); color: var(--panel-text); border-color: var(--deck-btn-hover-border); }
.col-toggle { display: inline-flex; align-items: center; gap: 0.4rem; color: var(--panel-muted); font-size: 0.78rem; font-weight: 650; cursor: pointer; }

.col-slots { display: flex; flex-wrap: wrap; gap: 0.5rem; margin-bottom: 1.1rem; }
.col-slot {
  position: relative; width: 66px; padding: 0; border: none; background: none;
  aspect-ratio: 285 / 420; cursor: pointer;
}
.col-slot:hover { background: none; }
.col-slot img { width: 100%; height: 100%; object-fit: contain; display: block; }
.col-slot.is-empty {
  display: grid; place-items: center; border: 1px dashed var(--panel-inset-border);
  border-radius: 7px; color: var(--panel-dim); font-size: 1.2rem; font-weight: 800;
}
.col-slot.is-empty:hover { border-color: var(--deck-btn-hover-border); color: var(--panel-text); }
/* Waagerecht zentriert ueber automatische Raender statt ueber left:50% plus
   translateX(-50%). Der alte Weg rundet zweimal: einmal die 50 Prozent der
   Containerbreite, einmal die halbe Elementbreite - und die beiden Rundungen heben
   sich nicht auf. Je nach Fenster- und Schriftgroesse sass die Plakette dadurch
   sichtbar zu weit rechts, bei anderen Groessen exakt richtig (Eliass 02.09.2026:
   "verschiebt sich leicht nach rechts, in einer bestimmten groesse ist es aber
   korrekt"). Mit inset-inline: 0 und margin-inline: auto verteilt der Browser den
   Restplatz selbst und rundet nur einmal, symmetrisch.
   width: max-content ist dabei Pflicht: bei gesetztem linken UND rechten Rand wuerde
   ein absolut positioniertes Element sonst auf die volle Breite wachsen. */
.col-slot-level {
  position: absolute; inset-inline: 0; bottom: 2px;
  width: max-content; margin-inline: auto;
  padding: 0 0.32rem; border-radius: 4px; background: rgba(6, 9, 16, 0.85);
  color: var(--panel-text); font-size: 0.68rem; font-weight: 800; line-height: 1.45;
}
.col-slot-level.is-max { background: var(--gold); color: var(--text-invert); }
.col-deck-needs { display: flex; flex-wrap: wrap; gap: 1.1rem; margin-top: 1rem; }
.col-deck-specials { display: flex; flex-wrap: wrap; gap: 1.1rem; margin-top: 0.6rem; }
.col-deck-result .hint { margin: 0; }

/* Kartenauswahl im Modal. Bewusst breit: hier wird ein ganzes Deck gebaut, nicht
   eine einzelne Karte gesucht - die Kacheln sind entsprechend klein. */
.modal-box:has(.col-pick-wide) { width: min(1180px, 94vw); max-width: min(1180px, 94vw); text-align: left; }
.col-pick-wide > h3 { margin: 0 0 0.7rem; }
.col-pick-tabs { display: flex; flex-wrap: wrap; gap: 0.35rem; margin-bottom: 0.8rem; }
.col-pick-head { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 0.6rem 1.2rem; margin-bottom: 0.8rem; }
.col-pick-head .col-slots { margin-bottom: 0; }
.col-pick-body { max-height: 58vh; overflow-y: auto; margin-top: 0.7rem; }
.col-pick-section + .col-pick-section { margin-top: 1.1rem; }
.col-pick-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(44px, 1fr)); gap: 0.3rem; }
.col-pick {
  position: relative; padding: 0; border: none; background: none; cursor: pointer;
  aspect-ratio: 285 / 420; transition: transform 0.15s ease, filter 0.15s ease;
}
.col-pick:hover { background: none; transform: translateY(-2px); }
.col-pick img { width: 100%; height: 100%; object-fit: contain; display: block; }
/* Im Deck: angehoben und hervorgehoben. Gesperrt: gedaempft, aber sichtbar. */
.col-pick.is-picked { transform: translateY(-3px); }
.col-pick.is-picked img { filter: drop-shadow(0 0 0 2px var(--primary)) brightness(1.12); }
.col-pick.is-picked::after {
  content: ""; position: absolute; inset: -2px; border: 2px solid var(--primary);
  border-radius: 6px; pointer-events: none;
}
.col-pick.is-blocked { cursor: not-allowed; }
.col-pick.is-blocked img { filter: grayscale(0.7) brightness(0.5); }
.col-pick.is-locked img { filter: grayscale(1) brightness(0.45); }

/* Fertige Decks zur Uebernahme: eine Zeile je Deck, acht Bilder nebeneinander. */
.col-source-body { max-height: 62vh; overflow-y: auto; display: grid; gap: 0.5rem; }
.col-source-row {
  display: flex; align-items: center; justify-content: space-between; gap: 1rem;
  width: 100%; padding: 0.45rem 0.6rem; border-radius: 7px; text-align: left;
  border: 1px solid var(--panel-inset-border); background: var(--panel-inset); cursor: pointer;
}
.col-source-row:hover { background: var(--panel-inset); border-color: var(--deck-btn-hover-border); }
.col-source-cards { display: flex; gap: 0.2rem; }
.col-source-cards img { width: 42px; height: auto; object-fit: contain; display: block; }

/* Alle Karten: dichtes Raster, freistehende Bilder wie im Battle Log */
.col-cards { display: grid; grid-template-columns: repeat(auto-fill, minmax(58px, 1fr)); gap: 0.45rem 0.4rem; }
.col-card {
  position: relative; aspect-ratio: 285 / 420;
  padding: 0; border: none; background: none; cursor: pointer;
  transition: transform 0.15s ease, filter 0.15s ease;
}
.col-card img { width: 100%; height: 100%; object-fit: contain; display: block; }
/* Gleiche Anhebung wie bei den anklickbaren Karten im Geier-Draft. */
.col-card:hover { background: none; transform: translateY(-3px) scale(1.04); }
.col-card:focus-visible { outline: 2px solid var(--primary); outline-offset: 2px; }
.col-card.is-active { transform: translateY(-3px) scale(1.04); }
.col-card.is-locked img { filter: grayscale(1) brightness(0.45); }
.col-card.is-locked .col-slot-level { background: rgba(6, 9, 16, 0.8); color: var(--panel-dim); }

/* Sortierung und Filter rechts in der Kopfzeile, in einer Reihe. */
.col-head-tools { display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem 0.8rem; }
.col-sort { display: flex; gap: 0.35rem; }
/* Der globale `button:hover` faerbt sonst blau, deshalb der eigene aktive Zustand. */
.col-btn.active { background: var(--panel-inset); color: var(--panel-text); border-color: var(--deck-btn-hover-border); }

/* Je Gruppe eine eigene Zeile mit kleiner Beschriftung davor. */
.col-card-groups { display: grid; gap: 1.2rem; transition: opacity 0.2s ease; }
.col-card-groups.is-dimmed { opacity: 0.42; }
.col-card-group-head { display: flex; align-items: center; gap: 0.45rem; margin-bottom: 0.5rem; }
.col-card-group-head img { width: 22px; height: 22px; object-fit: contain; }
.col-card-group-head strong { color: var(--panel-muted); font-size: 0.76rem; font-weight: 800; text-transform: uppercase; letter-spacing: 0.08em; }

/* Kartendetail im Popup (globales Modal), also VOR dem Raster statt darueber. */
/* Das Popup ist breiter als das Standard-Modal, damit Label und Wert je Zeile
   nicht zusammenrutschen. */
/* Feste Breite, nicht mitwachsend: sonst springt das Fenster je nach Karte zwischen
   rund 210px (keine Sonderformen) und 394px (Knight, der als einziger Evolution, Hero
   und Star Level zugleich hat). Grundmass ist diese breiteste Karte plus 5 Prozent. */
.modal-box:has(.col-pop) { width: 414px; max-width: 414px; }
/* minmax(0, 1fr): sonst zieht ein breiter Inhalt das ganze Raster auseinander und
   die Werte der Detailzeilen rutschen aus dem Fenster. */
.col-pop { display: grid; grid-template-columns: minmax(0, 1fr); justify-items: center; gap: 0; }
/* Karte plus Leiste als eine Einheit: die Leiste ist genau so breit wie das Bild,
   damit sie wie im Spiel an der Karte haengt und nicht frei im Fenster schwebt. */
/* Karte plus Leiste. Die Leiste liegt HINTER der Karte (z-index) und wird per
   negativem Abstand hochgezogen, damit sie wie im Spiel am Kartenkoerper klebt.
   --card-pad ist der transparente Rand unter dem Kartenkoerper im PNG; er ist je
   Seltenheit/Form verschieden und wird deshalb in app.js je Karte gesetzt. */
/* margin-bottom: Luft zwischen Leiste/Abzeichen und dem Kartennamen darunter. */
/* --art-w ist die Bezugsbreite fuer alles, was unter der Karte sitzt (Leiste,
   Max-Abzeichen). Sie MUSS mit width uebereinstimmen - auch in jedem Bruchpunkt,
   sonst ragt das Darunterliegende seitlich hervor. Genau das war bis zum 02.09.2026
   der Fall: die Werte kamen aus dem JavaScript und gingen von 118px aus, waehrend
   die Karte mobil auf 96px schrumpft. */
.col-pop-card { position: relative; width: 118px; --art-w: 118px; margin-bottom: 11px; }
/* Gleiche Geometrie wie im Deck (.card-img): festes 285/420-Feld, Bild wird
   hineingerechnet statt gedehnt. Noetig, weil Evo-, Hero- und Legendary-Bilder
   unterschiedliche Eigenformate haben - sonst springt die Fensterhoehe je Karte. */
.col-pop-art {
  position: relative; z-index: 2;
  /* Breite vom Rahmen uebernehmen statt sie zu wiederholen. Vorher standen hier feste
     118px, waehrend .col-pop-card mobil auf 96px schrumpft - das Bild ragte also 22px
     nach rechts hinaus, und das Max-Abzeichen richtete sich am schmaleren Rahmen aus.
     Es sass dadurch rund 11px links neben der Kartenmitte (Eliass 02.09.2026, mit
     Screenshot belegt: "ich glaube es ist sogar die karte selbst").
     Mit 100% folgt das Bild jeder Rahmenbreite - auch kuenftigen Bruchpunkten, ohne
     dass jemand zwei Zahlen gleichzeitig pflegen muss. */
  width: 100%; aspect-ratio: 285 / 420; height: auto; object-fit: contain; display: block;
}

/* Bezug ist die KOERPERBREITE der Karte (--card-body), nicht die Bildbreite: das Bild
   hat seitlich transparenten Rand, sonst stuende die Leiste ueber die Karte hinaus.
   94 % davon entspricht dem Verhaeltnis im Spiel-Screenshot. */
.col-pop-progress {
  position: relative; z-index: 1;
  display: block; width: calc(var(--art-w) * var(--body-ratio, 0.9) * 0.88); height: 20px;
  margin: calc(-1 * var(--art-w) * (420 / 285) * var(--pad-ratio, 0.08) + 4px) auto 0;
  border: 2px solid var(--cr-bar-border); border-radius: 6px;
  background: linear-gradient(180deg, var(--cr-bar-track-top) 0 52%, var(--cr-bar-track-bottom) 52% 100%);
  overflow: hidden;
}
.col-pop-progress > i {
  position: absolute; inset: 0 auto 0 0; display: block;
  background: linear-gradient(180deg, var(--cr-bar-blue-top) 0 52%, var(--cr-bar-blue-bottom) 52% 100%);
}
/* Genug Karten fuer den naechsten Level. */
.col-pop-progress.is-ready > i {
  background: linear-gradient(180deg, var(--cr-bar-green-top) 0 52%, var(--cr-bar-green-bottom) 52% 100%);
}
/* Clash-Schrift mit schwarzer Kontur, wie im Spiel. `paint-order` legt die Kontur
   HINTER die Fuellung, sonst frisst sie die duennen Ziffern auf. */
.col-pop-progress > b {
  position: relative; display: block; line-height: 16px; text-align: center;
  font-family: "Clash Display", "Inter", system-ui, sans-serif;
  font-size: 0.7rem; font-weight: 700; color: #fff;
  -webkit-text-stroke: 1.5px var(--cr-bar-border);
  paint-order: stroke fill;
}
/* Das Abzeichen ersetzt die Leiste. Etwas schmaler als der Kartenkoerper, damit es
   seitlich nirgends hervorschaut - die Karte verdeckt es bis auf den Streifen ueber
   dem "Max". Im Original (IMG_9935) ragt es 27,8 % der Kartenbreite unter die Karte;
   Breite und Hochzug sind so gewaehlt, dass wir genau darauf landen. */
.col-pop-max {
  position: relative; z-index: 1;
  display: block; width: calc(var(--art-w) * var(--body-ratio, 0.9) * 0.96); height: auto;
  margin: calc(-1 * var(--art-w) * ((420 / 285) * var(--pad-ratio, 0.08) + var(--lift-ratio, 0.093))) auto 0;
}
.col-pop h3 { margin: 0.5rem 0 0.1rem; color: var(--panel-text); font-size: 1.15rem; }
.col-detail-rarity { color: var(--panel-muted); font-size: 0.74rem; font-weight: 800; text-transform: uppercase; letter-spacing: 0.08em; }
.col-detail-forms { display: flex; flex-wrap: wrap; justify-content: center; gap: 0.4rem 0.8rem; margin-top: 0.7rem; }
/* Die Sonderformen sind Buttons und fuehren in ihren Reiter. Sie sollen aber wie
   Text aussehen, nicht wie eine Schaltflaeche - deshalb der Reset gegen den
   globalen `button` (blaue Flaeche, Polsterung) wie schon bei .col-card. */
.col-detail-form {
  display: inline-flex; align-items: center; gap: 0.3rem;
  padding: 0; border: none; border-radius: 0; background: none; cursor: pointer;
  color: var(--panel-text); font-size: 0.76rem; font-weight: 750;
  transition: color 0.15s ease;
}
.col-detail-form:hover { background: none; color: var(--primary); }
.col-detail-form:focus-visible { outline: 2px solid var(--primary); outline-offset: 3px; }
.col-detail-form img { width: 20px; height: 20px; object-fit: contain; }
.col-detail-form.is-locked { color: var(--panel-dim); }
.col-detail-form.is-locked:hover { color: var(--primary); }
.col-detail-form.is-locked img { filter: grayscale(1) brightness(0.6); }
.col-detail-lines { display: grid; gap: 0.3rem; width: 100%; margin: 0.9rem 0 0; }
.col-detail-line { display: flex; align-items: center; justify-content: space-between; gap: 0.8rem; }
/* Dieselbe Zeile, nur anklickbar (Mastery fuehrt in den Mastery-Reiter). */
.col-detail-line.is-link {
  width: 100%; padding: 0; border: none; border-radius: 0; background: none;
  cursor: pointer; font: inherit; text-align: left;
}
.col-detail-line.is-link:hover { background: none; }
.col-detail-line.is-link:hover span, .col-detail-line.is-link:hover b { color: var(--primary); }
.col-detail-line.is-link:focus-visible { outline: 2px solid var(--primary); outline-offset: 3px; }
.col-detail-line span { display: inline-flex; align-items: center; gap: 0.4rem; color: var(--panel-muted); font-size: 0.78rem; }
.col-detail-line span img { width: 20px; height: 20px; object-fit: contain; }
.col-detail-line b { color: var(--panel-text); font-size: 0.82rem; font-variant-numeric: tabular-nums; }

/* Bestes Deck mit dieser Karte. Abgesetzt durch eine duenne Linie, nicht durch eine
   zweite Flaeche - das Popup bleibt EIN Panel. Das Feature selbst kommt spaeter,
   bis dahin steht hier nur das Schloss. */
.col-pop-decks {
  width: 100%; margin-top: 1rem; padding-top: 0.9rem;
  border-top: 1px solid var(--panel-inset-border); text-align: center;
}
.col-pop-decks h4 { margin: 0; color: var(--panel-text); font-size: 0.9rem; }
/* Dasselbe Schloss wie bei den gesperrten Streamer-Plugins, nur nicht ueberlagernd:
   hier steht es frei unter der Ueberschrift, es gibt ja noch nichts zu verdecken. */
.col-pop-lock { display: block; margin: 0.6rem auto 0.15rem; width: 38px; height: 38px; }
.col-pop-lock img {
  width: 100%; height: 100%; object-fit: contain;
  filter: drop-shadow(0 6px 14px rgba(0, 0, 0, 0.6));
}

/* Ueberschrift mit vorangestelltem Icon */
.col-head-icon { display: inline-flex; align-items: center; gap: 0.45rem; }
.col-head-icon img { width: 26px; height: 26px; object-fit: contain; }

/* Star Points: zwei Zahlen, die man sonst verwechselt, mit klarer Beschriftung. */
.col-star-points { display: flex; flex-wrap: wrap; gap: 0.4rem 2rem; margin-bottom: 1rem; }
.col-star-points span { display: inline-flex; align-items: center; gap: 0.35rem; color: var(--panel-text); font-size: 0.86rem; font-weight: 800; font-variant-numeric: tabular-nums; }
.col-star-points img { width: 20px; height: 20px; object-fit: contain; }
.col-star-points b { color: var(--panel-muted); font-size: 0.75rem; font-weight: 650; }

/* Star Level auf der Kachel */
.col-star-badge {
  position: absolute; inset-inline: 0; bottom: 2px;
  width: max-content; margin-inline: auto;
  display: inline-flex; align-items: center; gap: 0.15rem; white-space: nowrap;
  padding: 0 0.28rem; border-radius: 4px; background: rgba(6, 9, 16, 0.85);
  color: var(--panel-text); font-size: 0.62rem; font-weight: 800; line-height: 1.5;
}
.col-star-badge img { width: 11px; height: 11px; }
.col-star-badge.is-max { background: var(--gold); color: var(--text-invert); }

/* ---------- Karten / Decks ---------- */
.card-grid { display: flex; flex-wrap: wrap; gap: 0.6rem; }
.card { width: 84px; text-align: center; font-size: 0.75rem; }
.card-img { position: relative; width: 84px; aspect-ratio: 285 / 420; }
.card-img img { width: 84px; height: 100%; object-fit: contain; display: block; border-radius: 8px; }
.card-26000106 .card-img img { object-position: center 86%; }
.card .name { margin-top: 0.2rem; font-weight: 600; }
.card .lvl { color: var(--muted); }

/* Evolution und Hero brauchen keine Markierung: Das Kartenbild ist bereits ein anderes
   und fuer jeden Spieler sofort erkennbar. Die Klassen .card-evo / .card-hero bleiben am
   Markup, falls spaeter doch einmal etwas daran haengen soll. */

/* ---------- Battle log ---------- */
#battle-list { display: flex; flex-direction: column; gap: 0.6rem; }
.battle-list-actions {
  display: flex; align-items: center; justify-content: center; gap: 0.55rem;
  min-height: 58px; margin-top: 8px; color: var(--panel-muted);
  font-size: 0.78rem; font-weight: 750;
}
.battle-list-actions[hidden] { display: none; }
.battle-list-actions .lb-loading-ring { width: 22px; height: 22px; border-width: 2px; }
.battle {
  position: relative;
  padding: 0.8rem 1rem 0.65rem;
  border-radius: var(--panel-radius);
  background: var(--panel-bg);
  border: 1px solid var(--panel-border);
  box-shadow: var(--panel-shadow);
  color: var(--panel-text);
}
.battle-time { position: absolute; left: 0; top: 6px; font-size: 0.72rem; color: var(--panel-muted); }
/* Win/loss: dark directional background from concept 04 + focused laser edge from 02.
   Draw shares the exact same shape, only colourless (see below). */
.battle.win, .battle.loss, .battle.draw {
  color: #f4f7ff;
  border: 1px solid transparent;
  background:
    linear-gradient(105deg, var(--result-left), #151a24 52%, var(--result-right)) padding-box,
    linear-gradient(#151a24, #151a24) padding-box,
    linear-gradient(90deg, var(--laser-left), var(--laser-mid) 50%, var(--laser-right)) border-box;
  box-shadow:
    0 0 0 1px color-mix(in srgb, var(--laser-left) 20%, transparent),
    0 0 7px color-mix(in srgb, var(--laser-left) 22%, transparent),
    0 0 18px color-mix(in srgb, var(--laser-right) 10%, transparent),
    inset 0 0 18px var(--result-inner);
}
.battle.win {
  --result-left: rgba(43, 82, 210, 0.48);
  --result-right: rgba(224, 65, 58, 0.1);
  --laser-left: #4f72ff;
  --laser-mid: #9b65ff;
  --laser-right: #ff4a6d;
  --result-inner: rgba(84, 103, 255, 0.05);
  --laser-glow: 0 0 5px rgba(91, 116, 255, 0.5), 0 0 12px rgba(155, 101, 255, 0.2);
}
.battle.loss {
  --result-left: rgba(224, 65, 58, 0.2);
  --result-right: rgba(43, 82, 210, 0.48);
  --laser-left: #ff4a6d;
  --laser-mid: #9b65ff;
  --laser-right: #4f72ff;
  --result-inner: rgba(84, 103, 255, 0.05);
  --laser-glow: 0 0 5px rgba(91, 116, 255, 0.5), 0 0 12px rgba(155, 101, 255, 0.2);
}
/* Draw: neither side won, so the card stays symmetric and neutral grey –
   no directional tint, no coloured glow. */
.battle.draw {
  --result-left: rgba(124, 132, 148, 0.26);
  --result-right: rgba(124, 132, 148, 0.26);
  --laser-left: #767d8b;
  --laser-mid: #b3bac7;
  --laser-right: #767d8b;
  --result-inner: rgba(179, 186, 199, 0.05);
  --laser-glow: 0 0 5px rgba(160, 168, 182, 0.3), 0 0 12px rgba(160, 168, 182, 0.12);
}
.battle.win::before, .battle.win::after,
.battle.loss::before, .battle.loss::after,
.battle.draw::before, .battle.draw::after {
  content: "";
  position: absolute;
  left: 9%;
  right: 9%;
  z-index: 1;
  height: 2px;
  pointer-events: none;
  background: linear-gradient(90deg, transparent, var(--laser-left) 18%, var(--laser-mid) 50%, var(--laser-right) 82%, transparent);
  box-shadow: var(--laser-glow);
}
.battle.win::before, .battle.loss::before, .battle.draw::before { top: -1px; }
.battle.win::after, .battle.loss::after, .battle.draw::after { bottom: -1px; }
.battle.win .side-clan, .battle.win .battle-time, .battle.win .score .sep,
.battle.loss .side-clan, .battle.loss .battle-time, .battle.loss .score .sep,
.battle.draw .side-clan, .battle.draw .battle-time, .battle.draw .score .sep {
  color: rgba(226, 233, 248, 0.62);
}
.battle.battle-target { animation: battle-target-pulse 2.4s ease; }
@keyframes battle-target-pulse {
  0%, 100% { outline: 2px solid transparent; outline-offset: 3px; }
  18%, 72% { outline-color: rgba(255, 214, 99, 0.95); }
}

/* Top row: medals (outer edges) and mode (center) all on the same height. */
.battle-top { display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; gap: 0.5rem; margin-bottom: 0.6rem; }
.medals-slot.left { justify-self: start; }
.medals-slot.right { justify-self: end; }
.battle-mode { display: inline-flex; align-items: center; gap: 0.5rem; justify-self: center; }
.mode-icon { width: 32px; height: 32px; object-fit: contain; }
.mode-text { display: flex; flex-direction: column; align-items: flex-start; line-height: 1.15; }
.mode-name { font-weight: 700; }
/* Zweite Zeile, aktuell nur die Spielstufe der C.H.A.O.S. Draft League. */
.mode-sub { font-size: 0.72rem; font-weight: 600; color: var(--muted); }

/* Info blocks sit at the outer edges and top-aligned; the decks stay in the middle. */
.battle-body { position: relative; display: flex; align-items: flex-start; justify-content: center; }
.side-info { position: absolute; top: 0; z-index: 1; display: flex; flex-direction: column; width: 132px; }
.side-info.left { left: 0; align-items: flex-start; text-align: left; }
.side-info.right { right: 0; align-items: flex-end; text-align: right; }
.side-name { font-weight: 700; font-size: 0.9rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 100%; }
.side-clan { color: var(--muted); font-size: 0.8rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 100%; }
.side-name a, .side-clan a {
  display: block; max-width: 100%; overflow: hidden; color: inherit;
  text-decoration: none; text-overflow: ellipsis;
  transition: color 0.14s ease, text-shadow 0.14s ease;
}
.side-name a:hover, .side-name a:focus-visible {
  color: #fff; text-decoration: underline; text-decoration-color: rgba(126, 162, 255, 0.75);
  text-underline-offset: 3px; text-shadow: 0 0 9px rgba(91, 124, 255, 0.35);
}
.side-clan a:hover, .side-clan a:focus-visible {
  color: rgba(226, 233, 248, 0.9); text-decoration: underline;
  text-decoration-color: rgba(226, 233, 248, 0.42); text-underline-offset: 2px;
}
.side-name a:focus-visible, .side-clan a:focus-visible { outline: 1px solid #7ea2ff; outline-offset: 2px; border-radius: 2px; }

/* Deck / score in the center; score lands between the two deck rows.
   Row 1: [deck][score][deck], Row 2: [actions][spacer][actions] under each deck. */
.battle-rounds {
  display: flex;
  flex-direction: column;
  gap: 1rem;
}
.battle-decks {
  display: grid;
  grid-template-columns: auto auto auto;
  align-items: center; justify-items: center;
  column-gap: 0.6rem; row-gap: 0.45rem;
}
.deck-actions { display: inline-flex; align-items: center; gap: 5px; }
.battle-deck-actions.own { justify-self: end; }
.battle-deck-actions.opponent { justify-self: start; }
.actions-spacer { width: 0; }

/* 2v2: zwei Spieler je Seite, untereinander. Das Ergebnis steht EINMAL mittig
   zwischen den beiden Deckspalten - es gilt fuer das Team, nicht pro Spieler.
   `align-items: center` der Grid-Zelle setzt es automatisch auf halbe Hoehe. */
.battle-decks.is-2v2 { grid-template-columns: auto auto auto; }
.battle-2v2-side { display: flex; flex-direction: column; gap: 0.75rem; }
.battle-2v2-side.own { align-items: flex-end; }
.battle-2v2-side.opponent { align-items: flex-start; }
.battle-2v2-player { display: flex; flex-direction: column; gap: 0.45rem; }
.battle-2v2-side.own .battle-2v2-player { align-items: flex-end; }
.battle-2v2-side.opponent .battle-2v2-player { align-items: flex-start; }
/* Die Namen stehen weiterhin aussen, jetzt aber zwei uebereinander: ueber die volle
   Hoehe verteilt landet jeder Name neben dem Deck, zu dem er gehoert. */
.battle.is-2v2 .side-info { bottom: 0; justify-content: space-around; }
/* Zweite Fassung des Namens, direkt ueber dem Deck - nur auf schmalen Schirmen
   sichtbar, wo die aeussere Namensspalte wegfaellt. */
.battle-2v2-name { display: none; max-width: 100%; }
/* Der sichtbare Abstand ist groesser als der hier gesetzte: die Rahmengrafik hat
   links und rechts je rund 6 px transparenten Rand (das Sechseck fuellt nur 71,8 %
   der Kachel). Enger stellen deshalb ueber den negativen Versatz unten, nicht ueber
   gap - gap allein kommt nicht unter diesen Sockel. */
.battle-chaos-modifiers {
  display: flex; align-items: center; justify-content: center; gap: 0;
  width: 225px; min-height: 48px; padding-top: 4px;
  border-top: 1px solid var(--panel-inset-border);
}
.battle-chaos-modifiers .chaos-augment + .chaos-augment { margin-left: -2px; }
.battle-chaos-modifiers.own { justify-self: end; }
.battle-chaos-modifiers.opponent { justify-self: start; }
.battle-chaos-modifiers.is-empty { visibility: hidden; }
/* C.H.A.O.S.-Augments sind ingame sechseckig. Die API liefert dazu nur Codes wie
   "Giant3" und kein Bild (siehe chaosModifierRow in app.js), also liefert das
   Kartenbild das Motiv und der echte Rahmen aus assets/augments/ die Form. Die
   Tierfarbe steckt im Rahmen: 1 = blau, 2 = orange, 3 = lila, keine Extra-Ziffer.
   Die Prozentwerte sind am 256er-Master ausgemessen (Rahmen aussen x 34..222 /
   y 21..235, Innenoeffnung x 49..201 / y 51..204) und duerfen nicht geraten werden;
   wird die Grafik getauscht, hier nachmessen. */
.chaos-augment {
  position: relative; display: block; width: 44px; height: 44px; flex: none;
}
/* Das Motiv wird NICHT auf die Innenoeffnung geclippt, sonst klafft zwischen Bild
   und farbigem Rand eine Luecke. Geclippt wird auf die Aussensilhouette des Rahmens
   (gemessen 13.89%..85.65% waagerecht, 8.33%..91.20% senkrecht), rund 1 % nach innen
   gesetzt - so laeuft das Bild unter den farbigen Rand und der ueberlappt es. */
.chaos-augment-clip {
  position: absolute; display: block; overflow: hidden;
  left: 15%; top: 10%; width: 70%; height: 80%;
  background: var(--panel-inset);
  clip-path: polygon(50% 0%, 100% 25%, 100% 75%, 50% 100%, 0% 75%, 0% 25%);
}
/* Gezeigt wird nicht die ganze Karte, sondern ein 236x270-Fenster der 285x420-Grafik
   um den Punkt (142.5|205) - ohne Namensleiste, aber weit genug aufgezogen, dass es
   keine Nahaufnahme wird. Die Prozentwerte sind genau diese Umrechnung; wer sie
   aendert, verschiebt den Bildausschnitt, nicht die Groesse des Augments. */
.chaos-augment-art {
  position: absolute; display: block;
  width: 120.9%; height: auto; left: -10.5%; top: -25.9%;
}
.chaos-augment-frame {
  position: absolute; display: block; inset: 0; width: 100%; height: 100%;
  object-fit: contain; pointer-events: none;
}
.elixir {
  display: inline-flex; align-items: center; gap: 0.14rem; min-height: 24px;
  border: 1px solid rgba(238, 90, 244, 0.34); border-radius: 6px;
  padding: 0.05rem 0.36rem 0.05rem 0.2rem;
  background: linear-gradient(135deg, rgba(109, 27, 121, 0.86), rgba(45, 17, 65, 0.92));
  color: #fff; font-size: 0.73rem; font-weight: 850;
  box-shadow: inset 0 1px rgba(255, 255, 255, 0.09), 0 0 7px rgba(214, 60, 224, 0.12);
}
.elixir img { width: 17px; height: 19px; object-fit: contain; filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.42)); }
.meta-elixir { display: flex; align-items: center; justify-content: flex-end; gap: 0.28rem; margin-top: 0.18rem; }
/* Bookmark-/QR-Buttons: Standard ist das Deckbox-Schema aus Geier.
   Nicht pro Bereich neu einfaerben – Abweichungen nur ueber die Tokens. */
.deck-btn {
  display: inline-flex; align-items: center; justify-content: center;
  width: 24px; height: 24px; padding: 0; border-radius: 6px;
  border: 1px solid var(--deck-btn-border); background: var(--deck-btn-bg);
  color: var(--deck-btn-fg); cursor: pointer;
  transition: border-color 0.14s ease, color 0.14s ease, background 0.14s ease;
}
.deck-btn:hover { border-color: var(--deck-btn-hover-border); color: var(--deck-btn-hover-fg); }
.deck-save.saved { background: var(--deck-btn-on); color: #fff; border-color: var(--deck-btn-on); }

/* Medal chips – clean black/grey style inspired by the top banner, thicker border. */
.medals { display: inline-flex; gap: 5px; }
.medal-count, .medal-chg {
  display: inline-flex; align-items: center; gap: 0.3rem;
  border: 2px solid #2b2f3a; background: #14161c;
  border-radius: 8px; padding: 0.2rem 0.55rem; font-weight: 800; font-size: 0.82rem; color: #fff;
}
.medal-chg.up { color: #35d07f; border-color: rgba(53, 208, 127, 0.55); }
.medal-chg.down { color: #ff5f5f; border-color: rgba(255, 95, 95, 0.55); }
.medal-chg.zero { color: #9aa0ad; }
.cur-icon {
  width: 18px; height: 18px; object-fit: contain;
  margin-left: -1px; transform: scale(1.12); transform-origin: center;
}

.battle-deck-side { display: flex; align-items: center; }

/* Die Turmtruppe stand frueher als volle 54px-Karte am aeusseren Rand der 2x4-Decks
   (.battle-tower-troop, samt Trennlinie). Das machte jede Kampfzeile 160px breiter und
   liess sie wie eine neunte Deckkarte wirken. Jetzt sitzt sie klein in der Knopfzeile
   darunter - so gross wie die Knoepfe daneben, damit sie als Teil dieser Zeile gelesen
   wird und nicht mit dem Deck konkurriert. */
/* Am Desktop wie vor der Mobil-Ueberarbeitung: volle Karte am aeusseren Rand des Decks,
   mit Trennlinie. Das kleine Symbol in der Knopfzeile bleibt dort verborgen. */
.battle-tower-troop { display: flex; align-items: center; flex: none; }
.battle-deck-side.tower-left .battle-tower-troop {
  margin-right: 13px; padding-right: 13px;
  border-right: 1px solid var(--panel-inset-border);
}
.battle-deck-side.tower-right .battle-tower-troop {
  margin-left: 13px; padding-left: 13px;
  border-left: 1px solid var(--panel-inset-border);
}
.battle-tower-troop .card,
.battle-tower-troop .card-img,
.battle-tower-troop .card-img img { width: 54px; }
.deck-tower { display: none; }

/* Schmal genau umgekehrt: die Karte neben dem Deck machte die Kampfzeile 80px breiter,
   dort steht die Turmtruppe klein in der Knopfzeile. */
@media (max-width: 1100px) {
  .battle-tower-troop { display: none; }
  .deck-tower { display: inline-flex; align-items: center; flex: none; }
  .deck-tower .card,
  .deck-tower .card-img,
  .deck-tower .card-img img { width: 26px; }
}

/* The 8-card deck: moderate fixed size, 2 rows of 4. */
.battle-deck { display: grid; grid-template-columns: repeat(4, 54px); gap: 3px; }
.battle-deck .card { width: 54px; }
.battle-deck .card-img, .battle-deck .card-img img { width: 54px; }
.score { flex: none; font-size: 1.4rem; font-weight: 800; white-space: nowrap; }
.score .sep { color: var(--muted); margin: 0 1px; }

/* Expandable space reserved for future battle statistics. */
.battle-footer { position: relative; margin-top: 0.45rem; min-height: 26px; }
.battle-more { width: 100%; }
.battle-more summary {
  display: flex; align-items: center; justify-content: center;
  width: 34px; height: 26px; margin: 0 auto;
  border-radius: 6px; color: rgba(226, 233, 248, 0.68);
  cursor: pointer; list-style: none;
  transition: color 0.18s ease, background 0.18s ease;
}
.battle-more summary::-webkit-details-marker { display: none; }
.battle-more summary:hover { color: #fff; background: rgba(255, 255, 255, 0.08); }
.battle-more summary:focus-visible { outline: 2px solid var(--laser-left, var(--primary)); outline-offset: 2px; }
.battle-more summary svg { transition: transform 0.25s ease; }
.battle-more[open] summary svg { transform: rotate(180deg); }
.battle-more-content {
  margin: 0.45rem -1rem -0.65rem;
  padding: 1rem 1rem 1.2rem;
  border-top: 1px solid rgba(255, 255, 255, 0.1);
  color: rgba(226, 233, 248, 0.68);
  text-align: center; font-size: 0.84rem; font-weight: 600;
  background: rgba(8, 10, 16, 0.24);
  animation: battle-more-reveal 0.22s ease-out;
}
@keyframes battle-more-reveal {
  from { opacity: 0; transform: translateY(-4px); }
  to { opacity: 1; transform: translateY(0); }
}

/* ---------- Tabellen ---------- */
table { border-collapse: collapse; width: 100%; font-size: 0.92rem; }
th, td { text-align: left; padding: 0.5rem 0.7rem; border-bottom: 1px solid var(--panel-inset-border); }
th { background: rgba(9, 12, 20, 0.55); font-size: 0.78rem; text-transform: uppercase; letter-spacing: 0.03em; color: var(--panel-muted); }
tbody tr:hover { background: rgba(89, 122, 255, 0.09); }

/* ---------- Clan tab (dark cards matching battle log / player decks) ---------- */
/* Base card: same gradient + glow line as .player-deck-box. */
.clan-card {
  position: relative; overflow: hidden;
  padding: 1rem 1.1rem; border: 1px solid var(--panel-border); border-radius: 8px;
  color: #f3f6ff;
  background: var(--panel-bg);
  box-shadow: var(--panel-shadow);
  margin-bottom: 0.75rem;
}
.clan-card::before {
  content: ""; position: absolute; top: 0; left: 10%; right: 10%; height: 1px;
  background: var(--panel-line);
  box-shadow: 0 0 8px rgba(89, 122, 255, 0.5); pointer-events: none;
}

/* Header card: clan identity and stats on the left, ten-week war chart on the right. */
#profile,
#clan { scroll-margin-top: 108px; }
#clan-header { padding: 1.15rem; overflow: visible; }
.clan-header-layout {
  display: grid;
  grid-template-columns: minmax(320px, 0.92fr) minmax(420px, 1.18fr);
  gap: 1.15rem;
  align-items: stretch;
}
.clan-overview { min-width: 0; }
.clan-head-top { display: flex; align-items: flex-start; gap: 0.85rem; min-height: 70px; }
#clan-header .clan-badge { width: 68px; height: 68px; margin: 0; flex: none; }
.clan-head-names { min-width: 0; padding-top: 0.1rem; }
.clan-name { margin: 0; font-size: 1.35rem; letter-spacing: 0; }
.clan-name .tag {
  display: inline-block; color: rgba(226, 233, 248, 0.55);
  font-size: 0.82rem; font-weight: 500; margin-left: 0.35rem;
}
.clan-desc {
  display: block; margin: 0.3rem 0 0; max-width: 54ch;
  color: rgba(226, 233, 248, 0.72); font-size: 0.82rem; line-height: 1.38;
  overflow-wrap: anywhere;
}
.clan-stat-grid {
  display: grid; grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 7px; margin-top: 0.85rem;
}
.clan-stat {
  display: flex; align-items: center; gap: 0.5rem; min-width: 0; min-height: 55px;
  border: 1px solid rgba(123, 145, 216, 0.2); border-radius: 7px;
  padding: 0.35rem 0.48rem;
  background: linear-gradient(135deg, rgba(9, 12, 20, 0.78), rgba(20, 24, 35, 0.72));
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.035);
}
.clan-stat-icon {
  width: 39px; height: 39px; flex: none; object-fit: contain;
  filter: drop-shadow(0 3px 4px rgba(0, 0, 0, 0.42));
}
.clan-stat-copy { display: flex; flex-direction: column; min-width: 0; }
.clan-stat .k {
  color: rgba(226, 233, 248, 0.52); font-size: 0.61rem; font-weight: 750;
  text-transform: uppercase; letter-spacing: 0; white-space: nowrap;
  overflow: hidden; text-overflow: ellipsis;
}
.clan-stat .v {
  color: #fff; font-size: 0.92rem; font-weight: 850; line-height: 1.18;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.clan-stat .detail {
  color: rgba(226, 233, 248, 0.43); font-size: 0.56rem; font-weight: 650;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}

.clan-war-progress {
  position: relative; display: flex; flex-direction: column; min-width: 0; min-height: 286px;
  padding: 0.8rem 0.85rem 0.4rem; overflow: visible;
  border: 1px solid rgba(112, 150, 255, 0.3); border-radius: 7px;
  background:
    radial-gradient(circle at 84% 14%, rgba(255, 206, 83, 0.12), transparent 27%),
    linear-gradient(155deg, rgba(8, 12, 23, 0.9), rgba(12, 19, 38, 0.86) 58%, rgba(18, 15, 31, 0.9));
  box-shadow: inset 0 0 30px rgba(53, 93, 203, 0.08), 0 8px 22px rgba(1, 4, 12, 0.2);
}
.clan-war-progress::after {
  content: ""; position: absolute; inset: 0; pointer-events: none;
  border-radius: inherit;
  background: linear-gradient(110deg, transparent 38%, rgba(113, 164, 255, 0.045) 50%, transparent 62%);
  background-size: 260% 100%; background-position: 130% 0;
  animation: clan-chart-sheen 4.8s 1.2s ease-in-out infinite;
}
.clan-chart-head {
  position: relative; z-index: 2; display: flex; align-items: center; justify-content: space-between;
  gap: 0.75rem; min-height: 42px; padding: 0 0.25rem;
}
.clan-chart-head > span:first-child { display: flex; flex-direction: column; }
.clan-chart-eyebrow {
  color: rgba(210, 222, 255, 0.5); font-size: 0.61rem; font-weight: 750;
  text-transform: uppercase; letter-spacing: 0;
}
.clan-chart-head strong { color: #f6f8ff; font-size: 0.98rem; letter-spacing: 0; }
.clan-chart-head > img { width: 42px; height: 42px; object-fit: contain; }
.clan-chart-total { display: inline-flex; align-items: center; gap: 0.35rem; }
.clan-chart-total img {
  width: 38px; height: 38px; object-fit: contain;
  filter: drop-shadow(0 0 7px rgba(255, 206, 83, 0.25));
}
.clan-chart-total > span { display: flex; align-items: baseline; gap: 0.38rem; }
.clan-chart-total b { color: #fff; font-size: 1.08rem; font-variant-numeric: tabular-nums; }
.clan-chart-total small { font-size: 0.68rem; font-weight: 800; }
.clan-chart-total .up { color: #65e3a2; }
.clan-chart-total .down { color: #ff7080; }
.clan-chart-total .flat { color: rgba(226, 233, 248, 0.5); }
.clan-war-chart { position: relative; z-index: 1; display: block; width: 100%; flex: 1; min-height: 205px; overflow: visible; }
.clan-chart-grid line { stroke: rgba(183, 203, 255, 0.09); stroke-width: 1; stroke-dasharray: 3 5; }
.clan-chart-grid text {
  fill: rgba(211, 221, 247, 0.38); font-size: 9px; font-weight: 650;
  text-anchor: end; font-variant-numeric: tabular-nums;
}
.clan-chart-area {
  fill: url(#clan-war-area); transform-box: fill-box; transform-origin: left;
  animation: clan-chart-area-in 1.05s 0.18s cubic-bezier(0.22, 1, 0.36, 1) both;
}
.clan-chart-line {
  fill: none; stroke: url(#clan-war-line); stroke-width: 3; stroke-linecap: round; stroke-linejoin: round;
  filter: url(#clan-war-glow); stroke-dasharray: 1; stroke-dashoffset: 1;
  animation: clan-chart-line-in 1.25s 0.12s cubic-bezier(0.65, 0, 0.35, 1) forwards;
}
.clan-chart-point { opacity: 0; transform-box: fill-box; transform-origin: center; animation: clan-chart-point-in 0.35s var(--point-delay) ease-out forwards; }
.clan-chart-point { outline: none; cursor: default; }
.clan-chart-point circle { fill: #11192d; stroke: #9fc1ff; stroke-width: 2.5; transition: r 0.14s ease, filter 0.14s ease; }
.clan-chart-point:hover circle, .clan-chart-point:focus circle { r: 7px; filter: drop-shadow(0 0 4px currentColor); }
.clan-chart-point.up circle { stroke: #64e3a1; }
.clan-chart-point.down circle { stroke: #ff7182; }
.clan-chart-point.flat circle { stroke: #98a8cc; }
.clan-chart-point .point-change { font-size: 9px; font-weight: 850; text-anchor: middle; fill: #aebad6; }
.clan-chart-point.up .point-change { fill: #64e3a1; }
.clan-chart-point.down .point-change { fill: #ff7182; }
.clan-chart-point .point-label { fill: rgba(213, 222, 246, 0.48); font-size: 8.5px; font-weight: 650; text-anchor: middle; }
.clan-chart-tooltip {
  position: absolute; z-index: 5; width: 176px; padding: 0.65rem 0.7rem;
  border: 1px solid rgba(119, 156, 255, 0.48); border-radius: 7px;
  color: #f5f7ff;
  background: linear-gradient(145deg, rgba(17, 24, 44, 0.98), rgba(9, 12, 22, 0.98));
  box-shadow: 0 10px 28px rgba(0, 0, 0, 0.48), inset 0 1px rgba(255, 255, 255, 0.06);
  pointer-events: none; transform: translate(-50%, -100%);
  animation: clan-tooltip-in 0.14s ease-out;
}
.clan-chart-tooltip[hidden] { display: none; }
.clan-chart-tooltip::after {
  content: ""; position: absolute; left: var(--tooltip-arrow-left, 50%); bottom: -5px; width: 9px; height: 9px;
  border-right: 1px solid rgba(119, 156, 255, 0.48); border-bottom: 1px solid rgba(119, 156, 255, 0.48);
  background: #0b0f1c; transform: translateX(-50%) rotate(45deg);
}
.clan-tooltip-head { display: flex; align-items: center; justify-content: space-between; gap: 0.45rem; }
.clan-tooltip-head strong { font-size: 0.72rem; }
.clan-tooltip-head span {
  flex: none; padding: 0.08rem 0.28rem; border-radius: 4px;
  font-size: 0.58rem; font-weight: 800; background: rgba(151, 166, 200, 0.12);
}
.clan-tooltip-head .up { color: #65e3a2; background: rgba(46, 190, 118, 0.13); }
.clan-tooltip-head .down { color: #ff7887; background: rgba(232, 72, 94, 0.13); }
.clan-tooltip-head .flat { color: #afbad2; }
.clan-tooltip-score { display: flex; align-items: center; gap: 0.45rem; margin-top: 0.52rem; }
.clan-tooltip-score img { width: 30px; height: 30px; object-fit: contain; }
.clan-tooltip-score span { display: flex; flex-direction: column; }
.clan-tooltip-score b { font-size: 1rem; line-height: 1; font-variant-numeric: tabular-nums; }
.clan-tooltip-score small { margin-top: 0.14rem; color: rgba(218, 226, 247, 0.48); font-size: 0.57rem; }
.clan-tooltip-rank {
  margin-top: 0.45rem; padding-top: 0.4rem; border-top: 1px solid rgba(255, 255, 255, 0.08);
  color: rgba(218, 226, 247, 0.56); font-size: 0.62rem;
}
.clan-tooltip-rank b { float: right; color: #fff; font-size: 0.68rem; }
.clan-chart-empty { display: grid; flex: 1; place-items: center; color: rgba(226, 233, 248, 0.48); font-size: 0.8rem; }
.clan-chart-loading { display: flex; align-items: flex-end; gap: 7%; flex: 1; padding: 1.4rem 1rem 1.8rem; }
.clan-chart-loading span {
  width: 18%; height: 32%; border-radius: 4px 4px 1px 1px;
  background: linear-gradient(180deg, rgba(108, 151, 255, 0.36), rgba(108, 151, 255, 0.04));
  animation: clan-chart-loading 1.1s ease-in-out infinite alternate;
}
.clan-chart-loading span:nth-child(2) { height: 55%; animation-delay: 0.12s; }
.clan-chart-loading span:nth-child(3) { height: 43%; animation-delay: 0.24s; }
.clan-chart-loading span:nth-child(4) { height: 72%; animation-delay: 0.36s; }
@keyframes clan-chart-line-in { to { stroke-dashoffset: 0; } }
@keyframes clan-chart-area-in { from { opacity: 0; transform: scaleX(0); } to { opacity: 1; transform: scaleX(1); } }
@keyframes clan-chart-point-in { from { opacity: 0; transform: scale(0.35); } to { opacity: 1; transform: scale(1); } }
@keyframes clan-tooltip-in { from { opacity: 0; transform: translate(-50%, calc(-100% + 5px)); } }
@keyframes clan-chart-loading { to { opacity: 0.45; transform: scaleY(0.72); } }
@keyframes clan-chart-sheen { 0%, 58% { background-position: 130% 0; } 82%, 100% { background-position: -30% 0; } }

/* Summary line above the members table (matches .player-decks-summary). */
.clan-summary { color: rgba(239, 243, 252, 0.7); font-size: 0.82rem; font-weight: 650; margin-bottom: 0.6rem; }

/* Dark tables (members + war participants) inside a glowing card frame. */
.clan-table-wrap {
  position: relative; overflow-x: auto;
  border: 1px solid var(--panel-border); border-radius: 8px;
  background: var(--panel-bg);
  box-shadow: var(--panel-shadow);
  margin-bottom: 0.75rem;
}
/* Groessensteuerung ueber den breiten Clan-Tabellen. Am Desktop passt die Tabelle
   ohnehin ins Fenster, dort waere der Regler nur zusaetzliches Bedienteil - er wird
   deshalb erst auf schmalen Bildschirmen eingeblendet (siehe Mobil-Block). */
.table-zoom { display: none; align-items: center; gap: 0.4rem; margin-bottom: 0.5rem; }
.table-zoom .col-btn {
  min-height: 28px; min-width: 34px; padding: 0.15rem 0.4rem;
  font-size: 1rem; line-height: 1; text-align: center;
}
.table-zoom .col-btn:disabled { opacity: 0.4; cursor: default; }
.table-zoom-value {
  min-width: 3rem; color: var(--panel-muted); font-size: 0.72rem;
  font-weight: 700; font-variant-numeric: tabular-nums; text-align: center;
}
/* `zoom` statt `transform: scale()`: der Browser rechnet die Groesse ins Layout ein,
   dadurch stimmen die klebenden Spalten und die Wischweite weiterhin. Bei scale() waere
   die Tabelle nur optisch kleiner, der Scrollbereich aber unveraendert breit. */
.clan-table-wrap .clan-table { zoom: var(--table-zoom, 1); }

.clan-table { color: #f3f6ff; font-size: 0.88rem; }
.clan-table th {
  background: rgba(8, 10, 15, 0.6); color: rgba(226, 233, 248, 0.6);
  border-bottom: 1px solid rgba(255, 255, 255, 0.1); white-space: nowrap;
}
.clan-table td { border-bottom: 1px solid rgba(255, 255, 255, 0.07); }
.clan-table th:first-child, .clan-table td:first-child { width: 1%; padding-right: 0.35rem; }
.clan-table tbody tr:hover { background: rgba(255, 255, 255, 0.05); }
.clan-table tbody tr.lb-clan-war-highlight {
  background:
    linear-gradient(90deg, color-mix(in srgb, var(--clan-war-color) 16%, transparent), transparent 38%),
    rgba(255, 255, 255, 0.018);
  box-shadow: inset 3px 0 0 var(--clan-war-color);
}
.clan-table tbody tr.lb-clan-war-highlight:hover {
  background:
    linear-gradient(90deg, color-mix(in srgb, var(--clan-war-color) 22%, transparent), transparent 42%),
    rgba(255, 255, 255, 0.055);
}
.clan-table tbody tr:last-child td { border-bottom: none; }
.clan-table a { color: #f3f6ff; font-weight: 600; }
.clan-table .num { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; }
.cell-icon { width: 16px; height: 16px; object-fit: contain; vertical-align: -3px; margin-right: 4px; }
.league-cell-icon { width: 22px; height: 22px; vertical-align: -6px; margin: -4px 2px -4px -2px; }
.ranked-cell { white-space: nowrap; }
.cell-empty { color: rgba(226, 233, 248, 0.35); }
.rank-cell {
  white-space: nowrap; font-weight: 700;
}
.rank-wrap {
  display: inline-flex; align-items: center; gap: 0.35rem;
}
.rank-main { min-width: 2.45rem; color: rgba(243, 246, 255, 0.86); font-variant-numeric: tabular-nums; }
.rank-delta {
  display: inline-flex; align-items: center; gap: 0.2rem;
  color: rgba(226, 233, 248, 0.52);
  font-size: 0.68rem; font-weight: 850; font-variant-numeric: tabular-nums;
}
.rank-delta i {
  width: 0; height: 0; display: inline-block;
  border-left: 4px solid transparent; border-right: 4px solid transparent;
}
.rank-delta.up { color: #77d99d; }
.rank-delta.up i {
  border-bottom: 7px solid #62e2a0;
  filter: drop-shadow(0 0 4px rgba(98, 226, 160, 0.22));
}
.rank-delta.down { color: #ef8d95; }
.rank-delta.down i {
  border-top: 7px solid #ff7a86;
  filter: drop-shadow(0 0 4px rgba(255, 122, 134, 0.2));
}

/* Sortable headers: click to sort, click again to flip. Only one column at a time. */
.clan-table.sortable th:is([data-sort], [data-river-sort]) { cursor: pointer; user-select: none; transition: color 0.15s, background 0.15s; }
.clan-table.sortable th:is([data-sort], [data-river-sort]):hover { color: #fff; background: rgba(255, 255, 255, 0.06); }
.clan-table.sortable th:is([data-sort], [data-river-sort])::after {
  content: "↕"; margin-left: 5px; font-size: 0.72em; opacity: 0.28;
}
.clan-table.sortable th.sorted { color: #fff; background: rgba(88, 124, 255, 0.16); }
.clan-table.sortable th.sorted[data-dir="asc"]::after { content: "▲"; opacity: 1; color: #7ea2ff; }
.clan-table.sortable th.sorted[data-dir="desc"]::after { content: "▼"; opacity: 1; color: #7ea2ff; }
.role-chip {
  display: inline-block; padding: 0.08rem 0.5rem; border-radius: 6px;
  border: 1px solid rgba(255, 255, 255, 0.16); background: rgba(255, 255, 255, 0.06);
  font-size: 0.74rem; font-weight: 700; white-space: nowrap;
}
.role-chip.role-leader { color: #ffd66f; border-color: rgba(255, 214, 111, 0.45); }
.role-chip.role-coLeader { color: #f3a25c; border-color: rgba(243, 162, 92, 0.4); }
.role-chip.role-elder { color: #7ea2ff; border-color: rgba(126, 162, 255, 0.4); }

/* River race + war log */
#riverrace-status, #warlog-status { color: rgba(255, 255, 255, 0.82); font-size: 0.9rem; }
.race-meta { color: rgba(239, 243, 252, 0.7); font-size: 0.82rem; font-weight: 650; margin-bottom: 0.6rem; }
#tab-clan h3.clan-sub-h {
  margin: 1.1rem 0 0.5rem; font-size: 1rem;
  color: #fff; text-shadow: 0 1px 4px rgba(0, 0, 0, 0.5);
}
.river-participants-toolbar {
  display: flex; align-items: flex-end; justify-content: space-between; gap: 0.75rem;
}
.river-participants-actions { display: inline-flex; align-items: center; gap: 0.55rem; margin-bottom: 0.5rem; }
.river-participants-status { color: var(--panel-muted); font-size: 0.7rem; }
.river-participants-refresh {
  display: inline-flex; align-items: center; gap: 0.35rem; min-height: 32px;
  padding: 0.3rem 0.65rem; border: 1px solid var(--panel-inset-border); border-radius: 6px;
  background: var(--panel-inset); color: var(--panel-text);
  font-size: 0.76rem; font-weight: 750;
}
.river-participants-refresh:hover { border-color: var(--primary); color: var(--text); }
.river-participants-refresh:disabled { cursor: wait; opacity: 0.62; }
.river-participants-refresh.is-loading svg { animation: river-refresh-spin 0.8s linear infinite; }
.river-participant-divider td {
  padding: 0.38rem 0.65rem; border-top: 3px solid var(--gold); border-bottom: 0;
  background: color-mix(in srgb, var(--gold) 10%, transparent); color: var(--gold);
  font-size: 0.7rem; font-weight: 850; letter-spacing: 0.02em; text-transform: uppercase;
}
.clan-table tbody tr.river-participant-divider:hover {
  background: color-mix(in srgb, var(--gold) 10%, transparent);
}
@keyframes river-refresh-spin { to { transform: rotate(360deg); } }
.race-week-head { display: flex; justify-content: space-between; align-items: baseline; gap: 0.6rem; margin-bottom: 0.35rem; }
.race-week-title { font-weight: 800; font-size: 0.95rem; }
.race-week-date { color: rgba(226, 233, 248, 0.55); font-size: 0.78rem; }
.warlog-current-section {
  padding-bottom: 1.05rem; margin-bottom: 1rem;
  border-bottom: 1px solid var(--panel-inset-border);
}
.warlog-section-head, .warlog-history-head {
  display: flex; align-items: center; justify-content: space-between; gap: 0.8rem;
  margin: 0 0 0.55rem; padding: 0 0.15rem;
}
.warlog-section-title { color: var(--panel-text); font-size: 0.82rem; font-weight: 800; }
.warlog-live-status {
  display: inline-flex; align-items: center; gap: 0.42rem;
  color: var(--panel-muted); font-size: 0.7rem; font-weight: 750;
}
.warlog-live-dot {
  width: 7px; height: 7px; flex: none; border-radius: 50%; background: var(--primary);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--primary) 16%, transparent);
}
.race-week-active { border-color: color-mix(in srgb, var(--primary) 34%, var(--panel-border)); }
.warlog-history-head { margin-bottom: 0.55rem; }
.warlog-history-count { color: var(--panel-dim); font-size: 0.7rem; }
.race-row {
  display: flex; align-items: center; gap: 0.6rem;
  padding: 0.45rem 0.35rem; border-bottom: 1px solid rgba(255, 255, 255, 0.07);
  font-size: 0.9rem;
}
.race-row:last-child { border-bottom: none; }
.race-row.own { background: rgba(88, 124, 255, 0.14); border-radius: 6px; }
.race-rank { width: 2.1rem; flex: none; font-weight: 800; color: rgba(226, 233, 248, 0.6); }
.race-row.own .race-rank { color: #fff; }
.race-clan {
  display: inline-flex; align-items: center; gap: 0.45rem; flex: 1; min-width: 0;
  color: var(--panel-text); font-weight: 700; text-decoration: none;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.race-clan:hover { color: color-mix(in srgb, var(--primary) 58%, white); }
.race-clan .clan-badge { width: 24px; height: 24px; margin: 0; flex: none; }
.race-sub { flex: none; color: rgba(226, 233, 248, 0.55); font-size: 0.78rem; white-space: nowrap; }
.race-fame { flex: none; font-weight: 800; white-space: nowrap; }
.clan-empty {
  padding: 2rem; border: 1px dashed rgba(255, 255, 255, 0.2); border-radius: 8px;
  color: rgba(235, 239, 248, 0.64); text-align: center;
}

/* ---------- Leaderboard ---------- */
.lb-toolbar {
  display: flex; align-items: center; flex-wrap: wrap; gap: 0.6rem;
  margin-bottom: 0.75rem;
}
.lb-location-field { position: relative; }
.lb-location-button {
  min-height: 36px; min-width: 150px; display: inline-flex; align-items: center; gap: 0.48rem;
  padding: 0.25rem 0.55rem; border: 1px solid rgba(255, 255, 255, 0.12); border-radius: 8px;
  background: rgba(8, 10, 15, 0.82); color: #eef2fb; font-size: 0.82rem; font-weight: 750;
}
.lb-event-button { min-width: 240px; padding-right: 0.42rem; }
.lb-location-button:hover, .lb-location-button[aria-expanded="true"] {
  border-color: rgba(126, 162, 255, 0.62); background: rgba(18, 28, 58, 0.92);
}
.lb-event-icon {
  width: 26px; height: 26px; object-fit: contain; flex: none;
  filter: drop-shadow(0 1px 3px rgba(0, 0, 0, 0.36));
}
.lb-event-caret {
  width: 18px; height: 18px; flex: none; margin-left: auto; position: relative;
  border-radius: 5px; background: rgba(255, 255, 255, 0.05);
}
.lb-event-caret::before {
  content: ""; position: absolute; left: 50%; top: 50%;
  width: 7px; height: 7px; border-right: 2px solid rgba(226, 233, 248, 0.78); border-bottom: 2px solid rgba(226, 233, 248, 0.78);
  transform: translate(-50%, -62%) rotate(45deg);
}
.lb-event-button[aria-expanded="true"] .lb-event-caret::before {
  transform: translate(-50%, -38%) rotate(225deg);
}
.lb-location-code {
  flex: none; width: 2rem; min-height: 1.35rem; display: inline-grid; place-items: center;
  border: 1px solid rgba(126, 162, 255, 0.32); border-radius: 5px;
  background: rgba(49, 91, 212, 0.2); color: #dfe7ff; font-size: 0.66rem; font-weight: 900;
}
.lb-location-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.lb-location-menu {
  position: absolute; z-index: 30; top: calc(100% + 6px); left: 0; width: min(310px, calc(100vw - 2rem));
  padding: 0.45rem; border: 1px solid rgba(126, 162, 255, 0.24); border-radius: 8px;
  background: rgba(10, 13, 21, 0.98); box-shadow: 0 18px 42px rgba(0, 0, 0, 0.38);
}
.lb-location-search {
  width: 100%; min-height: 32px; margin-bottom: 0.4rem; padding: 0.25rem 0.55rem;
  border: 1px solid rgba(255, 255, 255, 0.12); border-radius: 7px;
  background: rgba(255, 255, 255, 0.05); color: #eef2fb; font-size: 0.82rem;
}
.lb-location-search:focus { outline: none; border-color: #7ea2ff; box-shadow: 0 0 0 3px rgba(59, 110, 245, 0.14); }
.lb-location-options {
  max-height: 260px; display: grid; gap: 3px; overflow: auto; padding-right: 2px;
}
.lb-location-options button {
  display: flex; align-items: center; gap: 0.48rem; width: 100%; min-height: 32px;
  padding: 0.2rem 0.35rem; border-radius: 6px; color: rgba(231, 236, 248, 0.76);
  background: transparent; text-align: left; font-size: 0.8rem; font-weight: 700;
}
.lb-event-options button { min-height: 42px; gap: 0.6rem; padding: 0.28rem 0.45rem; }
.lb-event-options .lb-event-icon { width: 30px; height: 30px; }
.lb-event-option-name {
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.lb-location-options button:hover, .lb-location-options button.active {
  background: rgba(49, 91, 212, 0.28); color: #fff;
}
.lb-location-empty { padding: 0.65rem; color: rgba(226, 233, 248, 0.5); font-size: 0.8rem; text-align: center; }
.lb-search {
  flex: 1; min-width: 170px; max-width: 260px; min-height: 34px;
  padding: 0.3rem 0.65rem;
  border: 1px solid rgba(255, 255, 255, 0.12); border-radius: 8px;
  background: rgba(8, 10, 15, 0.82); color: #eef2fb; font-size: 0.82rem;
}
.lb-search::placeholder { color: rgba(226, 233, 248, 0.38); }
.lb-search:focus { outline: none; border-color: var(--primary); box-shadow: 0 0 0 3px rgba(59, 110, 245, 0.15); }
.lb-summary { margin-left: auto; color: rgba(239, 243, 252, 0.7); font-size: 0.82rem; font-weight: 650; }
#lb-ranked-status, #lb-clan-status, #lb-event-status { color: rgba(255, 255, 255, 0.82); font-size: 0.9rem; }
.lb-loading {
  min-height: 150px; display: flex; flex-direction: column; align-items: center;
  justify-content: center; gap: 0.7rem; color: var(--panel-muted); font-size: 0.84rem;
}
.lb-loading[hidden] { display: none; }
.lb-loading-ring {
  width: 34px; height: 34px; border: 3px solid var(--panel-inset-border);
  border-top-color: var(--gold); border-radius: 50%; animation: lb-loading-spin 0.8s linear infinite;
}
@keyframes lb-loading-spin { to { transform: rotate(360deg); } }
@media (prefers-reduced-motion: reduce) { .lb-loading-ring { animation-duration: 1.8s; } }
.lb-empty-cell { padding: 1.6rem; color: rgba(235, 239, 248, 0.6); text-align: center; }
.lb-events-off { display: flex; flex-direction: column; gap: 0.45rem; }
.lb-events-off span { font-size: 0.85rem; max-width: 62ch; margin: 0 auto; }

/* Pager – identical above and below the list. */
.lb-pager { display: flex; align-items: center; justify-content: center; gap: 0.75rem; margin: 0.6rem 0; }
.lb-pager:empty { display: none; }
.lb-page-btn {
  min-height: 32px; padding: 0.3rem 0.72rem; border-radius: 8px;
  border: 1px solid rgba(255, 255, 255, 0.12); background: rgba(8, 10, 15, 0.82);
  color: #eef2fb; font-size: 0.8rem; font-weight: 700;
}
.lb-page-btn.icon {
  width: 34px; padding: 0; display: inline-grid; place-items: center;
  font-size: 1.02rem; line-height: 1;
}
.lb-page-btn:hover:not(:disabled) { background: #315bd4; border-color: #7894f4; }
.lb-page-btn:disabled { opacity: 0.35; cursor: default; }
.lb-page-info {
  min-width: 4.8rem; text-align: center; color: rgba(239, 243, 252, 0.62);
  font-size: 0.78rem; font-variant-numeric: tabular-nums;
}
.lb-page-info b { color: #fff; }

/* Ranked rows: one wide banner per player, built like the player-deck box. */
.lb-list { display: flex; flex-direction: column; gap: 0.55rem; }
.lb-row {
  position: relative; overflow: hidden;
  padding: 0.7rem 0.9rem 0.75rem;
  border: 1px solid var(--panel-border); border-radius: 8px;
  color: #f3f6ff;
  background: var(--panel-bg);
  box-shadow: var(--panel-shadow);
  /* Pop-in on scroll: the .lb-in class is set by the IntersectionObserver. */
  opacity: 0; transform: translateY(14px) scale(0.994);
  transition: opacity 0.42s cubic-bezier(0.22, 1, 0.36, 1), transform 0.42s cubic-bezier(0.22, 1, 0.36, 1);
}
.lb-row.lb-in { opacity: 1; transform: none; }
.lb-row::before {
  content: ""; position: absolute; top: 0; left: 10%; right: 10%; height: 1px;
  background: var(--panel-line);
  box-shadow: 0 0 8px rgba(89, 122, 255, 0.5); pointer-events: none;
}
@media (prefers-reduced-motion: reduce) {
  .lb-row { opacity: 1; transform: none; transition: none; }
}

.lb-row-head { display: flex; align-items: center; gap: 0.6rem; min-width: 0; }
.lb-rank {
  flex: none; min-width: 4.3rem; display: inline-flex; flex-direction: column; line-height: 1.15;
  font-size: 0.95rem; font-weight: 850; color: rgba(226, 233, 248, 0.62);
  font-variant-numeric: tabular-nums;
}
/* Ranglistenzeile: der Rang braucht nur so viel Platz, wie "#1000" plus der globale
   Zusatz belegen. Name und Clan sind eine Einheit und ruecken gemeinsam nach links. */
#lb-ranked-list .lb-rank { min-width: 3.3rem; }
#lb-ranked-list .lb-row-head { gap: 0.45rem; }
.lb-who { display: inline-flex; align-items: baseline; gap: 0.5rem; min-width: 0; }
/* Elixier | QR | Save | Medaillen – wie bei den Meta-Decks, nur mit Medaillen
   an der Stelle des Scores. */
.lb-head-actions { display: flex; align-items: center; gap: 0.5rem; margin-left: auto; flex: none; }
/* Der Elixierschnitt steht hier als Geschwister der Knopfleiste, nicht als deren
   erstes Kind (deckActions mit `elixirOutside`) - der Abstand muss deshalb hier
   stehen, sonst kleben Schnitt und Knoepfe aneinander. */
.lb-actions-slot { display: inline-flex; }
/* Ausrichtung und Abstand kamen mit der schmalen Zeile dazu (siehe Kommentar oben) und
   bleiben deshalb dort. */
@media (max-width: 1100px) {
  .lb-actions-slot { align-items: center; gap: 5px; }
}
.lb-head-actions .lb-elo { margin-left: 0; }
/* Country boards: the national rank leads, the global standing rides underneath. */
.lb-rank-global { color: rgba(226, 233, 248, 0.38); font-size: 0.62rem; font-weight: 700; white-space: nowrap; }
.lb-player { font-size: 1rem; font-weight: 800; color: #fff; white-space: nowrap; }
.lb-player:hover { color: #9db4ff; text-decoration: none; }
.lb-clan {
  display: inline-flex; align-items: center; gap: 0.3rem; min-width: 0;
  color: rgba(226, 233, 248, 0.66); font-size: 0.84rem; font-weight: 650;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.lb-clan.muted { color: rgba(226, 233, 248, 0.34); }
a.lb-clan:hover { color: #fff; text-decoration: none; }
.lb-clan .clan-badge { width: 20px; height: 20px; margin: 0; flex: none; }
.lb-elo {
  margin-left: auto; flex: none; display: inline-flex; align-items: center;
  border: 2px solid #2b2f3a; background: #14161c; border-radius: 8px;
  padding: 0.14rem 0.5rem; font-weight: 800; font-size: 0.85rem; color: #fff;
}

/* Deck row: 8 cards in a single line, so the banner scrolls nicely. */
.lb-row-body { display: flex; align-items: center; gap: 0.7rem; margin-top: 0.55rem; flex-wrap: wrap; }
.lb-deck { display: grid; grid-template-columns: repeat(8, 52px); gap: 3px; min-height: 77px; }
.lb-deck .card, .lb-deck .card-img, .lb-deck .card-img img { width: 52px; }
/* A ranking snapshot can still list a player whose profile 404s -> no deck to show. */
.lb-deck-empty {
  grid-column: 1 / -1; display: flex; align-items: center;
  color: rgba(226, 233, 248, 0.35); font-size: 0.82rem; white-space: nowrap;
}
/* Platzhalter, solange das Deck der Zeile noch nachgeladen wird. */
.lb-card-skeleton {
  width: 52px; height: 63px; border-radius: 5px;
  background: linear-gradient(180deg, rgba(255, 255, 255, 0.07), rgba(255, 255, 255, 0.03));
  border: 1px solid rgba(255, 255, 255, 0.06);
  animation: lb-card-skeleton 1.2s ease-in-out infinite alternate;
}
.lb-card-skeleton:nth-child(2) { animation-delay: 0.08s; }
.lb-card-skeleton:nth-child(3) { animation-delay: 0.16s; }
.lb-card-skeleton:nth-child(4) { animation-delay: 0.24s; }
.lb-card-skeleton:nth-child(5) { animation-delay: 0.32s; }
.lb-card-skeleton:nth-child(6) { animation-delay: 0.4s; }
.lb-card-skeleton:nth-child(7) { animation-delay: 0.48s; }
.lb-card-skeleton:nth-child(8) { animation-delay: 0.56s; }
@keyframes lb-card-skeleton { to { opacity: 0.42; } }
@media (prefers-reduced-motion: reduce) {
  .lb-card-skeleton { animation: none; }
}
/* Das nachgereichte Deck blendet sich ein, statt hart zu erscheinen. */
.lb-row:not(.lb-deck-pending) .lb-deck { animation: battle-more-reveal 0.24s ease-out; }

.lb-deck-actions { flex: none; }
/* Reserved for the upcoming per-player statistics block – keeps the space in the layout. */
.lb-stats-slot { flex: 1; min-width: 0; align-self: flex-end; text-align: right; }

/* ---------- Rangliste: Verlauf der letzten Ranked-Kaempfe ----------
   Gleiche Breite und gleiche Abstaende wie der Bilanzblock unter Decks/Meta. */
.lb-record {
  display: flex; flex-direction: column; justify-content: flex-end;
  flex: 1 1 auto; min-width: 0; text-align: left;
  margin-left: 1.25rem; margin-right: 0.9rem;
  /* Haelt die Hoehe auch dann, wenn das Deck noch nicht geladen ist. */
  min-height: 84px;
}
.lb-timeline-defs { position: absolute; width: 0; height: 0; overflow: hidden; }
.lb-timeline-wrap {
  position: relative; overflow: hidden; cursor: pointer; outline: none;
  border: 1px solid rgba(255, 255, 255, 0.09); border-radius: 6px;
  background: rgba(5, 7, 13, 0.5);
  box-shadow: inset 0 2px 6px rgba(0, 0, 0, 0.3);
}
.lb-timeline { display: block; width: 100%; height: 82px; }
/* Flaeche unter der Kurve – dieselbe Idee wie beim Clan-War-Chart. */
.lb-area { fill: url(#lb-timeline-area); stroke: none; }
/* `preserveAspectRatio="none"` streckt die Kurve auf die Slotbreite. Damit die Linien
   dabei nicht mitskalieren und unterschiedlich dick werden, zeichnet der Browser sie
   ueber `vector-effect` in echter Pixelstaerke. */
/* Der Glow liegt auf der Gruppe, nicht auf jedem Strich: sonst leuchtet jedes Segment
   einzeln und die Uebergaenge bekommen helle Knoten. */
.lb-segments { filter: url(#lb-timeline-glow); }
.lb-seg {
  fill: none; stroke-width: 2; stroke-linecap: round;
  vector-effect: non-scaling-stroke;
}
.lb-seg-win { stroke: #53d794; }
.lb-seg-loss { stroke: #f26773; }
/* Unentschieden: grau, aber durchgezogen. */
.lb-seg-draw { stroke: #8e97a9; }
/* Anderes Deck: dasselbe Grau, gestrichelt – so bleibt beides unterscheidbar. */
.lb-seg-other { stroke: #7c8495; stroke-dasharray: 3 3; }
/* Anderer Spielmodus: duenn und immer waagerecht. Der Ladder-Stand bleibt dabei stehen,
   die Linie ueberbrueckt die Pause nur sichtbar. */
.lb-seg-mode { stroke: rgba(148, 163, 184, 0.42); stroke-width: 1; }
.lb-seg-zero { stroke: rgba(255, 255, 255, 0.12); stroke-width: 1; stroke-dasharray: 2 4; vector-effect: non-scaling-stroke; }
.lb-end { stroke: rgba(8, 10, 15, 0.85); stroke-width: 1.5; vector-effect: non-scaling-stroke; }
.lb-end-up { fill: #53d794; }
.lb-end-down { fill: #f26773; }
.lb-end-flat { fill: #8e97a9; }
/* Leerzustand des Ranked-Verlaufs. Bis 03.09.2026 stand hier die Beschriftung
   "No ranked data"; sie las sich wie ein Fehler, obwohl der Spieler schlicht 30
   Kaempfe lang kein Ranked gespielt hat. Jetzt laeuft eine duenne graue Linie durch -
   dieselbe Hoehe, dieselbe Ruhe wie eine Kurve ohne Ausschlag (Eliass 03.09.2026).
   Die alte Klasse bleibt als Regel stehen, falls noch irgendwo ein Text erzeugt wird. */
.lb-timeline-empty {
  display: flex; align-items: center; justify-content: center; height: 82px;
  color: rgba(226, 233, 248, 0.32); font-size: 0.74rem; font-weight: 650;
}
.lb-timeline-flat line {
  stroke: rgba(226, 233, 248, 0.20);
  /* vector-effect, weil das SVG mit preserveAspectRatio="none" in die Breite gezogen
     wird - ohne das waere die Linie waagerecht gestaucht und wirkte dicker. */
  stroke-width: 1.5; vector-effect: non-scaling-stroke; stroke-linecap: round;
}

/* Zahlenblatt ueber der Kurve. Die Flaeche ist absichtlich fast deckend – die Kurve soll
   dahinter noch zu ahnen sein, aber nicht mehr mit den Zahlen um Aufmerksamkeit ringen. */
.lb-timeline-overlay {
  position: absolute; inset: 0; z-index: 2;
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 0.12rem;
  background: rgba(6, 8, 14, 0.88);
  backdrop-filter: blur(1.5px);
  opacity: 0; pointer-events: none;
  transition: opacity 0.24s ease;
}
/* :hover NUR fuer echte Zeigegeraete. Am Touchscreen bleibt der emulierte
   Hover-Zustand nach dem Tippen auf dem Element kleben - das Zahlenblatt liess sich
   deshalb nicht mehr wegtippen, obwohl der Klick-Umschalter (.is-pinned) korrekt
   umschaltete. Kurz, lang, wischend: die Zahlen blieben stehen und die Kurve
   dahinter verborgen (Eliass 03.09.2026). */
@media (hover: hover) {
  .lb-timeline-wrap:hover .lb-timeline-overlay { opacity: 1; }
}
.lb-timeline-wrap:focus-visible .lb-timeline-overlay,
.lb-timeline-wrap.is-pinned .lb-timeline-overlay { opacity: 1; }

/* Die drei Zeilen ziehen nacheinander von rechts herein und beim Verlassen nach links
   wieder hinaus. Zwei Keyframes statt einer Transition, weil Hin- und Rueckweg in
   VERSCHIEDENE Richtungen laufen - eine Transition kann nur denselben Weg zurueck.
   Der Wechsel des animation-name startet die jeweils andere Animation neu. */
/* Der Versatz steckt in einer Variablen, nicht in einer eigenen animation-delay-Regel:
   die Kurzschreibweise `animation:` im Hover-Zustand wuerde ein separates Delay wieder
   auf 0 zuruecksetzen (sie ist spezifischer). Als Variable ueberlebt er beide Zustaende. */
.lb-timeline-overlay > * { --ov-delay: 0s; animation: lbOvOut 0.2s var(--ov-delay) both; }
.lb-timeline-overlay > *:nth-child(2) { --ov-delay: 0.05s; }
.lb-timeline-overlay > *:nth-child(3) { --ov-delay: 0.1s; }
@media (hover: hover) {
  .lb-timeline-wrap:hover .lb-timeline-overlay > * { animation: lbOvIn 0.26s cubic-bezier(0.22, 1, 0.36, 1) var(--ov-delay) both; }
}
.lb-timeline-wrap:focus-visible .lb-timeline-overlay > *,
.lb-timeline-wrap.is-pinned .lb-timeline-overlay > * {
  animation: lbOvIn 0.26s cubic-bezier(0.22, 1, 0.36, 1) var(--ov-delay) both;
}

@keyframes lbOvIn {
  from { opacity: 0; transform: translateX(20px); }
  to { opacity: 1; transform: none; }
}
@keyframes lbOvOut {
  from { opacity: 1; transform: none; }
  to { opacity: 0; transform: translateX(-20px); }
}
.lb-ov-battles { color: rgba(226, 233, 248, 0.62); font-size: 0.7rem; font-weight: 650; }
.lb-ov-battles b { color: #fff; font-size: 0.86rem; font-weight: 850; }
.lb-ov-record {
  display: inline-flex; align-items: baseline; gap: 0.26rem;
  font-size: 1.02rem; font-weight: 850; font-variant-numeric: tabular-nums;
}
.lb-ov-record i { font-style: normal; }
.lb-ov-record em { font-style: normal; color: rgba(226, 233, 248, 0.3); font-weight: 700; }
.lb-ov-record small {
  margin-left: 0.3rem; color: rgba(226, 233, 248, 0.42); font-size: 0.62rem; font-weight: 650;
}
.lb-ov-winrate { color: rgba(226, 233, 248, 0.62); font-size: 0.7rem; font-weight: 650; }
.lb-ov-winrate b { color: #fff; font-size: 0.86rem; font-weight: 850; }
@media (prefers-reduced-motion: reduce) {
  .lb-timeline-overlay { transition: none; }
  .lb-timeline-overlay > * { animation: none; }
  .lb-timeline-wrap:not(:hover):not(.is-pinned) .lb-timeline-overlay > * { opacity: 0; }
}

.lb-clan-war-showcase {
  position: relative; overflow: visible; margin: 0.35rem 0 0.75rem; padding: 0.78rem 0.85rem 0.82rem;
  border: 1px solid rgba(112, 150, 255, 0.3); border-radius: 8px;
  background:
    radial-gradient(circle at 12% 14%, rgba(111, 167, 255, 0.14), transparent 28%),
    radial-gradient(circle at 88% 18%, rgba(242, 201, 76, 0.1), transparent 24%),
    linear-gradient(155deg, rgba(8, 12, 23, 0.94), rgba(13, 20, 39, 0.9) 58%, rgba(18, 15, 31, 0.92));
  box-shadow: inset 0 0 30px rgba(53, 93, 203, 0.08), 0 8px 22px rgba(1, 4, 12, 0.2);
}
.lb-clan-war-showcase::after {
  content: ""; position: absolute; inset: 0; pointer-events: none;
  background: linear-gradient(110deg, transparent 38%, rgba(113, 164, 255, 0.045) 50%, transparent 62%);
  background-size: 260% 100%; background-position: 130% 0;
  animation: clan-chart-sheen 4.8s 1.2s ease-in-out infinite;
}
.lb-clan-war-showcase-head {
  position: relative; z-index: 2; display: flex; align-items: center; justify-content: space-between;
  min-height: 40px; gap: 0.75rem; padding: 0 0.2rem 0.25rem;
}
.lb-clan-war-showcase-head span { display: flex; flex-direction: column; }
.lb-clan-war-showcase-head small {
  color: rgba(210, 222, 255, 0.5); font-size: 0.61rem; font-weight: 750;
  text-transform: uppercase; letter-spacing: 0;
}
.lb-clan-war-showcase-head strong { color: #f6f8ff; font-size: 0.98rem; letter-spacing: 0; }
.lb-clan-war-showcase-head img {
  width: 40px; height: 40px; object-fit: contain; filter: drop-shadow(0 0 7px rgba(255, 206, 83, 0.25));
}
.lb-clan-war-showcase-body {
  position: relative; z-index: 1; display: grid; grid-template-columns: minmax(0, 1fr) minmax(210px, 0.34fr);
  gap: 0.8rem; align-items: stretch;
}
.lb-clan-war-chart { display: block; width: 100%; min-height: 232px; overflow: visible; }
.lb-clan-war-series path {
  fill: none; stroke: var(--clan-war-color); stroke-width: 3; stroke-linecap: round; stroke-linejoin: round;
  filter: drop-shadow(0 0 5px color-mix(in srgb, var(--clan-war-color) 58%, transparent));
  stroke-dasharray: 1; stroke-dashoffset: 1;
  transition: opacity 0.16s ease, stroke-width 0.16s ease, filter 0.16s ease;
  animation: clan-chart-line-in 1.25s cubic-bezier(0.65, 0, 0.35, 1) forwards;
}
.lb-clan-war-series {
  transition: opacity 0.16s ease;
}
.lb-clan-war-showcase.is-focusing .lb-clan-war-series:not(.active) {
  opacity: 0.24;
}
.lb-clan-war-showcase.is-focusing .lb-clan-war-series.active path {
  stroke-width: 5;
  filter:
    drop-shadow(0 0 7px color-mix(in srgb, var(--clan-war-color) 92%, transparent))
    drop-shadow(0 0 18px color-mix(in srgb, var(--clan-war-color) 50%, transparent));
}
.lb-clan-war-point {
  outline: none; cursor: default;
}
.lb-clan-war-point circle {
  fill: #11192d; stroke: var(--clan-war-color); stroke-width: 2.2;
  opacity: 0; transform-box: fill-box; transform-origin: center;
  transition: r 0.14s ease, filter 0.14s ease;
  animation: clan-chart-point-in 0.32s var(--point-delay) ease-out forwards;
}
.lb-clan-war-point:hover circle,
.lb-clan-war-point:focus circle {
  r: 6.7px;
  filter: drop-shadow(0 0 5px var(--clan-war-color));
}
.lb-clan-war-axis text {
  fill: rgba(211, 221, 247, 0.42); font-size: 10px; font-weight: 700;
  text-anchor: middle; font-variant-numeric: tabular-nums;
}
.lb-clan-war-legend {
  display: grid; gap: 0.35rem; align-content: center; min-width: 0;
}
.lb-clan-war-legend-item {
  display: grid; grid-template-columns: 1.1rem 28px minmax(0, 1fr); align-items: center; gap: 0.42rem;
  min-height: 38px; padding: 0.3rem 0.42rem; border: 1px solid color-mix(in srgb, var(--clan-war-color) 30%, transparent);
  border-radius: 7px; background: linear-gradient(90deg, color-mix(in srgb, var(--clan-war-color) 13%, transparent), rgba(255, 255, 255, 0.035));
  color: #f3f6ff; text-decoration: none;
}
.lb-clan-war-legend-item:hover,
.lb-clan-war-legend-item.active {
  color: #fff; text-decoration: none; border-color: color-mix(in srgb, var(--clan-war-color) 58%, transparent);
  box-shadow: 0 0 0 1px color-mix(in srgb, var(--clan-war-color) 22%, transparent), 0 8px 18px rgba(0, 0, 0, 0.18);
}
.lb-clan-war-legend-item i {
  width: 1.1rem; height: 1.1rem; display: inline-grid; place-items: center;
  border-radius: 5px; background: var(--clan-war-color); color: #07101f;
  font-size: 0.67rem; font-weight: 950; font-style: normal;
}
.lb-clan-war-legend-item .clan-badge { width: 28px; height: 28px; margin: 0; }
.lb-clan-war-legend-item span { min-width: 0; display: flex; flex-direction: column; line-height: 1.12; }
.lb-clan-war-legend-item b { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 0.78rem; }
.lb-clan-war-legend-item small { color: rgba(226, 233, 248, 0.56); font-size: 0.67rem; font-weight: 800; font-variant-numeric: tabular-nums; }
.lb-clan-war-legend-item em { font-style: normal; }
.lb-clan-war-legend-item em.up { color: #68e0a5; }
.lb-clan-war-legend-item em.down { color: #ff7f92; }
.lb-clan-war-legend-item em.flat { color: rgba(226, 233, 248, 0.56); }
.lb-clan-war-loading {
  min-height: 210px; display: flex; align-items: center; justify-content: center; gap: 7px;
}

/* Schmal untereinander statt nebeneinander: die Top-5-Liste hat eine Mindestbreite von
   210px, auf 375px blieben dem Verlauf daneben genau 83px - eine Linie, an der nichts
   mehr abzulesen war (Eliass 15.08.2026). Ueber der Liste nutzt er die volle Breite.
   Die Hoehe geht dafuer zurueck: 232px waren fuer eine halbe Spalte gedacht, quer ueber
   den Bildschirm reichen 180px fuer denselben Verlauf. */
@media (max-width: 640px) {
  .lb-clan-war-showcase-body { grid-template-columns: minmax(0, 1fr); }
  .lb-clan-war-chart { min-height: 180px; }
  .lb-clan-war-legend { align-content: start; }
}
.lb-clan-war-loading span {
  width: 8px; height: 58px; border-radius: 999px; background: #6fa7ff;
  animation: lbClanWarPulse 1.05s ease-in-out infinite;
}
.lb-clan-war-loading span:nth-child(2) { background: #f2c94c; animation-delay: 0.12s; }
.lb-clan-war-loading span:nth-child(3) { background: #68e0a5; animation-delay: 0.24s; }
.lb-clan-war-loading span:nth-child(4) { background: #f07da1; animation-delay: 0.36s; }
@keyframes lbClanWarPulse {
  0%, 100% { transform: scaleY(0.42); opacity: 0.45; }
  50% { transform: scaleY(1); opacity: 1; }
}

@media (max-width: 820px) {
  .lb-deck { grid-template-columns: repeat(4, 52px); }
  .lb-summary { margin-left: 0; width: 100%; }
}
@media (max-width: 560px) {
  .lb-search { max-width: none; }
  .lb-location-field, .lb-location-button { width: 100%; }
  .lb-pager { gap: 0.4rem; }

  /* ---------- Werkzeugleiste: eine Zeile ueber der Suche ----------
     Vorher vier gestapelte Reihen (197px): Bereichswahl, Suche, Filter und die
     Legende standen jeweils allein, weil `.deck-sort-control { width: 100% }` und die
     Suche mit `flex: 1` jede fuer sich eine volle Zeile belegten. Jetzt behalten
     Bereichswahl, Filter und Legende ihre Inhaltsbreite und teilen sich die erste
     Zeile, die Suche liegt darunter ueber die volle Breite. */
  .lb-toolbar > .deck-sort-control { flex: none; width: auto; }
  .lb-toolbar > .deck-sort-control button { flex: none; }
  /* Reihenfolge in der ersten Zeile: Bereichswahl links, dann der Platz fuer die
     Landesauswahl (nur im lokalen Modus sichtbar), rechts Filter und Legende. Der
     Filter stand vorher direkt neben der Bereichswahl - die Landesauswahl fand dann
     keinen Platz mehr und schob sich in eine eigene Zeile. So teilen sich beide
     Zustaende dieselbe Zeile (Eliass 15.08.2026). */
  #lb-ranked-scope { order: 1; }
  #lb-ranked-local { order: 2; flex: 1 1 0; min-width: 0; width: auto; }
  #lb-ranked-local .lb-location-button { width: 100%; min-width: 0; }
  .lb-toolbar > .deck-sort-control:not([role="group"]) { order: 3; margin-left: auto; }
  .lb-legend-btn { order: 4; }
  .lb-search { order: 5; flex: 1 0 100%; }
  .lb-location-field { order: 5; flex: 1 0 100%; }
  .meta-filter-chip, .lb-summary { order: 6; }
}

/* ---------- Ranglistenzeile schmal ----------
   Ausgangslage: 405px je Zeile. Der Name wurde vom Elixierschnitt ueberdeckt, das Deck
   stand als 4x2 da, die Turmtruppe fiel mitsamt ihrem Trennstrich auf eine eigene
   Zeile darunter. Aufbau jetzt wie bei den Meta-Decks und den gespeicherten Decks:
   Kopfzeile zweizeilig, Deck als 8x1 mit Turmtruppe rechts daneben.
   `display: contents` loest `.lb-who` und `.lb-head-actions` als Kaesten auf, damit
   Name, Clan, Aktionen und Medaille direkt im Raster der Kopfzeile liegen. */
@media (max-width: 560px) {
  #lb-ranked-list .lb-row-head {
    display: grid; grid-template-columns: auto minmax(0, 1fr) auto auto;
    align-items: center; gap: 2px 8px;
  }
  #lb-ranked-list :is(.lb-who, .lb-head-actions, .lb-actions-slot) { display: contents; }
  /* 3.3rem Mindestbreite fuer "#1" hiess 53px Leerraum vor dem Namen. Der Rang steht
     in der ersten Zeile neben dem Namen und nicht ueber beide Zeilen gespannt - sonst
     sitzt er auf halber Hoehe zwischen Name und Clan und liest sich zu keinem von
     beiden. */
  #lb-ranked-list .lb-rank { grid-area: 1 / 1; min-width: 0; }
  #lb-ranked-list .lb-player { grid-area: 1 / 2; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
  /* Elixierschnitt links neben die Medaille in die erste Zeile (Eliass 15.08.2026).
     `justify-self: end` ist dabei entscheidend und nicht kosmetisch: Rasterkinder
     dehnen sich standardmaessig auf die Spaltenbreite: die Medaille wurde dadurch auf
     die Breite der darunter liegenden Knopfleiste aufgezogen und sah aus wie ein zu
     breiter Kasten. */
  #lb-ranked-list .lb-actions-slot > .elixir { grid-area: 1 / 3; justify-self: end; }
  #lb-ranked-list .lb-elo { grid-area: 1 / 4; justify-self: end; }
  #lb-ranked-list .lb-clan { grid-area: 2 / 2; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
  /* QR und Save ueber beide rechten Spalten, buendig am rechten Rand. */
  #lb-ranked-list .lb-deck-actions { grid-area: 2 / 3 / 3 / 5; justify-self: end; }
  /* Der Clan ist eine Zusatzangabe, kein zweiter Name - kleiner und blasser, damit der
     Blick am Spielernamen haengen bleibt (Eliass 15.08.2026). */
  #lb-ranked-list .lb-clan { font-size: 0.74rem; color: rgba(226, 233, 248, 0.5); }
  #lb-ranked-list .lb-clan .clan-badge { width: 15px; height: 15px; }

  /* Acht Karten in einer Reihe, die Turmtruppe rechts daneben. Beide Bloecke sind
     flexibel im Verhaeltnis 8:1, damit die Turmtruppe genau eine Kartenbreite
     einnimmt - fest auf 52px waere sie fast doppelt so gross wie die Karten daneben. */
  #lb-ranked-list .lb-deck {
    flex: 8 1 0; min-width: 0;
    grid-template-columns: repeat(8, minmax(0, 1fr)); gap: 2px;
    /* Die 77px Mindesthoehe stammen von 52px breiten Karten und halten die Zeile
       waehrend des Nachladens auf ihrer Endhoehe. Bei 29px breiten Karten sind die
       Bilder nur noch 43px hoch - die Vorgabe liess 34px Leerraum unter dem Deck
       stehen. Die Platzhalter-Kacheln bringen ihre eigene Hoehe mit, es springt
       trotzdem nichts. */
    min-height: 0;
  }
  #lb-ranked-list .lb-deck :is(.card, .card-img, .card-img img) { width: 100%; }
  /* Die Platzhalter halten dieselben Masse wie die fertigen Karten, sonst ruckt die
     ganze Liste beim Nachladen der Decks. Fest 52px waeren hier acht mal zu breit. */
  #lb-ranked-list .lb-card-skeleton { width: 100%; height: 43px; }
  #lb-ranked-list .meta-deck-tower { flex: 1 1 0; min-width: 0; margin-left: 0; padding-left: 0.7rem; }
  #lb-ranked-list .meta-deck-tower :is(.card, .card-img, .card-img img) { width: 100%; }
  /* Der Statistikblock nimmt die Zeile darunter. */
  #lb-ranked-list .lb-record { flex: 1 0 100%; margin: 0.5rem 0 0; text-align: left; }
}

/* Event boards: compact 100-player pages, not a full-width table. */
.event-list {
  display: flex; flex-direction: column; gap: 0.38rem;
}
/* Aufbau wie die Merge-Tactics-Rangliste (`.mt-row`): eine ruhige, fuer ALLE Zeilen
   gleiche Flaeche. Frueher wanderten hier zwei farbige Verlaeufe pro Zeile ueber
   `--event-band` (index % 10) durchs Bild - das erzeugte ein Farbmuster ueber die Liste,
   das nichts bedeutete und nur nach Dekoration aussah. Die Podestplaetze faerben sich
   weiterhin, dort steht die Farbe fuer etwas. */
.event-row.lb-row {
  display: grid; grid-template-columns: 4.8rem minmax(140px, 1.4fr) minmax(150px, 1fr) auto;
  align-items: center; gap: 0.75rem;
  min-height: 46px; padding: 0.48rem 0.72rem;
  background:
    linear-gradient(90deg, rgba(83, 203, 255, 0.08), transparent 34%, rgba(255, 255, 255, 0.025) 66%, transparent),
    linear-gradient(145deg, rgba(28, 40, 68, 0.9), rgba(14, 18, 29, 0.97));
  transition: opacity 0.42s cubic-bezier(0.22, 1, 0.36, 1), border-color 0.18s ease,
              filter 0.18s ease, transform 0.18s ease;
}
/* Derselbe Hover wie in der Merge-Tactics-Rangliste (`.mt-row:hover`): eine Spur heller
   und zwei Pixel zur Seite. Kein Anheben und kein Leuchten - die Zeile ruckt nicht aus
   der Liste heraus, sie reagiert nur. */
.event-row.lb-row:hover {
  border-color: rgba(126, 162, 255, 0.46);
  filter: brightness(1.08);
  transform: translateX(2px);
}
.event-row.lb-row::before { display: none; }
.lb-row.event-row.medal-1 {
  background:
    radial-gradient(circle at 12% 0%, rgba(255, 218, 128, 0.2), transparent 34%),
    radial-gradient(circle at 86% 100%, rgba(88, 124, 255, 0.12), transparent 34%),
    linear-gradient(145deg, rgba(58, 43, 20, 0.96), rgba(22, 24, 31, 0.98) 55%, rgba(50, 35, 16, 0.92)) padding-box,
    conic-gradient(from var(--profile-gold-angle), var(--medal-dark), var(--medal-mid), var(--medal-hi), var(--medal-mid), var(--medal-dark)) border-box;
}
.lb-row.event-row.medal-2 {
  background:
    radial-gradient(circle at 16% 0%, rgba(230, 238, 248, 0.18), transparent 34%),
    radial-gradient(circle at 82% 100%, rgba(126, 162, 255, 0.1), transparent 34%),
    linear-gradient(145deg, rgba(50, 58, 70, 0.96), rgba(20, 23, 31, 0.98) 56%, rgba(37, 43, 54, 0.92)) padding-box,
    conic-gradient(from var(--profile-gold-angle), var(--medal-dark), var(--medal-mid), var(--medal-hi), var(--medal-mid), var(--medal-dark)) border-box;
}
.lb-row.event-row.medal-3 {
  background:
    radial-gradient(circle at 16% 0%, rgba(238, 158, 92, 0.18), transparent 34%),
    radial-gradient(circle at 82% 100%, rgba(189, 113, 240, 0.1), transparent 34%),
    linear-gradient(145deg, rgba(55, 34, 22, 0.96), rgba(22, 23, 31, 0.98) 56%, rgba(48, 27, 20, 0.92)) padding-box,
    conic-gradient(from var(--profile-gold-angle), var(--medal-dark), var(--medal-mid), var(--medal-hi), var(--medal-mid), var(--medal-dark)) border-box;
}
.event-rank {
  color: rgba(226, 233, 248, 0.66); font-weight: 900; font-variant-numeric: tabular-nums;
}
.event-player {
  color: #fff; font-weight: 850; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.event-player:hover, .event-clan:hover { color: #9db4ff; text-decoration: none; }
.event-clan {
  display: inline-flex; align-items: center; gap: 0.3rem; min-width: 0;
  color: rgba(226, 233, 248, 0.62); font-size: 0.82rem; font-weight: 650;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.event-clan.muted { color: rgba(226, 233, 248, 0.34); }
.event-clan .clan-badge { width: 20px; height: 20px; margin: 0; flex: none; }
.event-result {
  display: inline-flex; align-items: center; justify-content: flex-end; gap: 5px;
}
/* Fortschritts-Einheit: Bild plus Zahl, ohne Rahmen – gleiche Bauart wie `.mt-score`. */
.event-score {
  display: inline-flex; align-items: center; justify-content: flex-end; gap: 0.3rem;
  min-width: 94px;
  color: #ffe9a6; font-weight: 950; font-variant-numeric: tabular-nums;
}
.event-score img { width: 21px; height: 21px; object-fit: contain; }
.event-wins {
  min-width: 58px; height: 24px; display: inline-flex; align-items: center; justify-content: center; gap: 4px;
  border: 1px solid rgba(150, 163, 186, 0.38); border-radius: 7px;
  background:
    linear-gradient(180deg, rgba(176, 185, 202, 0.26), rgba(75, 85, 104, 0.22) 48%, rgba(28, 35, 49, 0.46)),
    rgba(18, 23, 34, 0.82);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.18), inset 0 -8px 14px rgba(0, 0, 0, 0.18);
  color: #f4f7ff; font-size: 0.8rem; font-weight: 900; font-variant-numeric: tabular-nums;
}
.event-wins img {
  width: 17px; height: 17px; object-fit: contain; filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.35));
}
.event-losses {
  display: inline-grid; grid-template-columns: repeat(5, 23px); gap: 5px;
}
.event-losses i {
  position: relative;
  width: 23px; height: 24px; display: block;
  border: 1px solid rgba(129, 145, 169, 0.42); border-radius: 7px;
  background:
    linear-gradient(180deg, rgba(151, 163, 183, 0.28), rgba(66, 76, 96, 0.22) 45%, rgba(18, 24, 36, 0.5)),
    rgba(15, 20, 31, 0.88);
  box-shadow:
    inset 0 1px 0 rgba(255, 255, 255, 0.16),
    inset 0 -8px 14px rgba(0, 0, 0, 0.2),
    0 1px 2px rgba(0, 0, 0, 0.22);
}
.event-losses i::before,
.event-losses i::after {
  content: "";
  position: absolute; left: 50%; top: 50%;
  width: 15px; height: 5px; border-radius: 999px;
  background: linear-gradient(180deg, #ff78a0, #f33272);
  box-shadow: 0 1px 0 rgba(255, 255, 255, 0.26) inset, 0 0 6px rgba(243, 50, 114, 0.38);
  transform-origin: center;
}
.event-losses i::before { transform: translate(-50%, -50%) rotate(45deg); }
.event-losses i::after { transform: translate(-50%, -50%) rotate(-45deg); }
.event-row.medal .event-rank {
  background-image: linear-gradient(100deg, var(--medal-mid) 6%, var(--medal-hi) 28%, #fff 44%, var(--medal-hi) 60%, var(--medal-mid) 88%);
  background-size: 260% 100%;
  -webkit-background-clip: text; background-clip: text;
  color: transparent; filter: drop-shadow(0 1px 6px var(--medal-glow));
}
.event-pager { margin: 0.55rem 0; }
/* ---------- Event-Zeilen: eine Zeile, egal wie schmal ----------
   Vorher stapelten sich Rang/Name, Clan und Punktestand auf drei Reihen (102px je
   Eintrag), und der Wert stand links unter dem Namen statt bei den anderen Werten.
   Was eine Ranglistenzeile beantworten muss, ist "wer steht wo und mit welchem Stand" -
   das sind Rang, Name und Wert; der Clan ist Beiwerk und faellt als Erstes weg
   (Eliass 15.08.2026). Der Wert steht wie ueberall sonst rechts aussen. */
@media (max-width: 720px) {
  .event-row.lb-row {
    grid-template-columns: auto minmax(0, 1.6fr) minmax(0, 1fr) auto;
    align-items: center; gap: 0 0.55rem; min-height: 40px; padding: 0.4rem 0.6rem;
  }
  /* Die Ergebnis-Spalte hatte sich ueber die ganze Zeile gelegt. */
  .event-result { grid-column: auto; justify-content: flex-end; }
  .event-score { min-width: 0; }
}
@media (max-width: 560px) {
  /* Zu dritt wird es eng: der Clan geht, Name und Wert bleiben. Dieselbe Regel gilt fuer
     die Merge-Tactics-Rangliste - die steht aber weiter unten in der Datei und braucht
     ihren eigenen Block, weil bei gleicher Spezifitaet die spaetere Regel gewinnt. */
  .event-row.lb-row { grid-template-columns: auto minmax(0, 1fr) auto; }
  .event-clan { display: none; }
  .event-rank { font-size: 0.86rem; }
  .event-score { font-size: 0.9rem; }
  .event-score img { width: 18px; height: 18px; }
}

/* ---------- Merge Tactics ---------- */
.mt-hero {
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 0.15rem;
  min-height: 84px; padding: 0.7rem 0 0.65rem;
  border-bottom: 1px solid rgba(255, 255, 255, 0.14);
}
.mt-title-lockup { display: flex; align-items: center; justify-content: center; min-width: 0; }
.mt-logo {
  width: clamp(190px, 28vw, 330px); height: 70px; object-fit: contain; object-position: center;
  filter: drop-shadow(0 8px 14px rgba(0, 0, 0, 0.5));
}
.mt-hero-summary {
  max-width: 72ch; margin: 0; color: var(--panel-muted);
  font-size: 0.8rem; line-height: 1.45; text-align: center;
}
.mt-eyebrow {
  color: #9db4ff; font-size: 0.72rem; font-weight: 900; text-transform: uppercase; letter-spacing: 0.06em;
}
.mt-hero-actions, .mt-tools { display: flex; align-items: center; gap: 0.45rem; flex-wrap: wrap; }
.mt-primary-btn, .mt-secondary-btn {
  height: 36px; border: 1px solid rgba(255, 255, 255, 0.16); border-radius: 8px;
  padding: 0 0.78rem; cursor: pointer; font-weight: 850;
  color: #f8fbff; background: rgba(17, 23, 38, 0.86);
}
.mt-primary-btn {
  background: linear-gradient(180deg, #6d8bff, #315bd4);
  border-color: rgba(170, 190, 255, 0.58);
  box-shadow: 0 10px 24px rgba(49, 91, 212, 0.28);
}
.mt-secondary-btn:hover { border-color: rgba(157, 180, 255, 0.58); color: #fff; }
.mt-secondary-btn.active {
  color: #07111f; background: linear-gradient(180deg, #f7d77a, #e8a82d); border-color: rgba(255, 229, 147, 0.74);
}
.mt-season {
  display: flex; justify-content: space-between; gap: 1rem; align-items: stretch;
  margin: 1rem 0; padding: 0.85rem 1rem; border: 1px solid rgba(255, 255, 255, 0.14); border-radius: 10px;
  background: linear-gradient(145deg, rgba(21, 31, 52, 0.9), rgba(11, 15, 24, 0.92));
  color: rgba(235, 241, 255, 0.84);
}
.mt-season-main { display: grid; gap: 0.08rem; }
.mt-season-main span { color: #90e8ff; font-weight: 900; font-size: 0.78rem; text-transform: uppercase; }
.mt-season-main b { color: #fff; font-size: 1rem; }
.mt-season-note {
  max-width: 330px; color: rgba(226, 233, 248, 0.62); font-size: 0.82rem; text-align: right;
}
.mt-leaderboard-stage {
  position: relative; overflow: hidden; display: flex; align-items: flex-end; min-height: 360px;
  margin: -1rem -1rem 1rem; padding: 2.4rem 1rem 0; box-sizing: border-box;
  background:
    radial-gradient(ellipse at 50% 96%, rgba(255, 190, 66, 0.34), transparent 36%),
    radial-gradient(ellipse at 50% 8%, rgba(119, 218, 255, 0.18), transparent 34%),
    linear-gradient(180deg, rgba(3, 7, 16, 0.32), rgba(3, 7, 16, 0.9) 76%),
    linear-gradient(90deg, rgba(5, 8, 16, 0.96), rgba(5, 8, 16, 0.48) 45%, rgba(5, 8, 16, 0.93)),
    url("assets/merge-tactics/branding/season-banner-crop.jpg") center / cover no-repeat;
  border-radius: 10px 10px 0 0;
  isolation: isolate;
}
.mt-leaderboard-stage::before,
.mt-leaderboard-stage::after {
  content: ""; position: absolute; top: -30%; bottom: 16%; width: 30%; pointer-events: none;
  background: linear-gradient(180deg, rgba(255, 239, 183, 0.54), rgba(255, 226, 137, 0.16) 48%, transparent);
  filter: blur(5px);
  opacity: 0;
  mix-blend-mode: screen;
  animation: mtSpotlightSweep 900ms cubic-bezier(0.2, 0.8, 0.2, 1) 140ms forwards;
}
.mt-leaderboard-stage::before { --mt-beam-skew: -17deg; left: 12%; transform: skewX(var(--mt-beam-skew)) translateY(-22px); }
.mt-leaderboard-stage::after { --mt-beam-skew: 17deg; right: 12%; transform: skewX(var(--mt-beam-skew)) translateY(-22px); animation-delay: 260ms; }
.mt-season-showcase { position: absolute; inset: 0; pointer-events: none; }
.mt-top3 {
  position: relative; z-index: 1; display: grid; grid-template-columns: repeat(3, minmax(0, 220px));
  justify-content: center; align-items: end; gap: 0.42rem; width: 100%; max-width: 790px; margin: 0 auto;
}
.mt-top3::before {
  display: none;
}
.mt-podium {
  position: relative; overflow: visible; display: grid; grid-template-rows: 1fr auto;
  min-height: 236px; padding: 0 0.55rem;
  border: 0; border-radius: 0;
  text-align: center;
  background: transparent;
  box-shadow: none;
  transform: translateY(14px);
  opacity: 0;
  animation: mtPodiumSettle 620ms cubic-bezier(0.18, 0.9, 0.22, 1) forwards;
}
.mt-podium::before,
.mt-podium::after {
  display: none;
}
.mt-podium::before {
  left: 18%; right: 18%; bottom: 70px; height: 108px; z-index: 0;
  background:
    radial-gradient(ellipse at 50% 0%, rgba(255, 247, 203, 0.16), transparent 48%),
    linear-gradient(145deg, rgba(43, 52, 73, 0.88), rgba(11, 16, 28, 0.96));
  clip-path: polygon(16% 0, 84% 0, 100% 100%, 0 100%);
  border: 1px solid rgba(180, 204, 255, 0.16);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.16), 0 20px 36px rgba(0, 0, 0, 0.36);
  transform-origin: 50% 100%;
  transform: scaleY(0);
  animation: mtPodiumRise 720ms cubic-bezier(0.16, 0.9, 0.24, 1) forwards;
}
.mt-podium::after {
  left: 22%; right: 22%; bottom: 76px; height: 5px; z-index: 2;
  background: linear-gradient(90deg, transparent, rgba(255, 236, 166, 0.82), transparent);
  border-radius: 999px;
  opacity: 0;
  animation: mtCrestFlash 760ms ease-out 420ms forwards;
}
.mt-podium-2 { min-height: 214px; animation-delay: 120ms; }
.mt-podium-1 {
  min-height: 278px; order: 2; animation-delay: 0ms;
}
.mt-podium-2 { order: 1; }
.mt-podium-3 { min-height: 198px; order: 3; animation-delay: 220ms; }
.mt-podium-2::before { animation-delay: 160ms; }
.mt-podium-1::before { animation-delay: 40ms; }
.mt-podium-3::before { animation-delay: 260ms; }
.mt-podium-1::before {
  bottom: 82px; height: 150px;
  background:
    radial-gradient(ellipse at 50% 0%, rgba(255, 252, 212, 0.32), transparent 48%),
    linear-gradient(145deg, rgba(231, 178, 64, 0.98), rgba(121, 74, 18, 0.96) 54%, rgba(44, 28, 13, 0.98));
  border-color: rgba(255, 232, 144, 0.5);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.24), 0 24px 46px rgba(0, 0, 0, 0.42), 0 0 34px rgba(232, 168, 45, 0.22);
}
.mt-podium-2::before {
  bottom: 74px; height: 116px;
  background:
    radial-gradient(ellipse at 50% 0%, rgba(219, 247, 255, 0.24), transparent 48%),
    linear-gradient(145deg, rgba(116, 148, 170, 0.96), rgba(44, 59, 77, 0.98));
  border-color: rgba(167, 221, 255, 0.28);
}
.mt-podium-3::before {
  bottom: 70px; height: 96px;
  background:
    radial-gradient(ellipse at 50% 0%, rgba(255, 210, 161, 0.22), transparent 48%),
    linear-gradient(145deg, rgba(188, 102, 56, 0.95), rgba(82, 45, 32, 0.98));
  border-color: rgba(255, 182, 117, 0.24);
}
.mt-spotlight {
  position: absolute; left: 18%; right: 18%; top: -56px; bottom: 88px; z-index: -1; pointer-events: none;
  background: linear-gradient(180deg, rgba(255, 244, 197, 0.44), rgba(255, 218, 115, 0.1) 52%, transparent);
  clip-path: polygon(42% 0, 58% 0, 100% 100%, 0 100%);
  filter: blur(2px);
  opacity: 0;
  animation: mtSpotlightSweep 760ms cubic-bezier(0.2, 0.8, 0.2, 1) 260ms forwards;
}
.mt-podium-1 .mt-spotlight {
  left: 4%; right: 4%; top: -74px; bottom: 102px;
  background: linear-gradient(180deg, rgba(255, 249, 209, 0.58), rgba(255, 218, 115, 0.16) 52%, transparent);
}
.mt-podium-player-card {
  position: relative; z-index: 3; align-self: end; display: grid;
  grid-template-columns: auto minmax(0, 1fr); align-items: center; gap: 0.38rem 0.45rem;
  min-width: 0; min-height: 102px; margin: 0 auto 0.82rem; width: min(100%, 190px); padding: 0.72rem;
  border: 1px solid rgba(255, 255, 255, 0.16); border-radius: 8px;
  background:
    radial-gradient(circle at 50% 0%, rgba(255, 226, 143, 0.16), transparent 48%),
    linear-gradient(180deg, rgba(16, 24, 39, 0.94), rgba(6, 10, 18, 0.96));
  box-shadow: 0 16px 30px rgba(0, 0, 0, 0.34), inset 0 1px 0 rgba(255, 255, 255, 0.1);
  transform: translateY(10px);
  opacity: 0;
  animation: mtWinnerCardIn 560ms cubic-bezier(0.18, 0.9, 0.22, 1) 260ms forwards;
}
.mt-podium-1 .mt-podium-player-card {
  width: min(100%, 212px);
  border-color: rgba(255, 226, 137, 0.34);
  box-shadow: 0 18px 38px rgba(0, 0, 0, 0.38), 0 0 28px rgba(232, 168, 45, 0.16), inset 0 1px 0 rgba(255, 255, 255, 0.14);
}
.mt-podium-rank {
  min-width: 29px; height: 21px; padding: 0 0.28rem; display: inline-grid; place-items: center;
  color: #17110a; font-weight: 950; font-size: 0.66rem;
  background: linear-gradient(180deg, #fff2bd, #e8a82d 58%, #b8791f);
  border: 1px solid rgba(255, 244, 193, 0.64); border-radius: 999px;
  box-shadow: 0 4px 10px rgba(0, 0, 0, 0.28);
}
.mt-podium-2 .mt-podium-rank {
  color: #09121e; background: linear-gradient(180deg, #eef8ff, #9ec8df 58%, #5c7891);
  border-color: rgba(229, 248, 255, 0.58);
}
.mt-podium-3 .mt-podium-rank {
  color: #180d08; background: linear-gradient(180deg, #ffd3aa, #d68247 58%, #8c4b2d);
  border-color: rgba(255, 214, 178, 0.5);
}
.mt-podium-player {
  position: relative; z-index: 3; align-self: end; display: grid; justify-items: center;
  min-width: 0; padding: 0 0.35rem 0.62rem;
}
.mt-podium-player span {
  color: rgba(229, 238, 255, 0.58); font-size: 0.66rem; font-weight: 900;
  text-transform: uppercase; letter-spacing: 0.08em;
}
.mt-podium-name {
  min-width: 0; max-width: 100%; color: #fff; font-size: 0.96rem; font-weight: 850; line-height: 1.15;
  text-align: left;
  text-decoration: none; text-shadow: 0 2px 8px rgba(0, 0, 0, 0.62);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.mt-podium-name:hover { color: #fff1b3; text-decoration: underline; text-underline-offset: 0.18em; }
.mt-podium-1 .mt-podium-name { font-size: 1.08rem; }
.mt-podium-score {
  grid-column: 1 / -1; justify-self: center;
  display: grid; grid-template-columns: 18px auto; align-items: center; justify-content: center; gap: 0 0.28rem;
  min-height: 35px; padding: 0.25rem 0.62rem;
  color: #ffe9a6; font-variant-numeric: tabular-nums;
  background: linear-gradient(180deg, rgba(255, 210, 92, 0.13), rgba(255, 197, 61, 0.05));
  border: 1px solid rgba(255, 215, 118, 0.2); border-radius: 7px;
}
.mt-podium-score img { grid-row: 1 / 3; width: 18px; height: 18px; object-fit: contain; filter: drop-shadow(0 2px 3px rgba(0, 0, 0, 0.38)); }
.mt-podium-score b { color: #fff0b7; font-size: 0.96rem; line-height: 1; }
.mt-podium-score small { color: rgba(255, 235, 169, 0.58); font-size: 0.56rem; font-weight: 850; line-height: 1; text-align: left; text-transform: uppercase; }
.mt-podium-1 .mt-podium-score b { font-size: 1.04rem; }
.mt-podium-step {
  position: relative; z-index: 2; height: 66px; margin: 0; display: grid; place-items: center;
  background:
    linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.1), transparent),
    linear-gradient(180deg, #4a5d74, #213044 56%, #101724);
  clip-path: polygon(9% 0, 91% 0, 100% 100%, 0 100%);
  border-top: 1px solid rgba(255, 255, 255, 0.2);
  box-shadow: inset 0 8px 18px rgba(255, 255, 255, 0.07), inset 0 -14px 22px rgba(0, 0, 0, 0.34);
  transform-origin: 50% 100%;
  transform: scaleY(0);
  animation: mtPodiumRise 720ms cubic-bezier(0.16, 0.9, 0.24, 1) forwards;
}
.mt-podium-2 .mt-podium-step { animation-delay: 120ms; }
.mt-podium-1 .mt-podium-step {
  height: 82px; animation-delay: 0ms;
  background:
    linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.18), transparent),
    linear-gradient(180deg, #ffe28b, #d3942c 52%, #6b4218);
}
.mt-podium-3 .mt-podium-step {
  height: 58px; animation-delay: 220ms;
  background:
    linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.12), transparent),
    linear-gradient(180deg, #f0a36a, #9a5637 52%, #4a2a22);
}
.mt-podium-step span {
  color: rgba(255, 255, 255, 0.84); font-size: 1.34rem; font-weight: 950;
  text-shadow: 0 2px 8px rgba(0, 0, 0, 0.48);
}
.mt-podium-1 .mt-podium-step span { color: rgba(42, 27, 10, 0.74); font-size: 1.58rem; }

@keyframes mtPodiumRise {
  0% { transform: scaleY(0); }
  70% { transform: scaleY(1.04); }
  100% { transform: scaleY(1); }
}
@keyframes mtPodiumSettle {
  0% { opacity: 0; transform: translateY(28px); }
  100% { opacity: 1; transform: translateY(0); }
}
@keyframes mtWinnerCardIn {
  0% { opacity: 0; transform: translateY(16px) scale(0.96); }
  100% { opacity: 1; transform: translateY(0) scale(1); }
}
@keyframes mtSpotlightSweep {
  0% { opacity: 0; transform: skewX(var(--mt-beam-skew, 0deg)) translateY(-30px) scaleX(0.7); }
  100% { opacity: 0.76; transform: skewX(var(--mt-beam-skew, 0deg)) translateY(0) scaleX(1); }
}
@keyframes mtCrestFlash {
  0% { opacity: 0; transform: scaleX(0.24); }
  48% { opacity: 1; }
  100% { opacity: 0.5; transform: scaleX(1); }
}
@media (prefers-reduced-motion: reduce) {
  .mt-leaderboard-stage::before,
  .mt-leaderboard-stage::after,
  .mt-podium,
  .mt-podium::before,
  .mt-podium::after,
  .mt-spotlight,
  .mt-podium-player-card,
  .mt-podium-step {
    animation: none;
    opacity: 1;
    transform: none;
  }
}
.mt-board, .mt-knowledge, .mt-tutorial, .mt-gallery-section {
  margin-top: 1rem; padding: 1rem; border: 1px solid rgba(255, 255, 255, 0.13); border-radius: 10px;
  background: rgba(8, 12, 20, 0.62);
}
.mt-board { overflow: hidden; }
.mt-board-head, .mt-section-head {
  display: flex; justify-content: space-between; align-items: flex-start; gap: 1rem; margin-bottom: 0.75rem;
}
.mt-board-head h3, .mt-section-head h3 { margin: 0; color: #fff; }
.mt-section-head p { margin: 0.22rem 0 0; color: rgba(226, 233, 248, 0.62); font-size: 0.84rem; max-width: 62ch; }
#mt-asset-search {
  width: 280px; max-width: 100%; height: 36px; min-width: 180px;
  background: rgba(10, 14, 23, 0.92); border-color: rgba(255, 255, 255, 0.14); color: #fff;
}
#mt-search { flex: 0 0 240px; width: 240px; max-width: 240px; }
.mt-leaderboard-tools {
  display: flex; align-items: center; justify-content: flex-start; gap: 0.5rem;
  margin: 0 0 0.7rem;
}
.mt-list { display: flex; flex-direction: column; gap: 0.38rem; }
.mt-list-head {
  display: grid; grid-template-columns: 4.5rem minmax(170px, 1fr) minmax(190px, 0.85fr) 7.5rem;
  align-items: center; gap: 0.65rem; padding: 0 0.65rem 0.18rem;
  color: rgba(226, 233, 248, 0.48); font-size: 0.68rem; font-weight: 900;
  text-transform: uppercase; letter-spacing: 0.07em;
}
.mt-list-head span:last-child { text-align: right; }
.mt-row {
  display: grid; grid-template-columns: 4.5rem minmax(170px, 1fr) minmax(190px, 0.85fr) 7.5rem;
  align-items: center; gap: 0.65rem; min-height: 48px; padding: 0.5rem 0.65rem;
  border: 1px solid rgba(255, 255, 255, 0.1); border-radius: 9px;
  background:
    linear-gradient(90deg, rgba(83, 203, 255, 0.08), transparent 34%, rgba(255, 255, 255, 0.025) 66%, transparent),
    linear-gradient(145deg, rgba(28, 40, 68, 0.9), rgba(14, 18, 29, 0.97));
}
.mt-row.medal-1 {
  border-color: rgba(255, 218, 128, 0.42);
  background:
    radial-gradient(circle at 12% 0%, rgba(255, 218, 128, 0.2), transparent 34%),
    linear-gradient(145deg, rgba(58, 43, 20, 0.96), rgba(22, 24, 31, 0.98) 55%, rgba(50, 35, 16, 0.92));
}
.mt-row.medal-2 {
  border-color: rgba(230, 238, 248, 0.34);
  background:
    radial-gradient(circle at 16% 0%, rgba(230, 238, 248, 0.18), transparent 34%),
    linear-gradient(145deg, rgba(50, 58, 70, 0.96), rgba(20, 23, 31, 0.98) 56%, rgba(37, 43, 54, 0.92));
}
.mt-row.medal-3 {
  border-color: rgba(238, 158, 92, 0.34);
  background:
    radial-gradient(circle at 16% 0%, rgba(238, 158, 92, 0.18), transparent 34%),
    linear-gradient(145deg, rgba(55, 34, 22, 0.96), rgba(22, 23, 31, 0.98) 56%, rgba(48, 27, 20, 0.92));
}
.mt-rank { color: rgba(226, 233, 248, 0.64); font-weight: 950; font-variant-numeric: tabular-nums; }
.mt-player { color: #fff; font-weight: 850; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.mt-clan {
  display: inline-flex; align-items: center; gap: 0.28rem; min-width: 0;
  color: rgba(226, 233, 248, 0.62); font-size: 0.82rem; font-weight: 650;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.mt-clan .clan-badge { width: 20px; height: 20px; margin: 0; flex: none; }
.mt-clan.muted { color: rgba(226, 233, 248, 0.34); }
.mt-score {
  display: inline-flex; align-items: center; justify-content: flex-end; gap: 0.3rem;
  color: #ffe9a6; font-weight: 950; font-variant-numeric: tabular-nums;
}
.mt-score img { width: 21px; height: 21px; object-fit: contain; }
.mt-trait-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0.7rem; }
.mt-trait-card, .mt-unit-card, .mt-note-card {
  border: 1px solid rgba(255, 255, 255, 0.11); border-radius: 9px; background: rgba(13, 18, 29, 0.78);
  color: rgba(226, 233, 248, 0.76);
}
.mt-trait-card { padding: 0.82rem; }
.mt-trait-head { display: grid; grid-template-columns: 32px minmax(0, 1fr) auto; align-items: center; gap: 0.6rem; }
.mt-trait-head img { width: 32px; height: 32px; object-fit: contain; filter: drop-shadow(0 2px 5px rgba(0, 0, 0, 0.38)); }
.mt-trait-head span { color: #fff; font-weight: 900; }
.mt-trait-head b {
  min-width: 26px; height: 24px; display: inline-flex; align-items: center; justify-content: center;
  border-radius: 999px; background: rgba(125, 211, 252, 0.14); color: #90e8ff; font-size: 0.76rem;
}
.mt-trait-card p, .mt-unit-card p, .mt-note-card p { margin: 0.45rem 0 0; font-size: 0.83rem; }
.mt-trait-card p strong, .mt-thresholds strong { color: rgba(255, 255, 255, 0.92); font-weight: 900; }
.mt-threshold-bonus { min-width: 0; font-style: normal; }
.mt-thresholds, .mt-trait-pills { display: flex; flex-wrap: wrap; gap: 0.35rem; margin-top: 0.55rem; }
.mt-thresholds span, .mt-trait-pills i {
  display: inline-flex; align-items: center; gap: 0.28rem; padding: 0.2rem 0.42rem; border-radius: 999px;
  background: rgba(255, 255, 255, 0.08); color: rgba(238, 243, 255, 0.8); font-size: 0.72rem; font-style: normal;
}
.mt-unit-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0.6rem; }
.mt-unit-card { display: grid; grid-template-columns: 58px minmax(0, 1fr); gap: 0.65rem; padding: 0.65rem; }
.mt-unit-art {
  width: 58px; height: 58px; display: grid; place-items: center; border-radius: 8px;
  background: linear-gradient(145deg, rgba(82, 111, 181, 0.8), rgba(26, 35, 59, 0.9));
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.18);
}
.mt-unit-art img { width: 100%; height: 100%; object-fit: contain; }
.mt-unit-art span { color: #fff; font-weight: 950; font-size: 1rem; }
.mt-unit-title { display: flex; align-items: baseline; justify-content: space-between; gap: 0.6rem; }
.mt-unit-title b { color: #fff; }
.mt-unit-title span { color: #ffe9a6; font-size: 0.76rem; font-weight: 900; white-space: nowrap; }
.mt-season-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0.7rem; }
.mt-note-card { padding: 0.85rem; }
.mt-note-card h4 { margin: 0 0 0.38rem; color: #fff; }
.mt-note-card b, .mt-note-card small { display: block; }
.mt-note-card ul { margin: 0.55rem 0 0; padding-left: 1rem; }
.mt-equipment-list { display: grid; gap: 0.48rem; }
.mt-equipment-list span { display: grid; gap: 0.05rem; }
.mt-tutorial-grid {
  display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 0.65rem;
}
.mt-tutorial-card {
  padding: 0.85rem; min-height: 102px; border: 1px solid rgba(255, 255, 255, 0.11); border-radius: 9px;
  background: linear-gradient(145deg, rgba(28, 40, 68, 0.86), rgba(13, 18, 29, 0.9));
}
.mt-tutorial-card span { color: #90e8ff; font-weight: 950; font-size: 0.78rem; text-transform: uppercase; }
.mt-tutorial-card p { margin: 0.42rem 0 0; color: rgba(226, 233, 248, 0.74); font-size: 0.84rem; }
.mt-assets-info { margin: 0; color: rgba(226, 233, 248, 0.64); font-size: 0.82rem; }
.mt-assets-info:empty { display: none; }
.mt-asset-grid {
  display: grid; grid-template-columns: repeat(auto-fill, minmax(144px, 1fr)); gap: 0.85rem;
}
.mt-asset-grid.is-sectioned { display: block; }
.mt-asset-group + .mt-asset-group { margin-top: 1.2rem; }
.mt-asset-group h4 {
  display: flex; align-items: center; gap: 0.45rem;
  margin: 0 0 0.7rem; color: rgba(247, 215, 122, 0.92); font-size: 0.82rem;
  font-weight: 950; text-transform: uppercase; letter-spacing: 0.08em;
}
.mt-asset-group h4 img { width: 28px; height: 28px; object-fit: contain; }
.mt-card-guide-grid {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(360px, 1fr)); gap: 0.8rem;
}
.mt-asset-card {
  min-width: 0; padding: 0.45rem 0.45rem 0.55rem; border: 0; border-radius: 8px;
  background: transparent;
}
.mt-asset-card.is-blog-card {
  display: grid; grid-template-columns: 106px minmax(0, 1fr); align-items: center; gap: 0.85rem;
  min-height: 168px; padding: 0.72rem;
  border: 1px solid rgba(255, 255, 255, 0.1); border-radius: 8px;
  background: linear-gradient(145deg, rgba(20, 29, 48, 0.84), rgba(9, 13, 22, 0.88));
}
.mt-asset-card.is-placeholder { opacity: 0.42; filter: grayscale(0.75); }
.mt-card-shell {
  position: relative; aspect-ratio: 460 / 567; display: grid; place-items: center; overflow: hidden;
  border-radius: 23px; background: #141923;
  box-shadow: 0 10px 22px rgba(0, 0, 0, 0.36);
}
.mt-asset-card.is-blog-card .mt-card-shell { width: 106px; }
.mt-asset-card.needs-frame .mt-card-shell {
  padding: 11px 10px 10px;
  border: 3px solid #171b21;
  background:
    linear-gradient(180deg, #535a62 0%, #1d2229 10%, #07090d 50%, #323840 90%, #111418 100%);
  box-shadow:
    inset 0 3px 3px rgba(255, 255, 255, 0.32),
    inset 0 -4px 5px rgba(0, 0, 0, 0.72),
    0 10px 22px rgba(0, 0, 0, 0.38);
}
.mt-asset-card.is-missing-card .mt-card-shell {
  width: 106px; padding: 0; border: 1px dashed rgba(247, 215, 122, 0.28); border-radius: 16px;
  background: linear-gradient(145deg, rgba(52, 41, 24, 0.82), rgba(13, 16, 24, 0.9));
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.08);
}
.mt-missing-card-art {
  display: grid; place-items: center; width: 100%; height: 100%;
  color: rgba(247, 215, 122, 0.78); font-size: 1.35rem; font-weight: 950;
}
.mt-asset-card.needs-frame .mt-card-shell::before {
  content: ""; position: absolute; inset: 7px; z-index: 2; pointer-events: none; border-radius: 17px;
  border: 0;
  box-shadow:
    inset 0 14px 20px rgba(255, 255, 255, 0.15),
    inset 0 -14px 20px rgba(0, 0, 0, 0.26);
}
.mt-asset-card.needs-frame .mt-card-shell::after {
  content: ""; position: absolute; inset: 12px; z-index: 3; pointer-events: none; border-radius: 12px;
  background:
    linear-gradient(135deg, rgba(255, 255, 255, 0.2), rgba(255, 255, 255, 0.035) 34%, transparent 52%);
  mix-blend-mode: screen;
}
.mt-card-shell img {
  position: relative; z-index: 1; width: 100%; height: 100%; object-fit: cover; display: block;
  border-radius: 13px;
}
/* Karten mit offiziellem Rahmen im Bild: das PNG ist exakt auf den sichtbaren
   Rahmen zugeschnitten (257x322), deshalb fuellt es die Shell randlos aus und
   die Badges koennen sich direkt an den echten Kartenkanten orientieren. */
.mt-asset-card.is-framed .mt-card-shell {
  aspect-ratio: 257 / 322; overflow: visible; padding: 0; border: 0; border-radius: 0;
  background: transparent; box-shadow: none;
}
/* Nur das Kartenmotiv selbst, nicht die Badge-Bilder in der Shell (Schloss,
   Trait) - die behalten ihre eigenen Groessen. */
.mt-asset-card.is-framed .mt-card-shell > img:not(.mt-card-lock) {
  width: 100%; height: 100%; object-fit: fill; border-radius: 0;
  filter: drop-shadow(0 7px 14px rgba(0, 0, 0, 0.42));
}
.mt-asset-card.is-framed .mt-card-shell::before,
.mt-asset-card.is-framed .mt-card-shell::after { display: none; }
/* Ecke des Bildrahmens ist gerundet (Radius ~8% der Breite): Elixier sitzt auf
   dem Scheitel dieser Rundung, das Trait mittig ueber der unteren Kante. */
.mt-asset-card.is-framed .mt-card-elixir-badge { top: calc(2.1% + 5px); left: calc(2.7% + 5px); }
.mt-asset-card.is-framed .mt-card-trait-badge { bottom: 6.7%; }
/* Karten ohne Bildrahmen auf dieselbe optische Hoehe ziehen (deren Shell hat
   noch Rand + Innenabstand, deshalb der etwas kleinere Wert). */
.mt-asset-card.needs-frame .mt-card-trait-badge { bottom: 6%; }
.mt-asset-card.is-ruler .mt-card-shell {
  aspect-ratio: 1181 / 1678; overflow: visible; border-radius: 0; background: transparent; box-shadow: none;
}
.mt-asset-card.is-ruler .mt-card-shell img {
  object-fit: contain; border-radius: 0; filter: drop-shadow(0 11px 18px rgba(0, 0, 0, 0.38));
}
.mt-ruler-ability {
  position: absolute; right: 0.22rem; bottom: 0.28rem; z-index: 4;
  width: 34px; height: 34px; display: grid; place-items: center; border-radius: 50%;
  background:
    radial-gradient(circle at 35% 28%, rgba(255, 255, 255, 0.32), transparent 24%),
    linear-gradient(145deg, #303746, #080b12 68%, #4f5662);
  box-shadow: inset 0 1px 2px rgba(255, 255, 255, 0.24), 0 5px 12px rgba(0, 0, 0, 0.42);
}
.mt-ruler-ability img {
  width: 70% !important; height: 70% !important; object-fit: contain !important;
  border-radius: 0 !important; filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.45)) !important;
}
.mt-asset-card.is-icon .mt-card-shell {
  aspect-ratio: 1; width: min(100%, 112px); margin: 0 auto;
  border-radius: 50%;
  background:
    radial-gradient(circle at 35% 30%, rgba(255, 255, 255, 0.34), transparent 20%),
    linear-gradient(145deg, #263756, #090d17 62%, #424957);
  box-shadow:
    inset 0 2px 3px rgba(255, 255, 255, 0.22),
    inset 0 -4px 8px rgba(0, 0, 0, 0.5),
    0 7px 18px rgba(0, 0, 0, 0.32);
}
.mt-asset-card.is-icon .mt-card-shell img {
  width: 62%; height: 62%; object-fit: contain;
  filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.45));
}
.mt-asset-caption { display: grid; gap: 0.08rem; margin-top: 0.42rem; min-width: 0; text-align: center; }
.mt-asset-card.is-blog-card .mt-asset-caption { margin-top: 0; text-align: left; align-self: center; }
.mt-asset-caption b {
  color: #fff; font-size: 0.82rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.mt-asset-card.is-blog-card .mt-asset-caption b { font-size: 0.98rem; }
.mt-card-meta { display: flex; align-items: center; flex-wrap: wrap; gap: 0.36rem; margin: 0.24rem 0 0.42rem; }
.mt-card-cost, .mt-card-trait {
  display: inline-flex; align-items: center; gap: 0.24rem; min-height: 25px; padding: 0.12rem 0.45rem;
  border-radius: 999px; background: rgba(255, 255, 255, 0.08);
  color: rgba(238, 243, 255, 0.84); font-size: 0.74rem; font-weight: 850;
}
.mt-card-cost img { width: 18px; height: 18px; object-fit: contain; }
.mt-card-trait img { width: 19px; height: 19px; object-fit: contain; }
.mt-asset-card.is-blog-card p {
  margin: 0; color: rgba(226, 233, 248, 0.72); font-size: 0.82rem; line-height: 1.42;
}
.mt-ruler-guide-card {
  padding: 0.95rem; border: 1px solid rgba(255, 255, 255, 0.1); border-radius: 8px;
  background:
    linear-gradient(145deg, rgba(24, 32, 51, 0.9), rgba(8, 12, 21, 0.94) 58%, rgba(36, 28, 23, 0.86));
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.05);
}
.mt-ruler-guide-card + .mt-ruler-guide-card { margin-top: 0.9rem; }
.mt-ruler-guide-main {
  display: grid; grid-template-columns: 170px minmax(0, 1fr); gap: 1rem; align-items: center;
}
.mt-ruler-art-card {
  width: 160px; max-width: 100%; margin: 0 auto; padding: 0;
}
.mt-ruler-copy { min-width: 0; }
.mt-ruler-copy > span, .mt-ruler-ability-block span, .mt-ruler-quest-block span {
  display: block; color: rgba(247, 215, 122, 0.78); font-size: 0.68rem; font-weight: 950;
  text-transform: uppercase; letter-spacing: 0.08em;
}
.mt-ruler-copy h4 {
  margin: 0.1rem 0 0.38rem; color: #fff; font-size: 1.28rem; letter-spacing: 0;
}
.mt-ruler-copy > p {
  margin: 0; color: rgba(226, 233, 248, 0.74); font-size: 0.88rem; line-height: 1.5;
}
.mt-ruler-ability-block {
  display: grid; grid-template-columns: 54px minmax(0, 1fr); gap: 0.72rem; align-items: center;
  margin-top: 0.78rem; padding: 0.7rem; border: 1px solid rgba(247, 215, 122, 0.18); border-radius: 8px;
  background: linear-gradient(145deg, rgba(247, 215, 122, 0.1), rgba(255, 255, 255, 0.04));
}
.mt-ruler-ability-block > img {
  width: 54px; height: 54px; object-fit: contain;
  filter: drop-shadow(0 5px 8px rgba(0, 0, 0, 0.38));
}
.mt-ruler-ability-placeholder {
  display: grid; width: 50px; height: 50px; place-content: center; border: 1px dashed rgba(255, 255, 255, 0.42);
  border-radius: 7px; background: rgba(4, 7, 13, 0.52); color: rgba(255, 255, 255, 0.7); text-align: center;
}
.mt-ruler-ability-placeholder em { color: #fff; font-size: 1.15rem; font-style: normal; font-weight: 950; line-height: 0.9; }
.mt-ruler-ability-placeholder small {
  margin-top: 0.18rem; color: rgba(255, 255, 255, 0.55); font-size: 0.43rem; font-weight: 900;
  line-height: 1; text-transform: uppercase;
}
.mt-ruler-ability-block b {
  display: block; margin: 0.1rem 0 0.16rem; color: #fff; font-size: 0.94rem;
}
.mt-ruler-ability-block p {
  margin: 0; color: rgba(226, 233, 248, 0.72); font-size: 0.82rem; line-height: 1.38;
}
.mt-ruler-quest-block {
  display: grid; grid-template-columns: 54px minmax(0, 1fr); gap: 0.72rem; align-items: center;
  padding: 0.7rem;
}
.mt-ruler-quest-block > img {
  width: 50px; height: 50px; object-fit: contain;
  filter: drop-shadow(0 5px 8px rgba(0, 0, 0, 0.38));
}
.mt-ruler-quest-block span { color: rgba(111, 209, 255, 0.88); }
.mt-ruler-quest-block p {
  margin: 0.16rem 0 0; color: rgba(226, 233, 248, 0.72); font-size: 0.82rem; line-height: 1.38;
}
.mt-ruler-quest-block p strong { color: rgba(255, 255, 255, 0.92); font-weight: 900; }
.mt-ruler-skins {
  margin-top: 0.8rem; padding-top: 0.78rem; border-top: 1px solid rgba(255, 255, 255, 0.08);
}
.mt-ruler-skins > b {
  display: block; margin-bottom: 0.55rem; color: rgba(226, 233, 248, 0.58); font-size: 0.72rem;
  font-weight: 950; text-transform: uppercase; letter-spacing: 0.08em;
}
.mt-ruler-skin-grid {
  display: grid; grid-template-columns: repeat(auto-fill, minmax(82px, 1fr)); gap: 0.58rem;
}
.mt-ruler-skin-card {
  min-width: 0; padding: 0.45rem 0.35rem 0.5rem; border: 1px solid rgba(255, 255, 255, 0.07);
  border-radius: 8px; background: rgba(255, 255, 255, 0.035); text-align: center;
}
.mt-ruler-skin-card .mt-ruler-art-card { width: 72px; }
.mt-ruler-skin-card b {
  display: block; margin-top: 0.36rem; color: rgba(226, 233, 248, 0.72); font-size: 0.66rem;
  line-height: 1.15; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.mt-modifier-grid {
  display: grid; grid-template-columns: repeat(auto-fill, minmax(112px, 1fr)); gap: 0.65rem; margin-top: 1rem;
}
.mt-modifier-card {
  display: grid; justify-items: center; gap: 0.45rem; padding: 0.65rem 0.45rem;
  border: 1px solid rgba(255, 255, 255, 0.1); border-radius: 9px;
  background: rgba(13, 18, 29, 0.76); text-align: center;
}
.mt-modifier-icon {
  position: relative; width: 72px; height: 72px; display: grid; place-items: center; border-radius: 50%;
  background:
    radial-gradient(circle at 35% 30%, rgba(255, 255, 255, 0.38), transparent 18%),
    linear-gradient(145deg, #263756, #090d17 62%, #424957);
  box-shadow:
    inset 0 2px 3px rgba(255, 255, 255, 0.25),
    inset 0 -4px 8px rgba(0, 0, 0, 0.5),
    0 7px 18px rgba(0, 0, 0, 0.32);
}
.mt-modifier-icon::before {
  content: ""; position: absolute; inset: -7px; border-radius: 50%; pointer-events: none;
  background: url("assets/merge-tactics/modifier-border.png") center / contain no-repeat;
  opacity: 0.78;
}
.mt-modifier-icon img {
  position: relative; z-index: 1; width: 46px; height: 46px; object-fit: contain;
  filter: drop-shadow(0 2px 3px rgba(0, 0, 0, 0.45));
}
.mt-modifier-card b { color: rgba(239, 244, 255, 0.86); font-size: 0.74rem; line-height: 1.15; }

/* Merge Tactics field guide: one editorial document instead of an asset catalogue. */
.mt-insights {
  margin-top: 1rem; color: #eef3fb;
  border-top: 1px solid rgba(255, 255, 255, 0.14);
  background:
    linear-gradient(90deg, rgba(51, 191, 214, 0.035), transparent 24%, transparent 76%, rgba(245, 194, 83, 0.035)),
    rgba(8, 12, 20, 0.42);
}
.mt-season-browser {
  position: relative; z-index: 12;
  display: grid; grid-template-columns: 42px minmax(220px, 300px) 42px; justify-content: center; gap: 0.45rem;
  max-width: 1040px; margin: 0 auto; padding: 0.55rem 1.25rem;
  border-bottom: 1px solid var(--panel-inset-border); background: var(--panel-inset);
}
.mt-season-step,
.mt-season-picker > button {
  min-height: 38px; border: 1px solid var(--panel-inset-border); border-radius: 6px;
  background: var(--deck-btn-bg); color: var(--panel-text); font: inherit; cursor: pointer;
}
.mt-season-step {
  display: grid; place-items: center; padding: 0;
  font-family: "Clash Display", sans-serif; font-size: 1.55rem; line-height: 1;
}
.mt-season-step:hover:not(:disabled),
.mt-season-picker > button:hover { border-color: var(--deck-btn-hover-border); color: var(--deck-btn-hover-fg); }
.mt-season-step:focus-visible,
.mt-season-picker > button:focus-visible,
.mt-season-menu button:focus-visible { outline: 2px solid var(--primary); outline-offset: 2px; }
.mt-season-step:disabled { cursor: default; opacity: 0.34; }
.mt-season-picker { position: relative; min-width: 0; }
.mt-season-picker > button {
  position: relative; width: 100%; padding: 0.34rem 2rem 0.34rem 0.75rem; text-align: left;
}
.mt-season-picker > button span,
.mt-season-picker > button b { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.mt-season-picker > button span {
  color: var(--panel-muted); font-size: 0.63rem; font-weight: 900; letter-spacing: 0.06em; text-transform: uppercase;
}
.mt-season-picker > button b { margin-top: 0.04rem; color: var(--panel-text); font-size: 0.82rem; }
.mt-season-picker > button i {
  position: absolute; right: 0.8rem; top: 50%; width: 7px; height: 7px;
  border-right: 2px solid currentColor; border-bottom: 2px solid currentColor;
  transform: translateY(-70%) rotate(45deg); transition: transform 160ms ease;
}
.mt-season-picker > button[aria-expanded="true"] i { transform: translateY(-25%) rotate(225deg); }
.mt-season-menu {
  position: absolute; z-index: 20; top: calc(100% + 5px); left: 0; right: 0;
  max-height: 330px; overflow-y: auto; padding: 0.35rem;
  border: 1px solid var(--panel-border); border-radius: var(--panel-radius);
  background: var(--panel-bg); box-shadow: var(--panel-shadow);
}
.mt-season-menu[hidden] { display: none; }
.mt-season-menu button {
  display: grid; grid-template-columns: 72px minmax(0, 1fr); align-items: center; gap: 0.55rem;
  width: 100%; min-height: 38px; padding: 0.42rem 0.55rem;
  border: 0; border-bottom: 1px solid var(--panel-inset-border); border-radius: 4px;
  background: transparent; color: var(--panel-muted); font: inherit; text-align: left; cursor: pointer;
}
.mt-season-menu button:last-child { border-bottom: 0; }
.mt-season-menu button:hover,
.mt-season-menu button[aria-selected="true"] { background: var(--panel-inset); color: var(--panel-text); }
.mt-season-menu button span { font-size: 0.68rem; font-weight: 900; text-transform: uppercase; }
.mt-season-menu button b { overflow: hidden; color: inherit; font-size: 0.75rem; text-overflow: ellipsis; white-space: nowrap; }
.mt-insights-intro {
  position: relative; min-height: 310px; max-width: 1040px; margin: 0 auto; padding: 3.15rem 1.25rem 2.5rem;
  overflow: hidden; isolation: isolate; scroll-margin-top: var(--mt-insights-sticky-top, 94px);
  background: linear-gradient(90deg, rgba(8, 12, 20, 0.98) 0%, rgba(8, 12, 20, 0.88) 38%, rgba(8, 12, 20, 0.16) 72%, transparent 100%);
}
.mt-insights-intro::after {
  content: ""; position: absolute; z-index: 3; inset: 0 auto 0 0; width: 62%; pointer-events: none;
  background: linear-gradient(90deg, rgba(8, 12, 20, 0.98) 0%, rgba(8, 12, 20, 0.78) 58%, transparent 100%);
}
.mt-insights-intro-copy { position: relative; z-index: 4; max-width: 440px; }
.mt-insights-intro-copy > span {
  display: block; color: var(--gold); font-family: "Inter", system-ui, sans-serif;
  font-size: 1.85rem; font-weight: 950; line-height: 1; text-transform: uppercase; letter-spacing: 0.055em;
}
.mt-insights-intro-copy > small {
  display: block; margin-top: 0.34rem; color: var(--panel-muted);
  font-size: 0.68rem; font-weight: 850; letter-spacing: 0.04em; text-transform: uppercase;
}
.mt-insights-intro h3 { margin: 1.05rem 0 0.45rem; color: var(--panel-text); font-size: 1.85rem; letter-spacing: 0; }
.mt-insights-intro p { margin: 0; color: rgba(226, 233, 248, 0.72); line-height: 1.55; }
.mt-insights-scene { position: absolute; z-index: 2; inset: 0; pointer-events: none; }
.mt-scene-spotlight {
  position: absolute; z-index: 1; top: -34px; right: 72px; width: 430px; height: 390px;
  clip-path: polygon(44% 0, 56% 0, 100% 100%, 0 100%);
  background: linear-gradient(to bottom, rgba(193, 244, 255, 0.34), rgba(81, 203, 240, 0.16) 54%, rgba(41, 151, 204, 0.02) 100%);
  filter: blur(13px); mix-blend-mode: screen; opacity: 0.72; transform-origin: 50% 0;
}
.mt-scene-spotlight::after {
  content: ""; position: absolute; left: 12%; right: 12%; bottom: -20px; height: 74px; border-radius: 50%;
  background: radial-gradient(ellipse, rgba(91, 218, 246, 0.3), transparent 68%); filter: blur(7px);
}
.mt-scene-layer {
  position: absolute; height: auto; transform-origin: 50% 55%;
  filter: drop-shadow(0 18px 22px rgba(0, 0, 0, 0.38));
}
.mt-scene-season {
  z-index: 3; right: 34px; bottom: -14%; width: min(48%, 490px); max-height: 118%; object-fit: contain; object-position: center bottom;
}
.mt-insights-intro[data-season="1"] .mt-scene-season { right: 94px; bottom: -20%; width: min(46%, 470px); max-height: 124%; }
.mt-insights-intro[data-season="2"] .mt-scene-season,
.mt-insights-intro[data-season="4"] .mt-scene-season { right: 48px; bottom: -9%; width: min(44%, 450px); max-height: 110%; }
.mt-insights-intro[data-season="3"] .mt-scene-season { right: 82px; bottom: -9%; width: min(44%, 450px); max-height: 110%; }
.mt-insights-intro[data-season="5"] .mt-scene-season { right: 84px; bottom: -9%; width: min(44%, 450px); max-height: 110%; }
.mt-insights-intro[data-season="6"] .mt-scene-season { right: 104px; bottom: -11%; width: min(40%, 410px); max-height: 99%; }
/* Season 11 ist der Sonderfall: kein stehender Ruler, sondern der animierte
   Elixir-Loong-Emote (Eliass 04.09.2026). Die Grundregel schneidet das Motiv unten
   bewusst an (`bottom: -14%`, `object-position: center bottom`) - das passt zu einer
   Figur, die am Boden steht, nicht zu einem Emote, der schweben soll.
   Deshalb hier: positiver Abstand nach unten statt negativem, damit nichts
   abgeschnitten wird, und das Motiv mittig statt unten ausgerichtet.
   Zentriert wird ueber die Abstaende und NICHT ueber `transform: translateY(-50%)`:
   die Einblendung (.is-entering) animiert genau diese Eigenschaft und wuerde die
   Zentrierung ueberschreiben.
   Schmaler als die Ruler-Bilder, weil der Emote querformatig ist (500x300) und
   sonst die halbe Kopfzeile fuellt. */
.mt-insights-intro[data-season="11"] .mt-scene-season {
  /* Waagerecht MITTIG IM LICHTKEGEL. Der sitzt bei `right: 72px` und ist 430px
     breit, seine Mitte liegt also 287px vom rechten Rand. Die Rechnung zieht die
     halbe Bildbreite davon ab, damit die Mitte auch dann stimmt, wenn die Breite
     ueber min() kleiner ausfaellt (Eliass 04.09.2026: "er muss mehr nach links,
     damit er mittig im Lichtkegel sitzt"). */
  --mt-emote-breite: min(34%, 340px);
  width: var(--mt-emote-breite);
  right: calc(287px - var(--mt-emote-breite) / 2);
  bottom: 13%; max-height: 74%;
  object-position: center center;
}
@media (max-width: 820px) {
  .mt-insights-intro[data-season="11"] .mt-scene-season {
    --mt-emote-breite: min(40%, 280px);
    right: calc(200px - var(--mt-emote-breite) / 2);
    bottom: 16%; max-height: 66%;
  }
}
.mt-insights-intro:not([data-season="1"]) .mt-scene-dragon { display: none; }
.mt-scene-empress {
  z-index: 3; right: 168px; bottom: -118px; width: 335px;
  clip-path: polygon(18% 4%, 92% 2%, 100% 100%, 30% 100%, 13% 89%, 1% 67%, 21% 51%, 29% 15%);
}
.mt-scene-dragon { z-index: 2; }
.mt-scene-dragon-left {
  --mt-scene-x: -18px; --mt-scene-y: 8px; --mt-scene-delay: 280ms; --mt-float-delay: 1050ms;
  right: 430px; bottom: 23px; width: 180px;
  -webkit-mask-image: radial-gradient(ellipse 48% 43% at 50% 54%, #000 0 58%, rgba(0, 0, 0, 0.82) 76%, transparent 100%);
  mask-image: radial-gradient(ellipse 48% 43% at 50% 54%, #000 0 58%, rgba(0, 0, 0, 0.82) 76%, transparent 100%);
}
.mt-scene-dragon-top {
  --mt-scene-x: 16px; --mt-scene-y: -12px; --mt-scene-delay: 470ms; --mt-float-delay: 1240ms;
  right: 24px; top: -18px; width: 185px;
  -webkit-mask-image: radial-gradient(ellipse 45% 43% at 50% 50%, #000 0 58%, rgba(0, 0, 0, 0.82) 76%, transparent 100%);
  mask-image: radial-gradient(ellipse 45% 43% at 50% 50%, #000 0 58%, rgba(0, 0, 0, 0.82) 76%, transparent 100%);
}
.mt-scene-dragon-bottom {
  --mt-scene-x: 20px; --mt-scene-y: 14px; --mt-scene-delay: 660ms; --mt-float-delay: 1430ms;
  right: 31px; bottom: -5px; width: 158px;
  -webkit-mask-image: radial-gradient(ellipse 47% 44% at 50% 52%, #000 0 58%, rgba(0, 0, 0, 0.82) 76%, transparent 100%);
  mask-image: radial-gradient(ellipse 47% 44% at 50% 52%, #000 0 58%, rgba(0, 0, 0, 0.82) 76%, transparent 100%);
}
.mt-insights-intro.is-entering .mt-scene-spotlight {
  animation: mt-spotlight-enter 900ms cubic-bezier(.2, .8, .2, 1) both, mt-spotlight-breathe 5.6s ease-in-out 1.1s infinite alternate;
}
.mt-insights-intro.is-entering .mt-scene-empress {
  animation: mt-empress-enter 880ms cubic-bezier(.2, .8, .2, 1) both;
}
.mt-insights-intro.is-entering .mt-scene-season {
  animation: mt-empress-enter 880ms cubic-bezier(.2, .8, .2, 1) both;
}
.mt-insights-intro.is-entering .mt-scene-dragon {
  animation:
    mt-dragon-enter 720ms cubic-bezier(.16, 1, .3, 1) var(--mt-scene-delay) both,
    mt-dragon-float 4.8s ease-in-out var(--mt-float-delay) infinite alternate;
}
@keyframes mt-empress-enter {
  from { opacity: 0; transform: translateY(34px) scale(0.97); }
  to { opacity: 1; transform: translateY(0) scale(1); }
}
@keyframes mt-spotlight-enter {
  from { opacity: 0; transform: scaleX(0.3) scaleY(0.18); filter: blur(18px); }
  to { opacity: 0.72; transform: scale(1); filter: blur(13px); }
}
@keyframes mt-spotlight-breathe {
  from { opacity: 0.58; }
  to { opacity: 0.78; }
}
@keyframes mt-dragon-enter {
  from { opacity: 0; transform: translate(var(--mt-scene-x), var(--mt-scene-y)) scale(0.78); filter: blur(5px) drop-shadow(0 18px 22px rgba(0, 0, 0, 0.38)); }
  to { opacity: 1; transform: translate(0, 0) scale(1); filter: blur(0) drop-shadow(0 18px 22px rgba(0, 0, 0, 0.38)); }
}
@keyframes mt-dragon-float {
  from { transform: translateY(0); }
  to { transform: translateY(-7px); }
}
.mt-insights-nav {
  position: sticky; top: var(--mt-insights-sticky-top, 94px); z-index: 9;
  display: grid; grid-template-columns: repeat(var(--mt-season-chapters, 4), minmax(0, 1fr));
  max-width: 1040px; margin: 0 auto; border-top: 1px solid rgba(255, 255, 255, 0.11);
  border-bottom: 1px solid rgba(255, 255, 255, 0.14);
  background: rgba(11, 16, 25, 0.96); box-shadow: 0 10px 20px rgba(0, 0, 0, 0.18);
  backdrop-filter: blur(14px);
  overflow: hidden;
}
.mt-insights-nav a {
  position: relative; display: flex; align-items: center; justify-content: center; gap: 0.46rem;
  min-height: 43px; padding: 0.48rem; color: rgba(238, 243, 251, 0.55);
  font-size: 0.78rem; font-weight: 850; text-decoration: none;
}
.mt-insights-nav a[hidden],
.mt-insights-chapter[hidden] { display: none; }
.mt-insights-nav a:hover, .mt-insights-nav a.active { color: #fff; background: rgba(255, 255, 255, 0.025); }
.mt-insights-indicator {
  position: absolute; z-index: 2; left: 0; bottom: -1px; width: calc(100% / var(--mt-season-chapters, 4)); height: 3px; pointer-events: none;
  background: linear-gradient(90deg, #42d5e2, #f4cb62);
  box-shadow: 0 0 10px rgba(70, 210, 224, 0.42);
  transition: transform 420ms cubic-bezier(0.22, 1, 0.36, 1), width 420ms cubic-bezier(0.22, 1, 0.36, 1);
}
.mt-insights-indicator::before {
  content: ""; position: absolute; left: 5%; right: 5%; bottom: 0; height: 26px;
  background: linear-gradient(to top, rgba(73, 211, 224, 0.2), rgba(244, 203, 98, 0.06) 46%, transparent 100%);
  opacity: 0; filter: blur(3px); transform-origin: bottom; pointer-events: none;
  animation: mt-nav-glow 5.2s ease-in-out infinite;
}
@keyframes mt-nav-glow {
  0%, 58%, 100% { opacity: 0; transform: scaleY(0.35); }
  70% { opacity: 0.72; transform: scaleY(1); }
  84% { opacity: 0.18; transform: scaleY(0.72); }
}
.mt-insights-document { max-width: 1040px; margin: 0 auto; padding: 0 1.25rem 3rem; }
.mt-insights-chapter { scroll-margin-top: calc(var(--mt-insights-sticky-top, 94px) + 56px); padding: 2.5rem 0 0; }
.mt-insights-chapter + .mt-insights-chapter { margin-top: 4rem; }
.mt-chapter-head {
  position: relative;
  display: grid; grid-template-columns: minmax(0, 1fr); align-items: center;
  width: calc(100% + 2.5rem); margin: 0 -1.25rem 1.8rem; padding: 1.2rem 1.25rem;
  border-top: 1px solid rgba(255, 255, 255, 0.14); border-bottom: 1px solid rgba(255, 255, 255, 0.08);
  background:
    linear-gradient(90deg, rgba(70, 202, 220, 0.18), transparent 40%, transparent 63%, rgba(244, 198, 92, 0.14)),
    rgba(255, 255, 255, 0.025);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.035), 0 12px 28px rgba(0, 0, 0, 0.12);
}
.mt-chapter-head::before {
  content: ""; position: absolute; left: 0; right: 0; top: -1px; height: 3px;
  background: linear-gradient(90deg, #43d0df 0 18%, rgba(67, 208, 223, 0.18) 42%, rgba(244, 198, 92, 0.18) 66%, #f4c65c 100%);
  box-shadow: 0 0 12px rgba(67, 208, 223, 0.22);
}
.mt-chapter-head h4 { margin: 0; color: #fff; font-size: 1.5rem; letter-spacing: 0; }
.mt-chapter-head p { max-width: 66ch; margin: 0.3rem 0 0; color: rgba(226, 233, 248, 0.62); line-height: 1.5; }
.mt-coming-soon { margin: 0; padding: 3rem 1rem; color: rgba(238, 243, 251, 0.7); text-align: center; font-size: 1rem; }

/* ---- Merge-Tactics-Board (Best Builds) ---------------------------------
   Sichtbar ist ausschliesslich das echte Arena-Bild. Darueber liegt eine
   SVG-Ebene mit 20 Polygonen, deren Eckpunkte am Bild selbst ausgemessen
   wurden (assets/merge-tactics/arena-tiles.json). Es wird also nichts
   nachgezeichnet oder eingefaerbt - dadurch koennen Farbe und Perspektive
   gar nicht erst auseinanderlaufen, und jedes Feld darf seine eigene,
   leicht andere Form haben. */
.mt-arena-layout { display: flex; gap: 1rem; align-items: flex-start; flex-wrap: wrap; }
.mt-arena-stage-column {
  flex: 1.5 1 520px; min-width: 320px; max-width: 760px;
}
.mt-arena-stage {
  position: relative; width: 100%;
  aspect-ratio: 2400 / 2769;
  border: 1px solid var(--panel-inset-border); border-radius: var(--panel-radius);
  background: var(--mt-arena-floor) url("assets/merge-tactics/ui/arena-board.jpg") center / cover no-repeat;
  overflow: hidden;
}
.mt-arena-export-actions {
  display: flex; align-items: center; gap: 0.45rem; min-height: 40px; padding-top: 0.48rem;
}
.mt-arena-export-btn {
  display: inline-flex; align-items: center; gap: 0.38rem; min-height: 32px; padding: 0.28rem 0.62rem;
  border: 1px solid var(--panel-inset-border); border-radius: 6px;
  background: var(--panel-inset); color: var(--panel-muted); font-size: 0.68rem; font-weight: 800;
  cursor: pointer; transition: border-color 0.18s ease, color 0.18s ease, background 0.18s ease;
}
.mt-arena-export-btn:hover, .mt-arena-export-btn:focus-visible {
  border-color: var(--primary); background: var(--panel-inset); color: var(--panel-text);
}
.mt-arena-export-btn:disabled { opacity: 0.5; cursor: wait; }
.mt-arena-export-status {
  min-width: 0; overflow: hidden; color: var(--panel-dim); font-size: 0.64rem;
  text-overflow: ellipsis; white-space: nowrap;
}
.mt-arena-export-status:empty { display: none; }
/* preserveAspectRatio="none" + viewBox 0..100: die Prozentkoordinaten aus der
   JSON treffen damit exakt dieselben Bildpunkte, in jeder Groesse. */
.mt-arena-svg { position: absolute; inset: 0; width: 100%; height: 100%; display: block; }
.mt-arena-credit {
  position: absolute; z-index: 4; left: 50%; bottom: 0.7rem; margin: 0;
  color: var(--panel-muted); font-size: 0.82rem; font-weight: 950;
  letter-spacing: 0.08em; text-transform: uppercase; transform: translateX(-50%);
  white-space: nowrap; pointer-events: none;
}
.mt-arena-credit span { color: var(--gold); }
.mt-arena-visibility {
  position: absolute; z-index: 7; top: 0.65rem; left: 0.65rem;
  display: grid; gap: 4px; width: 122px;
}
.mt-arena-visibility button {
  display: grid; grid-template-columns: 34px minmax(0, 1fr); align-items: center; gap: 0.36rem;
  min-width: 0; min-height: 34px; padding: 0 4px 0 0;
  border: 1px solid color-mix(in srgb, var(--panel-text) 7%, transparent); border-radius: 5px;
  background: color-mix(in srgb, var(--text-invert) 32%, transparent);
  color: var(--panel-text); cursor: pointer; text-align: left;
  filter: drop-shadow(0 2px 3px color-mix(in srgb, var(--text-invert) 72%, transparent));
  transform-origin: left center;
  transition: transform 0.2s cubic-bezier(.22, 1, .36, 1), filter 0.2s ease, background 0.18s ease, border-color 0.18s ease;
}
.mt-arena-visibility button:hover {
  border-color: color-mix(in srgb, var(--panel-text) 14%, transparent);
  background: color-mix(in srgb, var(--text-invert) 46%, transparent);
  color: var(--panel-text); transform: scale(1.045);
  filter: drop-shadow(0 3px 4px color-mix(in srgb, var(--text-invert) 84%, transparent));
}
.mt-arena-visibility img { display: block; width: 34px; height: 34px; object-fit: contain; }
.mt-arena-visibility span {
  overflow: hidden; color: var(--panel-text); font-family: "Clash Display", "Inter", sans-serif;
  font-size: 0.72rem; font-weight: 700; line-height: 1; text-overflow: ellipsis;
}
.mt-arena-modifier-preview {
  position: absolute; z-index: 5; top: 0.75rem; right: 0.75rem;
  display: grid; grid-template-columns: 68px minmax(0, 1fr); align-items: center; gap: 0.42rem;
  width: clamp(248px, 46%, 304px); min-height: 92px; padding: 0.5rem 0.62rem;
  border: 4px solid var(--panel-text); border-radius: 10px;
  background: var(--mt-modifier-card-bg); color: var(--panel-text);
  box-shadow: 0 4px 0 var(--mt-modifier-card-shadow), 0 8px 14px color-mix(in srgb, var(--text-invert) 42%, transparent);
}
.mt-arena-modifier-preview > img,
.mt-arena-modifier-preview-fallback {
  display: grid; width: 68px; height: 68px; place-items: center; object-fit: contain;
}
.mt-arena-modifier-preview-fallback {
  border: 1px solid color-mix(in srgb, var(--panel-text) 52%, transparent); border-radius: 7px;
  background: color-mix(in srgb, var(--text-invert) 28%, transparent); color: var(--panel-text);
  font-family: "Clash Display", "Inter", sans-serif; font-size: 0.72rem; font-weight: 900;
}
.mt-arena-modifier-preview-copy {
  display: grid; align-content: center; min-width: 0; text-align: left;
}
.mt-arena-modifier-preview-copy > strong {
  color: var(--gold); font-family: "Clash Display", "Inter", sans-serif;
  font-size: 0.94rem; line-height: 1.05;
  -webkit-text-stroke: 1px var(--mt-modifier-card-shadow);
  paint-order: stroke fill; text-shadow: 0 2px 0 var(--mt-modifier-card-shadow);
}
.mt-arena-modifier-preview-copy > span {
  margin-top: 0.38rem; color: var(--panel-text); font-family: "Inter", system-ui, sans-serif;
  font-size: 0.6rem; font-weight: 750; line-height: 1.28;
  text-shadow: 0 1px 1px var(--mt-modifier-card-shadow);
}
.mt-arena-hex {
  fill: transparent; stroke: transparent; stroke-width: 2px;
  vector-effect: non-scaling-stroke; cursor: pointer;
  transition: fill 0.12s ease, stroke 0.12s ease;
}
.mt-arena-hex:hover { fill: var(--mt-arena-hex-hover); stroke: var(--mt-arena-hex-line); }
.mt-arena-hex:focus-visible, .mt-arena-bench:focus-visible, .mt-arena-ruler-spot:focus-visible {
  outline: none; fill: var(--mt-arena-hex-hover); stroke: var(--primary); stroke-width: 4px;
}
.mt-arena-hex.taken { fill: var(--mt-arena-hex-taken); }
/* Bank unter dem Feld: gleiche Mechanik wie ein Spielfeld. */
.mt-arena-bench { fill: transparent; stroke: transparent; stroke-width: 2px;
  vector-effect: non-scaling-stroke; cursor: pointer;
  transition: fill 0.12s ease, stroke 0.12s ease; }
.mt-arena-bench:hover { fill: var(--mt-arena-hex-hover); stroke: var(--mt-arena-hex-line); }
/* Ruler-Podest: noch ohne Funktion, deshalb Gold statt der ueblichen Markierung. */
.mt-arena-ruler-spot { fill: transparent; stroke: transparent; stroke-width: 2px;
  vector-effect: non-scaling-stroke; cursor: pointer;
  transition: fill 0.12s ease, stroke 0.12s ease; }
.mt-arena-ruler-spot:hover { fill: var(--mt-arena-ruler-hover); stroke: var(--gold); }

/* Einheit ausgewaehlt: freie Zielfelder zeigen sich, belegte bleiben ruhig. */
.mt-arena-svg.is-arming .mt-arena-hex:not(.is-filled),
.mt-arena-svg.is-arming .mt-arena-bench:not(.is-filled) {
  fill: var(--mt-arena-hex-hover); stroke: var(--mt-arena-hex-line); stroke-opacity: 0.55;
}
/* Belegtes Feld: die Karte fuellt es schon aus, der Hover bleibt dezent. */
.mt-arena-hex.is-filled, .mt-arena-bench.is-filled { stroke: var(--mt-arena-hex-line); stroke-width: 1.5px; }
.mt-arena-hex.is-filled:hover, .mt-arena-bench.is-filled:hover { fill: var(--mt-arena-hex-taken); }
.mt-arena-hex.is-drop-target, .mt-arena-bench.is-drop-target {
  fill: var(--mt-arena-hex-taken); stroke: var(--primary); stroke-width: 3px;
}
.mt-arena-art { pointer-events: none; }
.mt-arena-ruler-art { pointer-events: none; }
.mt-arena-overlays { pointer-events: none; }
.mt-arena-trait-area { fill: color-mix(in srgb, var(--primary) 16%, transparent); }
.mt-arena-equipment-area { fill: color-mix(in srgb, var(--text-invert) 72%, transparent); }
.mt-arena-placed-trait, .mt-arena-placed-equipment {
  pointer-events: none; filter: drop-shadow(0 2px 2px color-mix(in srgb, var(--text-invert) 68%, transparent));
}
.mt-arena-loading { margin: 0; padding: 3rem 1rem; text-align: center; color: var(--panel-muted); }

/* ---- Steuerspalte -------------------------------------------------------
   Flaechen sind .panel (Standard der Seite). Die Kachel-Zustaende folgen
   .builder-card aus dem Deck Builder, damit sich beides gleich anfuehlt. */
.mt-arena-side { flex: 1 1 300px; min-width: 280px; display: flex; flex-direction: column; gap: 0.7rem; }
.mt-arena-panel { --mt-arena-collapsed-height: 62px; padding: 0.75rem 0.8rem 0.35rem; }
.mt-arena-panel[data-arena-panel="troops"] { --mt-arena-collapsed-height: 94px; }
.mt-arena-panel[data-arena-panel="equipment"],
.mt-arena-panel[data-arena-panel="modifiers"] { --mt-arena-collapsed-height: 66px; }
.mt-arena-panel-head {
  display: flex; align-items: center; justify-content: space-between; gap: 0.6rem;
  margin-bottom: 0.6rem;
}
.mt-arena-panel-head h4 { margin: 0; font-size: 0.95rem; color: var(--panel-text); }
.mt-arena-panel-title { display: flex; align-items: baseline; gap: 0.48rem; min-width: 0; }
.mt-arena-panel-title > span {
  overflow: hidden; color: var(--panel-dim); font-size: 0.7rem; text-overflow: ellipsis; white-space: nowrap;
}
.mt-arena-tag {
  max-width: 58%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  padding: 0.1rem 0 0.1rem 0.42rem; border: 0; border-left: 2px solid var(--panel-inset-border);
  border-radius: 0; background: transparent;
  color: var(--panel-muted); font-size: 0.73rem; font-variant-numeric: tabular-nums;
}
.mt-arena-tag.is-full { color: var(--gold); border-color: var(--gold); }
.mt-arena-panel-body {
  position: relative; max-height: var(--mt-arena-collapsed-height); overflow: hidden;
  transition: max-height 0.28s cubic-bezier(.22, 1, .36, 1);
}
.mt-arena-panel-body::after {
  content: ""; position: absolute; z-index: 8; inset: auto 0 0; height: 27px; pointer-events: none;
  background: linear-gradient(to bottom, transparent, color-mix(in srgb, var(--text-invert) 82%, transparent));
  transition: opacity 0.18s ease;
}
.mt-arena-panel.active .mt-arena-panel-body { max-height: 520px; overflow-y: auto; }
.mt-arena-panel.active .mt-arena-panel-body::after { opacity: 0; }
.mt-arena-panel-toggle {
  display: flex; align-items: center; justify-content: center; width: 34px; height: 26px;
  margin: 0.18rem auto 0; padding: 0; border: 0; border-radius: 6px;
  background: transparent; color: var(--panel-muted); cursor: pointer;
  transition: color 0.18s ease, background 0.18s ease;
}
.mt-arena-panel-toggle:hover { color: var(--panel-text); background: color-mix(in srgb, var(--panel-text) 8%, transparent); }
.mt-arena-panel-toggle:focus-visible { outline: 2px solid var(--primary); outline-offset: 2px; }
.mt-arena-panel-toggle svg { transition: transform 0.25s ease; }
.mt-arena-panel.active .mt-arena-panel-toggle svg { transform: rotate(180deg); }

/* ---------- Board-Editor ----------
   Ziehen und Seitenscrollen vertragen sich auf dem Handy nicht: beim Ziehen einer Truppe
   auf das Feld scrollt die Seite mit, das Feld wandert unter dem Finger weg (Eliass
   15.08.2026). Der Editor loest das, indem der Bereich fuer die Dauer der Bearbeitung
   das ganze Fenster einnimmt - darin gibt es nichts zu scrollen, also auch keinen
   Konflikt. Er ist bewusst ein ZUSTAND dieses Bereichs und kein eigener Dialog: die
   Auswahlpanels behalten dadurch ihren delegierten Klick-Handler und ihre gesamte
   Bedienlogik unveraendert.

   AUSDRUECKLICH NUR MOBIL (Eliass 16.08.2026): Der Editor loest ein Problem, das es nur
   auf dem Handy gibt. Am Desktop stehen die Auswahlpanels wie vor der Mobil-Ueberarbeitung
   neben dem Feld, dort gab es nie einen Grund fuer ein Vollbild-Overlay. Der ganze Block
   bis `body.mt-editing` haengt deshalb an der 1100px-Grenze - derselben, an der die Seite
   ohnehin zwischen unterer Leiste und Reiterreihe umschaltet. Die Einrueckung ist bewusst
   unveraendert geblieben, damit der Unterschied zum alten Stand lesbar bleibt. */
/* Diese Zeile MUSS ausserhalb der Mobil-Grenze stehen: sie blendet die Editor-Elemente
   im Ruhezustand aus. Im Mobil-Block eingesperrt waeren sie am Desktop sichtbar - dort
   versteckt sie dann keine Regel mehr. Das ist bei diesem Umbau zweimal passiert
   (Eliass 16.08.2026): erst bei Leiste und Kategoriefeldern, dann beim Schliesskreuz
   der Auswahl, das als blauer Knopf ohne Wirkung unter dem Builder stand. */
.mt-editor-bar, .mt-editor-cats, .mt-editor-panel-close { display: none; }

@media (max-width: 1100px) {
.mt-arena-layout.is-editing {
  position: fixed; inset: 0; z-index: 80;
  /* Die Grundregel setzt `align-items: flex-start` - die Kinder waeren dann nur so breit
     wie ihr Inhalt und die Kopfzeile des Editors haette "Done" direkt neben dem Titel
     statt am rechten Rand. */
  display: flex; flex-direction: column; align-items: stretch; gap: 0.55rem; flex-wrap: nowrap;
  /* Seitlich knapp gehalten, damit das Spielfeld so breit wie moeglich wird - es ist
     das, worauf gezogen und getippt wird (Eliass 16.08.2026). */
  padding: 0.6rem 0.35rem calc(0.7rem + env(safe-area-inset-bottom, 0px));
  background: var(--feedback-bg);
  overscroll-behavior: contain;
}
.mt-arena-layout.is-editing .mt-editor-bar {
  display: flex; align-items: center; justify-content: space-between; gap: 0.8rem; flex: none;
}
.mt-editor-title { color: var(--panel-text); font-size: 1rem; font-weight: 850; }
.mt-editor-done {
  padding: 0.36rem 1rem; border-radius: 7px; border: 1px solid var(--primary);
  background: var(--primary); color: #fff; font-weight: 800; font-size: 0.85rem; cursor: pointer;
}
/* Vier quadratische Felder: eines je Bereich, den man bearbeiten kann. */
.mt-arena-layout.is-editing .mt-editor-cats {
  display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 0.4rem; flex: none;
}
/* Die Felder waren Quadrate ueber die volle Breite, bei 375px also 83px hoch - ein
   Viertel des Editors, bevor ueberhaupt etwas zu sehen war. Jetzt hoechstens halb so
   hoch, dafuer mit einem erklaerenden Bild statt einer Ueberschrift (Eliass
   16.08.2026). `aspect-ratio` muss dafuer weg: es zog die Hoehe an der Spaltenbreite
   hoch, jede Hoehenangabe waere daneben wirkungslos geblieben. */
/* Quadratisch und klein, mit dem Bild als einzigem Inhalt: es fuellt das Feld fast
   ganz aus (Eliass 16.08.2026). Feste 40px statt `aspect-ratio` - letzteres zog die
   Hoehe an der Spaltenbreite hoch und machte jede Hoehenangabe wirkungslos. Die
   Spalten sind deshalb ebenfalls 40px breit und stehen als Gruppe mittig, sonst
   waeren die Felder wieder gestreckt. */
.mt-arena-layout.is-editing .mt-editor-cats {
  grid-template-columns: repeat(4, 40px); justify-content: center; gap: 0.55rem;
}
.mt-editor-cats button {
  display: flex; align-items: center; justify-content: center;
  width: 40px; height: 40px; padding: 2px; border-radius: 8px;
  border: 1px solid var(--panel-inset-border); background: var(--panel-inset);
  color: var(--panel-muted); cursor: pointer; text-align: center;
}
.mt-editor-cats img {
  width: 100%; height: 100%; object-fit: contain;
  filter: drop-shadow(0 1px 2px color-mix(in srgb, var(--text-invert) 55%, transparent));
}
/* Name und Statuswert bleiben im Markup, damit Screenreader den Knopf benennen
   koennen - sichtbar ist nur noch das Bild. */
.mt-editor-cats b,
.mt-editor-cats small {
  position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0;
  overflow: hidden; clip-path: inset(50%); white-space: nowrap;
}
.mt-editor-cats button.active { border-color: var(--primary); background: color-mix(in srgb, var(--primary) 22%, transparent); }

/* Das Spielfeld fuellt den Rest und bleibt vollstaendig sichtbar. */
/* Ohne offene Auswahl steht das Feld mittig im freien Raum, sonst haengt es unten -
   dann ueberdeckt die Auswahl so wenig davon wie moeglich. */
.mt-arena-layout.is-editing .mt-arena-stage-column {
  flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; justify-content: center;
}
/* Bei offener Auswahl steht die Arena nicht mehr am unteren Rand, sondern direkt unter
   dem Auswahlkasten - der leere Streifen dazwischen war je nach Geraetehoehe ueber
   100px hoch. Der Abstand kommt aus merge-tactics.mjs (rueckeArenaHoch), weil er von
   der jeweiligen Kastenhoehe abhaengt. Als Aussenabstand am Feld, NICHT als Polsterung
   der Spalte: sonst waere `clientHeight` der Spalte mitgewachsen und die Rechnung, ob
   die Arena noch passt, haette sich selbst verschoben. */
.mt-arena-layout.is-editing[data-editor-open]:not([data-editor-open=""]) .mt-arena-stage-column {
  justify-content: flex-start;
}
.mt-arena-layout.is-editing[data-editor-open]:not([data-editor-open=""]) .mt-arena-stage {
  margin-top: var(--mt-editor-stage-top, 0px);
}
.mt-arena-layout.is-editing .mt-arena-export-actions { display: none; }

/* Das geoeffnete Auswahlpanel legt sich ueber den OBEREN Teil des Feldes - dort steht
   ohnehin nur die gegnerische Haelfte, auf der nichts abgelegt werden kann. */
.mt-arena-layout.is-editing .mt-arena-side {
  /* Ueber den Sichtbarkeits-Schaltern des Feldes (z-index 7) - die liegen oben links auf
     dem Feld und lagen sonst quer ueber der Auswahl. */
  position: absolute; z-index: 9; left: 0.35rem; right: 0.35rem; min-width: 0;
  top: calc(0.6rem + 2.1rem + 0.55rem + var(--mt-editor-cats-height, 84px) + 0.55rem);
  max-height: 62vh;
}
.mt-arena-layout.is-editing .mt-arena-panel { display: none; }
.mt-arena-layout.is-editing[data-editor-open="rulers"] .mt-arena-panel[data-arena-panel="rulers"],
.mt-arena-layout.is-editing[data-editor-open="troops"] .mt-arena-panel[data-arena-panel="troops"],
.mt-arena-layout.is-editing[data-editor-open="equipment"] .mt-arena-panel[data-arena-panel="equipment"],
.mt-arena-layout.is-editing[data-editor-open="modifiers"] .mt-arena-panel[data-arena-panel="modifiers"] {
  display: block;
}
/* Im Editor ist das Panel immer offen - der Aufklapp-Pfeil hat hier keine Aufgabe mehr,
   geschlossen wird ueber das Kreuz oder einen Klick daneben. */
/* Platz fuer das Kreuz, sonst liegt es auf der Zahl rechts in der Kopfzeile ("0 / 6"). */
.mt-arena-layout.is-editing .mt-arena-panel-head { padding-right: 2rem; }
/* Alle Auswahlkaesten sind hoechstens so tief wie Equipment (Eliass 16.08.2026): das
   war der einzige, der von sich aus bei y=396 endete und das Feld genau nicht mehr
   verdeckte. Troops war mit 475px Kastenhoehe 182px in das Feld hineingewachsen.
   242px Inhalt plus Kopfzeile ergeben dieselben 295px Kastenhoehe.
   Vorher stand hier `52vh` - ein Anteil der Fensterhoehe, der auf grossen Geraeten
   beliebig tief wurde und mit dem Feld darunter nichts zu tun hatte. */
/* Die Truppenliste bringt aus der normalen Ansicht ihren EIGENEN Rollkasten mit
   (`max-height: 420px; overflow-y: auto`). Im Editor lagen dadurch zwei Balken
   nebeneinander - der innere scrollte ganze 3px und war nicht zu gebrauchen
   (Eliass 16.08.2026). Im Editor rollt nur der Kasten aussen. */
.mt-arena-layout.is-editing .mt-arena-roster { max-height: none; overflow: visible; }
.mt-arena-layout.is-editing .mt-arena-panel .mt-arena-panel-body {
  /* Der Wert wird in merge-tactics.mjs aus der echten Tiefe des Equipment-Kastens
     gemessen und hier eingesetzt; 242px sind nur der Rueckfallwert fuer 375px. */
  max-height: var(--mt-editor-body-max, 242px); overflow-y: auto; overscroll-behavior: contain;
  /* Platz und sichtbarer Griff fuer den Daumen: die Inhalte hier werden gezogen, ein
     ueberlagerter Systembalken waere beim Ziehen weder sichtbar noch treffbar. */
  padding-right: 0.55rem;
  /* `scrollbar-gutter: stable` wie bei `.geier-members-scroll`: ohne das legt der
     Browser den Balken als Overlay ueber den Inhalt - beim Ziehen greift man dann
     ins Leere oder erwischt eine Karte statt des Balkens. */
  scrollbar-gutter: stable;
  scrollbar-width: thin;
  scrollbar-color: color-mix(in srgb, var(--panel-text) 34%, transparent) transparent;
}
.mt-arena-layout.is-editing .mt-arena-panel .mt-arena-panel-body::-webkit-scrollbar { width: 9px; }
.mt-arena-layout.is-editing .mt-arena-panel .mt-arena-panel-body::-webkit-scrollbar-track {
  border-radius: 5px; background: color-mix(in srgb, var(--text-invert) 30%, transparent);
}
.mt-arena-layout.is-editing .mt-arena-panel .mt-arena-panel-body::-webkit-scrollbar-thumb {
  border-radius: 5px; background: color-mix(in srgb, var(--panel-text) 34%, transparent);
}
.mt-arena-layout.is-editing .mt-arena-panel .mt-arena-panel-body::after { opacity: 0; }
.mt-arena-layout.is-editing .mt-arena-panel-toggle { display: none; }
.mt-editor-panel-close {
  display: none; position: absolute; z-index: 3; top: 0.45rem; right: 0.5rem;
  width: 26px; height: 26px; padding: 0; border-radius: 6px;
  border: 1px solid var(--panel-inset-border); background: var(--panel-inset);
  color: var(--panel-muted); font-size: 1rem; line-height: 1; cursor: pointer;
}
/* Nur sichtbar, solange wirklich eine Auswahl offen ist - `data-editor-open` steht im
   geschlossenen Zustand auf dem leeren Wert, nicht "nicht vorhanden". */
.mt-arena-layout.is-editing[data-editor-open]:not([data-editor-open=""]) .mt-editor-panel-close { display: block; }
/* Kopfzeile und untere Leiste liegen in eigenen Stapelebenen ueber `main` (z-index 10
   bzw. 60). Der Editor sitzt INNERHALB von `main`, dessen z-index 2 den ganzen Zweig
   deckelt - ein hoeherer Wert am Editor selbst kommt dagegen nicht an. Beide werden
   deshalb fuer die Dauer der Bearbeitung unsichtbar geschaltet.
   `visibility` und nicht `display`: so bleiben sie im Fluss und die Seite darunter
   springt beim Schliessen nicht. */
body.mt-editing > header, body.mt-editing .mobile-nav { visibility: hidden; }
body.mt-editing { overflow: hidden; }
}
/* Ende des mobilen Board-Editors. */

/* Auf breiten Handys und Tablets soll sich die Auswahl nicht ueber die ganze Breite
   ziehen - sie wird mittig auf Lesebreite gehalten. Die obere Grenze gehoert dazu,
   sonst griffe die Regel auch am Desktop, wo es den Editor gar nicht mehr gibt. */
@media (min-width: 760px) and (max-width: 1100px) {
  .mt-arena-layout.is-editing .mt-arena-side {
    left: 50%; right: auto; width: min(520px, calc(100% - 1.4rem)); transform: translateX(-50%);
  }
  .mt-editor-cats { max-width: 520px; margin-inline: auto; }
}

.mt-board-actions { display: flex; gap: 0.5rem; flex: none; }
/* Den Knopf gibt es nur dort, wo es auch den Editor gibt. Am Desktop stehen die
   Auswahlpanels ohnehin offen neben dem Feld - dort waere er ein Knopf ohne Wirkung. */
.mt-arena-edit { display: none; }
@media (max-width: 1100px) {
  .mt-arena-edit {
    display: inline-flex; align-items: center; gap: 0.34rem;
    align-self: flex-start; padding: 0.34rem 0.8rem; border-radius: 7px;
    border: 1px solid var(--primary); background: var(--primary);
    color: #fff; font-weight: 800; font-size: 0.82rem; cursor: pointer;
  }
}
.mt-arena-reset {
  align-self: flex-start; padding: 0.34rem 0.8rem; border-radius: 7px;
  border: 1px solid var(--panel-inset-border); background: var(--panel-inset);
  color: var(--panel-muted); font-size: 0.8rem; cursor: pointer;
}
/* Eigener :hover noetig - sonst greift die globale button:hover-Regel (blau). */
.mt-arena-reset:hover { background: var(--panel-inset); border-color: var(--loss); color: var(--loss); }

.mt-arena-rulers {
  display: grid; grid-template-columns: repeat(auto-fill, minmax(39px, 1fr)); gap: 4px;
}
.mt-arena-ruler-card {
  position: relative; display: block; min-width: 0; padding: 1px;
  border: 1px solid transparent; border-radius: 5px; background: transparent;
  cursor: pointer; transform: translateZ(0); transform-origin: 50% 70%;
  transition: transform 0.24s cubic-bezier(.22, 1, .36, 1); will-change: transform;
}
.mt-arena-ruler-card img {
  width: 100%; aspect-ratio: 1181 / 1678; object-fit: contain; display: block;
  pointer-events: none; user-select: none; -webkit-user-drag: none;
  transition: opacity 0.22s ease, filter 0.22s ease;
}
.mt-arena-ruler-card:hover { background: transparent; border-color: transparent; transform: scale(1.045); }
.mt-arena-rulers:has(.mt-arena-ruler-card.active) .mt-arena-ruler-card:not(.active) img {
  opacity: 0.6; filter: grayscale(0.6) saturate(0.4);
}
.mt-arena-ruler-card:hover img { opacity: 1; filter: none; }
.mt-arena-ruler-card.active {
  border-color: transparent; background: transparent; box-shadow: none;
}
.mt-arena-ruler-card.active img {
  filter: drop-shadow(0 0 5px color-mix(in srgb, var(--primary) 42%, transparent));
}
.mt-arena-bonus {
  position: absolute; top: 1px; right: 1px; padding: 0 3px; border-radius: 4px;
  background: var(--gold); color: var(--text-invert);
  font-size: 0.56rem; font-weight: 850; font-style: normal; line-height: 1.25;
}

.mt-arena-filters {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(31px, 1fr)); gap: 4px; margin-bottom: 0.55rem;
}
.mt-arena-chip {
  display: grid; place-items: center; min-width: 0; height: 32px; padding: 3px; border-radius: 5px;
  border: 1px solid var(--panel-inset-border); background: var(--panel-inset);
  color: var(--panel-muted); font-size: 0.65rem; font-weight: 800; cursor: pointer;
}
.mt-arena-chip img { width: 23px; height: 23px; object-fit: contain; }
.mt-arena-chip:hover { background: var(--panel-inset); border-color: var(--primary); }
.mt-arena-chip.active { border-color: var(--primary); color: var(--panel-text); background: var(--panel-inset); }

.mt-arena-roster {
  max-height: 420px; overflow-y: auto;
}
.mt-arena-unit-grid, .mt-arena-building-grid {
  display: grid; grid-template-columns: repeat(auto-fill, minmax(39px, 1fr)); gap: 4px;
}
.mt-arena-building-section {
  margin-top: 0.6rem; padding-top: 0.52rem;
  border-top: 1px solid var(--panel-inset-border);
}
.mt-arena-building-section > header {
  display: flex; align-items: center; justify-content: space-between;
  margin-bottom: 0.4rem; padding: 0 2px; color: var(--panel-dim);
}
.mt-arena-building-section > header b {
  color: var(--panel-muted); font-size: 0.68rem; font-weight: 850;
  letter-spacing: 0.08em; text-transform: uppercase;
}
.mt-arena-building-section > header span {
  font-size: 0.64rem; font-weight: 800; font-variant-numeric: tabular-nums;
}
.mt-arena-unit {
  position: relative; overflow: hidden; border: 1px solid transparent; border-radius: 5px; background: transparent;
  padding: 1px; cursor: grab; line-height: 0; touch-action: pan-y pinch-zoom;
  transform: translateZ(0); transition: transform 0.22s cubic-bezier(.22, 1, .36, 1), border-color 0.18s ease, background 0.18s ease;
  will-change: transform;
}
.mt-arena-unit > img {
  width: 100%; aspect-ratio: 257 / 322; object-fit: contain; display: block;
  pointer-events: none; user-select: none; -webkit-user-drag: none;
}
.mt-arena-unit .mt-card-trait-badges { bottom: 3%; width: 48%; }
.mt-arena-unit .mt-card-trait-badge img { position: absolute; width: 100%; aspect-ratio: 1; }
.mt-arena-unit .mt-card-trait-badge .mt-card-trait-icon { width: 68%; height: 68%; }
.mt-arena-unit:hover { border-color: var(--primary); background: var(--panel-inset); transform: scale(1.035); }
.mt-arena-unit.active { border-color: var(--primary); box-shadow: 0 0 0 1px var(--primary); }
/* Bereits gesetzt: sichtbar, aber zurueckgenommen. */
.mt-arena-unit.is-used { opacity: 0.34; }
/* Monats-Sperre (Season 11): Rider und Boss gehoeren zu verschiedenen Monaten und
   lassen sich nicht mischen. Die gesperrte Karte bleibt SICHTBAR und anklickbar -
   der Klick meldet dann im Hinweisfeld, warum es gerade nicht geht. Ausgrauen statt
   Ausblenden, damit man sieht, dass es die Truppe gibt (gleiche Linie wie beim
   Deck Builder: Besitz ist ein Hinweis, keine Sperre). Etwas heller als is-used,
   weil das ein anderer Zustand ist: verbraucht gegen gerade nicht kombinierbar. */
.mt-arena-unit.is-monatsgesperrt { opacity: 0.46; filter: grayscale(0.8); }
.mt-arena-unit.is-monatsgesperrt:hover { opacity: 0.62; }
.mt-arena-unit.is-locked, .mt-arena-unit:disabled {
  opacity: 0.25; filter: grayscale(0.78) saturate(0.35); cursor: not-allowed;
}
.mt-arena-unit.is-locked:hover, .mt-arena-unit:disabled:hover {
  border-color: transparent; background: transparent; transform: none;
}
.mt-arena-unit-fallback {
  display: grid; place-items: center; aspect-ratio: 257 / 322; border-radius: 6px;
  background: var(--panel-inset); color: var(--panel-dim);
  font-size: 0.6rem; line-height: 1.15; padding: 2px; text-align: center;
}
.mt-arena-hint { margin: 0.55rem 0 0; color: var(--panel-dim); font-size: 0.76rem; }
.mt-arena-hint:empty { display: none; }

.mt-arena-equipment, .mt-arena-modifiers {
  display: grid; grid-template-columns: repeat(auto-fill, minmax(52px, 1fr)); gap: 4px;
}
.mt-arena-equipment-card, .mt-arena-modifier-card {
  min-width: 0; display: grid; justify-items: center; gap: 2px; padding: 3px 2px;
  border: 1px solid transparent; border-radius: 5px; background: transparent;
  color: var(--panel-muted); cursor: pointer;
}
.mt-arena-equipment-card { cursor: grab; touch-action: pan-y pinch-zoom; }
.mt-arena-equipment-card img, .mt-arena-modifier-card img {
  display: block; width: 38px; height: 38px; object-fit: contain;
  pointer-events: none; user-select: none; -webkit-user-drag: none;
}
.mt-arena-equipment-card > span, .mt-arena-modifier-card > span {
  display: grid; place-items: center; width: 38px; height: 38px; border-radius: 5px;
  background: var(--panel-inset); color: var(--panel-dim); font-size: 0.62rem;
}
.mt-arena-modifier-card > .mt-arena-no-modifier-icon {
  border-radius: 0; background: transparent; color: var(--panel-dim);
  font-size: 1.55rem; font-weight: 500; line-height: 1;
}
.mt-arena-equipment-card b, .mt-arena-modifier-card b {
  display: block; width: 100%; overflow: hidden; color: inherit; font-size: 0.54rem;
  line-height: 1.1; text-overflow: ellipsis; white-space: nowrap;
}
.mt-arena-equipment-card:hover, .mt-arena-modifier-card:hover,
.mt-arena-equipment-card.active, .mt-arena-modifier-card.active {
  border-color: var(--primary); background: var(--panel-inset); color: var(--panel-text);
}
.mt-arena-equipment-card.active, .mt-arena-modifier-card.active { box-shadow: 0 0 0 1px var(--primary); }

.mt-arena-info {
  position: absolute; z-index: 12; left: var(--mt-info-x); top: var(--mt-info-y); width: 282px;
  padding: 0.65rem 0.7rem; border: 1px solid var(--panel-border); border-radius: 7px;
  background: var(--panel-bg); box-shadow: var(--panel-shadow); color: var(--panel-text);
  transform: translate(-50%, calc(-100% - 12px)); animation: clan-tooltip-in 0.14s ease-out;
}
.mt-arena-info::after {
  content: ""; position: absolute; left: 50%; bottom: -5px; width: 9px; height: 9px;
  border-right: 1px solid var(--panel-border); border-bottom: 1px solid var(--panel-border);
  background: color-mix(in srgb, var(--text-invert) 88%, var(--primary)); transform: translateX(-50%) rotate(45deg);
}
.mt-arena-info-close {
  position: absolute; top: 4px; right: 5px; width: 22px; height: 22px; padding: 0;
  border: 0; border-radius: 5px; background: transparent; color: var(--panel-dim); cursor: pointer;
}
.mt-arena-info-close:hover { color: var(--panel-text); background: var(--panel-inset); }
.mt-arena-info-head { display: flex; align-items: baseline; justify-content: space-between; gap: 0.5rem; padding-right: 1.35rem; }
.mt-arena-info-head strong { font-size: 0.82rem; }
.mt-arena-info-head span { color: var(--panel-dim); font-size: 0.58rem; }
.mt-arena-info-card {
  display: grid; grid-template-columns: 58px minmax(0, 1fr); align-items: start; gap: 0.65rem;
  margin-top: 0.55rem;
}
.mt-arena-info-card > img { display: block; width: 58px; aspect-ratio: 257 / 322; object-fit: contain; }
.mt-arena-info-card > p { margin: 0; color: var(--panel-muted); font-size: 0.62rem; line-height: 1.42; }
.mt-arena-info-details {
  margin-top: 0.58rem; padding-top: 0.08rem; border-top: 1px solid var(--panel-inset-border);
}
.mt-arena-info-row { display: flex; align-items: center; gap: 0.42rem; margin-top: 0.52rem; }
.mt-arena-info-row > img { width: 30px; height: 30px; object-fit: contain; }
.mt-arena-info-row > span { display: grid; min-width: 0; flex: 1; }
.mt-arena-info-row small { color: var(--panel-dim); font-size: 0.55rem; }
.mt-arena-info-row b { overflow: hidden; font-size: 0.68rem; text-overflow: ellipsis; white-space: nowrap; }
.mt-arena-info-row > button, .mt-arena-info-remove {
  padding: 0.18rem 0.35rem; border: 1px solid var(--panel-inset-border); border-radius: 5px;
  background: color-mix(in srgb, var(--loss) 7%, var(--panel-inset));
  border-color: color-mix(in srgb, var(--loss) 28%, var(--panel-inset-border));
  color: color-mix(in srgb, var(--loss) 72%, var(--panel-text)); font-size: 0.58rem; cursor: pointer;
  transition: background 0.16s ease, border-color 0.16s ease, color 0.16s ease;
}
.mt-arena-info-row > button:hover, .mt-arena-info-remove:hover {
  background: color-mix(in srgb, var(--loss) 13%, var(--panel-inset));
  border-color: color-mix(in srgb, var(--loss) 48%, var(--panel-inset-border));
  color: color-mix(in srgb, var(--loss) 88%, var(--panel-text));
}
.mt-arena-info-actions {
  display: flex; justify-content: center; margin-top: 0.56rem; padding-top: 0.48rem;
  border-top: 1px solid var(--panel-inset-border);
}
.mt-arena-info-remove { width: auto; margin: 0; padding: 0.24rem 0.48rem; }

.mt-arena-drag-ghost {
  position: fixed; z-index: 9999; display: grid; place-items: center; width: 74px; pointer-events: none;
  transform: translate(-50%, -58%); filter: drop-shadow(0 9px 9px color-mix(in srgb, var(--text-invert) 68%, transparent));
}
.mt-arena-drag-ghost.is-equipment { width: 58px; }
.mt-arena-drag-ghost img { display: block; width: 100%; height: auto; object-fit: contain; }
.mt-arena-drag-ghost span { color: var(--panel-text); font-weight: 800; }
.mt-arena-is-dragging, .mt-arena-is-dragging * { cursor: grabbing; }

/* ---------- Merge Tactics tutorial ---------- */
.mt-tutorial { color: #eef3fb; }
.mt-tutorial-intro {
  position: relative; min-height: 330px; max-width: 1040px; margin: 0 auto; padding: 4.4rem 1.25rem 2.6rem;
  display: flex; align-items: center; overflow: hidden; isolation: isolate; scroll-margin-top: var(--mt-tutorial-sticky-top, 94px);
  background-image:
    linear-gradient(90deg, rgba(7, 11, 18, 0.98) 0%, rgba(7, 11, 18, 0.93) 39%, rgba(7, 11, 18, 0.38) 68%, rgba(7, 11, 18, 0.1) 100%),
    url("assets/merge-tactics/branding/season-banner-crop.jpg");
  background-size: cover; background-position: center;
}
.mt-tutorial-intro::after {
  content: ""; position: absolute; z-index: -1; inset: auto 0 0; height: 2px;
  background: linear-gradient(90deg, #42d5e2, rgba(66, 213, 226, 0.18) 48%, rgba(244, 201, 99, 0.22), #f4c963);
}
.mt-tutorial-intro-copy { max-width: 570px; }
.mt-tutorial-kicker, .mt-tutorial-heading > span {
  display: block; color: #f4c963; font-size: 0.7rem; font-weight: 900; text-transform: uppercase; letter-spacing: 0.08em;
}
.mt-tutorial-intro h3 { max-width: 16ch; margin: 0.4rem 0 0.65rem; color: #fff; font-size: 2.3rem; line-height: 1.08; letter-spacing: 0; }
.mt-tutorial-intro p { max-width: 58ch; margin: 0; color: rgba(238, 243, 251, 0.76); line-height: 1.62; }
.mt-tutorial-meta { display: flex; flex-wrap: wrap; gap: 0.8rem 1.2rem; margin-top: 1.25rem; color: rgba(238, 243, 251, 0.58); font-size: 0.72rem; font-weight: 750; }
.mt-tutorial-meta span + span { position: relative; }
.mt-tutorial-meta span + span::before { content: ""; position: absolute; left: -0.62rem; top: 0.25em; width: 1px; height: 0.9em; background: rgba(255, 255, 255, 0.22); }

.mt-tutorial-nav {
  position: sticky; top: var(--mt-tutorial-sticky-top, 94px); z-index: 9;
  display: grid; grid-template-columns: repeat(6, minmax(0, 1fr)); max-width: 1040px; margin: 0 auto;
  border-bottom: 1px solid rgba(255, 255, 255, 0.14); background: rgba(11, 16, 25, 0.97);
  box-shadow: 0 10px 20px rgba(0, 0, 0, 0.18); backdrop-filter: blur(14px); overflow: hidden;
}
.mt-tutorial-nav a {
  position: relative; z-index: 2; display: flex; align-items: center; justify-content: center; min-height: 44px; padding: 0.5rem 0.35rem;
  color: rgba(238, 243, 251, 0.54); font-size: 0.72rem; font-weight: 850; text-decoration: none; white-space: nowrap;
}
.mt-tutorial-nav a:hover, .mt-tutorial-nav a.active { color: #fff; background: rgba(255, 255, 255, 0.025); }
.mt-tutorial-indicator {
  position: absolute; z-index: 3; left: 0; bottom: 0; width: calc(100% / 6); height: 3px; pointer-events: none;
  background: linear-gradient(90deg, #42d5e2, #f4c963); box-shadow: 0 0 10px rgba(66, 213, 226, 0.36);
  transition: transform 380ms cubic-bezier(.22, 1, .36, 1), width 380ms cubic-bezier(.22, 1, .36, 1);
}

.mt-tutorial-document { max-width: 1040px; margin: 0 auto; padding: 0 1.25rem 3.5rem; }
.mt-tutorial-chapter { scroll-margin-top: calc(var(--mt-tutorial-sticky-top, 94px) + 58px); padding: 3.5rem 0 0; }
.mt-tutorial-chapter + .mt-tutorial-chapter { margin-top: 1.5rem; }
.mt-tutorial-heading { max-width: 760px; margin-bottom: 1.8rem; }
.mt-tutorial-heading h4 { margin: 0.36rem 0 0.46rem; color: #fff; font-size: 1.7rem; letter-spacing: 0; }
.mt-tutorial-heading p { margin: 0; color: rgba(226, 233, 248, 0.65); line-height: 1.6; }

.mt-rule-facts {
  display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); margin: 0 0 2.2rem;
  border-block: 1px solid rgba(255, 255, 255, 0.12); background: rgba(8, 12, 20, 0.24);
}
.mt-rule-facts > div { min-width: 0; padding: 1.15rem 1rem; border-left: 1px solid rgba(255, 255, 255, 0.1); }
.mt-rule-facts > div:first-child { border-left: 0; }
.mt-rule-facts strong { display: block; color: #fff; font-size: 1.5rem; line-height: 1; }
.mt-rule-facts span { display: block; margin-top: 0.35rem; color: #7ddce6; font-size: 0.72rem; font-weight: 850; text-transform: uppercase; letter-spacing: 0.05em; }
.mt-rule-facts small { display: block; margin-top: 0.35rem; color: rgba(226, 233, 248, 0.5); line-height: 1.35; }
.mt-tutorial-prose { color: rgba(226, 233, 248, 0.72); line-height: 1.65; }
.mt-tutorial-prose-two { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 2.4rem; }
.mt-tutorial-prose h5, .mt-position-rules b { margin: 0 0 0.38rem; color: #fff; font-size: 1rem; }
.mt-tutorial-prose p { margin: 0; }

.mt-tutorial-note {
  display: grid; grid-template-columns: 120px minmax(0, 1fr); align-items: start; gap: 1rem; margin-top: 1.8rem; padding: 1rem 1.1rem;
  border-left: 3px solid #56cad8; background: rgba(65, 198, 216, 0.07);
}
.mt-tutorial-note strong { color: #91e4eb; font-size: 0.76rem; text-transform: uppercase; letter-spacing: 0.05em; }
.mt-tutorial-note p { margin: 0; color: rgba(226, 233, 248, 0.69); line-height: 1.55; }
.mt-tutorial-note.is-warning { border-color: #f4c963; background: rgba(244, 201, 99, 0.07); }
.mt-tutorial-note.is-warning strong { color: #f4c963; }
.mt-tutorial-note.is-season { border-color: #a78bfa; background: rgba(139, 92, 246, 0.08); }
.mt-tutorial-note.is-season strong { color: #c4b5fd; }

.mt-round-flow { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 0; margin: 0; padding: 0; list-style: none; border-block: 1px solid rgba(255, 255, 255, 0.12); }
.mt-round-flow li { position: relative; display: grid; grid-template-columns: 34px minmax(0, 1fr); gap: 0.72rem; padding: 1.25rem 1rem; border-left: 1px solid rgba(255, 255, 255, 0.1); }
.mt-round-flow li:first-child { border-left: 0; }
.mt-round-flow i { color: #f4c963; font-size: 0.72rem; font-style: normal; font-weight: 900; }
.mt-round-flow h5 { margin: 0 0 0.34rem; color: #fff; font-size: 0.92rem; }
.mt-round-flow p { margin: 0; color: rgba(226, 233, 248, 0.6); font-size: 0.78rem; line-height: 1.5; }
.mt-observe-strip { display: flex; align-items: center; flex-wrap: wrap; gap: 0.65rem 1rem; margin-top: 1.2rem; color: rgba(226, 233, 248, 0.54); font-size: 0.72rem; }
.mt-observe-strip > span { color: #7ddce6; font-weight: 850; text-transform: uppercase; }
.mt-observe-strip b { font-weight: 750; }

.mt-merge-demo {
  display: grid; grid-template-columns: 1.3fr 36px 0.8fr 36px 1fr; align-items: center; gap: 0.5rem; min-height: 190px; padding: 1.2rem;
  border-block: 1px solid rgba(255, 255, 255, 0.12); background: rgba(8, 12, 20, 0.24);
}
.mt-merge-unit, .mt-merge-result, .mt-copy-ladder { display: grid; justify-items: center; text-align: center; }
.mt-merge-cards { position: relative; display: block; width: 110px; height: 105px; }
.mt-merge-cards img { position: absolute; top: 0; width: 78px; height: 105px; object-fit: contain; filter: drop-shadow(0 7px 10px rgba(0, 0, 0, 0.38)); }
.mt-merge-cards img:first-child { left: 0; transform: rotate(-4deg); }
.mt-merge-cards img:last-child { right: 0; transform: rotate(4deg); }
.mt-merge-unit strong, .mt-merge-result b { color: #fff; }
.mt-merge-unit small { color: rgba(226, 233, 248, 0.5); }
.mt-merge-arrow { color: rgba(125, 220, 230, 0.72); font-size: 1.6rem; text-align: center; }
.mt-merge-result img { width: 82px; height: 108px; object-fit: contain; filter: drop-shadow(0 7px 10px rgba(0, 0, 0, 0.38)); }
.mt-merge-result span { margin-top: 0.25rem; color: #f4c963; font-size: 0.72rem; font-weight: 850; }
.mt-copy-ladder { gap: 0.6rem; }
.mt-copy-ladder span { display: block; color: rgba(226, 233, 248, 0.68); font-size: 0.82rem; }
.mt-copy-ladder b { color: #fff; font-size: 1.1rem; }

.mt-economy-rules { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); margin-top: 1.7rem; border-block: 1px solid rgba(255, 255, 255, 0.1); }
.mt-economy-rules article { padding: 1rem; border-left: 1px solid rgba(255, 255, 255, 0.09); }
.mt-economy-rules article:first-child { border-left: 0; }
.mt-economy-rules span { color: #7ddce6; font-size: 0.65rem; font-weight: 900; text-transform: uppercase; letter-spacing: 0.06em; }
.mt-economy-rules h5 { margin: 0.25rem 0 0.38rem; color: #fff; font-size: 0.9rem; }
.mt-economy-rules p { margin: 0; color: rgba(226, 233, 248, 0.56); font-size: 0.76rem; line-height: 1.5; }
.mt-decision-table { margin-top: 1.5rem; border-top: 1px solid rgba(255, 255, 255, 0.11); }
.mt-decision-table > div { display: grid; grid-template-columns: 90px minmax(0, 1fr); gap: 1rem; padding: 0.78rem 0; border-bottom: 1px solid rgba(255, 255, 255, 0.09); }
.mt-decision-table b { color: #f4c963; font-size: 0.78rem; }
.mt-decision-table span { color: rgba(226, 233, 248, 0.67); font-size: 0.8rem; line-height: 1.5; }

.mt-board-lesson { display: grid; grid-template-columns: minmax(300px, 0.95fr) minmax(0, 1.05fr); gap: 2.5rem; align-items: center; }
.mt-board-diagram { padding: 0.8rem 1rem; border: 1px solid rgba(91, 203, 214, 0.2); background: rgba(8, 12, 20, 0.36); }
.mt-board-zone { display: block; padding: 0.38rem; color: rgba(226, 233, 248, 0.38); font-size: 0.64rem; font-weight: 850; text-align: center; text-transform: uppercase; letter-spacing: 0.08em; }
.mt-board-zone.is-enemy { border-bottom: 1px solid rgba(244, 201, 99, 0.16); color: rgba(244, 201, 99, 0.5); }
.mt-board-row { display: grid; grid-template-columns: repeat(4, 58px); justify-content: center; min-height: 83px; }
.mt-board-row.is-back { margin-left: 29px; }
.mt-board-row figure { position: relative; width: 58px; height: 72px; margin: 0; }
.mt-board-row img { width: 100%; height: 66px; object-fit: contain; filter: drop-shadow(0 6px 8px rgba(0, 0, 0, 0.4)); }
.mt-board-row figcaption { position: absolute; left: 50%; bottom: -2px; transform: translateX(-50%); color: #fff; font-size: 0.56rem; font-weight: 850; white-space: nowrap; }
.mt-position-rules { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 1.3rem 1.6rem; }
.mt-position-rules p { margin: 0.35rem 0 0; color: rgba(226, 233, 248, 0.6); font-size: 0.78rem; line-height: 1.55; }

.mt-season-chapter { position: relative; }
.mt-season-chapter::before { content: ""; position: absolute; top: 2.2rem; left: -1.25rem; right: -1.25rem; height: 3px; background: linear-gradient(90deg, #42d5e2, rgba(66, 213, 226, 0.14) 45%, rgba(244, 201, 99, 0.16), #f4c963); }
.mt-season-chapter .mt-tutorial-heading { padding-top: 1.5rem; }
.mt-season-snapshot { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); border-block: 1px solid rgba(255, 255, 255, 0.11); }
.mt-season-snapshot > div { padding: 1rem; border-left: 1px solid rgba(255, 255, 255, 0.09); }
.mt-season-snapshot > div:first-child { border-left: 0; }
.mt-season-snapshot span { display: block; margin-bottom: 0.35rem; color: rgba(226, 233, 248, 0.48); font-size: 0.65rem; text-transform: uppercase; }
.mt-season-snapshot strong { color: #fff; font-size: 0.82rem; }
.mt-orb-road { display: grid; grid-template-columns: 1fr 50px 1fr 50px 1fr; align-items: center; margin: 1.7rem 0; }
.mt-orb-road > div { text-align: center; }
.mt-orb-road span, .mt-orb-road small { display: block; color: rgba(226, 233, 248, 0.48); font-size: 0.68rem; }
.mt-orb-road b { display: block; margin: 0.25rem 0; color: #f4c963; font-size: 1.1rem; }
.mt-orb-road i { height: 1px; background: linear-gradient(90deg, rgba(66, 213, 226, 0.1), #42d5e2, rgba(244, 201, 99, 0.18)); }
.mt-season-compare { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 2rem; }
.mt-season-compare > div { padding: 1rem 1.1rem; border-left: 3px solid; }
.mt-season-compare .is-current { border-color: #4ade80; background: rgba(34, 197, 94, 0.06); }
.mt-season-compare .is-history { border-color: #f59e0b; background: rgba(245, 158, 11, 0.055); }
.mt-season-compare h5 { margin: 0 0 0.6rem; color: #fff; }
.mt-season-compare ul { margin: 0; padding-left: 1.05rem; color: rgba(226, 233, 248, 0.64); font-size: 0.78rem; line-height: 1.65; }

.mt-insight-links { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 0; margin-top: 2rem; border-block: 1px solid rgba(255, 255, 255, 0.11); }
.mt-insight-links a { min-width: 0; padding: 1rem; border-left: 1px solid rgba(255, 255, 255, 0.09); color: inherit; text-decoration: none; transition: background 0.16s ease; }
.mt-insight-links a:first-child { border-left: 0; }
.mt-insight-links a:hover { background: rgba(66, 213, 226, 0.06); }
.mt-insight-links span, .mt-insight-links small { display: block; color: rgba(226, 233, 248, 0.48); font-size: 0.66rem; line-height: 1.4; }
.mt-insight-links b { display: block; margin: 0.25rem 0; color: #7ddce6; font-size: 0.86rem; }

.mt-game-plan { border-block: 1px solid rgba(255, 255, 255, 0.11); }
.mt-game-plan article { display: grid; grid-template-columns: 46px minmax(0, 1fr); gap: 1rem; padding: 1rem 0; border-top: 1px solid rgba(255, 255, 255, 0.09); }
.mt-game-plan article:first-child { border-top: 0; }
.mt-game-plan i { display: grid; place-items: center; width: 34px; height: 34px; border: 1px solid rgba(66, 213, 226, 0.35); color: #7ddce6; font-style: normal; font-weight: 900; }
.mt-game-plan h5 { margin: 0 0 0.3rem; color: #fff; }
.mt-game-plan p { margin: 0; color: rgba(226, 233, 248, 0.64); line-height: 1.55; }
.mt-mistakes { margin-top: 2rem; }
.mt-mistakes h5 { margin: 0 0 0.8rem; color: #fff; font-size: 1rem; }
.mt-mistakes ul { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0; margin: 0; padding: 0; border-top: 1px solid rgba(255, 255, 255, 0.1); list-style: none; }
.mt-mistakes li { padding: 0.8rem 1rem 0.8rem 0; border-bottom: 1px solid rgba(255, 255, 255, 0.08); }
.mt-mistakes li:nth-child(even) { padding-left: 1rem; border-left: 1px solid rgba(255, 255, 255, 0.08); }
.mt-mistakes b, .mt-mistakes span { display: block; }
.mt-mistakes b { color: #f4c963; font-size: 0.78rem; }
.mt-mistakes span { margin-top: 0.22rem; color: rgba(226, 233, 248, 0.56); font-size: 0.74rem; line-height: 1.45; }
.mt-tutorial-sources { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 2rem; align-items: end; margin-top: 2.6rem; padding-top: 1.2rem; border-top: 1px solid rgba(255, 255, 255, 0.13); }
.mt-tutorial-sources span { color: #7ddce6; font-size: 0.65rem; font-weight: 900; text-transform: uppercase; }
.mt-tutorial-sources strong { display: block; margin-top: 0.25rem; color: #fff; }
.mt-tutorial-sources p { max-width: 70ch; margin: 0.4rem 0 0; color: rgba(226, 233, 248, 0.5); font-size: 0.74rem; line-height: 1.5; }
.mt-source-actions { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 0.7rem 1rem; }
.mt-source-actions a { color: #7ddce6; font-size: 0.72rem; font-weight: 800; text-decoration: none; }
.mt-source-actions a:hover { color: #fff; }

@media (max-width: 760px) {
  .mt-tutorial-intro { min-height: 340px; padding: 2.3rem 0.8rem 1.5rem; background-position: 62% center; }
  .mt-tutorial-intro::before { content: ""; position: absolute; z-index: -1; inset: 0; background: rgba(7, 11, 18, 0.24); }
  .mt-tutorial-intro-copy { max-width: 310px; }
  .mt-tutorial-intro h3 { max-width: 13ch; font-size: 1.75rem; }
  .mt-tutorial-intro p { font-size: 0.86rem; }
  .mt-tutorial-meta { gap: 0.55rem 0.9rem; font-size: 0.65rem; }
  .mt-tutorial-nav { grid-template-columns: repeat(6, minmax(108px, 1fr)); margin: 0; overflow-x: auto; overflow-y: hidden; }
  .mt-tutorial-nav a { min-width: 108px; }
  .mt-tutorial-document { padding: 0 0.8rem 2.5rem; }
  .mt-tutorial-chapter { scroll-margin-top: calc(var(--mt-tutorial-sticky-top, 94px) + 56px); padding-top: 2.6rem; }
  .mt-tutorial-heading h4 { font-size: 1.35rem; }
  .mt-rule-facts { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .mt-rule-facts > div:nth-child(3) { border-left: 0; border-top: 1px solid rgba(255, 255, 255, 0.1); }
  .mt-rule-facts > div:nth-child(4) { border-top: 1px solid rgba(255, 255, 255, 0.1); }
  .mt-tutorial-prose-two, .mt-season-compare, .mt-mistakes ul { grid-template-columns: 1fr; gap: 1.3rem; }
  .mt-tutorial-note { grid-template-columns: 1fr; gap: 0.35rem; }
  .mt-round-flow { grid-template-columns: 1fr; }
  .mt-round-flow li { border-left: 0; border-top: 1px solid rgba(255, 255, 255, 0.1); }
  .mt-round-flow li:first-child { border-top: 0; }
  .mt-merge-demo { grid-template-columns: 1fr; gap: 0.8rem; }
  .mt-merge-arrow { transform: rotate(90deg); }
  .mt-economy-rules { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .mt-economy-rules article:nth-child(3) { border-left: 0; border-top: 1px solid rgba(255, 255, 255, 0.09); }
  .mt-economy-rules article:nth-child(4) { border-top: 1px solid rgba(255, 255, 255, 0.09); }
  .mt-board-lesson { grid-template-columns: 1fr; gap: 1.6rem; }
  .mt-position-rules { grid-template-columns: 1fr; }
  .mt-season-chapter::before { left: -0.8rem; right: -0.8rem; }
  .mt-season-snapshot { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .mt-season-snapshot > div:nth-child(3) { border-left: 0; border-top: 1px solid rgba(255, 255, 255, 0.09); }
  .mt-season-snapshot > div:nth-child(4) { border-top: 1px solid rgba(255, 255, 255, 0.09); }
  .mt-orb-road { grid-template-columns: 1fr; gap: 0.7rem; }
  .mt-orb-road i { width: 1px; height: 18px; margin: auto; background: linear-gradient(#42d5e2, rgba(244, 201, 99, 0.2)); }
  .mt-insight-links { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .mt-insight-links a:nth-child(3) { border-left: 0; border-top: 1px solid rgba(255, 255, 255, 0.09); }
  .mt-insight-links a:nth-child(4) { border-top: 1px solid rgba(255, 255, 255, 0.09); }
  .mt-mistakes li:nth-child(even) { padding-left: 0; border-left: 0; }
  .mt-tutorial-sources { grid-template-columns: 1fr; align-items: start; }
  .mt-source-actions { justify-content: flex-start; }
}

@media (prefers-reduced-motion: reduce) {
  .mt-tutorial-indicator { transition: none; }
}

.mt-insights .mt-ruler-guide-card {
  padding: 1.1rem 0; border: 0; border-top: 1px solid rgba(255, 255, 255, 0.1); border-radius: 0;
  background: transparent; box-shadow: none;
}
.mt-insights .mt-ruler-guide-card + .mt-ruler-guide-card { margin-top: 0; }
.mt-insights .mt-ruler-guide-main { grid-template-columns: 132px minmax(0, 1fr); gap: 1.35rem; }
.mt-insights .mt-ruler-art-card { width: 124px; }
.mt-insights .mt-ruler-ability-block {
  margin-top: 0.7rem; padding: 0.6rem 0; border: 0; border-top: 1px solid rgba(247, 215, 122, 0.16); border-radius: 0;
  background: transparent;
}
.mt-insights .mt-ruler-ability-block > img { width: 46px; height: 46px; }
.mt-insights .mt-ruler-ability-placeholder { width: 44px; height: 44px; }
.mt-insights .mt-ruler-quest-block {
  padding: 0.6rem 0;
}
.mt-insights .mt-ruler-quest-block > img { width: 42px; height: 42px; }
.mt-insights .mt-ruler-skins { margin-left: 147px; }
.mt-insights .mt-ruler-skin-card { border: 0; border-radius: 0; background: transparent; }

.mt-quest-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0 1.4rem; }
.mt-quest-card {
  min-width: 0; padding: 0.9rem 0; border-bottom: 1px solid var(--panel-inset-border);
}
.mt-quest-card > header {
  display: grid; grid-template-columns: 58px minmax(0, 1fr); align-items: center; gap: 0.7rem;
}
.mt-quest-card > header .mt-ruler-art-card { width: 54px; }
.mt-quest-card > header span,
.mt-ruler-changes > span {
  color: var(--gold); font-size: 0.62rem; font-weight: 900; letter-spacing: 0.05em; text-transform: uppercase;
}
.mt-quest-card > header h5 { margin: 0.12rem 0 0; color: var(--panel-text); font-size: 0.95rem; }
.mt-quest-card .mt-ruler-ability-block {
  grid-template-columns: 36px minmax(0, 1fr); margin-top: 0.55rem; padding: 0.55rem 0;
}
.mt-quest-card .mt-ruler-ability-block > img,
.mt-quest-card .mt-ruler-ability-placeholder { width: 34px; height: 34px; }
.mt-quest-card .mt-ruler-quest-block { grid-template-columns: 36px minmax(0, 1fr); padding: 0.55rem 0; }
.mt-quest-card .mt-ruler-quest-block > img { width: 32px; height: 32px; }
.mt-ruler-changes { padding: 0.55rem 0; border-top: 1px solid var(--panel-inset-border); }
.mt-ruler-changes p { margin: 0.3rem 0 0; color: var(--panel-muted); font-size: 0.68rem; }
.mt-ruler-changes p b { color: var(--panel-text); }

.mt-insights .mt-trait-grid { margin-bottom: 2rem; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0 1.4rem; }
.mt-status-section + .mt-status-section { margin-top: 1.7rem; }
.mt-status-head {
  display: grid; grid-template-columns: 30px minmax(0, 1fr) auto; align-items: center; gap: 0.55rem;
  min-height: 58px; padding: 0.55rem 0.7rem; border-bottom: 1px solid rgba(255, 255, 255, 0.11);
}
.mt-status-icon { width: 27px; height: 27px; object-fit: contain; filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.5)); }
.mt-status-marker { width: 8px; height: 8px; margin-left: 9px; background: #e3b950; box-shadow: 0 0 9px rgba(227, 185, 80, 0.38); transform: rotate(45deg); }
.mt-status-head h5 { margin: 0; color: #fff; font-size: 0.88rem; letter-spacing: 0; }
.mt-status-head p { margin: 0.08rem 0 0; color: rgba(226, 233, 248, 0.45); font-size: 0.68rem; }
.mt-status-head > b { color: rgba(226, 233, 248, 0.48); font-size: 0.72rem; }
.mt-status-head > b strong,
.mt-status-head > b small { display: block; text-align: center; }
.mt-status-head > b strong { color: var(--panel-text); font-family: "Clash Display", sans-serif; font-size: 1rem; line-height: 1; }
.mt-status-head > b small { margin-top: 0.12rem; color: var(--panel-muted); font-size: 0.52rem; letter-spacing: 0.05em; text-transform: uppercase; }
.mt-status-season {
  margin-top: 2.4rem; border-top: 3px solid var(--gold); border-bottom: 1px solid var(--panel-inset-border);
  background: transparent; box-shadow: none;
}
.mt-status-season .mt-status-head {
  min-height: 66px; padding-inline: 0.7rem;
  background: linear-gradient(90deg, color-mix(in srgb, var(--gold) 6%, transparent), color-mix(in srgb, var(--panel-text) 3%, transparent) 58%, transparent);
}
.mt-status-season .mt-status-marker { background: var(--gold); }
.mt-status-active { border-top: 2px solid rgba(83, 210, 154, 0.82); background: linear-gradient(180deg, rgba(49, 166, 115, 0.09), transparent 125px); }
.mt-status-inactive { border-top: 2px solid rgba(238, 82, 99, 0.72); background: linear-gradient(180deg, rgba(166, 45, 61, 0.09), transparent 125px); }
.mt-status-active .mt-status-head { background: linear-gradient(90deg, rgba(60, 190, 135, 0.11), transparent 55%); }
.mt-status-inactive .mt-status-head { background: linear-gradient(90deg, rgba(206, 61, 78, 0.11), transparent 55%); }
.mt-status-inactive .mt-trait-grid { opacity: 0.5; filter: saturate(0.5); }

/* ---------- Merge Tactics: Balance Changes ----------
   Die Ansicht liegt auf denselben Flaechen wie Seasons (.mt-insights,
   .mt-insights-intro, .mt-status-section), deshalb steht hier nur, was die
   Change-Karten selbst brauchen. Zwei Karten pro Zeile am Desktop.
   Die vier Richtungsakzente sind exakt die bestehenden .mt-row.mt-tone-* Werte -
   keine neue Farbe im Projekt. */
.mt-bal-buff { --mt-bal-accent: 82, 194, 139; }
.mt-bal-card.is-buff { --mt-bal-accent: 82, 194, 139; }
.mt-bal-card.is-nerf { --mt-bal-accent: 232, 111, 145; }
.mt-bal-card.is-rework { --mt-bal-accent: 175, 118, 225; }
.mt-bal-card.is-neutral { --mt-bal-accent: 58, 201, 222; }

/* Feinjustierung der Balance-Hero-Renders. Gleiche Stellschrauben wie bei den
   Season-Portraits (right/bottom/width/max-height), nur nach Bild statt nach Season.
   Wichtig: die `[data-season="N"]`-Regeln weiter oben greifen auf dieses Intro
   ebenfalls, sind aber fuer die Portraits gemacht - `[data-art]` setzt deshalb
   zuerst die Grundwerte zurueck und justiert dann je Bild.
   Groesser = mehr `width`/`max-height`, tiefer = negativeres `bottom`,
   weiter links = groesseres `right`. */
.mt-balance-intro[data-art] .mt-scene-season {
  right: 34px; bottom: -14%; width: min(48%, 490px); max-height: 118%;
}
.mt-balance-intro[data-art="mini-pekka"] .mt-scene-season { bottom: -21%; }
.mt-balance-intro[data-art="giant-skeleton"] .mt-scene-season { bottom: -36%; }
.mt-balance-intro[data-art="archer-queen"] .mt-scene-season {
  right: 14px; bottom: -25%; width: min(55%, 565px); max-height: 132%;
}
/* Deutlich groesser, der Sockel wird zur Haelfte vom unteren Rand geschnitten, und
   das Motiv sitzt mittig im Lichtkegel (.mt-scene-spotlight, Mitte ~287px von rechts). */
.mt-balance-intro[data-art="x-bow"] .mt-scene-season {
  right: -14px; bottom: -30%; width: min(66%, 680px); max-height: 158%;
}
/* Um 10 Grad im Uhrzeigersinn gedreht, Groesse wie zuerst festgelegt und nur tiefer
   gesetzt. `rotate` statt `transform`, damit die Einblend-Animation (transform) nicht
   kollidiert. */
.mt-balance-intro[data-art="inferno-tower"] .mt-scene-season {
  rotate: 10deg; right: 20px; bottom: -40%; width: min(60%, 620px); max-height: 158%;
}
.mt-balance-intro[data-art="golden-knight"] .mt-scene-season { bottom: -21%; }
.mt-balance-intro[data-art="witch"] .mt-scene-season { right: 64px; bottom: -19%; }
.mt-balance-intro[data-art="princess"] .mt-scene-season {
  right: 40px; bottom: -27%; width: min(56%, 575px); max-height: 134%;
}
.mt-balance-intro[data-art="skeleton-dragons"] .mt-scene-season {
  bottom: 2%; width: min(60%, 620px); max-height: 128%;
}
/* Groesser und so tief, dass die Fuesse unter dem Rand verschwinden. */
.mt-balance-intro[data-art="electro-giant"] .mt-scene-season {
  bottom: -30%; width: min(55%, 565px); max-height: 136%;
}
.mt-balance-intro[data-art="knight"] .mt-scene-season { right: 14px; bottom: -22%; }
.mt-balance-intro[data-art="tomb-queen"] .mt-scene-season { right: 24px; bottom: -20%; }
.mt-balance-intro[data-art="king"] .mt-scene-season {
  right: 92px; bottom: -12%; width: min(38%, 390px); max-height: 100%;
}
.mt-balance-intro[data-art="spirit-empress"] .mt-scene-season {
  right: 94px; bottom: -20%; width: min(46%, 470px); max-height: 124%;
}

/* Waehrend das neue Hero-Bild laedt, bleibt das Element unsichtbar - sonst steht
   kurz noch das Bild des vorigen Updates da. */
.mt-balance-intro .mt-scene-season.is-swapping { visibility: hidden; }

/* Die Drachen gehoeren nur zum Launch-Update mit der Spirit Empress. */
.mt-balance-intro .mt-scene-dragon { display: none; }
.mt-balance-intro.has-dragons .mt-scene-dragon { display: block; }

/* Zaehler im Intro, gleiche Bauart wie die Kennzahlen der Season-Ansicht. */
.mt-balance-counts { display: flex; flex-wrap: wrap; gap: 0.4rem; margin-top: 0.9rem; }
.mt-bal-count {
  display: inline-flex; align-items: center; gap: 0.32rem; padding: 0.32rem 0.6rem;
  border: 1px solid var(--panel-inset-border); border-radius: 7px; background: var(--panel-inset);
}
.mt-bal-count strong {
  color: var(--panel-text); font-family: "Clash Display", sans-serif; font-size: 0.95rem; line-height: 1;
}
.mt-bal-count small {
  color: var(--panel-muted); font-size: 0.56rem; font-weight: 900;
  letter-spacing: 0.07em; text-transform: uppercase;
}
.mt-bal-count i { width: 8px; height: 8px; flex: none; }
.mt-bal-count.is-buff i { background: rgb(82, 194, 139); clip-path: polygon(50% 0, 100% 100%, 0 100%); }
.mt-bal-count.is-nerf i { background: rgb(232, 111, 145); clip-path: polygon(50% 100%, 0 0, 100% 0); }
.mt-bal-count.is-rework i { background: rgb(175, 118, 225); clip-path: polygon(50% 0, 100% 50%, 50% 100%, 0 50%); }
.mt-bal-count.is-neutral i { background: rgb(58, 201, 222); border-radius: 50%; }

/* Kategorien tragen denselben Kapitel-Kopf wie "New Ruler" in der Season-Ansicht. */
.mt-bal-category { padding-top: 2rem; }
.mt-bal-category + .mt-bal-category { padding-top: 2.6rem; }
.mt-bal-category .mt-chapter-head { margin-bottom: 1.2rem; }
/* Drei Karten pro Zeile, wo der Platz reicht - auto-fill statt fester Spaltenzahl,
   damit die Karten nicht bei jeder Breite neu ausgerechnet werden muessen. */
.mt-bal-grid {
  display: grid; grid-template-columns: repeat(auto-fill, minmax(330px, 1fr));
  gap: 0.55rem; padding: 0.2rem 0 0.3rem;
}
.mt-bal-card {
  display: flex; flex-direction: column; min-width: 0; padding: 0.7rem 0.8rem 0.6rem;
  border: 1px solid rgba(255, 255, 255, 0.1); border-radius: 9px;
  background:
    linear-gradient(90deg, rgba(var(--mt-bal-accent), 0.11), transparent 34%),
    linear-gradient(145deg, rgba(25, 34, 51, 0.94), rgba(11, 16, 26, 0.98));
  box-shadow: inset 2px 0 0 rgba(var(--mt-bal-accent), 0.72);
  transition: border-color 160ms ease, filter 160ms ease;
}
.mt-bal-card:hover { border-color: rgba(var(--mt-bal-accent), 0.46); filter: brightness(1.06); }

/* Kein Rahmen und keine Box um die Grafik - sie steht frei und behaelt ihr
   Seitenverhaeltnis, damit Karten (257x322) nicht gequetscht wirken. */
.mt-bal-card-head {
  display: grid; grid-template-columns: auto minmax(0, 1fr) auto; align-items: center;
  gap: 0.6rem; padding-bottom: 0.55rem; border-bottom: 1px solid var(--panel-inset-border);
}
.mt-bal-card-art {
  width: 40px; height: auto; max-height: 50px; object-fit: contain;
  filter: drop-shadow(0 2px 5px rgba(0, 0, 0, 0.5));
}
.mt-bal-card-art.is-traits, .mt-bal-card-art.is-modifiers, .mt-bal-card-art.is-equipment { width: 34px; }
.mt-bal-card-art.is-blank { width: 34px; height: 34px; }
.mt-bal-card-head b {
  min-width: 0; color: #fff; font-size: 0.92rem; font-weight: 850; line-height: 1.2;
}

/* Cards und Rulers: Portrait links, Stats rechts daneben, getrennt durch eine
   duenne Linie. Spart die Kopfzeile ueber den Stats und damit Hoehe. */
.mt-bal-card.is-portrait {
  flex-direction: row; align-items: stretch; gap: 0.75rem; padding: 0.6rem 0.75rem;
}
.mt-bal-card-figure { position: relative; flex: none; align-self: center; }
.mt-bal-card.is-portrait .mt-bal-card-art {
  display: block; width: 68px; max-height: none;
  filter: drop-shadow(0 3px 8px rgba(0, 0, 0, 0.55));
}
.mt-bal-card.is-portrait .mt-bal-card-art.is-blank { width: 68px; height: 85px; }
/* Die Elixier-Blase ist das bestehende .mt-card-elixir-badge aus der Season-Ansicht
   (Asset elixir-orange.png). Hier sitzt sie an der oberen linken Ecke des Portraits,
   nur die Position wird gesetzt - Groesse, Asset und Schrift kommen von dort. */
.mt-bal-card-figure .mt-card-elixir-badge { top: 4px; left: 4px; }
.mt-bal-card-body {
  display: flex; flex-direction: column; min-width: 0; flex: 1;
  padding-left: 0.75rem; border-left: 1px solid rgba(255, 255, 255, 0.075);
}
.mt-bal-card.is-portrait .mt-bal-card-head {
  grid-template-columns: minmax(0, 1fr) auto; gap: 0.4rem 0.5rem; padding-bottom: 0.42rem;
}
/* Traits laufen unter dem Namen ueber die ganze Kopfbreite. */
.mt-bal-card-traits { grid-column: 1 / -1; display: flex; flex-wrap: wrap; gap: 0.28rem; }
.mt-bal-trait {
  display: inline-flex; align-items: center; gap: 0.22rem;
  padding: 0.08rem 0.34rem 0.08rem 0.16rem; border-radius: 5px;
  background: rgba(255, 255, 255, 0.06); color: var(--panel-muted);
  font-size: 0.62rem; font-weight: 800;
}
.mt-bal-trait img { width: 15px; height: 15px; object-fit: contain; }

/* Richtungs-Badge im Design der Builder-Badges: dunkler Chip, Text als Verlauf.
   Der Rahmen traegt die Richtungsfarbe, direkt darunter liegt eine duenne weisse
   Innenlinie plus ein weisser Verlauf von oben. Die farbige Kante mit dem hellen
   Kern dahinter liest sich wie ein Laser. Kein Puls, kein farbiger Schlagschatten -
   der Schatten bleibt dunkel wie bei den Builder-Badges. */
.mt-bal-badge.is-buff { --mt-bal-accent: 82, 194, 139; }
.mt-bal-badge.is-nerf { --mt-bal-accent: 232, 111, 145; }
.mt-bal-badge.is-rework { --mt-bal-accent: 175, 118, 225; }
.mt-bal-badge.is-neutral { --mt-bal-accent: 58, 201, 222; }
/* Doppelte Klasse, weil .builder-badge weiter unten in der Datei steht und bei
   gleicher Spezifitaet sonst gewinnt. */
.builder-badge.mt-bal-badge {
  align-self: center;
  border-color: rgba(var(--mt-bal-accent), 0.85);
  background:
    linear-gradient(180deg, rgba(255, 255, 255, 0.17), rgba(255, 255, 255, 0.04) 48%, rgba(255, 255, 255, 0) 78%),
    #14161c;
  box-shadow:
    inset 0 0 0 1px rgba(255, 255, 255, 0.2),
    0 1px 5px rgba(0, 0, 0, 0.22);
}
.mt-bal-badge.is-buff span {
  background-image: linear-gradient(100deg, #1c6b45 6%, #3fae7c 28%, #d9ffe9 46%, #52c28b 62%, #1c6b45 88%);
  filter: drop-shadow(0 1px 4px rgba(82, 194, 139, 0.22));
}
.mt-bal-badge.is-nerf span {
  background-image: linear-gradient(100deg, #7d2740 6%, #d05f7e 28%, #ffe1ea 46%, #e86f91 62%, #7d2740 88%);
  filter: drop-shadow(0 1px 4px rgba(232, 111, 145, 0.22));
}
.mt-bal-badge.is-rework span {
  background-image: linear-gradient(100deg, #5b2c86 6%, #9a63d1 28%, #f1e2ff 46%, #af76e1 62%, #5b2c86 88%);
  filter: drop-shadow(0 1px 4px rgba(175, 118, 225, 0.22));
}
.mt-bal-badge.is-neutral span {
  background-image: linear-gradient(100deg, #176577 6%, #3aa8bd 28%, #dcf7ff 46%, #3ac9de 62%, #176577 88%);
  filter: drop-shadow(0 1px 4px rgba(58, 201, 222, 0.22));
}

.mt-bal-stats { display: flex; flex-direction: column; margin: 0; padding: 0; list-style: none; }
.mt-bal-stat {
  display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: baseline;
  gap: 0.5rem; padding: 0.42rem 0;
}
.mt-bal-stat + .mt-bal-stat { border-top: 1px solid rgba(255, 255, 255, 0.055); }
.mt-bal-stat-name { color: var(--panel-muted); font-size: 0.78rem; font-weight: 650; }
/* Trait-Stufe steht als kleine Marke am Namen: "Shield 4+". */
.mt-bal-stat-name em {
  margin-left: 0.34rem; padding: 0.04rem 0.28rem; border-radius: 4px;
  background: rgba(255, 255, 255, 0.07); color: var(--panel-dim);
  font-size: 0.6rem; font-style: normal; font-weight: 900;
}
/* Alter Wert bleibt gedaempft stehen, neuer Wert fett. Kein Durchstreichen, kein
   Textpfeil - getrennt wird mit einer Linie, die Richtung zeigt ein CSS-Dreieck. */
.mt-bal-values {
  display: flex; align-items: center; justify-content: flex-end; flex-wrap: wrap;
  gap: 0.1rem 0.5rem; min-width: 0; text-align: right; font-variant-numeric: tabular-nums;
}
.mt-bal-old { color: var(--panel-dim); font-size: 0.78rem; }
.mt-bal-new {
  display: inline-flex; align-items: center; gap: 0.32rem;
  color: var(--panel-text); font-size: 0.86rem; font-weight: 900;
}
.mt-bal-old + .mt-bal-new { padding-left: 0.5rem; border-left: 1px solid rgba(255, 255, 255, 0.14); }
.mt-bal-new i { width: 8px; height: 8px; flex: none; }
.mt-bal-stat.is-buff .mt-bal-new i { background: rgb(82, 194, 139); clip-path: polygon(50% 0, 100% 100%, 0 100%); }
.mt-bal-stat.is-nerf .mt-bal-new i { background: rgb(232, 111, 145); clip-path: polygon(50% 100%, 0 0, 100% 0); }
.mt-bal-stat.is-rework .mt-bal-new i { background: rgb(175, 118, 225); clip-path: polygon(50% 0, 100% 50%, 50% 100%, 0 50%); }
.mt-bal-stat.is-neutral .mt-bal-new i { background: rgb(58, 201, 222); border-radius: 50%; }
/* Lange Prosa ("Ability", "Effect") passt nicht nebeneinander. */
.mt-bal-stat.has-prose { grid-template-columns: minmax(0, 1fr); }
.mt-bal-stat.has-prose .mt-bal-values {
  justify-content: flex-start; flex-direction: column; align-items: flex-start;
  gap: 0.22rem; text-align: left;
}
.mt-bal-stat.has-prose .mt-bal-old,
.mt-bal-stat.has-prose .mt-bal-new { font-size: 0.78rem; font-weight: 650; line-height: 1.45; }
.mt-bal-stat.has-prose .mt-bal-new { align-items: flex-start; font-weight: 800; }
.mt-bal-stat.has-prose .mt-bal-old + .mt-bal-new { padding-left: 0; border-left: 0; }
.mt-bal-stat.has-prose .mt-bal-new i { margin-top: 0.36rem; }
.mt-bal-stat-note {
  grid-column: 1 / -1; margin-top: 0.18rem;
  color: var(--panel-dim); font-size: 0.66rem; line-height: 1.4;
}
.mt-bal-source { margin: 1.4rem 0 0; text-align: center; }
.mt-bal-source a { color: var(--panel-muted); font-size: 0.72rem; font-weight: 800; }
.mt-bal-source a:hover { color: var(--panel-text); }
.mt-insights .mt-trait-card {
  padding: 0.9rem 0.7rem; border: 0; border-bottom: 1px solid rgba(255, 255, 255, 0.09); border-radius: 0;
  background: transparent;
}
.mt-insights .mt-trait-head { grid-template-columns: 34px minmax(0, 1fr) auto; }
.mt-insights .mt-trait-head b {
  min-width: 23px; height: 23px; border: 1px solid rgba(79, 213, 224, 0.22); border-radius: 3px;
  background: transparent; color: rgba(128, 229, 237, 0.85);
}
.mt-insights .mt-thresholds { display: grid; gap: 0; margin-top: 0.6rem; }
.mt-insights .mt-thresholds span {
  display: grid; grid-template-columns: 26px minmax(0, 1fr); gap: 0.45rem; align-items: baseline;
  padding: 0.28rem 0; border-top: 1px solid rgba(255, 255, 255, 0.06); border-radius: 0;
  background: transparent; color: rgba(226, 233, 248, 0.66); font-size: 0.72rem;
}
.mt-insights .mt-thresholds span b { color: #f0c963; font-variant-numeric: tabular-nums; }
.mt-trait-units {
  display: flex; flex-wrap: wrap; gap: 0.62rem; margin-top: 0.68rem; padding: 0.72rem 0 0.15rem 0.3rem;
  border-top: 1px solid rgba(255, 255, 255, 0.08);
}
.mt-trait-units > button {
  position: relative; width: 32px; aspect-ratio: 257 / 322; overflow: visible; display: grid; place-items: center;
  padding: 0; font: inherit; cursor: pointer;
  border: 1px solid rgba(255, 255, 255, 0.18); border-radius: 3px; background: rgba(7, 11, 18, 0.65);
  box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
}
.mt-trait-units > button:hover { border-color: rgba(109, 221, 232, 0.7); transform: translateY(-1px); }
.mt-trait-units > button:focus-visible { outline: 2px solid #72dce7; outline-offset: 3px; }
.mt-trait-units > button > img:not(.mt-orb-lock) { width: 100%; height: 100%; object-fit: cover; border-radius: 2px; }
.mt-trait-units i { color: rgba(238, 243, 251, 0.72); font-size: 0.57rem; font-style: normal; font-weight: 900; }
.mt-trait-units .mt-orb-lock {
  position: absolute; z-index: 6; right: 1px; top: 1px; width: 14px; height: 14px; object-fit: contain;
  filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.9));
}
.mt-orb-note {
  display: grid; grid-template-columns: 34px minmax(0, 1fr); gap: 0.7rem; align-items: center;
  margin: 0.3rem 0 2.1rem; padding: 0.75rem 0.7rem; border-top: 1px solid rgba(244, 198, 92, 0.28);
  border-bottom: 1px solid rgba(244, 198, 92, 0.12); background: rgba(244, 198, 92, 0.035);
}
.mt-orb-note > img { width: 30px; height: 30px; object-fit: contain; filter: drop-shadow(0 3px 5px rgba(0, 0, 0, 0.45)); }
.mt-orb-note p { margin: 0; }
.mt-orb-note b { display: block; color: #f4ce73; font-size: 0.76rem; }
.mt-orb-note span { display: block; margin-top: 0.12rem; color: rgba(226, 233, 248, 0.6); font-size: 0.7rem; line-height: 1.4; }
.mt-orb-guide { margin-top: 2.8rem; }
.mt-orb-guide-head,
.mt-quest-orb-guide > header,
.mt-modifier-orb-guide > header {
  display: grid; min-height: 66px; align-content: center; padding: 0.55rem 0.7rem;
  border-top: 3px solid var(--gold); border-bottom: 1px solid var(--panel-inset-border);
  background: linear-gradient(90deg, color-mix(in srgb, var(--gold) 6%, transparent), color-mix(in srgb, var(--panel-text) 3%, transparent) 58%, transparent);
}
.mt-orb-guide h5,
.mt-orb-guide h6 { margin: 0; color: var(--panel-text); }
.mt-orb-guide-head h5 { font-size: 0.88rem; }
.mt-orb-guide-head p,
.mt-quest-orb-guide > header p,
.mt-modifier-orb-guide > header p {
  margin: 0.08rem 0 0; color: var(--panel-muted); font-size: 0.68rem;
}
.mt-orb-exclusive {
  display: grid; grid-template-columns: minmax(220px, 0.7fr) minmax(0, 1.3fr); align-items: center; gap: 1rem;
  padding: 0.85rem 0.7rem; border-bottom: 1px solid var(--panel-inset-border);
}
.mt-orb-exclusive-copy {
  display: grid; grid-template-columns: 34px minmax(0, 1fr); align-items: center; gap: 0.65rem;
}
.mt-orb-exclusive-copy > img { width: 30px; height: 30px; object-fit: contain; }
.mt-orb-exclusive-copy h6 { font-size: 0.82rem; }
.mt-orb-exclusive-copy p { margin: 0.12rem 0 0; color: var(--panel-muted); font-size: 0.68rem; }
.mt-orb-source-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0 1.5rem; }
.mt-orb-family-card { min-width: 0; padding: 1rem 0.7rem; border-bottom: 1px solid var(--panel-inset-border); }
.mt-orb-family-card > header,
.mt-quest-orb-tier > header {
  display: grid; grid-template-columns: 58px minmax(0, 1fr); align-items: center; gap: 0.7rem;
}
.mt-orb-family-card > header > img,
.mt-quest-orb-tier > header > img {
  width: 54px; height: 54px; object-fit: contain; filter: drop-shadow(0 4px 7px color-mix(in srgb, var(--panel-dim) 55%, transparent));
}
.mt-orb-family-card > header span,
.mt-quest-orb-tier > header span {
  color: var(--gold); font-size: 0.58rem; font-weight: 900; letter-spacing: 0.05em; text-transform: uppercase;
}
.mt-orb-family-card > header h6,
.mt-quest-orb-tier > header h6 { margin-top: 0.08rem; font-size: 0.86rem; }
.mt-orb-family-card > p {
  margin: 0.55rem 0 0; color: var(--panel-muted); font-size: 0.7rem; line-height: 1.45;
}
.mt-orb-version-list { margin-top: 0.75rem; }
.mt-orb-version-list > section + section { margin-top: 0.8rem; padding-top: 0.8rem; border-top: 1px solid var(--panel-inset-border); }
.mt-orb-version-list > section > small,
.mt-orb-family-note {
  display: block; color: var(--panel-dim); font-size: 0.58rem; font-weight: 800; text-transform: uppercase;
}
.mt-orb-rule {
  display: grid; grid-template-columns: 74px minmax(0, 1fr); gap: 0.25rem 0.55rem; align-items: baseline;
  padding-top: 0.48rem;
}
.mt-orb-rule > b { color: var(--gold); font-size: 0.66rem; }
.mt-orb-rule > span { color: var(--panel-muted); font-size: 0.66rem; line-height: 1.4; }
.mt-orb-rule .mt-orb-card-strip { grid-column: 2; }
.mt-building-orb-schedule {
  display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); margin: 0.75rem 0;
  border-block: 1px solid var(--panel-inset-border);
}
.mt-building-orb-schedule > span { padding: 0.45rem; border-left: 1px solid var(--panel-inset-border); text-align: center; }
.mt-building-orb-schedule > span:first-child { border-left: 0; }
.mt-building-orb-schedule b,
.mt-building-orb-schedule small { display: block; }
.mt-building-orb-schedule b { color: var(--panel-text); font-size: 0.62rem; }
.mt-building-orb-schedule small { margin-top: 0.1rem; color: var(--gold); font-size: 0.55rem; }
.mt-orb-family-note { margin-top: 0.65rem; line-height: 1.4; text-transform: none; }
.mt-orb-card-strip { display: flex; flex-wrap: wrap; gap: 0.42rem; margin-top: 0.45rem; }
.mt-orb-card-strip > span {
  position: relative; display: grid; width: 38px; aspect-ratio: 257 / 322; place-items: center;
  border: 1px solid var(--panel-inset-border); border-radius: 3px; background: var(--panel-inset);
}
.mt-orb-card-strip > span > img { width: 100%; height: 100%; object-fit: cover; border-radius: 2px; }
.mt-orb-card-strip > span > i { color: var(--panel-muted); font-size: 0.56rem; font-style: normal; font-weight: 900; }
.mt-insights .mt-orb-card-strip .mt-card-elixir-badge {
  top: 1px; left: 1px; width: 13px; height: 13px; transform: translate(-50%, -50%);
}
.mt-insights .mt-orb-card-strip .mt-card-elixir-badge b {
  font-size: 0.45rem; line-height: 1; -webkit-text-stroke-width: 0.55px;
}
.mt-orb-card-strip.has-traits { gap: 0.58rem; }
.mt-orb-card-strip.has-traits > span { width: 44px; }
.mt-insights .mt-orb-card-strip.has-traits .mt-card-trait-badges {
  bottom: -8%; width: 56%;
}
.mt-insights .mt-orb-card-strip.has-traits .mt-card-trait-badges[data-count="1"] { width: 56%; }
.mt-orb-equipment-strip {
  display: flex; flex-wrap: wrap; gap: 0.5rem; margin-top: 0.5rem;
}
.mt-orb-equipment-strip > span {
  display: grid; width: 42px; height: 42px; place-items: center;
}
.mt-orb-equipment-strip img { width: 100%; height: 100%; object-fit: contain; }
.mt-orb-equipment-strip i {
  color: var(--panel-muted); font-size: 0.58rem; font-style: normal; font-weight: 900;
}
.mt-quest-orb-guide,
.mt-modifier-orb-guide { margin-top: 2rem; }
.mt-quest-orb-guide > header h6,
.mt-modifier-orb-guide > header h6 { font-size: 0.88rem; }
.mt-quest-orb-phase { padding: 1rem 0.7rem; border-bottom: 1px solid var(--panel-inset-border); }
.mt-quest-orb-phase-head { display: flex; align-items: baseline; justify-content: space-between; gap: 1rem; }
.mt-quest-orb-phase-head b { color: var(--panel-text); font-size: 0.78rem; }
.mt-quest-orb-phase-head span { color: var(--panel-dim); font-size: 0.6rem; }
.mt-orb-phase-summary { margin: 0.35rem 0 0; color: var(--panel-muted); font-size: 0.66rem; line-height: 1.45; }
.mt-quest-orb-tier-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 0.75rem; margin-top: 0.8rem; }
.mt-quest-orb-tier { min-width: 0; padding: 0.7rem; border: 1px solid var(--panel-inset-border); border-radius: 6px; background: var(--panel-inset); }
.mt-orb-reward-option { padding: 0.5rem 0; border-top: 1px solid var(--panel-inset-border); }
.mt-orb-reward-option > b { color: var(--panel-text); font-size: 0.66rem; }
.mt-orb-reward-option.is-elixir {
  margin-top: 0.5rem; padding: 0.5rem 0.58rem;
  border-top-color: color-mix(in srgb, var(--gold) 48%, transparent);
  background: linear-gradient(90deg, color-mix(in srgb, var(--gold) 10%, transparent), transparent);
}
.mt-orb-reward-option.is-elixir > b { color: var(--gold); font-size: 0.74rem; }
.mt-orb-reward-option > p { margin: 0.22rem 0 0; color: var(--panel-muted); font-size: 0.6rem; line-height: 1.4; }
.mt-modifier-orb-guide > article {
  display: grid; grid-template-columns: 46px minmax(0, 1fr); gap: 0.75rem; align-items: center;
  padding: 0.75rem 0.7rem; border-bottom: 1px solid var(--panel-inset-border);
}
.mt-modifier-orb-guide > article > img { width: 44px; height: 44px; object-fit: contain; }
.mt-modifier-orb-guide > article b { color: var(--panel-text); font-size: 0.72rem; }
.mt-modifier-orb-guide > article p { margin: 0.2rem 0 0; color: var(--panel-muted); font-size: 0.66rem; line-height: 1.45; }
.mt-orb-odds-note {
  margin: 1rem 0 0; padding: 0.7rem; border-block: 1px solid var(--panel-inset-border);
  color: var(--panel-muted); font-size: 0.64rem; line-height: 1.45;
}
.mt-orb-odds-note b { color: var(--gold); }
.mt-insights .mt-card-guide-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0 1.3rem; }
.mt-insights .mt-asset-group + .mt-asset-group { margin-top: 2rem; }
.mt-insights .mt-asset-group h4 { margin-bottom: 0.25rem; }
.mt-insights .mt-trait-guide h4 {
  margin-bottom: 0.82rem; padding-bottom: 0.42rem; border-bottom: 1px solid rgba(247, 215, 122, 0.14);
  font-size: 1rem;
}
.mt-insights .mt-trait-guide h4 img { width: 32px; height: 32px; }
.mt-insights .mt-asset-card.is-blog-card {
  grid-template-columns: 76px minmax(0, 1fr); align-items: start; gap: 0.75rem; min-height: 116px; padding: 0.65rem 0;
  border: 0; border-bottom: 1px solid rgba(255, 255, 255, 0.09); border-radius: 0; background: transparent;
}
.mt-insights .mt-asset-card.is-blog-card { scroll-margin-top: calc(var(--mt-insights-sticky-top, 94px) + 68px); }
.mt-insights .mt-asset-card.is-blog-card.is-jump-target {
  animation: mt-card-jump-pulse 900ms ease-out;
}
@keyframes mt-card-jump-pulse {
  0% { background: rgba(90, 213, 225, 0.16); box-shadow: inset 3px 0 0 rgba(105, 226, 236, 0.95); }
  100% { background: transparent; box-shadow: inset 3px 0 0 rgba(105, 226, 236, 0); }
}
.mt-insights .mt-asset-card.is-blog-card .mt-asset-caption { align-self: start; }
.mt-insights .mt-asset-card.is-blog-card .mt-card-shell,
.mt-insights .mt-asset-card.is-missing-card .mt-card-shell { width: 76px; }
.mt-insights .mt-card-shell { border-radius: 6px; box-shadow: 0 6px 13px rgba(0, 0, 0, 0.28); }
.mt-insights .mt-asset-card.is-blog-card .mt-card-shell { overflow: visible; }
.mt-insights .mt-asset-card.needs-frame .mt-card-shell {
  padding: 3px; border: 1px solid rgba(192, 203, 216, 0.42); border-radius: 6px;
  background: #171c25; box-shadow: 0 6px 13px rgba(0, 0, 0, 0.28);
}
.mt-insights .mt-asset-card.needs-frame .mt-card-shell::before {
  inset: 2px; border-radius: 4px; box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2);
}
.mt-insights .mt-asset-card.needs-frame .mt-card-shell::after { display: none; }
.mt-insights .mt-card-shell img { border-radius: 4px; }
.mt-insights .mt-asset-card.is-framed .mt-card-shell img { border-radius: 0; }
.mt-card-elixir-badge {
  position: absolute; z-index: 6; top: 0; left: 0; width: 30px; height: 30px;
  display: grid; place-items: center; background: url("assets/merge-tactics/elixir-orange.png") center / contain no-repeat;
  transform: translate(-50%, -50%); filter: drop-shadow(0 2px 2px rgba(0, 0, 0, 0.72)); pointer-events: none;
}
.mt-card-elixir-badge b {
  color: #fff; font-family: "Clash Display", sans-serif; font-size: 0.92rem; line-height: 1;
  -webkit-text-stroke: 1px #111; paint-order: stroke fill; text-shadow: 0 1px 1px rgba(0, 0, 0, 0.8);
}
/* Der Tropfen im Elixier-Asset hat seinen optischen Mittelpunkt unterhalb der
   Bildmitte, deshalb sitzt die Zahl etwas tiefer als geometrisch zentriert. */
.mt-asset-card .mt-card-elixir-badge b { transform: translateY(1.5px); }
.mt-insights .mt-asset-card.needs-frame .mt-card-elixir-badge { top: -1px; left: -1px; }
.mt-card-shell > .mt-card-lock {
  /* Ueber top/right verankert: eine Groessenaenderung waechst nach links unten,
     die obere rechte Ecke bleibt sitzen. */
  position: absolute; z-index: 6; top: 4%; right: 4%; width: 21px; height: 21px;
  object-fit: contain; border-radius: 0; filter: drop-shadow(0 2px 3px rgba(0, 0, 0, 0.9));
}
.mt-card-trait-badge {
  position: absolute; z-index: 6; left: 50%; bottom: 4%; width: 27%; aspect-ratio: 1;
  display: grid; place-items: center; transform: translateX(-50%); pointer-events: none;
}
.mt-card-trait-badges {
  position: absolute; z-index: 6; left: 50%; bottom: 6.7%;
  display: flex; justify-content: center; gap: 1px; width: 56%; transform: translateX(-50%); pointer-events: none;
}
.mt-card-trait-badges .mt-card-trait-badge {
  position: relative; inset: auto; flex: 0 0 48%; width: auto; transform: none;
}
.mt-card-trait-badges[data-count="1"] { width: 27%; }
.mt-card-trait-badges[data-count="1"] .mt-card-trait-badge { flex-basis: 100%; }
.mt-asset-card.needs-frame .mt-card-trait-badges { bottom: 6%; }
.mt-card-trait-badge img {
  position: absolute; display: block; border-radius: 0; object-fit: contain;
}
.mt-card-trait-bg { z-index: 1; inset: 0; width: 100%; height: 100%; }
.mt-card-trait-icon { z-index: 2; width: 68%; height: 68%; }
.mt-trait-units .mt-card-elixir-badge { top: -1px; left: -1px; width: 18px; height: 18px; transform: translate(-50%, -50%); }
.mt-trait-units .mt-card-elixir-badge b { font-size: 0.58rem; -webkit-text-stroke-width: 0.7px; }
.mt-trait-units .mt-card-trait-badges { bottom: 3%; width: 56%; }
.mt-trait-units .mt-card-trait-badges[data-count="1"] { width: 27%; }
.mt-insights .mt-asset-caption b { font-size: 0.91rem; }
.mt-insights .mt-asset-card.is-blog-card p { font-size: 0.78rem; }
.mt-card-stats-toggle {
  width: 100%; display: flex; align-items: center; justify-content: flex-start; gap: 0.38rem;
  margin-top: 0.48rem; padding: 0.36rem 0; border: 0; border-top: 1px solid rgba(255, 255, 255, 0.08);
  border-radius: 0; background: transparent; color: rgba(127, 224, 233, 0.86);
  font: inherit; font-size: 0.66rem; font-weight: 900; text-transform: uppercase; cursor: pointer;
}
.mt-card-stats-toggle i {
  width: 0; height: 0; border-top: 5px solid transparent; border-bottom: 5px solid transparent;
  border-left: 7px solid currentColor; transform-origin: 35% 50%; transition: transform 220ms ease;
}
.stats-open .mt-card-stats-toggle i { transform: rotate(90deg); }
.mt-card-stats-wrap {
  display: grid; grid-template-rows: 0fr; opacity: 0; transition: grid-template-rows 300ms cubic-bezier(.2, .8, .2, 1), opacity 220ms ease;
}
.mt-card-stats-wrap > div { min-height: 0; overflow: hidden; }
.stats-open .mt-card-stats-wrap { grid-template-rows: 1fr; opacity: 1; }
.mt-card-stats-panel { padding-top: 0.48rem; color: rgba(229, 236, 248, 0.75); font-size: 0.62rem; font-variant-numeric: tabular-nums; }
.mt-card-star-head, .mt-card-stat-series {
  display: grid; grid-template-columns: minmax(54px, 0.9fr) repeat(4, minmax(0, 1fr)); align-items: center; gap: 0.2rem;
}
.mt-card-star-head { color: #f1c95f; font-size: 0.42rem; text-align: center; }
.mt-card-star-head b { overflow: hidden; font-size: inherit; white-space: nowrap; }
.mt-card-stat-series { padding: 0.25rem 0; border-top: 1px solid rgba(255, 255, 255, 0.065); }
.mt-card-stat-series > b {
  color: rgba(239, 244, 252, 0.62); font-size: 0.59rem;
  overflow: visible; text-overflow: clip; white-space: normal;
}
.mt-card-stat-series > span { color: #fff; text-align: center; }
.mt-card-base-stats { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 0; margin: 0.42rem 0 0; }
.mt-card-base-stats div { min-width: 0; padding: 0 0.25rem; border-left: 1px solid rgba(255, 255, 255, 0.07); }
.mt-card-base-stats div:first-child { padding-left: 0; border-left: 0; }
.mt-card-base-stats dt { color: rgba(226, 233, 248, 0.45); font-size: 0.52rem; line-height: 1.2; }
.mt-card-base-stats dd { margin: 0.13rem 0 0; color: rgba(255, 255, 255, 0.9); font-weight: 850; overflow-wrap: anywhere; }
.mt-card-ability-stats { display: grid; gap: 0.2rem; margin-top: 0.45rem; padding-top: 0.4rem; border-top: 1px solid rgba(255, 255, 255, 0.07); }
.mt-card-ability-stats span { color: rgba(176, 224, 230, 0.76); line-height: 1.35; }
.mt-insights .mt-card-meta {
  margin: 0.5rem 0 0; padding-top: 0.36rem; border-top: 1px solid rgba(255, 255, 255, 0.07);
}
.mt-insights .mt-card-cost {
  width: auto; height: 22px; min-height: 0; padding: 0;
  display: inline-flex; align-items: center; gap: 0.17rem;
  border: 0; border-radius: 0; background: transparent; box-shadow: none;
}
.mt-insights .mt-card-cost img { width: 17px; height: 17px; transform: translateY(1px); }
.mt-insights .mt-card-cost b {
  position: static; color: #fff; font-size: 0.72rem; font-weight: 950; line-height: 1; text-shadow: none;
}
.mt-insights .mt-card-cost small { margin-left: -0.04rem; color: rgba(226, 233, 248, 0.48); font-size: 0.61rem; font-weight: 800; text-transform: uppercase; }
.mt-insights .mt-asset-card.is-placeholder { opacity: 1; filter: none; }

.mt-equipment-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); column-gap: 1.5rem; }
.mt-equipment-group + .mt-equipment-group { margin-top: 2rem; }
.mt-equipment-group > header {
  display: grid; min-height: 66px; align-content: center; padding: 0.55rem 0.7rem;
  border-top: 3px solid var(--gold); border-bottom: 1px solid var(--panel-inset-border);
  background: linear-gradient(90deg, color-mix(in srgb, var(--gold) 6%, transparent), color-mix(in srgb, var(--panel-text) 3%, transparent) 58%, transparent);
}
.mt-equipment-group > header h5 { margin: 0; color: var(--panel-text); font-size: 0.88rem; }
.mt-equipment-group > header p { margin: 0.08rem 0 0; color: var(--panel-muted); font-size: 0.68rem; }
.mt-equipment-entry {
  display: grid; grid-template-columns: 58px minmax(0, 1fr); gap: 0.8rem; align-items: center;
  min-height: 96px; padding: 0.75rem 0; border-top: 1px solid rgba(255, 255, 255, 0.1);
}
.mt-equipment-entry img { width: 54px; height: 54px; object-fit: contain; filter: drop-shadow(0 5px 8px rgba(0, 0, 0, 0.4)); }
.mt-equipment-placeholder {
  width: 48px; height: 48px; border: 1px dashed var(--panel-inset-border); border-radius: 6px; background: var(--panel-inset);
}
.mt-equipment-trait-icon {
  display: grid; width: 54px; height: 54px; place-items: center;
  border: 0; border-radius: 0; background: transparent;
}
.mt-equipment-trait-icon img { width: 44px; height: 44px; }
.mt-equipment-entry h5 { margin: 0 0 0.22rem; color: #fff; font-size: 0.9rem; letter-spacing: 0; }
.mt-equipment-trait-label {
  display: block; margin-bottom: 0.2rem; color: var(--gold);
  font-size: 0.62rem; font-weight: 900; letter-spacing: 0.04em; text-transform: uppercase;
}
.mt-equipment-entry p { margin: 0; color: rgba(226, 233, 248, 0.68); font-size: 0.78rem; line-height: 1.42; }
.mt-season-empty {
  display: grid; gap: 0.2rem; min-height: 88px; place-content: center; padding: 1rem;
  border-block: 1px solid var(--panel-inset-border); color: var(--panel-muted); text-align: center;
}
.mt-season-empty b { color: var(--panel-text); font-size: 0.85rem; }
.mt-season-empty span { font-size: 0.74rem; }
.mt-insights[aria-busy="true"] .mt-insights-document,
.mt-insights[aria-busy="true"] .mt-insights-intro { opacity: 0.58; pointer-events: none; }
.mt-insights .mt-modifier-grid { grid-template-columns: repeat(auto-fill, minmax(120px, 1fr)); gap: 0; }
.mt-insights .mt-modifier-card {
  grid-template-columns: 54px minmax(0, 1fr); justify-items: start; align-items: center; gap: 0.55rem;
  padding: 0.65rem 0.4rem; border: 0; border-bottom: 1px solid rgba(255, 255, 255, 0.08); border-radius: 0;
  background: transparent; text-align: left;
}
.mt-insights .mt-modifier-icon {
  width: 52px; height: 52px; border-radius: 0; background: transparent; box-shadow: none; overflow: visible;
}
.mt-insights .mt-modifier-icon::before { inset: 0; z-index: 2; border-radius: 0; opacity: 1; }
.mt-insights .mt-modifier-icon > span {
  position: absolute; z-index: 1; left: 12.7px; top: 9.5px; width: 30.8px; height: 33.5px; overflow: hidden;
  clip-path: polygon(50% 0, 100% 24%, 100% 76%, 50% 100%, 0 76%, 0 24%);
}
.mt-insights .mt-modifier-icon > span img {
  position: absolute; left: calc(50% - 3px); top: calc(50% - 1px); width: 55px; height: 55px; max-width: none; object-fit: contain;
  transform: translate(-50%, -50%); filter: none;
}
.mt-modifier-summary {
  display: flex; flex-wrap: wrap; gap: 0.5rem; margin: 0 0 1rem;
}
.mt-modifier-summary span {
  display: inline-flex; align-items: baseline; gap: 0.35rem; min-height: 30px; padding: 0.36rem 0.55rem;
  border: 1px solid rgba(255, 255, 255, 0.09); border-radius: 4px;
  background: rgba(255, 255, 255, 0.035); color: rgba(226, 233, 248, 0.62);
  font-size: 0.7rem; font-weight: 850; text-transform: uppercase;
}
.mt-modifier-summary b { color: #f4c963; font-size: 0.88rem; }
.mt-status-ruler {
  border-top: 2px solid rgba(111, 212, 224, 0.76);
  background: linear-gradient(180deg, rgba(54, 169, 198, 0.08), transparent 125px);
}
.mt-status-unclassified {
  border-top: 2px solid rgba(227, 185, 80, 0.56);
  background: linear-gradient(180deg, rgba(227, 185, 80, 0.06), transparent 125px);
}
.mt-status-ruler .mt-status-head { background: linear-gradient(90deg, rgba(54, 169, 198, 0.1), transparent 55%); }
.mt-status-unclassified .mt-status-head { background: linear-gradient(90deg, rgba(227, 185, 80, 0.08), transparent 55%); }
.mt-modifier-detail-grid {
  display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0 1.2rem;
}
.mt-insights .mt-modifier-card.mt-modifier-detail-card {
  grid-template-columns: 58px minmax(0, 1fr); align-items: start; min-height: 132px; padding: 0.85rem 0.35rem 0.9rem;
}
.mt-modifier-copy { min-width: 0; }
.mt-modifier-copy h5 {
  margin: 0 0 0.26rem; color: #fff; font-size: 0.88rem; line-height: 1.15; letter-spacing: 0;
}
.mt-modifier-copy p {
  margin: 0; color: rgba(226, 233, 248, 0.7); font-size: 0.76rem; line-height: 1.43;
}
.mt-modifier-meta {
  display: flex; flex-wrap: wrap; gap: 0.35rem; margin-top: 0.54rem;
}
.mt-modifier-meta span,
.mt-modifier-meta a {
  min-height: 22px; padding: 0.23rem 0.42rem; border: 1px solid rgba(255, 255, 255, 0.08); border-radius: 3px;
  background: rgba(255, 255, 255, 0.035); color: rgba(226, 233, 248, 0.52);
  font-size: 0.63rem; font-weight: 850; line-height: 1.1; text-decoration: none;
}
.mt-modifier-meta a { color: rgba(111, 212, 224, 0.82); }
.mt-modifier-meta a:hover { color: #fff; border-color: rgba(111, 212, 224, 0.34); }
.mt-modifier-copy small {
  display: block; margin-top: 0.42rem; color: rgba(244, 201, 99, 0.68); font-size: 0.68rem; line-height: 1.35;
}
.mt-modifier-placeholder {
  display: block; width: 100%; height: 100%;
  background: radial-gradient(circle, rgba(226, 233, 248, 0.28), rgba(226, 233, 248, 0.05) 62%, transparent 70%);
}

#mt-info { display: none; }
.mt-row[class*="mt-tone-"]:not(.medal-1):not(.medal-2):not(.medal-3) {
  border-color: rgba(var(--mt-row-accent), 0.2);
  background:
    linear-gradient(90deg, rgba(var(--mt-row-accent), 0.13), transparent 24%, rgba(255, 255, 255, 0.025)),
    linear-gradient(145deg, rgba(25, 34, 51, 0.94), rgba(11, 16, 26, 0.98));
  box-shadow: inset 2px 0 0 rgba(var(--mt-row-accent), 0.72);
}
.mt-row.mt-tone-1 { --mt-row-accent: 58, 201, 222; }
.mt-row.mt-tone-2 { --mt-row-accent: 82, 194, 139; }
.mt-row.mt-tone-3 { --mt-row-accent: 175, 118, 225; }
.mt-row.mt-tone-4 { --mt-row-accent: 232, 111, 145; }
.mt-row { transition: border-color 160ms ease, transform 160ms ease, filter 160ms ease; }
.mt-row:hover { border-color: rgba(var(--mt-row-accent, 113, 220, 232), 0.46); filter: brightness(1.08); transform: translateX(2px); }
.mt-pager { margin: 0.75rem 0; }
@media (max-width: 820px) {
  .mt-top3, .mt-trait-grid, .mt-unit-grid, .mt-season-grid, .mt-tutorial-grid { grid-template-columns: 1fr; }
  /* Change-Karten stehen auf schmalen Schirmen einspaltig. */
  .mt-bal-grid { grid-template-columns: 1fr; }
  .mt-bal-category { padding-top: 1.4rem; }
  .mt-bal-category + .mt-bal-category { padding-top: 1.8rem; }
  .mt-bal-card.is-portrait .mt-bal-card-art { width: 58px; }
  .mt-board-head, .mt-section-head, .mt-season, .mt-hero { flex-direction: column; align-items: stretch; }
  .mt-title-lockup { justify-content: center; }
  .mt-logo { width: min(76vw, 280px); height: 64px; }
  /* Der negative obere Aussenabstand von -1rem zieht die Podestflaeche auf dem Desktop
     unter die Einleitung. Schmal ist die Einleitung drei Zeilen lang statt einer - die
     letzte Zeile verschwand dadurch hinter dem Podest (Eliass 15.08.2026). */
  .mt-leaderboard-stage { min-height: auto; margin-top: 0.7rem; padding: 1.35rem 0.65rem 0; }
  .mt-leaderboard-stage::before, .mt-leaderboard-stage::after { width: 46%; opacity: 0.44; }
  /* Die drei Plaetze stehen NEBENEINANDER, nicht untereinander (Eliass 16.08.2026).
     Untereinander war es kein Podest mehr, sondern eine Liste mit Stufen daneben.
     `1fr` statt fester Breiten: bei 375px bleiben nach der Buehnenpolsterung 342px,
     also rund 110px je Platz - jede feste Zahl waere bei 320px zu breit. Die
     Reihenfolge 2-1-3 ist dieselbe wie am Desktop, der Erste steht in der Mitte. */
  .mt-top3 { grid-template-columns: repeat(3, minmax(0, 1fr)); align-items: end; gap: 0.3rem; max-width: none; }
  .mt-top3::before { left: -4%; right: -4%; height: 54px; border-radius: 18px 18px 0 0; }
  /* Das Podest kostete 510px, bevor die eigentliche Rangliste anfing - auf dem Handy
     ist das mehr als ein halber Bildschirm fuer drei Namen (Eliass 15.08.2026). Karte,
     Stufe und Schrift eine Stufe kleiner; die Anmutung bleibt, der Platzbedarf halbiert
     sich. */
  /* Gestaffelte Hoehen statt einer gemeinsamen: erst der Hoehenunterschied macht aus
     drei Spalten ein Podest. Die Zahlen sind die Desktop-Staffelung (278/214/198),
     etwa halbiert. */
  .mt-podium { min-height: 0; padding: 0 0.1rem; }
  .mt-podium-1 { order: 2; min-height: 152px; }
  .mt-podium-2 { order: 1; min-height: 132px; }
  .mt-podium-3 { order: 3; min-height: 120px; }
  .mt-podium::before, .mt-podium-1::before, .mt-podium-2::before, .mt-podium-3::before {
    left: 6%; right: 6%; bottom: 34px; height: 62px;
  }
  .mt-podium-step, .mt-podium-2 .mt-podium-step { height: 30px; }
  .mt-podium-1 .mt-podium-step { height: 42px; }
  .mt-podium-3 .mt-podium-step { height: 24px; }
  .mt-podium-1 .mt-podium-step span { font-size: 1rem; }
  .mt-podium-2 .mt-podium-step span, .mt-podium-3 .mt-podium-step span { font-size: 0.82rem; }
  .mt-podium-player-card, .mt-podium-1 .mt-podium-player-card {
    /* Die 102px Mindesthoehe aus der Grundregel hielten die Karte auf Desktop-Mass,
       obwohl Rang, Name und Punktestand darin zusammen nur rund 70px brauchen. */
    width: 100%; min-height: 0; margin-bottom: 0.28rem; padding: 0.36rem 0.3rem 0.4rem;
  }
  /* Bei rund 110px Spaltenbreite ist jeder Name irgendwann zu lang - er wird
     abgekuerzt statt die Spalte aufzuziehen. `min-width: 0` gehoert dazu, sonst
     wehrt sich das Rasterkind gegen das Schrumpfen und alle drei werden breiter. */
  .mt-podium-name, .mt-podium-1 .mt-podium-name {
    display: block; max-width: 100%; min-width: 0; overflow: hidden;
    font-size: 0.74rem; text-overflow: ellipsis; white-space: nowrap;
  }
  /* Die Rangmarke im Kaertchen faellt weg: direkt darunter steht dieselbe Ziffer
     gross auf der Stufe. Zweimal derselbe Wert kostete rund 30 der 101px, die dem
     Namen fehlten - ohne sie gehoert ihm die ganze Kartenbreite. */
  .mt-podium-rank, .mt-podium-2 .mt-podium-rank, .mt-podium-3 .mt-podium-rank { display: none; }
  .mt-podium-score { min-height: 20px; gap: 0 0.2rem; }
  .mt-podium-score img { width: 14px; height: 14px; }
  .mt-podium-score b, .mt-podium-1 .mt-podium-score b { font-size: 0.76rem; }
  .mt-podium-score small { font-size: 0.5rem; }
  .mt-podium-player { display: none; }
  .mt-season-note { text-align: left; max-width: none; }
  .mt-leaderboard-tools { justify-content: stretch; flex-direction: column; align-items: stretch; }
  #mt-search { flex-basis: auto; width: 100%; max-width: none; }
  .mt-list-head { display: none; }
  /* Einzeiler wie in der Event-Rangliste: Rang und Name links, der Wert rechts aussen.
     Vorher fiel der Clan in eine zweite Zeile und jede Zeile war 69px hoch. */
  .mt-row {
    grid-template-columns: auto minmax(0, 1.6fr) minmax(0, 1fr) auto;
    align-items: center; gap: 0 0.55rem;
  }
  .mt-clan { grid-column: auto; grid-row: 1; }
  .mt-score { grid-column: auto; grid-row: 1; justify-content: flex-end; }
  .mt-card-guide-grid { grid-template-columns: 1fr; }
  .mt-asset-card.is-blog-card { grid-template-columns: 86px minmax(0, 1fr); min-height: 142px; gap: 0.68rem; }
  .mt-asset-card.is-blog-card .mt-card-shell,
  .mt-asset-card.is-missing-card .mt-card-shell { width: 86px; }
  .mt-ruler-guide-main { grid-template-columns: 1fr; text-align: center; }
  .mt-ruler-art-card { width: 136px; }
  .mt-ruler-ability-block { grid-template-columns: 44px minmax(0, 1fr); text-align: left; }
  .mt-ruler-ability-block > img { width: 44px; height: 44px; }
  .mt-ruler-ability-placeholder { width: 42px; height: 42px; }
  .mt-ruler-quest-block { grid-template-columns: 44px minmax(0, 1fr); text-align: left; }
  .mt-ruler-quest-block > img { width: 40px; height: 40px; }
  .mt-ruler-skin-grid { grid-template-columns: repeat(auto-fill, minmax(76px, 1fr)); }
  .mt-ruler-skin-card .mt-ruler-art-card { width: 64px; }
  /* Der Season-Kopf war schmal hoeher als am Desktop (330 gegen 310px) und zeigte
     den Ruler trotzdem nur 180x141 gross statt 461x360 - fast der ganze Kasten war
     leere dunkle Flaeche. Der Engpass ist die BREITE (`width: min(48%, 490px)`
     ergibt bei 375px eben 180px), nicht `max-height`. Der Kopf wird deshalb
     flacher und der Ruler zugleich deutlich groesser (Eliass 16.08.2026). */
  .mt-insights-intro {
    min-height: 250px; padding: 1.7rem 0.8rem 1.1rem;
    background: linear-gradient(90deg, rgba(8, 12, 20, 0.97) 0%, rgba(8, 12, 20, 0.82) 58%, rgba(8, 12, 20, 0.12) 100%);
  }
  .mt-insights-intro::after { width: 82%; }
  .mt-insights-intro-copy { max-width: 270px; }
  .mt-insights-intro h3 { font-size: 1.55rem; }
  /* Die Beschreibung faellt schmal weg: sie kostet 50px Hoehe genau dort, wo der
     Ruler stehen soll, und wiederholt, was Titel und Kapitel darunter ohnehin
     sagen. Beim Kopf der Balance Changes gilt dasselbe (Eliass 16.08.2026) - die
     Zaehler fuer Buffs und Nerfs bleiben, das sind Werte und keine Beschreibung.
     Gezielt ueber die beiden Kennungen, nicht ueber `.mt-insights-intro p`: unter
     dieser Klasse haengen auch Absaetze, die bleiben sollen. */
  #mt-season-summary,
  #mt-balance-summary { display: none; }
  /* Der Titel der Balance Changes nimmt schmal drei Zeilen ein und wiederholt, was
     der goldene Kicker darueber schon sagt - optisch faellt er deshalb weg
     (Eliass 16.08.2026). Bewusst NICHT `display: none`: das hier ist die `h1` der
     Seite. Ausgeblendet verloere die mobile Ansicht ihre Hauptueberschrift, fuer
     Screenreader wie fuer die Indexierung, die mobil zuerst liest. Der Text bleibt
     deshalb vorhanden und vorlesbar, belegt aber keinen Platz mehr. */
  #mt-balance-title {
    position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0;
    overflow: hidden; clip-path: inset(50%); white-space: nowrap;
  }
  /* Ohne den Titel traegt der Kicker den Kopf allein - auf 1.85rem lief er dabei
     selbst ueber drei Zeilen. Nur hier, nicht bei Seasons: dort heisst er nur
     "SEASON 10" und steht in einer Zeile. */
  .mt-balance-intro .mt-insights-intro-copy > span { font-size: 1.15rem; }
  /* Ohne Titel und Beschreibung bleiben nur Kicker, Datum und die Zaehler - der
     Kasten darf deshalb flacher sein als der Season-Kopf, und das Bild geht ein
     Stueck mit zurueck (Eliass 16.08.2026). */
  .mt-balance-intro { min-height: 180px; }
  /* Vier Bausteine, nicht drei: die allgemeine Regel `.mt-insights-intro
     [data-season] .mt-scene-season` steht in diesem Block WEITER UNTEN und gewinnt
     bei Gleichstand. Beide Klassen zusammen heben diese hier darueber. */
  .mt-insights-intro.mt-balance-intro[data-season] .mt-scene-season { width: min(66%, 250px); }
  /* Die Zaehler stehen unten buendig und in EINER Reihe, auch wenn sie dabei ueber
     dem Bild liegen - der Textblock liegt mit z-index 4 ohnehin vor Bild (2) und
     Farbverlauf (3).
     Bewusst NICHT ueber `position: absolute`: die Zaehler stecken im Textblock, und
     der ist selbst `position: relative`. Sie haetten sich an DESSEN Unterkante
     gehaengt - bei 59px Texthoehe also mitten in den Kicker hinein. Stattdessen
     wird der Textblock auf die voll Hoehe gezogen und `margin-top: auto` schiebt
     die Zaehler ans untere Ende (Eliass 16.08.2026). */
  .mt-balance-intro { display: flex; flex-direction: column; }
  .mt-balance-intro .mt-insights-intro-copy { display: flex; flex-direction: column; flex: 1; }
  .mt-balance-intro .mt-balance-counts {
    flex: none; flex-wrap: nowrap; gap: 0.3rem; margin-top: auto;
  }
  .mt-balance-intro .mt-bal-count { min-width: 0; padding: 0.26rem 0.42rem; }
  /* `[data-season]` ist noetig, damit die Regel die Season-eigenen Masse aus
     Zeile 6608ff schlaegt: die haben drei Bausteine, ein blosses
     `.mt-scene-season` nur einen und bliebe wirkungslos. Der Ruler darf jetzt
     hinter der Schrift liegen - er steht dort ohnehin hinter dem Farbverlauf. */
  .mt-insights-intro[data-season] .mt-scene-season {
    right: -34px; bottom: -18%; width: min(78%, 300px); max-height: 124%;
  }
  .mt-scene-spotlight { right: -26px; width: 330px; height: 380px; opacity: 0.6; }
  .mt-scene-empress { right: 94px; bottom: -95px; width: 275px; }
  .mt-insights-intro[data-season="3"] .mt-scene-season,
  .mt-insights-intro[data-season="5"] .mt-scene-season { right: 8px; }
  .mt-insights-intro[data-season="6"] .mt-scene-season { right: 18px; bottom: -8%; }
  /* Season 11 traegt keinen stehenden Ruler, sondern den querformatigen
     Elixir-Loong-Emote (500x300). Die Regel oben ist fuer stehende Figuren gemacht:
     `right: -34px` zieht sie bewusst ueber den rechten Rand und `bottom: -18%`
     schneidet die Fuesse ab. Beim Emote hiess das rechts UND unten angeschnitten
     (Eliass 06.09.2026).
     Diese Regel MUSS hier stehen und nicht bei den anderen Season-11-Massen weiter
     oben in der Datei: `.mt-insights-intro[data-season="11"]` und
     `.mt-insights-intro[data-season]` haben dieselbe Spezifitaet (0,2,0), also
     entscheidet die Reihenfolge - die Feinregel oben verlor stillschweigend. */
  .mt-insights-intro[data-season="11"] .mt-scene-season {
    right: 10px; bottom: 12px; width: min(46%, 190px); max-height: 46%;
    object-position: center center;
  }
  .mt-scene-dragon-left { right: 206px; bottom: 30px; width: 138px; }
  .mt-scene-dragon-top { right: -8px; top: 36px; width: 142px; }
  .mt-scene-dragon-bottom { right: 2px; bottom: 18px; width: 128px; }
  /* Alle Kapitel nebeneinander, die Woerter untereinander (Eliass 15.08.2026).
     Vorher stand hier fest `repeat(4, ...)`, obwohl `--mt-season-chapters` je nach
     Season auch 5 sein kann: das fuenfte Kapitel ("Modifiers") fiel dann in eine
     zweite Rasterzeile, und der gleitende Unterstrich rechnet mit `100% / 5` - er
     stand also unter dem falschen Kapitel. Die Spaltenzahl kommt jetzt wie auf dem
     Desktop aus der Variablen, und die 108px Mindestbreite entfallen: bei fuenf
     Kapiteln waeren das 540px auf einem 335px breiten Schirm. */
  .mt-insights-nav {
    top: var(--mt-insights-sticky-top, 94px); margin: 0;
    grid-template-columns: repeat(var(--mt-season-chapters, 4), minmax(0, 1fr));
    overflow: hidden;
  }
  .mt-insights-nav a {
    min-width: 0; padding: 0.42rem 0.15rem; gap: 0;
    /* Gross genug, dass die zweiwortigen Beschriftungen umbrechen und untereinander
       stehen, statt sich auf eine winzige Zeile zu quetschen. Die Grenze nach unten
       haelt bei 320px "Equipment" und "Modifiers" als GANZES Wort in der Zeile -
       darueber wuerde `overflow-wrap: anywhere` sie mitten im Wort trennen. */
    font-size: clamp(0.6rem, 3.1vw, 0.74rem); line-height: 1.15; text-align: center;
    white-space: normal; overflow-wrap: anywhere;
  }
  /* Der Season-Artikel liest sich wie ein Blogbeitrag und nimmt dafuer die ganze
     Bildschirmbreite ein (Eliass 15.08.2026) - die 1.25rem Innenabstand von `main`
     werden hier zurueckgenommen. Die Textbloecke darin haben ihren eigenen Abstand
     (siehe .mt-insights-document), es klebt also nichts am Rand. */
  .mt-insights { margin-inline: -1.25rem; }
  /* Etwas mehr Innenabstand als vorher: durch die volle Breite faellt der 1.25rem
     Aussenabstand von `main` weg, sonst klebte der Fliesstext am Bildschirmrand. */
  .mt-insights-document { padding: 0 1.1rem 2rem; }
  .mt-insights-chapter { scroll-margin-top: calc(var(--mt-insights-sticky-top, 94px) + 54px); padding-top: 2.2rem; }
  .mt-insights-chapter + .mt-insights-chapter { margin-top: 2.2rem; }
  /* Die drei Werte muessen der seitlichen Polsterung von `.mt-insights-document`
     entsprechen - die steht schmal auf 1.1rem, hier standen aber 0.8rem. Die
     Differenz von 0.3rem blieb links und rechts als heller Rand stehen, der Kopf
     lief also NICHT ueber die volle Breite (Eliass 16.08.2026). */
  .mt-chapter-head { width: calc(100% + 2.2rem); grid-template-columns: minmax(0, 1fr); margin: 0 -1.1rem 1.1rem; padding-inline: 1.1rem; }
  /* Dieselbe volle Breite fuer den Orb-Kopf und seine beiden Geschwister - es ist
     ein und derselbe Baustein mit goldener Oberkante, nur an drei Stellen
     eingesetzt. Sie stehen genauso am Anfang eines Abschnitts wie ein Kapitelkopf
     und sollen deshalb auch so weit laufen (Eliass 16.08.2026). */
  .mt-orb-guide-head,
  .mt-quest-orb-guide > header,
  .mt-modifier-orb-guide > header {
    width: calc(100% + 2.2rem); margin-inline: -1.1rem; padding-inline: 1.1rem;
  }
  /* Zwischen zwei Rulern eine kraeftigere Linie: innerhalb einer Quest-Karte
     trennen bereits 1px-Linien die Faehigkeit von der Quest, sodass die Grenze
     ZWISCHEN zwei Rulern in derselben Staerke unterging. */
  .mt-quest-card { border-bottom: 3px solid var(--panel-border); }
  .mt-quest-card:last-child { border-bottom: 0; }
  .mt-chapter-head h4 { font-size: 1.2rem; }
  /* Herrscherbild und Skins waren in der Breite die eigentlichen Platzfresser: 92px
     Bildspalte liessen dem Text 244px, und jede gesparte Bildbreite ist eine Zeile
     weniger Text (Eliass 15.08.2026). Etwas kleiner gerendert bleibt die Figur gut
     erkennbar - es ist ein Portraitbild, kein Detailbild. */
  /* `align-items: start` gegen den Grundwert `center` aus Zeile 6405: schmal ist die
     Textspalte deutlich hoeher als das Rahmenbild, mittig ausgerichtet schwebte es
     dadurch neben der Mitte des Textes. Oben buendig steht es auf einer Linie mit
     der Ueberschrift, zu der es gehoert (Eliass 16.08.2026). */
  .mt-insights .mt-ruler-guide-main { grid-template-columns: 72px minmax(0, 1fr); align-items: start; text-align: left; gap: 0.7rem; }
  .mt-insights .mt-ruler-art-card { width: 70px; }
  .mt-insights .mt-ruler-skins { margin-left: 0; }
  /* Fuenf statt vier Skins je Reihe - dieselbe Rechnung. Die Mindestbreite muss den
     Abstand mitdenken: bei 0.58rem Luecke passen fuenf Spuren nur unter 56px. */
  .mt-insights .mt-ruler-skin-grid { grid-template-columns: repeat(auto-fill, minmax(54px, 1fr)); gap: 0.45rem; }
  .mt-insights .mt-ruler-skin-card .mt-ruler-art-card { width: 54px; }
  /* Die zwei Quest-Spalten liessen je Karte nur 163px - Bild plus Text standen darin
     als schmale Saeule und der Abschnitt wurde fast 2000px hoch. Untereinander nimmt
     jede Quest die volle Breite und kommt mit ein bis zwei Textzeilen aus. */
  .mt-quest-grid { grid-template-columns: minmax(0, 1fr); gap: 0; }
  .mt-insights .mt-trait-grid { grid-template-columns: 1fr; }
  .mt-insights .mt-card-guide-grid, .mt-equipment-grid { grid-template-columns: 1fr; }
  .mt-orb-exclusive,
  .mt-orb-source-grid,
  .mt-quest-orb-tier-grid { grid-template-columns: 1fr; }
  .mt-quest-orb-phase-head { align-items: flex-start; flex-direction: column; gap: 0.2rem; }
  .mt-building-orb-schedule { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .mt-building-orb-schedule > span:nth-child(3) { border-left: 0; border-top: 1px solid var(--panel-inset-border); }
  .mt-building-orb-schedule > span:nth-child(4) { border-top: 1px solid var(--panel-inset-border); }
  .mt-insights .mt-asset-card.is-blog-card { grid-template-columns: 68px minmax(0, 1fr); min-height: 106px; }
  .mt-insights .mt-asset-card.is-blog-card .mt-card-shell,
  .mt-insights .mt-asset-card.is-missing-card .mt-card-shell { width: 68px; }
  .mt-insights .mt-modifier-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .mt-modifier-detail-grid { grid-template-columns: 1fr; }
  .mt-insights .mt-modifier-card.mt-modifier-detail-card { grid-template-columns: 54px minmax(0, 1fr); min-height: 0; }

  /* ---------- Best Builds: die Vorschau ist nur Vorschau ----------
     Unter dem Feld standen bisher alle vier Auswahlpanels (Ruler, Troops,
     Equipment, Modifier) offen da - dieselben Kaesten, die der Editor einblendet.
     In der Vorschau kann man damit nichts anfangen, und sie machten die Seite um
     ein Vielfaches laenger (Eliass 16.08.2026). Der Editor holt sie sich mit der
     zweiten Regel zurueck; sie ist staerker und steht danach. */
  .mt-arena-side { display: none; }
  .mt-arena-layout.is-editing .mt-arena-side { display: flex; }

  /* Die Modifier-Karte auf dem Feld war mit bis zu 304px Breite und 92px Hoehe fast
     so breit wie das ganze 320px-Feld. Alle Masse gehen gemeinsam eine Stufe
     zurueck, damit das Verhaeltnis von Bild, Titel und Text bleibt - kleiner Text
     ist in Ordnung, ein schiefes Verhaeltnis nicht. */
  .mt-arena-modifier-preview {
    grid-template-columns: 40px minmax(0, 1fr); gap: 0.32rem;
    width: clamp(150px, 56%, 188px); min-height: 54px; padding: 0.34rem 0.4rem;
    border-width: 3px; border-radius: 8px;
  }
  .mt-arena-modifier-preview > img,
  .mt-arena-modifier-preview-fallback { width: 40px; height: 40px; }
  .mt-arena-modifier-preview-fallback { font-size: 0.56rem; }
  .mt-arena-modifier-preview-copy > strong { font-size: 0.66rem; -webkit-text-stroke-width: 0.5px; }
  .mt-arena-modifier-preview-copy > span { margin-top: 0.2rem; font-size: 0.46rem; line-height: 1.22; }

  /* Dieselbe Stufe fuer die Sichtbarkeits-Schalter: fuenf Zeilen zu 34px lagen ueber
     einem Drittel des Feldes. Das Auge bleibt gross genug zum Treffen. */
  .mt-arena-visibility { top: 0.4rem; left: 0.4rem; gap: 3px; width: 88px; }
  .mt-arena-visibility button {
    grid-template-columns: 22px minmax(0, 1fr); gap: 0.26rem; min-height: 24px; border-radius: 4px;
  }
  .mt-arena-visibility img { width: 22px; height: 22px; }
  .mt-arena-visibility span { font-size: 0.56rem; }

}

/* Dieselbe Regel wie bei der Event-Rangliste, nur hier unten notiert: der 820px-Block
   darueber setzt `.mt-row` ebenfalls, und bei gleicher Spezifitaet gewinnt die spaetere
   Regel. Weiter oben stehend waere dieser Block wirkungslos. */
@media (max-width: 560px) {
  .mt-row { grid-template-columns: auto minmax(0, 1fr) auto; }
  .mt-clan { display: none; }
  /* Flacher, damit man schneller durch die 100 Plaetze kommt (Eliass 16.08.2026):
     48px Zeile plus 6px Abstand waren 54px Raster und 15 Zeilen je Schirm. Mit 40px
     und 4px sind es 44px und 18 Zeilen - ein Fuenftel weniger Scrollweg, ohne dass
     die Zeile gedraengt wirkt. Angefasst wird nur die Hoehe: der Name bleibt die
     groesste Schrift der Zeile, das Gefuege bleibt wie es war. */
  .mt-list { gap: 0.25rem; }
  .mt-row { min-height: 40px; padding-block: 0.3rem; }
  .mt-player { font-size: 0.94rem; }
  .mt-rank { font-size: 0.82rem; }
  .mt-score { font-size: 0.86rem; }
  .mt-score img { width: 16px; height: 16px; }
}

@media (prefers-reduced-motion: reduce) {
  .mt-insights-indicator, .mt-insights-indicator::before, .mt-card-stats-wrap, .mt-card-stats-toggle i, .mt-insights .mt-asset-card.is-jump-target, .mt-scene-layer, .mt-scene-spotlight { transition: none; animation: none; }
}

/* ---------- Meta-Decks ---------- */
.feature-stage {
  min-height: 260px; padding: 1rem 0;
  border-top: 1px solid rgba(255, 255, 255, 0.14);
  color: #fff;
}
.feature-stage > span {
  color: rgba(225, 231, 246, 0.48); font-size: 0.64rem; font-weight: 800;
  text-transform: uppercase;
}
.feature-stage h2 { margin: 0.12rem 0 0; color: #fff; font-size: 1.35rem; letter-spacing: 0; }

/* Farbe absichtlich nicht hier: siehe Regel "auf dem Bild-Hintergrund" weiter oben. */
#decks-info { font-size: 0.85rem; }
.deck-cards { display: flex; gap: 3px; }
.deck-cards .card { width: 52px; }
.deck-cards .card-img, .deck-cards .card-img img { width: 52px; }
.wr-good { color: var(--win); font-weight: 700; }
.wr-bad { color: var(--loss); font-weight: 700; }

/* ---------- Decks tab (meta) ----------
   Uebernimmt die Bildsprache der Leaderboard-/Player-Deck-Karten: dunkle
   Verlaufskarte, Laser-Linie oben, helle Schrift. */
.meta-toolbar-controls { display: inline-flex; align-items: center; gap: 0.4rem; }

/* Stichprobe waehlen. Alle drei Stufen kommen aus derselben Aufnahme, der Wechsel ist
   daher sofort da – die Knoepfe duerfen sich also ruhig "leichtgewichtig" anfuehlen. */
.meta-tiers {
  display: inline-flex; gap: 3px; margin: 0.15rem 0 0.2rem; padding: 3px;
  border: 1px solid rgba(255, 255, 255, 0.12); border-radius: 10px;
  background: rgba(8, 10, 15, 0.76);
}
.meta-tier {
  display: flex; flex-direction: column; align-items: center; gap: 1px;
  min-width: 5.6rem; padding: 0.34rem 0.8rem; border-radius: 7px;
  background: transparent; color: rgba(231, 236, 248, 0.58);
  transition: background 0.16s ease, color 0.16s ease;
}
.meta-tier b { font-size: 0.82rem; font-weight: 800; letter-spacing: 0.01em; }
.meta-tier span { font-size: 0.66rem; font-weight: 650; opacity: 0.72; font-variant-numeric: tabular-nums; }
.meta-tier:hover { background: rgba(255, 255, 255, 0.06); color: #fff; }
/* Der Verlauf des aktiven Knopfes steckt in der gleitenden Pille (.seg-indicator). */
.meta-tier.active { color: #fff; }

/* Ladeanzeige: echter Fortschritt (Battlelogs 415/1000) statt eines Spinners, der nichts
   verraet – die Aufnahme dauert ~20 s, da will man wissen, wie weit sie ist. */
.meta-loading { margin: 0.9rem 0 1.1rem; }
.meta-loading-bar {
  position: relative; overflow: hidden;
  padding: 0.7rem 1rem 0.8rem;
  border: 1px solid var(--panel-border); border-radius: 8px;
  background: var(--panel-bg);
  box-shadow: 0 8px 24px rgba(3, 6, 14, 0.24);
}
.meta-loading-bar::before {
  content: ""; position: absolute; top: 0; left: 10%; right: 10%; height: 1px;
  background: var(--panel-line);
  box-shadow: 0 0 8px rgba(89, 122, 255, 0.5); pointer-events: none;
}
.meta-loading-head {
  display: flex; align-items: baseline; justify-content: space-between; gap: 1rem;
  margin-bottom: 0.55rem;
}
.meta-loading-label { color: #fff; font-size: 0.86rem; font-weight: 750; }
.meta-loading-count {
  color: rgba(226, 233, 248, 0.6); font-size: 0.76rem; font-weight: 700;
  font-variant-numeric: tabular-nums; white-space: nowrap;
}
.meta-progress {
  position: relative; overflow: hidden; height: 6px; border-radius: 999px;
  background: rgba(255, 255, 255, 0.08);
}
.meta-progress > i {
  display: block; height: 100%; width: 0; border-radius: 999px;
  background: linear-gradient(90deg, #587cff, #bd71f0);
  box-shadow: 0 0 10px rgba(120, 130, 255, 0.55);
  transition: width 0.45s cubic-bezier(0.22, 0.61, 0.36, 1);
}
/* Solange der Server noch keine Zahlen liefert (Rangliste holen), laeuft ein Wischer durch. */
.meta-progress.indeterminate > i {
  width: 32%; animation: meta-progress-sweep 1.15s ease-in-out infinite;
}
@keyframes meta-progress-sweep {
  0% { transform: translateX(-105%); }
  100% { transform: translateX(320%); }
}

/* Platzhalter in der Form der echten Deck-Zeilen -> kein Layout-Sprung beim Umschalten. */
.meta-skeleton { display: grid; gap: 0.55rem; margin-top: 0.75rem; }
.skel-deck {
  padding: 0.7rem 0.85rem;
  border: 1px solid rgba(255, 255, 255, 0.07); border-radius: 8px;
  background: rgba(14, 17, 26, 0.72);
}
.skel-head { display: flex; align-items: center; gap: 0.6rem; margin-bottom: 0.6rem; }
.skel-line, .skel-card {
  border-radius: 5px;
  background: linear-gradient(180deg, rgba(255, 255, 255, 0.07), rgba(255, 255, 255, 0.03));
  border: 1px solid rgba(255, 255, 255, 0.06);
  animation: lb-card-skeleton 1.2s ease-in-out infinite alternate;
}
.skel-line { height: 12px; }
.skel-rank { width: 2.6rem; }
.skel-usage { width: 11rem; }
.skel-score { width: 3.4rem; height: 20px; margin-left: auto; }
.skel-cards { display: grid; grid-template-columns: repeat(8, 52px); gap: 3px; }
.skel-card { height: 63px; }
.skel-card:nth-child(2) { animation-delay: 0.08s; }
.skel-card:nth-child(3) { animation-delay: 0.16s; }
.skel-card:nth-child(4) { animation-delay: 0.24s; }
.skel-card:nth-child(5) { animation-delay: 0.32s; }
.skel-card:nth-child(6) { animation-delay: 0.4s; }
.skel-card:nth-child(7) { animation-delay: 0.48s; }
.skel-card:nth-child(8) { animation-delay: 0.56s; }
@media (prefers-reduced-motion: reduce) {
  .skel-line, .skel-card { animation: none; }
  .meta-progress.indeterminate > i { animation: none; width: 100%; opacity: 0.5; }
  .meta-progress > i { transition: none; }
}
@media (max-width: 900px) {
  .skel-cards { grid-template-columns: repeat(4, 52px); }
}
@media (max-width: 560px) {
  /* Die Stufenwahl ist eine Nebenentscheidung und darf nicht wie die Hauptsache
     aussehen (Eliass 15.08.2026: "kann kleiner sein", "nicht so breit gezogen").
     Entscheidend ist die Breite: `width: 100%` plus `flex: 1` zog die drei Knoepfe
     ueber den ganzen Bildschirm auseinander, obwohl "Top 1000" nur rund 70px braucht.
     Der Schalter ist deshalb wieder so breit wie sein Inhalt (`inline-flex` aus der
     Grundregel) und die Knoepfe verlieren ihre Mindestbreite von 5.6rem. */
  .meta-tiers { padding: 2px; border-radius: 8px; }
  .meta-tier { min-width: 0; padding: 0.22rem 0.55rem; gap: 0; }
  .meta-tier b { font-size: 0.76rem; }
  .meta-tier span { font-size: 0.6rem; }
}

.meta-overview {
  position: relative; overflow: hidden;
  display: grid; grid-template-columns: minmax(150px, 200px) 1fr; gap: 1.1rem;
  margin: 0.9rem 0 1.1rem; padding: 0.85rem 1rem 0.75rem;
  border: 1px solid var(--panel-border); border-radius: 8px;
  color: #f3f6ff;
  background: var(--panel-bg);
  box-shadow: var(--panel-shadow);
}
.meta-overview::before {
  content: ""; position: absolute; top: 0; left: 10%; right: 10%; height: 1px;
  background: var(--panel-line);
  box-shadow: 0 0 8px rgba(89, 122, 255, 0.5); pointer-events: none;
}
.meta-stats {
  display: flex; flex-direction: column; justify-content: center; gap: 0.55rem;
  padding-right: 1.1rem; border-right: 1px solid rgba(255, 255, 255, 0.08);
}
/* Jede Kachel traegt ihr eigenes Bild: gekreuzte Schwerter (Kaempfe), Kartenstapel
   (verschiedene Decks), Saeulendiagramm (Winrate). */
.meta-stat { display: flex; align-items: center; gap: 0.7rem; }
.meta-stat-icon {
  width: 42px; height: 42px; flex: none; object-fit: contain;
  filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.55));
}
.meta-stat-copy { display: flex; flex-direction: column; min-width: 0; }
.meta-stat-copy b {
  display: block; color: #fff; font-size: 1.2rem; font-weight: 850; line-height: 1.15;
  font-variant-numeric: tabular-nums;
}
.meta-stat-copy span {
  color: rgba(226, 233, 248, 0.55); font-size: 0.68rem; font-weight: 650;
  text-transform: uppercase; letter-spacing: 0.03em;
}

/* ---------- Podest: Gold, Silber, Bronze ----------
   Der Rang wird zur Metallschrift (Verlauf durch den Text gestanzt), ein Glanzstreifen
   wandert langsam darueber. Dazu eine getoente Kante und ein leiser Schein an der Karte –
   zurueckhaltend genug, dass die Deck-Karten selbst die Hauptrolle behalten. */
/* Der Rahmen ist ein umlaufender Metallverlauf – dieselbe Technik wie beim Profil:
   conic-gradient in der border-box, dessen Startwinkel animiert wird (--profile-gold-angle).
   2px statt 1px, sonst geht das Metall neben den kraeftigen Deck-Karten unter. */
.lb-row.medal {
  border: 2px solid transparent;
  background:
    var(--panel-bg) padding-box,
    conic-gradient(
      from var(--profile-gold-angle),
      var(--medal-dark) 0deg,
      var(--medal-mid) 58deg,
      var(--medal-hi) 84deg,
      var(--medal-mid) 112deg,
      var(--medal-dark) 178deg,
      var(--medal-mid) 240deg,
      var(--medal-hi) 268deg,
      var(--medal-mid) 296deg,
      var(--medal-dark) 360deg
    ) border-box;
  box-shadow:
    0 0 0 1px var(--medal-ring),
    0 0 14px var(--medal-glow),
    0 14px 34px rgba(0, 0, 0, 0.26);
}
/* Die Laser-Linie wuerde gegen den umlaufenden Rahmen anlaufen – bei Medaillen weg damit. */
.lb-row.medal::before { display: none; }

/* Die Rangzahl als Metallschrift. Bewusst wenig Dunkelanteil: der Verlauf laeuft von
   mittel ueber hell nach weiss, der dunkle Ton kommt nur als schmale Kante vor. */
.lb-row.medal .lb-rank {
  background-image: linear-gradient(100deg, var(--medal-mid) 6%, var(--medal-hi) 28%, #fff 44%, var(--medal-hi) 60%, var(--medal-mid) 88%);
  background-size: 260% 100%;
  -webkit-background-clip: text; background-clip: text;
  color: transparent;
  font-weight: 900;
  filter: drop-shadow(0 1px 6px var(--medal-glow));
  animation: medal-sheen 5s ease-in-out infinite;
}

:is(.lb-row, .lb-season-entry).medal-1 {
  --medal-hi: #fff2ba; --medal-mid: #f0c04a; --medal-dark: #a9761b;
  --medal-ring: rgba(247, 190, 73, 0.3); --medal-glow: rgba(247, 190, 73, 0.3);
}
:is(.lb-row, .lb-season-entry).medal-2 {
  --medal-hi: #ffffff; --medal-mid: #dce4ee; --medal-dark: #8494a8;
  --medal-ring: rgba(220, 228, 238, 0.26); --medal-glow: rgba(220, 228, 238, 0.24);
}
:is(.lb-row, .lb-season-entry).medal-3 {
  --medal-hi: #ffd9ae; --medal-mid: #e09a5c; --medal-dark: #96551f;
  --medal-ring: rgba(224, 154, 92, 0.28); --medal-glow: rgba(224, 154, 92, 0.26);
}

/* Shine-Sweep auf Platz 1: ein leicht schraeger, weich ausgefadeter Lichtbalken huscht
   von links nach rechts ueber die Karte. Bewusst NUR auf #1 – auf allen drei Podestplaetzen
   waere es Unruhe statt Auszeichnung. Die Karte ist overflow:hidden, der Balken wird also
   sauber an ihrer Kante beschnitten. */
/* Der Verlauf liegt ueber der GANZEN Karte und ist dreimal so breit wie sie; bewegt wird
   nur seine Position. Ein gedrehtes schmales Element waere naheliegender, zeigt aber seine
   Ecken als harte Kanten – hier gibt es keine Kanten, nur den Verlauf selbst. Die 104 Grad
   erzeugen die leichte Schraege. */
/* Damit der Schimmer HINTER den Karten und Texten liegt, muss die Karte selbst ein
   eigener Stapelkontext sein – sonst rutscht ein Kind mit negativem z-index hinter den
   Kartenhintergrund und ist gar nicht mehr zu sehen. Dasselbe Mittel nutzt #profile. */
.lb-row.medal-1 { isolation: isolate; }
.lb-row.medal-1::after {
  content: "";
  position: absolute; inset: 0;
  z-index: -1; /* ueber dem Kartenhintergrund, unter Deck-Karten, Text und Score */
  pointer-events: none;
  /* Breiter, weicher Lichtkeil statt eines scharfen Streifens: der Kern ist blass, die
     Flanken laufen ueber die halbe Karte aus. Er soll auffallen, wenn man hinsieht –
     nicht, wenn man liest. */
  background: linear-gradient(
    104deg,
    transparent 12%,
    rgba(255, 226, 158, 0.04) 30%,
    rgba(255, 236, 190, 0.11) 50%,
    rgba(255, 226, 158, 0.04) 70%,
    transparent 88%
  );
  transform: translateX(-85%);
}
@media (prefers-reduced-motion: no-preference) {
  /* Sehr traege und gleichfoermig: ein Durchlauf dauert eine knappe halbe Minute, ohne
     Beschleunigen, ohne Pause. Man bemerkt ihn eher als Stimmung denn als Bewegung. */
  .lb-row.medal-1::after { animation: medal-shine 26s linear infinite; }
}
@keyframes medal-shine {
  0% { transform: translateX(-85%); }
  100% { transform: translateX(85%); }
}

@keyframes medal-sheen {
  0%, 100% { background-position: 100% 50%; }
  50% { background-position: 0% 50%; }
}
@keyframes popular-sheen {
  0%, 100% { background-position: 100% 50%; }
  50% { background-position: 0% 50%; }
}
/* Der Rahmen kreist – Tempo wie beim Profil, Gold am schnellsten, damit Platz 1 fuehrt. */
@media (prefers-reduced-motion: no-preference) {
  .lb-row.medal-1 { animation: profile-border-orbit 7s linear infinite; }
  .lb-row.medal-2 { animation: profile-border-orbit 9s linear infinite; }
  .lb-row.medal-3 { animation: profile-border-orbit 11s linear infinite; }
}
@media (prefers-reduced-motion: reduce) {
  .lb-row.medal .lb-rank { animation: none; background-position: 44% 50%; }
}

.meta-chart { margin: 0; min-width: 0; }
.meta-chart figcaption {
  display: flex; align-items: baseline; gap: 0.5rem; flex-wrap: wrap; margin-bottom: 0.25rem;
}
.meta-chart figcaption b { color: #fff; font-size: 0.82rem; font-weight: 800; }
.meta-chart figcaption span { color: rgba(226, 233, 248, 0.45); font-size: 0.7rem; font-weight: 650; }
.meta-chart-plot { position: relative; }
.meta-scatter { display: block; width: 100%; height: auto; overflow: visible; }

/* Zurueckhaltendes Raster – die Punkte tragen die Grafik. */
.mc-grid { stroke: rgba(255, 255, 255, 0.07); stroke-width: 1; }
.mc-axis { stroke: rgba(255, 255, 255, 0.12); stroke-width: 1; }
/* Die Groessen sind echte Pixel: der viewBox wird in app.js auf die tatsaechliche
   Breite gesetzt, das SVG skaliert also nicht mehr. Vorher schrumpfte 9px auf schmalen
   Bildschirmen auf 4,8px zusammen. */
.mc-tick, .mc-axis-label {
  fill: rgba(226, 233, 248, 0.45); font-size: 9px; font-weight: 650; font-family: inherit;
}
/* Beide Achsen tragen denselben Namensstil: Versalien statt eines Pfeil-Zeichens. */
.mc-axis-label { font-size: 8.5px; font-weight: 800; letter-spacing: 0.1em; }
.mc-avg { stroke: rgba(226, 233, 248, 0.3); stroke-width: 1; stroke-dasharray: 4 3; }
/* Die groesseren, helleren Werte gelten nur schmal: dort ist das Diagramm auf feste
   Breite gesetzt, das SVG skaliert nicht mehr mit, und 9px schrumpften vorher auf
   4,8px zusammen. Am Desktop bleibt es bei den urspruenglichen Groessen
   (Eliass 16.08.2026 - die Desktop-Ansicht war fertig und sollte unangetastet bleiben). */
/* Halo in Kartenfarbe, damit das Label auch ueber einem Punkt lesbar bleibt. */
.mc-avg-label {
  fill: rgba(226, 233, 248, 0.55); font-size: 8.5px; font-weight: 700; font-family: inherit;
  paint-order: stroke; stroke: #171b28; stroke-width: 3px; stroke-linejoin: round;
}
/* Der Mobil-Block steht bewusst NACH allen drei Grundregeln - bei gleicher
   Spezifitaet gewinnt die spaetere. Davor waere er fuer `.mc-avg-label` wirkungslos. */
@media (max-width: 1100px) {
  .mc-tick, .mc-axis-label { fill: rgba(226, 233, 248, 0.55); font-size: 11px; }
  .mc-axis-label { font-size: 10px; }
  .mc-avg-label { fill: rgba(226, 233, 248, 0.62); font-size: 10px; }
}
.mc-dot {
  fill: #6f8dff; fill-opacity: 0.78;
  stroke: rgba(14, 17, 26, 0.9); stroke-width: 2; /* Ring haelt Ueberlappungen lesbar */
  cursor: pointer; transition: fill 0.12s, fill-opacity 0.12s;
  /* fill-box, sonst skalierte der Punkt um den Ursprung des SVG statt um sich selbst. */
  transform-box: fill-box; transform-origin: center;
  /* Kaum Ueberschwung: die Punkte sollen erscheinen, nicht huepfen. */
  animation: mc-pop 0.38s cubic-bezier(0.22, 0.9, 0.32, 1) both;
}
/* Rang 1 ploppt als letzter und einen Tick kraeftiger – er ist der Punkt, um den es geht. */
.mc-dot-lead { animation-name: mc-pop-lead; animation-duration: 0.5s; }

@keyframes mc-pop {
  0% { transform: scale(0.2); opacity: 0; }
  100% { transform: scale(1); opacity: 1; }
}
@keyframes mc-pop-lead {
  0% { transform: scale(0.2); opacity: 0; }
  72% { transform: scale(1.1); opacity: 1; }
  100% { transform: scale(1); opacity: 1; }
}
@media (prefers-reduced-motion: reduce) {
  .mc-dot, .mc-dot-lead { animation: none; }
}
.mc-dot:hover, .mc-dot.active, .mc-dot:focus-visible {
  fill: #bd71f0; fill-opacity: 1; stroke: rgba(255, 255, 255, 0.55); outline: none;
}
.mc-tip {
  position: absolute; transform: translate(-50%, -100%);
  padding: 0.42rem 0.6rem; border: 1px solid rgba(99, 125, 215, 0.5); border-radius: 8px;
  background: rgba(11, 14, 22, 0.96); color: #f3f6ff;
  font-size: 0.74rem; font-weight: 650; line-height: 1.4;
  white-space: nowrap; pointer-events: none; z-index: 5;
  box-shadow: 0 8px 24px rgba(3, 6, 14, 0.45);
}
.mc-tip b { color: #fff; font-weight: 850; }
.mc-tip .record-wins { color: #62e2a0; }
.mc-tip .record-losses { color: #ff7a86; }

/* Deck-Zeilen: gleiche Karte wie im Leaderboard (.lb-row) + Meta-Kopfzeile. */
.meta-deck { margin-bottom: 0.6rem; }
.meta-deck.linked { border-color: rgba(155, 122, 240, 0.85); box-shadow: 0 8px 26px rgba(3, 6, 14, 0.3), 0 0 0 1px rgba(189, 113, 240, 0.35); }
/* Drei Wert-Symbol-Paare statt eines Satzes. Der Trenner entfaellt: die Bilder setzen
   die Gruppen schon sichtbar voneinander ab. */
.meta-usage {
  display: inline-flex; align-items: center; gap: 0.7rem;
  color: rgba(226, 233, 248, 0.6); font-size: 0.84rem; font-weight: 650; white-space: nowrap;
}
.meta-usage > span { display: inline-flex; align-items: center; gap: 0.28rem; }
.meta-usage img {
  width: 17px; height: 17px; object-fit: contain; flex: none;
  filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.55));
}
.meta-usage b { color: #fff; font-weight: 800; font-variant-numeric: tabular-nums; }
/* Elixier | QR | Save | Score sitzen zusammen rechts in der Kopfzeile (Bauart wie bei
   Saved Decks). Dadurch bleibt die Zeile darunter frei fuer Karten + Turmtruppe. */
.meta-head-actions { display: flex; align-items: center; gap: 0.5rem; margin-left: auto; flex: none; }
.meta-deck-actions { flex: none; }
/* Turmtruppe als neunter Slot, mit Trennstrich abgesetzt – und in derselben Groesse
   wie die acht Karten (52px), nicht kleiner. */
/* Gleicher Abstand links und rechts vom Strich: der Abstand zu den Karten setzt sich
   aus dem 0.7rem-Gap der Zeile UND dem eigenen Aussenabstand zusammen, der
   Innenabstand rechts musste deshalb die Summe der beiden sein (Eliass 15.08.2026:
   "Trennstrich Towertroop muss mittig sein"). Vorher: 16.8px links, 12.8px rechts. */
.meta-deck-tower {
  flex: none; margin-left: 0.35rem; padding-left: 1.05rem;
  border-left: 1px solid rgba(148, 163, 184, 0.28);
}
.meta-deck-tower .card, .meta-deck-tower .card-img, .meta-deck-tower .card-img img { width: 52px; }

.meta-score { position: relative; gap: 0.32rem; cursor: help; }
.meta-score em {
  font-style: normal; color: rgba(226, 233, 248, 0.5);
  font-size: 0.62rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.04em;
}
.meta-score:hover, .meta-score:focus-visible { border-color: #587cff; outline: none; }

/* Score-Tooltip: gleiche Karte wie der Tooltip im Clankriegs-Chart, nur nach UNTEN
   geoeffnet – die Deck-Karte hat overflow:hidden, nach oben wuerde er abgeschnitten. */
/* Haengt an <body> (die Deck-Karte ist overflow:hidden) -> feste Viewport-Position. */
.meta-score-tip {
  position: fixed; width: 224px; padding: 0.62rem 0.7rem;
  transform: none; text-align: left; font-weight: 650;
  background: linear-gradient(145deg, #131b33, #090c16);
  z-index: 60;
  animation: meta-score-tip-in 0.14s ease-out;
}
.meta-score-tip::after {
  top: -5px; bottom: auto; left: auto; right: 18px;
  border: 0; border-left: 1px solid rgba(119, 156, 255, 0.48); border-top: 1px solid rgba(119, 156, 255, 0.48);
  background: #111828; transform: rotate(45deg);
}
@keyframes meta-score-tip-in { from { opacity: 0; transform: translateY(-4px); } }
.score-parts { display: block; margin-top: 0.55rem; }
.score-part + .score-part { margin-top: 0.42rem; }
.score-part-head {
  display: flex; align-items: baseline; gap: 0.35rem; margin-bottom: 0.22rem;
  color: rgba(218, 226, 247, 0.62); font-size: 0.66rem;
}
.score-part-head em {
  font-style: normal; color: rgba(218, 226, 247, 0.38); font-size: 0.58rem; font-weight: 700;
}
.score-part-head b { margin-left: auto; color: #fff; font-size: 0.68rem; font-variant-numeric: tabular-nums; }
.score-part-track {
  height: 5px; border-radius: 999px; overflow: hidden;
  background: rgba(255, 255, 255, 0.08); box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.35);
}
.score-part-track i { display: block; height: 100%; border-radius: 999px; }
/* Ein Farbton je Faktor – dieselben Akzente wie im Rest der App. */
.score-part-players .score-part-track i { background: linear-gradient(90deg, #3f63d8, #7ea2ff); }
.score-part-battles .score-part-track i { background: linear-gradient(90deg, #8b4ec4, #bd71f0); }
.score-part-winrate .score-part-track i { background: linear-gradient(90deg, #168452, #43d389); }
.meta-score-tip .clan-tooltip-rank { display: block; }

/* ---------- Kartenfilter ---------- */
.meta-toolbar-left { display: flex; align-items: center; gap: 0.6rem; flex-wrap: wrap; min-width: 0; }
.meta-filter-btn { display: inline-flex; align-items: center; gap: 0.42rem; padding-left: 0.5rem; }
.meta-filter-btn img {
  width: 19px; height: 19px; flex: none;
  filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.55));
}

.meta-filter-chip {
  display: inline-flex; align-items: center; gap: 0.4rem; padding: 0.16rem 0.3rem 0.16rem 0.16rem;
  border: 1px solid rgba(99, 125, 215, 0.5); border-radius: 999px;
  background: rgba(49, 91, 212, 0.16);
  color: #f3f6ff; font-size: 0.76rem; font-weight: 700;
}
.meta-filter-chip[hidden] { display: none; }
.meta-filter-chip img { width: 26px; height: 32px; object-fit: contain; border-radius: 4px; }
.meta-filter-clear {
  width: 18px; height: 18px; padding: 0; border: 0; border-radius: 50%;
  background: rgba(255, 255, 255, 0.12); color: #fff;
  font-size: 0.9rem; line-height: 1; cursor: pointer;
}
.meta-filter-clear:hover { background: #e0413a; }

/* Auswahl-Box: klappt in der Seite auf (zwischen Leiste und erstem Deck), kein Overlay.
   Gleiche Karte wie die uebrigen Panels. */
.card-picker {
  position: relative; overflow: hidden;
  margin: 0 0 0.75rem; padding: 0.9rem 1rem 0.8rem;
  border: 1px solid var(--panel-border); border-radius: 8px;
  color: #f3f6ff;
  background: var(--panel-bg);
  box-shadow: var(--panel-shadow);
  /* Faehrt beim Oeffnen auf und schiebt die Decks sanft nach unten. */
  animation: card-picker-open 0.32s cubic-bezier(0.22, 1, 0.36, 1);
  transform-origin: top;
}
.card-picker[hidden] { display: none; }
@keyframes card-picker-open {
  from { opacity: 0; max-height: 0; margin-bottom: 0; padding-top: 0; padding-bottom: 0; transform: translateY(-6px); }
  to { opacity: 1; max-height: 1200px; margin-bottom: 0.75rem; transform: none; }
}
@media (prefers-reduced-motion: reduce) {
  .card-picker { animation: none; }
}
.card-picker::before {
  content: ""; position: absolute; top: 0; left: 10%; right: 10%; height: 1px;
  background: var(--panel-line);
  box-shadow: 0 0 8px rgba(89, 122, 255, 0.5); pointer-events: none;
}
.card-picker-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 1rem; }
.card-picker-head h3 { margin: 0; font-size: 0.95rem; color: #fff; }
.card-picker-head p { margin: 0.18rem 0 0; color: rgba(226, 233, 248, 0.5); font-size: 0.74rem; }
.card-picker-close {
  flex: none; width: 26px; height: 26px; padding: 0; border: 0; border-radius: 6px;
  background: rgba(255, 255, 255, 0.06); color: rgba(226, 233, 248, 0.7);
  font-size: 1.1rem; line-height: 1; cursor: pointer;
}
.card-picker-close:hover { background: rgba(255, 255, 255, 0.12); color: #fff; }

/* Kleine Kacheln -> viele Karten pro Reihe. Der Name steht im Tooltip, nicht darunter.
   Bewusst ohne Scrollbereich: der komplette Kartenpool liegt auf einen Blick da. */
.card-picker-grid {
  display: grid; grid-template-columns: repeat(auto-fill, minmax(40px, 1fr));
  gap: 4px; margin: 0.75rem 0;
}
.card-picker-loading {
  grid-column: 1 / -1; padding: 1.6rem; text-align: center;
  color: rgba(226, 233, 248, 0.6); font-size: 0.85rem;
}
.card-pick {
  display: block; padding: 2px; border: 1px solid transparent; border-radius: 6px;
  background: transparent; cursor: pointer; line-height: 0;
  transition: border-color 0.12s, background 0.12s, transform 0.12s;
}
.card-pick .card, .card-pick .card-img, .card-pick .card-img img { width: 100%; }
.card-pick:hover:not(:disabled) {
  background: rgba(255, 255, 255, 0.08); border-color: rgba(126, 162, 255, 0.55);
  transform: translateY(-1px);
}
.card-pick.is-picked {
  background: rgba(49, 91, 212, 0.3); border-color: #7ea2ff;
  box-shadow: 0 0 0 1px rgba(126, 162, 255, 0.4), 0 4px 14px rgba(20, 40, 110, 0.45);
}
/* Karten, die in keinem der 25 Decks vorkommen: sichtbar, aber nicht waehlbar. */
.card-pick.is-out { cursor: not-allowed; opacity: 0.25; filter: grayscale(1); }

.card-picker-foot {
  display: flex; align-items: center; justify-content: space-between; gap: 1rem; flex-wrap: wrap;
  padding-top: 0.7rem; border-top: 1px solid rgba(255, 255, 255, 0.1);
}
.card-picker-selection { color: rgba(226, 233, 248, 0.6); font-size: 0.8rem; font-weight: 650; }
.card-picker-selection b { color: #fff; }

/* Schmal passten nur sechs Karten in eine Reihe, der ganze Pool wurde dadurch sehr
   lang (Eliass 15.08.2026: "sicherlich 8 oder 9 nebeneinander"). Kleinere Mindestbreite
   und engere Abstaende bringen neun in die Reihe; die Kacheln bleiben mit rund 33px
   noch gut zu treffen, weil der Kartenname ohnehin nur im Tooltip steht. */
@media (max-width: 560px) {
  .card-picker-grid { grid-template-columns: repeat(auto-fill, minmax(30px, 1fr)); gap: 2px; margin: 0.55rem 0; }
  .card-pick { padding: 1px; border-radius: 4px; }
}

/* Sichtbarkeitsmarke fuer das blockweise Nachladen der Deckliste. Sie braucht eine
   messbare Hoehe: ein Element ohne Ausdehnung meldet dem IntersectionObserver nie
   Sichtbarkeit. */
.meta-load-marker { height: 1px; }
.meta-load-marker[hidden] { display: none; }

/* Gefilterte Decks bleiben im Streudiagramm hervorgehoben, der Rest tritt zurueck. */
.mc-dot-dim { fill-opacity: 0.14; }

/* Aufklappbereich: uebernimmt Chevron + Reveal des Battle Logs (.battle-more). */
.meta-footer { margin-top: 0.55rem; }
.meta-more-content { text-align: left; }
.meta-players-loading { text-align: center; color: rgba(226, 233, 248, 0.6); font-size: 0.82rem; }
.meta-players-head {
  margin-bottom: 0.55rem; color: rgba(226, 233, 248, 0.62); font-size: 0.78rem; font-weight: 650;
}
.meta-players-head b { color: #fff; }
.meta-players-head .sep { padding: 0 0.2rem; color: rgba(226, 233, 248, 0.3); }
.meta-players-table { font-size: 0.82rem; }
.meta-players-table th { background: rgba(8, 10, 15, 0.5); font-size: 0.66rem; }
.meta-players-table th, .meta-players-table td { padding: 0.38rem 0.6rem; }
.meta-players-table a:hover { color: #9db4ff; }
.meta-players-table .rank-cell { color: rgba(226, 233, 248, 0.6); }
.meta-players-clan { max-width: 190px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.meta-players-table .record-wins { color: #62e2a0; font-weight: 700; }
.meta-players-table .record-losses { color: #ff7a86; font-weight: 700; }
.meta-players-table .record-draws { color: #aab2c3; font-weight: 700; }
/* Sieben Spalten passen auf 375px nicht - die Tabelle wurde zum Wischfeld, in dem alles
   auf zwei Zeichen zusammengedrueckt war (Eliass 15.08.2026: "sehr kritisch"). Uebrig
   bleibt, was die Frage "wer spielt das Deck und wie gut" beantwortet: Rang, Name,
   Bilanz. Clan, Kampfzahl, Quote und "zuletzt gespielt" stehen auf dem Desktop weiter
   da - dort ist der Platz vorhanden. */
@media (max-width: 560px) {
  .meta-players-table :is(th, td):nth-child(3),
  .meta-players-table :is(th, td):nth-child(4),
  .meta-players-table :is(th, td):nth-child(6),
  .meta-players-table :is(th, td):nth-child(7) { display: none; }
  /* Die Bilanz ist hier die letzte verbliebene Spalte und traegt keine Zahlenkolonne
     mehr neben sich, an der sie sich rechts ausrichten muesste - mittig steht sie
     ruhiger unter ihrer Ueberschrift. Auf dem Desktop bleibt sie rechtsbuendig, dort
     stehen Kampfzahl und Quote daneben. */
  .meta-players-table :is(th, td):nth-child(5) { text-align: center; }
}
/* Bilanz-Block rechts neben dem Deck: fuellt die Restbreite, steht aber auf beiden
   Seiten gleich weit frei – links 31px zur Turmtruppe, rechts 31px zur Kartenkante.
   Die CSS-Werte sind darum unterschiedlich: links steuert `.lb-row-body` schon 0.7rem
   Gap bei, rechts kommen die 17px Innenabstand der Deck-Karte selbst dazu. */
.meta-record {
  display: flex; flex-direction: column; justify-content: flex-end;
  flex: 1 1 auto; min-width: 0;
  margin-left: 1.25rem; margin-right: 0.9rem;
}
.meta-record .player-deck-metrics { margin-top: 0.4rem; }
/* Nur noch die Win Rate, und die mittig unter dem Balken. */
.meta-record-metrics { justify-content: center; }

@media (max-width: 860px) {
  .meta-overview { grid-template-columns: 1fr; }
  .meta-stats {
    flex-direction: row; flex-wrap: wrap; gap: 0.9rem;
    padding: 0 0 0.7rem; border-right: 0; border-bottom: 1px solid rgba(255, 255, 255, 0.08);
  }
  .meta-record { width: 100%; margin-left: 0; margin-right: 0; }
}

/* Schmal standen die drei Kennzahlen als 1 + 2 untereinander und kosteten drei Reihen.
   Nebeneinander passen sie in eine (Eliass 15.08.2026) - dafuer wandert das Bild ueber
   den Text, denn nebeneinander waere bei rund 95px je Spalte kein Platz mehr. */
/* Die vier Kartenspalten stehen fest auf 52px, die Zeile ist aber breiter - der Rest
   blieb als Luecke rechts stehen, wodurch die Turmtruppe 19px vom Rand entfernt war,
   die erste Karte links aber nur 16px. Mitwachsende Spalten fuellen die Zeile exakt
   aus, damit sind beide Seiten gleich. Bewusst nur fuer die Meta-Decks: die
   Ranglistenzeilen teilen sich `.lb-deck`, haben aber keine Turmtruppe daneben. */
@media (max-width: 560px) {
  /* `flex-basis: 0` und nicht `auto`: mit `width: 100%` auf den Bildern ist die
     max-content-Breite des Rasters die INTRINSISCHE Bildbreite (285px je Karte). Als
     Basis genommen sprengte das die Zeile und die Turmtruppe rutschte darunter. */
  .meta-deck .lb-deck { flex: 1 1 0; min-width: 0; grid-template-columns: repeat(4, minmax(0, 1fr)); }
  .meta-deck .lb-deck :is(.card, .card-img, .card-img img) { width: 100%; }

  /* Kopfzeile der Deck-Karte: Rang und die drei Kennzahlen links, rechts daneben
     standen Elixierschnitt, QR, Save und der Score in EINER Reihe. Zusammen waren das
     rund 100px zu viel - die Karte ist `overflow: hidden`, Save und Score wurden also
     schlicht abgeschnitten (Eliass 15.08.2026: "katastrophal").
     Rechts steht jetzt ein zweizeiliger Block: oben der Elixierschnitt, darunter QR
     und Save mittig unter ihm. Beide Zeilen sind etwa gleich breit (62px gegen 53px),
     der Block wirkt dadurch als Einheit statt als Reihe.
     Der negative Abstand unten ist der Kern: er zieht genau die Hoehe der Knopfzeile
     (24px plus 5px Abstand) wieder aus der Rechnung heraus. Fuer die Kopfzeile ist der
     Block damit nur so hoch wie der Elixierschnitt, der dadurch auf einer Linie mit
     dem Rang und den drei Kennzahlen steht; die Knoepfe ragen sichtbar in die
     Kartenreihe hinein. Das geht gefahrlos, weil auf ihrer Hoehe rechts nur die
     Turmtruppe steht - und die beginnt erst weiter unten.
     `z-index` ist noetig, weil die Kartenreihe im HTML spaeter kommt und die Knoepfe
     sonst verdecken wuerde. */
  .meta-deck-actions {
    position: relative; z-index: 2;
    display: grid; grid-template-columns: repeat(2, auto); justify-content: end;
    gap: 5px; margin-bottom: -29px;
  }
  .meta-deck-actions > .elixir { grid-column: 1 / -1; justify-self: center; }
  /* Der Score passt daneben nicht mehr und war ohnehin schon unsichtbar. Die Decks
     stehen standardmaessig nach ihm sortiert, die Reihenfolge sagt hier dasselbe. */
  .meta-score { display: none; }

  .meta-stats { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 0.5rem; }
  .meta-stat { flex-direction: column; align-items: center; gap: 0.2rem; text-align: center; }
  .meta-stat-icon { width: 30px; height: 30px; }
  .meta-stat-copy { align-items: center; }
  .meta-stat-copy b { font-size: 1rem; }
  .meta-stat-copy span { font-size: 0.58rem; letter-spacing: 0.01em; line-height: 1.25; }
}

/* ---------- Geier multiplayer lobby ---------- */
#tab-geier > .geier-shell ~ h2,
#tab-geier > .geier-shell ~ .hint,
#tab-geier > .geier-shell ~ .plugin-grid { display: none; }

.geier-shell {
  --geier-bg: #12151f;
  --geier-panel: #111824;
  --geier-panel-2: #151f2e;
  --geier-line: rgba(255, 255, 255, 0.1);
  --geier-muted: #8e9aaf;
  --geier-gold: #ffc84d;
  margin: 18px auto 0;
  position: relative;
  overflow: visible;
  color: #f3f6fc;
  border: 1px solid var(--panel-border);
  border-radius: 8px;
  background: linear-gradient(138deg, #1a2940 0%, #121923 48%, #2a1738 100%);
  background-size: 160% 160%;
  animation: geierShellDrift 18s ease-in-out infinite alternate;
  box-shadow: 0 12px 34px rgba(3, 8, 16, 0.3), inset 0 1px rgba(255, 255, 255, 0.035);
}
.geier-runtime-loader {
  display: none;
  min-height: 360px;
  align-items: center;
  justify-content: center;
  gap: 0.75rem;
  color: var(--panel-muted);
  font-size: 0.84rem;
  font-weight: 750;
}
.geier-shell.geier-runtime-loading > :not(.geier-runtime-loader) { display: none !important; }
.geier-shell.geier-runtime-loading > .geier-runtime-loader { display: flex; }
@keyframes geierShellDrift {
  from { background-position: 0% 30%; }
  to { background-position: 100% 70%; }
}
.geier-shell button, .geier-shell input, .geier-shell select { font: inherit; }
.geier-shell button { color: inherit; }
.geier-shell [hidden] { display: none !important; }

.geier-shell-head {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 18px;
  padding: 22px 24px;
  min-height: 132px;
  border-radius: 8px 8px 0 0;
  border-bottom: 1px solid rgba(255, 255, 255, 0.08);
  background:
    linear-gradient(90deg, rgba(11, 14, 22, 0.92) 0%, rgba(11, 14, 22, 0.58) 46%, rgba(11, 14, 22, 0.12) 100%),
    url("assets/geier/banner.jpg") center / cover no-repeat;
}
.geier-shell-head > div { position: relative; text-shadow: 0 1px 6px rgba(0, 0, 0, 0.6); }
.geier-kicker, .geier-section-heading span, .entry-title > span, .geier-panel-title div > span {
  color: #38bdf8;
  font-size: 0.66rem;
  font-weight: 900;
  letter-spacing: 0.18em;
  text-transform: uppercase;
}
.geier-shell-head h2 { margin: 2px 0; color: #f1f5f9; font-size: 1.4rem; }
.geier-shell-head p { margin: 0; color: #cbd5e1; font-size: 0.88rem; }

#geier-home { padding: 22px 24px; position: relative; }
.geier-section-heading { display: flex; align-items: end; justify-content: space-between; gap: 2rem; margin-bottom: 1.15rem; }
.geier-section-heading h3 { margin: 0.12rem 0 0; color: #fff; font-size: 1.55rem; }
.geier-section-heading > p { max-width: 430px; margin: 0; color: var(--geier-muted); font-size: 0.8rem; text-align: right; }

.geier-mode-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 12px; }
.geier-mode-card {
  --mode-accent: #ffc84d;
  position: relative;
  display: grid;
  grid-template-rows: auto 1fr;
  min-height: 238px;
  padding: 0;
  overflow: hidden;
  cursor: pointer;
  text-align: left;
  border: 1px solid rgba(99, 125, 215, 0.32);
  border-radius: 8px;
  background: rgba(8, 10, 15, 0.24);
  transition: transform 0.2s, border-color 0.2s, background 0.2s, box-shadow 0.2s;
}
.geier-mode-card:hover { transform: translateY(-2px); border-color: rgba(125, 211, 252, 0.48); }
.geier-mode-card.selected { border-color: #587cff; background: linear-gradient(145deg, rgba(49, 91, 212, 0.28), rgba(189, 113, 240, 0.12)); box-shadow: inset 0 0 0 1px rgba(88, 124, 255, 0.18), 0 8px 24px rgba(3, 6, 14, 0.18); }
/* Gesperrte (noch nicht gebaute) Modi: ausgegraut, Schloss-Icon, nicht anklickbar.
   Perspektivisch z.B. fuer Pro-Abos freischaltbar. Kein blauer Hover-Akzent -
   nur ein etwas helleres Grau (gleiche Sprache wie .plugin-card.locked). */
.geier-mode-card.locked { cursor: not-allowed; border-color: rgba(148, 163, 184, 0.28); }
.geier-mode-card.locked:hover {
  transform: none; border-color: rgba(148, 163, 184, 0.4);
  box-shadow: none; background: rgba(148, 163, 184, 0.05);
}
.geier-mode-card.locked .geier-mode-img { filter: grayscale(1) brightness(0.5); opacity: 0.5; }
.geier-mode-card.locked .geier-mode-art { filter: grayscale(1) brightness(0.75); }
.geier-mode-card.locked .geier-mode-copy h4 { color: #8895ab; }
.geier-mode-card.locked .geier-mode-copy p { color: #66707f; }
.geier-mode-lock {
  position: absolute; z-index: 4; left: 50%; top: 50%; transform: translate(-50%, -50%);
  display: grid; place-items: center; width: 56px; height: 56px; pointer-events: none;
}
.geier-mode-lock img {
  width: 100%; height: 100%; object-fit: contain;
  filter: drop-shadow(0 6px 14px rgba(0, 0, 0, 0.6));
}
.geier-mode-art {
  position: relative;
  display: grid;
  min-height: 132px;
  place-items: center;
  overflow: hidden;
  border-bottom: 1px solid rgba(99, 125, 215, 0.22);
  background:
    linear-gradient(135deg, color-mix(in srgb, var(--mode-accent) 12%, transparent), transparent 62%),
    repeating-linear-gradient(135deg, rgba(255,255,255,.025) 0 1px, transparent 1px 12px),
    rgba(8, 10, 15, 0.3);
}
.geier-mode-img {
  position: absolute;
  left: 50%;
  bottom: -12px;
  transform: translateX(calc(-50% - 8px));
  width: auto;
  height: 136px;
  pointer-events: none;
  z-index: 2;
  filter: drop-shadow(0 7px 9px rgba(0, 0, 0, 0.5));
}
/* Freigestellte Artworks sitzen "perched" auf der Kante zur Copy – Art darf unten ueberstehen. */
.geier-mode-art:has(.geier-mode-img) { overflow: visible; }

/* Feintuning: einzelne Freisteller ein paar px tiefer setzen. */
.geier-mode-card.accent-gold .geier-mode-img,
.geier-mode-card.accent-red .geier-mode-img,
.geier-mode-card.accent-violet .geier-mode-img,
.geier-mode-card.accent-green .geier-mode-img { bottom: -18px; }

/* Hintergrund pro Modus als Theme. */
/* Geier Royale = "Classic": royalblau + Gold-Glow von unten. */
.geier-mode-card.accent-gold .geier-mode-art {
  background:
    radial-gradient(120% 82% at 50% 100%, rgba(255, 200, 77, 0.30), rgba(255, 200, 77, 0) 62%),
    radial-gradient(95% 72% at 50% 26%, rgba(91, 140, 255, 0.34), rgba(91, 140, 255, 0) 72%),
    linear-gradient(160deg, #1a2a55 0%, #101a34 60%, #0d1220 100%);
}
/* Geier Out: violettes Theme (passend zum Card-Akzent). */
.geier-mode-card.accent-violet .geier-mode-art {
  background:
    radial-gradient(120% 82% at 50% 100%, rgba(168, 121, 255, 0.30), rgba(168, 121, 255, 0) 62%),
    radial-gradient(95% 72% at 50% 26%, rgba(120, 80, 200, 0.32), rgba(120, 80, 200, 0) 72%),
    linear-gradient(160deg, #2a1c4d 0%, #1a1230 60%, #120c1f 100%);
}
/* Imposter Royale: mittig rot, aussen schwarz. */
.geier-mode-card.accent-pink .geier-mode-art {
  background: radial-gradient(82% 78% at 50% 44%, rgba(224, 42, 54, 0.62), rgba(120, 16, 26, 0.34) 46%, #0a0607 82%);
}
/* Mega Draft: blau. */
.geier-mode-card.accent-blue .geier-mode-art {
  background:
    radial-gradient(120% 82% at 50% 100%, rgba(91, 140, 255, 0.30), rgba(91, 140, 255, 0) 62%),
    radial-gradient(95% 72% at 50% 26%, rgba(120, 170, 255, 0.22), rgba(120, 170, 255, 0) 72%),
    linear-gradient(160deg, #16264d 0%, #0e1830 60%, #0b1120 100%);
}
/* Mega Draft: Hard Core: dunkelrot. */
.geier-mode-card.accent-red .geier-mode-art {
  background:
    radial-gradient(120% 82% at 50% 100%, rgba(255, 94, 104, 0.32), rgba(255, 94, 104, 0) 62%),
    radial-gradient(95% 72% at 50% 26%, rgba(200, 40, 50, 0.26), rgba(200, 40, 50, 0) 72%),
    linear-gradient(160deg, #431521 0%, #290d15 60%, #150a0d 100%);
}
/* Snake Royale: gruen. */
.geier-mode-card.accent-green .geier-mode-art {
  background:
    radial-gradient(120% 82% at 50% 100%, rgba(62, 203, 110, 0.30), rgba(62, 203, 110, 0) 62%),
    radial-gradient(95% 72% at 50% 26%, rgba(40, 160, 90, 0.24), rgba(40, 160, 90, 0) 72%),
    linear-gradient(160deg, #123a26 0%, #0d2418 60%, #0a1610 100%);
}
/* Speed Royale: cyan. */
.geier-mode-card.accent-cyan .geier-mode-art {
  background:
    radial-gradient(120% 82% at 50% 100%, rgba(45, 212, 218, 0.30), rgba(45, 212, 218, 0) 62%),
    radial-gradient(95% 72% at 50% 26%, rgba(56, 189, 248, 0.24), rgba(56, 189, 248, 0) 72%),
    linear-gradient(160deg, #103a45 0%, #0c2430 60%, #0a1720 100%);
}

/* --- Geier identity gate + profile chip -------------------------------- */
.geier-identity {
  position: relative; z-index: 1;
  display: inline-flex; align-items: center; gap: 8px;
  padding: 5px 12px 5px 5px; border-radius: 999px; cursor: pointer;
  color: #f1f5f9; font: inherit; font-weight: 800; font-size: 0.86rem;
  border: 1px solid rgba(255, 255, 255, 0.16);
  background: rgba(8, 10, 15, 0.55); backdrop-filter: blur(6px);
}
.geier-identity:hover { border-color: rgba(255, 255, 255, 0.34); }
.geier-avatar {
  position: relative; width: 30px; height: 30px; border-radius: 50%;
  line-height: 1; flex: none; overflow: hidden;
  background: var(--emote-c, #26324a);
  background:
    radial-gradient(120% 92% at 50% 116%, color-mix(in srgb, var(--emote-c) 74%, #fff 6%), transparent 58%),
    linear-gradient(180deg, #0e1320, color-mix(in srgb, var(--emote-c) 26%, #0b0f18));
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.16), inset 0 0 0 1px rgba(255, 255, 255, 0.12), inset 0 -5px 8px rgba(0, 0, 0, 0.3);
}
.geier-avatar img {
  position: absolute; left: calc(50% + var(--ava-dx, 0%)); bottom: var(--ava-dy, -5%);
  transform: translateX(-50%);
  height: var(--ava-h, 92%); width: auto; display: block;
}
.geier-gate {
  position: absolute; inset: 0; z-index: 20; border-radius: 8px;
  display: grid; place-items: center; padding: 24px;
  background: radial-gradient(120% 80% at 50% 0%, rgba(10, 14, 26, 0.42), rgba(6, 8, 13, 0.66));
  backdrop-filter: blur(2.5px) saturate(1.05);
}
.geier-gate-card {
  position: relative; width: min(430px, 100%); display: grid; gap: 11px; padding: 26px 24px 22px;
  border-radius: 14px; border: 1px solid rgba(99, 125, 215, 0.5);
  background:
    repeating-linear-gradient(135deg, rgba(255, 255, 255, 0.022) 0 1px, transparent 1px 13px),
    radial-gradient(120% 82% at 50% 100%, rgba(255, 200, 77, 0.14), rgba(255, 200, 77, 0) 60%),
    radial-gradient(95% 72% at 50% 14%, rgba(91, 140, 255, 0.34), rgba(91, 140, 255, 0) 70%),
    linear-gradient(160deg, #1a2a55 0%, #101a34 58%, #0d1220 100%);
  box-shadow:
    0 24px 70px rgba(0, 0, 0, 0.6),
    inset 0 0 0 1px rgba(88, 124, 255, 0.16),
    inset 0 0 44px rgba(88, 124, 255, 0.07),
    inset 0 1px 0 rgba(255, 255, 255, 0.09);
}
.geier-gate-card::before {
  content: ""; position: absolute; left: 24px; right: 24px; top: 0; height: 2px; border-radius: 2px;
  background: linear-gradient(90deg, transparent, rgba(245, 185, 59, 0.8), transparent);
}
.geier-shell .geier-gate-close {
  position: absolute; top: 14px; right: 14px; z-index: 2;
  display: inline-flex; width: 32px; height: 32px; align-items: center; justify-content: center;
  padding: 0; cursor: pointer; border: 1px solid rgba(255, 255, 255, .13); border-radius: 7px;
  background: rgba(7, 11, 19, .34); color: rgba(226, 233, 248, .72);
  transition: color .15s ease, border-color .15s ease, background .15s ease, transform .15s ease;
}
.geier-shell .geier-gate-close:hover { color: #fff; border-color: rgba(126, 162, 255, .48); background: rgba(91, 140, 255, .14); transform: translateY(-1px); }
.geier-shell .geier-gate-close:focus-visible { outline: 2px solid #aac1ff; outline-offset: 2px; }
.geier-gate-close svg { display: block; }
.geier-gate-card h3 { margin: 2px 0 0; color: #f1f5f9; font-size: 1.25rem; }
.geier-gate-sub { margin: 0 0 6px; color: #94a3b8; font-size: 0.85rem; }
.geier-gate-field { display: grid; gap: 5px; }
.geier-gate-field > span, .geier-gate-label {
  color: #cbd5e1; font-size: 0.72rem; font-weight: 800; letter-spacing: 0.1em; text-transform: uppercase;
}
.geier-gate-field input {
  padding: 10px 12px; border-radius: 9px; color: #f1f5f9; font: inherit;
  border: 1px solid rgba(255, 255, 255, 0.14); background: rgba(0, 0, 0, 0.28);
}
.geier-gate-field input:focus { outline: none; border-color: #5b8cff; }
.geier-avatar-picker { display: flex; flex-wrap: wrap; gap: 10px; padding-top: 8px; }
.geier-avatar-option {
  position: relative; width: 52px; height: 52px; border-radius: 50%; cursor: pointer; padding: 0;
  overflow: hidden; border: none; line-height: 1;
  background: var(--emote-c, #26324a);
  background:
    radial-gradient(120% 92% at 50% 116%, color-mix(in srgb, var(--emote-c) 78%, #fff 6%), transparent 58%),
    radial-gradient(92% 74% at 50% 24%, color-mix(in srgb, var(--emote-c) 30%, transparent), transparent 74%),
    linear-gradient(166deg, color-mix(in srgb, var(--emote-c) 20%, #0d121d), color-mix(in srgb, var(--emote-c) 8%, #0a0e16));
  box-shadow:
    inset 0 1px 0 rgba(255, 255, 255, 0.16),
    inset 0 0 0 1px rgba(255, 255, 255, 0.10),
    inset 0 -8px 12px rgba(0, 0, 0, 0.34),
    0 3px 8px rgba(0, 0, 0, 0.4);
  transition: box-shadow 0.15s ease, filter 0.15s ease;
}
.geier-avatar-option img {
  position: absolute; left: calc(50% + var(--ava-dx, 0%)); bottom: var(--ava-dy, -5%);
  transform: translateX(-50%);
  height: var(--ava-h, 95%); width: auto; pointer-events: none;
  filter: drop-shadow(0 2px 3px rgba(0, 0, 0, 0.45));
}
.geier-avatar-option:hover {
  filter: brightness(1.08);
  box-shadow:
    inset 0 1px 0 rgba(255, 255, 255, 0.2),
    inset 0 0 0 1px rgba(255, 255, 255, 0.14),
    inset 0 -8px 12px rgba(0, 0, 0, 0.3),
    0 3px 10px rgba(0, 0, 0, 0.45),
    0 0 0 2px rgba(125, 211, 252, 0.4);
}
.geier-avatar-option.selected {
  box-shadow:
    inset 0 1px 0 rgba(255, 255, 255, 0.22),
    inset 0 -8px 12px rgba(0, 0, 0, 0.3),
    0 0 0 2px var(--geier-gold),
    0 4px 12px rgba(0, 0, 0, 0.5);
}
.geier-gate-actions { display: flex; gap: 10px; margin-top: 8px; justify-content: center; }
/* WICHTIG: `.geier-shell .geier-gate-save` statt nur `.geier-gate-save`, sonst
   ueberschreibt die Regel `.geier-shell button { font: inherit; color: inherit }`
   (hoehere Spezifitaet) Schrift + Farbe -> genau das machte den Button vorher
   duenn/unlesbar. Stil: blauer Spiel-Button, Clash-Display-Schrift in GROSSBUCHSTABEN
   (wie die Merge-Tactics-Caps), weisse Schrift + Glow. Kein Pfeil, zentriert. */
.geier-shell .geier-gate-save {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 106px; min-height: 38px; padding: 0.4rem 1.1rem; cursor: pointer;
  border: 1px solid rgba(176, 196, 255, 0.55); border-radius: 9px;
  background: linear-gradient(180deg, #6d8bff, #3358cf);
  color: #ffffff;
  font-family: "Inter", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
  font-size: 0.82rem; font-weight: 800; line-height: 1; text-transform: uppercase; letter-spacing: 0.03em;
  text-shadow: 0 1px 2px rgba(4, 10, 30, 0.4);
  box-shadow: 0 4px 12px rgba(49, 91, 212, 0.32), 0 0 16px rgba(109, 139, 255, 0.36);
  transition: transform 0.15s ease, box-shadow 0.15s ease, filter 0.15s ease, background 0.15s ease;
}
.geier-shell .geier-gate-save:hover {
  transform: translateY(-1px); filter: brightness(1.06);
  background: linear-gradient(180deg, #7f9bff, #3d68e0);
  box-shadow: 0 9px 24px rgba(49, 91, 212, 0.46), 0 0 30px rgba(120, 148, 244, 0.58);
}
.geier-shell .geier-gate-save:active { transform: translateY(0); }
.geier-shell .geier-gate-save:focus-visible { outline: 2px solid #aac1ff; outline-offset: 3px; }
/* Icon-Button (Muelleimer). `.geier-shell ...` noetig, sonst ueberschreibt
   `.geier-shell button { color: inherit }` die rote Farbe (currentColor -> SVG). */
.geier-shell .geier-gate-delete {
  display: inline-flex; align-items: center; justify-content: center;
  width: 38px; min-height: 38px; padding: 0; cursor: pointer; border-radius: 9px;
  color: #ff8f8f; background: rgba(224, 65, 58, 0.12); border: 1px solid rgba(224, 65, 58, 0.5);
  transition: color 0.15s ease, background 0.15s ease, border-color 0.15s ease;
}
.geier-shell .geier-gate-delete:hover {
  color: #ffb3b3; background: rgba(224, 65, 58, 0.2); border-color: rgba(224, 65, 58, 0.72);
}
.geier-gate-delete svg { display: block; }
.geier-gate-error { margin: 0; color: #ff8f8f; font-size: 0.82rem; }
.geier-art-placeholder {
  display: grid;
  min-width: 112px;
  min-height: 58px;
  place-items: center;
  align-content: center;
  gap: 2px;
  border: 1px dashed rgba(148, 163, 184, 0.28);
  border-radius: 7px;
  color: rgba(226, 233, 248, 0.42);
  text-align: center;
}
.geier-art-placeholder b { font-size: 0.62rem; letter-spacing: 0.1em; text-transform: uppercase; }
.geier-art-placeholder small { color: var(--mode-accent); font-size: 0.58rem; font-weight: 900; letter-spacing: 0.14em; }
.geier-mode-copy { display: block; padding: 12px 14px 14px; }
.geier-mode-card h4 { margin: 0 0 0.3rem; color: #f1f5f9; font-size: 0.95rem; }
.geier-mode-card p { margin: 0; color: #94a3b8; font-size: 0.76rem; line-height: 1.4; }
.mode-state { position: absolute; top: 0.7rem; right: 0.75rem; color: #6f7c91; font-size: 0.56rem; font-weight: 800; letter-spacing: 0.1em; text-transform: uppercase; }
.mode-state.primary { color: var(--mode-accent); }
.accent-blue { --mode-accent: #5b8cff; }.accent-red { --mode-accent: #ff5e68; }.accent-violet { --mode-accent: #a879ff; }
.accent-pink { --mode-accent: #ff75bd; }.accent-green { --mode-accent: #54d898; }.accent-cyan { --mode-accent: #45d6e7; }

.geier-mode-card.is-entering {
  opacity: 0;
  animation: geierModeCardIn 0.52s cubic-bezier(0.18, 0.9, 0.22, 1) forwards;
  animation-delay: var(--geier-mode-delay, 0ms);
}
.geier-mode-card:nth-child(1) { --geier-mode-delay: 30ms; }
.geier-mode-card:nth-child(2) { --geier-mode-delay: 85ms; }
.geier-mode-card:nth-child(3) { --geier-mode-delay: 140ms; }
.geier-mode-card:nth-child(4) { --geier-mode-delay: 195ms; }
.geier-mode-card:nth-child(5) { --geier-mode-delay: 250ms; }
.geier-mode-card:nth-child(6) { --geier-mode-delay: 305ms; }
.geier-mode-card:nth-child(7) { --geier-mode-delay: 360ms; }
@keyframes geierModeCardIn {
  from { opacity: 0; transform: translateY(14px) scale(.982); filter: blur(4px); }
  to { opacity: 1; transform: none; filter: none; }
}

.geier-mode-setup {
  animation: geierSetupIn 0.42s cubic-bezier(.2, .8, .2, 1);
  transform-origin: 50% 20%;
}
.geier-setup-header { display: grid; max-width: 820px; justify-items: start; gap: 0.8rem; margin: 0 auto 1.2rem; }
/* Etwas Platz unter den Spielregeln, bevor das Formular beginnt. */
#geier-mode-setup .geier-setup-header { margin-bottom: 1.15rem; }
/* Header-Text schmaler halten, damit Titel/Regeln nicht hinter das Mode-Artwork
   laufen, das oben rechts auf der Box sitzt (frueher Zeilenumbruch). */
.geier-setup-header > div { min-width: 0; max-width: 620px; }
.geier-setup-header span { color: var(--geier-gold); font-size: 0.64rem; font-weight: 850; letter-spacing: 0.13em; text-transform: uppercase; }
.geier-setup-header h3 { margin: 0.08rem 0 0.18rem; color: #fff; font-size: 1.55rem; }
.geier-setup-header p { margin: 0; color: var(--geier-muted); font-size: 0.78rem; }
/* Spielregeln: Schriftrolle + Regeltext in der Typo der Settings-Labels (Players,
   Cards per round, ...), nur groesser - hebt die Regeln vom uebrigen Kleintext ab. */
.geier-setup-rules { display: flex; align-items: center; gap: 10px; margin-top: 0.34rem; }
.geier-setup-rules-ico { flex: 0 0 auto; width: 36px; height: 36px; object-fit: contain; }
.geier-setup-header .geier-setup-rules p { color: #d5deed; font-size: 0.95rem; font-weight: 750; }

/* Back-Button sitzt oben links auf Hoehe der Create/Join-Nav (absolut im #geier-home,
   nimmt also KEINEN eigenen Vertikal-Space weg). Er wird erst nach der Setup-Einblendung
   sichtbar - waehrend deren Transform waere die absolute Verankerung sonst kurz verschoben. */
.geier-setup-backrow { position: absolute; top: 23px; left: 24px; z-index: 6; margin: 0; animation: geierBackIn .3s ease .42s both; }
@keyframes geierBackIn { from { opacity: 0; } to { opacity: 1; } }
.geier-shell .geier-setup-return {
  display: inline-flex; align-items: center; gap: 6px;
  color: #d5deed !important;
  font-size: 0.72rem; font-weight: 750; letter-spacing: 0.1em; text-transform: uppercase;
  padding: 0.34rem 0.7rem 0.34rem 0.55rem;
}
.geier-shell .geier-setup-return > span { line-height: 1; }
/* SVG-Chevron: flach/stumpf, saubere Dicke - KEINE Hover-Bewegung (nur die Buttonflaeche reagiert). */
.geier-shell .geier-setup-return .geier-back-ico { width: 15px; height: 15px; flex: none; }
@keyframes geierSetupIn {
  from { opacity: 0; transform: translateX(18px) scale(.985); filter: blur(3px); }
  to { opacity: 1; transform: none; filter: none; }
}

.geier-entry-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; margin-top: 2.2rem; }
.geier-mode-setup .geier-entry-grid { margin-top: 0; }
.geier-entry-card { position: relative; padding: 1.5rem; overflow: hidden; border: 1px solid var(--geier-line); border-radius: 18px; background: var(--geier-panel); }
.geier-entry-card.create { border-top-color: rgba(255, 200, 77, 0.5); }
.geier-entry-card.join { border-top-color: rgba(91, 140, 255, 0.55); }
.entry-number { position: absolute; top: 0.35rem; right: 1rem; color: rgba(255, 255, 255, 0.04); font-family: "Clash Display", sans-serif; font-size: 4.8rem; line-height: 1; }
.entry-title { position: relative; z-index: 1; padding-right: 3rem; }
.entry-title h3 { margin: 0.12rem 0 0.35rem; color: #fff; font-size: 1.18rem; }
.entry-title p { margin: 0; color: var(--geier-muted); font-size: 0.78rem; }

.geier-form { position: relative; z-index: 1; display: grid; gap: 0.82rem; margin-top: 1.25rem; }
.geier-form label { display: grid; gap: 0.32rem; }
.geier-form label > span:first-child { color: #aeb9ca; font-size: 0.68rem; font-weight: 750; }
.geier-form input[type="text"], .geier-form input[type="number"], .geier-form select {
  width: 100%; max-width: none; min-width: 0; height: 43px; padding: 0 0.75rem;
  border: 1px solid #2b3545; border-radius: 10px; outline: none;
  background: #0b111c; color: #f0f4fb; font-size: 0.83rem;
}
.geier-form input:focus, .geier-form select:focus { border-color: #5b8cff; box-shadow: 0 0 0 3px rgba(91, 140, 255, 0.12); }
.geier-form select:disabled, .geier-form input:disabled { color: #758197; cursor: not-allowed; opacity: 0.75; }
.geier-form-row { display: grid; grid-template-columns: 1fr 1fr; gap: 0.7rem; }
.geier-input-unit { position: relative; }
.geier-input-unit input { padding-right: 2.7rem !important; }
.geier-input-unit small { position: absolute; top: 50%; right: 0.7rem; transform: translateY(-50%); color: #6f7c91; font-size: 0.66rem; }
.geier-code-input { text-transform: uppercase; letter-spacing: 0.2em; font-weight: 850; }

.geier-switch { grid-template-columns: auto auto 1fr; align-items: center; gap: 0.65rem !important; min-height: 42px; cursor: pointer; }
.geier-switch input { position: absolute; opacity: 0; pointer-events: none; }
.switch-track { position: relative; width: 38px; height: 22px; border-radius: 999px; background: #293345; transition: background 150ms; }
.switch-track::after { content: ""; position: absolute; top: 3px; left: 3px; width: 16px; height: 16px; border-radius: 50%; background: #9ba7b9; transition: transform 150ms, background 150ms; }
.geier-switch input:checked + .switch-track { background: #315fce; }
.geier-switch input:checked + .switch-track::after { transform: translateX(16px); background: #fff; }
.geier-switch > span:last-child { display: grid; }
.geier-switch b { color: #dce4f1; font-size: 0.75rem; }
.geier-switch small { color: #77849a; font-size: 0.65rem; }

.geier-primary-action, .geier-secondary-action {
  display: flex; align-items: center; justify-content: space-between; gap: 0.75rem;
  min-height: 44px; padding: 0 0.9rem; cursor: pointer;
  border: 1px solid transparent; border-radius: 11px; font-size: 0.76rem; font-weight: 850;
}
.geier-primary-action { background: linear-gradient(135deg, #f4b82d, #ffcf59); color: #201704 !important; box-shadow: 0 8px 20px rgba(245, 185, 59, 0.16); }
/* Eigener Hover-Hintergrund: sonst faerbt die globale Regel `button:hover`
   (background: --primary-d) den goldenen Button beim Hover blau. */
.geier-primary-action:hover { filter: brightness(1.05); background: linear-gradient(135deg, #f6bd35, #ffd463); }
.geier-secondary-action { border-color: #344156; background: #182232; color: #d8e1ee !important; }
.geier-secondary-action:hover { border-color: #5b8cff; background: #1c2940; }
.geier-join-actions { display: grid; grid-template-columns: 1fr 1fr; gap: 0.55rem; }
.geier-release-note { display: flex; gap: 0.7rem; align-items: flex-start; margin-top: 1rem; padding: 0.8rem; border: 1px dashed #303a4a; border-radius: 11px; background: rgba(255, 255, 255, 0.02); }
.geier-release-note > span { font-size: 0.9rem; filter: grayscale(1); opacity: 0.65; }
.geier-release-note div { display: grid; }
.geier-release-note b { color: #aab5c6; font-size: 0.7rem; }
.geier-release-note small { color: #657187; font-size: 0.64rem; }

.geier-lobby-tabs {
  display: flex; width: fit-content; max-width: 100%; margin: 0 auto 22px;
}
.geier-lobby-tabs button {
  display: flex; align-items: center; justify-content: center; gap: 8px; min-width: 170px; min-height: 36px;
}
.geier-lobby-tabs button > span { color: #7183a1; font-size: .9rem; font-weight: 900; }
.geier-lobby-tabs button.active > span { color: #ffd166; }

.geier-create-setup {
  /* Der Abstand nach oben kommt jetzt aus .geier-setup-backrow (siehe dort). */
  max-width: 820px; margin: 0 auto; padding: 24px;
  overflow: visible; border: 1px solid var(--panel-border); border-radius: 8px;
  background: var(--panel-bg);
  box-shadow: var(--panel-shadow);
}
.geier-create-setup::before {
  content: ""; position: absolute; top: 0; left: 10%; right: 10%; height: 1px;
  background: var(--panel-line);
  box-shadow: 0 0 8px rgba(89, 122, 255, 0.5); pointer-events: none;
}
.geier-setup-art {
  --setup-art-height: 108px;
  position: absolute; z-index: 3; top: calc(var(--setup-art-overlap, 18px) - var(--setup-art-height)); right: 24px;
  width: auto; height: var(--setup-art-height); object-fit: contain; pointer-events: none;
  filter: drop-shadow(0 10px 10px rgba(0, 0, 0, 0.42));
}
.geier-setting-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
/* Flex statt fester 3-Spalten-Grid: blendet ein Feld modusabhaengig aus (Cards nur bei
   Geier Royale), bleiben die uebrigen zentriert statt links zu kleben. */
.geier-range-grid { display: flex; flex-wrap: wrap; justify-content: center; gap: 10px; }
.geier-range-grid > * { flex: 1 1 190px; min-width: 0; max-width: 250px; }
.geier-wide-field > span small { margin-left: 5px; color: #68758a; font-weight: 600; }
.geier-form .geier-range-field {
  align-content: start; gap: 3px; min-width: 0; padding: 10px 12px 8px;
  border: 1px solid rgba(126, 151, 218, .22); border-radius: 7px;
  background: rgba(6, 11, 19, .34); box-shadow: inset 0 1px rgba(255, 255, 255, .025);
}
.geier-range-field > span { display: flex; align-items: center; min-height: 22px; color: #d5deed !important; }
.geier-setting-label { gap: 7px; }
.geier-setting-label img { width: 22px; height: 22px; object-fit: contain; filter: drop-shadow(0 2px 3px rgba(0, 0, 0, .34)); }
.geier-range-field output { display: grid; min-width: 34px; height: 29px; place-items: center; border: 1px solid #3a4659; border-radius: 6px; background: #141d2c; color: #ffd166; font-size: .76rem; line-height: 1; font-weight: 900; }
.geier-range-control { position: relative; padding-top: 37px; overflow: visible; }
.geier-range-control output {
  position: absolute; top: 1px; left: var(--range-x, 9px);
  z-index: 2; transform: translateX(-50%); pointer-events: none;
  border-color: rgba(255, 200, 77, .5); background: #1b2230; box-shadow: 0 4px 10px rgba(0,0,0,.28);
}
.geier-range-control output::after { content: ""; position: absolute; left: 50%; bottom: -4px; width: 7px; height: 7px; transform: translateX(-50%) rotate(45deg); border-right: 1px solid rgba(255, 200, 77, .5); border-bottom: 1px solid rgba(255, 200, 77, .5); background: #1b2230; }
.geier-form input[type="range"] {
  --geier-thumb-size: 18px;
  width: 100%; height: 22px; padding: 0; cursor: pointer; appearance: none;
  border: 0; border-radius: 0; box-shadow: none;
  background: linear-gradient(90deg, #ffc84d 0 var(--range-progress), #354155 var(--range-progress) 100%) center / 100% 5px no-repeat;
}
.geier-form input[type="range"]::-webkit-slider-thumb {
  width: var(--geier-thumb-size); height: var(--geier-thumb-size); appearance: none;
  border: 2px solid #fff0c4; border-radius: 50%; background: #ffc84d;
  box-shadow: 0 2px 8px rgba(0, 0, 0, .42), 0 0 0 3px rgba(255, 200, 77, .13);
}
.geier-form input[type="range"]::-moz-range-thumb {
  width: var(--geier-thumb-size); height: var(--geier-thumb-size);
  border: 2px solid #fff0c4; border-radius: 50%; background: #ffc84d;
  box-shadow: 0 2px 8px rgba(0, 0, 0, .42), 0 0 0 3px rgba(255, 200, 77, .13);
}
.geier-segment-field { min-width: 0; margin: 0; padding: 0; border: 0; }
.geier-segment-field legend { margin-bottom: 5px; color: #aeb9ca; font-size: 0.68rem; font-weight: 750; }
.geier-segment-field legend.geier-segment-title { display: flex; align-items: center; gap: 6px; }
.geier-segment-title img { width: 19px; height: 19px; object-fit: contain; filter: drop-shadow(0 2px 3px rgba(0, 0, 0, .3)); }
.geier-segments { position: relative; display: grid; grid-auto-flow: column; grid-auto-columns: 1fr; padding: 3px; overflow: hidden; border: 1px solid #2b3545; border-radius: 7px; background: #0b111c; }
.geier-segments::before {
  content: ""; position: absolute; top: 3px; bottom: 3px; left: 3px; z-index: 0;
  width: calc((100% - 6px) / 2); border-radius: 5px;
  background: #315bd4; box-shadow: 0 2px 9px rgba(32, 66, 164, .36);
  transition: transform .28s cubic-bezier(.4, 0, .2, 1), background .22s ease, box-shadow .22s ease;
}
.geier-segments:has(label:nth-child(3))::before { width: calc((100% - 6px) / 3); }
.geier-segments:has(label:nth-child(2) input:checked)::before { transform: translateX(100%); }
.geier-segments:has(label:nth-child(3) input:checked)::before { transform: translateX(200%); }
.geier-segments label { position: relative; z-index: 1; display: block; min-width: 0; cursor: pointer; }
.geier-segments input { position: absolute; opacity: 0; pointer-events: none; }
.geier-segments span { display: flex; min-height: 32px; align-items: center; justify-content: center; gap: 5px; padding: 0 6px; color: #8f9bb0; font-size: 0.66rem; font-weight: 800; transition: color .2s ease; }
.geier-segments span::before { content: ""; width: 6px; height: 6px; flex: none; border-radius: 50%; background: var(--choice-color, #5b8cff); box-shadow: 0 0 7px color-mix(in srgb, var(--choice-color) 55%, transparent); }
.geier-segments input:checked + span { color: #fff; }
.geier-segments input[value="easy"] + span { --choice-color: #58d99c; }
.geier-segments input[value="hard"] + span { --choice-color: #ffc84d; }
.geier-segments input[value="extreme"] + span { --choice-color: #ff727c; }
.geier-segments input[value="public"] + span, .geier-segments input[value="member"] + span { --choice-color: #6d8bff; }
.geier-segments input[value="private"] + span { --choice-color: #f0b95b; }
.geier-segments input[value="visitor"] + span { --choice-color: #45d6e7; }
.geier-segments:has(input[value="easy"]:checked)::before { background: #176b49; box-shadow: 0 2px 10px rgba(36, 151, 102, .28); }
.geier-segments:has(input[value="hard"]:checked)::before { background: #80550e; box-shadow: 0 2px 10px rgba(209, 147, 31, .25); }
.geier-segments:has(input[value="extreme"]:checked)::before { background: #852c36; box-shadow: 0 2px 10px rgba(202, 63, 77, .28); }
.geier-segments:has(input[value="private"]:checked)::before { background: #72521c; box-shadow: 0 2px 10px rgba(192, 135, 35, .23); }
.geier-segments:has(input[value="visitor"]:checked)::before { background: #176577; box-shadow: 0 2px 10px rgba(40, 166, 191, .23); }
.geier-pool-tabs {
  width: min(360px, 100%); margin: 3px auto 2px;
}
.geier-pool-tabs button {
  display: inline-flex; flex: 1 1 50%; align-items: center; justify-content: center; gap: 7px;
}
.geier-pool-tab-icon {
  width: 20px; height: 20px; flex: none; object-fit: contain;
  filter: drop-shadow(0 2px 3px color-mix(in srgb, var(--geier-bg) 62%, transparent));
}
.geier-difficulty-icon-outline,
.geier-difficulty-icon-needle-outline {
  stroke: var(--geier-bg); stroke-width: 5;
}
.geier-difficulty-icon-arc { stroke: var(--win); stroke-width: 3; }
.geier-difficulty-icon-needle { stroke: var(--geier-gold); stroke-width: 2.6; }
.geier-difficulty-icon-hub-outline { fill: var(--geier-bg); stroke: var(--geier-bg); stroke-width: 1.5; }
.geier-difficulty-icon-hub { fill: var(--geier-gold); stroke: var(--geier-gold); }
.geier-pool-stage {
  min-width: 0; transition: height .28s cubic-bezier(.22, 1, .36, 1);
}
.geier-pool-stage.is-resizing { overflow: hidden; }
.geier-pool-stage.is-resizing > * { pointer-events: none; }
.geier-card-filter-block { min-width: 0; }
.geier-card-filter-toggle {
  display: flex; width: 100%; min-height: 42px; align-items: center; gap: 9px; padding: 7px 10px;
  border: 1px solid var(--panel-inset-border); border-radius: var(--panel-radius);
  background: var(--panel-inset); color: var(--panel-text); text-align: left;
}
.geier-card-filter-toggle > img { width: 22px; height: 22px; flex: none; }
.geier-card-filter-toggle > span { display: grid; flex: 1; gap: 1px; }
.geier-card-filter-toggle b { font-size: .72rem; }
.geier-card-filter-toggle small { color: var(--panel-muted); font-size: .6rem; }
.geier-filter-enabled { width: 96px; height: 25px; min-height: 25px; flex: none; padding: 2px; }
.geier-filter-enabled::before { top: 2px; bottom: 2px; }
.geier-filter-enabled label { min-height: 21px; }
.geier-filter-enabled span { min-height: 21px; gap: 3px; padding: 0 5px; font-size: .58rem; font-weight: 850; letter-spacing: .04em; text-transform: uppercase; }
.geier-filter-enabled span::before { width: 4px; height: 4px; box-shadow: none; }
.geier-filter-enabled input[value="off"] + span { --choice-color: var(--panel-muted); }
.geier-filter-enabled input[value="on"] + span { --choice-color: var(--win); }
.geier-filter-enabled:has(input[value="on"]:checked)::before { background: color-mix(in srgb, var(--win) 38%, var(--geier-bg)); box-shadow: 0 2px 7px color-mix(in srgb, var(--win) 24%, transparent); }
.geier-card-filter-reveal {
  display: grid; grid-template-rows: 1fr;
  transition: grid-template-rows .28s cubic-bezier(.22, 1, .36, 1), opacity .18s ease, margin-top .28s cubic-bezier(.22, 1, .36, 1);
}
.geier-card-filter-reveal > div { min-height: 0; overflow: hidden; }
.geier-card-filter-block.is-collapsible .geier-card-filter-reveal {
  grid-template-rows: 0fr; margin-top: 0; opacity: 0;
}
.geier-card-filter-block.is-collapsible.is-open .geier-card-filter-reveal {
  grid-template-rows: 1fr; margin-top: 7px; opacity: 1;
}
.geier-card-filter-map {
  position: relative; width: 100%; min-width: 0; padding: 12px; overflow: hidden;
  border: 1px solid var(--panel-inset-border); border-radius: var(--panel-radius);
  background:
    linear-gradient(color-mix(in srgb, var(--panel-text) 3.5%, transparent) 1px, transparent 1px) 0 0 / 20px 20px,
    linear-gradient(90deg, color-mix(in srgb, var(--panel-text) 3.5%, transparent) 1px, transparent 1px) 0 0 / 20px 20px,
    var(--panel-inset);
  box-shadow: inset 0 1px color-mix(in srgb, var(--panel-text) 3%, transparent);
  transform-origin: top center;
}
.geier-card-filter-head {
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  padding: 0 2px 10px; border-bottom: 1px solid var(--geier-line);
}
.geier-card-filter-head > div { display: grid; gap: 2px; }
.geier-card-filter-head strong { color: var(--panel-text); font-size: .76rem; }
.geier-card-filter-head > div > span { color: var(--panel-muted); font-size: .66rem; }
.geier-card-filter-command { display: grid; justify-items: center; gap: 7px; padding: 10px 2px 1px; }
.geier-card-filter-actions {
  display: flex; overflow: hidden; border: 1px solid var(--panel-border); border-radius: 7px;
  background: color-mix(in srgb, var(--panel-bg) 54%, transparent); box-shadow: inset 0 1px color-mix(in srgb, var(--panel-text) 4%, transparent);
}
.geier-card-filter-actions button {
  display: inline-flex; align-items: center; justify-content: center; gap: 5px; min-height: 27px; padding: 3px 10px;
  border: 0; border-radius: 0; background: transparent; color: var(--panel-text); font-size: .62rem; font-weight: 850; letter-spacing: .035em; text-transform: uppercase;
}
.geier-card-filter-actions button + button { border-left: 1px solid var(--panel-border); }
.geier-card-filter-actions button:hover { background: color-mix(in srgb, var(--geier-gold) 12%, transparent); }
.geier-card-filter-actions button:focus-visible { outline: 2px solid var(--geier-gold); outline-offset: -2px; }
.geier-card-filter-actions button span { color: var(--geier-gold); font-size: .78rem; line-height: 1; }
.geier-card-filter-count {
  padding: 3px 8px; color: var(--panel-muted); font-size: .58rem; font-weight: 800; letter-spacing: .07em; text-transform: uppercase;
}
.geier-card-filter-count b { color: var(--geier-gold); }
.geier-card-filter-grid {
  display: grid; grid-template-columns: repeat(auto-fill, minmax(40px, 1fr));
  gap: 4px; margin-top: 10px;
}
.geier-pool-card {
  min-width: 0;
  transition: opacity .2s ease, filter .2s ease, transform .2s cubic-bezier(.22, 1, .36, 1), border-color .12s, background .12s;
}
.geier-card-filter-grid.is-revealing .geier-pool-card {
  animation: geierPoolCardEnter .18s cubic-bezier(.22, 1, .36, 1) both;
  animation-delay: calc(180ms + var(--geier-card-index, 0) * 5ms);
}
.geier-pool-card.is-removed {
  cursor: pointer; opacity: .27; filter: grayscale(1) brightness(.58); transform: scale(.92);
}
.geier-pool-card.is-removed:hover {
  opacity: .42; transform: scale(.94);
}
.geier-pool-card.is-toggling { animation: geierPoolCardToggle .24s ease; }
.geier-pool-card:focus-visible {
  outline: 2px solid var(--geier-gold); outline-offset: 1px;
}
@keyframes geierPoolCardEnter { from { opacity: 0; transform: translateY(5px) scale(.94); } }
@keyframes geierPoolCardToggle {
  45% { transform: scale(.82); }
}
.geier-card-filter-warning {
  margin: 7px 0 0; padding: 8px 9px;
  border-left: 3px solid var(--loss); border-radius: 0 6px 6px 0;
  background: color-mix(in srgb, var(--loss) 10%, transparent);
  color: var(--panel-text); font-size: .66rem; line-height: 1.4;
}
.geier-settings-panel .geier-card-filter-grid { grid-template-columns: repeat(auto-fill, minmax(36px, 1fr)); }
.geier-difficulty-field { display: grid; justify-items: center; margin-bottom: 10px; }
.geier-difficulty-field > legend { width: 100%; text-align: center; }
.geier-difficulty-meter {
  --needle-angle: -60deg; --gauge-current: #54d898;
  position: relative; width: min(520px, 100%); height: 196px; overflow: hidden;
  border: 1px solid rgba(92, 119, 181, .28); border-radius: 8px;
  background:
    linear-gradient(rgba(109, 139, 255, .035) 1px, transparent 1px) 0 0 / 100% 20px,
    linear-gradient(90deg, rgba(109, 139, 255, .035) 1px, transparent 1px) 0 0 / 20px 100%,
    radial-gradient(70% 72% at 50% 78%, color-mix(in srgb, var(--gauge-current) 10%, transparent), transparent 68%),
    rgba(6, 11, 19, .6);
  box-shadow: inset 0 1px rgba(255, 255, 255, .025), inset 0 -20px 38px rgba(0, 0, 0, .18);
  transition: --gauge-current .2s ease;
}
.geier-difficulty-meter:has(input[value="hard"]:checked) { --needle-angle: 0deg; --gauge-current: #ffc84d; }
.geier-difficulty-meter:has(input[value="extreme"]:checked) { --needle-angle: 60deg; --gauge-current: #ff6675; }
.geier-gauge { position: absolute; left: 50%; top: -1px; width: min(420px, 100%); height: 180px; transform: translateX(-50%); overflow: visible; }
.geier-gauge path { fill: none; stroke-linecap: round; }
.geier-gauge-bed { stroke: #202b3d; stroke-width: 28; filter: drop-shadow(0 6px 8px rgba(0, 0, 0, .42)); }
.geier-gauge-zone { stroke-width: 15; stroke-linecap: butt; opacity: .86; }
.geier-gauge-zone.zone-extreme { stroke: #e34d5d; filter: drop-shadow(0 0 5px rgba(227, 77, 93, .34)); }
.geier-gauge-zone.zone-hard { stroke: #e4a92f; filter: drop-shadow(0 0 5px rgba(228, 169, 47, .3)); }
.geier-gauge-zone.zone-easy { stroke: #35bb7b; filter: drop-shadow(0 0 5px rgba(53, 187, 123, .3)); }
.geier-gauge-ticks { stroke: rgba(233, 239, 250, .54); stroke-width: 3; stroke-dasharray: 1 6.7; }
.geier-gauge-scan {
  stroke: rgba(255, 255, 255, .85); stroke-width: 3; stroke-dasharray: 3 97;
  filter: url(#geier-gauge-glow); animation: geierGaugeScan 3.8s linear infinite;
}
.geier-gauge-hit { fill: none; stroke: transparent; stroke-width: 34; pointer-events: stroke; cursor: pointer; }
.geier-difficulty-meter:has(.hit-easy:hover) .zone-easy,
.geier-difficulty-meter:has(.hit-hard:hover) .zone-hard,
.geier-difficulty-meter:has(.hit-extreme:hover) .zone-extreme { opacity: 1; }
.geier-difficulty-meter:has(.hit-easy:hover) .zone-easy { filter: drop-shadow(0 0 10px rgba(53, 187, 123, .8)); }
.geier-difficulty-meter:has(.hit-hard:hover) .zone-hard { filter: drop-shadow(0 0 10px rgba(228, 169, 47, .8)); }
.geier-difficulty-meter:has(.hit-extreme:hover) .zone-extreme { filter: drop-shadow(0 0 10px rgba(227, 77, 93, .8)); }
.geier-gauge-zone { transition: stroke-width .16s ease, opacity .16s ease, filter .16s ease; }
.geier-gauge-needle {
  color: var(--gauge-current); transform-origin: 210px 155px; transform: rotate(var(--needle-angle));
  filter: drop-shadow(0 0 6px color-mix(in srgb, var(--gauge-current) 74%, transparent));
  transition: transform .62s cubic-bezier(.34, 1.42, .64, 1), color .24s ease, filter .24s ease;
}
.geier-gauge-needle path { fill: #eaf1ff; stroke: var(--gauge-current); stroke-width: 2; }
.geier-gauge-needle circle { fill: #111a29; stroke: var(--gauge-current); stroke-width: 3; }
.geier-gauge-needle .geier-gauge-hub { fill: var(--gauge-current); stroke: #eef4ff; stroke-width: 2; }
.geier-gauge-options {
  position: absolute; left: 22px; right: 22px; bottom: 0;
  display: grid; grid-template-columns: repeat(3, 1fr); align-items: end;
}
.geier-gauge-option { --zone-color: #fff; position: relative; display: grid !important; place-items: center; cursor: pointer; }
.geier-gauge-option.is-extreme { --zone-color: #ff6675; }
.geier-gauge-option.is-hard { --zone-color: #ffc84d; }
.geier-gauge-option.is-easy { --zone-color: #54d898; }
.geier-gauge-option input { position: absolute; opacity: 0; pointer-events: none; }
.geier-gauge-option span {
  position: relative; min-width: 82px; padding: 6px 10px 7px;
  color: color-mix(in srgb, var(--zone-color) 55%, #7d899e); font-size: .67rem; font-weight: 900;
  letter-spacing: .08em; text-align: center; text-transform: uppercase;
  transition: color .2s ease, text-shadow .2s ease, transform .2s ease;
}
.geier-gauge-option span::before {
  content: ""; position: absolute; left: 12px; right: 12px; bottom: 0; height: 2px;
  background: var(--zone-color); opacity: .24; transform: scaleX(.35);
  box-shadow: 0 0 8px var(--zone-color); transition: opacity .22s ease, transform .22s ease;
}
.geier-gauge-option input:checked + span { color: #fff; text-shadow: 0 0 10px var(--zone-color); transform: translateY(-1px); }
.geier-gauge-option input:checked + span::before { opacity: 1; transform: scaleX(1); }
@keyframes geierGaugeScan { to { stroke-dashoffset: -100; } }
.geier-mode-settings-note { margin: 0; padding: 12px; border-left: 3px solid #5b8cff; background: rgba(91, 140, 255, 0.08); color: #92a0b6; font-size: 0.72rem; line-height: 1.45; }
.geier-legal-consent { max-width: 820px; margin: 4px auto 0; color: var(--panel-muted); font-size: 0.69rem; line-height: 1.5; text-align: center; }
.geier-legal-consent a { color: var(--gold); text-underline-offset: 2px; }
.geier-join-legal { margin-top: 10px; }
.geier-shell .geier-create-submit { justify-self: center; min-width: 150px; margin-top: 18px; }

.geier-join-search { display: grid; grid-template-columns: minmax(0, 1fr) 128px; align-items: end; gap: 10px; max-width: 820px; margin-inline: auto; }
.geier-join-search label { display: grid; gap: 5px; color: #aeb9ca; font-size: 0.68rem; font-weight: 750; }
.geier-join-search input { width: 100%; max-width: none; height: 44px; padding: 0 12px; border: 1px solid #2b3545; border-radius: 8px; outline: 0; background: #0b111c; color: #f0f4fb; }
.geier-join-search input:focus { border-color: #5b8cff; box-shadow: 0 0 0 3px rgba(91, 140, 255, 0.12); }
.geier-join-results-head { display: flex; max-width: 820px; align-items: center; justify-content: space-between; margin: 24px auto 9px; }
.geier-join-results-head h4 { margin: 0; color: #fff; font-size: 0.9rem; }
.geier-join-results-head span { color: #77849a; font-size: 0.66rem; }
.geier-join-results { display: grid; max-width: 820px; gap: 8px; margin-inline: auto; }
.geier-join-result {
  position: relative; display: flex; align-items: center; justify-content: space-between; gap: 14px;
  min-height: 94px; padding: 12px 14px; overflow: hidden;
  border: 1px solid var(--panel-border); border-radius: 8px;
  background: var(--panel-bg);
  box-shadow: var(--panel-shadow);
}
.geier-join-result::before { content: ""; position: absolute; top: 0; left: 10%; right: 10%; height: 1px; background: var(--panel-line); box-shadow: 0 0 8px rgba(89, 122, 255, 0.5); pointer-events: none; }
.geier-join-mode-art { width: 62px; height: 66px; flex: none; object-fit: contain; filter: drop-shadow(0 6px 7px rgba(0, 0, 0, .38)); }
.geier-join-result > div { min-width: 0; }
.geier-join-copy { flex: 1 1 auto; }
.geier-join-result > div > span { color: #79c9ee; font-size: 0.58rem; font-weight: 900; letter-spacing: 0.1em; text-transform: uppercase; }
.geier-join-result h4 { margin: 2px 0 3px; overflow: hidden; color: #eef3fb; font-size: 0.88rem; text-overflow: ellipsis; white-space: nowrap; }
.geier-join-result p { margin: 0; color: #8491a5; font-size: 0.66rem; }
.geier-join-result p b { color: #ffc84d; font-family: ui-monospace, monospace; letter-spacing: 0.08em; }
.geier-shell .geier-join-command { min-width: 112px; min-height: 42px; }
.geier-join-result .geier-join-command { flex: 0 0 112px; }
.geier-shell .geier-join-command:disabled { cursor: not-allowed; opacity: .46; filter: grayscale(.35); transform: none; box-shadow: none; }
.geier-empty-copy { margin: 0; padding: 26px 14px; border: 1px dashed #303b4d; border-radius: 8px; color: #718096; font-size: 0.72rem; text-align: center; }

.geier-room { padding: 2rem 2.5rem 2.7rem; }
.geier-shell.in-room { width: min(1840px, calc(100vw - 36px)); margin-left: 50%; transform: translateX(-50%); }
.geier-shell.in-room .geier-shell-head { display: none; }
.geier-room-header { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); align-items: start; gap: 1.6rem; padding-bottom: 1.3rem; border-bottom: 1px solid var(--geier-line); }
.geier-room-header h3 { margin: 0 0 0.55rem; color: #fff; font-size: 1.9rem; line-height: 1.1; }

/* --- Code / Invite als schlichte Textzeilen (linke Spalte) --- */
/* Labels + Code sind statisch; nur das Copy-Icon ist klickbar. Der Code bleibt
   immer geblurrt (auch bei Hover). Kein Button-Hover-Blau (globale button:hover-Regel). */
.geier-code-line { display: flex; align-items: center; gap: 0.5rem; padding: 0.16rem 0; }
.geier-line-label { color: #9aa6bb; font-size: 0.62rem; font-weight: 850; letter-spacing: 0.1em; text-transform: uppercase; }
/* Der Code steht als XXXXXX da und wird erst auf Antippen sichtbar (geier-hardcore.mjs).
   Der Weichzeichner ist deutlich schwaecher als die frueheren 5px: er soll andeuten,
   dass etwas dahinter liegt, und nicht wie ein Darstellungsfehler aussehen. Da nur ein
   Platzhalter verdeckt wird, muss er auch nichts mehr wirklich unlesbar machen.
   (Eliass 02.09.2026) */
.geier-code-value {
  color: var(--geier-gold); font-size: 0.9rem; font-weight: 850; letter-spacing: 0.18em;
  text-transform: uppercase; filter: blur(2px); cursor: pointer; user-select: none;
  transition: filter .14s ease;
}
.geier-code-value:hover { filter: blur(1px); }
.geier-code-value.is-revealed { filter: none; user-select: text; }
.geier-line-value { color: #7d899e; font-size: 0.82rem; font-weight: 700; }
/* Kopieren und Einladen sind jetzt beschriftete Knoepfe, keine nackten Symbole mehr.
   Vorgabe von Eliass (02.09.2026): untereinander, linksbuendig ausgerichtet, beide
   gleich lang, die Beschriftung darin mittig. Gleich lang heisst hier feste Breite -
   "Copy Code" und "Invite Link" sind unterschiedlich lang, ohne Deckel wuerden die
   Knoepfe verschieden breit. Das Symbol steht im Knopf vor der Beschriftung. */
.geier-code-actions { display: flex; flex-direction: column; align-items: flex-start; gap: 0.4rem; margin-top: 0.45rem; }
.geier-copy-btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 0.45rem;
  width: 11rem; max-width: 100%; min-height: 34px; padding: 0 0.75rem; cursor: pointer;
  border: 1px solid var(--panel-inset-border); border-radius: 9px;
  background: rgba(255, 255, 255, 0.03); color: var(--geier-gold);
  font-size: 0.74rem; font-weight: 800; letter-spacing: 0.04em;
  transition: background .16s ease, border-color .16s ease, color .16s ease;
}
.geier-copy-btn svg { flex: none; }
.geier-copy-btn:hover { background: rgba(255, 255, 255, 0.08); border-color: rgba(255, 255, 255, 0.22); }
.geier-copy-btn:focus-visible { outline: 2px solid #ffd670; outline-offset: 2px; }
/* Der Einladungsknopf tritt bewusst zurueck: der Code ist der Hauptweg in die Lobby,
   der Link die Zugabe. Frueher hing das an .geier-invite-line, die es nicht mehr gibt. */
.geier-invite-btn { color: #9aa6bb; }

/* --- Invites: SVG-Brief neben dem Profil, gleicher Aufbau wie die Leave-Tuer --- */
.geier-room-requests, .geier-room-history { position: relative; display: flex; align-items: center; }
/* Der Selektor braucht .geier-shell davor, sonst gewinnt `.geier-shell button
   { color: inherit }` (Klasse + Typ schlaegt eine Klasse allein) und die Symbole erben
   das Weiss der Huelle. Aufgefallen ist es erst, als die Beschriftungen wegfielen: die
   trugen ihre Farbe in einer eigenen Regel und tarnten den Fehler. (02.09.2026) */
.geier-shell .geier-envelope {
  display: grid; justify-items: center; align-content: center; gap: 0.28rem; padding: 0 0.25rem;
  cursor: pointer; border: 0; background: none; color: #8fa3c4;
  transition: color .16s ease, transform .12s ease;
}
.geier-envelope:hover { background: none; color: #cddcf5; transform: translateY(-1px); }
.geier-envelope:focus-visible { outline: 2px solid #8fa3c4; outline-offset: 3px; border-radius: 6px; }
/* Flex statt Block: als Block reserviert die Zeilenbox um das inline stehende SVG
   Platz fuer Unterlaengen. Die Huelle wurde dadurch hoeher als das Symbol und beim
   Zentrieren rutschte das Symbol nach oben - gemessen 167 statt 170, also 3px ueber
   dem Verlassen-Symbol, das ohne Huelle direkt im Raster steht. (Eliass 02.09.2026) */
.geier-envelope-ico { display: flex; align-items: center; justify-content: center; }
.geier-envelope-label { color: currentColor; font-size: 0.62rem; font-weight: 850; letter-spacing: 0.14em; text-transform: uppercase; }
.geier-envelope.has-requests { color: #ff8f95; }
.geier-envelope-badge { position: absolute; top: -3px; right: -4px; display: grid; place-items: center; min-width: 17px; height: 17px; padding: 0 5px; border-radius: 99px; background: #e5484d; color: #fff; font-size: 0.6rem; font-weight: 900; box-shadow: 0 1px 3px rgba(0, 0, 0, .5); }

/* Modus-Artwork in der Kopfmitte - zeigt jederzeit, welcher Modus laeuft. */
.geier-room-art { display: grid; place-items: center; align-self: center; }
.geier-room-art img { display: block; width: auto; max-width: 100%; height: 96px; object-fit: contain; filter: drop-shadow(0 8px 14px rgba(0, 0, 0, .5)); }
/* rechts buendig, weil der Brief jetzt am rechten Rand sitzt - mittig wuerde ueberlaufen */
.geier-request-pop { position: absolute; z-index: 20; top: calc(100% + 10px); right: -8px; width: min(280px, 78vw); display: grid; gap: 0.4rem; padding: 0.55rem; border: 1px solid #2a3547; border-radius: 10px; background: #0f1826; box-shadow: 0 16px 34px rgba(0, 0, 0, .5); }
.geier-request-empty { margin: 0; padding: 0.3rem; color: #647086; font-size: 0.66rem; text-align: center; }

.geier-history-round { display: grid; gap: 0.5rem; padding: 1.7rem 0; }
.geier-history-round + .geier-history-round { border-top: 1px solid #22303f; }
.geier-history-round:first-child { padding-top: 0.3rem; }
.geier-history-round-head { display: flex; align-items: baseline; justify-content: space-between; gap: 0.5rem; }
.geier-history-round-mode { color: #cddcf5; font-size: 0.78rem; font-weight: 800; }
.geier-history-round-time { color: #647086; font-size: 0.68rem; }
.geier-history-round .geier-deck-board { padding: 0; }
.geier-request-row { display: flex; align-items: center; gap: 0.5rem; padding: 0.3rem 0.35rem; border: 1px solid #22303f; border-radius: 8px; background: #0e1520; }
.geier-request-row .geier-avatar { width: 28px; height: 28px; flex: 0 0 auto; }
.geier-request-name { flex: 1 1 auto; min-width: 0; overflow: hidden; color: #e1e9f4; font-size: 0.72rem; font-weight: 700; text-overflow: ellipsis; white-space: nowrap; }
.geier-request-actions { display: flex; gap: 0.25rem; flex: 0 0 auto; }
.geier-req-accept, .geier-req-decline { display: grid; place-items: center; width: 28px; height: 28px; padding: 0; cursor: pointer; border-radius: 6px; }
.geier-req-accept { border: 1px solid rgba(85, 219, 156, 0.4); background: rgba(38, 137, 92, 0.2); color: #7fe6b4; }
.geier-req-accept:hover { background: rgba(38, 137, 92, 0.42); }
.geier-req-decline { border: 1px solid rgba(255, 94, 104, 0.34); background: rgba(255, 94, 104, 0.1); color: #ff9aa1; }
.geier-req-decline:hover { background: rgba(255, 94, 104, 0.22); }

/* --- Viewer (rechte Spalte): Profil+Rolle | Trennstrich | Tuer/Leave --- */
.geier-room-viewer { display: flex; align-items: stretch; justify-content: flex-end; gap: 0.9rem; }
.geier-viewer-me { display: grid; justify-items: center; align-content: center; gap: 0.35rem; }
.geier-room-profile { display: grid; grid-template-columns: auto 1fr; align-items: center; gap: 8px; min-width: 10rem; padding: 5px 12px 5px 5px; border: 1px solid rgba(255, 255, 255, 0.16); border-radius: 999px; background: rgba(8, 10, 15, 0.55); backdrop-filter: blur(6px); }
.geier-room-profile .geier-avatar { width: 30px; height: 30px; flex: 0 0 auto; }
.geier-room-profile b { overflow: hidden; color: #f1f5f9; font-size: 0.84rem; font-weight: 800; text-align: center; text-overflow: ellipsis; white-space: nowrap; }
.geier-room-role { color: #aeb8c8; font-size: 0.62rem; font-weight: 850; letter-spacing: 0.14em; text-transform: uppercase; text-align: center; }
.geier-viewer-divider { width: 1px; align-self: stretch; background: var(--geier-line); }
/* Gleiche Spezifitaetsfalle wie bei .geier-envelope - siehe Kommentar dort. Das Rot
   faerbt ueber currentColor auch das SVG, nicht nur die Beschriftung. */
.geier-shell .geier-leave-door { display: grid; justify-items: center; align-content: center; gap: 0.28rem; padding: 0 0.25rem; cursor: pointer; border: 0; background: none; color: #ff6b73; transition: color .16s ease, transform .12s ease; }
.geier-leave-door:hover { background: none; color: #ff8f95; transform: translateY(-1px); }
.geier-leave-door:focus-visible { outline: 2px solid #ff8f95; outline-offset: 3px; border-radius: 6px; }
.geier-leave-label { color: #ff6b73; font-size: 0.62rem; font-weight: 850; letter-spacing: 0.14em; text-transform: uppercase; }

.geier-invite-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 0.75rem; padding: 1rem 0; }
.geier-invite-grid label { display: grid; gap: 0.3rem; }
.geier-invite-grid label > span { color: #647086; font-size: 0.59rem; font-weight: 800; letter-spacing: 0.09em; text-transform: uppercase; }
.geier-invite-grid label > div { display: grid; grid-template-columns: 1fr auto; }
.geier-invite-grid input { min-width: 0; padding: 0.55rem 0.7rem; border: 1px solid #252e3d; border-radius: 9px 0 0 9px; background: #0c111a; color: #626e81; font-size: 0.67rem; }
.geier-invite-grid button { border: 1px solid #252e3d; border-left: 0; border-radius: 0 9px 9px 0; background: #171e29; color: #586477; font-size: 0.65rem; }

.geier-previous-decks { margin: 16px 0; border-top: 1px solid var(--geier-line); border-bottom: 1px solid var(--geier-line); background: rgba(8, 12, 19, 0.32); }
.geier-previous-decks > header { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 12px 14px 8px; }
.geier-previous-decks > header span { color: #ffc84d; font-size: 0.58rem; font-weight: 900; letter-spacing: 0.12em; text-transform: uppercase; }
.geier-previous-decks > header h4 { margin: 1px 0 0; color: #fff; font-size: 0.92rem; }
.geier-previous-decks > header small { color: #6f7c91; font-size: 0.63rem; }
.geier-deck-placeholder { display: flex; align-items: center; justify-content: center; gap: 18px; min-height: 118px; padding: 12px 20px 18px; overflow: hidden; text-align: left; }
.geier-deck-placeholder img { align-self: flex-end; width: 92px; height: 86px; object-fit: contain; object-position: bottom; filter: grayscale(.25) drop-shadow(0 7px 8px rgba(0,0,0,.5)); opacity: .72; }
.geier-deck-placeholder strong { color: #dbe5f2; font-size: 0.86rem; }
.geier-deck-placeholder p { margin: 3px 0 0; color: #738096; font-size: 0.67rem; }

/* Deck-Board: vier Decks nebeneinander, volle Breite */
.geier-deck-board { display: flex; flex-wrap: wrap; justify-content: center; gap: 12px; padding: 10px 14px 16px; }
.geier-deck-tile { position: relative; overflow: hidden; display: grid; gap: 10px; padding: 0.8rem 0.85rem 0.75rem; border: 1px solid var(--panel-border); border-radius: 8px; background: var(--panel-bg); box-shadow: var(--panel-shadow); }
.geier-deck-tile::before { content: ""; position: absolute; top: 0; left: 10%; right: 10%; height: 1px; background: var(--panel-line); box-shadow: 0 0 8px rgba(89, 122, 255, 0.5); pointer-events: none; }
.geier-deck-tile > header { display: flex; align-items: center; justify-content: space-between; gap: 10px; min-height: 30px; }
.geier-deck-who { display: flex; align-items: center; gap: 7px; min-width: 0; }
.geier-deck-who .geier-avatar { width: 26px; height: 26px; flex: 0 0 auto; }
.geier-deck-who strong { overflow: hidden; color: #f3f6ff; font-size: .82rem; font-weight: 800; text-overflow: ellipsis; white-space: nowrap; }
.geier-deck-tile .deck-actions { display: flex; align-items: center; gap: 6px; flex: none; }
.geier-deck-tile .deck-actions .elixir { padding-inline: 0.38rem; }
.geier-deck-loadout { display: flex; align-items: center; gap: 10px; }
.geier-deck-cards { display: grid; grid-template-columns: repeat(4, 52px); justify-content: center; gap: 4px; }
.geier-deck-card img { display: block; width: 52px; object-fit: contain; }
.geier-deck-div { align-self: stretch; width: 1px; background: rgba(255, 255, 255, 0.16); }
.geier-deck-tower { display: grid; place-items: center; flex: 0 0 auto; }
.geier-deck-tower img { width: 58px; object-fit: contain; filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .4)); }

/* --- Verlauf ("Past rounds"): immer zwei Decks je Zeile -------------------- */
/* Bewusst OHNE Media Query, anders als bei Previous Decks: der Dialog ist mit
   `width: min(440px, …)` auch am grossen Bildschirm schmal, zwei Kacheln sind dort also
   genauso eng wie am Handy. Eine Regel nur fuer Mobil haette am Desktop weiterhin
   untereinander liegende Decks gelassen - Eliass 03.09.2026: "die historie soll 2 decks
   nebeneinander immer haben".
   Der Turm faellt hier ueberall weg ("die towertroop kommt weg, die braucht man nicht
   aktuell"); in einer 185px-Kachel waere ohnehin kein Platz dafuer.
   Steht direkt nach den Grundregeln, damit `display: flex` von .geier-deck-board
   ueberschrieben ist - die ID gewinnt zwar ohnehin, aber die Naehe haelt beides
   zusammen lesbar. */
#geier-history-list .geier-deck-board {
  display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; padding: 0;
}
/* min-width: 0 ist Pflicht - Rasterelemente schrumpfen sonst nicht unter ihre
   Inhaltsbreite und es passt trotz zweier Spalten nur eine Kachel je Zeile. */
#geier-history-list .geier-deck-tile { padding: 0.5rem 0.45rem; gap: 6px; min-width: 0; }
#geier-history-list .geier-deck-tile > header,
#geier-history-list .geier-deck-loadout,
#geier-history-list .geier-deck-cards { min-width: 0; }
/* Karten fuellen die Kachel statt auf festen 52px zu bestehen. */
#geier-history-list .geier-deck-cards { grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 3px; }
#geier-history-list .geier-deck-card img { width: 100%; }
#geier-history-list .geier-deck-div,
#geier-history-list .geier-deck-tower { display: none; }
#geier-history-list .geier-deck-loadout { display: block; }
/* Name und Aktionen untereinander - nebeneinander passen sie in eine halbe Kachel nicht.
   Weglassen waere bequemer, nimmt aber Speichern und Kopieren fremder Decks weg. */
#geier-history-list .geier-deck-tile > header { align-items: stretch; flex-direction: column; gap: 4px; min-height: 0; }
#geier-history-list .deck-actions { flex-wrap: wrap; justify-content: flex-end; gap: 3px; }
#geier-history-list .deck-actions .elixir { margin-right: auto; padding-inline: 0.24rem; font-size: .62rem; min-width: 0; }
#geier-history-list .deck-btn { width: 24px; height: 24px; min-width: 0; padding: 0; flex: none; }
/* Die Gruppe ist EIN Flex-Element und bricht nie in sich um - die Umbruchstelle liegt
   damit immer zwischen Elixier-Chip und Knopfpaar, nie zwischen den beiden Knoepfen. */
#geier-history-list .geier-deck-btns { flex: none; display: flex; flex-wrap: nowrap; gap: 3px; }
#geier-history-list .deck-btn svg { width: 14px; height: 14px; }
#geier-history-list .geier-deck-who .geier-avatar { width: 20px; height: 20px; }
#geier-history-list .geier-deck-who strong { font-size: .68rem; }

/* ===== Lobby-Panels: Lobby | Chat | Settings (per Icon aufklappbar) ===== */
/* Drei gleich breite Spalten; das Icon sitzt mittig UEBER der jeweiligen Box. */
.geier-lobby-panels { display: flex; align-items: flex-start; gap: 16px; }
.geier-panel-col { display: flex; flex-direction: column; align-items: stretch; gap: 10px; flex: 1 1 0; min-width: 0; }
/* Icon-Only-Toggle, zentriert ueber der Box */
.geier-panel-tab {
  position: relative;
  display: flex; flex-direction: column; align-items: center; gap: 5px;
  align-self: center; padding: 4px 12px; cursor: pointer;
  border: 0; background: none; color: #e6edf8;
}
/* Ungelesen-Badge wie bei den Invite-Requests (roter Kreis mit Anzahl). */
.geier-panel-badge {
  position: absolute; top: -3px; right: 4px; z-index: 2;
  display: grid; place-items: center; min-width: 18px; height: 18px; padding: 0 5px;
  border-radius: 99px; background: #e5484d; color: #fff; font-size: .62rem; font-weight: 900;
  box-shadow: 0 1px 4px rgba(0,0,0,.55); animation: geierPanelPop .2s cubic-bezier(.2,.8,.3,1);
}
.geier-panel-badge[hidden] { display: none; }
.geier-panel-tab:hover { background: none; } /* globales button:hover-Blau neutralisieren */
.geier-panel-tab:focus-visible { outline: 2px solid #7ea2ff; outline-offset: 3px; border-radius: 12px; }
/* Einheitlicher, quadratischer Icon-Slot -> alle drei gleich groß, Boxen fluchten */
.geier-panel-ico { width: 56px; height: 56px; flex: 0 0 auto; object-fit: contain; filter: drop-shadow(0 3px 5px rgba(0, 0, 0, .45)); transition: transform .16s ease, filter .16s ease; }
.geier-panel-tab:hover .geier-panel-ico { transform: translateY(-2px); }
/* Chat-Sprechblase hat einen Tail -> Koerper wirkt kleiner; per transform (ohne Layout-Einfluss) hochskalieren */
/* Schwerpunkt der Sprechblase liegt ~12% links -> per translateX optisch zentrieren */
/* Kein translateX mehr: die 7px schoben das Symbol sichtbar aus der Mitte seiner
   Schaltflaeche (Eliass 02.09.2026). Vergroessert wird es weiterhin, das Bild ist
   kleiner gezeichnet als die uebrigen. */
.geier-panel-ico-chat { transform: scale(1.32); }
.geier-panel-tab:hover .geier-panel-ico-chat { transform: translateY(-2px) scale(1.32); }
.geier-panel-col[data-open="true"] .geier-panel-ico { filter: drop-shadow(0 0 10px rgba(126, 162, 255, .6)) drop-shadow(0 3px 5px rgba(0, 0, 0, .45)); }
.geier-panel-count { min-width: 32px; padding: 2px 11px; border-radius: 99px; background: #172131; border: 1px solid #2b3648; color: #a9b8cf; font-size: 0.64rem; font-weight: 850; text-align: center; letter-spacing: .02em; }
.geier-panel-col[data-open="true"] .geier-panel-count { color: #cdddff; border-color: rgba(126, 162, 255, .4); background: #16203a; }
.geier-panel-body { padding: 0.95rem; border: 1px solid var(--geier-line); border-radius: 12px; background: var(--geier-panel); }
.geier-panel-col[data-open="false"] .geier-panel-body { display: none; }
.geier-panel-col[data-open="true"] .geier-panel-body { transform-origin: top center; animation: geierPanelPop .19s cubic-bezier(.2, .8, .3, 1); }
@keyframes geierPanelPop { from { opacity: 0; transform: scale(.96) translateY(-7px); } to { opacity: 1; transform: none; } }
@media (prefers-reduced-motion: reduce) { .geier-panel-col[data-open="true"] .geier-panel-body { animation: none; } }

/* Lobby: Mitgliederliste, max ~10 Zeilen dann scrollen */
/* padding-right haelt die Spielerzeilen von der Scrollbar weg (lag vorher minimal drueber) */
/* Feste Hoehe statt max-height, aus demselben Grund wie beim Chat (siehe dort): alle
   drei Lobby-Spalten sollen gleich tief sein, nicht nur bis zu einer Obergrenze wachsen.
   61.5rem, weil hier nur Padding drumherum liegt (kein Umschalter/Eingabefeld wie beim
   Chat) - macht in Summe dieselbe ~1017.6px Boxtiefe wie Settings/Chat.
   align-content:start ist PFLICHT, nicht Kosmetik: ohne das strecken sich die Zeilen
   (#geier-member-list, #geier-spectators) als Grid-Items per Default-"stretch" auf die
   volle 61.5rem, und darin wiederum jede einzelne .geier-member-row - bei 1-2 Mitgliedern
   wurden die Zeilen dadurch riesig statt in normaler Groesse oben zu bleiben und den Rest
   als freien Raum zu lassen (Eliass 09.08.2026: "die Hoehe der Member... dynamisch damit
   verknuepft... absolut garbage"). .geier-chat-log hatte dieses align-content schon immer,
   nur hier hatte es gefehlt. */
.geier-members-scroll { display: grid; align-content: start; gap: 10px; height: 61.5rem; overflow-y: auto; padding-right: 10px; scrollbar-gutter: stable; scrollbar-width: thin; scrollbar-color: #33425e transparent; }
.geier-members-scroll::-webkit-scrollbar { width: 8px; }
.geier-members-scroll::-webkit-scrollbar-track { background: transparent; }
.geier-members-scroll::-webkit-scrollbar-thumb { border-radius: 99px; background: #33425e; }
.geier-members-scroll::-webkit-scrollbar-thumb:hover { background: #43557a; }
.geier-spectators { display: grid; align-content: start; gap: 6px; }
/* Credits am Fuss der Lobby: Ueberschrift in der Typo der Room-Buttons (PAUSE/READY),
   darunter eine duenne Linie und die Quellen als Badge im "Recommended"-Design des
   Deck Builders (.builder-badge.recommended wird bewusst wiederverwendet). */
.geier-credits { display: grid; justify-items: center; gap: 12px; margin-top: 26px; }
.geier-credits-title {
  width: 100%; margin: 0; padding-bottom: 9px;
  border-bottom: 1px solid rgba(255, 255, 255, 0.1);
  color: #75849e; font-size: 0.74rem; font-weight: 900; letter-spacing: 0.09em; text-align: center; text-transform: uppercase;
}
/* groesser als das Builder-Badge: hier ist es kein Beiwerk, sondern der eigentliche Inhalt */
.geier-shell .geier-credit-link {
  padding: 0.3rem 0.8rem; border-radius: 7px;
  font-size: 0.95rem; letter-spacing: 0.06em;
  text-decoration: none; transition: transform 0.16s ease, border-color 0.16s ease;
}
.geier-shell .geier-credit-link.recommended:hover { transform: translateY(-1px); border-color: rgba(247, 190, 73, 0.45); }
.geier-shell .geier-credit-link.popular:hover { transform: translateY(-1px); border-color: rgba(125, 211, 252, 0.5); }
.geier-shell .geier-credit-link:focus-visible { outline: 2px solid #ffd670; outline-offset: 3px; }

.geier-group-sep { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding-top: 6px; margin-top: 2px; border-top: 1px dashed rgba(255, 255, 255, 0.12); }
.geier-group-sep span { color: #8693a8; font-size: 0.56rem; font-weight: 850; letter-spacing: 0.12em; text-transform: uppercase; }
.geier-group-sep b { color: #647086; font-size: 0.62rem; }
.geier-bot-tag { padding: 0.05rem 0.32rem; border: 1px solid rgba(126, 162, 255, 0.4); border-radius: 99px; color: #9ab6ff; font-size: 0.5rem; font-weight: 850; letter-spacing: 0.06em; text-transform: uppercase; vertical-align: middle; }

/* Chat: eigene, klar abgegrenzte Nachrichtenflaeche. Hoehe so gewaehlt, dass die GESAMTE
   Box (.geier-panel-body, inkl. Stil-Umschalter + Eingabezeile drumherum) genauso tief
   wird wie die Settings-Box im Mega-Draft-Modus (Eliass 09.08.2026: "die tiefe, die die
   Settings-Box bei Mega Draft hat, wuerde ich als Standardgroesse fuer den Chat und die
   Mitgliederliste nehmen") - per Live-Messung ermittelt: Settings-Box ~1017.6px, Chat
   drumherum (Umschalter-Zeile + Eingabefeld + Abstaende) braucht ~126px, macht 55.75rem
   fuer den Log selbst. Vorher 28rem, dynamisch je nach Modus meist die kuerzeste Spalte. */
.geier-chat-log {
  display: grid; align-content: start; gap: 10px; height: 55.75rem; overflow-y: auto; padding: 0.8rem 0.7rem;
  border: 1px solid #1d2942; border-radius: 12px;
  background:
    radial-gradient(120% 60% at 50% 0%, rgba(91, 140, 255, .06), transparent 60%),
    linear-gradient(180deg, #0b1220, #0a0f1a);
  box-shadow: inset 0 1px rgba(255, 255, 255, .03), inset 0 -18px 30px rgba(0, 0, 0, .28);
  scrollbar-width: thin; scrollbar-color: #2b3a55 transparent;
}
/* Classic braucht mehr seitliches Innenpolster als modern: die Tail-Spitze ragt bis zu
   18px seitlich ueber die Nachrichtenbox hinaus - bei der normalen 0.7rem-Polsterung
   wurde sie vom Container abgeschnitten (Eliass 09.08.2026: "wird an der Seite
   abgeschnitten... musst die von dem Rand noch weiter nach innen reinschieben"). */
#geier-chat-log[data-chat-style="classic"] { padding-left: 1.7rem; padding-right: 1.7rem; }
.geier-chat-log::-webkit-scrollbar { width: 8px; }
.geier-chat-log::-webkit-scrollbar-thumb { background: #263450; border-radius: 99px; }
.geier-chat-empty { margin: auto; color: #647086; font-size: 0.72rem; }

/* Umschalter fuer den Chat-Stil (Eliass 09.08.2026) - Apple/iOS-Kippschalter, im Projekt
   bisher ohne Vorbild, deshalb neu, aber ueber Tokens/Groessen an den Rest der Seite
   angeglichen statt frei erfunden. Persistiert in localStorage, siehe app.js. */
.geier-chat-style-row {
  display: flex; align-items: center; justify-content: flex-end; gap: 0.5rem;
  margin-bottom: 0.5rem; color: #8796ad; font-size: 0.68rem; font-weight: 700;
}
.ios-switch { position: relative; display: inline-flex; cursor: pointer; }
.ios-switch input { position: absolute; opacity: 0; width: 1px; height: 1px; }
.ios-switch-track {
  width: 38px; height: 22px; border-radius: 999px; background: #263450;
  border: 1px solid #33445f; transition: background .16s ease, border-color .16s ease;
  display: block;
}
.ios-switch-knob {
  display: block; width: 16px; height: 16px; margin: 2px; border-radius: 50%;
  background: #cbd5e1; box-shadow: 0 1px 3px rgba(0, 0, 0, .4);
  transition: transform .16s cubic-bezier(.4, 0, .2, 1);
}
.ios-switch input:checked + .ios-switch-track { background: var(--primary); border-color: var(--primary-d); }
.ios-switch input:checked + .ios-switch-track .ios-switch-knob { transform: translateX(16px); background: #fff; }
.ios-switch input:focus-visible + .ios-switch-track { outline: 2px solid var(--primary); outline-offset: 2px; }

/* Nachricht = Profil-Icon + Sprechblase. Gemeinsame Struktur fuer beide Chat-Stile
   (.geier-chat-avatar/.geier-chat-meta/.geier-chat-role/.geier-chat-time existieren immer
   im Markup) - [data-chat-style] auf #geier-chat-log entscheidet per CSS, was wo
   sichtbar/platziert ist, damit renderGeierChat() nur eine Markup-Version pflegen muss. */
.geier-chat-row { display: flex; align-items: flex-end; gap: 8px; max-width: 88%; }
.geier-chat-row.mine { flex-direction: row-reverse; margin-left: auto; }
/* Blockifizieren ist hier PFLICHT, nicht Kosmetik: .geier-avatar ist ein <span>
   (inline per Default) und wird sonst nur blockifiziert, wenn es DIREKTES Kind eines
   Flex-Containers ist. Seit der Avatar in .geier-chat-avatar verschachtelt liegt (fuer
   den classic-Stil, der ihn per display:none ausblendet), greifen width/height eines
   inline-Elements nicht mehr - das Ergebnis war ein unsichtbarer 0x0-Avatar.
   Grid statt block, weil es beides leistet: Es blockifiziert genauso, zentriert aber
   zusaetzlich den Inhalt. Hat jemand kein Profilbild, stehen dort seine Initialen, und
   mit `block` klebten die oben links im Kreis statt in der Mitte - man sah nur einen
   Rest des Namens (Eliass 02.09.2026, im Stil "modern" sichtbar). .geier-avatar-fallback
   bringt place-items: center schon mit, die Regel hier war nur spezifischer und hat es
   ueberschrieben. Bilder sind davon unberuehrt, .geier-avatar img liegt absolut. */
.geier-chat-avatar { flex: 0 0 auto; display: block; }
.geier-chat-avatar .geier-avatar { display: grid; place-items: center; width: 28px; height: 28px; box-shadow: 0 0 0 2px rgba(126, 162, 255, .18); }
/* justify-items bleibt IMMER "start" - auch fuer eigene Nachrichten (Eliass 09.08.2026:
   "die messages ... ist immer linksbuendig, logischerweise"). Nur die Box als Ganzes
   wandert bei "mine" per row-reverse+margin-left:auto nach rechts, der Text darin bleibt
   wie in jedem echten Chat linksbuendig. */
.geier-chat-msg { display: grid; gap: 2px; justify-items: start; min-width: 0; }
.geier-chat-meta { display: flex; align-items: baseline; gap: 0.4rem; }
.geier-chat-role { display: none; }
/* display:block ist PFLICHT, nicht nur classic: seit Nachrichten gruppiert werden
   (mehrere .geier-chat-text-Zeilen in einer Box), laufen sonst als <span> (inline) alle
   Zeilen ohne Umbruch ineinander - betraf beide Stile, nicht nur "classic". */
.geier-chat-text { display: block; font-size: 0.8rem; line-height: 1.32; word-break: break-word; }

/* --- Stil "modern" (Standard): Panel-Optik der restlichen Seite --- */
#geier-chat-log[data-chat-style="modern"] .geier-chat-msg {
  /* position:relative + Bottom-Padding wie bei classic: die Zeit sitzt absolut unten
     links IN der Box, braucht also reservierten Platz (Eliass 09.08.2026: "die Uhrzeit
     unten in der Nachricht... nicht oben rechts, sondern unten links unter der
     Nachricht"). */
  position: relative; padding: 0.42rem 0.68rem 1.15rem; border-radius: 13px 13px 13px 4px;
  background: linear-gradient(180deg, #16233a, #101a2b); border: 1px solid #26344c;
  box-shadow: 0 2px 6px rgba(0, 0, 0, .28);
}
#geier-chat-log[data-chat-style="modern"] .geier-chat-row.mine .geier-chat-msg {
  border-radius: 13px 13px 4px 13px;
  background: linear-gradient(180deg, rgba(255, 200, 77, .16), rgba(43, 82, 190, .22));
  border-color: rgba(255, 200, 77, .38);
}
/* Glow-Linie an der Oberkante bei Nachrichten von ANDEREN (nicht bei eigenen - die haben
   bereits den goldenen Akzent) - der Farbverlauf aus dem Redesign-Entwurf
   (https://claude.ai/code/artifact/b7d45dc6-b08a-4369-a1e3-638bb82011d6), den Eliass hier
   noch vermisst hat. Dieselbe Konvention wie ueberall sonst auf der Seite (`.panel::before`
   mit --panel-line/--panel-line-glow), keine neu erfundenen Werte. */
#geier-chat-log[data-chat-style="modern"] .geier-chat-row:not(.mine) .geier-chat-msg { overflow: hidden; }
#geier-chat-log[data-chat-style="modern"] .geier-chat-row:not(.mine) .geier-chat-msg::before {
  content: ""; position: absolute; top: 0; left: 10%; right: 10%; height: 1px;
  background: var(--panel-line); box-shadow: var(--panel-line-glow); pointer-events: none;
}
#geier-chat-log[data-chat-style="modern"] .geier-chat-author { color: #93a9c8; font-size: 0.56rem; font-weight: 850; letter-spacing: 0.04em; text-transform: uppercase; }
#geier-chat-log[data-chat-style="modern"] .geier-chat-row.mine .geier-chat-author { color: var(--geier-gold); }
/* Rolle bleibt oben rechts in der Meta-Zeile (Eliass 09.08.2026: "die Rolle... muss oben
   rechts in der Box sein, der Style ist perfekt davon" - unveraendert gut). Zeit wandert
   dagegen aus der Meta-Zeile raus, unten links unter den Text (siehe .geier-chat-time
   unten) statt oben rechts daneben zu stehen. */
#geier-chat-log[data-chat-style="modern"] .geier-chat-meta { width: 100%; justify-content: space-between; gap: 0.5rem; }
#geier-chat-log[data-chat-style="modern"] .geier-chat-role { display: block; color: #647086; font-size: 0.54rem; font-weight: 700; }
#geier-chat-log[data-chat-style="modern"] .geier-chat-time {
  display: block; position: absolute; bottom: 4px; left: 0.68rem;
  color: #576076; font-size: 0.54rem; font-weight: 700;
}
#geier-chat-log[data-chat-style="modern"] .geier-chat-text { color: #e9f0fb; }

/* --- Stil "classic": echte Clash-Royale-Chat-Box als Vorlage (Eliass 09.08.2026,
   docs/data/design-references/geier-chat-cr-reference-*.png) - helle abgerundete Box mit
   Tail-Notch, Name+Rolle in einer Zeile oben IN der Box, Zeit unten IN der Box. Kein Avatar
   neben der Box (im Original nur bei reinen Emote-Nachrichten sichtbar, nicht bei Text). */
#geier-chat-log[data-chat-style="classic"] .geier-chat-avatar { display: none; }
/* Feste Breite heisst hier: ein fixer PROZENTSATZ der Panel-Breite, nicht ein fixer
   px-Wert (Eliass 09.08.2026, Praezisierung nach dem ersten Versuch: "das war aber in
   dem Sinne ein wenig anders gemeint... ich moechte, dass sie 70 Prozent von der Breite
   der Chatbox einnimmt... und das ist fest, weiter geht es nicht") - waechst/schrumpft
   also MIT dem Panel, deckelt aber immer bei 70%. `width` statt `max-width`, damit auch
   kurze Nachrichten die vollen 70% einnehmen statt auf Inhaltsbreite zu schrumpfen. */
#geier-chat-log[data-chat-style="classic"] .geier-chat-row { width: 70%; max-width: 70%; }
#geier-chat-log[data-chat-style="classic"] .geier-chat-msg {
  /* Unten extra Padding: die Zeit sitzt absolut positioniert IN der Box (wie im Original)
     und wuerde sonst mehrzeiligen Text ueberlappen, weil absolut positionierte Elemente
     der letzten Textzeile keinen Platz reservieren. */
  position: relative; width: 100%; padding: 0.42rem 0.65rem 1.15rem; border-radius: 14px;
  /* Hintergrundfarbe 1:1 aus dem Referenzscreenshot gepixelt (rgb 240/248/255,
     identisch fuer eigene und fremde Nachrichten - der echte CR-Chat unterscheidet
     nicht per Boxfarbe, nur per Namensfarbe). */
  background: #f0f8ff; box-shadow: 0 2px 5px rgba(0, 0, 0, .25);
}
/* Tail-Notch: Kontur direkt aus dem Referenzscreenshot abgetastet (pixelweiser Scan der
   linken Boxkante ueber die Tail-Region in geier-chat-cr-reference-1.png, siehe
   Session-Notizen) statt frei Hand gezeichnet - dadurch ein steiler, fast gerader
   oberer Rand bis zur Spitze und ein weicher, laenger auslaufender unterer Rand,
   nicht zwei symmetrisch runde Kurven (Eliass 09.08.2026: "das soll fast gar nicht
   abgerundet sein" / "bau es eins zu eins nach wie auf dem Screenshot"). */
/* top:18px statt 10px: die Box hat border-radius:14px oben links - bei top:10px lag der
   Tail-Ansatzpunkt noch INNERHALB der Rundungszone und die Boxkante schnitt sichtbar in
   den Tail hinein (Eliass 09.08.2026: "sieht so aus als ob die Box eine Umrandung hat
   und das liegt teilweise ueber diesem Dreieck-Schnipsel"). 18px liegt sicher unterhalb
   der Rundung, auf dem geraden Teil der linken Kante. */
#geier-chat-log[data-chat-style="classic"] .geier-chat-msg::after {
  content: ""; position: absolute; top: 18px; width: 18px; height: 20px; background: inherit;
}
#geier-chat-log[data-chat-style="classic"] .geier-chat-msg::after {
  left: -18px;
  clip-path: polygon(100% 0%, 86% 3%, 51% 8%, 17% 15%, 3% 23%, 0% 28%, 0% 36%, 11% 44%, 26% 54%, 43% 64%, 60% 74%, 83% 85%, 97% 95%, 100% 100%);
}
#geier-chat-log[data-chat-style="classic"] .geier-chat-row.mine .geier-chat-msg::after {
  left: auto; right: -18px;
  clip-path: polygon(0% 0%, 14% 3%, 49% 8%, 83% 15%, 97% 23%, 100% 28%, 100% 36%, 89% 44%, 74% 54%, 57% 64%, 40% 74%, 17% 85%, 3% 95%, 0% 100%);
}
#geier-chat-log[data-chat-style="classic"] .geier-chat-meta { width: 100%; justify-content: space-between; gap: 0.6rem; }
/* NUR der Name bekommt die Spielschrift "Clash Display" (Eliass 09.08.2026, endgueltige
   Klarstellung: "die Clash Royale Schrift ist NUR fuer den Namen von dem Absender... die
   Schriftart [vom Text] soll eine andere sein, die nicht so verschnoerkelt/abgerundet
   ist, aber ein bisschen dicker" - vorheriger Versuch, per Pixel-Zoom auch den Text auf
   Clash Display umzustellen, war ein Fehlschluss). Der Nachrichtentext bleibt Inter,
   aber in einem deutlich fetteren Schnitt (800) statt der vorherigen 600, damit er nicht
   duenn wirkt. Farben weiterhin direkt aus dem Referenzscreenshot gepixelt. */
#geier-chat-log[data-chat-style="classic"] .geier-chat-author {
  color: #0f97ff; font-family: "Clash Display", "Inter", sans-serif; font-size: 0.78rem; font-weight: 700;
}
#geier-chat-log[data-chat-style="classic"] .geier-chat-row.mine .geier-chat-author { color: var(--geier-gold); }
#geier-chat-log[data-chat-style="classic"] .geier-chat-role { display: block; color: #8a94a6; font-size: 0.6rem; font-weight: 700; }
#geier-chat-log[data-chat-style="classic"] .geier-chat-time { display: none; }
#geier-chat-log[data-chat-style="classic"] .geier-chat-text {
  color: #53637a; font-family: "Inter", system-ui, sans-serif; font-weight: 800; font-size: 0.76rem;
  line-height: 1.36; margin: 0.2rem 0 0.3rem;
}
#geier-chat-log[data-chat-style="classic"] .geier-chat-row.mine .geier-chat-text { color: #0e7cc2; }
/* Zeitstempel unten LINKS in der Box, wie im Original - nicht rechts (Eliass 09.08.2026:
   "die Zeit da drin ist linksbuendig"). */
#geier-chat-log[data-chat-style="classic"] .geier-chat-msg::before {
  content: attr(data-time); position: absolute; bottom: 4px; left: 0.65rem;
  color: #8a94a6; font-size: 0.56rem; font-weight: 700;
}
/* nur die neueste Nachricht animiert rein */
.geier-chat-log .geier-chat-row:last-child { animation: geierChatIn .24s cubic-bezier(.2, .8, .3, 1); }
.geier-chat-log .geier-chat-row.mine:last-child { animation-name: geierChatInMine; }
@keyframes geierChatIn { from { opacity: 0; transform: translateY(8px) scale(.96); } to { opacity: 1; transform: none; } }
@keyframes geierChatInMine { from { opacity: 0; transform: translate(10px, 6px) scale(.96); } to { opacity: 1; transform: none; } }
@media (prefers-reduced-motion: reduce) { .geier-chat-log .geier-chat-row:last-child { animation: none; } }
/* Eingabezeile: rechts angedockt neben dem Senden-Button, links bleibt Raum frei; Trennstrich oben */
.geier-chat-form { display: flex; justify-content: flex-end; align-items: center; gap: 8px; margin-top: 0.7rem; padding-top: 0.7rem; border-top: 1px solid var(--geier-line); }
.geier-chat-form input { flex: 0 1 260px; min-width: 0; padding: 0.55rem 0.75rem; border: 1px solid #263142; border-radius: 99px; background: #0c111a; color: #e6edf8; font-size: 0.78rem; }
.geier-chat-form input:focus-visible { outline: 2px solid #7ea2ff; outline-offset: 1px; }
.geier-chat-form input:disabled { opacity: 0.5; cursor: not-allowed; }
.geier-chat-send { display: grid; place-items: center; width: 40px; height: 40px; flex: 0 0 auto; padding: 0; cursor: pointer; border: 1px solid rgba(126, 162, 255, 0.45); border-radius: 50%; background: rgba(49, 95, 206, 0.26); color: #cdddff; transition: background .15s ease, transform .12s ease, box-shadow .15s ease; }
.geier-chat-send svg { display: block; transform: translate(-1px, 1px); } /* Papierflieger optisch mittig */
.geier-chat-send:hover { background: rgba(49, 95, 206, 0.45); box-shadow: 0 0 12px rgba(91, 140, 255, .45); }
.geier-chat-send:active { transform: scale(.9); }
.geier-chat-note { margin: 0.5rem 0 0; color: #7f8ca1; font-size: 0.66rem; text-align: right; }

/* Settings: an die Create-Lobby-Optik angelehnt */
/* Settings-Panel: gleiche Optik wie das Erstellen der Lobby (Slider + Tacho + Segmente),
   aber in der schmalen Panel-Spalte werden die Grids gestapelt. */
.geier-settings-panel { display: grid; gap: 0.8rem; margin: 0; }
.geier-settings-panel .geier-wide-field > span { color: #647086; font-size: 0.59rem; font-weight: 800; letter-spacing: 0.09em; text-transform: uppercase; }
.geier-settings-panel > .geier-wide-field select,
.geier-settings-panel > .geier-wide-field input[type="text"] { width: 100%; padding: 0.5rem 0.6rem; border: 1px solid #263142; border-radius: 9px; background: #0c111a; color: #e6edf8; font-size: 0.76rem; }
.geier-settings-panel .geier-range-grid { grid-template-columns: 1fr; }
.geier-settings-panel .geier-setting-grid { grid-template-columns: 1fr; }
/* Save-Zeile: klar abgesetzt (Trennlinie + Abstand), kompakter Button, kurze Bestaetigung */
.geier-settings-actions { display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; gap: 12px; margin-top: 0.5rem; padding-top: 0.9rem; border-top: 1px solid var(--geier-line); }
.geier-settings-save { width: auto; min-width: 132px; margin: 0; }
.geier-settings-save { grid-column: 2; }
.geier-settings-saved { grid-column: 3; justify-self: start; display: inline-flex; align-items: center; gap: 5px; color: #6ce4a9; font-size: 0.72rem; font-weight: 800; }
.geier-settings-saved.show { animation: geierSavedFlash 1.8s ease forwards; }
@keyframes geierSavedFlash { 0% { opacity: 0; transform: translateX(-4px); } 12% { opacity: 1; transform: none; } 72% { opacity: 1; } 100% { opacity: 0; } }
@media (prefers-reduced-motion: reduce) { .geier-settings-saved.show { animation: none; opacity: 1; } }

/* Aktionsleiste: direkt unter der Decks-Box, kompakte mittige Buttons */
.geier-room-actions { display: grid; justify-items: center; gap: 12px; margin: 6px 0 20px; }
.geier-room-actions .geier-spectator-notice { justify-self: stretch; width: 100%; margin: 0; }
.geier-room-buttons { display: flex; flex-wrap: wrap; justify-content: center; align-items: stretch; gap: 12px; }
.geier-room-btn {
  position: relative; /* Traeger fuer den Ready-Lichtlauf (::after) */
  display: inline-flex; align-items: center; gap: 9px; min-height: 48px; padding: 0 22px; cursor: pointer;
  border: 1px solid transparent; border-radius: 12px;
  transition: transform .14s ease, box-shadow .2s ease, background .2s ease, border-color .2s ease, color .2s ease;
}
.geier-room-btn span { font-size: 0.74rem; font-weight: 900; letter-spacing: .09em; text-transform: uppercase; }
.geier-btn-ico { width: 15px; height: 15px; flex: 0 0 auto; }
.geier-room-btn:not(:disabled):hover { transform: translateY(-1px); }
.geier-room-btn:disabled { cursor: not-allowed; }
/* Ready: kein dunkelgruener Block mehr. Ungeklickt neutral wie Pause; ist der Spieler
   ready, bekommt der Button denselben Lichtlauf wie seine Zeile in der Lobbyliste. */
.geier-btn-ready { background: #131d2c; border-color: #2c3a52; color: #cdd8e8 !important; }
.geier-btn-ready:hover { background: #182338; border-color: rgba(88, 217, 156, .6); box-shadow: 0 0 13px rgba(88, 217, 156, .24); }
.geier-btn-ready.is-ready { background: #131d2c; color: #d9ffee !important; }
.geier-btn-ready.is-ready:hover { background: #182338; }
.geier-btn-ready.is-ready .geier-btn-ico { color: #7cf0bb; }
/* Pause: kompakt, dezent */
.geier-btn-pause { background: #131d2c; border-color: #2c3a52; color: #cdd8e8 !important; }
.geier-btn-pause:hover { background: #182338; border-color: #5b8cff; box-shadow: 0 0 13px rgba(91, 140, 255, .3); }
/* Start game: gesperrt bis Regeln bestaetigt, aber elegant statt breiter Kasten */
.geier-btn-start { background: linear-gradient(180deg, #16233a, #101a2b); border: 1px dashed #33425e; color: #93a0b6 !important; }
.geier-btn-start b { color: #6f7d93; }
.geier-btn-start:disabled { opacity: .9; }
.geier-btn-start:hover { background: linear-gradient(180deg, #16233a, #101a2b); } /* globales button:hover-Blau neutralisieren (auch disabled) */
.geier-btn-start:not(:disabled) { border-style: solid; border-color: rgba(126, 162, 255, .5); color: #cdddff !important; }
.geier-btn-start:not(:disabled):hover { box-shadow: 0 0 18px rgba(91, 140, 255, .45); border-color: #7ea2ff; }

.geier-panel-title { display: flex; align-items: center; justify-content: space-between; margin-bottom: 0.85rem; }
.geier-panel-title h4 { margin: 0.08rem 0 0; color: #fff; font-size: 1rem; }
.geier-panel-title > b, .geier-panel-title > span { color: #8693a8; font-size: 0.67rem; }
.geier-player-list { display: grid; grid-template-columns: 1fr 1fr; gap: 0.55rem; }
.geier-player-seat { display: flex; align-items: center; gap: 0.65rem; min-height: 58px; padding: 0.65rem; border: 1px solid #263142; border-radius: 11px; background: #0e1520; }
.geier-player-seat.empty { border-style: dashed; opacity: 0.5; }
.geier-player-avatar { display: grid; flex: 0 0 auto; width: 34px; height: 34px; place-items: center; border-radius: 10px; background: linear-gradient(135deg, #334b75, #1c2940); color: #bfd1f1; font-weight: 900; }
.geier-player-seat.ready .geier-player-avatar { background: linear-gradient(135deg, #26895c, #1a5c42); color: #d7ffec; }
.geier-player-seat > div { display: grid; min-width: 0; }
.geier-player-seat strong { overflow: hidden; color: #dce5f2; font-size: 0.75rem; text-overflow: ellipsis; white-space: nowrap; }
.geier-player-seat small { color: #6d7a90; font-size: 0.61rem; }
.geier-player-state { margin-left: auto; color: #69768b; font-size: 0.57rem; font-weight: 850; text-transform: uppercase; }
.geier-player-seat.ready .geier-player-state { color: #55db9c; }
.geier-member-list { display: grid; align-content: start; gap: 8px; }
.geier-member-row {
  --role-accent: #52637c; --role-tint: rgba(82, 99, 124, .10);
  position: relative; display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 12px;
  min-height: 62px; padding: 9px 12px 9px 15px; overflow: hidden;
  border: 1px solid #26324a; border-radius: 10px;
  background: linear-gradient(100deg, var(--role-tint), rgba(255, 255, 255, 0) 62%), #0e1626;
}
/* farbiger Rollen-Streifen an der Kante (statt grauem border-left) */
.geier-member-row::before { content: ""; position: absolute; left: 0; top: 0; bottom: 0; width: 4px; background: var(--role-accent); box-shadow: 0 0 12px color-mix(in srgb, var(--role-accent) 55%, transparent); }
.geier-member-row.role-leader { --role-accent: #ffc84d; --role-tint: rgba(255, 200, 77, .12); border-color: rgba(255, 200, 77, .30); }
.geier-member-row.role-coleader { --role-accent: #5b8cff; --role-tint: rgba(91, 140, 255, .12); border-color: rgba(91, 140, 255, .28); }
.geier-member-row.role-member { --role-accent: #58d99c; --role-tint: rgba(88, 217, 156, .10); border-color: rgba(88, 217, 156, .22); }
.geier-member-row.role-visitor { --role-accent: #45d6e7; --role-tint: rgba(69, 214, 231, .10); border-color: rgba(69, 214, 231, .22); }
.geier-member-row.role-visitor, .geier-member-row.paused { opacity: .82; }
/* Ready-Kennzeichnung: ruhiger Grundrahmen + ein einzelner, weicher Lichtlauf.
   Frueher: dicker 2px-Rand, harter weisser Peak und 2,15 s -> wirkte unruhig.
   Jetzt: 1.5px, symmetrischer Abfall ohne Weissspitze, deutlich langsamer.
   Dieselbe Behandlung nutzt der Ready-Button (siehe .geier-btn-ready.is-ready). */
.geier-member-row.ready,
.geier-btn-ready.is-ready { border-color: rgba(88, 217, 156, .46); box-shadow: inset 0 0 0 1px rgba(88, 217, 156, .13); }
.geier-member-row.ready::after,
.geier-btn-ready.is-ready::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 3;
  padding: 1.5px;
  pointer-events: none;
  border-radius: inherit;
  background: conic-gradient(
    from var(--geier-ready-angle),
    rgba(124, 240, 187, 0) 0deg 246deg,
    rgba(124, 240, 187, .16) 274deg,
    rgba(124, 240, 187, .52) 296deg,
    rgba(173, 250, 214, .78) 310deg,
    rgba(124, 240, 187, .52) 324deg,
    rgba(124, 240, 187, .16) 346deg,
    rgba(124, 240, 187, 0) 360deg
  );
  -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  -webkit-mask-composite: xor;
  mask-composite: exclude;
  animation: geierReadyBorderTrace 3.6s linear infinite;
}
@keyframes geierReadyBorderTrace { to { --geier-ready-angle: 360deg; } }
.geier-member-main, .geier-member-tail { display: flex; align-items: center; gap: 10px; min-width: 0; }
.geier-member-main > .geier-avatar { width: 40px; height: 40px; box-shadow: 0 0 0 2px color-mix(in srgb, var(--role-accent) 45%, transparent); }
.geier-member-main > div { display: grid; min-width: 0; }
.geier-member-main strong { overflow: hidden; color: #eaf1fb; font-size: .76rem; text-overflow: ellipsis; white-space: nowrap; }
.geier-member-main small { font-size: .61rem; font-weight: 800; letter-spacing: .02em; color: color-mix(in srgb, var(--role-accent) 78%, #cfd8e6); }
.geier-avatar-fallback { display: grid; place-items: center; background: #25344e; color: #c8d5e9; font-size: .7rem; font-weight: 900; }
.geier-you { color: #78a0ff; font-size: .55rem; font-weight: 850; text-transform: uppercase; }
.geier-member-row.ready .geier-player-state { color: #55db9c; }
.geier-role-edit { display: grid; width: 32px; height: 32px; padding: 0; place-items: center; cursor: pointer; border: 1px solid #344156; border-radius: 7px; background: #172131; color: #9fb0c9 !important; }
.geier-role-edit:hover { background: #1c2740; border-color: #5b8cff; color: #cbd9ff !important; }
.geier-role-kick { display: grid; width: 32px; height: 32px; padding: 0; place-items: center; cursor: pointer; border: 1px solid rgba(234, 91, 103, .38); border-radius: 7px; background: rgba(100, 30, 39, .22); color: #e98b94 !important; }
.geier-role-kick:hover { background: rgba(145, 40, 52, .35); border-color: #f06d78; color: #ffd3d7 !important; }
.geier-role-kick:disabled { cursor: wait; opacity: .55; }

/* Kick-Bestaetigung im Look der Deck-Karten. */
.geier-kick-dialog { width: min(440px, calc(100vw - 28px)); max-width: none; padding: 0; border: 0; border-radius: 14px; color: #f3f6ff; background: transparent; overflow: visible; }
.geier-kick-dialog::backdrop { background: rgba(3, 6, 13, .78); backdrop-filter: blur(6px); }
.geier-kick-card {
  position: relative; overflow: hidden; display: grid; gap: 18px; margin: 0; padding: 24px;
  border: 1px solid rgba(99, 125, 215, .48); border-radius: 14px;
  background: linear-gradient(145deg, rgba(31, 48, 91, .98), rgba(18, 21, 31, .99) 52%, rgba(39, 22, 48, .98));
  box-shadow: 0 24px 70px rgba(0, 0, 0, .62), inset 0 0 30px rgba(83, 110, 215, .08);
}
.geier-kick-card::before { content: ""; position: absolute; top: 0; left: 10%; right: 10%; height: 1px; background: var(--panel-line); box-shadow: 0 0 10px rgba(89, 122, 255, .65); }
.geier-kick-dialog[open] .geier-kick-card { animation: geierKickOpen .2s cubic-bezier(.2, .8, .2, 1); }
@keyframes geierKickOpen { from { opacity: 0; transform: translateY(8px) scale(.98); } to { opacity: 1; transform: none; } }
.geier-kick-head { display: flex; align-items: center; gap: 13px; }
.geier-kick-head > div { display: grid; gap: 1px; }
.geier-kick-head span:not(.geier-kick-symbol) { color: #8796ad; font-size: .61rem; font-weight: 850; letter-spacing: .11em; text-transform: uppercase; }
.geier-kick-head h3 { margin: 0; color: #fff; font-size: 1.08rem; }
.geier-kick-symbol { display: grid; width: 44px; height: 44px; flex: 0 0 auto; place-items: center; border: 1px solid rgba(240, 109, 120, .42); border-radius: 11px; background: rgba(126, 34, 45, .24); color: #f38b95; }
.geier-cancel-dialog-head { padding-right: 30px; }
.geier-cancel-dialog-close {
  position: absolute; top: 11px; right: 11px; width: 30px; height: 30px; padding: 0; cursor: pointer;
  border-radius: 7px;
}
.geier-cancel-dialog-close svg { width: 16px; height: 16px; }
.geier-cancel-dialog-close:hover, .geier-cancel-dialog-close:focus-visible {
  border-color: var(--loss);
  background: color-mix(in srgb, var(--loss) 34%, transparent);
  color: var(--panel-text);
}
.geier-kick-player { display: flex; align-items: center; gap: 12px; padding: 12px; border: 1px solid rgba(99, 125, 215, .28); border-radius: 10px; background: rgba(7, 11, 19, .5); }
.geier-kick-player > span, .geier-kick-player .geier-avatar { width: 42px; height: 42px; flex: 0 0 auto; }
.geier-kick-player > div { display: grid; min-width: 0; }
.geier-kick-player strong { overflow: hidden; color: #f3f6ff; font-size: .85rem; text-overflow: ellipsis; white-space: nowrap; }
.geier-kick-player small { color: #8290a6; font-size: .66rem; font-weight: 750; }
.geier-kick-card > p { margin: -5px 0 0; color: #8e9bb0; font-size: .72rem; }
.geier-kick-actions { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
.geier-kick-actions button { min-height: 43px; border-radius: 9px; font-size: .7rem; font-weight: 850; letter-spacing: .05em; text-transform: uppercase; }
.geier-kick-cancel { border: 1px solid #39465a; background: #172131; color: #c5d0df; }
.geier-kick-cancel:hover, .geier-kick-cancel:focus-visible { border-color: #61718a; background: #202c3f; color: #fff; }
.geier-kick-confirm { border: 1px solid rgba(255, 130, 140, .58); background: linear-gradient(180deg, #a73d49, #752731); color: #fff; box-shadow: 0 7px 18px rgba(93, 24, 34, .34); }
.geier-kick-confirm:hover, .geier-kick-confirm:focus-visible { border-color: #ff9aa3; background: linear-gradient(180deg, #c64a57, #8b2d38); box-shadow: 0 0 16px rgba(240, 91, 104, .3), 0 7px 18px rgba(93, 24, 34, .38); }
.geier-info-dialog .geier-kick-symbol {
  border-color: color-mix(in srgb, var(--geier-gold) 45%, transparent);
  background: color-mix(in srgb, var(--geier-gold) 14%, transparent);
  color: var(--geier-gold);
}
.geier-dialog-primary {
  border: 1px solid color-mix(in srgb, var(--primary) 72%, white);
  background: linear-gradient(180deg, var(--primary), var(--primary-d));
  color: white;
  box-shadow: 0 7px 18px color-mix(in srgb, var(--primary-d) 34%, transparent);
}
.geier-dialog-primary:hover, .geier-dialog-primary:focus-visible {
  border-color: white; background: var(--primary-d);
}
/* Verlauf: breiter als der Standard-Kick-Dialog (min(440px,...)) - traegt ganze
   Deck-Kacheln statt einzelner Zeilen, bei vielen Mitspielern pro Runde waere ein
   schmales Fenster sonst ewig scrollbar. Muss NACH .geier-kick-dialog stehen, sonst
   gewinnt dessen width in der Kaskade (beides einfache Klassenselektoren). */
.geier-history-dialog { width: min(1600px, 94vw); }
.geier-history-card { max-height: min(84vh, 860px); padding-right: 10px; }
.geier-history-card > header { padding-right: 24px; }
#geier-history-list { display: grid; max-height: min(70vh, 720px); overflow-y: auto; padding-right: 10px; margin-right: -10px; }
/* Editor liegt IM Fluss (volle Breite unter der Zeile) -> wird nicht mehr vom Scroll-Container abgeschnitten */
/* Einspaltig, seit der Apply-Button entfaellt: die Auswahl wirkt direkt. */
.geier-role-editor { flex: 1 0 100%; display: grid; gap: 6px; margin-top: 2px; padding: 8px; border: 1px solid #3a4a63; border-radius: 8px; background: #0c1524; box-shadow: inset 0 1px rgba(255, 255, 255, .03); }
.geier-role-editor[hidden] { display: none; } /* Klassen-display darf hidden nicht ueberstimmen */
.geier-role-editor select { width: 100%; height: 34px; cursor: pointer; border: 1px solid #344156; border-radius: 6px; background: #0b111b; color: #dbe5f2; font-size: .67rem; }
.geier-role-editor select:disabled { cursor: wait; opacity: .55; }
.spectator-title { margin-top: 1.25rem; }
.geier-spectator-list { display: flex; flex-wrap: wrap; gap: 0.4rem; min-height: 32px; }
.geier-spectator-list p { margin: 0; color: #647086; font-size: 0.68rem; }
.geier-spectator-chip { padding: 0.28rem 0.5rem; border: 1px solid #293445; border-radius: 99px; background: #0f1621; color: #91a0b7; font-size: 0.64rem; }
.geier-spectator-notice { margin: 0.85rem 0; padding: 0.85rem; border: 1px solid rgba(91, 140, 255, 0.25); border-radius: 11px; background: rgba(91, 140, 255, 0.07); }
.geier-spectator-notice b { color: #91b1ff; font-size: 0.72rem; }
.geier-spectator-notice p { margin: 0.25rem 0 0; color: #7f8ca1; font-size: 0.66rem; }

#geier-note.geier-status { min-height: 1.5rem; margin: 0.6rem 0 0; padding: 0 0.5rem; color: #dce5f2; font-size: 0.75rem; }
#geier-note.geier-status.error { color: #ff9aa1; }
#geier-note.geier-status.success { color: #6ce4a9; }
/* Erfolgsmeldungen blenden aus, statt abrupt zu verschwinden. Die Klasse kommt aus
   setGeierStatus in geier-identity.mjs, die Dauer dort muss zu dieser passen.
   Bewusst global und nicht im Mobilblock: das JavaScript vergibt sie ueberall, eine
   Regel nur fuer die mobile Lobby haette den Desktop und die Erstellen-/Beitreten-
   Ansichten weiterhin hart umschalten lassen. */
#geier-note.geier-status { transition: opacity .45s ease; }
#geier-note.geier-status.is-fading { opacity: 0; }

@media (max-width: 1200px) {
  .geier-deck-board { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 900px) {
  /* Previous Decks: eigenes Deck lang oben, die uebrigen zu dritt je Zeile (Eliass
     02.09.2026). Vorher lag jedes Deck untereinander - gemessen 1818px Gesamthoehe, bis
     zum naechsten "Ready" eine sehr lange Strecke. Jetzt 860px.
     Der Block steht bewusst HIER und nicht weiter oben bei den uebrigen Spielregeln:
     die Grundregel `.geier-deck-board { display: flex }` kommt spaeter in der Datei und
     haette bei gleicher Spezifitaet gewonnen - oben gesetzt blieb das Raster wirkungslos.
     Alle Regeln haengen an #geier-previous-decks-content, weil dieselben Kacheln auch im
     Verlauf verwendet werden. Dort gibt es kein eigenes Deck; ohne die Begrenzung haette
     jede Kachel im Verlauf als fremd gegolten und ihre Aktionen verloren. */
  #geier-previous-decks-content.geier-deck-board {
    display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; padding: 10px 10px 14px;
  }
  /* min-width: 0 ist Pflicht: Raster-Elemente haben von sich aus min-width: auto und
     koennen dann nicht unter ihre Inhaltsbreite schrumpfen. Gemessen blieb jede Kachel
     sonst 249px breit, und es passte trotz dreier Spalten nur eine je Zeile. */
  #geier-previous-decks-content .geier-deck-tile { padding: 0.5rem 0.45rem; gap: 6px; min-width: 0; }
  #geier-previous-decks-content .geier-deck-tile > header,
  #geier-previous-decks-content .geier-deck-loadout,
  #geier-previous-decks-content .geier-deck-cards { min-width: 0; }
  #geier-previous-decks-content .geier-deck-tile.own { grid-column: 1 / -1; padding: 0.7rem 0.75rem; gap: 9px; }

  /* Karten fuellen die Kachel, statt auf festen 52px zu bestehen - sonst passen drei
     Kacheln nicht nebeneinander. Das eigene Deck bekommt alle acht in eine Reihe. */
  #geier-previous-decks-content .geier-deck-cards { grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 3px; }
  #geier-previous-decks-content .geier-deck-tile.own .geier-deck-cards { grid-template-columns: repeat(8, minmax(0, 1fr)); gap: 4px; }
  #geier-previous-decks-content .geier-deck-card img { width: 100%; }

  /* Turm und Trennstrich fallen mobil ueberall weg - auch beim eigenen Deck. Dort war
     der Turm in einer anderen Groesse als die Karten und brach die Reihe optisch
     (Eliass 03.09.2026). Ohne ihn nehmen die acht Karten die volle Breite ein. */
  #geier-previous-decks-content .geier-deck-div,
  #geier-previous-decks-content .geier-deck-tower { display: none; }
  #geier-previous-decks-content .geier-deck-loadout { display: block; }

  /* Name und Aktionen untereinander statt nebeneinander - nebeneinander passen sie in
     eine Drittel-Kachel nicht. Sie ganz wegzulassen waere bequemer gewesen, nimmt aber
     Speichern und Kopieren fremder Decks weg, und Zuschauern, deren ID in der Runde gar
     nicht vorkommt, saemtliche Aktionen. */
  #geier-previous-decks-content .geier-deck-tile:not(.own) > header {
    align-items: stretch; flex-direction: column; gap: 4px; min-height: 0;
  }
  /* Elixierzahl links, Merken und QR als Paar rechts - nicht mit dem Chip dazwischen
     auseinandergezogen (Eliass 03.09.2026). Das erledigt margin-right: auto am Chip.
     20px waren als Symbol zu klein; 24px sind wieder greifbar. flex-wrap bleibt als
     Rueckfallebene: auf sehr schmalen Geraeten rutscht das Knopfpaar dann gemeinsam
     eine Zeile tiefer, statt am overflow: hidden der Kachel abgeschnitten zu werden. */
  #geier-previous-decks-content .geier-deck-tile:not(.own) .deck-actions {
    flex-wrap: wrap; justify-content: flex-end; gap: 3px;
  }
  #geier-previous-decks-content .geier-deck-tile:not(.own) .deck-actions .elixir {
    margin-right: auto; padding-inline: 0.24rem; font-size: .62rem; min-width: 0;
  }
  #geier-previous-decks-content .geier-deck-tile:not(.own) .deck-btn {
    width: 24px; height: 24px; min-width: 0; padding: 0; flex: none;
  }
  /* Die Gruppe ist EIN Flex-Element und bricht nie in sich um - damit ist die
     Umbruchstelle immer zwischen Chip und Knopfpaar, nie zwischen den Knoepfen. */
  #geier-previous-decks-content .geier-deck-btns { flex: none; display: flex; flex-wrap: nowrap; gap: 3px; }
  #geier-previous-decks-content .geier-deck-tile:not(.own) .deck-btn svg { width: 14px; height: 14px; }
  #geier-previous-decks-content .geier-deck-tile:not(.own) .geier-deck-who .geier-avatar { width: 20px; height: 20px; }
  #geier-previous-decks-content .geier-deck-tile:not(.own) .geier-deck-who strong { font-size: .68rem; }

  .geier-mode-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .geier-lobby-panels { flex-direction: column; }
  .geier-panel-col { flex: 1 1 auto; width: 100%; }
  .geier-chat-log { height: 20rem; }
  .geier-members-scroll { height: 20rem; }
  .geier-room-header { grid-template-columns: 1fr 1fr; }
  .geier-room-identity { grid-column: 1 / -1; }
  .geier-room-viewer { justify-items: start; }
}
@media (max-width: 680px) {
  .geier-shell { border-radius: 8px; }
  .geier-shell-head { align-items: flex-start; padding: 16px; flex-direction: column; }
  #geier-home, .geier-room { padding: 1.4rem 1rem 1.7rem; }
  .geier-section-heading { display: block; }
  .geier-section-heading > p { margin-top: 0.45rem; text-align: left; }
  .geier-mode-grid, .geier-entry-grid, .geier-invite-grid, .geier-setting-grid, .geier-range-grid { grid-template-columns: 1fr; }
  .geier-lobby-tabs { width: 100%; }
  .geier-lobby-tabs button { min-width: 0; flex: 1 1 50%; }
  .geier-player-list { grid-template-columns: 1fr; }
  .geier-room-header { grid-template-columns: 1fr; }
  .geier-room-viewer { justify-items: start; }
  .geier-form-row, .geier-join-actions { grid-template-columns: 1fr; }
  .geier-join-search { grid-template-columns: 1fr; }
  .geier-join-result { align-items: stretch; flex-direction: column; }
  .geier-join-mode-art { align-self: flex-start; width: 54px; height: 54px; margin-bottom: -5px; }
  .geier-join-result .geier-join-command { flex-basis: auto; width: 100%; }
  /* mobil war der Abstand 48px -> 8 + 34 + 6 haelt das Formular an derselben Stelle */
  .geier-create-setup { margin-top: 0; padding: 18px 14px; }
  .geier-setup-backrow { position: static; margin: 8px auto 6px; }
  .geier-setup-header > div { max-width: none; }
  .geier-setup-rules-ico { width: 30px; height: 30px; }
  .geier-setup-header .geier-setup-rules p { font-size: 0.86rem; }
  .geier-setup-art { --setup-art-height: 78px; right: 12px; }
  .geier-difficulty-meter { height: 172px; }
  .geier-gauge { top: 0; width: 360px; height: 154px; }
  .geier-gauge-options { left: 4px; right: 4px; bottom: 0; }
  .geier-gauge-option span { min-width: 0; padding-inline: 3px; font-size: .61rem; }
  .geier-previous-decks > header { align-items: flex-start; flex-direction: column; }
  .geier-deck-placeholder { justify-content: flex-start; }
  .geier-member-tail { gap: 5px; }
  .geier-role-editor { left: 8px; right: 8px; }
}

@media (prefers-reduced-motion: reduce) {
  .geier-mode-card.is-entering,
  .geier-mode-setup,
  .geier-shell,
  .geier-create-setup::before,
  .geier-card-filter-map { opacity: 1; animation: none; filter: none; }
  .geier-pool-stage,
  .geier-card-filter-reveal,
  .geier-card-filter-toggle > svg { transition-duration: .01ms; }
  .geier-pool-card.is-toggling,
  .geier-card-filter-grid.is-revealing .geier-pool-card { animation: none; }
  .geier-member-row.ready::after,
  .geier-btn-ready.is-ready::after { animation: none; background: rgba(124, 240, 187, .7); }
  .geier-gauge-scan { animation: none; }
  .geier-gauge-needle { transition-duration: .01ms; }
}

/* ---------- Plugin- / Modus-Kacheln ---------- */
/* Grid statt flex+center: Karten fuellen die Zeile immer bis zum Rand
   (gleiche linke/rechte Kante wie ueberschrift/hint), keine Luecke mehr,
   die bei zentriertem flex-wrap je nach Kartenzahl pro Zeile entstehen kann. */
.plugin-grid {
  display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
  gap: 1.1rem; margin: 1rem 0;
}
.plugin-card, .mode-card {
  position: relative; overflow: hidden;
  display: grid; grid-template-rows: auto 1fr;
  min-height: 224px; text-align: left; padding: 0; cursor: pointer;
  border: 1px solid var(--panel-border); border-radius: var(--panel-radius);
  background: var(--panel-bg); box-shadow: var(--panel-shadow);
  color: var(--panel-text); transition: transform 0.12s, box-shadow 0.12s, border-color 0.12s, background 0.12s; text-decoration: none;
}
.plugin-card::before, .mode-card::before {
  content: ""; position: absolute; top: 0; left: 10%; right: 10%; height: 1px;
  background: var(--panel-line); box-shadow: var(--panel-line-glow); pointer-events: none;
}
.plugin-card:hover, .mode-card:hover:not(:disabled) {
  transform: translateY(-2px); border-color: var(--deck-btn-hover-border);
  box-shadow: var(--panel-shadow), 0 0 14px rgba(89, 122, 255, 0.18);
  text-decoration: none;
}
/* Platzhalter-Banner oben in der Karte, analog zur Art-Zeile bei
   .geier-mode-card - reserviert die Flaeche fuer ein spaeteres Plug-in-Bild. */
.plugin-card-banner {
  position: relative; min-height: 104px;
  border-bottom: 1px solid rgba(99, 125, 215, 0.22);
  background:
    repeating-linear-gradient(135deg, rgba(255, 255, 255, 0.03) 0 1px, transparent 1px 12px),
    linear-gradient(135deg, rgba(89, 122, 255, 0.16), rgba(189, 113, 240, 0.09) 60%, transparent);
}
.plugin-card-banner:not(:has(img))::after {
  content: "🖼️"; position: absolute; inset: 0; display: grid; place-items: center;
  font-size: 1.7rem; opacity: 0.22; pointer-events: none;
}
.plugin-card-banner img {
  position: absolute; inset: 0; width: 100%; height: 100%;
  object-fit: cover; object-position: center; display: block;
}
/* Profil-Icon: sitzt wie ein Avatar auf der Kante zwischen Banner und Copy,
   ragt oben ins Banner rein. Bilder liegen unter assets/streamer/ und sind
   auf den 216x216-Canvas mit ~73% Fuellgrad normalisiert (siehe
   docs/ASSET-KATALOG.md) - object-fit:contain reicht dadurch fuer alle
   Icons gleich, ohne Groessen-Handarbeit pro Bild. */
.plugin-card-icon {
  position: absolute; z-index: 5; left: 18px; top: 104px; transform: translateY(-50%);
  width: 52px; height: 52px; border-radius: 50%; overflow: hidden;
  display: grid; place-items: center;
  background: linear-gradient(180deg, #232838, #14161f);
  border: 3px solid #14161f; box-shadow: 0 4px 10px rgba(0, 0, 0, 0.4);
}
.plugin-card-icon:empty::after {
  content: ""; width: 20px; height: 20px; border-radius: 50%;
  border: 2px dashed rgba(226, 233, 248, 0.28);
}
.plugin-card-icon img { width: 100%; height: 100%; object-fit: contain; display: block; }
.plugin-card.locked .plugin-card-icon { filter: grayscale(1) brightness(0.7); }
.plugin-card-copy { padding: 1.6rem 1.1rem 1.1rem; }
.plugin-card h3, .mode-card h3 { margin: 0 0 0.4rem; font-size: 1.05rem; }
.plugin-card p, .mode-card p { margin: 0; color: var(--panel-muted); font-size: 0.88rem; }
.mode-card:disabled { opacity: 0.5; cursor: default; }
/* Gesperrte (noch nicht gebaute) Streamer-Plug-ins: gleiche Sprache wie
   .geier-mode-card.locked - Schloss-Icon liegt als Overlay ueber dem Banner,
   die komplette Karte ist ausgegraut und nicht anklickbar. Beim Hover kommt
   kein blauer Akzent, sondern ein etwas helleres Grau. */
.plugin-card.locked {
  cursor: not-allowed; border-color: rgba(148, 163, 184, 0.24);
  background: linear-gradient(145deg, rgba(64, 68, 76, 0.9), rgba(24, 26, 31, 0.96) 55%, rgba(46, 48, 54, 0.9));
}
.plugin-card.locked:hover {
  transform: none; border-color: rgba(148, 163, 184, 0.34);
  box-shadow: var(--panel-shadow); background: linear-gradient(145deg, rgba(70, 74, 82, 0.9), rgba(28, 30, 35, 0.96) 55%, rgba(50, 52, 58, 0.9));
}
.plugin-card.locked .plugin-card-banner { filter: grayscale(1) brightness(0.7); }
.plugin-card.locked .plugin-card-banner::after { opacity: 0.1; }
.plugin-card-body { filter: grayscale(1) brightness(0.55); opacity: 0.85; }
.plugin-card.locked::before { background: rgba(148, 163, 184, 0.3); box-shadow: none; }
.plugin-card-lock {
  position: absolute; z-index: 4; left: 50%; top: 50%; transform: translate(-50%, -50%);
  display: grid; place-items: center; width: 44px; height: 44px; pointer-events: none;
}
.plugin-card-lock img {
  width: 100%; height: 100%; object-fit: contain;
  filter: drop-shadow(0 6px 14px rgba(0, 0, 0, 0.6));
}

/* ---------- Streamer-Plugin-Detailseite ---------- */
/* Eigene "Seite" statt Inline-Panel: gleiches Muster wie Geier home/room. */
/* Back-Button nutzt das bestehende .builder-back-Muster mit SVG-Chevron (kein Pfeil-Zeichen).
   Optik wie .geier-setup-return, die aber auf .geier-shell begrenzt ist. */
.streamer-back {
  display: inline-flex; align-items: center; gap: 6px; margin-bottom: 1rem;
  color: #d5deed; font-size: 0.72rem; font-weight: 750;
  letter-spacing: 0.1em; text-transform: uppercase;
  padding: 0.34rem 0.7rem 0.34rem 0.55rem;
}
.streamer-back > span { line-height: 1; }
.streamer-back .geier-back-ico { width: 15px; height: 15px; flex: none; }
/* Genau EINE Box: Banner/Icon-Kopf und alle Auswahlmoeglichkeiten liegen darin. */
.streamer-detail-card {
  border: 1px solid var(--panel-border); border-radius: var(--panel-radius);
  background: var(--panel-bg); box-shadow: var(--panel-shadow); overflow: visible;
}
/* Das Panel darf die Account-Vorschlaege nicht an seiner Unterkante abschneiden.
   Nur der Kopf clippt weiterhin seine Banner-Grafik an den oberen Rundungen. */
.streamer-detail-head {
  position: relative; overflow: hidden;
  border-radius: var(--panel-radius) var(--panel-radius) 0 0;
}
.streamer-detail-banner { position: relative; display: block; height: 150px; overflow: hidden; }
.streamer-detail-banner img { width: 100%; height: 100%; object-fit: cover; display: block; filter: blur(7px) brightness(.58); transform: scale(1.06); }
.streamer-detail-banner::after {
  content: ""; position: absolute; inset: 0; pointer-events: none;
  background: radial-gradient(ellipse 31% 48% at 50% 50%, rgba(3, 5, 11, .76) 0%, rgba(3, 5, 11, .52) 42%, rgba(3, 5, 11, .18) 68%, transparent 100%);
}
.streamer-detail-banner-title {
  position: absolute; inset: 0 0 auto; z-index: 2; display: grid; height: 150px; margin: 0; padding: 0 1rem; place-items: center;
  color: var(--panel-text); font-family: inherit; font-size: clamp(2.35rem, 7vw, 3.25rem); font-weight: 800; line-height: 1.05; letter-spacing: -.025em; text-align: center;
  text-shadow: 0 3px 12px rgba(0, 0, 0, .82);
}
.streamer-detail-icon {
  position: absolute; left: 24px; top: 150px; transform: translateY(-50%); z-index: 3;
  width: 78px; height: 78px; border-radius: 50%; overflow: hidden;
  display: grid; place-items: center;
  background: linear-gradient(180deg, #232838, #14161f);
  border: 4px solid #14161f; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.45);
}
.streamer-detail-icon img { width: 100%; height: 100%; object-fit: contain; }
/* Der linke Innenabstand haelt Platz fuer den runden Plug-in-Icon-Kreis, der aus
   dem Banner heraushaengt. Rechts kein Abstand - die Karte laeuft bis zur
   Panel-Kante durch und wird dort weich ausgeblendet. */
.streamer-detail-rules { display: flex; align-items: center; min-height: 102px; padding: 1rem 0 1.15rem 7.4rem; }
.streamer-detail-rules-card {
  position: relative; flex: 1; min-width: 0; min-height: 68px;
  display: flex; align-items: center; gap: 16px;
  /* Der Text laeuft bis fast an die Panel-Kante. Er wird bewusst NICHT vor dem
     Verlauf gestoppt - die Maske liegt nur auf der Deko, der Text bleibt scharf. */
  padding: 0.2rem 1.6rem 0.2rem 0.2rem;
}
/* Hintergrund, Rahmen und Lichtkante liegen auf Pseudo-Elementen, damit nur die
   Deko nach rechts ausblendet und der Text davon unberuehrt bleibt. */
.streamer-detail-rules-card::before,
.streamer-detail-rules-card::after {
  content: ""; position: absolute; pointer-events: none;
  -webkit-mask-image: linear-gradient(90deg, #000 0 86%, transparent 100%);
  mask-image: linear-gradient(90deg, #000 0 86%, transparent 100%);
}
.streamer-detail-rules-card::before {
  inset: 0; border: 1px solid rgba(99, 125, 215, 0.3); border-right: 0; border-radius: 12px 0 0 12px;
  background: linear-gradient(135deg, rgba(58, 91, 217, 0.17), rgba(124, 58, 237, 0.1) 52%, rgba(8, 11, 18, 0.34));
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.06);
}
/* Dieselbe Lichtkante wie oben auf der Overlay-Karte (streak.css). */
.streamer-detail-rules-card::after {
  top: 0; left: 8%; right: 0; height: 1px;
  background: linear-gradient(90deg, transparent, #587cff, #bd71f0, transparent);
  box-shadow: 0 0 8px rgba(89, 122, 255, 0.5);
}
.streamer-detail-rules-icon,
.streamer-detail-rules-copy { position: relative; z-index: 1; }
/* Bild ohne Kachel, so hoch wie die Karte. */
.streamer-detail-rules-icon {
  flex: 0 0 auto; align-self: stretch; display: flex; align-items: center;
}
.streamer-detail-rules-icon img {
  width: auto; height: 100%; max-height: 108px; object-fit: contain;
  filter: drop-shadow(0 3px 9px rgba(0, 0, 0, 0.5));
}
.streamer-detail-rules-copy { display: grid; gap: 5px; min-width: 0; }
.streamer-detail-eyebrow {
  color: #38bdf8; font-size: 0.62rem; font-weight: 900; letter-spacing: 0.18em; text-transform: uppercase;
}
.streamer-detail-rules p { margin: 0; color: var(--panel-text); font-size: 1rem; line-height: 1.45; }

/* VORUEBERGEHEND (2026-07-27): Vergleichsvariante "harte Kante" statt Ausblenden.
   Umschalten mit ?rules=edge in der URL (setzt .rules-edge auf <body>, siehe app.js).
   Sobald die Entscheidung steht, gewinnt eine der beiden und der Rest fliegt raus. */
.rules-edge .streamer-detail-rules-card::before,
.rules-edge .streamer-detail-rules-card::after {
  -webkit-mask-image: none; mask-image: none;
}
.rules-edge .streamer-detail-rules-card::after { right: 0; }

/* Schmale Fenster: der prozentuale Textabstand und der Verlauf wuerden den Text
   unlesbar quetschen - dann normale Karte mit Rand auf beiden Seiten. */
@media (max-width: 900px) {
  .streamer-detail-rules { padding: 1rem 1.3rem 1.15rem 1.3rem; }
  .streamer-detail-rules-card { padding: 0.2rem 1.15rem 0.2rem 0.2rem; }
  .streamer-detail-rules-card::before {
    border-right: 1px solid rgba(99, 125, 215, 0.3); border-radius: 12px;
    -webkit-mask-image: none; mask-image: none;
  }
  .streamer-detail-rules-card::after { left: 12%; right: 12%; -webkit-mask-image: none; mask-image: none; }
  .streamer-detail-rules-icon img { max-height: 76px; }
}
.streamer-soon { color: var(--panel-muted); font-size: 0.92rem; padding: 0 1.3rem 1.4rem; }

/* ---------- Streamer-Plugin-Setup (Streak & Co.) ---------- */
/* WICHTIG: [hidden] setzt nur display:none per UA-Stylesheet - jede eigene
   display-Regel wuerde das ueberschreiben und z. B. eine leere Box sichtbar
   lassen. Deshalb hier explizit nachziehen (gleiches Muster wie .search-dropdown). */
.streamer-setup[hidden], .streamer-output[hidden], .streamer-account-card[hidden],
.streamer-soon[hidden], #streamer-home[hidden], #streamer-detail[hidden] { display: none; }
.streamer-setup { display: flex; flex-direction: column; gap: 1.6rem; padding: 0 1.3rem 1.4rem; }
.streamer-step { display: flex; gap: 0.9rem; align-items: flex-start; }
.streamer-step-no {
  flex: none; width: 28px; height: 28px; border-radius: 50%; display: grid; place-items: center;
  background: linear-gradient(145deg, #3a5bd9, #7c3aed); color: #fff;
  font-size: 0.85rem; font-weight: 800; margin-top: 0.1rem;
}
/* Links steht die Nummer (28px + 0.9rem Abstand). Ohne Ausgleich rechts säße der
   Inhalt im Schritt nicht symmetrisch im Panel, sondern wäre nach rechts verschoben -
   deshalb wird dieselbe Breite rechts wieder herausgerechnet. */
.streamer-step-body { flex: 1; min-width: 0; padding-right: calc(28px + 0.9rem); }
.streamer-setup h3 { margin: 0 0 0.3rem; font-size: 1.05rem; }
.streamer-setup .hint { margin: 0 0 1rem; }
.streamer-field { display: flex; flex-direction: column; gap: 0.35rem; margin-bottom: 1rem; max-width: 320px; }
/* Suchfeld braucht Positionierung, damit das Vorschlags-Dropdown darunter haengt. */
.streak-player-search { position: relative; }
.streamer-account-card {
  display: flex; align-items: center; justify-content: space-between; gap: 1rem; flex-wrap: wrap;
  max-width: 420px; padding: 0.7rem 0.9rem; border-radius: 10px;
  border: 1px solid rgba(74, 222, 128, 0.35); background: rgba(74, 222, 128, 0.08);
  font-size: 0.88rem;
}
.streamer-account-card.is-error { border-color: rgba(248, 113, 113, 0.4); background: rgba(248, 113, 113, 0.08); color: #f87171; }
.streamer-account-loading { color: var(--panel-muted); }
.streamer-account-main { display: flex; flex-direction: column; gap: 0.1rem; min-width: 0; }
.streamer-account-main strong { font-size: 0.98rem; }
.streamer-account-main span { color: var(--panel-muted); font-size: 0.8rem; }
.streamer-account-stats { display: flex; gap: 0.9rem; }
.streamer-account-stats span { display: inline-flex; align-items: center; gap: 0.3rem; font-weight: 700; }
.streamer-account-stats img { width: 18px; height: 18px; object-fit: contain; }
.streamer-field > span { font-size: 0.78rem; font-weight: 700; color: var(--panel-muted); text-transform: uppercase; letter-spacing: 0.04em; }
.streamer-field input[type="text"] {
  padding: 0.55rem 0.7rem; border-radius: 8px; border: 1px solid var(--panel-border);
  background: rgba(8, 10, 15, 0.4); color: var(--panel-text); font-size: 0.95rem;
}
.streamer-field input[type="text"]:focus { outline: none; border-color: var(--deck-btn-hover-border); }
.streamer-mode-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 0.7rem; margin-bottom: 1.1rem; }
/* Die Spielerfelder des Challenge-Boards: eine Zeile je Spieler, rechts daneben
   der geladene Name als Bestaetigung. */
.board-player-rows { display: grid; gap: 0.3rem; }
.board-player-row {
  display: grid; grid-template-columns: 26px minmax(0, 1fr) minmax(0, 1fr) 30px;
  align-items: center; gap: 0.7rem;
}
.board-player-row[hidden] { display: none; }
/* Nur der Aussenabstand muss weg, damit die Zeile mittig ausgerichtet bleibt.
   Die Maximalbreite von `.streamer-field` bleibt bewusst stehen: sie ist dieselbe
   wie die von `input[type="text"]` (style.css oben), und weil der Add-Knopf in
   derselben Huelle sitzt, ist er dadurch automatisch genauso breit wie die Felder.
   Wird hier `max-width: none` gesetzt, laufen Huelle und Knopf auf volle
   Spaltenbreite, waehrend der Input bei seiner eigenen Deckelung stehen bleibt -
   genau das war der Grund, warum der Knopf breiter war. */
.board-player-row .streamer-field { margin-bottom: 0; }
.board-player-remove {
  display: grid; place-items: center; width: 30px; height: 30px; padding: 0;
  border: 1px solid transparent; border-radius: 8px; background: transparent;
  color: var(--panel-muted); font-size: 0.9rem; cursor: pointer;
  transition: color 0.14s ease, border-color 0.14s ease, background 0.14s ease;
}
.board-player-remove:hover { color: #ff8a95; border-color: rgba(248, 113, 113, 0.4); background: rgba(248, 113, 113, 0.08); }
.board-player-no {
  display: grid; place-items: center; width: 26px; height: 26px; border-radius: 50%;
  background: rgba(10, 12, 18, 0.72); box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.06);
  color: var(--panel-muted); font-size: 0.78rem; font-weight: 900;
}
/* Die Bestaetigung sitzt in derselben Zeile, damit die Zuordnung eindeutig ist.
   Sie belegt ihren Platz auch leer, sonst springt die Zeile beim Laden. */
.board-player-confirm { min-height: 26px; display: flex; align-items: center; font-size: 0.92rem; color: var(--panel-muted); }
.board-player-confirm[hidden] { display: flex; visibility: hidden; }
.board-player-confirm.is-error { color: #ff8a95; }
.board-player-ok {
  display: inline-flex; align-items: center; gap: 0.4rem; min-width: 0;
  padding: 0.2rem 0.6rem 0.2rem 0.45rem; border-radius: 999px;
  border: 1px solid rgba(88, 221, 160, 0.36); background: rgba(31, 122, 88, 0.18);
  color: #8ff0c4; font-weight: 700;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.board-player-ok svg { flex: none; }
/* Der Hinzufuegen-Knopf sitzt in derselben Rasterspalte wie die Eingabefelder und
   uebernimmt deren Masse - nur gestrichelt statt durchgezogen. */
.board-add-player {
  width: 100%; text-align: left; font-family: inherit; font-size: 0.95rem;
  padding: 0.55rem 0.7rem; border-radius: 8px;
  border: 1px dashed rgba(99, 125, 215, 0.55);
  background: transparent; color: var(--panel-muted); cursor: pointer;
  transition: color 0.14s ease, border-color 0.14s ease, background 0.14s ease;
}
.board-add-player::before { content: "+ "; font-weight: 900; }
.board-add-player:hover { color: var(--panel-text); border-color: rgba(137, 154, 255, 0.8); background: rgba(99, 125, 215, 0.07); }
.board-player-add-row[hidden] { display: none; }
.board-player-no.is-ghost { background: transparent; box-shadow: none; color: rgba(226, 233, 248, 0.32); }
/* Zusatzoption unter einem Modus-Raster (z. B. QR-Code bei Current Deck). */
.streamer-toggle {
  display: flex; align-items: center; gap: 0.6rem; cursor: pointer;
  color: var(--panel-muted); font-size: 0.92rem;
}
.streamer-toggle input { width: 17px; height: 17px; accent-color: #6d5cff; cursor: pointer; }
.streamer-toggle:hover { color: var(--panel-text); }
.streamer-mode-choice {
  position: relative;
  display: grid; grid-template-columns: 34px 1fr; grid-template-rows: auto auto;
  column-gap: 0.7rem; align-items: center;
  text-align: left; padding: 0.7rem 0.85rem; cursor: pointer;
  border: 1px solid var(--panel-border); border-radius: 10px;
  background: rgba(8, 10, 15, 0.28); color: var(--panel-text);
  transition: border-color 0.12s, background 0.12s;
}
.streamer-mode-choice > img {
  grid-row: 1 / 3; grid-column: 1; width: 34px; height: 34px; object-fit: contain;
}
.streamer-mode-choice:hover { border-color: var(--deck-btn-hover-border); }
.streamer-mode-choice b { grid-column: 2; display: block; font-size: 0.9rem; margin-bottom: 0.2rem; }
/* Alle Kacheln - auch die gesperrte - behalten exakt dasselbe Grid und Padding,
   sonst wird eine Kachel hoeher und zieht die ganze Zeile mit. Das Schloss liegt
   deshalb absolut (ausserhalb des Grid-Flusses) mittig ueber der Kachel. */
.streamer-mode-choice > span:not(.streamer-mode-lock) {
  grid-column: 2; display: block; font-size: 0.78rem; color: var(--panel-muted); line-height: 1.35;
}
.streamer-mode-choice.active {
  border-color: #587cff; background: linear-gradient(145deg, rgba(49, 91, 212, 0.28), rgba(189, 113, 240, 0.12));
}
.streamer-mode-choice.locked { cursor: not-allowed; border-color: rgba(148, 163, 184, 0.24); }
.streamer-mode-choice.locked:hover { border-color: rgba(148, 163, 184, 0.34); background: rgba(148, 163, 184, 0.05); }
/* Inhalt dahinter abgedunkelt/entsaettigt, das Schloss selbst bleibt farbig. */
.streamer-mode-choice.locked > img,
.streamer-mode-choice.locked > b,
.streamer-mode-choice.locked > span:not(.streamer-mode-lock) {
  filter: grayscale(1) brightness(0.5); opacity: 0.85;
}
.streamer-mode-lock {
  position: absolute; z-index: 4; left: 50%; top: 50%; transform: translate(-50%, -50%);
  display: grid; place-items: center; width: 38px; height: 38px; pointer-events: none;
}
.streamer-mode-lock img {
  width: 100%; height: 100%; object-fit: contain;
  filter: drop-shadow(0 6px 14px rgba(0, 0, 0, 0.6));
}
.streamer-setup-actions { display: flex; align-items: center; gap: 0.9rem; }
.streamer-generate-btn {
  padding: 0.6rem 1.1rem; border-radius: 8px; border: 1px solid var(--deck-btn-hover-border);
  background: linear-gradient(145deg, #3a5bd9, #7c3aed); color: #fff; font-weight: 700;
  cursor: pointer; font-size: 0.9rem;
}
.streamer-generate-btn:hover { filter: brightness(1.08); }
.streamer-setup-status { font-size: 0.82rem; color: var(--panel-muted); }
.streamer-setup-status.is-error { color: #f87171; }
.streamer-output { margin-top: 1.2rem; padding-top: 1.1rem; border-top: 1px solid var(--panel-border); }
.streamer-output > .streamer-field { width: min(100%, 760px); max-width: none; }
.streamer-link-row { display: flex; gap: 0.5rem; }
.streamer-link-row input {
  flex: 1; padding: 0.55rem 0.7rem; border-radius: 8px; border: 1px solid var(--panel-border);
  background: rgba(8, 10, 15, 0.4); color: var(--panel-text); font-size: 0.85rem;
}
.streamer-link-row button, .streamer-link-row a {
  display: inline-flex; align-items: center; justify-content: center;
  padding: 0.55rem 0.9rem; border-radius: 8px; border: 1px solid var(--panel-border);
  background: rgba(255, 255, 255, 0.05); color: var(--panel-text);
  font-family: inherit; font-size: 0.85rem; font-weight: 800;
  cursor: pointer; text-decoration: none; white-space: nowrap;
}
.streamer-link-row button:hover, .streamer-link-row a:hover { border-color: var(--deck-btn-hover-border); }
.streamer-preview { margin-top: 1rem; }
.streamer-preview-label { display: block; font-size: 0.78rem; font-weight: 700; color: var(--panel-muted); text-transform: uppercase; letter-spacing: 0.04em; margin-bottom: 0.4rem; }
.streamer-preview-stage { display: flex; align-items: stretch; gap: .8rem; max-width: 980px; }
.streamer-preview iframe {
  flex: 1; width: 100%; min-width: 0; height: 350px; border: 1px dashed var(--panel-border);
  border-radius: 10px; background:
    repeating-conic-gradient(var(--panel-inset) 0% 25%, var(--panel-bg) 0% 50%) 50% / 16px 16px;
}
.streamer-preview-controls { display: flex; flex: 0 0 132px; flex-direction: column; justify-content: center; gap: .45rem; }
.streamer-preview-controls > span { color: var(--panel-muted); font-size: .68rem; font-weight: 800; letter-spacing: .06em; text-transform: uppercase; }
.streamer-preview-controls button {
  min-height: 32px; border: 1px solid var(--panel-border); border-radius: 7px;
  background: var(--panel-inset); color: var(--panel-text);
  font-family: inherit; font-size: .85rem; font-weight: 800; letter-spacing: normal;
}
.streamer-preview-controls button:hover { border-color: var(--deck-btn-hover-border); }
.streamer-preview-controls #streak-preview-win { color: var(--win); }
.streamer-preview-controls #streak-preview-loss { color: var(--loss); }
.streamer-preview-controls #streak-preview-draw { color: #a8afbd; }

/* Merge Tactics simuliert Platzierungen statt Sieg/Niederlage: 1./2. sind gute,
   3./4. sind schlechte Partien - deshalb dieselben zwei Farben wie sonst. */
.merge-preview-controls button[data-merge-preview-placement="1"],
.merge-preview-controls button[data-merge-preview-placement="2"] { color: var(--win); }
.merge-preview-controls button[data-merge-preview-placement="3"],
.merge-preview-controls button[data-merge-preview-placement="4"] { color: var(--loss); }

/* Das Board simuliert je Spieler - eine Zeile pro Teilnehmer statt zwei Knoepfen. */
.board-preview-controls { flex: 0 0 176px; }
.board-preview-controls #board-preview-players { display: flex; flex-direction: column; gap: .55rem; }
.board-preview-player { display: grid; gap: .25rem; }
.board-preview-player > span {
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  color: var(--panel-muted); font-size: .74rem; font-weight: 700;
}
.board-preview-buttons { display: flex; gap: .3rem; }
.board-preview-buttons button { flex: 1; min-width: 0; padding: 0 .25rem; font-size: .78rem; }
.board-preview-buttons button[data-board-preview-result="win"] { color: var(--win); }
.board-preview-buttons button[data-board-preview-result="loss"] { color: var(--loss); }
@media (max-width: 560px) { .streamer-preview-stage { flex-direction: column; } .streamer-preview-controls { flex-basis: auto; flex-direction: row; flex-wrap: wrap; } .streamer-preview-controls > span { width: 100%; } .streamer-preview-controls button { flex: 1; } }

/* Streak ist ein breites Overlay (760 px): die Bühne bekommt die volle Breite wie
   bei Current Deck, die Knöpfe wandern darunter nebeneinander. Seitlich hätten sie
   die Bühne so weit eingeengt, dass die Box größer war als ihr Rahmen. */
#streak-setup .streamer-preview-stage { flex-direction: column; }
/* WICHTIG in der Spaltenrichtung: `.streamer-preview iframe` hat `flex: 1`, und in
   einem Spalten-Flexbox bestimmt Flex die HÖHE - die `height` des Iframes (auch die
   von autoSizePreviewFrame gesetzte) wäre wirkungslos, das Iframe bliebe zu klein
   und die Box abgeschnitten. Deshalb hier zurück auf die eigene Höhe. */
#streak-setup .streamer-preview iframe { flex: 0 0 auto; }
#streak-setup .streamer-preview-controls {
  flex: 0 0 auto; flex-direction: row; flex-wrap: wrap;
  align-items: center; justify-content: center; gap: .45rem;
}
/* Beschriftung ueber den Knoepfen, die Knoepfe selbst mittig und in ihrer
   natuerlichen Breite - auseinandergezogen wirken drei Knoepfe wie eine Leiste. */
#streak-setup .streamer-preview-controls > span { flex: 0 0 100%; text-align: center; }
#streak-setup .streamer-preview-controls button { flex: 0 0 auto; min-width: 116px; padding-inline: .9rem; }

/* Zweite Reihe: die Art der nächsten Challenge. Steht unter den Kampfknöpfen und
   nur im Challenge-Modus. */
.streak-preview-kinds { flex: 0 0 100%; display: flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: .4rem; }
.streak-preview-kinds[hidden] { display: none; }
.streak-preview-kinds > span { flex: 0 0 100%; text-align: center; color: var(--panel-muted); font-size: .68rem; font-weight: 800; letter-spacing: .06em; text-transform: uppercase; }
#streak-setup .streak-preview-kinds button { min-width: 96px; font-size: .8rem; }
#streak-setup .streak-preview-kinds button.active { border-color: var(--deck-btn-hover-border); color: var(--panel-text); }

/* Keine festen Bühnenhöhen: `autoSizePreviewFrame()` in app.js misst die Box im
   Iframe und setzt die Höhe darauf. Der Wert in `.streamer-preview iframe` gilt nur,
   bis das Overlay geladen ist. */

/* ---------- Ad placeholder (subtle, non-intrusive) ---------- */
/* `width: 100%` ist noetig, seit body ein Spalten-Flex ist: `margin: 0 auto` allein
   liesse das Element sonst auf Inhaltsbreite zusammenfallen statt auf 1000px. */
.site-footer { width: 100%; max-width: 1000px; margin: 0 auto; padding: 0 1.25rem 2.5rem; }

/* ---------- Support-Leisten ueber der Rechtsleiste ---------- */
/* Bewusst nur halb so hoch wie die erste Fassung und deutlich transparenter als der
   schwarze Rechts-Footer darunter. Jede ganze Zeile ist ein Link; es gibt weder
   Untertitel noch rechte Handlungsbeschriftung oder Pfeil. */
.site-support {
  position: relative; z-index: 1; flex: none;
  width: 100%; background: var(--support-bg);
  border-top: 1px solid var(--panel-inset-border);
  border-bottom: 1px solid var(--panel-inset-border);
}
.site-support-row {
  display: block; width: 100%; color: var(--gold); text-decoration: none;
}
.site-support-row + .site-support-row { border-top: 1px solid var(--panel-inset-border); }
.site-support-row:hover { text-decoration: none; }
.site-support-inner {
  display: flex; align-items: center; gap: 0.7rem;
  width: 100%; max-width: 1000px; min-height: 39px;
  margin: 0 auto; padding: 0.25rem 1rem;
}
.site-support-art {
  display: flex; flex: none; align-items: center; justify-content: center;
  width: 29px; height: 29px;
}
.site-support-art img { display: block; width: 29px; height: 29px; object-fit: contain; }
.site-support-row:last-child .site-support-art img { transform: translateY(1px); }
.site-support-copy {
  overflow: hidden; min-width: 0;
  color: var(--gold); font-family: "Inter", system-ui, sans-serif;
  font-size: 0.8rem; font-weight: 600; letter-spacing: 0;
  line-height: 1.2; white-space: nowrap; text-overflow: ellipsis;
  opacity: 0.88; transition: opacity .15s ease;
}
.site-support-row:hover .site-support-copy { opacity: 1; }
.site-support-row:focus-visible { outline: 2px solid var(--primary); outline-offset: -4px; }
.site-support + .site-legal { margin-top: 0; }

/* ---------- Fusszeile: Rechtliches ---------- */
/* Gegenstueck zum Seitenkopf: gleicher schwarzer Balken, gleiche Schriftfarben,
   nur eine Stufe kleiner und ohne aktiven Zustand. Deshalb stehen hier dieselben
   rohen Werte wie in `body > header` / `#tabs` - beide Leisten muessen exakt
   zusammenpassen, ein abweichendes Token wuerde genau das brechen. */
.site-legal {
  /* Wie `main`/`.site-footer` ueber das fixierte, geblurrte Hintergrundbild
     (`body::before`, z-index 0) heben - sonst liegt das Artwork darueber. */
  position: relative; z-index: 1;
  margin-top: 1.6rem;
  background: #0b0b0d;
  border-top: 1px solid rgba(255, 255, 255, 0.08);
}
.site-legal-inner { max-width: 1000px; margin: 0 auto; padding: 1.1rem 1rem 1.3rem; }
.site-legal-links { display: flex; flex-wrap: wrap; align-items: center; gap: 0.25rem 1.4rem; }
/* Gemischt: fertige Rechtsseiten sind echte <a> mit eigener Adresse (das Impressum
   MUSS verlinkbar sein), die noch ungeschriebenen oeffnen weiterhin das Modal. Beide
   sollen gleich aussehen - der Besucher soll den Unterschied nicht sehen. */
.site-legal-links button,
.site-legal-links a {
  padding: 0.2rem 0; border: none; background: none;
  color: rgba(255, 255, 255, 0.6);
  font-size: 0.82rem; font-weight: 600; white-space: nowrap;
  text-decoration: none;
  transition: color 0.15s;
}
/* Der globale `button:hover` faerbt sonst blau. */
.site-legal-links button:hover,
.site-legal-links a:hover { background: none; color: #fff; }
.site-legal-social { margin-left: auto; gap: 0.7rem; }
.site-legal-social a { width: 20px; height: 20px; }
.site-legal-social img { width: 16px; height: 16px; }
@media (max-width: 680px) {
  .site-legal-social { flex-basis: 100%; margin: 0.45rem 0 0; }
}
/* Kontaktfenster (ueber "Contact" in der Rechtsleiste). Bewusst schlicht und formell:
   eine Beschriftungsspalte, daneben der Wert - dieselbe Form wie im Impressum. Kein
   farbiges Abzeichen fuer "bevorzugt"; in einem Rechtsbereich wirkt eine Plakette
   deplatziert, ein ruhiger Satz darunter sagt dasselbe. */
.contact-rows { display: grid; grid-template-columns: max-content 1fr; gap: 0.5rem 1.1rem; margin: 0.9rem 0 0; }
.contact-rows dt { color: var(--muted); font-size: 0.82rem; }
.contact-rows dd { margin: 0; font-size: 0.92rem; }
.contact-rows dd a { color: var(--gold); text-decoration: none; }
.contact-rows dd a:hover { text-decoration: underline; }
.contact-note { margin: 1rem 0 0; padding-top: 0.85rem; border-top: 1px solid var(--border); color: var(--muted); font-size: 0.82rem; }
.contact-note a { color: var(--gold); }
.site-legal-foot {
  display: flex; align-items: center; gap: 0.6rem;
  margin-top: 1rem; padding-top: 0.9rem;
  border-top: 1px solid rgba(255, 255, 255, 0.08);
}
.site-legal-logo { flex: none; border-radius: 5px; opacity: 0.8; }
.site-disclaimer {
  margin: 0; color: rgba(255, 255, 255, 0.38);
  font-size: 0.74rem; font-weight: 500; line-height: 1.45;
}
/* ---------- Icon tab (bookmark) ---------- */
#tabs .tab-icon { display: inline-flex; align-items: center; }

/* ---------- Saved decks ---------- */
/* Die gespeicherten Decks nutzen dieselben `.builder-result`-Karten wie der Deck
   Builder, deshalb traegt `#saved-decks` im HTML die Klasse `.builder-results`
   (Grid mit gap). Die frueheren `.saved-deck`-Regeln sind damit entfallen. */

/* ---------- Modal (QR) ---------- */
.modal { position: fixed; inset: 0; z-index: 100; background: rgba(0, 0, 0, 0.6); }
.modal:not([hidden]) { display: flex; align-items: center; justify-content: center; }
/* Kein `overflow: hidden` – sonst beschneidet die Box den QR-Glow. Die
   Glow-Linie unten liegt mit left/right 10% ohnehin innerhalb der Rundung. */
.modal-box {
  position: relative;
  background: var(--panel-bg); border: 1px solid var(--panel-border);
  border-radius: var(--panel-radius); color: var(--panel-text);
  padding: 1.6rem; max-width: 320px; text-align: center; box-shadow: var(--panel-shadow);
}
.modal-box::before {
  content: ""; position: absolute; top: 0; left: 10%; right: 10%; height: 1px;
  background: var(--panel-line); box-shadow: var(--panel-line-glow); pointer-events: none;
}
.modal-box h3 { margin: 0 0 0.9rem; }
.modal-close {
  position: absolute; top: 6px; right: 10px; width: auto; padding: 0;
  background: none; border: none; font-size: 1.5rem; line-height: 1;
  color: var(--panel-muted); cursor: pointer;
}
.modal-close:hover { color: var(--panel-text); }
/* QR bleibt bewusst auf Weiss – dunkle Codes sind schlechter scannbar.
   Feste Masse, damit der Rahmen auch dann steht, wenn das Bild nicht laedt. */
.qr-img { display: block; width: 240px; height: 240px; border-radius: 8px; background: #fff; padding: 6px; }
/* Pulsierender Glow um den Code. Der Ring liegt in einem eigenen Overlay,
   animiert wird nur `opacity` – kein Dauer-Neuberechnen von Schatten. */
.qr-frame { position: relative; display: inline-block; border-radius: 10px; }
.qr-frame::after {
  content: "";
  position: absolute; inset: -3px;
  border-radius: 12px; pointer-events: none;
  box-shadow:
    0 0 9px 2px rgba(88, 124, 255, 0.55),
    0 0 20px 6px rgba(189, 113, 240, 0.28);
  animation: qrGlowPulse 2.6s ease-in-out infinite;
}
@keyframes qrGlowPulse {
  0%, 100% { opacity: 0.5; }
  50% { opacity: 1; }
}
@media (prefers-reduced-motion: reduce) {
  .qr-frame::after { animation: none; opacity: 0.8; }
}
.cr-link {
  display: inline-block; margin-top: 0.6rem; background: var(--primary); color: #fff;
  padding: 0.5rem 1rem; border-radius: var(--radius-sm); font-weight: 600;
}
.cr-link:hover { background: var(--primary-d); text-decoration: none; }

/* ---------- Responsive ---------- */
@media (max-width: 560px) {
  .deck-stats { margin-left: 0; text-align: left; width: 100%; }
  .race-sub { display: none; }
  #clan-header { padding: 0.8rem; }
  .clan-header-layout { grid-template-columns: minmax(0, 1fr); gap: 0.8rem; }
  #clan-header .clan-badge { width: 58px; height: 58px; }
  .clan-head-top { min-height: 60px; }
  .clan-name { font-size: 1.15rem; }
  .clan-name .tag { display: block; margin: 0.1rem 0 0; }
  .clan-stat-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .clan-stat { min-height: 51px; padding-inline: 0.35rem; gap: 0.3rem; }
  .clan-stat-icon { width: 32px; height: 32px; }
  .clan-stat .v { font-size: 0.82rem; }
  .clan-war-progress { min-height: 255px; padding-inline: 0.5rem; }
  .clan-chart-total img { width: 32px; height: 32px; }
  .clan-chart-total b { font-size: 0.92rem; }
  .clan-war-chart { min-height: 190px; }
  .profile-top { grid-template-columns: minmax(0, 1fr) auto; }
  .profile-main { grid-column: 1; grid-row: 1; }
  .profile-league { grid-column: 2; grid-row: 1; }
  .profile-battle-form { grid-column: 1 / -1; grid-row: 2; max-width: none; margin-top: 0.3rem; }
  .player-decks-toolbar { align-items: flex-start; flex-direction: column; gap: 0.55rem; }
  .deck-sort-control { width: 100%; }
  /* Die Segment-Schalter waren schmal so wuchtig wie auf dem Desktop und nahmen mehr
     Gewicht ein, als eine Sortierung verdient (Eliass 15.08.2026). Flacher und mit
     kleinerer Schrift; 28px bleiben mit dem 3px-Rahmen der Gruppe bei 34px Tasthoehe. */
  .deck-sort-control { padding: 2px; }
  .deck-sort-control button { flex: 1; min-height: 28px; padding-inline: 0.28rem; font-size: 0.72rem; }
  /* Meta-Werkzeugleiste: Filter, Sortierung und Reload standen als drei Bloecke in
     EINER Zeile, obwohl jeder davon `width: 100%` bekommt - zusammen ragten sie 11px
     ueber den Bildschirm hinaus und "Reload" war abgeschnitten.
     Aufteilung jetzt: Sortierung ueber die ganze Breite in einer eigenen Zeile (vier
     Felder, die sich den Platz teilen), darueber Filter links und Reload rechts als
     zwei getrennte Kaesten in ihrer Inhaltsbreite. `order` ist noetig, weil die
     Sortierung im HTML zwischen den beiden steht. */
  .meta-toolbar-controls { display: flex; flex-wrap: wrap; width: 100%; }
  .meta-toolbar-controls > #decks-sort { order: 2; flex: 1 0 100%; }
  .meta-toolbar-controls > .deck-sort-control:not(#decks-sort) { order: 1; flex: none; width: auto; }
  .meta-toolbar-controls > .deck-sort-control:not(#decks-sort) button { flex: none; }
  /* Reload steht im HTML als letztes und wird damit an den rechten Rand geschoben. */
  .meta-toolbar-controls > .deck-sort-control:last-child { margin-left: auto; }
  /* Die Belohnungsarten bleiben auch schmal Bilder nebeneinander und brechen um,
     statt sich wie ein Segment-Schalter ueber die Breite zu ziehen. */
  /* 80px Kachelbreite liessen bei 335px Inhaltsbreite nur DREI Arten je Reihe zu -
     sieben Arten wurden damit drei Reihen und 251px hoch, mehr als Ueberschrift und
     Fliesstext darueber zusammen. 72px ergeben vier je Reihe, also 4 + 3.
     `min-width: 0` gehoert zwingend dazu: Flex-Kinder haben von sich aus
     `min-width: auto` und werden von einem langen Wort ueber ihre 72px hinaus
     aufgezogen - daran fiel Indonesisch auf drei je Reihe zurueck, und "Emoticons"
     (pt-BR) sowie "Kestenekler" (tr) sassen ueber ihrer Kachel. Mit 0 bleibt die
     Kachel bei 72px; ein zu langer Name ragt stattdessen leicht darueber hinaus.
     Nicht ueber eine anteilige Breite (25% je Kachel) loesen: das war gemessen
     schlechter (236px statt 147px). */
  .gift-filter { gap: 0.15rem 0.4rem; }
  .gift-filter button { width: 72px; min-width: 0; padding: 0.3rem 0.15rem 0.45rem; font-size: 0.74rem; }
  /* Die Ueberschrift des Bereichs darf kraeftiger stehen als der globale Mobilwert
     (Eliass 15.08.2026: "darf groesser geschrieben sein"). Bewusst NUR hier und
     nicht an `.page-intro h1`, sonst wandern alle bereits abgenommenen Bereiche
     mit. 5.4vw statt 4.6vw sind bei 375px rund 3px mehr.
     `.page-intro` muss mitgeschrieben werden, obwohl `.gift-rewards-intro` allein
     schon eindeutig waere: weiter unten steht `.page-intro h1` mit derselben
     Spezifitaet (eine Klasse, ein Element) und wuerde als spaetere Regel gewinnen. */
  .page-intro.gift-rewards-intro h1 { font-size: clamp(1.1rem, 5.4vw, 1.42rem); }
  .gift-filter button em { font-size: 0.72rem; }
  .gift-filter-art { height: 40px; }
  .gift-filter-art img { max-height: 40px; max-width: 48px; }
  .gift-filter-art.is-fan img { max-width: 32px; margin-left: 0; }
  .gift-filter-art.is-fan img + img { margin-left: -12px; }
  .player-deck-grid { grid-template-columns: 1fr; }
  .player-deck-cards { grid-template-columns: repeat(4, 58px); }
  .player-deck-cards .card,
  .player-deck-cards .card-img,
  .player-deck-cards .card-img img { width: 58px; }
  .player-deck-tower { margin-left: 10px; padding-left: 10px; }
  .player-deck-tower .card,
  .player-deck-tower .card-img,
  .player-deck-tower .card-img img { width: 58px; }
  .career-record { grid-template-columns: minmax(0, 1fr) 88px; gap: 0.65rem; padding: 0.8rem; }
  .career-record-copy h3 { font-size: 1.42rem; }
  .career-record-copy p { font-size: 0.68rem; }
  .career-winrate { width: 84px; height: 84px; }
  .career-winrate::before { width: 62px; height: 62px; }
  .career-winrate strong { font-size: 0.96rem; }
  .stats-kpi-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .stats-kpi { min-height: 72px; padding: 0.55rem; gap: 0.4rem; }
  .stats-kpi > img { width: 33px; height: 33px; }
  .stats-kpi strong { font-size: 0.82rem; }
  .stats-detail-grid { grid-template-columns: minmax(0, 1fr); }
  .account-progress { align-items: flex-start; flex-direction: column; }
  .account-metrics { width: 100%; gap: 0.7rem 1rem; flex-wrap: wrap; justify-content: flex-start; }
  .account-metric { flex: 1 1 calc(50% - 0.5rem); }
  .favorite-card { min-width: 0; justify-content: flex-start; }
  /* ---------- Free Rewards auf schmalen Schirmen ----------
     Hier standen bis zuletzt fuenf Regeln fuer `.gift-offer`/`.gift-copy` - ein
     Layout, das es im Markup nicht mehr gibt. Zwei davon trafen aber weiter die
     echten Kacheln: `min-height: 220px` blies jede Belohnungskachel auf 331px auf
     (mobil also HOEHER als am Desktop), und `width: 122px; height: 178px` zwang
     jedes Bild in ein schmales Hochformat - ein Banner ist quer und schrumpfte
     darin auf Briefmarkengroesse mitten in einer leeren Flaeche. Beides ist
     ersatzlos entfernt; es gelten wieder die Grundwerte (.gift-art, 150px). */
  /* Zwei Kacheln nebeneinander: 18 aktive Belohnungen sind einspaltig 6154px
     Scrollweg, zweispaltig knapp ein Drittel davon. Das Spaltenmass muss zweimal
     in die SCHMALSTE Inhaltsbreite passen (320px Schirm = 280px Inhalt), sonst
     faellt genau dort wieder alles auf eine Spalte zurueck - mit 150px war das so.
     132px + 8px Spalt = 272px passen ueberall ab 320px, und drei Spalten passen
     bis 560px nie hinein. */
  #tab-gifts { --gift-col: 132px; --gift-gap: 0.5rem; }
  .gift-art { height: 104px; }
  .gift-art > img { max-height: 86px; }
  .gift-rays { width: 190px; height: 190px; }
  .gift-body { gap: 0; padding: 0.55rem 0.6rem 0.65rem; }
  .gift-body h3 { margin: 0.05rem 0 0.55rem; font-size: 0.85rem; }
  .gift-body .gift-cta { min-height: 28px; padding: 0.2rem 0.8rem; font-size: 0.74rem; }
  #search-form, #clan-form { max-width: none; }
  /* Die klebende Suchleiste hing auf 66px, die Kopfzeile ist auf dem Handy aber nur
     53px hoch. Durch die 13px Spalt dazwischen schob sich beim Scrollen der Text
     darunter durch - nach der Suche blieben genau 5px der Einleitung sichtbar und es
     sah aus, als haette die Seite zu wenig gescrollt. 57px lassen 4px Luft, die als
     Abstand gelesen wird und nichts mehr durchscheinen laesst. */
  .profile-search-dock { width: calc(100% + 1rem); top: 57px; }
  .player-search-submit { padding-inline: 0.85rem; }
  .site-support-inner { padding-inline: 0.75rem; }
  .site-support-copy { font-size: clamp(0.67rem, 3vw, 0.84rem); }
}

/* Bei 320px Schirm bleiben 280px Inhalt, und viermal 72px plus drei Spalten sind
   307px - die vierte Belohnungsart faellt dort in die naechste Reihe und aus 4 + 3
   werden drei Reihen. 64px passen mit 275px hinein, fuenf (346px) nie. Ab 361px
   bleibt es bei 72px, denn dort ergeben die 72px bis 412px weiterhin genau vier. */
@media (max-width: 360px) {
  .gift-filter button { width: 64px; }
}

@media (min-width: 561px) and (max-width: 820px) {
  .profile-top { grid-template-columns: minmax(0, 1fr) auto; }
  .profile-main { grid-column: 1; grid-row: 1; }
  .profile-league { grid-column: 2; grid-row: 1; }
  .profile-battle-form { grid-column: 1 / -1; grid-row: 2; max-width: none; margin-top: 0.3rem; }
  .clan-header-layout { grid-template-columns: minmax(0, 1fr); }
  .player-deck-grid { grid-template-columns: 1fr; }
  .stats-kpi-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .stats-detail-grid { grid-template-columns: minmax(0, 1fr); }
}

/* ---------- Player-Seite auf schmalen Bildschirmen ----------
   Steht bewusst HINTER den Bloecken oben: die dortigen Regeln fuer .profile-top und
   .profile-league haben dieselbe Spezifitaet, bei Gleichstand gewinnt die spaetere.
   Gemessen am 14.08.2026 auf 393px: Einleitung 156px, Profilkarte 365px, und die fuenf
   Unterreiter brauchten 466px in einer 385px breiten Zeile - "Favorites" war
   abgeschnitten. Verkleinert wird ueber Schrift und Abstaende, nicht ueber Weglassen. */
@media (max-width: 640px) {
  /* Der Einleitungssatz ist Beiwerk zur Suche, nicht der Inhalt der Seite. Kleinere
     Schrift UND engerer Zeilenabstand - beides einzeln bringt zu wenig. */
  .page-intro { margin-bottom: 0.7rem; }
  .page-intro > span { margin-bottom: 0.1rem; font-size: 0.65rem; }
  /* Die Ueberschriften brauchten zwei Zeilen: "Clash Royale Clan Stats & War Log" will
     bei 22.7px 362px, verfuegbar sind 353px. Die Grundregel klemmt bei 1.42rem fest,
     ihr `2.4vw` greift auf dem Handy nie. Hier folgt die Groesse deshalb wirklich der
     Fensterbreite. Untergrenze 0.95rem: darunter wird die Zeile zwar noch schmaler,
     die Ueberschrift aber kleiner als der Fliesstext darunter. */
  .page-intro h1 { font-size: clamp(0.95rem, 4.6vw, 1.42rem); }
  .page-intro p { margin-top: 0.3rem; font-size: 0.82rem; line-height: 1.38; }

  /* Fuenf Reiter in eine Zeile: `flex: 1` verteilt die volle Breite gleichmaessig statt
     sie seitlich wegscrollen zu lassen (die Scroll-Regel weiter oben wird hier gezielt
     nur fuer diese eine Reihe zurueckgenommen). Die Schrift folgt der Fensterbreite,
     damit auch "Collection" als laengstes Einzelwort bei 320px noch in sein Fuenftel
     passt. `white-space: normal` ist die Reissleine: reicht es doch nicht, bricht
     "Battle Log" auf zwei Zeilen um, statt aus der Reihe zu laufen. */
  #player-subtabs { overflow-x: visible; margin-inline: 0; padding-inline: 0; }
  #player-subtabs :is(a, button) {
    flex: 1 1 0; min-width: 0; padding: 0.45rem 0.1rem 0.55rem; text-align: center;
    font-size: clamp(0.6rem, 3vw, 0.86rem); white-space: normal; line-height: 1.2;
    /* Letzte Reissleine fuer Sprachen mit langen Einzelwoertern: Russisch braucht bei
       320px "Статистика" am Stueck und sprengte damit sein Fuenftel. Ein Wortumbruch
       mitten im Wort ist haesslich, aber immer noch besser als ein Reiter, den man gar
       nicht sieht - und er greift nur, wenn es sonst wirklich nicht passt. */
    overflow-wrap: anywhere;
  }

  /* Profilkarte: der Name bleibt gross - um ihn geht es. Alles Beiwerk darunter wird
     kleiner, und das Liga-Emblem wandert nach oben rechts, statt als 124px-Block eine
     eigene Spalte zu fuellen. */
  #profile { padding: 0.7rem; }
  .profile-top { gap: 0.5rem; }
  .profile-main { gap: 0.05rem; }
  .pname { margin-bottom: 0.15rem; font-size: 1.3rem; }
  .ptag { font-size: 0.78rem; }
  .pline { gap: 0.32rem; font-size: 0.86rem; }
  .pline.muted { font-size: 0.78rem; }
  .line-icon { width: 16px; height: 16px; }
  /* Der Balken bleibt als Ganzes stehen - die Bilanz der letzten Kaempfe ist der Grund,
     warum man die Karte ueberhaupt ansieht. Nur seine Hoehe geht zurueck; bei 36px sind
     Sieg, Niederlage und Unentschieden immer noch klar auseinanderzuhalten. */
  .profile-battle-form { margin-top: 0.1rem; }
  .profile-form-chart, .profile-form-match { height: 36px; }
  .profile-league { gap: 0.1rem; align-self: start; }
  .league-icon, .profile-league img { width: 74px; height: 74px; }
  .league-rank { bottom: 2%; font-size: 0.82rem; }
  .league-name { font-size: 0.7rem; }
  .profile-clan { margin-top: 0.5rem; padding-top: 0.45rem; gap: 0.4rem; font-size: 0.95rem; }
  .profile-clan .clan-badge { width: 22px; height: 22px; }
  .profile-clan .tag { font-size: 0.72rem; }

  /* ----- Battle-Log -----
     Gemessen am 14.08.2026: eine Kampfzeile war 665px breit in einem 320px-Fenster.
     Die Ursache waren zwei feste Groessen - 54px je Karte und die Turmtruppe als volle
     Karte am aeusseren Rand. Feste Pixel koennen auf einem Handy nicht aufgehen, also
     wird die Kartenbreite hier fluessig: das Deck bekommt vier gleiche Spalten und die
     Karten fuellen ihre Spalte. Dadurch passen die zwei mal vier Karten je Seite bei
     JEDER Breite, statt bei genau einer. */
  .battle-decks { grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr); column-gap: 0.3rem; row-gap: 0.3rem; }
  .battle-deck-side { width: 100%; min-width: 0; }
  .battle-deck { grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 2px; width: 100%; }
  .battle-deck .card,
  .battle-deck .card-img,
  .battle-deck .card-img img { width: 100%; }
  .battle-rounds { gap: 0.6rem; }
  .score { font-size: 1rem; }

  /* Kopfzeile: Modus-Symbol und Medaillenkaesten waren fuer diese Breite ausgelegt wie
     fuer den Desktop und drueckten die Karten zusaetzlich zusammen. */
  /* Der Modusname bekommt eine EIGENE Zeile unter der Kopfzeile, ueber die volle
     Breite. Damit konkurriert er gar nicht erst mit den Medaillenkaesten um Platz:
     kein Zusammenquetschen, kein Umbruch, keine Kuerzung - und er darf so gross
     bleiben wie zuvor. In der Kopfzeile selbst steht nur noch das Symbol.
     `1fr auto 1fr` MUSS bleiben: nur gleich breite Aussenspalten halten das Symbol
     wirklich mittig. Mit inhaltsbreiten Spalten sass es schief, sobald eine Seite
     weniger anzeigt - etwa im Clan-Krieg, wo eine Seite gar keine Pokale hat.
     `display: contents` loest die Modus-Box auf, damit Symbol und Text getrennt im
     Raster platziert werden koennen. */
  .battle-top { grid-template-columns: 1fr auto 1fr; gap: 0.25rem; row-gap: 0.1rem; margin-bottom: 0.4rem; }
  .battle-mode { display: contents; }
  .mode-icon { grid-column: 2; grid-row: 1; justify-self: center; }
  .mode-text {
    grid-column: 1 / -1; grid-row: 2;
    align-items: center; text-align: center; font-size: 0.78rem;
  }
  .mode-name { white-space: nowrap; }
  /* Groesse bleibt bei den 32px vom Desktop. Die 22px von vorher waren nur noetig,
     solange der Modusname NEBEN dem Symbol stand und beide sich die Mittelspalte
     teilten. Seit der Name eine eigene Zeile hat, gibt es diesen Zwang nicht mehr -
     und ein Liga-Emblem wie Ultimate Champion war in 22px kaum noch zu erkennen. */
  .mode-sub { font-size: 0.62rem; }
  .cur-icon { width: 14px; height: 14px; }
  /* Die beiden Medaillenkaesten waren zusammen 246px breit - in einem 320px-Fenster
     bleibt daneben nichts mehr fuer den Modus in der Mitte. min-width:0 erlaubt den
     Aussenspalten ueberhaupt erst zu schrumpfen (1fr allein tut das nicht), der Umbruch
     ist die Reissleine fuer noch schmalere Geraete. */
  /* display:flex statt des Vorgabe-Blocks: .medals ist inline-flex und sass damit auf
     der Textgrundlinie, wodurch die linke und die rechte Seite 3px versetzt standen. */
  .medals-slot { display: flex; align-items: center; min-width: 0; }
  .medals-slot.right { justify-content: flex-end; }
  /* nowrap statt wrap: der Umbruch war als Reissleine gedacht, hat aber genau den
     Fehler erzeugt, den er verhindern sollte - die Kaesten brachen um, sobald der
     Modusname breit wurde. Mit den Aussenspalten auf `auto` (siehe .battle-top) kann
     das nicht mehr passieren, also darf hier hart nowrap stehen. */
  .medals { gap: 3px; flex-wrap: nowrap; }

  /* C.H.A.O.S.-Augments: dieselbe Falle wie bei den Karten - die Reihe war auf feste
     225px gesetzt und jedes Augment auf 44px. In einer Deckspalte von 112px (bei
     320px Fensterbreite) sprengt das jede Zeile. Die Reihe nimmt jetzt die Spalte, die
     sie hat, und die Groesse folgt der Fensterbreite. Innenleben und Rahmen sind in
     Prozent gesetzt (siehe .chaos-augment-clip/-art), skalieren also von allein mit -
     deshalb genuegt hier die eine Groessenangabe. */
  .battle-chaos-modifiers {
    width: 100%; min-height: 0; padding-top: 3px; flex-wrap: wrap;
  }
  .chaos-augment { width: clamp(20px, 7vw, 32px); height: clamp(20px, 7vw, 32px); }
  .medal-count, .medal-chg {
    gap: 0.18rem; border-width: 1px; border-radius: 6px;
    padding: 0.1rem 0.3rem; font-size: 0.68rem;
  }

  /* Die Namensregeln stehen bewusst NICHT hier, sondern in einem eigenen Block bis
     820px - siehe "Kampfnamen im Fluss" weiter unten. Sie muessen frueher greifen als
     der Rest der Handy-Anpassungen. */
  .side-name { font-size: 0.76rem; }
  .side-clan { font-size: 0.68rem; }

  /* ----- Clan-Tabellen: Tabelle mit festgehaltener Namensspalte -----
     Die Mitgliederliste ist 691px breit, das Fenster 353px. Sie bleibt eine Tabelle und
     wird seitlich gewischt - beim Wischen wandern aber Rang und Name mit und bleiben
     stehen. Ohne das verliert man nach zwei Spalten, wessen Zahlen man gerade liest.
     Die festgehaltenen Zellen brauchen einen DECKENDEN Hintergrund, sonst scheint der
     durchlaufende Inhalt hindurch; --feedback-bg ist die im Projekt vorhandene deckende
     Flaeche fuer genau solche ueberlagernden Elemente (siehe .profile-search-dock). */
  .table-zoom { display: flex; }
  .clan-table { font-size: 0.78rem; }
  .clan-table th, .clan-table td { padding: 0.4rem 0.5rem; }
  .clan-table th { font-size: 0.66rem; }
  .clan-table th:first-child, .clan-table td:first-child {
    width: 2.6rem; min-width: 2.6rem; padding-inline: 0.4rem;
  }
  .clan-table th:nth-child(2), .clan-table td:nth-child(2) { min-width: 7.5rem; }
  .clan-table :is(th, td):nth-child(-n + 2) {
    position: sticky; z-index: 2; background: var(--feedback-bg);
  }
  /* Die Markierung der sortierten Spalte ist halbtransparent und ist spezifischer als
     die Regel darueber - dadurch schien im festgehaltenen Kopf der durchlaufende Text
     hindurch ("...ED" von RANKED stand im #-Feld). Die Faerbung bleibt, liegt hier aber
     als eigene Schicht UEBER der deckenden Flaeche statt sie zu ersetzen. */
  .clan-table.sortable th:is(.sorted, :hover):nth-child(-n + 2) {
    background: linear-gradient(rgba(88, 124, 255, 0.16), rgba(88, 124, 255, 0.16)), var(--feedback-bg);
  }
  .clan-table :is(th, td):first-child { left: 0; }
  /* Exakt die Breite der ersten Spalte. `* { box-sizing: border-box }` gilt global, die
     2.6rem sind also die GESAMTbreite inklusive Padding - ein Aufschlag dafuer waere
     falsch und hinterliesse einen Spalt, durch den der laufende Inhalt scheint. */
  .clan-table :is(th, td):nth-child(2) { left: 2.6rem; box-shadow: 1px 0 0 var(--panel-inset-border); }
  .clan-table thead :is(th, td):nth-child(-n + 2) { z-index: 3; }

  /* ----- Ausnahme: die Clan-Rangliste passt ganz auf den Bildschirm -----
     Sie hat nur fuenf Spalten und war mit 429px knapp zu breit fuer die 335px des
     Fensters. Mit festem Spaltenraster, kleinerer Schrift und abgeschnittenen Namen
     steht alles gleichzeitig da - und damit faellt der Grund fuer die festgehaltene
     Namensspalte weg (Eliass 15.08.2026). Die Mitglieder- und River-Race-Tabellen
     bleiben beim Wischen mit festem Namen: die sind mit 691px in einer anderen
     Groessenordnung und lassen sich nicht sinnvoll zusammenschieben.
     `table-layout: fixed` ist dabei der entscheidende Teil: ohne das richtet sich die
     Breite weiter nach dem laengsten Clannamen und die Vorgaben unten waeren nur
     Mindestwerte. */
  #lb-clan-table { table-layout: fixed; width: 100%; font-size: 0.7rem; }
  #lb-clan-table :is(th, td) { padding: 0.38rem 0.3rem; }
  /* `.clan-table .num` setzt `white-space: nowrap` - das gilt auch fuer die
     Kopfzellen, und "War trophies" ragte damit in "Members" hinein. In den schmalen
     Spalten hier duerfen die Ueberschriften umbrechen. */
  #lb-clan-table th { font-size: 0.55rem; white-space: normal; line-height: 1.2; }
  /* Rang und Auf-/Abstieg stehen nebeneinander in EINER Zeile (Eliass 15.08.2026).
     Die Grundregeln geben dem Gespann rund 70px: 2.45rem Mindestbreite fuer die Zahl,
     damit "#1" und "#1000" untereinander fluchten, plus Abstand und Pfeil. So breit
     ist hier keine Spalte. Die Mindestbreite entfaellt deshalb, Zahl und Pfeil werden
     eine Spur kleiner - damit passt beides in 56px, und die Spalte laesst dem Clannamen
     noch 96px. */
  #lb-clan-table :is(th, td):nth-child(1) { width: 3.5rem; min-width: 0; padding-inline: 0.25rem; }
  #lb-clan-table .rank-wrap { gap: 0.15rem; }
  #lb-clan-table .rank-main { min-width: 0; font-size: 0.62rem; }
  #lb-clan-table .rank-delta { gap: 0.1rem; font-size: 0.52rem; }
  #lb-clan-table .rank-delta i { border-left-width: 3px; border-right-width: 3px; }
  #lb-clan-table .rank-delta.up i { border-bottom-width: 5px; }
  #lb-clan-table .rank-delta.down i { border-top-width: 5px; }
  #lb-clan-table :is(th, td):nth-child(3) { width: 3.7rem; }
  /* Breit genug fuer die Ueberschriften selbst - "MEMBERS" und "LOCATION" sind ein
     Wort und koennen nicht umbrechen; zu enge Spalten liessen sie ineinanderlaufen. */
  #lb-clan-table :is(th, td):nth-child(4) { width: 3.8rem; }
  #lb-clan-table :is(th, td):nth-child(5) { width: 3.8rem; }
  /* Name und Land bekommen den Rest und schneiden ab, statt die Tabelle zu dehnen. */
  #lb-clan-table :is(td:nth-child(2), td:nth-child(5)) {
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  }
  /* Der Link muss selbst abschneiden: `text-overflow` an der Zelle wirkt nur auf deren
     eigenen Inhalt, ein Kind mit eigener Formatierung laeuft weiter darueber hinaus -
     lange Namen brachen dadurch hart ab, ohne Auslassungspunkte. Als Block mit
     Fliesstext greift die Regel; das Wappen bleibt ein normales Inline-Bild und wird
     von der Grundregel `.clan-badge` mittig zur Zeile gesetzt. */
  #lb-clan-table td:nth-child(2) a {
    display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  }
  #lb-clan-table td:nth-child(2) .clan-badge { width: 16px; height: 16px; vertical-align: -3px; }
  /* Nichts mehr festhalten - es wird ja nicht mehr gewischt. */
  #lb-clan-table :is(th, td):nth-child(-n + 2) { position: static; background: none; box-shadow: none; }

  /* ----- Favoriten -----
     Name und Spielercode standen nebeneinander in einer Spalte, die sich den Platz
     zusaetzlich mit Pokalen und Medaillen teilt - fuer den Namen blieb so wenig uebrig,
     dass laengere Namen abgeschnitten wurden. Untereinander bekommt der Name die volle
     Spaltenbreite, und kleinere Schrift verschafft ihm weitere Zeichen. */
  .favorite-row { gap: 0.45rem; padding: 0.55rem 0; }
  .favorite-id { flex-direction: column; align-items: flex-start; gap: 0; }
  .favorite-name { font-size: 0.82rem; }
  .favorite-tag { font-size: 0.7rem; }
  .favorite-score { font-size: 0.75rem; gap: 0.22rem; }
  .favorite-score img { width: 15px; height: 15px; }

  /* ----- Sammlung -----
     Sechs Kategorien in einer scrollbaren Zeile: man sieht nur die ersten drei und
     nichts deutet darauf hin, dass es weitergeht. Zwei Reihen zu dritt zeigen alle
     sechs auf einmal. Der gleitende Unterstrich kann das nicht mitmachen - er kennt
     nur eine Zeile und saesse fuer die obere Reihe an der falschen Stelle. Deshalb
     markiert hier der Reiter selbst seinen Zustand. */
  /* Gilt fuer beide Reiterreihen der Sammlung: die sechs Kategorien (#col-views) und
     die drei Deckquellen im Deck Calculator (#col-source-nav). Beide liefen vorher
     seitlich aus dem Bild und waren rechts angeschnitten. */
  #col-views, #col-source-nav {
    display: grid; grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: 0 0.5rem; overflow: visible; margin-inline: 0; padding-inline: 0;
    /* Die durchgehende Linie der Reiterleiste traegt jetzt jeder Reiter selbst - so
       liegt sie unter BEIDEN Reihen und der aktive Abschnitt hebt sich davon ab. */
    border-bottom: none;
  }
  #col-views .tab-indicator, #col-source-nav .tab-indicator { display: none; }
  #col-views button, #col-source-nav button {
    flex: none; padding: 0.45rem 0.15rem 0.38rem; text-align: center;
    font-size: clamp(0.62rem, 2.9vw, 0.82rem); line-height: 1.15;
    white-space: normal; overflow-wrap: anywhere;
    /* border-radius: 0 ist Pflicht: der globale button-Stil setzt --radius-sm, dadurch
       bog sich die Unterstreichung an den Enden nach oben und sah aus wie ein Bogen
       statt wie ein Reiter-Unterstrich. */
    border-radius: 0;
    border-bottom: 2px solid var(--panel-inset-border);
  }
  /* Sechs gleich breite Abschnitte auf einer gemeinsamen Linie zeigen von selbst, dass
     es sechs Ziele sind und welches gerade gilt - ohne dass jedes eine eigene Box
     bekommt (siehe Designregel "nicht jedes Element bekommt eine eigene Box"). */
  #col-views button.active, #col-source-nav button.active { border-bottom-color: var(--primary); }

  /* ----- Merge Tactics: fuenf Abschnitte, EINE Zeile -----
     Vorgeschichte in zwei Schritten. Zuerst lief die Reihe seitlich, und "Best Builds"
     und "Tutorial" standen ausserhalb des Bildes, OHNE dass etwas darauf hindeutete
     (Eliass 15.08.2026). Die Antwort darauf waren zwei Rasterreihen. Die kosteten aber
     dauerhaft eine Zeilenhoehe, schoben den Klebepunkt der Reihe nach unten - wodurch
     die Monatsauswahl darunter verschwand - und waren schwer zu bedienen
     (Eliass 06.09.2026).
     Jetzt eine Zeile, die nur dann seitlich laeuft, wenn sie muss. `flex: 1 0 auto`
     laesst die Reiter die volle Breite fuellen, solange sie hineinpassen, und erst bei
     Platzmangel ueberlaufen. Gemessen auf 390px (367px sichtbar, davon 335px Inhalt):
     Deutsch 332, Englisch 331, Koreanisch 259, Chinesisch 230, Arabisch 346 - die
     passen. Spanisch braucht 452, Russisch 434, Portugiesisch 432; die laufen seitlich.
     Damit der Hinweis von 15.08. diesmal da ist, blendet der rechte Rand ab, sobald
     wirklich mehr da ist - die Klasse dafuer setzt merge-tactics.mjs. */
  #mt-subtabs {
    display: flex; flex-wrap: nowrap;
    gap: 0 0.2rem; overflow-x: auto; overflow-y: hidden;
    scrollbar-width: none; overscroll-behavior-x: contain;
    border-bottom: none;
  }
  #mt-subtabs::-webkit-scrollbar { display: none; }
  #mt-subtabs .tab-indicator { display: none; } /* der aktive Reiter traegt seine eigene Linie */
  #mt-subtabs [data-mtsub] {
    flex: 1 0 auto;
    padding: 0.45rem 0.2rem 0.38rem; text-align: center;
    font-size: clamp(0.62rem, 2.9vw, 0.82rem); line-height: 1.15;
    white-space: nowrap;
    border-radius: 0; border-bottom: 2px solid var(--panel-inset-border);
  }
  #mt-subtabs [data-mtsub].active { border-bottom-color: var(--primary); }
  /* Die Abblendung ist ein KLEBENDES KIND, keine `mask-image` auf der Reihe selbst:
     die Reihe malt ihren angedockten Balken ueber einen `box-shadow` mit 100vmax
     Ausbreitung, und eine Maske haette den mit weggeschnitten. Das Kind zieht sich
     ueber `margin-left` seine eigene Breite wieder ab, kostet also keinen Platz. */
  #mt-subtabs.has-overflow::after {
    content: ""; position: sticky; right: 0; flex: 0 0 34px; width: 34px;
    margin-left: -34px; align-self: stretch; pointer-events: none;
    background: linear-gradient(90deg, transparent, var(--feedback-bg));
  }

  /* Die Seltenheitszeile war ein sechsspaltiges Raster mit festen Breiten und brauchte
     dadurch ueber 570px. In 314px blieben nur Symbol, Name und Prozentzahl sichtbar -
     Fortschrittsbalken, fehlendes Gold und fehlende Karten standen ausserhalb und waren
     schlicht nicht zu sehen. Gestapelt statt nebeneinander: Name und Prozent oben,
     darunter der Balken, darunter die beiden Restwerte. */
  .col-rarity {
    grid-template-columns: 40px minmax(0, 1fr) auto;
    grid-template-areas:
      "icon name pct"
      "icon bar  bar"
      "icon need need";
    align-items: center; gap: 0.28rem 0.6rem;
  }
  /* Mittig ueber alle drei Zeilen der Kachel statt oben angeheftet: die Wildcard ist die
     Marke der ganzen Seltenheit, nicht nur der Namenszeile. */
  .col-rarity-icon { grid-area: icon; align-self: center; width: 38px; height: 38px; }
  .col-rarity-name { grid-area: name; }
  .col-rarity > .col-bar { grid-area: bar; }
  .col-rarity-pct { grid-area: pct; align-self: start; }
  /* display:contents machte die beiden Restwerte zu eigenen Rasterfeldern - hier
     brauchen sie ein gemeinsames Feld, also wieder ein echter Container. */
  .col-rarity-need { grid-area: need; display: flex; flex-wrap: wrap; gap: 0.2rem 1.1rem; }
  .col-rarity-need img, .col-need img, .col-tower-need img { width: 16px; height: 16px; }
  .col-rarity-need span, .col-need, .col-tower-need { font-size: 0.74rem; }
  .col-rarity-name strong { font-size: 0.84rem; }
  .col-rarity-list { gap: 1.05rem; }

  /* Vier Karten je Reihe waren zu wenig fuer eine Uebersicht ueber 120 Karten. 46px
     Mindestbreite ergeben sechs. Gilt zugleich fuer Evolutions, Heroes und Star
     Levels - alle vier Raster benutzen .col-cards. */
  .col-cards { grid-template-columns: repeat(auto-fill, minmax(46px, 1fr)); gap: 0.3rem 0.28rem; }

  /* Der erste Kasten unter "Evolutions and heroes" stand linksbuendig in einer
     zentrierten Flaeche und wirkte dadurch verrutscht. */
  /* Nur die UEBERSCHRIFT der Uebersichtsflaeche steht mittig - die Flaeche selbst ist
     der einzige Panel-Kopf ohne Zusatzangabe rechts daneben, linksbuendig wirkte er
     dadurch verrutscht. Die Zeilen darunter bleiben linksbuendig wie ueberall sonst. */
  .col-panel:has(.col-specials-center) .col-head { justify-content: center; }
  .col-specials { gap: 0.9rem 1.6rem; }
  .col-special { min-width: 0; width: 100%; }
  .col-special > div { min-width: 0; flex: 1; }

  /* Die Regeln fuer "Choose a deck" (.col-source-box) koennen NICHT hier stehen: ihre
     Grundregeln folgen weiter unten in dieser Datei und haetten bei gleicher
     Spezifitaet gewonnen. Sie stehen deshalb ganz am Dateiende. */
  .col-source-cards img { width: 26px; }
  .col-source-row { gap: 0.5rem; padding: 0.4rem 0.45rem; }

  /* Eine Kachel je Reihe verschenkt die halbe Breite. Zwei nebeneinander bleiben
     lesbar; drei waeren bei den langen Kartennamen zu eng. */
  /* Eine Kachel je Reihe verschenkt die halbe Breite. Damit zwei nebeneinander passen,
     muss aber auch die Kachel selbst schrumpfen: das Abzeichen war 82px breit und liess
     vom 153px-Feld nur 61px fuer den Namen uebrig - "Firecracker" lief dann rechts aus
     der Spalte heraus. Kleineres Abzeichen, kleinere Schrift, und als Reissleine darf
     ein ueberlanger Name im Wort umbrechen. */
  .col-mastery-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0.55rem 0.6rem; }
  .col-badges-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0.7rem 0.6rem; }
  .col-mastery-grid .col-badge > img,
  .col-mastery-grid .col-badge > .col-icon-pending { width: 46px; height: 46px; margin: 0; }
  .col-badges-grid .col-badge > img,
  .col-badges-grid .col-badge > .col-icon-pending { width: 54px; height: 54px; margin: 0; }
  .col-badge { gap: 0.45rem; }
  .col-badge strong { font-size: 0.73rem; overflow-wrap: anywhere; }
  .col-badge span { font-size: 0.65rem; }
  .col-badge .col-bar { max-width: none; }

  /* Vier Slots zu 66px plus Abstaende belegen 288px von 314px - die 26px Rest lagen
     alle rechts, das Deck sass also sichtbar links statt in der Mitte. */
  .col-slots { justify-content: center; }

  /* Der Kartenwaehler war 870px hoch bei 852px Bildschirm und stand oben wie unten
     9px ueber. Statt zwei ineinander verschachtelter Scrollbereiche (Fenster UND
     Kartenliste) scrollt hier das ganze Fenster: eine Bewegung, ein Ende. */
  .modal-box:has(.col-pick-wide) {
    max-height: calc(100dvh - 1.5rem); overflow-y: auto; padding: 0.9rem;
  }
  .col-pick-body { max-height: none; overflow: visible; }

  /* Kartendetail: die 414px sind das Mass der breitesten Karte (Knight, als einzige mit
     Evolution, Hero UND Star Level) - auf einem 393px-Geraet heisst das randlos ueber
     die ganze Breite. Das Fenster wird schmaler und behaelt sichtbaren Rand; damit die
     Formzeile dabei einzeilig bleibt, schrumpfen ihre Chips im gleichen Zug mit. Sie
     ist und bleibt das Mass, an dem sich die Breite ausrichtet. */
  .modal-box:has(.col-pop) { width: min(414px, 92vw); max-width: min(414px, 92vw); padding: 1.05rem; }
  .col-detail-forms { gap: 0.3rem 0.5rem; margin-top: 0.5rem; }
  .col-detail-form { gap: 0.28rem; font-size: 0.74rem; }
  .col-detail-form img { width: 16px; height: 16px; }
  .col-pop-card { width: 96px; --art-w: 96px; margin-bottom: 8px; }
  .col-pop h3 { font-size: 1rem; }
  .col-detail-lines { margin-top: 0.7rem; }
  .col-detail-line span { font-size: 0.74rem; }
  .col-detail-line span img { width: 17px; height: 17px; }
  .col-detail-line b { font-size: 0.78rem; }
}

/* Eine Spalte auf sehr schmalen Geraeten. Steht bewusst HINTER dem 640px-Block:
   dort setzt dieselbe Eigenschaft mit derselben Spezifitaet zwei Spalten, und bei
   gleicher Spezifitaet gewinnt die spaetere Regel. Weiter oben notiert - wo sie bis
   zum 03.09.2026 stand - war sie wirkungslos. */
@media (max-width: 440px) { .col-mastery-grid { grid-template-columns: minmax(0, 1fr); } }

@media (prefers-reduced-motion: reduce) {
  .clan-war-progress::after, .clan-chart-loading span,
  .clan-chart-area, .clan-chart-line, .clan-chart-point { animation: none; }
  .clan-chart-line { stroke-dashoffset: 0; }
  .clan-chart-point { opacity: 1; }
  .gift-rays, .gift-art > img { animation: none; }
  /* Partikel bleiben sichtbar, aber stehen still - sonst waere die Kachel ploetzlich leer. */
  .gift-prize-motes i { animation: none; opacity: 0.4; }
  .profile-form-match i { animation: none; opacity: 1; }
}

/* ---------- Deck Builder ---------- */
/* Elemente mit eigener display-Regel brauchen den Guard, sonst hebelt sie [hidden] aus. */
#tab-builder [hidden] { display: none !important; }

.primary-btn {
  border: 0; border-radius: 11px; padding: 11px 16px;
  background: linear-gradient(135deg, #38bdf8, #2563eb);
  color: white; font-weight: 900; cursor: pointer;
}
.primary-btn:disabled { opacity: 0.55; cursor: wait; }

/* "Continue" und "Analyze decks" haben dieselbe Gestalt wie die Knoepfe im
   Free-Gifts-Bereich (Pillenform, flach, so breit wie ihr Text) - nur in Weiss.
   Getauscht werden ausschliesslich die Farbvariablen, siehe .gift-cta. Das frueher
   hier stehende `min-width: 136px` ist bewusst weg: der Knopf soll seinem Text
   folgen und nicht auf ein Mindestmass gezogen werden. */
.builder-main-btn {
  --btn-face: rgba(255, 255, 255, 0.94);
  --btn-edge: rgba(255, 255, 255, 0.16);
  --btn-ink: var(--text-invert);
  --btn-glow: rgba(3, 6, 14, 0.2);
  --btn-glow-strong: rgba(3, 6, 14, 0.28);
  min-height: 34px; padding: 0.3rem 1.15rem; font-size: 0.82rem;
}
/* Aufhellen bringt auf Weiss nichts - hier faerbt der Hover stattdessen Rand und
   Schrift blau, so wie dieser Knopf es vorher schon getan hat. */
.builder-main-btn:hover {
  --btn-face: #fff;
  --btn-edge: #7894f4;
  --btn-ink: #315bd4;
  filter: none;
}
.builder-main-btn:disabled { opacity: 0.55; cursor: wait; transform: none; filter: none; }

.builder-picker-head { display: flex; justify-content: space-between; gap: 12px; align-items: center; margin-bottom: 12px; }
.builder-picker-head-tools { justify-content: flex-end; }
.builder-picker-head > div { display: grid; gap: 3px; }
.builder-picker-head b { color: #f1f5f9; }
.builder-picker-head small { color: #94a3b8; }
.builder-picker-head input {
  width: 100%; max-width: 270px; border: 1px solid rgba(148, 163, 184, 0.25);
  background: #111b30; color: #f8fafc; border-radius: 10px; padding: 10px 12px;
}

.builder-selected { display: flex; gap: 6px; min-height: 42px; flex-wrap: wrap; padding: 2px 0 8px; }
.builder-selected.has-selection {
  margin-bottom: 8px; padding-bottom: 11px;
  border-bottom: 1px solid rgba(125, 211, 252, 0.22);
}
.builder-selected button {
  position: relative; display: grid; place-items: center; width: 45px; height: 58px;
  background: transparent; border: 0; border-radius: 7px;
  color: white; padding: 0; cursor: pointer;
  filter: drop-shadow(0 5px 9px rgba(0, 0, 0, 0.34));
  transition: transform .16s ease, filter .16s ease;
}
.builder-selected button:hover { transform: translateY(-2px); filter: drop-shadow(0 0 10px rgba(56, 189, 248, 0.45)); }
.builder-selected img { width: 100%; height: 100%; object-fit: contain; border-radius: 5px; }
.builder-selected span:not(.builder-chip-mark) { display: none; }
.builder-empty { color: #94a3b8; padding: 10px; }

/* Auswahlmodus, Reset und Sortierung stehen bewusst in einer einzigen kompakten
   Werkzeugzeile. So beginnt das Kartenraster auf Desktop und Mobile frueher. */
.builder-card-toolbar {
  display: flex; align-items: center; justify-content: space-between; gap: 8px;
  margin-bottom: 10px;
}
.builder-pick-controls, .builder-pick-mode { display: inline-flex; align-items: center; gap: 6px; }
.builder-pick-mode button, .builder-card-reset {
  display: inline-flex; align-items: center; gap: 5px;
  border: 1px solid rgba(148, 163, 184, 0.25); background: rgba(15, 23, 42, .35);
  color: #cbd5e1; border-radius: 8px; padding: 6px 12px; font-size: 0.8rem; font-weight: 700;
  cursor: pointer; transition: background .15s ease, border-color .15s ease, color .15s ease;
}
.builder-pick-mode button:hover, .builder-card-reset:hover { border-color: rgba(148, 163, 184, 0.45); }
.builder-card-reset {
  justify-content: center; width: 34px; height: 34px; padding: 0;
  color: var(--loss);
}
.builder-card-reset:hover:not(:disabled) {
  border-color: var(--loss);
  background: color-mix(in srgb, var(--loss) 14%, transparent);
}
.builder-card-reset:disabled { opacity: 0.34; cursor: default; }
.builder-card-reset svg { display: block; }
.builder-card-toolbar > .deck-sort-control { flex: none; width: auto; }
/* Dieselben Haken-/Kreuz-Bilder wie im Reveal von Mega Draft: Hard Core
   (assets/icons/status/active.png/inactive.png), nicht ein
   selbstgezeichnetes Kontur-Icon - Eliass 09.08.2026: "das ist visuell viel viel
   besser". Die Bilder bringen ihre Farbe/Form schon mit, brauchen kein currentColor. */
.builder-pick-mode-icon {
  width: 16px; height: 16px; flex: none; object-fit: contain;
}
.builder-pick-mode button[data-builder-pick-mode="include"].active {
  background: rgba(34, 197, 94, 0.18); border-color: #22c55e; color: #86efac;
}
.builder-pick-mode button[data-builder-pick-mode="exclude"].active {
  background: rgba(239, 68, 68, 0.18); border-color: #ef4444; color: #fca5a5;
}

/* Dasselbe Haken-/Kreuz-Bild noch einmal klein auf jedem Chip in den beiden Zeilen
   unten links - man soll auch aus dem Zusammenhang gerissen sehen, ob eine Karte
   Pflicht oder gebannt ist, nicht nur an der Zeilenfarbe. Kein Kreis-Hintergrund mehr:
   die Bilder bringen ihre eigene Form/Farbe mit, ein zusaetzlicher Kreis waere doppelt. */
.builder-selected, .builder-banned { position: relative; }
.builder-selected button, .builder-banned button { position: relative; }
.builder-chip-mark {
  position: absolute; left: -3px; bottom: -3px; width: 16px; height: 16px;
  display: grid; place-items: center; pointer-events: none;
  filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.6));
}
.builder-chip-mark img { width: 100%; height: 100%; object-fit: contain; }

/* Die Exclude-Zeile ist die "gebannte" Zwillingsreihe der Include-Zeile: gleiche
   Chip-Groesse, nur mit rotem statt blauem Trennstrich, damit auf den ersten Blick klar
   ist, welche Zeile welche ist. Kein roter Rahmen mehr ums Kartenbild selbst (Eliass
   09.08.2026: "muss weg") - das rote Kreuz-Icon in der Ecke sagt schon "ausgeschlossen",
   ein zusaetzlicher Rahmen war doppelt gemoppelt. */
.builder-banned.has-selection { border-bottom-color: rgba(239, 68, 68, 0.35); }
/* NUR das Kartenbild selbst bekommt Graustufen/Schatten (`button > img`, direktes Kind) -
   nicht mehr am ganzen Button, sonst faerbt das auch das Haken-/Kreuz-Icon in der Ecke mit
   ein (Eliass 09.08.2026: "das Kreuz ist dort aus irgendeinem Grund dunkelrot"). Filter auf
   einem Element wirkt IMMER auf den kompletten gerenderten Teilbaum darunter - die einzige
   Moeglichkeit, das Icon davon auszunehmen, ist der Filter direkt aufs Bild. */
.builder-banned button > img {
  filter: drop-shadow(0 5px 9px rgba(0, 0, 0, 0.34)) grayscale(0.55);
  border-radius: 5px;
}
/* Der Button selbst bekommt beim Hover sonst zusaetzlich den blauen Basis-Glow von
   `.builder-selected button:hover` - hier neutralisiert, damit nur der rote Glow des
   Bildes sichtbar bleibt (ein Farbton statt zwei uebereinander). */
.builder-banned button:hover { filter: none; }
.builder-banned button:hover > img { filter: drop-shadow(0 0 10px rgba(239, 68, 68, 0.5)) grayscale(0); }

/* Im Kartenraster selbst zeigt dasselbe Kreuz-Bild oben rechts, dass genau diese Form
   gerade ausgeschlossen ist - unabhaengig davon, in welchem Modus man sich befindet. */
.builder-card.banned { border-color: rgba(239, 68, 68, 0.55); background: rgba(239, 68, 68, 0.1); }
.builder-card-banned-mark {
  position: absolute; top: 1px; right: 1px; width: 17px; height: 17px;
  display: grid; place-items: center; pointer-events: none;
  filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.7));
}
.builder-card-banned-mark img { width: 100%; height: 100%; object-fit: contain; }
.builder-card { position: relative; }

/* Kartenpicker: nur die Artworks, dicht aufgereiht. Name + Elixier stehen im Tooltip. */
.builder-card-grid {
  display: grid; grid-template-columns: repeat(auto-fill, minmax(34px, 1fr));
  gap: 3px; overflow: visible; padding: 0;
}
.builder-card-section + .builder-card-section { margin-top: 18px; }
.builder-card-group-head { display: flex; align-items: center; gap: 7px; margin-bottom: 8px; }
.builder-card-group-head img { width: 22px; height: 22px; object-fit: contain; }
.builder-card-group-head strong {
  color: var(--panel-muted); font-size: 0.76rem; font-weight: 800;
  text-transform: uppercase; letter-spacing: 0.08em;
}
.builder-card {
  border: 1px solid transparent; background: transparent;
  border-radius: 7px; padding: 1px; cursor: pointer; line-height: 0;
}
.builder-card:hover { border-color: rgba(125, 211, 252, 0.55); background: rgba(15, 23, 42, .35); }
.builder-card.active {
  border-color: #38bdf8; background: rgba(14, 165, 233, 0.16);
  box-shadow: 0 0 0 1px rgba(56, 189, 248, 0.45), 0 0 10px rgba(56, 189, 248, 0.22);
}
.builder-card:disabled { opacity: 0.34; cursor: not-allowed; }
.builder-card img { width: 100%; aspect-ratio: 285 / 420; object-fit: contain; display: block; border-radius: 6px; }
.builder-card-fallback {
  width: 100%; aspect-ratio: 285 / 420; display: grid; place-items: center;
  border-radius: 6px; background: linear-gradient(145deg, #334155, #172033);
  font-size: 0.9rem; line-height: 1.2; font-weight: 900; color: #7dd3fc;
}

.builder-status { color: rgba(255, 255, 255, 0.82); margin: 16px 2px; }
/* Fehler duerfen nicht in der grauen Statuszeile untergehen. */
.builder-status.error {
  padding: 12px 14px; border: 1px solid rgba(251, 191, 36, 0.4); border-radius: 11px;
  background: rgba(245, 158, 11, 0.12); color: #fde68a; font-weight: 600;
}
.builder-results { display: grid; gap: 14px; }
.builder-locked-summary {
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  padding: 9px 11px; border: 1px solid rgba(125, 211, 252, .22); border-radius: 10px;
  background: rgba(15, 23, 42, .48);
}
.builder-locked-summary > span {
  color: #94a3b8; font-size: .72rem; font-weight: 800;
  text-transform: uppercase; letter-spacing: .08em;
}
.builder-locked-summary > div { display: flex; align-items: center; gap: 5px; flex-wrap: wrap; }
.builder-locked-summary button {
  width: 34px; height: 44px; padding: 0; border: 0; background: transparent;
  cursor: pointer; filter: drop-shadow(0 4px 7px rgba(0,0,0,.28));
}
.builder-locked-summary img { width: 100%; height: 100%; object-fit: contain; display: block; }
.builder-warning {
  padding: 12px 14px; border: 1px solid rgba(251, 191, 36, 0.35); border-radius: 11px;
  background: rgba(245, 158, 11, 0.09); color: #fde68a; margin-bottom: 10px;
}

/* Ergebnis-Deck: Aufbau wie die uebrigen Deck-Kacheln der Seite. */
.builder-result {
  position: relative; overflow: hidden;
  background: var(--panel-bg);
  border: 1px solid var(--panel-border); border-radius: 8px; padding: 0.7rem 0.9rem 0.75rem;
  color: #e2e8f0;
  box-shadow: var(--panel-shadow);
}
.builder-result::before {
  content: ""; position: absolute; top: 0; left: 10%; right: 10%; height: 1px;
  background: var(--panel-line);
  box-shadow: 0 0 8px rgba(89, 122, 255, 0.5); pointer-events: none;
}
.builder-result.recommended {
  border-color: rgba(88, 124, 255, 0.78);
  box-shadow: 0 8px 26px rgba(3, 6, 14, 0.3), 0 0 0 1px rgba(88, 124, 255, 0.24), inset 0 0 22px rgba(83, 110, 215, 0.08);
}
.builder-reveal {
  opacity: 0;
  transform: translateY(14px) scale(0.982);
  filter: blur(5px);
  animation: builderDeckReveal 0.52s cubic-bezier(0.18, 0.9, 0.22, 1) forwards;
  animation-delay: var(--builder-reveal-delay, 0ms);
}
.builder-result.builder-reveal::before {
  opacity: 0;
  animation: builderDeckLineReveal 0.42s ease-out forwards;
  animation-delay: calc(var(--builder-reveal-delay, 0ms) + 140ms);
}
/* Leerer Ausgang der Analyse: Emote, kurze Aussage, ein Satz was man tun kann. */
.builder-empty-state {
  display: flex; flex-direction: column; align-items: center; gap: 6px;
  padding: 26px 20px 30px; text-align: center;
}
.builder-empty-state img { width: 128px; height: auto; margin-bottom: 4px; }
.builder-empty-state strong { color: #f1f5f9; font-size: 1.1rem; font-weight: 850; }
.builder-empty-state span { color: #94a3b8; font-size: 0.86rem; }

.builder-result header, .builder-result header > div { display: flex; align-items: center; gap: 10px; }
.builder-result header { justify-content: space-between; }
.builder-result-head-actions { display: flex; align-items: center; gap: 8px; }
.builder-deck-actions { flex: none; }
.builder-confidence-boundary {
  position: relative; overflow: hidden;
  display: flex; align-items: center; min-height: 58px;
  gap: 12px; margin: 14px 2px 2px; padding: 11px 86px 11px 15px;
  border: 1px dashed rgba(251, 191, 36, 0.45); border-radius: 12px;
  background: rgba(245, 158, 11, 0.08); color: #fde68a;
}
.builder-confidence-boundary > div { display: grid; gap: 3px; min-width: 0; }
.builder-confidence-boundary span { color: #cbd5e1; font-size: 0.8rem; }
.builder-confidence-boundary img {
  position: absolute;
  right: 12px;
  bottom: 0;
  width: 62px;
  height: auto;
  pointer-events: none;
  filter: drop-shadow(0 8px 12px rgba(0, 0, 0, 0.34));
}
.builder-result.lower-confidence { border-color: rgba(251, 191, 36, 0.22); }
.builder-result h3 { margin: 0; font-size: 1.05rem; color: #f1f5f9; }
.builder-badge {
  display: inline-flex; align-items: center;
  border: 1px solid #0b0d13;
  background: #14161c;
  padding: 0.15rem 0.46rem;
  border-radius: 5px;
  font-size: 0.66rem;
  font-weight: 850;
  letter-spacing: 0.045em;
  text-transform: uppercase;
  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.035), 0 1px 5px rgba(0, 0, 0, 0.22);
}
.builder-badge span {
  background-size: 260% 100%;
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
  animation: medal-sheen 5s ease-in-out infinite;
}
.builder-badge.recommended {
  border-color: #05070b;
}
.builder-badge.recommended span {
  background-image: linear-gradient(100deg, #9b6b17 6%, #e1ad37 28%, #fff2ba 44%, #f3cf63 60%, #9b6b17 88%);
  filter: drop-shadow(0 1px 4px rgba(247, 190, 73, 0.22));
}
/* Herkunft ist eine Einordnung, keine Auszeichnung – deshalb schlicht grau statt
   Glanzverlauf, sonst konkurriert sie mit "Recommended". */
.builder-badge.origin span {
  background-image: none; color: rgba(226, 233, 248, 0.55); animation: none;
}
.builder-badge.popular {
  border-color: #05070b;
}
.builder-badge.popular span {
  background-image: linear-gradient(100deg, #38bdf8 4%, #7dd3fc 24%, #ffffff 42%, #bd71f0 60%, #ff5ec4 84%);
  filter: drop-shadow(0 1px 4px rgba(189, 113, 240, 0.22));
  animation: popular-sheen 5.4s ease-in-out infinite;
}
.builder-rank { font-weight: 900; color: #38bdf8; }
/* Spalte 9 ist der Trennstrich, Spalte 10 die Turmtruppe – und die traegt exakt
   dieselbe Spaltendefinition wie eine Kartenspalte, damit sie gleich gross bleibt. */
.builder-result-cards {
  display: grid; grid-template-columns: repeat(8, minmax(46px, 52px)) 26px minmax(46px, 52px) minmax(112px, 1fr); gap: 3px; margin: 0.55rem 0 0;
  align-items: start;
}
/* Gespeicherte Decks ohne den "Stats coming soon"-Platzhalter: dessen Spalte war die
   einzige mit `1fr` und hat die Restbreite geschluckt. Ohne sie stehen die Karten links
   und die Reihe hoert nach der Turmtruppe auf. */
.saved-deck-cards {
  grid-template-columns: repeat(8, minmax(46px, 52px)) 26px minmax(46px, 52px);
  justify-content: start;
}
.builder-stats-placeholder {
  align-self: stretch;
  min-height: 82px;
  margin-left: 13px;
  display: flex; align-items: center; justify-content: center;
  border: 1px dashed rgba(148, 163, 184, 0.16);
  border-radius: 7px;
  background: rgba(8, 10, 15, 0.18);
  color: rgba(226, 233, 248, 0.34);
  font-size: 0.68rem;
  line-height: 1.25;
  font-weight: 800;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  text-align: center;
}
.builder-result-card { text-align: center; min-width: 0; }
.builder-result-card > div { position: relative; }
/* display: block entfernt den Zeilenabstand unter dem Bild. Als Inline-Element steht
   das Bild auf der Grundlinie, und der Platz fuer Unterlaengen darunter zaehlte als
   echter Abstand mit - rund 4px, die sich mit margin allein nicht wegnehmen liessen
   (Eliass 02.09.2026: "der abstand zu den karten ist zu gross"). */
.builder-result-card img { width: 100%; height: 82px; object-fit: contain; display: block; }
/* Nicht freigeschaltet, im ERGEBNIS-Deck (Eliass 03.09.2026). Dieselbe Behandlung wie
   im Waehler weiter unten (.builder-card.not-unlocked), damit beide Stellen dasselbe
   sagen: ausgegraut und leicht verschleiert, aber niemals gesperrt - die Karte bleibt
   Teil des Decks, laesst sich anfassen, teilen und exportieren. Sie steht ja bewusst
   drin, weil der Nutzer sie ausdruecklich eingeschlossen hat.
   Der Schleier liegt auf dem inneren <div> (dem Bildkasten) statt auf der Karte selbst,
   weil darunter noch die Level-Plakette haengt - die soll nicht mit vergrauen. */
.builder-result-card.not-unlocked > div > img,
.builder-result-card.not-unlocked > div > .builder-result-fallback {
  filter: grayscale(.86) brightness(.74); opacity: .76;
}
.builder-result-card.not-unlocked > div::after {
  content: ""; position: absolute; inset: 0; z-index: 1; pointer-events: none;
  border-radius: 5px; background: color-mix(in srgb, var(--feedback-bg) 12%, transparent);
}
/* Die Stufe stand mit -4px so dicht am Kartenbild, dass sie es an der Unterkante
   beruehrte (Eliass 15.08.2026). Sie ist eine eigene Angabe unter der Karte und
   braucht dafuer auch sichtbar Luft. */
/* Dieselbe Plakette wie mobil - dunkle Box, farbiger Rand, weisse Zahl (Eliass
   02.09.2026). Am Desktop bleibt sie aber UNTER der Karte stehen statt auf ihr zu
   liegen; nur der Abstand ist von 3px auf 1px zurueckgenommen, er war zu gross.
   Die 2px Innenabstand unten sind die optische Korrektur: Flex zentriert Ober- PLUS
   Unterlaenge, Ziffern nutzen beides nicht aus und wirken sonst zu tief. */
.builder-card-lvl {
  display: inline-flex; align-items: center; justify-content: center;
  margin-top: -2px; padding: 0 0.3rem 2px; border-radius: 4px;
  min-height: 15px; line-height: 1;
  background: rgba(6, 9, 16, 0.78); border: 1px solid rgba(255, 255, 255, 0.28);
  font-size: 0.62rem; font-weight: 800; font-style: normal; color: #fff;
}
/* Auf der Plakette reicht die Zahl. Dass es sich um Kartenlevel handelt, ergibt sich
   aus dem Zusammenhang - "Lvl" davor kostet nur Breite. Das Wort steht als eigenes
   <span> im Markup, damit es hier entfallen kann, ohne die Zahl anzufassen.
   (Eliass 30.08.2026 fuer mobil, 02.09.2026 auch fuer den Desktop.) */
.builder-card-lvl .lvl-word { display: none; }
/* Der Rand misst gegen das Bezugslevel des Spielers, nicht gegen die feste 16: gruen
   auf Hoehe seines eigenen Standes, gelb ein bis zwei darunter, rot ab drei. Welches
   Level das ist, rechnet der Server (builder-v1.mjs: bezugsLevel). Gilt fuer beide
   Ansichten, deshalb steht es hier und nicht im Mobilblock. */
.builder-card-lvl.lvl-gut { border-color: #22c55e; }
.builder-card-lvl.lvl-mittel { border-color: #facc15; }
.builder-card-lvl.lvl-schlecht { border-color: #ef4444; }
/* .low meinte "unter Level 16" und ist durch den relativen Vergleich abgeloest. Die
   Klasse bleibt im Markup, faerbt aber nichts mehr. */
.builder-card-lvl.low { color: #fff; }
/* Tower Troop: eigener Slot mit Luft zur 8. Karte. Der Strich steht in seiner eigenen
   Spalte, damit die Karte selbst in voller Kartenbreite bleibt. */
/* Bewusst kuerzer als die Karten: der Strich soll die Turmtruppe absetzen, nicht wie
   eine Rahmenkante wirken. Auf voller Kartenhoehe (82px) sah er laenger aus als der
   Block, den er teilt (Eliass 15.08.2026). Mittig statt oben ausgerichtet, damit die
   Luecke oben und unten gleich gross ist. */
.builder-tower-divider {
  justify-self: center; align-self: center;
  width: 1px; height: 58px; background: rgba(148, 163, 184, 0.28);
}
.builder-tower-card img { width: 100%; height: 82px; object-fit: contain; }
.builder-result-fallback {
  height: 82px; display: grid !important; place-items: center; border-radius: 10px;
  background: linear-gradient(145deg, #334155, #172033);
  font-size: 1.15rem !important; font-weight: 900; color: #7dd3fc;
}
.builder-result details { margin-top: 10px; border-top: 1px solid rgba(148, 163, 184, 0.15); padding-top: 10px; }
.builder-result summary { cursor: pointer; color: #7dd3fc; font-weight: 700; }
.builder-result details p { color: #cbd5e1; }
.builder-breakdown { display: flex; flex-wrap: wrap; gap: 8px; }
.builder-breakdown span { display: grid; background: rgba(30, 41, 59, 0.8); padding: 6px 10px; border-radius: 9px; font-size: 0.72rem; color: #e2e8f0; }
.builder-breakdown b { text-transform: capitalize; color: #94a3b8; }

@media (max-width: 760px) {
  .builder-picker-head { align-items: stretch; flex-direction: column; }
  .builder-picker-head input { max-width: none; }
  .builder-card-toolbar { gap: 6px; }
  .builder-pick-controls, .builder-pick-mode { gap: 4px; }
  .builder-pick-mode button { gap: 4px; padding: 5px 8px; font-size: 0.74rem; }
  .builder-pick-mode-icon { width: 15px; height: 15px; }
  .builder-card-reset { width: 32px; height: 32px; }
  .builder-card-toolbar > .deck-sort-control { width: auto; padding: 2px; }
  .builder-card-toolbar > .deck-sort-control button {
    flex: none; min-height: 28px; padding-inline: 0.34rem; font-size: 0.72rem;
  }

  /* ---------- Ergebniskarte schmal: vier klar getrennte Reihen ----------
     Vorher stand alles in einer Kopfzeile: Rang, Name, Etiketten, Elixierschnitt,
     Speichern und QR. Auf 375px war das schlicht zu viel - der Name brach um, und
     Elixier/Speichern/QR wurden vom `overflow: hidden` der Karte abgeschnitten, waren
     also gar nicht mehr erreichbar. Jetzt: Rang plus Name, darunter die Etiketten,
     darunter die Karten, darunter die Aktionen.
     `display: contents` loest den <header> als Kasten auf, sodass seine beiden
     Haelften direkt Kinder der Ergebniskarte werden und sich per `order` zwischen
     die Kartenreihe einsortieren lassen. */
  .builder-result { display: grid; }
  .builder-result header { display: contents; }
  .builder-result header > div:first-child { order: 1; flex-wrap: wrap; row-gap: 6px; }
  /* Die Ueberschrift belegt den Rest der ersten Zeile, damit "Popular", "Reference"
     und Co. verlaesslich in die zweite umbrechen statt mit dem Namen zu kollidieren.
     Der Abzug ist die Breite der Rangzahl samt Abstand (auch bei "#10"). */
  .builder-result header > div:first-child > h3 { flex: 1 0 calc(100% - 48px); }
  .builder-result-cards { order: 2; }
  .builder-result-head-actions { order: 3; justify-content: space-between; margin-top: 10px; }
  /* Das 2v2-Paar steht an der Stelle der Kartenreihe, nicht davor - sonst rutscht der
     Kopf mit Rang und Belegen unter die Decks (der <header> ist hier `display: contents`
     und seine Haelften ordnen sich per `order` ein). Die Belege gehoeren nach oben zum
     Rang, nicht ans Ende der Kachel. */
  .builder-result.is-2v2 .builder-team-decks { order: 2; }
  .builder-result.is-2v2 .builder-result-head-actions { order: 1; margin-top: 0; justify-content: flex-start; }

  /* Vier Kartenspalten in zwei Reihen, rechts daneben der Trennstrich und die
     Turmtruppe ueber beide Reihen. Die Karten 5 bis 8 bekommen dafuer fest die
     zweite Reihe: Kinder mit fester Reihe werden vor den frei fliessenden gesetzt,
     die Karten 1 bis 4 finden danach genau die vier freien Felder der ersten Reihe.
     Ohne Turmtruppe faellt das Markup fuer Strich und Turm ganz weg - dann bleiben
     die vier gleich breiten Spalten von vorher, sonst stuenden zwei leere daneben. */
  .builder-result-cards { grid-template-columns: repeat(4, minmax(0, 1fr)); }
  .builder-result-cards:has(.builder-tower-card) {
    grid-template-columns: repeat(4, minmax(0, 1fr)) 12px minmax(0, 1fr);
  }
  .builder-result-cards:has(.builder-tower-card) > .builder-result-card:nth-child(n + 5):nth-child(-n + 8) {
    grid-row: 2;
  }
  /* Ueber zwei Kartenreihen gespannt, aber weiterhin deutlich kuerzer als sie: 70%
     der Blockhoehe, mittig. Volle Hoehe lief auch neben den Stufen-Etiketten entlang
     und wirkte wie ein Rahmen statt wie eine Trennung. */
  .builder-tower-divider { grid-area: 1 / 5 / 3 / 6; align-self: center; height: 70%; }
  .builder-tower-card { grid-area: 1 / 6 / 3 / 7; align-self: center; }

  /* ---------- Nur mobil: Hoehe der Ergebniskachel zusammenziehen ----------
     Eliass 30.08.2026. Alle drei Regeln gelten ausschliesslich unter 760px,
     die Desktop-Ansicht bleibt unveraendert.

     1. Der "Stats coming soon"-Platzhalter faellt weg. Er ist eine Ankuendigung
        ohne Inhalt und kostet auf dem Handy Platz, den die Karten brauchen. Am
        Desktop bleibt er stehen - dort stoert die freie Spalte nicht. */
  .builder-stats-placeholder { display: none; }

  /* 2. Der Abstand zwischen den beiden Kartenreihen zog die Kachel unnoetig
        auseinander. Die Spalten behalten ihre 3px, die Reihen ruecken zusammen. */
  .builder-result-cards { column-gap: 3px; row-gap: 2px; }

  /* 3. Die Stufe stand als eigene Zeile unter dem Kartenbild - bei einer Suche
        nach Kartenlevel kam diese Hoehe acht Mal zusammen und war der groesste
        Einzelposten der Kachel. Jetzt liegt sie als Plakette auf dem Bild, genau
        wie das Star-Level in der Collection (.col-star-badge). Sie kostet damit
        keine Hoehe mehr und bleibt trotzdem sofort lesbar.
        Absolut positioniert heisst: aus dem Fluss genommen, die Kachel ist nur
        noch so hoch wie das Kartenbild selbst. */
  .builder-result-card { position: relative; }
  /* Mobil liegt die Plakette AUF dem Kartenbild statt darunter - dort ist keine Hoehe
     fuer eine eigene Zeile. Aussehen und Farben kommen aus der Basisregel, hier stehen
     nur die Unterschiede. */
  .builder-card-lvl {
    position: absolute; inset-inline: 0; bottom: 6px;
    width: max-content; margin-inline: auto; margin-top: 0;
  }


  /* Ohne Stufen-Plakette wirkten die beiden Kartenreihen weiter auseinander als mit:
     die Plakette fuellt den unteren Rand des Bildes optisch aus, ohne sie bleibt dort
     Leerraum aus `object-fit: contain` stehen. Deshalb sitzen die Reihen genau dann
     ganz dicht, wenn keine Stufen angezeigt werden. */
  .builder-result-cards:not(:has(.builder-card-lvl)) { row-gap: 0; }

  /* Feste 70px Hoehe bei mitwachsender Spaltenbreite hiess: auf 375px passte die Karte
     knapp, auf 700px stand sie als kleines Bild in einer doppelt so breiten Spalte und
     die Reihe wirkte leer. Stattdessen fuellt die Karte ihre Spalte und wird nur nach
     oben begrenzt - `text-align: center` der Kachel haelt sie dabei mittig. */
  .builder-result-card img { width: auto; height: auto; max-width: 100%; max-height: 92px; }
  .builder-stats-placeholder { grid-column: 1 / -1; min-height: 38px; margin-left: 0; }
}

/* ---------- Gespeicherte Decks: zwei Kartenanordnungen ----------
   Steht bewusst NACH dem Mobil-Block darueber: die Regeln dort haben dieselbe
   Spezifitaet (`:has(...)` zaehlt wie sein Argument), bei Gleichstand gewinnt die
   spaetere Regel. Weiter oben notiert waeren diese hier wirkungslos.
   Beide Anordnungen gelten in jeder Breite - ein Umschalter, der auf dem Desktop
   nichts tut, waere kein Umschalter. */
/* Titelzeile: Ueberschrift links, Umschalter rechts. Als eigene Reihe kostete der
   Schalter rund 60px zwischen "Saved Decks" und dem ersten Deck - hier fuellt er nur
   Platz, der neben der Ueberschrift ohnehin frei ist. `align-items: end` setzt ihn auf
   die Grundlinie der Ueberschrift statt auf ihre Mitte. */
.saved-head {
  display: flex; align-items: end; justify-content: space-between; gap: 1rem;
  margin-bottom: 0.9rem;
}
.saved-head h1 { margin: 0; }
/* Inhaltsbreite statt ueber den ganzen Bildschirm: zwei Knoepfe mit je vier Zeichen
   brauchen keine 335px, und die Mobil-Regel `.deck-sort-control { width: 100% }` haette
   sie genau so auseinandergezogen wie zuvor die Stufenwahl der Meta-Decks. */
.saved-layout-switch { flex: none; width: auto; }
.saved-layout-switch button { flex: none; }

/* Eine Reihe: acht Karten, Trennstrich, Turmtruppe. */
.saved-layout-row .saved-deck-cards {
  grid-template-columns: repeat(8, minmax(0, 52px)) 26px minmax(0, 52px);
}
/* `grid-row: auto` ist hier nicht bloss Aufraeumen: Rasterkinder mit fester Reihe
   werden VOR den frei fliessenden gesetzt. Blieb die Mobil-Regel `grid-row: 2` fuer
   die Karten 5 bis 8 stehen, belegten genau die die ersten vier Plaetze der Reihe -
   das Deck stand dann in falscher Reihenfolge da. */
.saved-layout-row .saved-deck-cards > .builder-result-card:nth-child(n + 5):nth-child(-n + 8) {
  grid-row: auto;
}
.saved-layout-row .builder-tower-divider { grid-area: 1 / 9 / 2 / 10; }
.saved-layout-row .builder-tower-card { grid-area: 1 / 10 / 2 / 11; }

/* Vier mal zwei: Strich und Turmtruppe stehen rechts ueber beide Reihen. */
.saved-layout-grid .saved-deck-cards {
  grid-template-columns: repeat(4, minmax(0, 52px)) 26px minmax(0, 52px);
}
.saved-layout-grid .saved-deck-cards > .builder-result-card:nth-child(n + 5):nth-child(-n + 8) {
  grid-row: 2;
}
.saved-layout-grid .builder-tower-divider { grid-area: 1 / 5 / 3 / 6; height: 70%; }
.saved-layout-grid .builder-tower-card { grid-area: 1 / 6 / 3 / 7; align-self: center; }

/* Schmal fuellen die Spalten die Breite aus, statt bei 52px stehen zu bleiben. */
@media (max-width: 760px) {
  .saved-layout-row .saved-deck-cards {
    grid-template-columns: repeat(8, minmax(0, 1fr)) 10px minmax(0, 1fr); gap: 2px;
  }
  .saved-layout-grid .saved-deck-cards {
    grid-template-columns: repeat(4, minmax(0, 1fr)) 12px minmax(0, 1fr);
  }
}

/* ---------- Guided deck analyzer (Wizard) ---------- */
.builder-wizard {
  margin: 18px auto 0;
  background: var(--panel-bg);
  border: 1px solid var(--panel-border); border-radius: 8px;
  box-shadow: var(--panel-shadow);
  overflow: visible;
}
.builder-wizard-head {
  display: flex; align-items: center; justify-content: space-between; gap: 18px;
  padding: 16px 20px; border-bottom: 1px solid rgba(255, 255, 255, 0.08);
}
.builder-wizard-head h2 { font-size: 1.4rem; margin: 2px 0; color: #f1f5f9; }
.builder-wizard-head p { margin: 0; color: #94a3b8; font-size: 0.88rem; }
.builder-eyebrow {
  font-size: 0.66rem; text-transform: uppercase; letter-spacing: 0.18em;
  font-weight: 900; color: #38bdf8;
}

/* Stepper: beschriftete, klickbare Schritte statt anonymer Balken. */
.builder-stepper { display: flex; gap: 2px; flex-wrap: nowrap; filter: drop-shadow(0 6px 14px rgba(0,0,0,.16)); }
.builder-step-pill {
  position: relative;
  display: flex; align-items: center; gap: 7px; padding: 8px 17px 8px 15px;
  border: 0; border-radius: 0;
  clip-path: polygon(10px 0, 100% 0, calc(100% - 10px) 100%, 0 100%);
  background: rgba(23, 34, 55, 0.6); color: #94a3b8; cursor: pointer;
  font-weight: 700; font-size: 0.8rem; transition: color .15s, background .18s, box-shadow .18s;
}
.builder-step-pill i {
  position: relative; display: grid; place-items: center; width: 20px; height: 20px; border-radius: 50%;
  background: #26344e; color: #cbd5e1; font-style: normal; font-size: 0.72rem; font-weight: 900;
}
.builder-step-pill i::before {
  content: "";
  position: absolute;
  left: 50%;
  top: 47%;
  width: 5px;
  height: 9px;
  border-right: 2px solid #052e16;
  border-bottom: 2px solid #052e16;
  opacity: 0;
  transform: translate(-50%, -52%) rotate(45deg) scale(.82);
  transform-origin: center;
}
.builder-step-pill:not(:disabled):hover { border-color: rgba(125, 211, 252, 0.5); color: #e2e8f0; }
.builder-step-pill.done {
  color: #dcfce7;
  background: linear-gradient(145deg, rgba(21, 128, 61, .42), rgba(20, 83, 45, .25));
  box-shadow: inset 0 0 0 1px rgba(74, 222, 128, .42), 0 0 16px rgba(34, 197, 94, .18);
}
.builder-step-pill.done i {
  width: 18px; height: 18px;
  background: #22c55e; color: transparent;
  box-shadow: 0 0 8px rgba(74, 222, 128, .48);
}
.builder-step-pill.done i::before { opacity: 1; transform: translate(-50%, -52%) rotate(45deg) scale(1); }
.builder-step-pill.just-completed {
  animation: builderStepComplete .46s ease-out;
}
.builder-step-pill.just-completed i {
  animation: builderCheckPop .46s ease-out;
}
.builder-step-pill.active {
  color: #fff;
  background: linear-gradient(145deg, rgba(14,165,233,.72), rgba(79,70,229,.52));
}
.builder-step-pill.active i { background: linear-gradient(135deg, #38bdf8, #6366f1); color: #fff; }
.builder-step-pill:disabled { opacity: 0.45; cursor: default; }

.builder-step { position: relative; padding: 22px 24px; animation: builderStepIn .42s cubic-bezier(.2,.8,.2,1); transform-origin:50% 20%; }
.builder-step.entering-back { animation-name: builderStepBack; }
.builder-step-title { display: flex; gap: 12px; align-items: center; margin-bottom: 16px; }
.builder-step-title > span {
  display: grid; place-items: center; flex: 0 0 38px; height: 38px;
  border: 1px solid rgba(56, 189, 248, 0.3); border-radius: 12px;
  color: #7dd3fc; font-weight: 900; background: rgba(14, 165, 233, 0.08);
}
.builder-step-title h3 { margin: 0 0 2px; font-size: 1.15rem; color: #f1f5f9; }
.builder-step-title p { margin: 0; color: #94a3b8; font-size: 0.86rem; }
.builder-card-step-title { margin-bottom: 16px; }
.builder-setup-section h3,
.builder-level-section h3 {
  margin: 0 0 10px; color: var(--panel-text); font-size: 1.15rem;
}
.builder-level-section {
  margin-top: 22px; padding-top: 20px; border-top: 1px solid var(--panel-inset-border);
}

.builder-choice-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px; }
.builder-choice-grid.two { grid-template-columns: repeat(2, 1fr); }
/* Kompakte Auswahlkarten: Icon links, Text rechts – spart viel Hoehe. */
.builder-choice {
  display: grid; grid-template-columns: 46px 1fr; align-items: center; column-gap: 12px;
  text-align: left; padding: 12px 14px; border-radius: 8px;
  border: 1px solid rgba(99, 125, 215, 0.32); background: rgba(8, 10, 15, 0.24);
  color: #e2e8f0; cursor: pointer;
  transition: transform 0.2s, border-color 0.2s, background 0.2s, box-shadow 0.2s;
}
.builder-choice:hover { transform: translateY(-2px); border-color: rgba(125, 211, 252, 0.48); }
.builder-choice.active {
  border-color: #587cff;
  background: linear-gradient(145deg, rgba(49, 91, 212, 0.28), rgba(189, 113, 240, 0.12));
  box-shadow: inset 0 0 0 1px rgba(88, 124, 255, 0.18), 0 8px 24px rgba(3, 6, 14, 0.18);
}
.builder-choice img { grid-row: 1 / 3; height: 42px; max-width: 46px; object-fit: contain; }
.builder-mode-grid .builder-choice img { height:52px; max-width:58px; justify-self:center; }
/* Vier Modi statt drei: `auto-fit` statt einer festen Spaltenzahl, damit sie bei
   genug Platz nebeneinander stehen und sonst von selbst auf zwei Reihen umbrechen,
   statt sich auf 3+1 aufzuteilen. */
.builder-mode-grid { grid-template-columns: repeat(auto-fit, minmax(196px, 1fr)); }

/* Gesperrter Modus - gleiche Sprache wie .streamer-mode-choice.locked: Inhalt
   entsaettigt und abgedunkelt, das Schloss selbst bleibt farbig und liegt mittig
   darueber. Kein blauer Akzent beim Ueberfahren, nur etwas helleres Grau. */
.builder-choice.locked { position: relative; cursor: not-allowed; border-color: rgba(148, 163, 184, 0.24); }
.builder-choice.locked:hover {
  transform: none; border-color: rgba(148, 163, 184, 0.34); background: rgba(148, 163, 184, 0.05);
}
.builder-choice.locked > img,
.builder-choice.locked > b,
.builder-choice.locked > span:not(.builder-choice-lock) {
  filter: grayscale(1) brightness(0.5); opacity: 0.85;
}
.builder-choice-lock {
  /* Ohne explizite grid-column/-row wird ein absolut positioniertes Grid-Kind trotzdem
     automatisch in eine Zelle einsortiert (hier Spalte 2, die Textspalte) - `left: 50%`
     zentriert dann nur innerhalb dieser Zelle statt ueber den ganzen Button (Eliass
     07.08.2026: Schloss bei "Clan Wars" nicht x-zentriert). Ueber beide Spalten/Zeilen
     spannen, damit der ganze Button die Bezugsbox fuer die Zentrierung ist.
     WICHTIG: `.builder-choice` deklariert nur grid-template-columns, keine
     grid-template-rows - die zwei sichtbaren Zeilen (Titel/Beschreibung) sind rein
     implizit. `-1` referenziert aber nur die letzte EXPLIZITE Linie, hier also Zeile 2
     statt der tatsaechlich letzten Zeile - dadurch spannte grid-row bisher nur die
     erste Zeile und das Schloss saß zu weit oben (Eliass 08.08.2026, Firefox). Deshalb
     hier explizit "1 / 3" wie beim Icon (`.builder-choice img`) statt "1 / -1". */
  grid-column: 1 / -1; grid-row: 1 / 3;
  position: absolute; z-index: 4; left: 50%; top: 50%; transform: translate(-50%, -50%);
  display: grid; place-items: center; width: 38px; height: 38px; pointer-events: none;
}
/* Mit `.builder-mode-grid` davor, weil die Regel fuer die Modus-Icons weiter oben
   (`.builder-mode-grid .builder-choice img`) sonst spezifischer waere und dem Schloss
   ihre 52px-Hoehe aufzwingen wuerde. */
.builder-mode-grid .builder-choice-lock img {
  width: 100%; height: 100%; max-width: none; object-fit: contain;
  filter: drop-shadow(0 6px 14px rgba(0, 0, 0, 0.6));
}
.builder-mode-grid .builder-choice[data-builder-mode="ultimate-champion"] img { transform:scale(1.34); }
.builder-mode-grid .builder-choice[data-builder-mode="top-ladder"] img { transform:scale(1.2); }
.builder-choice .builder-glyph { grid-row: 1 / 3; grid-column: 1; font-size: 1.6rem; color: #7dd3fc; line-height: 1; text-align: center; }
.builder-choice b { font-size: 0.95rem; }
.builder-choice span:not(.builder-choice-lock) { grid-column: 2; font-size: 0.78rem; line-height: 1.4; color: #94a3b8; }

.builder-setting-block + .builder-setting-block { margin-top: 16px; }
.builder-setting-block h4 {
  margin: 0 0 8px; color: #cbd5e1; font-size: 0.78rem;
  text-transform: uppercase; letter-spacing: 0.08em;
}
.builder-tag-panel {
  margin-top: 14px; padding: 14px; border-radius: 14px;
  border: 1px solid rgba(56, 189, 248, 0.25); background: rgba(14, 165, 233, 0.07);
  display: grid; gap: 6px;
}
.builder-tag-panel label { color: #cbd5e1; font-weight: 700; font-size: 0.85rem; }
.builder-tag-panel input {
  border: 1px solid rgba(148, 163, 184, 0.28); background: #101b30;
  color: white; border-radius: 10px; padding: 11px;
}
.builder-tag-panel small { color: #94a3b8; }

.builder-actions { display: flex; align-items: center; justify-content: space-between; margin-top: 20px; }
.builder-back {
  min-height: 34px;
  border: 1px solid rgba(255, 255, 255, 0.12); background: rgba(8, 10, 15, 0.42);
  color: rgba(226, 233, 248, 0.72); border-radius: 8px; padding: 0.35rem 0.75rem; cursor: pointer;
  font-weight: 750;
  transition: color 0.16s ease, background 0.16s ease, border-color 0.16s ease;
}
.builder-back:hover { color: #fff; background: rgba(255, 255, 255, 0.08); border-color: rgba(255, 255, 255, 0.2); }
.builder-card-actions {
  margin: 16px 0 20px;
  padding: 12px 4px;
  border-top: 1px solid var(--panel-inset-border);
  border-bottom: 1px solid var(--panel-inset-border);
}
.builder-card-actions .builder-back {
  border-color: color-mix(in srgb, var(--primary) 58%, var(--panel-inset-border));
  background: color-mix(in srgb, var(--primary) 18%, transparent);
  color: var(--panel-text);
}
.builder-card-actions .builder-back:hover {
  border-color: var(--primary);
  background: color-mix(in srgb, var(--primary) 28%, transparent);
}

.builder-results-actions {
  display: flex; align-items: center; justify-content: center;
  min-height: 38px; margin-top: 14px;
}
.builder-more-btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 0.42rem;
  min-width: 132px; height: 32px; margin: 0 auto; padding: 0 0.75rem;
  border: 1px solid rgba(255, 255, 255, 0.12); border-radius: 8px;
  background: rgba(8, 10, 15, 0.34);
  color: rgba(226, 233, 248, 0.68); cursor: pointer;
  transition: color 0.18s ease, background 0.18s ease, transform 0.18s ease;
  font-size: 0.78rem; font-weight: 800;
}
.builder-more-btn:hover { color: #fff; background: rgba(255, 255, 255, 0.08); border-color: rgba(255, 255, 255, 0.2); }
.builder-more-btn:focus-visible { outline: 2px solid var(--laser-left, var(--primary)); outline-offset: 2px; }
.builder-more-btn.loading { opacity: 0.55; cursor: wait; }
.builder-more-btn.loading svg { animation: builderMoreSpin 0.8s linear infinite; }
@keyframes builderMoreSpin { to { transform: rotate(360deg); } }

.builder-search { position: relative; display: flex; align-items: center; }
.builder-search > span { position: absolute; left: 12px; color: #7dd3fc; font-size: 1.15rem; }
.builder-search input { padding-left: 36px !important; }
.builder-step .builder-card-grid { background:transparent; border-radius:0; padding:0; }
.builder-player-search { position:relative; }
.builder-player-search input { width:100%; }
.builder-player-search .search-dropdown { top:calc(100% + 5px); z-index: 80; }

.builder-analyzing { text-align: center; padding: 55px 30px; }
.builder-analyzing h3 { font-size: 1.35rem; margin: 22px 0 8px; color: #f1f5f9; }
.builder-analyzing p { color: #94a3b8; }
/* ---------- Analyse-Anzeige: Elixier-Tank ----------
   Vorher waren es drei geschlossene Ringe mit `rotate`. Die drehten sich zwar, sahen
   dabei aber vollkommen still aus: ein gleichmaessiger Kreis ist rotationssymmetrisch,
   an ihm ist eine Drehung schlicht nicht ablesbar. Deshalb dreht sich hier nur noch ein
   BOGEN (Anfang und Ende sichtbar), und die eigentliche Bewegung uebernimmt das Elixier
   im Glas: Pegel steigt und faellt, die Oberflaeche schwappt, Blasen steigen auf.
   Elixier statt Neonblau, weil es die eine Farbe ist, die in Clash Royale fuer
   "es laeuft gerade etwas voll" steht - dieselbe Sprache wie die Elixier-Blase an den
   Decks. Palette aus `.elixir`. */
.builder-orb { width: 110px; height: 110px; position: relative; margin: auto; display: grid; place-items: center; }
.builder-orb-arc {
  position: absolute; inset: 0; border-radius: 50%;
  border: 2px solid transparent;
  border-top-color: rgba(238, 90, 244, 0.85);
  border-right-color: rgba(238, 90, 244, 0.3);
  animation: builderOrbit 1.15s linear infinite;
}
.builder-orb-glass {
  position: absolute; inset: 13px; overflow: hidden; border-radius: 50%;
  border: 1px solid rgba(238, 90, 244, 0.28);
  background: radial-gradient(circle at 32% 28%, rgba(72, 22, 88, 0.42), rgba(11, 6, 18, 0.97));
  box-shadow: inset 0 2px 10px rgba(0, 0, 0, 0.55), 0 0 18px rgba(214, 60, 224, 0.16);
}
/* Der Pegel selbst. Breiter als das Glas und mit rundem Kopf: dadurch wandert beim
   Verschieben eine gewoelbte Oberflaeche durchs Bild statt einer geraden Kante. */
.builder-orb-level {
  position: absolute; left: -25%; right: -25%; bottom: 0; height: 30%;
  background: linear-gradient(180deg, #e05af0, #a72fc8 55%, #6d1b79);
  box-shadow: 0 0 14px rgba(214, 60, 224, 0.45);
  animation: builderElixirFill 2.8s ease-in-out infinite;
}
.builder-orb-level::before {
  content: ""; position: absolute; left: 0; right: 0; bottom: 100%; height: 11px;
  border-radius: 50%;
  background: linear-gradient(180deg, #ef6ffb, #e05af0);
  animation: builderElixirWave 1.9s ease-in-out infinite;
}
/* Blasen. Sie starten unter dem Glasrand und steigen durch die Fuellung nach oben. */
.builder-orb .builder-orb-glass b {
  position: absolute; bottom: 6%; width: 7px; height: 7px; border-radius: 50%;
  background: rgba(255, 255, 255, 0.72);
  animation: builderElixirBubble 2.3s ease-in infinite;
}
.builder-orb .builder-orb-glass b:nth-of-type(1) { left: 28%; }
.builder-orb .builder-orb-glass b:nth-of-type(2) { left: 52%; width: 5px; height: 5px; animation-delay: 0.75s; animation-duration: 2.7s; }
.builder-orb .builder-orb-glass b:nth-of-type(3) { left: 70%; width: 4px; height: 4px; animation-delay: 1.4s; animation-duration: 2.1s; }
.builder-analysis-bars { display: flex; justify-content: center; gap: 5px; margin-top: 20px; }
.builder-analysis-bars i { width: 42px; height: 4px; background: #26344e; border-radius: 8px; overflow: hidden; }
.builder-analysis-bars i:after { content: ""; display: block; width: 100%; height: 100%; background: #38bdf8; animation: builderScan 1.2s ease-in-out infinite; }
.builder-analysis-bars i:nth-child(2):after { animation-delay: 0.2s; }
.builder-analysis-bars i:nth-child(3):after { animation-delay: 0.4s; }
@keyframes builderStepIn { from { opacity:0; transform:translateX(18px) scale(.985); filter:blur(3px); } to { opacity:1; transform:none; filter:none; } }
@keyframes builderStepBack { from { opacity:0; transform:translateX(-18px) scale(.985); filter:blur(3px); } to { opacity:1; transform:none; filter:none; } }
@keyframes builderDeckReveal {
  0% { opacity: 0; transform: translateY(16px) scale(0.982); filter: blur(5px); }
  62% { opacity: 1; transform: translateY(-2px) scale(1.004); filter: blur(0); }
  100% { opacity: 1; transform: none; filter: none; }
}
@keyframes builderDeckLineReveal {
  from { opacity: 0; transform: scaleX(0.35); }
  to { opacity: 1; transform: scaleX(1); }
}
@keyframes builderStepComplete {
  0% { box-shadow: inset 0 0 0 1px rgba(74, 222, 128, 0), 0 0 0 rgba(34, 197, 94, 0); }
  45% { box-shadow: inset 0 0 0 1px rgba(134, 239, 172, .86), 0 0 24px rgba(34, 197, 94, .42); }
  100% { box-shadow: inset 0 0 0 1px rgba(74, 222, 128, .42), 0 0 16px rgba(34, 197, 94, .18); }
}
@keyframes builderCheckPop {
  0% { transform: scale(.74); }
  55% { transform: scale(1.12); }
  100% { transform: scale(1); }
}
@keyframes builderOrbit { to { transform: rotate(360deg); } }
@keyframes builderScan { 0%, 100% { transform: translateX(-110%); } 50% { transform: translateX(0); } }
/* Nicht bis oben: bei vollem Glas verschwindet der dunkle Tank und uebrig bliebe eine
   flache magentafarbene Scheibe – dann waere wieder nichts von der Bewegung zu sehen. */
@keyframes builderElixirFill {
  0%, 100% { height: 22%; }
  50% { height: 64%; }
}
/* Nur seitlich verschieben, nicht skalieren: die Woelbung bleibt gleich, wandert aber –
   das liest sich als Schwappen. */
@keyframes builderElixirWave {
  0%, 100% { transform: translateX(-9%) rotate(-2deg); }
  50% { transform: translateX(9%) rotate(2deg); }
}
@keyframes builderElixirBubble {
  0% { transform: translateY(0) scale(0.6); opacity: 0; }
  18% { opacity: 0.75; }
  80% { opacity: 0.5; }
  100% { transform: translateY(-58px) scale(1); opacity: 0; }
}
/* Bei reduzierter Bewegung bleibt ein ruhiger, halb gefuellter Tank stehen. */
@media (prefers-reduced-motion: reduce) {
  .builder-orb-arc, .builder-orb-level, .builder-orb-level::before,
  .builder-orb .builder-orb-glass b { animation: none; }
  .builder-orb-level { height: 50%; }
}

/* ---------- Deck Builder auf schmalen Bildschirmen ----------
   Ziel (Eliass 15.08.2026): Schritt 1 muss ohne Scrollen in EINEN Bildschirm passen.
   Gemessen am iPhone-SE-Format (375x812, davon 755px ueber der unteren Leiste) waren
   es vorher 1123px - Kopf 309, Schritt 814. Drei Stellen tragen die Hauptlast:
   der Kopf stapelte Eyebrow/H1/Text/Stepper untereinander, die H1 lief mit
   Browser-Standardgroesse samt 21px Aussenabstaenden, und die fuenf Modus-Kacheln
   standen einspaltig mit je einer Beschreibungszeile. */
/* Der Kopf wird schon ab 900px flach - er kostet ueberall dieselbe Hoehe, waehrend die
   Kachelspalten weiter unten erst ab 760px umgestellt werden duerfen (bei 768px sind
   drei Spalten noch die flachere Loesung). */
@media (max-width: 900px) {
  /* Zwei Spalten statt Stapel: der Stepper sitzt oben rechts auf Hoehe des Eyebrows
     "Deck Intelligence" und kostet damit gar keine eigene Zeile mehr. */
  /* Absolut statt als zweite Rasterspalte: eine echte Spalte haette auch Ueberschrift
     und Fliesstext auf ihre Restbreite eingeschnuert - der Untertitel lief dadurch
     ueber sechs Zeilen (191px breit statt 301). So belegt der Stepper nur die
     Eyebrow-Zeile, alles darunter nutzt die volle Breite. Die Eyebrow-Zeile bekommt
     dafuer die Hoehe des Steppers, damit die H1 nicht darunter laeuft. */
  .builder-wizard-head { display: block; position: relative; padding: 14px 16px; }
  .builder-stepper { position: absolute; top: 14px; right: 16px; }
  .builder-wizard-head .builder-eyebrow {
    display: flex; align-items: center; min-height: 32px;
    padding-right: 300px; /* Platz fuer die beschrifteten Schritte */
  }
  /* Standard-H1 waere 32px mit 21px Abstand oben UND unten - der Abstand zwischen
     Eyebrow und Ueberschrift kam fast komplett daher. */
  .builder-wizard-head h1 { margin: 3px 0 0; font-size: 1.25rem; }
  .builder-page-summary { margin-top: 6px; font-size: 0.8rem; line-height: 1.4; }
  .builder-step { padding: 16px; }
}

@media (max-width: 760px) {
  .builder-choice-grid, .builder-choice-grid.two { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .builder-step-pill span { display: none; } /* auf Mobil nur die Nummern */
  .builder-step-pill { padding: 6px; }
  /* Ohne Beschriftung braucht die Eyebrow-Zeile deutlich weniger Vorhalt. */
  .builder-wizard-head .builder-eyebrow { padding-right: 116px; }
}

/* Flache Kacheln: Icon plus Name, ohne die erklaerende Zeile. Sie halbiert die Hoehe
   je Kachel und ist der Grund, warum zwei Spalten hier nicht ueberladen wirken -
   "Trophy Road" oder "My card levels" erklaeren sich selbst, und der ausgewaehlte
   Zustand bleibt am Rahmen erkennbar. */
@media (max-width: 560px) {
  .builder-choice-grid, .builder-choice-grid.two, .builder-mode-grid {
    grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px;
  }
  .builder-choice { grid-template-columns: 34px minmax(0, 1fr); column-gap: 9px; padding: 8px 10px; }
  .builder-choice img, .builder-mode-grid .builder-choice img {
    grid-row: 1; height: 32px; max-width: 34px;
  }
  .builder-choice b { font-size: 0.82rem; line-height: 1.2; }
  .builder-choice span:not(.builder-choice-lock) { display: none; }
  /* Das Schloss lag mittig ueber der ganzen Kachel - solange darunter Icon plus zwei
     Textzeilen standen, war das stimmig; ohne die Beschreibung deckt es den Namen ab
     ("C[schloss]n Wars"). Es sitzt jetzt als Kennzeichen rechts aussen, der
     Zusatzabstand haelt den Namen davon frei.
     `grid-area: auto` ist hier der entscheidende Teil und kein Aufraeumen: solange
     eine explizite Rasterposition gesetzt ist (Grundregel: `1 / -1` bzw. `1 / 3`),
     ist der Bezugsrahmen des absolut gesetzten Kindes die RASTERFLAECHE, also der
     Inhaltskasten ohne Innenabstand - `right: 6px` landete damit 40px vor der Kante,
     mitten im Namen. Ohne explizite Position ist der Bezug der Innenkasten. */
  .builder-choice.locked { padding-right: 34px; }
  .builder-choice-lock {
    grid-area: auto;
    left: auto; right: 8px; top: 50%; transform: translateY(-50%);
    width: 24px; height: 24px;
  }
  /* Die Trennlinie zwischen den beiden Abschnitten bleibt, nur schmaler. */
  .builder-level-section { margin-top: 14px; padding-top: 12px; }
  .builder-setup-section h3, .builder-level-section h3 { margin-bottom: 8px; font-size: 1.02rem; }
  .builder-actions { margin-top: 14px; }
}

@media (prefers-reduced-motion: reduce) {
  .builder-reveal,
  .builder-result.builder-reveal::before {
    opacity: 1;
    transform: none;
    filter: none;
    animation: none;
  }
}

/* ---------- Deck-Rechner: zwei Abschnitte in einer Box ---------- */
.col-deck-title { margin: 0 0 0.7rem; color: var(--panel-text); font-size: 0.9rem; }
.col-deck-actions { margin-top: 0.9rem; }
.col-btn[disabled] { opacity: 0.45; cursor: not-allowed; }
.col-btn[disabled]:hover { background: var(--panel-inset); color: var(--panel-muted); border-color: var(--panel-inset-border); }
/* Muelleimer und Haken neben den acht Plaetzen. */
.col-pick-tools { display: flex; align-items: center; gap: 0.4rem; }
.col-icon-btn {
  display: grid; place-items: center; width: 34px; height: 34px; padding: 0;
  border-radius: 7px; border: 1px solid var(--panel-inset-border);
  background: var(--panel-inset); color: var(--panel-muted); cursor: pointer;
}
.col-icon-btn:hover { background: var(--panel-inset); color: var(--panel-text); border-color: var(--deck-btn-hover-border); }
.col-icon-btn.is-confirm { color: var(--win); }
.col-icon-btn[disabled] { opacity: 0.4; cursor: not-allowed; }
.col-icon-btn[disabled]:hover { color: var(--panel-muted); border-color: var(--panel-inset-border); }

/* Ergebnis nach dem Bestaetigen. Gleiche Bausteine wie die Maxed-Anzeige oben. */
.modal-box:has(.col-result) { width: 470px; max-width: 470px; }
.col-result { display: grid; justify-items: center; }
.col-result-deck { display: grid; grid-template-columns: repeat(8, minmax(0, 1fr)); gap: 3px; width: 100%; }
.col-result-card { position: relative; aspect-ratio: 285 / 420; }
.col-result-card img { width: 100%; height: 100%; object-fit: contain; display: block; }
.col-result-score { margin: 1.2rem 0 1.1rem; }
.col-result-score strong { font-size: 2.9rem; }
.col-result-figures { gap: 1.2rem 2.2rem; }
.col-result-needs { justify-content: center; margin-top: 1.1rem; }
/* Die Kartenbedarfe blenden nacheinander ein, nachdem die Zahl hochgezaehlt hat. */
.col-result-need { opacity: 0; animation: colResultNeed 0.4s ease forwards; animation-delay: var(--delay, 0.5s); }
@keyframes colResultNeed { from { opacity: 0; transform: translateY(5px); } to { opacity: 1; transform: none; } }
@media (prefers-reduced-motion: reduce) {
  .col-result-need { opacity: 1; animation: none; }
}

/* ---------- Choose a deck: Deckkasten wie im Decks-Reiter ---------- */
/* Feste Hoehe mit eigenem Scrollbereich. Zwei Gruende: die Box bleibt beim Wechsel
   zwischen den drei Reitern gleich hoch, wodurch der Panel-Verlauf nicht mehr
   umspringt (er skaliert mit der Elementhoehe), und die Seite wird kuerzer. */
.col-source-body {
  display: grid; gap: 0.7rem; max-height: 60vh; overflow-y: auto;
  transition: opacity 0.5s ease;
}
.col-source-body.is-switching { opacity: 0; }
.col-source-box { margin: 0; }
.col-source-pick { display: flex; align-items: center; justify-content: space-between; gap: 1rem; flex-wrap: wrap; }
.col-source-take { flex: none; }
.col-source-note { display: block; margin-top: 0.45rem; }
/* Der Modus-Block links wird durch eine duenne Linie vom Deck getrennt. */
.col-source-box .player-deck-mode {
  padding-right: 0.8rem; border-right: 1px solid var(--panel-inset-border);
}
/* Acht Karten in EINER Reihe, linksbuendig und bewusst klein - die Zeile soll auf
   einen Blick als Deck lesbar sein und nicht die halbe Seitenhoehe fressen. */
.col-source-box .player-deck-cards {
  grid-template-columns: repeat(8, 52px);
  justify-content: start; flex: none; margin: 0;
}
.col-source-box .player-deck-cards .card,
.col-source-box .player-deck-cards .card-img,
.col-source-box .player-deck-cards .card-img img { width: 52px; }
.col-source-pick { justify-content: flex-start; gap: 1.2rem; }

/* Platzierung, Siegquote und Spielerzahl mit Icon statt als Fliesstext. */
.col-meta-stats { display: flex; align-items: center; gap: 0.9rem; }
.col-meta-stats span {
  display: inline-flex; align-items: center; gap: 0.3rem;
  color: var(--panel-text); font-size: 0.82rem; font-weight: 800;
  font-variant-numeric: tabular-nums;
}
.col-meta-stats img { width: 19px; height: 19px; object-fit: contain; }

/* ---------- Gesperrter Bereich (Emotes) ---------- */
.col-locked-panel { display: grid; justify-items: center; padding-bottom: 1.9rem; }
.col-locked-panel .col-head { width: 100%; }
.col-locked-panel .col-pop-lock { margin: 0.4rem auto 0; }
.col-locked-soon {
  margin: 0.7rem 0 0; color: var(--panel-muted); font-size: 0.82rem; font-weight: 700;
}

/* Leere Kartenplaetze im Deck-Rechner waren kaum zu sehen. Jetzt eine deutliche
   Flaeche mit klarem Rahmen, damit erkennbar ist, wo eine Karte hingehoert. */
.col-slot.is-empty {
  border: 1px dashed var(--deck-btn-hover-border);
  background: var(--panel-inset);
  color: var(--panel-muted); font-size: 1.35rem; font-weight: 800;
}
.col-slot.is-empty:hover {
  border-color: var(--primary); color: var(--panel-text);
}

/* ---------- Feedback und Bug Reports ----------
   Ganz am Dateiende, damit die vielen frueheren globalen input/button-Regeln diese
   Form nicht wieder ueberstimmen. Struktur und Dichte folgen dem globalen Modal. */
.modal-box:has(.feedback-form) {
  width: min(620px, 94vw); max-width: min(620px, 94vw); max-height: 92vh;
  overflow-y: auto; text-align: left; padding: 1.6rem 1.75rem;
}
.feedback-form { display: grid; gap: 0.9rem; }
.feedback-head { display: flex; align-items: center; gap: 0.75rem; padding-right: 1.4rem; }
.feedback-head-icon {
  display: grid; place-items: center; flex: 0 0 38px; height: 38px;
  border: 2px solid var(--panel-inset-border); border-radius: 7px;
  color: var(--panel-text); background: var(--panel-inset);
}
.feedback-head > div { display: grid; gap: 0.08rem; }
.feedback-head > div > span {
  color: var(--panel-dim); font-size: 0.67rem; font-weight: 800;
  text-transform: uppercase; letter-spacing: 0.08em;
}
.feedback-head h3 { margin: 0; }
.feedback-kind { display: grid; grid-template-columns: 1fr 1fr; gap: 0.45rem; }
.feedback-kind button {
  display: flex; align-items: center; justify-content: center; gap: 0.45rem;
  min-height: 38px; border: 2px solid var(--panel-inset-border); border-radius: 7px;
  background: var(--panel-inset); color: var(--panel-muted); cursor: pointer;
  font: inherit; font-size: 0.8rem; font-weight: 800;
}
.feedback-kind button:hover { background: var(--panel-inset); color: var(--panel-text); border-color: var(--panel-border); }
.feedback-kind button.active { color: var(--panel-text); border-color: var(--primary); }
.feedback-context {
  display: grid; grid-template-columns: max-content 1fr max-content; align-items: center;
  gap: 0.65rem; margin: 0; padding-bottom: 0.75rem;
  border-bottom: 1px solid var(--panel-inset-border);
}
.feedback-context span { color: var(--panel-dim); font-size: 0.72rem; font-weight: 750; }
.feedback-context strong { min-width: 0; font-size: 0.82rem; }
.feedback-context code { color: var(--panel-muted); font-size: 0.72rem; }
.feedback-field { display: grid; gap: 0.32rem; position: relative; }
.feedback-field > span { color: var(--panel-text); font-size: 0.78rem; font-weight: 800; }
.feedback-field > span i { color: var(--panel-dim); font-size: 0.7rem; font-style: normal; font-weight: 650; }
.feedback-form .feedback-field textarea,
.feedback-form .feedback-field input,
.feedback-form .feedback-field select {
  width: 100%; max-width: none; margin: 0; border: 2px solid var(--panel-inset-border);
  border-radius: 7px; background: var(--panel-inset); color: var(--panel-text);
  padding: 0.65rem 0.72rem; font: inherit; font-size: 0.82rem;
}
.feedback-form .feedback-field textarea { min-height: 126px; resize: vertical; padding-bottom: 1.25rem; }
.feedback-form .feedback-field textarea:focus,
.feedback-form .feedback-field input:focus,
.feedback-form .feedback-field select:focus { outline: none; border-color: var(--primary); }
.feedback-form .feedback-field select:disabled { opacity: .48; cursor: not-allowed; }
.feedback-field > small { position: absolute; right: 0.55rem; bottom: 0.42rem; color: var(--panel-dim); font-size: 0.66rem; }
.feedback-field > small b { color: inherit; }
.feedback-file {
  display: flex; align-items: center; justify-content: space-between; gap: 0.8rem;
  border-top: 1px solid var(--panel-inset-border); padding-top: 0.85rem;
}
.feedback-file > span { display: grid; grid-template-columns: 20px auto; align-items: center; gap: 0 0.42rem; }
.feedback-file > span svg { grid-row: 1 / span 2; color: var(--panel-muted); }
.feedback-file b { font-size: 0.78rem; }
.feedback-file small { color: var(--panel-dim); font-size: 0.67rem; }
.feedback-file input { min-width: 0; max-width: 265px; color: var(--panel-muted); font-size: 0.72rem; }
.feedback-file input::file-selector-button {
  border: 2px solid var(--panel-inset-border); border-radius: 6px;
  background: var(--panel-inset); color: var(--panel-text); padding: 0.32rem 0.5rem;
  font: inherit; font-weight: 750; cursor: pointer;
}
.feedback-safety, .feedback-reward-note, .feedback-legal {
  margin: -0.48rem 0 0; color: var(--panel-dim); font-size: 0.7rem; line-height: 1.45;
}
.feedback-contact-row { display: grid; grid-template-columns: 1fr 1fr; gap: 0.65rem; }
.feedback-reward-note { margin-top: -0.55rem; }
.feedback-legal { margin: 0; padding-top: 0.7rem; border-top: 1px solid var(--panel-inset-border); }
.feedback-legal a { color: var(--gold); }
.feedback-website { position: fixed; left: -10000px; width: 1px; height: 1px; overflow: hidden; }
.feedback-status { min-height: 1.1rem; margin: -0.35rem 0; color: var(--panel-muted); font-size: 0.75rem; }
.feedback-status.is-error { color: var(--loss); }
.feedback-submit {
  justify-self: end; min-height: 36px; padding: 0.42rem 1rem;
  border: 2px solid var(--primary); border-radius: 7px;
  background: var(--primary); color: var(--text); cursor: pointer;
  font: inherit; font-size: 0.8rem; font-weight: 850;
}
.feedback-submit:hover { background: var(--primary-d); }
.feedback-submit:disabled { opacity: .55; cursor: wait; }
.feedback-success { display: grid; justify-items: center; gap: 0.45rem; text-align: center; }
.feedback-success > svg { width: 28px; height: 28px; color: var(--win); }
.feedback-success h3, .feedback-success p { margin: 0; }
.feedback-success small { color: var(--panel-dim); font-family: ui-monospace, monospace; }

.giveaway-step-legal {
  margin: 0.42rem 0 0; color: var(--panel-dim); font-size: 0.65rem; line-height: 1.4;
}
.giveaway-step-legal a { color: var(--gold); }

/* Ruhige Support-Zeilen unter der Werbeflaeche, nach dem Vorbild eines Footer-Hinweises
   und nicht als dritte Werbekachel. Einzelwerte stehen frei, keine Box pro Zeile. */
.modal-box:has(.credits-pop) { width: 470px; max-width: min(470px, 94vw); text-align: left; }
.credits-pop > p { color: var(--panel-muted); font-size: 0.8rem; }
.credits-pop dl { display: grid; grid-template-columns: max-content 1fr; gap: 0.65rem 1rem; margin: 1rem 0; }
.credits-pop dt, .credits-pop dd { margin: 0; font-size: 0.8rem; }
.credits-pop dt a { color: var(--gold); font-weight: 800; }
.credits-pop dd { color: var(--panel-muted); }
.credits-pop .credits-note { margin: 0; padding-top: 0.75rem; border-top: 1px solid var(--panel-inset-border); font-size: 0.7rem; }

/* Builder-Picker: Besitz ist nur ein visueller Hinweis, niemals eine Sperre. Auch eine
   nicht freigeschaltete Karte/Form bleibt anklickbar. Gewaehlt/ausgeschlossen wird
   allein durch den mittigen echten Haken bzw. das echte Kreuz gezeigt - kein Rahmen. */
.builder-card.not-unlocked > img,
.builder-card.not-unlocked > .builder-card-fallback { filter: grayscale(.86) brightness(.74); opacity: .76; }
.builder-card.not-unlocked::after {
  content: ""; position: absolute; inset: 1px; z-index: 1; pointer-events: none;
  border-radius: 5px; background: color-mix(in srgb, var(--feedback-bg) 12%, transparent);
}
.builder-card.not-unlocked:hover > img,
.builder-card.not-unlocked:hover > .builder-card-fallback { opacity: .86; }
.builder-card.active,
.builder-card.banned {
  border-color: transparent; background: transparent; box-shadow: none;
}
.builder-card.active:hover,
.builder-card.banned:hover { border-color: var(--panel-border); background: var(--panel-inset); }
.builder-card-pick-mark {
  position: absolute; left: 50%; top: 50%; z-index: 2;
  width: 30px; height: 30px; transform: translate(-50%, -50%);
  display: grid; place-items: center; pointer-events: none;
  filter: drop-shadow(0 2px 4px var(--bg));
}
.builder-card-pick-mark img { width: 100%; height: 100%; object-fit: contain; }

/* ---------- Feedback-Wizard ----------
   Diese Regeln stehen bewusst nach allen alten Formular- und Button-Regeln. Jeder
   Hover ist lokal definiert, damit das globale `button:hover` keinen blauen Kasten
   in die schwarze Feedback-Flaeche setzt. */
.modal.feedback-active { background: var(--feedback-backdrop); }
.modal-box:has(.feedback-wizard) {
  width: min(680px, 94vw); max-width: min(680px, 94vw); max-height: 92vh;
  overflow-y: auto; padding: 0; text-align: left;
  border: 2px solid var(--panel-border); background: var(--feedback-bg);
}
.modal-box:has(.feedback-wizard)::before { left: 5%; right: 5%; }
.modal-box:has(.feedback-wizard) > .modal-close {
  top: 15px; right: 17px; z-index: 4; width: 32px; height: 32px;
  display: grid; place-items: center; border-radius: 5px; background: transparent;
}
.modal-box:has(.feedback-wizard) > .modal-close:hover { background: transparent; color: var(--panel-text); }
.feedback-wizard { display: grid; min-height: 570px; color: var(--panel-text); }
.feedback-wizard-head {
  display: flex; align-items: center; gap: 0.75rem; padding: 1.15rem 3.6rem 1rem 1.35rem;
  border-bottom: 2px solid var(--panel-inset-border); background: var(--feedback-bg);
}
.feedback-wizard-head > img {
  width: 50px; height: 50px; object-fit: contain;
}
.feedback-wizard-head > div { display: grid; gap: 0.08rem; }
.feedback-wizard-head span, .feedback-step-kicker {
  color: var(--panel-dim); font-size: 0.66rem; font-weight: 850;
  letter-spacing: 0.09em; text-transform: uppercase;
}
.feedback-wizard-head h2 { margin: 0; font-size: 1.05rem; line-height: 1.2; }
.feedback-progress {
  display: grid; grid-template-columns: repeat(4, 1fr); gap: 0; margin: 0;
  padding: 0.85rem 1.35rem; list-style: none; border-bottom: 2px solid var(--panel-inset-border);
}
.feedback-progress li { position: relative; display: flex; align-items: center; gap: 0.42rem; color: var(--panel-dim); }
.feedback-progress li:not(:last-child)::after {
  content: ""; position: absolute; left: calc(50% + 20px); right: 8px; top: 50%;
  height: 2px; background: var(--panel-inset-border);
}
.feedback-progress li.complete:not(:last-child)::after { background: var(--primary); }
.feedback-progress i {
  position: relative; z-index: 1; display: grid; place-items: center; width: 24px; height: 24px;
  border: 2px solid var(--panel-inset-border); border-radius: 50%; background: var(--feedback-bg);
  color: inherit; font-size: 0.68rem; font-style: normal; font-weight: 850;
}
.feedback-progress li.active, .feedback-progress li.complete { color: var(--panel-text); }
.feedback-progress li.active i, .feedback-progress li.complete i { border-color: var(--primary); }
.feedback-progress li.complete i { background: var(--primary); }
.feedback-progress span { position: relative; z-index: 1; background: var(--feedback-bg); padding-right: 0.4rem; font-size: 0.69rem; font-weight: 750; }
.feedback-wizard-step { display: grid; align-content: start; gap: 0.75rem; min-height: 330px; padding: 1.25rem 1.35rem 1rem; }
.feedback-wizard-step h3 { margin: -0.25rem 0 0; font-size: 1.25rem; }
.feedback-wizard-step h3:focus { outline: none; }
.feedback-wizard-step > p { margin: -0.25rem 0 0.2rem; color: var(--panel-muted); font-size: 0.78rem; line-height: 1.5; }
.feedback-kind-choices { display: grid; gap: 0.55rem; }
.feedback-kind-choices button {
  display: grid; grid-template-columns: 42px 1fr max-content; align-items: center; gap: 0.8rem;
  width: 100%; min-height: 70px; padding: 0.65rem 0.85rem; text-align: left;
  border: 2px solid var(--panel-inset-border); border-radius: 7px;
  background: var(--panel-inset); color: var(--panel-text); cursor: pointer;
}
.feedback-kind-choices button:hover { background: var(--panel-inset); border-color: var(--panel-border); }
.feedback-kind-choices button.active { background: var(--panel-inset); border-color: var(--primary); }
.feedback-kind-choices img { width: 42px; height: 42px; object-fit: contain; }
.feedback-kind-choices span, .feedback-topic-choices span { display: grid; gap: 0.18rem; }
.feedback-kind-choices b, .feedback-topic-choices b { font-size: 0.84rem; }
.feedback-kind-choices small, .feedback-topic-choices small { color: var(--panel-muted); font-size: 0.7rem; line-height: 1.35; }
.feedback-kind-choices button > i { color: var(--panel-dim); font-style: normal; font-size: 1.1rem; }
.feedback-reward-preview {
  display: grid; justify-items: center; gap: 0.55rem;
  margin-top: 0.2rem; padding: 0.75rem 0.4rem; border-top: 2px solid var(--panel-inset-border);
  border-bottom: 2px solid var(--panel-inset-border);
}
.feedback-reward-preview > strong { color: var(--gold); font-size: 0.78rem; text-align: center; }
.feedback-reward-preview > small { color: var(--panel-muted); font-size: 0.65rem; line-height: 1.35; text-align: center; }
.feedback-preview-carousel { width: 100%; display: grid; grid-template-columns: 26px minmax(0, 1fr) 26px; align-items: center; gap: 0.35rem; }
.feedback-preview-carousel > button {
  width: 26px; height: 38px; padding: 0; border: none; background: transparent;
  color: var(--panel-muted); font-size: 1.1rem; cursor: pointer;
}
.feedback-preview-carousel > button:hover { background: transparent; color: var(--panel-text); }
.feedback-preview-track { display: flex; justify-content: flex-start; gap: 0.8rem; overflow-x: auto; scrollbar-width: none; }
.feedback-preview-track::-webkit-scrollbar { display: none; }
.feedback-preview-item { flex: 0 0 88px; height: 74px; display: grid; place-items: center; }
.feedback-preview-item.is-banner { flex-basis: 138px; }
.feedback-preview-item > img, .feedback-preview-item > .feedback-reward-fallback { width: 72px; height: 72px; object-fit: contain; }
.feedback-preview-item.is-banner > img { width: 132px; height: 72px; }
.feedback-reward-fallback { display: grid; place-items: center; color: var(--gold); font-size: 0.6rem; font-weight: 850; }
.feedback-choice-label, .feedback-area-field > span, .feedback-message-field > span,
.feedback-email-field > span, .feedback-reward-head > span { color: var(--panel-text); font-size: 0.76rem; font-weight: 850; }
.feedback-area-field, .feedback-message-field, .feedback-email-field { display: grid; gap: 0.36rem; }
.feedback-area-field select, .feedback-message-field textarea, .feedback-email-field input {
  width: 100%; max-width: none; margin: 0; border: 2px solid var(--panel-inset-border);
  border-radius: 7px; background: var(--panel-inset); color: var(--panel-text);
  padding: 0.64rem 0.72rem; font: inherit; font-size: 0.8rem;
}
.feedback-area-field select:focus, .feedback-message-field textarea:focus, .feedback-email-field input:focus {
  outline: none; border-color: var(--primary);
}
.feedback-area-field small { color: var(--panel-dim); font-size: 0.66rem; }
.feedback-area-field code { color: var(--panel-muted); }
.feedback-topic-choices { display: grid; grid-template-columns: 1fr 1fr; gap: 0.45rem; }
.feedback-topic-choices button {
  display: grid; grid-template-columns: 1fr 22px; align-items: center; gap: 0.45rem;
  min-height: 72px; padding: 0.55rem 0.65rem; text-align: left;
  border: 2px solid var(--panel-inset-border); border-radius: 7px;
  background: var(--panel-inset); color: var(--panel-text); cursor: pointer;
}
.feedback-topic-choices button.has-icon { grid-template-columns: 56px 1fr 22px; }
.feedback-topic-choices button > img { width: 56px; height: 56px; object-fit: contain; }
.feedback-topic-choices button:hover { background: var(--panel-inset); border-color: var(--panel-border); }
.feedback-topic-choices button.active { background: var(--panel-inset); border-color: var(--primary); }
.feedback-topic-choices button > i { display: grid; place-items: center; color: var(--primary); font-style: normal; font-weight: 900; }
.feedback-topic-choices.is-bug { grid-template-columns: 1fr; gap: 0.3rem; }
.feedback-topic-choices.is-bug .feedback-bug-topic {
  grid-template-columns: 16px 1fr; min-height: 38px; padding: 0.38rem 0.6rem;
  border-color: var(--panel-inset-border); text-align: left;
}
.feedback-topic-choices.is-bug .feedback-bug-topic > i {
  position: relative; width: 14px; height: 14px; border: 2px solid var(--panel-muted);
  border-radius: 50%; color: transparent;
}
.feedback-topic-choices.is-bug .feedback-bug-topic.active > i { border-color: var(--primary); }
.feedback-topic-choices.is-bug .feedback-bug-topic.active > i::after {
  content: ""; position: absolute; inset: 2px; border-radius: 50%; background: var(--primary);
}
.feedback-topic-choices.is-bug .feedback-bug-topic > b { font-size: 0.74rem; }
.feedback-message-topic { display: grid; grid-template-columns: 64px 1fr max-content; align-items: center; gap: 0.7rem; }
.feedback-message-topic > img { width: 64px; height: 64px; object-fit: contain; }
.feedback-message-topic > div { display: grid; gap: 0.2rem; }
.feedback-message-topic h3, .feedback-message-topic p { margin: 0; }
.feedback-message-topic p { color: var(--panel-muted); font-size: 0.75rem; line-height: 1.4; }
.feedback-message-topic > small { color: var(--panel-dim); font-size: 0.66rem; font-weight: 750; }
.feedback-message-field { position: relative; }
.feedback-message-field textarea { min-height: 150px; resize: vertical; padding-bottom: 1.35rem; }
.feedback-message-field > small { position: absolute; right: 0.6rem; bottom: 0.42rem; color: var(--panel-dim); font-size: 0.66rem; }
.feedback-upload {
  display: flex; align-items: center; justify-content: space-between; gap: 0.8rem;
  padding: 0.65rem 0; border-top: 2px solid var(--panel-inset-border); border-bottom: 2px solid var(--panel-inset-border);
}
.feedback-upload > div { display: flex; align-items: center; gap: 0.55rem; }
.feedback-upload > div > img { width: 30px; height: 30px; object-fit: contain; }
.feedback-upload > div span, .feedback-file-ready { display: grid; gap: 0.1rem; }
.feedback-upload b { font-size: 0.75rem; }
.feedback-upload b i { color: var(--panel-dim); font-size: 0.65rem; font-style: normal; font-weight: 650; }
.feedback-upload small { color: var(--panel-dim); font-size: 0.64rem; }
.feedback-upload > label { cursor: pointer; }
.feedback-upload > label input { position: fixed; left: -10000px; width: 1px; height: 1px; }
.feedback-upload > label > span, .feedback-file-ready button {
  display: inline-flex; min-height: 31px; align-items: center; padding: 0.28rem 0.62rem;
  border: 2px solid var(--panel-inset-border); border-radius: 6px; background: var(--panel-inset);
  color: var(--panel-text); font-size: 0.7rem; font-weight: 800; cursor: pointer;
}
.feedback-upload > label:hover > span { border-color: var(--panel-border); }
.feedback-file-ready { grid-template-columns: minmax(0, 1fr) max-content; max-width: 270px; }
.feedback-file-ready b, .feedback-file-ready small { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.feedback-file-ready button { grid-column: 2; grid-row: 1 / span 2; min-height: 28px; padding: 0 0.5rem; }
.feedback-file-ready button:hover { background: var(--panel-inset); border-color: var(--loss); }
.feedback-wizard .feedback-safety, .feedback-wizard .feedback-reward-note, .feedback-wizard .feedback-legal {
  margin: -0.35rem 0 0; color: var(--panel-dim); font-size: 0.66rem; line-height: 1.45;
}
.feedback-reward-head { display: flex; justify-content: space-between; gap: 0.8rem; }
.feedback-reward-head small { color: var(--panel-dim); font-size: 0.66rem; }
.feedback-reward-carousel { display: grid; grid-template-columns: 30px minmax(0, 1fr) 30px; align-items: center; gap: 0.4rem; }
.feedback-reward-track { display: flex; gap: 0.45rem; overflow-x: auto; scrollbar-width: thin; scroll-snap-type: x proximity; padding: 0.15rem; }
.feedback-reward-choice {
  flex: 0 0 105px; min-height: 96px; display: grid; place-items: center; align-content: center;
  gap: 0.3rem; padding: 0.5rem; border: 2px solid var(--panel-inset-border); border-radius: 7px;
  background: var(--panel-inset); color: var(--panel-muted); text-align: center; cursor: pointer; scroll-snap-align: start;
}
.feedback-reward-choice.is-banner { flex-basis: 138px; }
.feedback-reward-choice.active { border-color: var(--primary); color: var(--panel-text); }
.feedback-reward-choice.disabled { opacity: 0.42; cursor: not-allowed; }
.feedback-reward-choice input { position: fixed; left: -10000px; width: 1px; height: 1px; }
.feedback-reward-choice img, .feedback-reward-choice .feedback-reward-fallback { width: 58px; height: 58px; object-fit: contain; }
.feedback-reward-choice.is-banner img { width: 92px; height: 58px; }
.feedback-reward-choice span { font-size: 0.65rem; font-weight: 750; line-height: 1.25; }
.feedback-reward-choice.none { align-content: center; }
.feedback-reward-arrow {
  width: 30px; height: 44px; padding: 0; border: 2px solid var(--panel-inset-border);
  border-radius: 6px; background: transparent; color: var(--panel-muted); font-size: 1.25rem; cursor: pointer;
}
.feedback-reward-arrow:hover { background: transparent; color: var(--panel-text); border-color: var(--panel-border); }
.feedback-no-rewards { padding: 0.65rem; border: 2px solid var(--panel-inset-border); color: var(--panel-muted); font-size: 0.72rem; }
.feedback-review { display: grid; grid-template-columns: max-content 1fr; gap: 0.18rem 0.7rem; margin: 0; padding-top: 0.5rem; border-top: 2px solid var(--panel-inset-border); }
.feedback-review span { color: var(--panel-dim); font-size: 0.66rem; }
.feedback-review b { color: var(--panel-muted); font-size: 0.68rem; }
.feedback-wizard .feedback-legal { margin: 0; }
.feedback-wizard .feedback-legal a { color: var(--gold); }
.feedback-wizard-actions {
  display: flex; align-items: center; justify-content: space-between; gap: 0.8rem;
  min-height: 62px; padding: 0.75rem 1.35rem; border-top: 2px solid var(--panel-inset-border);
}
.feedback-back, .feedback-next {
  min-height: 36px; padding: 0.38rem 0.9rem; border: 2px solid var(--panel-inset-border);
  border-radius: 6px; background: transparent; color: var(--panel-muted); font: inherit; font-size: 0.76rem; font-weight: 850; cursor: pointer;
}
.feedback-back:hover { background: transparent; color: var(--panel-text); border-color: var(--panel-border); }
.feedback-next { border-color: var(--primary); background: var(--primary); color: var(--text); }
.feedback-next:hover { background: var(--primary-d); border-color: var(--primary-d); }
.feedback-next:disabled { opacity: 0.5; cursor: wait; }
.feedback-wizard > .feedback-status { min-height: 1rem; margin: -0.15rem 1.35rem 0; color: var(--panel-muted); font-size: 0.7rem; }
.feedback-wizard > .feedback-status.is-error { color: var(--loss); }
.feedback-website { position: fixed; left: -10000px; width: 1px; height: 1px; overflow: hidden; }
.feedback-leave-confirm {
  position: absolute; inset: 0; z-index: 8; display: grid; place-items: center;
  padding: 1rem; background: var(--feedback-backdrop);
}
.feedback-leave-confirm[hidden] { display: none; }
.feedback-leave-confirm > div {
  width: min(360px, 100%); padding: 1.1rem; border: 2px solid var(--panel-border);
  border-radius: 7px; background: var(--feedback-bg); box-shadow: var(--panel-shadow);
}
.feedback-leave-confirm h3, .feedback-leave-confirm p { margin: 0; }
.feedback-leave-confirm p { margin-top: 0.35rem; color: var(--panel-muted); font-size: 0.76rem; }
.feedback-leave-confirm > div > div { display: flex; justify-content: flex-end; gap: 0.5rem; margin-top: 1rem; }
.feedback-leave-confirm button {
  min-height: 34px; padding: 0.35rem 0.7rem; border: 2px solid var(--panel-inset-border);
  border-radius: 6px; background: transparent; color: var(--panel-text); font: inherit; font-size: 0.72rem; font-weight: 800; cursor: pointer;
}
.feedback-leave-confirm button:hover { background: transparent; border-color: var(--panel-border); }
.feedback-leave-confirm [data-feedback-discard] { border-color: var(--loss); color: var(--loss); }
.feedback-success > img { width: 52px; height: 52px; object-fit: contain; }

@keyframes feedbackLeaveForward { to { opacity: 0; transform: translateX(-24px); } }
@keyframes feedbackLeaveBackward { to { opacity: 0; transform: translateX(24px); } }
@keyframes feedbackEnterForward { from { opacity: 0; transform: translateX(24px); } }
@keyframes feedbackEnterBackward { from { opacity: 0; transform: translateX(-24px); } }
@keyframes feedbackItemEnter { from { opacity: 0; transform: translateX(8px); } }
.feedback-wizard-step.is-leaving-forward { animation: feedbackLeaveForward 0.15s ease both; }
.feedback-wizard-step.is-leaving-backward { animation: feedbackLeaveBackward 0.15s ease both; }
.feedback-wizard-step.is-entering-forward { animation: feedbackEnterForward 0.22s ease both; }
.feedback-wizard-step.is-entering-backward { animation: feedbackEnterBackward 0.22s ease both; }
.feedback-wizard-step.is-entering-forward > * { animation: feedbackItemEnter 0.2s ease both; }
.feedback-wizard-step.is-entering-forward > :nth-child(2) { animation-delay: 0.035s; }
.feedback-wizard-step.is-entering-forward > :nth-child(3) { animation-delay: 0.07s; }
.feedback-wizard-step.is-entering-forward > :nth-child(4) { animation-delay: 0.105s; }

@media (prefers-reduced-motion: reduce) {
  .feedback-wizard-step[class*="is-entering-"], .feedback-wizard-step[class*="is-leaving-"] { animation: none; }
  .feedback-wizard-step.is-entering-forward > * { animation: none; }
}

@media (max-width: 620px) {
  .modal-box:has(.feedback-wizard) { width: 96vw; max-width: 96vw; max-height: 96vh; }
  .feedback-progress span { display: none; }
  .feedback-progress li:not(:last-child)::after { left: 28px; right: 4px; }
  .feedback-topic-choices { grid-template-columns: 1fr; }
  .feedback-upload { align-items: flex-start; flex-direction: column; }
  .feedback-reward-preview { align-items: flex-start; flex-direction: column; }
}

/* Trait-Kopf ueber dem Kartenraster (Eliass 04.09.2026). Die Karten dieser Season
   haben keine Stats - der Trait-Effekt ist damit der eigentliche Inhalt und steht
   deshalb direkt ueber den zugehoerigen Karten statt in einem eigenen Abschnitt. */
.mt-trait-guide h4 { display: flex; align-items: center; gap: 0.5rem; flex-wrap: wrap; }
.mt-trait-neu {
  padding: 0.1rem 0.4rem; border-radius: 4px;
  background: var(--primary); color: #fff;
  font-size: 0.62rem; font-weight: 900; letter-spacing: .06em; text-transform: uppercase;
}
/* Die Zahl der Karten in dieser Gruppe - gedaempft, sie ist eine Nebenangabe. */
.mt-trait-anzahl {
  margin-left: auto; color: var(--panel-muted); font-size: 0.8rem; font-weight: 700;
}
/* Zweite Stufe der Boss-Supers. Sie greift erst unter 50 % HP und ist deshalb
   abgesetzt statt im selben Absatz - sonst liest es sich wie ein Effekt. */
.mt-card-stufe2 {
  margin-top: 0.35rem; color: var(--panel-muted); font-size: 0.78rem; line-height: 1.45;
}
.mt-card-stufe2 span {
  display: inline-block; margin-right: 0.35rem; padding: 0.02rem 0.32rem;
  border-radius: 4px; background: rgba(245, 185, 59, 0.16); color: var(--gold);
  font-size: 0.64rem; font-weight: 900; letter-spacing: .05em; text-transform: uppercase;
}

/* Der Trait-Kasten hat zwei Spalten: links die Stufen mit ihren Werten, rechts -
   hinter einem durchgehenden Trennstrich - wofuer der Trait gut ist. Die
   Beschreibung stand vorher als Absatz UEBER dem Kasten und las sich wie eine
   Bildunterschrift; sie gehoert neben die Zahlen, die sie erklaert. Der Strich
   ist eine eigene 1px-Spalte, damit er ueber die volle Hoehe laeuft und nicht je
   Zeile neu ansetzt (Eliass 04.09.2026). */
.mt-trait-kasten {
  display: grid; grid-template-columns: minmax(0, 1fr) 1px minmax(0, 0.85fr);
  align-items: center; gap: 0 1.5rem;
  margin: 0.2rem 0 1.1rem; padding: 0.85rem 1rem;
  border: 1px solid var(--panel-inset-border); border-radius: 10px;
  background: rgba(8, 11, 19, 0.4);
}
/* Traits ohne Stufenliste - der Boss-Trait wirkt je Einheit, nicht ab einer
   Anzahl - haben nichts zu trennen und stehen einspaltig. */
.mt-trait-kasten.ohne-stufen { grid-template-columns: minmax(0, 1fr); }
.mt-trait-kasten.ohne-stufen .mt-trait-trenner { display: none; }

.mt-trait-trenner { align-self: stretch; width: 1px; background: var(--panel-inset-border); }

/* Rechte Spalte: Info-Icon oben, darunter mittig der Text. */
.mt-trait-beschreibung {
  display: grid; justify-items: center; gap: 0.5rem; text-align: center;
}
.mt-trait-info { width: 24px; height: 24px; flex: none; object-fit: contain; opacity: 0.85; }
.mt-trait-beschreibung p {
  margin: 0; max-width: 40ch;
  color: var(--panel-text); font-size: 0.9rem; line-height: 1.5;
}

/* Stufen eines Traits als Plaketten, wie das Spiel sie zeigt (nach Eliass'
   Screenshots vom 04.09.2026): runder Kreis mit dem Trait-Icon, daran eine
   Zaehlerpille "erreicht/naechste". Die letzte Stufe ist der Vollzustand -
   goldener Kreis, weisses Icon, ganz gruene Pille. */
.mt-trait-stufen {
  list-style: none; display: grid; gap: 0.55rem;
  margin: 0; padding: 0;
}
.mt-trait-stufe {
  display: grid; grid-template-columns: 58px minmax(0, 1fr);
  align-items: center; gap: 0.95rem;
}
.mt-trait-stufe p {
  margin: 0; color: var(--panel-text); font-size: 0.88rem; line-height: 1.45;
}

.mt-trait-plakette {
  position: relative; display: grid; place-items: center;
  width: 46px; height: 46px; border-radius: 50%;
  /* Deckender Rand, KEIN halbdurchsichtiges Schwarz: ueber dem goldenen Kreis
     schien sonst das Gelb durch und die Plakette wirkte groesser und unsauber
     (Eliass 04.09.2026). Alle Zustaende tragen denselben Rand. */
  border: 2px solid #14181f;
  background: #5c6270;
}
.mt-trait-plakette img { width: 30px; height: 30px; object-fit: contain; display: block; }
/* Vollzustand: goldener Kreis, gleicher Rand wie die uebrigen. */
.mt-trait-stufe.is-max .mt-trait-plakette {
  background: linear-gradient(180deg, #f7cf5b, #e0a423);
}

/* Die Pille haengt unten rechts halb ueber dem Kreis - wie im Spiel.

   Zur Hoehe: `align-items: center` zentriert die ZEILENBOX, nicht die Ziffern.
   Die Zeilenbox reicht unter die Grundlinie, weil dort Platz fuer Unterlaengen
   liegt - Ziffern haben keine, also sitzt die Tinte in einer zentrierten Box
   immer zu tief. Im Browser gemessen waren es 5px Luft oben gegen 3px unten.
   Deshalb traegt die Pille ihre Hoehe ueber ASYMMETRISCHES Polster (2px oben,
   4px unten) statt ueber `min-height`; damit steht die Tinte mit 3.9px auf
   beiden Seiten wirklich mittig. Die Werte gehoeren zu font-size 0.74rem -
   wer die Schriftgroesse aendert, misst neu. (Eliass 04.09.2026, dritter Anlauf) */
.mt-trait-zaehler {
  position: absolute; right: -18px; bottom: -5px;
  display: inline-flex; align-items: center; justify-content: center;
  padding: 2px 0.4rem 4px; border-radius: 100px;
  background: #0e121a;
  color: #fff; font-size: 0.74rem; font-weight: 800; line-height: 1;
  font-variant-numeric: tabular-nums; letter-spacing: -0.01em;
}
/* Das Gruen ist aus Eliass' Screenshot ausgemessen (#53ff63), nicht geschaetzt -
   der vorherige Wert war deutlich zu blass. */
.mt-trait-zaehler b { color: #53ff63; font-weight: 900; }
.mt-trait-stufe.is-max .mt-trait-zaehler { color: #53ff63; }

/* Schmal: die Beschreibung rutscht unter die Stufen, der Strich legt sich quer.
   Die Plakette bleibt neben ihrem Text - untereinander wuerde die Liste sehr lang. */
@media (max-width: 720px) {
  .mt-trait-kasten { grid-template-columns: minmax(0, 1fr); gap: 0.9rem 0; }
  .mt-trait-trenner { width: 100%; height: 1px; }
  .mt-trait-beschreibung p { max-width: none; }
}

/* Der Blogtext am Seitenende folgte direkt auf die dichte Modifier-Liste und las
   sich dadurch wie deren Fortsetzung (Eliass 05.09.2026). Er braucht einen
   deutlichen Bruch: mehr Luft davor und die Trennlinie weiter oben, damit sie als
   Abschluss des Nachschlageteils wirkt und nicht als Zierde am Kasten. */
#mt-insights-section .panel.seo-guide { margin-top: 7.5rem; }
#mt-insights-section .panel.no-line.seo-guide::before { top: -3.75rem; }

/* ---------- Clash-Royale-Schrift, eine Definition fuer die ganze Seite ----------
   (Eliass 05.09.2026: "das sollten wir klar definieren, dass das fuer die Clash
   Royale Schrift fest sitzt".)

   AM SPIEL GEMESSEN, nicht geschaetzt. An der Ueberschrift "Bronze II" aus seinem
   Screenshot, an den beiden Balken der "II", weil das saubere Rechtecke ohne
   Nachbarbuchstaben sind:

     Versalhoehe der Fuellung   34 px
     Schwarz links / rechts      2 px  (also symmetrisch)
     Schwarz oben                2 px
     Schwarz unten               5 px

   Daraus folgt: eine gleichmaessige Kontur von 2 px und ein harter Schatten, der
   3 px nach UNTEN faellt. Links und rechts sind gleich, es gibt also keinen
   seitlichen Versatz. Beide Masse liegen bei rund 7 % der Versalhoehe, deshalb
   stehen sie hier in `em` und wachsen mit der Schriftgroesse mit.

   Zwei Bausteine, die CSS dafuer hergibt:

   1. `-webkit-text-stroke` zeichnet die Kontur. Sie sitzt MITTIG auf dem
      Buchstabenrand, die Haelfte liegt also unter der Fuellung - deshalb die
      doppelte Breite, damit aussen das gemessene Mass herauskommt. `paint-order`
      legt die Fuellung ueber die Kontur, sonst frisst der Strich duenne Stellen an.
   2. `filter: drop-shadow(... 0 ...)` wirft den Schatten der FERTIGEN Form, also
      samt Kontur. Genau das ist die "Schattenumrandung": ein Schatten mit voller
      Deckkraft und ohne Weichzeichnung. `text-shadow` kann das NICHT - es
      schattiert nur die Fuellung, nicht den Umriss.

   Zum Ausprobieren: /tools/cr-font.html (nur lokal) hat Regler fuer alle Werte und
   gibt das fertige CSS aus. */
.cr-text {
  --cr-fill: #fff;
  --cr-outline: 0.06em;
  --cr-outline-color: #241a12;
  --cr-shadow-x: 0em;
  --cr-shadow-y: 0.09em;
  --cr-shadow-color: rgba(0, 0, 0, 0.9);

  font-family: "Clash Display", sans-serif;
  font-weight: 400;
  color: var(--cr-fill);
  -webkit-text-stroke: calc(var(--cr-outline) * 2) var(--cr-outline-color);
  paint-order: stroke fill;
  filter: drop-shadow(var(--cr-shadow-x) var(--cr-shadow-y) 0 var(--cr-shadow-color));
}

/* ---------- Modifier als Starsteel Road (Eliass 05.09.2026) ----------
   Nach seinem Spiel-Screenshot: Liganame mit Abzeichen, darunter die Plakette mit
   dem Starsteel-Stand, darunter die Modifier dieser Stufe. Alles mittig.
   Vorher stand hier ein flaches Kartenraster mit einem Liga-Etikett - man sah
   dadurch nicht, ab wann man einen Modifier ueberhaupt bekommt. */
.mt-liga-road { display: grid; gap: 2.6rem; justify-items: center; }
.mt-liga { display: grid; justify-items: center; width: 100%; max-width: 680px; }

/* Der Liganame in der Clash-Schrift: weiss, dunkle Kontur, harter Schatten nach
   unten. Die Kontur entsteht aus acht versetzten Schatten statt aus
   `-webkit-text-stroke` - der Strich liegt dort ueber der Fuellung und frisst die
   duennen Stellen der Schrift an. */
/* Schriftbehandlung kommt aus `.cr-text`; hier nur Groesse und Anordnung. */
.mt-liga-name {
  display: flex; align-items: center; justify-content: center; gap: 0.6rem;
  margin: 0 0 0.7rem;
  font-size: clamp(1.5rem, 4.4vw, 2.1rem); line-height: 1;
  text-transform: uppercase; letter-spacing: 0.02em;
}
/* Das Abzeichen darf den Schatten der Schrift nicht mitbekommen. */
.mt-liga-name img { filter: none; }
/* Groesser: das Abzeichen ist das Erkennungszeichen der Stufe (Eliass 05.09.2026). */
.mt-liga-name img { width: 64px; height: 64px; object-fit: contain; flex: none; }

/* Die Plakette: die freigestellte Vorlage als Hintergrund, der Inhalt sitzt darin.
   `background-size: 100% 100%` statt `contain`, damit die Platte mit dem Text
   mitwaechst; die Zacken links und rechts bleiben ueber das Polster frei. */
.mt-liga-steel {
  display: inline-flex; align-items: center; justify-content: center; gap: 0.5rem;
  margin: 0 0 1.1rem; min-width: 260px; min-height: 54px;
  padding: 0.1rem 4.2rem 0.35rem;
  background-repeat: no-repeat; background-position: center; background-size: 100% 100%;
}
.mt-liga-steel.is-bronze { background-image: url("assets/merge-tactics/leagues/starsteel-plate-bronze.png"); }
.mt-liga-steel.is-silber { background-image: url("assets/merge-tactics/leagues/starsteel-plate-silber.png"); }
.mt-liga-steel.is-gold   { background-image: url("assets/merge-tactics/leagues/starsteel-plate-gold.png"); }
.mt-liga-steel img { width: 30px; height: 30px; object-fit: contain; flex: none; }
.mt-liga-steel b { font-size: 1.4rem; line-height: 1; font-variant-numeric: tabular-nums; }

/* Die Modifier der Stufe: zwei nebeneinander, Bild oben, Text darunter, mittig. */
.mt-liga-mods {
  display: grid; grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 1.4rem; width: 100%; justify-items: center;
}
.mt-liga-mod { display: grid; justify-items: center; text-align: center; max-width: 300px; }
/* Der silberne Sechskantrahmen aus dem Spiel liegt um jedes Modifier-Bild.
   Dieselbe Datei nutzt schon der Board-Editor (Eliass 05.09.2026). */
.mt-liga-mod-rahmen {
  position: relative; display: grid; place-items: center; width: 96px; height: 96px;
}
.mt-liga-mod-rahmen::before {
  content: ""; position: absolute; inset: 0; pointer-events: none;
  background: url("assets/merge-tactics/modifier-border.png") center / contain no-repeat;
}
/* Groesse und Versatz sind aus den beiden Bildern gerechnet, nicht geschaetzt.
   Beide Dateien sind 1024x1024, aber keine ist in ihrer Leinwand zentriert:
   die Rahmenoeffnung liegt bei x 243..809 / y 186..820 (Mitte 526/503), das
   Motiv des Icons bei x 225..798 / y 182..839 (Mitte 511/510). Mit 66px sass
   das Icon ausserdem deutlich zu klein in der Oeffnung und schwamm darin
   (Eliass 05.09.2026).

   Bei 97% der Rahmenkante fuellt das Motiv die Oeffnung fast genau aus; der
   Versatz gleicht die unterschiedlichen Bildmitten aus. */
.mt-liga-mod img {
  position: relative; z-index: 1;
  width: 97%; height: 97%; object-fit: contain;
  transform: translate(1.4%, -0.8%);
}
.mt-liga-mod-platzhalter {
  position: relative; z-index: 1;
  display: grid; place-items: center; width: 60px; height: 60px;
  color: var(--muted); font-size: 0.9rem; font-weight: 800;
}
.mt-liga-mod h6 {
  margin: 0.5rem 0 0.15rem; color: #fff;
  font-size: 0.98rem; font-weight: 800; letter-spacing: -0.01em;
}
.mt-liga-mod p { margin: 0; color: var(--panel-text); font-size: 0.87rem; line-height: 1.45; }

@media (max-width: 560px) {
  .mt-liga-mods { grid-template-columns: minmax(0, 1fr); gap: 1.6rem; }
  .mt-liga-name img { width: 52px; height: 52px; }
  .mt-liga-steel { min-width: 210px; padding: 0.1rem 3.4rem 0.3rem; }
  .mt-liga-mod-rahmen { width: 82px; height: 82px; }
}

/* ---------- Orbs als eigenes Kapitel (Eliass 04./05.09.2026) ----------
   Dritter Anlauf. Erst eine Texttabelle (falsch, die Seite lebt von Icons), dann
   Bilder in Kaesten (auch falsch: ein Rahmen um jedes Item zerschneidet die Seite).
   Jetzt ohne jeden Rahmen und ohne Fuellfarbe. Getrennt wird nur durch eine
   Haarlinie zwischen den Eintraegen.

   Die Breite ist begrenzt: ueber die volle Seitenbreite gezogen stand eine
   Belohnung als endlos lange Einzelreihe da, statt als geschlossene Gruppe. */
.mt-orb-gruppe { margin: 0 0 2.2rem; }
.mt-orb-gruppe > h5 {
  margin: 0 0 0.3rem; color: #fff;
  font-size: 1.02rem; font-weight: 800; letter-spacing: -0.01em;
}
.mt-orb-gruppe-text { margin: 0 0 0.9rem; max-width: 70ch; color: var(--muted); font-size: 0.9rem; line-height: 1.55; }

.mt-orb-liste { max-width: 720px; }
.mt-orb-eintrag {
  display: grid; grid-template-columns: 54px minmax(0, 1fr);
  gap: 0 0.9rem; padding: 1.1rem 0;
  border-top: 1px solid var(--panel-inset-border);
}
.mt-orb-eintrag:first-child { border-top: none; padding-top: 0.2rem; }
/* Das Orbbild fuehrt den Eintrag an, es ist das Erkennungszeichen. */
.mt-orb-bild { width: 54px; height: 54px; object-fit: contain; align-self: start; }
.mt-orb-koerper h6 { margin: 0; color: #fff; font-size: 0.98rem; font-weight: 800; }
.mt-orb-herkunft { margin: 0.15rem 0 0; max-width: 62ch; color: var(--muted); font-size: 0.86rem; line-height: 1.45; }

.mt-orb-inhalt { display: grid; gap: 0.5rem; margin-top: 0.85rem; }
/* Beschriftung links, Bilder rechts. Wird es eng, rutscht die Beschriftung darueber. */
.mt-orb-reward {
  display: grid; grid-template-columns: 148px minmax(0, 1fr);
  align-items: center; gap: 0.7rem;
}
.mt-orb-reward-label {
  color: var(--muted); font-size: 0.72rem; font-weight: 800;
  letter-spacing: 0.05em; text-transform: uppercase;
}
/* Alles, was zu einer Belohnung gehoert, steht in dieser einen Zelle nebeneinander. */
.mt-orb-reward-wert { display: flex; align-items: center; flex-wrap: wrap; gap: 0.45rem; min-width: 0; }
.mt-orb-regel { color: var(--panel-text); font-size: 0.9rem; font-weight: 700; }

/* Elixier und Teamgroesse: Icon mit Zahl daneben, wie im Spiel. */
.mt-orb-marke { display: inline-flex; align-items: center; gap: 0.35rem; }
.mt-orb-marke img { width: 24px; height: 24px; object-fit: contain; }
.mt-orb-marke b { color: #fff; font-size: 1rem; font-weight: 900; line-height: 1; }

/* Equipment-Streifen. Ohne Kachelrahmen, nur die Icons nebeneinander. */
.mt-orb-equip-streifen { display: flex; flex-wrap: wrap; gap: 0.35rem; }
.mt-orb-equip-streifen span { display: grid; place-items: center; width: 40px; height: 40px; }
.mt-orb-equip-streifen img { width: 38px; height: 38px; object-fit: contain; }
.mt-orb-equip-streifen i {
  display: grid; place-items: center; width: 38px; height: 38px; border-radius: 8px;
  background: rgba(255, 255, 255, 0.07);
  color: var(--muted); font-size: 0.68rem; font-weight: 800; font-style: normal;
}

/* Modifier-Orbs stehen abgesetzt: sie haben kein eigenes Orb-Gesicht, sondern
   fallen aus Modifiern heraus. Das Modifier-Bild traegt die Zeile und ist deshalb
   deutlich groesser als zuerst gebaut (Eliass 05.09.2026). */
.mt-orb-gruppe-modifier {
  margin-top: 2.6rem; padding-top: 1.6rem;
  border-top: 1px solid var(--panel-inset-border);
}
.mt-orb-modifier-liste { margin: 0; padding: 0; list-style: none; display: grid; gap: 0.9rem; max-width: 720px; }
.mt-orb-modifier-liste li {
  display: grid; grid-template-columns: 64px minmax(0, 1fr);
  align-items: center; gap: 0.9rem;
}
.mt-orb-modifier-liste img { width: 64px; height: 64px; object-fit: contain; }
.mt-orb-modifier-liste i {
  display: grid; place-items: center; width: 64px; height: 64px; border-radius: 12px;
  background: rgba(255, 255, 255, 0.07);
  color: var(--muted); font-size: 0.8rem; font-weight: 800; font-style: normal;
}
.mt-orb-modifier-liste b { color: #fff; font-size: 0.95rem; }
.mt-orb-modifier-liste p { margin: 0.12rem 0 0; color: var(--panel-text); font-size: 0.88rem; line-height: 1.45; }

.mt-orb-hinweis { margin: 1.4rem 0 0; max-width: 70ch; color: var(--muted); font-size: 0.84rem; line-height: 1.5; }

@media (max-width: 640px) {
  .mt-orb-reward { grid-template-columns: minmax(0, 1fr); gap: 0.3rem; }
  .mt-orb-eintrag { grid-template-columns: 44px minmax(0, 1fr); gap: 0 0.7rem; }
  .mt-orb-bild { width: 44px; height: 44px; }
  .mt-orb-modifier-liste li { grid-template-columns: 52px minmax(0, 1fr); }
  .mt-orb-modifier-liste :is(img, i) { width: 52px; height: 52px; }
}

/* Monatsumschalter der Season-Seite (ab Season 11, Eliass 04.09.2026). Season 11
   laeuft drei Monate und tauscht monatlich Supers, Traits, Modifier und Kartenpool -
   ein Schalter fuer die ganze Seite, nicht je Abschnitt. Bei Seasons ohne
   Monatsdaten bleibt er ueber [hidden] weg. */
.mt-season-months {
  /* Mittig im Leerraum zwischen Kapitelnavigation und erstem Abschnitt. `flex` statt
     `inline-flex` plus `width: max-content` und `margin-inline: auto` zentriert
     zuverlaessig, ohne dass der Elternteil `text-align: center` braucht. */
  /* Der Abstand nach unten muss GEGEN mehrere Posten anlaufen, die alle unter dem
     Schalter liegen: 38px bis zur Kante des ersten Kapitels, dessen 40px Innenabstand
     und noch der Abstand der Ueberschrift. Gemessen waren es 99px bis zum Wort
     "Ruler Quests" - deutlich zu viel (Eliass zweimal gemeldet, 04./05.09.2026).
     -5.2rem (83px) zieht das zusammen. Der obere Wert ist danach 1.1rem und nicht
     mehr 2.4rem: unter dem Schalter beginnt das Kapitel bereits, seine sichtbare
     Kante liegt nur ~18px tiefer. Mit 2.4rem oben stand der Schalter sichtbar
     schief im Zwischenraum (Eliass 05.09.2026). Gemessen, nicht geschaetzt. */
  display: flex; width: max-content; margin: 1.1rem auto -5.2rem;
  gap: 2px; padding: 3px;
  border: 1px solid var(--panel-inset-border); border-radius: 9px;
  background: rgba(8, 11, 19, 0.46);
}
.mt-season-months button {
  all: unset; box-sizing: border-box; cursor: pointer;
  display: inline-flex; align-items: baseline; gap: 0.3rem;
  min-height: 34px; padding: 0.3rem 0.8rem; border-radius: 6px;
  color: var(--panel-muted); font-size: 0.82rem; font-weight: 700;
  transition: background-color .14s ease, color .14s ease;
}
.mt-season-months button:hover:not([disabled]) { color: var(--panel-text); }
.mt-season-months button[aria-pressed="true"] { background: var(--primary); color: #fff; }
/* November steht sichtbar, aber gesperrt - das Spiel kuendigt ihn erst Ende Oktober
   an. Ihn wegzulassen liesse die Season kuerzer wirken, als sie ist. */
.mt-season-months button[disabled] { cursor: default; opacity: 0.42; }
.mt-season-months button small {
  font-size: 0.62rem; font-weight: 800; letter-spacing: .04em; text-transform: uppercase;
}
.mt-season-months button:focus-visible { outline: 2px solid var(--primary); outline-offset: 2px; }

/* Auf dem Handy fehlt dem Schalter unten die Luft. Die -5.2rem oben sind am Desktop
   gemessen, wo das Kapitel darunter 2.5rem Innenabstand hat; mobil sind es nur 2.2rem
   (siehe `.mt-insights-chapter` im 820px-Block), also rutscht dessen sichtbare Kante
   weiter hoch. Gemessen hing die Pille dadurch 48px im Kapitel statt der 19px vom
   Desktop und stiess unten an dessen Kante an, statt darueber zu schweben
   (Eliass 06.09.2026).
   Diese Regel MUSS hinter der Grundregel stehen: beide sind gleich spezifisch, also
   entscheidet die Reihenfolge. Im 820px-Block weiter oben in der Datei verlor sie
   still gegen die Grundregel hier - derselbe Stolperstein wie beim Season-11-Emote.
   Der Abstand nach OBEN bleibt unangetastet, der ist bereits zweimal nachgezogen. */
@media (max-width: 820px) {
  .mt-season-months { margin-bottom: -3.4rem; }
}
/* Die Liga, in der ein Modifier im gewaehlten Monat zur Wahl steht. Steht neben der
   Kategorie in derselben Zeile, damit die Karte nicht hoeher wird. */
.mt-modifier-league {
  color: var(--gold); font-weight: 700;
}

/* ============================================================================
   Zwischenstufe: Desktop-Navigation auf schmalen FENSTERN
   ----------------------------------------------------------------------------
   Bis zum 03.09.2026 sprang die Seite bei 1100px direkt auf die Mobil-Navigation.
   Das war keine Gestaltungsentscheidung, sondern das Ende der Fahnenstange: die
   Reiterreihe braucht einzeilig 826px (en), dazu Marke (106px), die Knoepfe rechts
   (184px) und 40px Polster - zusammen 1156px. Zwischen 1101 und 1156px standen die
   drei Bloecke deshalb schon auf 0px Abstand und die Reihe 44px links neben der
   Mitte. Wer am Rechner ein Fenster nur zur Haelfte aufzieht, bekam damit eine
   Bedienung, die fuer Daumen gebaut ist - obwohl da eine Maus dranhaengt
   (Eliass 03.09.2026).

   Statt frueher umzuschalten wird die Reihe schmaler gesetzt:
   - Beschriftungen brechen auf das laengste Wort um (`width: min-content`), aus
     "Merge Tactics" wird "Merge / Tactics". Die Leiste bleibt dabei 58px hoch,
     zwei Zeilen a 16,1px sind 32px - das passt ohne Zuwachs.
   - Der Schriftzug faellt weg, das Logo bleibt der Weg nach Hause.
   - "Feedback" wird zum reinen Icon. Sonst ist die rechte Spalte breiter als die
     linke und die Reihe verliert ihre Mitte, lange bevor der Platz ausgeht.

   Auf Englisch misst die Reihe damit 657 statt 826px und steht bis 940px exakt
   fenstermittig. Darunter rutscht sie durch `1fr auto 1fr` von allein nach links,
   der Abstand zwischen Logo und Home schrumpft mit: 59px bei 900, 39px bei 880.
   Bei 840px stiesse das Logo ans Haus-Icon, 880px ist also die Schwelle mit noch
   sichtbarem Rest-Abstand (Eliass 03.09.2026).

   ACHTUNG, das ist der Grund fuer die Sprachgruppen weiter unten: 880px gilt NUR
   fuer Englisch. Gemessen mit den echten Katalogen (03.09.2026), Reihe umgebrochen:
     ar 627 | ko/zh-CN 640 | id 648 | en 657 | pl 711 | fr 717 | tr 725 | ru 739
     it 750 | uk 761 | es-419 766 | pt-BR 768 | de 850 | ja 923
   Deutsch schrumpft kaum, weil "Gratisbelohnungen" EIN Wort ist und nicht umbricht.
   Japanisch und Chinesisch brechen ueberhaupt nicht um - CJK-Text hat hier keine
   Trennstelle. Eine einzige Schwelle fuer alle 15 Sprachen muesste sich deshalb an
   Japanisch orientieren (1148px) und waere praktisch wertlos.

   Die Obergrenze 1160px ist der Punkt, ab dem auf Englisch alles einzeilig passt.
   ========================================================================== */

/* Der Umbruch selbst gilt ohne Sprachunterschied. Unterhalb der jeweiligen
   Sprachschwelle ist `#tabs` ohnehin ausgeblendet, dort laeuft die Regel ins Leere. */
@media (max-width: 1160px) {
  /* `width: min-content` = so breit wie das laengste Wort, der Rest bricht um.
     Es braucht das eigene Element aus index.html: ein blosser Textknoten in einem
     Flex-Container ist kein ansprechbares Ziel.
     Gebrochen wird auch an weichen Trennstellen, daher steht dort
     "Leader&shy;boards" - der Strich erscheint nur im Umbruch, oben bei voller
     Breite steht "Leaderboards" am Stueck. Das Trennzeichen darf NICHT in die
     Uebersetzungskataloge geraten, siehe translateTextNode() in i18n-runtime.mjs.
     `word-break: keep-all` ist eine Absicherung fuer andere Browser: Chrome bricht
     CJK-Beschriftungen hier von sich aus nicht auf, andere Engines duerfen daraus
     aber keine Kette einzelner Zeichen machen. */
  .nav-item .nav-link .nav-label {
    display: block; width: min-content; text-align: center;
    line-height: 1.12; white-space: normal; hyphens: manual; word-break: keep-all;
  }
}

/* Kompakte Kopfzeile oberhalb aller Sprachschwellen. Darunter uebernehmen die
   Sprachbloecke weiter unten, die dasselbe zusaetzlich zur Reiterreihe regeln. */
@media (min-width: 1101px) and (max-width: 1160px) {
  .brand span { display: none; }
  .header-feedback span { display: none; }
}

/* ============================================================================
   Untere Hauptnavigation (nur schmale Bildschirme)
   ----------------------------------------------------------------------------
   Umschaltpunkt 1100px. Sprachen, deren Reiterreihe umgebrochen frueher passt,
   holen sich die Desktop-Kopfzeile im Block "Sprachgruppen" darunter zurueck -
   dieser Block bleibt die sichere Grundeinstellung fuer alles Uebrige.

   iOS-Safari legt seine Adressleiste unten ab. `env(safe-area-inset-bottom)`
   liefert genau die Hoehe, die dort (und beim Home-Indicator) frei bleiben muss.
   Ohne diesen Zuschlag sitzt die letzte Reihe unter der Systemleiste und ist
   nicht antippbar. Der Fallback 0px greift auf Geraeten ohne solche Zone.
   ========================================================================== */
@media (max-width: 1100px) {
  /* Die Reiterreihe der Kopfzeile ist der Grund fuer das seitliche Wegscrollen. */
  #tabs { display: none; }

  /* Ohne die Reiterreihe bleiben nur zwei Elemente im Raster. Die Spaltenvorgabe
     `1fr auto 1fr` gilt aber weiter, deshalb landen die Knoepfe in der MITTLEREN
     Spalte und kleben am Schriftzug. Auf zwei Spalten reduzieren und die Knoepfe
     ausdruecklich nach rechts setzen. */
  .nav-inner {
    grid-template-columns: 1fr auto;
    height: 52px; padding: 0 0.9rem;
  }
  .header-actions { justify-self: end; }

  /* "Tryaz Gaming" brach auf schmalen Displays in zwei Zeilen um und trieb damit die
     Kopfzeile auseinander. Etwas kleiner und ausdruecklich einzeilig. */
  .brand .logo { width: 26px; height: 26px; }
  .brand span { margin-left: 0.45rem; font-size: 0.95rem; white-space: nowrap; }

  .mobile-nav {
    position: fixed; inset: auto 0 0 0; z-index: 60;
    display: grid; grid-template-columns: repeat(5, 1fr);
    background: rgba(9, 13, 22, 0.96);
    border-top: 1px solid var(--panel-inset-border, rgba(255, 255, 255, 0.1));
    backdrop-filter: blur(12px);
    padding-bottom: env(safe-area-inset-bottom, 0px);
  }

  .mobile-nav-item {
    display: flex; flex-direction: column; align-items: center; justify-content: center;
    gap: 0.16rem; min-height: 56px; padding: 0.4rem 0.2rem;
    border: 0; background: none; cursor: pointer;
    color: rgba(226, 233, 248, 0.62);
    font: inherit; font-size: 0.62rem; letter-spacing: 0.02em;
    text-decoration: none; -webkit-tap-highlight-color: transparent;
  }
  .mobile-nav-item span { line-height: 1; }

  /* Leichte Trennlinie zwischen den Feldern. Bewusst als Pseudo-Element auf 58%
     Hoehe statt als durchgehender border: Eine Linie von Kante zu Kante zerschneidet
     die Leiste optisch in fuenf Kaesten, die kurze Linie trennt nur die Tippziele. */
  .mobile-nav-item + .mobile-nav-item::before {
    content: ""; position: absolute; left: 0; top: 21%;
    width: 1px; height: 58%;
    background: rgba(255, 255, 255, 0.1);
  }
  .mobile-nav-item { position: relative; }
  .mobile-nav-item.active, .mobile-nav-item[aria-expanded="true"] { color: #fff; }
  .mobile-nav-item.active svg { color: var(--primary); }

  /* Damit der Fussbereich mit Impressum ueber der Leiste endet und nicht darunter
     verschwindet. Ohne diesen Abstand waere der letzte Inhalt dauerhaft verdeckt. */
  body { padding-bottom: calc(56px + env(safe-area-inset-bottom, 0px)); }

  /* Bewusst UNTER der Leiste (z-index 60): So bleibt "More" sichtbar und antippbar,
     das Blatt laesst sich also mit demselben Feld wieder schliessen, mit dem es
     geoeffnet wurde. Das Blatt endet dank padding-bottom oberhalb der Leiste. */
  /* Die globale Regel `button:hover { background: var(--primary-d) }` ist mit 0-1-1
     spezifischer als eine einzelne Klasse und faerbt sonst jeden dieser Knoepfe
     blau, sobald ein Finger ihn beruehrt. Deshalb hier ausdruecklich zuruecksetzen -
     inklusive der Groessenangaben aus derselben Regel. */
  .mobile-nav-item, .mobile-nav-item:hover, .mobile-nav-item:focus,
  .ms-toggle, .ms-toggle:hover, .ms-toggle:focus,
  .mobile-sheet-close, .mobile-sheet-close:hover, .mobile-sheet-close:focus {
    background: none; border-radius: 0; font-weight: 400;
  }
  .ms-toggle, .ms-toggle:hover { padding: 0; }
  .mobile-sheet-close, .mobile-sheet-close:hover { padding: 0.3rem; }
  /* Tastaturbedienung bleibt sichtbar - nur der Maus-/Tippzustand wird ruhig. */
  .mobile-nav-item:focus-visible, .ms-toggle:focus-visible, .mobile-sheet-close:focus-visible {
    outline: 2px solid var(--primary); outline-offset: -3px;
  }

  .mobile-sheet { position: fixed; inset: 0; z-index: 50; }
  .mobile-sheet[hidden] { display: none; }
  /* Das Blatt faehrt von unten ein und der Hintergrund blendet dazu auf. Die Kurve
     ist am Ende flach: Die Bewegung kommt schnell in Gang und laeuft weich aus,
     statt gleichmaessig zu gleiten - das wirkt auf dem Handy weniger traege.
     Geschlossen wird etwas schneller als geoeffnet, weil eine Bewegung, die man
     schon kennt, nicht noch einmal vorgefuehrt werden muss. */
  .mobile-sheet-backdrop {
    position: absolute; inset: 0; background: rgba(2, 5, 11, 0.62);
    opacity: 0; transition: opacity .16s ease;
  }
  .mobile-sheet.is-open .mobile-sheet-backdrop { opacity: 1; transition-duration: .22s; }
  .mobile-sheet-panel {
    position: absolute; inset: auto 0 0 0;
    max-height: 78vh; display: flex; flex-direction: column;
    background: var(--panel, #0d1420);
    border-top: 1px solid var(--panel-inset-border, rgba(255, 255, 255, 0.12));
    border-radius: 14px 14px 0 0;
    padding-bottom: calc(56px + env(safe-area-inset-bottom, 0px));
    transform: translateY(100%);
    transition: transform .18s cubic-bezier(.4, 0, 1, 1);
    will-change: transform;
  }
  .mobile-sheet.is-open .mobile-sheet-panel {
    transform: translateY(0);
    transition: transform .26s cubic-bezier(.32, .72, 0, 1);
  }

  /* Wer Bewegung im System abgestellt hat, bekommt sie auch hier nicht. Das Blatt
     erscheint dann sofort - die Funktion bleibt identisch. */
  @media (prefers-reduced-motion: reduce) {
    .mobile-sheet-backdrop, .mobile-sheet-panel,
    .mobile-sheet.is-open .mobile-sheet-backdrop, .mobile-sheet.is-open .mobile-sheet-panel {
      transition: none;
    }
  }
  .mobile-sheet-head {
    display: flex; align-items: center; justify-content: space-between;
    padding: 0.9rem 1rem 0.6rem; font-weight: 700; color: #fff;
  }
  .mobile-sheet-close { border: 0; background: none; color: rgba(226, 233, 248, 0.7); cursor: pointer; padding: 0.3rem; }
  .mobile-sheet-body { overflow-y: auto; display: flex; flex-direction: column; }

  /* Eine Oberkategorie. Bereiche mit Unterpunkten sind bewusst zweigeteilt: die
     Zeile fuehrt zur Hauptseite, der Pfeil rechts klappt nur auf. Waere die ganze
     Zeile ein Umschalter, kaeme man nicht mehr direkt auf die Uebersichtsseite. */
  .ms-row {
    display: flex; align-items: center; gap: 0.7rem;
    padding: 0.8rem 1rem; color: rgba(226, 233, 248, 0.92);
    text-decoration: none; border-top: 1px solid rgba(255, 255, 255, 0.05);
  }
  .ms-row svg { flex: none; opacity: 0.75; }
  .ms-row.active { color: #fff; }
  .ms-row.active svg { opacity: 1; color: var(--primary); }

  .ms-group { position: relative; display: flex; flex-wrap: wrap; }
  .ms-group .ms-row { flex: 1; min-width: 0; }
  .ms-toggle {
    flex: none; width: 56px; border: 0; background: none; cursor: pointer;
    color: rgba(226, 233, 248, 0.55);
    border-top: 1px solid rgba(255, 255, 255, 0.05);
    -webkit-tap-highlight-color: transparent;
  }
  .ms-toggle svg { transition: transform .18s ease; }
  .ms-toggle[aria-expanded="true"] svg { transform: rotate(180deg); }
  .ms-toggle[aria-expanded="true"] { color: #fff; }

  .ms-sub { flex: 0 0 100%; display: flex; flex-direction: column; background: rgba(0, 0, 0, 0.22); }
  .ms-sub[hidden] { display: none; }
  .ms-sub a {
    padding: 0.66rem 1rem 0.66rem 2.9rem;
    color: rgba(226, 233, 248, 0.74); font-size: 0.9rem;
    text-decoration: none; border-top: 1px solid rgba(255, 255, 255, 0.04);
  }
  .mobile-sheet-legal {
    display: flex; flex-wrap: wrap; gap: 0.2rem 1.1rem;
    padding: 0.8rem 1rem; border-top: 1px solid rgba(255, 255, 255, 0.08);
  }
  .mobile-sheet-legal a { color: var(--panel-muted, rgba(226, 233, 248, 0.6)); font-size: 0.78rem; text-decoration: none; }

  /* Der dekorative Hintergrundschweif ragte ueber den rechten Rand hinaus und
     erzeugte denselben seitlichen Scrollweg wie die Reiterreihe. */
  .home-galaxy { overflow: hidden; }

  /* Unterreiter (z. B. auf der Player-Seite) sind zusammen breiter als ein
     schmales Display. Sie werden seitlich scrollbar statt umgebrochen: Eine
     Reiterreihe, die in zwei Zeilen umspringt, verliert ihre Leserichtung.
     Der negative Rand laesst sie bis an den Bildschirmrand laufen, damit
     sichtbar ist, dass dort weitergescrollt werden kann. */
  .subtabs {
    flex-wrap: nowrap; overflow-x: auto; scrollbar-width: none;
    margin-inline: -1rem; padding-inline: 1rem;
    overscroll-behavior-x: contain;
  }
  .subtabs::-webkit-scrollbar { display: none; }
  .subtabs :is(a, button) { flex: 0 0 auto; }

  /* Die beiden Einwilligungsknoepfe stehen unter 560px nebeneinander und passen
     auf 320px nicht mehr. Untereinander bleiben beide gleich gross und gut
     treffbar - die Ablehnung darf dabei nicht kleiner werden als die Zustimmung. */
  .cookie-bar-actions { grid-template-columns: 1fr; }
}

/* Ab 1101px bleibt alles wie bisher: keine untere Leiste, kein Sheet.
   Der Wert ist gemessen, nicht geschaetzt: Die Kopfzeile passt auf Englisch erst ab
   1160px vollstaendig. Die Reiterreihe selbst braucht je nach Sprache 826px (en) bis
   943px (pt-BR) - ein einzelner Umschaltpunkt kann also nie fuer alle 15 Sprachen
   genau stimmen. Deshalb zweistufig: unter 1100px die untere Leiste, darueber die
   Reiterreihe mit Sicherheitsnetz (siehe unten). */
/* ============================================================================
   Sprachgruppen: ab wann die Kopfnavigation wirklich nicht mehr passt
   ----------------------------------------------------------------------------
   Der Mobilblock darueber schaltet bei 1100px um - das ist die sichere
   Grundeinstellung und gilt fuer Deutsch, Japanisch und jede Sprache, die hier
   noch nicht vermessen ist. Sprachen mit kuerzeren Beschriftungen holen sich die
   Desktop-Kopfzeile in ihrem eigenen Band zurueck.

   Die Zahlen sind gemessen, nicht geschaetzt (03.09.2026, echte Kataloge, echte
   Schrift): Mindestbreite = umgebrochene Reihe + 28px Logo + 118px Knoepfe rechts
   + 40px Polster + 39px Rest-Abstand zwischen Logo und Home.
     Gruppe 880:  ar 852 | ko/zh-CN 865 | id 873 | en 882
     Gruppe 1000: pl 936 | fr 942 | tr 950 | ru 964 | it 975 | uk 986
                  es-419 991 | pt-BR 993
     Rest (1100): de 1075 | ja 1148

   Bekannte Restluecke, bewusst so gelassen: Japanisch braucht 1109px, das Band
   1101-1109px bleibt also zu eng. Vor dieser Aenderung war dort dasselbe kaputt,
   nur schlimmer - ohne den Umbruch brauchte Japanisch rund 1300px.

   Eine neue Sprache faellt automatisch in die sichere 1100er-Gruppe. Wer sie
   hochstufen will, misst sie zuerst und traegt sie dann hier ein.
   ========================================================================== */
@media (min-width: 1000px) and (max-width: 1100px) {
  :is(html:lang(en), html:lang(ko), html:lang(zh-CN), html:lang(ar), html:lang(id),
     html:lang(pl), html:lang(fr), html:lang(tr), html:lang(ru), html:lang(it),
     html:lang(uk), html:lang(es-419), html:lang(pt-BR)) #tabs { display: flex; }
  :is(html:lang(en), html:lang(ko), html:lang(zh-CN), html:lang(ar), html:lang(id),
     html:lang(pl), html:lang(fr), html:lang(tr), html:lang(ru), html:lang(it),
     html:lang(uk), html:lang(es-419), html:lang(pt-BR)) .nav-inner { grid-template-columns: 1fr auto 1fr; height: 58px; padding: 0 1.25rem; }
  :is(html:lang(en), html:lang(ko), html:lang(zh-CN), html:lang(ar), html:lang(id),
     html:lang(pl), html:lang(fr), html:lang(tr), html:lang(ru), html:lang(it),
     html:lang(uk), html:lang(es-419), html:lang(pt-BR)) .brand .logo { width: 28px; height: 28px; }
  /* Schriftzug und "Feedback" wie in der Zwischenstufe oben - hier ist es eng. */
  :is(html:lang(en), html:lang(ko), html:lang(zh-CN), html:lang(ar), html:lang(id),
     html:lang(pl), html:lang(fr), html:lang(tr), html:lang(ru), html:lang(it),
     html:lang(uk), html:lang(es-419), html:lang(pt-BR)) .brand span,
  :is(html:lang(en), html:lang(ko), html:lang(zh-CN), html:lang(ar), html:lang(id),
     html:lang(pl), html:lang(fr), html:lang(tr), html:lang(ru), html:lang(it),
     html:lang(uk), html:lang(es-419), html:lang(pt-BR)) .header-feedback span { display: none; }
  :is(html:lang(en), html:lang(ko), html:lang(zh-CN), html:lang(ar), html:lang(id),
     html:lang(pl), html:lang(fr), html:lang(tr), html:lang(ru), html:lang(it),
     html:lang(uk), html:lang(es-419), html:lang(pt-BR)) .mobile-nav,
  :is(html:lang(en), html:lang(ko), html:lang(zh-CN), html:lang(ar), html:lang(id),
     html:lang(pl), html:lang(fr), html:lang(tr), html:lang(ru), html:lang(it),
     html:lang(uk), html:lang(es-419), html:lang(pt-BR)) .mobile-sheet { display: none; }
  :is(html:lang(en), html:lang(ko), html:lang(zh-CN), html:lang(ar), html:lang(id),
     html:lang(pl), html:lang(fr), html:lang(tr), html:lang(ru), html:lang(it),
     html:lang(uk), html:lang(es-419), html:lang(pt-BR)) body { padding-bottom: 0; }
  /* Die klebenden Leisten haengen an der Kopfzeilenhoehe: 58px statt 52px, und
     die Merge-Tactics-Reiter kleben am Desktop gar nicht.
     WICHTIG `relative`, nicht `static`: die Grundregel ist `.subtabs { position:
     relative }`, und daran haengt der blaue Schieber unter dem aktiven Reiter, der
     absolut positioniert ist. Mit `static` verliert er seinen Bezugsrahmen, richtet
     sich am <main> aus und landet mit Breite 0 am Seitenende - der Strich war
     schlicht weg (Eliass 05.09.2026).
     `top: auto` gehoert zwingend dazu: der 1100px-Block macht die Reihe klebend mit
     `top: 52px`. `static` ignoriert diesen Versatz, `relative` befolgt ihn - die Reihe
     rutschte dadurch 52px nach unten und legte sich ueber die Season-Auswahl. */
  :is(html:lang(en), html:lang(ko), html:lang(zh-CN), html:lang(ar), html:lang(id),
     html:lang(pl), html:lang(fr), html:lang(tr), html:lang(ru), html:lang(it),
     html:lang(uk), html:lang(es-419), html:lang(pt-BR)) .mt-subtabs { position: relative; top: auto; }
  :is(html:lang(en), html:lang(ko), html:lang(zh-CN), html:lang(ar), html:lang(id),
     html:lang(pl), html:lang(fr), html:lang(tr), html:lang(ru), html:lang(it),
     html:lang(uk), html:lang(es-419), html:lang(pt-BR)) .deck-tools-tabs { top: 58px; }
  /* Der Zug-Glow spannte zwischen Kopfzeile (52px) und Mobil-Leiste (56px).
     Beide Bezugsgroessen stimmen hier nicht mehr - unten ist keine Leiste. */
  :is(html:lang(en), html:lang(ko), html:lang(zh-CN), html:lang(ar), html:lang(id),
     html:lang(pl), html:lang(fr), html:lang(tr), html:lang(ru), html:lang(it),
     html:lang(uk), html:lang(es-419), html:lang(pt-BR)) .geier-turn-glow:not([hidden]) { top: 58px; bottom: 0; }
}

@media (min-width: 881px) and (max-width: 999px) {
  :is(html:lang(en), html:lang(ko), html:lang(zh-CN), html:lang(ar), html:lang(id)) #tabs { display: flex; }
  :is(html:lang(en), html:lang(ko), html:lang(zh-CN), html:lang(ar), html:lang(id)) .nav-inner { grid-template-columns: 1fr auto 1fr; height: 58px; padding: 0 1.25rem; }
  :is(html:lang(en), html:lang(ko), html:lang(zh-CN), html:lang(ar), html:lang(id)) .brand .logo { width: 28px; height: 28px; }
  /* Schriftzug und "Feedback" wie in der Zwischenstufe oben - hier ist es eng. */
  :is(html:lang(en), html:lang(ko), html:lang(zh-CN), html:lang(ar), html:lang(id)) .brand span,
  :is(html:lang(en), html:lang(ko), html:lang(zh-CN), html:lang(ar), html:lang(id)) .header-feedback span { display: none; }
  :is(html:lang(en), html:lang(ko), html:lang(zh-CN), html:lang(ar), html:lang(id)) .mobile-nav,
  :is(html:lang(en), html:lang(ko), html:lang(zh-CN), html:lang(ar), html:lang(id)) .mobile-sheet { display: none; }
  :is(html:lang(en), html:lang(ko), html:lang(zh-CN), html:lang(ar), html:lang(id)) body { padding-bottom: 0; }
  /* Die klebenden Leisten haengen an der Kopfzeilenhoehe: 58px statt 52px, und
     die Merge-Tactics-Reiter kleben am Desktop gar nicht.
     WICHTIG `relative`, nicht `static`: die Grundregel ist `.subtabs { position:
     relative }`, und daran haengt der blaue Schieber unter dem aktiven Reiter, der
     absolut positioniert ist. Mit `static` verliert er seinen Bezugsrahmen, richtet
     sich am <main> aus und landet mit Breite 0 am Seitenende - der Strich war
     schlicht weg (Eliass 05.09.2026).
     `top: auto` gehoert zwingend dazu: der 1100px-Block macht die Reihe klebend mit
     `top: 52px`. `static` ignoriert diesen Versatz, `relative` befolgt ihn - die Reihe
     rutschte dadurch 52px nach unten und legte sich ueber die Season-Auswahl. */
  :is(html:lang(en), html:lang(ko), html:lang(zh-CN), html:lang(ar), html:lang(id)) .mt-subtabs { position: relative; top: auto; }
  :is(html:lang(en), html:lang(ko), html:lang(zh-CN), html:lang(ar), html:lang(id)) .deck-tools-tabs { top: 58px; }
  /* Der Zug-Glow spannte zwischen Kopfzeile (52px) und Mobil-Leiste (56px).
     Beide Bezugsgroessen stimmen hier nicht mehr - unten ist keine Leiste. */
  :is(html:lang(en), html:lang(ko), html:lang(zh-CN), html:lang(ar), html:lang(id)) .geier-turn-glow:not([hidden]) { top: 58px; bottom: 0; }
}

@media (min-width: 1101px) {
  .mobile-nav, .mobile-sheet { display: none !important; }

  /* ⚠️ HIER KEIN `overflow` SETZEN. Bis zum 31.08.2026 stand hier
     `#tabs { overflow-x: auto }` als Sicherheitsnetz fuer lange Uebersetzungen. Das hat
     saemtliche Hover-Dropdowns der Kopfnavigation unsichtbar gemacht - und zwar nur ab
     1101px, weil die Regel in diesem Media-Query steht. Darunter greift
     `#tabs { display: none }`, dort war also nichts zu sehen und der Fehler entzog sich
     der Suche.
     Gemessen: `.dropdown` blieb `visibility: visible` mit `opacity: 1` und korrektem
     Rechteck, tauchte aber in `document.elementsFromPoint()` gar nicht auf - der Stapel
     ging direkt MAIN -> BODY -> HTML. Klassisches Clipping, keine Ueberdeckung.
     Der Kommentar bei `#tabs` (Zeile ~391) hatte genau davor gewarnt: eine Achse
     ungleich `visible` laesst den Browser auch die andere auf `auto` berechnen und
     schneidet die absolut positionierten Panels ab. Der Pfeil dreht sich dann noch, das
     Panel bleibt weg - exakt das gemeldete Symptom.
     Die Reiter duerfen dafuer wieder schrumpfen statt zu scrollen; das verschiebt das
     Layout nicht und kommt ohne Clipping aus. Falls eine Sprache doch einmal zu breit
     wird, ist die Loesung ein Dropdown, das per JS ausserhalb von #tabs gerendert wird -
     nicht ein erneutes `overflow`. */
  #tabs > .nav-item { flex: 0 1 auto; min-width: 0; }
  #tabs .nav-link { min-width: 0; }
}

/* ---------- Sammlung: Nachzuegler ----------
   Steht bewusst als Letztes in der Datei. Die Grundregeln fuer .col-source-box stehen
   weiter oben (ca. Zeile 11540) und haben dieselbe Spezifitaet - bei Gleichstand
   gewinnt die spaetere Regel, ein Mobil-Block weiter oben waere wirkungslos geblieben.
   Inhaltlich gehoert das zum Sammlungs-Block bei .col-rarity. */
@media (max-width: 640px) {
  /* "Choose a deck": acht Karten zu je festen 52px brauchen 437px - sichtbar waren nur
     fuenf. Wieder feste Pixel, wieder derselbe Ausweg wie im Battle-Log: acht gleiche
     Spalten, die Karten fuellen ihre Spalte. Gilt fuer alle drei Quellen (My Decks,
     Top Ladder Decks, Saved Decks), sie teilen sich diese Klasse. */
  .col-source-box .player-deck-cards {
    grid-template-columns: repeat(8, minmax(0, 1fr)); width: 100%; gap: 2px;
  }
  .col-source-box .player-deck-cards .card,
  .col-source-box .player-deck-cards .card-img,
  .col-source-box .player-deck-cards .card-img img { width: 100%; }
  .col-source-pick { gap: 0.5rem; }
  .col-source-box .player-deck-mode { padding-right: 0.5rem; }
  /* Die Deckbox ist eine Flaeche IN einer Flaeche. Ohne eigenen Einzug endete ihr Rahmen
     exakt auf der Innenkante des Panels und sah dadurch aus, als stiesse sie an den
     Rand - Text daneben tut das nie, weil Buchstaben nicht bis zur Kante laufen. */
  .col-source-box { margin-inline: 0.55rem; }
}

/* Wartungshinweis der offiziellen API. Bewusst dieselbe Bildsprache wie public/404.html:
   Builder-Illustration, grosse Zeile, Ueberschrift, zwei Knoepfe, Linkzeile. Beides sind
   Sackgassen, die weiterschicken muessen, und sollen sich gleich anfuehlen. Die Werte
   sind von dort uebernommen, damit ein spaeterer Abgleich leicht faellt. (01.09.2026) */
.maintenance-notice {
  display: flex; flex-direction: column; align-items: center; text-align: center;
  gap: 4px; padding: 40px 20px 44px;
  border: 1px dashed rgba(255, 255, 255, 0.2); border-radius: 8px;
}
.maintenance-art { width: 150px; max-width: 42vw; height: auto; margin-bottom: 6px; }
.maintenance-code {
  margin: 0; font-size: clamp(1.9rem, 6vw, 2.8rem); font-weight: 800; line-height: 1;
  letter-spacing: -0.03em; color: #fff;
}
.maintenance-title { margin: 10px 0 0; font-size: clamp(1.05rem, 3vw, 1.3rem); font-weight: 750; color: var(--panel-text); }
.maintenance-text { margin: 10px 0 0; max-width: 52ch; color: rgba(226, 233, 248, 0.62); line-height: 1.65; }
.maintenance-actions { display: flex; flex-wrap: wrap; gap: 10px; justify-content: center; margin-top: 24px; }
.maintenance-btn {
  display: inline-flex; align-items: center; padding: 11px 20px; border-radius: 10px;
  font-weight: 700; font-size: 0.92rem; text-decoration: none;
  background: #4c6de1; color: #fff; border: 1px solid transparent;
}
.maintenance-btn:hover { background: #3f5cc4; text-decoration: none; }
.maintenance-btn-ghost { background: transparent; border-color: rgba(255, 255, 255, 0.16); color: #e8edfb; }
.maintenance-btn-ghost:hover { background: rgba(255, 255, 255, 0.07); }
.maintenance-links { max-width: none; margin-top: 26px; font-size: 0.86rem; color: rgba(226, 233, 248, 0.45); }
.maintenance-links a { color: rgba(226, 233, 248, 0.72); text-decoration: none; }
.maintenance-links a:hover { color: #fff; text-decoration: underline; }
.maintenance-links span { padding: 0 6px; opacity: 0.4; }

/* ==========================================================================
   Geier-Lobby auf schmalen Fenstern (Eliass 02.09.2026)

   Fuer die Lobby gab es bis hierher KEINE einzige Mobilregel - alle Werte
   stammten aus der Desktop-Ansicht. Das erklaert die Symptome gemeinsam: der
   Kopf war ein Raster aus drei gleich breiten Spalten (Titel, Maskottchen,
   Nutzerzeile), und auf dem Handy reichte der Platz fuer keine der drei.
   ========================================================================== */
@media (max-width: 760px) {
  /* Ab der Lobby gehoert der ganze Platz dem Spiel. Zwischen Kopfzeile und unterer
     Navigation bleibt kein Hintergrund mehr sichtbar - der lenkt ab und kostet
     genau die Breite, die der Inhalt braucht. Oben etwas mehr Luft, damit der
     Titel nicht an der Kopfzeile klebt. */
  /* Der Spalt oben entstand aus ZWEI Quellen, die sich addierten: 24px Innenabstand
     von main und 18px Aussenabstand der Huelle - zusammen 42px, in denen der
     Seitenhintergrund durchschien (gemessen 02.09.2026). Beide fallen in der Lobby
     weg; die Hoehe kommt als grauer INNENabstand zurueck, damit der Titel nicht an
     der Kopfzeile klebt. Die :has-Abfrage haengt am Element selbst, kann also nicht
     mit einer vergessenen Koerperklasse auseinanderlaufen. */
  main:has(.geier-shell.in-room) { padding-top: 0; }
  /* Den unteren Abstand nur im eingeklappten Zustand wegnehmen. Aufgeklappt folgen
     darunter Beschreibung, "Support me with" und Impressum - ohne den Abstand klebte
     die Infobox direkt an der Support-Leiste (Eliass 02.09.2026). */
  body:not(.mini-extras-open) main:has(.geier-shell.in-room) { padding-bottom: 0; }

  /* Beim Scrollen ans Ende schaute man unter die Lobby auf den Seitenhintergrund -
     97px gemessen (Eliass 02.09.2026). Ursache: die Huelle ist kuerzer als der
     Bildschirm, und darunter lag noch der Innenabstand von main.
     Das Grau ist ein Hintergrundbild AUF der Huelle, also muss die Huelle selbst bis
     nach unten reichen. 53px ist die Kopfzeile, 56px der reservierte Platz hinter der
     unteren Navigation - beide stehen bereits so im Layout. dvh statt vh, damit die
     einklappende Adressleiste auf dem Handy nicht doch wieder eine Luecke aufreisst.
     Ist der Inhalt laenger, waechst die Huelle ohnehin von selbst.
     Nur die Kopfzeile abziehen, NICHT zusaetzlich den Platz hinter der unteren
     Navigation: den reserviert body bereits als Innenabstand, und er liegt hinter der
     Leiste. Zog man ihn hier ein zweites Mal ab, blieben 33px Hintergrund stehen.
     Die Hoehe steht als Variable da, weil `body.embed-mode > header` die Kopfzeile
     ganz ausblendet (Zeile 241) und `?embed=1` auf jeder Route moeglich ist - mit fest
     verdrahteten 53px bliebe die Huelle dort zu kurz und der Spalt waere zurueck. */
  .geier-shell.in-room { min-height: calc(100dvh - var(--geier-kopfzeile, 53px)); }
  body.embed-mode .geier-shell.in-room { --geier-kopfzeile: 0px; }

  /* Die Statuszeile ("Lobby ABC123 created") ist ein Geschwister der Huelle, nicht ihr
     Kind. Im Fluss stehend schob sie 34px Seitenhintergrund unter die graue Flaeche -
     genau der Spalt, den Eliass beim Scrollen ans Ende sah. In der Lobby laeuft sie
     deshalb als schwebende Meldung ueber der unteren Navigation und nimmt keinen Platz
     mehr im Fluss ein. Ausserhalb der Lobby (Startbildschirm, Beitreten) bleibt sie, wo
     sie war - dort gibt es keine flaechenfuellende Huelle. */
  #tab-geier:has(.geier-shell.in-room) #geier-note.geier-status {
    position: fixed;
    left: 50%;
    transform: translateX(-50%);
    /* Wie body und .mobile-nav selbst: 56px plus die Safe Area. Ohne env() rutschte die
       Meldung auf Geraeten mit Home-Indicator hinter die Leiste (z-index 60 > 40). */
    bottom: calc(56px + env(safe-area-inset-bottom, 0px) + 0.5rem);
    z-index: 40;
    margin: 0;
    max-width: calc(100% - 1.5rem);
    padding: 0.35rem 0.75rem;
    border-radius: 999px;
    background: rgba(12, 16, 26, 0.92);
    box-shadow: 0 2px 10px rgba(0, 0, 0, 0.45);
    text-align: center;
    /* Nicht pointer-events: none. Ist die Zwischenablage gesperrt, zeigt der Kopierknopf
       hier den Code bzw. den Link im Klartext zum Abschreiben - der muss markierbar
       bleiben. Diese Meldung ist bewusst KEIN Erfolg und blendet darum auch nicht aus. */
    user-select: text;
  }
  /* Leer soll sie gar nichts zeigen - sonst schwebte dauerhaft eine leere Pille ueber
     der Leiste. min-height traegt die Zeile sonst auch im leeren Zustand. */
  #tab-geier:has(.geier-shell.in-room) #geier-note.geier-status:empty { display: none; }
  .geier-shell.in-room {
    width: 100vw; margin-left: 50%; margin-top: 0; transform: translateX(-50%);
    border-radius: 0;
  }
  .geier-room { padding: 1.35rem 0.85rem 1.3rem; border-radius: 0; }

  /* Credits und Aufklapp-Knopf haften unten (Eliass 02.09.2026): "wenn die seite leer
     waere, dann wuerde das unten bleiben und der raum dazwischen waere frei". Bisher
     klebten sie am letzten Inhaltselement, und der freie Platz lag darunter.
     Die Huelle ist ueber min-height hoch genug, aber #geier-room ist ein Block und damit
     nur so hoch wie sein Inhalt. Beide werden zu Flex-Spalten, der Raum bekommt flex: 1
     und die Credits mit margin-top: auto den ganzen Rest. Gefahrlos, weil alle uebrigen
     Kinder der Huelle display: none sind - nur der Raum wird zum Flex-Element. */
  .geier-shell.in-room { display: flex; flex-direction: column; }
  .geier-shell.in-room .geier-room { flex: 1; display: flex; flex-direction: column; }
  /* Der Auto-Abstand haengt am Fuss, nicht an den Credits: die sind in Modi ohne
     Credit-Eintrag ausgeblendet (mega-draft-hardcore hat keinen), und an einem
     unsichtbaren Element verpufft er. Am Fuss wirkt er immer. Die Kinder behalten ihre
     eigenen Abstaende nach oben - 26px bei den Credits, 1.4rem beim Umschalter -, also
     bleibt der Mindestabstand in beiden Faellen erhalten. Flex-Spalte, damit der
     Umschalter wie bisher ueber margin-inline: auto mittig steht. */
  .geier-shell.in-room .geier-room-footer { margin-top: auto; display: flex; flex-direction: column; }

  /* Das Maskottchen entfaellt hier ganz: es hat den Kopf gesprengt und traegt auf
     dem Handy nichts bei, was den Platz wert waere. Am Desktop bleibt es. */
  .geier-room-art { display: none; }

  /* Links Titel samt Code und Link, rechts oben die drei Aktionen, darunter das
     eigene Konto - so von Eliass vorgegeben. */
  .geier-room-header {
    grid-template-columns: minmax(0, 1fr) auto;
    gap: 0.5rem 0.5rem;
    padding-bottom: 0.85rem;
  }
  .geier-room-header h3 { font-size: 1.25rem; margin-bottom: 0.3rem; }

  /* Diese Regel aus dem 900px-Block spannte die Identitaet ueber ALLE Spalten - der
     Viewer wurde dadurch in die zweite Zeile gedrueckt, obwohl daneben Platz war.
     Sie muss hier ausdruecklich zurueckgenommen werden. (Eliass 02.09.2026) */
  .geier-room-identity { grid-column: 1; }

  /* Reihenfolge in der rechten Spalte (Eliass 02.09.2026): oben das eigene Konto, die
     Rolle mittig darunter, und die drei Aktionen unten buendig - kurz ueber der Linie,
     die den Kopf abschliesst. Ein Raster statt Flex, weil die drei Symbole einzelne
     Geschwister des Kontos sind: sie bekommen je eine eigene Spalte in Zeile 2, das
     Konto spannt darueber. `align-content: space-between` bei voller Hoehe drueckt die
     Symbolzeile an die Unterkante, ohne dass ein Umbau des Markups noetig waere. */
  .geier-room-header { align-items: stretch; }
  .geier-room-viewer {
    display: grid; grid-template-columns: repeat(3, auto);
    justify-content: end; justify-items: center;
    align-content: space-between;
    gap: 0.5rem 0.2rem; height: 100%;
    /* Ohne Deckel diktiert das Konto die Spaltenbreite und quetscht den Titel auf 22px
       (gemessen 02.09.2026). Der Deckel laesst genau die drei Symbole nebeneinander. */
    max-width: 11.5rem;
  }
  .geier-viewer-divider { display: none; }
  .geier-viewer-me { grid-row: 1; grid-column: 1 / -1; display: grid; justify-items: center; gap: 0.15rem; }
  .geier-room-requests { grid-row: 2; grid-column: 1; }
  .geier-room-history { grid-row: 2; grid-column: 2; }
  .geier-leave-door { grid-row: 2; grid-column: 3; padding: 0; }

  /* Zeile 1 ist der Code allein - die Beschriftung "Lobby code:" entfaellt, weil der
     Knopf direkt darunter "Copy Code" heisst und die Sache damit benennt. */
  .geier-line-label { display: none; }
  /* Der Code sitzt mittig ueber den beiden Knoepfen, nicht linksbuendig: dieselbe
     Breite wie sie, Inhalt zentriert (Eliass 02.09.2026). */
  .geier-code-line { width: 7.5rem; justify-content: center; }
  .geier-copy-btn { width: 10rem; }

  /* Nur die Symbole, keine Beschriftungen (Eliass 02.09.2026): "INVITES", "HISTORY"
     und "LEAVE" sind unterschiedlich lang, die drei Knoepfe wurden dadurch
     verschieden breit und standen sichtbar schief zueinander - am staerksten LEAVE.
     Ohne Text bekommt jeder Knopf denselben quadratischen Platz, und sie duerfen
     enger zusammenruecken. Rot bleibt das Verlassen-Symbol trotzdem: die Farbe steckt
     in .geier-leave-door und faerbt ueber currentColor das SVG. */
  .geier-envelope-label, .geier-leave-label { display: none; }
  .geier-envelope, .geier-leave-door {
    width: 34px; height: 34px; padding: 0; gap: 0;
    justify-items: center; align-content: center;
  }
  .geier-envelope svg, .geier-leave-door svg { width: 23px; height: 23px; }

  /* Die Knoepfe waren zu wuchtig fuer das, was sie sagen. */
  .geier-copy-btn { width: 7.5rem; min-height: 26px; gap: 0.3rem; padding: 0 0.5rem; font-size: 0.6rem; letter-spacing: 0.02em; }
  .geier-copy-btn svg { width: 12px; height: 12px; }
  .geier-code-actions { gap: 0.32rem; margin-top: 0.35rem; }

  .geier-room-profile { min-width: 0; padding: 3px 9px 3px 3px; gap: 6px; }
  .geier-room-profile .geier-avatar { width: 24px; height: 24px; }
  .geier-room-profile b { font-size: 0.74rem; }
  .geier-room-role { font-size: 0.54rem; letter-spacing: 0.1em; }

  /* Pause, Ready und Start passen wieder in eine Zeile. */
  /* Gleich lang statt textbreit: gemessen 83/84/83px. flex-basis 0 mit gleichem
     Wachstum macht sie exakt gleich, und ein ausgeblendeter Pause-Knopf (nur die
     Leitung sieht ihn) belegt dabei keine leere Spalte, wie es ein Raster taete. */
  .geier-room-buttons { gap: 8px; }
  .geier-room-btn { flex: 1 1 0; min-width: 0; }
  .geier-room-btn { min-height: 38px; padding: 0 13px; gap: 6px; }
  .geier-room-btn span { font-size: 0.64rem; letter-spacing: 0.05em; }
  .geier-btn-ico { width: 13px; height: 13px; }

  /* Spielerliste, Chat und Einstellungen als echte Reiter: die drei Symbole in
     EINER Zeile unter den Knoepfen, darunter der geoeffnete Bereich ueber die
     volle Breite. `display: contents` loest die Spalten auf, sodass Symbol und
     Inhalt direkt Raster-Kinder werden - nur so lassen sie sich auf zwei Zeilen
     verteilen, ohne das Markup umzubauen. */
  .geier-lobby-panels {
    display: grid;
    /* Nicht `repeat(3, 1fr)`: das zoege die Symbole ueber die volle Breite auseinander,
       sie sollen gedrungen beieinander stehen. Aber auch nicht `auto`: dann bestimmt der
       laengste Text die Spalte, gemessen 52/52/69px wegen "Settings" - das mittlere
       Symbol lag dadurch bei 192 statt auf der Seitenmitte 200 und die Reihe wirkte
       schief. Feste gleiche Spalten loesen beides. 5.75rem entspricht dem Abstand der
       Knopfmitten darueber (108/200/292), die Symbole stehen damit unter ihren Knoepfen.
       Aussen je eine dehnbare Spalte: `grid-column: 1 / -1` des aufgeklappten Bereichs
       spannte sonst nur ueber die drei festen Spalten und war damit 276 statt 401px
       breit - daher nahm eine Teilnehmerzeile zwei Zeilen ein und Chat wie Settings
       wirkten gequetscht (Eliass 02.09.2026). */
    grid-template-columns: 1fr repeat(3, 5.75rem) 1fr;
    justify-content: center;
    /* Spaltenabstand 0: die 5.75rem sind bereits der volle Abstand der Knopfmitten.
       Mit zusaetzlicher Luecke standen die Symbole 102px auseinander statt 92 und
       liefen damit wieder aus der Flucht der Knoepfe darueber. */
    align-items: start; gap: 10px 0;
  }
  .geier-panel-col { display: contents; }
  /* Ausdrueckliche Spalten: die automatische Platzierung wuerde die drei Reiter in die
     Spalten 1 bis 3 setzen, also in die linke Dehnspalte hinein. */
  .geier-panel-tab { grid-row: 1; gap: 3px; padding: 2px 6px; }
  .geier-panel-col[data-geier-col="lobby"] .geier-panel-tab { grid-column: 2; }
  .geier-panel-col[data-geier-col="chat"] .geier-panel-tab { grid-column: 3; }
  .geier-panel-col[data-geier-col="settings"] .geier-panel-tab { grid-column: 4; }
  /* 56px waren fuer reine Symbole zu wuchtig. */
  .geier-panel-tab .geier-panel-ico { width: 40px; height: 40px; }
  .geier-panel-count { min-width: 26px; padding: 1px 8px; font-size: 0.58rem; }
  .geier-panel-body { grid-row: 2; grid-column: 1 / -1; }

  /* Die Reglerkaesten (Players, Cards per round, Round duration) blieben bei 250px und
     standen mittig eingerueckt, waehrend alle uebrigen Elemente im Bereich 368px breit
     sind - der Deckel stammt aus der Desktop-Ansicht, wo drei davon nebeneinander
     passen. Untereinander gestapelt gibt es nichts zu deckeln (Eliass 02.09.2026). */
  .geier-range-grid > * { max-width: none; }

  /* Teilnehmerliste ohne eigenes Scrollfenster (Eliass 02.09.2026): "deutlich leichter
     zu bedienen, als in diesem kleinen fenster zu scrollen". Die Liste waechst mit der
     Seite; gescrollt wird die Seite selbst. Erst ab 16 Zeilen - mehr als die 15 Plaetze,
     also sobald eine Warteschlange entsteht - bekommt sie wieder einen Deckel, sonst
     schoebe eine volle Lobby alles andere aus dem Bild. */
  .geier-members-scroll { height: auto; overflow: visible; padding-right: 0; }
  /* `nth-child(16 of .geier-member-row)` zaehlt ausdruecklich nur Teilnehmerzeilen.
     Mit einfachem :nth-child(16) griff der Deckel schon bei 15 Leuten, weil zwischen
     den Zeilen der Knopf "Add bot" steht und die Zaehlung um eins verschiebt. */
  .geier-members-scroll:has(#geier-member-list > .geier-member-row:nth-child(16 of .geier-member-row)) {
    max-height: 65dvh; overflow-y: auto; padding-right: 10px;
  }

  /* Chat: nur EINE Umrandung. Der Bereich drumherum hat schon eine, der Nachrichten-
     kasten brachte eine zweite mit - doppelt gerahmt (Eliass 02.09.2026). Der eigene
     dunklere Grund bleibt, er trennt die Nachrichten von Umschalter und Eingabezeile.
     Die Hoehe setzt geierChatHoeheAnpassen() in app.js: der Kasten soll bis kurz ueber
     die untere Navigation reichen. 55.75rem waeren hier 892px - das stammt aus der
     Desktop-Ansicht und passt auf ein Handy nicht. Der Wert hier greift nur, falls das
     JavaScript nicht laeuft. */
  .geier-chat-log { height: 50dvh; border-color: transparent; border-radius: 10px; }
}

/* --------------------------------------------------------------------------
   Mini Games: Beschreibung, Creator-Code-Leiste und Impressum hinter einem
   Umschalter (Eliass 02.09.2026).

   Grund: Beim Scrollen in einer Lobby sah man unter die Spielflaeche auf
   Seitenmoebel, die dort nichts verloren haben. Auf allen anderen Seiten bleibt
   alles unveraendert sichtbar - deshalb haengt die Regel an `.mini-active`, das
   switchTab() setzt.

   Hinweis fuer spaeter: Der Beschreibungstext ist Teil der AdSense-Textarbeit.
   Eingeklappter Text bleibt im Dokument und wird indexiert, zaehlt bei Google
   aber tendenziell weniger. Falls die Werbefreigabe erneut scheitert, ist das
   eine der Stellschrauben.
   -------------------------------------------------------------------------- */
.mini-extras-toggle {
  display: flex; align-items: center; gap: 0.5rem; margin: 1.4rem auto 0;
  padding: 0.5rem 0.9rem; cursor: pointer;
  border: 1px solid var(--panel-inset-border); border-radius: 999px;
  background: transparent; color: var(--panel-muted);
  font-size: 0.78rem; font-weight: 750;
}
.mini-extras-toggle:hover { color: var(--panel-text); background: rgba(255, 255, 255, 0.05); }
.mini-extras-caret {
  width: 0; height: 0; border-left: 5px solid transparent; border-right: 5px solid transparent;
  border-top: 6px solid currentColor; transition: transform .16s ease;
}
body.mini-extras-open .mini-extras-caret { transform: rotate(180deg); }

/* Eingeklappt: nur im Mini-Games-Bereich und nur solange nicht aufgeklappt. */
/* Die Credits bleiben ausdruecklich sichtbar - der Umschalter steht ja unter ihnen
   und waere sonst ohne Bezug (Eliass 02.09.2026). */
body.mini-active:not(.mini-extras-open) #tab-geier .seo-guide,
body.mini-active:not(.mini-extras-open) .site-support,
body.mini-active:not(.mini-extras-open) .site-legal { display: none; }

/* Der Umschalter selbst gehoert nur auf diese Seite. */
.mini-extras-toggle { display: none; }
body.mini-active .mini-extras-toggle { display: flex; }

/* ---- Season End: Endstand einer abgeschlossenen Season -------------------
   Die Liste selbst benutzt die vorhandenen `.lb-row`-Regeln des Ranked-Boards.
   Eigene Regeln braucht nur das Diagramm. */
.lb-season-chart { padding: 14px 16px 12px; margin-bottom: 14px; }
.lb-season-chart-head {
  display: flex; align-items: flex-start; justify-content: space-between;
  gap: 12px; flex-wrap: wrap; margin-bottom: 6px;
}
.lb-season-chart-head > span:first-child { display: flex; flex-direction: column; gap: 1px; }
.lb-season-eyebrow {
  font-size: .68rem; letter-spacing: .09em; text-transform: uppercase;
  color: var(--panel-dim);
}
.lb-season-chart-head strong { font-size: .95rem; color: var(--panel-text); }
.lb-season-captured { font-size: .74rem; color: var(--panel-muted); padding-top: 2px; }

/* Umschalter fuer das Zeitfenster - nutzt die vorhandene .deck-sort-control,
   damit er wie die uebrigen Segmentschalter der Seite aussieht. */
.lb-season-ranges { margin: 2px 0 8px; }

.lb-season-svg { width: 100%; height: auto; display: block; overflow: visible; }

/* Raster und Achsen wie beim Clan-Graphen: gestrichelt, sehr zurueckhaltend. */
.lb-season-grid line { stroke: rgba(183, 203, 255, 0.09); stroke-width: 1; stroke-dasharray: 3 5; }
.lb-season-grid text,
.lb-season-xaxis text {
  fill: rgba(211, 221, 247, 0.38); font-size: 9px; font-weight: 650;
  font-variant-numeric: tabular-nums; font-family: "Inter", system-ui, sans-serif;
}
.lb-season-grid text { text-anchor: end; }
.lb-season-xaxis text { text-anchor: middle; }

/* Die Linie steigt SCHRAEG ueber die Spieldauer eines Kampfes und laeuft nur in
   den Pausen waagerecht (siehe lbSeasonVerlauf). Runde Verbindungen, weil hier
   Schraegen aneinanderstossen - eckige wuerden bei flachen Winkeln Spitzen
   erzeugen. Bewusst duenn: bei zehn Linien entscheidet die Ruhe der Flaeche
   darueber, ob man ueberhaupt etwas erkennt. */
.lb-season-path {
  fill: none; stroke-width: 1.75;
  stroke-linejoin: round; stroke-linecap: round;
  vector-effect: non-scaling-stroke;
}
/* Abgeschaltet heisst NUR ausgegraut - Anordnung und Skala bleiben unveraendert
   (Eliass 07.09.2026). Die Linie verschwindet nicht, sie tritt zurueck. */
.lb-season-line .lb-season-path { stroke: rgba(150, 165, 200, 0.55); opacity: .28; }
.lb-season-line.is-focus .lb-season-path { stroke: var(--panel-text); opacity: .95; }

/* Zeigt man auf den Namen rechts, leuchtet die Linie auf. Die Klasse setzt
   app.js - im SVG gibt es keinen Selektor, der vom Namen auf das zugehoerige
   <g> mit demselben data-tag zeigt. */
.lb-season-line.is-hover .lb-season-path {
  opacity: 1; stroke-width: 3;
  filter: drop-shadow(0 0 5px currentColor) drop-shadow(0 0 10px currentColor);
}
.lb-season-line.is-hover .lb-season-dot { opacity: 1; }
.lb-season-line.s1 { color: var(--series-1); }
.lb-season-line.s2 { color: var(--series-2); }
.lb-season-line.s3 { color: var(--series-3); }
.lb-season-line.s4 { color: var(--series-4); }
.lb-season-line.s5 { color: var(--series-5); }
.lb-season-line.s6 { color: var(--series-6); }
.lb-season-line.s7 { color: var(--series-7); }
.lb-season-line.s8 { color: var(--series-8); }
.lb-season-line.s9 { color: var(--series-9); }
.lb-season-line.s10 { color: var(--series-10); }
.lb-season-line.is-focus.s1 .lb-season-path { stroke: var(--series-1); }
.lb-season-line.is-focus.s2 .lb-season-path { stroke: var(--series-2); }
.lb-season-line.is-focus.s3 .lb-season-path { stroke: var(--series-3); }
.lb-season-line.is-focus.s4 .lb-season-path { stroke: var(--series-4); }
.lb-season-line.is-focus.s5 .lb-season-path { stroke: var(--series-5); }
.lb-season-line.is-focus.s6 .lb-season-path { stroke: var(--series-6); }
.lb-season-line.is-focus.s7 .lb-season-path { stroke: var(--series-7); }
.lb-season-line.is-focus.s8 .lb-season-path { stroke: var(--series-8); }
.lb-season-line.is-focus.s9 .lb-season-path { stroke: var(--series-9); }
.lb-season-line.is-focus.s10 .lb-season-path { stroke: var(--series-10); }
.lb-season-line.s1 .lb-season-dot { fill: var(--series-1); }
.lb-season-line.s2 .lb-season-dot { fill: var(--series-2); }
.lb-season-line.s3 .lb-season-dot { fill: var(--series-3); }
.lb-season-line.s4 .lb-season-dot { fill: var(--series-4); }
.lb-season-line.s5 .lb-season-dot { fill: var(--series-5); }
.lb-season-line.s6 .lb-season-dot { fill: var(--series-6); }
.lb-season-line.s7 .lb-season-dot { fill: var(--series-7); }
.lb-season-line.s8 .lb-season-dot { fill: var(--series-8); }
.lb-season-line.s9 .lb-season-dot { fill: var(--series-9); }
.lb-season-line.s10 .lb-season-dot { fill: var(--series-10); }
.lb-season-line-label.s1 { fill: var(--series-1); }
.lb-season-line-label.s2 { fill: var(--series-2); }
.lb-season-line-label.s3 { fill: var(--series-3); }
.lb-season-line-label.s4 { fill: var(--series-4); }
.lb-season-line-label.s5 { fill: var(--series-5); }
.lb-season-line-label.s6 { fill: var(--series-6); }
.lb-season-line-label.s7 { fill: var(--series-7); }
.lb-season-line-label.s8 { fill: var(--series-8); }
.lb-season-line-label.s9 { fill: var(--series-9); }
.lb-season-line-label.s10 { fill: var(--series-10); }
.lb-season-chip.s1 .lb-season-swatch { background: var(--series-1); }
.lb-season-chip.s2 .lb-season-swatch { background: var(--series-2); }
.lb-season-chip.s3 .lb-season-swatch { background: var(--series-3); }
.lb-season-chip.s4 .lb-season-swatch { background: var(--series-4); }
.lb-season-chip.s5 .lb-season-swatch { background: var(--series-5); }
.lb-season-chip.s6 .lb-season-swatch { background: var(--series-6); }
.lb-season-chip.s7 .lb-season-swatch { background: var(--series-7); }
.lb-season-chip.s8 .lb-season-swatch { background: var(--series-8); }
.lb-season-chip.s9 .lb-season-swatch { background: var(--series-9); }
.lb-season-chip.s10 .lb-season-swatch { background: var(--series-10); }

/* Nur winzige Markierungen an den Kampfenden. Grosse Ringe wie beim Clan-Graphen
   funktionieren dort, weil es EINE Linie mit zehn Punkten gibt - hier waeren es
   zehn Linien mit je dreissig, und die Flaeche saeuft in Kreisen ab
   (am 07.09.2026 ausprobiert und verworfen). Der Punkt sitzt am Ende der
   Schraegen und markiert damit genau den Moment, in dem das Spiel vorbei war. */
/* Der Ring in der Untergrundfarbe trennt den Punkt sichtbar von der Linie
   (Eliass 07.09.2026: "die punkte sollen die linien nicht beruehren"). */
.lb-season-dot { stroke: #131a2c; stroke-width: 2.2; opacity: .95; transition: r .12s ease; }
.lb-season-dot.up { fill: #6fe0a6; }
.lb-season-dot.down { fill: #ff8494; }
.lb-season-dot.flat { fill: #9fb0d4; }
.lb-season-dot:hover { r: 4.5px; opacity: 1; }

/* Alle Namen beginnen an derselben Stelle und laufen nach rechts - dadurch stehen
   sie als saubere Spalte statt an den Linienenden zu kleben. */
.lb-season-line-label {
  font-size: 10.5px; font-weight: 700; text-anchor: start;
  font-family: "Inter", system-ui, sans-serif;
  paint-order: stroke fill; stroke: rgba(6, 12, 30, 0.85); stroke-width: 2.5px; stroke-linejoin: round;
  cursor: default;
}
/* Abgeschaltete Spieler stehen weiter in der Liste, nur grau. */
.lb-season-line-label.is-off { fill: rgba(160, 172, 200, 0.42) !important; }
.lb-season-line-label:hover { filter: drop-shadow(0 0 4px currentColor); }

.lb-season-legend { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 10px; }
.lb-season-chip {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 4px 9px; border-radius: 6px; cursor: pointer;
  background: var(--panel-inset); border: 1px solid var(--panel-inset-border);
  color: var(--panel-muted); font-size: .76rem; line-height: 1.3;
  font-family: inherit; transition: color .15s, border-color .15s;
}
.lb-season-chip:hover { color: var(--panel-text); border-color: var(--panel-border); }
.lb-season-chip.active { color: var(--panel-text); border-color: var(--panel-border); }
.lb-season-swatch {
  width: 9px; height: 9px; border-radius: 2px; flex: none;
  background: var(--panel-dim);
}
.lb-season-chip:not(.active) .lb-season-swatch { opacity: .3; }

.lb-season-empty { color: var(--panel-muted); font-size: .85rem; padding: 20px 0; text-align: center; }

/* Auf dem Handy hat die Direktbeschriftung rechts keinen Platz mehr - dort traegt
   die Legende die Identitaet, und das Diagramm darf die volle Breite nutzen. */
@media (max-width: 620px) {
  .lb-season-chart { padding: 12px 12px 10px; }
  .lb-season-line-label { display: none; }
  .lb-season-captured { font-size: .7rem; }
  .lb-season-ranges button { padding-left: .55rem; padding-right: .55rem; }
}
/* Das Etikett traegt dieselbe Farbe wie seine Linie - bei drei Namen dicht
   untereinander ist das die einzige verlaessliche Zuordnung. */
.lb-season-line-label.s1 { fill: var(--series-1); }
.lb-season-line-label.s2 { fill: var(--series-2); }
.lb-season-line-label.s3 { fill: var(--series-3); }
.lb-season-line-label.s4 { fill: var(--series-4); }



/* ---- Season End: der Endstand auf dem Clash-Royale-Rautenmuster ----------
   Eliass 07.09.2026: das Spielmuster als Untergrund der Tabelle, darauf jeder
   Spieler als dunkles, halbdurchsichtiges Element MIT SCHWARZER UMRANDUNG - so
   wie die Plaketten im Spiel-Screenshot. Platz 1 bis 3 bleiben ebenfalls
   schwarz; ausgezeichnet wird allein der Rahmen in Gold, Silber und Bronze.

   Schrift: ueber die Klasse `.cr-text` (siehe dort). Die Werte darin sind am
   Spiel ausgemessen - Kontur 2 px, harter Schatten 3 px nach unten, beides in em,
   damit es mit der Schriftgroesse mitwaechst. NICHT durch eine eigene text-shadow
   ersetzen: `text-shadow` schattiert nur die Fuellung, nicht den Umriss.

   Zur Schriftkette: Clash_Bold deckt 470 Zeichen ab - Ziffern, A-Z, a-z, #,
   Umlaute -, aber kein CJK, keine Kapitaelchen und keine Emoji. Solche Namen
   fallen deshalb zeichenweise automatisch auf die Zweitschrift zurueck. Das ist
   gewollt und braucht keine Sonderbehandlung im Code. */
.lb-season-board {
  --cr-schwarz: #05070f;
  padding: 7px;
  border-radius: var(--panel-radius);
  background-color: var(--karo-fuge);
  background-image: var(--karo-licht), var(--karo-kachel);
  background-size: auto, var(--karo-groesse) var(--karo-groesse);
  box-shadow: var(--panel-shadow);
}

/* Die Zeile. Die Werte stammen 1:1 aus Abschnitt 4 der Musterseite
   (public/preview/pattern/index.html) - dort war die Aufteilung so, wie Eliass
   sie wollte: eine dunkle, deutlich durchsichtige Flaeche in Marineblau, KEIN
   Rahmen. Ein schwarzer Rahmen und ein dunklerer Ton haben die Zeilen am
   07.09.2026 komplett schwarz aussehen lassen - das war der Fehler.

   Die Stufen werden ueber die Deckkraft unterschieden: je weiter oben, desto
   heller die Zeile. Keine zusaetzlichen Rahmen, keine zweite Akzentfarbe. */
.lb-season-entry {
  position: relative;
  display: grid;
  /* NUR die Namensspalte ist flexibel; Deck, Elixier, Knoepfe und Wertung sind
     inhaltsbreit und schrumpfen nie. Zwei Fehler lagen hier schon:
     eine Mindestbreite von 7,5rem an der letzten Spalte liess die Wertung ueber
     den rechten Rand laufen, und ein minmax(0, 1fr) dort liess sie unter ihre
     Inhaltsbreite schrumpfen - die Medaille lag dann ueber QR und Speichern. */
  grid-template-columns: 3.4rem minmax(0, 1fr) auto auto auto auto;
  align-items: center;
  gap: 0 0.7rem;
  padding: 0.5rem 0.8rem;
  border-radius: 8px;
  background: rgba(6, 20, 54, 0.62);
}
.lb-season-entry + .lb-season-entry { margin-top: 4px; }
.lb-season-entry:hover { background: rgba(6, 20, 54, 0.74); }

/* Top 10 und Top 50 heben sich nur ueber die Deckkraft ab - sonst konkurrieren
   sie mit den Medaillen. */
.lb-season-entry.tier-50 { background: rgba(6, 20, 54, 0.62); }
.lb-season-entry.tier-10 { background: rgba(6, 20, 54, 0.62); }

/* Platz 1 bis 3: KEIN Rahmen. Sie unterscheiden sich allein ueber die Flaeche
   und die Farbe der Rangzahl (siehe --cr-fill weiter unten). Ein Metallrahmen
   stand hier zwischenzeitlich, ist auf Wunsch von Eliass am 07.09.2026 aber
   wieder raus - die Auszeichnung soll aus dem Hintergrund kommen, nicht aus
   einer Umrandung. */
.lb-season-entry.medal { background: rgba(6, 20, 54, 0.62); }
.lb-season-entry.medal:hover { background: rgba(6, 20, 54, 0.74); }
/* Silber etwas dunkler als Gold und Bronze (Eliass 07.09.2026). */
.lb-season-entry.medal-2 { background: rgba(6, 20, 54, 0.62); }
.lb-season-entry.medal-2:hover { background: rgba(6, 20, 54, 0.74); }

/* Platzierung: Spielschrift, mittig. Bei den ersten drei nur die FUELLUNG in der
   Medaillenfarbe - Kontur und Schatten kommen unveraendert aus .cr-text. */
.lb-season-pos { font-size: 1.5rem; line-height: 1; text-align: center; }
.lb-season-entry.medal-1 .lb-season-pos { --cr-fill: #ffd873; }
.lb-season-entry.medal-2 .lb-season-pos { --cr-fill: #eef3fa; }
.lb-season-entry.medal-3 .lb-season-pos { --cr-fill: #ffbd85; }

.lb-season-who { display: flex; min-width: 0; }
.lb-season-player {
  font-size: 1.02rem; line-height: 1.25; text-decoration: none;
  max-width: 100%; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.lb-season-player:hover { text-decoration: underline; }

.lb-season-deck {
  display: grid; grid-template-columns: repeat(8, 46px) auto;
  gap: 4px; align-items: center;
}
/* Breite auf allen drei Ebenen, wie bei .lb-deck: das Bild traegt eine eigene
   feste Breite, eine Regel allein am .card bleibt wirkungslos. */
.lb-season-deck :is(.card, .card-img, .card-img img) { width: 46px; }
.lb-season-deck .card-img img { border-radius: 5px; }
/* Die Turmkarte ist keine der acht - ein schmaler Abstand mit Trennlinie sagt
   das, ohne ihr eine eigene Box zu geben. */
.lb-season-tower {
  display: inline-flex; margin-left: 7px; padding-left: 7px;
  border-left: 1px solid rgba(255, 255, 255, 0.14);
}
.lb-season-deck-empty {
  grid-column: 1 / -1; font-size: 0.8rem; color: rgba(226, 233, 248, 0.5);
  display: flex; align-items: center; white-space: nowrap;
}

/* Elixierschnitt, QR und Speichern - derselbe Baustein wie im Ranked-Board. Der
   Elixierschnitt steht als eigenes Element davor (elixirOutside), damit er auf
   dem Handy in die Kopfzeile kann, waehrend QR und Speichern darunter rutschen. */
.lb-season-entry > .elixir {
  justify-self: start;
  font-family: "Clash Display", "Inter", system-ui, sans-serif;
  font-size: 0.86rem;
}
.lb-season-elixir-leer { visibility: hidden; }
.lb-season-actions { justify-self: start; }
.lb-season-actions-empty { display: block; }

/* Die Wertung: die Medaille, aus der eine Pille mit dem Wert herauslaeuft -
   so wie im Spiel-Screenshot. Bewusst KEIN Kasten um beides zusammen.

   Die Werte sind am Asset und am Referenzbild ausgemessen, nicht geschaetzt:

     ranked-medal.png ist 216x216, sichtbar ist y 27..188 und maximal 122 breit.
     Bei 30 px Icon-Hoehe heisst das: sichtbarer Teil y 3,8..26,1, der RUNDE Teil
     endet bei y 23,9 (darunter haengt nur noch das Band), seine Mitte liegt also
     bei y 13,9. Seitlich sind je 6,5 px leer, die Medaille endet rechts bei
     x 23,4.

   Daraus folgt:
   - Die Pille muss mindestens um ihren Eckradius nach links unter die Medaille
     reichen, sonst schaut ihre runde linke Kante darunter hervor.
   - Ihre Mitte gehoert auf die Mitte des RUNDEN Teils (13,9), nicht auf die
     Mitte des ganzen Assets - sonst sitzt sie sichtbar zu tief, weil das Band
     nach unten haengt. */
.lb-season-elo {
  display: inline-flex; align-items: flex-start; justify-self: end;
}
.lb-season-elo .cell-icon {
  width: 30px; height: 30px; flex: none;
  position: relative; z-index: 1;
  /* Die Pille beginnt bei x 18 und damit 5,4 px unter der Medaillenkante -
     mehr als ihr Eckradius, ihre linke Rundung bleibt also verdeckt. */
  margin-right: -12px;
}
/* Pille und Text sind BEWUSST zwei Elemente. Clash Display hat eine Oberlaenge
   groesser als 1em: bei line-height 1 laeuft die Glyphe oben aus ihrer Zeilenbox
   heraus, und mit align-items:center klebt sie dann an der Oberkante der Pille.
   Am 07.09.2026 gemessen: 0 px Luft oben, 4 px unten. Ueber ein eigenes
   Textelement laesst sich das mit einem Versatz sauber ausgleichen, ohne die
   Pille selbst zu verschieben. */
.lb-season-elo b {
  display: inline-flex; align-items: center;
  height: 21px;
  /* Links so viel, dass die Ziffern hinter der Medaille hervorkommen. */
  padding: 0 9px 0 12px;
  /* Deutlich weniger rund als eine Kapsel. */
  border-radius: 5px;
  background: rgba(2, 11, 38, 0.78);
  /* Mitte der Pille auf die Mitte des runden Medaillenteils (y 13,9). */
  margin-top: 3px;
}
.lb-season-elo b > span {
  /* Am Referenzbild gemessen: die Trophaeenzahl ist kein Weiss, sondern ein
     helles Cyan (#d4f4f3 im Kern der hellsten Pixel). */
  --cr-fill: #dcfbf8;
  /* Clash Displays Ziffern sind fast so hoch wie die Schriftgroesse (Verhaeltnis
     1,03 gemessen) und tragen zusaetzlich 0,12em Kontur je Seite. Bei 0,74rem
     fuellten sie die Pille zu 79 %. */
  font-size: 0.78rem; line-height: 1; font-weight: 400;
  font-variant-numeric: tabular-nums;
  /* Kein Versatz noetig: bei dieser Pillenhoehe sitzt die Glyphe von selbst
     mittig (gemessen 5 px Luft oben, 5 px unten). Bei einer engeren Pille war
     ein translateY hier zwingend - siehe Kommentar oben. */
}

/* Zwischenbreiten: das Deck ist die einzige Spalte, die nicht schrumpfen darf,
   ohne dass die Karten unlesbar werden. Vor dem Umbruch auf zwei Zeilen deshalb
   erst die Kartenbreite reduzieren. */
@media (max-width: 1100px) {
  .lb-season-deck { grid-template-columns: repeat(8, 40px) auto; }
  .lb-season-deck :is(.card, .card-img, .card-img img) { width: 40px; }
}

@media (max-width: 560px) {
  .lb-season-board { padding: 5px; }
  /* Der Name braucht Platz. Gemessen am 07.09.2026: er wollte 159 px, bekam in
     der ersten Fassung 61 (alles in EINER Kopfzeile) und in der zweiten 64 (dann
     brach er mitten im Wort um). Deshalb steht rechts die Wertung UEBER Elixier
     und Knoepfen - der Name bekommt so die ganze verbleibende Breite.
     ENTSCHEIDEND ausserdem: das Deck spannt ueber ALLE Spalten. Liesse man auch
     nur eine Spalte fuer die Knoepfe frei, teilte sich das Deck die
     Spaltenbreiten mit der Kopfzeile und die Karten fielen auf 19 px. */
  .lb-season-entry {
    grid-template-columns: 2.1rem minmax(0, 1fr) auto auto;
    grid-template-areas:
      "pos who elixir elo"
      "pos who actions actions"
      "deck deck deck deck";
    gap: 4px 0.45rem;
    padding: 0.5rem 0.55rem;
  }
  .lb-season-pos { grid-area: pos; font-size: 1.25rem; }
  .lb-season-who { grid-area: who; }
  .lb-season-player { font-size: 0.94rem; }
  .lb-season-entry > .elixir { grid-area: elixir; justify-self: end; }
  .lb-season-actions { grid-area: actions; justify-self: end; align-self: center; }
  .lb-season-actions-empty { grid-area: actions; }
  .lb-season-elo { grid-area: elo; }
  .lb-season-elo .cell-icon { width: 26px; height: 26px; margin-right: -10px; }
  .lb-season-elo b { height: 17px; padding: 0 8px 0 10px; margin-top: 3px; }
  .lb-season-elo b > span { font-size: 0.66rem; }
  .lb-season-deck { grid-area: deck; grid-template-columns: repeat(8, 1fr) auto; gap: 3px; }
  /* Nur die acht Deckkarten dehnen sich auf die Spaltenbreite. Die Turmkarte
     steht in der auto-Spalte - mit 100 % Breite haette sie sich selbst
     aufgeblasen und die Zeile gesprengt. Die Spezifitaet muss hier hoeher liegen
     als die der Grundregel oben: dort steht :is(...), und :is() erbt die
     Spezifitaet seines STAERKSTEN Arguments. */
  .lb-season-entry .lb-season-deck > .card,
  .lb-season-entry .lb-season-deck > .card .card-img,
  .lb-season-entry .lb-season-deck > .card .card-img img { width: 100%; }
  .lb-season-tower { margin-left: 5px; padding-left: 5px; }
  .lb-season-tower :is(.card, .card-img, .card-img img) { width: 36px; }
}

/* ---------- Kampfnamen im Fluss (bis 820px) ----------
   Die Namen liegen normalerweise als absolute Ebene links und rechts neben den Decks.
   Das geht nur auf, solange genug Platz da ist: die Decks brauchen rund 500px, dazu
   je 132px fuer die Namen - unter etwa 766px ueberdecken die Namen sonst sichtbar die
   Karten (bei 1v1 genauso wie bei 2v2, gemessen 99px Ueberlappung bei 657px).
   Deshalb greift die Umstellung hier schon ab 820px und nicht erst bei den uebrigen
   Handy-Anpassungen (640px): sobald es eng wird, steht der Name UEBER seinem Deck.
   Eliass, 07.09.2026 - "solange es mobile ist, muss es IMMER drueber stehen". */
@media (max-width: 820px) {
  .battle-body { flex-wrap: wrap; justify-content: space-between; }
  .side-info { position: static; width: auto; max-width: 48%; min-width: 0; }
  .side-info.left { order: 1; }
  .side-info.right { order: 2; }
  .battle-rounds { order: 3; width: 100%; }
  /* 2v2 haengt die Decks direkt in den Koerper, nicht in .battle-rounds - sonst
     stuenden sie vor den Namen und die Namen laegen wieder ueber den Karten. */
  .battle-decks.is-2v2 { order: 3; width: 100%; }
  /* Bei 2v2 zaehlt die Zuordnung: jeder Name steht ueber SEINEM Deck, danach das Deck
     mit seinen Schaltflaechen, dann der zweite Spieler genauso. Die aeussere
     Namensspalte wuerde daneben nur alle vier Namen als Block wiederholen. */
  .battle.is-2v2 .side-info { display: none; }
  /* Buendig nach AUSSEN, nicht zur Mitte: der Name gehoert an den Rand seiner Seite,
     so wie in der breiten Ansicht auch. */
  .battle-2v2-name { display: block; width: 100%; }
  .battle-2v2-side.own .battle-2v2-name { text-align: left; }
  .battle-2v2-side.opponent .battle-2v2-name { text-align: right; }
  .battle-2v2-player { gap: 0.3rem; }
  .battle-2v2-side { gap: 1rem; }
}

/* ---------- Deck Builder: 2v2 ----------
   Zwei Decks in EINER Kachel, untereinander, jeweils mit dem Namen des Spielers
   darueber. Deck-Namen gibt es bei 2v2 noch nicht - die Zeile sagt stattdessen, wem
   das Deck gehoert (Eliass 07.09.2026). */
/* Auf dem Desktop stehen die beiden Decks NEBENEINANDER, jedes als 4+4-Block mit der
   Turmtruppe daneben. Acht Karten in einer Reihe ergaeben zwei sehr breite Zeilen
   untereinander; so bleibt das Paar auf einen Blick vergleichbar (Eliass 07.09.2026).
   Schmale Schirme stapeln die beiden Decks, siehe weiter unten. */
/* Die Spalten sind genau so breit wie ein Deck (`max-content`), nicht auf die halbe
   Kachel gestreckt. Auf `1fr` klaffte zwischen dem Namen links und den Schaltflaechen
   rechts eine Luecke, und die beiden Decks trieben an die Aussenraender - Eliass
   07.09.2026: "sieht sehr planlos und verwahrlost aus", "sehr auseinander gezogen".
   Zentriert stehen sie als Paar zusammen, mit einer Trennlinie dazwischen. */
.builder-team-decks {
  display: grid; grid-template-columns: max-content max-content;
  /* Nicht eng zusammen in der Mitte und auch nicht an den Aussenrand gedrueckt: die
     beiden Decks stehen auf halbem Weg dazwischen (Eliass 07.09.2026). Der Container
     bleibt mittig, ist aber schmaler als die Kachel - dadurch bleibt aussen Rand. */
  /* WICHTIG: `center` mit einem echten Abstand, NICHT `space-between`. Bei
     space-between verteilt das Raster den Restplatz selbst - der tatsaechliche
     Abstand war dann 161px, waehrend `gap` nur das Minimum von 26px angibt. Der
     Trennstrich richtet sich nach `--team-gap` und sass dadurch 66px neben der Mitte
     (Eliass 07.09.2026). So ist der Abstand das, was hier steht - und die Mitte
     damit berechenbar.
     Der Abstand waechst mit dem Fenster: eng genug fuer 900px, weit genug, damit die
     Decks auf einem breiten Schirm nicht in der Mitte kleben. */
  justify-content: center;
  gap: var(--team-gap); position: relative;
  --team-gap: clamp(2rem, 9vw, 10rem);
}
/* Der Trennstrich nimmt denselben Farbverlauf wie die Linie oben an der Kachel
   (--panel-line), nur senkrecht: er laeuft oben und unten weich aus und traegt
   denselben Schimmer. Ein harter grauer Strich wirkte daneben wie ein Fremdkoerper.
   Er haengt am CONTAINER und steht bei 50% - also mittig im Zwischenraum. Am zweiten
   Deck festgemacht klebte er an dessen Kante und stand damit aus der Mitte
   (Eliass 07.09.2026). */
/* Der Strich haengt am zweiten Deck, sitzt aber um den halben Abstand nach aussen
   versetzt - dadurch steht er exakt in der MITTE des Zwischenraums, unabhaengig
   davon, wie hoch oder breit die beiden Decks gerade sind. An 50% des Containers
   ausgerichtet wanderte er mit, sobald ein Deck hoeher war als das andere. */
.builder-team-decks > .builder-team-deck + .builder-team-deck::before {
  content: ""; position: absolute; top: 0; bottom: 0;
  left: calc(-1 * var(--team-gap) / 2 - 1px);
  width: 2px; border-radius: 2px;
  background: linear-gradient(180deg, transparent, #587cff, #bd71f0, transparent);
  box-shadow: var(--panel-line-glow);
  pointer-events: none;
}
.builder-team-deck { position: relative; }
/* `.builder-result-cards` traegt projektweit `order: 2`, damit die Karten in der
   normalen Deckkachel unter den Kopf rutschen. Innerhalb des Paares zaehlt dagegen die
   DOM-Reihenfolge, sonst stuenden erst beide Namen und dann beide Decks. */
.builder-team-decks > *, .builder-team-deck > * { order: 0; }
.builder-team-deck { min-width: 0; }
/* Name links, Elixier und die beiden Schaltflaechen rechtsbuendig darueber - beides
   auf der Breite des Decks, damit nichts frei im Raum haengt. */
.builder-team-deck .builder-result-cards { width: max-content; }
/* 4 Karten je Reihe, danach die Turmtruppe in einer eigenen Spalte ueber beide Reihen. */
.builder-team-deck .builder-result-cards {
  grid-template-columns: repeat(4, minmax(40px, 52px)) 14px minmax(40px, 52px);
  margin-top: 0.35rem;
}
/* Trennstrich und Turmtruppe stehen rechts neben BEIDEN Kartenreihen, nicht in der
   Kartenreihe selbst - sonst rutschen sie in die zweite Zeile und das Raster bricht. */
.builder-team-deck .builder-result-cards > .builder-tower-divider { grid-column: 5; grid-row: 1 / span 2; height: 100%; }
.builder-team-deck .builder-result-cards > .builder-tower-card { grid-column: 6; grid-row: 1 / span 2; align-self: center; }
.builder-deck-owner {
  display: flex; align-items: center; justify-content: space-between; gap: 0.6rem;
  font-weight: 700; font-size: 0.86rem; color: var(--muted);
  padding-bottom: 0.3rem; min-width: 0;
}
.builder-deck-owner-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* Elixier und die beiden Schaltflaechen gehoeren zum Deck, nicht in die Kopfzeile der
   Kachel - dort beruehrten sie sich und galten sichtbar nur fuer das erste Deck. */
.builder-deck-owner-actions { display: inline-flex; align-items: center; gap: 0.5rem; flex: none; }
/* Der Umschalter zwischen den beiden Konten steht ueber der Kartenauswahl. */
.builder-side-switch { display: flex; justify-content: center; margin: 0 0 0.9rem; }
.builder-tag-optional { color: var(--muted); font-weight: 400; }

/* Schmal: die beiden Decks untereinander. Die Grenze liegt bei 900px, nicht bei den
   sonst ueblichen 820: zwei Decks nebeneinander brauchen 622px, bei 820px Fenster hat
   die Ergebniskachel innen aber nur 607 - das zweite Deck wurde am rechten Rand
   angeschnitten (gemessen 07.09.2026, 15px Ueberlauf). Der Aufbau je Deck bleibt
   gleich (4+4 plus Turmtruppe daneben). */
@media (max-width: 900px) {
  .builder-team-decks {
    grid-template-columns: max-content; gap: var(--team-gap);
    justify-content: center; max-width: 100%;
    --team-gap: 1.6rem;
  }
  /* Untereinander laeuft derselbe Verlauf waagerecht - ebenfalls mittig zwischen den
     beiden Decks, und ueber die volle Breite statt nur ueber die Deckbreite: schmal
     wirkte er wie ein Rest, nicht wie eine Trennung. */
  .builder-team-decks > .builder-team-deck + .builder-team-deck { padding-left: 0; }
  /* Waagerecht, ebenfalls mittig im Abstand - und ueber die volle Breite der Kachel
     statt nur ueber die Deckbreite: kurz wirkte er wie ein Rest, nicht wie eine
     Trennung (Eliass 07.09.2026). */
  .builder-team-decks > .builder-team-deck + .builder-team-deck::before {
    top: calc(-1 * var(--team-gap) / 2 - 1px); bottom: auto;
    left: 50%; right: auto; transform: translateX(-50%);
    width: 100vw; max-width: 88vw; height: 2px;
    background: linear-gradient(90deg, transparent, #587cff, #bd71f0, transparent);
  }
}

/* Regelwerk der Minigames ("How the modes work").
   Ergaenzt am 08.09.2026: /mini-games war mit 183 Woertern die duennste Seite der
   Domain und lag hinter einem Identitaets-Modal, das jeden Erstbesucher aussperrte -
   beides zusammen ist genau das Bild, das Google am 28.08.2026 als "minderwertige
   Inhalte" abgelehnt hat. Die Regeln stammen aus docs/minigames-wissen.md.

   Steht bewusst am DATEIENDE: In dieser Datei stehen viele Grundregeln HINTER den
   Media-Bloecken, und bei gleicher Spezifitaet gewinnt die spaetere. Weiter oben
   eingefuegt waere ein Teil davon still wirkungslos. */
.geier-rules-section {
  margin-top: 34px;
  padding-top: 26px;
  border-top: 1px solid rgba(99, 125, 215, 0.22);
}
.geier-rules-intro,
.geier-rules-note {
  max-width: 78ch;
  margin: 0 0 14px;
  color: rgba(226, 232, 246, 0.78);
  font-size: 0.95rem;
  line-height: 1.62;
}
.geier-rules-note {
  margin: -4px 0 22px;
  padding-left: 14px;
  border-left: 2px solid rgba(255, 200, 77, 0.5);
  color: rgba(226, 232, 246, 0.68);
  font-style: italic;
}
.geier-rules-mode {
  display: grid;
  grid-template-columns: 132px 1fr;
  gap: 20px;
  align-items: start;
  margin: 0 0 22px;
  padding: 18px;
  border: 1px solid rgba(99, 125, 215, 0.26);
  border-radius: 10px;
  background: rgba(8, 10, 15, 0.28);
}
.geier-rules-art {
  width: 100%;
  height: auto;
  border-radius: 8px;
  background: rgba(4, 6, 12, 0.4);
}
.geier-rules-copy h4 {
  margin: 0 0 8px;
  font-size: 1.12rem;
  color: #f2f5ff;
}
.geier-rules-badge {
  margin-left: 8px;
  padding: 2px 8px;
  border-radius: 999px;
  background: rgba(99, 125, 215, 0.22);
  color: rgba(198, 212, 246, 0.9);
  font-size: 0.68rem;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  vertical-align: middle;
}
.geier-rules-copy p {
  margin: 0 0 10px;
  color: rgba(226, 232, 246, 0.78);
  font-size: 0.94rem;
  line-height: 1.6;
}
.geier-rules-copy ul {
  margin: 0;
  padding-left: 20px;
  color: rgba(226, 232, 246, 0.72);
  font-size: 0.92rem;
  line-height: 1.58;
}
.geier-rules-copy li { margin-bottom: 5px; }
.geier-rules-copy li::marker { color: rgba(255, 200, 77, 0.7); }

@media (max-width: 700px) {
  .geier-rules-mode {
    grid-template-columns: 1fr;
    gap: 12px;
  }
  .geier-rules-art {
    width: 118px;
    justify-self: start;
  }
}
