/* ==========================================================================
   STRAWBERRY CREW — Reproduction fidèle du site strawberrycrew.com
   Thème clair. Rouge #DB3535 · Vert #86D629 · Gris #3B3838
   Polices : Poppins (nav/titres) · Exo 2 (hero) · Montserrat · Open Sans
   ========================================================================== */

:root {
  --rouge: #db3535;
  --rouge-charte: #dc3434;
  --vert: #86d629;
  --gris-fonce: #323131;
  --gris-texte: #3b3838;
  --gris-clair: #f3f3f3;
  --blanc: #ffffff;
  --header-h: 92px;
  /* Outils de la DA minimaliste : le filet remplace les ombres et les
     contours de cartes, la sourdine porte les métadonnées. */
  --filet: rgba(0, 0, 0, .1);
  --sourdine: #8a8a8a;
  /* Neutres de prose et variantes d'accent : ils etaient ecrits en dur des
     dizaines de fois, et le mode sombre devait les rattraper un par un.
     Passes en tokens, ils basculent tout seuls (voir le bloc MODE SOMBRE). */
  --corps: #6b6b6b;          /* prose secondaire */
  --corps-fort: #333333;     /* prose appuyee */
  --rouge-fonce: #c22b2b;    /* survol des pleins rouges */
  --rouge-doux: #fff0f0;     /* survol des pilules rouges */
  color-scheme: light;
}

/* Le toggle de thème pose data-theme="dark" sur <html> (script inline dans le
   <head>, avant le premier rendu → aucun flash). Le mode sombre est un
   thème COMPLET : voir le grand bloc « MODE SOMBRE » en fin de feuille. */
.theme-toggle {
  display: inline-grid; place-items: center; flex: none;
  width: 34px; height: 34px; padding: 0;
  border: 1px solid var(--filet); border-radius: 50%;
  background: none; color: var(--gris-texte); cursor: pointer;
  transition: color .2s ease, border-color .2s ease, background .2s ease;
}
.theme-toggle:hover { color: var(--rouge); border-color: var(--rouge); }
.theme-toggle .th-i { width: 18px; height: 18px; }
/* Clair : on montre la lune (cliquer → sombre). Sombre : le soleil. */
.th-sun { display: none; }
:root[data-theme="dark"] .th-moon { display: none; }
:root[data-theme="dark"] .th-sun { display: block; }

* { margin: 0; padding: 0; box-sizing: border-box; }

body {
  font-family: 'Open Sans', sans-serif;
  color: var(--gris-texte);
  background: var(--blanc);
  /* clip et pas hidden : hidden ferait du body un conteneur de défilement,
     ce qui désamorce tous les position:sticky de la page (frise Histoire). */
  overflow-x: clip;
  -webkit-font-smoothing: antialiased;
}

img { max-width: 100%; height: auto; display: block; }
a { text-decoration: none; color: inherit; }
:focus-visible { outline: 3px solid var(--vert); outline-offset: 2px; }

.container { width: min(1200px, 92%); margin-inline: auto; }

.skip-link {
  position: absolute; left: -9999px; top: 8px; z-index: 999;
  background: var(--rouge); color: #fff; padding: 10px 18px; border-radius: 36px;
  font-family: 'Poppins', sans-serif; font-weight: 600;
}
.skip-link:focus { left: 12px; }

/* ==========================================================================
   HEADER — barre pilule blanche, bordure rouge, arrondi 36px
   ========================================================================== */
.site-header {
  position: fixed; top: 18px; left: 0; right: 0; z-index: 200;
  display: flex; justify-content: center;
  pointer-events: none;
}
.header-pill {
  pointer-events: auto;
  position: relative; /* ancre le menu déroulant mobile sur la pilule, pas sur le header pleine largeur */
  display: flex; align-items: center; gap: 22px;
  background: var(--blanc);
  border: 2px solid var(--rouge);
  border-radius: 36px;
  padding: 8px 22px;
  box-shadow: 0 6px 24px rgba(0, 0, 0, .07);
  max-width: 94vw;
}
.header-pill .logo img { width: 34px; height: 34px; }

.nav-menu { display: flex; align-items: center; list-style: none; }
.nav-menu > li { position: relative; }
.nav-menu > li > a {
  display: block; padding: 0 15px;
  font-family: 'Poppins', sans-serif; font-size: 14px; font-weight: 500;
  color: #000; line-height: 30px; white-space: nowrap;
  transition: color .2s ease;
}
.nav-menu > li > a:hover,
.nav-menu > li.current > a { color: var(--vert); }

/* Sous-menu "Autre" */
.nav-menu .has-sub > a::after {
  content: '▾'; font-size: 10px; margin-left: 6px; color: var(--rouge);
}
.sub-menu {
  position: absolute; top: calc(100% + 14px); left: 50%; transform: translateX(-50%);
  min-width: 220px; list-style: none;
  background: var(--blanc);
  border: 2px solid var(--rouge);
  border-radius: 36px;
  padding: 14px 10px;
  opacity: 0; visibility: hidden; transition: opacity .2s ease, visibility .2s ease;
}
.nav-menu .has-sub:hover .sub-menu,
.nav-menu .has-sub:focus-within .sub-menu { opacity: 1; visibility: visible; }
.sub-menu a {
  display: block; padding: 8px 18px; text-align: center;
  font-family: 'Poppins', sans-serif; font-size: 14px; font-weight: 500;
  color: var(--gris-texte); transition: color .2s ease;
}
.sub-menu a:hover { color: var(--vert); }

/* Voter — la seule action du site qui fait vraiment venir des joueurs.
   Elle vit dans la pilule, en vert : le rouge est déjà pris par l'accent de
   marque, et le vert est le survol du menu — l'oeil le connaît déjà.
   Le nav-menu passe en burger sous 1024px, donc ce bouton reste visible
   quand le menu se replie : c'est voulu, il ne doit pas dépendre du burger. */
.nav-voter {
  flex: none; display: inline-flex; align-items: center; gap: 6px;
  font-family: 'Poppins', sans-serif; font-size: 13px; font-weight: 600;
  color: #4f7d18; border: 1.5px solid var(--vert); border-radius: 36px;
  padding: 5px 13px; white-space: nowrap;
  transition: background-color .2s ease, color .2s ease;
}
.nav-voter span { font-size: 11px; color: var(--vert); transition: color .2s ease; }
.nav-voter:hover { background: var(--vert); color: #1d2b0a; }
.nav-voter:hover span { color: #1d2b0a; }
@media (max-width: 640px) {
  /* Sur les très petits écrans la pilule déborde : on garde l'étoile seule. */
  .nav-voter { padding: 5px 9px; }
  .nav-voter span + * , .nav-voter { font-size: 0; }
  .nav-voter span { font-size: 13px; }
}

/* Bouton "Copier l'IP" — pilule FIXE en bas de l'écran, comme sur le site réel */
.ip-container {
  position: fixed; bottom: 16px; left: 50%; transform: translateX(-50%);
  z-index: 300; display: inline-block; font-family: 'Arial', sans-serif;
}
.ip-text {
  background-color: white;
  border: 2px solid var(--rouge-charte);
  border-radius: 36px;
  color: var(--rouge-charte);
  cursor: pointer;
  font-size: 14px;
  font-weight: bold;
  padding: 5px 15px;
  position: relative;
  transition: all .2s ease;
  display: inline-block;
  white-space: nowrap;
}
.ip-text:hover { background-color: var(--rouge-doux); }
.ip-text:active { transform: translateY(1px); }
.copy-feedback {
  position: absolute; top: -25px; left: 50%; transform: translateX(-50%);
  background-color: rgba(0, 0, 0, .7); color: white;
  padding: 3px 6px; border-radius: 3px; font-size: 11px;
  opacity: 0; transition: opacity .3s ease; white-space: nowrap;
  pointer-events: none;
}
.copy-feedback.show { opacity: 1; }

/* Burger mobile */
.burger {
  display: none; background: none; border: 0; cursor: pointer;
  padding: 6px; margin-left: auto;
}
.burger span {
  display: block; width: 24px; height: 3px; margin: 4px 0;
  background: var(--gris-texte); border-radius: 2px; transition: background .2s ease;
}
.burger:hover span { background: var(--vert); }

@media (max-width: 1024px) {
  .burger { display: block; margin-left: 0; }
  /* Groupe le toggle avec le burger, à droite (le burger perd son auto). */
  .theme-toggle { margin-left: auto; }
  .header-pill { width: 92vw; justify-content: space-between; gap: 12px; }
  .nav-menu {
    /* left/right à -2px : la bordure du menu s'aligne pile sur celle de la pilule (bordure 2px) */
    position: absolute; top: calc(100% + 12px); left: -2px; right: -2px;
    flex-direction: column; align-items: stretch;
    background: var(--blanc); border: 2px solid var(--rouge); border-radius: 24px;
    padding: 14px; display: none;
  }
  .nav-menu.open { display: flex; }
  .nav-menu > li > a { padding: 10px 16px; line-height: 1.6; }
  .sub-menu {
    position: static; transform: none; opacity: 1; visibility: visible;
    border: 0; border-radius: 0; padding: 0 0 0 14px; min-width: 0;
  }
  .sub-menu a { text-align: left; padding: 8px 16px; }
}

/* ==========================================================================
   HERO — 3 NIVEAUX D'IMMERSION (home uniquement)
   Remplace l'ancien duo « slider three.js plein écran + hero » : chaque
   niveau tient le slider et le message sur un seul écran. Un seul niveau
   est affiché à la fois, le visiteur choisit via la pilule « Immersion ».
     1 · Pioche   — le monde est sous la page, le curseur mine les blocs
     2 · Cylindre — carrousel 3D courbé, successeur CSS du slider three.js
     3 · Bandeau  — les builds défilent derrière le message (« Fusion »)
   Le message (.content-wrapper) est identique aux 3 : seul le décor change.
   ========================================================================== */
/* Sélecteur composé obligatoire : .minecraft-hero (display:flex, height:75vh)
   est déclaré plus bas dans cette feuille et, à spécificité égale, gagnerait
   → les 3 heros s'afficheraient empilés en permanence. */
.minecraft-hero.hero-im {
  display: none;
  height: auto;
  min-height: 100vh;
  min-height: 100dvh;
}
.minecraft-hero.hero-im.on { display: flex; }

@keyframes defile {
  from { transform: translateX(0); }
  to { transform: translateX(-50%); }
}

/* ---------- 1 · PIOCHE ----------
   Une couche de blocs blancs recouvre un build ; ceux que le curseur
   approche s'effacent puis repoussent. Le trou est aligné sur la grille,
   donc blocky — c'est ça qui dit « Minecraft », pas un masque rond. */
.hero-pioche { cursor: none; }
.hero-pioche .content-wrapper { cursor: auto; }
.pioche-monde { position: absolute; inset: 0; z-index: 0; }
.pioche-monde img { width: 100%; height: 100%; object-fit: cover; }
/* Le monde reste en sourdine derrière le message et se donne franchement
   sur les bords : le titre reste lisible où qu'on creuse. */
.pioche-sourdine {
  position: absolute; inset: 0; z-index: 1; pointer-events: none;
  background: radial-gradient(52% 44% at 50% 46%, rgba(255, 255, 255, .88) 24%, rgba(255, 255, 255, .1) 100%);
}
.pioche-surface {
  position: absolute; inset: 0; z-index: 2;
  display: grid;
  grid-template-columns: repeat(var(--cols), 1fr);
  grid-template-rows: repeat(var(--rows), 1fr);
}
.pioche-surface i {
  background: var(--blanc);
  transition: opacity .55s ease;
}
.hero-pioche .grid-overlay { z-index: 3; }
/* Le viseur de bloc du jeu : il se cale sur le bloc visé, il ne flotte pas. */
.pioche-bloc {
  position: fixed; top: 0; left: 0; z-index: 8;
  border: 2px solid rgba(41, 41, 41, .7);
  pointer-events: none;
  opacity: 0;
  transition: opacity .25s ease, border-color .2s ease;
}
.pioche-bloc.vu { opacity: 1; }
.pioche-bloc.creuse { border-color: var(--rouge); }
.pioche-aide {
  position: absolute; left: 50%; transform: translateX(-50%); bottom: 12vh; z-index: 10;
  font-family: 'Poppins', sans-serif; font-size: 11px; font-weight: 600;
  letter-spacing: .24em; text-transform: uppercase; color: #b3aca4;
  pointer-events: none;
}

/* ---------- 2 · CYLINDRE ----------
   9 faces sur un cylindre en CSS pur : même rotation courbée que l'ancien
   slider three.js, sans WebGL ni librairie.

   Message et carrousel sont EMPILÉS DANS LE FLUX et centrés ensemble.
   L'ancienne version collait le message en haut et le carrousel en absolute
   tout en bas, avec des tailles en pixels fixes : sur un grand écran (2545px
   de large) le vide explosait entre les deux et le carrousel restait un petit
   objet perdu. Ici tout dérive de --r, donc tout grandit avec l'écran. */
.minecraft-hero.hero-cylindre {
  /* Borné en vw ET en vh : le carrousel doit remplir l'écran large sans
     jamais déborder en hauteur sur un écran court. */
  --r: clamp(240px, min(30vw, 42vh), 640px);
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: clamp(16px, 3vh, 46px);
  padding-top: var(--header-h);   /* dégage la pilule flottante du header */
}
.hero-cylindre .content-wrapper { padding-top: 0; z-index: 10; }
.cylindre-scene {
  position: relative;
  width: 100%;
  height: calc(var(--r) * 0.8);
  display: flex; justify-content: center; align-items: center;
  /* Perspective proportionnelle au rayon : le grossissement des faces avant
     reste le même (~×1,4) quelle que soit la taille de l'écran. */
  perspective: calc(var(--r) * 3.5);
  /* Le point de fuite tombe au centre de la scène, donc à la hauteur de
     l'anneau : on regarde le cylindre de face. Sans ça on le voit d'en haut
     et on aperçoit sa paroi du fond en plus de celle de devant — l'intérieur
     du tonneau. */
  pointer-events: none;
}
.cylindre-anneau {
  position: relative;
  /* 9 faces sur un cercle : largeur = 2·r·tan(180°/9) ≈ 0,73·r. Au-delà,
     elles se chevauchent (c'était le cas avant : 280px pour un rayon 340). */
  width: calc(var(--r) * 0.73);
  height: calc(var(--r) * 0.46);
  transform-style: preserve-3d;
  animation: cylindreTourne 60s linear infinite;
  pointer-events: auto;
}
.cylindre-anneau:hover { animation-play-state: paused; }
@keyframes cylindreTourne {
  from { transform: rotateX(-7deg) rotateY(0deg); }
  to   { transform: rotateX(-7deg) rotateY(-360deg); }
}
.cylindre-anneau figure {
  position: absolute; inset: 0;
  transform: rotateY(var(--a)) translateZ(var(--r));
  border-radius: 14px; overflow: hidden;
  box-shadow: 0 16px 38px rgba(29, 22, 18, .2);
  background: #eee;
}
.cylindre-anneau img { width: 100%; height: 100%; object-fit: cover; }
/* Ne fond plus que le léger débord des faces inclinées : le carrousel étant
   centré dans le flux, il ne descend plus jusqu'au bas du hero. */
.cylindre-brume {
  position: absolute; left: 0; right: 0; bottom: 0; height: 10vh; z-index: 6;
  background: linear-gradient(180deg, transparent, rgba(255, 255, 255, .92));
  pointer-events: none;
}
/* Pas d'indice « survole pour figer » ici : le bas de l'écran est occupé par
   le carrousel, le texte y était illisible. Le survol reste découvrable. */

/* ---------- 3 · BANDEAU (« Fusion ») ----------
   Le bandeau d'images passe DERRIÈRE le message au lieu d'occuper son
   propre écran : slider + hero sur un seul écran. Les images sont
   dupliquées dans le HTML → translateX(-50%) boucle sans raccord. */
/* Ce padding pousse le message au-dessus du bandeau (le bloc est centré
   verticalement). À 34vh il remontait trop haut et le tag « Serveur Créatif »
   venait frôler la pilule du header. */
.hero-fusion .content-wrapper { padding-bottom: 28vh; z-index: 10; }
.fusion-bande {
  position: absolute; left: -4%; right: -4%; bottom: -3%;
  height: 48vh; z-index: 3; overflow: hidden;
  transform: rotate(-2deg);
  -webkit-mask-image: linear-gradient(90deg, transparent 0%, #000 10%, #000 90%, transparent 100%);
  mask-image: linear-gradient(90deg, transparent 0%, #000 10%, #000 90%, transparent 100%);
}
.fusion-piste {
  display: flex; align-items: flex-end; gap: 22px;
  width: max-content; height: 100%; padding-right: 22px;
  animation: defile 70s linear infinite;
}
.fusion-bande:hover .fusion-piste { animation-play-state: paused; }
.fusion-piste img {
  height: 82%; width: auto; flex: none;
  border-radius: 14px;
  box-shadow: 0 18px 40px rgba(29, 22, 18, .16);
}
.fusion-voile {
  position: absolute; inset: 0; z-index: 4; pointer-events: none;
  background: linear-gradient(180deg, #fff 6%, rgba(255, 255, 255, .92) 30%, rgba(255, 255, 255, .55) 52%, rgba(255, 255, 255, .06) 78%, transparent 100%);
}
/* Le bandeau déborde volontairement sous le bas du hero. Sans ce fondu, les
   images étaient tranchées net pile à la jointure avec la section suivante :
   là elles se dissolvent dans le blanc, qui devient celui de la section. */
.hero-fusion::after {
  content: ''; position: absolute; left: 0; right: 0; bottom: 0;
  height: 18vh; z-index: 5; pointer-events: none;
  background: linear-gradient(180deg, transparent, var(--blanc) 82%);
}

/* ==========================================================================
   PILULE « IMMERSION » — même langage que la pilule IP. Fermée, c'est un
   bouton ; au survol (ou au focus clavier, ou au clic sur tactile) elle
   s'ouvre vers la gauche sur le réglage.
   ========================================================================== */
.immersion {
  position: fixed; right: 16px; bottom: 16px; z-index: 300;
  display: flex; align-items: center;
  background: #fff;
  border: 2px solid var(--rouge-charte);
  border-radius: 36px;
  padding: 5px 15px;
  font-family: 'Poppins', sans-serif;
  transition: background .2s ease;
}
.immersion:hover { background: var(--rouge-doux); }
.immersion-btn {
  background: none; border: 0; padding: 0; cursor: pointer;
  color: var(--rouge-charte);
  font-family: 'Arial', sans-serif; font-size: 14px; font-weight: bold;
  white-space: nowrap;
}
.immersion-reglage {
  display: flex; align-items: center; gap: 10px;
  max-width: 0; opacity: 0; margin-right: 0;
  overflow: hidden;
  transition: max-width .35s ease, opacity .25s ease, margin-right .35s ease;
}
.immersion:hover .immersion-reglage,
.immersion:focus-within .immersion-reglage,
.immersion.ouverte .immersion-reglage {
  max-width: 200px; opacity: 1; margin-right: 12px;
}
.immersion-nom {
  font-size: 12px; font-weight: 600; color: var(--gris-texte);
  min-width: 62px;                 /* figé : le nom change sans faire sauter la pilule */
}
.immersion-range {
  -webkit-appearance: none; appearance: none;
  width: 84px; height: 18px;
  background: none; cursor: pointer; flex: none;
}
.immersion-range::-webkit-slider-runnable-track {
  height: 4px; border-radius: 2px;
  background: linear-gradient(90deg, var(--rouge-charte) var(--fill, 0%), #e6e4e2 var(--fill, 0%));
}
.immersion-range::-webkit-slider-thumb {
  -webkit-appearance: none; appearance: none; border: 0;
  width: 13px; height: 13px; margin-top: -4.5px;
  border-radius: 50%; background: var(--rouge-charte);
}
.immersion-range::-moz-range-track {
  height: 4px; border-radius: 2px;
  background: linear-gradient(90deg, var(--rouge-charte) var(--fill, 0%), #e6e4e2 var(--fill, 0%));
}
.immersion-range::-moz-range-thumb {
  border: 0; width: 13px; height: 13px;
  border-radius: 50%; background: var(--rouge-charte);
}

@media (max-width: 640px) {
  /* La pilule IP occupe le bas au centre : on empile l'immersion au-dessus. */
  .immersion { right: 50%; transform: translateX(50%); bottom: 60px; }
  .pioche-aide { display: none; }
  .cylindre-anneau { --r: 300px; width: 230px; height: 150px; }
}
@media (prefers-reduced-motion: reduce) {
  .cylindre-anneau, .fusion-piste { animation: none; }
  .pioche-surface i { transition: none; }
}

/* Bouton rouge plein (VOIR PLUS) */
.btn-rouge {
  display: inline-block;
  background: var(--rouge); color: #fff;
  font-family: 'Poppins', sans-serif; font-size: 14px; font-weight: 600;
  letter-spacing: .5px; text-transform: uppercase;
  padding: 12px 30px; border-radius: 36px; border: 0; cursor: pointer;
  transition: background .25s ease, transform .25s ease;
}
.btn-rouge:hover { background: #b82006; transform: translateY(-2px); color: #fff; }

/* ==========================================================================
   HERO (repris à l'identique du site — police Exo 2, particules, grille)
   ========================================================================== */
.minecraft-hero {
  position: relative;
  height: 75vh;
  width: 100%;
  overflow: hidden;
  color: var(--corps-fort);
  display: flex; align-items: center; justify-content: center;
  background-color: #ffffff;
  font-family: 'Exo 2', sans-serif;
}
.particles-container {
  position: absolute; top: 0; left: 0; width: 100%; height: 100%;
  z-index: 1; overflow: hidden;
}
.particle { position: absolute; border-radius: 50%; pointer-events: none; }
.particle.red { background: rgba(219, 53, 53, .3); }
.particle.green { background: rgba(134, 214, 41, .3); }

.grid-overlay {
  position: absolute; top: 0; left: 0; width: 100%; height: 100%;
  background-image:
    linear-gradient(rgba(219, 53, 53, .03) 1px, transparent 1px),
    linear-gradient(90deg, rgba(134, 214, 41, .03) 1px, transparent 1px);
  background-size: 40px 40px;
  z-index: 1;
  perspective: 1000px;
  transform-style: preserve-3d;
  animation: gridMovement 60s linear infinite;
}
@keyframes gridMovement {
  0% { background-position: 0 0; }
  100% { background-position: 40px 40px; }
}

.floating-elements {
  position: absolute; width: 100%; height: 100%; top: 0; left: 0;
  pointer-events: none; z-index: 2;
}
.floating-element {
  position: absolute; border-radius: 4px;
  box-shadow: 0 0 20px rgba(219, 53, 53, .2);
}
.floating-element.red { background: rgba(219, 53, 53, .08); border: 1px solid rgba(219, 53, 53, .2); }
.floating-element.green { background: rgba(134, 214, 41, .08); border: 1px solid rgba(134, 214, 41, .2); }

.content-wrapper {
  position: relative; width: 100%; max-width: 1200px; z-index: 10;
  display: flex; flex-direction: column; align-items: center; padding: 20px;
}

.brand-tag {
  background: rgba(219, 53, 53, .1);
  border: 1px solid rgba(219, 53, 53, .3);
  padding: 6px 16px; border-radius: 20px;
  font-size: 14px; letter-spacing: 2px; text-transform: uppercase;
  margin-bottom: 30px; color: var(--rouge);
  display: flex; align-items: center;
  transform: translateY(20px); opacity: 0;
  animation: fadeInUp 1s ease forwards .2s;
}
.brand-tag::before {
  content: ''; display: inline-block;
  width: 8px; height: 8px; background-color: var(--rouge);
  border-radius: 50%; margin-right: 10px;
  box-shadow: 0 0 10px var(--rouge);
}

.main-heading {
  /* Fluide plutot que par paliers : 2.8rem a 360px, 5rem au-dela de 1200px.
     Supprime les anciennes ruptures 768px et 992px, qui n'existaient que
     pour redescendre cette taille. */
  font-size: clamp(2.8rem, 1.75rem + 4.6vw, 5rem); font-weight: 700; line-height: 1.1;
  margin-bottom: 20px; text-align: center;
  background: linear-gradient(90deg, var(--rouge), var(--vert));
  -webkit-background-clip: text; background-clip: text;
  -webkit-text-fill-color: transparent;
  transform: translateY(20px); opacity: 0;
  animation: fadeInUp 1s ease forwards .4s;
}

.subtitle {
  font-size: clamp(1.1rem, 1rem + .42vw, 1.3rem); line-height: 1.6; color: #555;
  max-width: 600px; text-align: center; margin-bottom: 40px; font-weight: 300;
  transform: translateY(20px); opacity: 0;
  animation: fadeInUp 1s ease forwards .6s;
}

@keyframes fadeInUp { to { transform: translateY(0); opacity: 1; } }

.cta-button {
  position: relative; border: none;
  background: linear-gradient(90deg, var(--rouge), var(--vert));
  color: white; font-family: 'Exo 2', sans-serif;
  font-size: 1rem; font-weight: 600;
  padding: 14px 36px; border-radius: 30px;
  cursor: pointer; overflow: hidden;
  transition: all .3s ease;
  box-shadow: 0 10px 25px rgba(219, 53, 53, .3);
  transform: translateY(20px); opacity: 0;
  animation: fadeInUp 1s ease forwards .8s;
  display: flex; align-items: center; justify-content: center;
  z-index: 1;
}
.cta-button::before {
  content: ''; position: absolute; top: 0; left: -100%;
  width: 100%; height: 100%;
  background: linear-gradient(90deg, transparent, rgba(255, 255, 255, .2), transparent);
  transition: all .6s ease; z-index: -1;
}
.cta-button:hover { transform: translateY(-3px); box-shadow: 0 15px 30px rgba(219, 53, 53, .4); }
.cta-button:hover::before { left: 100%; }
.cta-button span { margin-left: 10px; font-size: 1.4rem; transition: transform .3s ease; }
.cta-button:hover span { transform: translateX(3px); }


/* ==========================================================================
   SECTIONS GÉNÉRIQUES
   ========================================================================== */
.section { padding: 80px 0; background: var(--blanc); }
.section--gris { background: var(--gris-clair); }

.section-title {
  font-family: 'Poppins', sans-serif;
  font-size: clamp(1.6rem, 1.2rem + 1.6vw, 2.3rem);
  font-weight: 700; text-align: center; color: var(--gris-fonce);
  margin-bottom: 12px;
}
.section-sub {
  text-align: center; color: var(--corps); max-width: 640px;
  margin: 0 auto 48px; line-height: 1.7;
}

/* Titre de page (pages internes) */
.page-header {
  padding: calc(var(--header-h) + 60px) 0 40px;
  text-align: center; background: var(--blanc);
}
.page-header h1 {
  font-family: 'Poppins', sans-serif; font-weight: 700;
  font-size: clamp(2rem, 1.5rem + 2.4vw, 3rem);
  background: linear-gradient(90deg, var(--rouge), var(--vert));
  -webkit-background-clip: text; background-clip: text;
  -webkit-text-fill-color: transparent;
  margin-bottom: 14px;
}
.page-header p { color: var(--corps); max-width: 680px; margin: 0 auto; line-height: 1.7; }

/* ==========================================================================
   COMPARATEURS AVANT/APRÈS (Strawberry Textures)
   ========================================================================== */
.comparaisons { display: grid; gap: 30px; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); }
.comparaison {
  position: relative; overflow: hidden;
  border-radius: 10px; box-shadow: 0 12px 30px rgba(0, 0, 0, .12);
  aspect-ratio: 16 / 10; user-select: none;
}
.comparaison img {
  position: absolute; inset: 0; width: 100%; height: 100%;
  object-fit: cover; pointer-events: none;
}
.comparaison .apres { clip-path: inset(0 0 0 var(--pos, 50%)); }
.comparaison .handle {
  position: absolute; top: 0; bottom: 0; left: var(--pos, 50%);
  width: 3px; background: #fff; transform: translateX(-50%);
  pointer-events: none; box-shadow: 0 0 10px rgba(0, 0, 0, .3);
}
.comparaison .handle::after {
  content: '⟷'; position: absolute; top: 50%; left: 50%;
  transform: translate(-50%, -50%);
  width: 36px; height: 36px; border-radius: 50%;
  background: var(--rouge); color: #fff;
  display: grid; place-items: center; font-size: 14px;
}
.comparaison input[type="range"] {
  position: absolute; inset: 0; width: 100%; height: 100%;
  opacity: 0; cursor: ew-resize; margin: 0;
}
.comparaison .etiq {
  position: absolute; bottom: 10px; z-index: 2;
  background: rgba(0, 0, 0, .6); color: #fff;
  font-family: 'Poppins', sans-serif; font-size: 11px; font-weight: 600;
  padding: 5px 10px; border-radius: 20px; pointer-events: none;
}
.comparaison .etiq-avant { left: 10px; }
.comparaison .etiq-apres { right: 10px; }

/* ==========================================================================
   TIMELINE (reprise à l'identique du site)
   ========================================================================== */
.strawberry-timeline { padding: 40px 20px; border-radius: 1.5rem; position: relative; }
.timeline-container { position: relative; max-width: 800px; margin: 0 auto; padding: 20px 0; }
.marker-line {
  position: absolute; top: 0; left: 50%; transform: translateX(-50%);
  width: 4px; height: 100%; background: #e74c3c;
}
.phase { display: flex; align-items: center; margin: 30px 0; position: relative; }
.phase-left { justify-content: flex-start; }
.phase-right { justify-content: flex-end; }
.timeline-card {
  background: #ffffff; border-radius: 1rem;
  box-shadow: 0 8px 20px rgba(0, 0, 0, .1);
  padding: 20px; width: 45%;
  transform: skewY(-2deg) rotate(-1deg);
  transition: transform .3s;
}
.timeline-card h4 {
  margin: 0 0 10px; font-size: 1.2rem; color: #e74c3c;
  text-transform: uppercase; font-family: 'Poppins', sans-serif;
}
.timeline-card p { margin: 0; font-size: .95rem; color: var(--corps-fort); line-height: 1.4; }
.timeline-card:hover { transform: skewY(0deg) rotate(0deg) scale(1.02); }

@media (max-width: 640px) {
  .marker-line { left: 12px; }
  .phase, .phase-right { justify-content: flex-start; }
  .timeline-card { width: calc(100% - 40px); margin-left: 34px; }
}

/* ==========================================================================
   FAQ (accordéon dans un panneau gris arrondi, comme le site réel)
   ========================================================================== */
.faq-panel {
  background: #f1f1f1; border-radius: 26px;
  padding: 56px clamp(20px, 4vw, 48px) 44px;
}
.faq-panel .section-title { color: #000; margin-bottom: 44px; }
.faq { margin: 0 auto; }
.faq details {
  background: #fff; border: 0; border-radius: 22px;
  margin-bottom: 18px; overflow: hidden;
  box-shadow: 0 2px 8px rgba(0, 0, 0, .05);
}
.faq summary {
  cursor: pointer; list-style: none;
  display: flex; justify-content: space-between; align-items: center; gap: 14px;
  padding: 20px 26px;
  font-family: 'Poppins', sans-serif; font-weight: 600; font-size: 1rem;
  color: #1d1d1d;
}
.faq summary::-webkit-details-marker { display: none; }
.faq summary::after {
  content: '+'; color: #555; font-weight: 300; font-size: 1.7rem; line-height: 1;
  flex: none;
}
.faq details[open] summary::after { content: '−'; color: var(--vert); font-weight: 600; }
.faq details[open] summary { color: var(--rouge); }
.faq .reponse { padding: 0 26px 22px; color: #5c5c5c; line-height: 1.7; }
.faq .reponse a { color: var(--vert); font-weight: 600; }

/* ==========================================================================
   CARTES (téléchargements, concours, dons…)
   ========================================================================== */
.grille { display: grid; gap: 26px; }
.grille--2 { grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); }
.grille--3 { grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); }
.grille--4 { grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); }

.carte {
  background: #fff; border: 1px solid #ececec; border-radius: 14px;
  padding: 26px; box-shadow: 0 6px 20px rgba(0, 0, 0, .05);
  transition: transform .25s ease, box-shadow .25s ease;
}
.carte:hover { transform: translateY(-5px); box-shadow: 0 14px 34px rgba(0, 0, 0, .09); }
.carte h3 { font-family: 'Poppins', sans-serif; color: var(--gris-fonce); margin-bottom: 10px; }
.carte p { color: var(--corps); line-height: 1.65; margin-bottom: 14px; }

.badge {
  display: inline-block; background: var(--rouge); color: #fff;
  font-family: 'Poppins', sans-serif; font-size: 11px; font-weight: 600;
  text-transform: uppercase; letter-spacing: .5px;
  padding: 4px 12px; border-radius: 20px; margin-bottom: 12px;
}
.badge--vert { background: var(--vert); color: #123; }
.badge--gris { background: #ececec; color: #666; }

.meta { display: flex; align-items: center; gap: 14px; font-size: 13px; color: var(--sourdine); margin-bottom: 16px; }
.note { color: #f0b429; font-weight: 600; }

.btn-ligne { display: flex; gap: 10px; flex-wrap: wrap; }
.btn-outline {
  display: inline-block; border: 2px solid var(--rouge); color: var(--rouge);
  background: #fff; font-family: 'Poppins', sans-serif; font-weight: 600; font-size: 14px;
  padding: 9px 22px; border-radius: 36px; cursor: pointer;
  transition: background .2s ease, color .2s ease;
}
.btn-outline:hover { background: var(--rouge); color: #fff; }

/* Filtres (galerie, téléchargements, concours) */
.filtres { display: flex; flex-wrap: wrap; justify-content: center; gap: 10px; margin-bottom: 40px; }
.filtres button {
  background: #fff; border: 1px solid #e0e0e0; border-radius: 36px;
  font-family: 'Poppins', sans-serif; font-size: 14px; font-weight: 500;
  color: var(--gris-texte); padding: 8px 22px; cursor: pointer;
  transition: all .2s ease;
}
.filtres button:hover { border-color: var(--vert); color: var(--vert); }
.filtres button[aria-pressed="true"] { background: var(--rouge); border-color: var(--rouge); color: #fff; }

/* ==========================================================================
   GALERIE + LIGHTBOX
   ========================================================================== */
.galerie { display: grid; grid-template-columns: repeat(auto-fill, minmax(290px, 1fr)); gap: 22px; }
.galerie figure {
  position: relative; overflow: hidden; border-radius: 12px; cursor: zoom-in;
  box-shadow: 0 8px 24px rgba(0, 0, 0, .08); background: #f6f6f6;
}
.galerie img { width: 100%; aspect-ratio: 16/10; object-fit: cover; transition: transform .4s ease; }
.galerie figure:hover img { transform: scale(1.05); }
.galerie figcaption {
  padding: 16px 18px; background: #fff;
}
.galerie figcaption strong {
  display: block; font-family: 'Poppins', sans-serif; color: var(--gris-fonce); margin-bottom: 6px;
}
.galerie figcaption span { font-size: 13px; color: var(--sourdine); display: block; }
.galerie figure.cache { display: none; }

.lightbox {
  position: fixed; inset: 0; z-index: 500;
  background: rgba(0, 0, 0, .92);
  display: none; align-items: center; justify-content: center; padding: 5vh 5vw;
}
.lightbox.ouverte { display: flex; }
.lightbox img { max-width: 100%; max-height: 86vh; border-radius: 8px; }
.lightbox button {
  position: absolute; background: rgba(255, 255, 255, .12); color: #fff;
  border: 0; width: 46px; height: 46px; border-radius: 50%;
  font-size: 20px; cursor: pointer; transition: background .2s ease;
}
.lightbox button:hover { background: var(--rouge); }
.lb-close { top: 20px; right: 20px; }
.lb-prev { left: 18px; top: 50%; transform: translateY(-50%); }
.lb-next { right: 18px; top: 50%; transform: translateY(-50%); }

/* ==========================================================================
   MEMBRES (grades + skins)
   ========================================================================== */
.grade { margin-bottom: 46px; }
.grade h3 {
  font-family: 'Poppins', sans-serif; font-size: 1.35rem;
  color: var(--rouge); margin-bottom: 8px;
}
.grade > p { color: var(--corps); max-width: 720px; line-height: 1.7; margin-bottom: 22px; }
.membres { display: flex; flex-wrap: wrap; gap: 18px; }
.membre {
  background: #fff; border: 1px solid #ececec; border-radius: 14px;
  padding: 18px 16px; text-align: center; width: 150px;
  box-shadow: 0 6px 18px rgba(0, 0, 0, .05);
  transition: transform .25s ease;
}
.membre:hover { transform: translateY(-6px); }
.membre img { height: 130px; width: auto; margin: 0 auto 12px; }
.membre span { font-family: 'Poppins', sans-serif; font-weight: 600; font-size: 14px; color: var(--gris-fonce); }

/* ==========================================================================
   COMMANDES UTILES (onglets + liste)
   ========================================================================== */
.onglets { display: flex; flex-wrap: wrap; justify-content: center; gap: 10px; margin-bottom: 40px; }
.onglets button {
  background: #fff; border: 1px solid #e0e0e0; border-radius: 36px;
  font-family: 'Poppins', sans-serif; font-size: 14px; font-weight: 500;
  padding: 9px 24px; cursor: pointer; color: var(--gris-texte);
  transition: all .2s ease;
}
.onglets button[aria-selected="true"] { background: var(--rouge); border-color: var(--rouge); color: #fff; }

.panneau { display: none; }
.panneau.actif { display: block; }
.panneau h3 {
  font-family: 'Poppins', sans-serif; color: var(--gris-fonce);
  margin: 32px 0 18px; font-size: 1.2rem;
}
.cmd {
  background: #fff; border: 1px solid #ececec; border-left: 4px solid var(--rouge);
  border-radius: 10px; padding: 18px 22px; margin-bottom: 12px;
}
.cmd code {
  font-family: 'Consolas', 'Courier New', monospace;
  color: var(--rouge); font-weight: 700; font-size: 15px;
}
.cmd p { color: var(--corps); margin: 6px 0; line-height: 1.6; }
.cmd .usage {
  display: inline-block; background: #f6f6f6; border-radius: 6px;
  padding: 5px 10px; font-family: 'Consolas', monospace; font-size: 13px; color: #555;
  margin-top: 4px;
}

/* ==========================================================================
   CHARTE GRAPHIQUE
   ========================================================================== */
.couleurs { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 18px; margin-bottom: 44px; }
.couleur { border-radius: 12px; overflow: hidden; box-shadow: 0 6px 18px rgba(0, 0, 0, .07); }
.couleur .pastille { height: 110px; }
.couleur .info { background: #fff; padding: 14px; text-align: center; }
.couleur .info strong { display: block; font-family: 'Poppins', sans-serif; font-size: 14px; color: var(--gris-fonce); }
.couleur .info code { font-size: 13px; color: var(--sourdine); }

.typos { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 20px; }
.typo { background: #fff; border: 1px solid #ececec; border-radius: 12px; padding: 24px; text-align: center; }
.typo .nom { font-size: 1.8rem; margin-bottom: 8px; color: var(--gris-fonce); }
.typo p { color: var(--sourdine); font-size: 14px; }

/* ==========================================================================
   CONTACT — DA minimaliste (issue de contact-lab.html, essai 06 « Comptoir »)
   À gauche on cherche (la FAQ filtre en direct), à droite on écrit. Quand
   aucune réponse ne colle, la question passe toute seule dans le message.
   Le minimalisme vient de la RETENUE : filets au lieu des ombres et des
   cartes, rouge réservé aux accents. Remplace l'ancien bloc .contact-grille /
   .form-champ / .form-2, qui n'était utilisé que par l'ancienne contact.html.
   ========================================================================== */
.ct-page { padding: calc(var(--header-h) + 70px) 0 110px; }

.ct-surtitre {
  font-family: 'Poppins', sans-serif; font-size: 11px; font-weight: 600;
  letter-spacing: .16em; text-transform: uppercase; color: var(--sourdine);
}
.ct-titre {
  font-family: 'Poppins', sans-serif; font-weight: 500;
  font-size: clamp(2.1rem, 1.5rem + 2.2vw, 3.1rem);
  color: var(--gris-fonce); letter-spacing: -.015em; line-height: 1.1;
  margin-top: 12px;
}
/* Pas de dégradé rouge→vert ici : un point rouge après le mot suffit. */
.ct-titre b { font-weight: 600; color: var(--rouge); }
.ct-chapo { color: var(--corps); line-height: 1.7; max-width: 560px; margin-top: 14px; }

.ct-btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  border-radius: 36px; padding: 12px 26px;
  font-family: 'Poppins', sans-serif; font-size: 13.5px; font-weight: 600;
  border: 0; cursor: pointer;
  transition: background .2s ease, transform .2s ease;
}
.ct-btn-plein { background: var(--rouge); color: #fff; }
.ct-btn-plein:hover { background: var(--rouge-fonce); transform: translateY(-2px); color: #fff; }
.ct-fl {
  display: inline-flex; align-items: center; gap: 8px;
  font-family: 'Poppins', sans-serif; font-size: 13px; font-weight: 600;
  color: var(--gris-fonce); background: none; border: 0; cursor: pointer;
  transition: color .2s ease, gap .2s ease;
}
.ct-fl:hover { color: var(--rouge); gap: 13px; }
.ct-cache { display: none !important; }

.ct-grille { display: grid; grid-template-columns: 1.05fr .95fr; gap: 72px; align-items: start; margin-top: 46px; }

/* ---------- Colonne gauche : on cherche ---------- */
.ct-champ { position: relative; }
.ct-champ input {
  width: 100%; border: 0; border-bottom: 2px solid var(--gris-fonce);
  background: none; padding: 0 34px 16px 0;
  font-family: 'Poppins', sans-serif; font-weight: 500;
  font-size: clamp(1.3rem, 1rem + 1.2vw, 2rem);
  color: var(--gris-fonce); letter-spacing: -.02em;
  transition: border-color .25s ease;
}
.ct-champ input:focus { outline: none; border-color: var(--rouge); }
.ct-champ input::placeholder { color: #cfcfcf; }
.ct-champ .ct-loupe {
  position: absolute; right: 2px; bottom: 18px;
  font-size: 1.2rem; color: var(--sourdine); pointer-events: none;
}
.ct-compte { font-size: 12.5px; color: var(--sourdine); margin-top: 14px; min-height: 19px; }
.ct-compte b { color: var(--gris-texte); font-family: 'Poppins', sans-serif; }

/* Ni panneau gris ni cartes blanches comme la FAQ de l'accueil : des filets. */
.ct-faq { margin-top: 22px; }
.ct-faq details { border-top: 1px solid var(--filet); }
.ct-faq details:last-of-type { border-bottom: 1px solid var(--filet); }
.ct-faq details.ct-cache { display: none !important; }
.ct-faq summary {
  cursor: pointer; list-style: none;
  display: flex; justify-content: space-between; align-items: center; gap: 16px;
  padding: 20px 0;
  font-family: 'Poppins', sans-serif; font-weight: 600; font-size: 1rem;
  color: var(--gris-fonce); transition: color .25s ease;
}
.ct-faq summary::-webkit-details-marker { display: none; }
.ct-faq summary:hover { color: var(--rouge); }
.ct-faq summary::after { content: '+'; color: var(--sourdine); font-weight: 400; font-size: 1.5rem; line-height: 1; flex: none; }
.ct-faq details[open] summary { color: var(--rouge); }
.ct-faq details[open] summary::after { content: '−'; color: var(--vert); font-weight: 600; }
.ct-faq .ct-reponse { padding: 0 0 22px; color: var(--corps); line-height: 1.75; max-width: 620px; }
.ct-faq .ct-reponse a { color: var(--vert); font-weight: 600; }
.ct-lien-ecrire { margin-top: 26px; }

/* ---------- Colonne droite : on écrit ---------- */
.ct-droite { padding-top: 4px; }
.ct-droite > .ct-surtitre { display: block; margin-bottom: 22px; }
.ct-form-champ { margin-bottom: 26px; }
.ct-form-champ label {
  display: block; font-family: 'Poppins', sans-serif; font-size: 11px; font-weight: 600;
  letter-spacing: .12em; text-transform: uppercase; color: var(--sourdine); margin-bottom: 8px;
}
/* Ni carte, ni boîte : un filet sous le champ. */
.ct-form-champ input, .ct-form-champ textarea {
  width: 100%; border: 0; border-bottom: 1px solid var(--filet);
  background: none; padding: 8px 2px 12px;
  font-family: 'Open Sans', sans-serif; font-size: 15.5px; color: var(--gris-texte);
  transition: border-color .25s ease;
}
.ct-form-champ textarea { min-height: 110px; resize: vertical; line-height: 1.7; }
.ct-form-champ input:focus, .ct-form-champ textarea:focus { outline: none; border-color: var(--rouge); }
.ct-form-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 26px; }

/* Le message s'allume quand la question lui est passée : le seul signal du
   transfert, et il vit dans le rouge d'accent, pas dans une animation. */
.ct-msg.ct-eveille textarea { border-color: var(--rouge); }
.ct-note { display: none; font-size: 12.5px; color: var(--sourdine); margin-top: 10px; }
.ct-msg.ct-eveille .ct-note { display: block; }
.ct-note b { color: var(--gris-texte); font-family: 'Poppins', sans-serif; font-weight: 600; }

/* Le piège à robots : hors de l'écran plutôt que display:none, que certains
   robots savent repérer. Même convention que `.ps-pot`. */
.ct-pot { position: absolute; left: -9999px; }

/* « obligatoire » : même traitement que sur la page « soumettre un projet ». */
.ct-oblig {
  font-style: normal; font-size: 10px; font-weight: 600; letter-spacing: .12em;
  text-transform: uppercase; color: var(--rouge); margin-left: 6px;
}

/* Le retour d'envoi. Il ne s'affiche que quand il a quelque chose à dire —
   pas de zone vide réservée qui décalerait le bouton au chargement. */
.ct-retour {
  margin-top: 18px; font-size: 14.5px; line-height: 1.6;
  padding-left: 14px; border-left: 2px solid var(--filet);
}
.ct-retour-erreur { border-left-color: var(--rouge); color: var(--gris-texte); }
.ct-retour a { color: var(--rouge); text-decoration: underline; text-underline-offset: 3px; }
.ct-btn[disabled] { opacity: .55; cursor: progress; transform: none; }

/* La confirmation remplace le formulaire : il n'y a plus rien à y faire,
   autant que la place serve au message. */
.ct-merci-titre {
  font-family: 'Poppins', sans-serif; font-size: clamp(1.5rem, 3vw, 2rem);
  font-weight: 500; color: var(--gris-fonce); letter-spacing: -.02em; margin-bottom: 12px;
}
.ct-merci-titre b { color: var(--rouge); }
.ct-merci-texte { font-size: 15.5px; line-height: 1.75; color: var(--gris-texte); max-width: 46ch; }
.ct-merci-texte b { font-weight: 600; }
.ct-merci-texte a { color: var(--rouge); text-decoration: underline; text-underline-offset: 3px; }

/* ---------- Bento : où nous trouver ----------
   Pas des cartes qui flottent (ombres + contours = le registre qu'on évite) :
   UN bloc, découpé par des filets. D'où gap:1px sur un fond filet — les
   tuiles blanches laissent voir la trame entre elles. */
.ct-bento { margin-top: 90px; }
.ct-bento-tete { display: flex; justify-content: space-between; align-items: baseline; gap: 20px; flex-wrap: wrap; margin-bottom: 22px; }
.ct-maille {
  display: grid; grid-template-columns: repeat(4, 1fr);
  gap: 1px; background: var(--filet);
  border: 1px solid var(--filet); border-radius: 22px; overflow: hidden;
}
.ct-tuile {
  position: relative; background: var(--blanc);
  padding: 26px; min-height: 138px;
  display: flex; flex-direction: column; gap: 5px;
  transition: background .25s ease;
}
.ct-tuile:hover { background: #fafafa; }
.ct-t-nom {
  font-family: 'Poppins', sans-serif; font-weight: 600; font-size: 1.05rem;
  color: var(--gris-fonce); letter-spacing: -.01em; transition: color .25s ease;
}
a.ct-tuile:hover .ct-t-nom { color: var(--rouge); }
.ct-t-sous { font-size: 12.5px; color: var(--sourdine); }
.ct-t-fl {
  position: absolute; top: 24px; right: 24px;
  color: var(--sourdine); font-size: 13px;
  transition: color .25s ease, transform .25s ease;
}
a.ct-tuile:hover .ct-t-fl { color: var(--rouge); transform: translate(3px, -3px); }
.ct-t-large { grid-column: span 2; }

/* La tuile serveur : 2×2, la seule qui parle. Elle porte la signature. */
.ct-t-ip { grid-column: span 2; grid-row: span 2; justify-content: space-between; gap: 20px; }
.ct-ip-titre {
  font-family: 'Poppins', sans-serif; font-weight: 500;
  font-size: clamp(1.35rem, 1.05rem + 1vw, 1.9rem);
  color: var(--gris-fonce); letter-spacing: -.02em; line-height: 1.15; margin-top: 10px;
}
.ct-ip-titre b { font-weight: 600; color: var(--rouge); }
.ct-ip-bas { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; }
/* Écho de la pilule IP du site, en bouton : le <span role="button"> d'origine
   ne répond pas au clavier, ici Entrée et Espace marchent gratuitement. */
.ct-ip-copie {
  position: relative; background: #fff;
  border: 2px solid var(--rouge-charte); border-radius: 36px;
  color: var(--rouge-charte); cursor: pointer;
  font-family: 'Poppins', sans-serif; font-size: 13.5px; font-weight: 700;
  padding: 7px 18px; white-space: nowrap;
  transition: background .2s ease;
}
.ct-ip-copie:hover { background: var(--rouge-doux); }
.ct-ip-copie:active { transform: translateY(1px); }
.ct-ip-ver { font-size: 12.5px; color: var(--sourdine); }

/* Twitch porte deux chaînes : la tuile ne peut pas être un <a> (pas de lien
   dans un lien), ce sont les chaînes qui le sont. */
.ct-t-chaines { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 6px; }
.ct-t-chaines a {
  display: inline-flex; align-items: center; gap: 6px;
  border: 1px solid var(--filet); border-radius: 36px; padding: 7px 14px;
  font-family: 'Poppins', sans-serif; font-size: 12.5px; font-weight: 500;
  color: var(--gris-texte);
  transition: border-color .2s ease, color .2s ease;
}
.ct-t-chaines a:hover { border-color: var(--rouge); color: var(--rouge); }

@media (max-width: 1024px) {
  .ct-page { padding: calc(var(--header-h) + 40px) 0 80px; }
  .ct-grille { grid-template-columns: 1fr; gap: 46px; }
  .ct-bento { margin-top: 60px; }
  .ct-maille { grid-template-columns: repeat(2, 1fr); }
  /* En 2 colonnes la tuile serveur prend la largeur, mais plus la hauteur
     double : elle n'a plus de voisine à côté de qui s'aligner. */
  .ct-t-ip { grid-column: span 2; grid-row: span 1; }
}
@media (max-width: 640px) {
  .ct-form-2 { grid-template-columns: 1fr; gap: 20px; }
  .ct-maille { grid-template-columns: 1fr; }
  .ct-t-large, .ct-t-ip { grid-column: span 1; }
}

/* ==========================================================================
   DONS
   ========================================================================== */
.don-total {
  text-align: center; font-family: 'Poppins', sans-serif;
  font-size: 2.4rem; font-weight: 700; color: var(--vert); margin-bottom: 8px;
}
.don-jauge {
  max-width: 520px; margin: 0 auto 40px; height: 12px;
  background: #ececec; border-radius: 20px; overflow: hidden;
}
.don-jauge span { display: block; height: 100%; background: linear-gradient(90deg, var(--rouge), var(--vert)); }

/* ==========================================================================
   PAGE TÉLÉCHARGEMENTS (styles repris du widget réel du site)
   ========================================================================== */
/* L'ancienne page Téléchargements (featured + cartes à ombre) a été remplacée
   par la version minimaliste — voir le bloc « TÉLÉCHARGEMENTS » plus bas. Tout
   son habillage (.page-dl, .featured-*, .download-*, .card-*, .filters) est
   parti avec elle ; seul .section-intro restait utilisé, par concours.html.
   L'ancienne page reste consultable dans « site - Copie ». */
.section-intro { max-width: 900px; font-size: 1.1rem; color: #666; margin-bottom: 3rem; }

/* ==========================================================================
   FOOTER (fond blanc, reproduction fidèle)
   ========================================================================== */
.site-footer { background: #fff; padding: 70px 0 90px; margin-top: 40px; }
.footer-grille { display: grid; gap: 40px; grid-template-columns: 2.2fr 1fr 1.3fr 1fr; }
.footer-col h2 {
  font-family: 'Poppins', sans-serif; font-size: 1.1rem; font-weight: 700;
  color: #000; margin-bottom: 14px;
}
.footer-col h2.souligne { text-decoration: underline; }
.footer-col p, .footer-col li { color: var(--corps-fort); font-size: 14px; line-height: 1.8; }
.footer-col ul { list-style: none; }
.footer-col a { color: var(--corps-fort); text-decoration: underline; transition: color .2s ease; }
.footer-col a:hover { color: var(--vert); }
.footer-marque h2 { color: var(--rouge); font-size: 1.15rem; margin-bottom: 6px; }
.footer-marque > p { color: var(--corps-fort); }
.disclaimer-box {
  border: 2px solid #000; border-radius: 12px;
  padding: 10px 16px 12px; margin: 22px 0 18px; max-width: 360px;
}
.disclaimer-box p { font-size: 12.5px; font-weight: 700; color: #000; line-height: 1.5; }
.disclaimer-box .disc-titre { margin-bottom: 8px; }
.footer-marque .credit { font-size: 12.5px; font-weight: 700; color: #000; }
@media (max-width: 900px) { .footer-grille { grid-template-columns: 1fr 1fr; } }
@media (max-width: 640px) { .footer-grille { grid-template-columns: 1fr; } }

/* ==========================================================================
   TITRES DE PAGE avec barre rouge (Concours, Dons)
   ========================================================================== */
.page-simple { background: #fff; padding: calc(var(--header-h) + 50px) 0 4rem; }
.titre-souligne {
  font-family: 'Poppins', sans-serif; font-weight: 700;
  font-size: clamp(1.9rem, 1.4rem + 2vw, 2.6rem); color: #222;
  margin-bottom: 18px;
}
.titre-souligne::after {
  content: ''; display: block; width: 62px; height: 4px;
  background: var(--rouge); margin-top: 12px; border-radius: 2px;
}
.titre-souligne--centre { text-align: center; }
.titre-souligne--centre::after { margin-left: auto; margin-right: auto; }

/* ==========================================================================
   CONCOURS & ÉVÉNEMENTS — DA minimaliste (issue de concours-lab.html, 04
   « Le prochain »). Remplace l'ancien bloc .event-* / .btn-resultats, qui
   n'était utilisé que par l'ancienne concours.html (.page-simple et
   .titre-souligne, eux, servent aussi à faire-un-don.html : on n'y touche pas).

   Parti pris : les 3 concours sont TERMINÉS et le dernier date de mars 2025.
   La page s'ouvre donc sur l'état vide, le dit franchement, et rend le
   passage sur Discord utile. Les filtres « En cours » / « À venir » de
   l'ancienne page ne sont pas repris : ils ne renvoyaient rien.
   ========================================================================== */
.cc-page { padding: calc(var(--header-h) + 70px) 0 110px; }

.cc-surtitre {
  font-family: 'Poppins', sans-serif; font-size: 11px; font-weight: 600;
  letter-spacing: .16em; text-transform: uppercase; color: var(--sourdine);
}
.cc-titre {
  font-family: 'Poppins', sans-serif; font-weight: 500;
  font-size: clamp(2.1rem, 1.5rem + 2.2vw, 3.1rem);
  color: var(--gris-fonce); letter-spacing: -.015em; line-height: 1.1;
  margin-top: 12px;
}
.cc-titre b { font-weight: 600; color: var(--rouge); }

.cc-btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  border-radius: 36px; padding: 12px 26px;
  font-family: 'Poppins', sans-serif; font-size: 13.5px; font-weight: 600;
  transition: background .2s ease, color .2s ease, border-color .2s ease, transform .2s ease;
}
.cc-btn-plein { background: var(--rouge); color: #fff; }
.cc-btn-plein:hover { background: var(--rouge-fonce); transform: translateY(-2px); color: #fff; }
.cc-btn-vide { border: 1px solid var(--filet); color: var(--gris-texte); }
.cc-btn-vide:hover { border-color: var(--gris-fonce); }

/* Le badge « Terminé » de l'ancienne page était un aplat gris. Ici un point
   et un mot : le statut est une information, pas une décoration. */
.cc-fini {
  display: inline-flex; align-items: center; gap: 7px;
  font-family: 'Poppins', sans-serif; font-size: 11px; font-weight: 600;
  letter-spacing: .1em; text-transform: uppercase; color: var(--sourdine);
  white-space: nowrap;
}
.cc-fini::before { content: ''; width: 5px; height: 5px; border-radius: 50%; background: var(--sourdine); flex: none; }

/* ---------- Le prochain : l'état vide, traité comme le sujet ---------- */
.cc-bloc {
  border: 1px solid var(--filet); border-radius: 26px;
  padding: clamp(30px, 5vw, 60px); margin-top: 46px;
  display: grid; grid-template-columns: 1fr auto; gap: 40px; align-items: center;
}
.cc-bloc h2 {
  font-family: 'Poppins', sans-serif; font-weight: 600;
  font-size: clamp(1.6rem, 1.2rem + 1.6vw, 2.3rem);
  color: var(--gris-fonce); letter-spacing: -.025em; margin: 12px 0;
}
.cc-bloc > div > p { color: var(--corps); line-height: 1.75; max-width: 460px; }
.cc-actions { display: flex; gap: 10px; flex-wrap: wrap; margin-top: 24px; }
/* Le dernier en date : la preuve que ça a existé, sinon l'état vide sonne mort. */
.cc-dernier { text-align: right; border-left: 1px solid var(--filet); padding-left: 40px; }
.cc-dernier b { display: block; font-family: 'Poppins', sans-serif; font-weight: 600; font-size: 1.15rem; color: var(--gris-fonce); margin: 8px 0 4px; }
.cc-dernier span { font-size: 12.5px; color: var(--sourdine); }

/* ---------- L'archive et sa bascule ---------- */
.cc-archive { margin-top: 84px; }
.cc-tete { display: flex; justify-content: space-between; align-items: center; gap: 24px; flex-wrap: wrap; margin-bottom: 8px; }
.cc-outils { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; }
.cc-vues { display: flex; gap: 2px; padding: 3px; border: 1px solid var(--filet); border-radius: 36px; }
.cc-vues button {
  display: grid; place-items: center; width: 32px; height: 30px;
  border: 0; border-radius: 36px; background: none; cursor: pointer;
  color: var(--sourdine); transition: background .2s ease, color .2s ease;
}
.cc-vues button svg { width: 15px; height: 15px; }
.cc-vues button:hover { color: var(--gris-fonce); }
.cc-vues button[aria-pressed="true"] { background: var(--rouge); color: #fff; }

/* --------------------------------------------------------------------------
   UN seul balisage (.cc-item), deux vues — même convention que .dl-item.
   C'est le conteneur qui décide (.cc-liste / .cc-grille). Les deux vues
   partagent les mêmes zones nommées : seule leur disposition change, donc
   elles ne peuvent pas diverger.
   -------------------------------------------------------------------------- */
.cc-item { position: relative; }
.cc-n { font-family: 'Poppins', sans-serif; font-size: 12px; font-weight: 600; color: var(--sourdine); grid-area: n; }
.cc-corps { grid-area: corps; }
.cc-nom {
  font-family: 'Poppins', sans-serif; font-weight: 600;
  color: var(--gris-fonce); letter-spacing: -.015em;
  transition: color .25s ease;
}
.cc-desc { color: var(--corps); line-height: 1.65; }
.cc-quand { grid-area: quand; font-family: 'Poppins', sans-serif; font-size: 12.5px; font-weight: 600; color: var(--gris-texte); }
.cc-quand span { display: block; color: var(--sourdine); font-weight: 500; font-size: 12px; margin-top: 3px; }
.cc-part { grid-area: part; font-family: 'Poppins', sans-serif; font-size: 13px; font-weight: 600; color: var(--gris-texte); white-space: nowrap; }
/* Le pied n'existe qu'en vue grille, où il porte un filet continu. En liste,
   `display: contents` l'efface et ses deux enfants retombent dans la grille
   de la ligne, à leurs zones nommées — un seul balisage pour les deux vues. */
.cc-part span { color: var(--sourdine); font-weight: 500; font-size: 11.5px; }
.cc-item .cc-fini { grid-area: fini; }
.cc-res {
  grid-area: res; display: inline-flex; align-items: center; gap: 8px;
  font-family: 'Poppins', sans-serif; font-size: 13px; font-weight: 600;
  color: var(--gris-fonce); transition: color .2s ease, gap .2s ease;
}
.cc-res::after { content: '→'; }
.cc-res:hover { color: var(--rouge); gap: 13px; }

/* ---------- Vue LISTE ---------- */
.cc-liste { margin-top: 10px; }
.cc-liste .cc-item {
  display: grid;
  grid-template-columns: 36px 1fr 180px 112px 92px 104px;
  grid-template-areas: "n corps quand part fini res";
  align-items: center; gap: 20px;
  padding: 24px 0; border-top: 1px solid var(--filet);
  transition: padding-left .3s cubic-bezier(.2, .8, .2, 1);
}
.cc-liste .cc-item:last-of-type { border-bottom: 1px solid var(--filet); }
.cc-liste .cc-item:hover { padding-left: 8px; }
.cc-liste .cc-item:hover .cc-nom { color: var(--rouge); }
.cc-liste .cc-pied { display: contents; }
.cc-liste .cc-nom { font-size: 1.1rem; }
.cc-liste .cc-desc { font-size: 13px; margin-top: 4px; }
.cc-liste .cc-res { justify-self: end; }

/* ---------- Vue GRILLE ---------- */
.cc-grille { margin-top: 10px; display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; }
/* Ni ombre ni fond : un filet, et le survol qui le fonce. */
.cc-grille .cc-item {
  display: grid; grid-template-columns: 1fr auto;
  grid-template-areas:
    "n     fini"
    "corps corps"
    "quand quand"
    "pied  pied";
  align-content: start; gap: 14px 12px;
  border: 1px solid var(--filet); border-radius: 20px; padding: 30px;
  transition: border-color .25s ease, transform .25s ease;
}
.cc-grille .cc-item:hover { border-color: var(--gris-fonce); transform: translateY(-3px); }
.cc-grille .cc-item:hover .cc-nom { color: var(--rouge); }
.cc-grille .cc-nom { font-size: 1.25rem; display: block; margin-bottom: 10px; }
/* La description pousse le pied vers le bas : les 3 cartes s'alignent. */
.cc-grille .cc-corps { min-height: 118px; }
.cc-grille .cc-quand { padding-top: 4px; }
.cc-grille .cc-pied {
  grid-area: pied; display: flex; justify-content: space-between; align-items: center;
  gap: 14px; padding-top: 16px; border-top: 1px solid var(--filet);
}

@media (max-width: 1024px) {
  .cc-page { padding: calc(var(--header-h) + 40px) 0 80px; }
  .cc-bloc { grid-template-columns: 1fr; gap: 28px; }
  .cc-dernier { text-align: left; border-left: 0; border-top: 1px solid var(--filet); padding: 24px 0 0; }
  .cc-grille { grid-template-columns: 1fr; }
  .cc-grille .cc-corps { min-height: 0; }
  /* En liste, les colonnes fixes ne tiennent plus : on garde l'essentiel. */
  .cc-liste .cc-item {
    grid-template-columns: 30px 1fr auto;
    grid-template-areas:
      "n corps corps"
      ". quand res";
    align-items: start; gap: 12px;
  }
  .cc-liste .cc-part, .cc-liste .cc-fini { display: none; }
}
@media (max-width: 640px) {
  .cc-liste .cc-desc { display: none; }
}

/* ==========================================================================
   PANNEAUX GRIS (grades, donateurs, réseaux — motif Elementor du site)
   ========================================================================== */
/* .panneau-gris reste : faire-un-don.html s'en sert. En revanche l'habillage
   propre à l'ancienne page Membres (.badge-panneau, .bande-grade, .grade-bloc,
   .social-*) est parti avec elle — voir le bloc « PAGE MEMBRES » plus bas.
   L'ancienne page reste consultable dans « site - Copie ». */
.panneau-gris { background: #f3f3f3; border-radius: 22px; padding: 30px; }

/* ==========================================================================
   PAGE FAIRE UN DON — DA minimaliste (issue de don-lab.html, 04 « La bande »)
   La ville en plein cadre : « c'est ça qu'on paie ». Remplace l'ancien bloc
   (.dons-*, .don-jauge-pleine, .don-pill, .btn-don, .bande-titre-rouge…),
   vérifié comme n'étant utilisé que par l'ancienne faire-un-don.html.
   .panneau-gris / .figure-joueur / .figures-liste sont CONSERVÉS : ce sont des
   composants génériques du site, même si plus personne ne s'en sert pour
   l'instant. .page-simple et .titre-souligne servent encore ailleurs.

   Ce qui a sauté au passage, et pourquoi :
   - `.don-jauge-pleine` était une jauge pleine à 100 % SANS objectif : elle ne
     mesurait rien. Le chiffre nu (327 €) est vrai et se suffit.
   - Le panneau « Donateurs » était décrit par la description du rôle
     Modérateur, copiée de membres.html. Elle ne parlait pas de dons.
   - Les donateurs étaient listés deux fois (pilules + figures). Une seule fois.
   ========================================================================== */

/* L'image démarre à y=0 et passe DERRIÈRE la pilule du header (fixe, 18→72px) :
   c'est voulu. Le dégradé blanc en bas la fond dans la page, et le titre vient
   mordre dessus. */
.dn-hero { position: relative; height: clamp(380px, 66vh, 660px); overflow: hidden; background: var(--gris-clair); }
.dn-hero img { width: 100%; height: 100%; object-fit: cover; object-position: center 42%; }
.dn-hero::after {
  content: ''; position: absolute; inset: 0; pointer-events: none;
  background: linear-gradient(to top, #fff 0%, rgba(255, 255, 255, 0) 46%);
}
/* Le contenu remonte sur le fondu : sinon une bande blanche vide les sépare. */
.dn-sous { position: relative; z-index: 2; margin-top: -56px; padding-bottom: 100px; }

.dn-surtitre {
  font-family: 'Poppins', sans-serif; font-size: 11px; font-weight: 600;
  letter-spacing: .16em; text-transform: uppercase; color: var(--sourdine);
}
.dn-titre {
  font-family: 'Poppins', sans-serif; font-weight: 500;
  font-size: clamp(2.1rem, 1.5rem + 2.2vw, 3.1rem);
  color: var(--gris-fonce); letter-spacing: -.015em; line-height: 1.1;
  margin-top: 12px;
}
.dn-titre b { font-weight: 600; color: var(--rouge); }

.dn-duo { display: grid; grid-template-columns: 1.15fr .85fr; gap: 60px; align-items: start; margin-top: 40px; }
.dn-duo p { color: var(--corps); line-height: 1.75; }
.dn-duo p + p { margin-top: 12px; }
.dn-duo p b { font-family: 'Poppins', sans-serif; font-weight: 600; color: var(--gris-texte); }
.dn-cote { border-left: 1px solid var(--filet); padding-left: 40px; }
.dn-cote .dn-surtitre { display: block; margin-bottom: 10px; }

/* Le chiffre nu remplace la jauge : 327 €, c'est vrai, ça se suffit.
   Montant et devise d'un seul rouge : le chiffre est le sujet de la page,
   il ne se coupe pas en deux couleurs.
   Sélecteur descendant obligatoire : `.dn-duo p` est plus spécifique que
   `.dn-somme` seul et lui imposerait le gris des paragraphes. */
.dn-duo .dn-somme {
  font-family: 'Poppins', sans-serif; font-weight: 600;
  font-size: clamp(2.6rem, 1.8rem + 3vw, 4.2rem);
  color: var(--rouge); letter-spacing: -.04em; line-height: .95;
}

/* Les 3 moyens de don : ni cartes ni ombres, des pilules filetées. */
.dn-moyens { display: flex; gap: 10px; flex-wrap: wrap; }
.dn-moyen {
  display: inline-flex; align-items: center; gap: 8px;
  border: 1px solid var(--filet); border-radius: 36px; padding: 11px 22px;
  font-family: 'Poppins', sans-serif; font-size: 13.5px; font-weight: 600;
  color: var(--gris-texte);
  transition: border-color .2s ease, color .2s ease;
}
.dn-moyen::after { content: '↗'; font-size: 11px; color: var(--sourdine); }
.dn-moyen:hover { border-color: var(--rouge); color: var(--rouge); }
.dn-moyen:hover::after { color: var(--rouge); }

.dn-grade {
  display: inline-flex; align-items: center; gap: 9px;
  border: 1px solid var(--filet); border-radius: 36px; padding: 8px 16px;
  font-family: 'Poppins', sans-serif; font-size: 12.5px; font-weight: 600;
  color: var(--gris-texte);
}
.dn-grade::before { content: ''; width: 7px; height: 7px; border-radius: 50%; background: var(--vert); flex: none; }

/* Les skins : ~24 % de transparent de chaque côté font déjà l'écart — d'où le
   gap minuscule. L'air est dans le PNG, pas dans le CSS. */
.dn-gens-bloc { margin-top: 34px; padding-top: 30px; border-top: 1px solid var(--filet); }
.dn-gens { display: flex; gap: 6px; flex-wrap: wrap; }
.dn-gars { text-align: center; }
.dn-gars img { height: 96px; width: auto; image-rendering: pixelated; margin-bottom: 8px; }
.dn-gars span { display: block; font-family: 'Poppins', sans-serif; font-size: 12px; color: var(--gris-texte); }

@media (max-width: 1024px) {
  .dn-hero { height: clamp(300px, 46vh, 420px); }
  .dn-duo { grid-template-columns: 1fr; gap: 34px; }
  .dn-cote { border-left: 0; border-top: 1px solid var(--filet); padding: 30px 0 0; }
  .dn-sous { padding-bottom: 70px; }
}
@media (max-width: 640px) {
  .dn-gars img { height: 74px; }
}

/* ==========================================================================
   COMPOSANTS GÉNÉRIQUES (plus utilisés depuis la refonte des pages, gardés :
   ce sont le vocabulaire du site, pas de la page de don)
   ========================================================================== */
.figures-liste { display: flex; flex-wrap: wrap; gap: 44px; justify-content: space-around; }
.figures-liste--gauche { justify-content: flex-start; gap: 38px; padding-left: 10px; }
.figure-joueur { text-align: center; }
.figure-joueur img { height: 105px; width: auto; margin: 0 auto 12px; }
.figure-joueur span { display: block; font-size: 14px; color: var(--corps-fort); }


/* ==========================================================================
   HERO GALERIE — « Colonnes » (repris de hero-lab-2.html, variante 05)
   Trois colonnes de builds défilent à contre-courant sur la moitié droite ;
   le message garde toute la moitié gauche. Réutilise .grid-overlay,
   .brand-tag et .cta-button définis plus haut.
   ========================================================================== */
.hero-galerie {
  position: relative; overflow: hidden;
  min-height: 100vh; min-height: 100dvh;
  display: flex; align-items: center; justify-content: flex-start;
  background: var(--blanc);
  font-family: 'Exo 2', sans-serif;
}
/* Les colonnes débordent en haut et en bas, et le masque efface leurs
   extrémités : on ne doit jamais voir le raccord de la boucle. */
.hg-cols {
  position: absolute; top: -6vh; bottom: -6vh; right: 0; width: 52%;
  z-index: 3; display: flex; gap: 18px; padding: 0 3.5vw;
  -webkit-mask-image: linear-gradient(180deg, transparent 0%, #000 14%, #000 86%, transparent 100%);
          mask-image: linear-gradient(180deg, transparent 0%, #000 14%, #000 86%, transparent 100%);
}
.hg-col { flex: 1; }
/* Chaque piste est doublée dans le HTML : translateY(-50%) boucle sans raccord */
.hg-col > div { animation: hgUp 46s linear infinite; }
.hg-col--b > div { animation: hgDown 58s linear infinite; }
.hg-col--c > div { animation-duration: 38s; }
@keyframes hgUp { to { transform: translateY(-50%); } }
@keyframes hgDown { from { transform: translateY(-50%); } to { transform: translateY(0); } }
.hg-col img {
  width: 100%; aspect-ratio: 3 / 3.6; object-fit: cover;
  border-radius: 14px; margin-bottom: 18px;
  box-shadow: 0 12px 30px rgba(29, 22, 18, .12);
}
.hg-inner {
  position: relative; z-index: 10;
  width: 48%; padding: 0 3vw 0 6vw;
  display: flex; flex-direction: column; align-items: flex-start;
  justify-content: center; min-height: 100dvh;
}
.hg-inner .brand-tag { margin-bottom: 26px; }
.hg-titre {
  font-family: 'Exo 2', sans-serif; font-weight: 700;
  font-size: clamp(2.6rem, 5.6vw, 4.6rem);
  line-height: 1.06; letter-spacing: -.01em;
  color: var(--gris-fonce); text-wrap: balance; margin-bottom: 20px;
  transform: translateY(20px); opacity: 0;
  animation: fadeInUp 1s ease forwards .4s;
}
.hg-titre .grad {
  background: linear-gradient(92deg, var(--rouge), var(--vert));
  -webkit-background-clip: text; background-clip: text;
  -webkit-text-fill-color: transparent; color: transparent;
}
.hg-sub {
  font-size: clamp(1rem, 1.3vw, 1.2rem); line-height: 1.7; color: #6a6560;
  max-width: 470px; margin-bottom: 34px;
  transform: translateY(20px); opacity: 0;
  animation: fadeInUp 1s ease forwards .6s;
}
.hg-actions {
  display: flex; gap: 14px; flex-wrap: wrap;
  transform: translateY(20px); opacity: 0;
  animation: fadeInUp 1s ease forwards .8s;
}
/* .cta-button porte déjà son propre fadeInUp : sans neutralisation, les deux
   animations se superposent et le bouton part de travers. */
.hg-actions .cta-button {
  display: inline-flex; align-items: center;
  animation: none; opacity: 1; transform: none;
}
.hg-ghost {
  display: inline-flex; align-items: center;
  color: var(--gris-fonce);
  font-family: 'Poppins', sans-serif; font-size: 14.5px; font-weight: 600;
  padding: 14px 30px; border-radius: 36px;
  background: rgba(255, 255, 255, .7);
  border: 1.5px solid rgba(41, 41, 41, .18);
  backdrop-filter: blur(6px); -webkit-backdrop-filter: blur(6px);
  transition: border-color .25s ease, transform .25s ease, color .25s ease;
}
.hg-ghost:hover { border-color: var(--rouge); color: var(--rouge); transform: translateY(-3px); }
.hg-veil { display: none; }
/* Le header est fixe : sans ça, l'ancre cale la cible sous la pilule. On vise
   la section entière et pas la grille seule, sinon on saute les filtres. */
#photos { scroll-margin-top: calc(var(--header-h) + 10px); }

@media (max-width: 1024px) {
  /* Plus la place pour deux colonnes côte à côte : les builds repassent en
     fond très atténué et le message reprend tout l'écran. */
  .hg-cols { width: 100%; opacity: .14; padding: 0 6vw; }
  .hg-inner { width: 100%; padding: 0 6vw; align-items: center; text-align: center; }
  .hg-sub { margin-left: auto; margin-right: auto; }
  .hg-actions { justify-content: center; }
  .hg-veil {
    display: block; position: absolute; inset: 0; z-index: 4; pointer-events: none;
    background: radial-gradient(80% 60% at 50% 50%, rgba(255, 255, 255, .75) 20%, transparent 100%);
  }
}
@media (max-width: 640px) {
  .hg-actions { width: 100%; }
  .hg-actions .cta-button, .hg-ghost { width: 100%; justify-content: center; }
}

/* ==========================================================================
   TÉLÉCHARGEMENTS — DA minimaliste (issue de dl-lab.html, variante 01)
   Le hero est propre à la page ; la liste/grille est partagée avec la
   section Téléchargements de l'accueil. Pas de carte à ombre : des filets,
   le rouge en accent, le vert en micro-signal (l'étoile).
   ========================================================================== */

/* ---------- Hero de la page ---------- */
.dl-hero {
  position: relative; overflow: hidden; background: var(--blanc);
  padding: calc(var(--header-h) + 80px) 0 70px;
}
.dl-hero .container { position: relative; z-index: 10; }
.dl-h-grille { display: grid; grid-template-columns: 1.15fr .85fr; gap: 60px; align-items: center; }
/* .brand-tag est en display:flex : sur l'accueil un parent centré la contraint,
   ici rien ne le fait — sans inline-flex elle s'étire sur toute la colonne. */
.dl-hero .brand-tag { display: inline-flex; margin-bottom: 24px; }
.dl-h1 {
  font-family: 'Poppins', sans-serif; font-weight: 500;
  font-size: clamp(2.5rem, 1.7rem + 3.4vw, 4.6rem);
  line-height: 1.03; letter-spacing: -.03em; color: var(--gris-fonce);
  margin-bottom: 20px;
  transform: translateY(20px); opacity: 0;
  animation: fadeInUp 1s ease forwards .4s;
}
/* Un point rouge suffit : le dégradé rouge→vert sur un titre, c'est le tic
   qu'on cherche justement à enlever. */
.dl-h1 b { color: var(--rouge); font-weight: 500; }
.dl-chapo {
  color: var(--corps); line-height: 1.75; max-width: 480px; margin-bottom: 32px;
  transform: translateY(20px); opacity: 0;
  animation: fadeInUp 1s ease forwards .6s;
}
.dl-h-actions {
  display: flex; gap: 12px; flex-wrap: wrap;
  transform: translateY(20px); opacity: 0;
  animation: fadeInUp 1s ease forwards .8s;
}
/* Le logo du modpack est la seule image « propre » du lot (les autres sont
   des captures ou des bannières à texte incrusté) : sa place est ici, en
   grand, pas recadrée dans une vignette de grille. */
.dl-h-vis { display: grid; place-items: center; }
.dl-h-vis img {
  width: min(100%, 400px);
  filter: drop-shadow(0 30px 55px rgba(219, 53, 53, .2));
  animation: dlFlotte 7s ease-in-out infinite;
}
@keyframes dlFlotte { 50% { transform: translateY(-14px); } }
.dl-h-meta {
  display: grid; grid-template-columns: repeat(4, 1fr);
  margin-top: 70px; border-top: 1px solid var(--filet);
}
.dl-h-meta div { padding-top: 22px; }
.dl-h-meta b {
  display: block; font-family: 'Poppins', sans-serif; font-weight: 600;
  font-size: 1.15rem; color: var(--gris-fonce); letter-spacing: -.01em;
}
.dl-h-meta span {
  display: block; margin-top: 4px; font-size: 11px; color: var(--sourdine);
  letter-spacing: .14em; text-transform: uppercase; font-family: 'Poppins', sans-serif;
}
.dl-corps {
  padding: 96px 0 110px; background: var(--blanc);
  scroll-margin-top: calc(var(--header-h) + 10px);
}

/* ---------- Vocabulaire commun ---------- */
.dl-btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 9px;
  border-radius: 36px; padding: 13px 28px;
  font-family: 'Poppins', sans-serif; font-size: 13.5px; font-weight: 600;
  transition: background .2s, color .2s, border-color .2s, transform .2s;
}
.dl-btn-plein { background: var(--rouge); color: #fff; }
.dl-btn-plein:hover { background: var(--rouge-fonce); transform: translateY(-2px); }
.dl-btn-vide { border: 1px solid var(--filet); color: var(--gris-texte); }
.dl-btn-vide:hover { border-color: var(--gris-fonce); }

.dl-surtitre {
  font-family: 'Poppins', sans-serif; font-size: 11px; font-weight: 600;
  letter-spacing: .16em; text-transform: uppercase; color: var(--sourdine);
  margin-bottom: 10px;
}
.dl-titre2 {
  font-family: 'Poppins', sans-serif; font-weight: 500;
  font-size: clamp(1.6rem, 1.2rem + 1.2vw, 2.1rem);
  color: var(--gris-fonce); letter-spacing: -.02em;
}
/* Un point rouge suffit : le dégradé rouge→vert sur un titre est le tic
   qu'on cherche justement à enlever. */
.dl-titre2 b { color: var(--rouge); font-weight: 500; }
.dl-tete { display: flex; justify-content: space-between; align-items: flex-end; gap: 40px; flex-wrap: wrap; }
.dl-outils { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; }

/* Bascule liste / grille — même langage que les filtres, en plus discret */
.dl-vues { display: flex; gap: 2px; padding: 3px; border: 1px solid var(--filet); border-radius: 36px; }
.dl-vues button {
  width: 36px; height: 30px; border: 0; border-radius: 36px; background: none;
  display: grid; place-items: center; cursor: pointer; color: var(--sourdine);
  transition: background .2s, color .2s;
}
.dl-vues button svg { width: 15px; height: 15px; }
.dl-vues button:hover { color: var(--gris-fonce); }
.dl-vues button[aria-pressed="true"] { background: var(--rouge); color: #fff; }

.dl-filtres { display: flex; gap: 8px; flex-wrap: wrap; }
.dl-filtres button {
  border: 1px solid var(--filet); border-radius: 36px; background: #fff;
  padding: 8px 20px; cursor: pointer; white-space: nowrap;
  font-family: 'Poppins', sans-serif; font-size: 13px; font-weight: 500;
  color: var(--gris-texte);
  transition: border-color .2s, color .2s, background .2s;
}
.dl-filtres button:hover { border-color: var(--gris-fonce); }
.dl-filtres button[aria-pressed="true"] { background: var(--rouge); border-color: var(--rouge); color: #fff; }

.dl-fl {
  display: inline-flex; align-items: center; gap: 8px;
  font-family: 'Poppins', sans-serif; font-size: 13px; font-weight: 600;
  color: var(--gris-fonce); transition: color .2s, gap .2s;
}
.dl-fl:hover { color: var(--rouge); gap: 13px; }

/* --------------------------------------------------------------------------
   Le fichier : UN seul balisage (.dl-item), deux vues.
   C'est le conteneur qui décide — .dl-liste ou .dl-grille. Dupliquer le
   balisage par vue, c'est se garantir deux versions qui divergent au premier
   fichier ajouté.
   -------------------------------------------------------------------------- */
.dl-item { position: relative; }
.dl-item.cache { display: none !important; }
.dl-n { font-family: 'Poppins', sans-serif; font-size: 12px; font-weight: 600; color: var(--sourdine); }
.dl-nom {
  font-family: 'Poppins', sans-serif; font-weight: 600;
  color: var(--gris-fonce); letter-spacing: -.01em;
}
.dl-desc { color: var(--sourdine); }
.dl-ver { font-family: 'Poppins', sans-serif; font-size: 12.5px; font-weight: 600; }
.dl-note { font-size: 12.5px; color: var(--sourdine); }
.dl-note::before { content: '★'; color: var(--vert); margin-right: 4px; }
.dl-media { position: relative; display: block; overflow: hidden; background: var(--gris-clair); }
.dl-media img { width: 100%; height: 100%; object-fit: cover; transition: transform .7s cubic-bezier(.2, .8, .2, 1); }
/* modpack.webp est un logo, pas une capture : en `cover` il se fait recadrer */
.dl-media img.logo { object-fit: contain; padding: 9%; }
.dl-tag {
  position: absolute; top: 12px; left: 12px;
  background: var(--rouge); color: #fff; border-radius: 36px;
  padding: 5px 13px;
  font-family: 'Poppins', sans-serif; font-size: 10.5px; font-weight: 600;
  letter-spacing: .06em; text-transform: uppercase;
}

/* ---------- Vue LISTE ---------- */
.dl-liste { margin-top: 46px; position: relative; }
.dl-liste .dl-item {
  display: grid; grid-template-columns: 40px 1.5fr 1fr 130px 150px;
  align-items: center; gap: 20px;
  padding: 26px 0; border-top: 1px solid var(--filet);
  transition: opacity .3s;
}
.dl-liste .dl-item:last-of-type { border-bottom: 1px solid var(--filet); }
/* Tout s'efface sauf la ligne visée : c'est ce qui remplace le survol des cartes */
.dl-liste:hover .dl-item:not(:hover) { opacity: .38; }
.dl-liste .dl-media, .dl-liste .dl-details { display: none; }
.dl-liste .dl-nom {
  font-size: 1.28rem;
  transition: transform .4s cubic-bezier(.2, .8, .2, 1), color .3s;
}
.dl-liste .dl-item:hover .dl-nom { transform: translateX(12px); color: var(--rouge); }
.dl-liste .dl-desc { font-size: 13px; }
.dl-liste .dl-meta { display: grid; grid-template-columns: 62px auto; gap: 14px; align-items: baseline; }
.dl-liste .dl-actions { justify-self: end; }
.dl-liste .dl-tele {
  display: inline-flex; align-items: center; gap: 8px;
  font-family: 'Poppins', sans-serif; font-size: 13px; font-weight: 600;
  color: var(--gris-fonce); transition: color .2s, gap .2s;
}
.dl-liste .dl-tele::after { content: '→'; }
.dl-liste .dl-tele:hover { color: var(--rouge); gap: 13px; }

/* ---------- Vue GRILLE ---------- */
.dl-grille { margin-top: 46px; display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; }
.dl-grille .dl-item {
  display: flex; flex-direction: column;
  border: 1px solid var(--filet); border-radius: 18px; overflow: hidden;
  transition: border-color .25s;
}
.dl-grille .dl-item:hover { border-color: rgba(0, 0, 0, .24); }
.dl-grille .dl-item:hover .dl-media img { transform: scale(1.04); }
.dl-grille .dl-n { display: none; }
.dl-grille .dl-media { aspect-ratio: 16/10; }
.dl-grille .dl-nom { font-size: 1.08rem; padding: 18px 18px 0; }
.dl-grille .dl-desc { font-size: 13px; line-height: 1.6; padding: 6px 18px 0; }
.dl-grille .dl-meta { display: flex; gap: 16px; padding: 14px 18px 0; margin-top: auto; }
.dl-grille .dl-actions { display: flex; gap: 8px; padding: 16px 18px 18px; }
.dl-grille .dl-tele, .dl-grille .dl-details {
  flex: 1;
  display: inline-flex; align-items: center; justify-content: center;
  border-radius: 36px; padding: 11px 16px;
  font-family: 'Poppins', sans-serif; font-size: 13px; font-weight: 600;
  transition: background .2s, color .2s, border-color .2s, transform .2s;
}
.dl-grille .dl-tele { background: var(--rouge); color: #fff; }
.dl-grille .dl-tele:hover { background: var(--rouge-fonce); transform: translateY(-2px); }
.dl-grille .dl-details { border: 1px solid var(--filet); color: var(--gris-texte); }
.dl-grille .dl-details:hover { border-color: var(--gris-fonce); }

/* L'aperçu vit hors du flux et traîne derrière le curseur (lerp dans main.js) */
.dl-vue {
  position: fixed; top: 0; left: 0; z-index: 150;
  width: 260px; aspect-ratio: 16/11; border-radius: 18px; overflow: hidden;
  pointer-events: none; opacity: 0;
  transform: translate(-50%, -50%) scale(.92);
  transition: opacity .3s, transform .45s cubic-bezier(.2, .8, .2, 1);
  box-shadow: 0 20px 50px rgba(0, 0, 0, .18);
  background: var(--gris-clair);
}
.dl-vue.on { opacity: 1; transform: translate(-50%, -50%) scale(1); }
.dl-vue img {
  position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover;
  opacity: 0; visibility: hidden; transition: opacity .3s, visibility .3s;
}
.dl-vue img.on { opacity: 1; visibility: visible; }
/* modpack.webp est un logo, pas une capture : en `cover` il se fait recadrer */
.dl-vue img.logo { object-fit: contain; padding: 11%; }

.dl-aide {
  border-top: 1px solid var(--filet); margin-top: 90px; padding-top: 26px;
  display: flex; justify-content: space-between; align-items: baseline;
  gap: 20px; flex-wrap: wrap;
}

@media (max-width: 1024px) {
  .dl-vue { display: none; }
  .dl-liste .dl-item { grid-template-columns: 30px 1fr auto; gap: 14px; }
  .dl-liste .dl-desc, .dl-liste .dl-meta { display: none; }
  .dl-grille { grid-template-columns: repeat(2, 1fr); gap: 20px; }
  .dl-h-grille { grid-template-columns: 1fr; gap: 40px; }
  .dl-h-vis { order: -1; }
  .dl-h-vis img { width: min(70%, 280px); }
  .dl-h-meta { grid-template-columns: repeat(2, 1fr); row-gap: 20px; margin-top: 50px; }
}
@media (max-width: 640px) {
  .dl-filtres { overflow-x: auto; flex-wrap: nowrap; scrollbar-width: none; padding-bottom: 4px; }
  .dl-filtres::-webkit-scrollbar { display: none; }
  /* Padding aligné sur les filtres « top » de la galerie niv1 (.gx1-tag) */
  .dl-filtres button { padding: 9px 18px; }
  .dl-outils { width: 100%; justify-content: space-between; }
  .dl-grille { grid-template-columns: 1fr; }
  .dl-hero { padding-top: calc(var(--header-h) + 40px); }
  .dl-corps { padding: 60px 0 80px; }
  .dl-h-actions { width: 100%; }
  .dl-h-actions .dl-btn { flex: 1; }
}

/* ---------- L'état vide des filtres ----------
   Schematics, blueprints Axiom et mondes existent comme catégories AVANT
   d'avoir leurs fichiers : quand un filtre ne renvoie rien, ce bloc le dit
   franchement au lieu de laisser un trou (le piège « Véhicules » de
   l'ancienne galerie). Affiché/masqué par main.js via [hidden]. */
.dl-vide { border-top: 1px solid var(--filet); margin-top: 46px; padding: 72px 0; text-align: center; }
.dl-vide-titre {
  font-family: 'Poppins', sans-serif; font-weight: 600; font-size: 1.15rem;
  color: var(--gris-fonce); letter-spacing: -.01em;
}
.dl-vide-note { margin: 10px auto 0; max-width: 460px; color: var(--sourdine); font-size: 13.5px; line-height: 1.75; }
.dl-vide-note a { color: var(--rouge); }
.dl-vide-note a:hover { text-decoration: underline; }

/* ---------- Le pas-à-pas d'installation : « Jusqu'au spawn » ----------
   Cinq étapes, du premier clic à « on se voit sur le serveur ». Les textes
   s'appuient sur ressources/commencer.html — la version détaillée. Colonne
   gauche épinglée, étapes en lignes filetées : le langage de la liste. */
.dl-guide {
  background: var(--blanc); padding: 96px 0 110px;
  border-top: 1px solid var(--filet);
  scroll-margin-top: calc(var(--header-h) + 10px);
}
.dl-g-grille { display: grid; grid-template-columns: .8fr 1.2fr; gap: 70px; align-items: start; }
.dl-g-gauche { position: sticky; top: calc(var(--header-h) + 24px); }
.dl-g-chapo { margin-top: 16px; color: var(--gris-texte); line-height: 1.75; max-width: 420px; }
.dl-g-note { margin-top: 22px; color: var(--sourdine); font-size: 13.5px; line-height: 1.75; max-width: 420px; }
.dl-g-etapes { list-style: none; }
.dl-g-etapes li {
  display: grid; grid-template-columns: 44px 1fr; gap: 22px;
  padding: 28px 0; border-top: 1px solid var(--filet);
}
.dl-g-etapes li:last-child { border-bottom: 1px solid var(--filet); }
.dl-g-n { font-family: 'Poppins', sans-serif; font-size: 12px; font-weight: 600; color: var(--sourdine); padding-top: 5px; }
.dl-g-etapes h3 {
  font-family: 'Poppins', sans-serif; font-weight: 600; font-size: 1.15rem;
  color: var(--gris-fonce); letter-spacing: -.01em; margin-bottom: 8px;
}
.dl-g-etapes p { color: var(--gris-texte); line-height: 1.75; max-width: 560px; }
.dl-g-etapes a { color: var(--rouge); }
.dl-g-etapes a:hover { text-decoration: underline; }
.dl-g-adresse { font-family: 'Poppins', sans-serif; font-weight: 600; }
@media (max-width: 1024px) {
  .dl-g-grille { grid-template-columns: 1fr; gap: 40px; }
  .dl-g-gauche { position: static; }
  .dl-guide { padding: 60px 0 80px; }
}

  /* ==========================================================================
 PAGE MEMBRES — DA minimaliste (essai A, hero « Défilé »)
 Le staff en rangées, les 7 grades de construction dessinés comme une
 échelle qu'on gravit. Pas de carte : des filets, le rouge en accent, et
 la couleur des grades réduite à une pastille — elle vient du jeu.
 ========================================================================== */

/* Vocabulaire minimaliste : le filet remplace ombres et cartes, le rouge
   est un accent, le vert un micro-signal. */
.mb-sur {
  font-family: 'Poppins', sans-serif; font-size: 11px; font-weight: 600;
  letter-spacing: .16em; text-transform: uppercase; color: var(--sourdine);
}
.mb-h1 {
  font-family: 'Poppins', sans-serif; font-weight: 500;
  font-size: clamp(2.4rem, 1.6rem + 3.2vw, 4.4rem);
  line-height: 1.04; letter-spacing: -.03em; color: var(--gris-fonce);
  margin: 18px 0 20px;
}
/* Un point rouge suffit : pas de dégradé rouge→vert sur le titre */
.mb-h1 b { color: var(--rouge); font-weight: 500; }
.mb-h2 {
  font-family: 'Poppins', sans-serif; font-weight: 500;
  font-size: clamp(1.6rem, 1.2rem + 1.2vw, 2.1rem);
  color: var(--gris-fonce); letter-spacing: -.02em;
}
.mb-h2 b { color: var(--rouge); font-weight: 500; }
.mb-chapo { color: var(--corps); line-height: 1.75; max-width: 520px; }
.mb-hero { position: relative; overflow: hidden; padding: calc(var(--header-h) + 80px) 0 60px; }
.mb-hero .container { position: relative; z-index: 10; }
.mb-hero .brand-tag { display: inline-flex; margin: 0; }
.mb-sec { padding: 90px 0; }
.mb-tete { display: flex; justify-content: space-between; align-items: flex-end; gap: 40px; flex-wrap: wrap; margin-bottom: 44px; }
.mb-btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 9px;
  border-radius: 36px; padding: 13px 28px;
  font-family: 'Poppins', sans-serif; font-size: 13.5px; font-weight: 600;
  background: var(--rouge); color: #fff;
  transition: background .2s, transform .2s;
}
.mb-btn:hover { background: var(--rouge-fonce); transform: translateY(-2px); }
.mb-fl {
  display: inline-flex; align-items: center; gap: 8px;
  font-family: 'Poppins', sans-serif; font-size: 13px; font-weight: 600;
  color: var(--gris-fonce); transition: color .2s, gap .2s;
}
.mb-fl:hover { color: var(--rouge); gap: 13px; }
/* La pastille de couleur porte le grade : c'est la seule couleur admise
   hors rouge/vert, parce qu'elle vient du jeu. */
.mb-pastille { width: 9px; height: 9px; border-radius: 50%; flex: none; }
.mb-nom {
  font-family: 'Poppins', sans-serif; font-weight: 600;
  color: var(--gris-fonce); letter-spacing: -.01em;
}
.mb-meta { display: grid; grid-template-columns: repeat(3, 1fr); margin-top: 60px; border-top: 1px solid var(--filet); }
.mb-meta div { padding-top: 22px; }
.mb-meta b {
  display: block; font-family: 'Poppins', sans-serif; font-weight: 600;
  font-size: 1.15rem; color: var(--gris-fonce);
}
.mb-meta span {
  display: block; margin-top: 4px; font-size: 11px; color: var(--sourdine);
  letter-spacing: .14em; text-transform: uppercase; font-family: 'Poppins', sans-serif;
}
/* Les skins Minecraft sont des pixel-art : jamais de lissage */
.mb-skin { image-rendering: pixelated; }
.mb-reseaux { border-top: 1px solid var(--filet); padding-top: 26px; display: flex; justify-content: space-between; align-items: center; gap: 24px; flex-wrap: wrap; }
.mb-rs { display: flex; gap: 8px; flex-wrap: wrap; }
.mb-rs a {
  display: inline-flex; align-items: center; gap: 8px;
  border: 1px solid var(--filet); border-radius: 36px; padding: 9px 16px;
  font-family: 'Poppins', sans-serif; font-size: 12.5px; font-weight: 500;
  color: var(--gris-texte); transition: border-color .2s, color .2s;
}
.mb-rs a svg { width: 14px; height: 14px; fill: currentColor; }
.mb-rs a:hover { border-color: var(--rouge); color: var(--rouge); }
@media (max-width: 900px) {
  .mb-hero { padding-top: calc(var(--header-h) + 40px); }
  .mb-sec { padding: 60px 0; }
  .mb-meta { grid-template-columns: 1fr 1fr; row-gap: 18px; }
}

.a-role { padding: 34px 0; border-top: 1px solid var(--filet); display: grid; grid-template-columns: 220px 1fr; gap: 40px; align-items: start; }
.a-role:last-of-type { border-bottom: 1px solid var(--filet); }
.a-role-tete { display: flex; align-items: center; gap: 10px; }
.a-role h3 { font-family: 'Poppins', sans-serif; font-weight: 600; font-size: 1.15rem; color: var(--gris-fonce); }
.a-role p { color: var(--sourdine); font-size: 13px; line-height: 1.7; margin-top: 10px; }
.a-gens { display: flex; gap: 26px; flex-wrap: wrap; }
.a-gars { text-align: center; }
.a-gars img { height: 84px; width: auto; margin-bottom: 8px; }
.a-gars span { display: block; font-size: 12px; color: var(--gris-texte); font-family: 'Poppins', sans-serif; }
.a-ech { position: relative; padding-left: 46px; }
.a-ech::before { content: ''; position: absolute; left: 5px; top: 12px; bottom: 12px; width: 1px; background: var(--filet); }
.a-bar { position: relative; padding: 26px 0; }
.a-bar + .a-bar { border-top: 1px solid var(--filet); }
.a-bar .pt { position: absolute; left: -46px; top: 32px; width: 11px; height: 11px; border-radius: 50%; box-shadow: 0 0 0 4px var(--blanc); }
.a-bar .n { font-family: 'Poppins', sans-serif; font-size: 11px; font-weight: 600; color: var(--sourdine); letter-spacing: .12em; }
.a-bar h3 { font-family: 'Poppins', sans-serif; font-weight: 600; font-size: 1.3rem; color: var(--gris-fonce); letter-spacing: -.015em; margin: 6px 0 8px; }
.a-bar p { color: var(--corps); line-height: 1.75; max-width: 620px; }
@media (max-width: 900px) {
  .a-role { grid-template-columns: 1fr; gap: 20px; }
  .a-ech { padding-left: 30px; }
  .a-bar .pt { left: -30px; }
}

.h-bande {
  margin-top: 50px; overflow: hidden;
  -webkit-mask-image: linear-gradient(90deg, transparent, #000 7%, #000 93%, transparent);
          mask-image: linear-gradient(90deg, transparent, #000 7%, #000 93%, transparent);
}
/* Piste doublée dans le HTML : translateX(-50%) boucle sans raccord */
.h-piste { display: flex; gap: 30px; width: max-content; align-items: flex-end; animation: hDefile 44s linear infinite; }
.h-bande:hover .h-piste { animation-play-state: paused; }
@keyframes hDefile { to { transform: translateX(-50%); } }
.h-piste img { height: 110px; width: auto; opacity: .9; transition: opacity .25s, transform .25s; }
.h-piste img:hover { opacity: 1; transform: translateY(-8px); }
@media (max-width: 900px) { .h-piste img { height: 76px; } .h-piste { gap: 18px; } }
@media (prefers-reduced-motion: reduce) { .h-piste { animation: none; } }

/* Réduction des animations */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: .01ms !important; animation-iteration-count: 1 !important;
    transition-duration: .01ms !important;
  }
  .brand-tag, .main-heading, .subtitle, .cta-button { opacity: 1; transform: none; }
  .hg-titre, .hg-sub, .hg-actions { opacity: 1; transform: none; }
  .dl-h1, .dl-chapo, .dl-h-actions { opacity: 1; transform: none; }
  .dl-h-vis img { animation: none; }
}

/* ==========================================================================
   CHARTE GRAPHIQUE — « LE NUANCIER »
   La page se lit comme un nuancier d'imprimeur : la couleur n'est pas
   illustrée par une pastille posée à côté d'une légende, elle EST la
   surface, et la légende vit dedans. Préfixe ng-.
   ========================================================================== */

/* ---------- Hero : l'éventail ----------
   Les lames sont empilées au même point et pivotent depuis leur base :
   c'est le geste d'un nuancier papier qu'on ouvre. L'angle de chaque lame
   est porté par --a, écrit dans le HTML ; au repos l'éventail n'est ouvert
   qu'à 38 %, il se déploie au survol. */
.ng-hero { position: relative; overflow: hidden; padding: calc(var(--header-h) + 80px) 0 0; }
.ng-hero .container { position: relative; z-index: 10; }
.ng-hero-grille { display: grid; grid-template-columns: 1fr 440px; gap: 60px; align-items: center; }
.ng-h1 {
  font-family: 'Poppins', sans-serif; font-weight: 700;
  font-size: clamp(2.3rem, 4.6vw, 3.8rem); line-height: 1.05;
  letter-spacing: -.035em; color: var(--gris-fonce);
}
.ng-h1 b { color: var(--rouge); }
.ng-chapo { margin-top: 20px; max-width: 540px; color: var(--corps); line-height: 1.75; }

.ng-eventail {
  position: relative; height: 420px;
  display: flex; align-items: flex-end; justify-content: center;
}
.ng-lame {
  position: absolute; bottom: 0;
  width: 56px; height: 290px;
  border-radius: 28px;
  transform-origin: 50% 100%;
  transform: rotate(calc(var(--a) * .38));
  transition: transform .7s cubic-bezier(.22, 1, .36, 1);
  box-shadow: 0 10px 30px rgba(0, 0, 0, .1);
}
.ng-eventail:hover .ng-lame { transform: rotate(var(--a)); }
/* Le blanc a besoin d'un filet, sinon la lame disparaît sur le fond. */
.ng-lame--filet { box-shadow: 0 10px 30px rgba(0, 0, 0, .1), inset 0 0 0 1px var(--filet); }
.ng-eventail-socle {
  position: absolute; bottom: -20px; z-index: 20;
  width: 76px; height: 76px; border-radius: 50%;
  background: var(--blanc); border: 2px solid var(--rouge);
  display: grid; place-items: center;
}
.ng-eventail-socle img { width: 40px; height: 40px; }

.ng-meta { display: grid; grid-template-columns: repeat(4, 1fr); margin-top: 70px; border-top: 1px solid var(--filet); }
.ng-meta div { padding: 22px 0 0; }
.ng-meta b {
  display: block; font-family: 'Poppins', sans-serif; font-weight: 600;
  font-size: 1.15rem; color: var(--gris-fonce);
}
.ng-meta span {
  display: block; margin-top: 4px; font-size: 11px; color: var(--sourdine);
  letter-spacing: .14em; text-transform: uppercase; font-family: 'Poppins', sans-serif;
}

/* ---------- Structure de section ---------- */
.ng-sec { padding: 100px 0; }
.ng-sec--gris { background: var(--gris-clair); }
.ng-tete { margin-bottom: 46px; max-width: 720px; }
.ng-num {
  font-family: 'Poppins', sans-serif; font-size: 11px; font-weight: 600;
  color: var(--sourdine); letter-spacing: .16em; text-transform: uppercase;
}
.ng-h2 {
  font-family: 'Poppins', sans-serif; font-weight: 600;
  font-size: clamp(1.7rem, 3vw, 2.4rem); line-height: 1.15;
  letter-spacing: -.025em; color: var(--gris-fonce); margin-top: 10px;
}
.ng-h2 b { color: var(--rouge); }
.ng-tete p { margin-top: 14px; color: var(--corps); line-height: 1.75; }
.ng-sur {
  font-family: 'Poppins', sans-serif; font-size: 11px; font-weight: 600;
  color: var(--sourdine); letter-spacing: .14em; text-transform: uppercase;
  padding-bottom: 14px; border-bottom: 1px solid var(--filet); margin-bottom: 26px;
}
/* Une intertitre qui suit un bloc doit s'en décoller : les légendes de la
   grille précédente ont des hauteurs inégales et viendraient le toucher. */
* + .ng-sur { margin-top: 64px; }

/* ---------- Le nuancier ----------
   Chaque nuance est un bouton : cliquer copie l'hexa. La légende est dans
   la couleur, jamais en dessous — c'est ce qui sépare un nuancier d'une
   grille de pastilles. */
.ng-gamme { display: grid; grid-template-columns: repeat(auto-fit, minmax(185px, 1fr)); gap: 14px; }
.ng-nuance {
  position: relative; display: flex; flex-direction: column; justify-content: flex-end;
  min-height: 258px; padding: 20px; border: 0; border-radius: 16px;
  text-align: left; cursor: pointer; color: #fff;
  font-family: 'Poppins', sans-serif;
  transition: transform .3s cubic-bezier(.22, 1, .36, 1), box-shadow .3s ease;
}
.ng-nuance:hover { transform: translateY(-6px); box-shadow: 0 18px 40px rgba(0, 0, 0, .13); }
/* Nuances claires : le texte blanc y serait illisible. */
.ng-nuance--clair { color: var(--gris-fonce); }
.ng-nuance--bord { box-shadow: inset 0 0 0 1px var(--filet); }
.ng-nuance--bord:hover { box-shadow: inset 0 0 0 1px var(--filet), 0 18px 40px rgba(0, 0, 0, .13); }
.ng-nuance i {
  position: absolute; top: 18px; left: 20px;
  font-style: normal; font-size: 11px; font-weight: 600;
  letter-spacing: .14em; opacity: .55;
}
.ng-nuance strong { display: block; font-size: 15px; font-weight: 600; letter-spacing: -.01em; }
.ng-nuance code {
  display: block; margin-top: 3px;
  font-family: 'Poppins', sans-serif; font-size: 12.5px; font-weight: 500;
  letter-spacing: .06em; opacity: .72;
}
/* Le filet sous le nom reprend la couleur du texte : il ne tranche jamais,
   quelle que soit la nuance qui le porte. */
.ng-nuance em {
  display: block; margin-top: 12px; padding-top: 12px;
  border-top: 1px solid currentColor;
  font-style: normal; font-family: 'Open Sans', sans-serif;
  font-size: 11.5px; line-height: 1.55; opacity: .78;
}
.ng-copie {
  position: absolute; top: 16px; right: 18px;
  font-size: 10.5px; font-weight: 600; letter-spacing: .1em; text-transform: uppercase;
  opacity: 0; transition: opacity .2s ease;
}
.ng-nuance:hover .ng-copie { opacity: .6; }
.ng-nuance.copie .ng-copie { opacity: 1; }

/* Écart assumé entre la charte et le code du site. La page montre le système
   réel : quand les deux divergent, on le dit ici plutôt que de le maquiller. */
.ng-ecart {
  display: flex; gap: 12px; align-items: flex-start;
  margin-top: 22px; padding-top: 16px; border-top: 1px solid var(--filet);
  font-size: 12.5px; color: var(--sourdine); line-height: 1.7; max-width: 720px;
}
.ng-ecart::before {
  content: ''; flex: none; margin-top: 6px;
  width: 7px; height: 7px; border-radius: 50%; background: var(--rouge);
}
.ng-ecart b { font-family: 'Poppins', sans-serif; font-weight: 600; color: var(--gris-fonce); }

/* ---------- La règle des deux mots ---------- */
.ng-regle {
  border: 1px solid var(--filet); border-radius: 20px;
  padding: clamp(30px, 5vw, 64px); text-align: center; background: var(--blanc);
}
.ng-mot {
  font-family: 'Poppins', sans-serif; font-weight: 700;
  font-size: clamp(1.9rem, 6.6vw, 4.8rem); line-height: 1; letter-spacing: -.03em;
}
.ng-mot span:first-child { color: var(--vert); }
.ng-mot span:last-child { color: var(--rouge-charte); }
.ng-mot-sub {
  margin-top: 16px; font-family: 'Poppins', sans-serif; font-weight: 600;
  font-size: clamp(.85rem, 1.5vw, 1.1rem); color: var(--gris-texte);
}
.ng-regle-notes { display: grid; grid-template-columns: repeat(auto-fit, minmax(210px, 1fr)); gap: 30px; margin-top: 54px; text-align: left; }
.ng-regle-notes div { border-top: 1px solid var(--filet); padding-top: 18px; }
.ng-regle-notes b { display: block; font-family: 'Poppins', sans-serif; font-weight: 600; font-size: 14px; color: var(--gris-fonce); }
.ng-regle-notes p { margin-top: 7px; font-size: 13px; color: var(--sourdine); line-height: 1.65; }

/* ---------- Typographie ---------- */
.ng-typo { border-top: 1px solid var(--filet); padding: 34px 0; display: grid; grid-template-columns: 200px 1fr; gap: 40px; align-items: baseline; }
.ng-typo:last-of-type { border-bottom: 1px solid var(--filet); }
.ng-typo-nom { font-family: 'Poppins', sans-serif; font-weight: 600; font-size: 1.15rem; color: var(--gris-fonce); }
.ng-typo-role { margin-top: 6px; font-size: 12px; color: var(--sourdine); line-height: 1.6; }
.ng-typo-spec { font-size: clamp(1.5rem, 3.6vw, 2.7rem); line-height: 1.25; color: var(--gris-fonce); letter-spacing: -.02em; }
.ng-typo-jeu { margin-top: 10px; font-size: 12.5px; color: var(--sourdine); letter-spacing: .04em; }

/* ---------- Logos ---------- */
.ng-logos { display: grid; grid-template-columns: repeat(auto-fit, minmax(230px, 1fr)); gap: 18px; }
.ng-logo-vue { aspect-ratio: 4 / 3; display: grid; place-items: center; padding: 34px; border-radius: 18px; }
.ng-logo-vue img { max-height: 100%; width: auto; }
.ng-logo-vue--blanc { background: var(--blanc); box-shadow: inset 0 0 0 1px var(--filet); }
.ng-logo-vue--noir { background: #000; }
.ng-logo-vue--charbon { background: #292929; }
.ng-logo-vue--arc { background: linear-gradient(135deg, #e40303, #ff8c00, #ffed00, #008026, #004dff, #750787); }
.ng-logo-vue--gris { background: var(--gris-clair); }
.ng-logo figcaption { padding: 16px 4px 0; }
.ng-logo figcaption strong { display: block; font-family: 'Poppins', sans-serif; font-weight: 600; font-size: 14px; color: var(--gris-fonce); }
.ng-logo figcaption span { display: block; margin-top: 4px; font-size: 11.5px; color: var(--sourdine); line-height: 1.6; }

/* Zone de protection : le cadre pointillé matérialise la marge minimale
   autour du logo, exprimée en hauteurs de sa pastille verte. */
.ng-garde { display: grid; grid-template-columns: 1fr 380px; gap: 60px; align-items: center; margin-top: 74px; }
.ng-garde-vue {
  position: relative; aspect-ratio: 1; padding: 22%;
  background: var(--gris-clair); border-radius: 18px; display: grid; place-items: center;
}
.ng-garde-vue::before {
  content: ''; position: absolute; inset: 22%;
  border: 1px dashed var(--rouge); border-radius: 4px;
}
.ng-garde-vue img { width: 100%; height: auto; }
.ng-garde-liste { list-style: none; }
.ng-garde-liste li { border-top: 1px solid var(--filet); padding: 16px 0; font-size: 13.5px; color: var(--corps); line-height: 1.7; }
.ng-garde-liste li:last-child { border-bottom: 1px solid var(--filet); }
.ng-garde-liste li b { font-family: 'Poppins', sans-serif; color: var(--gris-fonce); font-weight: 600; }

/* ---------- Cas & usage : la galerie d'assets ---------- */
/* Colonnes figées, pas d'auto-fit : les assets ont des ratios différents et
   l'auto-fit glissait à 3 colonnes sur les séries pensées en 2. */
.ng-cas { display: grid; gap: 22px; }
.ng-cas--2 { grid-template-columns: repeat(2, 1fr); }
.ng-cas--3 { grid-template-columns: repeat(3, 1fr); }
.ng-piece-vue { overflow: hidden; border-radius: 14px; box-shadow: inset 0 0 0 1px var(--filet); }
.ng-piece-vue img { width: 100%; height: auto; transition: transform .5s cubic-bezier(.22, 1, .36, 1); }
.ng-piece:hover .ng-piece-vue img { transform: scale(1.03); }
.ng-piece figcaption { padding: 15px 2px 0; display: flex; justify-content: space-between; gap: 16px; align-items: baseline; }
.ng-piece figcaption strong { font-family: 'Poppins', sans-serif; font-weight: 600; font-size: 13.5px; color: var(--gris-fonce); }
.ng-piece figcaption span { font-size: 11px; color: var(--sourdine); letter-spacing: .08em; white-space: nowrap; font-family: 'Poppins', sans-serif; }
.ng-piece p { padding: 6px 2px 0; font-size: 12.5px; color: var(--sourdine); line-height: 1.65; }

/* Les bannières de listing sont minuscules et de formats très différents :
   les aligner sur une colonne à filets vaut mieux qu'une grille, qui les
   aurait toutes étirées à la même largeur. */
.ng-banniere {
  display: flex; align-items: center; justify-content: space-between; gap: 30px;
  border-top: 1px solid var(--filet); padding: 24px 0; flex-wrap: wrap;
}
.ng-banniere:last-of-type { border-bottom: 1px solid var(--filet); }
.ng-banniere img { max-width: 100%; height: auto; border-radius: 3px; box-shadow: 0 4px 16px rgba(0, 0, 0, .1); }
.ng-banniere-info { flex: 1; min-width: 210px; }
.ng-banniere-info strong { display: block; font-family: 'Poppins', sans-serif; font-weight: 600; font-size: 14px; color: var(--gris-fonce); }
.ng-banniere-info span { display: block; margin-top: 4px; font-size: 11px; color: var(--sourdine); letter-spacing: .1em; font-family: 'Poppins', sans-serif; }
.ng-banniere-info p { margin-top: 8px; font-size: 12.5px; color: var(--sourdine); line-height: 1.6; max-width: 380px; }

/* ---------- À faire / à ne pas faire ----------
   Même langage que la FAQ de l'accueil : un panneau gris arrondi posé dans
   le blanc de la section, et non une bande grise pleine largeur. */
.ng-panneau {
  background: #f1f1f1; border-radius: 26px;
  padding: 56px clamp(20px, 4vw, 48px) 44px;
}
.ng-panneau .ng-tete { margin-bottom: 38px; }
.ng-jugements { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: 22px; }
/* Cartes blanches sur le gris, comme les details de la FAQ. Le filet coloré
   du haut suit l'arrondi : c'est lui qui annonce la colonne. */
.ng-jugement {
  background: #fff; border-radius: 22px;
  border-top: 3px solid; padding: 24px 26px 8px;
  box-shadow: 0 2px 8px rgba(0, 0, 0, .05);
}
.ng-jugement--oui { border-top-color: var(--vert); }
.ng-jugement--non { border-top-color: var(--rouge-charte); }
/* Sur carte blanche, la dernière puce n'a plus besoin de son filet de bas. */
.ng-jugement li:last-child { border-bottom: 0; }
.ng-jugement-tag {
  font-family: 'Poppins', sans-serif; font-size: 11px; font-weight: 600;
  letter-spacing: .14em; text-transform: uppercase;
}
.ng-jugement--oui .ng-jugement-tag { color: #5ba31a; }
.ng-jugement--non .ng-jugement-tag { color: var(--rouge-charte); }
.ng-jugement ul { list-style: none; margin-top: 14px; }
.ng-jugement li { font-size: 13px; color: var(--corps); line-height: 1.7; padding: 10px 0 10px 20px; position: relative; border-bottom: 1px solid var(--filet); }
.ng-jugement li::before { position: absolute; left: 0; top: 10px; font-weight: 700; }
.ng-jugement--oui li::before { content: '+'; color: var(--vert); }
.ng-jugement--non li::before { content: '–'; color: var(--rouge-charte); }

/* ---------- Fin de la charte ---------- */
.ng-fin { text-align: center; }
.ng-fin .ng-tete { margin: 0 auto 32px; }
.ng-fin p { margin-left: auto; margin-right: auto; }

@media (max-width: 1024px) {
  .ng-hero-grille { grid-template-columns: 1fr; gap: 40px; }
  .ng-eventail { height: 340px; }
  .ng-garde { grid-template-columns: 1fr; gap: 34px; }
  .ng-garde-vue { max-width: 340px; }
}
@media (max-width: 900px) {
  .ng-cas--2, .ng-cas--3 { grid-template-columns: 1fr; }
}
@media (max-width: 640px) {
  .ng-hero { padding-top: calc(var(--header-h) + 40px); }
  .ng-sec { padding: 64px 0; }
  .ng-meta { grid-template-columns: 1fr 1fr; row-gap: 18px; }
  .ng-typo { grid-template-columns: 1fr; gap: 14px; }
  .ng-lame { width: 42px; height: 210px; }
  .ng-eventail { height: 270px; }
  /* Sans survol au doigt, l'éventail resterait fermé : on l'ouvre d'office,
     à 70 % pour qu'il tienne dans la largeur. */
  .ng-lame { transform: rotate(calc(var(--a) * .7)); }
}
/* L'éventail reste lisible sans le geste : on le fige à demi ouvert. */
@media (prefers-reduced-motion: reduce) {
  .ng-lame,
  .ng-eventail:hover .ng-lame { transform: rotate(calc(var(--a) * .38)); transition: none; }
}

/* ==========================================================================
   GALERIE PHOTOS — 3 NIVEAUX D'IMMERSION
   Même système que le hero d'accueil : une pilule, un range 1→3, la classe
   .on qui bascille le niveau, le choix retenu d'une visite à l'autre.

   ⚠️ La pilule porte les IDs gal-immersion* et NON immersion* : le module
   d'immersion de main.js se garde sur #immersion et écrirait « Pioche /
   Cylindre / Bandeau » dans le nom, en plus d'écraser la clé de l'accueil.

   ⚠️ AUCUN NIVEAU NE RECADRE. Les 38 photos ont 12 ratios différents (7 sont
   carrées, 31 en paysage de 1.67 à 1.95) : chacune est posée à sa forme.
   L'ancienne page les forçait toutes en 16/10 et jetait 37 % de chaque image.

   Préfixe gx-.
   ========================================================================== */
.gx-niveau { display: none; }
.gx-niveau.on { display: block; }

.gx-hero { position: relative; overflow: hidden; padding: calc(var(--header-h) + 60px) 0 0; }
.gx-hero .container { position: relative; z-index: 10; }
.gx-surtitre { font-family: 'Poppins', sans-serif; font-size: 11px; font-weight: 600; letter-spacing: .16em; text-transform: uppercase; color: var(--sourdine); }
.gx-titre {
  font-family: 'Poppins', sans-serif; font-weight: 700;
  font-size: clamp(2.1rem, 1.5rem + 2.4vw, 3.4rem);
  color: var(--gris-fonce); letter-spacing: -.035em; line-height: 1.05; margin-top: 14px;
}
.gx-titre b { color: var(--rouge); }
.gx-chapo { color: var(--corps); line-height: 1.75; max-width: 580px; margin-top: 16px; }
/* Les skins Minecraft sont du pixel-art : jamais de lissage. */
.gx-skin { image-rendering: pixelated; }
/* Le marqueur d'écart : une légende qui ne décrit pas son image. */
.gx-ecart { display: inline-block; width: 6px; height: 6px; border-radius: 50%; background: var(--rouge); vertical-align: middle; margin-left: 5px; flex: none; }

/* ==========================================================================
   NIVEAU 1 — LA GRILLE
   Colonnes CSS plutôt que grille : c'est le seul moyen de laisser 12 ratios
   cohabiter sans en recadrer un seul.
   ========================================================================== */
.gx1-barre { display: flex; justify-content: space-between; align-items: center; gap: 20px; flex-wrap: wrap; margin-bottom: 32px; }
.gx1-tags { display: flex; gap: 8px; flex-wrap: wrap; }
.gx1-tag {
  border: 1px solid var(--filet); background: none; border-radius: 36px;
  padding: 9px 18px; cursor: pointer;
  font-family: 'Poppins', sans-serif; font-size: 12.5px; font-weight: 600; color: var(--gris-texte);
  transition: border-color .2s, color .2s, background .2s;
}
.gx1-tag:hover { border-color: var(--vert); color: var(--vert); }
.gx1-tag[aria-pressed="true"] { background: var(--rouge); border-color: var(--rouge); color: #fff; }
.gx1-tag b { opacity: .55; margin-left: 5px; font-weight: 600; }
.gx1-vues { display: flex; gap: 2px; background: var(--gris-clair); padding: 4px; border-radius: 36px; }
.gx1-vue {
  border: 0; background: none; border-radius: 36px; padding: 8px 16px; cursor: pointer;
  font-family: 'Poppins', sans-serif; font-size: 12px; font-weight: 600; color: var(--sourdine);
  transition: background .2s, color .2s;
}
.gx1-vue[aria-pressed="true"] { background: var(--blanc); color: var(--gris-fonce); }

.gx1-lot[data-vue="grille"] { columns: 3; column-gap: 20px; }
.gx1-lot[data-vue="liste"] { columns: 1; }
.gx1-item { display: block; width: 100%; border: 0; background: none; padding: 0; text-align: left; cursor: pointer; break-inside: avoid; }
.gx1-item.cache { display: none; }
/* Un <button> ne peut contenir que du texte en ligne : ses enfants sont donc
   des <span>, qu'il faut repasser en bloc — sinon le nom et la date se
   collent l'un à l'autre sur la même ligne. */
.gx1-vue-img, .gx1-info, .gx1-nom, .gx1-sous, .gx1-date { display: block; }
/* « Sans titre » n'est pas un titre : il se lit comme un manque, en sourdine. */
.gx1-nom.vide { color: var(--sourdine); font-weight: 500; font-style: italic; }
[data-vue="grille"] .gx1-item { margin-bottom: 20px; }
[data-vue="grille"] .gx1-vue-img { border-radius: 10px; overflow: hidden; box-shadow: inset 0 0 0 1px var(--filet); }
[data-vue="grille"] .gx1-vue-img img { width: 100%; height: auto; display: block; transition: transform .6s cubic-bezier(.22,1,.36,1); }
[data-vue="grille"] .gx1-item:hover .gx1-vue-img img { transform: scale(1.04); }
[data-vue="grille"] .gx1-info { padding: 11px 2px 0; }
[data-vue="grille"] .gx1-nom { font-family: 'Poppins', sans-serif; font-weight: 600; font-size: 13px; color: var(--gris-fonce); }
[data-vue="grille"] .gx1-sous { margin-top: 3px; font-size: 11.5px; color: var(--sourdine); font-family: 'Poppins', sans-serif; }
[data-vue="grille"] .gx1-date { display: none; }
/* Vue liste : la même donnée mise à plat, vignette 72 px, date à droite. */
[data-vue="liste"] .gx1-item {
  display: grid; grid-template-columns: 72px 1fr auto; gap: 20px; align-items: center;
  padding: 12px 0; border-top: 1px solid var(--filet);
}
[data-vue="liste"] .gx1-item:last-of-type { border-bottom: 1px solid var(--filet); }
[data-vue="liste"] .gx1-item:hover { background: var(--gris-clair); }
[data-vue="liste"] .gx1-vue-img { border-radius: 5px; overflow: hidden; height: 46px; }
[data-vue="liste"] .gx1-vue-img img { width: 100%; height: 100%; object-fit: cover; display: block; }
[data-vue="liste"] .gx1-nom { font-family: 'Poppins', sans-serif; font-weight: 600; font-size: 14px; color: var(--gris-fonce); }
[data-vue="liste"] .gx1-sous { margin-top: 3px; font-size: 12px; color: var(--sourdine); }
[data-vue="liste"] .gx1-date { font-family: 'Poppins', sans-serif; font-size: 11.5px; color: var(--sourdine); letter-spacing: .05em; white-space: nowrap; }
@media (max-width: 900px) { .gx1-lot[data-vue="grille"] { columns: 2; } }
@media (max-width: 640px) { .gx1-lot[data-vue="grille"] { columns: 1; } }

/* ==========================================================================
   NIVEAU 2 — LA TOILE
   Un plan bien plus grand que l'écran, qu'on tire dans n'importe quel sens.
   Fond blanc : c'est la couleur du site, et les photos y respirent mieux que
   sur du noir.
   ========================================================================== */
.gx2-cadre {
  position: relative; height: 100vh; overflow: hidden;
  background: var(--blanc); cursor: grab; touch-action: none;
  user-select: none; -webkit-user-select: none;
}
.gx2-cadre.tire { cursor: grabbing; }
.gx2-cadre:focus-visible { outline: 3px solid var(--vert); outline-offset: -3px; }
.gx2-trame {
  position: absolute; inset: 0; z-index: 0; pointer-events: none;
  background-image:
    linear-gradient(rgba(0,0,0,.05) 1px, transparent 1px),
    linear-gradient(90deg, rgba(0,0,0,.05) 1px, transparent 1px);
  background-size: 64px 64px;
}
.gx2-toile { position: absolute; top: 0; left: 0; will-change: transform; }
.gx2-piece {
  position: absolute; border: 0; padding: 0; background: none; cursor: pointer;
  border-radius: 4px; overflow: hidden;
  box-shadow: 0 14px 36px rgba(0,0,0,.15);
  transition: transform .35s cubic-bezier(.22,1,.36,1), box-shadow .35s ease;
}
/* draggable=false est posé sur chaque img côté HTML : sans lui, tirer DEPUIS
   une photo lance le glisser-déposer natif, qui envoie un pointercancel et
   fige la toile. Elle ne bougerait que depuis le fond. */
.gx2-piece img {
  width: 100%; height: 100%; object-fit: cover; display: block;
  pointer-events: none; -webkit-user-drag: none; user-select: none;
}
.gx2-piece:hover { transform: scale(1.03); box-shadow: 0 24px 60px rgba(0,0,0,.26); z-index: 5; }
.gx2-piece figcaption {
  position: absolute; left: 0; right: 0; bottom: 0;
  padding: 24px 12px 9px; text-align: left;
  background: linear-gradient(180deg, transparent, rgba(0,0,0,.8));
  font-family: 'Poppins', sans-serif; font-size: 11px; font-weight: 600; color: #fff;
  opacity: 0; transition: opacity .3s ease;
}
.gx2-piece:hover figcaption { opacity: 1; }
/* Les emplacements libres : ils montrent la toile telle qu'elle sera quand la
   crew aura envoyé ses photos. Jamais cliquables. */
.gx2-vide {
  position: absolute; border: 1px dashed rgba(0,0,0,.16); border-radius: 4px;
  display: grid; place-items: center; pointer-events: none; background: rgba(0,0,0,.012);
}
.gx2-vide span {
  font-family: 'Poppins', sans-serif; font-size: 10px; font-weight: 600;
  letter-spacing: .14em; text-transform: uppercase; color: rgba(0,0,0,.2);
}
/* L'aide reprend la pilule du site : blanche, filet rouge. Elle s'efface au
   premier geste — elle ne sert qu'une fois. */
.gx2-aide {
  position: absolute; left: 50%; bottom: 84px; transform: translateX(-50%); z-index: 12;
  background: var(--blanc); border: 2px solid var(--rouge-charte); color: var(--rouge-charte);
  padding: 7px 17px; border-radius: 36px;
  font-family: 'Poppins', sans-serif; font-size: 11.5px; font-weight: 600;
  pointer-events: none; transition: opacity .5s ease;
  box-shadow: 0 6px 20px rgba(0,0,0,.08);
}
.gx2-cadre.bouge .gx2-aide { opacity: 0; }
.gx2-plan {
  position: absolute; right: 18px; top: calc(var(--header-h) + 8px); z-index: 12;
  width: 156px; background: var(--blanc); border: 1px solid var(--filet);
  border-radius: 6px; padding: 5px; pointer-events: none;
  box-shadow: 0 8px 24px rgba(0,0,0,.08);
}
.gx2-plan-toile { position: relative; width: 100%; }
.gx2-plan-pt { position: absolute; background: rgba(0,0,0,.3); border-radius: 1px; }
.gx2-plan-pt.vide { background: rgba(0,0,0,.09); }
.gx2-plan-vue { position: absolute; border: 1.5px solid var(--rouge); border-radius: 2px; }

/* ==========================================================================
   NIVEAU 3 — LA PILE
   Les photos empilées en 3D ; la molette les fait défiler. Le titre applique
   la règle des deux mots de la charte : dernier mot rouge, le reste vert.
   ========================================================================== */
.gx3-scene {
  position: relative; height: 100vh; overflow: hidden;
  background: var(--blanc); perspective: 1500px; perspective-origin: 50% 50%;
  touch-action: none; user-select: none; -webkit-user-select: none;
}
.gx3-pile { position: absolute; inset: 0; transform-style: preserve-3d; }
/* La carte est calée sur la HAUTEUR, pas la largeur : c'est le seul moyen de
   donner la même présence à un carré et à un 1.94 sans recadrer ni l'un ni
   l'autre. Elle déborde volontairement à droite et passe sous le titre. */
.gx3-carte {
  position: absolute; top: 50%; left: 62%;
  height: 78vh; width: auto; max-width: 82vw;
  /* Le ratio vient de la photo, il n'est pas imposé : c'est tout le sujet. */
  aspect-ratio: var(--ar, 1);
  translate: -50% -50%;
  border-radius: 8px; overflow: hidden; background: var(--gris-clair);
  will-change: transform, opacity; cursor: pointer; border: 0; padding: 0;
  box-shadow: 0 30px 90px rgba(0,0,0,.28);
}
.gx3-carte img { width: 100%; height: 100%; object-fit: cover; display: block; pointer-events: none; -webkit-user-drag: none; }
/* Le voile de la charte, appliqué tel quel : « le décor s'efface, le
   screenshot passe sous un voile blanc à ~90 % ». Sans lui, le titre vert et
   rouge deviendrait illisible dès que la photo passe dessous. */
.gx3-voile {
  position: absolute; left: 0; top: 0; bottom: 0; width: 62vw; z-index: 15;
  pointer-events: none;
  background: linear-gradient(90deg,
    rgba(255,255,255,.98) 0%, rgba(255,255,255,.96) 38%,
    rgba(255,255,255,.78) 64%, rgba(255,255,255,0) 100%);
}
.gx3-texte { position: absolute; left: 5vw; top: 50%; transform: translateY(-52%); z-index: 20; pointer-events: none; max-width: 42vw; }
.gx3-h1 {
  font-family: 'Poppins', sans-serif; font-weight: 700;
  font-size: min(4.4vw, 8.6vh); line-height: .96; letter-spacing: -.04em;
  text-transform: uppercase;
}
/* Le masque de l'animation vit sur le MOT, pas la ligne : chaque lettre étant
   un inline-block, une ligne casserait au milieu d'un mot.
   Le padding paie le débord des glyphes hors de la ligne : à line-height .96
   la boîte est plus courte que les lettres, et l'overflow:hidden du masque
   leur coupait le bas. La marge négative annule le padding dans la mise en
   page — le masque gagne de la place sans que le titre bouge. */
.gx3-h1 .bloc { display: block; }
.gx3-h1 .mot {
  display: inline-block; overflow: hidden; white-space: nowrap; vertical-align: bottom;
  padding-bottom: .22em; margin-bottom: -.22em;
}
.gx3-h1 .ch { display: inline-block; animation: gx3In .7s cubic-bezier(.2,.8,.2,1) both; }
.gx3-h1 .vert { color: var(--vert); }
.gx3-h1 .rouge { color: var(--rouge); }
/* 130 % : les lettres doivent démarrer sous le masque AGRANDI par le padding. */
@keyframes gx3In { from { transform: translateY(130%) skewY(6deg); opacity: 0; } to { transform: none; opacity: 1; } }
.gx3-sous { margin-top: 20px; font-family: 'Poppins', sans-serif; font-size: clamp(12.5px, 1vw, 15px); color: var(--sourdine); line-height: 1.7; }
.gx3-gens { display: flex; gap: 18px; margin-top: 18px; }
.gx3-gars { display: flex; align-items: center; gap: 8px; }
.gx3-gars img { height: 42px; width: auto; }
.gx3-gars span { font-family: 'Poppins', sans-serif; font-size: 9px; font-weight: 600; letter-spacing: .1em; text-transform: uppercase; color: var(--sourdine); display: block; }
.gx3-gars b { font-family: 'Poppins', sans-serif; font-size: 12px; font-weight: 600; color: var(--gris-fonce); display: block; margin-top: 2px; }
.gx3-ouvrir {
  pointer-events: auto; margin-top: 24px;
  background: var(--rouge); color: #fff; border: 0; cursor: pointer;
  padding: 13px 32px; border-radius: 36px;
  font-family: 'Poppins', sans-serif; font-size: 12.5px; font-weight: 600; letter-spacing: .12em;
  transition: background .2s, transform .2s;
}
.gx3-ouvrir:hover { background: #b82006; transform: translateY(-2px); }
.gx3-compteur {
  position: absolute; left: 5vw; bottom: 26px; z-index: 20;
  font-family: 'Poppins', sans-serif; font-size: 11px; font-weight: 600;
  letter-spacing: .2em; color: var(--sourdine);
}
.gx3-mini {
  position: absolute; left: 50%; bottom: 0; transform: translateX(-50%);
  width: min(560px, 62vw); padding: 20px 18px 14px; z-index: 30;
  cursor: pointer; touch-action: none;
}
.gx3-mini-rang { display: flex; align-items: center; gap: 14px; }
.gx3-mini-bord { font-family: 'Poppins', sans-serif; font-size: 9.5px; font-weight: 700; letter-spacing: .2em; color: var(--sourdine); }
.gx3-barres { position: relative; flex: 1; height: 24px; display: flex; align-items: center; gap: 2px; }
.gx3-barre { flex: 1; background: rgba(0,0,0,.14); border-radius: 1px; transform-origin: center; transition: background .3s; }
.gx3-barre.jouee { background: rgba(0,0,0,.3); }
.gx3-barre.on { background: var(--vert); }
.gx3-curseur { position: absolute; top: -3px; bottom: -3px; width: 2px; background: var(--rouge); border-radius: 2px; }
.gx3-mini-nom {
  margin-top: 8px; text-align: center;
  font-family: 'Poppins', sans-serif; font-size: 10px; font-weight: 600;
  letter-spacing: .12em; text-transform: uppercase; color: var(--sourdine);
}
@media (max-width: 1024px) {
  /* En colonne le texte passe SOUS la photo, pas à côté : le voile latéral
     n'a plus de sens. Le bloc de texte porte lui-même son fond blanc — c'est
     le seul moyen d'être sûr qu'il reste lisible quelle que soit la hauteur
     de la carte, sans régler un dégradé au pixel près. */
  .gx3-carte { left: 50%; top: 34%; height: 38vh; max-width: 88vw; }
  .gx3-voile { display: none; }
  /* Blanc PLEIN, pas un dégradé : sur un fond déjà blanc il ne se voit pas,
     et il garantit que la photo ne passera jamais derrière le titre quelle
     que soit la longueur du nom. Un dégradé se réglait au pixel et ratait. */
  .gx3-texte {
    left: 0; right: 0; top: auto; bottom: 74px; transform: none; max-width: none;
    text-align: center; padding: 26px 6vw 0;
    background: var(--blanc);
  }
  .gx3-h1 { font-size: 7.4vw; }
  .gx3-gens { justify-content: center; }
  .gx3-compteur { left: 50%; transform: translateX(-50%); bottom: 72px; }
  .gx3-mini { display: none; }
}

/* ==========================================================================
   LA FICHE — partagée par les niveaux 1, 2 et 3
   Claire, comme le reste du site : un voile blanc, pas une boîte noire.
   ========================================================================== */
.gx-fiche {
  position: fixed; inset: 0; z-index: 400; display: none;
  background: rgba(255,255,255,.97); backdrop-filter: blur(6px);
  align-items: center; justify-content: center; padding: 30px;
}
.gx-fiche.ouverte { display: flex; }
.gx-fiche-boite { display: grid; grid-template-columns: 1fr 330px; gap: 44px; align-items: center; width: min(1200px, 100%); }
.gx-fiche-boite img.principale { max-height: 82vh; max-width: 100%; width: auto; margin-inline: auto; border-radius: 6px; display: block; box-shadow: 0 24px 70px rgba(0,0,0,.2); }
.gx-fiche-fermer {
  position: absolute; top: 22px; right: 22px;
  background: var(--blanc); border: 2px solid var(--rouge-charte); color: var(--rouge-charte);
  width: 40px; height: 40px; border-radius: 50%; cursor: pointer; font-size: 14px; font-weight: 700;
  transition: background .2s, color .2s;
}
.gx-fiche-fermer:hover { background: var(--rouge); color: #fff; }
.gx-fiche-num { font-family: 'Poppins', sans-serif; font-size: 11px; font-weight: 600; color: var(--sourdine); letter-spacing: .16em; }
.gx-fiche-nom {
  font-family: 'Poppins', sans-serif; font-weight: 700;
  font-size: clamp(1.4rem, 1.1rem + 1.4vw, 2rem); color: var(--gris-fonce);
  letter-spacing: -.03em; margin: 8px 0 20px; line-height: 1.15;
}
.gx-faits { list-style: none; }
.gx-faits li { display: grid; grid-template-columns: 92px 1fr; gap: 14px; padding: 10px 0; border-top: 1px solid var(--filet); font-size: 12.5px; }
.gx-faits .k { font-family: 'Poppins', sans-serif; font-size: 10px; font-weight: 600; letter-spacing: .1em; text-transform: uppercase; color: var(--sourdine); padding-top: 2px; }
.gx-faits .v { color: var(--gris-texte); }
/* Le crédit manquant : un cadratin sourd, jamais un nom inventé. */
.gx-faits .vide { color: #c9c9c9; }
.gx-fiche-gens { display: flex; gap: 18px; margin-top: 20px; }
.gx-fiche-gens img { height: 50px; width: auto; }
/* Le crédit vide n'est pas un cul-de-sac : on peut le réclamer. */
.gx-reclamer {
  display: inline-flex; align-items: center; gap: 8px; margin-top: 20px;
  border: 1px solid var(--filet); border-radius: 36px; padding: 10px 18px;
  font-family: 'Poppins', sans-serif; font-size: 12px; font-weight: 600; color: var(--gris-texte);
  transition: border-color .2s, color .2s;
}
.gx-reclamer:hover { border-color: var(--rouge); color: var(--rouge); }
@media (max-width: 900px) {
  .gx-fiche-boite { grid-template-columns: 1fr; gap: 20px; }
  .gx-fiche-boite img.principale { max-height: 40vh; }
  .gx2-plan { display: none; }
}
@media (max-width: 640px) { .gx-hero { padding-top: calc(var(--header-h) + 30px); } }

/* ==========================================================================
   NOTRE HISTOIRE — une histoire continue, dans la DA du site
   Pas de chapitres : un seul flux de lecture sur le fond de page (tokens —
   blanc en clair, charbon en sombre), ponctué de jalons discrets posés sur
   un filet. Le scroll révèle les paragraphes MOT À MOT (histoire.js pose
   .hi-anime et pilote .vu ; sans JS le texte est simplement posé). Les
   visuels sont des figures sur filets, jamais des pleins cadres sombres.
   Rail fixe = la hotbar du jeu : 9 cases, un moment par case. Préfixe hi-.
   ========================================================================== */

/* ---------- En-tête de page (même registre que dl-hero / mb-hero) ---------- */
.hi-entete { padding: calc(var(--header-h) + 80px) 0 10px; background: var(--blanc); }
.hi-sur {
  font-family: 'Poppins', sans-serif; font-size: 11px; font-weight: 600;
  letter-spacing: .16em; text-transform: uppercase; color: var(--sourdine);
  transform: translateY(20px); opacity: 0; animation: fadeInUp 1s ease forwards .1s;
}
.hi-h1 {
  margin-top: 14px;
  font-family: 'Poppins', sans-serif; font-weight: 500;
  font-size: clamp(2.5rem, 1.7rem + 3.4vw, 4.6rem);
  line-height: 1.03; letter-spacing: -.03em; color: var(--gris-fonce);
  transform: translateY(20px); opacity: 0; animation: fadeInUp 1s ease forwards .3s;
}
.hi-h1 b { color: var(--rouge); font-weight: 500; }
.hi-chapo {
  margin-top: 18px; color: var(--corps); line-height: 1.75; max-width: 520px;
  transform: translateY(20px); opacity: 0; animation: fadeInUp 1s ease forwards .5s;
}

/* ---------- Le flux de lecture ---------- */
.hi-flux { max-width: 720px; padding-bottom: 30px; }
.hi .container:last-of-type .hi-flux { padding-bottom: 110px; }
.hi-jalon {
  display: flex; align-items: center; gap: 16px;
  margin: clamp(64px, 9vh, 100px) 0 8px;
  font-family: 'Poppins', sans-serif; font-size: 11px; font-weight: 600;
  letter-spacing: .16em; text-transform: uppercase; color: var(--sourdine);
}
.hi-jalon i { font-style: normal; opacity: .75; letter-spacing: .1em; }
.hi-jalon::after { content: ''; flex: 1; height: 1px; background: var(--filet); }
.hi-flux > .hi-jalon:first-child { margin-top: clamp(28px, 5vh, 48px); }

.hi-p {
  margin: 26px 0; max-width: 640px;
  font-size: clamp(1.02rem, .95rem + .4vw, 1.25rem);
  line-height: 1.9; color: var(--gris-texte);
}
.hi-p strong { font-weight: 600; color: var(--gris-fonce); }
/* Révélation mot à mot : histoire.js enveloppe chaque mot (.hi-mot) et
   allume .vu selon la position du paragraphe dans l'écran — réversible,
   le texte se remplit et se vide avec le scroll. */
.hi-anime .hi-mot { opacity: .13; transition: opacity .3s ease; }
.hi-anime .hi-mot.vu { opacity: 1; }
.hi-signature {
  margin: 18px 0 0; font-family: 'Poppins', sans-serif; font-size: 13px;
  font-weight: 500; letter-spacing: .06em; color: var(--sourdine);
}
.hi-final {
  font-family: 'Poppins', sans-serif; font-weight: 500;
  font-size: clamp(1.25rem, 1.1rem + .9vw, 1.7rem); line-height: 1.55;
  letter-spacing: -.01em; color: var(--gris-fonce);
}
.hi-final b { color: var(--rouge); }

/* ---------- Apparition des figures (seulement si le JS est là) ---------- */
.hi-js .hi-app { opacity: 0; transform: translateY(20px); transition: opacity .8s ease, transform .8s ease; }
.hi-js .hi-app.vu { opacity: 1; transform: none; }

/* ---------- Les skins ----------
   Les PNG font 345 × 460 avec ~24 % de vide de chaque côté. Le conteneur
   .hi-skin fait la largeur du CORPS (345 × .52 ≈ 179) et l'image déborde en
   surlargeur centrée : l'espacement réel se règle au gap, au pixel près. */
.hi-skin { display: block; position: relative; aspect-ratio: 179 / 460; }
/* Hauteur du conteneur autoritaire + image ancrée en bas et centrée :
   quel que soit le ratio réel du PNG, les pieds et les étiquettes
   s'alignent sur la même ligne. */
.hi-skin img {
  position: absolute; bottom: 0; left: 50%; transform: translateX(-50%);
  height: 100%; width: auto; max-width: none;
  image-rendering: pixelated;
}
/* flex-start et pas flex-end : les skins font tous la même hauteur, donc
   aligner par le HAUT pose les pieds sur une même ligne — alors qu'aligner
   par le bas ferait remonter les figures à sous-étiquette (2 lignes). */
.hi-bande, .hi-chaine { display: flex; align-items: flex-start; margin: 44px 0; }
.hi-bande { gap: clamp(26px, 5vw, 56px); }
.hi-joueur { margin: 0; text-align: center; }
.hi-joueur .hi-skin { width: clamp(44px, 5.4vw, 64px); margin-inline: auto; }
.hi-joueur figcaption {
  margin-top: 12px; font-family: 'Poppins', sans-serif;
  font-size: 12.5px; font-weight: 600; color: var(--gris-fonce);
}
.hi-joueur figcaption span {
  display: block; margin-top: 3px; font-size: 11px; font-weight: 500;
  color: var(--sourdine);
}
/* La bande entre joueur par joueur */
.hi-js .hi-bande .hi-joueur,
.hi-js .hi-chaine .hi-joueur { opacity: 0; transform: translateY(14px); transition: opacity .6s ease, transform .6s ease; }
.hi-js .hi-bande.vu .hi-joueur,
.hi-js .hi-chaine.vu .hi-joueur { opacity: 1; transform: none; }
.hi-js .hi-bande.vu .hi-joueur:nth-child(2) { transition-delay: .12s; }
.hi-js .hi-bande.vu .hi-joueur:nth-child(3) { transition-delay: .24s; }
.hi-js .hi-bande.vu .hi-joueur:nth-child(4) { transition-delay: .36s; }
.hi-js .hi-chaine.vu .hi-joueur:nth-child(3) { transition-delay: .15s; }
.hi-js .hi-chaine.vu .hi-joueur:nth-child(5) { transition-delay: .3s; }

/* La chaîne des rencontres : l'un amène l'autre, filet + point rouge. */
.hi-chaine { gap: 0; }
.hi-fleche {
  flex: none; width: clamp(30px, 5vw, 70px); height: 1px;
  background: var(--filet); position: relative;
  /* Alignée sur le milieu du corps : la hauteur d'un skin vaut ~2,57 × sa
     largeur (460/179), le filet se pose donc à mi-hauteur. */
  align-self: flex-start; margin-top: calc(clamp(44px, 5.4vw, 64px) * 1.28);
}
.hi-fleche::after {
  content: ''; position: absolute; right: -2px; top: 50%; transform: translateY(-50%);
  width: 6px; height: 6px; border-radius: 50%; background: var(--rouge);
}

/* La crew au complet, sans étiquettes : les noms vivent sur la page Membres. */
.hi-foule { display: flex; flex-wrap: wrap; align-items: flex-end; gap: clamp(16px, 2.4vw, 30px); margin: 44px 0; }
.hi-foule .hi-skin { width: clamp(34px, 3.8vw, 48px); }
.hi-js .hi-foule .hi-skin { opacity: 0; transform: translateY(12px); transition: opacity .5s ease, transform .5s ease; }
.hi-js .hi-foule.vu .hi-skin { opacity: 1; transform: none; }

/* ---------- 2022 : le duo texte / tirage d'archive ---------- */
.hi-duo { display: grid; grid-template-columns: 1fr clamp(210px, 23vw, 280px); gap: clamp(28px, 4vw, 56px); align-items: start; }
.hi-tirage {
  margin: 26px 0 0; background: var(--blanc); border: 1px solid var(--filet);
  padding: 10px 10px 12px; border-radius: 4px;
  transform: rotate(1.6deg);
}
.hi-js .hi-tirage { transform: rotate(1.6deg) translateY(20px); }
.hi-js .hi-tirage.vu { transform: rotate(1.6deg); }
.hi-tirage img { border-radius: 2px; }
.hi-tirage figcaption { margin-top: 10px; font-size: 12px; line-height: 1.6; color: var(--corps); }
.hi-tirage figcaption b { font-family: 'Poppins', sans-serif; font-weight: 600; color: var(--gris-fonce); }

/* ---------- L'identité : logos + comparateur ---------- */
.hi-logos { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; margin: 40px 0; max-width: 640px; }
.hi-logo-vue { margin: 0; }
.hi-logo-vue > img {
  width: 100%; aspect-ratio: 16 / 10; object-fit: contain;
  border-radius: 12px; padding: clamp(18px, 2.6vw, 34px); box-sizing: border-box;
}
/* Le lettrage des débuts est blanc/rouge : il vit sur charbon, comme dans
   la charte. Le logo actuel vit sur la page, cerné d'un simple filet. */
.hi-logo-vue:first-child > img { background: #292929; }
.hi-logo-vue:last-child > img { background: var(--blanc); border: 1px solid var(--filet); }
.hi-logo-vue figcaption { display: flex; align-items: baseline; gap: 10px; margin-top: 12px; }
.hi-logo-vue figcaption b { font-family: 'Poppins', sans-serif; font-size: 13px; font-weight: 600; color: var(--gris-fonce); }
.hi-logo-vue figcaption span { font-size: 12px; color: var(--corps); }
.hi-compare { max-width: 640px; margin: 40px 0; }

/* ---------- La frise des archives (pleine largeur, épinglée) ---------- */
.hi-frise { height: 300vh; position: relative; }
.hi-frise-colle {
  position: sticky; top: 0; height: 100vh; overflow: hidden;
  display: flex; flex-direction: column; justify-content: center;
  background: var(--blanc);
}
/* La légende s'aligne sur le bord gauche du .container (min(1200px, 92%)) */
.hi-frise-legende {
  position: absolute; top: max(96px, 12vh); left: max(4vw, calc(50% - 600px));
  z-index: 3; max-width: 540px;
}
.hi-frise-legende p {
  margin: 4px 0; font-size: clamp(1rem, 1.25vw, 1.2rem); line-height: 1.7;
  color: var(--gris-fonce); opacity: .16; transition: opacity .5s ease;
}
.hi-frise-legende p.vu { opacity: 1; }
.hi-piste {
  display: flex; align-items: center; gap: clamp(18px, 2.6vw, 40px);
  width: max-content; padding-inline: 8vw; will-change: transform;
}
.hi-photo { flex: none; width: clamp(280px, 30vw, 480px); margin: 0; }
.hi-photo:nth-child(odd) { transform: translateY(-2.5vh); }
.hi-photo:nth-child(even) { transform: translateY(5vh); }
.hi-photo img { width: 100%; aspect-ratio: 16 / 9; object-fit: cover; border-radius: 10px; }
.hi-photo figcaption { display: flex; align-items: baseline; gap: 10px; margin-top: 10px; }
.hi-photo figcaption b { font-family: 'Poppins', sans-serif; font-size: 11px; font-weight: 600; color: var(--rouge); letter-spacing: .04em; }
.hi-photo figcaption span { font-family: 'Poppins', sans-serif; font-size: 12.5px; font-weight: 500; color: var(--sourdine); }
.hi-frise-note {
  position: absolute; bottom: 22px; left: 0; right: 0; text-align: center;
  font-family: 'Poppins', sans-serif; font-size: 10px; font-weight: 600;
  letter-spacing: .16em; text-transform: uppercase; color: var(--sourdine);
}

/* ---------- Les chiffres (registre .mb-meta / .dl-h-meta) ---------- */
.hi-chiffres {
  display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px;
  max-width: 640px; margin: 44px 0; border-top: 1px solid var(--filet);
}
.hi-chiffres > div { padding-top: 20px; }
.hi-chiffres b {
  display: block; font-family: 'Poppins', sans-serif; font-weight: 600;
  font-size: clamp(1.5rem, 2vw, 2rem); color: var(--gris-fonce); letter-spacing: -.01em;
}
.hi-chiffres > div > span {
  display: block; margin-top: 4px; font-size: 11px; color: var(--sourdine);
  letter-spacing: .12em; text-transform: uppercase; font-family: 'Poppins', sans-serif;
}

/* ---------- La suite ---------- */
.hi-suite { display: flex; align-items: center; gap: 26px; flex-wrap: wrap; margin-top: 44px; }
.hi-suite .cta-button { animation: none; opacity: 1; transform: none; }
.hi-suite-lien {
  font-family: 'Poppins', sans-serif; font-size: 14px; font-weight: 600;
  color: var(--gris-fonce); box-shadow: inset 0 -1px 0 var(--rouge);
  padding-bottom: 3px; transition: color .2s ease;
}
.hi-suite-lien:hover { color: var(--rouge); }

/* ---------- Le rail-hotbar : 9 cases, un moment par case ---------- */
.hi-rail {
  position: fixed; right: 20px; top: 50%; transform: translateY(-50%);
  z-index: 150; display: flex; flex-direction: column; gap: 8px;
}
.hi-rail a {
  position: relative; width: 13px; height: 13px;
  border: 1px solid var(--sourdine); border-radius: 3px;
  opacity: .45; transition: opacity .25s ease, border-color .25s ease, background .25s ease;
}
.hi-rail a.passe { background: var(--sourdine); opacity: .3; }
.hi-rail a.actif { opacity: 1; border: 2px solid var(--rouge); background: transparent; }
.hi-rail a span {
  position: absolute; right: calc(100% + 12px); top: 50%; transform: translateY(-50%);
  white-space: nowrap; background: var(--gris-fonce); color: var(--blanc);
  font-family: 'Poppins', sans-serif; font-size: 12px; font-weight: 500;
  padding: 6px 12px; border-radius: 8px;
  opacity: 0; pointer-events: none; transition: opacity .2s ease;
}
.hi-rail a:hover span, .hi-rail a:focus-visible span { opacity: 1; }

/* ---------- Responsive ---------- */
@media (max-width: 1280px) {
  .hi-rail { display: none; }
}
@media (max-width: 900px) {
  .hi-duo { grid-template-columns: 1fr; }
  .hi-tirage { max-width: 300px; }
  .hi-bande { flex-wrap: wrap; gap: 30px 34px; }
  .hi-logos { grid-template-columns: 1fr; }
  /* La frise n'est plus épinglée : une bande qu'on fait défiler au doigt. */
  .hi-frise { height: auto; }
  .hi-frise-colle { position: static; height: auto; overflow: visible; padding: 26px 0 8px; }
  .hi-frise-legende { position: static; max-width: none; width: min(1200px, 92%); margin: 0 auto 22px; }
  .hi-frise-legende p { opacity: 1; }
  .hi-piste {
    width: auto; overflow-x: auto; padding: 8px 4vw 16px;
    transform: none !important; scroll-snap-type: x mandatory;
    -webkit-overflow-scrolling: touch;
  }
  .hi-photo { width: 76vw; scroll-snap-align: center; }
  .hi-photo:nth-child(odd), .hi-photo:nth-child(even) { transform: none; }
  .hi-frise-note { position: static; margin: 12px 0 0; }
}

/* ---------- Mouvement réduit : tout est posé, rien ne bouge ---------- */
@media (prefers-reduced-motion: reduce) {
  .hi-sur, .hi-h1, .hi-chapo { animation: none; opacity: 1; transform: none; }
  .hi-anime .hi-mot { opacity: 1; transition: none; }
  .hi-js .hi-app,
  .hi-js .hi-bande .hi-joueur, .hi-js .hi-chaine .hi-joueur,
  .hi-js .hi-foule .hi-skin { opacity: 1; transform: none; transition: none; }
  .hi-js .hi-tirage, .hi-js .hi-tirage.vu { transform: rotate(1.6deg); }
  .hi-frise-legende p { opacity: 1; transition: none; }
  .hi-frise { height: auto; }
  .hi-frise-colle { position: static; height: auto; overflow: visible; padding: 26px 0 8px; }
  .hi-frise-legende { position: static; max-width: none; width: min(1200px, 92%); margin: 0 auto 22px; }
  .hi-piste { width: auto; overflow-x: auto; transform: none !important; padding: 8px 4vw 16px; }
  .hi-photo:nth-child(odd), .hi-photo:nth-child(even) { transform: none; }
  .hi-frise-note { position: static; margin: 12px 0 0; }
}

/* ==========================================================================
   NEWS — « Le fil d'annonces » (news.html + accueil)
   La page reprend le registre dl- (hero, corps, aide) ; ici ne vivent que le
   fil lui-même et les 3 lignes de l'accueil. Tout passe par les tokens → le
   mode sombre est gratuit. Les visuels sont les annonces Discord réelles
   (assets/img/news/) ; une entrée sans date affiche « Sans date » en
   sourdine — jamais une date inventée (même règle que « Sans titre » en
   galerie). Les données vivent dans le tableau NEWS de news.js.
   ========================================================================== */

.nw-fil { max-width: 1000px; }
.nw-item {
  display: grid; grid-template-columns: 190px 1fr; gap: 40px;
  padding: 44px 0; border-top: 1px solid var(--filet);
  scroll-margin-top: calc(var(--header-h) + 20px);
}
.nw-fil .nw-item:last-child { border-bottom: 1px solid var(--filet); }
.nw-date {
  font-family: 'Poppins', sans-serif; font-size: 13px; font-weight: 600;
  color: var(--gris-fonce);
}
.nw-sansdate { color: var(--sourdine); font-style: italic; font-weight: 400; }
.nw-tag {
  display: inline-flex; margin-top: 12px;
  border: 1px solid var(--filet); border-radius: 36px; padding: 4px 12px;
  font-family: 'Poppins', sans-serif; font-size: 10.5px; font-weight: 600;
  letter-spacing: .08em; text-transform: uppercase; color: var(--sourdine);
}
.nw-titre {
  font-family: 'Poppins', sans-serif; font-weight: 600; font-size: 1.35rem;
  color: var(--gris-fonce); letter-spacing: -.01em; line-height: 1.25;
}
.nw-texte { margin-top: 10px; color: var(--gris-texte); line-height: 1.75; max-width: 560px; }
.nw-vis {
  margin-top: 22px; width: min(100%, 560px);
  border: 1px solid var(--filet); border-radius: 14px;
}
.nw-corps .dl-fl { margin-top: 18px; }
/* La note qui ouvre la fin du fil : les annonces d'avant le site, sans date */
.nw-note {
  margin: 44px 0 0; padding-left: 230px;
  color: var(--sourdine); font-size: 13px; font-style: italic;
}

/* L'accueil : les 3 dernières, en lignes — le langage de la liste dl */
.nw-accueil { margin-top: 46px; }
.nw-ligne {
  display: grid; grid-template-columns: 150px 100px 1fr auto;
  align-items: baseline; gap: 20px;
  padding: 24px 0; border-top: 1px solid var(--filet);
  transition: opacity .3s;
}
.nw-accueil .nw-ligne:last-child { border-bottom: 1px solid var(--filet); }
.nw-accueil:hover .nw-ligne:not(:hover) { opacity: .38; }
.nw-l-date { font-family: 'Poppins', sans-serif; font-size: 12.5px; font-weight: 600; color: var(--gris-fonce); }
.nw-l-tag {
  font-family: 'Poppins', sans-serif; font-size: 10.5px; font-weight: 600;
  letter-spacing: .08em; text-transform: uppercase; color: var(--sourdine);
}
.nw-l-titre {
  font-family: 'Poppins', sans-serif; font-weight: 600; font-size: 1.15rem;
  color: var(--gris-fonce); letter-spacing: -.01em;
  transition: transform .4s cubic-bezier(.2, .8, .2, 1), color .3s;
}
.nw-ligne:hover .nw-l-titre { transform: translateX(12px); color: var(--rouge); }
.nw-l-fl { color: var(--gris-fonce); font-family: 'Poppins', sans-serif; font-weight: 600; }

@media (max-width: 1024px) {
  .nw-item { grid-template-columns: 1fr; gap: 14px; padding: 34px 0; }
  .nw-marge { display: flex; align-items: center; gap: 14px; }
  .nw-tag { margin-top: 0; }
  .nw-note { padding-left: 0; }
  .nw-ligne { grid-template-columns: 110px 1fr auto; }
  .nw-l-tag { display: none; }
}

/* ==========================================================================
   RESOURCE PACK  (pack.html)
   Le catalogue du pack. Même parti pris que le reste du site : des filets
   plutôt que des cartes ombrées, le rouge en accent rare. Ici la matière est
   le sujet — les vignettes occupent toute la largeur de leur carte et le
   texte se fait discret dessous. Tout est écrit en var(--…) : le mode sombre
   suit sans une ligne de plus.
   ========================================================================== */

/* ---------- Hero ---------- */
.pk-h-grille { display: grid; grid-template-columns: 1.05fr .95fr; gap: 60px; align-items: center; }
.pk-h-grille .brand-tag { display: inline-flex; margin-bottom: 24px; }
/* Neuf vraies textures du pack, une par catégorie : l'aperçu montre
   l'étendue du pack au lieu d'illustrer avec une image de communication. */
.pk-h-mur {
  display: grid; grid-template-columns: repeat(3, 1fr); gap: 6px;
  border-radius: 4px; overflow: hidden;
  transform: translateY(20px); opacity: 0;
  animation: fadeInUp 1s ease forwards .7s;
}
.pk-h-tuile {
  display: block; aspect-ratio: 1; background-size: cover; background-position: center;
  transition: transform .5s cubic-bezier(.2, .8, .2, 1);
}
.pk-h-mur:hover .pk-h-tuile { transform: scale(.96); }
.pk-h-tuile:hover { transform: scale(1.06); }

/* ---------- La barre de recherche, toujours à portée ---------- */
.pk-barre {
  --pk-collage: calc(var(--header-h) - 20px);
  position: sticky; top: var(--pk-collage); z-index: 20;
  display: flex; align-items: center; gap: 20px; flex-wrap: wrap;
  /* La marge haute doit rester >= --pk-collage : c'est elle qui loge le
     cache ci-dessous quand la barre n'est pas encore collée. */
  margin: 78px 0 34px; padding: 14px 0;
  background: var(--blanc);
  border-bottom: 1px solid var(--filet);
}
/* Le header est une pilule FLOTTANTE : au-dessus de la barre collée il
   reste une bande de la hauteur de --pk-collage où rien n'arrête les
   cartes, et on les voyait défiler de part et d'autre de la pilule. Ce
   cache pleine largeur bouche la bande. Il vit dans la marge haute de la
   barre tant qu'elle n'est pas collée, donc sur du blanc : invisible. */
.pk-barre::before {
  content: ''; position: absolute; z-index: -1;
  left: 50%; margin-left: -50vw; width: 100vw;
  bottom: 100%; height: var(--pk-collage);
  background: var(--blanc);
}
.pk-champ {
  position: relative; display: flex; align-items: center; gap: 12px;
  flex: 1 1 380px; min-width: 260px;
  border: 1px solid var(--filet); border-radius: 36px; padding: 0 16px;
  transition: border-color .2s;
}
.pk-champ:focus-within { border-color: var(--gris-fonce); }
.pk-champ svg { width: 17px; height: 17px; color: var(--sourdine); flex: none; }
.pk-champ input {
  flex: 1; border: 0; background: none; outline: none; padding: 13px 0;
  font-family: 'Open Sans', sans-serif; font-size: 14px; color: var(--gris-texte);
}
.pk-champ input::placeholder { color: var(--sourdine); }
.pk-champ input::-webkit-search-cancel-button { display: none; }
.pk-vider {
  border: 0; background: none; cursor: pointer; padding: 0 2px;
  font-size: 20px; line-height: 1; color: var(--sourdine);
}
.pk-vider:hover { color: var(--rouge); }
.pk-compte {
  font-family: 'Poppins', sans-serif; font-size: 12px; font-weight: 600;
  letter-spacing: .1em; text-transform: uppercase; color: var(--sourdine);
}

/* ---------- Deux colonnes : filtres à gauche, blocs à droite ---------- */
.pk-grille { display: grid; grid-template-columns: 208px 1fr; gap: 48px; align-items: start; }
.pk-cote { position: sticky; top: calc(var(--header-h) + 62px); }
.pk-cote-bloc + .pk-cote-bloc { margin-top: 32px; }
/* Le <details> ne sert qu'au repli mobile : sur desktop il est toujours
   ouvert et son résumé n'a pas lieu d'être. */
.pk-cote-resume { display: none; }
.pk-cote::-webkit-details-marker { display: none; }
.pk-cote-titre {
  font-family: 'Poppins', sans-serif; font-size: 11px; font-weight: 600;
  letter-spacing: .16em; text-transform: uppercase; color: var(--sourdine);
  margin-bottom: 14px;
}
.pk-cats { list-style: none; }
.pk-cats button {
  display: flex; justify-content: space-between; align-items: baseline; gap: 10px;
  width: 100%; border: 0; background: none; cursor: pointer;
  padding: 7px 0; text-align: left;
  font-family: 'Poppins', sans-serif; font-size: 13.5px; color: var(--gris-texte);
  transition: color .2s, transform .3s cubic-bezier(.2, .8, .2, 1);
}
.pk-cats button span { font-size: 11px; color: var(--sourdine); font-variant-numeric: tabular-nums; }
.pk-cats button:hover { color: var(--rouge); transform: translateX(4px); }
.pk-cats button[aria-pressed="true"] { color: var(--rouge); font-weight: 600; }
.pk-cats button[aria-pressed="true"] span { color: var(--rouge); }

.pk-couleurs { display: flex; flex-wrap: wrap; gap: 6px; }
.pk-co {
  display: inline-flex; align-items: center; gap: 7px;
  border: 1px solid var(--filet); border-radius: 36px; background: none;
  padding: 5px 12px 5px 6px; cursor: pointer;
  font-family: 'Poppins', sans-serif; font-size: 12px; color: var(--gris-texte);
  transition: border-color .2s, color .2s;
}
.pk-co i { width: 13px; height: 13px; border-radius: 50%; flex: none; box-shadow: inset 0 0 0 1px rgba(0, 0, 0, .12); }
.pk-co:hover { border-color: var(--gris-fonce); }
.pk-co[aria-pressed="true"] { border-color: var(--rouge); color: var(--rouge); }
.pk-co-toutes { padding: 5px 14px; }

.pk-raz {
  margin-top: 26px; border: 1px solid var(--filet); border-radius: 36px;
  background: none; cursor: pointer; padding: 9px 18px;
  font-family: 'Poppins', sans-serif; font-size: 12.5px; font-weight: 600;
  color: var(--gris-texte); transition: border-color .2s, color .2s;
}
.pk-raz:hover { border-color: var(--rouge); color: var(--rouge); }

/* ---------- Les cartes ---------- */
.pk-blocs { display: grid; grid-template-columns: repeat(auto-fill, minmax(190px, 1fr)); gap: 26px 20px; }
.pk-c {
  display: block; border: 0; background: none; padding: 0; cursor: pointer;
  text-align: left; font: inherit; color: inherit;
}
.pk-c.pk-cache { display: none; }
.pk-c-vis {
  position: relative; display: block; overflow: hidden; border-radius: 3px;
  background: var(--gris-clair);
}
.pk-c-vis img {
  width: 100%; aspect-ratio: 1; object-fit: cover;
  transition: transform .55s cubic-bezier(.2, .8, .2, 1);
}
.pk-c:hover .pk-c-vis img { transform: scale(1.06); }
/* Le filet rouge n'apparaît qu'au survol : au repos, rien ne doit distraire
   de la matière elle-même. */
.pk-c-vis::after {
  content: ''; position: absolute; inset: 0; border: 2px solid var(--rouge);
  border-radius: 3px; opacity: 0; transition: opacity .25s;
}
.pk-c:hover .pk-c-vis::after,
.pk-c:focus-visible .pk-c-vis::after { opacity: 1; }
.pk-c-tag {
  position: absolute; left: 8px; top: 8px;
  background: var(--rouge); color: #fff; border-radius: 36px;
  padding: 3px 10px; font-family: 'Poppins', sans-serif;
  font-size: 10px; font-weight: 600; letter-spacing: .04em;
}
.pk-c-tag-doux { background: rgba(0, 0, 0, .55); }
.pk-c-nom {
  display: block; margin-top: 12px;
  font-family: 'Poppins', sans-serif; font-size: 14px; font-weight: 500;
  color: var(--gris-fonce); line-height: 1.35;
  transition: color .2s;
}
.pk-c:hover .pk-c-nom { color: var(--rouge); }
.pk-c-mc {
  display: block; margin-top: 3px; font-size: 11.5px; color: var(--sourdine);
  font-family: 'Poppins', sans-serif;
  /* anywhere plutôt que break-all : le navigateur coupe d'abord aux
     underscores de l'identifiant, pas au milieu d'un mot. */
  overflow-wrap: anywhere;
}

.pk-vide { padding: 80px 0; text-align: center; }
.pk-vide-titre {
  font-family: 'Poppins', sans-serif; font-weight: 500; font-size: 1.3rem;
  color: var(--gris-fonce);
}
.pk-vide-note { margin: 10px auto 0; max-width: 460px; color: var(--sourdine); font-size: 13.5px; line-height: 1.75; }
.pk-vide-note a { color: var(--rouge); }
.pk-vide-note a:hover { text-decoration: underline; }

/* ---------- Sections suivantes ---------- */
.pk-section { padding: 96px 0; background: var(--blanc); scroll-margin-top: var(--header-h); }
.pk-section-grise { background: var(--gris-clair); }
.pk-tete-note { max-width: 380px; color: var(--sourdine); font-size: 13.5px; line-height: 1.75; }

/* ---------- Palettes ---------- */
.pk-palettes { display: grid; grid-template-columns: repeat(auto-fit, minmax(330px, 1fr)); gap: 44px 36px; margin-top: 48px; }
.pk-p-bande { display: grid; grid-template-columns: repeat(6, 1fr); border-radius: 3px; overflow: hidden; }
.pk-p-bloc {
  position: relative; border: 0; padding: 0; cursor: pointer; background: none;
  display: block; overflow: hidden;
}
.pk-p-bloc img { width: 100%; aspect-ratio: 1; object-fit: cover; transition: transform .5s cubic-bezier(.2, .8, .2, 1); }
/* Le nom ne sort qu'au survol : la palette doit d'abord se lire comme une
   bande de couleurs, pas comme une liste. */
.pk-p-bloc span {
  position: absolute; inset: auto 0 0 0; padding: 6px 4px;
  background: rgba(0, 0, 0, .72); color: #fff;
  font-family: 'Poppins', sans-serif; font-size: 9.5px; line-height: 1.25;
  opacity: 0; transform: translateY(100%); transition: opacity .25s, transform .25s;
}
.pk-p-bloc:hover img { transform: scale(1.08); }
.pk-p-bloc:hover span, .pk-p-bloc:focus-visible span { opacity: 1; transform: none; }
.pk-p-texte h3 {
  margin-top: 18px; font-family: 'Poppins', sans-serif; font-weight: 500;
  font-size: 1.15rem; color: var(--gris-fonce);
}
.pk-p-texte p { margin-top: 8px; color: var(--sourdine); font-size: 13.5px; line-height: 1.8; }

/* ---------- Conseils ---------- */
.pk-tips {
  list-style: none; counter-reset: none; margin-top: 48px;
  display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 0 48px;
}
.pk-tips li { padding: 30px 0; border-top: 1px solid var(--filet); }
.pk-tip-n {
  font-family: 'Poppins', sans-serif; font-size: 11px; font-weight: 600;
  letter-spacing: .14em; color: var(--rouge);
}
.pk-tips h3 {
  margin: 10px 0 8px; font-family: 'Poppins', sans-serif; font-weight: 500;
  font-size: 1.05rem; color: var(--gris-fonce); line-height: 1.35;
}
.pk-tips p { color: var(--sourdine); font-size: 13.5px; line-height: 1.85; }
.pk-tips em { font-style: normal; color: var(--gris-texte); }

/* ---------- Mobilier 3D ---------- */
.pk-mobilier { display: grid; grid-template-columns: 1fr 1fr; gap: 56px; margin-top: 48px; align-items: start; }
.pk-mob-texte p { color: var(--sourdine); font-size: 14px; line-height: 1.85; }
.pk-mob-texte p + p { margin-top: 14px; }
.pk-mob-texte b { color: var(--gris-fonce); }
/* Le renvoi vers le menu en jeu : c'est la vraie référence, cette page n'en
   est qu'un reflet. Il mérite donc d'être traité comme une adresse. */
.pk-mob-warp {
  margin-top: 26px !important; padding: 24px 26px;
  border: 1px solid var(--filet); border-radius: 4px;
}
.pk-mob-warp span {
  display: block; font-family: 'Poppins', sans-serif; font-size: 11px;
  font-weight: 600; letter-spacing: .16em; text-transform: uppercase;
  color: var(--sourdine); margin-bottom: 8px;
}
.pk-mob-warp b {
  display: block; margin-bottom: 10px; color: var(--rouge);
  font-family: 'Poppins', sans-serif; font-size: 1.35rem; font-weight: 600;
}
.pk-mob-ligne { display: grid; grid-template-columns: 130px 1fr 46px; align-items: center; gap: 14px; padding: 9px 0; }
.pk-mob-nom { font-family: 'Poppins', sans-serif; font-size: 13px; color: var(--gris-texte); }
.pk-mob-jauge { height: 3px; background: var(--filet); border-radius: 3px; overflow: hidden; }
.pk-mob-jauge i { display: block; height: 100%; background: var(--rouge); border-radius: 3px; }
.pk-mob-nb { font-family: 'Poppins', sans-serif; font-size: 12px; color: var(--sourdine); text-align: right; font-variant-numeric: tabular-nums; }

/* ---------- Le basculement Textures / Modèles 3D ---------- */
/* Deux catalogues sous un même titre. La pilule reprend le langage de
   .dl-vues (bascule liste/grille) : même rail, même actif rouge. */
.pk-onglets { display: flex; gap: 3px; padding: 4px; border: 1px solid var(--filet); border-radius: 36px; }
.pk-onglets button {
  display: inline-flex; align-items: center; gap: 8px;
  border: 0; border-radius: 36px; background: none; cursor: pointer;
  padding: 9px 20px; white-space: nowrap;
  font-family: 'Poppins', sans-serif; font-size: 13.5px; font-weight: 600;
  color: var(--gris-texte);
  transition: background .25s, color .25s;
}
.pk-onglets button span {
  font-size: 11px; font-weight: 500; color: var(--sourdine);
  font-variant-numeric: tabular-nums; transition: color .25s;
}
.pk-onglets button:hover { color: var(--rouge); }
.pk-onglets button[aria-selected="true"] { background: var(--rouge); color: #fff; }
.pk-onglets button[aria-selected="true"] span { color: rgba(255, 255, 255, .75); }

/* ---------- La galerie des modèles 3D ---------- */
.pk-modeles { display: grid; grid-template-columns: repeat(auto-fill, minmax(158px, 1fr)); gap: 22px 16px; }
.pk-m {
  display: block; border: 0; background: none; padding: 0; cursor: pointer;
  text-align: left; font: inherit; color: inherit;
}
.pk-m.pk-cache { display: none; }
/* Les rendus sont détourés : sans fond, un objet noir disparaîtrait sur la
   page en sombre et un objet blanc en clair. La tuile porte donc le fond. */
.pk-m-vis {
  position: relative; display: block; overflow: hidden;
  border-radius: 4px; background: var(--gris-clair);
  transition: background .25s;
}
.pk-m-vis img {
  width: 100%; aspect-ratio: 1; object-fit: contain; padding: 8%;
  transition: transform .5s cubic-bezier(.2, .8, .2, 1);
}
.pk-m:hover .pk-m-vis img { transform: scale(1.09) translateY(-2px); }
.pk-m:hover .pk-m-vis { background: var(--d-hover, #fafafa); }
.pk-m-vis::after {
  content: ''; position: absolute; inset: 0; border: 2px solid var(--rouge);
  border-radius: 4px; opacity: 0; transition: opacity .25s;
}
.pk-m:hover .pk-m-vis::after,
.pk-m:focus-visible .pk-m-vis::after { opacity: 1; }
.pk-m-nom {
  display: block; margin-top: 10px;
  font-family: 'Poppins', sans-serif; font-size: 13px; font-weight: 500;
  color: var(--gris-fonce); line-height: 1.35; transition: color .2s;
}
.pk-m:hover .pk-m-nom { color: var(--rouge); }
.pk-m-cat { display: block; margin-top: 2px; font-size: 11px; color: var(--sourdine); font-family: 'Poppins', sans-serif; }

/* Les rayons : même liste que les catégories, en plus discret */
.pk-sous button { font-size: 12.5px; }
.pk-note3d {
  margin-top: 40px; padding-top: 22px; border-top: 1px solid var(--filet);
  color: var(--sourdine); font-size: 12.5px; line-height: 1.8; max-width: 560px;
}
.pk-note3d b { color: var(--rouge); font-family: 'Poppins', sans-serif; }

/* ---------- La fiche d'un bloc ---------- */
.pk-fiche {
  position: fixed; inset: 0; z-index: 200; display: grid; place-items: center;
  padding: 30px; background: rgba(0, 0, 0, .72);
  opacity: 0; transition: opacity .2s ease;
  overflow-y: auto;
}
/* `display:grid` écrase le display:none que le navigateur applique à
   [hidden] : sans cette ligne, la fiche fermée reste un calque plein écran
   qui avale tous les clics de la page. */
.pk-fiche[hidden] { display: none; }
.pk-fiche.ouverte { opacity: 1; }
.pk-f-boite {
  position: relative; width: min(880px, 100%); max-height: 90vh; overflow-y: auto;
  background: var(--blanc); border-radius: 5px; padding: 40px;
  transform: translateY(14px); transition: transform .25s cubic-bezier(.2, .8, .2, 1);
}
.pk-fiche.ouverte .pk-f-boite { transform: none; }
.pk-f-fermer {
  position: absolute; right: 16px; top: 12px; z-index: 2;
  border: 0; background: none; cursor: pointer;
  font-size: 28px; line-height: 1; color: var(--sourdine);
}
.pk-f-fermer:hover { color: var(--rouge); }
.pk-f-haut { display: grid; grid-template-columns: 260px 1fr; gap: 34px; align-items: start; }
.pk-f-vis { border-radius: 4px; overflow: hidden; background: var(--gris-clair); }
.pk-f-vis img { width: 100%; aspect-ratio: 1; object-fit: cover; }
/* Un modèle 3D est détouré : il se pose DANS le cadre, il ne le remplit pas. */
.pk-fiche-3d .pk-f-vis img,
.pk-fiche-3d .pk-f-a img { object-fit: contain; padding: 7%; }
.pk-f-cat {
  font-family: 'Poppins', sans-serif; font-size: 11px; font-weight: 600;
  letter-spacing: .16em; text-transform: uppercase; color: var(--rouge);
}
.pk-f-nom {
  margin: 8px 0 10px; font-family: 'Poppins', sans-serif; font-weight: 500;
  font-size: clamp(1.5rem, 1.2rem + 1vw, 2rem); color: var(--gris-fonce);
  letter-spacing: -.02em; line-height: 1.15;
}
.pk-f-sous { color: var(--sourdine); font-size: 13.5px; line-height: 1.8; }
.pk-f-sous b { color: var(--gris-texte); font-weight: 600; }
.pk-f-sous a { color: var(--rouge); }
.pk-f-sous a:hover { text-decoration: underline; }
/* L'identifiant technique est ce qu'on vient chercher : il se copie d'un clic. */
.pk-f-copie {
  display: inline-flex; align-items: center; gap: 14px; margin-top: 18px;
  border: 1px solid var(--filet); border-radius: 36px; background: none;
  padding: 9px 9px 9px 18px; cursor: pointer;
  transition: border-color .2s;
}
.pk-f-copie:hover { border-color: var(--gris-fonce); }
.pk-f-copie code {
  font-family: 'Poppins', sans-serif; font-size: 13px; color: var(--gris-fonce);
  word-break: break-all; text-align: left;
}
.pk-f-copie-mot {
  flex: none; background: var(--gris-clair); border-radius: 36px; padding: 5px 14px;
  font-family: 'Poppins', sans-serif; font-size: 11.5px; font-weight: 600;
  color: var(--gris-texte); transition: background .2s, color .2s;
}
.pk-f-copie-ok { border-color: var(--vert); }
.pk-f-copie-ok .pk-f-copie-mot { background: var(--vert); color: #1d2b0a; }
.pk-f-faits { list-style: none; margin-top: 24px; }
.pk-f-faits li {
  display: grid; grid-template-columns: 168px 1fr; gap: 16px;
  padding: 11px 0; border-top: 1px solid var(--filet);
  font-size: 13px; line-height: 1.6;
}
.pk-f-faits .k { color: var(--sourdine); }
.pk-f-faits .v { color: var(--gris-texte); display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.pk-f-faits code { font-family: 'Poppins', sans-serif; font-size: 12px; color: var(--sourdine); }
.pk-f-pastille { width: 14px; height: 14px; border-radius: 50%; box-shadow: inset 0 0 0 1px rgba(0, 0, 0, .15); }
.pk-f-avec { margin-top: 36px; padding-top: 30px; border-top: 1px solid var(--filet); }
.pk-f-avec-liste { display: grid; grid-template-columns: repeat(6, 1fr); gap: 12px; }
.pk-f-a { border: 0; background: none; padding: 0; cursor: pointer; text-align: left; }
.pk-f-a img { width: 100%; aspect-ratio: 1; object-fit: cover; border-radius: 3px; transition: transform .4s cubic-bezier(.2, .8, .2, 1); }
.pk-f-a:hover img { transform: scale(1.07); }
.pk-f-a-nom {
  display: block; margin-top: 7px; font-family: 'Poppins', sans-serif;
  font-size: 11.5px; line-height: 1.3; color: var(--gris-fonce);
}
.pk-f-a:hover .pk-f-a-nom { color: var(--rouge); }
.pk-f-a-cat { display: block; margin-top: 2px; font-size: 10.5px; color: var(--sourdine); }

/* ---------- Responsive ---------- */
@media (max-width: 1024px) {
  .pk-h-grille { grid-template-columns: 1fr; gap: 44px; }
  .pk-h-mur { max-width: 420px; }
  .pk-grille { grid-template-columns: 1fr; gap: 30px; }
  /* Sur mobile la colonne de filtres passe au-dessus : elle ne peut plus
     rester collée, sinon elle mangerait la moitié de l'écran. */
  .pk-cote { position: static; }
  .pk-cote-bloc + .pk-cote-bloc { margin-top: 24px; }
  .pk-cote-resume {
    display: flex; align-items: center; justify-content: space-between;
    gap: 10px; cursor: pointer; list-style: none;
    border: 1px solid var(--filet); border-radius: 36px; padding: 11px 20px;
    font-family: 'Poppins', sans-serif; font-size: 13.5px; font-weight: 600;
    color: var(--gris-texte);
  }
  .pk-cote-resume::-webkit-details-marker { display: none; }
  .pk-cote-resume svg { width: 16px; height: 16px; transition: transform .25s; }
  .pk-cote[open] .pk-cote-resume { margin-bottom: 24px; border-color: var(--gris-fonce); }
  .pk-cote[open] .pk-cote-resume svg { transform: rotate(180deg); }
  .pk-cats { display: flex; flex-wrap: wrap; gap: 6px; }
  .pk-cats button {
    width: auto; border: 1px solid var(--filet); border-radius: 36px;
    padding: 7px 15px; font-size: 12.5px;
  }
  .pk-cats button:hover { transform: none; }
  .pk-cats button[aria-pressed="true"] { border-color: var(--rouge); }
  .pk-mobilier { grid-template-columns: 1fr; gap: 36px; }
  .pk-f-avec-liste { grid-template-columns: repeat(3, 1fr); }
}
@media (max-width: 640px) {
  /* On règle --pk-collage et pas `top` : le cache pleine largeur se
     redimensionne avec, et la marge haute reste >= à lui. */
  .pk-barre { --pk-collage: calc(var(--header-h) - 26px); margin: 72px 0 26px; gap: 12px; }
  .pk-blocs { grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: 22px 14px; }
  .pk-modeles { grid-template-columns: repeat(auto-fill, minmax(120px, 1fr)); gap: 18px 12px; }
  .pk-onglets { width: 100%; }
  .pk-onglets button { flex: 1; justify-content: center; padding: 10px 12px; font-size: 13px; }
  .pk-section { padding: 70px 0; }
  .pk-f-boite { padding: 30px 22px; max-height: 94vh; }
  .pk-f-haut { grid-template-columns: 1fr; gap: 22px; }
  .pk-f-vis { max-width: 220px; }
  .pk-f-faits li { grid-template-columns: 1fr; gap: 2px; }
  .pk-p-bande { grid-template-columns: repeat(3, 1fr); }
  .pk-mob-ligne { grid-template-columns: 108px 1fr 40px; gap: 10px; }
  .pk-fiche { padding: 0; }
  .pk-f-boite { border-radius: 0; max-height: 100vh; height: 100vh; }
}

/* ==========================================================================
   PROJETS — la bibliothèque (`projets.html`) et les fiches (`projet.html`)

   Le registre : une revue d'architecture, pas un catalogue. Ce qui le tient —
   1. L'IMAGE D'ABORD. Les visuels sont grands, tenus plein cadre, sans ombre
      ni bordure : la photo est l'objet, le reste est de la légende.
   2. LE BLANC EST UNE MATIÈRE. Les respirations sont larges et régulières
      (--pj-air) ; c'est le vide qui donne le sentiment de musée, pas les
      effets.
   3. LES FILETS PLUTÔT QUE LES CARTES. On sépare par un trait de 1px, on
      n'encadre pas — hérité du reste du site (--filet).
   4. LES TITRES SE COUPENT EN DEUX. Dernier mot en rouge, comme partout
      ailleurs sur le site.
   ========================================================================== */
/* Le voile de la charte, en variable : « le décor s'efface, le screenshot
   passe sous un voile blanc à ~90 % ». En sombre c'est le charbon de la
   page qui prend le relais — le principe ne change pas, la teinte si. */
:root { --pj-voile: 255, 255, 255; }
:root[data-theme="dark"] { --pj-voile: 20, 20, 22; }

.pf-sur {
  font-family: 'Poppins', sans-serif; font-size: 11px; font-weight: 600;
  letter-spacing: .2em; text-transform: uppercase; color: var(--rouge);
  margin-bottom: 16px;
}

/* ---------- Le hero ----------
   Le registre du site : fond de page, titre encre, rouge en accent unique.
   La capture ne fait PAS le fond sombre d'une landing page — elle passe
   dessous, presque effacée, et ne sert qu'à donner la texture et le lieu.
   Le dégradé part opaque à gauche (sous le texte) et s'allège à droite,
   où la photo a le droit de se voir un peu. */
.pj-hero, .pf-hero {
  position: relative; overflow: hidden; background: var(--blanc);
  padding: calc(var(--header-h) + 80px) 0 68px;
}
.pj-hero-photo, .pf-hero-photo {
  position: absolute; top: 0; bottom: 0; right: 0; width: 72%; z-index: 0;
}
.pj-hero-photo img, .pf-hero-photo img { width: 100%; height: 100%; object-fit: cover; }
.pj-hero-voile, .pf-hero-voile {
  position: absolute; inset: 0; z-index: 1; pointer-events: none;
  background:
    linear-gradient(90deg,
      rgb(var(--pj-voile)) 0%,
      rgba(var(--pj-voile), .99) 30%,
      rgba(var(--pj-voile), .9) 52%,
      rgba(var(--pj-voile), .74) 76%,
      rgba(var(--pj-voile), .62) 100%),
    linear-gradient(180deg,
      rgb(var(--pj-voile)) 0%, rgba(var(--pj-voile), 0) 26%,
      rgba(var(--pj-voile), 0) 74%, rgb(var(--pj-voile)) 100%);
}
.pj-hero .container, .pf-hero .container { position: relative; z-index: 10; }
.pj-hero .brand-tag { display: inline-flex; margin-bottom: 26px; }

/* Poppins 500, pas 700 : c'est la graisse des titres de page du site. En
   700 le titre criait, et c'est exactement ce qui le faisait sortir du lot. */
.pj-h1, .pf-h1 {
  font-family: 'Poppins', sans-serif; font-weight: 500;
  font-size: clamp(2.5rem, 1.7rem + 3.4vw, 4.6rem);
  line-height: 1.03; letter-spacing: -.03em; color: var(--gris-fonce);
  margin-bottom: 20px;
  transform: translateY(20px); opacity: 0;
  animation: fadeInUp 1s ease forwards .4s;
}
.pj-h1 b, .pf-h1 b { color: var(--rouge); font-weight: 500; }
.pj-chapo {
  color: var(--corps); line-height: 1.75; max-width: 500px; margin-bottom: 32px;
  transform: translateY(20px); opacity: 0;
  animation: fadeInUp 1s ease forwards .6s;
}
.pj-hero-actions {
  display: flex; gap: 12px; flex-wrap: wrap;
  transform: translateY(20px); opacity: 0;
  animation: fadeInUp 1s ease forwards .8s;
}
.pj-hero .dl-h-meta { margin-top: 66px; }
/* Le crédit de la capture, discret, calé sur le bord droit du hero. */
.pj-hero-credit {
  position: absolute; right: 4vw; bottom: 22px; z-index: 10;
  font-family: 'Poppins', sans-serif; font-size: 10.5px; font-weight: 500;
  letter-spacing: .14em; text-transform: uppercase; color: var(--sourdine);
}

/* ---------- Le corps de la bibliothèque ---------- */
.pj-corps { padding: 96px 0 110px; background: var(--blanc); }
.pj-tete {
  display: flex; justify-content: space-between; align-items: flex-end; gap: 24px;
  flex-wrap: wrap; padding-bottom: 26px; border-bottom: 1px solid var(--filet);
}
.pj-surtitre {
  font-family: 'Poppins', sans-serif; font-size: 11px; font-weight: 600;
  letter-spacing: .2em; text-transform: uppercase; color: var(--sourdine);
  margin-bottom: 10px;
}
.pj-titre2 {
  font-family: 'Poppins', sans-serif; font-weight: 700; color: var(--gris-fonce);
  font-size: clamp(1.7rem, 2.6vw, 2.5rem); line-height: 1.1; letter-spacing: -.02em;
}
.pj-titre2 b, .pf-h2 b { color: var(--rouge); }
.pj-compte {
  font-family: 'Poppins', sans-serif; font-size: 12px; font-weight: 600;
  letter-spacing: .1em; text-transform: uppercase; color: var(--sourdine);
}

/* ---------- Les filtres ----------
   Quatre familles côte à côte, chacune une rangée de pilules. On voit d'un
   coup tout ce qui existe et combien il y en a — un filtre qui cache son
   inventaire oblige à cliquer pour découvrir qu'il n'y a rien. */
.pj-filtres {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));
  gap: 30px 40px; padding: 30px 0 34px; border-bottom: 1px solid var(--filet);
}
.pj-f-titre {
  font-family: 'Poppins', sans-serif; font-size: 11px; font-weight: 600;
  letter-spacing: .16em; text-transform: uppercase; color: var(--sourdine);
  margin-bottom: 14px;
}
.pj-f-boutons { display: flex; flex-wrap: wrap; gap: 8px; }
.pj-f-boutons button {
  display: inline-flex; align-items: baseline; gap: 7px;
  padding: 8px 15px; border: 1px solid var(--filet); border-radius: 36px;
  background: none; cursor: pointer;
  font-family: 'Poppins', sans-serif; font-size: 13px; font-weight: 500;
  color: var(--gris-texte); transition: border-color .2s, color .2s, background .2s;
}
.pj-f-boutons button span { font-size: 11px; color: var(--sourdine); }
.pj-f-boutons button:hover { border-color: var(--gris-fonce); color: var(--gris-fonce); }
.pj-f-boutons button[aria-pressed="true"] {
  background: var(--gris-fonce); border-color: var(--gris-fonce); color: #fff;
}
.pj-f-boutons button[aria-pressed="true"] span { color: rgba(255,255,255,.6); }
.pj-raz {
  grid-column: 1 / -1; justify-self: start;
  border: 0; background: none; cursor: pointer; padding: 0;
  font-family: 'Poppins', sans-serif; font-size: 13px; font-weight: 600;
  color: var(--rouge); text-decoration: underline; text-underline-offset: 4px;
}

/* ---------- Les cartes ----------
   Deux colonnes seulement : une carte de projet doit pouvoir montrer une
   architecture. À trois ou quatre par rangée on retombe dans la vignette,
   et la page redevient une galerie. */
.pj-grille {
  display: grid; grid-template-columns: repeat(auto-fill, minmax(430px, 1fr));
  gap: 72px 48px; padding-top: 64px;
}
.pj-c[hidden] { display: none; }

/* La mise en avant : le projet le plus récent prend toute la largeur,
   image à gauche et notice à droite. Sans elle, la grille se lit comme un
   catalogue où tout se vaut — il faut un point d'entrée. */
.pj-c-une { grid-column: 1 / -1; }
.pj-c-une .pj-c-lien {
  display: grid; grid-template-columns: 1.32fr .68fr;
  gap: 52px; align-items: center;
}
.pj-c-une .pj-c-vue { aspect-ratio: 16 / 9; }
.pj-c-une .pj-c-corps { padding-top: 0; }
.pj-c-une .pj-c-nom { font-size: 2.1rem; letter-spacing: -.025em; }
.pj-c-une .pj-c-resume { font-size: 1.02rem; margin-top: 14px; }
.pj-c-une .pj-c-faits { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.pj-c-lien { display: block; color: inherit; }
.pj-c-vue {
  display: block; position: relative; overflow: hidden;
  aspect-ratio: 16 / 10; background: var(--gris-clair); border-radius: 3px;
}
.pj-c-vue img {
  width: 100%; height: 100%; object-fit: cover;
  transition: transform .9s cubic-bezier(.2, .8, .2, 1);
}
.pj-c-lien:hover .pj-c-vue img { transform: scale(1.045); }
.pj-c-cat {
  position: absolute; left: 14px; top: 14px;
  padding: 6px 13px; border-radius: 36px;
  background: rgba(255,255,255,.94); color: var(--gris-fonce);
  font-family: 'Poppins', sans-serif; font-size: 10.5px; font-weight: 600;
  letter-spacing: .1em; text-transform: uppercase;
}
.pj-c-corps { display: block; padding-top: 22px; }
.pj-c-nom {
  font-family: 'Poppins', sans-serif; font-weight: 700; font-size: 1.5rem;
  color: var(--gris-fonce); letter-spacing: -.01em; transition: color .2s;
}
.pj-c-lien:hover .pj-c-nom { color: var(--rouge); }
.pj-c-resume {
  margin-top: 10px; font-size: .95rem; line-height: 1.72; color: var(--sourdine);
  max-width: 46ch;
}
/* La fiche d'identité de la carte : deux colonnes de couples label/valeur,
   comme le cartouche d'un plan. */
.pj-c-faits {
  display: grid; grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 12px 22px; margin-top: 22px;
  padding-top: 18px; border-top: 1px solid var(--filet);
}
.pj-c-faits > span {
  display: flex; flex-direction: column; gap: 3px; min-width: 0;
  font-size: .87rem; color: var(--gris-texte); overflow-wrap: anywhere;
}
.pj-c-faits b {
  font-family: 'Poppins', sans-serif; font-size: 10px; font-weight: 600;
  letter-spacing: .14em; text-transform: uppercase; color: var(--sourdine);
}
.pj-c-cta {
  display: inline-flex; align-items: center; gap: 9px; margin-top: 22px;
  font-family: 'Poppins', sans-serif; font-size: 13px; font-weight: 600;
  color: var(--rouge);
}
.pj-c-cta i { font-style: normal; transition: transform .25s ease; }
.pj-c-lien:hover .pj-c-cta i { transform: translateX(5px); }

.pj-vide { padding: 80px 0; text-align: center; }
.pj-vide-titre {
  font-family: 'Poppins', sans-serif; font-size: 1.2rem; font-weight: 600;
  color: var(--gris-fonce); margin-bottom: 10px;
}
.pj-vide-note { color: var(--sourdine); font-size: .95rem; line-height: 1.7; }
.pj-vide-note a { color: var(--rouge); text-decoration: underline; text-underline-offset: 3px; }

/* ---------- L'appel à contribution ---------- */
.pj-appel {
  display: flex; align-items: center; justify-content: space-between;
  gap: 36px; flex-wrap: wrap; margin-top: 96px; padding: 46px 0 0;
  border-top: 1px solid var(--filet);
}
.pj-appel-sur {
  font-family: 'Poppins', sans-serif; font-size: 11px; font-weight: 600;
  letter-spacing: .18em; text-transform: uppercase; color: var(--sourdine);
  margin-bottom: 12px;
}
.pj-appel-titre {
  font-family: 'Poppins', sans-serif; font-weight: 700;
  font-size: clamp(1.5rem, 2.2vw, 2.1rem); color: var(--gris-fonce); letter-spacing: -.01em;
}
.pj-appel-titre b { color: var(--rouge); }
.pj-appel-texte {
  margin-top: 12px; max-width: 52ch; color: var(--sourdine);
  font-size: .97rem; line-height: 1.72;
}

/* Le jeton d'auteur sans skin : l'initiale, pour dire qu'on connaît le
   pseudo mais pas le visage. Jamais une tête prise au hasard. */
.pj-jeton, .pf-gens-skin {
  display: inline-grid; place-items: center; overflow: hidden;
  width: 44px; height: 44px; border-radius: 50%; background: var(--gris-clair);
}
.pj-jeton img, .pf-gens-skin img {
  width: 100%; height: 100%; object-fit: cover; image-rendering: pixelated;
}
.pj-jeton-vide, .pf-gens-vide {
  background: var(--gris-fonce); color: #fff;
  font-family: 'Poppins', sans-serif; font-weight: 600; font-size: 1rem;
}

/* ==========================================================================
   PROJET — la fiche (`projet.html`)
   ========================================================================== */
.pf-retour {
  display: inline-flex; align-items: center; gap: 9px; margin-bottom: 24px;
  font-family: 'Poppins', sans-serif; font-size: 13px; font-weight: 500;
  color: var(--sourdine); transition: color .2s, gap .2s;
}
.pf-retour:hover { color: var(--rouge); gap: 13px; }
.pf-retour i { font-style: normal; }

/* Le cartouche : les faits du projet sous le titre, comme le bandeau
   d'identification d'un plan d'architecte. */
.pf-cartouche {
  display: flex; flex-wrap: wrap; gap: 16px 56px; margin-top: 44px;
  padding-top: 26px; border-top: 1px solid var(--filet);
}
.pf-cartouche dt {
  font-family: 'Poppins', sans-serif; font-size: 10px; font-weight: 600;
  letter-spacing: .16em; text-transform: uppercase; color: var(--sourdine);
  margin-bottom: 6px;
}
.pf-cartouche dd {
  font-family: 'Poppins', sans-serif; font-size: 1.02rem; font-weight: 500;
  color: var(--gris-fonce);
}

/* ---------- Rythme des sections : la grille asymétrique ----------
   L'intitulé de section part dans une colonne de gauche et y reste collé
   pendant qu'on lit — le lecteur sait toujours dans quelle partie du
   dossier il se trouve. C'est la mise en page d'une revue d'architecture,
   et ça casse l'empilement de blocs pleine largeur. */
.pf-section { padding: 92px 0; background: var(--blanc); }
.pf-section + .pf-section { padding-top: 0; }
.pf-section > .container {
  display: grid; grid-template-columns: 176px minmax(0, 1fr); column-gap: 64px;
}
.pf-section > .container > * { grid-column: 2; }
/* Sélecteur aussi spécifique que la règle ci-dessus, sinon `> *` l'emporte
   et l'intitulé retombe dans la colonne de contenu. */
.pf-section > .container > .pf-titre-sec {
  grid-column: 1; grid-row: 1 / -1; align-self: start;
  position: sticky; top: calc(var(--header-h) + 24px);
  font-family: 'Poppins', sans-serif; font-size: 11px; font-weight: 600;
  letter-spacing: .18em; text-transform: uppercase; color: var(--rouge);
}
.pf-h2 {
  font-family: 'Poppins', sans-serif; font-weight: 700; color: var(--gris-fonce);
  font-size: clamp(1.6rem, 2.5vw, 2.3rem); line-height: 1.12;
  letter-spacing: -.02em; margin-bottom: 16px;
}
.pf-intro { max-width: 58ch; color: var(--sourdine); font-size: .98rem; line-height: 1.75; }

/* ---------- L'article ----------
   Colonne étroite (62 caractères) : c'est la mesure d'un texte qui se lit
   vraiment. Le reste de la page est large, le récit ne l'est pas. */
.pf-article { max-width: 68ch; }
.pf-art-h2 {
  font-family: 'Poppins', sans-serif; font-weight: 700; font-size: 1.45rem;
  color: var(--gris-fonce); letter-spacing: -.01em; margin: 46px 0 14px;
}
.pf-art-h2:first-child { margin-top: 0; }
.pf-art-p { font-size: 1.05rem; line-height: 1.85; color: var(--gris-texte); margin-bottom: 18px; }

/* Le manque assumé : un encadré qui dit ce qui n'existe pas encore et
   propose de le combler, plutôt qu'une section vide ou du faux texte. */
.pf-manque {
  padding: 40px; border: 1px dashed var(--filet); border-radius: 4px;
  background: var(--gris-clair); max-width: 68ch;
}
.pf-manque-titre {
  font-family: 'Poppins', sans-serif; font-size: 1.12rem; font-weight: 600;
  color: var(--gris-fonce); margin-bottom: 12px;
}
.pf-manque-texte {
  font-size: .97rem; line-height: 1.78; color: var(--sourdine); margin-bottom: 26px;
}

/* ---------- La galerie masonry ----------
   Colonnes CSS : les captures Minecraft ont des ratios très variés (12
   ratios différents rien que dans la galerie du site), une grille à cases
   fixes les recadrerait toutes. Là, chaque image garde sa proportion. */
/* Deux colonnes par défaut : depuis que l'intitulé occupe un rail à gauche,
   la colonne de contenu ne porte plus trois images sans les rapetisser — et
   avec deux photos seulement, la troisième colonne restait un trou. */
.pf-masonry { columns: 2; column-gap: 26px; margin-top: 8px; }
@media (min-width: 1500px) { .pf-masonry { columns: 3; } }
.pf-vignette {
  break-inside: avoid; margin: 0 0 26px; cursor: zoom-in;
  transition: transform .5s cubic-bezier(.2,.8,.2,1);
}
.pf-vignette img { width: 100%; border-radius: 3px; display: block; }
.pf-vignette:hover { transform: translateY(-4px); }
.pf-vignette:focus-visible { outline: 3px solid var(--vert); outline-offset: 4px; }
.pf-vignette figcaption {
  margin-top: 10px; font-size: .86rem; line-height: 1.6; color: var(--sourdine);
}

/* ---------- Plans et documents ---------- */
.pf-plans {
  display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
  gap: 34px; margin-top: 38px;
}
.pf-plan { margin: 0; cursor: zoom-in; }
.pf-plan img {
  width: 100%; aspect-ratio: 4 / 3; object-fit: cover;
  border: 1px solid var(--filet); border-radius: 3px; background: var(--gris-clair);
}
.pf-plan:focus-visible { outline: 3px solid var(--vert); outline-offset: 4px; }
.pf-plan figcaption { margin-top: 12px; }
.pf-plan figcaption b {
  display: block; font-family: 'Poppins', sans-serif; font-size: 10px;
  font-weight: 600; letter-spacing: .16em; text-transform: uppercase;
  color: var(--rouge); margin-bottom: 5px;
}
.pf-plan figcaption span { font-size: .9rem; line-height: 1.6; color: var(--sourdine); }

/* ---------- Localisation ---------- */
.pf-lieu { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 48px; align-items: start; }
.pf-warp {
  padding: 34px; border: 1px solid var(--filet); border-radius: 4px;
  background: var(--gris-clair);
}
.pf-warp-label {
  font-family: 'Poppins', sans-serif; font-size: 10px; font-weight: 600;
  letter-spacing: .16em; text-transform: uppercase; color: var(--sourdine);
  margin-bottom: 14px;
}
.pf-warp-btn {
  display: flex; align-items: center; justify-content: space-between; gap: 18px;
  width: 100%; padding: 16px 20px; cursor: pointer;
  border: 1px solid var(--filet); border-radius: 36px; background: var(--blanc);
  transition: border-color .2s, background .2s;
}
.pf-warp-btn:hover { border-color: var(--rouge); }
.pf-warp-btn code {
  font-family: 'Courier New', monospace; font-size: 1.02rem; font-weight: 700;
  color: var(--gris-fonce);
}
.pf-warp-etat {
  font-family: 'Poppins', sans-serif; font-size: 11px; font-weight: 600;
  letter-spacing: .1em; text-transform: uppercase; color: var(--rouge); flex: none;
}
.pf-warp-btn.copie { border-color: var(--vert); }
.pf-warp-btn.copie .pf-warp-etat { color: var(--vert); }
.pf-warp-aide { margin-top: 14px; font-size: .87rem; color: var(--sourdine); }
.pf-coords { display: grid; gap: 20px; }
.pf-coords > div { padding-bottom: 16px; border-bottom: 1px solid var(--filet); }
.pf-coords dt {
  font-family: 'Poppins', sans-serif; font-size: 10px; font-weight: 600;
  letter-spacing: .16em; text-transform: uppercase; color: var(--sourdine);
  margin-bottom: 6px;
}
.pf-coords dd { font-size: 1rem; color: var(--gris-texte); }

/* ---------- Les créateurs ---------- */
.pf-gens { display: flex; flex-wrap: wrap; gap: 20px 56px; align-items: center; }
.pf-personne { display: flex; align-items: center; gap: 16px; margin: 0; }
.pf-gens-skin { width: 62px; height: 62px; border-radius: 6px; flex: none; }
.pf-personne figcaption b {
  display: block; font-family: 'Poppins', sans-serif; font-size: 1.08rem;
  font-weight: 600; color: var(--gris-fonce); margin-bottom: 3px;
}
.pf-personne figcaption span { font-size: .9rem; color: var(--sourdine); }
.pf-revendiquer {
  flex-basis: 100%; margin-top: 14px;
  font-family: 'Poppins', sans-serif; font-size: 13px; font-weight: 500;
  color: var(--sourdine); text-decoration: underline; text-underline-offset: 4px;
  transition: color .2s;
}
.pf-revendiquer:hover { color: var(--rouge); }

/* ---------- Statistiques ---------- */
/* Des tuiles indépendantes, pas une grille qui s'étire : une fiche
   technique n'a souvent qu'un ou deux chiffres connus, et une seule case
   tirée sur toute la largeur donnait un grand cadre presque vide. */
.pf-stats { display: flex; flex-wrap: wrap; gap: 18px; }
.pf-stat {
  flex: 1 1 168px; max-width: 260px; padding: 28px 26px;
  background: var(--blanc); border: 1px solid var(--filet); border-radius: 4px;
}
.pf-stat b {
  display: block; font-family: 'Poppins', sans-serif; font-size: 1.75rem;
  font-weight: 700; color: var(--gris-fonce); letter-spacing: -.02em; margin-bottom: 8px;
}
.pf-stat span {
  font-family: 'Poppins', sans-serif; font-size: 10.5px; font-weight: 600;
  letter-spacing: .14em; text-transform: uppercase; color: var(--sourdine);
}

/* ---------- Vidéo ---------- */
.pf-video { aspect-ratio: 16 / 9; border-radius: 4px; overflow: hidden; background: #000; }
.pf-video iframe { width: 100%; height: 100%; border: 0; display: block; }

/* ---------- Les projets voisins ---------- */
.pf-suite { padding-bottom: 110px; }
.pf-voisins { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 34px; }
.pf-voisin { display: block; color: inherit; }
.pf-voisin-vue {
  display: block; aspect-ratio: 16 / 10; overflow: hidden;
  border-radius: 3px; background: var(--gris-clair); margin-bottom: 16px;
}
.pf-voisin-vue img {
  width: 100%; height: 100%; object-fit: cover;
  transition: transform .8s cubic-bezier(.2,.8,.2,1);
}
.pf-voisin:hover .pf-voisin-vue img { transform: scale(1.05); }
.pf-voisin b {
  display: block; font-family: 'Poppins', sans-serif; font-size: 1.12rem;
  font-weight: 600; color: var(--gris-fonce); margin-bottom: 4px; transition: color .2s;
}
.pf-voisin:hover b { color: var(--rouge); }
.pf-voisin-cat {
  font-family: 'Poppins', sans-serif; font-size: 10.5px; font-weight: 600;
  letter-spacing: .14em; text-transform: uppercase; color: var(--sourdine);
}

/* ---------- Projet introuvable ---------- */
.pf-absent { padding: calc(var(--header-h) + 120px) 0 140px; background: var(--blanc); }
.pf-absent .pf-h1 { color: var(--gris-fonce); }
.pf-absent .pf-sur { color: var(--rouge); }
.pf-absent .pf-chapo, .pf-absent .pj-chapo {
  max-width: 52ch; margin: 20px 0 34px; color: var(--sourdine);
  font-size: 1.02rem; line-height: 1.75;
}

/* ---------- La visionneuse ---------- */
.pf-loupe {
  position: fixed; inset: 0; z-index: 500;
  display: grid; place-items: center; padding: 5vh 6vw;
  background: rgba(12, 12, 14, .95);
}
.pf-loupe[hidden] { display: none; }
.pf-loupe-boite { margin: 0; max-width: 100%; max-height: 100%; text-align: center; }
.pf-loupe-boite img {
  max-width: 100%; max-height: 80vh; object-fit: contain;
  border-radius: 3px; margin-inline: auto;
}
.pf-loupe-boite figcaption {
  margin-top: 18px; font-family: 'Poppins', sans-serif; font-size: .92rem;
  color: rgba(255,255,255,.72);
}
.pf-loupe-fermer, .pf-loupe-nav {
  position: absolute; display: grid; place-items: center;
  border: 1px solid rgba(255,255,255,.25); border-radius: 50%;
  background: rgba(255,255,255,.06); color: #fff; cursor: pointer;
  transition: background .2s, border-color .2s;
}
.pf-loupe-fermer:hover, .pf-loupe-nav:hover {
  background: rgba(255,255,255,.16); border-color: rgba(255,255,255,.5);
}
.pf-loupe-fermer { top: 22px; right: 22px; width: 46px; height: 46px; font-size: 17px; }
.pf-loupe-nav { top: 50%; transform: translateY(-50%); width: 52px; height: 52px; font-size: 28px; line-height: 1; }
.pf-loupe-prec { left: 20px; }
.pf-loupe-suiv { right: 20px; }

/* ==========================================================================
   SOUMETTRE UN PROJET (`soumettre-projet.html`)
   ========================================================================== */
.ps-page, .ps-merci { padding: calc(var(--header-h) + 70px) 0 0; background: var(--blanc); }
.ps-page > .container, .ps-merci > .container { padding-bottom: 100px; }
.ps-h1 {
  font-family: 'Poppins', sans-serif; font-weight: 700; color: var(--gris-fonce);
  font-size: clamp(2rem, 4vw, 3.3rem); line-height: 1.08; letter-spacing: -.025em;
}
.ps-h1 b { color: var(--rouge); }
.ps-chapo {
  max-width: 62ch; margin-top: 22px; font-size: 1.03rem; line-height: 1.8;
  color: var(--sourdine);
}
.ps-chapo strong { color: var(--gris-texte); }
.ps-page .pf-retour { color: var(--sourdine); margin-bottom: 30px; }
.ps-page .pf-retour:hover { color: var(--rouge); }

.ps-form { max-width: 780px; margin-top: 56px; }
.ps-pot { position: absolute; left: -9999px; }
.ps-bloc { border: 0; padding: 0; margin: 0 0 58px; }
.ps-legend {
  display: flex; align-items: center; gap: 14px; width: 100%;
  padding-bottom: 18px; margin-bottom: 30px; border-bottom: 1px solid var(--filet);
  font-family: 'Poppins', sans-serif; font-size: 1.15rem; font-weight: 600;
  color: var(--gris-fonce);
}
.ps-legend span {
  display: grid; place-items: center; flex: none; width: 30px; height: 30px;
  border-radius: 50%; background: var(--rouge); color: #fff;
  font-size: 13px; font-weight: 700;
}
.ps-intro-bloc {
  margin-bottom: 28px; font-size: .95rem; line-height: 1.75; color: var(--sourdine);
}
.ps-intro-bloc strong { color: var(--gris-texte); }
.ps-champ { margin-bottom: 26px; }
.ps-deux { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 0 24px; }
.ps-champ label {
  display: flex; align-items: baseline; gap: 10px; margin-bottom: 9px;
  font-family: 'Poppins', sans-serif; font-size: 13.5px; font-weight: 600;
  color: var(--gris-fonce);
}
.ps-champ label em {
  font-style: normal; font-size: 10px; font-weight: 600; letter-spacing: .12em;
  text-transform: uppercase; color: var(--rouge);
}
.ps-champ input[type="text"], .ps-champ input[type="url"],
.ps-champ textarea, .ps-champ select {
  width: 100%; padding: 13px 16px; border: 1px solid var(--filet); border-radius: 4px;
  background: var(--blanc); color: var(--gris-texte);
  font-family: 'Open Sans', sans-serif; font-size: .95rem; line-height: 1.6;
  transition: border-color .2s;
}
.ps-champ textarea { resize: vertical; min-height: 76px; }
.ps-champ input:focus, .ps-champ textarea:focus, .ps-champ select:focus {
  outline: none; border-color: var(--rouge);
}
.ps-champ input::placeholder, .ps-champ textarea::placeholder { color: #c4c4c4; }
.ps-champ input[type="file"] {
  width: 100%; padding: 13px 16px; border: 1px dashed var(--filet); border-radius: 4px;
  background: var(--gris-clair); font-family: 'Open Sans', sans-serif; font-size: .9rem;
  color: var(--gris-texte); cursor: pointer;
}
.ps-aide { margin-top: 8px; font-size: .85rem; line-height: 1.6; color: var(--sourdine); }
.ps-envoi {
  display: flex; align-items: center; gap: 26px; flex-wrap: wrap;
  padding-top: 34px; border-top: 1px solid var(--filet);
}
.ps-suite { max-width: 40ch; font-size: .87rem; line-height: 1.65; color: var(--sourdine); }
.ps-secours {
  max-width: 780px; margin-top: 46px; padding: 24px 28px;
  border-left: 3px solid var(--rouge); background: var(--gris-clair);
  font-size: .93rem; line-height: 1.7; color: var(--sourdine);
}
.ps-secours b { color: var(--gris-fonce); }
.ps-secours a { color: var(--rouge); text-decoration: underline; text-underline-offset: 3px; }
.ps-merci-actions { display: flex; flex-wrap: wrap; gap: 14px; margin-top: 38px; }

/* ---------- Adaptations ---------- */
@media (max-width: 1024px) {
  .pf-masonry { columns: 2; }
  .pf-lieu { grid-template-columns: 1fr; gap: 34px; }
  /* Le rail n'a plus la place d'être une colonne : l'intitulé repasse
     au-dessus du contenu, avec le filet qu'il avait avant. */
  .pf-section > .container { grid-template-columns: 1fr; }
  .pf-section > .container > * { grid-column: 1; }
  .pf-section > .container > .pf-titre-sec {
    grid-column: 1; grid-row: auto; position: static;
    padding-bottom: 16px; margin-bottom: 30px; border-bottom: 1px solid var(--filet);
  }
  .pj-c-une .pj-c-lien { grid-template-columns: 1fr; gap: 24px; }
  .pj-c-une .pj-c-nom { font-size: 1.7rem; }
}
@media (max-width: 900px) {
  .pj-grille { grid-template-columns: 1fr; gap: 56px; padding-top: 48px; }
  .pj-corps { padding: 70px 0 84px; }
  .pj-filtres { gap: 26px; }
  .pj-hero, .pf-hero { padding: calc(var(--header-h) + 46px) 0 52px; }
  /* Sur une colonne étroite le texte retombe sur la photo : le voile
     devient un aplat franc, seul le bas laisse voir la capture. */
  .pj-hero-photo, .pf-hero-photo { width: 100%; }
  .pj-hero-voile, .pf-hero-voile {
    background: linear-gradient(180deg,
      rgb(var(--pj-voile)) 0%, rgba(var(--pj-voile), .97) 58%,
      rgba(var(--pj-voile), .88) 100%);
  }
  .pj-hero-credit { display: none; }
  .pj-hero .dl-h-meta { grid-template-columns: repeat(2, 1fr); gap: 20px 0; margin-top: 46px; }
  .pf-section { padding: 68px 0; }
  .pf-cartouche { gap: 18px 34px; }
  .pj-appel { margin-top: 64px; }
}
@media (max-width: 640px) {
  .pf-masonry { columns: 1; }
  .pj-c-faits { grid-template-columns: 1fr; }
  .pf-loupe { padding: 4vh 3vw; }
  .pf-loupe-nav { width: 42px; height: 42px; font-size: 22px; }
  .pf-loupe-prec { left: 6px; }
  .pf-loupe-suiv { right: 6px; }
  .pf-loupe-fermer { top: 12px; right: 12px; }
  .ps-envoi { flex-direction: column; align-items: flex-start; gap: 16px; }
}

/* ==========================================================================
   CARTE DU SERVEUR (`carte.html`)
   Le hero et les intitulés sont ceux de la page Projets — c'est la même
   famille, il n'y a pas de raison d'inventer un troisième langage. Ce qui
   est propre à cette page : le cadre de la webmap, qui doit tenir ses
   proportions AVANT d'avoir une carte à montrer, pour que la mise en page
   ne saute pas le jour où on l'allume.
   ========================================================================== */
.ca-corps { padding: 92px 0 0; background: var(--blanc); scroll-margin-top: var(--header-h); }
.ca-lieux { padding: 92px 0 110px; background: var(--blanc); scroll-margin-top: var(--header-h); }

.ca-etat {
  display: inline-flex; align-items: center; gap: 9px;
  font-family: 'Poppins', sans-serif; font-size: 11px; font-weight: 600;
  letter-spacing: .14em; text-transform: uppercase; color: var(--sourdine);
}
.ca-etat::before {
  content: ''; width: 7px; height: 7px; border-radius: 50%;
  background: var(--sourdine); flex: none;
}
/* Le vert en micro-signal, comme l'étoile de note ailleurs sur le site. */
.ca-etat-actif { color: var(--gris-fonce); }
.ca-etat-actif::before { background: var(--vert); box-shadow: 0 0 8px var(--vert); }

.ca-cadre {
  position: relative; margin-top: 44px;
  aspect-ratio: 16 / 9; min-height: 420px;
  border: 1px solid var(--filet); border-radius: 4px; overflow: hidden;
  background: var(--gris-clair);
}
.ca-iframe { width: 100%; height: 100%; border: 0; display: block; }

/* L'attente : un encart dessiné, pas un rectangle gris. Il dit ce qui
   manque, et il occupe exactement la place que prendra la carte. */
.ca-attente {
  position: absolute; inset: 0;
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  text-align: center; padding: 48px 8%;
}
.ca-boussole { width: 62px; height: 62px; color: var(--rouge); opacity: .9; margin-bottom: 26px; }
.ca-attente-titre {
  font-family: 'Poppins', sans-serif; font-weight: 600;
  font-size: clamp(1.15rem, 1.8vw, 1.5rem); color: var(--gris-fonce);
  letter-spacing: -.01em; margin-bottom: 14px;
}
.ca-attente-titre b { color: var(--rouge); }
.ca-attente-texte {
  max-width: 56ch; font-size: .97rem; line-height: 1.78; color: var(--sourdine);
  margin-bottom: 30px;
}
.ca-attente-actions { display: flex; flex-wrap: wrap; gap: 12px; justify-content: center; }
.ca-avert {
  margin-top: 24px; padding: 12px 18px; border-radius: 4px;
  background: rgba(219, 53, 53, .08); border: 1px solid rgba(219, 53, 53, .25);
  font-size: .87rem; line-height: 1.6; color: var(--rouge); max-width: 60ch;
}

.ca-note {
  display: flex; flex-wrap: wrap; gap: 6px 14px; margin-top: 18px;
  font-size: .88rem; color: var(--sourdine);
}
/* `display:flex` bat la règle `[hidden] { display:none }` du navigateur :
   sans cette ligne, la note s'affichait alors qu'il n'y a pas de carte. */
.ca-note[hidden] { display: none; }
.ca-note a { color: var(--rouge); text-decoration: underline; text-underline-offset: 3px; }

.ca-intro {
  max-width: 62ch; margin-top: 26px; font-size: .98rem; line-height: 1.78;
  color: var(--sourdine);
}
/* Des cartes indépendantes plutôt qu'une grille aux cases jointives : avec
   deux lieux sur trois colonnes, la troisième case laissait un aplat gris.
   La bibliothèque de lieux commencera toujours petite. */
.ca-grille {
  display: grid; grid-template-columns: repeat(auto-fill, minmax(290px, 340px));
  gap: 22px; margin-top: 42px;
}
.ca-lieu {
  padding: 30px 28px; background: var(--blanc);
  border: 1px solid var(--filet); border-radius: 4px;
}
.ca-lieu-nom {
  font-family: 'Poppins', sans-serif; font-weight: 600; font-size: 1.25rem;
  color: var(--gris-fonce); letter-spacing: -.01em; margin-bottom: 18px;
}
.ca-warp {
  display: flex; align-items: center; justify-content: space-between; gap: 14px;
  width: 100%; padding: 12px 16px; cursor: pointer;
  border: 1px solid var(--filet); border-radius: 36px; background: none;
  transition: border-color .2s;
}
.ca-warp:hover { border-color: var(--rouge); }
.ca-warp code {
  font-family: 'Courier New', monospace; font-size: .95rem; font-weight: 700;
  color: var(--gris-fonce);
}
.ca-warp-etat {
  font-family: 'Poppins', sans-serif; font-size: 10px; font-weight: 600;
  letter-spacing: .1em; text-transform: uppercase; color: var(--rouge); flex: none;
}
.ca-warp.copie { border-color: var(--vert); }
.ca-warp.copie .ca-warp-etat { color: var(--vert); }
.ca-lieu-xyz {
  margin-top: 12px; font-family: 'Courier New', monospace;
  font-size: .88rem; color: var(--sourdine);
}
.ca-lieu-label {
  margin-top: 22px; font-family: 'Poppins', sans-serif; font-size: 10px;
  font-weight: 600; letter-spacing: .16em; text-transform: uppercase;
  color: var(--sourdine);
}
.ca-lieu-liens { display: flex; flex-direction: column; gap: 6px; margin-top: 10px; }
.ca-lieu-liens a {
  font-family: 'Poppins', sans-serif; font-size: .95rem; font-weight: 500;
  color: var(--gris-texte); transition: color .2s;
}
.ca-lieu-liens a:hover { color: var(--rouge); }
.ca-vide {
  margin-top: 40px; padding: 40px; text-align: center;
  border: 1px dashed var(--filet); border-radius: 4px;
  color: var(--sourdine); font-size: .95rem;
}

@media (max-width: 900px) {
  .ca-corps, .ca-lieux { padding-top: 68px; }
  .ca-lieux { padding-bottom: 84px; }
  .ca-cadre { aspect-ratio: 4 / 3; min-height: 340px; margin-top: 32px; }
  .ca-attente { padding: 32px 24px; }
  .ca-boussole { width: 48px; height: 48px; margin-bottom: 18px; }
}

/* ==========================================================================
   404 · VOTER · CONDITIONS — les trois pages ajoutées
   Écrites uniquement avec les tokens partagés (--blanc, --gris-fonce,
   --gris-texte, --filet, --sourdine, --rouge, --vert) : elles suivent donc
   le mode sombre toutes seules, sans une ligne de surcharge.
   Vocabulaire du site : des filets, pas de cartes ombrées.
   ========================================================================== */

/* --------------------------------------------------------------------------
   404 — la page manquante, dite dans la langue du jeu.
   Le grand « 404 » est un décor, pas un titre : il est en aria-hidden et
   posé derrière, très pâle. Le vrai titre suit la règle des deux mots.
   -------------------------------------------------------------------------- */
.e4-main { display: flex; flex-direction: column; min-height: 100vh; }
.e4-page {
  position: relative; overflow: hidden; background: var(--blanc);
  flex: 1; display: flex; align-items: center;
  padding: calc(var(--header-h) + 70px) 0 80px;
}
.e4-corps { position: relative; z-index: 10; }
/* Le vide sous la page : un dégradé qui monte du bas, très discret. */
.e4-vide {
  position: absolute; left: 0; right: 0; bottom: 0; height: 45%; z-index: 1;
  background: linear-gradient(to top, var(--gris-clair), transparent);
  pointer-events: none;
}
.e4-code {
  position: absolute; z-index: 0; top: 50%; right: -2vw; translate: 0 -50%;
  font-family: 'Poppins', sans-serif; font-weight: 700;
  font-size: clamp(9rem, 30vw, 24rem); line-height: .8;
  letter-spacing: -.05em; color: var(--filet); user-select: none;
}
.e4-titre {
  font-family: 'Poppins', sans-serif; font-weight: 500;
  font-size: clamp(2.3rem, 1.6rem + 3.2vw, 4.2rem);
  line-height: 1.04; letter-spacing: -.03em; color: var(--gris-fonce);
  margin: 14px 0 22px;
}
.e4-titre b { color: var(--rouge); font-weight: 500; }
.e4-chapo { color: var(--sourdine); line-height: 1.75; max-width: 46ch; margin-bottom: 34px; }
.e4-actions { display: flex; flex-wrap: wrap; gap: 14px; margin-bottom: 64px; }

.e4-pistes .dl-surtitre { margin-bottom: 14px; }
.e4-pistes ul {
  list-style: none; display: grid; gap: 0;
  grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));
  border-top: 1px solid var(--filet); max-width: 900px;
}
.e4-pistes li { border-bottom: 1px solid var(--filet); }
.e4-pistes a { display: block; padding: 16px 20px 16px 0; transition: padding-left .25s ease; }
.e4-pistes a:hover { padding-left: 12px; }
.e4-pistes b {
  display: block; font-family: 'Poppins', sans-serif; font-size: 15px;
  font-weight: 600; color: var(--gris-fonce); margin-bottom: 3px;
  transition: color .2s ease;
}
.e4-pistes a:hover b { color: var(--rouge); }
.e4-pistes span { font-size: 13px; color: var(--sourdine); }

@media (max-width: 640px) {
  .e4-code { right: auto; left: 50%; translate: -50% -50%; opacity: .6; }
  .e4-actions { margin-bottom: 44px; }
}

/* --------------------------------------------------------------------------
   VOTER — deux destinations, et rien pour distraire d'elles.
   Numérotées 01/02 parce qu'il y en a exactement deux et qu'on veut que le
   visiteur fasse les deux, pas qu'il en choisisse une.
   -------------------------------------------------------------------------- */
.vt-hero {
  position: relative; overflow: hidden; background: var(--blanc);
  padding: calc(var(--header-h) + 80px) 0 56px;
}
.vt-hero .container { position: relative; z-index: 10; }
.vt-hero .brand-tag { display: inline-flex; margin-bottom: 24px; }
.vt-hero .dl-chapo { max-width: 62ch; }
.vt-sec { padding-top: 0; }

.vt-listes {
  display: grid; gap: 0; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
  border-top: 1px solid var(--filet); margin-bottom: 90px;
}
.vt-carte {
  display: block; padding: 34px 34px 34px 0; border-bottom: 1px solid var(--filet);
  position: relative; transition: padding-left .3s ease;
}
.vt-carte + .vt-carte { padding-left: 0; }
.vt-carte:hover { padding-left: 16px; }
.vt-n {
  display: block; font-family: 'Poppins', sans-serif; font-size: 11px;
  font-weight: 600; letter-spacing: .2em; color: var(--rouge); margin-bottom: 14px;
}
.vt-nom {
  display: block; font-family: 'Poppins', sans-serif; font-weight: 500;
  font-size: clamp(1.5rem, 2.6vw, 2rem); letter-spacing: -.02em;
  color: var(--gris-fonce); margin-bottom: 10px; transition: color .2s ease;
}
.vt-carte:hover .vt-nom { color: var(--rouge); }
.vt-sous { display: block; color: var(--sourdine); line-height: 1.7; max-width: 40ch; margin-bottom: 18px; }
.vt-fl {
  display: inline-block; font-family: 'Poppins', sans-serif; font-size: 13px;
  font-weight: 600; color: var(--rouge);
  border-bottom: 1px solid currentColor; padding-bottom: 2px;
}

.vt-comment { display: grid; grid-template-columns: .8fr 1.2fr; gap: 60px; align-items: start; }
.vt-etapes { list-style: none; counter-reset: e; border-top: 1px solid var(--filet); }
.vt-etapes li {
  counter-increment: e; border-bottom: 1px solid var(--filet);
  padding: 20px 0 20px 52px; position: relative;
}
.vt-etapes li::before {
  content: counter(e, decimal-leading-zero);
  position: absolute; left: 0; top: 21px;
  font-family: 'Poppins', sans-serif; font-size: 12px; font-weight: 600;
  letter-spacing: .1em; color: var(--sourdine);
}
.vt-etapes b {
  display: block; font-family: 'Poppins', sans-serif; font-size: 16px;
  font-weight: 600; color: var(--gris-fonce); margin-bottom: 4px;
}
.vt-etapes span { color: var(--sourdine); font-size: 14.5px; line-height: 1.6; }

.vt-note {
  display: flex; flex-wrap: wrap; gap: 18px; align-items: baseline;
  justify-content: space-between; margin-top: 70px;
  padding-top: 22px; border-top: 1px solid var(--filet);
}

@media (max-width: 900px) {
  .vt-comment { grid-template-columns: 1fr; gap: 30px; }
  .vt-listes { margin-bottom: 60px; }
  .vt-carte { padding-right: 0; }
}

/* --------------------------------------------------------------------------
   CONDITIONS — un document, donc une seule colonne étroite et beaucoup d'air.
   Les blocs « à compléter » sont visibles exprès : ils doivent gêner tant
   qu'ils sont là, pour ne pas partir en ligne par oubli.
   -------------------------------------------------------------------------- */
.cg-hero {
  background: var(--blanc);
  padding: calc(var(--header-h) + 74px) 0 46px;
  border-bottom: 1px solid var(--filet);
}
.cg-titre {
  font-family: 'Poppins', sans-serif; font-weight: 500;
  font-size: clamp(2.2rem, 1.6rem + 3vw, 3.9rem);
  line-height: 1.04; letter-spacing: -.03em; color: var(--gris-fonce);
  margin: 12px 0 20px;
}
.cg-titre b { color: var(--rouge); font-weight: 500; }
.cg-chapo { color: var(--sourdine); line-height: 1.75; max-width: 54ch; }

.cg-corps { max-width: 720px; }
.cg-corps article { padding: 40px 0; border-bottom: 1px solid var(--filet); }
.cg-corps article:last-child { border-bottom: 0; }
.cg-corps h2 {
  font-family: 'Poppins', sans-serif; font-weight: 600; font-size: 1.12rem;
  letter-spacing: -.01em; color: var(--gris-fonce); margin-bottom: 16px;
}
.cg-corps p { color: var(--gris-texte); line-height: 1.8; margin-bottom: 14px; }
.cg-corps p:last-child { margin-bottom: 0; }
.cg-corps ul { list-style: none; margin: 6px 0 18px; }
.cg-corps li {
  color: var(--gris-texte); line-height: 1.75; padding: 9px 0 9px 22px;
  position: relative; border-bottom: 1px solid var(--filet);
}
.cg-corps li:last-child { border-bottom: 0; }
.cg-corps li::before {
  content: ""; position: absolute; left: 0; top: 17px;
  width: 6px; height: 6px; background: var(--rouge);
}
.cg-corps b { font-weight: 600; color: var(--gris-fonce); }
.cg-corps a { color: var(--rouge); text-decoration: underline; text-underline-offset: 3px; }

/* Le rappel de ce qui manque encore. Volontairement voyant. */
.cg-arem {
  background: var(--gris-clair); border-left: 3px solid var(--rouge);
  padding: 16px 20px; font-size: 14.5px; line-height: 1.7;
  color: var(--gris-texte) !important; margin-top: 6px;
}
.cg-vo { font-size: 13.5px; color: var(--sourdine); }


/* --------------------------------------------------------------------------
   PACK — la clôture de la page : le pack se regarde en jeu.
   Un fond de page (pas de carte), un titre en deux temps, deux warps posés
   côte à côte comme des commandes, et l'IP à portée de clic.
   -------------------------------------------------------------------------- */
.pk-venir { padding-top: 96px; padding-bottom: 104px; }
.pk-venir-titre {
  font-family: 'Poppins', sans-serif; font-weight: 500;
  font-size: clamp(1.9rem, 1.3rem + 2.6vw, 3.2rem);
  line-height: 1.08; letter-spacing: -.03em; color: var(--gris-fonce);
  margin: 12px 0 22px;
}
.pk-venir-titre b { color: var(--rouge); font-weight: 500; }
.pk-venir-texte { color: var(--corps); line-height: 1.8; max-width: 62ch; margin-bottom: 46px; }

.pk-venir-warps {
  display: grid; gap: 0; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
  border-top: 1px solid var(--filet); margin-bottom: 56px;
}
.pk-venir-warp { padding: 26px 30px 26px 0; border-bottom: 1px solid var(--filet); }
.pk-venir-warp code {
  display: inline-block; font-family: 'Poppins', sans-serif; font-size: 15px;
  font-weight: 600; color: var(--rouge); background: var(--rouge-doux);
  border-radius: 4px; padding: 5px 12px; margin-bottom: 12px;
}
.pk-venir-warp p { color: var(--corps); line-height: 1.7; font-size: 15px; max-width: 40ch; }

.pk-venir-bas {
  display: flex; flex-wrap: wrap; gap: 26px; align-items: center;
  justify-content: space-between;
  padding-top: 30px; border-top: 1px solid var(--filet);
}
.pk-venir-attente {
  font-family: 'Poppins', sans-serif; font-weight: 500;
  font-size: clamp(1.4rem, 1.1rem + 1.3vw, 2rem);
  letter-spacing: -.02em; color: var(--gris-fonce);
}
.pk-venir-attente b { color: var(--rouge); }
.pk-venir-actions { display: flex; flex-wrap: wrap; gap: 14px; }
/* Le bouton d'IP est ici un .dl-btn : le retour de copie doit se placer
   par-dessus lui, pas décaler le texte du bouton. */
.pk-venir-actions .dl-btn { position: relative; }

@media (max-width: 640px) {
  .pk-venir { padding-top: 64px; padding-bottom: 72px; }
  .pk-venir-warp { padding-right: 0; }
  .pk-venir-bas { flex-direction: column; align-items: flex-start; gap: 20px; }
}


/* Sous-titre et note de bas de section, page conditions. */
.cg-sous {
  font-family: 'Poppins', sans-serif; font-weight: 600; font-size: 12px;
  letter-spacing: .14em; text-transform: uppercase; color: var(--sourdine);
  margin: 22px 0 10px;
}
.cg-corps article > .cg-sous:first-of-type { margin-top: 18px; }
.cg-note {
  font-size: 14px; color: var(--sourdine); line-height: 1.7;
  padding-left: 14px; border-left: 2px solid var(--filet); margin-top: 22px;
}


/* L'issue de secours du formulaire projet : envoyer sans liens, puis déposer
   les captures sur le Discord. Encadrée pour qu'on la voie sans qu'elle
   concurrence le champ juste au-dessus. */
.ps-aide-encart {
  background: var(--gris-clair); border-left: 3px solid var(--vert);
  padding: 14px 18px; line-height: 1.7; margin-top: 4px;
}
.ps-aide-encart a { color: var(--rouge); text-decoration: underline; text-underline-offset: 3px; }

/* ==========================================================================
   MODE SOMBRE  —  :root[data-theme="dark"]
   Rétrofit : le thème clair (validé) n'est PAS touché. On bascule les tokens
   partagés, puis on surcharge UNIQUEMENT les littéraux (#fff surfaces, #000
   textes, filets clairs, voiles blancs). Le rouge, le vert et le jaune restent
   des accents — ils tranchent aussi bien sur charbon que sur blanc.
   Charbon chaud (#14 → #26) pour faire écho au #292929 de la charte.
   ========================================================================== */
:root[data-theme="dark"] {
  color-scheme: dark;
  /* Tokens partagés : tout ce qui passe par var(--…) bascule d'un coup. */
  --blanc: #141416;          /* fond de page */
  --gris-clair: #1d1d20;     /* surface secondaire, fonds de code, pistes */
  --gris-fonce: #f2f1ef;     /* titres */
  --gris-texte: #dcdbd9;     /* texte courant fort */
  --sourdine: #9a9a9e;       /* métadonnées */
  --filet: rgba(255, 255, 255, .14);
  /* Neutres propres au sombre, réutilisés par les surcharges ci-dessous. */
  --d-surf2: #1c1c1f;        /* cartes/panneaux posés sur la page */
  --d-surf3: #242429;        /* cartes posées sur un panneau, champs, pilules */
  --d-hover: #26262b;        /* survols (ex-#fafafa / #fbfbfb) */
  --d-corps: #a9a8a5;        /* ex-#6b6b6b : prose secondaire */
  --d-corps2: #c3c2bf;       /* ex-#333 : prose sur fonds clairs */
  --d-sep: rgba(255, 255, 255, .16);
  --d-rouge-doux: #2a1f20;   /* ex-#fff0f0 : survol des pilules rouges */
  /* Les memes valeurs, mais portees par les tokens partages : les surcharges
     ci-dessous qui ne servaient qu'a ca deviennent redondantes, pas fausses. */
  --corps: #a9a8a5;
  --corps-fort: #c3c2bf;
  --rouge-doux: #2a1f20;
}

/* ---------- Header, nav, pilules ---------- */
:root[data-theme="dark"] .nav-menu > li > a { color: var(--gris-fonce); }
:root[data-theme="dark"] .header-pill { box-shadow: 0 6px 24px rgba(0, 0, 0, .5); }
:root[data-theme="dark"] .ip-text,
:root[data-theme="dark"] .immersion,
:root[data-theme="dark"] .ct-ip-copie { background-color: var(--d-surf3); }
:root[data-theme="dark"] .ip-text:hover,
:root[data-theme="dark"] .immersion:hover,
:root[data-theme="dark"] .ct-ip-copie:hover { background-color: var(--d-rouge-doux); }

/* ---------- Grandes surfaces à fond blanc littéral ---------- */
/* Le footer porte son propre background:#fff : sans ça, il resterait blanc
   sur toutes les pages. Il épouse la page, comme en clair (#fff = #fff). */
:root[data-theme="dark"] .site-footer { background: var(--blanc); }
/* La ville du don se fond en bas dans un dégradé blanc → charbon, sinon bande
   blanche + titre blanc illisible par-dessus. */
:root[data-theme="dark"] .dn-hero::after {
  background: linear-gradient(to top, #141416 0%, rgba(20, 20, 22, 0) 46%);
}
/* Piste non remplie du curseur d'immersion (ex-#e6e4e2). */
:root[data-theme="dark"] .immersion-range::-webkit-slider-runnable-track,
:root[data-theme="dark"] .immersion-range::-moz-range-track {
  background: linear-gradient(90deg, var(--rouge-charte) var(--fill, 0%), #38383c var(--fill, 0%));
}

/* ---------- Surfaces : cartes & panneaux (ex-#fff / #f1f1f1 / #f3f3f3) ---------- */
:root[data-theme="dark"] .carte,
:root[data-theme="dark"] .membre,
:root[data-theme="dark"] .typo,
:root[data-theme="dark"] .cmd,
:root[data-theme="dark"] .couleur .info,
:root[data-theme="dark"] .galerie figcaption,
:root[data-theme="dark"] .galerie figure,
:root[data-theme="dark"] .faq-panel,
:root[data-theme="dark"] .ng-panneau,
:root[data-theme="dark"] .panneau-gris,
:root[data-theme="dark"] .timeline-card { background: var(--d-surf2); }
:root[data-theme="dark"] .carte,
:root[data-theme="dark"] .membre,
:root[data-theme="dark"] .typo { border-color: var(--filet); }

/* Cartes blanches POSÉES sur un panneau : un cran plus clair pour l'étage. */
:root[data-theme="dark"] .faq details,
:root[data-theme="dark"] .ng-jugement { background: var(--d-surf3); }

/* ---------- Boutons/pilules à fond blanc, champs ---------- */
:root[data-theme="dark"] .btn-outline,
:root[data-theme="dark"] .filtres button,
:root[data-theme="dark"] .onglets button,
:root[data-theme="dark"] .dl-filtres button,
:root[data-theme="dark"] .gx1-vue[aria-pressed="true"] { background: var(--d-surf3); }
:root[data-theme="dark"] .btn-outline:hover { background: var(--rouge); }
:root[data-theme="dark"] .badge--gris { background: var(--d-surf3); color: var(--gris-texte); }
:root[data-theme="dark"] .cmd .usage { background: var(--gris-clair); color: var(--d-corps2); }

/* ---------- Survols de tuiles (ex-#fafafa) ---------- */
:root[data-theme="dark"] .ct-tuile:hover { background: var(--d-hover); }

/* ---------- Textes forts (ex-#000 / #222 / #1d1d1d) → clair ---------- */
:root[data-theme="dark"] .footer-col h2,
:root[data-theme="dark"] .faq-panel .section-title,
:root[data-theme="dark"] .titre-souligne,
:root[data-theme="dark"] .faq summary { color: var(--gris-fonce); }
:root[data-theme="dark"] .disclaimer-box p,
:root[data-theme="dark"] .footer-marque .credit { color: var(--gris-texte); }
:root[data-theme="dark"] .disclaimer-box { border-color: var(--d-sep); }

/* ---------- Prose (ex-#6b6b6b / #6a6560) ---------- */
:root[data-theme="dark"] .section-sub,
:root[data-theme="dark"] .page-header p,
:root[data-theme="dark"] .carte p,
:root[data-theme="dark"] .grade > p,
:root[data-theme="dark"] .ct-chapo,
:root[data-theme="dark"] .ct-faq .ct-reponse,
:root[data-theme="dark"] .cc-bloc > div > p,
:root[data-theme="dark"] .cc-desc,
:root[data-theme="dark"] .dn-duo p,
:root[data-theme="dark"] .dl-chapo,
:root[data-theme="dark"] .mb-chapo,
:root[data-theme="dark"] .a-bar p,
:root[data-theme="dark"] .hg-sub,
:root[data-theme="dark"] .ng-chapo,
:root[data-theme="dark"] .ng-tete p,
:root[data-theme="dark"] .ng-garde-liste li,
:root[data-theme="dark"] .ng-jugement li,
:root[data-theme="dark"] .gx-chapo,
:root[data-theme="dark"] .section-intro { color: var(--d-corps); }

/* ---------- Prose sur fonds clairs (ex-#333 / #555 / #5c5c5c) ---------- */
:root[data-theme="dark"] .timeline-card p,
:root[data-theme="dark"] .footer-col p,
:root[data-theme="dark"] .footer-col li,
:root[data-theme="dark"] .footer-col a,
:root[data-theme="dark"] .footer-marque > p,
:root[data-theme="dark"] .figure-joueur span,
:root[data-theme="dark"] .subtitle,
:root[data-theme="dark"] .faq .reponse { color: var(--d-corps2); }
:root[data-theme="dark"] .faq summary::after { color: var(--sourdine); }

/* ---------- Bordures littérales (ex-#ececec / #e0e0e0) ---------- */
:root[data-theme="dark"] .carte,
:root[data-theme="dark"] .membre,
:root[data-theme="dark"] .typo,
:root[data-theme="dark"] .filtres button,
:root[data-theme="dark"] .onglets button,
:root[data-theme="dark"] .cmd { border-color: var(--filet); }
:root[data-theme="dark"] .dl-grille .dl-item:hover { border-color: rgba(255, 255, 255, .24); }

/* ---------- Hero d'accueil : voiles blancs → charbon ---------- */
:root[data-theme="dark"] .minecraft-hero { background-color: var(--blanc); color: var(--gris-texte); }
:root[data-theme="dark"] .pioche-sourdine {
  background: radial-gradient(52% 44% at 50% 46%, rgba(20, 20, 22, .86) 24%, rgba(20, 20, 22, .1) 100%);
}
:root[data-theme="dark"] .pioche-bloc { border-color: rgba(255, 255, 255, .6); }
:root[data-theme="dark"] .cylindre-brume {
  background: linear-gradient(180deg, transparent, rgba(20, 20, 22, .92));
}
:root[data-theme="dark"] .cylindre-anneau figure { background: #2a2a2e; }
:root[data-theme="dark"] .fusion-voile {
  background: linear-gradient(180deg, #141416 6%, rgba(20, 20, 22, .92) 30%, rgba(20, 20, 22, .55) 52%, rgba(20, 20, 22, .06) 78%, transparent 100%);
}
/* .hero-fusion::after et .gx3-texte mobile utilisent var(--blanc) → auto. */
:root[data-theme="dark"] .hg-ghost {
  background: rgba(255, 255, 255, .06);
  border-color: rgba(255, 255, 255, .18); color: var(--gris-fonce);
}
:root[data-theme="dark"] .hg-veil {
  background: radial-gradient(80% 60% at 50% 50%, rgba(20, 20, 22, .75) 20%, transparent 100%);
}

/* ---------- Charte : les démos de logo gardent leur fond RÉEL ---------- */
/* (la page montre le logo « sur blanc » / « sur gris clair » : on ne bascule
   pas ces surfaces, sinon la démonstration ne veut plus rien dire.) */
:root[data-theme="dark"] .ng-logo-vue--blanc { background: #fff; }
:root[data-theme="dark"] .ng-logo-vue--gris { background: #f3f3f3; }

/* ---------- Galerie : toile (trames noires → blanches), fiche ---------- */
:root[data-theme="dark"] .gx2-trame {
  background-image:
    linear-gradient(rgba(255, 255, 255, .05) 1px, transparent 1px),
    linear-gradient(90deg, rgba(255, 255, 255, .05) 1px, transparent 1px);
}
:root[data-theme="dark"] .gx2-vide { border-color: rgba(255, 255, 255, .18); background: rgba(255, 255, 255, .02); }
:root[data-theme="dark"] .gx2-vide span { color: rgba(255, 255, 255, .28); }
:root[data-theme="dark"] .gx2-plan-pt { background: rgba(255, 255, 255, .34); }
:root[data-theme="dark"] .gx2-plan-pt.vide { background: rgba(255, 255, 255, .12); }
:root[data-theme="dark"] .gx3-barre { background: rgba(255, 255, 255, .16); }
:root[data-theme="dark"] .gx3-barre.jouee { background: rgba(255, 255, 255, .34); }
:root[data-theme="dark"] .gx3-voile {
  background: linear-gradient(90deg,
    rgba(20, 20, 22, .98) 0%, rgba(20, 20, 22, .96) 38%,
    rgba(20, 20, 22, .78) 64%, rgba(20, 20, 22, 0) 100%);
}
:root[data-theme="dark"] .gx-fiche { background: rgba(18, 18, 20, .97); }
:root[data-theme="dark"] .gx-faits .vide { color: #6b6b70; }

/* ---------- Notre histoire : la page est 100 % tokens — il ne reste que
   la prose grise littérale (#6b6b6b) à éclaircir, comme partout ailleurs. */
:root[data-theme="dark"] .hi-chapo,
:root[data-theme="dark"] .hi-tirage figcaption,
:root[data-theme="dark"] .hi-logo-vue figcaption span { color: var(--d-corps); }

/* ---------- Resource Pack : la page est écrite en tokens, le sombre suit
   tout seul. Ne restent que les littéraux posés SUR les textures (voiles
   noirs, liserés de pastilles) qui doivent s'inverser. */
:root[data-theme="dark"] .pk-co i,
:root[data-theme="dark"] .pk-f-pastille { box-shadow: inset 0 0 0 1px rgba(255, 255, 255, .22); }
:root[data-theme="dark"] .pk-fiche { background: rgba(8, 8, 10, .86); }
:root[data-theme="dark"] .pk-c-tag-doux { background: rgba(0, 0, 0, .7); }
/* Les vignettes sont des photos de matière : en sombre, un blanc pur brûle
   l'œil. On les pose très légèrement en retrait, comme les autres images. */
:root[data-theme="dark"] .pk-c-vis img,
:root[data-theme="dark"] .pk-f-vis img,
:root[data-theme="dark"] .pk-p-bloc img { filter: brightness(.92); }

/* Les rendus 3D sont détourés : en sombre, un objet noir posé sur la surface
   habituelle (#1d1d20) devient invisible. Leur tuile prend donc un gris
   franchement plus clair, qui laisse lire aussi bien un objet noir qu'un
   objet blanc. Et on ne les assombrit pas comme les textures. */
:root[data-theme="dark"] .pk-m-vis { background: #2f2f36; }
:root[data-theme="dark"] .pk-m:hover .pk-m-vis { background: #383840; }
:root[data-theme="dark"] .pk-fiche-3d .pk-f-vis,
:root[data-theme="dark"] .pk-fiche-3d .pk-f-a img { background: #2f2f36; }
:root[data-theme="dark"] .pk-m-vis img,
:root[data-theme="dark"] .pk-fiche-3d .pk-f-vis img { filter: none; }

/* ---------- Projets, fiches et soumission ----------
   Les héros sont déjà du texte blanc sur photo assombrie : ils ne bougent
   pas d'un thème à l'autre. Ne sont repris ici que les littéraux du corps
   de page — surfaces blanches, aplats gris clair, pilules pressées. */
:root[data-theme="dark"] .pj-corps,
:root[data-theme="dark"] .pf-section,
:root[data-theme="dark"] .pf-absent,
:root[data-theme="dark"] .ps-page,
:root[data-theme="dark"] .ps-merci { background: var(--blanc); }


/* La pilule pressée était #fff sur charbon : illisible. On inverse. */
:root[data-theme="dark"] .pj-f-boutons button[aria-pressed="true"] {
  background: var(--gris-fonce); border-color: var(--gris-fonce); color: #14141a;
}
:root[data-theme="dark"] .pj-f-boutons button[aria-pressed="true"] span { color: rgba(20,20,26,.62); }

:root[data-theme="dark"] .pj-c-vue,
:root[data-theme="dark"] .pf-voisin-vue { background: var(--d-surf2); }
/* L'étiquette de catégorie est posée sur la photo : elle reste claire, mais
   moins crue que le blanc pur du thème clair. */
:root[data-theme="dark"] .pj-c-cat { background: rgba(28,28,31,.92); color: var(--gris-fonce); }

:root[data-theme="dark"] .pf-manque,
:root[data-theme="dark"] .pf-warp,
:root[data-theme="dark"] .ps-secours { background: var(--d-surf2); }
:root[data-theme="dark"] .pf-manque { border-color: var(--d-sep); }
:root[data-theme="dark"] .pf-warp-btn { background: var(--d-surf3); }
:root[data-theme="dark"] .pf-warp-btn code { color: var(--gris-fonce); }

:root[data-theme="dark"] .pf-stat { background: var(--d-surf2); border-color: var(--d-sep); }
:root[data-theme="dark"] .pf-plan img { background: var(--d-surf2); border-color: var(--d-sep); }

:root[data-theme="dark"] .pj-jeton, :root[data-theme="dark"] .pf-gens-skin { background: var(--d-surf3); }
:root[data-theme="dark"] .pj-jeton-vide, :root[data-theme="dark"] .pf-gens-vide {
  background: var(--d-surf3); color: var(--gris-fonce);
}

:root[data-theme="dark"] .ps-champ input[type="text"],
:root[data-theme="dark"] .ps-champ input[type="url"],
:root[data-theme="dark"] .ps-champ textarea,
:root[data-theme="dark"] .ps-champ select { background: var(--d-surf3); border-color: var(--d-sep); }
:root[data-theme="dark"] .ps-champ input[type="file"] {
  background: var(--d-surf2); border-color: var(--d-sep);
}
:root[data-theme="dark"] .ps-champ input::placeholder,
:root[data-theme="dark"] .ps-champ textarea::placeholder { color: #6a6a70; }
:root[data-theme="dark"] .ps-legend span { color: #fff; }

/* ---------- Carte du serveur ---------- */
:root[data-theme="dark"] .ca-corps,
:root[data-theme="dark"] .ca-lieux { background: var(--blanc); }
:root[data-theme="dark"] .ca-cadre { background: var(--d-surf2); border-color: var(--d-sep); }
:root[data-theme="dark"] .ca-lieu { background: var(--d-surf2); border-color: var(--d-sep); }
:root[data-theme="dark"] .ca-warp { background: var(--d-surf3); border-color: var(--d-sep); }
:root[data-theme="dark"] .ca-warp code { color: var(--gris-fonce); }
:root[data-theme="dark"] .ca-vide { border-color: var(--d-sep); }
:root[data-theme="dark"] .ca-avert { background: var(--d-rouge-doux); border-color: rgba(219,53,53,.4); }
