/* ── Local fonts — files in /assets/fonts/ ── */
@font-face {
  font-family: 'Cutive Mono';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('/assets/fonts/CutiveMono-Regular.woff2') format('woff2');
}
@font-face {
  font-family: 'VT323';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('/assets/fonts/VT323-Regular.woff2') format('woff2');
}
@font-face {
  font-family: 'Cinzel';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url('/assets/fonts/Cinzel-Bold.woff2') format('woff2');
}
@font-face {
  font-family: 'Noto Serif JP';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('/assets/fonts/NotoSerifJP-Regular.woff2') format('woff2');
}
@font-face {
  font-family: 'Noto Serif JP';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url('/assets/fonts/NotoSerifJP-Bold.woff2') format('woff2');
}

* { margin: 0; padding: 0; box-sizing: border-box; }

/* ── Unités d'accessibilité (2026-08-14) ──────────────────────────────
   font-size, padding/margin/gap et les dimensions d'éléments d'IHM
   (boutons, popins, cibles tactiles, icônes) sont exprimés en rem plutôt
   qu'en px dans tout ce fichier — 1rem = la taille de police racine
   (16px par défaut), que le navigateur/l'OS peut faire varier via les
   réglages d'accessibilité ("taille du texte"/zoom texte uniquement) sans
   passer par un zoom de page complet : ces valeurs suivent alors ce
   réglage, contrairement à des px figés. Restent volontairement en px
   (non concernés, pas une question d'échelle de texte) : les épaisseurs de
   bordure/outline (1-2px, un hairline plus net en px qu'en rem fractionné),
   les rayons de flou de box-shadow/text-shadow/backdrop-filter (effet
   visuel, pas une mesure de mise en page), les dimensions de l'ascenseur
   thémé (widget OS), et #maze-wrapper/canvas (taille calculée en pixels
   réels par initCanvasSize()/daidalos.js à partir de window.innerWidth —
   liée à la résolution d'écran, pas à la taille de police). Voir
   CLAUDE.md racine § Accessibilité pour la portée site-wide. */

:root {
  /* Couleurs Minotaure (THEMES[0]) — filet de sécurité si daidalos-theme-init.js
     ne s'exécute pas (JS désactivé) ; en usage normal, ce script (chargé en
     tout premier dans <head>) écrase ces valeurs avant le premier paint. */
  --c1: #e8c97a;
  --c2: #8b6e30;
  --c3: #2a1500;
  --bg: #120800;
  --font-main: 'Cutive Mono', monospace;
  --font-title: 'Cinzel', serif;
  --border-color: var(--c2);

  /* Ascenseur thémé — scrollbar-color est une propriété héritée : une seule
     déclaration ici couvre le scroll de page ET tout panel interne sans
     règle plus spécifique (#scores-table-wrap, #help-box, #scores-panel,
     #stats-panel…) — voir docs/scrollbar-theme-spec.md. Thumb = --c2 (déjà
     la variable utilisée par ces 4 panels avant centralisation). */
  scrollbar-width: thin;
  scrollbar-color: var(--c2) transparent;
}

/* Fallback WebKit/Blink historique (::-webkit-scrollbar* n'est pas hérité
   nativement comme scrollbar-color — sélecteur universel pour le même effet
   pratique sur tout élément qui scrolle, sans cibler chaque id). Dimensions
   du widget d'ascenseur lui-même — laissées en px (voir note d'en-tête). */
*::-webkit-scrollbar {
  width: 8px;
  height: 8px;
}
*::-webkit-scrollbar-track {
  background: transparent;
}
*::-webkit-scrollbar-thumb {
  background: var(--c2);
  border-radius: 4px;
}
*::-webkit-scrollbar-thumb:hover {
  background: var(--c1, var(--c2));
}

body {
  background: var(--bg);
  color: var(--c1);
  font-family: var(--font-main);
  min-height: 100vh;
  display: block;
  overflow-y: auto;
  overflow-x: hidden;
  position: relative;
  transition: background 0.5s, color 0.5s;
}

#scanlines {
  position: fixed; inset: 0; pointer-events: none; z-index: 999;
  background: repeating-linear-gradient(0deg,transparent,transparent 2px,rgba(0,0,0,0.13) 2px,rgba(0,0,0,0.13) 4px);
  opacity: 0; transition: opacity 0.4s;
}
#vignette {
  position: fixed; inset: 0; pointer-events: none; z-index: 998;
  background: radial-gradient(ellipse at center, transparent 55%, rgba(0,0,0,0.75) 100%);
  opacity: 0; transition: opacity 0.4s;
}
#bg-layer {
  position: fixed; inset: 0; pointer-events: none; z-index: -1;
  transition: background 0.5s, opacity 0.5s; opacity: 0;
}

#container {
  display: flex; flex-direction: column; align-items: center; gap: 0.75rem;
  position: relative; z-index: 1;
  padding: 1rem 0.75rem 1.5rem;
  width: 100%; max-width: 100vw;
  box-sizing: border-box;
  /* Espace réservé pour #lobby-tabbar, fixe en bas du viewport (voir plus
     bas) — sans ce padding le dernier panneau lobby / #ad-slot-banner
     passerait sous la barre. */
  padding-bottom: 5.25rem;
}
/* Masqué pendant l'écran de jeu plein écran (#game-screen.open) — header du
   jeu, 3 panneaux lobby et barre d'onglets disparaissent tous ensemble
   puisqu'ils sont tous enfants de #container. Voir docs/daidalos-mobile-ihm-spec.md §4.5/§0. */
#container.lobby-hidden { display: none; }

/* Visible uniquement sur l'onglet Jeu (voir switchLobbyTab(), daidalos.js) —
   retiré des onglets Daily/Thèmes le 2026-08-14 (demande explicite). Même
   patron .active que .lobby-panel/.lobby-tab juste en dessous. */
#game-header { display: none; text-align: center; letter-spacing: 0.2em; }
#game-header.active { display: block; }

#title {
  font-family: var(--font-title);
  font-size: 2.75rem; color: var(--c1);
  /* Halo réduit (était 10px + 30px) : un glow aussi large teinte
     perceptiblement le fond autour du texte, ce que l'audit de contraste
     (échantillonnage des pixels réellement rendus, pas juste la valeur CSS
     --bg) détecte comme un fond différent — cassait le seuil AA sur les
     thèmes dont la marge de contraste --c1/--bg est la plus courte (sakura,
     audit Lighthouse 2026-08-12). Rayon de flou laissé en px (effet visuel,
     pas une mesure de mise en page — voir note d'en-tête). */
  text-shadow: 0 0 4px var(--c1);
  line-height: 1; transition: color 0.4s, text-shadow 0.4s;
}
#subtitle {
  font-size: 0.8rem; color: var(--c2); letter-spacing: 0.35em; margin-top: 0.1875rem;
  transition: color 0.4s;
}

/* Ex-conteneur #hud/.hud-item (rangée chrono+meilleur+seed) : supprimé avec
   la refonte mobile (docs/daidalos-mobile-ihm-spec.md §4.5/§5) — le chrono
   vit désormais seul dans #game-hud (écran de jeu plein écran), meilleur et
   seed sont redistribués aux écrans de lancement (#controls / #lobby-daily).
   .hud-label/.hud-value restent : classes génériques réutilisées telles
   quelles pour ces éléments désormais dispersés. */
/* Pleine opacité (pas 0.7) : --c2 est déjà la teinte « secondaire » du
   thème, l'atténuer davantage par opacité pouvait tomber sous 4.5:1 sur
   plusieurs thèmes (audit Lighthouse 2026-08-12). */
.hud-label { font-size: 0.8rem; letter-spacing: 0.2em; color: var(--c2); transition: color 0.4s; }
.hud-value {
  font-family: var(--font-title);
  font-size: clamp(0.875rem, 4vw, 1.625rem); color: var(--c1);
  /* Halo réduit (était 8px) — même raison que #title ci-dessus, affectait
     #timer sur metal/gameboy/sakura. Rayon de flou laissé en px. */
  text-shadow: 0 0 3px var(--c1);
  min-width: 0; width: 100%; text-align: center;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  transition: color 0.4s, text-shadow 0.4s;
}

/* Breakpoint @media(max-width:400px) retiré (2026-08-14, refonte mobile,
   voir docs/daidalos-mobile-ihm-spec.md §4.7) : ne réduisait que
   font-size/padding sans réorganisation structurelle, et référençait
   .mode-tab (supprimée). La nouvelle structure (barre d'onglets fixe, un
   seul panneau lobby à la fois, écran de jeu plein écran) est conçue
   mobile-first — les tailles de base ci-dessus/ci-dessous doivent
   directement convenir aux petits écrans, sans ajustement ponctuel. */

#maze-wrapper {
  position: relative;
  border: 1px solid var(--border-color);
  box-shadow: 0 0 20px rgba(0,0,0,0.4), inset 0 0 20px rgba(0,0,0,0.5);
  background: #000; transition: border-color 0.4s;
  /* Taille pilotée par --canvas-size, calculée en pixels réels par
     initCanvasSize() (daidalos.js) à partir de window.innerWidth/Height —
     volontairement laissée en px (repli inclus) : liée à la résolution
     d'écran pour un rendu Canvas net, pas à l'échelle de texte. */
  width: var(--canvas-size, 420px);
  height: var(--canvas-size, 420px);
  flex-shrink: 0;
  outline: none;
}
/* Zone de jeu focusable (D-pad télécommande Android TV / clavier) — voir
   daidalos.js pour la gestion du focus (newGame/launchDaily/resumeGame). */
#maze-wrapper:focus-visible {
  outline: 2px solid var(--c1);
  outline-offset: 3px;
  box-shadow: 0 0 16px var(--c1), 0 0 20px rgba(0,0,0,0.4), inset 0 0 20px rgba(0,0,0,0.5);
}
canvas {
  display: block;
  image-rendering: pixelated;
  /* -2px : #maze-wrapper a une bordure de 1px de chaque côté (border-box) —
     sans ce correctif le canvas (sans bordure propre) déborde de 1px de
     chaque côté du cadre du labyrinthe. Pixels réels (résolution Canvas),
     comme --canvas-size ci-dessus — laissé en px. */
  width: calc(var(--canvas-size, 420px) - 2px) !important;
  height: calc(var(--canvas-size, 420px) - 2px) !important;
}

#controls { display: flex; gap: 0.625rem; align-items: center; flex-wrap: wrap; justify-content: center; }

button {
  background: transparent; color: var(--c1);
  border: 1px solid var(--c1);
  font-family: var(--font-main); font-size: 0.8rem;
  padding: 0.4375rem 1rem; letter-spacing: 0.15em;
  cursor: pointer; text-transform: uppercase;
  transition: background 0.1s, color 0.1s, box-shadow 0.1s, border-color 0.4s, color 0.4s;
  outline: none;
}
/* color: var(--bg) plutôt qu'un #000 figé — sur les thèmes où --c1 est lui-même
   une teinte sombre (parchment, gameboy : accent "encre" sur fond clair), un
   texte noir sur ce fond devenait illisible (contraste AA cassé, audit
   Lighthouse 2026-08-12). --bg garantit un contraste élevé quel que soit le
   thème : c'est la couleur la plus « éloignée » de --c1 par construction
   (utilisée ailleurs comme fond de page derrière du texte --c1 en pleine
   opacité). Voir CLAUDE.md § Accessibilité — audit Lighthouse par thème. */
button:hover { background: var(--c1); color: var(--bg); box-shadow: 0 0 12px var(--c1); }
button:active { transform: scale(0.97); }
button:focus-visible {
  outline: 2px solid var(--c1);
  outline-offset: 3px;
  box-shadow: 0 0 8px var(--c1);
}

/* ── Écran de jeu plein écran (refonte mobile 2026-08-14) ──────────────
   Overlay CSS occupant tout le viewport, distinct du lobby (#container) —
   voir docs/daidalos-mobile-ihm-spec.md §4.5. z-index 1500 : au-dessus de
   #site-header (header.js, z-index 900) donc le recouvre visuellement sans
   avoir à le masquer explicitement ; en-dessous des popins (2000, dont la
   nouvelle confirmation de sortie) pour qu'une popin ouverte pendant la
   partie reste visible. */
#game-screen {
  display: none;
  position: fixed; inset: 0; z-index: 1500;
  flex-direction: column; align-items: center; justify-content: center;
  gap: 0.75rem; padding: 1rem; box-sizing: border-box;
  background: var(--bg); transition: background 0.5s;
}
#game-screen.open { display: flex; }
#game-hud {
  position: absolute; top: 0.875rem; left: 50%; transform: translateX(-50%);
  font-family: var(--font-title); font-size: clamp(1.25rem, 6vw, 1.875rem);
  color: var(--c1); text-shadow: 0 0 4px var(--c1);
  transition: color 0.4s, text-shadow 0.4s;
}
/* Option "Chronomètre" (config-popin) — masque uniquement l'affichage,
   elapsed/timerInterval continuent de tourner (meilleur temps/stats
   inchangés), voir § TIMER TOGGLE (daidalos.js). */
#game-hud.hidden { display: none; }
#btn-exit {
  position: absolute; top: 0.5rem; right: 0.5rem; z-index: 2;
  min-width: 2.75rem; min-height: 2.75rem;
  font-size: 1.125rem; padding: 0.5rem 0.875rem;
  border-color: #cc3300; color: #cc3300;
  display: flex; align-items: center; justify-content: center;
}
#btn-exit:hover { background: #cc3300; color: #000; box-shadow: 0 0 12px #cc3300; }
/* Icône SVG (currentColor) injectée par JS, remplace l'emoji 🚪 de repli —
   hérite `color` de #btn-exit, y compris :hover, voir daidalos.js. */
#btn-exit svg { width: 1.25rem; height: 1.25rem; display: block; }

/* ── Confirmation de sortie (popin) ── même patron que #config-popin. */
#exit-confirm-popin {
  display: none; position: fixed; inset: 0; z-index: 2000;
  align-items: center; justify-content: center;
  background: rgba(0,0,0,0.75); backdrop-filter: blur(3px);
}
#exit-confirm-popin.open { display: flex; }
#exit-confirm-box {
  background: var(--bg); border: 1px solid var(--c2);
  box-shadow: 0 0 30px color-mix(in srgb, var(--c1) 20%, transparent);
  padding: 1.5rem 1.75rem; min-width: 17.5rem; max-width: 94vw;
  display: flex; flex-direction: column; gap: 1.25rem; text-align: center;
  font-family: var(--font-main);
}
#exit-confirm-title {
  font-family: var(--font-title); font-size: 1.375rem; color: var(--c1);
  text-shadow: 0 0 8px var(--c1); letter-spacing: 0.1em;
}
#exit-confirm-actions { display: flex; gap: 0.625rem; justify-content: center; }
#exit-confirm-actions button { min-width: 2.75rem; min-height: 2.75rem; flex: 1; }
#exit-confirm-quit { border-color: #cc3300; color: #cc3300; }
#exit-confirm-quit:hover { background: #cc3300; color: #000; box-shadow: 0 0 12px #cc3300; }

/* ── Pub (optionnelle) ────────────────────────────────────────────────
   Voir docs/ads-integration-spec.md + CLAUDE.md § Pub. house.js pose lui-
   même le style de sa carte (.house-ad-card, injecté par ce script) — cette
   règle positionne l'emplacement. window.ads réserve déjà une hauteur
   minimale sur #ad-slot-banner lui-même (anti-CLS, posée en JS).

   Bandeau plein écran, bord à bord (2026-08-14, demande explicite : "comme
   une vraie pub") — `align-self: stretch` ignore le `align-items: center`
   de #container (qui centre/rétrécit tous ses autres enfants au contenu) ;
   `margin: 0 -12px` compense le padding horizontal de #container (12px de
   chaque côté, voir sa règle plus haut) pour atteindre les bords réels du
   viewport plutôt que seulement les bords de la zone de contenu. `--r: 0px`
   (esthétique anguleuse du jeu, déjà posée plus bas) évite tout arrondi qui
   casserait visuellement le bord-à-bord. `.house-ad-card-cta` a déjà
   `margin-left: auto` côté house.js : icône+texte à gauche, CTA plaqué à
   droite — la mise en page reste lisible même très large, comme un vrai
   bandeau publicitaire (leaderboard), pas un encart centré et borné comme
   le reste de l'IHM.

   Pont de variables CSS — Daídalos est un jeu à thèmes bespoke (--bg/--c1/
   --c2/--c3/--border-color/--font-main, voir applyTheme() dans daidalos.js),
   explicitement hors de la convention --bg2/--text/--border/--accent des
   apps theme-switcher.js (voir CLAUDE.md racine § convention de thème) —
   celle que house.js lit pour se fondre dans le thème actif. Sans ce pont,
   house.js retombe sur son repli sombre codé en dur sur les 13 thèmes,
   y compris les thèmes clairs (`parchment` bg:#f0e0b0, `gameboy` bg:#9bbc0f)
   où un bloc sombre figé jurerait exactement comme le bug déjà corrigé sur
   TicTic/thème axolotl (voir www/ads-providers/house.js § thème). Ces
   custom properties, une fois posées ici, sont héritées par la carte que
   house.js injecte à l'intérieur de #ad-slot-banner — même mécanisme que
   n'importe quelle variable CSS standard, pas besoin que house.js les
   connaisse par leur nom d'origine.
   --bg2/--surface → --bg (pas de notion de "surface" distincte chez
     Daídalos — la carte devient une boîte au contour --border-color sur le
     fond du jeu, cohérent avec #hud/#maze-wrapper/button, plutôt qu'un pavé
     "app" au remplissage plein comme sur TicTic/Décide-moi !)
   --text → --c1 (couleur héroïque du thème, utilisée pour tout élément mis
     en avant : titre, valeur HUD, boutons — cohérent avec un encart qui se
     veut lisible/visible sans être une alerte)
   --border → --border-color (déjà la variable canonique de bordure du jeu,
     posée par applyTheme() = --c2)
   --accent → --c1 (--accent-bg n'a pas besoin d'être posée séparément : le
     repli de house.js, color-mix(...--text...), résout déjà --text = --c1
     ci-dessus)
   --r → 0 (esthétique anguleuse assumée du jeu — aucun élément de
     l'interface n'a de coin arrondi, hormis .theme-btn à 3px)
   --font-body → --font-main (typographie du thème actif, pas system-ui) */
#ad-slot-banner {
  align-self: stretch;
  width: auto;
  margin: 0 -0.75rem;
  --bg2: var(--bg);
  --surface: var(--bg);
  --text: var(--c1);
  --border: var(--border-color, var(--c2));
  --accent: var(--c1);
  --r: 0;
  --font-body: var(--font-main);
}
/* Correctifs de contraste ciblant la carte injectée par house.js — celui-ci
   atténue sa tagline par opacity (0.75, non paramétrable via variable CSS) et
   dérive le fond du CTA d'un color-mix() à partir de --text : sur les thèmes
   où --c1 a la marge de contraste la plus courte (metal/gameboy/sakura/
   parchment), la dilution repasse sous 4.5:1 (audit Lighthouse 2026-08-12).
   house.js reste agnostique de toute page hôte — pas touché ici — ces deux
   règles gagnent en spécificité grâce à l'ID #ad-slot-banner (ancêtre réel
   de la carte injectée), sans dépendre de son contenu interne. */
#ad-slot-banner .house-ad-card-tagline { opacity: 1; }
#ad-slot-banner .house-ad-card-cta { background: var(--c1); color: var(--bg); }

#diff-control {
  display: flex; align-items: center; gap: 0.375rem;
  font-size: 0.8rem; color: var(--c2); letter-spacing: 0.15em;
}
#diff-label { font-size: 0.8rem; letter-spacing: 0.3em; color: var(--c2); opacity: 0.7; transition: color 0.4s; }
/* Inactif : var(--c2) en pleine opacité plutôt que --c1 dilué (opacity: 0.5)
   — l'atténuation par opacité fait chuter le contraste sous 4.5:1 sur
   plusieurs thèmes (jusqu'à 1.62:1 sur sakura, audit Lighthouse 2026-08-12) :
   --c2 est déjà la teinte « secondaire » du thème (utilisée telle quelle pour
   .hud-label, .theme-section-title, #subtitle...), un choix de couleur plutôt qu'une
   transparence donne le même effet « moins mis en avant » sans jamais risquer
   de tomber sous le seuil AA. Voir CLAUDE.md § Accessibilité. */
.diff-btn {
  font-size: 0.8rem; padding: 0.375rem 0.625rem; letter-spacing: 0.1em;
  color: var(--c2); border-color: var(--c2);
}
.diff-btn.active {
  color: var(--bg); background: var(--c1); border-color: var(--c1);
  box-shadow: 0 0 10px var(--c1);
}
.diff-btn:hover { opacity: 0.85; }
.diff-btn.active:hover { opacity: 1; }

#size-control {
  display: flex; align-items: center; gap: 0.5rem;
  font-size: 0.8rem; color: var(--c2); letter-spacing: 0.2em; transition: color 0.4s;
}
input[type=range] {
  -webkit-appearance: none; width: 5.625rem; height: 2px;
  background: var(--c3); outline: none; transition: background 0.4s;
}
input[type=range]::-webkit-slider-thumb {
  -webkit-appearance: none; width: 0.6875rem; height: 0.6875rem;
  background: var(--c1); cursor: pointer; box-shadow: 0 0 5px var(--c1);
}

/* Theme bar */
/* margin-top relevé de 8px à 16px (2026-08-12) : sur Cosmos/Temple Maya, le
   curseur de taille (#size-slider) se retrouvait à moins de 24px de distance
   sûre du bouton de thème actif juste au-dessus (audit Lighthouse
   target-size, 22.6-22.8px mesurés) — effet de bord de la hauteur de page à
   cet endroit précis, pas une propriété propre à ces deux thèmes. Voir
   CLAUDE.md § Accessibilité. */
#controls { margin-top: 1rem; }

/* Onglet Thèmes — 3 sections (2026-08-14, demande explicite : Le Mythe /
   Draxolotl / Autres mondes, voir buildThemeBar() dans daidalos.js et
   CLAUDE.md § Écran des thèmes — 3 sections). #lobby-themes est déjà un
   .lobby-panel en flex-direction:column (gap 16px hérité) — chaque
   .theme-section n'a donc qu'à empiler son titre et sa .theme-bar. */
.theme-section { display: flex; flex-direction: column; gap: 0.5rem; width: 100%; }
.theme-section-title {
  font-size: 0.8rem; font-weight: normal; color: var(--c2); letter-spacing: 0.3em;
  text-align: center; margin: 0; transition: color 0.4s;
}
.theme-bar {
  display: flex; gap: 0.625rem; align-items: center; flex-wrap: wrap; justify-content: center;
}

/* Agrandies dans l'onglet Thèmes (2026-08-14, refonte mobile — voir
   docs/daidalos-mobile-ihm-spec.md §4.4/Phase 0) : 30px→60px, au-delà de la
   cible tactile 44px minimum retenue pour cette refonte. */
.theme-btn {
  width: 3.75rem; height: 3.75rem; padding: 0;
  border-radius: 0.1875rem; font-size: 1.625rem;
  display: flex; align-items: center; justify-content: center;
  border: 1px solid rgba(255,255,255,0.15); cursor: pointer;
  background: rgba(255,255,255,0.04);
  transition: transform 0.15s, border-color 0.15s, box-shadow 0.15s;
  color: unset; text-transform: none; letter-spacing: 0;
}
.theme-btn:hover { transform: scale(1.08); background: rgba(255,255,255,0.04); }
.theme-btn:hover, .theme-btn.active:hover { color: unset; }
.theme-btn.active {
  border-color: white !important; box-shadow: 0 0 8px white; transform: scale(1.05);
}
/* override global button hover for theme-btn */
.theme-btn:hover { background: rgba(255,255,255,0.1) !important; color: unset !important; box-shadow: none; }
.theme-btn.active:hover { box-shadow: 0 0 8px white !important; }

/* ── Barre d'onglets lobby (Daily / Jeu / Thèmes) ── refonte mobile
   2026-08-14, voir docs/daidalos-mobile-ihm-spec.md §4.1. Fixe en bas du
   viewport, masquée pendant l'écran de jeu (voir #container.lobby-hidden
   plus haut — la barre est enfant de #container, donc masquée avec lui). */
#lobby-tabbar {
  display: flex;
  position: fixed; left: 0; right: 0; bottom: 0; z-index: 60;
  border-top: 1px solid var(--border-color);
  background: var(--bg);
  transition: background 0.5s, border-color 0.4s;
}
.lobby-tab {
  flex: 1; padding: 0.75rem 0.375rem; min-height: 2.75rem;
  font-size: 0.8rem; letter-spacing: 0.15em;
  border: none; border-right: 1px solid var(--border-color);
  background: transparent; color: var(--c2); cursor: pointer;
  transition: opacity 0.2s, background 0.2s, color 0.2s, border-color 0.4s;
}
.lobby-tab:last-child { border-right: none; }
/* Onglet du milieu ("Jeu") visuellement plus large — demande explicite de
   l'utilisateur ("au milieu, un peu plus large"). */
.lobby-tab[data-tab="game"] { flex: 1.4; }
.lobby-tab.active { background: var(--c1); color: var(--bg); }
.lobby-tab:hover:not(.active) { opacity: 0.75; }

/* ── Panneaux lobby (Daily / Jeu / Thèmes) — un seul affiché à la fois,
   remplace #mode-tabs/#ui-panels/#daily-panel/#calendar-popin.
   max-width (2026-08-14, demande explicite : le calendrier de l'onglet
   Daily — grille CSS `repeat(7, 1fr)`, voir #cal-grid — s'étirait sur toute
   la largeur du viewport, illisible sur desktop malgré un rendu correct sur
   mobile) : #container a déjà `align-items: center`, donc plafonner ici
   suffit à centrer les 3 panneaux sans media query (sans effet tant que le
   viewport est plus étroit que la borne — mobile inchangé). Cohérent avec
   les autres largeurs "boîte" déjà en place dans ce fichier (popins
   ~340-520px, #maze-wrapper 560px max). Aucun effet visuel notable sur Jeu/
   Thèmes, déjà bornés par leurs propres enfants (.btn-launch 280px max,
   vignettes qui wrap) — la protection vaut aussi pour tout futur contenu. ── */
.lobby-panel { display: none; flex-direction: column; gap: 1rem; width: 100%; max-width: 30rem; }
.lobby-panel.active { display: flex; }

#lobby-game.active {
  flex-direction: row; align-items: flex-start; justify-content: space-between; gap: 1rem;
}
#game-config-wrap { display: flex; flex-direction: column; gap: 1rem; flex: 1; align-items: center; min-width: 0; }
#best-display { display: flex; flex-direction: column; align-items: center; gap: 0.125rem; }
.btn-launch { width: 100%; max-width: 17.5rem; padding: 0.875rem; font-size: 0.875rem; min-height: 2.75rem; }
#lobby-game-icons { display: flex; flex-direction: column; gap: 0.5rem; flex-shrink: 0; }
#lobby-game-icons button { min-width: 2.75rem; min-height: 2.75rem; }

/* Overlay */
#overlay {
  position: absolute; inset: 0; background: rgba(0,0,0,0.88);
  display: flex; flex-direction: column;
  align-items: center; justify-content: center;
  gap: 0.75rem; z-index: 10; font-family: var(--font-title);
}
#overlay.hidden { display: none; }
#overlay-title { font-size: 2.875rem; color: var(--c1); text-shadow: 0 0 20px var(--c1); letter-spacing: 0.08em; transition: color 0.4s, text-shadow 0.4s; }
#overlay-sub { font-size: 1.1875rem; color: var(--c2); letter-spacing: 0.2em; transition: color 0.4s; }
#overlay-time { font-size: 2rem; color: var(--c1); text-shadow: 0 0 10px var(--c1); transition: color 0.4s; }
#overlay-best { font-size: 1rem; color: var(--c2); transition: color 0.4s; }

/* D-pad — overlay flottant sur le labyrinthe (pas dans le flux, pour rester
   atteignable sans scroller même quand tous les panneaux sont visibles) */
#dpad {
  display: none;
  position: absolute; left: 0.5rem; bottom: 0.5rem; z-index: 5;
  grid-template-columns: repeat(3,2.5rem); grid-template-rows: repeat(3,2.5rem); gap: 0.1875rem;
}
@media (pointer: coarse) { #dpad { display: grid; } }
/* Option "Zones de déplacement" (popin config, off/on) — "off" masque le D-pad
   totalement, y compris sur pointeur tactile ; "on" garde le comportement
   par défaut ci-dessus (visible seulement sur pointeur tactile) et active en
   plus les zones .dpad-zone invisibles plus bas — voir daidalos.js § D-PAD MODE */
body.dpad-off #dpad { display: none; }
.dpad-btn {
  width: 2.5rem; height: 2.5rem; padding: 0; font-size: 1rem; display: flex; align-items: center; justify-content: center;
  touch-action: none; user-select: none;
  background: rgba(0,0,0,0.55); backdrop-filter: blur(2px);
}
.dpad-empty { background:transparent;border:none;pointer-events:none; }
.dpad-empty:hover { background:transparent;box-shadow:none; }

/* Zones de direction invisibles, plein écran sur le labyrinthe — la
   télécommande Android TV ne pilote pas les flèches en keydown mais une
   navigation/tap synthétique qui ne vise que des éléments interactifs
   (voir CLAUDE.md du jeu § Spécificités Android TV) : plutôt que d'obliger à viser le
   petit D-pad, ces 4 boutons (triangles se rejoignant au centre, aucune
   zone morte) couvrent tout #maze-wrapper, donc n'importe quel point où le
   "curseur" de la télécommande atterrit correspond déjà à une direction.
   pointer-events désactivé hors mode "zones" pour ne jamais gêner le swipe
   tactile normal sur le canvas (mobile).
   ⚠️ La règle générique `button:hover` (plus haut, thème des boutons du jeu)
   s'applique à TOUT `<button>` y compris `.dpad-zone` — sans l'override
   `:hover` ci-dessous, le triangle se peint en `var(--c1)` (couleur du
   thème, opaque) + glow dès que le curseur de la télécommande le survole.
   Confirmé sur l'appareil réel ET sur Windows (donc pas un calque
   d'accessibilité système comme d'abord supposé, purement ce `:hover` CSS
   oublié) : `.dpad-zone:hover/:focus/:active/:focus-visible` doivent tous
   rester transparents, sans outline ni box-shadow. */
.dpad-zone {
  position: absolute; inset: 0; z-index: 4;
  width: 100%; height: 100%;
  margin: 0; padding: 0; border: none; background: transparent;
  pointer-events: none; touch-action: none;
  outline: none; -webkit-tap-highlight-color: transparent;
}
.dpad-zone:hover, .dpad-zone:focus, .dpad-zone:active, .dpad-zone:focus-visible {
  background: transparent; box-shadow: none; outline: none;
}
/* Option "Zones de déplacement" activée uniquement — voir daidalos.js § D-PAD MODE */
body.dpad-zones-active .dpad-zone { pointer-events: auto; }
.dpad-zone[data-dir="up"]    { clip-path: polygon(0 0, 100% 0, 50% 50%); }
.dpad-zone[data-dir="down"]  { clip-path: polygon(0 100%, 100% 100%, 50% 50%); }
.dpad-zone[data-dir="left"]  { clip-path: polygon(0 0, 0 100%, 50% 50%); }
.dpad-zone[data-dir="right"] { clip-path: polygon(100% 0, 100% 100%, 50% 50%); }

/* Rendu visuel des zones — purement décoratif (pointer-events: none, le clic
   reste géré par les <button>.dpad-zone ci-dessus). Un simple border/outline
   CSS ne peut pas dessiner un contour qui suit un clip-path triangulaire (il
   ne suivrait que les bords du rectangle d'origine, pas les diagonales du
   découpage) — un <polygon> SVG le permet nativement via fill/stroke
   séparés. viewBox 0 0 100 100 + preserveAspectRatio="none" fait coïncider
   exactement les points avec ceux des clip-path ci-dessus (mêmes % de
   coordonnées) quel que soit le ratio réel de #maze-wrapper. */
.dpad-zone-visual {
  display: none;
  position: absolute; inset: 0; z-index: 4;
  width: 100%; height: 100%;
  pointer-events: none;
}
body.dpad-zones-active .dpad-zone-visual { display: block; }
.dpad-zone-shape {
  fill: var(--c1); fill-opacity: 0.00;
  stroke: var(--c1); stroke-opacity: 0.25; stroke-width: 0.5;
  vector-effect: non-scaling-stroke;
}


/* ── Scores popin ── */
#scores-popin {
  display: none;
  position: fixed; inset: 0; z-index: 2000;
  align-items: center; justify-content: center;
  background: rgba(0,0,0,0.75);
  backdrop-filter: blur(3px);
  padding: 0.5rem 0; /* évite que la box touche le header/footer */
  box-sizing: border-box;
}
#scores-popin.open { display: flex; }

#scores-box {
  background: var(--bg);
  border: 1px solid var(--c2);
  box-shadow: 0 0 30px color-mix(in srgb, var(--c1) 20%, transparent);
  padding: 1.5rem 1.75rem;
  min-width: 21.25rem; max-width: 94vw;
  max-height: calc(100vh - var(--header-height, 3.5rem) - 5rem);
  display: flex; flex-direction: column; gap: 0.875rem;
  position: relative;
  font-family: var(--font-main);
  overflow: hidden; /* clip interne, le scroll est sur les panels */
}

#scores-header {
  display: flex; align-items: center; justify-content: space-between;
}
#scores-title {
  font-family: var(--font-title);
  font-size: 1.75rem; color: var(--c1);
  text-shadow: 0 0 10px var(--c1);
  letter-spacing: 0.15em;
}
#scores-close {
  font-size: 0.8rem; padding: 0.3125rem 0.75rem; letter-spacing: 0.15em;
}

#scores-filters {
  display: flex; gap: 0.375rem; flex-wrap: wrap; align-items: center;
  font-size: 0.8rem; color: var(--c2); letter-spacing: 0.2em;
}
#scores-filters span { opacity: 0.6; }
/* Voir button:hover / .diff-btn plus haut pour le principe : couleur
   dédiée (--c2) plutôt qu'opacité pour l'état inactif, --bg plutôt que #000
   figé pour le texte sur fond --c1 (audit Lighthouse 2026-08-12). */
.sf-btn {
  font-size: 0.8rem; padding: 0.25rem 0.5625rem; letter-spacing: 0.1em;
  color: var(--c2); border-color: var(--c2);
}
.sf-btn.active { color: var(--bg); background: var(--c1); border-color: var(--c1); box-shadow: 0 0 8px var(--c1); }
.sf-btn:hover { opacity: 0.85; }
.sf-btn.active:hover { opacity: 1; }

#scores-table-wrap {
  overflow-y: auto; max-height: 45vh;
  /* scrollbar-width/scrollbar-color hérités du :root (voir en tête de fichier) */
}
#scores-table {
  width: 100%; border-collapse: collapse;
  font-size: 0.8rem; color: var(--c1);
}
#scores-table th {
  font-size: 0.8rem; letter-spacing: 0.25em; color: var(--c2);
  border-bottom: 1px solid var(--c3);
  padding: 0.25rem 0.5rem; text-align: left; position: sticky; top: 0;
  background: var(--bg);
}
#scores-table td {
  padding: 0.3125rem 0.5rem;
  border-bottom: 1px solid var(--c3);
}
#scores-table tr:last-child td { border-bottom: none; }
#scores-table tr.highlight td { color: var(--c1); text-shadow: 0 0 6px var(--c1); }
#scores-empty {
  text-align: center; color: var(--c2); font-size: 0.8rem;
  letter-spacing: 0.2em; opacity: 0.6; padding: 1.25rem 0;
}
#scores-clear {
  font-size: 0.8rem; padding: 0.3125rem 0.75rem; letter-spacing: 0.1em;
  border-color: #cc3300; color: #cc3300; align-self: flex-start;
}
#scores-clear:hover { background: #cc3300; color: #000; box-shadow: 0 0 10px #cc3300; }


/* ── Lang selector ── */
#lang-selector {
  position: fixed; top: 0.625rem; right: 0.75rem; z-index: 1000;
  display: flex; align-items: center; gap: 0;
}
#lang-select {
  background: transparent;
  color: var(--c1);
  border: 1px solid var(--c2);
  font-family: var(--font-main);
  font-size: 0.8rem;
  padding: 0.25rem 0.5rem;
  letter-spacing: 0.1em;
  cursor: pointer;
  outline: none;
  appearance: none;
  -webkit-appearance: none;
  transition: border-color 0.4s, color 0.4s;
}
#lang-select option {
  background: #111;
  color: #fff;
}
#lang-select:hover { border-color: var(--c1); }


/* ── Fog toggle ── */
#fog-control {
  display: flex; align-items: center; gap: 0.5rem;
  font-size: 0.8rem; color: var(--c2); letter-spacing: 0.2em;
  transition: color 0.4s;
}
#btn-fog {
  font-size: 0.8rem; padding: 0.375rem 0.875rem; letter-spacing: 0.15em;
  position: relative; color: var(--c2); border-color: var(--c2);
}
#btn-fog.on {
  background: var(--c1); color: var(--bg); border-color: var(--c1);
  box-shadow: 0 0 10px var(--c1);
}
#btn-fog:hover { opacity: 0.85; }
#btn-fog.on:hover { opacity: 1; }


/* ── Onglet Daily (#lobby-daily) — refonte mobile 2026-08-14, voir
   docs/daidalos-mobile-ihm-spec.md §4.2. Remplace #mode-tabs (disparu, voir
   #lobby-tabbar plus haut) et #daily-panel/.visible. ── */
/* Grille à 3 colonnes (pas flex + space-between) : la colonne centrale doit
   toujours rester visuellement centrée, quelle que soit la largeur du
   contenu des colonnes latérales — avec justify-content:space-between,
   l'élément central se décalait selon la longueur des libellés meilleur
   temps/nom de thème (signalé par l'utilisateur, 2026-08-14). Les deux
   colonnes latérales partagent le même `1fr` : elles ont donc toujours la
   même largeur l'une que l'autre (peu importe leur contenu), ce qui place
   mathématiquement la colonne centrale (`auto`) en son milieu exact. */
#daily-info {
  display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; gap: 0.625rem;
  font-size: 0.8rem; color: var(--c2); letter-spacing: 0.2em;
  border: 1px solid var(--border-color); padding: 0.375rem 0.875rem;
  transition: border-color 0.4s, color 0.4s;
}
.daily-info-center { text-align: center; }
.daily-info-side--right { text-align: right; }
#daily-date-label { font-family: var(--font-title); font-size: 1.375rem; color: var(--c1); transition: color 0.4s; }
#daily-theme-badge { font-size: 1.125rem; display: flex; justify-content: center; }
/* loadThemeIcon() injecte du SVG brut (width/height="512" dans les fichiers
   source, voir www/assets/icons/) — sans cette règle il s'affiche à sa taille
   intrinsèque au lieu d'une icône de badge (même valeur que .theme-btn svg). */
#daily-theme-badge svg { width: 1.125rem; height: 1.125rem; display: block; }
#daily-best-label { font-size: 0.8rem; letter-spacing: 0.3em; opacity: 0.7; }
#daily-best-val { font-family: var(--font-title); font-size: 1.375rem; color: var(--c1); text-shadow: 0 0 6px var(--c1); transition: color 0.4s, text-shadow 0.4s; }
#seed-display { font-size: 0.8rem; color: var(--c2); opacity: 0.7; margin-top: 0.125rem; }

#daily-controls { display: flex; gap: 0.5rem; justify-content: center; flex-wrap: wrap; }
#daily-controls button { min-height: 2.75rem; }

/* ── Calendrier — affiché directement dans l'onglet Daily, plus en popin
   (#calendar-popin/#cal-close supprimés, voir docs/daidalos-mobile-ihm-spec.md
   §4.2 : « calendrier affiché directement dans l'onglet »). #calendar-box
   garde le même contenu interne (titre/nav/grille), juste sans le fond/
   overlay plein écran qu'imposait la popin. ── */
#calendar-box {
  border: 1px solid var(--c2);
  padding: 0.875rem 1rem;
  display: flex; flex-direction: column; gap: 0.875rem; font-family: var(--font-main);
  transition: border-color 0.4s;
}
#cal-header { display: flex; align-items: center; justify-content: space-between; }
#cal-title { font-family: var(--font-title); font-size: 1.375rem; color: var(--c1); text-shadow: 0 0 8px var(--c1); letter-spacing: 0.1em; }
#cal-nav { display: flex; gap: 0.375rem; }
.cal-nav-btn { font-size: 0.8rem; padding: 0.25rem 0.625rem; letter-spacing: 0.1em; min-width: 2.75rem; min-height: 2.75rem; }

#cal-grid-header {
  display: grid; grid-template-columns: repeat(7, minmax(0, 1fr));
  gap: 0.1875rem; text-align: center; font-size: 0.8rem;
  color: var(--c2); opacity: 0.6; letter-spacing: 0.1em;
}
/* minmax(0, 1fr) plutôt que 1fr seul (2026-08-15) : un `1fr` nu équivaut à
   `minmax(auto, 1fr)` — la colonne ne peut pas rétrécir sous le min-content
   de son contenu (ici .cal-day-time, ex. "01:11.45"), donc si ce contenu est
   plus large que la part équitable de la colonne, toute la grille pousse et
   déborde de #calendar-box au lieu de laisser le contenu se contraindre.
   Bug réel constaté (grid.scrollWidth > clientWidth) une fois le plancher de
   police à 0.8rem appliqué — voir CLAUDE.md § Accessibilité. minmax(0, 1fr)
   retire ce plancher implicite : les colonnes se partagent toujours l'espace
   disponible à parts égales, quel que soit leur contenu. */
#cal-grid {
  display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); gap: 0.1875rem;
}
.cal-day {
  aspect-ratio: 1; display: flex; flex-direction: column;
  align-items: center; justify-content: center;
  font-size: 1rem; border: 1px solid transparent;
  cursor: default; transition: border-color 0.15s;
  position: relative; padding: 0.125rem;
}
.cal-day.playable { cursor: pointer; border-color: var(--c3); }
.cal-day.playable:hover { border-color: var(--c2); background: rgba(255,255,255,0.04); }
.cal-day.today { border-color: var(--c1) !important; box-shadow: 0 0 6px var(--c1); }
.cal-day.done { background: rgba(0,255,65,0.12); border-color: var(--c2); }
.cal-day.done .cal-day-num { color: var(--c1); }
/* Jour sélectionné (activeDailyDate) — celui que Défier va lancer, distinct
   du simple marqueur "aujourd'hui" (.today, une bordure) : un jour peut être
   sélectionné sans être aujourd'hui (clic sur un autre jour jouable), et
   inversement le jour du jour reste marqué même quand un autre jour est
   sélectionné. Priorité visuelle sur .done (déclarée après dans la cascade,
   même spécificité) : le fond de sélection prime sur le fond "complété".
   Voir docs/daidalos-mobile-ihm-spec.md §4.2. */
.cal-day.selected { background: color-mix(in srgb, var(--c1) 20%, transparent); border-color: var(--c1); }
.cal-day.selected .cal-day-num { color: var(--c1); }
.cal-day.empty { border: none; cursor: default; }
.cal-day.future { opacity: 0.2; cursor: default; }
.cal-day.before-start { opacity: 0.15; cursor: default; }
/* Numéro du jour + icône du thème du jour, sur la même ligne — affichée
   quel que soit l'état de la case (voir renderCalendar(), daidalos.js).
   Icône volontairement minuscule (8px) : la cellule elle-même ne fait que
   quelques dizaines de pixels dans une grille à 7 colonnes. */
.cal-day-header { display: flex; align-items: center; justify-content: center; gap: 0.1875rem; }
.cal-day-num { font-size: 1rem; font-weight: bold; color: var(--c2); line-height: 1; }
.cal-day-theme-icon { width: 0.5rem; height: 0.5rem; display: flex; flex-shrink: 0; }
.cal-day-theme-icon svg { width: 0.5rem; height: 0.5rem; display: block; }
.cal-day-time { font-size: 0.8rem; color: var(--c1); opacity: 0.8; margin-top: 0.0625rem; line-height: 1; }
.cal-day-dot { width: 0.3125rem; height: 0.3125rem; border-radius: 50%; background: var(--c1); margin-top: 0.0625rem; box-shadow: 0 0 4px var(--c1); }

#cal-playing-indicator {
  font-size: 0.8rem; color: var(--c2); letter-spacing: 0.15em;
  text-align: center; opacity: 0.7;
  border-top: 1px solid var(--c3); padding-top: 0.625rem;
}


/* ── Pause overlay ── */
#pause-overlay {
  display: none;
  position: absolute; inset: 0; z-index: 20;
  background: rgba(0,0,0,0.82);
  flex-direction: column;
  align-items: center; justify-content: center;
  gap: 0.75rem;
  font-family: var(--font-title);
  cursor: pointer;
}
#pause-overlay.visible { display: flex; }
#pause-icon {
  font-size: 3.25rem; color: var(--c1);
  text-shadow: 0 0 20px var(--c1);
  animation: pausePulse 1.8s ease-in-out infinite;
}
#pause-title {
  font-size: 2.25rem; color: var(--c1);
  text-shadow: 0 0 12px var(--c1);
  letter-spacing: 0.15em;
}
#pause-sub {
  font-size: 1rem; color: var(--c2);
  letter-spacing: 0.2em; opacity: 0.8;
}
@keyframes pausePulse {
  0%, 100% { opacity: 1; transform: scale(1); }
  50%       { opacity: 0.5; transform: scale(0.92); }
}


/* ── Icônes flottantes de l'onglet Jeu (Scores/⚙/❓) ── remplace
   #action-bar (supprimé, voir #lobby-game-icons plus haut). */
#btn-config {
  font-size: 0.8rem; padding: 0.4375rem 0.75rem; letter-spacing: 0.1em;
  border: 1px solid var(--c2); color: var(--c2);
  transition: all 0.2s;
}
#btn-config:hover { color: var(--c1); border-color: var(--c1); box-shadow: 0 0 10px var(--c1); background: transparent; }

/* ── Config popin ── */
#config-popin {
  display: none; position: fixed; inset: 0; z-index: 2000;
  align-items: center; justify-content: center;
  background: rgba(0,0,0,0.75); backdrop-filter: blur(3px);
}
#config-popin.open { display: flex; }
#config-box {
  background: var(--bg); border: 1px solid var(--c2);
  box-shadow: 0 0 30px color-mix(in srgb, var(--c1) 20%, transparent);
  padding: 1.375rem 1.75rem; min-width: 17.5rem;
  display: flex; flex-direction: column; gap: 1rem;
  font-family: var(--font-main);
}
#config-header {
  display: flex; align-items: center; justify-content: space-between;
}
#config-title {
  font-family: var(--font-title); font-size: 1.625rem;
  color: var(--c1); text-shadow: 0 0 10px var(--c1); letter-spacing: 0.15em;
}
#config-close { font-size: 0.8rem; padding: 0.3125rem 0.75rem; letter-spacing: 0.15em; }
.config-row {
  display: flex; align-items: center; justify-content: space-between;
  font-size: 0.8rem; color: var(--c2); letter-spacing: 0.25em;
  border-bottom: 1px solid var(--c3); padding-bottom: 0.75rem;
}
.config-row:last-child { border-bottom: none; padding-bottom: 0; }
.config-row button {
  font-size: 0.8rem; padding: 0.3125rem 1rem; letter-spacing: 0.15em;
  min-width: 3.75rem; color: var(--c2); border-color: var(--c2);
}
.config-row button.on {
  background: var(--c1); color: var(--bg); border-color: var(--c1); box-shadow: 0 0 10px var(--c1);
}
.config-row button:hover { opacity: 0.85; }
.config-row button.on:hover { opacity: 1; }
/* Ligne d'option avec explication en dessous — toutes les options de
   config-popin en ont une depuis le 2026-08-14 (demande explicite), pas
   seulement "Zones de déplacement" (introduite avec ce patron avant les
   autres) — même ligne label+bouton que .config-row en haut, plus une
   légende en petit et en clair (pas de majuscules/espacement large, pour
   rester lisible sur une phrase complète). */
.config-row--stacked { flex-direction: column; align-items: stretch; gap: 0.5rem; }
.config-row-main { display: flex; align-items: center; justify-content: space-between; }
.config-hint {
  font-size: 0.8rem; color: var(--c2); opacity: 0.65;
  letter-spacing: normal; text-transform: none; line-height: 1.5; margin: 0;
}


/* ── Help popin ── */
#help-popin {
  display: none; position: fixed; inset: 0; z-index: 2000;
  align-items: center; justify-content: center;
  background: rgba(0,0,0,0.75); backdrop-filter: blur(3px);
}
#help-popin.open { display: flex; }
#help-box {
  background: var(--bg); border: 1px solid var(--c2);
  box-shadow: 0 0 30px color-mix(in srgb, var(--c1) 20%, transparent);
  padding: 1.375rem 1.75rem; min-width: 18.75rem; max-width: min(32.5rem, 94vw);
  max-height: 85vh; overflow-y: auto;
  display: flex; flex-direction: column; gap: 1rem;
  font-family: var(--font-main);
  /* scrollbar-width/scrollbar-color hérités du :root (voir en tête de fichier) */
}
#help-header {
  display: flex; align-items: center; justify-content: space-between;
}
#help-title {
  font-family: var(--font-title); font-size: 1.625rem;
  color: var(--c1); text-shadow: 0 0 10px var(--c1); letter-spacing: 0.15em;
}
#help-close { font-size: 0.8rem; padding: 0.3125rem 0.75rem; letter-spacing: 0.15em; }

.help-section { display: flex; flex-direction: column; gap: 0.5rem; }
.help-section-title {
  font-size: 0.8rem; letter-spacing: 0.35em; color: var(--c2);
  border-bottom: 1px solid var(--c3); padding-bottom: 0.3125rem;
  text-transform: uppercase;
}
.help-row {
  display: flex; align-items: baseline; justify-content: space-between;
  gap: 0.75rem; font-size: 0.8rem; color: var(--c1);
}
.help-key {
  font-family: var(--font-title); font-size: 0.9375rem;
  color: var(--c2); white-space: nowrap; text-align: right; min-width: 7.5rem;
}
.help-desc { color: var(--c1); opacity: 0.85; font-size: 0.8rem; }
.help-text {
  font-size: 0.8rem; color: var(--c1); opacity: 0.8; line-height: 1.6;
  letter-spacing: 0.05em;
}
#btn-help {
  font-size: 0.8rem; padding: 0.4375rem 0.75rem; letter-spacing: 0.1em;
  border: 1px solid var(--c2); color: var(--c2);
  font-weight: bold;
  transition: all 0.2s;
}
#btn-help:hover { color: var(--c1); border-color: var(--c1); box-shadow: 0 0 10px var(--c1); background: transparent; }


/* ── Scores/Stats tabs ── */
#scores-tabs {
  display: flex; gap: 0;
  border-bottom: 1px solid var(--c3);
}
.scores-tab {
  flex: 1; padding: 0.375rem 0; font-size: 0.8rem; letter-spacing: 0.2em;
  background: transparent; border: none; border-bottom: 2px solid transparent;
  color: var(--c2); cursor: pointer; opacity: 0.5;
  transition: opacity 0.2s, border-color 0.2s, color 0.2s;
  font-family: var(--font-main);
}
.scores-tab.active { opacity: 1; color: var(--c1); border-bottom-color: var(--c1); }
.scores-tab:hover:not(.active) { opacity: 0.75; }

/* ── Stats panel ── */
/* scrollbar-width/scrollbar-color héritées du :root (voir en tête de fichier) */
#scores-panel { display: flex; flex-direction: column; gap: 0.625rem; overflow-y: auto; flex: 1; }
#stats-panel { display: none; flex-direction: column; gap: 0.875rem; overflow-y: auto; flex: 1; }
#stats-panel.visible { display: flex; }
#scores-panel { display: flex; flex-direction: column; gap: 0.625rem; }
#scores-panel.hidden { display: none; }

.stats-section { display: flex; flex-direction: column; gap: 0.375rem; }
.stats-section-title {
  font-size: 0.8rem; letter-spacing: 0.35em; color: var(--c2);
  border-bottom: 1px solid var(--c3); padding-bottom: 0.25rem;
}
.stats-row {
  display: flex; justify-content: space-between; align-items: baseline;
  font-size: 0.8rem; padding: 0.1875rem 0;
  border-bottom: 1px solid var(--c3);
}
.stats-row:last-child { border-bottom: none; }
.stats-label { color: var(--c2); letter-spacing: 0.1em; flex-shrink: 0; max-width: 55%; }
.stats-value {
  font-family: var(--font-title); font-size: 1.25rem;
  color: var(--c1); text-shadow: 0 0 6px var(--c1);
}
.stats-value.small { font-size: 0.9375rem; }
.stats-value-group { display: flex; flex-direction: column; align-items: flex-end; gap: 0.0625rem; }
.stats-sublabel { font-size: 0.8rem; color: var(--c2); letter-spacing: 0.1em; opacity: 0.8; }

/* Lignes avec description */
.stats-row--described {
  flex-direction: column;
  align-items: stretch;
  gap: 0.1875rem;
}
.stats-row-top {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
}
.stats-row--described .stats-label { max-width: 100%; }
.stats-desc {
  font-size: 0.8rem;
  color: var(--c2);
  letter-spacing: 0.08em;
  opacity: 0.6;
  font-style: italic;
  padding-left: 0.0625rem;
}

#help-tabs {
  display: flex; gap: 0;
  border-bottom: 1px solid var(--c3); margin-bottom: 0.25rem;
}
.help-tab {
  flex: 1; padding: 0.375rem 0; font-size: 0.8rem; letter-spacing: 0.2em;
  background: transparent; border: none; border-bottom: 2px solid transparent;
  color: var(--c2); cursor: pointer; opacity: 0.5;
  transition: opacity 0.2s, border-color 0.2s, color 0.2s;
  font-family: var(--font-main);
}
.help-tab.active { opacity: 1; color: var(--c1); border-bottom-color: var(--c1); }
.help-tab:hover:not(.active) { opacity: 0.75; }
#help-title { font-family: var(--font-title); font-size: 1.625rem; color: var(--c1); text-shadow: 0 0 10px var(--c1); letter-spacing: 0.1em; }


/* ── Theme button SVG icons ── agrandies avec .theme-btn (30→60px), voir plus haut */
.theme-btn svg { width: 2.125rem; height: 2.125rem; display: block; }
.theme-btn.active { box-shadow: 0 0 8px white; border-color: white !important; }
