/* ============================================================================
   HOMIES — SAISON 2 · LA COLLE DES 15 ÉCRANS INTERNES (vague 3)
   ----------------------------------------------------------------------------
   Mêmes principes que saison2-app.css (vague 1) : `saison2-socle.css` porte
   TOUT le dessin (il est généré, on n'y touche pas). Ce fichier ne dessine
   rien : il fait entrer un écran `.s2` dans le shell de la PWA, et il désarme
   les quelques endroits où une feuille plus ancienne (app.css, atelier.css,
   saison2.css, profil.css…) contredit le socle.

   Les 15 écrans se rangent en deux familles :
     · les écrans de `main.home-wrap` — ils portent `data-s2-interne` ;
       HUB, RANGS, SAISON, HISTORIQUE, POTES, PROFIL, BOUTIQUE, MES QUIZ,
       ATELIER (étape 1), LIVE OPS ;
     · les écrans plein cadre, déjà `position:fixed; inset:0` dans leur propre
       feuille — SOLO, RAFALE, MAQUIS, L'ÉVEIL, JPO. Là, `data-s2` se pose sur
       leur « stage », qui est déjà positionné.

   Il ne touche ni proto.css, ni brutal.css, ni app.css, ni saison2-socle.css,
   ni les colles saison2-{app,host,play,entree}.css.
   Mobile d'abord : tout ce qui suit est la base téléphone.
   ============================================================================ */

/* ── 1. UN ÉCRAN INTERNE OCCUPE TOUT LE CADRE ───────────────────────────────
   `.s2` est `position:absolute; inset:0` : son conteneur doit donc être
   positionné ET avoir la taille du cadre. `.sec` d'app.css pose un
   max-width:780px, un margin auto et un padding : on les enlève ici.
   L'écran interne porte sa PROPRE barre du haut (retour + titre) : la
   `.topbar` de l'app ferait doublon, et la barre du bas n'existe pas dans les
   maquettes de ces écrans — on revient par la flèche. */
.sec[data-s2-interne] {
  position: absolute; inset: 0;
  max-width: none; margin: 0; padding: 0;
}
main.home-wrap:has(> .sec.active[data-s2-interne]) {
  position: relative; overflow: hidden; padding-bottom: 0;
}
body:has(.sec.active[data-s2-interne]) .topbar,
body:has(.sec.active[data-s2-interne]) .bottom-nav { display: none; }

/* ── 2. LES NOMS DE CLASSE DÉJÀ PRIS ────────────────────────────────────────
   `.s2-ttl` (saison2.css), `.s2-card` et `.s2-tick` (atelier.css) sont définis
   en GLOBAL par des feuilles chargées avant le socle, qui les neutralise déjà
   sous `[data-s2]`.
   Il y en a un QUATRIÈME, que la vague 1 n'avait pas rencontré :
   `.s2-bar` — atelier.css en fait une jauge de progression
   (`height:19px; border; background; overflow:hidden`). Le socle s'en sert
   pour la barre du haut de TOUS les écrans internes : sans ce désarmement,
   la barre était haute de 19 px et son contenu débordait par-dessus.
   `[data-s2] .s2-bar` (0,2,0) du socle ne battait pas `.s2-bar` (0,1,0) sur
   les propriétés qu'il ne redit pas — on les remet ici à leur valeur neutre.

   LA LISTE COMPLÈTE, relevée dans atelier.css (seule feuille de l'app à
   définir des `.s2-*` en global, et chargée AVANT le socle) :
     .s2-bar   → une jauge de 19 px (la barre du haut des écrans internes) ;
     .s2-h     → l'entête d'un écran atelier (nos lignes d'historique) ;
     .s2-card  → un cadre complet posé sur la RACINE (double encadré) ;
     .s2-tick  → une coche en deux barres (pavé noir sur la coche du socle) ;
     .s2-chip, .s2-mini, .s2-grid2, .s2-ttl → même famille.
   Le désarmement se fait dans un `:where([data-s2])` : sa spécificité reste
   celle de la classe seule (0,1,0), donc il BAT atelier.css (chargé avant) et
   PERD contre le socle (`[data-s2] .s2-xxx`, 0,2,0). Autrement dit : le socle
   garde la main partout, et seules les propriétés qu'il ne dit pas
   retournent à zéro. */
:where([data-s2]) .s2-bar { height: auto; border: 0; background: none; overflow: visible; position: static; }
:where([data-s2]) .s2-h { display: block; align-items: normal; gap: normal; padding: 0; }
:where([data-s2]) .s2-ttl { font-family: inherit; font-size: inherit; letter-spacing: inherit; color: inherit; }
:where([data-s2]) .s2-card { border: 0; background: none; box-shadow: none; padding: 0; color: inherit; }
:where([data-s2]) .s2-tick { width: auto; height: auto; border: 0; background: none; flex: 0 0 auto; }
:where([data-s2]) .s2-chip { display: inline-flex; border: 0; background: none; box-shadow: none;
  padding: 0; font-family: inherit; font-size: inherit; letter-spacing: inherit; color: inherit; white-space: normal; }
:where([data-s2]) .s2-mini { font-family: inherit; font-size: inherit; font-weight: inherit;
  border: 0; padding: 0; background: none; color: inherit; }
:where([data-s2]) .s2-grid2 { display: flex; grid-template-columns: none; gap: normal; }

/* ── 2 bis. HUB : la grille d'app.css ne dessine plus rien ──────────────────
   `.hub-grid` est le conteneur qui porte, depuis toujours, la délégation de
   clic `[data-game]` d'app.js. On la garde dans le markup pour ne rien casser,
   mais `display:contents` la retire de la mise en page : les portes de jeu
   deviennent les enfants directs de `.s2-scroll` et prennent son `gap`. */
[data-s2] .s2 .hub-grid { display: contents; }

/* ── 2 ter. LA COCHE D'atelier.css ──────────────────────────────────────────
   Le socle neutralise `.s2-tick::after` mais pas `::before` : atelier.css
   dessine sa coche en DEUX barres, et celle du bas s'ajoutait à la coche
   tracée du socle — un pavé noir à la place. */
[data-s2] .s2 .s2-tick::before { content: none; }
/* …et son `::after` peint une BARRE NOIRE pleine. Le socle y redessine la
   coche en bordures, mais ne dit rien du fond : les deux se superposaient et
   donnaient un losange plein. Même règle à spécificité de classe. */
:where([data-s2]) .s2-tick::after { background: none; }

/* ── 2 quater. LES LISTES RENDUES DANS UN CONTENEUR INTERMÉDIAIRE ───────────
   `.s2-scroll` porte son `gap`, mais les écrans qui peignent leur liste dans
   un <div> (l'échelle des rangs, l'historique, les potes, la boutique) en
   sortent : ce <div> est un seul enfant. On lui rend la colonne. */
[data-s2] .s2 :is(#rk-ladder, #histo-list, #socialList, #sznTiers, #sznDefis,
  #atLists, #lo-rooms, .shop, .s2-liste) {
  display: flex; flex-direction: column; gap: var(--s2-r); min-width: 0;
}
/* …et le RYTHME s'y applique comme dans `.s2-scroll` : l'écart vu est le même
   partout (les tokens sont définis une seule fois, dans saison2-socle.css ›
   LE RYTHME VERTICAL). Un bloc qui porte une ombre dure la réserve, sinon elle
   mange l'écart ; un bloc vide sort de la colonne. */
[data-s2] .s2 :is(#rk-ladder, #histo-list, #socialList, #sznTiers, #sznDefis,
  #atLists, #lo-rooms, .shop, .s2-liste) > :is(.card, .listcard, .s2-ink, .lbrow,
  .s2-grid2, .s2-grid3) { margin-bottom: var(--sh); }
[data-s2] .s2 :is(#rk-ladder, #histo-list, #socialList, #sznTiers, #sznDefis,
  #atLists, #lo-rooms, .shop, .s2-liste) > :is(.ln, .seg, .statcard, .s2-md) { margin-bottom: 3px; }
[data-s2] .s2 :is(#rk-ladder, #histo-list, #socialList, #sznTiers, #sznDefis,
  #atLists, #lo-rooms, .shop, .s2-liste) > :is(.s2-div, .eyebrow, .s2-head, .s2-sub) { margin-bottom: 0; }
[data-s2] .s2 :is(#rk-ladder, #histo-list, #socialList, #sznTiers, #sznDefis,
  #atLists, #lo-rooms, .shop, .s2-liste) > :empty:not(.sp) { display: none; }

/* `credits.css` (l'ANCIENNE boutique) écrit `#sec-credits .shop { padding:14px
   16px 8px }` : la vitrine rentrait de 16 px de plus à l'intérieur d'un `.s2`
   qui a déjà son gouttière, et les tuiles étaient plus étroites que la barre du
   haut. On remet à plat. */
#sec-credits[data-s2] .shop { padding: 0; }

/* ── 2 quinquies. POTES : le padding de l'ancien écran ─────────────────────
   app.css cale la liste et la barre d'ajout par `#sec-potes …` (0,2,0) : elles
   se retrouvaient décalées de 16 px à l'intérieur d'un `.s2` qui a déjà le
   sien. On les remet à plat. */
#sec-potes[data-s2] #socialList { padding: 0; }

/* ── 3. LE `hidden` DES COMPOSANTS DE PROTO ─────────────────────────────────
   `.pill`, `.card`, `.btn`, `.seg`, `.listcard` posent un `display` : il bat
   le `[hidden]` de l'agent utilisateur, et un bloc masqué restait affiché. */
[data-s2-interne] [hidden], [data-s2] .s2 [hidden] { display: none !important; }

/* ── 4. CE QUI EST CLIQUABLE, ET LES LIENS ──────────────────────────────────
   Les composants de proto sont des <span> ; dans l'app ils portent une action.
   On leur rend le doigt, jamais l'allure. */
[data-s2-interne] [role="button"], [data-s2] .s2 [role="button"] { cursor: pointer; -webkit-tap-highlight-color: transparent; }
[data-s2-interne] a, [data-s2] .s2 a { text-decoration: none; color: inherit; }

/* Les maquettes composent avec des <span> ; l'app a besoin de vrais <button>
   (clavier, lecteur d'écran, `disabled`). Ce reset leur retire l'habillage du
   NAVIGATEUR sans jamais toucher à celui de proto : il est écrit dans un
   `:where(...)` complet, donc sa spécificité est ZÉRO — il bat la feuille de
   l'agent utilisateur et perd contre la moindre classe (`.btn`, `.iconbtn`,
   `.cta`, `.s2-ok`…). C'est ce qui manquait au premier essai : à (0,3,0) il
   écrasait `.btn` et les boutons devenaient du texte nu. */
:where([data-s2] .s2 button, [data-s2-interne] button) {
  appearance: none; -webkit-appearance: none;
  background: none; border: 0; padding: 0; margin: 0;
  font: inherit; color: inherit; text-align: inherit;
  cursor: pointer; -webkit-tap-highlight-color: transparent;
}

/* les champs de saisie de l'app posés dans un écran s2 (POTES, ATELIER) */
[data-s2] .s2 input.s2-inp {
  flex: 1; min-width: 0; appearance: none; -webkit-appearance: none;
  border: var(--bd) solid var(--ink); background: var(--paper); color: var(--ink);
  box-shadow: 3px 3px 0 var(--ink); padding: 10px 12px;
  font-family: var(--font-m); font-weight: 700; font-size: 12px; letter-spacing: .4px;
}
[data-s2] .s2 input.s2-inp::placeholder { color: color-mix(in srgb, var(--ink) 45%, transparent); }

/* ── 5. L'AVATAR ÉQUIPÉ DANS UN AVATAR DE PROTO ─────────────────────────────
   QZ.framedAvatar() rend `.ava-fr > .ava-emo`, et `.ava-emo` porte SON propre
   bord de 3 px (brutal.css). Posé dans le `.avatar` de proto, qui a déjà le
   sien, ça faisait un double cadre. Même correctif que la vague 1. */
[data-s2] .s2 :is(.avatar, .avatar-lv) > :is(.ava-emo, .ava-fr) {
  width: 100%; height: 100%; border: 0; box-shadow: none;
}
[data-s2] .s2 .ava-fr > .ava-emo { border: 0; }
[data-s2] .s2 .avatar img { width: 100%; height: 100%; object-fit: cover; display: block; }

/* ── 6. LES DRAPEAUX ────────────────────────────────────────────────────────
   AVATARS.flagHtml rend une <img class="flag"> : on la cale sur la `.s2-flag`
   des maquettes plutôt que de créer une classe de plus. */
[data-s2] .s2 .s2-flag img, [data-s2] .s2 img.flag {
  width: 19px; height: 13px; object-fit: cover; display: inline-block;
  border: 2px solid var(--ink); vertical-align: -2px;
}

/* ── 7. LES ÉCRANS PLEIN CADRE (SOLO, RAFALE, MAQUIS, L'ÉVEIL, JPO) ─────────
   Leur `.sec` est déjà `position:fixed; inset:0; z-index:2000` dans sa propre
   feuille, et leur « stage » est `position:absolute; inset:0`. `data-s2` se
   pose sur le stage : il ne reste qu'à lui rendre une couleur de fond neutre
   (le `.s2` la repeint) et à retirer le padding que la feuille d'origine
   posait pour son ancien contenu. */
#soloStage[data-s2], #rfStage[data-s2], #mqStage[data-s2],
#eveilStage[data-s2], #jpoStage[data-s2] { padding: 0; display: block; }
/* la barre du haut de ces écrans descend sous l'encoche */
[data-s2] .s2.s2-plein { padding-top: calc(18px + env(safe-area-inset-top)); }
/* le bouton ✕ que ces écrans posent EN DEHORS du stage passe au-dessus */
#sec-rafale .rf-close, #sec-jpo .jpo-close { z-index: 5; }

/* ── 8. PROFIL : la cover de l'app dans la carte `.s2-cov` ──────────────────
   profil.css habille `#pfCoverImg` pour l'ancien hero plein écran (hauteur,
   position absolue, dégradé). Dans la maquette, c'est l'image d'une carte,
   haute de 100 px : le socle le dit déjà, on se contente d'annuler ce que
   profil.css ajoutait par-dessus. */
#sec-profil[data-s2] #pfCoverImg { position: static; inset: auto; width: 100%; }

/* ── 8 bis. LES STATCARD VIVES EN PEAU SOMBRE ──────────────────────────────
   brutal.css (chantier dark-mode) éteint TOUTES les `.statcard` en ABÎME :
   `background:var(--paper) !important`. C'est le bon choix pour l'ancien
   profil, dont le texte suit `--ink` — mais pas ici : les maquettes 16 et 25
   gardent les trois premiers aplats vifs (jaune, vert, cyan) et y mettent
   l'encre NOIRE, en clair comme en NÉON. Même arbitrage que la vague 1 sur
   l'onglet STATS. Le `!important` n'est pas un raccourci : c'est la seule
   façon de repasser devant un `!important`. */
html[data-theme="abime"] #sec-profil[data-s2] .statcard.a,
html[data-theme="abime"] #sec-liveops[data-s2] .statcard.a { background: var(--yellow) !important; }
html[data-theme="abime"] #sec-profil[data-s2] .statcard.b,
html[data-theme="abime"] #sec-liveops[data-s2] .statcard.b { background: var(--green) !important; }
html[data-theme="abime"] #sec-profil[data-s2] .statcard.c,
html[data-theme="abime"] #sec-liveops[data-s2] .statcard.c { background: var(--cyan) !important; }
html[data-theme="abime"] :is(#sec-profil, #sec-liveops)[data-s2]
  :is(.statcard.a, .statcard.b, .statcard.c) :is(.v, .l) { color: #0A0A0A !important; }

/* ── 9. BOUTIQUE : la vignette d'un article ─────────────────────────────────
   Les aperçus viennent de l'app (image, cadre, couleur de pseudo, titre,
   émotes) ; la maquette leur donne un cadre carré qui ne bouge pas. */
[data-s2] .s2 .s2-item .s2-pv {
  display: flex; align-items: center; justify-content: center;
  width: 100%; aspect-ratio: 1 / 1; overflow: hidden; background: var(--gray2);
}
[data-s2] .s2 .s2-item .s2-pv img { width: 100%; height: 100%; object-fit: cover; display: block; }
[data-s2] .s2 .s2-item .s2-pv .ava-fr { width: 64%; height: 64%; }

/* ── 10. LIVE OPS : la salle qu'on déplie ───────────────────────────────────
   Le détail n'apparaît qu'une fois la carte ouverte ; la chevron tourne. */
[data-s2] .s2 .s2-room:not(.on) .det { display: none; }
[data-s2] .s2 .s2-room.on .s2-chev { transform: rotate(90deg); }

/* ── 10 bis. RAFALE : le moteur garde sa mécanique, la peau vient du socle ──
   rafale.css pose sa carte en `position:absolute; inset:0` et, surtout, un
   `color:var(--paper)` hérité de l'ancien fond sombre : dans un écran clair,
   l'énoncé devenait crème sur crème — invisible. On remet la carte dans le
   flux du `.s2`, on lui rend l'encre, et on efface les paddings de l'ancienne
   mise en page. Le ✕ de la section fait doublon avec le ‹ de la barre. */
#rfStage[data-s2] .rf-card { position: static; inset: auto; flex: 1; min-height: 0; color: var(--ink); }
#rfStage[data-s2] .rf-body { padding: 0; gap: 10px; }
#rfStage[data-s2] .rf-ans { gap: 9px; }
#sec-rafale:has(#rfStage[data-s2]) .rf-close { display: none; }

/* ── 10 ter. L'ÉVEIL : la porte du donjon (maquette 23) ─────────────────────
   eveil.css repeint TOUTE la section pour son immersion : `--ink` devient un
   bleu très clair, et deux calques (`::before` scanlines en `screen`,
   `::after` vignette) passent par-dessus. Sur un écran `.s2` cela délavait
   tout — bords pâles, texte fantôme. La maquette 23 est un écran CLAIR sur
   lequel les blocs SYSTEM (navy + cyan) sont posés : on lui rend ses deux
   jetons et on coupe les calques, uniquement quand la porte est à l'écran.
   Le reste de l'event (splash, gate, épreuves) garde son immersion entière. */
#sec-eveil:has(#eveilStage[data-s2])::before,
#sec-eveil:has(#eveilStage[data-s2])::after { display: none; }
#eveilStage[data-s2] {
  --paper: #FFFEF7; --ink: #0A0A0A;
  --mut: color-mix(in srgb, #0A0A0A 62%, transparent);
  color: #0A0A0A;
}
/* `.sec` (app.css) garde son padding et son max-width même quand eveil.css
   passe la section en plein écran : l'écran s2 se retrouvait encadré de noir. */
#sec-eveil:has(#eveilStage[data-s2]) { padding: 0; max-width: none; margin: 0; }

/* Le socle définit `.s2-pod` DEUX fois : une tuile de butin (§3b) puis, plus
   bas, le podium en grille d'un autre écran — et c'est la seconde qui gagne.
   Résultat, dans la maquette comme dans l'app : la tuile de butin se tasse
   dans un tiers de sa carte, le reste vire au noir. On rend sa colonne à la
   tuile, et à elle seule (le podium, lui, n'est jamais un `.s2-item`). */
[data-s2] .s2-item.s2-pod { display: block; grid-template-columns: none; }

/* ── 10 quater. JPO : le champ de code posé sur ses cases ───────────────────
   La maquette dessine le code en cases (`.s2-code i`). L'app a besoin d'un
   vrai <input> (clavier du téléphone, collage, accessibilité) : on le pose
   par-dessus les cases, invisible, et les cases recopient ce qui est tapé. */
/* jpo.css peint TOUT le stage en bleu EPITECH avec une encre blanche : dans
   un écran `.s2` clair, la moitié des titres devenait invisible. On rend au
   stage l'encre et le fond de la maquette 24 — le reste du parcours JPO
   (glitch, splash, hub arcade) garde son bleu plein. */
#jpoStage[data-s2] { background: var(--paper); color: #0A0A0A; }

[data-s2] .s2-cf { position: relative; flex-shrink: 0; }
[data-s2] .s2-cf input {
  position: absolute; inset: 0; width: 100%; height: 100%;
  opacity: 0; border: 0; background: none; font: inherit;
  letter-spacing: 1em; text-align: center; caret-color: transparent;
}
#sec-jpo:has(#jpoStage[data-s2]) .jpo-close { display: none; }

/* ── 11. MAQUIS / SOLO / RAFALE : le moteur garde son écran de jeu ──────────
   Seule la vue d'AVANT-PARTIE (celle des maquettes 20 et 22) est en saison 2.
   Dès que le moteur peint sa table, il retire `data-s2` du stage et reprend
   la main : rien de ce fichier ne peut alors l'atteindre. Cette règle ne fait
   que garantir que le stage revient à zéro. */
#mqStage:not([data-s2]), #soloStage:not([data-s2]), #rfStage:not([data-s2]) { background: none; }

/* ── 12. ATELIER : la réserve du compte créateur ────────────────────────────
   atelier.css pose `.s2-body` / `.s2-h` / `.s2-ttl` sur `section.s2` : les
   écrans passés en saison 2 n'ont plus la classe `s2` sur la section, donc
   ces règles ne les atteignent plus. Les étapes 2 et 3 (non refaites) la
   gardent. Rien à neutraliser ici — note laissée pour la vague suivante. */

/* ── LA BOUTIQUE TIENT DANS MOINS D'ÉCRANS ─────────────────────────────────
   Edwin : « les éléments sont trop grands, la liste est trop longue à
   scroller, les fonds c'est trop grand, les avatars aussi, les bannières, les
   cadres… ». Mesuré : 43 articles pour 4 413 px de haut — plus de CINQ écrans
   de 844 à faire défiler, et un avatar occupait à lui seul 300 px.
   On garde exactement les mêmes composants, on les resserre :
   · les vignettes passent de deux à TROIS par ligne ;
   · l'image garde son carré mais rend la moitié de sa hauteur ;
   · les lignes (bannières, cadres, titres) perdent leur graisse inutile.
   Rien n'est retiré du catalogue : il devient seulement parcourable. */
#sec-credits[data-s2] .shop .s2-grid2 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
#sec-credits[data-s2] .shop .s2-item > .bd { padding: 7px; gap: 6px; }
#sec-credits[data-s2] .shop .s2-item .ph,
#sec-credits[data-s2] .shop .s2-item img:not(.nemoji) {
  width: 100%; aspect-ratio: 1; height: auto; object-fit: cover;
}
#sec-credits[data-s2] .shop .s2-item .nm { font-size: 10px; letter-spacing: .3px; }
/* le bouton d'un article : compact, mais encore visable au pouce */
#sec-credits[data-s2] .shop .s2-item :is(.btn, .s2-own-tag, .pill) {
  font-size: 9px; padding: 4px 6px; min-height: 26px;
}
/* les lignes de la liste (bannières, cadres, titres, pseudos) */
#sec-credits[data-s2] .shop .listcard > .bd { padding: 8px 10px; gap: 9px; }
#sec-credits[data-s2] .shop .listcard .emoji-box,
#sec-credits[data-s2] .shop .listcard .ph { width: 42px; height: 42px; flex: none; }
#sec-credits[data-s2] .shop .listcard .name { font-size: 12px; }
#sec-credits[data-s2] .shop .listcard .desc { font-size: 9px; }
/* l'article en vedette garde sa présence, sans prendre un tiers d'écran */
/* ⚠ C'EST ICI QUE LA BANNIÈRE ÉTAIT RÉDUITE À UNE VIGNETTE. Ces deux lignes
   écrasaient le format posé dans le socle : 74×74 pour un objet large de
   16/7. Edwin, à propos de GEAR 5 : « c'est une bannière, mais tu l'as
   affichée comme si c'était une image ». La vedette s'affiche au format de ce
   qu'elle est — la boutique de la saison 1 le faisait déjà bien. */
#sec-credits[data-s2] .shop .s2-art > .bd { padding: 0; }
#sec-credits[data-s2] .shop .s2-art .ph { width: 100%; height: auto; aspect-ratio: 16/7; flex: none; }

/* ── LE RANG DANS LA CARTE DU PROFIL, ET UN DRAPEAU QUI PORTE SON OMBRE ────
   Edwin : « ce serait bien de récupérer certaines informations et de les mettre
   directement dans le cadre du profil — le rang, le niveau ». Et : « attention
   au drapeau, j'ai choisi Côte d'Ivoire, l'ombre n'est pas correcte ».
   Le drapeau n'avait en effet AUCUNE ombre — seul bloc de la carte dans ce cas,
   alors que tout le brandbook porte une ombre dure. Sur la cover, son bord noir
   se perdait dans l'image. */
#sec-profil[data-s2] .s2-cov .s2-flag { box-shadow: 2px 2px 0 var(--ink); }
#sec-profil[data-s2] .s2-cov .s2-rkp {
  flex: none; margin-left: 4px; padding: 3px 7px;
  font-family: var(--font-d); font-size: 9px; letter-spacing: .8px;
  background: var(--yellow); color: #0A0A0A;
  border: 2px solid #0A0A0A; box-shadow: 2px 2px 0 #0A0A0A;
  white-space: nowrap;
}
/* NÉON : l'aplat jaune garde son encre noire, son ombre passe au magenta */
html[data-skin="neon"][data-theme] #sec-profil[data-s2] .s2-cov .s2-rkp { box-shadow: 2px 2px 0 #FF2E93; }
html[data-skin="neon"][data-theme] #sec-profil[data-s2] .s2-cov .s2-flag { box-shadow: 2px 2px 0 #FF2E93; }

/* ── LA BOUTIQUE N'EST PLUS UN MUR JAUNE ──────────────────────────────────
   Edwin : « il y a beaucoup d'éléments qui sont en jaune, je ne sais pas
   pourquoi ». Mesuré : 57 blocs jaunes sur l'écran, dont 43 corps de carte.
   LA CAUSE : `.s2-own .bd { background: var(--yellow) }` — tout article POSSÉDÉ
   devient jaune. Sur un compte qui possède presque tout le catalogue, la
   boutique entière vire au jaune, et on ne distingue plus rien.
   « Possédé » n'a pas besoin de crier : la COCHE le dit déjà. La carte garde
   donc le papier, et c'est sa coche qui passe au vert. Le jaune reste pour ce
   qui compte vraiment — le prix, et la nouveauté. */
#sec-credits[data-s2] .shop .s2-own .bd { background: var(--paper); }
#sec-credits[data-s2] .shop .s2-own .s2-tick { background: var(--green); }
/* le nom d'un article possédé redevient de l'encre sur son papier */
#sec-credits[data-s2] .shop .s2-own :is(.nm, .name, .desc) { color: var(--ink); }
#sec-credits[data-s2] .shop .s2-own .desc { color: color-mix(in srgb, var(--ink) 60%, transparent); }
/* NÉON : le papier devient prune, l'encre repasse en crème */
html[data-skin="neon"][data-theme] #sec-credits[data-s2] .shop .s2-own .bd { background: #2A1826; }
html[data-skin="neon"][data-theme] #sec-credits[data-s2] .shop .s2-own :is(.nm, .name) { color: #FFFEF7; }

/* ── LA FICHE D'UN RANG : PLUS DE DÉGRADÉ, ET UNE COCHE TRACÉE ────────────
   Edwin : « les pop-up, c'est les pop-up de la saison passée, c'est moche ;
   j'avais dit que le checkbox bizarre, il ne fallait plus jamais l'utiliser ».
   `rangs.css` porte DIX `linear-gradient` — le brandbook les interdit (« pas de
   dégradé, de lueur, de flou »). Chaque bandeau redevient un aplat franc.
   On ne touche pas à `rangs.css` : on le recouvre ici. */
[data-s2] .hm-rq-card.t-orange .hm-rq-head { background: #FF9F45; }
[data-s2] .hm-rq-card.t-cyan   .hm-rq-head { background: var(--cyan); }
[data-s2] .hm-rq-card.t-green  .hm-rq-head { background: var(--green); }
[data-s2] .hm-rq-card.t-yellow .hm-rq-head { background: var(--yellow); }
[data-s2] .hm-rq-card.t-purple .hm-rq-head { background: #B57BFF; }
[data-s2] .hm-rq-card.t-red    .hm-rq-head { background: var(--red); }
[data-s2] .hm-rq-card.t-gold   .hm-rq-head { background: var(--yellow); }
[data-s2] .rk-modal .hd.t-gold { background: var(--yellow); }

/* le nom du rang : plein, sur son ombre dure — pas de contour */
[data-s2] .hm-rq-head .nm, [data-s2] .hm-rq-head h3 {
  -webkit-text-stroke: 0; text-stroke: 0; text-shadow: 4px 4px 0 #0A0A0A;
}

/* ⚠ LA COCHE EST TRACÉE, JAMAIS LE GLYPHE. « ✓ PALIER D'XP ATTEINT » écrivait
   le caractère ✓ ; le brandbook le proscrit depuis le début. On le masque et on
   dessine la coche en CSS, à gauche du texte. */
[data-s2] .rk-prog-box.done .xp-nums { position: relative; padding-left: 26px; font-size: 0; }
[data-s2] .rk-prog-box.done .xp-nums::after {
  content: 'PALIER D\2019XP ATTEINT';
  font-family: var(--font-d); font-size: 13px; letter-spacing: .8px;
}
[data-s2] .rk-prog-box.done .xp-nums::before {
  content: ''; position: absolute; left: 6px; top: 50%;
  width: 8px; height: 15px; margin-top: -9px;
  border: solid var(--ink); border-width: 0 3px 3px 0;
  transform: rotate(45deg);
}
/* la ligne d'avantage : elle était en jaune pâle sur jaune pâle */
[data-s2] .hm-rq-perk, [data-s2] .hm-rq-card .perk {
  background: var(--paper); color: var(--ink);
  border: 3px solid var(--ink); box-shadow: 3px 3px 0 var(--ink);
}
/* NÉON : la carte vit sur le prune, ses ombres passent au magenta */
html[data-skin="neon"][data-theme] [data-s2] .hm-rq-card { box-shadow: 8px 8px 0 #FF2E93; }
html[data-skin="neon"][data-theme] [data-s2] .hm-rq-head { color: #0A0A0A; }
html[data-skin="neon"][data-theme] [data-s2] :is(.hm-rq-perk, .rk-prog-box) { box-shadow: 3px 3px 0 #FF2E93; }

/* ── LE FILIGRANE DANS LA BOUTIQUE AUSSI ──────────────────────────────────
   Edwin : « je te laisse faire ça pour cumul, boutique et stats aussi ».
   Chaque article porte son emoji de catégorie en grand et discret dans l'angle
   bas-droit. Il ne prend pas le clic et ne sort pas du cadre. */
#sec-credits[data-s2] .shop :is(.listcard, .s2-item) { position: relative; overflow: hidden; }
#sec-credits[data-s2] .shop :is(.listcard, .s2-item) > .bd { position: relative; z-index: 2; }
#sec-credits[data-s2] .shop :is(.listcard, .s2-item)[style*="--fil"]::after {
  content: ''; position: absolute; right: -12px; bottom: -14px; z-index: 0;
  width: 64px; height: 64px; opacity: .14; pointer-events: none;
  background: var(--fil) center / contain no-repeat;
}

/* ============================================================
   MES POTES — L'ÉTAT « PAS DE COMPTE ».
   C'est l'écran que voit TOUT joueur anonyme. Il était réduit à
   un bloc noir, un bouton et 600 px de vide, avec le texte
   aligné à droite. Il montre maintenant ce qu'on gagne : trois
   arguments, chacun avec son emoji ANIMÉ dans un cadre à ombre,
   et l'icône reprise EN FOND.
   ============================================================ */
#sec-potes[data-s2] .sd-anon { display: flex; flex-direction: column; gap: 10px; }
#sec-potes[data-s2] .sd-hero,
#sec-potes[data-s2] .sd-arg {
  position: relative; overflow: hidden; display: flex; align-items: center; gap: 13px;
  padding: 14px 13px; border: 4px solid var(--ink); box-shadow: 6px 6px 0 var(--ink);
  background: var(--paper); color: var(--ink); text-align: left;
}
#sec-potes[data-s2] .sd-hero { background: var(--magenta); color: #FFFEF7; }
#sec-potes[data-s2] .sd-hero::before,
#sec-potes[data-s2] .sd-arg::before {
  content: ''; position: absolute; right: -14px; top: 50%; transform: translateY(-50%);
  width: 104px; height: 104px; pointer-events: none; opacity: .15;
  background: var(--sd-fond) center / contain no-repeat;
}
#sec-potes[data-s2] .sd-hero > *,
#sec-potes[data-s2] .sd-arg > * { position: relative; z-index: 1; }
#sec-potes[data-s2] .sd-em {
  width: 54px; height: 54px; flex: none; display: grid; place-items: center;
  border: 3px solid var(--ink); box-shadow: 4px 4px 0 var(--ink); background: var(--paper);
}
#sec-potes[data-s2] .sd-em.big { width: 66px; height: 66px; }
#sec-potes[data-s2] .sd-em img { width: 74%; height: 74%; object-fit: contain; }
#sec-potes[data-s2] .sd-tx { flex: 1; min-width: 0; }
#sec-potes[data-s2] .sd-tx .t {
  display: block; font-family: var(--font-d); font-size: 21px; letter-spacing: .4px; line-height: 1;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
#sec-potes[data-s2] .sd-hero .sd-tx .t { font-size: 25px; }
#sec-potes[data-s2] .sd-tx .d {
  display: block; margin-top: 6px; font-family: var(--font-m); font-weight: 700;
  font-size: 9.5px; letter-spacing: 1.1px; line-height: 1.5; opacity: .72;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;   /* une ligne */
}
#sec-potes[data-s2] .sd-hero .sd-tx .d { opacity: .95; }
#sec-potes[data-s2] .sd-anonnote {
  margin-top: 10px; text-align: center; font-family: var(--font-m); font-weight: 700;
  font-size: 9px; letter-spacing: 1.1px; line-height: 1.7; opacity: .6;
}
/* fond sombre -> ombre colorée, jamais noire */
html[data-skin="neon"][data-theme] #sec-potes[data-s2] :is(.sd-hero, .sd-arg, .sd-em) {
  box-shadow: 5px 5px 0 var(--magenta);
}
