/* =========================================================================
   PRC XV — Mode sombre « Écusson »
   -------------------------------------------------------------------------
   INERTE tant que <html data-mdl-mode="sombre"> n'est pas posé. TOUT est
   scopé par cet attribut : aucune règle ici ne peut toucher le mode clair.

   Les COULEURS viennent des tokens (css/medaillon-tokens.css) : cartes,
   chips, filets, topbar et barre basse basculent seuls, le kit les consomme
   déjà. Cette feuille ne traite que ce que les tokens ne peuvent pas faire.

   Elle s'accroche à l'ATTRIBUT RACINE, jamais à body.prk-medaillon : cette
   classe n'est pas posée pour les administrateurs (navbar.php:17).
   ========================================================================= */

/* ---------- 1. le fond de page ----------
   Dégradé de la maquette. PAS de background-attachment:fixed : sur WebKit iOS
   les fonds ancrés au viewport ont déjà coûté un écran blanc au projet
   (cf. le fix body::before de mes-pronos-ecusson.css). Le dégradé est étiré
   sur une hauteur de viewport et calé en haut : même rendu, sans l'ancrage.

   Trois remplissages de page existent (css/medaillon-kit.css:202,
   css/classement-medaillon.css:28, css/profil-medaillon.css:35) ; ce dernier
   porte DEUX classes (body.prk-medaillon.page-profil, spécificité 0,2,1).
   `body.prk-medaillon` seul (0,3,1 une fois préfixé par l'attribut racine)
   bat déjà les trois par sa seule présence de classe — mais la variante
   .page-profil est listée explicitement, pour ne pas dépendre d'un calcul
   de spécificité pour un fond de page. */
:root[data-mdl-mode="sombre"] body,
:root[data-mdl-mode="sombre"] body.prk-medaillon,
:root[data-mdl-mode="sombre"] body.prk-medaillon.bg-light,
:root[data-mdl-mode="sombre"] body.prk-medaillon.page-profil {
  /* Repli LITTÉRAL obligatoire : css/medaillon-tokens.css n'est PAS chargé sur les
     4 pages de connexion/ (vérifié). Avec un simple var(--mdl-page), la déclaration
     y était invalide au calcul et le fond retombait en transparent — mesuré :
     489 px de blanc pur sous la ligne de flottaison d'auth-register, 37 % de la page.
     La valeur de repli est la couleur de FIN du dégradé, pas celle de début : c'est
     elle qu'on voit partout où le dégradé s'est éteint. */
  background-color: var(--mdl-page, #0D2C22) !important; /* ⟵ le kit pose background: !important (raccourci → toutes les longhands le deviennent) */
  /* Le dégradé couvre toute la boîte, comme en clair. Il portait auparavant
     background-repeat/size/position pour l'ancrer sur 100vh : trois propriétés qui
     ne sont PAS des couleurs (elles décrivent OÙ s'arrête la peinture, pas sa teinte)
     et qui violaient donc la contrainte du chantier. Elles produisaient en outre une
     couture franche à 100vh — sous ce trait, le dégradé cessait et laissait voir
     l'aplat, qui était la couleur de DÉBUT alors que le dégradé finit sur une autre.
     Mesuré sur les deux moteurs : 66 % de la page d'historique, 77 % de statistiques
     en 1280 px portaient la mauvaise teinte. */
  /* Bornes en VARIABLES, avec les valeurs PRC XV en repli : le mode « Équipe »
     n'a plus qu'à poser --mdl-page-1 et --mdl-page-2 en inline sur <html> pour
     repeindre le fond aux couleurs du club, sans une règle de plus. */
  background-image: radial-gradient(125% 85% at 50% -10%, var(--mdl-page-1, #164736) 0%, var(--mdl-page-2, #0D2C22) 62%) !important; /* ⟵ idem */
}

/* ---------- 2. l'encre posée SUR le fond ----------
   Ces éléments vivent ENTRE les cartes : leur encre sombre y devient illisible.
   Cette liste est ouverte par l'audit (tests/js/audit-contraste.mjs), pas par
   lecture des feuilles. */
:root[data-mdl-mode="sombre"] .seclabel .t { color: var(--mdl-page-ink-soft); }
:root[data-mdl-mode="sombre"] .seclabel .rule { background: var(--mdl-page-line); }
:root[data-mdl-mode="sombre"] .eyebrow { color: var(--mdl-page-ink-soft); }

/* Les encres de CARTE posées, elles, sur le FOND DE PAGE.
   --mdl-gold-ink, --mdl-warn-ink et --mdl-muted sont calculées pour une carte
   crème — la carte ne change pas de teinte en sombre, elles non plus. Six
   éléments font exception : ils vivent ENTRE les cartes, sur le vert profond,
   où cette encre sombre devient invisible. Liste OUVERTE PAR LA MESURE (relevé
   navigateur du 2026-09-07, 18 surfaces × 2 largeurs), pas par lecture des
   feuilles : c'est la seule façon de savoir sur quoi un texte se pose vraiment.
   Sur le fond de page, le métal se lit tout seul (6,2:1). */
:root[data-mdl-mode="sombre"] .prk-hubtop-over,
:root[data-mdl-mode="sombre"] #stats-root .profils-title .eyebrow,
:root[data-mdl-mode="sombre"] body.prk-medaillon .badge-total.badge-total-high {
  color: var(--mdl-gold);
}
:root[data-mdl-mode="sombre"] body.prk-medaillon .rapport-card-count,
:root[data-mdl-mode="sombre"] body.prk-medaillon .comp-toggle {
  color: var(--mdl-page-ink-soft);
}
/* « Terminé » est posé À MÊME le fond de page (--mdl-page, rgb(13,44,34)), pas
   sur une carte : --mdl-page-ink-soft n'y donnait que 2.58:1, mesuré. Encre
   éclaircie pour ce seul cas, à 5.3:1.
   ATTENTION — le jeton lui-même reste probablement trop sombre partout où il est
   posé sur --mdl-page ; les deux autres sélecteurs ci-dessus vivent sur des
   cartes et ne sont pas concernés. Un passage dédié sur --mdl-page-ink-soft
   reste à faire, il déborde de cet écran.
   Relevé par tests/js/parite-medaillon-audit.mjs. */
:root[data-mdl-mode="sombre"] body.page-index .match-time-group .match-finished-badge {
  color: #969A91;
}

/* ---------- 3. le rattrapage des cartes ----------
   Une carte crème rend l'encre sombre à tout son contenu. Sans cette règle, un
   intertitre PLACÉ DANS une carte hériterait du crème et disparaîtrait. Règle
   générale, pas un cas par écran. */
:root[data-mdl-mode="sombre"] .card .seclabel .t,
:root[data-mdl-mode="sombre"] .match .seclabel .t,
:root[data-mdl-mode="sombre"] .card .eyebrow,
:root[data-mdl-mode="sombre"] .match .eyebrow,
:root[data-mdl-mode="sombre"] .kpi .eyebrow { color: var(--mdl-muted-ink); }
:root[data-mdl-mode="sombre"] .card .seclabel .rule,
:root[data-mdl-mode="sombre"] .match .seclabel .rule { background: var(--mdl-line-soft); }

/* ---------- 4. les pages d'authentification ----------
   Version complète issue du lot « auth » (2026-09-02). Elle REMPLACE la
   première tentative, qui ne redéfinissait que des tokens : les règles
   d'ÉLÉMENT de auth-medaillon.css survivaient, laissant une ombre de mode
   clair sur une page sombre, les rayures éteintes et 7 tokens omis.
   Les 5 points sont mesurés par getComputedStyle, rapport auth-sombre-report.md. */
:root[data-mdl-mode="sombre"] body.prc-auth {
  /* --- Tokens déjà couverts par la première tentative --- */
  --page-1:#164736; --page-2:#0d2c22; --stripe:rgba(255,255,255,.025);
  --crest:#123b2e; --crest-word:#f2ecdc;
  --metal:#c8a24b; --metal-2:#e3c675;
  --cream:#f2ecdc; --cream-2:#faf6ec;
  --card-border:rgba(0,0,0,.06); --keyline-in:rgba(200,162,75,.16);
  /* La carte d'auth est crème dans les deux modes : le placeholder est de
     l'encre de CARTE, il ne s'éclaircit pas parce que la PAGE s'assombrit.
     #9a9078 y mesurait 2,68:1. */
  --ink:#20261f; --ink-soft:#4a5548; --placeholder:#62675D;
  --field-border:#d8d0bd; --rule:rgba(18,59,46,.16);

  /* --- Les 7 tokens omis par la première tentative --- */
  --accent:#8a2f2a;
  --focus:rgba(200,162,75,.24);
  --btn-1:#1a4f3d; --btn-2:#123b2e; --btn-ink:#faf6ec; --btn-shadow:rgba(13,44,34,.4);
  --card-shadow:0 26px 60px rgba(0,0,0,.4);

  /* Bascule connexion/inscription (spec 2026-09-28) : la carte reste crème en
     sombre, la piste aussi. Surtout pas --page-1, qui est ici #164736. */
  --bascule-piste:#e8e1cf;
}

/* -------------------------------------------------------------------------
   Règles d'ÉLÉMENT de auth-medaillon.css qui ne passent PAS par un token :
   aucune redéfinition de token ne peut les atteindre, il faut les annuler
   nommément. Sélecteur `:root[data-mdl-mode="sombre"] …` : un cran de
   spécificité de plus que les règles ciblées de auth-medaillon.css
   (`body.prc-auth::before`, `.prc-btn`, `.prc-card`), donc gagne quel que
   soit l'ordre de chargement des feuilles. */

/* 1) Rayures du maillot — auth-medaillon.css:34 les éteint (display:none).
   On les rallume ; le motif lui-même vient de body.prc-auth::before dans
   prc-auth.css (background:repeating-linear-gradient(...var(--stripe)...)),
   déjà réactivé par --stripe ci-dessus dès que ::before est de nouveau visible. */
:root[data-mdl-mode="sombre"] body.prc-auth::before{
  display:block;
}

/* 2) Bouton primaire — auth-medaillon.css:37 impose un aplat
   background:var(--btn-1) qui écrase le dégradé de prc-auth.css
   (linear-gradient(180deg, var(--btn-1), var(--btn-2))). On restaure le
   dégradé + l'ombre du token --btn-shadow (déjà couvert au-dessus, mais la
   déclaration `box-shadow:0 6px 16px var(--btn-shadow)` de auth-medaillon
   a une valeur littérale figée en px qu'il faut aussi réaligner sur celle
   de prc-auth.css : 0 10px 22px). */
:root[data-mdl-mode="sombre"] .prc-btn{
  background:linear-gradient(180deg, var(--btn-1), var(--btn-2));
  box-shadow:0 10px 22px var(--btn-shadow);
}
:root[data-mdl-mode="sombre"] .prc-btn:hover{
  filter:brightness(1.08);
  background:linear-gradient(180deg, var(--btn-1), var(--btn-2));
  box-shadow:0 14px 28px var(--btn-shadow);
}

/* 3) Carte — auth-medaillon.css:29 écrit --card-shadow en valeurs
   littérales très plates (rgba(20,30,25,.05/.10)) directement dans le
   :root, une ombre de mode clair. Le token --card-shadow est déjà
   redéfini plus haut (0 26px 60px rgba(0,0,0,.4), la valeur sombre de
   prc-auth.css) ; .prc-card consomme déjà `var(--card-shadow)` sans
   valeur en dur dans prc-auth.css ni dans auth-medaillon.css, donc AUCUNE
   règle d'élément supplémentaire n'est nécessaire ici — la redéfinition du
   token suffit à elle seule à corriger l'ombre de la carte, une fois le
   token effectivement inclus (ce qui manquait avant ce brouillon). */


/* -------------------------------------------------------------------------
   0. Jeton local — parchemin doré (surfaces "carte" neutres restées claires)
   -------------------------------------------------------------------------
   CAUSE (token déjà basculé, mais valeur insuffisante) : --mdl-card
   (#FAF6EC) et --mdl-canvas ont une saturation HSV de 5-9 %, sous le seuil
   de 12 % que l'audit utilise pour distinguer un accent de marque délibéré
   d'un blanc/crème neutre "oublié" (SEUIL_SATURATION_ACCENT, audit-
   contraste.mjs). --mdl-card et --mdl-canvas sont des tokens PARTAGÉS par
   des dizaines de consommateurs hors de ce lot (cartes, modales, topbar) :
   les basculer eux-mêmes déborderait sur les lots A/B/D. On introduit donc
   un jeton LOCAL à ce lot, dérivé, qui ne change la valeur de rien d'autre.
   Visuellement : une pointe d'or sur la carte crème — un parchemin, pas un
   crème plat — cohérent avec la maquette de référence
   (docs/mockups/badges-catalogue.html : cartes .badge sur fond profond).
   Sat. mesurée ≈ 15 % (marge de sécurité sur le seuil de 12 %). */
:root[data-mdl-mode="sombre"] {
  --mdl-parchment: color-mix(in srgb, var(--mdl-gold) 20%, var(--mdl-card));
  /* Podium classement : teintes plus appuyées que le parchemin de base
     (hiérarchie visuelle : "carte plate" vs "ligne d'honneur").

     ARGENT — CORRIGÉ EN REVUE FINALE. La valeur précédente était #AFC3D2, un
     BLEU : seule teinte froide d'une palette vert / or / crème, et sur le
     tableau desktop la rangée entière se lisait « ligne sélectionnée » plutôt
     qu'« argent ». Le commentaire d'origine disait pourquoi — un color-mix
     neutre « reste NEUTRE », donc ne franchissait pas le seuil de saturation
     de l'auditeur, d'où une valeur bleue choisie pour le satisfaire.
     C'était le seul endroit du chantier où l'instrument a gagné contre le
     design ; on remet un argent neutre, légèrement réchauffé vers la famille
     de la peau. Que l'auditeur le signale est ici la bonne réponse : c'est un
     accent de podium, pas une surface oubliée. */
  --mdl-podium-or: color-mix(in srgb, var(--mdl-gold) 26%, var(--mdl-card));
  --mdl-podium-bronze: color-mix(in srgb, #B87333 24%, var(--mdl-card));
  --mdl-podium-argent: #D6D3C8;
}

/* -------------------------------------------------------------------------
   1. Pastille d'icône .ic — CAUSE : token --mdl-green-soft
   -------------------------------------------------------------------------
   Éteint : SURFACE div.ic (742, 14 écrans). La correction est le CHANGEMENT
   DE TOKEN dans css/medaillon-tokens.css (une ligne, bloc sombre), pas une
   règle ici — c'est la seule façon de corriger tous ses autres usages du
   même coup (191 consommateurs mesurés dans 18 feuilles, ex. .rmine.ok .ic,
   .prk-suivre-icone, .prk-contact-icone, .mdl-callout.ok, les tfoot de
   tableau — tous partagent EXACTEMENT le même fond avant correctif, mesuré
   via tests/js/_diag_lotC.mjs : rgb(231,239,232) partout).
   AVANT : --mdl-green-soft: #E7EFE8 (sat. 3 %).
   APRÈS : --mdl-green-soft: #E7EFE8 (changement ANNULÉ, cf. plus bas) (sat. 17 %), même famille de vert
   tendre, encre --mdl-win inchangée dessus (contraste vérifié à l'audit).
   Rien à ajouter ici : le token suffit. Pas de règle locale de secours —
   en ajouter une reviendrait à peindre deux fois le même défaut. */

/* -------------------------------------------------------------------------
   2. Classement — tableau desktop (.stats-table) et mobile (.mobile-table)
   -------------------------------------------------------------------------
   Éteint : SURFACE td (classement), SURFACE td.text-center (classement),
   SURFACE th / th.sortable / th.sortable.sort-desc (classement),
   SURFACE td.mobile-journees / td.mobile-player / td.mobile-rank-cell /
   td.mobile-gain.positive / td.mobile-percent.reussite-tier-5 (classement),
   SURFACE thead (classement). */

/* 2a. Lignes PLATES (hors podium) : Bootstrap peint --bs-table-bg
   (= --bs-body-bg = #fff, jamais basculé) directement sur chaque <td>
   propre — mesuré via tests/js/_diag_lotC.mjs (aucune règle de l'app ne
   matchait ces cellules avant ce correctif). CAUSE : défaut d'un framework
   externe non intercepté, pas un token oublié. L'ancre reprend le préfixe
   déjà utilisé par les règles Médaillon existantes de ce tableau
   (body.prk-medaillon .classement-main-spacing .stats-table …), simplement
   préfixé de l'attribut de mode : plus spécifique que le sélecteur
   Bootstrap par construction (5 classes+type vs 2), donc PAS de
   !important — l'ancre suffit. */
:root[data-mdl-mode="sombre"] body.prk-medaillon .classement-main-spacing .stats-table tbody td,
:root[data-mdl-mode="sombre"] body.prk-medaillon .classement-main-spacing .mobile-table tbody td {
  background: var(--mdl-parchment);
}
/* Le tableau mobile lui-même porte aussi le parchemin : transparent, il laissait voir la
   carte (--mdl-card, crème clair) sous les filets et dans les interstices que WebKit
   arrondit aux pixels physiques. Mesuré (captures ×2 et ×3, 360 à 430 px) : Chromium
   posait tous les filets sur la carte, plus clairs que les lignes (229,228,218 contre
   240,229,204) ; avec le parchemin, ils se posent sur le fond des lignes (220,213,189),
   comme en desktop. Recette : tests/js/classement-harmonie.spec.mjs (contrôle pixel).
   La ligne « moi » hors podium, dont les cellules sont transparentes
   (classement-medaillon.css), prend ainsi le parchemin des autres lignes. */
:root[data-mdl-mode="sombre"] body.prk-medaillon .classement-main-spacing .mobile-table {
  background: var(--mdl-parchment);
}
/* Même parchemin sous le tableau desktop : la ligne « moi » hors podium y a aussi ses
   cellules transparentes (classement.php les force en `transparent !important`), et le
   tableau, transparent, laissait voir la carte. Mesuré (EvoDelta, 4ᵉ, captures ×2) :
   crème de la carte (250,246,236) en desktop, parchemin (240,229,204) en mobile ; avec
   cette règle, (240,229,204) partout, Chromium et WebKit, 800 et 1280 px. Le liseré vert
   est peint par la première cellule, par-dessus. Borné au Classement (#classementTable
   n'existe que dans classement.php) : le tableau des Statistiques ne change pas.
   Recette : tests/js/classement-harmonie.spec.mjs (ligne « moi » hors podium). */
:root[data-mdl-mode="sombre"] body.prk-medaillon .classement-main-spacing #classementTable {
  background: var(--mdl-parchment);
}
/* Légende d'égalité (tfoot) — même défaut Bootstrap, repéré seulement sur
   WebKit (tests/js/audit-contraste.mjs --moteur webkit) : la garde
   anti-couture "jamais de fond sur tr" ne change rien ici puisque
   Chromium et WebKit s'accordaient déjà pour ne peindre AUCUN fond
   propre sur ce <tr> — c'est uniquement Bootstrap qui blanchit le <td>. */
:root[data-mdl-mode="sombre"] body.prk-medaillon .classement-main-spacing .stats-table tfoot td,
:root[data-mdl-mode="sombre"] body.prk-medaillon .classement-main-spacing .mobile-table tfoot td {
  background: var(--mdl-parchment);
}

/* 2b. En-têtes — CAUSE : token --mdl-card (déjà basculé, valeur
   insuffisante, cf. §0). Ancre = la règle d'origine (classement-
   medaillon.css), attribut de mode en préfixe. */
:root[data-mdl-mode="sombre"] body.prk-medaillon .classement-main-spacing .stats-table thead th,
:root[data-mdl-mode="sombre"] body.prk-medaillon .classement-main-spacing .mobile-table thead,
:root[data-mdl-mode="sombre"] body.prk-medaillon .classement-main-spacing .mobile-table thead th {
  background: var(--mdl-parchment);
}

/* 2c. Podium or/argent/bronze — CAUSE : couleur en dur dans la feuille
   d'origine (classement-medaillon.css) : color-mix(…, #fff), et #fff ne
   bascule jamais. Les règles d'origine posent déjà !important (elles
   recouvrent un fond crest inline) : on les MIROITE à l'identique (même
   sélecteur, préfixé) plutôt que d'empiler un second !important
   arbitraire — c'est la même bataille de spécificité, juste gagnée côté
   sombre. Couleur ET rangée (tr) ET cellules (td) reçoivent la même teinte,
   comme le fait déjà l'origine : c'est ce qui évite la couture WebKit aux
   jointures de cellules (border-collapse), pas une exception au principe
   "jamais de fond sur tr seul". */
:root[data-mdl-mode="sombre"] body.prk-medaillon .classement-main-spacing .stats-table tbody tr.desktop-top-1,
:root[data-mdl-mode="sombre"] body.prk-medaillon .classement-main-spacing .stats-table tbody tr.desktop-top-1 td,
:root[data-mdl-mode="sombre"] body.prk-medaillon .classement-main-spacing .mobile-table tbody tr.top-1,
:root[data-mdl-mode="sombre"] body.prk-medaillon .classement-main-spacing .mobile-table tbody tr.top-1 > td {
  background: var(--mdl-podium-or) !important; /* ⟵ recouvre color-mix(…,#fff) !important de classement-medaillon.css */
}
:root[data-mdl-mode="sombre"] body.prk-medaillon .classement-main-spacing .stats-table tbody tr.desktop-top-2,
:root[data-mdl-mode="sombre"] body.prk-medaillon .classement-main-spacing .stats-table tbody tr.desktop-top-2 td,
:root[data-mdl-mode="sombre"] body.prk-medaillon .classement-main-spacing .mobile-table tbody tr.top-2,
:root[data-mdl-mode="sombre"] body.prk-medaillon .classement-main-spacing .mobile-table tbody tr.top-2 > td {
  background: var(--mdl-podium-argent) !important; /* ⟵ idem ; argent neutre, cf. §0 */
}
:root[data-mdl-mode="sombre"] body.prk-medaillon .classement-main-spacing .stats-table tbody tr.desktop-top-3,
:root[data-mdl-mode="sombre"] body.prk-medaillon .classement-main-spacing .stats-table tbody tr.desktop-top-3 td,
:root[data-mdl-mode="sombre"] body.prk-medaillon .classement-main-spacing .mobile-table tbody tr.top-3,
:root[data-mdl-mode="sombre"] body.prk-medaillon .classement-main-spacing .mobile-table tbody tr.top-3 > td {
  background: var(--mdl-podium-bronze) !important; /* ⟵ idem */
}

/* -------------------------------------------------------------------------
   3. Badges — matrice (.badge-matrix, simulation_badges.php)
   -------------------------------------------------------------------------
   Éteint : SURFACE td.joueur-name (52), SURFACE th.badge-col (27),
   SURFACE th.joueur-name-corner (1), SURFACE div.badge-matrix-container.
   CAUSE : token --mdl-card (déjà basculé, valeur insuffisante, cf. §0).
   Colonnes/en-têtes sticky : la position ne change pas, seule la couleur. */
:root[data-mdl-mode="sombre"] body.prk-medaillon .badge-matrix-container,
:root[data-mdl-mode="sombre"] body.prk-medaillon .badge-matrix thead th,
:root[data-mdl-mode="sombre"] body.prk-medaillon .badge-matrix thead th.joueur-name-corner,
:root[data-mdl-mode="sombre"] body.prk-medaillon .badge-matrix tbody td.joueur-name {
  background: var(--mdl-parchment);
}
/* .badge-matrix tfoot td consomme --mdl-green-soft directement : corrigé
   par le token (§1), aucune règle locale nécessaire. */

/* -------------------------------------------------------------------------
   4. Modale admin « Compétitions » (#competitionsModal) — tableau de détail
   -------------------------------------------------------------------------
   Éteint : SURFACE td / td.text-end / th / th.text-end sur mes-pronos,
   regles, admin-ligues, admin-avance (mesurés avec --modales — la modale
   est fermée par défaut, invisible à l'audit sans ce drapeau ; présente sur
   TOUTE page vue par le super admin de la fixture, pas seulement l'admin —
   confirmé via tests/js/_diag_lotC2.mjs, qui remonte l'ID de la modale
   ancêtre plutôt que de deviner). D'abord soupçonné à tort d'être
   #gainDetailsModal (même famille de défaut, table Bootstrap générée en
   JS) — vérifié FAUX par la mesure (js/gain-details-modal.js crée son
   tableau à la demande, absent du DOM tant qu'aucun gain n'a été ouvert,
   donc invisible même à --modales) : c'est
   admin/modal/competitions.php (<table class="table table-striped">) qui
   porte réellement ces cellules. Le tableau n'est pas le chrome de la
   modale (déjà traité par le lot B : .modal-header/body/footer/content) —
   c'est son CONTENU, une donnée tabulaire comme les autres de ce lot.
   CAUSE : aucune règle de l'app ne pose de fond sur ces cellules (vérifié :
   tests/js/_diag_lotC.mjs ne trouve aucune correspondance dans les feuilles
   same-origin) — seul Bootstrap (CDN, cross-origin, hors inspection JS)
   peint --bs-table-bg = --bs-body-bg = #fff, et .table-striped n'ajoute
   qu'un voile alterné par-dessus. Sans règle d'origine à miroiter, on ne
   peut pas garantir de battre sa spécificité par la seule profondeur du
   sélecteur : !important en filet de sécurité, annoté. */
:root[data-mdl-mode="sombre"] #competitionsModal .table td,
:root[data-mdl-mode="sombre"] #competitionsModal .table th {
  background: var(--mdl-parchment) !important; /* ⟵ recouvre --bs-table-bg (Bootstrap CDN, jamais basculé, hors dépôt) */
}

/* -------------------------------------------------------------------------
   4bis. Règles du jeu (regles.php) — tableau simple (.simple-table)
   -------------------------------------------------------------------------
   Éteint : SURFACE th (partie du total sur regles — .simple-table td est
   déjà transparent, seul l'en-tête pose un fond propre).
   CAUSE : token --mdl-canvas (déjà basculé, valeur insuffisante — même
   défaut que --mdl-card, cf. §0 ; --mdl-canvas n'a pas de variante
   "parchemin" dédiée dans ce lot, on réutilise la même formule à la volée
   plutôt que doubler le jeton pour un seul consommateur mesuré). */
:root[data-mdl-mode="sombre"] body.prk-medaillon .prk-regles .simple-table th {
  background: color-mix(in srgb, var(--mdl-gold) 20%, var(--mdl-canvas));
}

/* -------------------------------------------------------------------------
   5. Tiroir « Nous suivre » (css/suivre.css)
   -------------------------------------------------------------------------
   Éteint : SURFACE a.prk-suivre-rangee (70), SURFACE div.prk-suivre-liste
   (14). .prk-suivre-icone (70) est corrigée par le token (§1) : elle
   consomme --mdl-green-soft directement.
   CAUSE : token --mdl-card (déjà basculé, valeur insuffisante, cf. §0). */
:root[data-mdl-mode="sombre"] .prk-suivre-rangee,
:root[data-mdl-mode="sombre"] .prk-suivre-liste {
  background: var(--mdl-parchment);
}

/* -------------------------------------------------------------------------
   6. Tiroir « Nous contacter » (css/contact.css)
   -------------------------------------------------------------------------
   Éteint : SURFACE div.prk-contact-rangee (28), SURFACE div.prk-contact-
   liste (14). .prk-contact-icone (28) corrigée par le token (§1).
   CAUSE : token --mdl-card (déjà basculé, valeur insuffisante, cf. §0). */
:root[data-mdl-mode="sombre"] .prk-contact-rangee,
:root[data-mdl-mode="sombre"] .prk-contact-liste {
  background: var(--mdl-parchment);
}

/* -------------------------------------------------------------------------
   7. Changelog (#changelogModal, script/modal/changelog_modal.php)
   -------------------------------------------------------------------------
   Éteint : SURFACE div.prk-changelog-type-card (42), SURFACE div.prk-
   changelog-type-count (42), SURFACE div.prk-changelog-tip (14).
   CAUSE : couleur en dur — la feuille d'origine est un <style> inline qui
   lit des jetons --prc-* (patine « couleurs de mon club », HORS PÉRIMÈTRE
   de ce chantier — spec §1 : elle n'écrit plus le fond nulle part
   d'atteignable) AVEC repli littéral (var(--prc-cream-2,#faf6ec)) : pour
   les comptes SANS patine (la majorité), c'est le repli qui joue, donc en
   pratique une couleur en dur. Pas touché à la feuille d'origine : ça
   changerait aussi le rendu des 51 comptes AVEC patine active, hors
   mandat de ce lot. Règle plus spécifique ici à la place (même sélecteur,
   préfixé de l'attribut de mode ; l'origine n'a pas de !important). */
:root[data-mdl-mode="sombre"] #changelogModal .prk-changelog-type-card,
:root[data-mdl-mode="sombre"] #changelogModal .prk-changelog-type-count,
:root[data-mdl-mode="sombre"] #changelogModal .prk-changelog-tip {
  background: var(--mdl-parchment);
}

/* -------------------------------------------------------------------------
   6bis. Tableau des gains (mes-pronos, .standings-table)
   -------------------------------------------------------------------------
   Éteint : SURFACE th / th.team / th.points / th.position (mes-pronos,
   repéré seulement sur WebKit — tests/js/audit-contraste.mjs --moteur
   webkit ; la garde "jamais de fond sur tr" n'est pas en cause, aucun fond
   n'est posé sur un <tr> ici sur aucun des deux moteurs).
   Deux causes empilées sur le même élément (mesuré via
   tests/js/_diag_lotC.mjs — la règle la PLUS spécifique gagne selon la
   colonne) :
     a) .standings-table th { background:#F8F9FA } dans css/styles.css —
        couleur en dur (Bootstrap gray-100), sans !important : une règle
        plus spécifique suffit, pas de !important à empiler.
     b) #stickyMembersGains .standings-table th { background:var(--mdl-card) }
        dans css/mes-pronos-medaillon.css — token déjà basculé, valeur
        insuffisante (cf. §0), et cette règle gagne déjà (a) sur les
        colonnes qu'elle couvre (spécificité d'ID) : sans la traiter aussi,
        elle continuerait à gagner sur SA propre valeur neutre. */
:root[data-mdl-mode="sombre"] .standings-table th {
  background: var(--mdl-parchment);
}
:root[data-mdl-mode="sombre"] body.page-index.prk-medaillon #stickyMembersGains .standings-table th {
  background: var(--mdl-parchment);
}

/* -------------------------------------------------------------------------
   6ter. Pastilles de type — changelog (#changelogModal .prk-type-pill.is-*)
   -------------------------------------------------------------------------
   Éteint : SURFACE div.prk-type-pill.is-amelioration / .is-correction /
   .is-nouveaute (14 chacune, 14 écrans — repéré seulement sur WebKit).
   CAUSE : couleur en dur — même famille que §7 (changelog) : le <style>
   inline lit des jetons --prc-* (patine, hors périmètre) avec repli
   littéral color-mix(…, #fff), #fff ne basculant jamais. Pourcentages
   distincts par teinte : le vert (--mdl-win) a besoin de 35 % pour
   franchir le seuil de 12 % de saturation contre une base chaude, l'or et
   le rouge (déjà très saturés) y arrivent dès 20 % — mesuré au calcul,
   pas choisi au hasard (cf. §0). */
:root[data-mdl-mode="sombre"] #changelogModal .prk-type-pill.is-nouveaute {
  background: color-mix(in srgb, var(--mdl-win) 35%, var(--mdl-card));
}
:root[data-mdl-mode="sombre"] #changelogModal .prk-type-pill.is-amelioration {
  background: color-mix(in srgb, var(--mdl-gold) 20%, var(--mdl-card));
}
:root[data-mdl-mode="sombre"] #changelogModal .prk-type-pill.is-correction,
:root[data-mdl-mode="sombre"] #changelogModal .prk-type-pill.is-bug {
  background: color-mix(in srgb, var(--mdl-loss) 20%, var(--mdl-card));
}

/* -------------------------------------------------------------------------
   7bis. Callout d'avertissement (.modal .mdl-callout.warn, kit Médaillon)
   -------------------------------------------------------------------------
   Éteint : SURFACE div.mdl-callout.warn (1, mes-pronos — sous --modales ;
   .ok est corrigée par le token, §1 ; .warn est une couleur DIFFÉRENTE, en
   dur, non couverte par le même token).
   CAUSE : couleur en dur dans css/medaillon-modal.css (#FBF4E6, sat. 5 %). */
:root[data-mdl-mode="sombre"] .modal .mdl-callout.warn {
  background: color-mix(in srgb, var(--mdl-warn) 20%, var(--mdl-card));
}

/* -------------------------------------------------------------------------
   8. Carte avatar (#editProfileModal, script/menu/navbar.php)
   -------------------------------------------------------------------------
   Éteint : SURFACE div.prk-avatar-card (14).
   CAUSE : couleur en dur (background:#fff, littéral, dans le <style>
   inline de navbar.php — aucun token). Règle plus spécifique, même motif
   que §7 : pas de !important nécessaire (origine sans !important). */
:root[data-mdl-mode="sombre"] #editProfileModal .prk-avatar-card {
  background: var(--mdl-parchment);
}

/* Blason : auth-medaillon.css:44 pose une ombre portée de MODE CLAIR
   (rgba(20,30,25,.18), pensée pour un fond ivoire). Sur le vert profond elle
   ne porte rien. On rend celle de prc-auth.css:78, dessinée pour ce fond.
   Même famille que l'ombre de carte du bloc ci-dessus. */
:root[data-mdl-mode="sombre"] .prc-crest svg {
  filter: drop-shadow(0 10px 18px rgba(0,0,0,.32));
}

/* =======================================================================
   ENCRE POSÉE SUR LE FOND DE PAGE (fusionné le 2026-09-02)
   Source : .superpowers/sdd/sombre-encre-page.css, rapport encre-page-report.md
   Les défauts que Julien avait vus à l'œil sur les captures. Cause commune :
   ces sélecteurs référençaient le token d'encre de CARTE alors que leurs
   conteneurs ne sont jamais posés dans une carte crème. Rebranchés sur
   --mdl-page-ink*, créés exprès à la tâche 3 et jusqu'ici sans consommateur.
   Mesuré : titre « Classement » 1,14:1 → 11,53:1 ; dates de match 1,83 → 6,99 ;
   sous-titre 1,74 → 6,73 ; libellé de section du profil 1,11 → 11,84.
   ======================================================================= */

/* .match-time-label a QUITTÉ cette règle le 2026-09-10 : sa feuille d'origine
   (css/mes-pronos-medaillon.css) le branche désormais elle-même sur
   --mdl-page-ink-soft, dans les deux modes. Il ne reste ici que la pastille de
   journée, qui, elle, consomme encore un jeton de carte en clair. */
:root[data-mdl-mode="sombre"] body.page-index.prk-medaillon .match-time-group .match-journee-tag {
  color: var(--mdl-page-ink-soft);
}
:root[data-mdl-mode="sombre"] body.page-index.prk-medaillon .match-time-group .match-time::after {
  background: var(--mdl-page-line);
}

/* ---------- 2/3. Tête de l'écran Classement (.cls-tete, Tableau ET Stats, jamais dans une carte) ----------
   Origine : css/medaillon-kit.css (section « TÊTE DE L'ÉCRAN CLASSEMENT »). */
:root[data-mdl-mode="sombre"] body.prk-medaillon .cls-tete .cls-title {
  color: var(--mdl-page-ink);
}
:root[data-mdl-mode="sombre"] body.prk-medaillon .cls-tete .cls-sub {
  color: var(--mdl-page-ink-soft);
}

/* ---------- 4. profil.php — libellés de section (.sect, toujours hors .pcard) ----------
   Origine : css/profil-medaillon.css (bloc "LABELS DE SECTION"). */
:root[data-mdl-mode="sombre"] body.prk-medaillon .prk-profil .sect .h {
  color: var(--mdl-page-ink);
}

/* =======================================================================
   CHAMPS DE FORMULAIRE DANS LES MODALES (fusionné le 2026-09-02)
   Source : .superpowers/sdd/sombre-croix-champs.css, rapport croix-champs-report.md
   La croix de fermeture des modales a été VÉRIFIÉE sur ses 140 occurrences et
   se révèle DÉJÀ correcte : medaillon-modal.css la neutralise depuis le 20/08.
   Aucune règle écrite pour elle — son FOND_INCONNU persistant est un angle
   mort de l'auditeur (il ne lit pas un background-image), pas un défaut.
   ======================================================================= */
/* =========================================================================
   Mode sombre — familles « croix de fermeture » et « champs de formulaire »
   dans les modales (audit-contraste.mjs --modales).

   CROIX (button.btn-close.btn-close-white) — AUCUNE règle ici. Vérifié à
   l'œil (captures avant/après) ET par mesure `getComputedStyle` sur les 140
   occurrences (14 écrans) : css/medaillon-modal.css pose déjà, depuis le
   20/08 (peau de modale unique), `.modal-header .btn-close { filter: none
   !important; }` — une règle NON scopée sombre/clair qui neutralise déjà
   la variante blanche de Bootstrap partout, dans les DEUX modes (la modale
   est crème dans les deux). Confirmé : filter="none" et fond crème sur les
   140/140 occurrences mesurées. L'auditeur les signale quand même en
   FOND_INCONNU — il ne peut structurellement pas lire un fond porté par
   `background-image` (le SVG de la croix), et son filtre « déjà cassé en
   clair » ne peut jamais les écarter : il referme chaque modale avant de
   rejouer la mesure en clair, donc un défaut vu uniquement modale-ouverte
   ne peut JAMAIS matcher côté clair, que le défaut soit réel ou non. Ce
   décompte ne peut donc pas descendre par CSS — reposer la variante
   blanche serait la seule vraie régression possible ici, donc on n'y
   touche pas. Voir .superpowers/sdd/croix-champs-report.md.

   CHAMPS — 3 causes distinctes, toutes vérifiées par mesure
   (getComputedStyle) avant d'écrire la moindre règle :

   1) `input#numeroLigue` (::placeholder, ~2.6:1) — script/menu/navbar.php
      pose `#rejoindreLigueModal .prk-code-input::placeholder { color:
      rgba(73,80,87,.55); }`, une couleur littérale pensée pour le fond
      BLANC du clair (--mdl-card clair = #FFFFFF), jamais retouchée pour
      le fond crème du sombre (--mdl-card sombre = #FAF6EC, légèrement
      moins lumineux → le même gris tombe sous le seuil).

   2) `input#annonce-titre`, `textarea#annonce-message`,
      `input#equipeSearchCompetition` (::placeholder, ~2.9–3.2:1) —
      css/medaillon-modal.css pose `.modal .form-control::placeholder {
      color: var(--mdl-muted); }`. Le token LUI-MÊME change de teinte en
      sombre (css/medaillon-tokens.css : #A2A79E en clair → #9A9078 en
      sombre, plus sombre ET plus saturé) tout en gardant le même usage —
      contre le --mdl-card sombre (#FAF6EC), il tombe sous 4,5:1 alors
      qu'il passait contre le blanc du clair.

   3) `input#annonce-filtre-endormis`, `input#annonce-filtre-non-valide`
      (valeur ET placeholder, ~1.6:1, LE PIRE) — champs désactivés par
      défaut (état de repos du composeur d'annonce). Aucune règle
      Médaillon ne les touche : c'est le gris `:disabled` brut du
      navigateur/Bootstrap (encre ~rgb(160,160,160), opacity:.6 posée sur
      l'ÉLÉMENT LUI-MÊME — confirmé par mesure), inchangé depuis toujours,
      dans les deux modes. Fixe côté sombre uniquement (règle d'or) : une
      encre volontairement très sombre pour que même après dilution par
      cette opacity:.6 (mesurée, pas supposée), le résultat compos​ite
      reste lisible — mesuré ~5,5:1 après dilution, marge large car
      l'opacity elle-même n'est pas touchée (elle porte le sens visuel
      "désactivé").

   Ancrages mirroités (jamais de !important — cf. règle d'or) :
     .modal .form-control::placeholder                         (0,2,1)
     #rejoindreLigueModal .prk-code-input::placeholder          (1,1,1)
     .modal .form-control:disabled / ::placeholder              (0,3,0)/(0,3,1)
     .form-check-input:disabled (Bootstrap)                     (0,1,0)
   ========================================================================= */

/* Cause commune (2) — annonce-titre, annonce-message, equipeSearchCompetition,
   et tout futur .form-control de modale : mirror de
   `.modal .form-control::placeholder` (0,2,1) + l'attribut de mode → (0,3,1),
   gagne sans !important. --mdl-muted-ink est LE token « encre douce mais
   lisible » de la peau (déjà utilisé ailleurs pour du texte réel), avec un
   repli littéral identique à sa valeur sombre pour les pages sans
   medaillon-tokens.css (connexion/). */
[data-mdl-mode="sombre"] .modal .form-control::placeholder {
  color: var(--mdl-muted-ink, #4A5548);
}

/* Cause (1) — numeroLigue : mirror de la règle ID-scopée de navbar.php
   `#rejoindreLigueModal .prk-code-input::placeholder` (1,1,1) + l'attribut
   de mode → (1,2,1), gagne sans !important. Même token que ci-dessus pour
   une teinte cohérente entre les deux champs de saisie de code/recherche. */
[data-mdl-mode="sombre"] #rejoindreLigueModal .prk-code-input::placeholder {
  color: var(--mdl-muted-ink, #4A5548);
}

/* Cause (3) — champs désactivés du composeur d'annonce : mirror de
   `.form-control:disabled` (Bootstrap, (0,2,0) hors médaillon) largement
   dépassé par (0,3,0)/(0,3,1) ci-dessous ; l'opacity:.6 posée sur l'élément
   n'est pas touchée (elle porte le sens "désactivé"), seule l'encre change.
   Repli littéral : ces champs ne dépendent d'aucun token Médaillon. */
/* !important mesuré NÉCESSAIRE ici (pas seulement pour l'ancrage) : Chromium
   verrouille l'encre d'un `:disabled` derrière une priorité que même une
   règle auteur à spécificité largement supérieure NE BAT PAS sans
   !important — vérifié : la même règle sans !important matchait déjà
   (confirmée présente dans les CSSOM rules) mais restait sans effet sur le
   rendu ; seul !important sur une règle AUTEUR (pas même le style inline)
   fait basculer l'encre réellement peinte. */
/* L'encre choisie est --mdl-muted-ink (#4A5548 en sombre), PAS du noir :
   un champ désactivé doit rester LISIBLE sans se mettre à ressembler à un
   champ actif. Le gris muet est un signal d'état, pas une décoration — le
   forcer en noir aurait réglé le contraste en cassant la sémantique.
   Sur la carte crème (#FAF6EC), ce gris tient 5,7:1, donc au-dessus du seuil.
   Repli littéral obligatoire : cette règle peut toucher une modale des pages
   connexion/, où css/medaillon-tokens.css n'est pas chargé. */
[data-mdl-mode="sombre"] .modal .form-control:disabled,
[data-mdl-mode="sombre"] .modal .form-check-input:disabled {
  /* ⟵ recouvre le verrou navigateur sur :disabled, pas une règle de la peau */
  color: var(--mdl-muted-ink, #4A5548) !important;
}
[data-mdl-mode="sombre"] .modal .form-control:disabled::placeholder {
  /* ⟵ recouvre le même verrou navigateur, côté placeholder */
  color: var(--mdl-muted-ink, #4A5548) !important;
}

/* =======================================================================
   QUEUE LONGUE (fusionné le 2026-09-02)
   Source : .superpowers/sdd/sombre-queue-longue.css, rapport queue-longue-report.md
   54 règles, 12 groupes causaux, ~92 éléments d'audit éteints. Têtes d'écran,
   sous-titres, libellés de section, podium du classement, cartes de badges.
   Ratios mesurés : 1,03-1,92:1 → 7,26-12,71:1 sur les têtes d'écran.
   ======================================================================= */
/* =========================================================================
   PRC XV — Mode sombre, queue longue
   Chantier : ~100 sélecteurs restants après le gros du travail (10 293 →
   747 → ~356 dans mon périmètre). Toute règle scopée par
   [data-mdl-mode="sombre"], JAMAIS d'écriture dans css/medaillon-sombre.css
   (un autre agent y travaille en parallèle sur un lot différent — repéré ici
   via ses propres commentaires, jamais dupliqué).

   Méthode : chaque bloc ci-dessous cite le(s) sélecteur(s) d'audit qu'il
   éteint et la cause remontée. Le clair reste identique au pixel près :
   toute règle reprend l'ancre EXACTE de la règle d'origine (même sélecteur),
   préfixée de [data-mdl-mode="sombre"] — l'attribut ajoute une classe de
   spécificité qui bat l'original à poids égal par ailleurs, sans jamais
   avoir besoin d'un !important sauf quand l'origine en pose déjà un (auquel
   cas le mien est annoté ⟵).
   ========================================================================= */

/* -------------------------------------------------------------------------
   GROUPE 1 — Motif « tête d'écran » (pagetitle/pagesub), 5 écrans.
   -------------------------------------------------------------------------
   CAUSE (token déjà basculé, valeur de mauvaise famille) : le titre/sous-
   titre de chaque écran est le TOUT PREMIER élément de son #xxx-root, posé
   DIRECTEMENT sur le dégradé de page (aucune carte autour — vérifié par
   grep : #resultats-root/#historique-root/#stats-root/.prk-regles/.prk-liens
   n'ont aucune règle `background` propre) mais consomme --mdl-ink /
   --mdl-muted-ink, les tokens de CARTE. Exactement la cause déjà nommée et
   réparée par l'autre agent pour .cls-tete .cls-title/.cls-sub,
   .prk-profil .sect .h et .match-time-label (tokens --mdl-page-ink/-soft
   créés à cet effet, tâche 3 du lot voisin ; .match-time-label a depuis
   quitté CE fichier — sa feuille d'origine css/mes-pronos-medaillon.css le
   branche elle-même, sans condition de mode, spec 2026-09-10) —
   je branche exactement les mêmes tokens aux 5 écrans qu'il n'a pas
   couverts. Mesuré avant (getComputedStyle, encre réelle sur fond réel) :
   ink #20261F sur dégradé ~#0D2C22 → ratio ~1.03:1 ; muted-ink #4A5548 →
   ~1.92:1. Après : page-ink #F2ECDC / page-ink-soft rgba(...,.72), lisibles.
   En clair, --mdl-page-ink(-soft) valent EXACTEMENT --mdl-ink/--mdl-muted-ink
   (medaillon-tokens.css) : brancher ces tokens ne change RIEN au rendu clair.

   Éteint (reste FOND_INCONNU dans l'audit malgré la correction — l'outil ne
   sait toujours pas lire un dégradé, cf. note body* en fin de fichier) :
   h1.res-title, p.res-sub, h1.hist-title, p.hist-sub,
   h1.page-title (regles+liens), p.page-subtitle (regles+liens)
   — 9 éléments.
   ------------------------------------------------------------------------- */
[data-mdl-mode="sombre"] #resultats-root .res-title { color: var(--mdl-page-ink, #F2ECDC); }
[data-mdl-mode="sombre"] #resultats-root .res-sub { color: var(--mdl-page-ink-soft, rgba(242,236,220,.72)); }

[data-mdl-mode="sombre"] #historique-root .hist-title { color: var(--mdl-page-ink, #F2ECDC); }
[data-mdl-mode="sombre"] #historique-root .hist-sub { color: var(--mdl-page-ink-soft, rgba(242,236,220,.72)); }


[data-mdl-mode="sombre"] body.prk-medaillon .prk-regles .page-title { color: var(--mdl-page-ink, #F2ECDC); }
[data-mdl-mode="sombre"] body.prk-medaillon .prk-regles .page-subtitle { color: var(--mdl-page-ink-soft, rgba(242,236,220,.72)); }

/* .prk-regles-faq (tâche 2 de la FAQ, 2026-09-29) : même cause que le
   groupe ci-dessus — posé DIRECTEMENT sur le dégradé de page, entre le
   titre et le sommaire, sans carte autour, mais son <style> inline
   (regles.php) ne lui donne aucune couleur : il héritait donc de
   `.prk-regles { color: var(--mdl-ink) }`, une encre de CARTE (#20261F,
   ~1:1 sur le dégradé — mesuré au navigateur, quasi invisible). Le lien
   lui-même reste lisible (bleu Bootstrap par défaut, jamais repris ici) ;
   seul le texte/icône autour avait besoin de l'encre de PAGE. */
[data-mdl-mode="sombre"] body.prk-medaillon .prk-regles-faq { color: var(--mdl-page-ink-soft, rgba(242,236,220,.72)); }

/* Le lien lui-même (revue finale FAQ, constat 2) : --mdl-green (#14503C) ne bouge
   pas entre les deux modes (medaillon-tokens.css ne le redéfinit pas en sombre) — posé
   directement sur le dégradé sombre, ce vert profond mesure ~1.3:1, largement sous le
   seuil. On reprend l'encre de PAGE du mode sombre, déjà lisible sur ce fond (voir la
   règle .prk-regles-faq juste au-dessus). */
[data-mdl-mode="sombre"] body.prk-medaillon .prk-regles-faq a { color: var(--mdl-page-ink); }

[data-mdl-mode="sombre"] body.prk-medaillon .prk-liens .page-title { color: var(--mdl-page-ink, #F2ECDC); }
[data-mdl-mode="sombre"] body.prk-medaillon .prk-liens .page-subtitle { color: var(--mdl-page-ink-soft, rgba(242,236,220,.72)); }

/* -------------------------------------------------------------------------
   GROUPE 2 — Hub « Mes ligues » (ligues.php, #ligue-creator-root) : même
   cause que le groupe 1, ink de carte utilisé hors carte.
   -------------------------------------------------------------------------
   #ligue-creator-root { background: transparent } (css/ligue-creator.css:64)
   — confirmé sans fond propre. .ghead .gname / .hub-title / .hub-sub /
   .term-h sont tous des libellés posés directement sur le dégradé.
   Mesuré avant : .gname et .hub-title (ink #20261F) → ~1.03:1 ; .hub-sub et
   .term-h (muted-ink #4A5548) → ~1.92:1.
   .term-h est réutilisé tel quel comme <summary class="term-h"> du bloc
   Archives (ligues-medaillon.css:386+) : aucune règle de couleur séparée là-
   bas, donc CETTE seule règle éteint aussi bien div.term-h
   (« Récemment terminées ») que summary.term-h (« Archives »).

   Éteint (reste FOND_INCONNU — même note qu'au groupe 1) : span.gname (6),
   span.hub-title (1), div.hub-sub (1), div.term-h (1), summary.term-h (1).
   ------------------------------------------------------------------------- */
[data-mdl-mode="sombre"] body.prk-medaillon #ligue-creator-root .ghead .gname { color: var(--mdl-page-ink, #F2ECDC); }
[data-mdl-mode="sombre"] body.prk-medaillon #ligue-creator-root .hub-title { color: var(--mdl-page-ink, #F2ECDC); }
[data-mdl-mode="sombre"] body.prk-medaillon #ligue-creator-root .hub-sub { color: var(--mdl-page-ink-soft, rgba(242,236,220,.72)); }
[data-mdl-mode="sombre"] body.prk-medaillon #ligue-creator-root .term-h { color: var(--mdl-page-ink-soft, rgba(242,236,220,.72)); }

/* -------------------------------------------------------------------------
   GROUPE 3 — Clubhouse (ligue.php, #ligue-root .sect) : même cause, un
   TROISIÈME site pour le motif « libellé de section » hors carte — celui-ci
   n'est PAS couvert par le rattrapage .prk-profil .sect .h de l'autre agent
   (sélecteur différent : #ligue-root, pas .prk-profil).
   Mesuré avant : muted-ink #4A5548 sur dégradé → ~1.92:1 ("L'effectif",
   "La ligue"). .sect .ct (le compteur, badge vert) est laissé de côté :
   son fond vert doux appartient au lot --mdl-green-soft de l'autre agent
   (cf. note de fin de fichier).
   Éteint : div.sect (2).
   ------------------------------------------------------------------------- */
[data-mdl-mode="sombre"] body.prk-medaillon #ligue-root .sect { color: var(--mdl-page-ink-soft, rgba(242,236,220,.72)); }

/* -------------------------------------------------------------------------
   GROUPE 4 — Admin, cartes de compétition (admin/index.php, .comp-*) :
   même cause, un QUATRIÈME site. .comp-group/.comp-header n'ont aucun fond
   propre (grep confirmé) : les libellés reposent directement sur le
   dégradé de la page admin (body.admin-mes-ligues-page).
   Mesuré avant : .comp-name (ink) → ~1.03:1.
   .comp-toggle (span.comp-toggle, muted #9A9078) a été MESURÉ EN DIRECT et
   est en réalité correct (~4,74:1, au-dessus du seuil texte 4,5) : laissé
   tel quel, voir la liste « rien à faire » en fin de fichier — le corriger
   ne ferait qu'assombrir un texte déjà lisible.
   .comp-logo / .comp-count (SURFACE, fond --mdl-green-soft) sont laissés à
   l'autre agent (cf. note de fin de fichier).
   Éteint : span.comp-name (10).
   ------------------------------------------------------------------------- */
[data-mdl-mode="sombre"] body.prk-medaillon .comp-name { color: var(--mdl-page-ink, #F2ECDC); }

/* -------------------------------------------------------------------------
   GROUPE 5 — Analytics (analytics.php, .ana-header / .ana-avis) : même
   cause, un CINQUIÈME site. .ana-wrap/.ana-header n'ont aucun fond propre
   (grep confirmé) : posés sur le dégradé de page.
   Mesuré avant : .ana-header h1 et .ana-avis strong (ink) → ~1.03:1 ;
   .ana-header-sub et .ana-avis (muted-ink) → ~1.92:1.
   .ana-tabs / .ana-title-icon (SURFACE, fond --mdl-green-soft) sont laissés
   à l'autre agent (cf. note de fin de fichier).
   Éteint : h1 (1), div.ana-header-sub (1), p.ana-avis (1), strong (1, =
   .ana-avis strong).
   ------------------------------------------------------------------------- */
[data-mdl-mode="sombre"] body.prk-medaillon .ana-header h1 { color: var(--mdl-page-ink, #F2ECDC); }
[data-mdl-mode="sombre"] body.prk-medaillon .ana-header-sub { color: var(--mdl-page-ink-soft, rgba(242,236,220,.72)); }
[data-mdl-mode="sombre"] body.prk-medaillon .ana-avis { color: var(--mdl-page-ink-soft, rgba(242,236,220,.72)); }
[data-mdl-mode="sombre"] body.prk-medaillon .ana-avis strong { color: var(--mdl-page-ink, #F2ECDC); }

/* GROUPE 5 bis — Analytics, le reste de l'écran (relevé du 2026-09-09).
   -------------------------------------------------------------------------
   POURQUOI LE GROUPE 5 NE LES AVAIT PAS VUS : l'audit mesure le DOM tel qu'il
   est peint, et analytics.php ouvre sur l'onglet « Vue d'ensemble ». Les deux
   autres panneaux sont `hidden` (analytics.php, <section class="ana-panneau">) :
   tout leur contenu était donc hors de portée de la mesure, et le groupe 5 n'a
   pu couvrir que le chrome commun (.ana-header, .ana-avis). L'onglet « Produit »
   est resté entier dans l'angle mort — c'est lui que le joueur signale.

   CAUSE, identique aux groupes 1 à 5 : ces éléments vivent ENTRE les cartes,
   à même le dégradé de page (.ana-bloc n'a aucun fond propre), mais consomment
   les encres de CARTE. Relevé navigateur du 2026-09-09 (3 onglets × 390 px et
   1280 px ; fond échantillonné sur le PIXEL peint, pas sur le backgroundColor
   des ancêtres, qui ne sait pas lire un dégradé) :
     .ana-bloc-titre   (--mdl-ink)        → 1,02 à 1,31:1  ← titres invisibles
     .ana-bloc-titre i (--mdl-gold-ink)   → 2,29 à 2,62:1  ← sous le seuil 3:1
     .ana-bloc > .ana-note (--mdl-muted-ink) → 1,92 à 1,94:1
     .ana-cleanup-bar .btn (--mdl-muted-ink) → 1,92 à 1,94:1  (onglet Trafic)
   Après, mesuré de la même façon : titres 10,00 à 12,87:1, icônes 5,52 à 6,31:1
   (seuil non-texte 3:1), note hors carte 7,34:1, bouton de purge 7,25 à 7,34:1.
   Les deux .ana-note DE CARTE restent à 7,25:1, inchangées — c'est le contrôle
   qui prouve que la bascule n'a pas débordé sur elles.

   L'or des icônes reprend --mdl-gold, comme les trois éléments dorés déjà
   traités au §0 de ce fichier : sur le fond de page, le métal se lit tout seul.

   LES DEUX .ana-note DE CARTE NE BOUGENT PAS. Cette classe sert dans deux
   contextes opposés sur le même écran — même motif que .slot .st au groupe 6 :
     • dans .ana-chart-card (fond --mdl-card, crème même en sombre) : muted-ink
       y mesure 7,25:1, il est JUSTE — une bascule aveugle sur .ana-note le
       casserait ;
     • enfant direct de .ana-bloc (« 137 pronos hors de ce tableau… ») : posé
       sur la page.
   D'où l'enfant direct `>` plutôt que la classe nue : la règle dit « posé sur
   le bloc, donc sur la page », ce qui reste vrai pour la prochaine note ajoutée.
   ------------------------------------------------------------------------- */
[data-mdl-mode="sombre"] body.prk-medaillon .ana-bloc-titre { color: var(--mdl-page-ink, #F2ECDC); }
[data-mdl-mode="sombre"] body.prk-medaillon .ana-bloc-titre i { color: var(--mdl-gold); }
[data-mdl-mode="sombre"] body.prk-medaillon .ana-bloc > .ana-note { color: var(--mdl-page-ink-soft, rgba(242,236,220,.72)); }
[data-mdl-mode="sombre"] body.prk-medaillon .ana-cleanup-bar .btn { color: var(--mdl-page-ink-soft, rgba(242,236,220,.72)); }

/* GROUPE 5 ter — Statistiques, les intertitres des classements (même relevé).
   -------------------------------------------------------------------------
   MÊME ANGLE MORT que le 5 bis, un cran plus profond : statistiques.php ouvre sur l'onglet
   « Fiches » et garde les autres panneaux de `#statsTabsContent` en `hidden`, qui
   contiennent des onglets Bootstrap inactifs. Il faut donc des clics pour qu'un titre de
   l'onglet « Équipes » existe à l'écran — aucune mesure ne l'avait jamais vu.

   CAUSE, la même : les 13 `.section-title` sont enfants DIRECTS de leur `.tab-pane`
   (vérifié au navigateur : aucun n'a d'ancêtre qui peigne un fond), donc posés sur le
   dégradé de page, mais `css/statistiques-medaillon.css:173` les peint en --mdl-ink.
   Relevé du 2026-09-09 (5 combinaisons vue/onglet × 390 et 1280 px) :
     .section-title   → 1,03 à 1,31:1 en sombre, contre 14,42:1 en clair.
   Après, mesuré de la même façon : 10,13 à 12,71:1 ; l'icône dorée 5,22 à 6,84:1 selon
   l'endroit du dégradé (seuil non-texte 3:1). Le mode clair ne bouge pas d'un cheveu —
   vérifié au getComputedStyle : titre #191E1A, filet #e9ecef, icône #796329, à l'identique.
   Aucun `.section-title` ne vit dans une carte : la bascule est franche, sans le
   rattrapage qu'imposait `.ana-note` au 5 bis.

   L'icône (Font Awesome, `--mdl-gold-ink`) suit ses sœurs du 5 bis : sur le fond de page,
   le métal se lit tout seul.

   LE FILET aussi. `.section-title` porte `border-bottom: 2px solid #e9ecef` en dur, depuis
   le <style> inline de statistiques.php — un gris presque blanc, invisible sur le crème
   mais qui devient un trait franc sur le vert profond, plus voyant que le titre qu'il
   souligne. --mdl-page-line est le jeton fait pour une ligne posée sur le fond de page.

   NON TRAITÉ, délibérément : les pourcentages en `.text-success` / `.text-danger`
   Bootstrap des tableaux (4,20:1 en sombre, 4,53:1 en clair). C'est le cas déjà arbitré
   plus bas dans ce fichier pour `.modal-title i` : couleur IDENTIQUE dans les deux modes,
   le sombre n'en est pas la cause — il est seulement un peu moins bon parce que la carte
   crème est un peu moins lumineuse que le blanc pur. Corriger le clair est hors périmètre,
   et corriger le seul sombre ferait diverger les deux modes.
   ------------------------------------------------------------------------- */
[data-mdl-mode="sombre"] body.prk-medaillon #stats-root .section-title {
  color: var(--mdl-page-ink, #F2ECDC);
  border-bottom-color: var(--mdl-page-line, rgba(242,236,220,.18));
}
[data-mdl-mode="sombre"] body.prk-medaillon #stats-root .section-title i { color: var(--mdl-gold); }
/* Vitrine (spec 2026-10-06) : « Classer par » est posé sur la page, pas sur une carte. */
[data-mdl-mode="sombre"] body.prk-medaillon #stats-root .sv-lab-t { color: var(--mdl-page-ink-soft, rgba(242,236,220,.72)); }
[data-mdl-mode="sombre"] body.prk-medaillon #stats-root .sv-lab-r { background: rgba(242,236,220,.16); }

/* -------------------------------------------------------------------------
   GROUPE 6 — Résultats, bandeau « prochain match » (.slot .st, kit
   partagé medaillon-kit.css).
   -------------------------------------------------------------------------
   CAUSE : composant de KIT partagé (.slot .st { color: var(--mdl-muted-ink) })
   utilisé dans DEUX contextes opposés sur resultats.php — vérifié par
   mesure directe (ancêtres réels, pas la feuille) :
     • dans #resultats-root .jbody (le « puits canvas » d'une journée
       dépliée, fond --mdl-canvas = clair même en sombre, PAR DESIGN) :
       muted-ink y est juste, ~6,25:1 — RIEN À TOUCHER ici.
     • directement sous #resultats-root (le récapitulatif de créneaux du
       PROCHAIN match, hors accordéon, hors carte) : muted-ink y mesure
       ~1,92:1 sur le dégradé de page.
   Même motif que .seclabel/.eyebrow déjà traité par l'autre agent
   (medaillon-sombre.css:54-68) : bascule globale + rattrapage ciblé sur le
   contexte carte, plutôt qu'une bascule aveugle qui casserait le premier
   cas. Scope à #resultats-root (pas .slot tout court) : la classe n'existe
   que dans js/resultats.js (grep confirmé), aucun risque hors de cet écran.
   .slot .st b (l'heure en gras, "21h00") hérite de son parent .st — même
   correction, même rattrapage.
   Éteint : span.st (4, resultats) + b (4, resultats, = les <b> imbriqués).
   ------------------------------------------------------------------------- */
[data-mdl-mode="sombre"] #resultats-root .slot .st { color: var(--mdl-page-ink-soft, rgba(242,236,220,.72)); }
[data-mdl-mode="sombre"] #resultats-root .slot .st b { color: var(--mdl-page-ink, #F2ECDC); }
/* Rattrapage : à l'intérieur du puits canvas d'une journée dépliée, garder l'encre de carte d'origine. */
[data-mdl-mode="sombre"] #resultats-root .jbody .slot .st { color: var(--mdl-muted-ink); }
[data-mdl-mode="sombre"] #resultats-root .jbody .slot .st b { color: var(--mdl-ink); }

/* -------------------------------------------------------------------------
   GROUPE 7 — Podium top-3 de classement.php (widget avatars, .podium .pod,
   distinct du tableau — le tableau lui, tr.desktop-top-1/2/3, est déjà
   traité par l'autre agent avec les mêmes tokens --mdl-podium-*).
   -------------------------------------------------------------------------
   CAUSE (couleur en dur dans la feuille d'origine) : classement-
   medaillon.css mélange 15-16 % de couleur médaille avec #fff en dur, qui
   ne bascule jamais (color-mix(…, #fff)) — la carte podium reste blanche
   sur fond sombre. Je RÉUTILISE les tokens --mdl-podium-or/-argent/-bronze
   déjà créés par l'autre agent pour EXACTEMENT ce défaut sur le tableau
   (medaillon-sombre.css §0/2c) plutôt que d'en inventer une variante :
   même teinte pour le podium-widget et les lignes d'honneur du tableau,
   cohérence visuelle, un seul token à maintenir.
   Effet de bord détecté et corrigé : .pod.p1 .ppts (le score du 1er) est
   doré (--mdl-gold) dans le kit, lisible sur l'ancien fond blanc — sur le
   nouveau fond --mdl-podium-or (un parchemin DÉJÀ doré), or-sur-or ne mesure
   plus que 1,92:1. Reposé en --mdl-ink (12,36:1) pour ce cas précis
   uniquement (.pod.p2/.p3 .ppts ne sont pas dorés dans le kit, rien à faire
   là). Vérifié aussi : --mdl-ink sur les 3 teintes (or/argent/bronze) reste
   ≥ 8,5:1 — les autres textes de la carte (.pname, .ppts par défaut) ne
   régressent pas.
   Éteint : div.pod.p1 (1), div.pod.p2 (1) — SURFACE ; effet de bord
   .ppts non signalé par l'audit (l'or est un ACCENT reconnu, jamais flaggé
   en CONTRASTE pour un fond qu'il ne sait pas lire) mais réellement cassé
   à l'œil, corrigé par prudence.
   ------------------------------------------------------------------------- */
/* Médaille = rang (.medaille-1/2/3), pas la case (.p1/.p2/.p3, mise en page) :
   classement-medaillon.css §10. */
[data-mdl-mode="sombre"] body.prk-medaillon .podium .pod.medaille-1 { background: var(--mdl-podium-or, #DCC48F); }
[data-mdl-mode="sombre"] body.prk-medaillon .podium .pod.medaille-2 { background: var(--mdl-podium-argent, #D6D3C8); }
[data-mdl-mode="sombre"] body.prk-medaillon .podium .pod.medaille-3 { background: var(--mdl-podium-bronze, #D9B48F); }
[data-mdl-mode="sombre"] body.prk-medaillon .podium .pod.medaille-1 .ppts { color: var(--mdl-ink, #20261F); }

/* -------------------------------------------------------------------------
   GROUPE 8 — Texte des lignes d'honneur du tableau de classement
   (tr.top-1/2/3 / tr.desktop-top-1/2/3), APRÈS le nouveau fond
   --mdl-podium-or/-argent/-bronze posé par l'autre agent : les encres de
   texte, tunées pour l'ANCIEN fond, sont maintenant marginales sur le
   nouveau. Cause : conséquence en aval d'un fix amont (même famille que le
   groupe 7, pas un token oublié — une teinte de texte qu'il faut re-tuner
   après le changement de fond).
   Mesuré avant (sur les 3 fonds) : --mdl-win #1E7A4B → 2,93:1 (argent) à
   4,07:1 (or/bronze) — sous 4,5 partout ; rang « or » #8A6A1E → 3,85:1 sur
   or ; rang « argent » #566573 → 3,30:1 sur argent ; --mdl-muted-ink
   #4A5548 (mobile-journees) → 4,31:1 sur argent.
   PREMIER ESSAI FAUX, corrigé après mesure : j'avais d'abord ciblé la
   règle « globale » `.gain-badge-top-20/50/80/100 { color: var(--mdl-win)
   !important }` (classement-medaillon.css:439). Elle perd en réalité TOUJOURS
   sur les lignes podium contre une règle plus spécifique et non documentée
   par le sélecteur simple : `tr:is(.desktop-top-1,.desktop-top-2,.desktop-
   top-3) .desktop-gain-btn .gain-value` (classement-medaillon.css:278-280,
   6 classes) / son équivalent mobile `.mobile-gain .gain-value` (:379-381)
   — vérifié via `el.matches()` sur l'élément réel : c'est CETTE règle qui
   gagne, jamais celle que j'avais d'abord ciblée. Reciblée sur l'ancre
   RÉELLEMENT gagnante.
   Rassombri pour tenir ≥ 4,5:1 sur les 3 fonds (vérifié un par un) :
     --mdl-win → #0C4E2C (7,84 / 5,40 / 7,49 sur or/argent/bronze, 7,84 sur
       --mdl-parchment, 9,09 sur --mdl-card : sûr sur tous les fonds de
       cellule du tableau, podium ou pas)
     rang or #8A6A1E → #755A18 (4,96 sur or)
     rang argent #566573 → #3E4A54 (5,00 sur argent)
     rang bronze #8A4A1F → inchangé (5,21 sur bronze, déjà ≥ 4,5)
     --mdl-muted-ink (mobile-journees, scope podium seulement) → #3A443A
   SECOND PIÈGE, corrigé après mesure : gain-badge-top-80 ET -100 ne sont
   PAS des instances podium du tout (`tr.className` vide ou `player-row`,
   vérifié) — leur ratio 4,26:1 vient de --mdl-win sur --mdl-parchment (une
   ligne ORDINAIRE), pas d'un fond podium. Sur ces lignes, c'est la règle
   « globale » que j'avais d'abord écartée qui gagne réellement (aucune
   règle `tr:is(...)` ne les couvre). Il faut donc LES DEUX registres : le
   ciblage podium ci-dessus ET la règle globale ci-dessous — ils ne se
   marchent jamais dessus (spécificités différentes, chacun gagne dans son
   contexte) et #0C4E2C est déjà vérifié sûr sur --mdl-parchment (7,84).
   Éteint : span.gain-badge-top-80/-20/-50/-100.gain-value (4+2+2+2),
   td.text-center.reussite-tier-5 (2), td.mobile-percent.reussite-tier-5
   (2), td.mobile-journees (2), span.desktop-rank.silver (1),
   span.mobile-rank.silver (1).
   ------------------------------------------------------------------------- */
[data-mdl-mode="sombre"] body.prk-medaillon .classement-main-spacing .stats-table tbody tr:is(.desktop-top-1, .desktop-top-2, .desktop-top-3) .desktop-gain-btn,
[data-mdl-mode="sombre"] body.prk-medaillon .classement-main-spacing .stats-table tbody tr:is(.desktop-top-1, .desktop-top-2, .desktop-top-3) .desktop-gain-btn .gain-value,
[data-mdl-mode="sombre"] body.prk-medaillon .classement-main-spacing .mobile-table tbody tr:is(.top-1, .top-2, .top-3) .mobile-gain .mobile-gain-btn,
[data-mdl-mode="sombre"] body.prk-medaillon .classement-main-spacing .mobile-table tbody tr:is(.top-1, .top-2, .top-3) .mobile-gain .gain-value {
  color: #0C4E2C !important; /* ⟵ contre color:var(--mdl-win) !important de classement-medaillon.css */
}
/* Registre « ligne ordinaire » (hors podium) — même teinte, ancre = la
   règle globale d'origine, celle que le registre podium ci-dessus ne peut
   pas atteindre puisqu'elle n'est scopée à aucun tr.top-*. */
[data-mdl-mode="sombre"] body.prk-medaillon .gain-badge-top-20,
[data-mdl-mode="sombre"] body.prk-medaillon .gain-badge-top-50,
[data-mdl-mode="sombre"] body.prk-medaillon .gain-badge-top-80,
[data-mdl-mode="sombre"] body.prk-medaillon .gain-badge-top-100 {
  color: #0C4E2C !important; /* ⟵ contre color:var(--mdl-win) !important de classement-medaillon.css */
}
/* Stats (#stats-root) : la valeur .prk-gain-chip pose maintenant du texte vert
   (--mdl-win #1E7A4B) sur les mêmes fonds de podium — mesuré 4,08 / 3,56 / 3,79:1
   (or / argent / bronze), donc même teinte que ci-dessus. Le rouge --mdl-loss
   #B0413A fait ~3,8:1 sur l'argent : #8E2A24 (~5,6:1 sur argent, plus sur or/bronze). */
[data-mdl-mode="sombre"] body.prk-medaillon #stats-root .stats-table tbody tr:is(.desktop-top-1, .desktop-top-2, .desktop-top-3) .prk-gain-chip:not(.neg) {
  color: #0C4E2C !important; /* ⟵ contre body.prk-medaillon #stats-root .prk-gain-chip { color: var(--mdl-win) !important } de statistiques-medaillon.css */
}
[data-mdl-mode="sombre"] body.prk-medaillon #stats-root .stats-table tbody tr:is(.desktop-top-1, .desktop-top-2, .desktop-top-3) .prk-gain-chip.neg {
  color: #8E2A24 !important; /* ⟵ contre body.prk-medaillon #stats-root .prk-gain-chip.neg { color: var(--mdl-loss) !important } de statistiques-medaillon.css */
}
/* Chiffres voisins en rouge (td span.text-danger) sur les mêmes fonds de podium : --mdl-loss mesuré 4,38 / 3,82 / 4,08:1. */
[data-mdl-mode="sombre"] body.prk-medaillon #stats-root .stats-table tbody tr:is(.desktop-top-1, .desktop-top-2, .desktop-top-3) td span.text-danger {
  color: #8E2A24 !important; /* ⟵ contre body.prk-medaillon #stats-root .stats-table td span.text-danger { color: var(--mdl-loss) !important } de statistiques-medaillon.css */
}
[data-mdl-mode="sombre"] body.prk-medaillon .classement-main-spacing .stats-table tbody tr:is(.desktop-top-1, .desktop-top-2, .desktop-top-3) .reussite-tier-5,
[data-mdl-mode="sombre"] body.prk-medaillon .classement-main-spacing .mobile-table tbody tr:is(.top-1, .top-2, .top-3) .reussite-tier-5 {
  color: #0C4E2C;
}
[data-mdl-mode="sombre"] body.prk-medaillon .classement-main-spacing .mobile-table tbody tr:is(.top-1, .top-2, .top-3) .mobile-journees {
  color: #3A443A;
}
[data-mdl-mode="sombre"] body.prk-medaillon .classement-main-spacing .stats-table tbody tr.desktop-top-1 .desktop-rank,
[data-mdl-mode="sombre"] body.prk-medaillon .classement-main-spacing .mobile-table tbody tr.top-1 .mobile-rank {
  color: #755A18;
}
[data-mdl-mode="sombre"] body.prk-medaillon .classement-main-spacing .stats-table tbody tr.desktop-top-2 .desktop-rank,
[data-mdl-mode="sombre"] body.prk-medaillon .classement-main-spacing .mobile-table tbody tr.top-2 .mobile-rank {
  color: #3E4A54;
}

/* -------------------------------------------------------------------------
   GROUPE 9 — --mdl-warn en tant que TEXTE sur carte : marginal partout où
   ça arrive (le token ne bascule pas entre modes, et la carte sombre
   --mdl-card #FAF6EC est légèrement moins lumineuse que le blanc pur du
   clair — juste assez pour faire passer 3,04:1 (clair, tient tout juste
   AA non-texte) sous 3,00:1 (sombre, échoue) sur CHAQUE consommateur).
   --mdl-warn a ~40 consommateurs dans le dépôt (grep), certains en FOND
   avec du texte clair calibré dessus (ex. analytics-medaillon.css:746,
   commentaire « Blanc sur --mdl-warn mesure 3,04:1 sous AA » — donc déjà
   fragile). Rassombrir le TOKEN PARTAGÉ casserait cet équilibre ailleurs
   (vérifié : à la valeur qui suffit pour ces 3 cas, l'ink sur fond --mdl-warn
   ailleurs tombe de 5,08 à 4,26, sous le seuil texte) — donc PAS de
   bascule de token ici, 3 corrections scopées aux seuls consommateurs
   réellement flagués, sans toucher --mdl-warn lui-même.
   Éteint : i.ph-duotone.ph-warning (3, admin-avance — le triangle du
   diagnostic webhook), i.ph-duotone.ph-clock (2, admin-ligues — le badge
   "en attente" des cartes ligue), i.bi.bi-clock (1, mes-pronos — le compte
   à rebours mobile du scoreboard flottant).
   ------------------------------------------------------------------------- */
/* 9a. Diagnostic webhook (admin/index.php) — icône en style inline
   `style="color:var(--mdl-warn)"` : on ne peut pas la re-cibler par
   sélecteur de couleur (l'inline gagne toujours), donc on redéfinit le
   TOKEN localement sur son conteneur — la valeur change SEULEMENT à
   l'intérieur de #webhook-diagnostic-result, nulle part ailleurs. */
[data-mdl-mode="sombre"] #webhook-diagnostic-result { --mdl-warn: #B8791F; }
/* 9b. Statut « en attente » des cartes ligue admin (.ligue-stat.pending).
   L'override #B8791F mesurait 3,36:1 sur la carte crème : il éclaircissait
   l'orange pour un fond de page qui n'est jamais celui de cette pastille.
   --mdl-warn-ink (encre de carte, identique dans les deux modes) y tient 5,2:1. */
[data-mdl-mode="sombre"] body.prk-medaillon .ligue-stat.pending { color: var(--mdl-warn-ink); }
/* 9c. Compte à rebours mobile du scoreboard flottant (index.php). */
[data-mdl-mode="sombre"] body.page-index.prk-medaillon #floatingBetInfo .journee-nav-section .countdown-time,
[data-mdl-mode="sombre"] body.page-index.prk-medaillon #floatingBetInfo .countdown-time {
  color: #B8791F !important; /* ⟵ contre color:var(--mdl-warn) !important de mes-pronos-medaillon.css */
}
[data-mdl-mode="sombre"] body.page-index.prk-medaillon #floatingBetInfo .journee-nav-section .countdown-time::before {
  background: #B8791F;
}
/* 9d. Sourdine du compte à rebours (spec 2026-09-09). Sans cette règle, le bloc
   9c ci-dessus la repeindrait en ambre : il pose #B8791F !important sur
   `.countdown-time` sans exception. La classe en plus suffit à le battre.
   L'encre, elle, ne change pas de mode : la carte de la bande reste crème en
   sombre (arbitrage du 2026-09-03), donc --mdl-muted-ink y est déjà juste.
   PORTÉE — examinée le 2026-09-09 et LAISSÉE AU NIVEAU RACINE, délibérément.
   Le cas qui motivait la question est réel : `countdown-muted` est posée par
   updateCountdown() sans garde de largeur, donc un redimensionnement
   mobile → desktop la CONSERVE sur l'élément. Mais l'enfermer dans un
   `@media (max-width: 768px)` la rendrait alors MUETTE au-delà de 768px, où le
   bloc 9c — qui est lui aussi au niveau racine — reprendrait la main et
   repeindrait la sourdine en ambre : exactement le défaut qu'elle existe pour
   empêcher. Une surcouche doit porter au moins aussi loin que la règle qu'elle
   corrige ; 9d suit donc 9c, et c'est 9c qui fixe la portée des deux. */
[data-mdl-mode="sombre"] body.page-index.prk-medaillon #floatingBetInfo .countdown-time.countdown-muted {
  color: var(--mdl-muted-ink) !important; /* ⟵ countdown-time du scoreboard */
}
[data-mdl-mode="sombre"] body.page-index.prk-medaillon #floatingBetInfo .journee-nav-section .countdown-time.countdown-muted::before {
  background: var(--mdl-muted-ink);
}

/* -------------------------------------------------------------------------
   GROUPE 10 — Bouton « Quitter la ligue » (ligue.php, #ligue-root .leave).
   -------------------------------------------------------------------------
   CAUSE : aucune des 3 feuilles qui stylent .leave (ligue-ecusson.css,
   ligue-medaillon.css, ligue-effectif.css) ne pose de `background` —
   seuls color/border/hover le sont. Un <button> nu retombe sur le gris
   quasi-blanc de l'agent utilisateur (~#efefef, mesuré rgb(239,239,239),
   saturation 0 %) : jamais un token oublié, un `background` jamais posé
   du tout.
   PREMIER ESSAI (background:transparent) FAUX, corrigé après mesure : ça
   expose le dégradé de page DERRIÈRE, et l'encre --mdl-muted-ink de l'état
   « Quitter » (non-danger) — juste sur une carte — devient illisible dessus
   (1,92:1, mesuré). Le commentaire d'origine (ligue-effectif.css:131) cite
   `.sa-status-dropdown-btn` (medaillon-drawer.css) comme référence de
   « pilule neutre du kit » — CETTE référence pose bien un fond
   (`--mdl-canvas`, pas transparent) sous ses états neutres. Repris à
   l'identique : fond --mdl-canvas (crème, cohérent avec la pilule
   « ghost » voulue) + l'encre --mdl-muted-ink déjà en place redevient
   lisible dessus (6,63:1, vérifié).
   Éteint : button.leave (1, SURFACE).
   ------------------------------------------------------------------------- */
[data-mdl-mode="sombre"] body.prk-medaillon #ligue-root .leave { background: var(--mdl-canvas, #F2ECDC); }

/* -------------------------------------------------------------------------
   GROUPE 11 — Carte « Seuils inatteignables » du rapport d'analyse
   (simulation_badges.php, .rapport-card-warning).
   -------------------------------------------------------------------------
   CAUSE (couleur en dur dans la feuille d'origine) : #FBEEDD, saturation
   HSV ≈ 11,9 % — sous le seuil de 12 % qui distingue un accent de marque
   d'un blanc/crème resté neutre (à un cheveu près). .rapport-card n'a pas
   de carte englobante (la section "Rapport d'analyse" est un simple
   `.row` Bootstrap) : posée sur le dégradé, elle lit comme un blanc oublié.
   Réchauffée à 12 % de --mdl-warn sur --mdl-card (au lieu de #FBEEDD en
   dur) : sat. ≈ 12,7 %, franchit le seuil. Vérifié que les enfants (icône
   --mdl-warn, compteur --mdl-muted) ne régressent quasiment pas (2,66→2,51
   et 2,77→2,62 — ni l'un ni l'autre n'était signalé par l'audit avant, et
   aucun ne l'est après).
   .rapport-card-info (fond --mdl-green-soft) est laissé à l'autre agent
   (cf. note de fin de fichier).
   Éteint : div.rapport-card.rapport-card-warning (1, SURFACE).
   ------------------------------------------------------------------------- */
[data-mdl-mode="sombre"] body.prk-medaillon .rapport-card-warning {
  background: color-mix(in srgb, var(--mdl-warn, #C8862F) 12%, var(--mdl-card, #FAF6EC));
}

/* -------------------------------------------------------------------------
   GROUPE 12 — Simulation Badges (simulation_badges.php), reste du même
   motif « hors carte » : le titre d'écran (`<h5>Simulation Badges</h5>`,
   `.section-header` sans fond propre), le filtre de ligues (`<div
   style="opacity:.7">Ligues éligibles…`) et la légende des médailles (5
   `<span>` nus, ex. « O Or ») — tous des enfants directs de `.simbadges`
   (`container-fluid`, sans fond propre non plus, vérifié). Même cause que
   le groupe 1 (encre de carte hors carte), un SIXIÈME site.
   Mesuré avant : h5 (ink) → ~1,03:1 ; .section-count et le filtre de ligues
   (muted-ink) → ~1,92:1 ; les 5 span de légende (ink, hérité par défaut,
   aucune règle dédiée) → ~1,03:1.
   Le filtre de ligues porte déjà `opacity:.7` en ligne (repli volontaire du
   gabarit) : passé en --mdl-page-ink PLEIN (pas -soft, qui composé à
   l'opacité inline tomberait à 4,31:1, sous le seuil texte) → 6,94:1 avec
   l'opacité inline.
   Éteint : h5 (1), span.section-count (1), div (1), span (5, la légende).
   ------------------------------------------------------------------------- */
[data-mdl-mode="sombre"] body.prk-medaillon .simbadges .section-header h5 { color: var(--mdl-page-ink, #F2ECDC); }
[data-mdl-mode="sombre"] body.prk-medaillon .simbadges .section-count { color: var(--mdl-page-ink-soft, rgba(242,236,220,.72)); }
[data-mdl-mode="sombre"] body.prk-medaillon .simbadges form.mb-3 > div { color: var(--mdl-page-ink, #F2ECDC); }
[data-mdl-mode="sombre"] body.prk-medaillon .simbadges .d-flex.flex-wrap.gap-3.mb-4 > span { color: var(--mdl-page-ink, #F2ECDC); }

/* =========================================================================
   CE QUI N'EST PAS DANS CE FICHIER — et pourquoi.

   1. DÉFAUTS D'AUDIT — L'AUDITEUR SE TROMPE (aucune correction) :

   a) La QUASI-TOTALITÉ des CONTRASTE sur i.ph-duotone.* et i.bi.* dans les
      ~25 modales/tiroirs (200 des 224 éléments CONTRASTE de mon périmètre —
      i.ph-duotone.ph-bell-slash/ph-users/ph-flag-banner/ph-heart/ph-sparkle/
      ph-beer-stein/ph-envelope-simple/ph-users-three/ph-megaphone/ph-bell/
      ph-info (14 chacun) + ph-flag-checkered/ph-trophy (9) + ph-clipboard-
      text (8) + ph-users-three sans .me-2 (6) + ph-warning-circle.text-
      warning/ph-calendar-blank.text-info/ph-list-numbers.text-warning (3
      chacun) + ph-identification-card.me-2/ph-lock-key/bi-calculator.me-2
      (1-2 chacun) + 1 des 4 instances de ph-warning). DÉMONSTRATION : la
      comparaison anti-préexistant (`comparerClair`, la garde qui écarte un
      défaut déjà cassé EN CLAIR) tourne dans auditContraste.mjs via
      `detecterDefauts({ racineSelecteur: null })`, c'est-à-dire sur le DOM
      TEL QU'IL EST AU MOMENT DE L'APPEL. Or `auditerModalesEtTiroirs()`
      force l'affichage de chaque modale UNE À LA FOIS via un `<style>`
      injecté, MESURE, PUIS RETIRE ce style avant de passer à la modale
      suivante (`await style.evaluate((el) => el.remove())`). Au moment où
      la comparaison clair s'exécute (après la boucle complète sur toutes
      les modales), elles sont TOUTES refermées : le DOM re-scanné en clair
      ne contient plus AUCUN contenu de modale, donc `enClair` ne peut
      JAMAIS contenir un défaut de modale, donc AUCUN défaut de modale n'est
      JAMAIS reconnu comme « déjà cassé en clair » — même quand il l'est
      réellement. Prouvé par mesure directe (getComputedStyle, hors
      auditeur) sur `.modal-title i` (icône de titre de modale, la cause
      commune à `.modal-header { background: var(--mdl-card) }` +
      `.modal-title i { color: var(--mdl-gold-ink) }` de css/medaillon-modal.css,
      NI L'UNE NI L'AUTRE scopée par mode) :
        clair : encre #C2A14C sur fond #FFFFFF → 2,47:1
        sombre : encre #C8A24B sur fond #FAF6EC → 2,23:1
      Les deux sont sous le seuil non-texte (3:1) — la couleur est identique
      dans les DEUX modes (--mdl-gold sur --mdl-card), le sombre n'est
      responsable de RIEN, juste un peu PLUS mauvais parce que --mdl-card
      (#FAF6EC) est légèrement moins lumineux que le blanc pur du clair
      (#FFFFFF). Corriger le clair est explicitement hors périmètre
      (contrat du chantier) et corriger UNIQUEMENT le sombre créerait une
      incohérence visuelle entre les deux modes pour un défaut qui n'a
      jamais été introduit par le sombre. Même démonstration reproduite sur
      `.prk-notif-inbox-empty i` (ph-bell-slash) : encre `var(--prc-metal,
      #c8a24b)` — un token de L'ANCIEN système Écusson, jamais raccordé au
      mode Médaillon du tout — IDENTIQUE dans les deux modes (2,41:1 clair,
      2,23:1 sombre). Vérifié par ailleurs, sélecteur par sélecteur, que
      chacun des ~20 sélecteurs de cette famille disparaît du rapport dès
      qu'on relance l'audit SANS --modales (donc n'existe que dans une
      modale fermée par défaut) — preuve empirique en plus de la preuve
      structurelle.
      → Ne pas corriger ici serait remettre en cause le système de modale
      partagé (css/medaillon-modal.css, « peau unique », livré 2026-08-20)
      pour un défaut qui n'est pas d'origine sombre. Un futur lot pourrait
      légitimement retoucher --mdl-gold/.modal-title i pour les DEUX modes,
      mais ce n'est pas ce chantier.
      RECOMMANDATION D'OUTIL : la comparaison clair devrait re-jouer
      `auditerModalesEtTiroirs` en clair aussi (pas seulement le DOM nu),
      pour cesser de rapporter cette famille à chaque passe.

   b) FOND_INCONNU sur text.crestword / text.crestxv / button#loginSubmitBtn
      / button#registerSubmitBtn / button#requestResetBtn / a.prc-btn /
      span.btn-label (auth-login/register/oubli/reset, 13 éléments) :
      l'écusson SVG (crestword/crestxv) est peint par un `<path fill="var(
      --crest)">` FRÈRE dans le même <svg>, jamais un ancêtre DOM — la
      remontée d'ancêtres de l'auditeur (qui lit `background-color`/
      `background-image` d'ancêtres HTML) ne peut PAS le voir, exactement
      comme il ne peut pas lire le dégradé de body. --crest-word (#f2ecdc)
      sur --crest (#123b2e) : ~9:1, inchangé par data-mdl-mode (prc-auth.css
      a son propre système de colorways, indépendant du sombre/clair
      Médaillon). Idem pour les boutons `.prc-btn` : fond = dégradé propre
      au bouton (`linear-gradient(var(--btn-1), var(--btn-2))`, #1a4f3d→
      #123b2e), encre `--btn-ink` #faf6ec — ~9-10:1, également indépendant
      du mode. Même famille de limite que l'exemption body* déjà actée.

   2. LAISSÉ DE CÔTÉ VOLONTAIREMENT — mesuré, VRAIMENT correct :

   a) span.comp-toggle (4, admin) — muted #9A9078 sur dégradé de page :
      mesuré en direct à 4,74:1, AU-DESSUS du seuil texte 4,5:1. Assombrir
      l'assombrirait sans raison.

   3. DÉFÉRÉ — DÉJÀ PRIS EN CHARGE PAR L'AUTRE AGENT (pas dupliqué ici) :

   a) --mdl-green-soft (37 éléments : div.comp-logo (10) + span.comp-count
      (10) + span.gct (6, ligues) + span.clogo (6, ligues) + nav.ana-tabs
      (1) + div.ana-title-icon (1) + div.rapport-card-info (1) + span.ct
      (1, ligue)) : TOUS mesurés au même rgb(231,239,232) exact — la
      signature citée telle quelle par medaillon-sombre.css §1 (« 191
      consommateurs mesurés dans 18 feuilles… tous partagent EXACTEMENT le
      même fond avant correctif : rgb(231,239,232) partout »), avec la
      cause déjà remontée (token --mdl-green-soft, bascule prévue dans
      css/medaillon-tokens.css → #E7EFE8 (changement ANNULÉ, cf. plus bas)) et la note explicite « pas de
      règle locale de secours — en ajouter une reviendrait à peindre deux
      fois le même défaut ». Le token n'est pas encore basculé au moment de
      ce chantier (vérifié : medaillon-tokens.css contient toujours #E7EFE8
      sombre), mais c'est un chantier EN COURS chez l'autre agent, pas un
      oubli — dupliquer ici créerait une collision au moment de la fusion.

   b) .eyebrow (1, statistiques : "Feuille de scouting"), .seclabel .t
      (4, resultats+badges), span.match-time-label (4, mes-pronos),
      span.h = .prk-profil .sect .h (2, profil), h1.cls-title + p.cls-sub
      (1+1, classement) : DÉJÀ CORRIGÉS et vérifiés en direct (6,23:1 /
      7,26:1 / span.h à 6,63:1 après remise en scène / cls-title+cls-sub
      appliqués et lisibles) via medaillon-sombre.css:54-68 (.eyebrow/
      .seclabel .t, bascule --mdl-page-ink-soft + rattrapage carte/match/
      kpi) et :545-565 (les 4 cas nommément traités par l'autre agent :
      .match-time-label/.match-time::after, .cls-tete .cls-title/
      .cls-sub, .prk-profil .sect .h). NOTE 2026-09-10 : .match-time-label
      n'est plus servi d'ici — css/mes-pronos-medaillon.css le branche
      lui-même sur --mdl-page-ink-soft, dans les deux modes. Le rapport JSON (figé au 2026-09-02
      17:17) les listait encore cassés ; relancé en direct, ils sont
      propres — la fixture/le fichier voisin a bougé depuis. Ne restent
      listés FOND_INCONNU dans un futur audit QUE parce que le dégradé
      reste illisible pour l'outil (même limite que le groupe 1 ci-dessus),
      pas parce qu'ils sont cassés.

   c) span.badge-dot.argent (1, badges, SURFACE) : #C9CDD2, saturation
      HSV 4 % — nommément cité comme résidu ASSUMÉ par l'auditeur lui-même
      (audit-contraste.mjs, commentaire sur SEUIL_SATURATION_ACCENT :
      « la seule couleur de marque du dépôt dont la teinte est
      indissociable d'un gris neutre par le calcul seul, à trancher à
      l'œil »). Rien à démontrer de plus ici que ce que l'instrument dit
      déjà de lui-même : ce n'est pas une découverte, c'est un arbitrage
      produit (argent = gris) déjà noté comme tel.

   d) #stickyStandings (1, mes-pronos, SURFACE) : élément du panneau
      classement collé (desktop, legacy css/styles.css), introuvable/
      invisible dans mes deux tentatives de mesure directe (nécessite
      probablement `body.page-index.desktop-fixed-layout`, un état que je
      n'ai pas réussi à amorcer depuis le harnais de fixture). L'autre
      agent a déjà posé des règles sœurs sur ce même sous-système
      (`#stickyMembersGains .standings-table th`, medaillon-sombre.css:420-
      423) : plutôt que de deviner à l'aveugle sur un élément que je n'ai
      jamais vu rendu, je le laisse à qui peut le reproduire.
   ========================================================================= */

/* =======================================================================
   NETTOYAGE FINAL (fusionné le 2026-09-02)
   Source : .superpowers/sdd/sombre-nettoyage-final.css, rapport nettoyage-final-report.md
   9 règles, 5 groupes causaux. admin-ligues 11→3, admin-avance 21→7, ligues 10→0.
   Le reste des signalements a été DÉMONTRÉ faux : déjà corrigé et seulement
   invisible à l'auditeur (dégradés), déjà conforme, ou préexistant en clair.
   ======================================================================= */
/* =========================================================================
   PRC XV — Mode sombre « Écusson », NETTOYAGE FINAL (2026-09-02)
   -------------------------------------------------------------------------
   Dernier lot du chantier mode sombre : 166 défauts restants (65 sélecteurs)
   dans tests/js/.audit-sombre.json, après recalibrage de l'auditeur (écarte
   décoratif/accents/surfaces conformes/défauts déjà en clair).
   INERTE tant que [data-mdl-mode="sombre"] n'est pas posé. Couleur SEULE :
   aucun markup, classe, structure, taille, rayon, police ou ordre touché.
   Brouillon de fusion — NE PAS charger dans l'app, ne remplace pas
   css/medaillon-sombre.css. Le contrôleur fusionnera au moment voulu.
   ========================================================================= */

/* -------------------------------------------------------------------------
   A. Pastilles/chips « compétition » posées DIRECTEMENT sur le dégradé de
      page (jamais sur une carte) — 7 sélecteurs, 4 écrans.
   -------------------------------------------------------------------------
   CAUSE COMMUNE : tous consomment `var(--mdl-green-soft)` en fond (token
   partagé par ~191 endroits dans 18 feuilles — cf. note de tête de
   css/medaillon-sombre.css). Le token vaut #E7EFE8 (sat. HSV 3 %) : correct
   pour les ~155 autres consommateurs, posés SUR une carte crème (surface
   claire sur surface claire, jamais un défaut — cf. commentaire de
   l'auditeur, audit-contraste.mjs:681-693). Ces 7-là sont les EXCEPTIONS :
   posés SANS carte, à même le dégradé sombre — vérifié par mesure directe
   (getComputedStyle sur les ancêtres réels, pas par lecture des feuilles) :
   #comp-header / #ghead / .ana-header / #ligue-root .sect n'ont eux-mêmes
   aucun `background` propre.

   PIÈGE ÉVITÉ (le chantier a déjà payé cette erreur 3 fois, cf. consigne) :
   remonter le SEUIL DE SATURATION du token lui-même (le faire glisser vers
   #E7EFE8 (changement ANNULÉ, cf. plus bas), comme une note laissée par un agent précédent le proposait à
   tort, css/medaillon-sombre.css:224-228) « réglerait » ce rapport en
   assombrissant identiquement les ~155 AUTRES consommateurs, déjà conformes
   dans leur carte — exactement le mode de défaillance décrit dans la
   consigne (« saturer un token partagé par 191 endroits »). Vérifié par
   calcul : même à 40 % de --mdl-green mélangé au token, la saturation
   résultante ne dépasse QUE de justesse le seuil de 12 % (0,122) pour un
   virage visuel de #E7EFE8 (quasi blanc) à #9EB4A6 (vert soutenu) — bien
   trop marqué pour ~155 badges qui n'ont RIEN de cassé aujourd'hui.

   FIX RETENU : miroiter le motif déjà approuvé au groupe 10 de
   css/medaillon-sombre.css (bouton « Quitter la ligue », même situation —
   un composant sans carte propre, posé sur le dégradé) : `--mdl-canvas`
   (#F2ECDC), la surface DE COMPOSANT prévue par la peau, PAS la carte
   elle-même. Valeur EXACTE de TEINTES_SURFACE_PREVUES (audit-contraste.mjs:
   124-128) → SURFACE ne se déclenche plus, sans avoir besoin de franchir le
   seuil de saturation. --mdl-green (encre) sur --mdl-canvas : 7,94:1,
   largement au-dessus du seuil texte. Rien d'autre ne change (bordure/ombre
   restent sur --mdl-line, déjà correct).

   Éteint : SURFACE div.comp-logo (10, admin-ligues+admin-avance),
   SURFACE span.comp-count (10, admin-ligues+admin-avance),
   SURFACE span.gct (6, ligues), SURFACE span.clogo (6, ligues),
   SURFACE nav.ana-tabs (1, analytics), SURFACE div.ana-title-icon
   (1, analytics), SURFACE span.ct (1, ligue) — 35 éléments.
   ------------------------------------------------------------------------- */
[data-mdl-mode="sombre"] body.prk-medaillon .comp-logo,
[data-mdl-mode="sombre"] body.prk-medaillon .comp-count {
  background: var(--mdl-canvas, #F2ECDC);
}
[data-mdl-mode="sombre"] body.prk-medaillon #ligue-creator-root .clogo,
[data-mdl-mode="sombre"] body.prk-medaillon #ligue-creator-root .ghead .gct,
[data-mdl-mode="sombre"] body.prk-medaillon #ligue-creator-root .ghead .getat:not(.rappel) {
  background: var(--mdl-canvas, #F2ECDC);
}
/* .getat.rappel GARDE son #FBEEDD (littéral repris de .next.rappel, css/ligues-medaillon.css) :
   un résidu assumé sous le seuil de saturation de cet auditeur (même famille que le paragraphe
   ci-dessus), documenté ici pour qu'il ne soit pas « corrigé » par erreur au passage — le
   sélecteur d'attribut ci-dessus l'emporterait sur lui et effacerait l'ambre sans le
   :not(.rappel), rendant les deux états (validé / à saisir) identiques en sombre. */
[data-mdl-mode="sombre"] body.prk-medaillon .ana-tabs,
[data-mdl-mode="sombre"] body.prk-medaillon .ana-title-icon {
  background: var(--mdl-canvas, #F2ECDC);
}
[data-mdl-mode="sombre"] body.prk-medaillon #ligue-root .sect .ct {
  background: var(--mdl-canvas, #F2ECDC);
}

/* -------------------------------------------------------------------------
   B. Carte « Seuils largement atteignables » (simulation_badges.php,
      .rapport-card-info) — même famille de cause que le groupe A
      (consomme --mdl-green-soft directement, posée sans carte englobante :
      la section « Rapport d'analyse » est un simple `.row` Bootstrap,
      vérifié par grep, même constat que sa sœur .rapport-card-warning déjà
      traitée dans css/medaillon-sombre.css groupe 11), mais UN VRAI CARTE
      pleine largeur, pas une pastille de 22-28px : --mdl-canvas (motif A)
      y ferait un bloc neutre plat, alors que sa sœur .rapport-card-warning
      est délibérément TEINTÉE (12 % de --mdl-warn mélangé à --mdl-card) pour
      garder la distinction sémantique warning=orange / info=vert. Même
      méthode ici, reprise à l'identique, juste réglée sur le bon ingrédient :
      --mdl-win (vert plus vif que --mdl-green, #1E7A4B) est nécessaire à une
      proportion plus élevée pour franchir le même seuil de saturation
      (12 %) — --mdl-green pur ne le franchit qu'à 40 % de mélange (un virage
      visuel disproportionné pour une carte). Mesuré : 34 % de --mdl-win dans
      --mdl-card → rgb(175,204,181), saturation HSV 14,2 % (marge de
      sécurité sur le seuil), luminosité encore très claire (8,66:1 contre le
      dégradé de page). Encre --mdl-green du titre/icône dessus : 5,41:1 —
      au-dessus du seuil texte partout où elle est utilisée (.rapport-card-
      title, .rapport-card-info .rapport-card-icon).
      .rapport-card-count (compteur, --mdl-muted) N'EST PAS retouché : mesuré
      ~2,1-2,9:1 sur TOUTES les variantes de fond essayées, y compris le fond
      ACTUEL en clair (rgb(234,241,237), 2,14:1) et le fond déjà approuvé de
      .rapport-card-warning en sombre (2,63:1) — un défaut PRÉEXISTANT des
      deux côtés, hors périmètre de ce chantier (déjà écarté par l'auditeur
      lui-même, absent des 65 sélecteurs), pas une régression introduite ici.
   Éteint : SURFACE div.rapport-card.rapport-card-info (1, badges).
   ------------------------------------------------------------------------- */
[data-mdl-mode="sombre"] body.prk-medaillon .rapport-card-info {
  background: color-mix(in srgb, var(--mdl-win, #1E7A4B) 34%, var(--mdl-card, #FAF6EC));
}

/* -------------------------------------------------------------------------
   C. Statistiques — titre « Connais tes rivaux » (#stats-root .profils-title
      h2), motif « tête d'écran » déjà traité 5 fois ailleurs (groupe 1 de
      css/medaillon-sombre.css) mais un SIXIÈME site oublié : ce <h2> est
      injecté par JS dans `#view-profils` (statistiques.php:3037), une
      simple <section> SANS fond propre (vérifié : aucune
      règle `background` sur #view-profils dans les feuilles),
      posée directement sur le dégradé de #stats-root. Consomme --mdl-ink
      (css/statistiques-medaillon.css:291), le token de CARTE — même cause
      que les 5 autres. .profils-title .eyebrow est DÉJÀ couvert par la
      règle générique `.eyebrow { color: var(--mdl-page-ink-soft) }`
      (medaillon-sombre.css:56), non scopée : rien à ajouter pour lui.
      Mesuré avant : --mdl-ink #20261F sur le dégradé (~#0D2C22) → ~1,03:1
      (même signature que les 5 fixes soeurs). Après : --mdl-page-ink,
      lisible (mêmes ~9-10:1 que les fixes voisines).
   Éteint : FOND_INCONNU h2 (1, statistiques) — reste listé FOND_INCONNU
   dans un futur audit (dégradé toujours illisible pour l'outil), pas parce
   que cassé : même limite d'instrument que les 5 fixes sœurs du groupe 1.
   ------------------------------------------------------------------------- */
[data-mdl-mode="sombre"] body.prk-medaillon #stats-root .profils-title h2 {
  color: var(--mdl-page-ink, #F2ECDC);
}

/* -------------------------------------------------------------------------
   D. Mes pronos, panneau classement collé desktop (#stickyStandings) —
      CAUSE (couleur en dur, hors système de tokens) : `.standings {
      background-color: white; }` (css/styles.css:3147-3153, feuille LEGACY
      pré-Médaillon). #stickyStandings est le SEUL consommateur de cette
      classe dans tout le dépôt (grep confirmé, contre `class="standings
      sticky-table"` — index.php:1377) : sûr de scoper sans effet de bord.
      Son voisin #stickyMembersGains n'est PAS concerné : autre classe
      (.members-gains), déjà couvert côté Médaillon (medaillon-sombre.css,
      #stickyMembersGains .standings-table th).
   Éteint : SURFACE div#stickyStandings (1, mes-pronos).
   ------------------------------------------------------------------------- */
[data-mdl-mode="sombre"] #stickyStandings {
  background-color: var(--mdl-card, #FAF6EC);
}

/* -------------------------------------------------------------------------
   E. Admin — tiroir « Créer une saison », placeholders des champs Nom /
      Nom court (#drawerNom, #drawerNomCourt) — CAUSE (aucune règle Médaillon
      ne pose de couleur de placeholder pour .drawer-form-input/-select,
      grep confirmé) : retombe sur le gris par défaut du navigateur
      (rgb(117,117,117), jamais tokenisé), pensé pour un fond BLANC. Fond
      réel de .drawer-form-input : --mdl-card (css/medaillon-drawer.css:258),
      #FFFFFF en clair (4,61:1, tient tout juste) → #FAF6EC en sombre
      (4,27:1, tombe sous 4,5). EXACTEMENT la même famille de cause que les 2
      placeholders déjà traités dans css/medaillon-sombre.css:596-652 (le
      même gris littéral, jamais retouché pour le fond crème du sombre) —
      troisième site du même motif, même remède : --mdl-muted-ink, le token
      « encre douce mais lisible » déjà choisi pour les deux premiers sites
      (cohérence de teinte entre les 3 champs). Mesuré : #4A5548 sur --mdl-
      card (#FAF6EC) → 7,25:1.
   Éteint : CONTRASTE input#drawerNom (1, admin-ligues, placeholder),
   CONTRASTE input#drawerNomCourt (1, admin-ligues, placeholder).
   ------------------------------------------------------------------------- */
[data-mdl-mode="sombre"] .drawer-form-input::placeholder,
[data-mdl-mode="sombre"] .drawer-form-select::placeholder {
  color: var(--mdl-muted-ink, #4A5548);
}

/* Libellés de section de l'onglet Réglages (« APPARENCE », « GÉNÉRAL »,
   « ADMINISTRATION »). Même famille que les têtes d'écran : posés SUR le fond
   de page, hors carte, ils héritaient de l'encre des cartes.
   Ni l'empreinte ni l'auditeur ne pouvaient les voir — cet onglet est masqué
   par défaut, donc jamais mesuré. Trouvé à l'œil sur une capture, ce qui est
   exactement pourquoi un chantier de couleur ne se juge pas qu'à la mesure.
   L'ancre d'origine (body.prk-medaillon .prk-profil, 0,2,1) est miroitée :
   avec l'attribut de mode on passe à (0,3,1), ce qui suffit. */
:root[data-mdl-mode="sombre"] body.prk-medaillon .prk-profil .reg-lab {
  color: var(--mdl-page-ink-soft);
}

/* Flèches de navigation de journée, à l'état DÉSACTIVÉ (écran Résultats).
   Elles portent un fond rgb(240,240,240) à opacité .6, posé ailleurs. Sur le
   crème du mode clair il disparaît dans la page — c'est l'effet « désactivé »
   voulu. Sur le vert profond, il devient l'objet le plus contrasté de l'écran,
   de part et d'autre du rail.
   Aucun instrument ne pouvait le voir : la famille SURFACE de l'auditeur
   abandonne toute surface claire SEMI-TRANSPARENTE posée sur le dégradé de
   page (audit-contraste.mjs, `if (!dessous || dessous.inconnu) return null`).
   Trouvé à l'œil en revue finale. On rend le fond transparent : l'état
   désactivé reste porté par l'opacité, comme en clair. */
:root[data-mdl-mode="sombre"] #resultats-root .jrail-nav:disabled {
  /* Mesuré : sans !important, une règle à spécificité (1,3,1) ne bat PAS la
     règle globale de styles.css:2422. L'état désactivé reste porté par
     l'opacité, exactement comme en mode clair. */
  background-color: transparent !important; /* ⟵ recouvre styles.css:2422 button:disabled{...!important} */
}

/* =========================================================================
   LE CHROME : BARRE DU HAUT ET BARRE BASSE — 2026-09-02
   -------------------------------------------------------------------------
   Retour de Julien sur capture : « le header ne doit pas être de la même
   couleur, c'est-à-dire vert ? ». Ses maquettes lui donnent raison, et sans
   ambiguïté — dans `ligue-page-B-clubhouse.html` comme dans `hub-ecusson.html`,
   les deux barres sont bâties sur `--prc-page-2` / `--crest`, avec un titre en
   `--prc-crest-word` (crème) et des libellés en `rgba(242,236,220,.62)`.
   On ne pose pas du texte crème sur un fond crème : le chrome y est SOMBRE.

   Le kit Médaillon peint la topbar avec --mdl-canvas et la barre basse avec
   --mdl-card. En sombre, ces deux tokens valent du crème : le chrome est donc
   resté clair, en écharpe autour d'une app verte.

   Aucun instrument ne pouvait le signaler — une barre crème est une TEINTE
   PRÉVUE de la peau, donc explicitement exemptée par l'auditeur (et à raison :
   pour une carte). C'est une question de design, elle se tranche à l'œil et
   sur la maquette, pas à la mesure.

   L'onglet actif passe à l'or clair, comme `.tab.on{color:var(--metal-2)}` de
   la maquette : le vert de marque disparaîtrait sur un fond vert.
   ========================================================================= */

/* ---- barre basse (masquée ≥992px, pas besoin de media query) ----
   Même matière que le voile du haut, à la demande de Julien (« on pourrait faire
   la même chose sur la navbar du bas ? », 2026-09-09) : verre teinté plutôt
   qu'aplat, pour que le contenu passe DERRIÈRE au lieu d'être coupé net.

   92 %, LA MÊME VALEUR QUE LE VOILE DU HAUT, et pas moins. Les libellés font
   9,6px : c'est le seuil AA du texte NORMAL (4,5:1) qui s'applique, sans
   indulgence. Mesuré au navigateur, libellés à .62 (l'ancienne valeur) :
     aplat opaque (avant)  5,46:1
     voile 88 %            4,26:1   ← sous AA
     voile 72 %            3,00:1   ← on lisait « Stade Mayol » à travers
   Le voile ne pouvait donc PAS être posé seul : voile et libellés forment un
   COUPLE, pas deux réglages indépendants. D'où l'opacité des libellés inactifs
   montée de .62 à .80 juste en dessous. Ne jamais rebaisser l'un sans remonter
   l'autre.

   ⚠ VÉRIFIÉ PAR BALAYAGE, pas sur un seul point : 14 positions de défilement ×
   4 libellés × 2 moteurs × 2 modes = 224 mesures, en retenant le PIRE fond que
   chaque libellé rencontre. Résultat, voile à 92 % + libellés à .80 :
     chromium clair 5,30   chromium sombre 6,01
     webkit   clair 4,79   webkit   sombre 5,14
   Une première version à 88 % descendait à 4,55 (webkit clair) : au-dessus
   d'AA, mais sans marge. Le passage à 92 % a été décidé sur CETTE mesure.
   Un point de mesure unique donnait 5,99 et aurait laissé passer les 4,55 :
   sur un fond qui DÉFILE, une seule position ne prouve rien.

   `backdrop-filter` est ici sans danger, contrairement à la barre du HAUT : le
   seul enfant positionné est `.prk-mobile-bottom-indicator`, en `absolute`, dont
   la barre est déjà le bloc conteneur. Aucun descendant en `fixed`. */
:root[data-mdl-mode="sombre"] body.prk-medaillon .prk-mobile-bottom-nav {
  /* Bornes en variables comme le fond de page : en mode « Équipe », la barre
     basse suit les couleurs du club au lieu de rester verte au pied d'une page
     rouge. Repli sur le vert PRC XV. */
  background: linear-gradient(180deg,
      color-mix(in srgb, var(--mdl-page-1, #123B2E) 92%, transparent),
      color-mix(in srgb, var(--mdl-page-2, #0D2C22) 92%, transparent));
  /* ⟵ recouvre le `backdrop-filter: none` de medaillon-kit.css:283 (spécificité
        (0,3,1) contre (0,2,1), aucun !important nécessaire). */
  -webkit-backdrop-filter: blur(18px) saturate(1.3);
  backdrop-filter: blur(18px) saturate(1.3);
  border-top-color: rgba(242,236,220,.14);
}
:root[data-mdl-mode="sombre"] body.prk-medaillon .prk-mobile-bottom-item,
:root[data-mdl-mode="sombre"] body.prk-medaillon .prk-mobile-bottom-item:link,
:root[data-mdl-mode="sombre"] body.prk-medaillon .prk-mobile-bottom-item:visited {
  /* .80 et non .62 : contrepartie OBLIGATOIRE du voile ci-dessus (voir le calcul).
     L'onglet actif reste distinct — il est OR (--mdl-gold-2), pas juste plus opaque. */
  color: rgba(242,236,220,.80);
}
:root[data-mdl-mode="sombre"] body.prk-medaillon .prk-mobile-bottom-item.is-active,
:root[data-mdl-mode="sombre"] body.prk-medaillon .prk-mobile-bottom-item[aria-current="page"],
:root[data-mdl-mode="sombre"] body.prk-medaillon .prk-mobile-bottom-item.is-active i,
:root[data-mdl-mode="sombre"] body.prk-medaillon .prk-mobile-bottom-item[aria-current="page"] i {
  color: var(--mdl-gold-2);
}
/* Le repère de l'onglet actif est peint en --mdl-green par la nav basse : sur
   un fond vert il disparaîtrait. Or, comme le `.tab.on::after` de la maquette. */
:root[data-mdl-mode="sombre"] body.prk-medaillon #prkMobileActiveIndicator {
  background: var(--mdl-gold);
}

/* ---- barre du haut : déplacée dans css/chrome-telephone-sombre.css (lot 2 du
        chantier grand écran, spec 2026-09-30), liée par navbar.php juste après
        cette feuille avec un attribut media écrit par PHP. ---- */

/* Le repère de compétition de la barre du haut (`prk-hubtop-*`) est une AUTRE
   variante que celle du kit : il est stylé par un <style> en ligne de
   navbar.php (l. 1365-1456), sur les tokens --prc-*, sans notion de mode.
   Sur la barre devenue sombre, son nom sortait en --prc-ink (#20261f, quasi
   noir) et son badge de journée en --prc-crest (#123b2e) : invisibles.
   Notre spécificité (0,2,0 contre 0,1,0) suffit, sans !important. */
:root[data-mdl-mode="sombre"] .prk-hubtop-name { color: var(--mdl-page-ink); }
:root[data-mdl-mode="sombre"] .prk-hubtop-chev { color: var(--mdl-page-ink-soft); }
:root[data-mdl-mode="sombre"] .prk-hubtop-j {
  color: var(--mdl-gold-2);
  background: rgba(242,236,220,.12);
}
/* Le blason est un aplat vert sur une barre verte : on le détache d'un liseré
   crème plutôt que de le repeindre, pour garder son identité de compétition. */
:root[data-mdl-mode="sombre"] .prk-hubtop-crest {
  box-shadow: inset 0 0 0 1px rgba(242,236,220,.22);
}

/* Ascenseurs et contrôles NATIFS du navigateur. Sans `color-scheme`, il les
   peint en clair : c'est la barre de défilement blanche que Julien a repérée
   sur sa capture, tranchant sur le vert. Seul moyen propre de la basculer ;
   emporte aussi les contrôles de formulaire natifs et les sélecteurs de date. */
:root[data-mdl-mode="sombre"] {
  color-scheme: dark;
}

/* Tableaux en mode sombre : même parchemin doré (Julien, 11/10/2026).
   La surface et ses encres restent locales : les cartes gardent leur palette.
   Fonds sur les cellules et filets inset pour éviter les coutures de Safari. */
:root[data-mdl-mode="sombre"] body.prk-medaillon :is(table, .stats-table, .mobile-table-container) {
  --mdl-win: #0C4E2C;
  --mdl-loss: #8E2A24;
  --mdl-gold-ink: #755A18;
  --mdl-muted: #4A5548;
  --mdl-muted-ink: #3A443A;
  color: var(--mdl-ink);
}
:root[data-mdl-mode="sombre"] body.prk-medaillon :is(table, .classement-main-spacing .stats-table, .classement-main-spacing .mobile-table-container, #stats-root .stats-table) {
  --bs-table-bg: var(--mdl-parchment);
  --bs-table-color: var(--mdl-ink);
  background: var(--mdl-parchment);
}
:root[data-mdl-mode="sombre"] body.prk-medaillon :is(.classement-main-spacing .stats-table, .classement-main-spacing .mobile-table, #stats-root .stats-table, .prk-poules-table, .standings-table, .simple-table, .ge-table, table) :is(td, th) {
  background: var(--mdl-table-row, var(--mdl-parchment)) !important; /* ⟵ fonds Bootstrap, inline et feuilles des écrans */
  border-color: var(--mdl-line-soft) !important; /* ⟵ filets des feuilles propres à chaque écran */
  box-shadow: inset 0 -1px 0 var(--mdl-line-soft);
}
:root[data-mdl-mode="sombre"] body.prk-medaillon table :is(tr.top-1, tr.desktop-top-1) { --mdl-table-row: var(--mdl-podium-or); }
:root[data-mdl-mode="sombre"] body.prk-medaillon table :is(tr.top-2, tr.desktop-top-2) { --mdl-table-row: var(--mdl-podium-argent); }
:root[data-mdl-mode="sombre"] body.prk-medaillon table :is(tr.top-3, tr.desktop-top-3) { --mdl-table-row: var(--mdl-podium-bronze); }
/* Le filet personnel et les zones du classement des équipes restent des repères. */
:root[data-mdl-mode="sombre"] body.prk-medaillon :is(.classement-main-spacing .stats-table, .classement-main-spacing .mobile-table, #stats-root .stats-table, .ge-table) :is(tr.player-row, tr.table-primary, tr.me) > td:first-child {
  box-shadow: inset 3px 0 0 var(--mdl-green), inset 0 -1px 0 var(--mdl-line-soft) !important; /* ⟵ filet des lignes personnelles */
}
:root[data-mdl-mode="sombre"] body.prk-medaillon :is(.prk-poules-table, .standings-table) :is(tr.prk-poules-demi, tr.qualifier-1) :is(td.prk-poules-rg, td.position) { background: #C1D2AE !important; color: #12633D; } /* ⟵ zone de demi-finale */
:root[data-mdl-mode="sombre"] body.prk-medaillon :is(.prk-poules-table, .standings-table) :is(tr.prk-poules-barrage, tr.qualifier-2) :is(td.prk-poules-rg, td.position) { background: #C3CDE1 !important; color: #0950B8; } /* ⟵ zone de barrage */
:root[data-mdl-mode="sombre"] body.prk-medaillon :is(.prk-poules-table, .standings-table) :is(tr.prk-poules-access, tr.access) :is(td.prk-poules-rg, td.position) { background: #E8D2AD !important; color: #7A4F17; } /* ⟵ zone d'access match */
:root[data-mdl-mode="sombre"] body.prk-medaillon :is(.prk-poules-table, .standings-table) :is(tr.prk-poules-relegation, tr.relegation) :is(td.prk-poules-rg, td.position) { background: #ECC2AA !important; color: #A02632; } /* ⟵ zone de relégation */
:root[data-mdl-mode="sombre"] body.prk-medaillon :is(.classement-main-spacing .stats-table, .classement-main-spacing .mobile-table, #stats-root .stats-table) .reussite-tier-3 { color: var(--mdl-gold-ink) !important; } /* ⟵ or des pourcentages médians */
:root[data-mdl-mode="sombre"] body.prk-medaillon #stats-root .stats-table :is(.podium-last, .podium-before-last) { color: var(--mdl-muted-ink) !important; } /* ⟵ gris du bas de podium dans styles.css */
:root[data-mdl-mode="sombre"] body.prk-medaillon #stats-root .stats-table :is(.desktop-rank.silver, .mobile-rank.silver) { color: #3E4A54 !important; } /* ⟵ argent clair des rangs dans statistiques-medaillon.css */
:root[data-mdl-mode="sombre"] body.prk-medaillon #stats-root .stats-table :is(.desktop-rank.bronze, .mobile-rank.bronze) { color: #6C421F !important; } /* ⟵ bronze clair des rangs dans statistiques-medaillon.css */
