/* ═══════════════════════════════════════════════════════════════════════════
   LOUISON — Design system « Le poste de veille »   (USL Dunkerque)

   La coque est la NUIT, le contenu est le PAPIER ÉCLAIRÉ.
   Navigation, accueil, bandeaux et en-têtes sur Mirage ; les tableaux de 81 000
   joueurs et les fiches restent sur fond clair — un tableau dense en tout-sombre
   est superbe en capture et épuisant à la douzième heure, et c'est là que vivent
   les contrastes qu'il faut tenir.

   LA LUMIÈRE NE DÉCORE JAMAIS. Calico (--sand) marque ce qui est ACTIF ou EN
   ALERTE : onglet courant, ligne visée, jeton choisi, arête d'un bandeau. Posée
   partout, elle ne dirait plus rien — c'est la seule règle qui tient ce monde.

   Polices : chargées via <link> + preconnect dans base.html (l'ancien @import CSS
   bloquait le rendu et sérialisait les requêtes).
   ═══════════════════════════════════════════════════════════════════════════ */

:root {
  /* ── La nuit ── Mirage #1B2738 est la couleur officielle du club. Les deux
     variantes ne sont pas des teintes inventées : --night-2 est le relief (bande
     survolée, carte posée sur la nuit), --night-3 le fond de cale (pied de page,
     creux). Aucune n'écrit de texte. */
  --night:      #1B2738;
  --night-2:    #26354A;
  --night-3:    #121A26;
  /* Encre secondaire SUR la nuit. Teintée du bleu de la nuit, jamais grise :
     un gris neutre sur un fond coloré se lit comme une tache. 7,3:1 sur --night. */
  --night-mut:  #A7B5C8;

  /* ── La lumière ── Calico #E0C090, officiel. La charte du club la réserve au
     lettrage et aux contours : c'est exactement son emploi ici, l'arête éclairée.
     --sand-2 est la même lumière plus dense (bordure appuyée, survol) ;
     --sand-fg est sa variante TEXTE sur fond clair — Calico écrit à 1,9:1 sur
     blanc, donc illisible, il ne remplace jamais une encre. */
  --sand:       #E0C090;
  --sand-2:     #C8A063;
  --sand-fg:    #7A5A1E;
  --sand-voile: rgba(224, 192, 144, .22);   /* filets et graticule sur la nuit */

  --ink:        #14181A;
  --ink-2:      #4A524D;
  /* #737B75 tombait à ~4,0:1 sur --paper (sous AA) ; assombri pour passer 4,5:1
     tout en restant plus clair que --ink-2. */
  --muted:      #656E68;
  --paper:      #F4F5F7;
  --surface:    #FFFFFF;
  --line:       #E1E5EA;
  --line-2:     #CFD6DE;

  /* Échelle des percentiles. Ces cinq-là sont des FONDS de barre : la couleur
     EST la donnée, on n'y écrit pas. Elles ne bougent donc pas — c'est le
     langage visuel du produit. Pour les rares pastilles pleines qui portent du
     texte par-dessus, voir `--p-*-fg` juste en dessous. */
  --p-elite: #1E9E5A;
  --p-good:  #63B487;
  --p-avg:   #E8B04B;
  --p-low:   #E08748;
  --p-poor:  #C7513B;

  /* Encre à poser SUR chacune de ces pastilles. Le blanc systématique donnait
     1,95:1 sur `--p-avg` et 2,50:1 sur `--p-good` — illisible. Sur les fonds
     clairs c'est l'encre foncée qui passe (7,1 à 9,1:1), sur les fonds soutenus
     le blanc, à condition d'assombrir un peu le fond. */
  /* Variantes TEXTE des paliers : les cinq couleurs de barre écrivent mal
     sur blanc (`--p-low` à 2,72:1 pour un nombre de 30 px). Ces valeurs ne
     sont pas inventées — ce sont exactement celles que composition.css
     emploie déjà pour les notes des jetons, remontées ici pour cesser
     d'exister en double. 4,98 à 6,19:1 sur blanc. */
  --p-elite-tx: #157A45;  --p-good-tx: #14804A;  --p-avg-tx: #8F6410;
  --p-low-tx:   #9C5528;  --p-poor-tx: #A83E2C;

  --p-elite-bg: #157A43;  --p-elite-fg: #FFFFFF;   /* 5,39:1 */
  --p-good-fg:  var(--ink);                        /* 7,15:1 sur --p-good  */
  --p-avg-fg:   var(--ink);                        /* 9,14:1 sur --p-avg   */
  --p-low-fg:   var(--ink);                        /* 6,58:1 sur --p-low   */
  --p-poor-bg:  #A83420;  --p-poor-fg:  #FFFFFF;   /* 6,61:1 */

  --ok:   #1E9E5A;
  --warn: #C98A00;
  /* #C7513B tombait à 4,497:1 sur blanc — sous AA de trois millièmes, et à
     4,15:1 sur --paper. Assombri juste assez pour passer des deux côtés. */
  --bad:  #BC432D;

  /* ── Variantes TEXTE des couleurs d'accent ──
     Les couleurs ci-dessus sont calibrées pour des aplats et des bordures. En
     TEXTE sur fond clair elles échouent toutes : Calico écrit à 1,9:1 sur blanc
     (compteur de résultats, badges de niveau, jetons), --ok à 3,18:1 (pastille
     StatsBomb). Des jetons dédiés plutôt qu'un assombrissement global, qui
     aurait terni les bordures et les aplats où la lumière vive est juste.
     `--sand-fg` est défini plus haut, avec le reste de la lumière. */
  --ok-fg:    #157A43;   /* 4,97:1 sur --paper, 5,39:1 sur blanc */

  /* États de message (succès/erreur/avertissement) — tokens plutôt qu'hex épars */
  --success-bg: #E7F4EC; --success-fg: #14663C; --success-line: #B9E0C9;
  --error-bg:   #FBEAE7; --error-fg:   #9E3122; --error-line:   #F0CFC8;
  --warn-bg:    #FCF4E1; --warn-fg:    #8A5E00; --warn-line:    #EAD8AC;

  /* Couleurs de badge niveau qui n'ont pas d'équivalent dans la palette « pitch » */
  /* ── Échelle des notes 1 → 4 (1 = meilleur) ────────────────────────────
     Trois teintes par palier : fond, encre, bordure. Elle existait déjà, en
     dur, recopiée à l'identique dans TROIS composants — pastilles de note,
     cartes de recommandation, bascule de faisabilité — soit 35 littéraux pour
     douze couleurs. Ce n'était pas de la dérive, c'était une famille
     sémantique sans jetons.
     ⚠️ Volontairement distincte de `--error-*` / `--warn-*`, bien que deux
     valeurs coïncident : une note 4 n'est pas une erreur, et retoucher la
     couleur des messages d'erreur ne doit pas repeindre les notes.

     ⚠️ Le haut de l'échelle a été TURQUOISE le 17/09/2026, il était bleu marine.
     La règle n'a pas changé, c'est le produit qui a changé de couleur : on avait
     choisi le bleu parce que « le bleu n'appartient à rien d'autre ici » quand la
     coque était verte. La coque étant devenue le bleu de Dunkerque, une note 1 en
     #0F4B87 redevenait exactement ce qu'on fuyait — un élément de décor aux
     couleurs du club. Le turquoise ne touche ni au Mirage de la coque (bleu
     sombre désaturé) ni au vert des percentiles. Le bas de l'échelle (ambre,
     rouge) ne bouge pas : l'alerte a sa couleur, et elle est juste. Les
     percentiles, eux, restent verts — l'échelle StatsBomb n'est pas une notation
     de scout et les confondre effacerait la seule chose que le cloisonnement
     protège : la différence entre ce qu'un homme a vu et ce qu'un modèle a
     calculé. */
  --n1-bg: #CFE9EF;  --n1-fg: #0A5A6B;  --n1-line: #A2D3DE;
  --n2-bg: #E6F3F6;  --n2-fg: #1A7183;  --n2-line: #C4E2E9;
  --n3-bg: #FCF2DE;  --n3-fg: #7A5300;  --n3-line: #EAD8AC;
  --n4-bg: #F8E6E2;  --n4-fg: #9E3122;  --n4-line: #F0CFC8;

  /* Encre posée SUR la nuit (nav, bandeau, terrain). `#fff` y était écrit 37
     fois : c'est un rôle, pas une valeur — `--surface` aurait été un
     contresens sémantique (une surface n'est pas une encre). */
  --on-night: #FFFFFF;

  --lvl-n2:  #2C6E9E; --lvl-u19: #7A57B0; --lvl-be: #205A9E;

  --radius: 6px;
  /* Une ombre porte un DÉPLACEMENT et un flou — un halo centré n'est pas de la
     profondeur. Teintée de la nuit, jamais du noir pur : une ombre neutre sur
     un fond légèrement bleuté se voit comme de la saleté. */
  --shadow:    0 1px 2px rgba(18, 26, 38, .06), 0 4px 16px rgba(18, 26, 38, .05);
  --shadow-2:  0 2px 4px rgba(18, 26, 38, .10), 0 12px 32px rgba(18, 26, 38, .12);
  /* La lueur de la lampe : une ombre chaude, portée, pour ce qui est éclairé. */
  --lueur:     0 1px 2px rgba(18, 26, 38, .10), 0 6px 20px rgba(200, 160, 99, .22);
}

/* ── 27/10/2026 — Match en direct en cartes ─────────────────────────────
   Le terrain est retiré à l'essai à la demande de la cellule : en tribune,
   une liste tactile stable demande moins de précision qu'un onze miniature. */
body.ml-page .ml-equipes-saisie { display: grid; gap: 10px; margin: 0 0 16px; padding: 14px 16px; border: 1px solid var(--sand); border-radius: 8px; background: var(--paper); }
body.ml-page .ml-equipes-saisie label { display: grid; gap: 4px; font-weight: 600; }
body.ml-page .ml-equipes-saisie input[type=text] { font: inherit; font-size: 16px; min-height: 44px; padding: 8px 12px; border: 1px solid var(--line-2); border-radius: var(--radius); }
/* La zone de note héritait de la police machine à écrire du navigateur. */
body.ml-page .ml-form textarea { font: inherit; font-size: 16px; }
body.ml-page .ml-rangee-equipes { display: grid; grid-template-columns: minmax(0, 1fr); gap: 16px; align-items: start; }
body.ml-page .ml-colonne-equipe { min-width: 0; border: 1px solid var(--line); border-radius: 8px; background: var(--paper); overflow: hidden; }
body.ml-page .ml-equipe-entete { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; padding: 14px 16px; background: var(--night); color: var(--on-night); }
body.ml-page .ml-equipe-entete .ml-club-nom { margin: 0; color: inherit; }
body.ml-page .ml-equipe-entete > span { color: var(--night-mut); font-size: 13px; text-align: right; }
body.ml-page .ml-groupe-cartes { padding: 12px; border-top: 1px solid var(--line); }
body.ml-page .ml-groupe-cartes > h3 { margin: 0 0 8px; color: var(--night); font: 700 15px/1.2 "Barlow Condensed", sans-serif; letter-spacing: .06em; text-transform: uppercase; }
body.ml-page .ml-groupe-cartes .ml-liste { display: grid; grid-template-columns: minmax(0, 1fr); gap: 8px; }
body.ml-page .ml-groupe-cartes .ml-joueur { width: 100%; min-height: 56px; box-sizing: border-box; padding: 0 12px; }
body.ml-page .ml-groupe-cartes .ml-joueur > summary { min-height: 56px; display: flex; align-items: center; gap: 10px; }
body.ml-page .ml-groupe-cartes .ml-rapport-lien {
  min-width: 0; display: flex; flex: 1 1 auto; align-items: center; gap: 10px;
  color: inherit; text-decoration: none;
}
body.ml-page .ml-actions-secondaires {
  min-width: 36px; min-height: 36px; display: inline-grid; place-items: center;
  border-radius: 50%; color: var(--muted); font-size: 24px;
}
body.ml-page .ml-groupe-cartes .ml-joueur .ml-numero { min-width: 42px; font: 800 22px/1 "Barlow Condensed", sans-serif; }
body.ml-page .ml-groupe-cartes .ml-joueur .avatar--pm { flex: 0 0 auto; }
body.ml-page .ml-identite { min-width: 0; display: flex; flex: 1 1 auto; flex-direction: column; }
body.ml-page .ml-identite .ml-nom { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
body.ml-page .ml-identite .ml-poste { font-size: 13px; color: var(--muted); }
body.ml-page .ml-propositions { display: grid; gap: 7px; margin-bottom: 10px; }
body.ml-page .ml-proposition { display: grid; grid-template-columns: auto minmax(0, 1fr) auto; align-items: center; gap: 9px; padding: 8px; border: 1px solid var(--line); border-radius: 6px; }
body.ml-page .ml-proposition > span { display: flex; min-width: 0; flex-direction: column; }
body.ml-page .ml-proposition small { color: var(--muted); }
body.ml-page .ml-proposition--autre { border-style: dashed; }
body.ml-page .ml-propositions-titre { margin: 0 0 7px; font-weight: 700; }
body.ml-page .ml-recherche-manuelle { margin: 10px 0; }
body.ml-page .ml-recherche-manuelle > summary { min-height: 44px; cursor: pointer; font-weight: 600; }
body.ml-page .ml-aucune-proposition { display: flex; min-height: 44px; align-items: center; gap: 8px; }
body.ml-page .ml-ajouter-base.est-bloque { opacity: .45; cursor: not-allowed; }
body.ml-page .ml-photo-actions { display: flex; flex-wrap: wrap; justify-content: center; gap: 8px; }
body.ml-page .ml-photo-apercu { width: min(100%, 420px); }
body.ml-page .ml-photo-apercu[hidden], body.ml-page .ml-photo-spinner[hidden] { display: none; }
body.ml-page #ml-photo-vignette { display: block; width: 100%; max-height: 220px; margin-bottom: 8px; object-fit: contain; border-radius: 6px; }
body.ml-page #ml-photo-vignette[hidden] { display: none; }
body.ml-page .ml-photo-chosen { overflow-wrap: anywhere; }

@media (min-width: 900px) {
  body.ml-page .ml-rangee-equipes { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

@media (max-width: 720px) {
  body.ml-page .ml-recherche-input,
  body.ml-page .ml-manquant select { font-size: 16px; }
}

* { box-sizing: border-box; }
html, body { margin: 0; padding: 0; }
body {
  font-family: 'Barlow', system-ui, sans-serif;
  background: var(--paper);
  color: var(--ink);
  font-size: 15px;
  line-height: 1.45;
  -webkit-font-smoothing: antialiased;
}
a { color: inherit; text-decoration: none; }

.cond { font-family: 'Barlow Condensed', sans-serif; }
.tnum { font-variant-numeric: tabular-nums; }

/* Visible des seuls lecteurs d'écran. Vit ICI et pas dans composition.css :
   le tableau de la liste s'en sert (en-têtes des colonnes statut/suivi, libellé
   de la pastille de statut), et composition.css n'est chargé que sur une page —
   le texte serait sorti en clair partout ailleurs. */
.sr-only {
  position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
}

/* Lien d'évitement : hors écran jusqu'à ce qu'il reçoive le focus. */
.skip-lien {
  position: absolute; left: -9999px; top: 0; z-index: 100;
  background: var(--sand); color: var(--night);
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700;
  text-transform: uppercase; letter-spacing: .8px;
  padding: 12px 18px; border-radius: 0 0 var(--radius) 0;
}
.skip-lien:focus { left: 0; }

/* ── Zone du compte connecté ──────────────────────────────────────────────
   Hors de `.nav-links`, et délibérément dans une AUTRE voix que les onglets :
   Barlow (pas Condensed), bas-de-casse, sans interlettrage. Rangé dans la
   rangée d'onglets et habillé comme eux, le nom se lisait comme un sixième
   onglet cliquable. Le séparateur dit « ceci n'est plus la navigation ». */
.nav-compte {
  display: flex; align-items: center; gap: 10px;
  flex: 0 0 auto; align-self: center;
  margin-left: 14px; padding-left: 14px;
  border-left: 1px solid rgba(255,255,255,.18);
}
.nav-qui {
  display: flex; align-items: center; gap: 8px;
  font-family: 'Barlow', sans-serif; font-weight: 500;
  font-size: 13px; letter-spacing: 0; text-transform: none;
  color: rgba(255,255,255,.66);
  white-space: nowrap; cursor: default;
}
/* Pastille d'initiale : repère de coup d'œil, jamais l'identifiant — deux
   comptes peuvent partager leur initiale (cf. le commentaire de base.html). */
.nav-mono {
  flex: none; width: 24px; height: 24px; border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  background: rgba(255,255,255,.12);
  border: 1px solid rgba(255,255,255,.3);
  color: var(--on-night);
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700;
  font-size: 13px; line-height: 1;
}
.nav-nom { color: var(--on-night); font-weight: 600; }

/* ── Barre de navigation ── */
.nav {
  background: var(--night);
  border-bottom: 3px solid var(--sand);
  color: var(--on-night);
}
.nav-inner {
  max-width: 1280px; margin: 0 auto;
  display: flex; align-items: stretch; gap: 8px;
  padding: 0 24px;
  height: 60px;
}
.brand {
  display: flex; align-items: center; gap: 11px;
  font-family: 'Barlow Condensed', sans-serif;
  font-weight: 700; font-size: 22px; letter-spacing: .5px;
  text-transform: uppercase; color: var(--on-night);
  margin-right: 20px;
}
.brand .mark {
  width: 30px; height: 30px; border-radius: 4px;
  background: var(--sand); color: var(--night);
  display: flex; align-items: center; justify-content: center;
  font-size: 18px; font-weight: 800;
}
.nav-links { display: flex; align-items: stretch; margin-left: auto; }
.nav-links a {
  display: flex; align-items: center; padding: 0 18px;
  font-family: 'Barlow Condensed', sans-serif;
  font-weight: 600; font-size: 15px; letter-spacing: 1px;
  text-transform: uppercase; color: rgba(255,255,255,.72);
  border-bottom: 3px solid transparent; margin-bottom: -3px;
  transition: color .15s;
}
.nav-links a:hover { color: var(--on-night); }
.nav-links a.active { color: var(--on-night); border-bottom-color: var(--sand); }

/* Pastille "bêta" : fond plein plutôt qu'un texte coloré, pour rester lisible
   aussi bien sur le vert foncé de la nav que sur le fond clair des pages
   (un texte en --amber-fg, calibré pour du clair, serait illisible sur la nav). */
.beta-badge {
  display: inline-block; background: var(--amber); color: var(--pitch);
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700;
  font-size: 11px; letter-spacing: .5px; text-transform: uppercase;
  padding: 1px 6px; border-radius: 999px; vertical-align: middle;
  margin-left: 4px;
}

/* Déconnexion (POST requis par Django). Contour explicite : c'est la seule
   commande de la zone compte, elle doit se distinguer au premier regard du
   nom qui la précède — lequel, lui, ne se clique pas. */
.nav-logout { display: flex; margin: 0; }
.nav-logout button {
  display: inline-flex; align-items: center; gap: 7px; min-height: 34px; padding: 0 12px;
  font-family: 'Barlow Condensed', sans-serif;
  font-weight: 600; font-size: 13px; letter-spacing: .8px;
  text-transform: uppercase; color: rgba(255,255,255,.82);
  background: none; border: 1px solid rgba(255,255,255,.3);
  border-radius: var(--radius); cursor: pointer;
  transition: color .15s, background-color .15s, border-color .15s;
}
.nav-logout button:hover {
  color: var(--night); background: var(--sand); border-color: var(--sand);
}
.nav-logout button:focus-visible { outline: 2px solid var(--sand); outline-offset: 2px; }

.wrap { max-width: 1280px; margin: 0 auto; padding: 26px 24px 60px; }

/* ── Titres de section ── */
.section-title {
  font-family: 'Barlow Condensed', sans-serif;
  font-weight: 700; text-transform: uppercase; letter-spacing: .5px;
  font-size: 15px; color: var(--night);
  display: flex; align-items: center; gap: 9px;
  margin: 0 0 12px;
}
.section-title::before {
  content: ""; width: 4px; height: 16px; background: var(--sand); border-radius: 2px;
}

/* ── Messages ── */
.msg { padding: 10px 16px; border-radius: var(--radius); margin-bottom: 14px;
       font-weight: 600; font-size: 14px; border: 1px solid transparent; }
.msg.success { background: var(--success-bg); color: var(--success-fg); border-color: var(--success-line); }
.msg.error   { background: var(--error-bg);   color: var(--error-fg);   border-color: var(--error-line); }
.msg.warning { background: var(--warn-bg);    color: var(--warn-fg);    border-color: var(--warn-line); }

/* ── Page header ── */
.page-head { display: flex; align-items: baseline; gap: 14px; margin-bottom: 18px; }
.page-head h1 {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 800;
  text-transform: uppercase; letter-spacing: -.5px;
  font-size: 34px; margin: 0; color: var(--ink);
}
.page-head .count {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 600;
  color: var(--sand-fg); font-size: 18px; letter-spacing: .5px;
}
/* Niveau/catégorie de chaque club, sur le bandeau de match en direct — un
   repère, pas la donnée principale du bandeau. */
.ml-niveau { font-weight: 400; color: var(--muted); font-size: 14px; }
/* Repli du choix d'équipe (cf. match_live.html, même registre visuel que
   `.ml-banc`) : replié par défaut, un tap l'ouvre si la détection s'est
   trompée. */
.ml-niveaux-repli { margin: -8px 0 16px; }
.ml-niveaux-repli > summary {
  cursor: pointer; font-size: 12.5px; color: var(--muted); font-weight: 600;
  padding: 8px 0; min-height: 34px; display: flex; align-items: center;
  gap: 6px; list-style: none;
}
.ml-niveaux-repli > summary::-webkit-details-marker { display: none; }
/* Choix de l'équipe EXACTE (famille du club) — un réglage discret, sous le
   bandeau du match, pas la donnée principale de la page. */
.ml-niveaux-choix {
  display: flex; gap: 16px; flex-wrap: wrap; margin: 4px 0 12px;
}
.ml-niveau-lab {
  display: flex; flex-direction: column; gap: 3px; font-size: 11.5px;
  color: var(--muted); font-weight: 600; text-transform: uppercase;
  letter-spacing: .4px;
  /* Un club de la famille peut porter un nom long + son niveau entre
     parenthèses (« AS Saint-Étienne B (National 3) ») : le <select> fermé
     prend la largeur de sa plus longue option. Sans ce plancher/plafond, un
     seul long libellé poussait toute la ligne plus large que 390px — la
     page entière défilait alors horizontalement, pas juste ce contrôle. */
  flex: 1 1 160px; min-width: 0; max-width: 100%;
}
.ml-famille-select {
  font: inherit; text-transform: none; letter-spacing: normal; font-size: 13px;
  color: var(--night); background: var(--surface); border: 1px solid var(--line-2);
  border-radius: var(--radius); padding: 6px 8px; min-height: 32px;
  width: 100%; max-width: 100%;
}

/* ═══ FILTRES ═══ */
/* Repli des filtres. Sur grand écran le résumé n'existe pas visuellement et le
   bloc reste ouvert : rien ne change. Sous 900 px, le résumé devient la barre
   qu'on touche pour ouvrir, et il annonce combien de filtres sont actifs — sans
   ça, replier reviendrait à CACHER l'état du tri, ce qui est pire que le mur. */
.filters-som { display: none; }
@media (max-width: 900px) {
  .filters-som {
    display: flex; align-items: center; gap: 10px;
    min-height: 44px; padding: 4px 2px; cursor: pointer;
    font-family: 'Barlow Condensed', sans-serif; font-weight: 700;
    text-transform: uppercase; letter-spacing: .8px; font-size: 15px;
    color: var(--night); list-style: none;
  }
  .filters-som::-webkit-details-marker { display: none; }
  /* Chevron maison : le marqueur natif ne se style pas d'un moteur à l'autre. */
  .filters-som::after {
    content: "▾"; margin-left: auto; font-size: 13px; color: var(--muted);
    transition: transform .15s ease-out;
  }
  .filters-pli[open] > .filters-som::after { transform: rotate(180deg); }
  .filters-som:focus-visible { outline: 2px solid var(--night); outline-offset: 2px; }
  .filters-som-n {
    font-family: 'Barlow', sans-serif; font-weight: 700; font-size: 12px;
    text-transform: none; letter-spacing: 0;
    background: var(--sand); color: var(--night);
    border-radius: 10px; padding: 1px 9px;
  }
  .filters-som-n:empty { display: none; }
  .filters-pli[open] > .filters-som { margin-bottom: 12px; border-bottom: 1px solid var(--line); }
}
@media (prefers-reduced-motion: reduce) { .filters-som::after { transition: none; } }
.filters {
  background: var(--surface); border: 1px solid var(--line);
  border-radius: var(--radius); box-shadow: var(--shadow);
  padding: 16px 18px 18px; margin-bottom: 20px;
}
.filters-grid {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
  gap: 12px 14px;
}
.field { display: flex; flex-direction: column; gap: 5px; }
/* `.field-lab` est l'intitulé d'un CURSEUR : une plage porte une ou deux
   poignées, chacune déjà nommée par son `aria-label`, donc aucun `<label for>`
   ne peut pointer sur « le » contrôle. Un `<label>` sans cible annonce une
   étiquette qui n'en est pas une — d'où le `<span>`, à l'apparence identique. */
.field label, .field-lab {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 600;
  text-transform: uppercase; letter-spacing: .8px; font-size: 12px;
  color: var(--muted);
}
/* ── Combobox : la recherche EST la liste ─────────────────────────────────
   Club (~3 800 options) et championnat (335) ne se choisissent pas dans un
   `<select>` natif : sa frappe rapide ne fonctionne qu'en préfixe. Ils avaient
   donc reçu un champ de recherche par-dessus — deux contrôles empilés pour un
   seul geste, et le résultat de sa frappe invisible tant qu'on n'avait pas
   déplié le menu. Un seul champ désormais, la liste s'ouvre dessous.

   Montée par liste.js : sans JavaScript, `.cbx-champ` et `.cbx-liste`
   n'existent pas et c'est le `<select>` d'origine qui s'affiche, intact. */
.cbx { position: relative; }
/* Le `<select>` reste dans le formulaire — il porte le `name`, donc la valeur —
   mais sort de l'écran une fois la combobox posée. Pas `display:none` : un
   contrôle retiré du rendu ne participe plus à la validation ni au focus.

   ⚠️ Sélecteur `.field .cbx-source` (0,2,0) et non `.cbx-source` (0,1,0) :
   `.field select` vaut (0,1,1) et l'emporterait sur la largeur. Le `<select>`
   gardait alors ses 320 px hors écran et faisait déborder la page de 284 px
   en 390 px de large — mesuré. C'est le piège que l'ancien champ de recherche
   documentait déjà quelques lignes plus haut ; il fallait le relire. */
.field .cbx-source {
  position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
}
.cbx-liste {
  position: absolute; z-index: 30; top: calc(100% + 4px); left: 0; right: 0;
  margin: 0; padding: 4px; list-style: none;
  max-height: 268px; overflow-y: auto;
  background: var(--surface); border: 1px solid var(--line-2);
  border-radius: 5px; box-shadow: 0 6px 20px rgba(11,61,46,.14);
}
.cbx-liste[hidden] { display: none; }
.cbx-opt {
  padding: 8px 10px; border-radius: 4px; font-size: 14px; cursor: pointer;
  color: var(--ink); white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
/* Survol ET parcours clavier se ressemblent : c'est le même « où j'en suis ».
   La sélection en cours, elle, est marquée par la graisse et non par un fond —
   sinon deux repères se disputeraient la même surface. */
.cbx-opt:hover, .cbx-opt.est-actif { background: var(--paper); color: var(--night); }
.cbx-opt.est-choisi { font-weight: 700; color: var(--night); }
.cbx-opt.est-choisi::after { content: " ✓"; color: var(--sand-fg); }
/* La sortie (« Tous ») se lit comme une commande, pas comme un championnat. */
.cbx-tous {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700;
  text-transform: uppercase; letter-spacing: .6px; font-size: 12.5px;
  color: var(--ink-2); border-bottom: 1px solid var(--line); border-radius: 0;
  margin-bottom: 4px; padding-bottom: 9px;
}
.cbx-note { padding: 8px 10px; font-size: 12.5px; color: var(--muted); }
/* Poste et Pays acceptent plusieurs valeurs (21/10/2026) : une puce par choix,
   sous le champ de recherche — même langage visuel que `.fx-chip` (bandeau des
   filtres posés par l'assistant), pour que les deux formes de sélection
   multiple se lisent comme une seule idée dans l'écran. */
.cbx-tags { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 6px; }
.cbx-tags[hidden] { display: none; }
.cbx-tag { display: inline-flex; align-items: center; gap: 4px; max-width: 100%;
  padding: 4px 4px 4px 12px; border: 1px solid var(--line-2); border-left: 3px solid var(--sand-2);
  border-radius: 999px; background: var(--surface); font-size: 13px; font-weight: 600;
  color: var(--ink); overflow: hidden; }
.cbx-tag-x { flex: none; display: inline-flex; align-items: center; justify-content: center;
  width: 28px; height: 28px; border-radius: 50%; border: 0; background: transparent;
  color: var(--muted); font-size: 14px; line-height: 1; cursor: pointer; }
.cbx-tag-x:hover { background: var(--paper); color: var(--night); }

.field select, .field input {
  font-family: 'Barlow', sans-serif; font-size: 14px;
  padding: 8px 10px; border: 1px solid var(--line-2); border-radius: 5px;
  background: var(--surface); color: var(--ink); width: 100%;
}
.field select:focus, .field input:focus {
  outline: none; border-color: var(--night); box-shadow: 0 0 0 3px rgba(11,61,46,.08);
}
.filters-foot { display: flex; align-items: center; gap: 14px; margin-top: 14px; flex-wrap: wrap; }
/* Le `<label>` EST la cible : cliquer le texte coche la case, donc c'est sa
   boîte qu'on mesure, pas les 16 px de la case. Elle tombait quand même à
   22 px de haut sur desktop (la règle tactile ne la remonte qu'à partir de
   900 px). `flex` est sans risque ici, le libellé est un nœud unique. */
.check { display: flex; align-items: center; gap: 7px; font-size: 14px; color: var(--ink-2); font-weight: 500; min-height: 24px; }
.check input { width: 16px; height: 16px; }

/* ⚠️ `accent-color` était posé au cas par cas — sur `.check` et sur les cases
   de la comparaison — et nulle part ailleurs : les onze cases de la fenêtre
   d'export sortaient en BLEU système au milieu d'une charte vert et ambre.
   Une déclaration à la racine des contrôles vaut mieux que trois rappels :
   la coche native reste (c'est le meilleur choix d'accessibilité), elle prend
   simplement la couleur de la maison. */
input[type=checkbox], input[type=radio] { accent-color: var(--night); }

.btn {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 600;
  text-transform: uppercase; letter-spacing: .6px; font-size: 14px;
  padding: 9px 18px; border-radius: 5px; border: 1px solid transparent;
  cursor: pointer; transition: all .15s;
}
.btn-primary { background: var(--night); color: var(--on-night); }
.btn-primary:hover { background: var(--night-2); }
.btn-amber { background: var(--sand); color: var(--night); }
.btn-amber:hover { background: var(--sand-2); color: var(--on-night); }
.btn-ghost { background: transparent; color: var(--ink-2); border-color: var(--line-2); }
.btn-ghost:hover { border-color: var(--night); color: var(--night); }
.btn-sm { padding: 5px 11px; font-size: 12px; }

/* ═══ TABLEAU JOUEURS ═══ */
/* Filtrer / trier / paginer ne remplace que #resultats (cf. players/liste.js).
   Le temps de la requête, on estompe le tableau et on neutralise les clics :
   assez pour signaler que ça travaille, sans faire sauter la mise en page —
   un vrai indicateur de chargement à la place ferait clignoter l'écran à
   chaque frappe dans la recherche. `transition-delay` évite d'ailleurs que
   l'estompe apparaisse sur les réponses très rapides (~60 ms). */
#resultats { transition: opacity .12s ease; }
#resultats.est-charge {
  opacity: .5; pointer-events: none;
  transition-delay: .15s;
}
.table-card {
  background: var(--surface); border: 1px solid var(--line);
  border-radius: var(--radius); overflow: hidden; box-shadow: var(--shadow);
}
/* Défilement horizontal du tableau sur écran étroit : sans lui, `overflow:hidden`
   de .table-card ROGNAIT les colonnes de droite (Valeur, SB…) sur mobile. */
.table-scroll { overflow-x: auto; -webkit-overflow-scrolling: touch; }
table.grid { width: 100%; border-collapse: collapse; min-width: 720px; }
table.grid thead th {
  background: var(--night); color: var(--on-night);
  font-family: 'Barlow Condensed', sans-serif; font-weight: 600;
  text-transform: uppercase; letter-spacing: .7px; font-size: 12px;
  text-align: left; padding: 11px 14px; white-space: nowrap;
  position: sticky; top: 0; z-index: 2;
}
/* 24 px de haut au MINIMUM, à toute largeur (WCAG 2.2, SC 2.5.8). Le lien
   faisait 16 px : sous 900 px la règle tactile le remontait à 36 px, mais
   au-dessus il restait à 16 — et un en-tête de tri, contrairement au nom d'un
   joueur, n'a AUCUNE autre zone équivalente à viser (la ligne entière est
   cliquable, pas l'en-tête). `inline-block` pour que le padding vertical
   compte réellement dans la boîte. */
table.grid thead th a {
  color: rgba(255,255,255,.85);
  display: inline-block; padding-top: 4px; padding-bottom: 4px;
}
table.grid thead th a:hover { color: var(--sand); }
table.grid thead th.sorted a { color: var(--sand); }
table.grid tbody tr {
  border-top: 1px solid var(--line); cursor: pointer; transition: background .12s;
}
table.grid tbody tr:hover { background: #F0F5F1; }
table.grid td { padding: 10px 14px; vertical-align: middle; }
table.grid td.name { font-weight: 600; }
table.grid td.name .first { color: var(--muted); font-weight: 500; }
/* Lien clavier-accessible : la ligne entière reste cliquable à la souris (onclick),
   mais le nom porte le vrai <a> pour la navigation clavier / lecteur d'écran.
   Porté à 24 px comme les en-têtes de tri. Ici la ligne (45 px) offrait déjà
   une cible équivalente, donc SC 2.5.8 était tenu ; on l'aligne quand même,
   parce qu'un lien qu'on vise à la souris n'a pas à être plus fin que le
   reste. La hauteur de ligne ne bouge pas : le padding des cellules la fixait
   déjà au-dessus de 24 px. */
.name-link { color: inherit; display: inline-block; padding-top: 3px; padding-bottom: 3px; }
.name-link:focus-visible { outline: 2px solid var(--night); outline-offset: 2px; border-radius: 2px; }
.val { font-family: 'Barlow Condensed', sans-serif; font-weight: 700; font-size: 16px; }
.empty { padding: 40px; text-align: center; color: var(--muted); }
/* Un état vide sans issue laisse l'utilisateur relire ses 16 filtres pour
   trouver lequel a tout mangé. La page Rapports proposait déjà la sortie ;
   la liste, non. */
.empty-reset {
  display: inline-block; margin-left: 10px; padding: 7px 14px;
  min-height: 34px; border: 1px solid var(--line-2); border-radius: var(--radius);
  background: var(--surface); color: var(--night); font-weight: 600;
}
.empty-reset:hover { border-color: var(--night); }

/* ── Pagination ── */
.pager { display: flex; align-items: center; justify-content: space-between; gap: 14px;
  margin-top: 14px; flex-wrap: wrap; }
.pager-info { font-family: 'Barlow Condensed', sans-serif; font-weight: 600;
  text-transform: uppercase; letter-spacing: .6px; font-size: 13px; color: var(--muted); }
.pager-btns { display: flex; gap: 6px; }

/* ── Badges niveau ── */
.badge {
  display: inline-block; padding: 2px 8px; border-radius: 3px;
  font-family: 'Barlow Condensed', sans-serif; font-weight: 600;
  font-size: 11.5px; letter-spacing: .5px; text-transform: uppercase;
  border: 1px solid currentColor; white-space: nowrap;
}
.lvl-l1 { color: var(--night); } .lvl-l2 { color: var(--bad); }
.lvl-n { color: var(--sand-fg); } .lvl-n2 { color: var(--lvl-n2); }
.lvl-n3 { color: var(--p-elite); } .lvl-u19 { color: var(--lvl-u19); }
.lvl-be { color: var(--lvl-be); } .lvl-other { color: var(--muted); }

/* ── Pastille poste ── */
.pos {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 34px; padding: 2px 7px; border-radius: 3px;
  background: var(--night-3); color: var(--on-night);
  font-family: 'Barlow Condensed', sans-serif; font-weight: 600; font-size: 12px;
  letter-spacing: .5px;
}

/* ── Dot statut rapport ──
   ⚠️ La classe est `.dot-a_ecarter`, PAS `.dot-ecarter` : le gabarit rend
   `dot-{{ st }}` et `st` vaut la valeur de STATUT_CHOICES, soit `a_ecarter`.
   L'ancien nom raccourci ne s'appliquait à rien — la pastille sortait
   entièrement transparente pour 3 263 joueurs sur les 4 891 notés, c'est-à-dire
   que le statut le PLUS fréquent, et le plus décisif (« celui-là, c'est non »),
   était le seul invisible dans la première colonne du tableau.
   Les trois valeurs sont écrites en toutes lettres pour que le lien avec
   STATUT_CHOICES saute aux yeux si l'énumération bouge. */
.dot { display: inline-block; width: 9px; height: 9px; border-radius: 50%; }
.dot-vu        { background: var(--ok); }
.dot-a_ecarter { background: var(--bad); }
.dot-non_vu    { background: var(--line-2); border: 1px solid var(--line); }
/* `--ok` en texte donne 3,18:1 ; `--line-2` sur blanc, 1,45:1 — un rond gris
   sur fond blanc, invisible. La pastille « pas de données » passe en gris
   lisible, et sa signification est aussi portée par le `title` du gabarit. */
.sb-yes { color: var(--ok-fg); font-weight: 700; } .sb-no { color: var(--muted); }

/* ═══ FICHE JOUEUR ═══ */
.back-link { font-family:'Barlow Condensed',sans-serif; font-weight:600; text-transform:uppercase;
  letter-spacing:.6px; font-size:13px; color: var(--muted); display:inline-block; margin-bottom:14px; }
.back-link:hover { color: var(--night); }

.hero {
  position: relative; overflow: hidden;
  background: var(--night);
  /* Une GRATICULE, plus des bandes de tonte : le monde n'est plus la pelouse
     mais la salle de quart, et des raies verticales n'y voulaient plus rien
     dire. Filets horizontaux réguliers, très faibles, plus un halo de lampe
     dans l'angle haut-gauche. */
  background-image:
    radial-gradient(520px 200px at 6% -30%, rgba(224,192,144,.14), transparent 70%),
    repeating-linear-gradient(180deg, rgba(224,192,144,.07) 0 1px, rgba(255,255,255,0) 1px 34px);
  border-radius: var(--radius); border-left: 4px solid var(--sand);
  padding: 26px 30px; color: var(--on-night); margin-bottom: 18px;
}
.hero::after {
  content:""; position:absolute; right:-40px; top:-40px; width:200px; height:200px;
  border: 2px solid rgba(255,255,255,.06); border-radius: 50%;
}
.hero-top { display: flex; justify-content: space-between; align-items: flex-start; gap: 20px; position: relative; z-index: 1; }
.hero-lead { display: flex; align-items: center; gap: 22px; flex-wrap: wrap; }
.hero h1 {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 800;
  text-transform: uppercase; letter-spacing: -.5px; line-height: .98;
  font-size: 46px; margin: 0;
}
.hero .sub { color: rgba(255,255,255,.8); font-weight: 500; margin-top: 6px; font-size: 15px; }
.hero-meta { margin-top: 16px; display: flex; gap: 8px; flex-wrap: wrap; align-items: center; }
/* Les puces du bandeau (« ☆ Suivre », « ＋ Liste », « ⤓ Exporter ») sont des
   commandes, pas des étiquettes : 23 px mesurés, un de moins que le minimum. */
.chip {
  background: rgba(255,255,255,.12); border: 1px solid rgba(255,255,255,.28);
  border-radius: 3px; padding: 3px 10px; font-size: 13px; font-weight: 600; color: var(--on-night);
  min-height: 24px;
}
button.chip, a.chip, .chip-mdl { display: inline-flex; align-items: center; }

/* ⚠️ Une pastille du bandeau est soit une ÉTIQUETTE inerte (statut, « Prêté
   par », « Hors Transfermarkt »), soit une COMMANDE (Suivre, Liste, Exporter,
   Comparer). Les deux partageaient `.chip` et donc le même dessin : six
   pastilles alignées, une seule cliquable, et rien pour dire laquelle. Les
   commandes prennent un contour net, un survol et une bague de focus ; les
   étiquettes restent plates. Le `style="cursor:pointer;border:none;"` qui
   traînait en ligne sur le bouton « Suivre » compensait exactement ce manque —
   il a disparu avec. */
.chip-cmd {
  border-color: rgba(255,255,255,.45); cursor: pointer;
  font: inherit; text-decoration: none;
  transition: background-color .15s, border-color .15s, color .15s;
}
.chip-cmd:hover { background: var(--sand); border-color: var(--sand); color: var(--night); }
.chip-cmd:focus-visible { outline: 2px solid var(--sand); outline-offset: 2px; }
.chip.amber { background: var(--sand); border-color: var(--sand); color: var(--night); }
.hero .badge { border-color: rgba(255,255,255,.55); color: var(--on-night); }
.hero-val { text-align: right; }
.hero-val .big { font-family:'Barlow Condensed',sans-serif; font-weight:800; font-size:38px; line-height:1; }

/* Mini-terrain du bandeau : poste principal TM (ambré) + postes joués SB (minutes). */
.hero-pitch {
  position: relative; flex: 0 0 auto; align-self: center;
  width: 122px; height: 160px; border-radius: 12px; overflow: hidden;
  /* Le terrain vu depuis le poste de veille : de nuit, tracé à la lumière.
     Il était vert vif — posé dans un bandeau bleu marine, c'était la seule
     tache de couleur étrangère de toute la fiche. Le terrain reste de la
     DONNÉE (où le joueur joue), pas un décor : on en change la lumière, pas
     la lecture. */
  background:
    repeating-linear-gradient(0deg, rgba(224,192,144,.05) 0 20px, rgba(255,255,255,0) 20px 40px),
    linear-gradient(158deg, #2A3A52 0%, #1B2738 58%, #121A26 100%);
  border: 1px solid rgba(224,192,144,.28);
  box-shadow: inset 0 1px 0 rgba(255,255,255,.12),
              inset 0 0 30px rgba(0,0,0,.30), 0 8px 20px rgba(0,0,0,.24);
}
.hero-pitch .hp-lines { position: absolute; inset: 0; width: 100%; height: 100%; }
.hero-pitch .hp-lines * {
  fill: none; stroke: rgba(224,192,144,.42); stroke-width: 1;
  vector-effect: non-scaling-stroke;
}
.hero-pitch .hp-lines .hp-out { stroke: rgba(224,192,144,.55); }
.hero-pitch .hp-lines .hp-spot { fill: rgba(224,192,144,.55); stroke: none; }

.hp-dot {
  position: absolute; transform: translate(-50%,-50%); z-index: 2;
  display: flex; flex-direction: column; align-items: center; gap: 2px;
}
.hp-dot .hp-chip {
  display: flex; align-items: center; justify-content: center;
  width: 26px; height: 26px; border-radius: 50%; color: var(--night);
  background: rgba(255,255,255,.94); border: 1.5px solid #fff;
  font-family: 'Barlow Condensed', sans-serif; font-weight: 800; font-size: 12px; letter-spacing: .3px;
  box-shadow: 0 2px 6px rgba(0,0,0,.4);
}
.hp-dot .hp-min {
  font-size: 8.5px; font-weight: 700; color: var(--on-night); line-height: 13px;
  padding: 0 5px; border-radius: 7px; background: rgba(8,22,15,.62);
  box-shadow: 0 1px 3px rgba(0,0,0,.35);
}
.hp-dot.hp-main { z-index: 3; }
.hp-dot.hp-main .hp-chip {
  width: 31px; height: 31px; font-size: 14px; color: var(--night);
  background: radial-gradient(circle at 34% 28%, #ffdf94, var(--sand) 78%);
  border: 2px solid #fff;
  box-shadow: 0 0 0 4px rgba(240,180,50,.22), 0 3px 9px rgba(0,0,0,.38);
}
.hp-dot.hp-main .hp-min { color: var(--night); background: rgba(255,255,255,.9); }
.trend { font-size: 13px; font-weight: 600; margin-top: 4px; }
.trend.up { color: #7FE0A6; } .trend.down { color: #F0A98F; } .trend.flat { color: rgba(255,255,255,.7); }
.tm-link { color: var(--sand); font-weight:600; font-size:13px; }

/* ── Cibles d'au moins 24 × 24 px, à TOUTE largeur (WCAG 2.2, SC 2.5.8) ─────
   La règle tactile du bloc ≤ 900 px remontait déjà ces liens à 34 px, mais
   au-dessus ils restaient à 16-22 px de haut : « ↗ lien » des Paramètres à
   33 × 16 (4 432 occurrences), le nom du joueur d'un rapport à 120 × 22, le
   retour à la liste à 119 × 19. Le critère ne dépend pas du pointeur.

   ⚠️ PADDING sur `inline-block`, jamais `inline-flex` : un conteneur flex fait
   de chaque nœud un élément et perd les nœuds de texte purement blancs. Le
   piège n'est pas théorique — mesuré à 760 px, `.back-link` rendait
   « ‹ RETOUR AUX JOUEURS » et « · filtres conservés » sur DEUX lignes, l'espace
   nu qui précède `<span class="back-keep">` ayant disparu. C'est le même défaut
   que le « LamineYAMAL » des noms de joueurs, resté latent dans le bloc
   tactile ; il est corrigé là-bas du même coup. */
.back-link, .fx-joueur, .tm-link, .nj-lien, .fx-lire, .rm-plus {
  display: inline-block; padding-top: 4px; padding-bottom: 4px;
}
/* `min-width` en plus pour les libellés très courts : « Âge » ne fait que
   19 px de large, « Act. » 22 — hauteur conforme, largeur non. */
table.grid thead th a { min-width: 24px; }

/* ── Grille de cartes ── */
.cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px,1fr)); gap: 14px; margin-bottom: 18px; }
.card {
  background: var(--surface); border: 1px solid var(--line);
  border-radius: var(--radius); padding: 16px 18px; box-shadow: var(--shadow);
}
/* `h2` autant que `h3` : les cartes placées SOUS un `.section-title` en sont
   les filles (h3), celles qui ouvrent la fiche juste après le nom du joueur
   sont de premier niveau (h2). Même dessin, deux rangs — un titre saute un
   niveau ou pas selon ce qu'il y a au-dessus, pas selon son apparence. */
.card h3, .card h2 {
  font-family:'Barlow Condensed',sans-serif; font-weight:700; text-transform:uppercase;
  letter-spacing:.7px; font-size: 12px; color: var(--night);
  border-left: 3px solid var(--sand); padding-left: 8px; margin: 0 0 12px;
}
.row { display: flex; justify-content: space-between; padding: 6px 0; border-bottom: 1px solid var(--line); font-size: 14px; gap: 10px; }
.row:last-child { border-bottom: none; }
.row .k { color: var(--muted); } .row .v { font-weight: 600; text-align: right; }
.contrat-urgent { color: var(--bad); font-weight: 700; }
.contrat-soon { color: var(--warn); font-weight: 700; }
.contrat-expire { color: var(--bad); font-style: italic; }
.contrat-none { color: var(--muted); font-style: italic; }
.big-num { font-family:'Barlow Condensed',sans-serif; font-weight:800; font-size:30px; text-align:center; padding: 8px 0; }

/* ── Graphe valeur (SVG) ── */
.chart svg { width: 100%; height: auto; display: block; }
.chart .area { fill: rgba(11,61,46,.07); }
.chart .line { fill: none; stroke: var(--night); stroke-width: 2.2; }
.chart .dot { fill: var(--sand); stroke: #fff; stroke-width: 1.4; }

/* ── Graphique de valeur marchande : survol ── */
.chart-interactive { position: relative; }
.chart-interactive #vc-hit { cursor: crosshair; }
/* les jalons s'effacent au survol pour laisser lire le point actif */
.chart-interactive .dot { transition: opacity .12s ease-out; }
.chart-interactive.vc-on .dot { opacity: .25; }

.vc-guide, .vc-active { opacity: 0; transition: opacity .12s ease-out; pointer-events: none; }
.vc-on .vc-guide, .vc-on .vc-active { opacity: 1; }
.vc-guide { stroke: var(--line-2); stroke-width: 1; stroke-dasharray: 3 3; }
.vc-active { fill: var(--sand); stroke: #fff; stroke-width: 2; }

.vc-tip {
  position: absolute; z-index: 5; pointer-events: none;
  transform: translate(-50%, calc(-100% - 14px));
  background: var(--ink); color: var(--on-night); border-radius: 5px;
  padding: 6px 10px; white-space: nowrap; line-height: 1.35;
  box-shadow: 0 6px 20px rgba(11,61,46,.28);
}
.vc-tip b { display: block; font-family: 'Barlow Condensed', sans-serif; font-size: 16px; font-weight: 800; }
.vc-tip span { display: block; font-size: 11.5px; opacity: .8; }
.vc-tip em { display: block; font-size: 11.5px; font-style: normal; color: var(--sand); }
.vc-tip::after {
  content: ""; position: absolute; left: 50%; top: 100%; transform: translateX(-50%);
  border: 5px solid transparent; border-top-color: var(--ink);
}
/* bascule sous le point quand il est trop haut : évite de masquer le grand chiffre */
.vc-tip.below { transform: translate(-50%, 14px); }
.vc-tip.below::after {
  top: auto; bottom: 100%;
  border-top-color: transparent; border-bottom-color: var(--ink);
}

@media (prefers-reduced-motion: reduce) {
  .chart-interactive .dot, .vc-guide, .vc-active { transition: none; }
}

/* ── Percentiles SB ── */
.perc-group { margin-bottom: 6px; }
.perc-head { display:flex; justify-content:space-between; align-items:baseline; margin-bottom:10px; }
.perc-head .t { font-family:'Barlow Condensed',sans-serif; font-weight:700; text-transform:uppercase; letter-spacing:.6px; font-size:14px; color: var(--night); }
.perc-head .r { font-size:12px; color: var(--muted); }
/* Trois colonnes : intitulé, barre, valeur. La valeur était POSÉE SUR la
   barre (`position:absolute` dans `.track`), donc à cheval sur la limite du
   remplissage — illisible une ligne sur deux. Elle a sa colonne, alignée à
   droite, en chiffres tabulaires pour que les quarante lignes du bloc se
   comparent verticalement. */
.perc { display: grid; grid-template-columns: 130px 1fr 96px; align-items: center; gap: 10px; margin-bottom: 8px; }
.perc .lbl { font-size: 13px; color: var(--ink-2); font-weight: 500; text-align: right; }
.perc .track { position: relative; height: 22px; background: var(--paper); border-radius: 3px; overflow: hidden; }
.perc .fill { position: absolute; inset: 0 auto 0 0; border-radius: 3px; }
.perc .fill.elite { background: var(--p-elite); } .perc .fill.good { background: var(--p-good); }
.perc .fill.avg { background: var(--p-avg); } .perc .fill.low { background: var(--p-low); }
.perc .fill.poor { background: var(--p-poor); }
.perc .val { display: flex; align-items: baseline; justify-content: flex-end; gap: 6px;
  font-family:'Barlow Condensed',sans-serif; font-size: 12px; white-space: nowrap; }
.perc .val b { font-weight: 700; color: var(--ink); }
/* Le rang est un repère, pas la mesure : il passe derrière la valeur. */
.perc .val .rg { font-weight: 600; color: var(--muted); font-size: 11.5px; }
.perc .val sup { font-size: .75em; }

/* Sous 560 px la valeur passe SOUS la barre plutôt que de l'écraser : à trois
   colonnes, 96 px de valeur ne laissent plus rien à la barre. */
@media (max-width: 560px) {
  .perc { grid-template-columns: 110px 1fr; row-gap: 2px; }
  .perc .val { grid-column: 2; justify-content: flex-start; }
}

/* ═══════════════════════════════════════════════════════════════════════════
   RAPPORTS DE SCOUTING
   Un rapport se lit comme une ligne de carnet : la date en talon, le fond à
   gauche, le verdict chiffré à droite. Même vocabulaire sur la fiche joueur et
   sur la page Rapports — un scout doit reconnaître la forme d'un coup d'œil.
   ═══════════════════════════════════════════════════════════════════════════ */

/* 22,5 × 23 px mesurés sur le poste de bureau : les trois blocs `@media` les
   remontaient bien à 38 px, mais sous les points d'arrêt mobiles seulement.
   Le critère de taille de cible ne dépend pas du pointeur, et les flèches
   ↑ ↓ des listes n'ont aucune zone équivalente à viser. */
.icon-btn { background:none; border:1px solid var(--line-2); border-radius:4px;
  cursor:pointer; padding:3px 7px; font-size:13px; color: var(--muted);
  min-width:24px; min-height:24px; }
.icon-btn:hover { border-color: var(--night); color: var(--night); }
.icon-btn:focus-visible { outline: 2px solid var(--night); outline-offset: 1px; }
/* 23 px mesurés : `inline-flex` est sans danger ici, ces liens ne portent
   qu'un seul nœud de texte (« ⤓ PDF », « Pièce jointe »). */
.obs-file, .fx-piece {
  background: var(--paper); border:1px solid var(--line); border-radius:3px;
  padding:2px 8px; font-size:11.5px; font-weight:600; color: var(--night);
  min-height:24px; display:inline-flex; align-items:center;
}
.fx-piece:hover { border-color: var(--night); }
/* Même alphabet que `.fx-piece` : un lien-badge de plus dans le pied de carte,
   pas une commande à part. */
.fx-match {
  background: var(--paper); border:1px solid var(--line); border-radius:3px;
  padding:2px 8px; font-size:11.5px; font-weight:600; color: var(--night);
  min-height:24px; display:inline-flex; align-items:center;
}
.fx-match:hover { border-color: var(--night); }

.count-inline {
  font-family:'Barlow Condensed',sans-serif; font-weight:600; font-size:13px;
  color: var(--muted); background: var(--paper); border:1px solid var(--line);
  border-radius: 10px; padding: 0 8px; letter-spacing:.4px;
}

/* Avis de cloisonnement. Délibérément NEUTRE — ni avertissement, ni erreur :
   il ne s'est rien passé d'anormal, la cellule a simplement déjà travaillé ce
   joueur. Un ton d'alerte (rouge, ambre) laisserait croire à un problème et
   pousserait à cliquer pour « régler » quelque chose. */
/* ⚠️ PAS de liseré latéral ici, contrairement à `.bgc` qui lui ressemble.
   Sur `.bgc` le liseré ENCODE le niveau de vigilance : sa couleur est une
   donnée. Ici il n'encoderait rien — ce serait le bandeau décoratif que le
   projet s'interdit ailleurs, et l'exception maison d'`app.css` porte sur
   tout le fichier, donc elle l'aurait couvert en silence. */
.rap-cloison {
  margin: 0 0 14px; padding: 11px 14px;
  background: var(--paper); border: 1px solid var(--line);
  border-radius: var(--radius);
  font-size: 13px; line-height: 1.5; color: var(--ink-2); max-width: 78ch;
}
.rap-cloison strong { color: var(--ink); }

/* ── Onglets de recommandation (filtres) ── */
.reco-tabs { display:flex; gap:6px; flex-wrap:wrap; margin-bottom:16px; }
.reco-tab {
  display:inline-flex; align-items:center; gap:8px;
  font-family:'Barlow Condensed',sans-serif; font-weight:600;
  text-transform:uppercase; letter-spacing:.7px; font-size: 13px;
  color: var(--ink-2); background: var(--surface);
  border:1px solid var(--line-2); border-radius: 4px;
  padding: 7px 13px; transition: border-color .15s, color .15s, background .15s;
}
.reco-tab:hover { border-color: var(--night); color: var(--night); }
.reco-tab:focus-visible { outline: 2px solid var(--night); outline-offset: 2px; }
.reco-tab-n {
  font-size: 12px; font-weight:700; color: var(--muted);
  background: var(--paper); border-radius: 9px; padding: 0 7px;
}
.reco-tab.on { background: var(--night); border-color: var(--night); color:var(--on-night); }
.reco-tab.on .reco-tab-n { background: rgba(255,255,255,.16); color:var(--on-night); }
.reco-tab.on.r-avancer { background: var(--sand); border-color: var(--sand); color: var(--night); }
.reco-tab.on.r-avancer .reco-tab-n { background: rgba(11,61,46,.14); color: var(--night); }
.reco-tab.on.r-pas_interet { background: var(--bad); border-color: var(--bad); color:var(--on-night); }

/* ── Pastille de recommandation ── */
.reco {
  display:inline-block; border-radius:3px; padding:2px 10px;
  font-family:'Barlow Condensed',sans-serif; font-weight:700;
  text-transform:uppercase; letter-spacing:.6px; font-size: 12px;
  border:1px solid transparent; white-space:nowrap;
}
.r-avancer     { background:var(--n3-bg); color:var(--n3-fg); border-color:var(--n3-line); }
.r-suivre      { background:var(--success-bg); color:var(--success-fg); border-color:var(--success-line); }
.r-pas_interet { background:var(--n4-bg); color:var(--n4-fg); border-color:var(--n4-line); }

/* ── Flux de rapports ── */
.flux { display:flex; flex-direction:column; gap:10px; }
.fx, .rap-view {
  display:grid; grid-template-columns: 54px minmax(0,1fr) auto;
  gap: 0 16px; align-items:start;
  background: var(--surface); border:1px solid var(--line);
  border-radius: var(--radius); box-shadow: var(--shadow);
  padding: 14px 16px;
}
.rap { background: var(--surface); border-radius: var(--radius); }
/* Même piège que .rf-field : `display:grid` masquerait l'effet de [hidden] et la
   vue resterait affichée sous le formulaire d'édition. */
.rap-view[hidden] { display:none; }

/* Talon de date : le jour porte le repère, le mois le contexte. */
.fx-jour { text-align:center; padding-top:1px; }
.fx-jour b {
  display:block; font-family:'Barlow Condensed',sans-serif; font-weight:800;
  font-size: 26px; line-height:1; color: var(--night);
}
.fx-jour i {
  display:block; font-style:normal; font-family:'Barlow Condensed',sans-serif;
  font-weight:600; text-transform:uppercase; letter-spacing:1px;
  font-size: 11.5px; color: var(--muted); margin-top:2px;
}

.fx-corps { min-width:0; }
.fx-titre { display:flex; align-items:baseline; gap:10px; flex-wrap:wrap; }
.fx-joueur {
  font-family:'Barlow Condensed',sans-serif; font-weight:700;
  text-transform:uppercase; letter-spacing:.3px; font-size:19px;
  color: var(--ink); line-height:1.15;
}
.fx-joueur:hover { color: var(--night); text-decoration: underline; text-underline-offset: 3px; }
.fx-prenom { font-weight:500; color: var(--ink-2); }
.fx-ctx {
  font-family:'Barlow Condensed',sans-serif; font-weight:600;
  text-transform:uppercase; letter-spacing:.6px; font-size: 12px;
  color: var(--night);
}
.fx-club { font-size:13px; color: var(--muted); }
/* Le commentaire est borné à 3 lignes : dans un flux, un rapport bavard ne
   doit pas repousser les suivants hors de l'écran. Le texte entier se lit dans
   la surcouche. */
.fx-texte {
  margin: 7px 0 0; font-size:14px; line-height:1.5;
  white-space:pre-wrap; color: var(--ink); max-width: 72ch;
  display: -webkit-box; -webkit-box-orient: vertical;
  -webkit-line-clamp: 3; line-clamp: 3; overflow: hidden;
}
/* « Tout lire » : posé par le JS uniquement quand le texte est vraiment coupé. */
/* « Tout lire » faisait 48 × 14 : c'est la commande qui ouvre le rapport
   complet, elle ne peut pas être la plus petite cible de la carte. Le padding
   la porte à 24 px sans déplacer le soulignement, posé par `text-decoration`. */
.fx-lire {
  background:none; border:0; padding:5px 0; cursor:pointer;
  font-family:'Barlow Condensed',sans-serif; font-weight:600;
  text-transform:uppercase; letter-spacing:.6px; font-size:12px;
  color: var(--night); text-decoration:underline; text-underline-offset:3px;
}
.fx-lire:hover { color: var(--sand-2); }
.fx-lire:focus-visible { outline: 2px solid var(--night); outline-offset: 2px; }
.fx-pied { display:flex; align-items:center; gap:10px; flex-wrap:wrap; margin-top:10px; }
.fx-signe {
  margin-left:auto; width:26px; height:26px; flex:none;
  display:inline-flex; align-items:center; justify-content:center;
  background: var(--night); color:var(--on-night); border-radius:50%;
  font-family:'Barlow Condensed',sans-serif; font-size:11.5px; font-weight:700;
  letter-spacing:.5px;
}

/* Carnet de notes : trois mesures alignées, lues verticalement. */
.carnet {
  display:flex; gap:14px; margin:0; padding:0 0 0 16px;
  border-left:1px solid var(--line); flex:none;
}
.carnet > div { display:flex; flex-direction:column; align-items:center; gap:4px; }
.carnet dt {
  font-family:'Barlow Condensed',sans-serif; font-weight:600;
  text-transform:uppercase; letter-spacing:.7px; font-size:10.5px;
  color: var(--muted);
}
.carnet dd { margin:0; }
.carnet .n, .carnet .f {
  display:flex; align-items:center; justify-content:center;
  min-width:34px; height:30px; padding:0 8px; border-radius:4px;
  font-family:'Barlow Condensed',sans-serif; font-weight:800; font-size:18px;
  border:1px solid transparent;
}
.carnet .f { font-size:14px; letter-spacing:.5px; text-transform:uppercase; }
.n-1 { background:var(--n1-bg); color:var(--n1-fg); border-color:var(--n1-line); }
.n-2 { background:var(--n2-bg); color:var(--n2-fg); border-color:var(--n2-line); }
.n-3 { background:var(--n3-bg); color:var(--n3-fg); border-color:var(--n3-line); }
.n-4 { background:var(--n4-bg); color:var(--n4-fg); border-color:var(--n4-line); }
.n-x, .f-na { background: var(--paper); color: var(--muted); border-color: var(--line); }
/* ⚠️ La faisabilité n'est PAS une note : c'est un oui/non. Elle empruntait les
   jetons de la note 1 tant que ceux-ci étaient verts ; maintenant qu'ils sont
   bleus, « Faisable : oui » aurait viré au bleu sans que rien ne l'ait décidé.
   Elle passe donc sur les jetons de succès — exactement les valeurs qu'elle
   affichait hier, cette fois nommées pour ce qu'elles disent. */
.f-oui { background:var(--success-bg); color:var(--success-fg); border-color:var(--success-line); }
.f-non { background:var(--n4-bg); color:var(--n4-fg); border-color:var(--n4-line); }

/* ── Surcouche de lecture d'un rapport ──
   Le fond s'assombrit et se floute : la liste reste visible derrière, on lit
   « par-dessus » sans avoir quitté sa place. */
.ovl { position: fixed; inset: 0; z-index: 60; display: grid; place-items: center;
  padding: 24px; }
.ovl[hidden] { display: none; }
.ovl-fond {
  position: absolute; inset: 0; background: rgba(11,61,46,.55);
  backdrop-filter: blur(3px); animation: ovl-fondu .18s ease-out;
}
/* Pas de liseré ambré ici : à 3 px sur un coin arrondi il laisse deux moignons
   carrés, et la surcouche est déjà détachée par le fond assombri et l'ombre
   portée. C'est une surface de lecture — rien à y décorer. */
.ovl-boite {
  position: relative; width: min(680px, 100%); max-height: 86vh; overflow-y: auto;
  background: var(--surface); border-radius: var(--radius);
  box-shadow: 0 18px 48px rgba(11,61,46,.28), 0 2px 8px rgba(11,61,46,.14);
  padding: 24px 28px 26px;
  animation: ovl-monte .22s cubic-bezier(.16,.84,.44,1);
}
@keyframes ovl-fondu { from { opacity: 0; } }
@keyframes ovl-monte { from { opacity: 0; transform: translateY(10px); } }
@media (prefers-reduced-motion: reduce) {
  .ovl-fond, .ovl-boite { animation: none; }
}
.ovl-x {
  position: absolute; top: 12px; right: 14px;
  background: none; border: 1px solid var(--line-2); border-radius: 4px;
  width: 30px; height: 30px; cursor: pointer; font-size: 14px; color: var(--muted);
}
.ovl-x:hover { border-color: var(--night); color: var(--night); }
.ovl-x:focus-visible { outline: 2px solid var(--night); outline-offset: 2px; }
/* Le fond ne défile plus tant que la surcouche est ouverte. */
body.ovl-ouvert { overflow: hidden; }

.rd-tete { margin: 0 40px 14px 0; }
.rd-joueur {
  display: block; font-family:'Barlow Condensed',sans-serif; font-weight:800;
  text-transform:uppercase; letter-spacing:-.2px; font-size:26px; line-height:1.1;
  color: var(--ink);
}
a.rd-joueur:hover { color: var(--night); text-decoration: underline; text-underline-offset: 4px; }
.rd-club { font-size: 13px; color: var(--muted); }

.rd-meta { display:grid; grid-template-columns: repeat(auto-fit, minmax(140px,1fr));
  gap: 10px 16px; margin: 0 0 16px; padding: 14px 0; border-top: 1px solid var(--line);
  border-bottom: 1px solid var(--line); }
.rd-meta > div { display:flex; flex-direction:column; gap:2px; min-width:0; }
.rd-meta dt {
  font-family:'Barlow Condensed',sans-serif; font-weight:600;
  text-transform:uppercase; letter-spacing:.7px; font-size:10.5px; color: var(--muted);
}
.rd-meta dd { margin:0; font-size:14px; font-weight:600; color: var(--ink); }

.carnet.rd-carnet { padding:0; border-left:0; justify-content:flex-start; gap:18px; }
.rd-reco { display:flex; align-items:center; gap:10px; flex-wrap:wrap; margin-top:14px; }

.rd-bloc { margin-top: 18px; }
.rd-bloc h4 {
  margin: 0 0 6px; font-family:'Barlow Condensed',sans-serif; font-weight:700;
  text-transform:uppercase; letter-spacing:.7px; font-size:12px; color: var(--night);
}
.rd-texte {
  margin: 0; font-size: 15px; line-height: 1.6; color: var(--ink);
  white-space: pre-wrap; max-width: 68ch;
}
.rd-vide { margin: 18px 0 0; font-size: 14px; color: var(--muted); font-style: italic; }

/* ── Dossier du joueur dans la surcouche ──
   Deux séries distinctes (matchs / entretiens) : elles ne se lisent pas de la
   même façon, les mélanger effacerait d'où vient chaque jugement. */
.rd-dossier { border-top: 1px solid var(--line); padding-top: 16px; }
.rd-dossier-t { margin: 0 0 4px; }
.rd-serie { margin-top: 14px; }
.rd-serie h5 {
  display: flex; align-items: center; gap: 8px; margin: 0 0 7px;
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700;
  text-transform: uppercase; letter-spacing: .7px; font-size: 12px; color: var(--ink-2);
}
.rd-serie h5 span {
  font-family: 'Barlow', sans-serif; font-weight: 600; font-size: 11.5px;
  color: var(--muted); background: var(--paper); border: 1px solid var(--line);
  border-radius: 9px; padding: 0 7px; letter-spacing: 0; text-transform: none;
}
.rd-lignes { list-style: none; margin: 0; padding: 0; display: grid; gap: 6px; }
.rd-lignes li {
  display: grid;
  /* 86 px et non 58 : la date passe en toutes lettres (« 2 août 2026 »),
     comme le reste de la prose. La colonne suivante est en `minmax(0, 1fr)`,
     c'est elle qui absorbe la différence. */
  grid-template-columns: 86px minmax(0, 1fr) auto auto 24px;
  align-items: center; gap: 10px;
  padding: 8px 10px; border: 1px solid var(--line); border-radius: 4px;
  background: var(--paper); font-size: 12px;
}
.rd-lignes li.est-courant { background: var(--surface); border-color: var(--sand); }
.rm-date {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700; font-size: 12px;
  color: var(--night);
}
.rm-quoi { font-weight: 600; color: var(--ink); overflow: hidden;
  text-overflow: ellipsis; white-space: nowrap; }
.rm-notes { display: flex; gap: 4px; }
.rm-notes .n {
  display: flex; align-items: center; justify-content: center;
  min-width: 22px; height: 21px; border-radius: 3px; border: 1px solid transparent;
  font-family: 'Barlow Condensed', sans-serif; font-weight: 800; font-size: 13px;
}
.rm-signe {
  width: 22px; height: 22px; display: inline-flex; align-items: center;
  justify-content: center; background: var(--night); color: var(--on-night); border-radius: 50%;
  font-family: 'Barlow Condensed', sans-serif; font-size: 10.5px; font-weight: 700;
}
.rm-ici {
  grid-column: 1 / -1;
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700; font-size: 10.5px;
  text-transform: uppercase; letter-spacing: .7px; color: var(--sand-2);
}
/* Borné à 2 lignes, dépliable sur place : on ne quitte pas le dossier pour lire. */
.rm-texte {
  grid-column: 1 / -1; margin: 2px 0 0; font-size: 12px; line-height: 1.45;
  color: var(--ink-2); white-space: pre-wrap;
  display: -webkit-box; -webkit-box-orient: vertical;
  -webkit-line-clamp: 2; line-clamp: 2; overflow: hidden;
}
.rm-texte.est-deplie {
  display: block; -webkit-line-clamp: none; line-clamp: none; overflow: visible;
}
.rm-plus {
  grid-column: 1 / -1; justify-self: start; margin-top: 2px;
  background: none; border: 0; padding: 0; cursor: pointer;
  font-family: 'Barlow Condensed', sans-serif; font-weight: 600;
  text-transform: uppercase; letter-spacing: .6px; font-size: 11.5px;
  color: var(--night); text-decoration: underline; text-underline-offset: 3px;
}
.rm-plus:hover { color: var(--sand-2); }
.rm-plus:focus-visible { outline: 2px solid var(--night); outline-offset: 2px; }

@media (max-width: 560px) {
  .rd-lignes li { grid-template-columns: 54px minmax(0, 1fr) auto; }
  .rd-lignes .reco, .rm-signe { grid-column: auto; }
}

/* La carte entière ouvre la surcouche : elle doit le dire au survol. */
[data-rapport-carte] { cursor: pointer; }
[data-rapport-carte]:hover { border-color: var(--line-2); box-shadow: 0 2px 6px rgba(11,61,46,.07), 0 8px 22px rgba(11,61,46,.06); }
[data-rapport-carte]:focus-visible { outline: 2px solid var(--night); outline-offset: 2px; }

/* Note A-D en cellule de tableau — même code couleur que le carnet, en compact. */
.tag-n {
  display:inline-flex; align-items:center; justify-content:center;
  min-width:24px; height:22px; border-radius:3px; padding:0 6px;
  font-family:'Barlow Condensed',sans-serif; font-weight:800; font-size:14px;
  border:1px solid transparent;
}

/* Carte de rapport sur la fiche : mêmes règles, plus les actions. */
.rap-view .fx-titre { align-items:center; }
.rap-actions { display:flex; gap:6px; margin-left:auto; }
.rap-actions form { margin:0; }

/* ── État vide ── */
.vide {
  background: var(--surface); border:1px dashed var(--line-2);
  border-radius: var(--radius); padding: 26px 22px; text-align:center;
}
.vide-titre {
  margin:0; font-family:'Barlow Condensed',sans-serif; font-weight:700;
  text-transform:uppercase; letter-spacing:.6px; font-size:16px; color: var(--ink-2);
}
.vide-aide { margin:6px 0 0; font-size:14px; color: var(--muted); }
.vide-aide a { color: var(--night); font-weight:600; text-decoration: underline; text-underline-offset: 3px; }

/* ═══ FORMULAIRE DE RAPPORT ═══ */
.rf-adder { margin-bottom: 14px; }
.rf-adder > summary {
  cursor:pointer; list-style:none; display:inline-flex; align-items:center; gap:8px;
  font-family:'Barlow Condensed',sans-serif; font-weight:700;
  text-transform:uppercase; letter-spacing:.7px; font-size:14px;
  color: var(--night); background: var(--surface);
  border:1px solid var(--line-2); border-radius:5px; padding: 8px 15px;
  transition: border-color .15s, background .15s;
}
.rf-adder > summary::-webkit-details-marker { display:none; }
.rf-adder > summary::before { content:"＋"; color: var(--sand); font-weight:800; font-size:17px; }
.rf-adder > summary:hover { border-color: var(--night); background: var(--paper); }
.rf-adder > summary:focus-visible { outline: 2px solid var(--night); outline-offset: 2px; }
.rf-adder[open] > summary { margin-bottom: 12px; }
.rf-adder[open] > summary::before { content:"−"; }

.rf-wrap {
  background: var(--surface); border:1px solid var(--line);
  border-radius: var(--radius); box-shadow: var(--shadow);
  padding: 18px 20px 16px;
}
.rap-edit { margin-top: 8px; }

.rf { display:flex; flex-direction:column; gap:16px; }
.rf-row { display:flex; gap:22px; flex-wrap:wrap; align-items:flex-start; }
.rf-row-eval { gap:26px; }
.rf-field { display:flex; flex-direction:column; gap:6px; min-width:0; }
/* `display:flex` d'une classe l'emporte sur le `display:none` que le navigateur
   applique à [hidden] : sans ceci, masquer le champ « adversaire » en JS reste
   sans effet à l'écran. Vaut pour tout .rf-field masqué. */
.rf-field[hidden] { display:none; }
.rf-field-date { width:170px; }
.rf-field-adv { flex:1; min-width:200px; max-width:340px; }
.rf-label {
  font-family:'Barlow Condensed',sans-serif; font-weight:600;
  text-transform:uppercase; letter-spacing:.8px; font-size:11.5px;
  color: var(--muted);
}
/* `select` compris : la liste des auteurs restait un contrôle natif brut au
   milieu de champs habillés — même règle que `.field select` des filtres. */
.rf input[type=text], .rf input[type=date], .rf select, .rf textarea {
  font-family:'Barlow',sans-serif; font-size:14px; padding:8px 11px;
  border:1px solid var(--line-2); border-radius:5px; background: var(--surface);
  color: var(--ink); width:100%;
}
.rf textarea { min-height:104px; resize:vertical; line-height:1.55; max-width:75ch; }
.rf input:focus, .rf select:focus, .rf textarea:focus {
  outline:none; border-color: var(--night); box-shadow: 0 0 0 3px rgba(11,61,46,.08);
}
.rf ::placeholder { color: var(--muted); }

/* Contrôle segmenté (type de rapport, faisabilité) */
.seg { display:inline-flex; border:1px solid var(--line-2); border-radius:5px; overflow:hidden; }
.seg-opt { position:relative; display:flex; }
.seg-opt + .seg-opt { border-left:1px solid var(--line-2); }
.seg-opt input { position:absolute; opacity:0; width:100%; height:100%; margin:0; cursor:pointer; }
.seg-opt span {
  display:flex; align-items:center; justify-content:center;
  padding: 8px 16px; min-width:56px;
  font-family:'Barlow Condensed',sans-serif; font-weight:600;
  text-transform:uppercase; letter-spacing:.7px; font-size: 13px;
  color: var(--ink-2); background: var(--surface); cursor:pointer;
  transition: background .15s, color .15s;
}
.seg-opt:hover span { background: var(--paper); }
.seg-opt input:checked + span { background: var(--night); color:var(--on-night); }
.seg-opt input:focus-visible + span { outline: 2px solid var(--night); outline-offset: -2px; }
.seg-bool .seg-oui input:checked + span { background: var(--ok); }
.seg-bool .seg-non input:checked + span { background: var(--bad); }

/* Pastilles de note A-D */
.notes { display:inline-flex; gap:6px; }
.note-opt { position:relative; display:flex; }
.note-opt input { position:absolute; opacity:0; width:100%; height:100%; margin:0; cursor:pointer; }
.note-opt span {
  display:flex; align-items:center; justify-content:center;
  width:40px; height:38px; border-radius:5px; cursor:pointer;
  border:1px solid var(--line-2); background: var(--surface);
  font-family:'Barlow Condensed',sans-serif; font-weight:800; font-size:18px;
  color: var(--ink-2); transition: all .15s;
}
.note-opt:hover span { border-color: var(--night); color: var(--night); }
.note-opt input:focus-visible + span { outline: 2px solid var(--night); outline-offset: 2px; }
.note-opt.n-1 input:checked + span { background:var(--n1-bg); border-color:var(--n1-fg); color:var(--n1-fg); }
.note-opt.n-2 input:checked + span { background:var(--n2-bg); border-color:var(--n2-fg); color:var(--n2-fg); }
.note-opt.n-3 input:checked + span { background:var(--n3-bg); border-color:var(--n3-fg); color:var(--n3-fg); }
.note-opt.n-4 input:checked + span { background:var(--n4-bg); border-color:var(--n4-fg); color:var(--n4-fg); }

/* Cartes de recommandation : le choix le plus lourd du formulaire */
.recos { display:flex; gap:8px; flex-wrap:wrap; }
.reco-opt { position:relative; display:flex; flex:1 1 190px; }
.reco-opt input { position:absolute; opacity:0; width:100%; height:100%; margin:0; cursor:pointer; }
.reco-opt span {
  display:flex; align-items:center; width:100%; gap:9px; cursor:pointer;
  padding: 11px 14px; border:1px solid var(--line-2); border-radius:5px;
  background: var(--surface); color: var(--ink-2);
  font-family:'Barlow Condensed',sans-serif; font-weight:600;
  text-transform:uppercase; letter-spacing:.6px; font-size: 13px;
  transition: all .15s;
}
/* Puce de sélection : elle se remplit, elle ne change pas de taille. */
.reco-opt span::before {
  content:""; flex:none; width:14px; height:14px; border-radius:50%;
  border:2px solid var(--line-2); background: var(--surface);
  transition: border-color .15s, background .15s, box-shadow .15s;
}
.reco-opt:hover span { border-color: var(--night); color: var(--night); }
.reco-opt input:focus-visible + span { outline: 2px solid var(--night); outline-offset: 2px; }
.reco-opt input:checked + span { border-color: currentColor; font-weight:700; }
.reco-opt input:checked + span::before { box-shadow: inset 0 0 0 3px var(--surface); }
.reco-opt.r-avancer input:checked + span { background:var(--n3-bg); color:var(--n3-fg); }
.reco-opt.r-avancer input:checked + span::before { background:var(--n3-fg); border-color:var(--n3-fg); }
.reco-opt.r-suivre input:checked + span { background:var(--success-bg); color:var(--success-fg); }
.reco-opt.r-suivre input:checked + span::before { background:var(--success-fg); border-color:var(--success-fg); }
.reco-opt.r-pas_interet input:checked + span { background:var(--n4-bg); color:var(--n4-fg); }
.reco-opt.r-pas_interet input:checked + span::before { background:var(--n4-fg); border-color:var(--n4-fg); }

/* Pied de formulaire */
.rf-foot {
  display:flex; align-items:center; justify-content:space-between; gap:14px;
  flex-wrap:wrap; border-top:1px solid var(--line); padding-top:14px;
}
.rf-foot-left, .rf-foot-right { display:flex; align-items:center; gap:10px; flex-wrap:wrap; }
/* Assez large pour un nom complet — 120 px tronquaient « Alexis Huot-Marchand ».
   `width:auto` annule le 100 % du contrôle : le pied de formulaire est une
   ligne, pas une colonne. */
.rf-scout { width:auto; min-width:200px; max-width:100%; }
.rf-file { position:relative; display:inline-flex; }
.rf-file input { position:absolute; inset:0; opacity:0; width:100%; cursor:pointer; }
.rf-file-btn {
  display:inline-flex; align-items:center; gap:6px; padding: 8px 13px;
  border:1px dashed var(--line-2); border-radius:5px; cursor:pointer;
  font-family:'Barlow Condensed',sans-serif; font-weight:600;
  text-transform:uppercase; letter-spacing:.6px; font-size: 12px; color: var(--ink-2);
}
.rf-file:hover .rf-file-btn { border-color: var(--night); color: var(--night); }
.rf-file input:focus-visible + .rf-file-btn { outline: 2px solid var(--night); outline-offset: 2px; }

@media (max-width: 720px) {
  .fx, .rap-view { grid-template-columns: 44px minmax(0,1fr); gap: 0 12px; }
  .fx-jour b { font-size: 22px; }
  /* Le carnet passe sous le corps, en ligne : il reste lisible sans écraser le texte. */
  .carnet {
    grid-column: 1 / -1; margin-top:12px; padding: 12px 0 0;
    border-left:0; border-top:1px solid var(--line); justify-content:space-around;
  }
  .rf-row, .rf-row-eval { gap:14px; }
  .rf-field-date { width:100%; }
  .reco-opt { flex-basis:100%; }
}

/* ── Puce PPI (bandeau) ── */
.ppi-chip {
  display:inline-block; margin-top:8px;
  background: var(--sand); color: var(--night);
  border-radius: 3px; padding: 4px 12px;
  font-family:'Barlow Condensed',sans-serif; font-size:15px; font-weight:600;
  letter-spacing:.4px;
}
.ppi-chip strong { font-size:18px; font-weight:800; }
.ppi-chip .ppi-proj { font-size: 12px; opacity:.85; }

/* rappel discret : le retour vers la liste rétablit les filtres */
.back-keep { text-transform: none; letter-spacing: 0; font-size: 11.5px; color: var(--muted); font-weight: 500; }

/* ── Échelle de percentile partagée (liste + compatibilité) ──
   `--tc` sert de FOND de barre : inchangé, c'est le langage visuel du produit.
   `--tc-solide` / `--tc-encre` ne servent qu'aux rares pastilles pleines qui
   portent du texte, où le blanc systématique donnait 1,95:1 sur l'ambre. */
.t-elite { --tc: var(--p-elite); --tc-solide: var(--p-elite-bg); --tc-encre: var(--p-elite-fg); --tc-texte: var(--p-elite-tx); }
.t-good  { --tc: var(--p-good);  --tc-solide: var(--p-good);     --tc-encre: var(--p-good-fg);  --tc-texte: var(--p-good-tx); }
.t-avg   { --tc: var(--p-avg);   --tc-solide: var(--p-avg);      --tc-encre: var(--p-avg-fg);   --tc-texte: var(--p-avg-tx); }
.t-low   { --tc: var(--p-low);   --tc-solide: var(--p-low);      --tc-encre: var(--p-low-fg);   --tc-texte: var(--p-low-tx); }
.t-poor  { --tc: var(--p-poor);  --tc-solide: var(--p-poor-bg);  --tc-encre: var(--p-poor-fg);  --tc-texte: var(--p-poor-tx); }

/* ── Bloc "cible de recrutement" (page liste) ── */
.target {
  margin-top: 14px; padding: 14px 16px 4px;
  border: 1px dashed var(--line-2); border-radius: var(--radius);
  background: color-mix(in srgb, var(--night) 3%, var(--surface));
}
.target-head { display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; margin-bottom: 10px; }
.target-title {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700; text-transform: uppercase;
  letter-spacing: .7px; font-size: 13px; color: var(--night);
}
.target-hint { font-size: 12px; color: var(--muted); }
.target-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); gap: 12px; }
.target select:disabled { opacity: .5; cursor: not-allowed; }

/* Raccourci « Ligue 2 » à côté du menu déroulant Championnat visé : même
   habillage que .cf-raccourcis (pastille, actif = fond nuit). */
.field-avec-raccourci { display: flex; gap: 8px; align-items: center; }
.field-avec-raccourci select { flex: 1 1 auto; min-width: 0; }
.btn-raccourci {
  flex: 0 0 auto; display: inline-flex; align-items: center; min-height: 36px;
  padding: 0 12px; border: 1px solid var(--line-2); border-radius: 999px;
  background: var(--surface); font-family: 'Barlow', sans-serif; font-size: 13px;
  font-weight: 600; color: var(--ink-2); text-decoration: none; white-space: nowrap;
}
.btn-raccourci:hover { border-color: var(--night); color: var(--night); }
.btn-raccourci.est-actif { background: var(--night); border-color: var(--night); color: var(--sand); }

/* pastille de percentile dans le tableau */
.fitpct {
  display: inline-block; min-width: 34px; padding: 2px 8px; border-radius: 20px;
  font-weight: 700; font-size: 13px; color: var(--on-night); background: var(--tc, var(--muted));
}
table.grid td .val { white-space: nowrap; }
.fit-na { color: var(--muted); }   /* --line-2 sur blanc = 1,45:1 */
table.grid th.col-fit { background: var(--night-3); }

/* ── Compatibilité championnat (fiche joueur) ── */
.fit-card { margin-bottom: 18px; }
.fit-pick { display: flex; align-items: center; gap: 9px; flex-wrap: wrap; margin-bottom: 16px; font-size: 14px; }
.fit-pick label { color: var(--ink-2); }
.fit-pick select {
  width: auto; min-width: 190px; font-weight: 700; color: var(--night);
  padding: 7px 10px; border: 1px solid var(--line-2); border-radius: 5px; background: var(--surface);
}
.fit-pos { color: var(--muted); }

.fit-axes { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: 22px; }
.fit-axis-head { display: flex; align-items: baseline; justify-content: space-between; margin-bottom: 7px; }
.fit-axis-head span {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700; text-transform: uppercase;
  letter-spacing: .6px; font-size: 13px; color: var(--ink-2);
}
/* transition "valeur chez lui -> valeur dans le championnat visé" */
.fit-move { display: flex; align-items: flex-end; gap: 14px; margin: 2px 0 10px; flex-wrap: wrap; }
.fit-move b {
  display: block; font-family: 'Barlow Condensed', sans-serif; font-weight: 800;
  font-size: 40px; line-height: .95;
}
.fit-move i { display: block; font-style: normal; font-size: 11.5px; color: var(--muted); margin-top: 2px; }
.fit-move .fm-from b { color: var(--muted); font-size: 30px; }
/* Nombre de 30 px : variante TEXTE du palier — `--tc` est une couleur de
   barre et tombait à 2,72:1 sur `--p-low`. */
.fit-move .fm-to b { color: var(--tc-texte, var(--tc, var(--night))); }
.fit-move .fm-arrow { font-size: 22px; color: var(--line-2); padding-bottom: 14px; }
.fit-bar { height: 10px; background: var(--paper); border: 1px solid var(--line); border-radius: 6px; overflow: hidden; }
.fit-fill { display: block; height: 100%; background: var(--tc, var(--night)); border-radius: 6px; }

/* alerte points faibles */
.fit-alert {
  margin-top: 18px; padding: 13px 15px; border-radius: var(--radius);
  background: color-mix(in srgb, var(--p-poor) 8%, var(--surface));
  border: 1px solid color-mix(in srgb, var(--p-poor) 30%, var(--surface));
}
.fit-alert-head {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700; text-transform: uppercase;
  letter-spacing: .6px; font-size: 13px; color: var(--p-poor-tx); margin-bottom: 9px;
}
.fit-alert ul { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 7px; }
.fit-alert li { display: grid; grid-template-columns: 1fr 110px 40px; align-items: center; gap: 12px; font-size: 13px; }
.fit-alert .w-lab { color: var(--ink); font-weight: 500; }
/* le rail reste bien visible : une barre à 0 % doit se lire comme "vide", pas comme absente */
.fit-alert .w-bar {
  height: 8px; background: var(--surface); border-radius: 5px; overflow: hidden;
  border: 1px solid color-mix(in srgb, var(--p-poor) 35%, var(--surface));
}
.fit-alert .w-fill { display: block; height: 100%; background: var(--p-poor); border-radius: 5px 0 0 5px; }
/* Sur le fond teinté de l'encadré, `--p-poor` tombe à 4,05:1 : variante TEXTE. */
.fit-alert .w-pct { text-align: right; font-weight: 800; color: var(--p-poor-tx); font-variant-numeric: tabular-nums; }
.fit-ok {
  margin-top: 18px; padding: 11px 15px; border-radius: var(--radius); font-size: 13px;
  color: var(--p-elite); background: color-mix(in srgb, var(--p-elite) 8%, var(--surface));
  border: 1px solid color-mix(in srgb, var(--p-elite) 25%, var(--surface));
}

/* ── Joueurs similaires ── */
.sim-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(190px, 1fr)); gap: 10px; }
.sim-card {
  display: block; border: 1px solid var(--line); border-radius: 6px; padding: 11px 13px;
  background: var(--surface); transition: border-color .15s, transform .12s, box-shadow .15s;
}
a.sim-card:hover { border-color: var(--night); transform: translateY(-2px); box-shadow: var(--shadow); }
.sim-name { font-family: 'Barlow Condensed', sans-serif; font-weight: 700; font-size: 15px; line-height: 1.15; }
.sim-meta { font-size: 12px; color: var(--muted); margin-top: 3px; }
.sim-prox { height: 5px; background: var(--paper); border-radius: 3px; overflow: hidden; margin: 9px 0 2px; }
.sim-prox-fill { display: block; height: 100%; background: linear-gradient(90deg, var(--sand-2), var(--sand)); border-radius: 3px; }
.sim-foot { display: flex; gap: 8px; align-items: center; margin-top: 8px; flex-wrap: wrap; }
.sim-ppi {
  /* Pastille PLEINE : fond et encre viennent de la paire du palier — le
     `color:var(--on-night)` d'origine donnait 1,95:1 sur `--p-avg`. */
  background: var(--tc-solide, var(--tc, var(--night))); color: var(--tc-encre, #fff);
  border-radius: 3px; padding: 1px 7px;
  font-family: 'Barlow Condensed', sans-serif; font-size: 12px; font-weight: 700;
}
.sim-inbase { font-size: 11.5px; color: var(--sand-fg); font-weight: 700; margin-left: auto; }

.hint { font-size: 12px; color: var(--muted); line-height: 1.5; margin: 9px 0 0; }
.hint b { color: var(--ink-2); }

@media (prefers-reduced-motion: reduce) { .sim-card { transition: none; } }

/* ── Paramètres ── */
.tabs { display:flex; gap:6px; border-bottom:1px solid var(--line-2); margin-bottom:18px; }
.tabs a {
  font-family:'Barlow Condensed',sans-serif; font-weight:600; text-transform:uppercase; letter-spacing:.7px;
  font-size:14px; padding:8px 14px; color: var(--muted); border-bottom:3px solid transparent; margin-bottom:-1px;
}
.tabs a.active { color: var(--night); border-bottom-color: var(--sand); }
.stat-strip { display:grid; grid-template-columns: repeat(auto-fit,minmax(150px,1fr)); gap:0; border:1px solid var(--line);
  border-radius: var(--radius); overflow:hidden; margin-bottom:20px; background:var(--surface); }
.stat-cell { padding:16px 18px; border-right:1px solid var(--line); }
.stat-cell:last-child { border-right:none; }
.stat-cell .n { font-family:'Barlow Condensed',sans-serif; font-weight:800; font-size:34px; color: var(--night); line-height:1; }
.stat-cell .l { font-family:'Barlow Condensed',sans-serif; font-weight:600; text-transform:uppercase; letter-spacing:.8px;
  font-size:12px; color: var(--muted); margin-top:4px; }

@media (max-width: 720px) {
  .obs-form .grid2 { grid-template-columns: 1fr 1fr; }
  .hero h1 { font-size: 34px; }
  .hero-top { flex-direction: column; }
  .hero-val { text-align: left; }
}

/* ── Bandeau : lecture de droite ──────────────────────────────────────────── */
.hero-val { text-align: right; display: flex; flex-direction: column;
  align-items: flex-end; gap: 14px; }
.hero-stat { display: flex; flex-direction: column; align-items: flex-end; gap: 1px; }
.hero-k { font-size: 11.5px; font-weight: 600; letter-spacing: .4px;
  text-transform: uppercase; color: rgba(255,255,255,.75); }
.hero-stat .big { font-family: 'Barlow Condensed', sans-serif; font-weight: 800;
  font-size: 38px; line-height: 1.02; color: var(--on-night); }
.hero-stat .trend { font-size: 12px; font-weight: 600; margin: 0; }
.hero-stat-ppi { padding-top: 12px; border-top: 1px solid rgba(255,255,255,.16);
  align-self: stretch; align-items: flex-end; }
.ppi-num { font-family: 'Barlow Condensed', sans-serif; font-weight: 800;
  font-size: 30px; line-height: 1.05; color: var(--sand); }
/* `rgba(255,255,255,.5)` sur le vert du bandeau composite à #859E97, soit
   4,26:1 — sous AA pour du 12-14 px. Relevé à .62, ce qui donne 5,5:1 sans
   ramener ces mentions au premier plan : elles restent en retrait du chiffre. */
.ppi-num i { font-style: normal; font-size: 14px; font-weight: 600;
  color: rgba(255,255,255,.62); margin-left: 1px; }
.hero-proj { font-size: 12px; font-weight: 600; color: rgba(255,255,255,.78); }
.hero-proj i { font-style: normal; color: rgba(255,255,255,.62); font-weight: 500; }

/* ── Trajectoire & projection ─────────────────────────────────────────────── */
.traj-card { padding: 16px 18px 14px; }
.traj-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
  gap: 24px; }
.traj-fig { margin: 0; min-width: 0; }
.traj-fig figcaption { display: flex; align-items: baseline; gap: 8px;
  margin-bottom: 4px; flex-wrap: wrap; }
.traj-t { font-family: 'Barlow Condensed', sans-serif; font-weight: 700;
  text-transform: uppercase; letter-spacing: .5px; font-size: 14px; color: var(--ink); }
.traj-s { font-size: 11.5px; color: var(--ink-2); }

.traj-chart { position: relative; }
.traj-svg { width: 100%; height: auto; display: block; overflow: visible; }
.traj-hit { fill: transparent; }
.traj-gy { stroke: var(--line); stroke-width: 1; }
.traj-sep { stroke: var(--line-2); stroke-width: 1; stroke-dasharray: 2 3; }
/* 10 px : --muted plafonne à 4,6:1 sur blanc, trop juste pour du texte aussi
   petit. --ink-2 monte à ~7,6:1 sans alourdir la grille. */
.traj-lab-y, .traj-lab-x { font-size: 10.5px; fill: var(--ink-2);
  font-variant-numeric: tabular-nums; letter-spacing: .2px; }
.traj-lab-y { text-anchor: end; }
.traj-lab-x { text-anchor: middle; }

.traj-line { fill: none; stroke-width: 2.2; stroke-linejoin: round;
  stroke-linecap: round; }
.traj-proj { stroke-dasharray: 5 4; }
.traj-band { opacity: .13; }
.traj-dot { fill: var(--surface); stroke-width: 2; }
.traj-dot.is-proj { fill: currentColor; }
.traj-ppi .traj-line, .traj-ppi .traj-dot { stroke: var(--night); color: var(--night); }
.traj-ppi .traj-band { fill: var(--night); }
.traj-val .traj-line, .traj-val .traj-dot { stroke: var(--sand-2); color: var(--sand-2); }
.traj-val .traj-band { fill: var(--sand); opacity: .2; }

.traj-guide, .traj-actif { opacity: 0; transition: opacity .16s ease-out; }
.traj-chart.is-on .traj-guide, .traj-chart.is-on .traj-actif { opacity: 1; }
.traj-guide { stroke: var(--line-2); stroke-width: 1; stroke-dasharray: 3 3; }
.traj-actif { fill: var(--surface); stroke-width: 2.5; }
.traj-ppi .traj-actif { stroke: var(--night); }
.traj-val .traj-actif { stroke: var(--sand-2); }
.traj-actif.is-proj { fill: currentColor; }

.traj-tip { position: absolute; top: 2px; transform: translateX(-50%);
  background: var(--ink); color: var(--on-night); border-radius: 4px; padding: 4px 9px;
  font-size: 11.5px; line-height: 1.45; white-space: nowrap; pointer-events: none;
  opacity: 0; transition: opacity .16s ease-out; }
.traj-chart.is-on .traj-tip { opacity: 1; }
.traj-chart.tip-bas .traj-tip { top: auto; bottom: 26px; }
.traj-tip b { font-weight: 700; }
.traj-tip span { display: block; color: rgba(255,255,255,.7); }

.traj-cards { display: flex; gap: 10px; margin: 18px 0 4px; flex-wrap: wrap; }
.traj-h { flex: 1 1 130px; background: var(--paper); border: 1px solid var(--line);
  border-radius: var(--radius); padding: 9px 11px; }
.traj-h-t { font-family: 'Barlow Condensed', sans-serif; font-weight: 700;
  text-transform: uppercase; letter-spacing: .5px; font-size: 12px; color: var(--ink-2); }
.traj-h-t span { color: var(--muted); font-weight: 500; }
.traj-h-v { font-family: 'Barlow Condensed', sans-serif; font-size: 26px;
  font-weight: 700; line-height: 1.1; color: var(--night); margin-top: 3px; }
.traj-h-v small { font-size: 11.5px; color: var(--ink-2); margin-left: 4px;
  font-family: 'Barlow', sans-serif; font-weight: 500; }
.traj-h-v2 { font-size: 17px; color: var(--sand-fg); margin-top: 6px; }
.traj-h-ic { font-size: 11.5px; color: var(--ink-2); font-variant-numeric: tabular-nums; }
.traj-note { font-size: 12px; color: var(--ink-2); line-height: 1.55;
  margin: 12px 0 0; padding-top: 10px; border-top: 1px solid var(--line);
  max-width: 78ch; }
.traj-note strong { color: var(--ink); }

@media (prefers-reduced-motion: reduce) {
  .traj-guide, .traj-actif, .traj-tip { transition: none; }
}

/* ── Lecture à un autre poste ─────────────────────────────────────────────── */
.poste-card { padding: 14px 18px 12px; }
.poste-strip { display: flex; gap: 8px; flex-wrap: wrap; }
.poste-item { flex: 1 1 128px; padding: 9px 11px; border: 1px solid var(--line);
  border-radius: var(--radius); background: var(--paper); }
.poste-item.est-naturel { border-color: var(--night); background: var(--surface); }
.poste-n { font-size: 12px; font-weight: 600; color: var(--ink-2); line-height: 1.3; }
.poste-n span { color: var(--night); font-weight: 700; text-transform: uppercase;
  font-size: 10.5px; letter-spacing: .4px; }
.poste-v { font-family: 'Barlow Condensed', sans-serif; font-size: 26px;
  font-weight: 700; color: var(--ink); line-height: 1.1; margin-top: 2px; }
.poste-item.est-naturel .poste-v { color: var(--night); }
.poste-v i { font-style: normal; font-size: 11.5px; font-weight: 500;
  color: var(--muted); margin-left: 2px; font-family: 'Barlow', sans-serif; }
.poste-note { font-size: 12px; color: var(--ink-2); line-height: 1.55;
  margin: 12px 0 0; padding-top: 10px; border-top: 1px solid var(--line);
  max-width: 78ch; }
.poste-note strong { color: var(--ink); }

/* ── Effet du club, dans la carte compatibilité ───────────────────────────── */
/* Un seul nombre : l'ÉCART. Afficher deux niveaux absolus juxtaposerait deux
   échelles (celle du championnat visé et l'échelle mondiale) — le lecteur les
   comparerait et se tromperait. */
.fit-ctx { display: flex; align-items: center; gap: 12px; margin-top: 14px;
  padding: 10px 12px; border: 1px solid var(--line); border-radius: var(--radius);
  background: var(--paper); }
.fit-ctx-d { font-family: 'Barlow Condensed', sans-serif; font-weight: 800;
  font-size: 24px; line-height: 1; color: var(--ink-2);
  font-variant-numeric: tabular-nums; min-width: 2.4ch; text-align: right; }
.fit-ctx-t { font-size: 13px; line-height: 1.5; color: var(--ink-2); }
.fit-ctx-t b { color: var(--ink); font-weight: 600; }
.fit-ctx.est-bon { background: #F1F8F3; border-color: #C9E4D3; }
/* `--ok` / `--bad` sont calibrés pour des aplats : en TEXTE sur le fond
   teinté de l'encadré, ils plafonnent à ~4,05:1. Variantes texte. */
.fit-ctx.est-bon .fit-ctx-d { color: var(--ok-fg); }
.fit-ctx.est-mauvais { background: #FDF3F1; border-color: #F0D3CC; }
.fit-ctx.est-mauvais .fit-ctx-d { color: var(--p-poor-tx); }

/* ── Lecture par poste ────────────────────────────────────────────────────── */
.fit-postes { margin-top: 16px; padding-top: 13px; border-top: 1px solid var(--line); }
.fit-postes-k { font-family: 'Barlow Condensed', sans-serif; font-weight: 700;
  text-transform: uppercase; letter-spacing: .5px; font-size: 12px;
  color: var(--ink-2); margin-bottom: 9px; }
.poste-bar { height: 4px; border-radius: 2px; background: var(--line);
  overflow: hidden; margin-top: 7px; }
.poste-bar span { display: block; height: 100%; border-radius: 2px; }
.poste-bar .t-elite { background: var(--p-elite); }
.poste-bar .t-good  { background: var(--p-good); }
.poste-bar .t-avg   { background: var(--p-avg); }
.poste-bar .t-low   { background: var(--p-low); }
.poste-bar .t-poor  { background: var(--p-poor); }
.ppi-postes-lignes { display: grid; gap: 6px; }
.ppi-poste-ligne { display: grid; grid-template-columns: minmax(130px, 1fr) auto minmax(72px, auto);
  align-items: center; gap: 10px; padding: 7px 9px; border: 1px solid var(--line);
  border-radius: var(--radius); background: var(--paper); font-size: 12px; }
.ppi-poste-n { color: var(--ink-2); font-weight: 600; }
.ppi-poste-volume { color: var(--muted); font-variant-numeric: tabular-nums; }
.ppi-poste-ligne .fitpct, .ppi-poste-na { justify-self: end; }
.ppi-poste-na { color: var(--muted); font-size: 11.5px; }
.ppi-poste-ligne.est-global { border-color: var(--night); background: var(--surface); }
.ppi-postes-aide { margin: 8px 0 0; color: var(--muted); font-size: 11.5px; }
@media (max-width: 560px) {
  .ppi-poste-ligne { grid-template-columns: 1fr auto; }
  .ppi-poste-volume { grid-column: 1; }
  .ppi-poste-ligne .fitpct, .ppi-poste-na { grid-column: 2; grid-row: 1 / span 2; }
}
/* l'encadré des points faibles n'a qu'une ou deux lignes : il n'a pas besoin
   d'occuper autant de place que les deux axes réunis */
.fit-alert { padding: 11px 13px; }
.fit-alert .hint { margin-bottom: 0; }

/* ── Curseur à double poignée (âge, valeur marchande) ─────────────────────── */
.field-range { gap: 8px; }
.field-range label, .field-range .field-lab { display: flex; justify-content: space-between; align-items: baseline; }
.range-out { font-family: 'Barlow', sans-serif; font-weight: 600; text-transform: none;
  letter-spacing: 0; font-size: 13px; color: var(--night);
  font-variant-numeric: tabular-nums; }
/* la piste et les deux <input range> se superposent exactement */
/* 26 px et non 22 : la POIGNÉE passe à 24 px (WCAG 2.2, SC 2.5.8), et il lui
   faut la place. Ce n'est pas cosmétique — `.field .range-h` porte
   `pointer-events: none` pour que deux curseurs superposés (min/max) ne se
   bloquent pas l'un l'autre, donc la seule surface qui capte le pointeur EST
   la poignée. Elle faisait 16 × 16 px, à toutes les largeurs, sur les huit
   curseurs de la liste : la mesure de la boîte de l'`input` (22 px) ne le
   montrait pas, seule la lecture du CSS le disait. */
.range { position: relative; height: 26px; }
.range-track { position: absolute; top: 11px; left: 0; right: 0; height: 4px;
  background: var(--line-2); border-radius: 2px; }
.range-fill { position: absolute; top: 0; height: 100%; background: var(--night);
  border-radius: 2px; }
/* `.field input` (0,1,1) l'emportait sur `.range-h` (0,1,0) et habillait les
   curseurs en champs texte : on remonte la spécificité. */
.field .range-h { position: absolute; top: 0; left: 0; width: 100%; height: 26px;
  margin: 0; padding: 0; background: none; border: none; border-radius: 0;
  -webkit-appearance: none; appearance: none; pointer-events: none; }
.field .range-h:focus { outline: none; box-shadow: none; border: none; }
/* seules les poignées captent la souris, pas toute la barre */
.range-h::-webkit-slider-thumb { -webkit-appearance: none; appearance: none;
  pointer-events: auto; width: 24px; height: 24px; border-radius: 50%;
  background: var(--surface); border: 2px solid var(--night); cursor: grab;
  box-shadow: 0 1px 3px rgba(0,0,0,.18); margin-top: 1px; transition: transform .1s; }
.range-h::-webkit-slider-thumb:active { cursor: grabbing; transform: scale(1.12); }
.range-h::-moz-range-thumb { pointer-events: auto; width: 24px; height: 24px;
  border-radius: 50%; background: var(--surface); border: 2px solid var(--night);
  cursor: grab; box-shadow: 0 1px 3px rgba(0,0,0,.18); }
/* ⚠️ INDICATEUR DE FOCUS des curseurs — il existait, mais à 18 % d'opacité :
   ~1,3:1 sur fond clair, c'est-à-dire rien de perceptible. Or ces poignées sont
   le seul moyen de régler âge, valeur et moyennes au clavier (Tab 16 à 22 sur
   la liste) : sans repère visible on ne sait pas ce qu'on est en train de
   déplacer. La bague passe en vert plein, doublée d'un halo blanc qui la
   détache aussi bien du rail vert foncé que du fond clair — WCAG 2.4.11 exige
   3:1 contre les couleurs adjacentes, quelles qu'elles soient.
   ⚠️ Firefox n'avait AUCUNE règle de focus : `::-moz-range-thumb` est ajouté.
   Les deux moteurs veulent des sélecteurs séparés — groupés, ils invalident
   toute la règle. */
.range-h:focus-visible::-webkit-slider-thumb {
  box-shadow: 0 0 0 2px var(--surface), 0 0 0 5px var(--night);
}
.range-h:focus-visible::-moz-range-thumb {
  box-shadow: 0 0 0 2px var(--surface), 0 0 0 5px var(--night);
}
.range-h::-webkit-slider-runnable-track { background: none; }
.range-h::-moz-range-track { background: none; }

/* Curseur inactif : tant qu'aucun championnat n'est visé, il n'y a rien à
   filtrer. Le champ reste lisible (on doit comprendre ce qu'il fera), il n'est
   simplement pas manipulable. */
.field-range.est-inactif { opacity: .55; }
.field-range.est-inactif label { color: var(--muted); }
.range-h:disabled { cursor: not-allowed; }
.range-h:disabled::-webkit-slider-thumb { cursor: not-allowed; border-color: var(--line-2); }
.range-h:disabled::-moz-range-thumb { cursor: not-allowed; border-color: var(--line-2); }


/* ── Navigation : trois entrées ne tiennent plus sur un téléphone ──
   Le libellé de marque s'efface avant les liens : le logo suffit à situer
   l'app, les liens sont la seule chose sur laquelle on peut cliquer. */
@media (max-width: 700px) {
  .nav-inner { padding: 0 14px; }
  .brand { margin-right: 10px; font-size: 19px; }
  .nav-links a { padding: 0 11px; font-size: 13px; letter-spacing: .5px; }
  /* cibles tactiles : les petits boutons passaient sous ~24px, durs au pouce */
  .btn-sm { padding: 9px 14px; }
  .icon-btn { min-width: 38px; min-height: 38px; }
}
@media (max-width: 460px) {
  .brand .libelle { display: none; }
  .nav-links a { padding: 0 9px; font-size: 12px; }
  .wrap { padding-left: 14px; padding-right: 14px; }
}

/* ═══════════════════════════════════════════════════════════════════════════
   LISTES PAR POSTE · BACKGROUND CHECKS · EXPORT PDF
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── Listes par poste ───────────────────────────────────────────────────────
   Huit accordéons, un par groupe. Le rang porte la préférence du scout : il se
   change aux flèches, pas en triant une colonne. */

/* Choix du compte — des cartes, pas une liste déroulante : un menu cachait les
   collègues derrière un clic et ne disait rien du contenu de leurs listes.
   Le liseré gauche reprend le motif maison (bandeau de fiche, titres de carte,
   background checks) : il passe à l'ambre sur le compte consulté. */
.lsel { margin: 0 0 20px; }
.lsel-titre {
  margin: 0 0 8px; font-family: 'Barlow Condensed', sans-serif;
  font-size: 12px; font-weight: 700; letter-spacing: 1.2px;
  text-transform: uppercase; color: var(--muted);
}
.lsel-grille {
  display: grid; gap: 10px;
  grid-template-columns: repeat(auto-fill, minmax(230px, 1fr));
}
.lsel-carte {
  display: flex; align-items: center; gap: 11px;
  padding: 11px 13px; background: var(--surface);
  border: 1px solid var(--line); border-left: 3px solid var(--line-2);
  border-radius: var(--radius); box-shadow: var(--shadow);
  transition: border-color .12s, transform .12s;
}
.lsel-carte:hover { border-color: var(--line-2); border-left-color: var(--sand); transform: translateY(-1px); }
.lsel-carte:focus-visible { outline: 2px solid var(--night); outline-offset: 2px; }
.lsel-carte.est-courant {
  border-color: var(--night); border-left-color: var(--sand);
  background: linear-gradient(180deg, rgba(11,61,46,.05), transparent 60%);
}
.lsel-av {
  flex: none; width: 38px; height: 38px; border-radius: 50%;
  display: grid; place-items: center;
  background: var(--paper); color: var(--night);
  border: 1px solid var(--line-2);
  font-family: 'Barlow Condensed', sans-serif;
  font-weight: 700; font-size: 15px; letter-spacing: .5px;
}
.lsel-carte.est-courant .lsel-av {
  background: var(--night); color: var(--on-night); border-color: var(--night);
}
.lsel-txt { flex: 1; min-width: 0; display: flex; flex-direction: column; }
.lsel-nom {
  font-weight: 700; font-size: 14px; color: var(--ink);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.lsel-role {
  font-size: 11.5px; letter-spacing: .7px; text-transform: uppercase;
  color: var(--muted); font-weight: 600;
}
.lsel-n { flex: none; text-align: right; line-height: 1.1; }
.lsel-n b {
  display: block; font-family: 'Barlow Condensed', sans-serif;
  font-size: 22px; color: var(--night);
}
.lsel-n small { font-size: 10.5px; color: var(--muted); }

/* Sommaire : huit postes, huit compteurs — où il y a de la matière, d'un coup d'œil. */
.lsom {
  display: flex; align-items: center; flex-wrap: wrap; gap: 10px 14px;
  padding: 10px 13px; margin-bottom: 14px;
  background: var(--surface); border: 1px solid var(--line);
  border-radius: var(--radius); box-shadow: var(--shadow);
}
.lsom-total { font-size: 13px; color: var(--muted); }
.lsom-total b { font-family: 'Barlow Condensed', sans-serif; font-size: 19px; color: var(--night); }
.lsom-liens { display: flex; flex-wrap: wrap; gap: 6px; margin-left: auto; }
.lsom-l {
  display: inline-flex; align-items: center; gap: 5px;
  padding: 4px 8px; border: 1px solid var(--line-2); border-radius: 999px;
  font-family: 'Barlow Condensed', sans-serif; font-size: 12px;
  font-weight: 700; letter-spacing: .5px; color: var(--night);
}
.lsom-l:hover { border-color: var(--night); background: var(--paper); }
.lsom-l:focus-visible { outline: 2px solid var(--night); outline-offset: 1px; }
.lsom-n {
  min-width: 17px; padding: 0 4px; text-align: center; border-radius: 999px;
  background: var(--night); color: var(--on-night); font-size: 11.5px;
}
/* Un poste vide reste cliquable — il faut pouvoir aller y déposer un joueur —
   mais ne réclame pas le regard. */
.lsom-l.est-vide { color: var(--muted); border-color: var(--line); }
.lsom-l.est-vide .lsom-n { background: var(--line-2); color: var(--ink-2); }

.lg {
  margin-bottom: 12px; background: var(--surface);
  border: 1px solid var(--line); border-radius: var(--radius);
  box-shadow: var(--shadow); overflow: hidden;
  scroll-margin-top: 14px;
}
.lg-tete {
  display: flex; align-items: center; gap: 10px;
  padding: 12px 14px; cursor: pointer; list-style: none;
  font-family: 'Barlow Condensed', sans-serif;
  border-left: 3px solid transparent;
}
.lg-tete::-webkit-details-marker { display: none; }
.lg-tete:hover { background: var(--paper); }
.lg-tete:focus-visible { outline: 2px solid var(--night); outline-offset: -2px; }
.lg[open] .lg-tete {
  border-bottom: 1px solid var(--line); border-left-color: var(--sand);
  background: linear-gradient(180deg, rgba(11,61,46,.045), transparent);
}
/* Un poste sans joueur se replie visuellement : six accordéons vides à pleine
   hauteur noieraient les deux qui portent quelque chose. */
.lg.est-vide { margin-bottom: 6px; box-shadow: none; }
.lg.est-vide .lg-tete { background: var(--paper); padding: 8px 14px; }
.lg.est-vide .lg-abbr { background: var(--line-2); color: var(--ink-2); }
.lg.est-vide .lg-nom { color: var(--ink-2); }
.lg-abbr {
  min-width: 40px; padding: 3px 7px; text-align: center;
  background: var(--night); color: var(--on-night); border-radius: 4px;
  font-weight: 700; font-size: 11.5px; letter-spacing: .6px;
}
.lg-nom {
  flex: 1; min-width: 0; font-weight: 700; font-size: 16px;
  text-transform: uppercase; letter-spacing: .5px; color: var(--night);
}
.lg-fleche { color: var(--muted); font-size: 12px; transition: transform .15s; }
.lg[open] .lg-fleche { transform: rotate(180deg); }
.lg-corps { margin: 0; border: none; box-shadow: none; border-radius: 0; }
.lg-rang { text-align: center; }
.lg-rang span {
  display: inline-grid; place-items: center;
  min-width: 22px; height: 22px; padding: 0 5px; border-radius: 4px;
  background: var(--paper); border: 1px solid var(--line);
  color: var(--muted); font-weight: 700; font-size: 12px;
}
/* Les trois premiers rangs sont la tête de liste : c'est là que se joue la
   préférence du scout, elle doit se voir sans compter les lignes. */
.lg-rang .est-tete {
  background: var(--night); border-color: var(--night); color: var(--on-night);
}
.lg-memo {
  display: block; margin-top: 2px; font-size: 12px; color: var(--muted);
}
.lg-actions { white-space: nowrap; text-align: right; }
.lg-actions form { display: inline; }
.lg-actions .icon-btn:disabled { opacity: .25; cursor: default; }
.lg-vide, .lg-pied { padding: 14px; }
.lg-vide { margin: 0; color: var(--muted); font-size: 13px; }
.lg-vide-titre { display: block; font-weight: 700; color: var(--ink-2); }

/* ── Fenêtres (`<dialog>`) ──────────────────────────────────────────────────
   Rendues avec `open` par le serveur : sans JavaScript ce sont de simples
   blocs en ligne, utilisables tels quels. Le script (cf. _modales.html) les
   referme, pose `js` sur <html> et bascule sur `showModal()`.
   D'où les deux jeux de règles : l'état « bloc » par défaut, l'état « fenêtre »
   sous `:modal`. */
.mdl {
  position: static; display: block; width: auto; max-width: 100%;
  margin: 0 0 18px; padding: 0;
  background: var(--surface); color: var(--ink);
  border: 1px solid var(--line); border-radius: var(--radius);
  box-shadow: var(--shadow);
}
.mdl:not([open]) { display: none; }

.mdl:modal {
  width: min(620px, 100%); margin: auto; max-height: 88vh; overflow: auto;
  box-shadow: 0 18px 50px rgba(11, 61, 46, .28);
}
.mdl::backdrop { background: rgba(11, 61, 46, .42); }

.mdl-tete {
  display: flex; align-items: center; gap: 10px;
  padding: 13px 16px; border-bottom: 1px solid var(--line);
  background: var(--paper); border-radius: var(--radius) var(--radius) 0 0;
}
.mdl-t {
  flex: 1; min-width: 0; margin: 0;
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700;
  text-transform: uppercase; letter-spacing: .6px; font-size: 15px;
  color: var(--night);
}
.mdl-x {
  width: 30px; height: 30px; flex: 0 0 auto;
  background: none; border: 1px solid transparent; border-radius: 5px;
  cursor: pointer; color: var(--muted); font-size: 14px; line-height: 1;
}
.mdl-x:hover { border-color: var(--line-2); color: var(--ink); }
.mdl-pied {
  display: flex; flex-wrap: wrap; align-items: center; justify-content: flex-end;
  gap: 10px; margin-top: 14px; padding-top: 12px;
  border-top: 1px solid var(--line);
}
.mdl-pied .fa-voir { margin-right: auto; }

/* Sans script, un déclencheur qui n'ouvre rien et une croix qui masquerait
   définitivement le formulaire seraient pires que rien : les deux n'existent
   qu'une fois `js` posée. */
.chip-mdl, .mdl-appel, .mdl-x, .mdl-annuler, .pdfx-presets { display: none; }
.js .pdfx-presets { display: grid; }
.js .chip-mdl { display: inline-flex; }
.js .mdl-appel, .js .mdl-annuler { display: inline-flex; }
.js .mdl-x { display: block; }
/* Le titre de la fenêtre fait double emploi avec le déclencheur tant que le
   bloc est en ligne. */
html:not(.js) .mdl-tete { border-bottom: none; }

/* Puce du bandeau : même dessin que « Suivre », en bouton. */
.chip-mdl { cursor: pointer; font: inherit; }

/* ── Choix du poste dans « Ajouter à une liste » ────────────────────────────
   Huit pastilles plutôt qu'une liste déroulante : on voit les huit postes d'un
   coup, et surtout ceux où le joueur est déjà inscrit. Même grammaire que les
   cartes de recommandation du formulaire de rapport (`.reco-opt`). */
.pg { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 6px; }
.pg-opt { position: relative; display: flex; }
.pg-opt input {
  position: absolute; opacity: 0; width: 100%; height: 100%; margin: 0;
  cursor: pointer;
}
.pg-opt span {
  display: flex; align-items: center; width: 100%; gap: 9px; cursor: pointer;
  padding: 8px 11px; border: 1px solid var(--line-2); border-radius: 5px;
  background: var(--surface); color: var(--ink-2);
  transition: border-color .15s, background .15s, color .15s;
}
.pg-abbr {
  flex: none; min-width: 34px; padding: 2px 6px; text-align: center;
  border-radius: 4px; background: var(--paper); color: var(--ink-2);
  font-family: 'Barlow Condensed', sans-serif; font-weight: 800;
  font-size: 11.5px; letter-spacing: .6px; font-style: normal;
  transition: background .15s, color .15s;
}
.pg-nom {
  flex: 1; min-width: 0; font-weight: 600; font-size: 13px;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.pg-tag {
  flex: none; font-style: normal; font-size: 10.5px; font-weight: 700;
  text-transform: uppercase; letter-spacing: .5px; color: var(--muted);
}
/* ⚠️ `--sand-2` est calibré pour des aplats et des bordures : en TEXTE sur
   fond clair il tombe à 2,72:1, mesuré au rendu. `--sand-fg` est la variante
   texte de la même couleur, déjà en place pour le compteur de résultats et les
   badges de niveau. Ce libellé se voit désormais sur PLUSIEURS lignes à la fois
   (un joueur peut tenir deux postes) : autant qu'il soit lisible. */
.pg-tag-sug { color: var(--sand-fg); }

.pg-opt:hover span { border-color: var(--night); color: var(--night); }
.pg-opt input:focus-visible + span { outline: 2px solid var(--night); outline-offset: 2px; }
.pg-opt input:checked + span {
  border-color: var(--night); background: var(--paper); color: var(--night);
}
.pg-opt input:checked + span .pg-abbr { background: var(--night); color: var(--on-night); }

/* Poste déjà pris : visible mais hors d'atteinte — proposer un choix qui ne
   ferait rien serait pire que de le montrer barré. */
.pg-deja span { opacity: .5; cursor: not-allowed; }
.pg-deja:hover span { border-color: var(--line-2); color: var(--ink-2); }
.pg-deja input { cursor: not-allowed; }

/* ── Contenu du formulaire d'export ─────────────────────────────────────── */
.fa-liste, .pdfx-form { padding: 14px 16px; }
.fa-liste .rf-field { margin-bottom: 14px; }
.fa-voir { font-size: 12px; color: var(--night); text-decoration: underline; }
.pdfx-aide { margin: 0 0 12px; font-size: 12px; color: var(--muted); }

/* Trois destinataires, trois jeux de cases. Le bouton porte le libellé ET ce
   que le préréglage veut dire : « Pour un agent » seul n'apprendrait pas
   qu'on retire l'avis interne. */
.pdfx-presets {
  grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
  gap: 8px; margin-bottom: 14px;
}
.pdfx-preset {
  display: flex; flex-direction: column; gap: 2px; text-align: left;
  padding: 9px 12px; min-height: 44px; cursor: pointer;
  background: var(--surface); border: 1px solid var(--line-2);
  border-radius: var(--radius);
  transition: border-color .15s, background-color .15s;
}
.pdfx-preset:hover { border-color: var(--night); background: var(--paper); }
.pdfx-preset:focus-visible { outline: 2px solid var(--night); outline-offset: 2px; }
.pdfx-preset.est-actif { border-color: var(--sand); background: var(--warn-bg); }
.pdfx-preset-t {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700;
  text-transform: uppercase; letter-spacing: .5px; font-size: 13px;
  color: var(--night);
}
.pdfx-preset-a { font-size: 11.5px; line-height: 1.35; color: var(--muted); }

/* Ce qui va réellement sortir, en une phrase, juste au-dessus du bouton.
   Les rubriques qui engagent la cellule à l'extérieur sont en gras : c'est sur
   elles qu'on se trompe, pas sur « identité du joueur ». */
.pdfx-recap {
  margin: 14px 0 0; padding: 10px 12px;
  background: var(--paper); border: 1px solid var(--line);
  border-radius: var(--radius);
  font-size: 12px; line-height: 1.5; color: var(--ink-2);
}
.pdfx-recap:empty { display: none; }
.pdfx-recap strong { color: var(--warn-fg); }
.pdfx-recap.est-vide { color: var(--error-fg); background: var(--error-bg);
  border-color: var(--error-line); }
.pdfx-cases {
  display: grid; grid-template-columns: repeat(auto-fill, minmax(210px, 1fr));
  gap: 6px 14px;
}
.pdfx-case {
  display: grid; grid-template-columns: auto 1fr; column-gap: 7px;
  align-items: baseline; padding: 5px 2px; cursor: pointer;
}
.pdfx-case input { margin: 0; }
.pdfx-lib { font-size: 13px; }
.pdfx-sub {
  grid-column: 2; font-size: 11.5px; color: var(--muted); line-height: 1.3;
}

/* ── Background checks ──────────────────────────────────────────────────────
   Les alertes remontent en tête (tri fait par la vue) et se signalent par un
   liseré : une information de vigilance enterrée sous six mois de notes
   anodines ne sert à rien. */
/* Le bloc des rapports qui précède n'a pas de marge basse (`.rap-plus` n'en
   pose pas), et `.section-title` n'a pas de marge haute : sans ces deux
   réglages, le titre colle au bouton « Voir les N autres rapports » et la
   section suivante colle à la dernière carte. */
.section-title#background { margin-top: 26px; }
.bgx { display: grid; gap: 10px; margin-bottom: 26px; }
.bgc {
  background: var(--surface); border: 1px solid var(--line);
  border-left: 3px solid var(--line-2);
  border-radius: var(--radius); box-shadow: var(--shadow);
}
.bgc-alerte { border-left-color: var(--bad); }
.bgc-surveiller { border-left-color: var(--warn); }
.bgc-ras { border-left-color: var(--ok); }
.bgc-view { padding: 12px 14px; }
/* ⚠️ `display:grid` ci-dessous l'emporterait sur le `display:none` que le
   navigateur applique à [hidden] : la règle est indispensable. */
.bgc-view[hidden], .bgc-edit[hidden] { display: none; }
.bgc-tete {
  display: flex; flex-wrap: wrap; align-items: center; gap: 8px;
  margin-bottom: 6px;
}
.bgc-theme {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700;
  text-transform: uppercase; letter-spacing: .6px; font-size: 12px;
  color: var(--night);
}
.bgc-vig {
  padding: 2px 8px; border-radius: 999px; font-size: 11.5px; font-weight: 700;
  text-transform: uppercase; letter-spacing: .5px;
}
.bgc-vig.v-ras { background: var(--success-bg); color: var(--success-fg); }
.bgc-vig.v-surveiller { background: var(--warn-bg); color: var(--warn-fg); }
.bgc-vig.v-alerte { background: var(--error-bg); color: var(--error-fg); }
.bgc-date { font-size: 12px; color: var(--muted); }
.bgc-tete .rap-actions { margin-left: auto; }
.bgc-texte { margin: 0; font-size: 14px; line-height: 1.5; }
.bgc-pied {
  display: flex; align-items: center; gap: 10px; margin-top: 8px;
  font-size: 12px; color: var(--muted);
}
.bgc-src { flex: 1; min-width: 0; }
.bgc-pied .fx-signe { margin-left: auto; }

/* Montants du relevé financier : réutilise la carte des background checks
   (.bgc et sa famille, cf. commentaire sur la veille plus bas), seuls les
   chiffres chiffrés diffèrent. */
.fin-montants {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(170px, 1fr));
  gap: 0 18px; margin-bottom: 6px;
}
.fin-montants .row { padding: 4px 0; font-size: 13px; }

/* Segmenté de vigilance : mêmes couleurs que les pastilles. */
.seg-v-alerte input:checked + span { background: var(--bad); color: var(--on-night); }
.seg-v-surveiller input:checked + span { background: var(--sand-fg); color: var(--on-night); }
.seg-v-ras input:checked + span { background: var(--ok-fg); color: var(--on-night); }

/* Blessures : une barre chronologique par saison, mêmes tokens que les pastilles
   de vigilance. Segments positionnés en % des vraies dates dans la saison (pas des
   cases fixes par mois) — plusieurs pistes par saison seulement si deux épisodes
   se chevauchent (rare, cf. _injuries_saison). */
.inj-saisons { display: flex; flex-direction: column; gap: 4px; }
.inj-saison-ligne { display: flex; align-items: center; gap: 10px; }
.inj-saison-label { flex: 0 0 48px; font-size: 12px; color: var(--muted); }
.inj-saison-barre { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.inj-piste { position: relative; height: 14px; background: var(--line-2); border-radius: 4px; }
.inj-seg { position: absolute; top: 0; bottom: 0; min-width: 4px; border-radius: 3px; }
.inj-seg.v-surveiller { background: var(--warn); }
.inj-seg.v-alerte { background: var(--bad); }
.inj-axe-ligne { margin-bottom: 2px; }
.inj-axe { position: relative; height: 14px; }
.inj-tick { position: absolute; transform: translateX(-50%); font-size: 10.5px; color: var(--muted); white-space: nowrap; }
/* Cliquer une saison déplie son détail : plus fiable qu'un survol sur un
   segment de 2 px pour une blessure d'un jour. */
.inj-saison-detail summary { cursor: pointer; }
.inj-saison-detail summary::-webkit-details-marker { margin-right: 4px; }
.inj-liste { display: flex; flex-direction: column; gap: 6px; margin: 6px 0 10px 58px; }
.inj-ep { display: flex; gap: 10px; flex-wrap: wrap; align-items: center; font-size: 13px; }
.inj-periode, .inj-duree, .inj-niveau { color: var(--muted); }

/* ── Épisode saisi à la main : vue / édition ──
   ⚠️ `.inj-ep-vue` porte `display:flex` : sans la règle `[hidden]` explicite,
   il resterait affiché SOUS son propre formulaire d'édition — le piège déjà
   rencontré sur `.rf-field`, `.rap-view` et `.cp-panel`. */
.inj-ep { display: flex; flex-direction: column; gap: 8px; }
.inj-ep-vue { display: flex; gap: 10px; flex-wrap: wrap; align-items: center; }
.inj-ep-vue[hidden], .inj-ep-edit[hidden] { display: none; }
.inj-ep-edit { margin: 2px 0 8px; }
/* L'indisponibilité qui court : c'est l'information qu'on cherche en premier
   sur un joueur qu'on projette d'aller voir samedi. */
.inj-court { color: var(--bad); font-weight: 700; }
.inj-src {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700;
  text-transform: uppercase; letter-spacing: .5px; font-size: 10.5px;
  color: var(--sand-fg);
}
.inj-encours { display: inline-flex; align-items: center; gap: 9px; cursor: pointer;
  font-size: 13px; color: var(--ink-2); min-height: 34px; }
.inj-encours input { width: 16px; height: 16px; accent-color: var(--night); cursor: pointer; }
.rf-field-court { flex: 0 1 150px; }
.rf-note { font-size: 11.5px; color: var(--muted); }


/* ── Bandeau de synthèse des rapports (anneaux + commande) ───────────────── */
.rap-bandeau {
  display: flex; align-items: center; justify-content: space-between;
  flex-wrap: wrap; gap: 16px;
  padding: 14px 16px; margin: 0 0 16px;
  background: var(--surface); border: 1px solid var(--line);
  border-radius: var(--radius); box-shadow: var(--shadow);
}
.rap-bandeau .rf-adder { margin: 0; }

.moys { display: flex; align-items: center; gap: 18px; margin: 0; }
.moy-rond { position: relative; display: flex; flex-direction: column; align-items: center; gap: 4px; }
.mr-anneau { width: 62px; height: 62px; transform: rotate(-90deg); }
.mr-anneau .mr-fond {
  fill: none; stroke: var(--line); stroke-width: 6;
}
.mr-anneau .mr-arc {
  fill: none; stroke: currentColor; stroke-width: 6; stroke-linecap: round;
}
.mr-anneau.n-1 { color: var(--n1-fg); } .mr-anneau.n-2 { color: var(--n2-fg); }
.mr-anneau.n-3 { color: var(--n3-fg); } .mr-anneau.n-4 { color: var(--n4-fg); }
/* La valeur est posée AU CENTRE de l'anneau : le SVG est tourné de −90° pour
   que l'arc démarre en haut, donc le texte ne peut pas vivre dedans — il
   tournerait avec lui. */
.mr-val {
  position: absolute; top: 31px; left: 50%;
  transform: translate(-50%, -50%);
  font-family: 'Barlow Condensed', sans-serif; font-weight: 800; font-size: 21px;
  line-height: 1; color: var(--ink);
}
/* ⚠️ `n-1`…`n-4` sont des PASTILLES (fond, bordure, encre) : posées telles
   quelles sur la valeur centrale, elles lui collaient un rectangle de couleur
   au milieu de l'anneau. On ne reprend que l'encre. */
.mr-val[class*="n-"], .mr-anneau[class*="n-"] {
  background: none; border: 0; padding: 0; border-radius: 0;
}
.mr-val.n-1 { color: var(--n1-fg); } .mr-val.n-2 { color: var(--n2-fg); }
.mr-val.n-3 { color: var(--n3-fg); } .mr-val.n-4 { color: var(--n4-fg); }
.mr-val.mr-rien { color: var(--muted); font-size: 18px; }
.mr-lab {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 600;
  text-transform: uppercase; letter-spacing: .8px; font-size: 11px;
  color: var(--muted);
}
.moys-n {
  font-size: 12px; color: var(--muted); line-height: 1.45;
  padding-left: 16px; border-left: 1px solid var(--line);
}
.moys-n i { font-style: normal; color: var(--ink-2); font-weight: 600; }

/* ── La carte joueur : le pied reste en bas quelle que soit la hauteur ──
   Sans ça, une carte portant des notes était plus haute que sa voisine et la
   ligne de métadonnées « flottait » à des hauteurs différentes d'une carte à
   l'autre — le défaut le plus visible d'une grille de cartes. */
.carte-j { display: flex; align-items: stretch; gap: 12px; min-height: 92px; }
.cj-corps { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; }
.carte-j .cj-plaque { grid-row: auto; align-self: flex-start; }
.carte-j .cj-pied { margin-top: auto; padding-top: 6px; }


/* ── La page Listes : barre de rayons ─────────────────────────────────────
   Dix postes dans une barre de segments : chacun porte son abréviation et son
   compteur, et le rayon vide se voit sans qu'on l'ouvre. C'est le même moteur
   que les onglets de la fiche — donc le même dessin, à une différence près :
   ici les segments ne sont pas de largeur égale (une abréviation de deux
   lettres n'a pas besoin de la place d'« ATTAQUANT »). */
.listes-onglets { max-width: none; margin: 0 0 18px; justify-content: flex-start; }
.listes-onglets a { flex: 0 0 auto; padding: 0 14px; gap: 8px; }
.listes-onglets a.est-vide { color: var(--muted); }
.listes-onglets a.est-vide .lo-n { opacity: .55; }
.lo-abbr { font-size: 14.5px; letter-spacing: 1px; }
.lo-n {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 20px; height: 18px; padding: 0 6px; border-radius: 9px;
  background: var(--surface); border: 1px solid var(--line-2);
  color: var(--ink-2); font-size: 11.5px; font-weight: 700;
}
.listes-onglets a.est-actif .lo-n {
  background: var(--sand); border-color: var(--sand); color: var(--night);
}
.lsom-total {
  margin: 0 0 12px; font-size: 13.5px; color: var(--ink-2);
}
.lsom-total b { font-family: 'Barlow Condensed', sans-serif; font-size: 17px; color: var(--night); }

.liste-vue[hidden] { display: none; }
.liste-vue:focus { outline: none; }

/* L'en-tête du rayon : il n'est plus cliquable (ce n'est plus un accordéon),
   donc il perd son chevron et redevient ce qu'il est — un titre. */
.lg { display: block; margin-bottom: 18px; }
.lg-tete {
  display: flex; align-items: center; gap: 10px; cursor: default;
  padding: 0 2px 10px; margin-bottom: 12px;
  border-bottom: 1px solid var(--line);
}
.lg-tete::-webkit-details-marker { display: none; }
.lg-abbr {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 38px; height: 30px; padding: 0 9px; border-radius: 6px;
  background: linear-gradient(160deg, var(--night-2), var(--night-3));
  border: 1px solid rgba(224,192,144,.28); color: var(--sand);
  font-family: 'Barlow Condensed', sans-serif; font-weight: 800; font-size: 15px;
  letter-spacing: .5px;
}
.lg-nom {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700;
  text-transform: uppercase; letter-spacing: .8px; font-size: 17px;
  color: var(--night);
}

/* Le rang porte la préférence du scout : les trois premiers se voient. */
.lg-rang .tnum {
  display: inline-flex; align-items: center; justify-content: center;
  width: 26px; height: 26px; border-radius: 50%;
  background: var(--paper); border: 1px solid var(--line-2);
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700; font-size: 13px;
  color: var(--ink-2);
}
.lg-rang .tnum.est-tete {
  background: var(--night); border-color: var(--night); color: var(--sand);
}
.lg-actions .icon-btn {
  display: inline-flex; align-items: center; justify-content: center;
  width: 28px; height: 28px; padding: 0;
}

@media (max-width: 720px) {
  .listes-onglets a { padding: 0 10px; }
  .lo-abbr { font-size: 13px; }
}


/* ── La navigation de fiche : un seul cadre, deux étages ──────────────────
   Les deux barres étaient posées l'une sous l'autre avec du vide entre elles :
   on lisait deux widgets empilés, pas une navigation qui se déplie. Elles
   partagent désormais un cadre, et le second étage est en creux — il se lit
   comme une précision du premier, ce qu'il est. */
.nav-fiche {
  background: var(--paper); border: 1px solid var(--line);
  border-radius: 12px; padding: 5px; margin: 4px 0 22px;
  box-shadow: inset 0 1px 2px rgba(18,26,38,.05);
}
.nav-fiche .onglets {
  margin: 0; padding: 0; background: none; border: 0;
  box-shadow: none; border-radius: 0; max-width: none;
}
/* Le second étage : séparé par un filet, sur un fond légèrement plus creux,
   et de taille inférieure. Trois signaux pour dire « ceci dépend de ce qui est
   au-dessus » — un seul n'aurait pas suffi. */
.nav-fiche .sous-onglets {
  margin: 5px 0 0; padding: 5px 0 0;
  border-top: 1px solid var(--line);
  justify-content: flex-start; gap: 4px;
}
.nav-fiche .sous-onglets a {
  flex: 0 0 auto; height: 32px; padding: 0 14px;
  font-size: 12.5px; letter-spacing: .8px;
}
.nav-fiche .sous-onglets .ong-curseur { top: 10px; height: 32px; }
.sous-onglets[hidden] { display: none; }

/* ── Profil de jeu ────────────────────────────────────────────────────────
   Trois colonnes plutôt que quatre : six facettes se lisent en deux rangées de
   trois, jamais en 4 + 2 — une rangée orpheline de deux éléments fait lire
   « il en manque ». La barre est plus épaisse (c'est la donnée), la valeur est
   une pastille colorée par palier, et une phrase en tête dit ce que le profil
   raconte : sans elle, six barres restent six barres. */
.profil-tete {
  display: flex; align-items: baseline; flex-wrap: wrap; gap: 6px 10px;
  margin: 0 0 14px; font-size: 13.5px; color: var(--ink-2);
}
.profil-tete b { color: var(--night); font-weight: 600; }
.profil-tete .pt-sep { color: var(--line-2); }
/* Trois colonnes fixes au-delà de 900 px : six facettes tombent en 3 + 3, cinq
   en 3 + 2. En `auto-fit`, la carte large en logeait quatre et la seconde
   rangée n'en portait qu'une — on lisait « il en manque ». */
.profil-grille { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 16px 30px; }
@media (max-width: 900px) { .profil-grille { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 560px) { .profil-grille { grid-template-columns: 1fr; } }
.pf-piste { height: 10px; border-radius: 5px; margin-top: 3px; }
.pf-val {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 42px; height: 24px; padding: 0 8px; border-radius: 12px;
  font-size: 14px; border: 1px solid transparent;
}
.pf-val.t-elite { background: var(--vert-bg, #EAF4EE); color: var(--p-elite-tx); border-color: #CBE6D7; }
.pf-val.t-good  { background: #EEF6F1; color: var(--p-good-tx);  border-color: #D3E8DC; }
.pf-val.t-avg   { background: var(--warn-bg); color: var(--p-avg-tx);   border-color: var(--warn-line); }
.pf-val.t-low   { background: #FCF0E8; color: var(--p-low-tx);   border-color: #F0D8C6; }
.pf-val.t-poor  { background: var(--error-bg); color: var(--p-poor-tx);  border-color: var(--error-line); }
.pf-val i { color: inherit; opacity: .6; }


/* ═══════════════════════════════════════════════════════════════════════════
   LA PAGE RAPPORTS   (18/09/2026)
   Une page d'index : même bandeau nuit que le tableau de bord, un relevé, une
   barre de répartition, puis le flux groupé par jour.
   ══════════════════════════════════════════════════════════════════════════ */

/* Bandeau court : cette page n'a pas de champ de recherche dans le bandeau
   (les filtres sont juste en dessous), il n'a donc pas besoin de la même
   hauteur que celui du tableau de bord. */
.quart-court { padding-bottom: 22px; }
.quart-court h1 { font-size: 36px; }

/* La barre de répartition : ce que la cellule recommande, en une ligne. Les
   trois parts portent les couleurs des recommandations — celles des pastilles
   `.r-avancer` / `.r-suivre` / `.r-pas_interet`, pour qu'on relie la barre aux
   jetons des cartes sans effort. */
.repart {
  display: flex; height: 10px; margin: 18px 0 10px; max-width: 620px;
  border-radius: 5px; overflow: hidden;
  background: rgba(255,255,255,.10);
}
.repart-part { display: block; height: 100%; }
.repart-part.r-avancer { background: var(--sand); }
.repart-part.r-suivre { background: #7FB79A; }
.repart-part.r-pas_interet { background: #8C6A63; }

.repart-leg {
  display: flex; flex-wrap: wrap; gap: 6px 20px; margin: 0; padding: 0;
  list-style: none; font-size: 12.5px; color: var(--night-mut);
}
.repart-leg li { display: flex; align-items: center; gap: 7px; }
.repart-leg b { color: var(--on-night); font-family: 'Barlow Condensed', sans-serif; font-size: 14px; }
.rl-p { width: 9px; height: 9px; border-radius: 2px; flex: none; }
.rl-p.r-avancer { background: var(--sand); }
.rl-p.r-suivre { background: #7FB79A; }
.rl-p.r-pas_interet { background: #8C6A63; }

/* Les onglets de recommandation empruntent le dessin des onglets de la fiche,
   mais ce sont des LIENS qui rechargent : pas de curseur glissant, et le
   segment actif porte donc son propre fond. */
/* ⚠️ Ces onglets-là ENVELOPPENT au lieu de défiler. Les autres barres de
   l'application portent des libellés courts (« Infos », « Données ») et tiennent
   sur une ligne ; ici les libellés sont des phrases (« Se renseigner pour
   avancer »), et sur 390 px les quatre segments se chevauchaient — le conteneur
   les comprimait sous la largeur de leur texte. Quatre jetons sur trois lignes
   se lisent ; quatre jetons superposés, non. */
/* ⚠️ `nav.reco-tabs`, avec le type : deux blocs datés définissent `.onglets`
   plus bas dans ce fichier (barre segmentée, puis barre centrée), et la
   dernière écrivait l'emballage. Un sélecteur d'un cran au-dessus met fin à la
   course — c'est le même remède que `html.rail-range`.
   `flex: 0 0 auto` : sans lui, le conteneur comprime les segments SOUS la
   largeur de leur texte, et comme celui-ci ne se coupe pas (`nowrap`), les
   quatre libellés se chevauchaient sur 390 px. */
nav.reco-tabs {
  justify-content: flex-start; max-width: none; margin: 0 0 16px;
  flex-wrap: wrap; overflow: visible;
}
nav.reco-tabs > a { flex: 0 0 auto; padding: 0 16px; }
.reco-tabs a.est-actif {
  background: var(--night); color: var(--on-night);
  box-shadow: 0 1px 2px rgba(18,26,38,.18), 0 4px 12px rgba(18,26,38,.16);
}
.reco-tabs a.est-actif .ong-n { background: var(--sand); border-color: var(--sand); color: var(--night); }

/* La séparation datée. Elle est collante : en descendant vingt-cinq cartes, on
   doit toujours savoir de quel jour on parle — c'est toute la raison d'être du
   groupement. */
.flux-jour {
  position: sticky; top: 0; z-index: 3;
  margin: 22px 0 10px; padding: 6px 0;
  background: linear-gradient(180deg, var(--paper) 72%, rgba(244,245,247,0));
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700;
  text-transform: uppercase; letter-spacing: 1px; font-size: 12.5px;
  color: var(--ink-2);
}
.flux-jour span {
  display: inline-flex; align-items: center; gap: 8px;
  padding: 3px 12px; border-radius: 999px;
  background: var(--surface); border: 1px solid var(--line);
  box-shadow: var(--shadow);
}
.flux-date > .fx:first-of-type { margin-top: 0; }

/* Bandeau « rapports de ce match » (posé par le lien `.fx-match`) : neutre
   comme `.rap-cloison`, ce n'est pas une alerte — juste un rappel de ce que le
   flux montre en ce moment, avec la sortie à portée de clic. */
.flux-filtre-match {
  display:flex; align-items:center; gap:10px; flex-wrap:wrap;
  margin: 0 0 14px; padding: 10px 14px;
  background: var(--paper); border:1px solid var(--line); border-radius: var(--radius);
  font-size: 13.5px; color: var(--ink-2);
}
.flux-filtre-match b { color: var(--ink); }
.flux-filtre-match a {
  margin-left: auto; font-weight:600; color: var(--night);
  text-decoration:underline; text-underline-offset:3px; white-space:nowrap;
}
.flux-filtre-match a:hover { color: var(--sand-2); }

/* Compos du match (`FeuilleDeMatch`) : repliées par défaut, dans le
   prolongement visuel du bandeau qui les précède. */
.flux-compo {
  margin: -4px 0 14px; padding: 0 14px 12px;
  background: var(--paper); border:1px solid var(--line); border-top:0;
  border-radius: 0 0 var(--radius) var(--radius);
}
.flux-compo summary {
  cursor:pointer; padding: 10px 0; font-size:13px; font-weight:600;
  color: var(--night); list-style:none;
}
.flux-compo summary::-webkit-details-marker { display:none; }
.flux-compo summary::before { content:"▸ "; }
.flux-compo[open] summary::before { content:"▾ "; }
.flux-compo-disp { font-weight:400; color: var(--muted); }
.flux-compo-grid {
  display:grid; grid-template-columns: 1fr 1fr; gap: 18px;
}
.flux-compo-titre {
  margin:0 0 6px; font-family:'Barlow Condensed',sans-serif; font-weight:700;
  text-transform:uppercase; letter-spacing:.4px; font-size:13px;
  color: var(--ink); border-bottom:1px solid var(--line); padding-bottom:4px;
}
.flux-compo-liste { list-style:none; margin:0; padding:0; }
.flux-compo-liste li { font-size:13px; padding:2px 0; }
.flux-compo-liste a { color: var(--ink-2); }
.flux-compo-liste a:hover { color: var(--night); text-decoration:underline; }
.flux-compo-banc-titre {
  margin:8px 0 2px; font-size:11px; font-weight:700; text-transform:uppercase;
  letter-spacing:.5px; color: var(--muted);
}
.flux-compo-banc a { color: var(--muted); }

@media (max-width: 560px) {
  .flux-compo-grid { grid-template-columns: 1fr; }
}

@media (max-width: 720px) {
  .quart-court h1 { font-size: 28px; }
  .repart { max-width: none; }
}


/* ── Tableau de bord : verdict dans le journal, activité de la cellule ──── */
.entree .par { display: flex; align-items: center; gap: 10px; justify-content: flex-end; }
.entree .par .reco { font-size: 10.5px; padding: 2px 8px; letter-spacing: .5px; }
.entree .par-qui { color: var(--muted); }

.acti {
  display: grid; grid-template-columns: 1fr auto; gap: 3px 10px;
  padding: 9px 16px; border-bottom: 1px solid var(--line);
}
.acti:last-child { border-bottom: 0; }
.acti-qui {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 600; font-size: 15px;
  color: var(--ink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.acti-n {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 800; font-size: 15px;
  color: var(--night);
}
.acti-piste {
  grid-column: 1 / -1; height: 6px; border-radius: 3px;
  background: var(--paper); border: 1px solid var(--line); overflow: hidden;
}
.acti-fill { display: block; height: 100%; background: var(--sand-2); border-radius: 3px; }

@media (max-width: 720px) {
  .entree .par { justify-content: flex-start; }
}

/* ═══════════════════════════════════════════════════════════════════════════
   LA PARTIE DONNÉES, RÉORGANISÉE   (17/09/2026, 6e passe)

   Elle portait huit sections à la file — trajectoire, compatibilité,
   multiposte, stats, physique, similaires, matchs, comparaison — chacune avec
   son langage visuel. On ne découvre pas huit langages d'affilée : trois
   sous-onglets, dans l'ordre des questions qu'on se pose devant un joueur.

   Placé AVANT le bloc « MOBILE ET TABLETTE ».
   ══════════════════════════════════════════════════════════════════════════ */

/* ── La barre de second niveau ────────────────────────────────────────────
   Même moteur, autre voix : plus petite, en creux, pour qu'on voie tout de
   suite qu'elle est SOUS les onglets de la fiche et non à côté. */
.sous-onglets {
  max-width: 520px; margin: 0 0 20px; padding: 4px; gap: 3px;
  border-radius: 9px;
}
.sous-onglets a {
  height: 36px; font-size: 13px; letter-spacing: .8px; border-radius: 6px;
}
.sous-vue[hidden] { display: none; }
.sous-vue:focus { outline: none; }

/* ── Les repères ──────────────────────────────────────────────────────────
   Les six nombres qu'on vient chercher, réunis en tête. Ils étaient dispersés :
   le PPI dans le bandeau, le PPI brut nulle part, l'écart au contexte enterré
   sous la compatibilité, les minutes dans les tuiles StatsBomb.

   ⚠️ Chaque tuile porte sa DÉFINITION en une ligne. Un tableau de bord qui
   suppose qu'on sait déjà ce qu'il montre ne se découvre jamais — et « PPI
   ajusté du contexte » ne veut rien dire pour quelqu'un qui arrive. C'est la
   seule raison d'être de la troisième ligne de chaque tuile. */
/* ⚠️ Tuiles INDÉPENDANTES, et non une grille à filets de 1 px. La grille était
   plus élégante — le fond de la grille servait de séparateur — mais le nombre
   de repères varie d'un joueur à l'autre (pas de projection, pas de minutes…) :
   dès que la dernière rangée était incomplète, le fond gris se voyait dans le
   vide. Une tuile qui porte son propre cadre ne laisse jamais de trou. */
.reperes {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(188px, 1fr));
  gap: 10px; margin: 0 0 18px;
}
.rp {
  display: flex; flex-direction: column; gap: 3px;
  padding: 13px 15px 14px; background: var(--surface);
  border: 1px solid var(--line); border-radius: var(--radius);
  box-shadow: var(--shadow);
}
.rp-v {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 800;
  font-size: 30px; line-height: 1; color: var(--night);
  font-variant-numeric: tabular-nums;
}
.rp-v i {
  font-style: normal; font-size: 13px; font-weight: 600; color: var(--muted);
  margin-left: 1px;
}
.rp-v.t-elite { color: var(--p-elite-tx); } .rp-v.t-good { color: var(--p-good-tx); }
.rp-v.t-avg { color: var(--p-avg-tx); } .rp-v.t-low { color: var(--p-low-tx); }
.rp-v.t-poor { color: var(--p-poor-tx); }
.rp-l {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700;
  text-transform: uppercase; letter-spacing: .8px; font-size: 11.5px;
  color: var(--ink-2);
}
.rp-d { font-size: 12px; color: var(--muted); line-height: 1.35; }

@media (max-width: 720px) {
  .sous-onglets { max-width: none; }
  .sous-onglets a { font-size: 12px; letter-spacing: .4px; padding: 0 6px; }
  .reperes { grid-template-columns: 1fr 1fr; }
  .rp { padding: 12px 13px; }
  .rp-v { font-size: 25px; }
}

/* ═══════════════════════════════════════════════════════════════════════════
   RAIL REPLIABLE · PROFIL DE JEU   (17/09/2026, 5e passe)
   Placé AVANT le bloc « MOBILE ET TABLETTE ».
   ══════════════════════════════════════════════════════════════════════════ */

/* ── Le bouton de repli ───────────────────────────────────────────────────
   Posé en haut du rail, à droite de la marque. Discret au repos, il s'éclaire
   au survol — c'est une commande de confort, pas une destination. */
.rail-pli {
  position: absolute; top: 24px; right: 10px;
  display: inline-flex; align-items: center; justify-content: center;
  width: 28px; height: 28px; padding: 0;
  background: none; border: 1px solid rgba(255,255,255,.18); border-radius: 7px;
  color: rgba(255,255,255,.55); cursor: pointer;
  transition: color .15s, border-color .15s, background-color .15s, transform .2s;
}
.rail-pli:hover {
  color: var(--sand); border-color: rgba(224,192,144,.5);
  background: rgba(255,255,255,.06);
}
.rail-pli:focus-visible { outline: 2px solid var(--sand); outline-offset: 2px; }

@media (min-width: 901px) {
  /* La largeur du rail est la SEULE chose qui change : tout le reste en
     découle, y compris le décalage du contenu. Une transition sur `width` et
     `padding-left` n'est pas gratuite (elle relance la mise en page), mais on
     parle d'un geste ponctuel, pas d'une animation permanente. */
  body { transition: padding-left .22s cubic-bezier(.22,1,.36,1); }
  .nav { transition: width .22s cubic-bezier(.22,1,.36,1); }

  /* ⚠️ `html.rail-range` et non `.rail-range` : `:root` (qui pose la largeur
     large) et `.rail-range` désignent LE MÊME élément avec la même spécificité,
     donc c'est l'ordre dans le fichier qui trancherait — et les sections datées
     de cette feuille ne sont pas rangées dans l'ordre où elles ont été
     écrites. Ajouter le type rend la règle indépendante de cet ordre. */
  html.rail-range { --rail: 68px; }
  .rail-range .nav-inner { padding: 20px 10px 16px; }
  .rail-range .rail-pli { top: 68px; right: 50%; transform: translateX(50%) rotate(180deg); }

  /* La marque garde son blason, perd son mot. */
  .rail-range .brand { justify-content: center; margin-bottom: 44px; padding: 0; }
  .rail-range .brand .libelle { display: none; }

  /* Les liens n'ont plus que leur icône, centrée. Le libellé reste dans le DOM
     (`.sr-only`) : un lecteur d'écran continue de l'annoncer, et `title` le
     ramène au survol (cf. base.js). */
  .rail-range .nav-links a { justify-content: center; padding: 0; gap: 0; }
  .rail-range .nav-links a > span {
    position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
    overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
  }
  .rail-range .nav-links a .ic { width: 20px; height: 20px; }
  .rail-range .nav-links a.active::before { top: 6px; bottom: 6px; }

  /* Le compte : la pastille d'initiale suffit, le nom et le mot
     « Déconnexion » sortent de l'écran (mais pas du nom accessible). */
  .rail-range .nav-compte { align-items: center; padding: 14px 0 0; }
  .rail-range .nav-nom { display: none; }
  .rail-range .nav-logout button { width: 40px; padding: 0; }
  .rail-range .nav-logout-mot {
    position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
    overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
  }
}

/* Sous 900 px le rail est une bande horizontale : il n'y a rien à ranger. */
@media (max-width: 900px) {
  .rail-pli { display: none; }
}
@media (prefers-reduced-motion: reduce) {
  body, .nav, .rail-pli { transition: none; }
}

/* ── Profil de jeu ────────────────────────────────────────────────────────
   Les six facettes du PPI (menace, création, construction, ballon, défense,
   physique) étaient calculées, stockées… et affichées nulle part sur la fiche
   — seule la page Composition les lisait. Elles répondent pourtant à la
   première question qu'on se pose devant un joueur : « c'est quoi, comme
   joueur ? », avant même « il est bon comment ? ».

   Six barres et non un radar : un radar de six axes se compare mal d'un joueur
   à l'autre (la forme dépend de l'ordre des axes), et l'app a déjà un vrai
   radar dans le bloc de comparaison, où l'on choisit ses axes. */
/* Les COLONNES sont fixées plus haut (section « Profil de jeu » du 18/09) :
   ⚠️ deux sections datées qui stylent le même composant se départagent par
   l'ordre du fichier, et les insertions successives se font AVANT les
   précédentes — la règle la plus récente se retrouve donc la plus haute, donc
   la perdante. On ne laisse ici que ce qui ne se discute pas. */
.profil-grille { display: grid; }
.pf {
  display: grid; grid-template-columns: 1fr auto; align-items: baseline;
  gap: 2px 10px;
}
.pf-lab {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 600;
  text-transform: uppercase; letter-spacing: .8px; font-size: 12px;
  color: var(--ink-2);
}
.pf-val {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 800; font-size: 17px;
  color: var(--ink); font-variant-numeric: tabular-nums;
}
.pf-val i { font-style: normal; font-size: 10.5px; font-weight: 600; color: var(--muted); }
.pf-piste {
  grid-column: 1 / -1; position: relative;
  height: 8px; border-radius: 4px;
  background: var(--paper); border: 1px solid var(--line);
}
.pf-piste::after {
  content: ""; position: absolute; left: 50%; top: 1px; bottom: 1px;
  width: 1px; background: var(--line-2);
}
.pf-fill { position: absolute; inset: 0 auto 0 0; border-radius: 4px; }
.pf-fill.elite { background: var(--p-elite); } .pf-fill.good { background: var(--p-good); }
.pf-fill.avg { background: var(--p-avg); } .pf-fill.low { background: var(--p-low); }
.pf-fill.poor { background: var(--p-poor); }
.pf-vide { color: var(--muted); font-size: 12.5px; }

/* ═══════════════════════════════════════════════════════════════════════════
   EN-TÊTE DES RAPPORTS · ONGLET INFOS   (17/09/2026, 4e passe)

   Deux derniers retours de la cellule : l'en-tête de la section rapports était
   « mal placé » (il y en avait deux qui se suivaient, le titre puis le bandeau
   des anneaux, décrochés l'un de l'autre), et l'onglet Infos méritait le même
   soin que les autres.

   Placé AVANT le bloc « MOBILE ET TABLETTE ».
   ══════════════════════════════════════════════════════════════════════════ */

/* ── L'en-tête unique de la section rapports ─────────────────────────────── */
.rap-bandeau {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto auto;
  align-items: center; gap: 22px;
  padding: 16px 18px;
}
.rb-tete { min-width: 0; }
.rb-tete h2 {
  margin: 0; font-family: 'Barlow Condensed', sans-serif; font-weight: 700;
  text-transform: uppercase; letter-spacing: .7px; font-size: 17px;
  color: var(--night); line-height: 1.1;
}
.rb-meta {
  margin: 5px 0 0; font-size: 12.5px; color: var(--muted);
}
.rb-meta i { font-style: normal; }
.rb-sep { color: var(--line-2); margin: 0 6px; }
/* Les anneaux sont adossés au titre par un filet : ils le résument, ils ne
   sont pas une troisième information posée à côté. */
.rap-bandeau .moys {
  padding-left: 22px; border-left: 1px solid var(--line);
}

/* ═══ ONGLET INFOS ═════════════════════════════════════════════════════════ */

/* Le titre de carte prend le même dessin que les blocs de stats : filet sous le
   titre. Trois cartes côte à côte sans cette ligne se lisaient comme un seul
   bloc de texte en trois colonnes. */
.card h2 {
  padding-bottom: 9px; margin-bottom: 4px;
  border-bottom: 1px solid var(--line);
}

/* La ligne clé/valeur : l'intitulé passe en petites capitales grises, la valeur
   prend le Condensed du produit. Avant, les deux avaient la même graisse et la
   même casse — l'œil ne savait pas lequel des deux il lisait. */
.row { padding: 9px 0; align-items: baseline; }
.row .k {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 600;
  text-transform: uppercase; letter-spacing: .7px; font-size: 11.5px;
  color: var(--muted); flex: 0 0 auto;
}
.row .v {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700;
  font-size: 16px; color: var(--ink); letter-spacing: .2px;
  min-width: 0; overflow-wrap: anywhere;
}
/* Les filets intérieurs sont en pointillé : sur six lignes empilées, six traits
   pleins faisaient un tableau là où il n'y a qu'une liste de faits. */
.row { border-bottom: 1px dashed var(--line); }
.row:last-child { border-bottom: 0; padding-bottom: 0; }

/* La valeur marchande est le seul chiffre de la rangée : il a droit à sa taille. */
.big-num { letter-spacing: -.5px; }

/* ── Historique de carrière ──
   Rangs alternés et montants en chiffres tabulaires : une colonne de sommes se
   compare verticalement ou ne sert à rien. La première ligne est le transfert
   le plus récent — celui qui explique où il est aujourd'hui. */
.table-card .grid tbody tr:nth-child(even) { background: rgba(27,39,56,.022); }
.table-card .grid tbody tr:first-child td { font-weight: 600; }
.table-card .grid tbody tr:first-child td:first-child { color: var(--night); }
.table-card .grid td:last-child {
  text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap;
}
.table-card .grid thead th:last-child { text-align: right; }

@media (max-width: 720px) {
  .rap-bandeau { grid-template-columns: 1fr; gap: 14px; }
  .rap-bandeau .moys { padding-left: 0; border-left: 0; }
  .rap-bandeau .rf-adder { width: 100%; }
  .row { flex-direction: column; gap: 1px; }
  .row .v { text-align: left; }
}

/* ═══════════════════════════════════════════════════════════════════════════
   ONGLETS CENTRÉS · LECTURE DES DONNÉES   (17/09/2026, 3e passe)

   Trois demandes de la cellule, dans l'ordre où elles ont été faites :
   centrer et agrandir la barre d'onglets, rendre le bloc des rapports plus
   fluide à lire, et rendre l'onglet Données plus agréable SANS rien retirer du
   détail des analyses. Tout ce qui suit est donc de la PRÉSENTATION : aucune
   valeur, aucun repère chiffré, aucun rang n'a été retiré d'un gabarit.

   Placé AVANT le bloc « MOBILE ET TABLETTE ».
   ══════════════════════════════════════════════════════════════════════════ */

/* ── La barre d'onglets : centrée, plus grande, avec un curseur qui glisse ──
   Le curseur est un bloc unique déplacé par `transform` (cf. fiche.js), et non
   un fond posé sur chaque segment : c'est ce qui donne le glissement d'un
   onglet à l'autre, et c'est une propriété composée — donc fluide même sur la
   tablette au bord du terrain. Sans JavaScript, le segment actif garde son
   propre fond (règle de repli plus bas) et rien ne manque. */
.onglets {
  position: relative;
  display: flex; justify-content: center;
  width: 100%; max-width: 760px; margin: 4px auto 22px;
  padding: 5px; gap: 4px;
  background: var(--paper);
  border: 1px solid var(--line);
  border-radius: 12px;
  box-shadow: inset 0 1px 2px rgba(18,26,38,.05);
}
.onglets a {
  flex: 1 1 0; justify-content: center;
  height: 46px; padding: 0 10px; min-width: 0;
  font-size: 15px; letter-spacing: 1.1px;
  border-radius: 8px; z-index: 1;
  transition: color .18s ease;
}
.onglets a .ic { width: 18px; height: 18px; }
/* Le fond du segment actif est porté par le curseur : on l'annule ici pour ne
   pas avoir deux fonds qui se suivent avec un temps de retard. */
.onglets a.est-actif { background: none; box-shadow: none; }
.onglets a:hover:not(.est-actif) { background: rgba(255,255,255,.75); }

.ong-curseur {
  position: absolute; top: 5px; left: 0; height: calc(100% - 10px);
  border-radius: 8px; background: var(--night);
  box-shadow: 0 1px 2px rgba(18,26,38,.20), 0 6px 16px rgba(18,26,38,.18);
  transition: transform .26s cubic-bezier(.22,1,.36,1), width .26s cubic-bezier(.22,1,.36,1);
  pointer-events: none; z-index: 0;
}
/* Premier positionnement : sans transition, sinon le curseur traverse la barre
   au chargement de chaque fiche. */
.ong-curseur.est-pose { transition: none; }
/* Repli sans JS : pas de curseur, donc le segment actif reprend son fond. */
.onglets:not(:has(.ong-curseur)) a.est-actif {
  background: var(--night);
  box-shadow: 0 1px 2px rgba(18,26,38,.18), 0 4px 12px rgba(18,26,38,.16);
}
@media (prefers-reduced-motion: reduce) {
  .ong-curseur { transition: none; }
}

/* ── Le flux de rapports ──────────────────────────────────────────────────
   Un FIL vertical relie les talons de date : la chronologie se lit d'un coup
   d'œil au lieu de se déduire en comparant les dates deux à deux. */
.flux { position: relative; }
.flux::before {
  content: ""; position: absolute; left: 39px; top: 14px; bottom: 14px;
  width: 2px; border-radius: 1px;
  background: linear-gradient(180deg, var(--line-2), var(--line) 70%, transparent);
  pointer-events: none;
}
.rap { position: relative; }
.fx-jour { position: relative; z-index: 1; }

/* Filtres de lecture : matchs vus / analyses. Les deux séries ne se lisent pas
   de la même façon, et la surcouche du dossier les sépare déjà. */
.flux-filtres { display: flex; gap: 6px; margin: 0 0 12px; flex-wrap: wrap; }
.ff {
  padding: 5px 13px; border-radius: 999px; cursor: pointer;
  background: var(--surface); border: 1px solid var(--line-2);
  font-family: 'Barlow Condensed', sans-serif; font-weight: 600;
  text-transform: uppercase; letter-spacing: .9px; font-size: 12.5px;
  color: var(--ink-2);
  transition: background-color .15s, color .15s, border-color .15s;
}
.ff:hover { border-color: var(--night); color: var(--night); }
.ff.est-actif {
  background: var(--night); border-color: var(--night); color: var(--on-night);
}
.ff:focus-visible { outline: 2px solid var(--night); outline-offset: 2px; }

/* Le verdict en tête de carte : c'est la première chose qu'on vient chercher. */
.fx-titre .reco { order: -1; }

/* La conclusion est le JUGEMENT, la description est ce qui l'a produit. Elles
   étaient rendues du même poids : l'œil ne savait pas laquelle lire d'abord.
   L'ordre du formulaire est conservé (description puis conclusion) — seule la
   hiérarchie typographique change. */
.fx-texte.fx-ccl { color: var(--ink); font-weight: 500; }
.fx-texte.fx-ccl .fx-quoi { color: var(--night); }

/* ── L'onglet Données ─────────────────────────────────────────────────────
   RIEN n'est retiré : mêmes métriques, mêmes valeurs, mêmes rangs. Ce qui
   change est la façon dont l'œil les parcourt. */

/* 1. L'intitulé passe À GAUCHE. Aligné à droite, il obligeait à repartir en
      arrière à chaque ligne pour retrouver le début du mot ; une colonne de
      quarante intitulés se balaie de haut en bas par son bord gauche. */
/* ⚠️ Colonnes en PARTS, plus en pixels : ces lignes vivent dans des cartes de
   largeurs très différentes (trois par rangée pour les familles de stats, une
   seule pleine largeur pour l'OBV détaillé). Un intitulé fixé à 148 px prenait
   la moitié d'une carte étroite et il ne restait que 45 px de barre — la barre
   EST la donnée, c'est elle qui doit survivre au rétrécissement. */
.perc {
  grid-template-columns: minmax(0, 1.25fr) minmax(58px, 1fr) minmax(86px, auto);
  gap: 10px; margin-bottom: 7px;
}
.perc .lbl { text-align: left; color: var(--ink-2); line-height: 1.25; }

/* 2. La barre gagne un REPÈRE À LA MÉDIANE. Le PDF l'a depuis le 06/08/2026 et
      l'écran ne l'avait pas : sans lui, 45 % et 55 % se ressemblent alors
      qu'ils s'opposent — au-dessus ou en dessous de la moitié du poste. */
.perc .track {
  height: 20px; border-radius: 10px;
  background: var(--paper); border: 1px solid var(--line);
}
.perc .track::after {
  content: ""; position: absolute; left: 50%; top: 3px; bottom: 3px;
  width: 1px; background: var(--line-2); z-index: 2;
}
.perc .fill { border-radius: 9px; }

/* 3. La valeur devient le poids fort de la ligne, le rang recule d'un cran. */
.perc .val b { font-size: 14px; color: var(--ink); }
.perc .val .rg { font-size: 11px; opacity: .85; }

/* 4. Les blocs de stats respirent, et leur titre porte enfin son référentiel
      comme une étiquette plutôt que comme une phrase en gris. */
.perc-head { margin-bottom: 14px; padding-bottom: 9px; border-bottom: 1px solid var(--line); }
.perc-head .t { font-size: 15px; letter-spacing: .8px; }
.perc-head .r {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 600;
  text-transform: uppercase; letter-spacing: .7px; font-size: 11px;
  color: var(--ink-2); background: var(--paper);
  border: 1px solid var(--line); border-radius: 999px; padding: 2px 9px;
  white-space: nowrap;
}

@media (max-width: 900px) {
  .onglets { max-width: none; }
}
@media (max-width: 720px) {
  .onglets { padding: 4px; border-radius: 10px; margin-bottom: 16px; }
  .onglets a { height: 40px; font-size: 13px; letter-spacing: .6px; padding: 0 6px; }
  .ong-curseur { top: 4px; height: calc(100% - 8px); }
  .flux::before { display: none; }
  .perc { grid-template-columns: 120px 1fr; }
}

/* ═══════════════════════════════════════════════════════════════════════════
   ONGLETS EN SEGMENTS + CARTE DE RAPPORT   (17/09/2026, 2e passe)

   Deux retours de la cellule, tous deux justes :
     · la barre d'onglets « ne se voyait pas très bien » — un filet de 3 px sous
       un libellé gris, c'est le dessin le plus discret qui existe, et sur une
       fiche qui commence par un bandeau nuit plein cadre il ne pesait rien ;
     · la carte de rapport manquait de présence pour ce qu'elle porte — c'est le
       document central du produit.

   Placé AVANT le bloc « MOBILE ET TABLETTE ».
   ══════════════════════════════════════════════════════════════════════════ */

/* ── La barre d'onglets devient un CONTRÔLE SEGMENTÉ ──────────────────────
   Piste claire, segment actif en relief. On voit d'un coup d'œil qu'il y a
   quatre sections ET laquelle est ouverte — l'ancien soulignement demandait de
   chercher lequel des quatre libellés était un peu plus foncé. */
.onglets {
  display: inline-flex; gap: 4px; align-items: stretch;
  margin: 0 0 20px; padding: 4px;
  background: var(--paper);
  border: 1px solid var(--line);
  border-bottom: 1px solid var(--line);
  border-radius: 10px;
  max-width: 100%; overflow-x: auto; scrollbar-width: none;
}
.onglets a {
  display: inline-flex; align-items: center; gap: 8px;
  padding: 0 16px; height: 40px; white-space: nowrap; border-radius: 7px;
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700;
  text-transform: uppercase; letter-spacing: 1px; font-size: 14.5px;
  color: var(--ink-2);
  border-bottom: 0; margin-bottom: 0;
  transition: color .15s, background-color .15s, box-shadow .15s;
}
.onglets a .ic { width: 17px; height: 17px; opacity: .75; }
.onglets a:hover { color: var(--night); background: rgba(255,255,255,.7); }
.onglets a.est-actif {
  color: var(--on-night); background: var(--night);
  border-bottom-color: transparent;
  box-shadow: 0 1px 2px rgba(18,26,38,.18), 0 4px 12px rgba(18,26,38,.16);
}
.onglets a.est-actif .ic { color: var(--sand); opacity: 1; }
.onglets a:focus-visible { outline: 2px solid var(--night); outline-offset: 2px; }
.ong-n {
  background: var(--surface); border-color: var(--line-2);
}
.onglets a.est-actif .ong-n {
  background: var(--sand); border-color: var(--sand); color: var(--night);
}

/* ── La carte de rapport ──────────────────────────────────────────────────
   Trois zones franches : le TALON de date (plaque nuit, comme la plaque de
   poste des cartes joueur), le CORPS, et le CARNET de notes en pastilles
   rondes à droite. Le rapport est le document central du produit : il a le
   droit d'occuper l'espace d'un document. */
.rap {
  border: 1px solid var(--line); box-shadow: var(--shadow);
  transition: border-color .15s, box-shadow .15s;
}
.rap:hover { border-color: var(--line-2); box-shadow: var(--shadow-2); }

/* Talon : plaque nuit, chiffre en lumière. Il donne à la colonne de gauche le
   rythme régulier d'un registre — c'est par lui que l'œil descend la liste. */
.fx-jour {
  align-self: start; text-align: center; padding: 8px 0 7px;
  width: 54px; border-radius: var(--radius);
  background: linear-gradient(160deg, var(--night-2), var(--night-3));
  border: 1px solid rgba(224,192,144,.26);
}
.fx-jour b { font-size: 23px; color: var(--sand); }
.fx-jour i { font-size: 10.5px; color: rgba(255,255,255,.62); letter-spacing: 1.2px; }

.fx-ctx {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700;
  text-transform: uppercase; letter-spacing: .9px; font-size: 14px;
  color: var(--night);
}

/* Le carnet : deux anneaux de note, comme la synthèse du bandeau — un rapport
   et la moyenne de tous les rapports se lisent alors dans le même alphabet. */
.carnet { gap: 10px; padding-left: 18px; align-items: flex-start; }
.carnet > div { gap: 5px; }
.carnet .n {
  width: 38px; height: 38px; min-width: 0; padding: 0; border-radius: 50%;
  font-size: 17px; border-width: 2px;
}
.carnet .f {
  min-width: 42px; height: 26px; border-radius: 13px; font-size: 12.5px;
  letter-spacing: .6px;
}
.carnet dt { font-size: 10px; letter-spacing: .8px; }

/* Les commandes d'édition : icônes dessinées, révélées au survol de la carte —
   présentes en permanence, elles concurrençaient la lecture ; jamais visibles,
   personne ne les trouve. Elles restent à 24 px de cible et apparaissent au
   focus clavier. */
.rap-actions { margin-left: auto; display: flex; gap: 6px; }
.rap-actions .icon-btn {
  display: inline-flex; align-items: center; justify-content: center;
  width: 28px; height: 28px; padding: 0; border-radius: 6px;
  opacity: .35; transition: opacity .15s, border-color .15s, color .15s;
}
.rap:hover .rap-actions .icon-btn,
.rap-actions .icon-btn:focus-visible { opacity: 1; }
.rap-actions .icon-btn:hover { border-color: var(--night); color: var(--night); }
.rap-actions form { display: flex; margin: 0; }

/* La recommandation prend la place d'un vrai verdict en bas de carte. */
.fx-pied { padding-top: 10px; border-top: 1px dashed var(--line); margin-top: 10px; }
.reco { font-size: 12px; letter-spacing: .7px; padding: 3px 11px; border-radius: 12px; }

@media (max-width: 720px) {
  .onglets { gap: 2px; padding: 3px; border-radius: 8px; }
  .onglets a { padding: 0 11px; height: 36px; font-size: 13px; }
  .onglets a .ic { display: none; }
  .fx-jour { width: 46px; }
  .carnet { padding-left: 0; border-left: 0; }
}

/* ═══════════════════════════════════════════════════════════════════════════
   LA FICHE EN ONGLETS + LA LISTE EN CARTES   (17/09/2026)

   Placé AVANT le bloc « MOBILE ET TABLETTE », comme les sections datées qui
   précèdent : rangé après, chaque règle écraserait sa propre surcharge de
   petit écran.
   ══════════════════════════════════════════════════════════════════════════ */

/* ── Barre d'onglets de la fiche ──────────────────────────────────────────
   Posée juste sous le bandeau du joueur, elle est le sommaire de la fiche.
   Un filet continu sous la barre, et l'onglet courant qui le mange : c'est le
   dessin d'onglet le plus lisible qui soit, et il ne coûte pas un pixel de
   décor en plus. */
/* La barre d'onglets est un CONTRÔLE SEGMENTÉ : son dessin vit plus bas, dans
   la section « ONGLETS EN SEGMENTS ». Le soulignement de 3 px qu'il y avait ici
   ne se voyait pas — retour de la cellule, et il avait raison : sur une fiche
   qui s'ouvre par un bandeau nuit plein cadre, un filet gris ne pèse rien.
   `::-webkit-scrollbar` reste : la barre défile sur petit écran. */
.onglets::-webkit-scrollbar { display: none; }
/* Le compteur d'un onglet : combien de rapports, combien d'épisodes. Il dit
   « il y a quelque chose là-dedans » avant qu'on ait cliqué. */
.ong-n {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 20px; height: 18px; padding: 0 6px; border-radius: 9px;
  background: var(--paper); border: 1px solid var(--line-2);
  color: var(--ink-2); font-size: 11.5px; font-weight: 700; letter-spacing: .4px;
}

/* ⚠️ Une classe qui pose `display:` l'emporte sur le `display:none` que le
   navigateur applique à `[hidden]` — piège déjà rencontré trois fois ici. */
.fiche-vue[hidden] { display: none; }
.fiche-vue:focus { outline: none; }

/* ═══ LA LISTE EN CARTES ═══════════════════════════════════════════════════
   Le tableau reste (il porte quatorze colonnes triables, et rien ne le
   remplace pour comparer quinze joueurs d'un coup d'œil) : les deux vues
   cohabitent et la bascule vit dans l'URL, donc une liste se partage telle
   qu'on la regarde. */
.page-head .vues-bascule { margin-left: auto; }
.vues-bascule { display: inline-flex; gap: 0; border: 1px solid var(--line-2);
  border-radius: var(--radius); overflow: hidden; background: var(--surface); }
.vues-bascule a {
  display: inline-flex; align-items: center; justify-content: center;
  width: 38px; height: 34px; color: var(--muted);
  transition: background-color .15s, color .15s;
}
.vues-bascule a + a { border-left: 1px solid var(--line-2); }
.vues-bascule a:hover { background: var(--paper); color: var(--ink); }
.vues-bascule a.est-actif { background: var(--night); color: var(--sand); }
.vues-bascule a:focus-visible { outline: 2px solid var(--night); outline-offset: -2px; }

.grille-j {
  display: grid; gap: 12px;
  grid-template-columns: repeat(auto-fill, minmax(288px, 1fr));
}

/* La carte joueur. La plaque porte l'ABRÉVIATION DU POSTE, vraie information
   et premier repère d'un recruteur qui balaie une grille ; quand le joueur a
   une photo, elle remplit la plaque et le poste passe en bandeau
   (`.cj-plaque--photo`, bloc « Photos de joueurs » en fin de fichier). */
.carte-j {
  display: grid; grid-template-columns: 54px minmax(0, 1fr); gap: 2px 12px;
  align-items: center;
  padding: 12px; background: var(--surface);
  border: 1px solid var(--line); border-radius: var(--radius);
  box-shadow: var(--shadow); color: var(--ink);
  transition: border-color .15s, box-shadow .15s, transform .12s;
}
.carte-j:hover {
  border-color: var(--sand-2); box-shadow: var(--shadow-2); transform: translateY(-1px);
}
.carte-j:focus-visible { outline: 2px solid var(--night); outline-offset: 2px; }
.cj-plaque {
  grid-row: 1 / span 3; align-self: start;
  width: 54px; height: 54px; border-radius: var(--radius);
  display: flex; align-items: center; justify-content: center;
  background: linear-gradient(160deg, var(--night-2), var(--night-3));
  color: var(--sand); border: 1px solid rgba(224,192,144,.3);
  font-family: 'Barlow Condensed', sans-serif; font-weight: 800;
  font-size: 19px; letter-spacing: .5px;
}
.cj-nom {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700;
  font-size: 19px; line-height: 1.1; color: var(--ink);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.carte-j:hover .cj-nom { text-decoration: underline; }
.cj-club {
  font-size: 12.5px; color: var(--ink-2); line-height: 1.3;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.cj-pied {
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  margin-top: 4px; font-size: 12px; color: var(--muted);
}
.cj-pied .sep { color: var(--line-2); }
.cj-tag {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 600;
  text-transform: uppercase; letter-spacing: .6px; font-size: 11px;
  padding: 1px 7px; border-radius: 4px;
  background: var(--paper); border: 1px solid var(--line-2); color: var(--ink-2);
}
.cj-notes { margin-left: auto; display: flex; align-items: center; gap: 5px; }
.cj-etoile { color: var(--sand-2); }
/* Le PPI garde sa place de droite et son ambiance de note chiffrée. */
.cj-ppi {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 800; font-size: 17px;
  color: var(--night); font-variant-numeric: tabular-nums;
}
.cj-ppi i { font-style: normal; font-size: 11px; font-weight: 600; color: var(--muted); }
/* Cible de recrutement active : le suffixe devient le nom du championnat visé
   (au lieu de « /100 ») — sans lui, le chiffre translaté semble être le PPI
   habituel, et « Cible de recrutement » paraît sans effet sur la carte. Un
   nom de championnat long (« Jupiler Pro League »…) est tronqué, pas le PPI. */
.cj-ppi-cible {
  display: inline-block; max-width: 72px; overflow: hidden;
  text-overflow: ellipsis; white-space: nowrap; vertical-align: bottom;
}
/* Cible ET Saison PPI actives ensemble : un seul chiffre est possible (le PPI
   de la saison, échelle commune) — LeagueFit n'existe que pour la saison
   courante. La cible reste affichée en CONTEXTE à gauche, sans chiffre. */
.cj-combo {
  display: flex; align-items: center; justify-content: space-between;
  gap: 8px; margin-top: 4px;
}
.cj-combo-cible {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700;
  text-transform: uppercase; letter-spacing: .5px; font-size: 11px;
  color: var(--muted); border: 1px solid var(--line-2); border-radius: 999px;
  padding: 2px 9px; max-width: 110px; overflow: hidden; text-overflow: ellipsis;
  white-space: nowrap;
}

@media (max-width: 720px) {
  .grille-j { grid-template-columns: 1fr; }
  .onglets a { padding: 0 12px; font-size: 13px; }
}

/* ═══════════════════════════════════════════════════════════════════════════
   LA BARRE LATÉRALE — la navigation passe sur le côté   (17/09/2026)

   Le même balisage sert aux deux formats : COLONNE fixe à gauche au-dessus de
   900 px, bande d'onglets défilable en dessous (le comportement mobile déjà
   éprouvé, qu'on ne touche pas). Les classes `.nav`, `.nav-links`,
   `.nav-compte` gardent donc leur nom — ce sont des rôles, pas des positions.

   Pourquoi un rail : six entrées de navigation, et bientôt plus. En haut, elles
   se disputaient la largeur avec le nom du compte ; sur le côté, chacune a sa
   ligne, son icône, et la place d'en accueillir une septième sans rien serrer.
   ══════════════════════════════════════════════════════════════════════════ */

:root { --rail: 236px; }

@media (min-width: 901px) {
  body { padding-left: var(--rail); }

  .nav {
    position: fixed; top: 0; left: 0; bottom: 0; width: var(--rail);
    z-index: 50; overflow-y: auto; overscroll-behavior: contain;
    border-bottom: 0;
    /* L'arête éclairée passe du bas au côté : c'est la même ligne de lumière,
       elle a juste tourné avec la barre. */
    border-right: 2px solid var(--sand);
    background:
      radial-gradient(420px 220px at 0% 0%, rgba(224,192,144,.13), transparent 70%),
      linear-gradient(180deg, var(--night) 0%, var(--night-3) 100%);
  }
  .nav-inner {
    position: relative;
    flex-direction: column; align-items: stretch; justify-content: flex-start;
    height: 100%; max-width: none; gap: 0; padding: 20px 12px 16px;
  }

  .brand {
    margin: 0 0 22px; padding: 0 8px; gap: 12px; font-size: 21px;
  }
  .brand .mark { width: 40px; height: 40px; }

  .nav-links { flex-direction: column; margin-left: 0; gap: 2px; }
  .nav-links a {
    height: 42px; padding: 0 12px; gap: 12px;
    justify-content: flex-start; border-radius: 8px;
    border-bottom: 0; margin-bottom: 0;
    font-size: 14px; letter-spacing: .9px;
    position: relative;
    transition: color .15s, background-color .15s;
  }
  .nav-links a .ic { width: 18px; height: 18px; opacity: .85; }
  .nav-links a:hover { background: rgba(255,255,255,.06); }
  .nav-links a.active {
    background: var(--night-2); color: var(--on-night); border-bottom-color: transparent;
  }
  .nav-links a.active .ic { color: var(--sand); opacity: 1; }
  /* L'arête de lumière tombe sur l'entrée courante — le faisceau, à l'échelle
     d'un lien. Un aplat Calico plein en ferait un bouton et écraserait tout le
     reste de la colonne. */
  .nav-links a.active::before {
    content: ""; position: absolute; left: 0; top: 9px; bottom: 9px;
    width: 3px; border-radius: 0 3px 3px 0; background: var(--sand);
  }

  /* Le compte descend au pied du rail, séparé par un filet : c'est le bas de la
     colonne, pas une septième destination. */
  .nav-compte {
    margin: auto 0 0; padding: 14px 8px 0;
    flex-direction: column; align-items: stretch; gap: 10px;
    border-left: 0; border-top: 1px solid rgba(255,255,255,.16);
  }
  .nav-qui { white-space: normal; }
  .nav-nom { overflow: hidden; text-overflow: ellipsis; }
  .nav-logout { width: 100%; }
  .nav-logout button { width: 100%; justify-content: center; }

  /* Le contenu garde sa gouttière propre : `.wrap` reste centré dans ce qui
     reste de la fenêtre. Sur très grand écran, la colonne de lecture ne colle
     donc pas au rail. */
  .wrap { max-width: 1240px; }
}

/* Écran large : le rail respire un peu plus. */
@media (min-width: 1500px) {
  :root { --rail: 260px; }
}

/* ── Sous 900 px : rien ne change, la bande d'onglets reprend la main ──
   Les règles du bloc « MOBILE ET TABLETTE » (plus bas dans ce fichier)
   continuent de gouverner. Une seule chose à annuler ici : dans la bande
   horizontale, l'icône mangerait la largeur des libellés. */
@media (max-width: 900px) {
  .nav-links a .ic { display: none; }
}

/* ═══════════════════════════════════════════════════════════════════════════
   LE POSTE DE VEILLE — blason, accueil, ouverture   (17/09/2026)

   Placé AVANT le bloc « MOBILE ET TABLETTE » : rangé après, ses règles
   écraseraient leurs propres surcharges de petit écran — même piège que les
   trois sections datées qui précèdent.
   ══════════════════════════════════════════════════════════════════════════ */

/* ── Le blason ────────────────────────────────────────────────────────────
   Posé en MASQUE et non en balise image : il prend ainsi la couleur du texte courant
   (`currentColor`), donc la même forme sert en sable sur la nuit, en nuit sur
   le papier, et en blanc sur une alerte — un seul fichier au lieu de cinq.
   ⚠️ Le blason est un dessin dense (lettrage DUNKERQUE, dauphin, monogramme,
   millésime) : en dessous de ~28 px il devient une tache. Ne jamais le réduire
   davantage — préférer l'écarter. */
.blason {
  display: inline-block;
  background: currentColor;
  -webkit-mask: url("blason.4c3bb6253229.svg") center / contain no-repeat;
  mask: url("blason.4c3bb6253229.svg") center / contain no-repeat;
}

/* ── Icônes ───────────────────────────────────────────────────────────────
   Dimensionnées en `em` : une icône suit la taille du texte qu'elle accompagne,
   donc une puce du bandeau et un lien de tableau n'ont pas besoin de deux
   réglages. `flex: none` empêche le conteneur flex de l'écraser quand le
   libellé s'allonge, et `stroke` hérite de `currentColor` — la même icône sert
   sur la nuit et sur le papier. */
.ic {
  width: 1.05em; height: 1.05em; flex: none;
  vertical-align: -.15em; pointer-events: none;
}
.ic-sm { width: .92em; height: .92em; }

/* ── Surfaces du navigateur ───────────────────────────────────────────────
   Sélection, curseur de saisie, barres de défilement, filets de focus : rien de
   tout cela n'appartient à un design system tant qu'on ne l'a pas peint. C'est
   le signe le moins cher qu'une page a été DESSINÉE et pas seulement assemblée. */
::selection { background: var(--sand); color: var(--night); }
:root { accent-color: var(--night); caret-color: var(--night); }
/* Firefox */
* { scrollbar-color: var(--line-2) transparent; scrollbar-width: thin; }
/* WebKit / Blink */
::-webkit-scrollbar { width: 11px; height: 11px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb {
  background: var(--line-2); border-radius: 99px;
  border: 3px solid var(--paper);
}
::-webkit-scrollbar-thumb:hover { background: #A9B3BF; }
/* Sur la nuit, une barre claire : l'inverse s'y voit comme une rayure noire. */
.nuit ::-webkit-scrollbar-thumb {
  background: rgba(255,255,255,.26); border-color: transparent;
}

/* ── La marque ────────────────────────────────────────────────────────────
   Le blason remplace la pastille carrée qui portait un emoji ballon. Il n'a
   pas de fond : c'est une forme découpée dans la lumière, posée sur la nuit. */
.brand .mark {
  width: 38px; height: 38px; border-radius: 0;
  background: var(--sand); color: var(--sand);
  box-shadow: none;
}
.brand .libelle { letter-spacing: 1.5px; }
.nav { border-bottom-width: 2px; }

/* ═══ ACCUEIL — LE QUART ═══════════════════════════════════════════════════ */

/* Le bandeau sort de la gouttière de `.wrap` pour toucher les deux bords : la
   nuit ne s'arrête pas à une marge. Les marges négatives reprennent EXACTEMENT
   les paddings de `.wrap` (24 / 16 / 14 px selon la largeur) — pas de `100vw`,
   qui compte la barre de défilement et ferait déborder la page. */
.quart {
  position: relative; overflow: hidden;
  margin: -26px -24px 26px; padding: 30px 24px 26px;
  background:
    radial-gradient(900px 340px at 14% -40%, rgba(224,192,144,.16), transparent 68%),
    linear-gradient(180deg, var(--night) 0%, var(--night-3) 100%);
  color: var(--on-night);
}
/* Le blason en filigrane, coupé par le bord du bandeau : la lampe est au bout
   de la pièce, on n'en voit qu'une partie. */
.quart::after {
  content: ""; position: absolute; top: 50%; right: -70px;
  width: 300px; height: 300px; transform: translateY(-50%);
  background: var(--sand); opacity: .085; pointer-events: none;
  -webkit-mask: url("blason.4c3bb6253229.svg") center / contain no-repeat;
  mask: url("blason.4c3bb6253229.svg") center / contain no-repeat;
}
.quart-inner { position: relative; z-index: 1; max-width: 1232px; margin: 0 auto; }

.quart h1 {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 800;
  text-transform: uppercase; letter-spacing: -.5px;
  font-size: 42px; line-height: 1; margin: 0; color: var(--on-night);
}
.quart-sous {
  margin: 8px 0 0; font-size: 14px; color: var(--night-mut);
}
.quart-sous b { color: var(--sand); font-weight: 600; }

/* Le relevé : une LIGNE de mesures, pas quatre tuiles. Un tableau de bord qui
   met quatre gros nombres en vitrine raconte les nombres ; ici ils servent de
   repère d'échelle avant d'entrer dans le journal, rien de plus. */
.releve {
  display: flex; flex-wrap: wrap; align-items: baseline;
  gap: 0 26px; margin: 20px 0 0; padding: 0; list-style: none;
}
.releve li {
  display: flex; align-items: baseline; gap: 8px;
  padding-right: 26px; border-right: 1px solid rgba(255,255,255,.14);
}
.releve li:last-child { border-right: 0; padding-right: 0; }
.releve .v {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700;
  font-size: 26px; line-height: 1; color: var(--on-night);
  font-variant-numeric: tabular-nums;
}
.releve .l {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 600;
  text-transform: uppercase; letter-spacing: 1px; font-size: 11.5px;
  color: var(--night-mut);
}

/* La recherche dans le bandeau : le geste le plus fréquent de la cellule reste
   « trouve-moi ce joueur ». Elle mène à la liste, elle ne filtre pas l'accueil. */
.quart-rech { display: flex; gap: 8px; margin: 22px 0 0; max-width: 520px; }
.quart-rech .champ { position: relative; flex: 1 1 auto; }
.quart-rech .champ svg {
  position: absolute; left: 12px; top: 50%; transform: translateY(-50%);
  color: var(--night-mut); pointer-events: none;
}
.quart-rech input {
  width: 100%; height: 42px; padding: 0 12px 0 38px;
  font-family: 'Barlow', sans-serif; font-size: 15px;
  color: var(--on-night); background: rgba(255,255,255,.07);
  border: 1px solid rgba(255,255,255,.22); border-radius: var(--radius);
  transition: border-color .15s, background-color .15s, box-shadow .15s;
}
.quart-rech input::placeholder { color: rgba(255,255,255,.5); }
.quart-rech input:focus {
  outline: none; background: rgba(255,255,255,.12);
  border-color: var(--sand); box-shadow: 0 0 0 3px rgba(224,192,144,.22);
}
.quart-rech button {
  height: 42px; padding: 0 18px;
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700;
  text-transform: uppercase; letter-spacing: .9px; font-size: 15px;
  color: var(--night); background: var(--sand);
  border: 0; border-radius: var(--radius); cursor: pointer;
  transition: background-color .15s;
}
.quart-rech button:hover { background: #EED3A9; }
.quart-rech button:focus-visible { outline: 2px solid var(--on-night); outline-offset: 2px; }

/* ── La grille de l'accueil ── */
.quart-grille {
  display: grid; grid-template-columns: minmax(0, 1fr) 340px; gap: 22px;
  align-items: start;
}
.rails { display: flex; flex-direction: column; gap: 22px; }

/* ── Le journal ─────────────────────────────────────────────────────────── */
.bloc {
  background: var(--surface); border: 1px solid var(--line);
  border-radius: var(--radius); box-shadow: var(--shadow); overflow: hidden;
}
.bloc-tete {
  display: flex; align-items: baseline; justify-content: space-between; gap: 12px;
  padding: 13px 16px; border-bottom: 1px solid var(--line);
}
.bloc-tete h2 {
  margin: 0; font-family: 'Barlow Condensed', sans-serif; font-weight: 700;
  text-transform: uppercase; letter-spacing: .6px; font-size: 15px;
  color: var(--night);
}
.bloc-tete .plus {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 600;
  text-transform: uppercase; letter-spacing: .8px; font-size: 12px;
  color: var(--sand-fg); white-space: nowrap;
}
.bloc-tete .plus:hover { text-decoration: underline; }

.entree {
  display: grid; grid-template-columns: 74px minmax(0, 1fr) auto;
  gap: 4px 14px; align-items: baseline;
  padding: 12px 16px; border-bottom: 1px solid var(--line);
  position: relative; transition: background-color .12s;
}
.entree:last-child { border-bottom: 0; }
/* La lumière tombe sur la ligne visée — le faisceau, réduit à son plus simple.
   Un liseré vertical épais aurait fait de chaque ligne une petite carte. */
.entree:hover, .entree:focus-within {
  background-image: linear-gradient(90deg, rgba(224,192,144,.20), rgba(224,192,144,0) 42%);
}
.entree .quand {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 600;
  font-size: 13px; letter-spacing: .4px; color: var(--muted);
  font-variant-numeric: tabular-nums; text-transform: uppercase;
}
.entree .qui {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700;
  font-size: 18px; letter-spacing: .2px; color: var(--ink);
}
.entree .qui:hover { color: var(--night); text-decoration: underline; }
.entree .ou { font-size: 13px; color: var(--ink-2); }
.entree .ou .sep { color: var(--line-2); margin: 0 6px; }
.entree .dit {
  grid-column: 2 / -1; margin: 2px 0 0; font-size: 13.5px; color: var(--ink-2);
  line-height: 1.5;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
  overflow: hidden;
}
.entree .par {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 600;
  text-transform: uppercase; letter-spacing: .8px; font-size: 11.5px;
  color: var(--muted); white-space: nowrap;
}

/* ── Les deux registres de droite ── */
.ligne-reg {
  display: flex; align-items: baseline; justify-content: space-between; gap: 12px;
  padding: 10px 16px; border-bottom: 1px solid var(--line);
  transition: background-color .12s;
}
.ligne-reg:last-child { border-bottom: 0; }
.ligne-reg:hover {
  background-image: linear-gradient(90deg, rgba(224,192,144,.20), rgba(224,192,144,0) 60%);
}
.ligne-reg .nom {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 600; font-size: 16px;
  color: var(--ink); min-width: 0; overflow: hidden; text-overflow: ellipsis;
  white-space: nowrap;
}
.ligne-reg .nom:hover { text-decoration: underline; }
.ligne-reg .det { font-size: 12px; color: var(--muted); display: block; font-weight: 400;
  font-family: 'Barlow', sans-serif; letter-spacing: 0; }
.ligne-reg .quand {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700; font-size: 13px;
  letter-spacing: .4px; color: var(--ink-2); white-space: nowrap;
  font-variant-numeric: tabular-nums;
}
.ligne-reg .quand.proche { color: var(--warn-fg); }
.ligne-reg .quand.urgent { color: var(--bad); }

/* ── Reco de Serge — COMPACT (27/10/2026) ──
   Dans la colonne principale, au-dessus du journal. Une lacune = UNE ligne
   repliée (<details>) : poste + motifs courts | les 3 choix en vignettes |
   « Pourquoi ». Le détail se déplie dessous. Le score est un chiffre calculé :
   encre normale, jamais turquoise (notes de scout). Seul le point « nouveau »
   prend la lumière Calico : c'est l'alerte. */
.quart-principal { display: flex; flex-direction: column; gap: 22px; min-width: 0; }
.serge-quand { cursor: help; text-transform: none; letter-spacing: .2px; }
.serge-l { border-bottom: 1px solid var(--line); }
.serge-l:last-child { border-bottom: 0; }
.serge-l > summary {
  display: grid; grid-template-columns: 172px minmax(0, 1fr) auto; gap: 10px 14px;
  align-items: center; padding: 9px 16px; cursor: pointer; list-style: none;
  transition: background-color .12s;
}
.serge-l > summary::-webkit-details-marker { display: none; }
.serge-l > summary:hover, .serge-l[open] > summary {
  background-image: linear-gradient(90deg, rgba(224,192,144,.20), rgba(224,192,144,0) 60%);
}
.serge-l > summary:focus-visible { outline: 2px solid var(--sand-2); outline-offset: -2px; }
.serge-l-poste { min-width: 0; }
.serge-l-poste b {
  display: block; font-family: 'Barlow Condensed', sans-serif; font-weight: 700;
  text-transform: uppercase; letter-spacing: .4px; font-size: 14.5px; color: var(--night);
  line-height: 1.15;
}
.serge-motifs { display: flex; flex-wrap: wrap; gap: 3px; margin-top: 3px; }
.serge-motifs i {
  font-style: normal; font-size: 10.5px; line-height: 1.5; color: var(--ink-2);
  padding: 0 6px; border: 1px solid var(--line-2); border-radius: 999px; white-space: nowrap;
}
.serge-choix { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; min-width: 0; }
.serge-v {
  display: flex; align-items: center; gap: 8px; min-width: 0; padding: 3px 6px 3px 3px;
  border-radius: 6px; color: var(--ink); text-decoration: none;
}
.serge-v:hover { background: var(--surface-2, rgba(27,39,56,.05)); }
.serge-v .avatar { flex: none; margin: 0; }
.serge-v-txt { min-width: 0; flex: 1; }
.serge-v-nom {
  display: block; font-family: 'Barlow Condensed', sans-serif; font-weight: 600; font-size: 15px;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; line-height: 1.2;
}
.serge-v-club {
  display: block; font-size: 11.5px; color: var(--muted);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.serge-v-score, .serge-score {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700; color: var(--night);
}
.serge-v-score { font-size: 17px; flex: none; }
/* Le chiffre est le PPI (29/10/2026) : son étiquette, petite, au-dessus. */
.serge-v-score, .serge-score { display: inline-flex; flex-direction: column; align-items: center;
  line-height: 1; }
.serge-v-score small, .serge-score small {
  font-size: 9.5px; font-weight: 600; letter-spacing: .6px; color: var(--muted); margin-bottom: 2px;
}
.serge-nouveau {
  display: inline-block; width: 7px; height: 7px; margin-left: 5px; border-radius: 50%;
  background: var(--sand-2); vertical-align: 2px;
}
.serge-aucun { font-size: 12.5px; color: var(--muted); }
.serge-pq {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 600; text-transform: uppercase;
  letter-spacing: .7px; font-size: 11.5px; color: var(--sand-fg); white-space: nowrap;
}
.serge-pq::after { content: ""; display: inline-block; width: 6px; height: 6px; margin-left: 6px;
  border-right: 1.5px solid currentColor; border-bottom: 1.5px solid currentColor;
  transform: rotate(45deg) translateY(-2px); transition: transform .15s; }
.serge-l[open] .serge-pq::after { transform: rotate(-135deg) translateY(-1px); }
.serge-detail { padding: 2px 16px 12px 202px; }
.serge-resume { margin: 4px 0 8px; font-size: 13px; line-height: 1.5; color: var(--ink-2); }
.serge-ligne {
  display: grid; grid-template-columns: 18px minmax(0, 1fr) 32px; gap: 8px;
  align-items: baseline; padding: 7px 0; border-top: 1px dashed var(--line);
}
.serge-rang { font-family: 'Barlow Condensed', sans-serif; font-weight: 700; color: var(--muted); font-size: 13px; }
.serge-ligne .nom { font-family: 'Barlow Condensed', sans-serif; font-weight: 600; font-size: 15px; color: var(--ink); }
.serge-ligne .nom:hover { text-decoration: underline; }
.serge-ligne .det { display: block; font-size: 12px; color: var(--muted); }
.serge-ligne .det .proche { color: var(--warn-fg); }
.serge-ligne .det .urgent { color: var(--bad); }
.serge-avis { display: block; margin-top: 3px; font-size: 12.5px; line-height: 1.45; color: var(--ink); }
.serge-stats { display: flex; flex-wrap: wrap; gap: 2px 10px; margin-top: 2px; font-size: 11.5px; }
.serge-stats .devant { color: var(--p-elite-tx); }
.serge-stats .derriere { color: var(--p-poor-tx); }
.serge-stats i { font-style: normal; color: var(--muted); }
.serge-score { font-size: 16px; justify-self: end; }
.serge-ecartes { margin: 6px 0 0; padding-top: 7px; border-top: 1px dashed var(--line);
  font-size: 12px; color: var(--ink-2); line-height: 1.5; }
.serge-ecartes a { color: var(--ink); font-weight: 600; }
@media (max-width: 900px) {
  .serge-l > summary { grid-template-columns: minmax(0, 1fr) auto; }
  .serge-choix { grid-column: 1 / -1; grid-row: 2; }
  .serge-detail { padding-left: 16px; }
}
@media (max-width: 520px) {
  /* Téléphone : le choix n°1 seul dans la ligne, les autres dans « Pourquoi ». */
  .serge-choix { grid-template-columns: minmax(0, 1fr); }
  .serge-choix .serge-v:nth-child(n+2) { display: none; }
  .serge-quand-budget { display: none; }
}

/* Un bloc vide DOIT parler : « rien » et « c'est cassé » ne se ressemblent pas. */
.rien {
  padding: 20px 16px; margin: 0; font-size: 13.5px; color: var(--muted);
  line-height: 1.6;
}

/* ═══ L'OUVERTURE DU BLASON ════════════════════════════════════════════════
   Le voile de nuit couvre la page, percé d'un trou EN FORME DE BLASON qui
   grandit jusqu'à l'avaler : on entre dans le blason. Le trou est obtenu par
   composition de masques (un rectangle plein MOINS la forme du blason), et la
   croissance anime `mask-size` — une propriété animable partout, là où animer
   une variable personnalisée aurait exigé `@property`.

   Trois garde-fous, parce qu'une animation d'accueil qui se met en travers du
   travail est pire que pas d'animation :
     · elle ne se joue qu'à la CONNEXION (drapeau de session consommé) ;
     · un clic, une touche ou 2 s l'effacent (cf. base.js) ;
     · `prefers-reduced-motion` la supprime entièrement.
   La page est complète et utilisable DESSOUS pendant toute sa durée. */
.ouverture { position: fixed; inset: 0; z-index: 900; pointer-events: none; }

.ouv-voile {
  position: absolute; inset: 0; background: var(--night);
  -webkit-mask-image: linear-gradient(#000, #000), url("blason.4c3bb6253229.svg");
  -webkit-mask-repeat: no-repeat; -webkit-mask-position: center, center;
  -webkit-mask-size: 100% 100%, 0 0;
  -webkit-mask-composite: xor;
  mask-image: linear-gradient(#000, #000), url("blason.4c3bb6253229.svg");
  mask-repeat: no-repeat; mask-position: center, center;
  mask-size: 100% 100%, 0 0;
  mask-composite: exclude;
  animation: ouvrir 1.15s cubic-bezier(.22, 1, .3, 1) .34s forwards;
}
@keyframes ouvrir {
  from { -webkit-mask-size: 100% 100%, 0 0;                 mask-size: 100% 100%, 0 0; }
  60%  { opacity: 1; }
  to   { -webkit-mask-size: 100% 100%, 300vmax 300vmax;     mask-size: 100% 100%, 300vmax 300vmax;
         opacity: 0; }
}

/* La lampe : le blason s'allume avant de s'ouvrir. */
.ouv-lampe {
  position: absolute; top: 50%; left: 50%; width: 164px; height: 164px;
  margin: -82px 0 0 -82px; background: var(--sand);
  -webkit-mask: url("blason.4c3bb6253229.svg") center / contain no-repeat;
  mask: url("blason.4c3bb6253229.svg") center / contain no-repeat;
  animation: allumer 1.49s cubic-bezier(.22, 1, .3, 1) forwards;
}
@keyframes allumer {
  from { opacity: 0; transform: scale(.82); filter: blur(7px); }
  22%  { opacity: 1; transform: scale(1);   filter: blur(0); }
  34%  { opacity: 1; transform: scale(1); }
  to   { opacity: 0; transform: scale(26); filter: blur(2px); }
}
/* Le halo de la lampe, derrière le blason : c'est lui qui fait « la lumière
   s'allume » plutôt que « une forme apparaît ». */
.ouv-halo {
  position: absolute; top: 50%; left: 50%; width: 620px; height: 620px;
  margin: -310px 0 0 -310px; border-radius: 50%;
  background: radial-gradient(circle, rgba(232,196,136,.38), rgba(224,192,144,.10) 42%, rgba(224,192,144,0) 66%);
  animation: halo 1.2s ease-out forwards;
}
@keyframes halo {
  from { opacity: 0; transform: scale(.6); }
  30%  { opacity: 1; transform: scale(1); }
  to   { opacity: 0; transform: scale(1.5); }
}

/* Navigateur sans composition de masques : pas de trou possible, donc pas de
   faux trou. Le voile se contente de se lever — le monde tient, l'effet est
   simplement plus sobre. */
@supports not ((mask-composite: exclude) or (-webkit-mask-composite: xor)) {
  .ouv-voile { -webkit-mask-image: none; mask-image: none;
               animation: lever .8s ease-out .3s forwards; }
  @keyframes lever { to { opacity: 0; } }
}

@media (prefers-reduced-motion: reduce) {
  .ouverture { display: none; }
}

/* ── Accueil : tablette et téléphone ── */
@media (max-width: 1080px) {
  .quart-grille { grid-template-columns: minmax(0, 1fr); }
  .rails { flex-direction: row; }
  .rails > * { flex: 1 1 0; min-width: 0; }
}
@media (max-width: 900px) {
  .quart { margin: -18px -16px 18px; padding: 24px 16px 22px; }
  .quart h1 { font-size: 34px; }
  .quart::after { width: 220px; right: -60px; }
  .releve { gap: 0 18px; }
  .releve li { padding-right: 18px; }
  .releve .v { font-size: 22px; }
}
@media (max-width: 720px) {
  .quart { margin: -18px -14px 18px; padding: 22px 14px 20px; }
  .quart h1 { font-size: 30px; }
  .quart::after { display: none; }
  .quart-rech { max-width: none; }
  .rails { flex-direction: column; }
  /* Deux colonnes franches plutôt qu'une file qui passe à la ligne : le filet
     de séparation d'un élément replié se retrouvait en bout de ligne, à
     séparer le vide de rien. */
  .releve { display: grid; grid-template-columns: 1fr 1fr; gap: 12px 14px; }
  .releve li { padding: 0; border-right: 0; }
  /* L'entrée du journal devient une vraie ligne de registre : l'heure et la
     signature en tête, le joueur dessous. Côte à côte sur 390 px, le nom de
     l'auteur se lisait comme la suite du nom du club. */
  .entree { grid-template-columns: minmax(0, 1fr) auto; row-gap: 2px; }
  .entree .quand { grid-column: 1; grid-row: 1; }
  .entree .par   { grid-column: 2; grid-row: 1; }
  .entree > span:not(.quand):not(.par) { grid-column: 1 / -1; grid-row: 2; }
  .entree .dit   { grid-column: 1 / -1; grid-row: 3; }
}

/* ══════════════════════════════════════════════════════════════════════════
   POSTES DU JOUEUR
   Transfermarkt n'en donne qu'un, et il se trompe. La cellule corrige et peut
   en reconnaître plusieurs : le bandeau les affiche, la fenêtre les édite.
   Placé AVANT le bloc « MOBILE ET TABLETTE » — rangé après, chaque règle
   écraserait sa propre surcharge @media.
   ══════════════════════════════════════════════════════════════════════════ */

/* ── Ligne d'identité du bandeau ── */
.sub-sep { opacity: .5; margin: 0 1px; }
.sub-poste.est-principal { font-weight: 600; }
.sub-corr {
  margin-left: 6px; padding: 1px 7px; border-radius: 999px;
  background: rgba(255,255,255,.14); border: 1px solid rgba(255,255,255,.28);
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700;
  text-transform: uppercase; letter-spacing: .6px; font-size: 10.5px;
  vertical-align: 1px;
}
/* Le déclencheur d'édition est posé sur le libellé qu'il modifie, pas dans la
   rangée des puces : c'est le poste qu'on vient corriger, pas une commande de
   plus à choisir parmi six. Discret au repos, net au survol et au focus. */
.sub-editer {
  margin-left: 8px; padding: 2px 9px; min-height: 26px;
  background: transparent; color: inherit;
  border: 1px solid rgba(255,255,255,.32); border-radius: 999px;
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700;
  text-transform: uppercase; letter-spacing: .7px; font-size: 11px;
  cursor: pointer; opacity: .8;
  transition: opacity .15s, background-color .15s, border-color .15s;
}
.sub-editer:hover { opacity: 1; background: rgba(255,255,255,.14); border-color: rgba(255,255,255,.55); }
.sub-editer:focus-visible { outline: 2px solid var(--sand); outline-offset: 2px; opacity: 1; }

/* Le formulaire de relecture TM ne doit pas casser la ligne : son seul
   contenu visible est le bouton, le reste (csrf) est masqué par le navigateur. */
.sub-relire-tm { display: inline; }

/* Avertissement : la note stockée porte encore l'ancien poste. Même grammaire
   que le bandeau de provenance des stats — un fond d'attention, pas une alerte
   rouge : rien n'est cassé, une valeur est simplement en retard. */
.note-perime {
  margin: -4px 0 14px; padding: 9px 13px;
  background: var(--warn-bg); border: 1px solid var(--warn-line);
  border-radius: var(--radius);
  font-size: 12.5px; line-height: 1.45; color: var(--warn-fg);
}
.note-perime b { font-weight: 700; }

/* ── Colonne « Poste » de la liste : postes ajoutés en retrait ──
   Ils se replient sous le principal quand la colonne est étroite : l'espacement
   doit donc valoir dans les deux sens, d'où le `gap` plutôt qu'une marge. */
.pos-groupe { display: inline-flex; flex-wrap: wrap; gap: 3px; }
.pos-sec { opacity: .62; font-weight: 500; }

/* ── Grille d'édition des postes ──
   Une ligne par poste : la case dit « il peut y jouer », l'étoile dit « c'est
   le sien ». Deux listes de douze auraient fait vingt-quatre lignes dans une
   fenêtre pour exprimer la même chose. */
.fa-postes { padding: 14px 16px; }
.pj-entete { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; }
.pj-legende { font-size: 11.5px; color: var(--muted); }
.pj { display: grid; gap: 5px; margin-top: 8px; }
.pj-ligne { display: flex; align-items: stretch; gap: 5px; }
.pj-ligne .pj-opt { position: relative; display: flex; flex: 1; min-width: 0; }
.pj-ligne .pj-opt input {
  position: absolute; opacity: 0; width: 100%; height: 100%; margin: 0; cursor: pointer;
}
.pj-ligne .pj-opt span {
  display: flex; align-items: center; width: 100%; gap: 9px; cursor: pointer;
  padding: 8px 11px; min-height: 40px;
  border: 1px solid var(--line-2); border-radius: 5px;
  background: var(--surface); color: var(--ink-2);
  transition: border-color .15s, background-color .15s, color .15s;
}
.pj-opt:hover span { border-color: var(--night); color: var(--night); }
.pj-opt input:focus-visible + span { outline: 2px solid var(--night); outline-offset: 2px; }
.pj-opt input:checked + span {
  border-color: var(--night); background: var(--paper); color: var(--night);
}
.pj-opt input:checked + span .pg-abbr { background: var(--night); color: var(--on-night); }

/* L'étoile : un choix parmi douze, donc un bouton radio — mais dessiné comme
   la marque qu'il pose, pas comme un rond gris. Éteinte, elle se voit à peine ;
   allumée, elle porte l'ambre du produit. */
.pj-etoile { position: relative; display: flex; flex: none; width: 40px; }
.pj-etoile input {
  position: absolute; opacity: 0; width: 100%; height: 100%; margin: 0; cursor: pointer;
}
.pj-etoile > span[aria-hidden] {
  display: flex; align-items: center; justify-content: center; width: 100%;
  border: 1px solid var(--line-2); border-radius: 5px;
  background: var(--surface); color: var(--line-2);
  font-size: 17px; line-height: 1; cursor: pointer;
  transition: color .15s, border-color .15s, background-color .15s;
}
.pj-etoile:hover > span[aria-hidden] { color: var(--sand-2); border-color: var(--sand-2); }
.pj-etoile input:focus-visible + span { outline: 2px solid var(--night); outline-offset: 2px; }
.pj-etoile input:checked + span {
  color: var(--sand); border-color: var(--sand); background: var(--warn-bg);
}
.pj-ligne.est-principal .pj-opt span { border-color: var(--sand); }

/* ══════════════════════════════════════════════════════════════════════════
   VEILLE TWITTER
   La note réutilise la carte des background checks (.bgc et sa famille) : même
   surface, même liseré sémantique, mêmes pastilles. Ne restent ici que les
   pièces propres à la veille — barre de lancement, grille de faits, citations.
   Placé AVANT le bloc « MOBILE ET TABLETTE », sinon ces règles écraseraient
   leurs propres surcharges @media.
   ══════════════════════════════════════════════════════════════════════════ */

.section-title#veille { margin-top: 26px; }

/* ── Barre de lancement ── */
.vt-barre { display: flex; align-items: center; gap: 12px; flex-wrap: wrap;
  margin-bottom: 12px; }
.vt-btn {
  display: inline-flex; align-items: center; gap: 7px;
  padding: 7px 14px; min-height: 34px;
  border: 1px solid var(--night); border-radius: var(--radius);
  background: var(--night); color: var(--on-night);
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700;
  text-transform: uppercase; letter-spacing: .6px; font-size: 13px;
  cursor: pointer; transition: background .15s ease;
}
.vt-btn:hover:not(:disabled) { background: var(--night-2); }
.vt-btn:disabled { opacity: .65; cursor: progress; }
.vt-meta { font-size: 12px; color: var(--muted); }

/* Attente : deux API en série, une quinzaine de secondes. Le pouls dit que
   quelque chose se passe — sans lui l'utilisateur reclique et repaie. */
.vt-attente .vt-btn::before {
  content: ""; width: 11px; height: 11px; flex: none;
  border: 2px solid currentColor; border-right-color: transparent;
  border-radius: 50%; animation: vt-tourne .7s linear infinite;
}
@keyframes vt-tourne { to { transform: rotate(360deg); } }
@media (prefers-reduced-motion: reduce) {
  .vt-attente .vt-btn::before { animation: none; opacity: .5; }
}

/* ── Bandeaux d'alerte (échec, homonyme, vigilance) ── */
/* Réutilise les tokens d'état ; `v-*` reprend le vocabulaire des pastilles pour
   qu'une même gravité porte partout la même couleur. */
.vt-alerte {
  padding: 9px 12px; border-radius: var(--radius); margin-bottom: 12px;
  font-size: 13px; line-height: 1.5;
}
.vt-alerte.v-alerte { background: var(--error-bg); color: var(--error-fg);
  border: 1px solid var(--error-line); }
.vt-alerte.v-surveiller { background: var(--warn-bg); color: var(--warn-fg);
  border: 1px solid var(--warn-line); }
.vt-alerte strong { font-weight: 700; }
/* Veille en arrière-plan : information neutre, pas une alerte. Le pouls du
   bouton (`.vt-attente`) dit que ça tourne ; ce bandeau dit qu'on peut lire
   la fiche en attendant. */
.vt-alerte.vt-en-cours { background: var(--surface); color: var(--ink-2);
  border: 1px solid var(--line-2); border-left: 3px solid var(--sand-2); }
[data-veille-suivi] .vt-btn::before {
  content: ""; width: 11px; height: 11px; flex: none;
  border: 2px solid currentColor; border-right-color: transparent;
  border-radius: 50%; animation: vt-tourne .7s linear infinite;
}
@media (prefers-reduced-motion: reduce) {
  [data-veille-suivi] .vt-btn::before { animation: none; opacity: .5; }
}
/* Dans la carte, le bandeau devient un encart : marges resserrées, pas de
   seconde carte imbriquée. */
.vt-inset { margin: 10px 0 2px; }
.vt-inset strong { display: block; margin-bottom: 4px; }
.vt-inset .vt-items li { border-color: var(--error-line); }

/* ── La note ── */
.vt-note { margin-bottom: 10px; }
/* La synthèse est la première chose lue : un cran au-dessus du corps de carte,
   et de l'air avant les faits qui la détaillent. */
.vt-synthese { font-size: 14px; line-height: 1.6; margin-bottom: 14px; }

/* Libellé à gauche, contenu à droite. Volontairement PAS en capitales : une
   seule étiquette capitale par carte (.bgc-theme « Départ »), sinon quatre
   intitulés de même force se neutralisent. */
.vt-faits { display: grid; grid-template-columns: max-content 1fr;
  gap: 10px 16px; margin: 0; align-items: baseline; }
.vt-faits dt { font-size: 12px; font-weight: 600; color: var(--muted);
  white-space: nowrap; padding-top: 1px; }
.vt-faits dd { margin: 0; font-size: 13px; line-height: 1.55;
  min-width: 0; overflow-wrap: anywhere; }

/* Listes sans puces : le filet entre les entrées suffit à les séparer, et les
   puces natives n'existent nulle part ailleurs dans la fiche. */
.vt-items { list-style: none; margin: 0; padding: 0; }
.vt-items li + li { margin-top: 5px; padding-top: 5px;
  border-top: 1px solid var(--line); }

/* Citations : filet neutre et italique. Pas d'ambre — il porte l'emphase dans
   ce système (liseré du bandeau joueur, titres de section) et crierait plus
   fort que le contenu sur quatre citations de routine. */
.vt-verbatims { list-style: none; margin: 7px 0 0; padding: 0;
  display: flex; flex-direction: column; gap: 6px; }
.vt-verbatims li { padding-left: 10px; border-left: 2px solid var(--line-2);
  font-style: italic; color: var(--ink-2); }

.vt-club {
  padding: 2px 9px; border-radius: 999px; font-size: 12px; font-weight: 600;
  background: var(--paper); border: 1px solid var(--line-2); color: var(--ink-2);
}

/* Réserves : en pied, sous un filet, plus petites. Ce sont des mises en garde
   sur ce qui précède, pas une rubrique de plus au même rang. */
.vt-reserves { margin-top: 14px; padding-top: 10px;
  border-top: 1px solid var(--line); }
.vt-reserves-lab { display: block; margin-bottom: 5px; font-size: 12px;
  font-weight: 600; color: var(--warn-fg); }
.vt-reserves .vt-items { font-size: 12px; line-height: 1.5;
  color: var(--ink-2); }

/* ── Historique ── */
.vt-histo { margin-bottom: 26px; }
.vt-histo > summary { cursor: pointer; font-size: 13px; color: var(--muted);
  min-height: 34px; display: flex; align-items: center; gap: 6px; }
.vt-histo-liste { display: flex; flex-direction: column; gap: 8px;
  margin: 4px 0 0 4px; }
.vt-histo-ligne { display: flex; gap: 10px; align-items: baseline;
  flex-wrap: wrap; font-size: 13px; }
.vt-histo-date { color: var(--muted); white-space: nowrap; }
.vt-histo-txt { flex: 1; min-width: 0; color: var(--ink-2);
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
  overflow: hidden; }

.vide-aide { margin: 4px 0 0; font-size: 13px; color: var(--muted); }

/* ══════════════════════════════════════════════════════════════════════════
   AJOUT D'UN JOUEUR ABSENT DE LA BASE
   Placé AVANT le bloc « MOBILE ET TABLETTE » : rangé après, ses règles
   écraseraient les surcharges @media, comme cela s'est produit pour .mdl.
   ══════════════════════════════════════════════════════════════════════════ */

/* Le lien sous la recherche : présent sans être bruyant. On le voit au moment
   où l'on vient d'échouer à trouver quelqu'un, pas avant. */
/* 22 px : deux de moins que le minimum. Le trait pointillé descend d'un pixel,
   c'est tout ce que coûte la mise à 24 px. */
.nj-lien{display:inline-block;margin-top:6px;font-size:12px;color:var(--muted);
  text-decoration:none;border-bottom:1px dotted currentColor;padding:3px 0}
.nj-lien:hover,.nj-lien:focus-visible{color:var(--night)}
.nj-lien strong{font-weight:600;color:var(--night)}

.nj{max-width:820px;margin:0 auto;padding:2px 0 48px}
.nj-retour{display:inline-block;font-size:13px;color:var(--muted);text-decoration:none;
  padding:8px 2px;min-height:34px}
.nj-retour:hover{color:var(--night)}

.nj-tete{margin:12px 0 26px}
.nj-tete h1{margin:0 0 8px;font-size:26px;line-height:1.15;color:var(--ink)}
.nj-tete p{margin:0;color:var(--ink-2);font-size:14px;line-height:1.6;max-width:58ch}

/* LE CHEMIN RAPIDE. Coller un lien est le geste de neuf fois sur dix et il
   remplit tout le reste : il porte donc le vert de la maison et occupe la
   largeur, quand la saisie manuelle reste posée sur le papier. Leur donner le
   même poids laisserait croire à deux chemins équivalents. */
.nj-vite{
  background:var(--night); border-radius:14px; padding:20px 22px 18px;
  display:grid; grid-template-columns:1fr auto; gap:12px 14px; align-items:end;
  box-shadow:0 10px 24px -14px rgba(11,61,46,.55);
}
.nj-vite-champ{display:flex;flex-direction:column;gap:8px;min-width:0}
.nj-vite-titre{font-size:13px;font-weight:600;color:#EAF2ED;letter-spacing:.01em}
.nj-vite input{
  width:100%; padding:11px 13px; border-radius:9px; font-size:14px;
  border:1px solid rgba(255,255,255,.22); background:rgba(255,255,255,.08);
  color:var(--on-night); min-height:42px;
}
/* Le gris par défaut tomberait sous 4,5:1 sur le vert : on teinte depuis la
   couleur de premier plan plutôt que de griser. */
.nj-vite input::placeholder{color:rgba(234,242,237,.62)}
.nj-vite input:focus{outline:none;border-color:var(--sand);background:rgba(255,255,255,.14)}
.nj-vite-aide{grid-column:1/-1;margin:2px 0 0;font-size:12px;line-height:1.5;
  color:rgba(234,242,237,.78)}

/* Jauge de lecture. Indéterminée à dessein : on ne connaît pas la durée, et
   une progression inventée mentirait. Elle occupe la largeur du champ, sous
   lui, là où le regard vient de laisser l'URL. */
.nj-jauge{grid-column:1/-1;height:3px;border-radius:2px;overflow:hidden;
  background:rgba(255,255,255,.16);margin-top:2px}
.nj-jauge[hidden]{display:none}
.nj-jauge span{display:block;height:100%;width:38%;border-radius:2px;
  background:var(--sand);animation:nj-va 1.15s cubic-bezier(.65,0,.35,1) infinite}
@keyframes nj-va{
  0%   {transform:translateX(-100%)}
  100% {transform:translateX(300%)}
}
/* Une animation qui tourne en boucle chez qui a demandé moins de mouvement
   devient une gêne : la barre reste alors visible, simplement immobile. */
@media (prefers-reduced-motion:reduce){
  .nj-jauge span{animation:none;width:100%}
}
.nj-btn-lire:disabled{opacity:.6;cursor:progress}
/* Sur un téléphone, garder le bouton à côté ne laissait qu'un tiers de largeur
   au champ : on ne voyait plus le début de l'URL qu'on vient de coller. */
@media (max-width:560px){
  .nj-vite{grid-template-columns:1fr}
  .nj-btn-lire{width:100%}
}

/* Une charnière, pas un titre de section : elle dit le rapport entre les deux
   chemins. Un intitulé capitalisé de plus ferait une grammaire d'eyebrows. */
.nj-sinon{display:flex;align-items:center;gap:14px;margin:22px 0 18px;
  color:var(--muted);font-size: 12px}
.nj-sinon::before,.nj-sinon::after{content:"";flex:1;height:1px;background:var(--line)}

.nj-main{background:var(--surface);border:1px solid var(--line);border-radius:14px;
  padding:20px 22px}
.nj-main.est-lu{border-color:var(--sand)}
.nj-lu{margin:0 0 16px;font-size:13px;font-weight:600;color:var(--warn-fg);
  background:var(--warn-bg);border:1px solid var(--warn-line);
  border-radius:8px;padding:9px 12px}

/* Deux colonnes qui retombent seules : pas de media query à maintenir en plus
   de celles du bas de fichier. */
/* Grille homogène : faire courir « Nom » sur deux colonnes le laissait SEUL
   sur sa ligne et cassait le rythme. Tous les champs ont la même emprise ;
   l'ordre suffit à dire ce qui compte d'abord. */
.nj-grille{display:grid;grid-template-columns:repeat(auto-fit,minmax(196px,1fr));
  gap:16px 18px}

.nj-btn{border:1px solid var(--line-2);border-radius:9px;padding:10px 18px;
  font-size: 13px;font-weight:600;cursor:pointer;background:var(--surface);
  color:var(--ink);min-height:42px;transition:border-color .15s ease,background .15s ease}
.nj-btn:hover{border-color:var(--muted)}
.nj-btn-lire{border-color:rgba(255,255,255,.3);background:rgba(255,255,255,.1);color:var(--on-night)}
.nj-btn-lire:hover{border-color:var(--sand);background:rgba(255,255,255,.18)}
.nj-btn-creer{background:var(--night);border-color:var(--night);color:var(--on-night);padding:12px 22px;
  font-size:14px}
.nj-btn-creer:hover{background:var(--night-2);border-color:var(--night-2)}

.nj-pied{margin-top:22px;display:flex;flex-direction:column;gap:12px;align-items:flex-start}
.nj-note{margin:0;font-size: 12px;color:var(--ink-2);line-height:1.6;max-width:66ch}
.nj-note b{color:var(--ink);font-weight:600}

/* Le joueur saisi à la main doit se reconnaître d'un coup d'œil : on ne doit
   jamais lire sa fiche en croyant y voir des données Transfermarkt. */
.chip.hors-tm{border-color:var(--sand-2);color:var(--warn-fg);
  background:var(--warn-bg);cursor:help}

/* ── ASSISTANT DE RECHERCHE (28/09/2026) ─────────────────────────────────────
   Placé AVANT le bloc « MOBILE ET TABLETTE ». Le message d'interprétation
   s'affiche au-dessus de la LISTE (messages Django) : `.msg.info` n'avait
   aucune règle, il sortait sans fond ni bordure. */
.msg.info { background: var(--surface); color: var(--ink); border-color: var(--line-2);
            border-left: 3px solid var(--sand-2); font-weight: 500; }
.filtres-extra { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 12px; }
.fx-chip { display: inline-flex; align-items: center; gap: 4px; padding: 4px 4px 4px 12px;
  border: 1px solid var(--line-2); border-left: 3px solid var(--sand-2); border-radius: 999px;
  background: var(--surface); font-size: 13px; font-weight: 600; color: var(--ink); }
.fx-chip-x { display: inline-flex; align-items: center; justify-content: center;
  width: 28px; height: 28px; border-radius: 50%; color: var(--muted); }
.fx-chip-x:hover { background: var(--paper); color: var(--night); }
.fx-chip-x .ic { width: 14px; height: 14px; }
/* ── VIGIE : l'assistant en conversation (comme Claude / ChatGPT) ──
   Une colonne de lecture au centre, la saisie collée en bas. La nuit n'est
   plus un bandeau : elle se réduit à l'avatar de Vigie et à la bulle de la
   question — l'arête Calico reste réservée à ce qui est actif (le champ en
   focus, l'étape en cours, les qualités cherchées). */
.vigie {
  --vigie-col: 820px;
  display: flex; flex-direction: column;
  min-height: calc(100vh - 52px); max-width: var(--vigie-col); margin: 0 auto;
}
.vigie-tete {
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  padding: 0 0 14px; border-bottom: 1px solid var(--line);
}
.vigie-nom {
  display: inline-flex; align-items: center; gap: 8px;
  font-family: 'Barlow Condensed', sans-serif; font-weight: 800; font-size: 22px;
  text-transform: uppercase; letter-spacing: .02em; color: var(--night);
}
.vigie-nouvelle {
  display: inline-flex; align-items: center; gap: 6px; min-height: 36px; padding: 0 12px;
  font-size: 14px; font-weight: 600; color: var(--night); text-decoration: none;
  border: 1px solid var(--line-2); border-radius: 999px; background: var(--surface);
}
.vigie-nouvelle:hover { border-color: var(--night); }
.vigie-nouvelle:focus-visible { outline: 2px solid var(--night); outline-offset: 2px; }
.vigie-nouvelle .ic { width: 15px; height: 15px; }

.vigie-fil { flex: 1 1 auto; padding: 26px 0 24px; display: flex; flex-direction: column; gap: 22px; }

/* L'accueil : une question, pas un tableau de bord. */
.vigie-accueil { margin: auto 0; padding: 28px 0 8px; text-align: center; }
.vigie-embleme {
  display: inline-grid; place-items: center; width: 76px; height: 76px; border-radius: 50%;
  background: var(--night); color: var(--sand); margin-bottom: 18px;
  box-shadow: 0 10px 28px rgba(27,39,56,.18);
}
.vigie-embleme .blason { width: 46px; height: 46px; }
.vigie-titre {
  margin: 0; font-family: 'Barlow Condensed', sans-serif; font-weight: 800;
  font-size: 38px; line-height: 1.05; letter-spacing: -.01em; color: var(--ink);
  text-wrap: balance;
}
.vigie-intro { margin: 12px auto 0; max-width: 60ch; font-size: 15.5px; line-height: 1.55; color: var(--ink-2); }
.vigie-suggestions {
  display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px;
  margin: 26px 0 0; padding: 0; list-style: none; text-align: left;
}
.vigie-suggestions form { margin: 0; height: 100%; }
.vigie-suggestions button {
  width: 100%; height: 100%; min-height: 58px; padding: 12px 14px; cursor: pointer;
  font: inherit; font-size: 14.5px; line-height: 1.4; text-align: left; color: var(--ink);
  background: var(--surface); border: 1px solid var(--line-2); border-radius: 12px;
  transition: border-color .15s, box-shadow .15s, transform .15s;
}
.vigie-suggestions button:hover { border-color: var(--night); box-shadow: 0 4px 14px rgba(27,39,56,.08); }
.vigie-suggestions button:focus-visible { outline: 2px solid var(--night); outline-offset: 2px; }
.vigie-recentes-titre { margin-top: 30px; text-align: left; }
.vigie-recentes { list-style: none; margin: 0; padding: 0; text-align: left; border-top: 1px solid var(--line); }
.vigie-recentes a {
  display: flex; justify-content: space-between; gap: 12px; padding: 11px 2px;
  border-bottom: 1px solid var(--line); color: var(--ink); text-decoration: none; font-size: 14.5px;
}
.vigie-recentes a span:first-child { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.vigie-recentes a:hover span:first-child { color: var(--night); text-decoration: underline; text-underline-offset: 3px; }
.vigie-recentes .asst-meta { flex: none; white-space: nowrap; }

/* 👍 / 👎 — discret, sous la réponse : un retour, pas une action principale. */
.asst-avis { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin-top: 18px;
  font-size: 13px; color: var(--muted); }
.asst-avis form { margin: 0; }
.asst-avis button {
  display: grid; place-items: center; width: 36px; height: 36px; cursor: pointer;
  font-size: 16px; line-height: 1; background: transparent;
  border: 1px solid var(--line-2); border-radius: 50%; filter: grayscale(1); opacity: .75;
  transition: border-color .15s, opacity .15s, filter .15s;
}
.asst-avis button:hover { opacity: 1; border-color: var(--night); }
.asst-avis button[aria-pressed="true"] { filter: none; opacity: 1; border-color: var(--night);
  background: var(--surface); }
.asst-avis button:focus-visible { outline: 2px solid var(--night); outline-offset: 2px; }
.asst-avis-merci { margin-left: 4px; }

/* Les messages : la question à droite dans sa bulle, Vigie à gauche, sans
   bulle (le contenu est riche : jetons, joueurs, citations). */
.vigie-msg { display: flex; gap: 12px; }
.vigie-moi { justify-content: flex-end; }
.vigie-bulle {
  margin: 0; max-width: min(78%, 560px); padding: 11px 16px;
  font-size: 15.5px; line-height: 1.5; white-space: pre-wrap; overflow-wrap: anywhere;
  color: var(--on-night); background: var(--night); border-radius: 18px 18px 4px 18px;
}
.vigie-avatar {
  display: grid; place-items: center; flex: none; width: 32px; height: 32px; border-radius: 50%;
  font-family: 'Barlow Condensed', sans-serif; font-weight: 800; font-size: 17px;
  color: var(--sand); background: var(--night);
}
.vigie-corps { flex: 1 1 auto; min-width: 0; padding-top: 5px; }
.vigie-corps .asst-rep > * + * { margin-top: 20px; }
.vigie-corps .asst-etapes { font-size: 12.5px; }

/* La saisie, collée en bas : une boîte arrondie, le bouton rond à droite. */
.vigie-saisie {
  position: sticky; bottom: 0; z-index: 5; margin: 0; padding: 10px 0 14px;
  background: linear-gradient(180deg, rgba(244,245,247,0), var(--paper) 22%);
}
.vigie-boite {
  display: flex; align-items: flex-end; gap: 8px; padding: 8px 8px 8px 16px;
  background: var(--surface); border: 1px solid var(--line-2); border-radius: 22px;
  box-shadow: 0 6px 22px rgba(27,39,56,.10);
  transition: border-color .15s, box-shadow .15s;
}
.vigie-boite:focus-within { border-color: var(--sand-2); box-shadow: 0 6px 22px rgba(27,39,56,.10), 0 0 0 3px rgba(224,192,144,.28); }
.vigie-boite textarea {
  flex: 1 1 auto; min-height: 40px; max-height: 200px; padding: 9px 0; resize: none;
  field-sizing: content; border: 0; outline: 0; background: transparent;
  font-family: 'Barlow', sans-serif; font-size: 16px; line-height: 1.45; color: var(--ink);
  caret-color: var(--sand-fg);
}
.vigie-boite textarea::placeholder { color: var(--muted); }
.vigie-envoyer {
  display: grid; place-items: center; flex: none; width: 40px; height: 40px; border-radius: 50%;
  border: 0; cursor: pointer; color: var(--sand); background: var(--night);
  transition: background-color .15s, transform .15s;
}
.vigie-envoyer .ic { width: 19px; height: 19px; }
.vigie-envoyer:hover:not(:disabled) { background: var(--night-2); }
.vigie-envoyer:focus-visible { outline: 2px solid var(--night); outline-offset: 2px; }
.vigie-envoyer:disabled { cursor: progress; opacity: .55; }
.est-occupe .vigie-envoyer { animation: asst-pouls 1.6s cubic-bezier(.16, 1, .3, 1) infinite; }
.vigie-pied { margin: 8px 0 0; text-align: center; font-size: 12px; color: var(--muted); }
@media (prefers-reduced-motion: reduce) { .est-occupe .vigie-envoyer { animation: none; } }

/* ── La réponse, sur le papier ── */
.asst-rep > * + * { margin-top: 26px; }
.asst-h2 {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700;
  text-transform: uppercase; letter-spacing: .08em; font-size: 13px;
  color: var(--muted); margin: 0 0 10px;
}

/* Les étapes du travail RÉEL : question, vivier, rapports. */
.asst-etapes {
  display: flex; flex-wrap: wrap; align-items: center; gap: 6px 0;
  margin: 0; padding: 0; list-style: none;
  font-family: 'Barlow Condensed', sans-serif; font-weight: 600;
  text-transform: uppercase; letter-spacing: .05em; font-size: 13.5px;
  color: var(--muted);
}
.asst-etapes li { display: inline-flex; align-items: center; gap: 8px; }
.asst-etapes li + li::before {
  content: ""; width: 26px; height: 1px; margin: 0 12px; background: var(--line-2);
}
.asst-etapes b { color: var(--ink); font-weight: 700; }
.asst-etapes .fait { color: var(--ink-2); }
.asst-etapes .actif { color: var(--night); }
.asst-etapes .echec { color: var(--bad); }
.asst-puce {
  width: 10px; height: 10px; border-radius: 50%; flex: none;
  border: 2px solid var(--line-2); background: var(--surface);
}
.asst-etapes .fait .asst-puce { border-color: var(--night); background: var(--night); }
.asst-etapes .echec .asst-puce { border-color: var(--bad); background: var(--bad); }
.asst-etapes .actif .asst-puce {
  border-color: var(--sand-2); background: var(--sand);
  animation: asst-pouls 1.6s cubic-bezier(.16, 1, .3, 1) infinite;
}
@keyframes asst-pouls {
  0% { box-shadow: 0 0 0 0 rgba(200,160,99,.55); }
  100% { box-shadow: 0 0 0 9px rgba(200,160,99,0); }
}

/* Le faisceau : UN moment animé, l'arête Calico qui balaie la ligne tant que
   le serveur travaille. Il n'existe que pendant l'attente. */
.asst-faisceau {
  position: relative; height: 2px; overflow: hidden;
  background: var(--line); border-radius: 2px; margin-top: 12px;
}
.asst-rep > .asst-faisceau { margin-top: 12px; }
.asst-faisceau::after {
  content: ""; position: absolute; inset: 0 auto 0 0; width: 34%;
  background: linear-gradient(90deg, transparent, var(--sand-2) 45%, var(--sand) 55%, transparent);
  animation: asst-balaye 1.5s cubic-bezier(.16, 1, .3, 1) infinite;
}
@keyframes asst-balaye { from { transform: translateX(-100%); } to { transform: translateX(300%); } }

/* Squelette : la forme des lignes qui arrivent, pas un tourniquet au milieu. */
.asst-squelette { list-style: none; margin: 18px 0 0; padding: 0; }
.asst-squelette li {
  height: 52px; border-radius: var(--radius); margin-bottom: 8px;
  /* Sur le papier de la page : la teinte des FILETS, sinon il disparaît. */
  background: linear-gradient(90deg, var(--line) 0 40px, transparent 40px 52px,
              var(--line) 52px 46%, transparent 46%);
  animation: asst-respire 1.8s ease-in-out infinite;
}
.asst-squelette li:nth-child(2) { animation-delay: .15s; opacity: .8; }
.asst-squelette li:nth-child(3) { animation-delay: .3s; opacity: .6; }
@keyframes asst-respire { 50% { opacity: .45; } }
@media (prefers-reduced-motion: reduce) {
  .asst-faisceau::after { animation: none; transform: translateX(100%); }
  .asst-etapes .actif .asst-puce, .asst-squelette li { animation: none; }
}

/* Ce qui a été compris : les jetons ACTIFS de la recherche. */
.asst-jetons { display: flex; flex-wrap: wrap; gap: 8px; margin: 0; padding: 0; list-style: none; }
.asst-jeton {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 6px 12px; border-radius: 14px; font-size: 14px; font-weight: 600;
  color: var(--ink); background: var(--surface); border: 1px solid var(--line-2);
}
.asst-jeton-q { color: var(--sand-fg); border-color: var(--sand-2); background: #FBF6EE; }
.asst-jeton-q .ic { width: 14px; height: 14px; }
.asst-jeton-vide { color: var(--muted); font-weight: 500; }
.asst-laisse { margin: 10px 0 0; font-size: 14px; color: var(--warn-fg); }
.asst-laisse b { font-weight: 700; }
.asst-note { margin: 10px 0 0; font-size: 13px; color: var(--muted); max-width: 72ch; }
.asst-note a, .asst-lien { color: var(--night); font-weight: 600; text-underline-offset: 3px; }
.asst-vide {
  margin: 0; padding: 16px 18px; border-radius: var(--radius);
  background: var(--surface); border: 1px dashed var(--line-2);
  color: var(--ink-2); font-size: 15px; max-width: 72ch;
}
.asst-erreur {
  margin: 0; padding: 14px 16px; border-radius: var(--radius);
  background: var(--error-bg); color: var(--error-fg); border: 1px solid var(--error-line);
  font-size: 15px;
}

/* Retirer un critère : chaque bouton dit ce qu'il retire ET ce qu'il rapporte. */
.asst-sugg { display: flex; flex-wrap: wrap; gap: 8px; margin: 0; padding: 0; list-style: none; }
.asst-sugg form { margin: 0; }
.asst-sugg button {
  display: inline-flex; align-items: baseline; gap: 8px; cursor: pointer;
  min-height: 40px; padding: 8px 14px; font: inherit; font-size: 14px;
  color: var(--ink); background: var(--surface);
  border: 1px solid var(--line-2); border-radius: var(--radius);
  transition: border-color .15s, box-shadow .15s;
}
.asst-sugg button:hover:not(:disabled) { border-color: var(--night);
  box-shadow: 0 2px 8px rgba(27,39,56,.08); }
.asst-sugg button:focus-visible { outline: 2px solid var(--night); outline-offset: 2px; }
.asst-sugg button:disabled { opacity: .6; cursor: progress; }
.asst-sugg-sans {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700; text-transform: uppercase;
  letter-spacing: .05em; font-size: 12.5px; color: var(--muted);
}
.asst-sugg b {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700; font-size: 15px;
  color: var(--night); padding-left: 8px; border-left: 1px solid var(--line-2);
}

.asst-bloc-tete { display: flex; flex-wrap: wrap; align-items: baseline;
  justify-content: space-between; gap: 6px 16px; margin-bottom: 10px; }
.asst-bloc-tete .asst-h2 { margin: 0; }
.asst-lien { display: inline-flex; align-items: center; gap: 5px; font-size: 14px; }
.asst-lien .ic { width: 14px; height: 14px; }

/* Une ligne de joueur : plaque de poste (aucune photo n'existe), identité, puis
   ce qui l'a fait retenir. */
.asst-plaque {
  display: inline-grid; place-items: center; flex: none;
  width: 40px; height: 40px; border-radius: 8px;
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700; font-size: 14px;
  letter-spacing: .03em; color: var(--sand); background: var(--night);
}
.asst-j-id { display: flex; flex-direction: column; min-width: 0; gap: 2px; }
.asst-j-nom { color: var(--ink); font-weight: 700; font-size: 16px; text-decoration: none; }
.asst-j-nom:hover { color: var(--night); text-decoration: underline; text-underline-offset: 3px; }
.asst-j-nom:focus-visible { outline: 2px solid var(--night); outline-offset: 2px; border-radius: 2px; }
.asst-meta { font-size: 13px; color: var(--muted); }

.asst-trouves, .asst-joueurs, .asst-histo {
  list-style: none; margin: 0; padding: 0; border-top: 1px solid var(--line);
}
.asst-trouves > li { padding: 16px 0; border-bottom: 1px solid var(--line); }
.asst-j { display: grid; grid-template-columns: 40px minmax(0, 1fr) auto; gap: 12px; align-items: center; }
.asst-compte {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700; font-size: 15px;
  padding: 3px 10px; border-radius: 999px; color: var(--night); background: var(--paper);
}
.asst-preuves { list-style: none; margin: 10px 0 0 52px; padding: 0; display: grid; gap: 10px; }
.asst-preuves li { display: grid; grid-template-columns: 170px minmax(0, 1fr); gap: 2px 14px; }
.asst-q {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700; text-transform: uppercase;
  letter-spacing: .05em; font-size: 12.5px; line-height: 1.9; color: var(--sand-fg);
}
.asst-citation { font-size: 15.5px; line-height: 1.5; color: var(--ink); quotes: "« " " »"; }
.asst-source { grid-column: 2; font-size: 12.5px; color: var(--muted); }
.asst-manque { color: var(--muted); font-size: 14px; align-items: baseline; }
.asst-manque .asst-q { color: var(--muted); }

/* « Que pensent les scouts de X ? » (outil rapports_joueur, 04/10/2026) :
   décomptes du serveur en pastilles, puis forces / limites citées. */
.asst-avis-scouts .asst-j { grid-template-columns: 40px minmax(0, 1fr); }
.asst-avis-faits { list-style: none; margin: 12px 0 0; padding: 0; display: flex; flex-wrap: wrap; gap: 6px; }
.asst-avis-faits li {
  font-size: 13px; padding: 4px 10px; border-radius: 999px;
  background: var(--paper); color: var(--ink);
}
.asst-avis-faits b { font-family: 'Barlow Condensed', sans-serif; margin-left: 4px; }
.asst-avis-titre {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700; font-size: 15px;
  text-transform: uppercase; letter-spacing: .06em; margin: 18px 0 0; color: var(--muted);
}
.asst-preuves.asst-avis-points { margin-left: 0; }
.asst-avis-evolution { margin: 8px 0 0; font-size: 15.5px; line-height: 1.5; }

.asst-joueurs > li {
  display: grid; grid-template-columns: 40px minmax(0, 1fr) auto; gap: 12px;
  align-items: center; padding: 10px 0; border-bottom: 1px solid var(--line);
}
.asst-mesures {
  display: flex; flex-wrap: wrap; justify-content: flex-end; align-items: baseline;
  gap: 4px 16px; margin: 0; padding: 0; list-style: none;
}
.asst-mesures li { display: inline-flex; align-items: baseline; gap: 6px; font-size: 12.5px; color: var(--muted); }
.asst-mesures b {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700; font-size: 17px; color: var(--ink);
}
.asst-mesures .asst-valeur { font-weight: 600; color: var(--ink-2); font-size: 13.5px; min-width: 72px; justify-content: flex-end; }

.asst-histo li { padding: 12px 0; border-bottom: 1px solid var(--line); }
.asst-histo a { color: var(--ink); font-weight: 600; text-decoration: none; }
.asst-histo a:hover { color: var(--night); text-decoration: underline; text-underline-offset: 3px; }
.asst-histo .asst-meta { display: block; margin-top: 3px; }

/* ── Vigie en agent (02/10/2026) : texte, tableaux, cartes ──
   Le texte de Vigie est sa voix : corps de lecture, pas de gris. Les tableaux
   et les cartes sont DÉSIGNÉS par le modèle mais remplis par le serveur. */
.asst-texte p { margin: 0; font-size: 16px; line-height: 1.6; color: var(--ink); max-width: 68ch; }
.asst-texte p + p { margin-top: 10px; }
.asst-texte b { font-weight: 700; }

.asst-table-defile { overflow-x: auto; margin-top: 10px; border: 1px solid var(--line); border-radius: 10px; }
.asst-table-defile:focus-visible { outline: 2px solid var(--night); outline-offset: 2px; }
.asst-table { width: 100%; border-collapse: collapse; font-size: 14px; }
.asst-table th, .asst-table td { padding: 8px 12px; text-align: left; white-space: nowrap;
  border-bottom: 1px solid var(--line); }
.asst-table thead th { font-size: 11.5px; font-weight: 700; letter-spacing: .4px;
  text-transform: uppercase; color: var(--muted); background: #F6F7F9; }
.asst-table tbody tr:last-child > * { border-bottom: 0; }
.asst-table .num { text-align: right; }
.asst-table td.num { font-family: 'Barlow Condensed', sans-serif; font-weight: 700; font-size: 16px; color: var(--ink); }
.asst-table tbody th { font-weight: 600; }
.asst-table-j { display: inline-flex; align-items: center; gap: 10px; color: var(--ink); text-decoration: none; }
a.asst-table-j:hover span { color: var(--night); text-decoration: underline; text-underline-offset: 3px; }
a.asst-table-j:focus-visible { outline: 2px solid var(--night); outline-offset: 2px; border-radius: 4px; }
.asst-hors-base { color: var(--muted); font-weight: 500; }

.asst-cartes { list-style: none; margin: 10px 0 0; padding: 0;
  display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 10px; }
.asst-carte { display: flex; align-items: center; gap: 12px; height: 100%; padding: 10px 12px;
  border: 1px solid var(--line); border-radius: 10px; color: var(--ink); text-decoration: none;
  min-height: 44px; }
a.asst-carte:hover { border-color: var(--night); box-shadow: 0 4px 14px rgba(27,39,56,.08); }
a.asst-carte:focus-visible { outline: 2px solid var(--night); outline-offset: 2px; }
.asst-carte-id { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
.asst-carte-id > b { font-size: 15.5px; font-weight: 700; }
.asst-carte-chiffres { display: flex; flex-wrap: wrap; gap: 2px 12px; font-size: 12.5px; color: var(--muted); }
.asst-carte-chiffres b { font-family: 'Barlow Condensed', sans-serif; font-size: 16px; color: var(--ink); }

/* ── Graphiques de Vigie (02/10/2026) ──
   Même langage que le reste : un joueur = SA couleur (--j1 nuit, --j2 sable
   foncé, --j3 bleu acier, celles du Face-à-face), un percentile = les couleurs
   de la fiche (--p-*), traits fins, grille effacée, texte toujours à l'encre
   (jamais à la couleur de la série). Une carte posée dans le fil, comme un
   collègue qui glisse un graphique sur la table. Entrée animée, une fois. */
.vg-fig {
  margin: 0; padding: 16px 18px 14px; border: 1px solid var(--line); border-radius: 12px;
  background: var(--surface); box-shadow: 0 1px 2px rgba(27,39,56,.04);
  container-type: inline-size;
}
/* Deux cadres par dessin (graphiques.deux_tailles) : choisi d'après la largeur
   de la CARTE, pas de l'écran — un SVG réduit en bloc rend son texte illisible. */
.vg-dessin svg { display: block; width: 100%; height: auto; overflow: visible; }
.vg-petit { display: none; }
@container (max-width: 520px) {
  .vg-grand { display: none; }
  .vg-petit { display: block; }
}
.vg-petit .vg-axe-l { font-size: 17px; }
.vg-petit .vg-grad { font-size: 14.5px; }
.vg-titre {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700; font-size: 15px;
  letter-spacing: .5px; text-transform: uppercase; color: var(--ink); margin: 0 0 6px;
}
.vg-aide { margin: 8px 0 0; font-size: 12.5px; color: var(--muted); }

/* Radar */
.vg-fig--radar .vg-dessin { max-width: 560px; margin: 0 auto; }
.vg-anneau { fill: none; stroke: var(--line); stroke-width: 1; }
.vg-anneau:last-of-type { stroke: #CBD2DA; }
.vg-axe { stroke: var(--line); stroke-width: 1; }
.vg-axe-l { font-family: 'Barlow', sans-serif; font-size: 12.5px; font-weight: 600; fill: var(--ink-2); }
.vg-serie polygon { fill: var(--j); fill-opacity: .13; stroke: var(--j); stroke-width: 2; stroke-linejoin: round; }
.vg-plusieurs .vg-serie polygon { fill-opacity: .06; }
.vg-sommet { fill: var(--j); stroke: var(--surface); stroke-width: 2; cursor: default; }
.vg-sommet:hover { r: 6.5; }
.vg-serie, .vg-sommets {
  transform-box: view-box; transform-origin: 50% 50%;
  animation: vg-ouvre .75s cubic-bezier(.2,.75,.25,1) both;
  animation-delay: calc(var(--i, 0) * 140ms + 80ms);
}
@keyframes vg-ouvre { from { transform: scale(.15); opacity: 0; } to { transform: none; opacity: 1; } }

.vg-legende { list-style: none; margin: 4px 0 0; padding: 0; display: flex; flex-wrap: wrap;
  justify-content: center; gap: 6px 18px; font-size: 13px; font-weight: 600; color: var(--ink); }
.vg-legende i { display: inline-block; width: 12px; height: 12px; border-radius: 3px;
  background: var(--j); margin-right: 7px; vertical-align: -1px; }

/* Barres de percentiles */
.vg-familles { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: 14px 28px; margin-top: 4px; }
.vg-famille-t { margin: 0 0 6px; font-size: 11.5px; font-weight: 700; letter-spacing: .5px;
  text-transform: uppercase; color: var(--muted); }
.vg-barres { list-style: none; margin: 0; padding: 0; display: grid; gap: 7px; }
.vg-barres li { display: grid; grid-template-columns: minmax(96px, 42%) minmax(0, 1fr) 30px;
  align-items: center; gap: 10px; font-size: 13.5px; color: var(--ink-2); }
.vg-barre-l { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.vg-piste { position: relative; height: 8px; border-radius: 4px; background: #EEF1F4; overflow: hidden; }
.vg-plein {
  position: absolute; inset: 0 auto 0 0; width: var(--w); border-radius: 4px;
  transform-origin: left center;
  animation: vg-pousse .8s cubic-bezier(.2,.75,.25,1) both;
  animation-delay: calc(var(--i, 0) * 45ms + 60ms);
}
@keyframes vg-pousse { from { transform: scaleX(0); } to { transform: none; } }
.vg-c-elite { background: var(--p-elite); } .vg-c-good { background: var(--p-good); }
.vg-c-avg { background: var(--p-avg); } .vg-c-low { background: var(--p-low); }
.vg-c-poor { background: var(--p-poor); }
.vg-barre-v { font-family: 'Barlow Condensed', sans-serif; font-weight: 700; font-size: 16px;
  color: var(--ink); text-align: right; }

/* Courbes */
.vg-grille { stroke: var(--line); stroke-width: 1; }
.vg-grad { font-family: 'Barlow Condensed', sans-serif; font-size: 13px; font-weight: 600; fill: var(--muted); }
.vg-bande { fill: var(--night); fill-opacity: .07; animation: vg-apparait .6s ease .7s both; }
.vg-aire { fill: var(--night); fill-opacity: .06; animation: vg-apparait .6s ease .5s both; }
.vg-ligne { fill: none; stroke: var(--night); stroke-width: 2.25; stroke-linejoin: round; stroke-linecap: round;
  stroke-dasharray: 1; stroke-dashoffset: 1; animation: vg-trace 1s cubic-bezier(.3,.6,.25,1) .1s forwards; }
.vg-ligne-proj { fill: none; stroke: var(--night); stroke-width: 2; stroke-dasharray: 5 5;
  stroke-opacity: .7; animation: vg-apparait .5s ease .9s both; }
@keyframes vg-trace { to { stroke-dashoffset: 0; } }
@keyframes vg-apparait { from { opacity: 0; } to { opacity: 1; } }
.vg-point { fill: var(--night); stroke: var(--surface); stroke-width: 2; pointer-events: none;
  animation: vg-apparait .35s ease .8s both; }
.vg-point.est-projete { fill: var(--surface); stroke: var(--night); stroke-width: 2; }
.vg-cible { fill: transparent; cursor: default; }
.vg-legende-traits { justify-content: flex-start; font-weight: 500; color: var(--ink-2); }
.vg-trait { width: 22px !important; height: 0 !important; border-radius: 0 !important;
  border-top: 2.25px solid var(--night); background: none !important; vertical-align: 4px !important; }
.vg-trait.est-projete { border-top-style: dashed; opacity: .7; }

/* Tableau des valeurs, sous le graphique */
.vg-valeurs { margin-top: 10px; }
.vg-valeurs summary { display: inline-flex; align-items: center; min-height: 34px; cursor: pointer;
  font-size: 13px; font-weight: 600; color: var(--night); }
.vg-valeurs summary:focus-visible { outline: 2px solid var(--night); outline-offset: 2px; border-radius: 4px; }
.vg-valeurs .asst-table { margin-top: 6px; border: 1px solid var(--line); border-radius: 8px; overflow: hidden; }

/* ── Lecture des réponses (02/10/2026, retour de la cellule : « pas agréable
   à lire ») ── Le verdict d'abord, en une phrase et plus grand ; puis des
   points courts au lieu d'un paragraphe de chiffres ; les chiffres vont aux
   tableaux et aux graphiques. */
.asst-texte.asst-verdict p { font-size: 19px; line-height: 1.45; letter-spacing: -.005em; }
/* Verdict en cours d'écriture (flux, 04/10/2026) : un curseur sable au bout
   du texte, éteint quand la réponse complète le remplace. */
.asst-verdict-direct p::after {
  content: ""; display: inline-block; width: .5em; height: 1em; margin-left: 2px;
  vertical-align: -.12em; background: var(--sand); animation: asst-curseur 1s steps(2) infinite;
}
@keyframes asst-curseur { to { opacity: 0; } }
@media (prefers-reduced-motion: reduce) { .asst-verdict-direct p::after { animation: none; } }
.asst-points { list-style: none; margin: 4px 0 0; padding: 0; display: grid; gap: 8px; max-width: 68ch; }
.asst-texte p + .asst-points, .asst-points + p { margin-top: 10px; }
.asst-points li { position: relative; padding-left: 18px; font-size: 16px; line-height: 1.5; color: var(--ink); }
.asst-points li::before { content: ""; position: absolute; left: 2px; top: .6em;
  width: 7px; height: 7px; border-radius: 2px; background: var(--night); }

/* Comparaison en FACE-À-FACE (_asst_comparatif.html) : un joueur par colonne,
   un critère par ligne — plus de tableau qui défile sur le côté. Le joueur
   garde la couleur du radar (filet au-dessus de sa colonne). */
.cmp { margin-top: 10px; border: 1px solid var(--line); border-radius: 12px;
  overflow: hidden; background: var(--surface); }
.cmp-table { width: 100%; border-collapse: collapse; table-layout: fixed; font-size: 14px; }
.cmp-coin, .cmp-table th[scope="row"] { width: 34%; }
.cmp-j { vertical-align: bottom; padding: 14px 8px 12px; text-align: center; font-weight: 400;
  border-left: 1px solid var(--line); box-shadow: inset 0 4px 0 var(--j, transparent); }
.cmp-j-lien { display: flex; flex-direction: column; align-items: center; gap: 7px;
  color: var(--ink); text-decoration: none; }
a.cmp-j-lien:hover .cmp-j-nom { text-decoration: underline; text-underline-offset: 3px; }
a.cmp-j-lien:focus-visible { outline: 2px solid var(--night); outline-offset: 2px; border-radius: 6px; }
.cmp-j-nom { font-weight: 700; font-size: 14.5px; line-height: 1.2; overflow-wrap: anywhere; }
.cmp-j-club { display: block; margin-top: 4px; font-size: 12px; line-height: 1.3; color: var(--muted); }
.cmp-sec th { text-align: left; padding: 9px 12px 7px; font-size: 11.5px; font-weight: 700;
  letter-spacing: .5px; text-transform: uppercase; color: var(--muted); background: var(--paper);
  border-top: 1px solid var(--line); }
.cmp-table tbody th[scope="row"] { text-align: left; padding: 8px 12px; font-weight: 600;
  color: var(--ink-2); border-top: 1px solid var(--line); }
.cmp-table tbody td { text-align: center; padding: 7px 6px; border-top: 1px solid var(--line);
  border-left: 1px solid var(--line); }
.cmp-table .cmp-sec + tr > * { border-top: 0; }
.cmp-pct, .cmp-v { font-family: 'Barlow Condensed', sans-serif; font-weight: 700; font-size: 16px; }
.cmp-pct { display: inline-block; min-width: 40px; padding: 3px 8px; border-radius: 6px;
  background: var(--tc-solide); color: var(--tc-encre); }
.cmp-v { color: var(--ink); }
/* Le meilleur de la ligne : un anneau d'encre autour de la pastille, et un fond
   de cellule — repérable sans lire la couleur. */
.cmp-table td.est-meilleur { background: #F4F6F8; }
.cmp-table td.est-meilleur .cmp-pct { box-shadow: 0 0 0 2px var(--surface), 0 0 0 4px var(--ink); }
.cmp-table td.est-meilleur .cmp-v { text-decoration: underline; text-decoration-thickness: 2px;
  text-underline-offset: 4px; }

/* Info-bulle (assistant.js) : nuit, texte clair — la seule surface sombre posée sur un graphique. */
.vg-tip {
  position: fixed; z-index: 60; pointer-events: none; max-width: 260px;
  padding: 6px 10px; border-radius: 7px; background: var(--night); color: #fff;
  font-size: 12.5px; font-weight: 600; line-height: 1.35; box-shadow: 0 6px 18px rgba(18,26,38,.25);
  transform: translate(-50%, calc(-100% - 10px)); opacity: 0; transition: opacity .12s;
}
.vg-tip.est-visible { opacity: 1; }
.vg-barres li[data-tip]:hover .vg-piste { background: #E3E8ED; }

@media (prefers-reduced-motion: reduce) {
  .vg-serie, .vg-sommets, .vg-plein, .vg-bande, .vg-aire, .vg-ligne-proj, .vg-point { animation: none; }
  .vg-ligne { animation: none; stroke-dashoffset: 0; }
}

@media (max-width: 720px) {
  .asst-preuves { margin-left: 0; }
  .asst-preuves li { grid-template-columns: 1fr; }
  .asst-source { grid-column: 1; }
  .asst-joueurs > li { grid-template-columns: 40px minmax(0, 1fr); }
  .asst-cartes { grid-template-columns: 1fr; }
  .vg-fig { padding: 14px 12px 12px; }
  .asst-texte p { font-size: 15.5px; }
  .asst-texte.asst-verdict p { font-size: 17.5px; }
  .asst-points li { font-size: 15.5px; }
  .cmp-table { font-size: 13px; }
  .cmp-coin, .cmp-table th[scope="row"] { width: 30%; }
  .cmp-table tbody th[scope="row"] { padding: 7px 8px; }
  .cmp-j { padding: 12px 4px 10px; }
  .cmp-j-nom { font-size: 13px; }
  .cmp-j-club { font-size: 11.5px; }
  .cmp-pct { min-width: 34px; padding: 2px 6px; font-size: 15px; }
  .asst-mesures { grid-column: 2; justify-content: flex-start; }
  .asst-etapes li + li::before { width: 14px; margin: 0 8px; }
  .vigie-suggestions { grid-template-columns: 1fr; }
  /* Les étapes en colonne : sur 390 px, les tirets de liaison cassaient la ligne. */
  .asst-etapes { flex-direction: column; align-items: flex-start; gap: 6px; }
  .asst-etapes li + li::before { display: none; }
  .asst-sugg li, .asst-sugg form, .asst-sugg button { width: 100%; }
  .asst-sugg button { justify-content: space-between; text-align: left; }
  .vigie-titre { font-size: 30px; }
  .vigie-bulle { max-width: 88%; }
  .vigie-avatar { width: 28px; height: 28px; font-size: 15px; }
  .vigie-msg { gap: 9px; }
}

/* 29/10/2026 — Serge : lecture d'effectif et relances contextuelles. */
.vigie .vg-fig--lignes .vg-dessin, .vigie .vg-fig--frise .vg-dessin { max-width: 680px; margin: 0 auto; }
.vigie .vg-lignes-repere { stroke: var(--line-2); stroke-width: 1; stroke-dasharray: 3 4; }
.vigie .vg-lignes-piste { fill: var(--paper); }
.vigie .vg-lignes-barre { fill: var(--night); cursor: default; }
.vigie .vg-lignes-label, .vigie .vg-lignes-valeur {
  font-family: 'Barlow Condensed', sans-serif; font-size: 13px; font-weight: 700; fill: var(--ink);
}
.vigie .vg-frise-axe { stroke: var(--line-2); stroke-width: 2; }
.vigie .vg-frise-point { stroke: var(--surface); stroke-width: 2; cursor: default; fill: var(--night); }
.vigie .vg-frise-point.est-urgent, .vigie .vg-legende-contrat i.est-urgent { fill: var(--error-fg); background: var(--error-fg); }
.vigie .vg-frise-point.est-renseigne, .vigie .vg-legende-contrat i.est-renseigne { fill: var(--night); background: var(--night); }
.vigie .vg-frise-point.est-inconnu, .vigie .vg-legende-contrat i.est-inconnu { fill: var(--muted); background: var(--muted); }
.vigie .vg-legende-contrat { justify-content: flex-start; }
.vigie .asst-relances { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 14px; }
.vigie .asst-relances a {
  display: inline-flex; align-items: center; min-height: 44px; max-width: 100%; padding: 8px 14px;
  border: 1px solid var(--line-2); border-radius: 999px; background: var(--surface);
  color: var(--night); font-size: 14px; font-weight: 600; line-height: 1.25; text-decoration: none;
  overflow-wrap: anywhere;
}
.vigie .asst-relances a:hover { border-color: var(--night); background: var(--paper); }
.vigie .asst-relances a:focus-visible { outline: 2px solid var(--night); outline-offset: 2px; }
@media (max-width: 720px) {
  .vigie .asst-relances { display: grid; grid-template-columns: minmax(0, 1fr); }
  .vigie .asst-relances a { width: 100%; }
}

/* ═══════════════════════════════════════════════════════════════════════════
   FICHE — SOURCE DES INFORMATIONS ET CORRECTIONS MANUELLES (28/09/2026)
   Le bandeau au-dessus des cartes Identité / Contrat dit d'où viennent les
   informations et quand elles ont été relevées, et porte les deux gestes de
   mise à jour : faire relire TM par le scraper, ou corriger à la main.
   Placé AVANT le bloc « MOBILE ET TABLETTE », comme les sections datées.
   ═══════════════════════════════════════════════════════════════════════════ */
.fiche-source {
  display: flex; align-items: center; justify-content: space-between;
  flex-wrap: wrap; gap: 10px 16px;
  margin: 0 0 12px; padding: 10px 14px;
  background: var(--surface); border: 1px solid var(--line);
  border-left: 3px solid var(--night); border-radius: 10px;
}
.fs-etat { display: flex; align-items: center; flex-wrap: wrap; gap: 6px 12px; min-width: 0; }
.fs-lab {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700;
  text-transform: uppercase; letter-spacing: .06em; font-size: 12px;
  color: var(--night);
}
.fs-txt { font-size: 13px; color: var(--ink-2); display: inline-flex; align-items: center; gap: 7px; }
.fs-attente { color: var(--sand-fg); font-weight: 600; }
.fs-erreur { color: var(--bad); font-weight: 600; cursor: help; }
/* Le point qui respire dit « quelque chose est en cours » sans texte de plus. */
.fs-pouls {
  width: 8px; height: 8px; border-radius: 50%; background: var(--sand);
  box-shadow: 0 0 0 0 rgba(224,192,144,.7); animation: fs-pouls 1.8s ease-out infinite;
}
@keyframes fs-pouls { to { box-shadow: 0 0 0 9px rgba(224,192,144,0); } }
@media (prefers-reduced-motion: reduce) { .fs-pouls { animation: none; } }
.fs-corr {
  display: inline-flex; align-items: center; gap: 5px;
  font-size: 12px; font-weight: 600; color: var(--sand-fg);
  padding: 2px 9px; border-radius: 999px; background: rgba(224,192,144,.18);
}
.fs-corr .ic { width: 13px; height: 13px; }
.fs-actions { display: flex; flex-wrap: wrap; gap: 8px; }
.fs-actions form { margin: 0; }
.fs-actions .btn { display: inline-flex; align-items: center; gap: 6px; }
.fs-actions .ic { width: 14px; height: 14px; }

/* Le crayon d'un champ corrigé : discret dans la lecture, explicite au survol. */
.marque-corr {
  display: inline-flex; vertical-align: -2px; margin-right: 6px;
  color: var(--sand-fg); cursor: help;
}
.marque-corr .ic { width: 13px; height: 13px; }

/* ── Fenêtre « Modifier la fiche » ── */
.mdl-infos:modal { width: min(760px, 100%); }
.fa-infos { padding: 14px 16px; }
.fi-groupe { border: 0; margin: 0 0 14px; padding: 0; min-width: 0; }
.fi-groupe legend {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700;
  text-transform: uppercase; letter-spacing: .06em; font-size: 13px;
  color: var(--night); padding: 0 0 6px; margin-bottom: 8px;
  border-bottom: 2px solid var(--sand); width: 100%;
}
.fi-grille { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px 16px; }
.fi-champ input, .fi-champ select { width: 100%; }
.fi-champ.est-corrige input, .fi-champ.est-corrige select { border-color: var(--sand); }
.fi-tag {
  font-style: normal; margin-left: 6px; padding: 0 7px; border-radius: 999px;
  font-size: 10.5px; font-weight: 700; letter-spacing: .03em; text-transform: uppercase;
  color: var(--sand-fg); background: rgba(224,192,144,.22);
}
.fi-retour { display: flex; align-items: flex-start; gap: 6px; font-size: 12px; color: var(--ink-2); cursor: pointer; }
.fi-retour input { margin-top: 2px; }
.fi-retour b { font-weight: 600; color: var(--ink); }
.fi-champ input:disabled, .fi-champ select:disabled { opacity: .45; text-decoration: line-through; }
@media (max-width: 560px) {
  .fi-grille { grid-template-columns: 1fr; }
  .fiche-source { align-items: stretch; }
  .fs-actions { width: 100%; }
  .fs-actions .btn, .fs-actions form { flex: 1 1 auto; justify-content: center; }
}

/* ═══════════════════════════════════════════════════════════════════════════
   MOBILE ET TABLETTE
   L'app se consulte au bord du terrain, sur un téléphone tenu à une main. Trois
   principes : ne jamais faire défiler la page horizontalement, garder des cibles
   tactiles d'au moins 44 px, et sacrifier les colonnes décoratives avant les
   colonnes utiles. Les blocs `@media` plus haut (nav, flux des rapports,
   bandeau) restent en place — ceci les complète.
   ══════════════════════════════════════════════════════════════════════════ */

/* ── Tablette (≤ 900 px) ── */
@media (max-width: 900px) {
  .wrap { padding: 18px 16px 48px; }

  /* ⚠️ LA BARRE D'ONGLETS COMMENCE ICI, PAS À 720 px.
     La nav desktop (marque + 4 liens + Déconnexion) réclame 795 px, mesurés.
     Le passage en onglets défilables était posé à `max-width: 720px` : il
     restait donc une bande de 721 à 794 px où la nav desktop était encore
     active et ne tenait pas — 27 px de défilement horizontal sur TOUTES les
     pages authentifiées. Cette bande contient 768 px, soit l'iPad en portrait,
     c'est-à-dire exactement l'appareil du scout au bord du terrain.
     Le diagnostic d'origine était juste (c'est la nav, pas le tableau) ; seul
     le seuil était trop bas. 900 px laisse 105 px de marge sur le besoin réel.
     `min-width: 0` est indispensable : sans lui un élément flex refuse de
     descendre sous la largeur de son contenu. */
  .nav-inner { padding: 0 12px; gap: 0; overflow: hidden; }
  .brand { margin-right: 10px; flex: 0 0 auto; }
  .nav-links {
    min-width: 0; overflow-x: auto; overflow-y: hidden;
    -webkit-overflow-scrolling: touch;
    scrollbar-width: none;
  }
  .nav-links::-webkit-scrollbar { display: none; }
  .nav-links a { padding: 0 13px; white-space: nowrap; }
  /* La zone compte ne défile PAS avec les onglets : savoir sous quel nom on
     écrit ne doit pas dépendre d'un geste de défilement horizontal. C'est la
     bande d'onglets qui se comprime, elle a `min-width: 0` pour cela. */
  .nav-compte { margin-left: 10px; padding-left: 10px; gap: 8px; }
  .nav-logout button { padding: 0 10px; white-space: nowrap; }
  /* Une tablette est un écran tactile : les mêmes cibles que sur téléphone y
     valent, même si la place ne manque pas. Mesurés avant correction :
     retour à la liste 19 px, jetons 23 px, joueur d'un rapport 22 px. */
  .ovl-x { width: 40px; height: 40px; }
  /* `inline-flex` pour ce qui aligne réellement plusieurs éléments (jeton,
     icône, pastille) : ceux-là ne portent aucun nœud de texte nu. */
  .chip, .cp-dep, .poste-jeton, .cmp-vue, .sb-pos, .fx-piece {
    min-height: 34px; display: inline-flex; align-items: center;
  }
  /* Les liens de TEXTE grandissent par le PADDING — voir l'avertissement de la
     règle 24 px : en `inline-flex`, `.back-link` rendait « · filtres
     conservés » sur une deuxième ligne, l'espace nu ayant été avalé. */
  .back-link, .fx-joueur, .rm-plus, .tm-link, .fx-lire {
    padding-top: 9px; padding-bottom: 9px;
  }
  .icon-btn { min-width: 38px; min-height: 38px; }
  .btn, .btn-sm { min-height: 38px; }
  /* Les liens DU TABLEAU faisaient 16 px de haut : en-têtes de tri (« Act. » :
     21,8 × 16) et noms de joueurs. Ce sont pourtant les cibles les plus visées
     de l'app. La ligne entière reste cliquable par ailleurs, mais un en-tête de
     tri, lui, n'a pas d'autre zone.

     ⚠️ Par du PADDING, surtout pas `inline-flex` : un conteneur flex ignore les
     nœuds de texte purement blancs entre ses enfants. Le nom du joueur s'écrit
     `<span class="first">Lamine</span> YAMAL` — l'espace disparaissait et on
     lisait « LamineYAMAL ». `inline-block` en plus, pour que le padding
     vertical compte réellement dans la boîte. */
  table.grid thead th a, .name-link {
    display: inline-block; padding-top: 9px; padding-bottom: 9px;
  }
  /* La marque de la barre de nav : 30 px de large, sous le seuil. */
  .brand { min-width: 44px; }
  /* Une case à cocher de 16 px se rate une fois sur deux au pouce. */
  .check input[type=checkbox] { width: 20px; height: 20px; }
  .check { display: inline-flex; align-items: center; gap: 8px; min-height: 38px; }
  .hero { padding: 20px 18px; }
  /* Le mini-terrain passe devant le texte plutôt que de l'écraser. */
  .hero-lead { flex-wrap: wrap; gap: 14px; }
  .traj-grid { grid-template-columns: 1fr; }
  .fit-axes { grid-template-columns: 1fr; gap: 16px; }
}

/* ── Téléphone (≤ 720 px) ── */
@media (max-width: 720px) {
  /* La barre d'onglets défilable est déclarée dans le bloc 900 px ci-dessus —
     c'est là que la nav desktop cesse de tenir (795 px mesurés), pas ici. */

  /* Cibles tactiles : ces liens-là ne sont pas dans une ligne cliquable, ils
     sont la seule zone à viser et faisaient 19 à 27 px de haut. */
  /* `inline-flex` pour ce qui aligne réellement plusieurs éléments (jeton,
     icône, pastille) : ceux-là ne portent aucun nœud de texte nu. */
  .chip, .cp-dep, .poste-jeton, .cmp-vue, .sb-pos, .fx-piece {
    min-height: 34px; display: inline-flex; align-items: center;
  }
  /* Les liens de TEXTE grandissent par le PADDING — voir l'avertissement de la
     règle 24 px : en `inline-flex`, `.back-link` rendait « · filtres
     conservés » sur une deuxième ligne, l'espace nu ayant été avalé. */
  .back-link, .fx-joueur, .rm-plus, .tm-link, .fx-lire {
    padding-top: 9px; padding-bottom: 9px;
  }
  .icon-btn { min-width: 38px; min-height: 38px; }
  /* Tableau des joueurs : 13 colonnes sur 720 px imposaient un défilement
     latéral permanent. On retire d'abord ce qui se retrouve sur la fiche —
     nationalité, présence StatsBomb — et la table cesse d'être plus large que
     l'écran. Le scout garde l'essentiel : qui, où, et ses deux notes. */
  .grid .c-nat, .grid .c-sb { display: none; }
  table.grid { min-width: 0; }
  .grid thead th, .grid tbody td { padding: 9px 8px; }

  /* Ligne entière cliquable : elle doit offrir une vraie surface au pouce. */
  .grid tbody td { height: 44px; }

  /* Filtres : une colonne pleine largeur, plus lisible qu'une grille écrasée. */
  .filters-grid { grid-template-columns: 1fr; }
  .filters-grid .field[style*="span 2"] { grid-column: auto !important; }
  .filters-foot { flex-wrap: wrap; gap: 10px; }
  .filters-foot .btn { flex: 1 1 auto; min-height: 44px; }

  /* Champs de formulaire : 16 px minimum, sinon iOS zoome à la sélection et
     laisse la page décalée. */
  .filters input, .filters select,
  .rf input, .rf select, .rf textarea,
  input[type="text"], input[type="date"], select, textarea { font-size: 16px; }
  .filters select, .filters input[type="text"], .rf-scout { min-height: 44px; }

  /* Percentiles : l'étiquette prenait 130 px sur 360 px d'écran. */
  .perc { grid-template-columns: 96px 1fr; gap: 8px; }
  .perc .lbl { font-size: 12px; }

  /* Veille : la grille libellé/contenu passe en une colonne. À 360 px, une
     colonne `max-content` laisserait moins de 200 px au texte, et « Ce qui se
     dit » se briserait sur trois lignes en face d'un paragraphe. */
  .vt-faits { grid-template-columns: 1fr; gap: 3px 0; }
  .vt-faits dt { padding-top: 8px; }
  .vt-faits dt:first-child { padding-top: 0; }
  .vt-faits dd + dt { border-top: 1px solid var(--line); }
  /* La barre : le bouton d'abord, la ligne de contexte dessous. */
  .vt-barre { gap: 8px; }
  .vt-btn { min-height: 40px; }
  .vt-meta { flex: 1 0 100%; }

  /* Surcouche de lecture d'un rapport : marges réduites, croix au pouce.
     `max-width` en plus de `width` : mesurée à 454 px dans un écran de 390, la
     boîte était élargie par la largeur mini de son contenu (les colonnes
     `auto` du dossier du joueur), que `width: min(680px, 100%)` ne borne pas. */
  .ovl { padding: 10px; }
  .ovl-boite {
    padding: 18px 16px 20px; max-height: 92vh;
    max-width: 100%; min-width: 0;
  }
  .ovl-x { width: 44px; height: 44px; top: 8px; right: 8px; }
  .rd-tete { margin-right: 52px; }
  /* Les lignes du dossier cessent d'imposer leur largeur : la recommandation
     passe sous le texte plutôt que d'élargir la boîte. */
  .rd-lignes li { grid-template-columns: 50px minmax(0, 1fr); }
  .rd-lignes .reco, .rm-signe { grid-column: 2; justify-self: start; }
  .rd-meta { grid-template-columns: repeat(auto-fit, minmax(110px, 1fr)); }

  /* Comparaison : le radar ne doit pas déborder. */
  .cmp-svg { max-height: 300px; }

  /* Le tableau reste défilable si un écran très étroit l'exige : l'ombre
     latérale dit qu'il y a quelque chose à droite, au lieu de le laisser
     deviner. */
  .table-scroll {
    background:
      linear-gradient(90deg, var(--surface) 30%, rgba(255,255,255,0)),
      linear-gradient(90deg, rgba(255,255,255,0), var(--surface) 70%) 100% 0,
      radial-gradient(farthest-side at 0 50%, rgba(11,61,46,.14), rgba(0,0,0,0)),
      radial-gradient(farthest-side at 100% 50%, rgba(11,61,46,.14), rgba(0,0,0,0)) 100% 0;
    background-repeat: no-repeat;
    background-size: 34px 100%, 34px 100%, 12px 100%, 12px 100%;
    background-attachment: local, local, scroll, scroll;
  }

  /* Listes, actions de fiche et panneau d'export : une colonne, cibles pleine
     largeur. Rangé DANS ce bloc et non dans un `@media` de plus — un seul
     palier 720 px, sinon la règle des 16 px cesse d'être la dernière lue. */
  .fa { flex-direction: column; align-items: stretch; }
  .fa-liste { flex-direction: column; align-items: stretch; }
  .fa-liste select, .fa-liste button { width: 100%; min-height: 44px; }
  .pdfx-cases { grid-template-columns: 1fr; }
  .pdfx-case { padding: 8px 2px; }
  .mdl-appel, .lg-tete { min-height: 44px; align-items: center; }
  /* La fenêtre occupe l'écran : sur 390 px, une boîte centrée laisserait des
     marges perdues et un formulaire à l'étroit. */
  .mdl:modal { width: 100%; max-height: 94vh; }
  /* Deux colonnes sur 390 px tronquaient « Milieu défensif » dès qu'un jeton
     « son poste » ou « déjà » venait s'ajouter. La fenêtre défile, la hauteur
     n'est pas un problème ; la largeur, si. */
  .pg { grid-template-columns: 1fr; }
  .mdl-pied .btn { flex: 1 1 auto; min-height: 44px; justify-content: center; }
  .lg-nom { font-size: 15px; }
  /* Une carte de compte par ligne : à 390 px, deux colonnes rognent le nom. */
  .lsel-grille { grid-template-columns: 1fr; }
  .lsel-carte { min-height: 44px; }
  /* Le sommaire passe sous le total plutôt que de le comprimer. */
  .lsom-liens { margin-left: 0; }
  .lsom-l { min-height: 34px; }
}

/* ── Petit téléphone (≤ 480 px) ── */
@media (max-width: 480px) {
  /* Second palier : on garde nom, club, championnat et les deux notes. La
     valeur marchande et le poste se lisent sur la fiche, à un doigt de là. */
  .grid .c-val, .grid .c-poste, .grid .c-age { display: none; }
  .grid thead th, .grid tbody td { padding: 8px 6px; font-size: 13px; }
  .badge { font-size: 10.5px; padding: 2px 5px; }

  .hero h1 { font-size: 26px; }
  .hero-pitch { width: 96px; height: 126px; }
  .cards { grid-template-columns: 1fr; }
  .stat-strip { grid-template-columns: 1fr 1fr; }
  .sim-grid { grid-template-columns: 1fr 1fr; }

  /* Pastilles de note et cartes de recommandation : pleine largeur, sans quoi
     elles tombent sous le seuil du pouce. */
  .note-opt { flex: 1 1 auto; min-width: 44px; }
  .note-opt span { min-height: 44px; }
  .reco-opt { flex-basis: 100%; }
}

/* Les moyennes se dessinent désormais en ANNEAUX (voir plus haut, section
   « Bandeau de synthèse des rapports »). La règle horizontale 1→4 qu'il y avait
   ici a été retirée avec son balisage : elle posait le « bon » à gauche, ce
   qu'il fallait légender sous le dessin à chaque fois, et son cadre blanc
   faisait une carte dans la carte une fois posée dans le bandeau. */

/* ── Rapport : description ET conclusion sur la carte ───────────────────────
   Les deux textes sont montrés, chacun étiqueté et borné à trois lignes. Avant,
   la carte n'en affichait qu'un : la conclusion disparaissait dès qu'il y avait
   une description. */
.fx-textes { display: grid; gap: 2px; }
.fx-quoi {
  display: block; margin-bottom: 1px;
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700;
  text-transform: uppercase; letter-spacing: .6px; font-size: 10.5px;
  color: var(--muted);
}
.fx-ccl { border-left: 2px solid var(--line-2); padding-left: 9px; }
.fx-ccl .fx-quoi { color: var(--night); }

/* ── « Voir les N autres rapports » ─────────────────────────────────────────
   Les rapports au-delà des deux plus récents restent dans le DOM (donc
   trouvables par la recherche du navigateur), seulement masqués.
   ⚠️ `.rap` n'a pas de `display` explicite, mais `[hidden]` sur un élément
   qu'une autre règle passerait en flex/grid cesserait d'agir : on l'écrit. */
.rap[hidden] { display: none; }
.rap-plus {
  display: block; width: 100%; margin-top: 10px; padding: 11px 14px;
  background: var(--surface); border: 1px dashed var(--line-2);
  border-radius: var(--radius); cursor: pointer;
  font-family: 'Barlow Condensed', sans-serif; font-weight: 600;
  text-transform: uppercase; letter-spacing: .7px; font-size: 12px;
  color: var(--night); transition: border-color .15s, background .15s;
}
.rap-plus:hover { border-color: var(--night); background: var(--surface); }
.rap-plus:focus-visible { outline: 2px solid var(--night); outline-offset: 2px; }

/* ── Barre de navigation, écrans étroits ───────────────────────────────────
   La zone compte (pastille + nom + Déconnexion) réclame ~215 px et ne défile
   pas : sous 560 px elle ne laisserait plus qu'une poignée de pixels à la
   bande d'onglets, qui se comprime pour tout le monde. Le mot « Scouting »
   part donc en premier — la pastille ⚽ reste, et elle porte toujours le lien
   vers l'accueil. Placé après le dernier bloc 720 px : voir le commentaire du
   bloc mobile plus haut et `test_champs_a_16px_sur_mobile`. */
@media (max-width: 560px) {
  .brand .libelle { display: none; }
  .brand { margin-right: 6px; }
  .nav-compte { margin-left: 8px; padding-left: 8px; gap: 6px; }
  /* Le libellé quitte l'ÉCRAN, pas l'arbre d'accessibilité : mêmes propriétés
     que `.sr-only`. Un bouton dont l'icône seule reste doit garder son nom. */
  .nav-logout-mot {
    position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
    overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
  }
  .nav-logout button { padding: 0 9px; gap: 0; }
}

/* ── Match en direct (players/match_live.html) ───────────────────────────────
   Ouverte depuis le lien envoyé par le bot Telegram, au bord du terrain :
   nativement en une colonne, cibles tactiles généreuses. Le champ de note
   hérite déjà du `textarea { font-size: 16px }` du bloc 720 px ci-dessus (pas
   besoin d'un nouveau bloc ici — cf. son commentaire sur ce qui doit rester
   le DERNIER bloc 720 px du fichier). */
@media (max-width: 900px) {
  /* Le rail vertical (56 px, cf. bloc « MOBILE ET TABLETTE » plus bas) mord
     sur les deux terrains déjà serrés côte à côte sous 900 px. Cette page se
     consulte en plein match, rarement pour naviguer ailleurs — le rail cède
     sa place plutôt que de grignoter la largeur des terrains. */
  body.ml-page { padding-left: 0; }
  body.ml-page .nav { display: none; }

  /* Bandeau de titre : « Match en direct » ne dit rien que l'écran ne dise
     déjà (le scout vient d'ouvrir le lien du bot) — retiré du rendu visuel
     sur téléphone (il reste au DOM, cf. `.ml-titre-plein`, pour un lecteur
     d'écran) pour laisser toute la hauteur aux deux terrains, ce qui manque
     le plus (retour de la cellule, 22/09/2026). Le nom des deux clubs reste
     seul, resserré. */
  body.ml-page .ml-titre-plein {
    position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
    overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
  }
  body.ml-page .page-head { margin-bottom: 6px; gap: 8px; }
  body.ml-page .page-head .count { font-size: 15px; }
  body.ml-page .ml-niveaux-repli { margin: -4px 0 8px; }

  /* Barre de validation sur UNE ligne (retour de la cellule, 22/09/2026) :
     laisser les trois gestes s'empiler sur deux lignes coûtait une rangée
     entière aux terrains. Jamais de retour à la ligne — un défilement
     horizontal si les trois ne tiennent pas plutôt qu'un empilement, cibles
     tactiles intactes (aucun bouton rapetissé sous le plancher 34-44 px). */
  body.ml-page .ml-validation-barre {
    margin-bottom: 6px; flex-wrap: nowrap; overflow-x: auto;
    -webkit-overflow-scrolling: touch; padding-bottom: 2px;
  }
  body.ml-page .ml-validation-barre > * { flex: 0 0 auto; }
  body.ml-page .ml-validation-barre::-webkit-scrollbar { display: none; }

  /* Plus un seul joueur à mapper nulle part sur la page (`tout_identifie`,
     views.match_live) : la cellule veut alors les DEUX terrains à l'écran,
     pas les résumés repliés « Titulaires en liste »/« Remplaçants » au-
     dessus/dessous. On ne masque QUE le résumé, jamais le `<details>`
     lui-même (`display:none` sur lui bloquerait aussi son contenu, y
     compris la carte de note qu'un tap sur le terrain doit pouvoir
     ouvrir en surcouche) — le JS force `.open` sur ce même `<details>`
     avant d'afficher la carte, ça continue de fonctionner à l'identique. */
  body.ml-page.ml-tout-identifie .ml-banc > summary { display: none; }

  /* Les terrains DESCENDENT JUSQU'EN BAS de l'écran (retour de la cellule,
     22/09/2026 : « en largeur c'est très bien, agrandis en hauteur ») —
     `.ml-pitch` n'est plus contraint par son `aspect-ratio` sur cette page,
     il grandit pour occuper tout ce qu'il reste sous le bandeau de
     validation. Toute la colonne de `<body>` jusqu'à `.ml-rangee-equipes`
     devient un empilement flex sur `100dvh` (jamais `100vh`, qui compte
     l'espace derrière la barre d'adresse mobile et ferait déborder la page)
     pour que le flex-grow ait une hauteur réelle à distribuer — sans ça,
     `flex: 1` n'a rien à donner, `<body>` ne fait que la hauteur de son
     contenu comme n'importe quelle page. `preserveAspectRatio="none"` sur le
     SVG du terrain (déjà en place) étire proprement les traits du terrain
     à la nouvelle hauteur, sans letterboxing ni recadrage ; les jetons
     joueurs sont déjà positionnés en `%`, ils suivent sans aucun JS à
     toucher. `min-height: 0` à chaque étage est OBLIGATOIRE — un enfant
     flex refuse par défaut de rétrécir sous la hauteur de son contenu
     (même piège que `min-width: 0` déjà documenté pour les colonnes). */
  body.ml-page { display: flex; flex-direction: column; min-height: 100dvh; }
  body.ml-page .wrap {
    display: flex; flex-direction: column; flex: 1 1 auto; min-height: 0;
  }
  body.ml-page .ml-rangee-equipes { flex: 1 1 auto; min-height: 0; align-items: stretch; }
  body.ml-page .ml-colonne-equipe { display: flex; flex-direction: column; min-height: 0; }
  body.ml-page .ml-pitch { flex: 1 1 auto; aspect-ratio: unset; min-height: 260px; }

  /* Largeur ET hauteur maximales pour les deux terrains (retour de la
     cellule, 22/09/2026, trois passes de resserrement le même jour) : les
     marges de page et l'espace entre les deux colonnes sont la seule
     largeur/hauteur qui ne sert pas le terrain lui-même. `.wrap` garde son
     padding pour le reste de la page (bandeau, boutons) — seule la RANGÉE
     des terrains déborde jusqu'au bord de l'écran via une marge négative,
     le geste de tri des jetons garde juste assez d'air entre les deux avec
     un `gap` de 2px. */
  body.ml-page .wrap { padding: 6px 4px; }
  body.ml-page .ml-rangee-equipes { gap: 2px; margin-left: -4px; margin-right: -4px; }
}
.ml-club { margin-bottom: 22px; }
.ml-club-nom {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700;
  text-transform: uppercase; letter-spacing: .6px; font-size: 15px;
  color: var(--night); margin: 0 0 8px;
}
/* Sous-titre Gardien/Défense/Milieu/Attaque au-dessus de chaque paquet de
   petites cases (cf. `_grouper_par_ligne`) — discret, ce n'est qu'un repère
   de lecture, pas une nouvelle section. */
.ml-ligne-titre {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700;
  text-transform: uppercase; letter-spacing: .5px; font-size: 11px;
  color: var(--muted); margin: 10px 0 4px;
}
.ml-ligne-titre:first-of-type { margin-top: 2px; }

.ml-liste { display: grid; gap: 8px; }
.ml-joueur {
  background: var(--surface); border: 1px solid var(--line-2);
  border-radius: var(--radius); padding: 2px 14px;
}
.ml-joueur summary {
  display: flex; align-items: center; justify-content: space-between;
  gap: 10px; padding: 12px 0; min-height: 44px; cursor: pointer;
  list-style: none;
}
.ml-joueur summary::-webkit-details-marker { display: none; }

/* « Petites cases » : grille de cartes compactes (nom + poste) plutôt qu'une
   liste d'une colonne — le terrain au-dessus fait déjà office de vue
   d'ensemble, cette grille sert à ATTEINDRE vite la note d'un joueur précis.
   Refermée, une carte tient dans sa cellule ; ouverte, elle reprend toute la
   largeur de la grille pour laisser respirer le formulaire de note.
   ⚠️ Cette grille vit dans une COLONNE ÉTROITE (une équipe = une moitié
   d'écran sur téléphone, cf. `.ml-colonne-equipe`) : une case minimale à
   112px ne laissait plus de place qu'à UNE seule par ligne, exactement
   l'effet « liste » qu'elle devait éviter. 84px en laisse deux. */
.ml-liste-compacte {
  grid-template-columns: repeat(auto-fill, minmax(84px, 1fr));
  gap: 6px;
}
.ml-liste-compacte .ml-joueur { padding: 0 10px; }
.ml-liste-compacte .ml-joueur[open] { grid-column: 1 / -1; }
.ml-liste-compacte .ml-joueur summary {
  flex-direction: column; align-items: flex-start; gap: 2px;
  padding: 8px 0; min-height: 40px; justify-content: center;
}
.ml-liste-compacte .ml-joueur .ml-poste { font-size: 11.5px; }
.ml-numero {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700; font-size: 13px;
  color: #fff; background: var(--night); border-radius: 999px;
  min-width: 24px; height: 24px; display: inline-flex; align-items: center;
  justify-content: center; padding: 0 6px; flex-shrink: 0;
}
.ml-nom { font-weight: 600; }
.ml-poste { color: var(--muted); font-size: 13px; }
.ml-form { display: grid; gap: 8px; padding: 0 0 14px; }
.ml-form textarea {
  width: 100%; box-sizing: border-box; resize: vertical;
  border: 1px solid var(--line-2); border-radius: var(--radius); padding: 10px 12px;
}
.ml-fiche {
  display: inline-block; margin: 0 0 12px; font-size: 12.5px; color: var(--muted);
}
/* Retirer un « non identifié » qui n'est pas un joueur (staff listé sur la
   feuille de match) — en retrait, un geste plus rare que chercher/mapper. */
.ml-manquant-supprimer {
  display: block; background: none; border: 0; padding: 0; margin: 0 0 12px;
  font-size: 12.5px; color: var(--muted); text-decoration: underline;
  text-underline-offset: 2px; cursor: pointer;
}
.ml-manquant-supprimer:hover, .ml-manquant-supprimer:focus-visible { color: var(--bad); }
/* Poste provisoire d'un non-identifié (cf. .ml-dot-virtuel) : un réglage
   secondaire dans la carte, avant la recherche qui reste l'action principale. */
.ml-manquant-poste-lab {
  display: block; font-size: 12px; color: var(--muted); margin: 0 0 8px;
}
.ml-manquant-poste {
  display: block; width: 100%; box-sizing: border-box; margin-top: 4px;
  border: 1px solid var(--line-2); border-radius: var(--radius); padding: 8px 10px;
  font: inherit; color: var(--night); background: var(--surface);
}
/* Repli famille de club (réserve/jeunes) : le joueur reste groupé avec son
   équipe du jour, cette note dit seulement où il est réellement inscrit. */
.ml-club-reel { margin: -4px 0 8px; font-size: 12px; color: var(--muted); font-style: italic; }
/* Choix du côté (domicile/extérieur) pour un joueur retrouvé mais dont
   l'équipe du jour n'est pas connue — cf. `joueurs_club_errone`. */
.ml-cote-choix { display: flex; gap: 8px; margin: 0 0 12px; flex-wrap: wrap; }
.ml-cote-btn {
  flex: 1 1 auto; min-width: 0; border: 1px solid var(--line-2); border-radius: var(--radius);
  background: var(--surface); padding: 8px 10px; font-size: 13px; cursor: pointer;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.ml-cote-btn:hover, .ml-cote-btn:focus-visible { border-color: var(--night); }

/* Correction DE LA FICHE (Player.club) — distincte du choix de côté ci-dessus
   (qui, lui, ne tranche que pour ce soir) : en retrait visuel, un geste plus
   rare et plus lourd de conséquence (écrit en base). */
.ml-corriger-club { margin: 0 0 12px; padding-top: 8px; border-top: 1px dashed var(--line); }
.ml-corriger-aide { margin: 0 0 6px; font-size: 11.5px; color: var(--muted); }
.ml-corriger-btn {
  border: 1px dashed var(--line-2); border-radius: var(--radius);
  background: none; padding: 6px 9px; font-size: 12px; color: var(--muted);
  cursor: pointer; margin: 0 6px 6px 0;
}
.ml-corriger-btn:hover, .ml-corriger-btn:focus-visible { border-color: var(--night); color: var(--night); }

/* Ce qui a déjà été écrit CE SOIR sur ce joueur (cf. match_live_note, qui
   fusionne) : visible avant de retaper, sinon on ne sait pas si un nouvel
   envoi s'ajoute ou repart de zéro. */
.ml-note-existante {
  margin: 0 0 10px; padding: 8px 10px; border: 1px solid var(--line-2);
  border-radius: var(--radius); background: var(--surface);
  font-size: 12.5px; color: var(--muted);
}
.ml-note-existante span { display: block; margin-top: 2px; color: inherit; white-space: pre-line; }

/* Carte de note EN SURCOUCHE (tap sur le terrain, Suivant/Précédent) — cf.
   le script partagé `mlOuvrirCarteModale` de match_live.html. Sans JS,
   `.ml-joueur--modale` n'est jamais posée : la carte reste un <details>
   normal, en ligne dans sa grille (amélioration progressive). */
.ml-backdrop { position: fixed; inset: 0; background: rgba(10, 14, 10, .6); z-index: 60; }
body.ml-modale-ouverte { overflow: hidden; }
.ml-joueur.ml-joueur--modale {
  position: fixed; z-index: 61; top: 50%; left: 50%; transform: translate(-50%, -50%);
  width: min(480px, 94vw); max-height: 88vh; overflow-y: auto; margin: 0;
  background: var(--surface); border-radius: var(--radius); padding: 18px 18px 20px;
  box-shadow: 0 24px 64px rgba(0, 0, 0, .45);
}
.ml-modale-fermer { display: none; }
.ml-joueur--modale .ml-modale-fermer, .ml-bilan .ml-modale-fermer {
  display: flex; position: absolute; top: 10px; right: 10px; width: 30px; height: 30px;
  align-items: center; justify-content: center; border: none; background: transparent;
  font-size: 16px; line-height: 1; color: var(--muted); cursor: pointer; border-radius: 999px;
}
.ml-joueur--modale .ml-modale-fermer:hover, .ml-joueur--modale .ml-modale-fermer:focus-visible {
  color: var(--night); background: var(--line-2);
}
/* Le bandeau du bilan est sur --night (cf. .ml-bilan-tete plus bas) : le ✕
   reprend l'encre claire de ce bandeau, pas celle des autres surcouches. */
.ml-bilan .ml-modale-fermer { color: var(--on-night); }
.ml-bilan .ml-modale-fermer:hover, .ml-bilan .ml-modale-fermer:focus-visible {
  color: var(--night); background: var(--sand);
}

/* Remplacement (cf. `.ml-remplacer-btn`, match_live.html) : repliée par
   défaut, un geste plus rare que noter — ne doit pas concurrencer le
   formulaire de note pour l'attention. */
.ml-remplacement { margin: 10px 0 0; }
.ml-remplacement > summary {
  cursor: pointer; font-weight: 600; padding: 8px 0; color: var(--muted); list-style: none;
}
.ml-remplacement > summary::-webkit-details-marker { display: none; }
.ml-remplacement-erreur {
  font-size: 12.5px; color: var(--bad, #B3261E); margin: -6px 0 8px; font-weight: 600;
}
.ml-remplacement-aide { font-size: 12.5px; color: var(--muted); margin: 0 0 8px; }
.ml-remplacer-btn {
  border: 1px solid var(--line-2); border-radius: var(--radius); background: var(--surface);
  padding: 8px 10px; font-size: 13px; cursor: pointer; text-align: left;
}
.ml-remplacer-btn:hover, .ml-remplacer-btn:focus-visible { border-color: var(--night); }
.ml-remplacement-minute-lab {
  display: block; font-size: 12px; color: var(--muted); margin: 0 0 10px; max-width: 120px;
}
.ml-remplacement-minute {
  display: block; width: 100%; box-sizing: border-box; margin-top: 4px;
  border: 1px solid var(--line-2); border-radius: var(--radius); padding: 8px 10px;
  font: inherit; color: var(--night); background: var(--surface);
}

/* État vide de match_live.html (arrivée sur "Match en direct" avant tout
   upload) — design retenu après design-shotgun (22/09/2026, variante "carte
   centrée"). Lecture directe par DeepSeek Vision, cf. views.match_live_photo. */
.ml-photo-vide {
  display: flex; flex-direction: column; align-items: center; text-align: center;
  gap: 0; padding: 36px 20px; max-width: 360px; margin: 0 auto;
}
.ml-photo-icone {
  /* Neutre, pas de sable ici : le sable reste réservé au geste ACTIF
     (`.ml-photo-cta` ci-dessous), jamais une décoration d'icône. */
  width: 64px; height: 64px; border-radius: 50%; background: var(--line);
  color: var(--night); display: flex; align-items: center; justify-content: center;
  margin-bottom: 18px;
}
.ml-photo-icone .ic { width: 30px; height: 30px; }
.ml-photo-titre {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700; font-size: 20px;
  margin: 0 0 8px; color: var(--night);
}
.ml-photo-texte { margin: 0 0 22px; color: var(--muted); font-size: 14px; line-height: 1.5; }
.ml-photo-form { display: flex; flex-direction: column; align-items: center; gap: 10px; width: 100%; }
.ml-photo-cta {
  display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  width: 100%; max-width: 280px; background: var(--sand); color: var(--night);
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700; font-size: 15px;
  padding: 13px 20px; cursor: pointer;
}
.ml-photo-cta:hover { background: var(--sand-2); }
.ml-photo-cta .ic { width: 18px; height: 18px; }
/* Le vrai <input> reste focusable au clavier (`.sr-only`, jamais display:none) ;
   c'est SON focus qu'on reporte visuellement sur l'étiquette-bouton. */
#ml-photo-input:focus-visible + .ml-photo-cta { outline: 2px solid var(--night-2); outline-offset: 2px; }
.ml-photo-envoyer { color: var(--muted); background: none; border: 1px solid var(--line-2); }
.ml-photo-chosen { margin: 0; font-size: 13px; color: var(--ink); background: var(--line);
  border-radius: var(--radius); padding: 6px 10px; }
.ml-photo-spinner {
  margin: 0; display: flex; align-items: center; gap: 8px; font-size: 13px; color: var(--muted);
}
/* `display:flex` ci-dessus l'emporterait sinon sur le `display:none` que le
   navigateur pose par défaut pour [hidden] (même spécificité, piège déjà
   rencontré sur ce projet) — sans cette règle le spinner tourne en boucle dès
   le chargement de la page, avant même d'avoir choisi une photo. */
.ml-photo-spinner[hidden] { display: none; }
.ml-photo-dot {
  width: 14px; height: 14px; border-radius: 50%; border: 2px solid var(--line-2);
  border-top-color: var(--night-2); animation: ml-photo-spin .8s linear infinite; flex: none;
}
@media (prefers-reduced-motion: reduce) { .ml-photo-dot { animation: none; } }
@keyframes ml-photo-spin { to { transform: rotate(360deg); } }

/* ── Choisir un match (29/10/2026) ─────────────────────────────────────────
   Remplace les deux parcours en pastilles (date → pays → championnat →
   match, et l'archive) : UNE recherche, des onglets de jour, la liste des
   matchs groupés par championnat. Le sable ne marque que l'onglet ACTIF et
   « Compo prête » (ce sur quoi un appui aboutit) — jamais une décoration. */
.ml-choix {
  max-width: 760px; margin: 8px auto 48px; padding-top: 28px;
  border-top: 1px solid var(--line-2);
}
.ml-choix-titre {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700; font-size: 22px;
  text-transform: uppercase; letter-spacing: .4px; color: var(--ink); margin: 0;
}
.ml-choix-sous { margin: 4px 0 16px; font-size: 14px; color: var(--muted); }

.ml-choix-recherche { position: relative; margin: 0 0 12px; }
.ml-choix-loupe {
  position: absolute; left: 14px; top: 50%; transform: translateY(-50%);
  width: 18px; height: 18px; color: var(--muted); pointer-events: none;
}
.ml-choix-recherche input[type=search] {
  width: 100%; box-sizing: border-box; min-height: 48px; padding: 0 14px 0 42px;
  font: inherit; font-size: 16px; color: var(--ink); background: var(--surface);
  border: 1px solid var(--line-2); border-radius: var(--radius);
}
.ml-choix-recherche input[type=search]:focus {
  outline: none; border-color: var(--night); box-shadow: 0 0 0 3px var(--sand-voile);
}

/* Onglets de jour : un segment, l'actif en nuit + lettrage sable. */
.ml-choix-jours {
  display: flex; border: 1px solid var(--line-2); border-radius: var(--radius);
  background: var(--surface); overflow: hidden;
}
.ml-choix-jour, .ml-choix-date {
  flex: 1 1 0; display: flex; align-items: center; justify-content: center; gap: 6px;
  min-height: 44px; padding: 0 10px; border-left: 1px solid var(--line);
  font-family: 'Barlow Condensed', sans-serif; font-weight: 600; font-size: 15px;
  text-transform: uppercase; letter-spacing: .5px; color: var(--ink-2);
  text-decoration: none; white-space: nowrap;
}
.ml-choix-jour:first-child { border-left: 0; }
.ml-choix-jour:hover { background: var(--paper); color: var(--ink); }
.ml-choix-jours .est-actif { background: var(--night); color: var(--sand); }
.ml-choix-date { flex: 1.4 1 0; margin: 0; }
.ml-choix-date .ic { width: 16px; height: 16px; flex: none; }
.ml-choix-date input[type=date] {
  min-width: 0; width: 100%; max-width: 150px; border: 0; background: transparent;
  font-family: 'Barlow', sans-serif; font-size: 16px; color: inherit;
  color-scheme: light;
}
.ml-choix-jours .ml-choix-date.est-actif input[type=date] { color-scheme: dark; }

.ml-choix-bandeau {
  display: flex; flex-wrap: wrap; justify-content: space-between; gap: 4px 16px;
  margin: 14px 0 6px; font-size: 13px; color: var(--muted);
}
.ml-choix-bandeau p { margin: 0; }
.ml-choix-contexte::first-letter { text-transform: uppercase; }
.ml-choix-bandeau a { color: var(--ink); }
.ml-choix-bandeau strong { color: var(--ink); font-weight: 600; }
.ml-choix-alerte {
  margin: 8px 0; padding: 8px 12px; font-size: 13px; color: var(--ink-2);
  border-left: 3px solid var(--sand-2); background: var(--surface);
}
.ml-choix-vide { margin: 18px 0; font-size: 14px; color: var(--muted); }
.ml-choix-vide a { color: var(--ink); }

/* Un championnat = un groupe repliable ; sa liste = des lignes, pas des cartes. */
.ml-choix-groupe { border-bottom: 1px solid var(--line-2); }
.ml-choix-groupe-tete {
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  min-height: 46px; margin: 0; padding: 0 2px; cursor: pointer; list-style: none;
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700; font-size: 15px;
  text-transform: uppercase; letter-spacing: .4px; color: var(--ink);
}
h3.ml-choix-groupe-tete { cursor: default; }
.ml-choix-groupe-tete::-webkit-details-marker { display: none; }
details.ml-choix-groupe > .ml-choix-groupe-tete::after {
  content: ""; flex: none; width: 7px; height: 7px; margin-left: 4px;
  border-right: 2px solid var(--muted); border-bottom: 2px solid var(--muted);
  transform: rotate(-45deg); transition: transform .15s;
}
details.ml-choix-groupe[open] > .ml-choix-groupe-tete::after { transform: rotate(45deg); }
.ml-choix-groupe-tete > span:first-child { flex: 1; min-width: 0; }
.ml-choix-pays { color: var(--muted); margin-right: 4px; }
.ml-choix-compte {
  font-family: 'Barlow', sans-serif; font-weight: 600; font-size: 12px;
  color: var(--muted); background: var(--line); border-radius: 99px; padding: 2px 8px;
}

.ml-choix-liste { list-style: none; margin: 0 0 8px; padding: 0; }
.ml-choix-match {
  display: grid; grid-template-columns: 52px minmax(0, 1fr) auto; align-items: center;
  gap: 2px 12px; min-height: 48px; padding: 6px 10px; border-radius: var(--radius);
  color: var(--ink); text-decoration: none;
}
.ml-choix-match:hover { background: var(--surface); box-shadow: inset 0 0 0 1px var(--line); }
.ml-choix-match:focus-visible { outline: 2px solid var(--night); outline-offset: 1px; }
.ml-choix-match.est-sans-compo { color: var(--muted); }
.ml-choix-heure { font-size: 14px; color: var(--muted); }
.ml-choix-equipes { min-width: 0; display: flex; flex-direction: column; }
.ml-choix-affiche {
  font-size: 15px; font-weight: 500; white-space: nowrap; overflow: hidden;
  text-overflow: ellipsis;
}
.ml-choix-score {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700; font-size: 16px;
  margin: 0 4px;
}
.ml-choix-ligue { font-size: 12px; color: var(--muted); }
.ml-choix-etat {
  display: inline-flex; align-items: center; gap: 4px; justify-self: end;
  font-size: 13px; color: var(--muted); white-space: nowrap;
}
.ml-choix-pret { color: var(--sand-fg); font-weight: 600; }
.ml-choix-fleche { width: 16px; height: 16px; color: var(--sand-fg); transform: rotate(180deg); }
.ml-choix-groupe[hidden], .ml-choix-liste li[hidden], .ml-choix-vide[hidden] { display: none; }

@media (max-width: 560px) {
  .ml-choix { padding-top: 22px; }
  .ml-choix-jours { flex-wrap: wrap; }
  .ml-choix-jour { flex-basis: 33%; }
  .ml-choix-date { flex-basis: 100%; border-left: 0; border-top: 1px solid var(--line); }
  .ml-choix-match { grid-template-columns: 44px minmax(0, 1fr); padding: 8px 6px; }
  .ml-choix-etat { grid-column: 2; justify-self: start; font-size: 12.5px; }
}

/* Barre de validation (joueurs / compo / fin de match) — trois gestes
   purement visuels, cf. le script de match_live.html. */
.ml-validation-barre {
  display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin: 0 0 8px;
}
.ml-valide-msg {
  margin: 0 0 18px; padding: 8px 12px; border-radius: var(--radius); font-size: 13px;
  border: 1px solid var(--line-2); background: var(--surface);
}
.ml-valide-msg-ok { border-color: var(--ok, #157A43); color: var(--ok, #157A43); }
.ml-valide-msg-alerte { border-color: var(--sand-2); color: var(--sand-fg); }

/* Bilan de fin de match (`_ml_bilan.html`) : même fond partagé et même
   registre visuel que la carte de note (`.ml-joueur--modale`), en plus
   large pour accueillir la liste des rapports du soir.

   Refonte du 21/09/2026 (retour de la cellule : « difficile de comprendre
   qui est validé ou non, et si ça part bien en base ») — piste B retenue
   sur 4 maquettes concurrentes (cf. artifact « Bilan de Match ») : bandeau
   nuit + DEUX groupes (à compléter / déjà noté). Une carte enregistrée migre
   physiquement du premier groupe au second au rechargement qui suit — ce
   déplacement, plus visible qu'un message de succès générique (`{% if
   messages %}` en haut de page, caché derrière la surcouche), sert de
   confirmation. */
.ml-bilan {
  position: fixed; z-index: 61; top: 50%; left: 50%; transform: translate(-50%, -50%);
  width: min(720px, 94vw); max-height: 88vh; overflow: hidden;
  background: var(--surface); border-radius: var(--radius);
  box-shadow: 0 24px 64px rgba(0, 0, 0, .45);
  display: flex; flex-direction: column;
}
.ml-bilan[hidden] { display: none; }
.ml-bilan-tete {
  flex: 0 0 auto; position: relative; background: var(--night); color: var(--on-night);
  padding: 16px 44px 14px 20px; border-bottom: 3px solid var(--sand);
}
.ml-bilan-titre { margin: 0 0 4px; font-size: 18px; }
.ml-bilan-sous { margin: 0; font-size: 12.5px; color: var(--night-mut); }
.ml-bilan-corps { flex: 1 1 auto; overflow-y: auto; padding: 16px 20px 20px; }
.ml-bilan-zone-titre {
  display: flex; align-items: center; gap: 8px; margin: 16px 0 10px;
  font-size: 12.5px; font-weight: 700; text-transform: uppercase; letter-spacing: .05em;
  color: var(--muted);
}
.ml-bilan-zone-titre:first-child { margin-top: 0; }
.ml-bilan-zone-n {
  background: var(--night); color: var(--on-night); border-radius: 999px; min-width: 20px;
  height: 20px; display: inline-flex; align-items: center; justify-content: center;
  font-size: 11.5px; padding: 0 6px;
}
.ml-bilan-zone-titre-attente { color: var(--sand-fg); }
.ml-bilan-zone-titre-attente .ml-bilan-zone-n { background: var(--sand); color: var(--night); }
.ml-bilan-zone-titre-ok .ml-bilan-zone-n { background: var(--ok-fg, #157A43); }
.ml-bilan-liste { display: grid; gap: 12px; }
.ml-bilan-liste-ok { border-top: 1px dashed var(--line-2); padding-top: 4px; }
.ml-bilan-ligne {
  border: 1px solid var(--line-2); border-left: 4px solid var(--sand-2);
  border-radius: var(--radius); padding: 12px 14px;
  transition: background .5s, border-color .3s;
}
.ml-bilan-ligne-ok {
  border-left-color: var(--success-line, #B9E0C9);
  background: color-mix(in srgb, var(--success-bg, #E7F4EC) 35%, var(--surface));
}
.ml-bilan-entete { display: flex; align-items: flex-start; justify-content: space-between; gap: 10px; margin-bottom: 6px; }
.ml-bilan-qui { display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; }
.ml-bilan-entete .ml-poste { font-size: 12.5px; }
.ml-bilan-chip {
  display: inline-flex; align-items: center; gap: 4px; font-size: 10.5px; font-weight: 700;
  text-transform: uppercase; letter-spacing: .03em; padding: 2px 8px; border-radius: 999px;
  white-space: nowrap; flex: 0 0 auto;
}
.ml-bilan-chip-attente { background: var(--sand-voile); color: var(--sand-fg); border: 1px solid var(--sand-2); }
.ml-bilan-chip-ok { background: var(--success-bg, #E7F4EC); color: var(--success-fg, #14663C); border: 1px solid var(--success-line, #B9E0C9); }
.ml-bilan-texte { margin: 0 0 8px; font-size: 13.5px; white-space: pre-line; }
/* Formulaire de note actuelle/potentielle/recommandation, inline dans
   chaque ligne du bilan (`match_live_bilan_note`) — pas `.ml-form` : sa
   grille/padding ne conviennent pas à cette rangée de petits contrôles. */
.ml-bilan-form { margin: 0 0 8px; }
.ml-bilan-champs { display: flex; align-items: flex-end; gap: 10px; flex-wrap: wrap; }
.ml-bilan-champs label {
  display: block; font-size: 11.5px; color: var(--muted); font-weight: 600;
}
.ml-bilan-champs select {
  display: block; margin-top: 4px; border: 1px solid var(--line-2); border-radius: var(--radius);
  padding: 6px 8px; font: inherit; color: var(--night); background: var(--surface);
}
/* Carte qui vient d'être enregistrée (JS, retour de `match_live_bilan_note`
   via le fragment `#ml-bilan-<oid>`) : un anneau qui pulse et s'efface —
   RGBA figé de `--ok` (un keyframe ne peut pas lire `color-mix` avec alpha
   variable), la confirmation la plus concrète qu'on puisse donner sans
   passer par un message texte facilement raté. */
@keyframes ml-bilan-pulse { 0% { box-shadow: 0 0 0 0 rgba(30,158,90,.45); }
  70% { box-shadow: 0 0 0 10px rgba(30,158,90,0); } 100% { box-shadow: 0 0 0 0 rgba(30,158,90,0); } }
.ml-bilan-ligne.ml-bilan-vient-d-etre-note { animation: ml-bilan-pulse 1.4s ease-out; }
@media (prefers-reduced-motion: reduce) {
  .ml-bilan-ligne.ml-bilan-vient-d-etre-note { animation: none; outline: 2px solid var(--ok, #1E9E5A); outline-offset: 2px; }
}

/* Joueurs non reconnus par la photo : recherche pour mapper à une fiche
   existante plutôt que d'en recréer une en double. */
.ml-manquants .ml-joueur { padding-bottom: 12px; }
/* Joueur retrouvé mais de côté inconnu (cf. `joueurs_club_errone`) : cadre
   ambré, pour qu'on le repère comme une anomalie à vérifier et non comme un
   effectif normal. */
.ml-club-alerte { border: 1px solid var(--sand); border-radius: var(--radius); padding: 12px 14px; }
.ml-club-alerte .ml-club-nom { color: var(--sand-fg, #7A5A1E); }
.ml-recherche-input {
  width: 100%; box-sizing: border-box; border: 1px solid var(--line-2);
  border-radius: var(--radius); padding: 10px 12px; margin-bottom: 6px;
}
.ml-recherche-resultats { display: grid; gap: 4px; }
.ml-recherche-item {
  text-align: left; padding: 9px 12px; border: 1px solid var(--line-2);
  border-radius: var(--radius); background: var(--bg); cursor: pointer; font-size: 13.5px;
}
.ml-recherche-item:hover, .ml-recherche-item:focus-visible { border-color: var(--night); }

/* Une COLONNE PAR ÉQUIPE (terrain, dispositif ET effectif complet ensemble),
   jamais un bloc après l'autre : c'est justement pour comparer les deux
   équipes d'un coup d'œil, de haut en bas, sur le téléphone, que la mise en
   page existe. `min-width: 0` est indispensable sur la colonne flex — sans
   lui un enfant flex refuse de rétrécir sous la largeur de son contenu
   (même piège que la barre de navigation, déjà documenté). */
.ml-rangee-equipes { display: flex; gap: 8px; align-items: flex-start; margin: 8px 0 2px; }
.ml-colonne-equipe { flex: 1 1 0; min-width: 0; }
.ml-club-nom-pitch {
  text-align: center; font-size: 12.5px; margin: 0 0 4px;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}

/* Terrain d'équipe : un point par TITULAIRE sur un emplacement du dispositif
   choisi, même habillage « nuit tracée à la lumière » que le mini-terrain de
   la fiche (.hero-pitch) — le terrain reste de la DONNÉE, pas un décor
   emprunté. */
.ml-pitch {
  position: relative; width: 100%; margin: 0 0 4px;
  aspect-ratio: 100 / 132; border-radius: 14px; overflow: hidden;
  background:
    repeating-linear-gradient(0deg, rgba(224,192,144,.05) 0 20px, rgba(255,255,255,0) 20px 40px),
    linear-gradient(158deg, #2A3A52 0%, #1B2738 58%, #121A26 100%);
  border: 1px solid rgba(224,192,144,.28);
  box-shadow: inset 0 1px 0 rgba(255,255,255,.12),
              inset 0 0 30px rgba(0,0,0,.30), 0 8px 20px rgba(0,0,0,.24);
  /* Sans ça, un glisser tactile fait défiler la page au lieu de déplacer le
     jeton — le geste de repositionnement doit rester dans le terrain. */
  touch-action: none;
}
.ml-pitch .hp-lines { position: absolute; inset: 0; width: 100%; height: 100%; }
.ml-pitch .hp-lines * {
  fill: none; stroke: rgba(224,192,144,.42); stroke-width: 1;
  vector-effect: non-scaling-stroke;
}
.ml-pitch .hp-lines .hp-out { stroke: rgba(224,192,144,.55); }
.ml-pitch .hp-lines .hp-spot { fill: rgba(224,192,144,.55); stroke: none; }

/* ⚠️ BUG RÉEL trouvé le 22/09/2026 (retour de la cellule : « mes deux bulles
   de milieu sont l'une sur l'autre ») : `.ml-dot` centrait via `transform:
   translate(-50%,-50%)` toute sa boîte flex — chip ET étiquette confondus.
   Passer l'étiquette en `row`/`row-reverse` élargit cette boîte (chip + gap
   + nom), et le centrage déplace alors le CHIP LUI-MÊME hors de son point
   réel — les deux relayeurs du 3-5-2/3-4-3 (l'un vers la droite, l'autre
   vers la gauche) glissaient donc l'un vers l'autre jusqu'à se chevaucher,
   malgré des coordonnées correctes dans `utils.FORMATIONS`.
   Fix : le CHIP seul reste dans le flux normal de `.ml-dot` (donc seul à
   déterminer sa taille, donc seul centré par le `translate`) ; l'étiquette
   passe en `position: absolute`, ancrée sur `.ml-dot` (positionné) et
   orientée par côté (`top`/`bottom`/`left`/`right` + `transform` de demi-
   décalage) — elle peut s'étaler dans n'importe quelle direction sans
   jamais déplacer le jeton qu'elle accompagne. */
.ml-dot {
  position: absolute; transform: translate(-50%,-50%); z-index: 2;
  display: flex; align-items: center; justify-content: center;
  background: none; border: none; padding: 0; margin: 0; cursor: pointer;
  touch-action: none; -webkit-tap-highlight-color: transparent;
}
/* Le gardien est TOUJOURS l'emplacement le plus proche du bord (slot « g »,
   y 90-93 % selon le dispositif, cf. `utils.FORMATIONS`) — une étiquette
   SOUS le jeton comme tout le monde débordait donc du terrain, et
   `.ml-pitch` (`overflow: hidden`) la tronquait net. `data-slot-id` suit le
   JOUEUR qui occupe l'emplacement (recalculé par `recalculer()` au
   changement de dispositif ou au glisser-déposer, cf. match_live.html) —
   ce sélecteur reste donc juste quel que soit qui s'y trouve. Étiquette à
   GAUCHE du jeton pour ce seul emplacement (retour de la cellule,
   22/09/2026 : préférée à l'étiquette au-dessus). */
.ml-dot[data-slot-id="g"] .ml-dot-nom { top: 50%; left: auto; right: 100%; transform: translateY(-50%); margin: 0 3px 0 0; }
/* Ailiers du 4-4-2 (« mg »/« md ») et latéraux d'une défense à 4 (« dg »/
   « dd », dans les trois dispositifs 4-3-3/4-2-3-1/4-4-2) : nom au-dessus
   du jeton, demande de la cellule (22/09/2026). Ces quatre identifiants ne
   sont réutilisés dans AUCUN autre dispositif, le sélecteur reste donc
   juste sans scoper par dispositif. */
.ml-dot[data-slot-id="mg"] .ml-dot-nom, .ml-dot[data-slot-id="md"] .ml-dot-nom,
.ml-dot[data-slot-id="dg"] .ml-dot-nom, .ml-dot[data-slot-id="dd"] .ml-dot-nom {
  top: auto; bottom: 100%; margin: 0 0 3px;
}
/* Les deux relayeurs du 3-5-2 ET du 3-4-3 (« mcg »/« mcd ») : nom AU-DESSUS
   du jeton (comme les latéraux/mg-md), mais légèrement dégagé vers son
   propre côté plutôt que centré pile dessus — demande de la cellule
   (22/09/2026, dernier réglage après le fix d'ancrage ci-dessus : « au-
   dessus mais légèrement dégagé sur leur côté pour pas que ce soit l'un
   sur l'autre »). `mcg`/`mcd` existent aussi dans d'autres dispositifs
   (4-3-3, 5-3-2) où ce réglage n'a pas été demandé — le sélecteur passe
   donc par `[data-dispositif]`, posé en JS sur le terrain lui-même (cf.
   match_live.html), jamais par l'identifiant seul. */
.ml-pitch[data-dispositif="3-5-2"] .ml-dot[data-slot-id="mcg"] .ml-dot-nom,
.ml-pitch[data-dispositif="3-4-3"] .ml-dot[data-slot-id="mcg"] .ml-dot-nom {
  top: auto; bottom: 100%; left: 50%; transform: translateX(calc(-50% - 12px)); margin: 0 0 3px;
}
.ml-pitch[data-dispositif="3-5-2"] .ml-dot[data-slot-id="mcd"] .ml-dot-nom,
.ml-pitch[data-dispositif="3-4-3"] .ml-dot[data-slot-id="mcd"] .ml-dot-nom {
  top: auto; bottom: 100%; left: 50%; transform: translateX(calc(-50% + 12px)); margin: 0 0 3px;
}
/* Le numéro de maillot est le repère PRINCIPAL en tribune, pas le poste —
   la position sur le terrain dit déjà le poste (emplacement du dispositif).
   D'où un chiffre grand et gras plutôt qu'une abréviation de poste. */
/* Taille réduite par défaut : les deux terrains vivent côte à côte dans une
   colonne étroite (téléphone), pas seuls sur toute la largeur.

   ⚠️ Retouché le 21/09/2026 (retour de la cellule : « les compos mal
   affichées » sur téléphone) — 34px/8px passait tout juste le plancher de
   cible tactile déjà documenté (34-44px), mais un chiffre à 14px sur un
   disque de 34px et un nom à 8px étaient à la limite du lisible sur un
   vrai écran de téléphone. À 390px de large, chaque colonne d'équipe fait
   ~181px (`.ml-rangee-equipes`, gap 8px) : la marge existe pour un chiffre
   et un nom plus confortables SANS renoncer aux deux terrains côte à côte
   (l'intérêt même de cette mise en page, cf. plus haut). */
.ml-dot-chip {
  position: relative; display: flex; align-items: center; justify-content: center;
  width: 41px; height: 41px; border-radius: 50%; color: var(--night);
  background: radial-gradient(circle at 34% 28%, #ffdf94, var(--sand) 78%);
  border: 2px solid #fff;
  font-family: 'Barlow Condensed', sans-serif; font-weight: 800; font-size: 17px;
  box-shadow: 0 0 0 3px rgba(240,180,50,.18), 0 2px 7px rgba(0,0,0,.4);
}
/* TOUJOURS une seule ligne (demande de la cellule, 22/09/2026 : le repli
   sur deux lignes essayé plus tôt le même jour gênait plus qu'il n'aidait)
   — le chevauchement sur une ligne à 4 défenseurs se règle désormais en
   écartant/étageant les emplacements eux-mêmes (cf. `utils.FORMATIONS`),
   pas en changeant la mise en forme de l'étiquette. `max-width` élargi
   ensuite (52 -> 60px, même jour) : des noms de 8-9 lettres (« ÉDOUARD »,
   « BULATOVIC », « CUISANCE »...) finissaient tronqués en « … » même sans
   ligne à 4 voisine juste à côté — la marge existe désormais aussi grâce
   à l'écartement des emplacements ci-dessus. */
.ml-dot-nom {
  /* Position par défaut : SOUS le jeton, centrée — les variantes
     au-dessus/à-gauche/à-droite ci-dessus ne font que réécrire ces quatre
     propriétés, jamais toucher `.ml-dot` (cf. le bloc plus haut). */
  position: absolute; top: 100%; left: 50%; transform: translateX(-50%);
  margin: 3px 0 0;
  max-width: 60px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  font-size: 8px; font-weight: 700; color: #fff; line-height: 11px;
  padding: 1px 5px; border-radius: 6px; background: rgba(8,22,15,.68);
  box-shadow: 0 1px 3px rgba(0,0,0,.35);
}
.ml-dot.ml-dot-drag { z-index: 5; }
.ml-dot.ml-dot-drag .ml-dot-chip { box-shadow: 0 0 0 4px rgba(240,180,50,.3), 0 6px 16px rgba(0,0,0,.5); }

/* Repère « déjà noté ce match » (cf. `.ml-dot--note`, match_live.html) — vert
   comme les autres confirmations de l'appli (`.ml-valide-msg-ok`), jamais la
   même lumière que le jeton lui-même (Calico y est déjà l'identité du
   joueur, pas un état à lire par-dessus). */
.ml-dot-note {
  position: absolute; top: -3px; right: -3px; width: 15px; height: 15px;
  border-radius: 50%; background: var(--ok, #157A43); color: #fff;
  display: flex; align-items: center; justify-content: center;
  font-size: 10px; font-weight: 800; border: 2px solid #fff; line-height: 1;
}
.ml-deja-note {
  color: var(--ok, #157A43); font-weight: 800; font-size: 13px; margin-left: 2px;
}

/* Jeton PROVISOIRE (non-identifié posté à la main, cf. .ml-manquant-poste) :
   en pointillés, jamais confondu avec un titulaire confirmé — même position
   de terrain, mais l'aplat ambré (identité certaine) cède la place à un
   contour vide (identité encore ouverte). */
.ml-dot-virtuel .ml-dot-chip {
  background: rgba(255,255,255,.12); border: 2px dashed rgba(224,192,144,.85);
  color: var(--sand); box-shadow: none;
}
.ml-dot-virtuel .ml-dot-nom { background: rgba(8,22,15,.5); font-style: italic; }

.ml-pitch-aide { font-size: 12px; color: var(--muted); text-align: center; margin: 0 0 8px; }
.ml-pitch-aide:last-of-type { margin-bottom: 16px; }

.ml-dispo-lab { display: block; margin: 0 0 4px; }
.ml-dispo {
  display: block; width: 100%; box-sizing: border-box; text-align: center;
  font: inherit; font-weight: 700; font-size: 12.5px; color: var(--night);
  border: 1px solid var(--line-2); border-radius: var(--radius);
  padding: 5px 4px; background: var(--surface);
}

/* Au-delà du téléphone, les deux terrains ont la place d'être plus grands —
   la lisibilité du chiffre prime dès que la place le permet. */
@media (min-width: 560px) {
  .ml-dot-chip { width: 46px; height: 46px; font-size: 20px; border-width: 2.5px; }
  .ml-dot-nom { max-width: 78px; font-size: 9.5px; line-height: 14px; padding: 0 6px; }
  .ml-club-nom-pitch { font-size: 15px; }
  .ml-rangee-equipes { gap: 16px; }
  .ml-liste-compacte { grid-template-columns: repeat(auto-fill, minmax(112px, 1fr)); }
}

/* Banc : mêmes cartes que les titulaires, repliées par défaut pour que le
   terrain reste le premier regard — le remplaçant n'a pas de position à lire. */
.ml-banc { margin: 6px 0 0; }
.ml-banc > summary {
  cursor: pointer; font-weight: 700; padding: 10px 0; min-height: 44px;
  display: flex; align-items: center; list-style: none; color: var(--muted);
}
.ml-banc > summary::-webkit-details-marker { display: none; }

/* ═══════════════════════════════════════════════════════════════════════════
   LA BARRE LATÉRALE SUR TÉLÉPHONE ET TABLETTE   (21/09/2026)

   Sous 900 px, la navigation était une bande d'onglets horizontale : elle
   mangeait 60 px de hauteur sur un écran qui en a 700, et les six entrées
   défilaient à l'horizontale, donc les dernières n'existaient pas pour qui ne
   pensait pas à pousser la bande du doigt.

   Elle devient un RAIL, comme sur grand écran, avec deux états :
     · rangé (par défaut) — 56 px, les icônes seules ;
     · ouvert — 236 px, PAR-DESSUS le contenu, avec un voile qui le referme.

   ⚠️ Ouvert, il se pose par-dessus au lieu de pousser la page : décaler le
   contenu de 180 px sur un écran de 390 rendrait illisible ce qu'on est en
   train de consulter, et le geste « je regarde où aller » ne doit pas défaire
   la mise en page de ce qu'on lit.

   Placé APRÈS le bloc « MOBILE ET TABLETTE » — c'est le seul endroit de ce
   fichier où l'ordre joue en notre faveur : ces règles doivent gagner sur
   celles de la bande d'onglets qu'elles remplacent.
   ══════════════════════════════════════════════════════════════════════════ */

@media (max-width: 900px) {
  :root { --rail-mini: 56px; }
  body { padding-left: var(--rail-mini); }

  .nav {
    position: fixed; top: 0; left: 0; bottom: 0; right: auto;
    width: var(--rail-mini); z-index: 60;
    border-bottom: 0; border-right: 2px solid var(--sand);
    overflow: visible;
    background:
      radial-gradient(320px 180px at 0% 0%, rgba(224,192,144,.13), transparent 70%),
      linear-gradient(180deg, var(--night) 0%, var(--night-3) 100%);
    transition: width .22s cubic-bezier(.22,1,.36,1);
  }
  .nav-inner {
    position: relative;
    flex-direction: column; align-items: stretch; justify-content: flex-start;
    height: 100%; max-width: none; gap: 0; padding: 14px 8px 12px;
    overflow: hidden;
  }

  .brand { margin: 0 0 30px; padding: 0; justify-content: center; flex: 0 0 auto; }
  .brand .mark { width: 32px; height: 32px; }
  .brand .libelle { display: none; }

  .nav-links {
    flex-direction: column; margin-left: 0; gap: 3px;
    overflow: visible; min-width: 0;
  }
  .nav-links a {
    height: 44px; padding: 0; gap: 0; justify-content: center;
    border-radius: 9px; border-bottom: 0; margin-bottom: 0; position: relative;
  }
  /* Le libellé reste dans le DOM (il est simplement hors écran) : un lecteur
     d'écran continue de l'annoncer, et il réapparaît quand le rail s'ouvre. */
  .nav-links a > span {
    position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
    overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
  }
  .nav-links a .ic { display: block; width: 21px; height: 21px; opacity: .85; }
  .nav-links a.active { background: var(--night-2); }
  .nav-links a.active .ic { color: var(--sand); opacity: 1; }
  .nav-links a.active::before {
    content: ""; position: absolute; left: -8px; top: 9px; bottom: 9px;
    width: 3px; border-radius: 0 3px 3px 0; background: var(--sand);
  }

  .nav-compte {
    margin: auto 0 0; padding: 12px 0 0; gap: 8px;
    flex-direction: column; align-items: center;
    border-left: 0; border-top: 1px solid rgba(255,255,255,.16);
  }
  .nav-qui { gap: 0; }
  .nav-nom { display: none; }
  .nav-logout { width: 100%; }
  .nav-logout button { width: 100%; padding: 0; min-height: 38px; justify-content: center; }
  .nav-logout-mot {
    position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
    overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
  }

  /* Le bouton : sous le blason, centré. Cible tactile de 40 px. */
  .rail-pli {
    display: inline-flex; position: static; align-self: center;
    width: 40px; height: 40px; margin: -18px 0 14px;
  }

  /* ── Ouvert : le rail passe PAR-DESSUS ───────────────────────────────── */
  .rail-ouvert .nav { width: 236px; box-shadow: 8px 0 28px rgba(9, 14, 22, .38); }
  .rail-ouvert .nav-inner { padding: 16px 12px 14px; }
  .rail-ouvert .brand { justify-content: flex-start; margin-bottom: 22px; }
  .rail-ouvert .brand .mark { width: 36px; height: 36px; }
  .rail-ouvert .brand .libelle { display: inline; }
  .rail-ouvert .nav-links a { justify-content: flex-start; padding: 0 12px; gap: 12px; }
  .rail-ouvert .nav-links a > span {
    position: static; width: auto; height: auto; margin: 0;
    overflow: visible; clip: auto;
  }
  .rail-ouvert .nav-links a.active::before { left: 0; }
  .rail-ouvert .nav-compte { align-items: stretch; padding: 12px 4px 0; }
  .rail-ouvert .nav-nom { display: inline; }
  .rail-ouvert .nav-logout button { justify-content: center; }
  .rail-ouvert .nav-logout-mot {
    position: static; width: auto; height: auto; margin: 0;
    overflow: visible; clip: auto;
  }
  .rail-ouvert .rail-pli {
    position: absolute; top: 18px; right: 10px; margin: 0;
    transform: rotate(180deg);
  }

  /* Le voile : il referme le rail, et il dit qu'on est en surcouche. Il ne
     porte pas de texte — le bouton reste accessible au clavier pour fermer. */
  .rail-voile {
    position: fixed; inset: 0; z-index: 55;
    background: rgba(9, 14, 22, .5);
    border: 0; padding: 0; cursor: pointer;
    animation: voile-entre .18s ease-out;
  }
  @keyframes voile-entre { from { opacity: 0; } to { opacity: 1; } }
  .rail-voile[hidden] { display: none; }
}

@media (max-width: 900px) and (prefers-reduced-motion: reduce) {
  .nav, .rail-voile { transition: none; animation: none; }
}

/* Sous 380 px, le rail mini se resserre encore : sur un petit téléphone,
   56 px de gouttière laissaient trop peu au contenu. */
@media (max-width: 380px) {
  :root { --rail-mini: 50px; }
  .nav-links a .ic { width: 19px; height: 19px; }
}


/* ═══════════════════════════════════════════════════════════════════════════
   LA PAGE LISTES SUR TÉLÉPHONE   (21/09/2026)

   Trois défauts constatés sur un iPhone 13, dans l'ordre où ils gênent :
     1. les dix rayons se CHEVAUCHAIENT — même cause que les onglets de
        recommandation : le conteneur comprimait les segments sous la largeur de
        leur texte, qui ne se coupe pas ;
     2. le sélecteur de compte prenait un écran et demi avant d'atteindre la
        première liste ;
     3. le tableau de dix colonnes imposait un défilement horizontal, c'est-à-
        dire l'un des deux gestes qu'on ne fait jamais sur un téléphone.
   ══════════════════════════════════════════════════════════════════════════ */

/* 1. Les rayons défilent au doigt, ils ne se compriment plus. Dix segments
      courts (« DCD », « MDF ») : le défilement horizontal est ici le bon geste,
      là où l'enveloppement en ferait trois lignes de pastilles. */
nav.listes-onglets {
  flex-wrap: nowrap; overflow-x: auto; scrollbar-width: none;
  -webkit-overflow-scrolling: touch;
}
nav.listes-onglets::-webkit-scrollbar { display: none; }
nav.listes-onglets > a { flex: 0 0 auto; }

/* Au-dessus de 900 px, le club a sa colonne : la ligne sous le nom ferait
   doublon. */
.lg .lg-club { display: none; }
.lg .c-actions { width: 104px; }

@media (max-width: 900px) {
  /* 2. Le sélecteur de compte devient une rangée qui défile : on choisit un
        compte en passant le doigt, au lieu de dérouler quatre cartes pleine
        largeur avant d'atteindre le contenu de la page. */
  .lsel-grille {
    display: flex; flex-wrap: nowrap; gap: 8px;
    overflow-x: auto; scrollbar-width: none; padding-bottom: 2px;
  }
  .lsel-grille::-webkit-scrollbar { display: none; }
  .lsel-carte {
    flex: 0 0 auto; width: auto; min-width: 0; gap: 9px;
    padding: 9px 13px 9px 10px;
  }
  .lsel-av { width: 30px; height: 30px; font-size: 12px; }
  .lsel-nom { font-size: 14px; }
  .lsel-role { font-size: 10.5px; }
  .lsel-n { flex-direction: row; align-items: baseline; gap: 4px; }
  .lsel-n b { font-size: 17px; }
  .lsel-n small { font-size: 10.5px; }

  /* 3. Le tableau tient dans l'écran : on retire la largeur minimale (qui
        imposait le défilement) et on laisse tomber les colonnes que la fiche du
        joueur donne de toute façon en un tap — club, championnat, âge, poste,
        valeur. Restent le rang, le nom, les deux moyennes et les commandes,
        c'est-à-dire ce qui fait la liste : un ORDRE et des noms. */
  .lg .table-scroll { overflow-x: visible; }
  /* ⚠️ `table-layout: fixed` : en disposition automatique, le club sous le nom
     (« Bayern Munich · Bundesliga ») imposait sa largeur à la colonne et
     poussait les commandes hors de la carte. En disposition fixe, les largeurs
     déclarées font loi et c'est le texte qui se coupe — ce qui est le bon
     arbitrage : le rang, la note et les commandes sont la raison d'être de
     cette page, le nom du championnat non. */
  .lg table.grid { min-width: 0; table-layout: fixed; width: 100%; }
  .lg .lg-rang { width: 40px; }
  .lg .c-act { width: 46px; }
  .lg .name { overflow: hidden; }
  .lg .lg-club { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  .lg .c-age, .lg .c-poste, .lg .c-champ, .lg .c-val, .lg .c-club { display: none; }
  /* Le nom ne se coupe plus en deux lignes une fois la place rendue. */
  .lg .name-link { white-space: nowrap; }
  .lg .name-link .first { font-size: .85em; }
  .lg table.grid td, .lg table.grid th { padding: 9px 8px; }
  .lg .name-link { font-size: 15px; }
  /* Le club passe SOUS le nom : l'information reste, elle change de place. */
  .lg .name .lg-club {
    display: block; font-size: 11.5px; color: var(--muted);
    font-weight: 400; margin-top: 1px;
  }
  /* ⚠️ JAMAIS `display:flex` sur un `<td>` : la déclaration remplace
     `display: table-cell`, la cellule sort de la table, et les boutons se
     dessinent PAR-DESSUS le nom du joueur (constaté ici même). On aligne donc
     en ligne, et ce sont les formulaires qui portent le `inline-flex`. */
  .lg-actions { white-space: nowrap; text-align: right; }
  .lg-actions form { display: inline-flex; margin: 0; }
  .lg .c-actions { width: 100px; white-space: nowrap; padding-left: 0; padding-right: 6px; }
  .lg-actions .icon-btn { width: 30px; height: 30px; min-width: 30px; min-height: 30px; }
  .lg-actions { gap: 2px; }
  .lg-tete { flex-wrap: wrap; }
}

@media (max-width: 420px) {
  /* Sur les plus petits écrans, les moyennes passent en une seule colonne :
     deux pastilles côte à côte plus les trois commandes ne tiennent pas. */
  .lg .c-pot { display: none; }
}

/* ── Téléphone (≤ 720 px) : le rayon n'est plus un tableau ─────────────────
   Entre 721 et 900 px (tablette), masquer des colonnes suffit — le tableau
   respire encore. Sous 720, non : quatre colonnes plus trois commandes de
   38 px ne tiennent pas dans 300 px utiles, et tout ce qu'on peut faire est
   rogner l'un ou l'autre. Or les cibles tactiles de 38 px sont un acquis
   (audit du 17/08/2026) qu'on ne reprend pas pour faire entrer une colonne.

   Les éléments du tableau passent donc en blocs : une LIGNE par joueur, le
   rang en pastille à gauche, la note en haut à droite, les commandes sur leur
   propre rangée. Le balisage ne bouge pas — c'est toujours un `<table>`, avec
   ses en-têtes pour les lecteurs d'écran et son ordre de lecture intact. */
@media (max-width: 720px) {
  .lg table.grid { display: block; table-layout: auto; }
  .lg table.grid thead { display: none; }
  .lg table.grid tbody { display: block; }
  .lg table.grid tr {
    display: block; position: relative;
    padding: 12px 12px 10px 56px;
    border-top: 1px solid var(--line); cursor: default;
  }
  .lg table.grid tr:first-child { border-top: 0; }
  /* ⚠️ `height: auto` : le bloc tactile de l'audit d'août pose
     `.grid tbody td { height: 44px }` pour donner de la prise au doigt. Sur une
     VRAIE cellule de tableau, `height` agit comme un minimum ; sur une cellule
     passée en bloc, c'est une hauteur FERME — et la ligne « club · championnat »
     sous le nom se retrouvait coupée par le `overflow: hidden` de la cellule.
     Invisible à l'inspection du DOM (l'élément est bien là, avec sa taille et
     sa couleur), visible seulement à l'écran. */
  .lg table.grid td { display: block; padding: 0; border: 0; height: auto; }
  /* ⚠️ Re-masquer EXPLICITEMENT les colonnes repliées : la règle qui passe les
     cellules en blocs est plus spécifique que le `display: none` posé par
     palier plus haut, et les colonnes masquées réapparaissaient les unes sous
     les autres — âge, poste, club, championnat, valeur, chacun sur sa ligne. */
  .lg table.grid td.c-age, .lg table.grid td.c-poste, .lg table.grid td.c-champ,
  .lg table.grid td.c-val, .lg table.grid td.c-club, .lg table.grid td.c-pot { display: none; }

  .lg .lg-rang { position: absolute; left: 12px; top: 12px; }
  .lg .lg-rang .tnum { width: 30px; height: 30px; }

  /* La note reste en haut à droite : c'est la colonne qu'on balaie du regard
     en descendant une liste classée. */
  .lg .c-act {
    position: absolute; right: 12px; top: 10px; width: auto;
    text-align: right !important;
  }
  .lg .name { padding-right: 52px; }
  .lg .name-link { white-space: normal; font-size: 16px; }
  .lg .lg-club { white-space: normal; }
  .lg .lg-memo { display: block; margin-top: 3px; }

  /* Les commandes prennent leur propre rangée, alignées à gauche sous le nom :
     à droite, le pouce les atteint moins bien sur un grand téléphone. */
  /* Pas de filet au-dessus des commandes : `.lg table.grid td { border: 0 }`
     (même bloc, sélecteur plus spécifique) l'emporterait, et une déclaration
     qui ne peint rien est un piège pour la prochaine lecture. L'espace suffit
     à séparer. */
  .lg .c-actions { width: auto; padding: 10px 0 0; text-align: left; margin-top: 2px; }
  /* ⚠️ Sélecteurs alignés sur ceux qu'ils doivent battre. La règle qui passe
     les cellules en blocs (`.lg table.grid td`) est plus spécifique qu'un
     simple `.lg-actions`, et l'alignement à droite posé pour la tablette porte
     exactement le même sélecteur que celui-ci : à spécificité égale, seul
     l'ordre tranche, et il ne suffisait pas ici. On reprend donc le sélecteur
     complet côté cellule, et on réécrit `.lg-actions` tel quel pour le reste. */
  .lg table.grid td.lg-actions {
    display: flex; gap: 8px; justify-content: flex-start; align-items: center;
  }
  .lg-actions { text-align: left; white-space: normal; }
  .lg-actions .icon-btn { width: 38px; height: 38px; min-width: 38px; min-height: 38px; }
}

/* ── Champs à 16 px : deux oublis, trouvés par le test ────────────────────
   Sous 16 px, iOS ZOOME à la sélection d'un champ et laisse la page décalée —
   le scout doit pincer pour revenir. La règle existait pour les champs des
   filtres ; ces deux-là y avaient échappé parce qu'ils sont déclarés dans des
   sections postérieures (la recherche du bandeau, l'ajout rapide d'un joueur).
   Le garde-fou de `test_mobile` les attrape désormais tous. */
@media (max-width: 720px) {
  .quart-rech input, .nj-vite input { font-size: 16px; }
}


/* ── Photos de joueurs (28-29/09/2026) ──────────────────────────────────────
   Balise `{% avatar p "<taille>" %}` (players_extras) : la photo TM rapatriée
   (cf. players/photos.py), sinon les initiales. Classes toutes neuves, posées
   en fin de fichier : aucune règle plus ancienne ne les dispute.

   Les portraits TM (`header`, 139×181) sont des GROS PLANS déjà serrés sur le
   visage, yeux vers 40 % de la hauteur. Deux leçons du premier essai :
   - sous ~32 px, un visage ne se reconnaît plus : on ne descend pas en dessous
     sur les écrans de lecture (liste, tableau de bord, rapports) ;
   - rien ne se pose SUR la photo (le bandeau de poste masquait la bouche et le
     menton) : l'étiquette passe sous le portrait. */
.avatar {
  display: inline-flex; flex: none; align-items: center; justify-content: center;
  position: relative; overflow: hidden; border-radius: 50%; vertical-align: middle;
  background: var(--night-2); color: var(--night-mut);
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700;
  letter-spacing: .3px; line-height: 1; text-transform: uppercase;
}
.avatar img {
  width: 100%; height: 100%; display: block;
  object-fit: cover; object-position: 50% 28%;
}
/* Filet intérieur : détache le visage du fond blanc sans cadre dur. */
.avatar::after {
  content: ""; position: absolute; inset: 0; border-radius: inherit;
  box-shadow: inset 0 0 0 1px rgba(20,24,26,.12); pointer-events: none;
}
/* Initiales sur fond clair : grises, jamais Calico — la lumière ne décore pas. */
.avatar--vide { background: #EEF1F4; color: var(--muted); }

.avatar--mini  { width: 30px; height: 30px; font-size: 11px; }
.avatar--ligne { width: 38px; height: 38px; font-size: 13px; }
.avatar--liste { width: 40px; height: 40px; font-size: 13px; margin-right: 12px; }
.avatar--ml    { width: 40px; height: 40px; font-size: 13px; }
/* Portrait de fiche : au format de la photo (3:4), jamais rogné en rond. */
.avatar--hero {
  width: 116px; height: 151px; border-radius: 10px;
  background: var(--night-3);
  box-shadow: 0 10px 26px rgba(0,0,0,.35), 0 0 0 1px rgba(224,192,144,.35);
}
.avatar--hero::after { box-shadow: inset 0 -40px 30px -30px rgba(18,26,38,.45); }

/* Liste (tableau) et listes par poste : photo + nom en bloc aligné. */
.name-link:has(.avatar--liste) { display: inline-flex; align-items: center; }

/* ── Portraits verticaux (29/09) ──
   Les ronds glissés au milieu d'une ligne se lisaient comme des pastilles
   collées sur le texte (retour de la cellule). Partout hors liste Joueurs :
   le MÊME langage que la carte et la fiche, qui plaisent — un portrait 3:4
   aux coins doux, posé EN TÊTE, jamais dans le fil du texte, avec le nom et
   son contexte empilés à droite. Trois tailles seulement :
     ps = 34×44 (lignes denses : échéances, suivis, matchs, compo, direct)
     pm = 42×55 (listes par poste, journal du tableau de bord)
     pl = 54×70 (flux des rapports) */
.avatar--ps, .avatar--pm, .avatar--pl { border-radius: 7px; background: var(--night-3); }
.avatar--ps.avatar--vide, .avatar--pm.avatar--vide, .avatar--pl.avatar--vide { background: #EEF1F4; }
.avatar--ps { width: 34px; height: 44px; font-size: 12px; border-radius: 6px; }
.avatar--pm { width: 42px; height: 55px; font-size: 14px; }
.avatar--pl { width: 54px; height: 70px; font-size: 16px; border-radius: 8px; }

/* Bloc d'identité générique : portrait + textes empilés. */
.ident { display: flex; align-items: center; gap: 14px; min-width: 0; }
.ident-txt { min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.ident-txt .name-link { padding: 0; }
.lg .ident-txt .lg-memo { margin-top: 2px; }

/* Tableau de bord, matchs : portrait + texte alignés. */
.avec-avatar { display: inline-flex; align-items: center; gap: 12px; min-width: 0; }
.ligne-reg:has(.avatar) { align-items: center; }
/* Journal du tableau de bord (refonte du 29/09) : photo | qui + verdict + où +
   extrait | quand/par qui. La date n'a plus sa colonne vide à gauche, le
   verdict colle au nom, et TOUTE la ligne ouvre la fiche (lien étiré). */
.entree.entree--v2 {
  grid-template-columns: auto minmax(0, 1fr) auto;
  align-items: center; gap: 0 14px; padding: 11px 16px; cursor: pointer;
}
.entree--v2 .e-corps { min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.entree--v2 .e-l1 { display: flex; align-items: center; gap: 10px; min-width: 0; }
.entree--v2 .qui {
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; line-height: 1.15;
}
.entree--v2 .e-l1 .reco { flex: none; }
.entree--v2 .e-lien::after { content: ""; position: absolute; inset: 0; }
.entree--v2 .e-lien:focus-visible { outline: none; }
.entree--v2:has(.e-lien:focus-visible) { outline: 2px solid var(--night); outline-offset: -2px; }
.entree--v2 .ou { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.entree--v2 .dit {
  grid-column: auto; margin: 3px 0 0; font-size: 13px; color: var(--muted);
  -webkit-line-clamp: 1;
}
.entree--v2 .e-meta {
  display: flex; flex-direction: column; align-items: flex-end; gap: 3px;
  align-self: start; padding-top: 2px; white-space: nowrap;
}
.entree--v2 .e-meta .quand { color: var(--ink-2); font-weight: 700; }
.entree--v2 .e-meta .par-qui {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 600;
  text-transform: uppercase; letter-spacing: .8px; font-size: 11px; color: var(--muted);
}
.entree--v2:hover .qui { text-decoration: underline; }

/* Registres de droite : toute la ligne ouvre la fiche, comme le journal. */
.ligne-reg:has(.avatar) { position: relative; cursor: pointer; }
.ligne-reg:has(.avatar) .nom::after { content: ""; position: absolute; inset: 0; }
/* Flux des rapports : portrait en colonne, tout le corps de la carte à droite. */
.fx-corps--photo { display: flex; align-items: flex-start; gap: 16px; }
.fx-corps--photo > .avatar { margin-top: 2px; }
.fx-corps-txt { flex: 1 1 auto; min-width: 0; }

/* Carte de la liste : un vrai portrait (3:4) à la place de la plaque, le poste
   en étiquette SOUS la photo, à cheval sur son bord — jamais sur le visage. */
.cj-portrait {
  flex: none; align-self: flex-start; position: relative;
  display: flex; flex-direction: column; align-items: center;
  width: 64px; padding-bottom: 9px; margin-right: 4px;
}
/* La carte est une grille dont la 1re colonne vaut 54 px (la plaque) : le
   portrait, plus large, débordait sur le nom. */
.carte-j:has(.cj-portrait) { grid-template-columns: 64px minmax(0, 1fr); column-gap: 14px; }
.cj-portrait .avatar--carte {
  width: 64px; height: 84px; border-radius: 8px; background: var(--night-3);
}
.cj-portrait-poste {
  position: absolute; bottom: 0; left: 50%; transform: translateX(-50%);
  min-width: 34px; padding: 2px 7px; border-radius: 999px; text-align: center;
  font-family: 'Barlow Condensed', sans-serif; font-weight: 800;
  font-size: 12px; line-height: 14px; letter-spacing: .5px;
  background: var(--night); color: var(--sand);
  border: 2px solid var(--surface);
}

/* Match en direct : dans la carte du joueur, pas sur le jeton du terrain (la
   ligne arrière y est déjà à la limite de la lisibilité). Dans la grille
   compacte (résumé en colonne), la photo passe au-dessus du nom. */
.ml-joueur summary .avatar + .ml-nom { margin-right: auto; }
.ml-liste-compacte .ml-joueur summary .avatar--ps { width: 40px; height: 52px; margin-bottom: 4px; }
.ml-bilan-qui { align-items: center; }

@media (max-width: 720px) {
  .avatar--hero { width: 84px; height: 110px; }
  .avatar--liste { width: 34px; height: 34px; margin-right: 9px; }
  .avatar--pl { width: 44px; height: 57px; }
  .fx-corps--photo { gap: 12px; }
  /* Téléphone : la colonne quand/qui passerait sous le nom ; elle rejoint la
     ligne du lieu, en petit, et le verdict reste collé au nom. */
  .entree.entree--v2 { grid-template-columns: auto minmax(0, 1fr); gap: 0 12px; }
  /* L'ancienne règle mobile (`.entree > span:not(.quand)…`) enverrait la
     photo — un <span> — seule sur sa ligne. Elle pèse (0,3,1) : ces sélecteurs
     portent l'élément pour passer devant. */
  article.entree.entree--v2 > span.avatar { grid-column: 1; grid-row: 1 / span 2; align-self: start; }
  article.entree.entree--v2 > div.e-corps { grid-column: 2; grid-row: 1; }
  article.entree.entree--v2 > div.e-meta { grid-row: 2; }
  .entree--v2 .e-meta {
    grid-column: 2; flex-direction: row; gap: 8px; align-items: center; padding-top: 3px;
  }
  .entree--v2 .e-l1 { flex-wrap: wrap; row-gap: 4px; }
}

/* ── Bandeau de fiche : sur UNE ligne (29/09/2026) ─────────────────────────
   Demande de la cellule : avec beaucoup de pastilles (prêt, statut, Comparer,
   Transfermarkt…), `.hero-lead` repliait et le mini-terrain tombait sous la
   photo — le bandeau doublait de hauteur. Les crans se règlent sur la largeur
   du BANDEAU (container query), pas de l'écran : rail ouvert ou rangé, la
   place réelle n'est pas la même.
   - Partout : les commandes reprennent la taille des étiquettes (13 px —
     `.chip-cmd` héritait des 15 px du corps via `font: inherit`).
   - ≥ 900 px de bandeau : rien ne passe à la ligne. En dernier recours, les
     ÉTIQUETTES (championnat, statut, « Prêté par ») se raccourcissent en « … »
     (jamais sous ~7 caractères, texte complet en infobulle) — les commandes
     jamais : « Ex… » ne se lit plus.
   - 900-1199 px : commandes en ICÔNE SEULE (libellé conservé pour les
     lecteurs d'écran, infobulle `title`).
   - < 900 px (tablette, téléphone) : repli d'origine — photo, terrain et
     valeurs ne laissent plus la place d'une ligne de pastilles lisible. */
.hero-top { container: hero-top / inline-size; }
.hero-meta .chip-txt { margin-left: 5px; }
.hero-meta .chip-cmd { font-size: 13px; }
@container hero-top (min-width: 900px) {
  .hero-lead { flex: 1 1 auto; min-width: 0; flex-wrap: nowrap; gap: 18px; }
  .hero-lead > .hero-id { flex: 1 1 auto; min-width: 0; }
  .hero-val { flex: 0 0 auto; }
  .hero-id > .hero-meta { flex-wrap: nowrap; gap: 6px; }
  .hero-id > .hero-meta > * { flex: 0 0 auto; white-space: nowrap; }
  .hero-id > .hero-meta .chip-cmd { padding: 3px 9px; min-height: 28px; }
  .hero-id > .hero-meta > .badge { max-width: 16em; overflow: hidden; text-overflow: ellipsis; }
  .hero-id > .hero-meta > .chip:not(.chip-cmd) {
    flex: 0 1 auto; min-width: 6em; overflow: hidden; text-overflow: ellipsis;
  }
}
@container hero-top (min-width: 900px) and (max-width: 1199px) {
  .hero-id > .hero-meta .chip-cmd { min-width: 32px; justify-content: center; padding: 3px 8px; }
  .hero-id > .hero-meta .chip-txt {
    position: absolute; width: 1px; height: 1px; overflow: hidden;
    clip: rect(0 0 0 0); white-space: nowrap; margin: 0;
  }
  .hero-id > .hero-meta > .tm-link { display: inline-flex; align-items: center; min-height: 28px; }
}


/* ═══════════════════════════════════════════════════════════════════════════
   MISSIONS   (30/09/2026)

   Deux faces du même pilotage : la couverture montre les trous des listes, la
   mission les bouche. Mêmes registres que l'accueil (`.bloc`, portrait en tête
   de ligne, nom en Barlow Condensed) — ce ne sont pas de nouveaux objets, ce
   sont de nouvelles lignes dans les mêmes carnets.
   Couleurs d'état : rouge = jamais vu, ambre = vu il y a longtemps, sable =
   vu une seule fois, nuit = à jour. PAS de vert : il appartient aux
   percentiles StatsBomb, et « à jour » n'est pas un jugement de valeur.
   ══════════════════════════════════════════════════════════════════════════ */
.page-sub a { color: var(--night); font-weight: 600; text-decoration: underline; text-underline-offset: 3px; }

/* Filtre « scout » : une étiquette et un menu, rien de plus. */
.mi-filtre { display: flex; align-items: center; gap: 10px; margin: 0 0 16px; }
.mi-filtre label {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 600; font-size: 13px;
  text-transform: uppercase; letter-spacing: .8px; color: var(--muted);
}
.mi-filtre select {
  font: inherit; font-size: 14px; padding: 7px 10px; min-height: 36px;
  border: 1px solid var(--line-2); border-radius: var(--radius); background: var(--surface);
}

.mi-bloc + .mi-bloc { margin-top: 22px; }
.mi-n { font-weight: 600; color: var(--muted); margin-left: 6px; }

/* Étiquettes d'état — texte TOUJOURS présent, la couleur ne fait que doubler. */
.mi-etat, .cv-etat {
  display: inline-flex; align-items: center; white-space: nowrap;
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700; font-size: 11.5px;
  text-transform: uppercase; letter-spacing: .7px;
  padding: 2px 8px; border-radius: 999px; border: 1px solid transparent;
}
.mi-retard { background: var(--error-bg); color: var(--error-fg); border-color: var(--error-line); }
.mi-faite { background: var(--paper); color: var(--ink-2); border-color: var(--line-2); }
.mi-encours { background: var(--sand-voile); color: var(--sand-fg); border-color: var(--sand); }
a.mi-etat:hover { text-decoration: underline; }

/* ── Une ligne de mission ── */
.mi-ligne {
  display: grid; grid-template-columns: auto minmax(0, 1fr) auto; gap: 4px 14px;
  align-items: start; padding: 12px 16px; border-bottom: 1px solid var(--line);
}
.mi-ligne:last-child { border-bottom: 0; }
.mi-ligne.est-retard { background-image: linear-gradient(90deg, rgba(188,67,45,.07), rgba(188,67,45,0) 55%); }
.mi-l1 { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.mi-nom {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700; font-size: 18px; color: var(--ink);
}
.mi-nom:hover { text-decoration: underline; }
.mi-ou { font-size: 13px; color: var(--ink-2); }
.mi-ou .sep, .fm-titre .sep, .cv-ou .sep { color: var(--line-2); margin: 0 6px; }
.mi-quoi { display: flex; gap: 12px; flex-wrap: wrap; margin-top: 3px;
  font-family: 'Barlow Condensed', sans-serif; font-weight: 600; font-size: 14px; color: var(--night); }
.mi-libre { color: var(--muted); font-weight: 500; }
.mi-consigne, .fm-consigne, .cv-memo {
  margin: 5px 0 0; font-size: 13.5px; line-height: 1.5; color: var(--ink-2);
  max-width: 75ch; white-space: pre-line;
}
.mi-meta { display: flex; flex-direction: column; align-items: flex-end; gap: 8px; }
.mi-qui {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 600; font-size: 12px;
  text-transform: uppercase; letter-spacing: .8px; color: var(--muted);
}
.mi-lien { font-size: 13px; font-weight: 600; color: var(--night); text-decoration: underline; text-underline-offset: 3px; }

/* ── Formulaire « confier une mission » (fenêtre de fiche + couverture) ── */
.mi-form { gap: 12px; }
.mi-grille { display: flex; flex-wrap: wrap; gap: 12px; }
.mi-grille > .rf-field:first-child { flex: 1 1 180px; }
.mi-grille .mi-match { flex: 2 1 220px; }
.mi-form textarea { min-height: 64px; }
.mi-pied { display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap; }
.mi-aide { font-size: 12.5px; color: var(--muted); }

/* ── Bandeau des missions sur la fiche ── */
.fiche-missions { display: flex; flex-direction: column; gap: 8px; margin: 0 0 16px; }
.fm-ligne {
  display: flex; align-items: flex-start; gap: 12px; padding: 11px 14px;
  background: var(--surface); border: 1px solid var(--line); border-left: 3px solid var(--sand);
  border-radius: var(--radius);
}
.fm-ligne.est-retard { border-left-color: var(--bad); }
.fm-ligne > .ic { flex: 0 0 auto; margin-top: 2px; color: var(--sand-fg); }
.fm-corps { flex: 1 1 auto; min-width: 0; }
.fm-titre { margin: 0; font-size: 14px; color: var(--ink); display: flex; align-items: center; flex-wrap: wrap; gap: 0 2px; }
.fm-titre .mi-etat { margin-left: 8px; }

/* Abréviation de poste en pastille nuit (dossier face-à-face). */
.cv-abbr {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 800; font-size: 12px;
  background: var(--night); color: var(--sand); border-radius: 4px; padding: 1px 6px; letter-spacing: .5px;
}

@media (max-width: 900px) {
  .mi-ligne { grid-template-columns: auto minmax(0, 1fr); }
  .mi-meta { grid-column: 2; align-items: flex-start; }
  .mi-filtre select, .mi-form input, .mi-form select, .mi-form textarea { font-size: 16px; }
}

/* ═══════════════════════════════════════════════════════════════════════════
   FACE-À-FACE — sélection et synthèse   (30/09/2026)

   Trois temps sur une page — le poste, les candidats, le dossier. Le dossier
   est une grille : une colonne par candidat, les mêmes rubriques à la même
   hauteur, parce que c'est l'alignement qui fait la comparaison.
   Les citations des rapports sont en sable pâle, comme l'exergue du PDF :
   c'est la parole d'un scout, pas celle de l'IA.
   ══════════════════════════════════════════════════════════════════════════ */
.cm-etape { margin-bottom: 26px; }
.cm-etape-tete { display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap; margin-bottom: 12px; }
.cm-etape-tete .cm-etape-t { margin: 0; }
.cm-etape-t {
  display: flex; align-items: center; gap: 10px; margin: 0 0 12px;
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700; font-size: 18px;
  text-transform: uppercase; letter-spacing: .6px; color: var(--night);
}
.cm-etape-t small { font-family: 'Barlow', sans-serif; font-weight: 400; font-size: 13px; text-transform: none; letter-spacing: 0; color: var(--muted); }
.cm-num {
  display: inline-flex; align-items: center; justify-content: center;
  width: 24px; height: 24px; border-radius: 50%;
  background: var(--night); color: var(--sand); font-size: 14px;
}
.cm-actions { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }

.cm-postes { display: flex; flex-wrap: wrap; gap: 8px; }
.cm-poste {
  display: inline-flex; align-items: center; gap: 8px; min-height: 38px; padding: 6px 12px;
  background: var(--surface); border: 1px solid var(--line-2); border-radius: var(--radius);
  font-size: 14px; font-weight: 600; color: var(--ink);
}
.cm-poste:hover { border-color: var(--night); }
.cm-poste.est-courant { background: var(--night); border-color: var(--night); color: var(--on-night); }

.cm-cands { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: 10px; }
.cm-cand {
  display: flex; align-items: center; gap: 12px; padding: 10px 12px; cursor: pointer;
  background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius);
}
.cm-cand:has(input:checked) { border-color: var(--sand-2); box-shadow: inset 3px 0 0 var(--sand); background: var(--sand-voile); }
.cm-cand:has(input:disabled) { opacity: .55; cursor: not-allowed; }
.cm-cand input { width: 18px; height: 18px; flex: 0 0 auto; accent-color: var(--night); }
.cm-cand-txt { display: flex; flex-direction: column; min-width: 0; }
.cm-cand-txt b { font-family: 'Barlow Condensed', sans-serif; font-size: 16px; color: var(--ink); }
.cm-cand-txt span { font-size: 12.5px; color: var(--ink-2); }
.cm-cand-txt .cm-cand-listes { color: var(--muted); font-size: 12px; }
.cm-choix-pied { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-top: 12px; flex-wrap: wrap; }

.cm-rien { margin: 4px 16px 14px; font-size: 13px; color: var(--muted); line-height: 1.5; }
.cm-erreur { margin: 4px 16px 8px; font-size: 13px; color: var(--error-fg); }

.cm-synthese { padding: 0 16px 14px; }
.cm-synthese[aria-busy="true"] { opacity: .6; }
.cm-synthese .cm-rien, .cm-synthese .cm-erreur { margin-left: 0; margin-right: 0; }
.cm-sous {
  margin: 8px 0 6px; font-family: 'Barlow Condensed', sans-serif; font-weight: 700;
  font-size: 12px; text-transform: uppercase; letter-spacing: .8px; color: var(--ink-2);
}
.cm-point { margin-bottom: 10px; padding-left: 10px; border-left: 3px solid var(--line-2); }
.cm-point.cm-force { border-left-color: var(--night-2); }
.cm-point.cm-reserve { border-left-color: var(--warn); }
.cm-point-t { margin: 0 0 4px; font-size: 14px; font-weight: 600; color: var(--ink); }
.cm-preuve {
  margin: 0; padding: 7px 10px; background: var(--sand-voile); border-radius: 4px;
  font-size: 13px; line-height: 1.5; color: var(--ink-2); font-style: italic;
}
.cm-preuve cite { display: block; margin-top: 3px; font-style: normal; font-size: 11.5px; color: var(--muted); }
.cm-meta { margin: 8px 0 0; font-size: 11.5px; color: var(--muted); }
.cm-rediger { margin: 2px 0 4px; }

@media (max-width: 900px) {
  .cm-cands { grid-template-columns: minmax(0, 1fr); }
}

.lg-comite { margin-left: auto; display: inline-flex; align-items: center; gap: 6px; font-size: 13px; font-weight: 600; color: var(--night); text-decoration: underline; text-underline-offset: 3px; }

/* ═══════════════════════════════════════════════════════════════════════════
   FACE-À-FACE — la comparaison   (30/09/2026, 2e version)

   Demande de la cellule : « comparer en un œil, percutant, visuel, présentable
   à un président ou un coach ». Chaque joueur a SA couleur (--j1 nuit, --j2
   sable foncé, --j3 bleu acier) qui le suit de la carte au radar et à l'en-tête
   de la carte de chaleur. Les percentiles gardent leurs couleurs à eux (vert
   → rouge) : ils disent « fort / faible », pas « qui ».
   ══════════════════════════════════════════════════════════════════════════ */
:root { --j1: #1B2738; --j2: #B08A46; --j3: #3E7CB1; }
.fa-j1 { --j: var(--j1); } .fa-j2 { --j: var(--j2); } .fa-j3 { --j: var(--j3); }

.fa-une { display: grid; grid-template-columns: repeat(var(--n, 3), minmax(0, 1fr)); gap: 14px; align-items: stretch; }
.fa-carte {
  background: var(--surface); border: 1px solid var(--line); border-top: 6px solid var(--j);
  border-radius: var(--radius); box-shadow: var(--shadow); display: flex; flex-direction: column;
}
.fa-tete { display: flex; gap: 12px; align-items: center; padding: 14px 16px 10px; position: relative; }
.fa-id { display: flex; flex-direction: column; min-width: 0; gap: 1px; }
.fa-nom { font-family: 'Barlow Condensed', sans-serif; font-weight: 800; font-size: 23px; line-height: 1.05; color: var(--j); text-transform: uppercase; }
.fa-j2 .fa-nom { color: #7A5A1E; }
.fa-nom:hover { text-decoration: underline; }
.fa-det { font-size: 12.5px; color: var(--ink-2); }
.fa-verdict {
  align-self: flex-start; margin-top: 5px; padding: 3px 9px; border-radius: 999px; border: 1px solid transparent;
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700; font-size: 11.5px; text-transform: uppercase; letter-spacing: .6px;
}

.fa-tuiles { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 6px; padding: 4px 16px 12px; }
.fa-tuile {
  display: flex; flex-direction: column; align-items: center; gap: 1px; padding: 8px 4px;
  background: var(--paper); border-radius: 6px; min-width: 0;
}
.fa-tuile .l { font-size: 10.5px; text-transform: uppercase; letter-spacing: .6px; color: var(--muted); font-weight: 600; }
.fa-tuile .v { font-family: 'Barlow Condensed', sans-serif; font-weight: 800; font-size: 21px; line-height: 1.1; color: var(--ink);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 100%; }
.fa-tuile.est-alerte { background: var(--error-bg); }
.fa-tuile.est-alerte .v, .fa-tuile.est-alerte .l { color: var(--error-fg); }
.fa-ppi.p-elite { background: var(--p-elite-bg); } .fa-ppi.p-elite .v, .fa-ppi.p-elite .l { color: var(--p-elite-fg); }
.fa-ppi.p-good { background: var(--p-good); } .fa-ppi.p-avg { background: var(--p-avg); }
.fa-ppi.p-low { background: var(--p-low); }
.fa-ppi.p-poor { background: var(--p-poor-bg); } .fa-ppi.p-poor .v, .fa-ppi.p-poor .l { color: var(--p-poor-fg); }
.fa-ppi.p-good .l, .fa-ppi.p-avg .l, .fa-ppi.p-low .l { color: var(--ink); }

.fa-scouts { padding: 10px 16px 14px; border-top: 1px solid var(--line); margin-top: auto; }
.fa-rub {
  margin: 0 0 8px; font-family: 'Barlow Condensed', sans-serif; font-weight: 700; font-size: 13px;
  text-transform: uppercase; letter-spacing: .8px; color: var(--sand-fg);
}
.fa-rub small { font-family: 'Barlow', sans-serif; font-weight: 400; text-transform: none; letter-spacing: 0; color: var(--muted); font-size: 12px; }
.fa-notes { display: grid; grid-template-columns: 1fr 1fr; gap: 6px; }
.fa-note { display: flex; align-items: baseline; justify-content: center; gap: 8px; padding: 8px; border-radius: 6px; border: 1px solid transparent; }
.fa-note .v { font-family: 'Barlow Condensed', sans-serif; font-weight: 800; font-size: 28px; line-height: 1; }
.fa-note .l { font-size: 11px; text-transform: uppercase; letter-spacing: .6px; font-weight: 700; }
.fa-recos { display: flex; height: 12px; margin-top: 10px; border-radius: 6px; overflow: hidden; background: var(--paper); }
.fa-reco-seg { display: block; height: 100%; }
.rs-avancer { background: var(--sand); } .rs-suivre { background: var(--success-fg); } .rs-pas_interet { background: var(--bad); }
.fa-recos-leg { list-style: none; margin: 6px 0 0; padding: 0; display: flex; flex-wrap: wrap; gap: 4px 12px; font-size: 12px; color: var(--ink-2); }
.fa-recos-leg i { display: inline-block; width: 9px; height: 9px; border-radius: 2px; margin-right: 5px; vertical-align: 0; }
.fa-regards { margin: 8px 0 0; font-size: 12px; color: var(--muted); }

.fa-stats { display: grid; grid-template-columns: minmax(0, 5fr) minmax(0, 6fr); gap: 14px; margin-top: 16px; align-items: start; }
.fa-radar { margin: 0; padding: 14px 16px; }
.fa-radar svg { display: block; width: 100%; height: auto; max-height: 520px; }
.fa-anneau { fill: none; stroke: var(--line); stroke-width: 1; }
.fa-anneau:last-of-type { stroke: var(--line-2); }
.fa-axe { stroke: var(--line); stroke-width: 1; }
.fa-axe-l { font-family: 'Barlow', sans-serif; font-size: 12px; fill: var(--ink-2); }
.fa-serie { fill: var(--j); fill-opacity: .14; stroke: var(--j); stroke-width: 2.5; stroke-linejoin: round; }
.fa-sommet { fill: var(--j); stroke: var(--surface); stroke-width: 1.5; }
.fa-legende { list-style: none; margin: 6px 0 0; padding: 0; display: flex; flex-wrap: wrap; gap: 6px 16px; font-size: 13px; font-weight: 600; }
.fa-legende i, .fa-hm thead i { display: inline-block; width: 12px; height: 12px; border-radius: 3px; background: var(--j); margin-right: 6px; vertical-align: -1px; }
.fa-legende small { font-weight: 400; color: var(--muted); }

.fa-chaleur { padding: 14px 16px; }
.fa-chaleur-cadre { overflow-x: auto; }
.fa-hm { width: 100%; border-collapse: separate; border-spacing: 3px; font-size: 13px; }
.fa-hm thead th {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 800; font-size: 14px; text-transform: uppercase;
  color: var(--j, var(--ink)); text-align: center; padding: 4px 6px; white-space: nowrap;
  border-bottom: 3px solid var(--j, transparent);
}
.fa-hm tbody th[scope="row"] { text-align: right; font-weight: 500; color: var(--ink-2); padding: 0 8px 0 0; white-space: nowrap; }
.fa-hm-bloc th {
  text-align: left; padding: 10px 0 2px; font-family: 'Barlow Condensed', sans-serif; font-weight: 700;
  font-size: 12px; text-transform: uppercase; letter-spacing: .8px; color: var(--sand-fg);
}
.fa-hm td { text-align: center; padding: 5px 4px; border-radius: 4px; min-width: 64px; font-weight: 700; }
.hm-elite { background: var(--p-elite-bg); color: var(--p-elite-fg); }
.hm-good { background: var(--p-good); color: var(--ink); }
.hm-avg { background: var(--p-avg); color: var(--ink); }
.hm-low { background: var(--p-low); color: var(--ink); }
.hm-poor { background: var(--p-poor-bg); color: var(--p-poor-fg); }
.hm-na { background: var(--paper); color: var(--muted); font-weight: 400; }
.fa-hm td.est-meilleur { box-shadow: inset 0 0 0 2.5px var(--ink); font-size: 14.5px; }

.fa-titre {
  margin: 26px 0 10px; font-family: 'Barlow Condensed', sans-serif; font-weight: 700; font-size: 18px;
  text-transform: uppercase; letter-spacing: .6px; color: var(--night);
}
.fa-dire { background: var(--surface); border: 1px solid var(--line); border-top: 4px solid var(--j); border-radius: var(--radius); }
.fa-dire-nom { margin: 0; padding: 10px 16px 0; font-family: 'Barlow Condensed', sans-serif; font-weight: 800; font-size: 17px; text-transform: uppercase; color: var(--j); }
.fa-j2 .fa-dire-nom { color: #7A5A1E; }
.fa-dire .cm-synthese { padding-top: 4px; }
.cm-point > summary { list-style: none; cursor: pointer; }
.cm-point > summary::-webkit-details-marker { display: none; }
.cm-point > summary::after { content: " ›"; color: var(--muted); }
.cm-point[open] > summary::after { content: " ⌄"; }
.cm-point .cm-preuve { margin-top: 5px; }

@media (max-width: 1100px) {
  .fa-stats { grid-template-columns: minmax(0, 1fr); }
}
@media (max-width: 900px) {
  .fa-une { grid-template-columns: minmax(0, 1fr); }
  .fa-tuiles { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .fa-tete { flex-wrap: wrap; }
}

/* ═══════════════════════════════════════════════════════════════════════════
   MISSIONS — tableau et « Confier un joueur »   (01/10/2026, 3e version)

   Demande de la cellule : « beaucoup plus joli, intuitif, design ». Trois
   principes :
     - « Confier un joueur » est LE geste de la page : bouton principal, fenêtre
       en quatre étapes numérotées, récapitulatif qui se compose avant l'envoi ;
     - une mission est une CARTE (joueur, échéance en mots, match, consigne),
       la même partout — tableau du pilote et « Mes missions » du scout ;
     - l'échéance se lit en délai (« dans 3 j », « en retard de 2 j ») et se
       teinte : sable = bientôt, rouge = en retard.
   ══════════════════════════════════════════════════════════════════════════ */
.mt-head { align-items: center; justify-content: space-between; flex-wrap: wrap; }
.mt-confier-btn { display: inline-flex; align-items: center; gap: 8px; padding: 10px 18px; font-size: 14px; }

/* ── Compteurs = filtres ── */
.mt-kpis { display: flex; flex-wrap: wrap; gap: 10px; margin: 0 0 14px; align-items: stretch; }
.mt-kpi {
  display: flex; align-items: center; gap: 10px; padding: 10px 18px 10px 14px; min-width: 150px;
  background: var(--surface); border: 1px solid var(--line); border-radius: 10px;
  box-shadow: var(--shadow); color: var(--ink); transition: border-color .12s, transform .12s;
}
.mt-kpi:hover { border-color: var(--line-2); transform: translateY(-1px); }
.mt-kpi .ic { width: 22px; height: 22px; padding: 7px; box-sizing: content-box; border-radius: 8px; }
.mt-kpi .v { font-family: 'Barlow Condensed', sans-serif; font-weight: 800; font-size: 28px; line-height: 1; }
.mt-kpi .l { font-size: 13px; color: var(--muted); }
.mt-kpi-voir .ic { background: var(--sand-voile); color: var(--sand-fg); }
.mt-kpi-retard .ic { background: var(--error-bg); color: var(--error-fg); }
.mt-kpi-retard .v { color: var(--bad); }
.mt-kpi-retard.est-nul .v { color: var(--ink); }
.mt-kpi-vus .ic { background: #E6EBF2; color: var(--night); }
.mt-kpi.est-courant { border-color: var(--night); box-shadow: inset 0 0 0 1px var(--night), var(--shadow); }
.mt-tout { align-self: center; font-size: 13px; font-weight: 600; color: var(--night); text-decoration: underline; text-underline-offset: 3px; }

/* ── Filtre par personne ── */
.mt-qui { display: flex; flex-wrap: wrap; gap: 8px; margin: 0 0 18px; }
.mt-qui-chip {
  display: inline-flex; align-items: center; gap: 8px; min-height: 36px; padding: 4px 14px 4px 5px;
  border: 1px solid var(--line-2); border-radius: 999px; background: var(--surface);
  font-size: 13.5px; font-weight: 600; color: var(--ink-2);
}
.mt-qui-chip:first-child { padding-left: 14px; }
.mt-qui-chip b { font-family: 'Barlow Condensed', sans-serif; font-size: 13px; color: var(--sand-fg);
  background: var(--sand-voile); border-radius: 999px; padding: 0 7px; }
.mt-qui-chip:hover { border-color: var(--night); }
.mt-qui-chip.est-courant { background: var(--night); border-color: var(--night); color: var(--on-night); }
.mt-qui-chip.est-courant b { background: rgba(224,192,144,.25); color: var(--sand); }
.mt-qui-av {
  display: inline-flex; align-items: center; justify-content: center; width: 26px; height: 26px;
  border-radius: 50%; background: var(--sand); color: var(--night);
  font-family: 'Barlow Condensed', sans-serif; font-weight: 800; font-size: 12px;
}

/* ── Colonnes par personne ── */
.mt-grille { display: grid; grid-template-columns: repeat(auto-fill, minmax(330px, 1fr)); gap: 18px; align-items: start; }
.mt-col { background: #EEF1F5; border-radius: 12px; padding: 0 10px 10px; }
.mt-col-tete {
  display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 4px 12px; align-items: center;
  margin: 0 -10px 10px; padding: 14px 16px 12px; background: var(--night); border-radius: 12px 12px 0 0;
}
.mt-av {
  display: inline-flex; align-items: center; justify-content: center; width: 38px; height: 38px;
  border-radius: 50%; background: var(--sand); color: var(--night);
  font-family: 'Barlow Condensed', sans-serif; font-weight: 800; font-size: 16px;
}
.mt-col-id h2 {
  margin: 0; font-family: 'Barlow Condensed', sans-serif; font-weight: 800; font-size: 19px;
  color: var(--on-night); text-transform: uppercase; letter-spacing: .4px;
}
.mt-col-n { font-size: 12.5px; color: var(--night-mut); }
.mt-col-n b { color: var(--on-night); }
.mt-col-retard { color: #F4A492; font-weight: 600; }
.mt-prog { grid-column: 1 / -1; display: block; height: 5px; border-radius: 3px; background: rgba(255,255,255,.12); overflow: hidden; margin-top: 6px; }
.mt-prog > span { display: block; height: 100%; background: var(--sand); border-radius: 3px; }
.mt-sec {
  margin: 12px 4px 6px; font-family: 'Barlow Condensed', sans-serif; font-weight: 700; font-size: 12px;
  text-transform: uppercase; letter-spacing: 1px; color: var(--muted);
}

/* ── La carte d'une mission ── */
.mt-carte {
  display: block; background: var(--surface); border: 1px solid var(--line); border-radius: 10px;
  padding: 11px 12px; margin-bottom: 8px; box-shadow: 0 1px 2px rgba(18,26,38,.05);
  border-left: 4px solid var(--sand);
}
.mt-carte.est-retard { border-left-color: var(--bad); }
.mt-carte.est-faite, .mt-vu { border-left-color: var(--night); }
.mt-carte-l1 { display: flex; align-items: center; gap: 11px; }
.mt-corps { display: flex; flex-direction: column; min-width: 0; flex: 1; }
.mt-nom { font-family: 'Barlow Condensed', sans-serif; font-weight: 700; font-size: 17px; color: var(--ink); line-height: 1.15; }
a.mt-nom:hover { text-decoration: underline; }
.mt-det { font-size: 12.5px; color: var(--ink-2); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.mt-quand { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 10px; margin-top: 9px; }
.mt-ech {
  display: inline-flex; align-items: center; gap: 5px; padding: 3px 9px; border-radius: 999px;
  font-size: 12.5px; font-weight: 600; background: var(--paper); color: var(--ink-2);
}
.mt-ech-proche { background: var(--sand-voile); color: var(--sand-fg); }
.mt-ech-retard { background: var(--error-bg); color: var(--error-fg); }
.mt-ech-libre { color: var(--muted); font-weight: 500; }
.mt-match { font-size: 12.5px; font-weight: 600; color: var(--night); }
.mt-consigne {
  margin: 8px 0 0; padding: 7px 10px; background: var(--paper); border-radius: 6px;
  font-size: 13px; line-height: 1.45; color: var(--ink-2);
}
.mt-retirer {
  display: inline-flex; align-items: center; justify-content: center; width: 34px; height: 34px; flex: 0 0 auto;
  border: 1px solid transparent; border-radius: 8px; background: none; color: var(--muted); cursor: pointer;
}
.mt-retirer:hover { border-color: var(--line-2); color: var(--bad); background: var(--error-bg); }
.mt-fait { display: inline-flex; align-items: center; gap: 5px; font-size: 13px; font-weight: 600; color: var(--night); white-space: nowrap; }
.mt-fait:hover { text-decoration: underline; }

.mt-vu > summary { list-style: none; cursor: pointer; }
.mt-vu > summary::-webkit-details-marker { display: none; }
.mt-vu:hover { border-color: var(--line-2); }
.mt-chevron { color: var(--muted); transition: transform .15s; flex: 0 0 auto; }
.mt-vu[open] .mt-chevron { transform: rotate(90deg); }
.mt-verdict { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin-top: 8px; }
.mt-note {
  display: inline-flex; align-items: baseline; gap: 4px; padding: 2px 9px; border-radius: 999px; border: 1px solid transparent;
  font-family: 'Barlow Condensed', sans-serif; font-weight: 800; font-size: 15px;
}
.mt-note small { font-family: 'Barlow', sans-serif; font-weight: 600; font-size: 10.5px; text-transform: uppercase; letter-spacing: .4px; opacity: .8; }
.mt-rapport { margin-top: 10px; padding-top: 10px; border-top: 1px dashed var(--line-2); }
.mt-r-concl {
  margin: 0 0 8px; padding: 8px 12px; border-left: 3px solid var(--sand); background: var(--sand-voile);
  border-radius: 0 6px 6px 0; font-size: 14px; font-weight: 600; line-height: 1.5; color: var(--ink); white-space: pre-line;
}
.mt-r-lab { margin: 6px 0 2px; font-family: 'Barlow Condensed', sans-serif; font-weight: 700; font-size: 11.5px;
  text-transform: uppercase; letter-spacing: .8px; color: var(--sand-fg); }
.mt-r-txt { margin: 0; font-size: 13.5px; line-height: 1.55; color: var(--ink); white-space: pre-line; }
.mt-r-meta { margin: 8px 0 0; font-size: 12px; color: var(--muted); }
.mt-rapport .mi-lien { display: inline-block; margin-top: 8px; }

.mt-vide {
  display: flex; flex-direction: column; align-items: center; text-align: center; gap: 6px;
  padding: 48px 20px; background: var(--surface); border: 1px dashed var(--line-2); border-radius: 12px;
}
.mt-vide > .ic { width: 34px; height: 34px; color: var(--sand-fg); }
.mt-vide .vide-aide { max-width: 46ch; margin-bottom: 10px; }

/* « Mes missions » du scout : la même carte, en liste. */
.mt-liste { max-width: 820px; }
.mt-liste + .mt-liste { margin-top: 26px; }
.mt-liste-tete { display: flex; align-items: baseline; justify-content: space-between; margin: 0 0 10px; }
.mt-liste-tete h2 { margin: 0; font-family: 'Barlow Condensed', sans-serif; font-weight: 700; font-size: 17px;
  text-transform: uppercase; letter-spacing: .6px; color: var(--night); }

/* ── « Confier un joueur » : la fenêtre en quatre étapes ── */
.mdl-large:modal { width: min(720px, 100%); }
.cf { padding: 6px 20px 18px; }
.cf-etape { padding: 14px 0; border-bottom: 1px solid var(--line); }
.cf-t {
  display: flex; align-items: center; gap: 10px; margin: 0 0 10px;
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700; font-size: 15px;
  text-transform: uppercase; letter-spacing: .6px; color: var(--night);
}
.cf-t small { font-family: 'Barlow', sans-serif; font-weight: 400; font-size: 12.5px; text-transform: none; letter-spacing: 0; color: var(--muted); }
.cf-n {
  display: inline-flex; align-items: center; justify-content: center; width: 24px; height: 24px;
  border-radius: 50%; background: var(--night); color: var(--sand); font-size: 13px;
}
.cf-cherche { position: relative; display: flex; align-items: center; }
.cf-cherche > .ic { position: absolute; left: 14px; color: var(--muted); pointer-events: none; }
.cf-cherche input {
  width: 100%; min-height: 46px; padding: 10px 14px 10px 42px; font: inherit; font-size: 16px;
  border: 1.5px solid var(--line-2); border-radius: 10px; background: var(--surface);
}
.cf-cherche input:focus { outline: none; border-color: var(--night); box-shadow: 0 0 0 3px rgba(27,39,56,.12); }
.cf-cherche[hidden], .cf-joueur[hidden], .cf-sugg[hidden] { display: none; }
.cf-sugg {
  position: absolute; z-index: 30; top: calc(100% + 6px); left: 0; right: 0; margin: 0; padding: 6px;
  list-style: none; background: var(--surface); border: 1px solid var(--line-2); border-radius: 10px;
  box-shadow: 0 14px 34px rgba(18,26,38,.18); max-height: 300px; overflow-y: auto;
}
.cf-sugg button {
  display: flex; align-items: center; gap: 12px; width: 100%; padding: 7px 8px; background: none;
  border: 0; border-radius: 8px; text-align: left; cursor: pointer; font: inherit;
}
.cf-sugg button:hover, .cf-sugg button:focus-visible { background: var(--sand-voile); outline: none; }
.cf-sugg-txt { display: flex; flex-direction: column; min-width: 0; }
.cf-sugg-txt b { font-size: 14.5px; color: var(--ink); }
.cf-sugg-txt span { font-size: 12.5px; color: var(--muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.cf-sugg-vide { padding: 10px; font-size: 13px; color: var(--muted); }
.cf-av {
  display: inline-flex; align-items: center; justify-content: center; flex: 0 0 auto;
  width: 36px; height: 46px; border-radius: 6px; overflow: hidden; background: #EEF1F4;
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700; font-size: 14px; color: var(--ink-2);
}
.cf-av img { width: 100%; height: 100%; object-fit: cover; }
.cf-joueur {
  display: flex; align-items: center; gap: 14px; padding: 10px 12px;
  background: var(--sand-voile); border: 1.5px solid var(--sand); border-radius: 10px;
}
.cf-joueur .cf-av { width: 42px; height: 55px; }
.cf-joueur-txt { display: flex; flex-direction: column; min-width: 0; flex: 1; }
.cf-joueur-txt b { font-family: 'Barlow Condensed', sans-serif; font-size: 19px; color: var(--ink); text-transform: uppercase; }
.cf-joueur-txt span { font-size: 13px; color: var(--ink-2); }
.cf-changer { border: 0; background: none; font: inherit; font-size: 13px; font-weight: 600; color: var(--night); text-decoration: underline; cursor: pointer; }

.cf-qui { display: grid; grid-template-columns: repeat(auto-fill, minmax(190px, 1fr)); gap: 8px; }
.cf-scout {
  position: relative; display: flex; align-items: center; gap: 10px; padding: 9px 12px; cursor: pointer;
  border: 1.5px solid var(--line-2); border-radius: 10px; background: var(--surface); transition: border-color .12s, background .12s;
}
.cf-scout input { position: absolute; opacity: 0; width: 1px; height: 1px; }
.cf-scout:hover { border-color: var(--night); }
.cf-scout:has(input:focus-visible) { box-shadow: 0 0 0 3px rgba(27,39,56,.18); }
.cf-scout-av {
  display: inline-flex; align-items: center; justify-content: center; width: 34px; height: 34px; flex: 0 0 auto;
  border-radius: 50%; background: #E6EBF2; color: var(--night);
  font-family: 'Barlow Condensed', sans-serif; font-weight: 800; font-size: 14px;
}
.cf-scout-txt { display: flex; flex-direction: column; min-width: 0; }
.cf-scout-txt b { font-size: 14px; color: var(--ink); }
.cf-scout-txt small { font-size: 11.5px; color: var(--muted); }
.cf-coche { margin-left: auto; color: var(--night); opacity: 0; transition: opacity .12s; }
.cf-scout:has(input:checked) { border-color: var(--night); background: var(--sand-voile); }
.cf-scout:has(input:checked) .cf-scout-av { background: var(--night); color: var(--sand); }
.cf-scout:has(input:checked) .cf-coche { opacity: 1; }

.cf-quand { display: grid; grid-template-columns: auto 1fr; gap: 10px; align-items: center; }
.cf-quand input[type=date], .cf-match {
  min-height: 42px; padding: 8px 12px; font: inherit; font-size: 15px;
  border: 1.5px solid var(--line-2); border-radius: 10px; background: var(--surface);
}
.cf-match { grid-column: 1 / -1; }
.cf-raccourcis { display: flex; flex-wrap: wrap; gap: 6px; }
.cf-raccourcis button, .cf-tags button {
  min-height: 34px; padding: 5px 12px; border: 1px solid var(--line-2); border-radius: 999px;
  background: var(--surface); font: inherit; font-size: 13px; font-weight: 600; color: var(--ink-2); cursor: pointer;
}
.cf-raccourcis button:hover, .cf-tags button:hover { border-color: var(--night); color: var(--night); }
.cf-raccourcis button.est-actif, .cf-tags button.est-actif { background: var(--night); border-color: var(--night); color: var(--sand); }
.cf-tags { display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 10px; }
.cf textarea {
  width: 100%; min-height: 70px; padding: 10px 12px; font: inherit; font-size: 15px; line-height: 1.5; resize: vertical;
  border: 1.5px solid var(--line-2); border-radius: 10px; background: var(--surface); box-sizing: border-box;
}
.cf input:focus, .cf textarea:focus { outline: none; border-color: var(--night); box-shadow: 0 0 0 3px rgba(27,39,56,.12); }
.cf-pied { display: flex; align-items: center; justify-content: space-between; gap: 14px; padding-top: 16px; flex-wrap: wrap; }
.cf-recap { margin: 0; font-size: 13.5px; color: var(--muted); }
.cf-recap.est-pret { color: var(--night); font-weight: 600; }
.cf-pied .btn { padding: 10px 20px; font-size: 14px; }

@media (max-width: 900px) {
  .mt-grille { grid-template-columns: minmax(0, 1fr); }
  .mt-kpi { flex: 1 1 140px; min-width: 0; }
  .cf { padding: 4px 14px 14px; }
  .cf-quand { grid-template-columns: minmax(0, 1fr); }
  .cf-qui { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .cf-scout { padding: 8px; gap: 8px; }
  .cf-scout-av { width: 28px; height: 28px; font-size: 12px; }
  .cf-quand input[type=date], .cf-match, .cf textarea { font-size: 16px; }
}

/* ═══════════════════════════════════════════════════════════════════════════
   DOSSIER DE PRÉSENTATION — la page qui le prépare   (02/10/2026)
   ══════════════════════════════════════════════════════════════════════════ */
.pr-head { align-items: center; justify-content: space-between; flex-wrap: wrap; }
.pr-ident { display: flex; align-items: center; gap: 16px; }
.pr-ident .page-sub { margin: 4px 0 0; }
.pr-pdf { display: inline-flex; align-items: center; gap: 8px; padding: 10px 18px; font-size: 14px; }
.pr-grille { display: grid; grid-template-columns: minmax(0, 2.4fr) minmax(260px, 1fr); gap: 18px; align-items: start; }
.pr-ia-corps { padding: 14px 18px 18px; }
.pr-badge {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700; font-size: 11.5px; text-transform: uppercase;
  letter-spacing: .7px; padding: 2px 9px; border-radius: 999px; background: var(--paper); color: var(--ink-2);
}
.pr-badge-ia { background: var(--sand-voile); color: var(--sand-fg); }
.pr-attente { display: flex; align-items: center; gap: 10px; margin: 0 0 14px; font-size: 14px; color: var(--night); }
.pr-spin { width: 16px; height: 16px; border: 2px solid var(--line-2); border-top-color: var(--night); border-radius: 50%; animation: pr-tourne 0.8s linear infinite; }
@keyframes pr-tourne { to { transform: rotate(360deg); } }
@media (prefers-reduced-motion: reduce) { .pr-spin { animation: none; } }
.pr-erreur { margin: 0 0 10px; font-size: 13px; color: var(--error-fg); }
.pr-info { margin: 0 0 10px; font-size: 13px; color: var(--warn-fg); }
.pr-aide { margin: 6px 0 14px; font-size: 12.5px; color: var(--muted); max-width: 70ch; }
.pr-accroche { margin: 8px 0 14px; font-family: 'Barlow Condensed', sans-serif; font-weight: 700; font-size: 21px; color: var(--night); }
.pr-cols { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 16px; }
.pr-cols h3 { margin: 0 0 8px; padding-top: 8px; border-top: 3px solid var(--sand);
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700; font-size: 14px; text-transform: uppercase; letter-spacing: .6px; color: var(--night); }
.pr-cols > div:nth-child(2) h3 { border-top-color: var(--bad); }
.pr-cols > div:nth-child(3) h3 { border-top-color: #6F93C0; }
.pr-cols ul { margin: 0; padding: 0; list-style: none; }
.pr-cols li { padding: 7px 0; border-bottom: 1px solid var(--line); font-size: 13.5px; line-height: 1.5; color: var(--ink); }
.pr-cols li:last-child { border-bottom: 0; }
.pr-vide { color: var(--muted); }
.pr-verdict { margin: 16px 0 0; padding: 10px 14px; background: var(--sand-voile); border-left: 3px solid var(--sand);
  border-radius: 0 6px 6px 0; font-size: 14px; line-height: 1.55; }
.pr-verdict b { font-family: 'Barlow Condensed', sans-serif; text-transform: uppercase; letter-spacing: .6px; margin-right: 6px; color: var(--sand-fg); }
.pr-liste { margin: 0; padding: 12px 16px 12px 36px; font-size: 14px; line-height: 1.9; color: var(--ink); }
.pr-note { margin: 0; padding: 0 16px 16px; font-size: 12.5px; color: var(--muted); line-height: 1.5; }
@media (max-width: 1000px) {
  .pr-grille, .pr-cols { grid-template-columns: minmax(0, 1fr); }
}

/* ── Dossier de présentation : l'éditeur et la fenêtre d'export (02/10/2026) ── */
.pr-publics { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 10px; margin: 0 0 14px; }
.pr-public {
  display: flex; flex-direction: column; gap: 2px; padding: 12px 16px; border-radius: 10px;
  background: var(--surface); border: 1.5px solid var(--line-2); color: var(--ink);
}
.pr-public b { font-family: 'Barlow Condensed', sans-serif; font-size: 17px; text-transform: uppercase; letter-spacing: .4px; }
.pr-public span { font-size: 12.5px; color: var(--muted); }
.pr-public:hover { border-color: var(--night); }
.pr-public.est-courant { background: var(--night); border-color: var(--night); color: var(--on-night); }
.pr-public.est-courant span { color: var(--night-mut); }
.pr-avertir { margin: 0 0 14px; padding: 9px 14px; border-radius: 8px; background: var(--sand-voile);
  font-size: 13px; color: var(--sand-fg); }
.pr-cote { display: flex; flex-direction: column; gap: 18px; }
.pr-champ { margin: 0 0 14px; }
.pr-champ-tete { display: flex; align-items: center; gap: 8px; margin-bottom: 5px; }
.pr-champ-tete label { font-family: 'Barlow Condensed', sans-serif; font-weight: 700; font-size: 14px;
  text-transform: uppercase; letter-spacing: .5px; color: var(--night); }
.pr-modif { font-size: 11px; font-weight: 700; padding: 1px 7px; border-radius: 999px; background: var(--sand-voile); color: var(--sand-fg); }
.pr-remettre { margin-left: auto; border: 0; background: none; font: inherit; font-size: 12.5px; font-weight: 600;
  color: var(--night); text-decoration: underline; cursor: pointer; }
.pr-champ textarea {
  width: 100%; box-sizing: border-box; padding: 10px 12px; font: inherit; font-size: 14px; line-height: 1.5;
  border: 1.5px solid var(--line-2); border-radius: 8px; background: var(--surface); resize: vertical;
}
.pr-champ.est-modifie textarea { border-color: var(--sand-2); background: #FFFDF8; }
.pr-champ textarea:focus { outline: none; border-color: var(--night); box-shadow: 0 0 0 3px rgba(27,39,56,.12); }
.pr-legendes { margin-top: 8px; padding-top: 10px; border-top: 1px solid var(--line); }
.pr-legendes > summary { cursor: pointer; margin-bottom: 12px; font-weight: 600; font-size: 13.5px; color: var(--night); }
.pr-pied { display: flex; justify-content: flex-end; gap: 10px; padding: 12px 18px; border-top: 1px solid var(--line); background: var(--paper); }
.pr-photo-bloc { padding: 14px 18px 18px; border-top: 1px solid var(--line); }
.pr-photo-bloc h3 { margin: 0 0 10px; font-family: 'Barlow Condensed', sans-serif; font-weight: 700; font-size: 14px;
  text-transform: uppercase; letter-spacing: .5px; color: var(--night); }
.pr-photo { display: flex; gap: 16px; align-items: flex-start; }
.pr-photo img { width: 96px; height: 128px; object-fit: cover; border-radius: 8px; border: 1px solid var(--line-2); }
.pr-retirer { display: flex; align-items: center; gap: 6px; margin-top: 8px; font-size: 13px; }

.pdfx-pres { padding: 4px 18px 0; }
.pdfx-pres-t { margin: 10px 0 8px; font-family: 'Barlow Condensed', sans-serif; font-weight: 700; font-size: 14px;
  text-transform: uppercase; letter-spacing: .6px; color: var(--night); }
.pdfx-pres-choix { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; }
.pdfx-pres-btn {
  display: flex; flex-direction: column; gap: 3px; padding: 10px 12px; border-radius: 10px;
  border: 1.5px solid var(--line-2); background: var(--surface); color: var(--ink);
}
.pdfx-pres-btn b { font-family: 'Barlow Condensed', sans-serif; font-size: 15px; text-transform: uppercase; }
.pdfx-pres-btn span { font-size: 11.5px; line-height: 1.35; color: var(--muted); }
.pdfx-pres-btn:hover { border-color: var(--night); background: var(--sand-voile); }
.pdfx-pres-perso { display: inline-block; margin-top: 10px; font-size: 13px; font-weight: 600; color: var(--night); text-decoration: underline; text-underline-offset: 3px; }
.pdfx-pres-ou { margin: 14px 0 0; padding-top: 12px; border-top: 1px solid var(--line); font-size: 12.5px; color: var(--muted); }

@media (max-width: 900px) {
  .pr-publics, .pdfx-pres-choix { grid-template-columns: minmax(0, 1fr); }
  .pr-champ textarea { font-size: 16px; }
}

/* ── Éditeur du dossier : graphiques et tableaux (02/10/2026) ── */
.pr-graph { margin: 4px 18px 16px; padding: 12px 14px; border: 1px solid var(--line); border-radius: 10px; background: var(--paper); }
.pr-graph > summary { display: flex; align-items: baseline; gap: 10px; cursor: pointer; list-style: none; }
.pr-graph > summary::-webkit-details-marker { display: none; }
.pr-graph > summary > span:first-child { font-family: 'Barlow Condensed', sans-serif; font-weight: 700; font-size: 15px;
  text-transform: uppercase; letter-spacing: .5px; color: var(--night); }
.pr-graph > summary::after { content: "›"; margin-left: auto; color: var(--muted); transition: transform .15s; }
.pr-graph[open] > summary::after { transform: rotate(90deg); }
.pr-aide-inline { font-size: 12.5px; color: var(--muted); }
.pr-remettre-graph { display: inline-block; margin: 10px 0 0; }
.pr-cases { margin: 14px 0 0; padding: 0; border: 0; }
.pr-cases legend { margin-bottom: 7px; font-weight: 700; font-size: 13.5px; color: var(--ink); }
.pr-cases legend small { font-weight: 400; color: var(--muted); }
.pr-cases-grille { display: grid; grid-template-columns: repeat(auto-fill, minmax(210px, 1fr)); gap: 6px; }
.pr-case { display: flex; align-items: center; gap: 7px; min-height: 34px; padding: 4px 10px;
  border: 1px solid var(--line-2); border-radius: 8px; background: var(--surface); font-size: 13px; cursor: pointer; }
.pr-case:has(input:checked) { border-color: var(--night); background: var(--sand-voile); }
.pr-case input { width: 16px; height: 16px; accent-color: var(--night); flex: 0 0 auto; }

/* ══ RAPPORT DE MATCH (05/10/2026) ═══════════════════════════════════════════
   Contexte du match, notes par domaine (1-4, turquoise comme toute note de
   scout), note de l'ALGO /100 (couleurs de percentile --p-*, jamais turquoise :
   c'est un calcul, pas un regard), bloc « Forme » de la fiche, bilan complet
   du match en direct. Placé APRÈS le bloc « MOBILE ET TABLETTE » : ses règles
   mobiles sont dans le @media de fin de section. */

/* ── Formulaire général ── */
.rf .rf-match { margin: 0; padding: 12px 14px 14px; border: 1px solid var(--line); border-radius: 8px; background: var(--paper); min-width: 0; }
.rf .rf-match[hidden] { display: none; }
.rf .rf-match > legend { padding: 0 6px; }
.rf-match-grille { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 12px 16px; }
/* Les segments (lieu, rôle) prennent la largeur de leur case et partagent
   l'espace : à largeur naturelle, « ? » sortait de la case. */
.rf-match .seg, .ml-bilan-match .seg { display: flex; width: 100%; }
.rf-match .seg-opt, .ml-bilan-match .seg-opt { flex: 1 1 0; min-width: 0; }
.rf-match .seg-opt span, .ml-bilan-match .seg-opt span { width: 100%; min-width: 0; padding: 8px 6px; }
.rf .rf-match input[type=number] { font-family: 'Barlow', sans-serif; font-size: 14px; padding: 8px 10px;
  border: 1px solid var(--line-2); border-radius: 5px; background: var(--surface); color: var(--ink); width: 100%; }
.rf-score { display: flex; align-items: center; gap: 6px; }
.rf .rf-score input[type=number] { width: 64px; text-align: center; }
.rf-aide { font-style: normal; text-transform: none; letter-spacing: 0; font-family: 'Barlow', sans-serif; font-weight: 400; color: var(--muted); }
.rf-domaines { border-top: 1px dashed var(--line-2); padding-top: 10px; }
.rf-domaines > summary { cursor: pointer; list-style: none; display: flex; align-items: center; gap: 6px; min-height: 34px; }
.rf-domaines > summary::-webkit-details-marker { display: none; }
.rf-domaines > summary::before { content: "›"; display: inline-block; transition: transform .15s; font-size: 15px; }
.rf-domaines[open] > summary::before { transform: rotate(90deg); }
.rf-domaines-grille, .ml-bilan-domaines { display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 8px 22px; margin-top: 8px; }
.rf-domaine { display: flex; align-items: center; justify-content: space-between; gap: 10px; }
.rf-domaine-lab { font-weight: 600; font-size: 13.5px; color: var(--ink); }
.notes-vide-ok .note-opt span { width: 36px; height: 36px; font-size: 16px; }
.notes-vide-ok .note-opt.n-x input:checked + span { background: var(--paper); border-color: var(--muted); color: var(--muted); }

/* ── Cartes de rapport : contexte, algo, domaines ── */
.rm-infos { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 12px; margin: 4px 0 6px; font-size: 12.5px; color: var(--ink-2); }
.rm-ctx { display: inline-flex; flex-wrap: wrap; align-items: center; gap: 0 6px; }
.rm-sep { color: var(--line-2); }
.rm-score { font-family: 'Barlow Condensed', sans-serif; font-weight: 800; font-size: 14px; color: var(--ink); }
.rm-score-v { color: var(--p-elite-tx); }
.rm-score-d { color: var(--p-poor-tx); }
.rm-domaines { display: inline-flex; flex-wrap: wrap; gap: 4px 8px; }
.rm-dom { display: inline-flex; align-items: center; gap: 4px; }
.rm-dom i { font-style: normal; color: var(--muted); }
.rm-dom .n { display: inline-flex; align-items: center; justify-content: center; min-width: 20px; height: 20px;
  border: 1px solid; border-radius: 4px; font-family: 'Barlow Condensed', sans-serif; font-weight: 800; font-size: 13px; }
.algo-note { display: inline-flex; align-items: center; gap: 5px; padding: 2px 8px 2px 4px; border-radius: 20px;
  background: var(--paper); border: 1px solid var(--line); }
.algo-note-lab { font-family: 'Barlow Condensed', sans-serif; font-weight: 700; text-transform: uppercase;
  letter-spacing: .6px; font-size: 11px; color: var(--muted); padding-left: 4px; }
.algo-note .fitpct { min-width: 30px; padding: 1px 6px; font-size: 12.5px; text-align: center; }
.algo-note i { font-style: normal; color: var(--muted); font-size: 11px; }
.algo-mini.fitpct { min-width: 26px; padding: 0 5px; font-size: 11.5px; margin-left: 4px; text-align: center; }
.rm-quoi .rm-score { margin-left: 4px; font-size: 13px; }
.carnet .rd-algo dd.fitpct { min-width: 40px; text-align: center; font-size: 16px; padding: 4px 8px; }
.carnet.rd-domaines { padding: 0; border-left: 0; justify-content: flex-start; gap: 18px; margin-top: 10px; }

/* ── Forme (fiche, onglet Rapports) ── */
.forme { margin: 0 0 18px; padding: 14px 16px; border: 1px solid var(--line); border-radius: var(--radius); background: var(--surface); }
.forme-tete { display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between; gap: 6px 14px; }
.forme-titre { margin: 0; font-family: 'Barlow Condensed', sans-serif; font-size: 15px; font-weight: 700;
  text-transform: uppercase; letter-spacing: .6px; color: var(--night); }
.forme-resume { margin: 0; font-size: 13px; color: var(--ink-2); display: flex; align-items: center; flex-wrap: wrap; gap: 6px; }
.forme-sep { color: var(--line-2); }
.forme-corps { display: grid; gap: 4px 28px; }
.forme-corps--2 { grid-template-columns: minmax(0, 480px) minmax(0, 1fr); align-items: start; }
.forme-cote > :first-child { margin-top: 12px; }
.forme-fig { margin: 10px 0 0; }
/* ⚠️ Le texte du SVG grandit et rapetisse AVEC lui : 9 unités à ~480 px de
   large ≈ 13,5 px à l'écran ; sur téléphone (~270 px) on passe à 11 unités
   (≈ 9 px), sinon les repères deviennent illisibles. */
.forme-svg { display: block; width: 100%; max-width: 480px; height: auto; overflow: visible; }
.forme-grille { stroke: var(--line); stroke-width: 1; stroke-dasharray: 2 3; }
.forme-axe { font-family: 'Barlow', sans-serif; font-size: 9px; fill: var(--muted); }
.forme-aire { fill: var(--night); opacity: .06; }
.forme-ligne { fill: none; stroke: var(--night); stroke-width: 1.6; stroke-linejoin: round; stroke-linecap: round; }
.forme-pt { fill: var(--tc, var(--muted)); stroke: var(--surface); stroke-width: 1.5; }
.forme-vu { fill: none; stroke: var(--n1-fg); stroke-width: 2; }
.forme-g { cursor: default; }
.forme-legende { display: flex; flex-wrap: wrap; gap: 4px 16px; margin-top: 6px; font-size: 11.5px; color: var(--muted); }
/* Puce neutre : la couleur des points EST la note (percentile), la légende ne
   doit pas en suggérer une. */
.forme-puce { display: inline-block; width: 9px; height: 9px; border-radius: 50%; background: var(--night); margin-right: 5px; vertical-align: -1px; }
.forme-puce-vu { background: transparent; border: 2px solid var(--n1-fg); width: 11px; height: 11px; }
.forme-matchs { list-style: none; margin: 12px 0 0; padding: 0; display: grid; gap: 4px; }
.forme-matchs li { display: grid; grid-template-columns: 52px minmax(0, 1fr) auto auto auto; align-items: center; gap: 10px;
  padding: 6px 8px; border-radius: 6px; background: var(--paper); font-size: 13px; }
.forme-date { color: var(--muted); font-size: 12px; }
.forme-adv { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 600; color: var(--ink); }
.forme-matchs .fitpct { min-width: 32px; text-align: center; font-size: 12.5px; padding: 1px 6px; }
.forme-matchs .n { display: inline-flex; align-items: center; justify-content: center; width: 24px; height: 24px; border: 1px solid;
  border-radius: 5px; font-family: 'Barlow Condensed', sans-serif; font-weight: 800; font-size: 14px; }
.forme-lien { font-size: 12px; font-weight: 600; color: var(--night); white-space: nowrap; }
.forme-domaines { margin-top: 14px; display: grid; gap: 6px; }
.forme-sous { margin: 0 0 2px; font-family: 'Barlow Condensed', sans-serif; font-weight: 700; text-transform: uppercase;
  letter-spacing: .6px; font-size: 12px; color: var(--muted); }
.forme-sous i { font-family: 'Barlow', sans-serif; font-style: normal; font-weight: 400; text-transform: none; letter-spacing: 0; }
.forme-dom { display: grid; grid-template-columns: 82px minmax(0, 1fr) 36px auto; align-items: center; gap: 10px; font-size: 13px; }
.forme-dom-lab { font-weight: 600; color: var(--ink); }
.forme-barre { height: 8px; border-radius: 4px; background: var(--paper); overflow: hidden; }
.forme-barre-in { display: block; height: 100%; border-radius: 4px; border: 0; }
.forme-barre-in.n-1 { background: var(--n1-fg); } .forme-barre-in.n-2 { background: var(--n2-fg); }
.forme-barre-in.n-3 { background: var(--n3-fg); } .forme-barre-in.n-4 { background: var(--n4-fg); }
.forme-dom-val { text-align: center; border-radius: 5px; border: 1px solid; font-family: 'Barlow Condensed', sans-serif; font-weight: 800; font-size: 14px; padding: 1px 0; }
.forme-dom-n { font-size: 11.5px; color: var(--muted); white-space: nowrap; }

/* ══ SES MATCHS — fiche > Données > Matchs (05/10/2026, refait le soir) ═══════
   Le langage de la fiche, pas celui d'un tableau de bord : un REGISTRE de
   matchs (lignes à filets, la ligne choisie en nuit), un bandeau nuit à arête
   Calico portant un RELEVÉ (mesures séparées par des filets, jamais des tuiles),
   les chiffres du poste en LIGNES DE PERCENTILE comme le reste de l'onglet
   Données (barre, repère médian, rang), et UN grand terrain de nuit à calques.
   Couleurs : percentiles --p-* (la donnée) ; sur le terrain, Calico = le joueur
   (sa chaleur, ses passes qui font avancer, ses buts), bleu acier = passes clés,
   blanc = réussi, corail éteint = raté. Jamais de turquoise : c'est la couleur
   des notes de scout. Comparaison : --j1 / --j2 du Face-à-face. */

.am-zone { display: grid; grid-template-columns: 236px minmax(0, 1fr); gap: 24px; align-items: start; }

/* ── Registre ── */
.am-registre { position: sticky; top: 14px; }
.am-reg-periode { display: grid; gap: 2px; padding: 12px 14px; margin-bottom: 14px; border-radius: var(--radius);
  border: 1px solid var(--line-2); background: var(--surface); color: var(--ink); text-decoration: none; }
.am-reg-periode:hover { border-color: var(--night); }
.am-reg-periode[aria-current] { background: var(--night); border-color: var(--night); color: var(--on-night);
  box-shadow: inset 0 -2px 0 var(--sand); }
.am-reg-titre { font-family: 'Barlow Condensed', sans-serif; font-weight: 700; text-transform: uppercase;
  letter-spacing: .7px; font-size: 14px; }
.am-reg-sous { font-size: 12px; color: var(--muted); }
.am-reg-periode[aria-current] .am-reg-sous { color: var(--night-mut); }
.am-reg-sep { display: flex; justify-content: space-between; margin: 0 2px 4px; font-family: 'Barlow Condensed', sans-serif;
  font-weight: 600; text-transform: uppercase; letter-spacing: 1px; font-size: 11.5px; color: var(--muted); }
.am-reg-liste { list-style: none; margin: 0; padding: 0; border-top: 1px solid var(--line); max-height: 62vh; overflow-y: auto;
  scrollbar-width: thin; scrollbar-color: var(--line-2) transparent; }
.am-reg-liste li { border-bottom: 1px solid var(--line); }
.am-reg-liste a { display: grid; grid-template-columns: 38px minmax(0, 1fr) 30px 38px; align-items: center; gap: 8px;
  min-height: 44px; padding: 4px 6px; color: var(--ink); text-decoration: none; font-size: 13px; }
.am-reg-liste a:hover { background: var(--paper); }
.am-reg-liste a[aria-current] { background: var(--night); color: var(--on-night); box-shadow: inset 2px 0 0 var(--sand); }
.am-reg-date { font-size: 12px; color: var(--muted); }
.am-reg-adv { font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.am-reg-adv i { font-style: normal; font-weight: 400; color: var(--muted); }
.am-reg-score { font-family: 'Barlow Condensed', sans-serif; font-weight: 700; font-size: 13.5px; text-align: center; }
.am-issue-v { color: var(--p-elite-tx); } .am-issue-d { color: var(--p-poor-tx); } .am-issue-n { color: var(--ink-2); }
.am-reg-note { display: grid; justify-items: end; gap: 3px; }
.am-reg-note b { font-family: 'Barlow Condensed', sans-serif; font-weight: 800; font-size: 16px; line-height: 1; color: var(--tc-texte, var(--muted)); }
.am-reg-note i { display: block; height: 3px; border-radius: 2px; background: var(--tc, var(--line-2)); justify-self: stretch; max-width: 100%; }
.am-reg-liste a[aria-current] .am-reg-date, .am-reg-liste a[aria-current] .am-reg-adv i { color: var(--night-mut); }
.am-reg-liste a[aria-current] .am-reg-note b, .am-reg-liste a[aria-current] .am-reg-score { color: var(--on-night); }
.am-reg-aide { margin: 8px 2px 0; font-size: 11.5px; color: var(--muted); line-height: 1.45; }

/* ── Fiche de match (16/10/2026) : deux compositions, note de l'algo ──
   Réutilise `.am-reg-note`/`.tnum`/`.t-<tier>` ci-dessus pour la pastille de
   note — même langage visuel que le registre « Match par match ». */
.mf-score { font-family: 'Barlow Condensed', sans-serif; font-weight: 800; color: var(--sand); margin: 0 4px; }
.mf-vs { color: var(--muted); margin: 0 10px; font-weight: 400; }
.mf-roster { list-style: none; margin: 10px 0 0; padding: 0; }
.mf-ligne {
  display: flex; align-items: center; justify-content: space-between; gap: 10px;
  padding: 7px 0; border-bottom: 1px dashed var(--line);
}
.mf-ligne:last-child { border-bottom: 0; padding-bottom: 0; }
.mf-nomposte { display: flex; flex-direction: column; min-width: 0; }
.mf-nom { font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.mf-poste { font-size: 11.5px; color: var(--muted); }
.mf-ligne .am-reg-note { width: 44px; flex: 0 0 auto; }

.am-panneau { min-width: 0; transition: opacity .2s cubic-bezier(.16, 1, .3, 1); }
.am-panneau.est-en-charge { opacity: .4; }

/* ── Bandeau ── */
.am-bandeau { display: flex; flex-wrap: wrap; align-items: flex-end; justify-content: space-between; gap: 16px 32px;
  padding: 18px 22px 16px; border-radius: var(--radius); background: var(--night); color: var(--on-night);
  box-shadow: inset 0 -2px 0 var(--sand); }
.am-titre { margin: 0; display: flex; flex-wrap: wrap; align-items: baseline; gap: 2px 12px; font-family: 'Barlow Condensed', sans-serif;
  font-weight: 700; font-size: 28px; line-height: 1.1; letter-spacing: .2px; color: var(--on-night); text-wrap: balance; }
.am-score { color: var(--sand); font-size: 30px; font-weight: 800; }
.am-score i { font-style: normal; margin: 0 4px; color: var(--night-mut); font-weight: 600; }
.am-contre { font-style: normal; font-family: 'Barlow', sans-serif; font-size: 15px; color: var(--night-mut); }
.am-meta { margin: 8px 0 0; font-size: 13px; color: var(--night-mut); line-height: 1.5; max-width: 62ch; }
.am-sep { margin: 0 7px; opacity: .55; }
.am-releve { display: flex; margin: 0; }
.am-releve > div { padding: 0 20px; border-left: 1px solid rgba(255, 255, 255, .14); }
.am-releve > div:first-child { border-left: 0; padding-left: 0; }
.am-releve dt { font-family: 'Barlow Condensed', sans-serif; font-weight: 600; text-transform: uppercase; letter-spacing: 1px;
  font-size: 11px; color: var(--night-mut); margin-bottom: 4px; white-space: nowrap; }
.am-releve dd { margin: 0; display: flex; align-items: baseline; gap: 4px; }
.am-releve dd b { font-family: 'Barlow Condensed', sans-serif; font-weight: 800; font-size: 30px; line-height: 1; }
.am-releve dd i { font-style: normal; font-size: 12px; color: var(--night-mut); }
/* La note de l'algo prend la couleur du percentile en TEXTE sur la nuit : les
   variantes -tx sont faites pour le blanc, on reprend donc les teintes pleines. */
.am-releve-note { color: var(--tc, var(--on-night)); }
.am-releve .am-pos { color: #8FD9AE; } .am-releve .am-neg { color: #F2A493; }
.am-releve-lien { display: inline-flex; align-items: center; gap: 8px; color: var(--on-night); text-decoration: none;
  font-weight: 600; font-size: 14px; border-bottom: 1px solid var(--sand-voile); padding-bottom: 2px; }
.am-releve-lien:hover { border-color: var(--sand); }

/* Depuis le panneau d'UN match : rejoindre la fiche de match (16/10/2026). */
.am-lien-match { color: var(--sand); text-decoration: none; font-weight: 600; }
.am-lien-match:hover { text-decoration: underline; }
.am-releve-lien .n { display: inline-flex; align-items: center; justify-content: center; width: 26px; height: 26px; border: 1px solid;
  border-radius: 50%; font-family: 'Barlow Condensed', sans-serif; font-weight: 800; font-size: 15px; }

/* ── Comparer ── */
.am-comparer { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 12px; margin: 14px 0 0; padding: 10px 14px;
  border: 1px solid var(--line); border-radius: var(--radius); background: var(--paper); font-size: 13px; color: var(--ink-2); }
.am-comparer label { display: inline-flex; align-items: center; gap: 6px; font-weight: 600; }
.am-comparer select { font: inherit; font-size: 14px; padding: 7px 10px; min-height: 38px; border: 1px solid var(--line-2);
  border-radius: 5px; background: var(--surface); color: var(--night); font-weight: 600; min-width: 220px; }
.am-duo { display: flex; flex-wrap: wrap; gap: 6px 18px; margin: 0 0 10px; font-size: 12.5px; font-weight: 600; color: var(--ink); }
.am-duo span::before, .am-fig-nom::before { content: ""; display: inline-block; width: 10px; height: 10px; border-radius: 2px;
  margin-right: 6px; vertical-align: -1px; background: var(--j); }
.am-duo-j1 { --j: var(--sand-2); } .am-duo-j2 { --j: var(--j3); }

/* ── Sections ── */
.am-section { margin-top: 30px; }
.am-section-tete { display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between; gap: 4px 16px;
  padding-bottom: 8px; margin-bottom: 14px; border-bottom: 1px solid var(--line); }
.am-h { margin: 0; font-family: 'Barlow Condensed', sans-serif; font-size: 17px; font-weight: 700; text-transform: uppercase;
  letter-spacing: .7px; color: var(--night); }
.am-legende-tete { margin: 0; font-size: 12.5px; color: var(--muted); display: inline-flex; align-items: center; gap: 4px; flex-wrap: wrap; }
.am-fleche { transform: rotate(180deg); }
.am-tend-haut { color: var(--p-elite-tx); } .am-tend-bas { color: var(--p-poor-tx); }

/* ── Lignes de percentile du poste ── */
.am-lignes { display: grid; gap: 10px; }
.am-ligne { display: grid; grid-template-columns: minmax(150px, 220px) minmax(0, 1fr) 190px; align-items: center; gap: 4px 14px; }
.am-ligne-duo { padding-bottom: 8px; border-bottom: 1px dashed var(--line); }
.am-lbl { font-size: 13.5px; color: var(--ink); font-weight: 500; text-align: right; }
.am-lbl-j2 { font-size: 12px; color: var(--muted); }
.am-track { position: relative; height: 16px; border-radius: 3px; background: var(--paper); overflow: hidden; }
.am-track::after { content: ""; position: absolute; left: 50%; top: 2px; bottom: 2px; width: 1px; background: var(--line-2); }
.am-track-j2 { height: 9px; }
.am-fill { position: absolute; inset: 0 auto 0 0; border-radius: 3px; background: var(--tc, var(--line-2));
  transition: width .5s cubic-bezier(.16, 1, .3, 1); }
.am-val { display: grid; grid-template-columns: auto 1fr auto 16px; align-items: baseline; gap: 8px; white-space: nowrap; }
.am-val b { font-family: 'Barlow Condensed', sans-serif; font-weight: 800; font-size: 18px; color: var(--ink); }
.am-val-j2 b { font-size: 14px; color: var(--ink-2); }
.am-det { font-size: 11.5px; color: var(--muted); }
.am-rg { font-family: 'Barlow Condensed', sans-serif; font-weight: 600; font-size: 12.5px; color: var(--muted); text-align: right; }
.am-rg sup { font-size: .72em; }
.am-tend-vide { width: 16px; }
.am-val .ic { align-self: center; }

/* ── Familles de statistiques (Son poste, Attaque, Construction, Ballon, Défense, Valeur) ── */
.am-cat[hidden] { display: none; }
.am-cat-t { margin: 0 0 12px; display: flex; flex-wrap: wrap; align-items: baseline; gap: 2px 12px; }
.am-cat-t b { font-family: 'Barlow Condensed', sans-serif; font-size: 15px; font-weight: 700; text-transform: uppercase;
  letter-spacing: .6px; color: var(--night); }
.am-cat-t span { font-size: 12.5px; color: var(--muted); }
.am-cat-moy { margin-left: 7px; padding-left: 7px; border-left: 1px solid var(--line-2); font-family: 'Barlow Condensed', sans-serif;
  font-weight: 700; font-size: 13px; opacity: .8; }
.am-cats { margin-bottom: 16px; }

/* ── Le terrain ── */
.am-calques { margin-bottom: 12px; }
.am-calques[hidden] { display: none; }
.am-scene { display: grid; grid-template-columns: minmax(0, 1fr) 248px; gap: 18px; align-items: start; }
.am-scene-duo { grid-template-columns: minmax(0, 1fr); }
.am-terrains { display: grid; gap: 12px; }
.am-scene-duo .am-terrains { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.am-scene-duo .am-detail { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); }
.am-fig { margin: 0; }
.am-fig-nom { font-size: 12.5px; font-weight: 600; color: var(--ink); margin: 0 0 6px; }
.am-calque[hidden] { display: none; }
.am-terrain { display: block; width: 100%; height: auto; border-radius: var(--radius); background: var(--night);
  box-shadow: 0 1px 2px rgba(18, 26, 38, .25), 0 8px 24px -12px rgba(18, 26, 38, .45); }
.am-fig .am-calque + .am-calque { margin-top: 12px; }
.tr-lignes rect, .tr-lignes line, .tr-lignes circle, .tr-lignes path { fill: none; stroke: rgba(224, 192, 144, .32); stroke-width: .35; }
.tr-lignes .tr-point { fill: rgba(224, 192, 144, .45); stroke: none; }
.tr-lignes .tr-but { fill: rgba(224, 192, 144, .6); stroke: none; }
.am-chaleur rect { fill: var(--sand); }
.am-moy circle { fill: var(--night); stroke: var(--on-night); stroke-width: .6; }
.am-moy text { font-family: 'Barlow Condensed', sans-serif; font-weight: 800; font-size: 4.2px; fill: var(--on-night); }
.am-p { stroke-width: .5; stroke-linecap: round; transition: opacity .2s; }
.am-p-ok { stroke: rgba(255, 255, 255, .5); }
.am-p-prog { stroke: var(--sand); stroke-width: .65; }
.am-p-cle { stroke: #8EC0EA; stroke-width: .8; }
.am-p-ko { stroke: rgba(242, 164, 147, .6); stroke-dasharray: 1.1 .9; }
.am-fl-ok { fill: rgba(255, 255, 255, .7); } .am-fl-prog { fill: var(--sand); }
.am-fl-cle { fill: #8EC0EA; } .am-fl-ko { fill: rgba(242, 164, 147, .8); }
.am-p-cache, .am-def-cache { opacity: .06; }
.am-conduite { stroke: var(--sand); stroke-width: .6; stroke-dasharray: 1.4 1; opacity: .8; }
.am-tir { stroke: var(--on-night); stroke-width: .45; fill: rgba(255, 255, 255, .06); }
.am-tir-but { fill: var(--sand); stroke: var(--sand); }
.am-tir-cadre { fill: rgba(255, 255, 255, .85); }
.am-def { stroke-width: .5; transition: opacity .2s; }
.am-def-duel { fill: #fff; stroke: #fff; } .am-def-interception { fill: #8EC0EA; stroke: #8EC0EA; }
.am-def-recuperation { fill: var(--sand); stroke: var(--sand); } .am-def-degagement { fill: #A7B5C8; stroke: #A7B5C8; }
.am-def-contre { fill: #E8A15A; stroke: #E8A15A; } .am-def-pressing { fill: rgba(255, 255, 255, .32); stroke: none; }
.am-def-aerien { fill: transparent; stroke: #F2A493; }
.am-def.am-def-rate { fill: transparent; }

/* ── Le détail du calque (à droite du terrain) ── */
.am-detail-t { margin: 0 0 8px; display: flex; justify-content: space-between; align-items: baseline;
  font-family: 'Barlow Condensed', sans-serif; font-weight: 700; text-transform: uppercase; letter-spacing: .7px;
  font-size: 13.5px; color: var(--night); }
.am-detail-t span { color: var(--muted); font-weight: 600; }
.am-detail-txt { margin: 8px 0 0; font-size: 12.5px; line-height: 1.5; color: var(--ink-2); }
.am-filtres { list-style: none; margin: 0; padding: 0; border-top: 1px solid var(--line); }
.am-filtres li { border-bottom: 1px solid var(--line); }
.am-filtre { width: 100%; display: grid; grid-template-columns: 14px 1fr auto; align-items: center; gap: 8px; min-height: 38px;
  padding: 4px 8px; border: 0; background: transparent; color: var(--ink); font: inherit; font-size: 13px; text-align: left; cursor: pointer; }
.am-filtre:hover { background: var(--paper); }
.am-filtre.est-actif { background: var(--night); color: var(--on-night); }
.am-filtre span { font-family: 'Barlow Condensed', sans-serif; font-weight: 700; font-size: 14px; }
.am-filtre:focus-visible { outline: 2px solid var(--night); outline-offset: -2px; }
.am-puce { display: inline-block; width: 12px; height: 12px; border-radius: 50%; border: 1.5px solid transparent; }
.am-puce-tout { background: conic-gradient(var(--sand) 0 25%, #fff 0 50%, #8EC0EA 0 75%, #F2A493 0); border-color: var(--night); }
.am-puce-prog { background: var(--sand); } .am-puce-ok { background: #fff; border-color: var(--line-2); }
.am-puce-cle { background: #8EC0EA; } .am-puce-ko { background: #F2A493; }
.am-puce-pression, .am-puce-longue, .am-puce-centre { background: transparent; border-color: var(--muted); }
.am-filtre.est-actif .am-puce-pression, .am-filtre.est-actif .am-puce-longue, .am-filtre.est-actif .am-puce-centre { border-color: var(--night-mut); }
.am-puce-tir-but { background: var(--sand); } .am-puce-tir-cadre { background: var(--night); }
.am-puce-tir-rate, .am-puce-tir-contre { border-color: var(--night); }
.am-detail .am-puce.am-def-duel { background: #fff; border-color: var(--line-2); }
.am-detail .am-puce.am-def-interception { background: #8EC0EA; } .am-detail .am-puce.am-def-recuperation { background: var(--sand); }
.am-detail .am-puce.am-def-degagement { background: #A7B5C8; } .am-detail .am-puce.am-def-contre { background: #E8A15A; }
.am-detail .am-puce.am-def-pressing { background: rgba(27, 39, 56, .25); }
.am-detail .am-puce.am-def-aerien { border-color: #E07A62; }
.am-journal { list-style: none; margin: 0; padding: 0; border-top: 1px solid var(--line); }
.am-journal li { display: grid; grid-template-columns: 34px 16px 1fr auto; align-items: center; gap: 6px; padding: 7px 4px;
  border-bottom: 1px solid var(--line); font-size: 13px; }
.am-journal li > .tnum:first-child { color: var(--muted); font-size: 12px; }
.am-journal-v { font-family: 'Barlow Condensed', sans-serif; font-weight: 700; font-size: 14px; }
.am-actions .am-journal li { grid-template-columns: 34px 1fr auto; }
.am-vide { color: var(--muted); display: block !important; }

/* ── Déroulé ── */
.am-courbe { display: block; width: 100%; height: auto; overflow: visible; }
.am-zero { stroke: var(--line-2); stroke-width: 1; }
.am-mi { stroke: var(--line); stroke-width: 1; stroke-dasharray: 3 3; }
.am-axe { font-family: 'Barlow', sans-serif; font-size: 10px; fill: var(--muted); }
.am-aire { opacity: .16; } .am-aire-pos { fill: var(--p-elite); } .am-aire-neg { fill: var(--p-poor); }
.am-ligne { fill: none; stroke: var(--night); stroke-width: 2; stroke-linejoin: round; stroke-linecap: round; }
.am-marque { stroke: var(--surface); stroke-width: 1.6; }
.am-marque-top { fill: var(--p-elite); } .am-marque-flop { fill: var(--p-poor); }
.am-pos { color: var(--p-elite-tx); } .am-neg { color: var(--p-poor-tx); }
.am-actions { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px 32px; margin-top: 14px; }

/* ── Physique : 1re et 2e mi-temps ── */
.am-mt { margin-top: 18px; padding-top: 12px; border-top: 1px dashed var(--line); max-width: 760px; }
.am-mt-leg { display: inline-flex; align-items: center; gap: 6px; font-family: 'Barlow', sans-serif; font-size: 12px;
  font-weight: 400; text-transform: none; letter-spacing: 0; color: var(--muted); }
.am-mt-leg i { display: inline-block; width: 10px; height: 10px; border-radius: 2px; margin-left: 6px; }
.am-mt-c1 { background: var(--night); } .am-mt-c2 { background: #8A97AA; }
.am-mt-ligne { display: grid; grid-template-columns: minmax(150px, 220px) minmax(0, 1fr) 64px; align-items: center;
  gap: 14px; padding: 6px 0; }
.am-mt-lbl { font-size: 13px; color: var(--ink); text-align: right; }
.am-mt-barres { display: grid; gap: 3px; }
.am-mt-b { display: flex; align-items: center; gap: 8px; }
.am-mt-b i { display: block; height: 9px; border-radius: 2px; }
.am-mt-b b { font-family: 'Barlow Condensed', sans-serif; font-weight: 700; font-size: 13px; color: var(--ink-2); }
.am-mt-ecart { font-family: 'Barlow Condensed', sans-serif; font-weight: 700; font-size: 15px; text-align: right; }
.am-mt-baisse { color: var(--p-poor-tx); } .am-mt-hausse { color: var(--p-elite-tx); } .am-mt-stable { color: var(--muted); }
@media (max-width: 720px) {
  .am-mt-ligne { grid-template-columns: minmax(0, 1fr) 56px; }
  .am-mt-lbl { grid-column: 1 / -1; text-align: left; }
}

/* En comparaison, le détail passe SOUS les deux terrains : les filtres
   redeviennent une rangée de puces plutôt qu'une colonne étirée. */
.am-scene-duo .am-filtres { display: flex; flex-wrap: wrap; gap: 6px; border: 0; }
.am-scene-duo .am-filtres li { border: 0; }
.am-scene-duo .am-filtre { width: auto; border: 1px solid var(--line-2); border-radius: 999px; padding: 4px 12px; min-height: 36px; }
.am-scene-duo .am-filtre span { margin-left: 4px; }

/* ── 360 : le relevé, sur papier ── */
.am-releve-360 { margin: 0; display: grid; grid-template-columns: repeat(auto-fit, minmax(170px, 1fr)); gap: 14px 0; }
.am-releve-360 li { border-right: 0; border-left: 1px solid var(--line); padding: 0 16px; flex-direction: column; gap: 6px; }
.am-releve-360 .v { color: var(--night); }
.am-releve-360 .l { color: var(--ink-2); }
.am-rg-txt { color: var(--tc-texte, var(--muted)); font-weight: 700; }
.am-note-bas { max-width: 90ch; }

@media (max-width: 1180px) {
  .am-zone { grid-template-columns: minmax(0, 1fr); }
  .am-registre { position: static; }
  .am-reg-liste { max-height: 228px; }
  .am-scene { grid-template-columns: minmax(0, 1fr); }
  .am-detail { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); }
}
@media (max-width: 720px) {
  .am-bandeau { padding: 14px 16px; }
  .am-titre { font-size: 22px; } .am-score { font-size: 24px; }
  .am-releve { width: 100%; }
  .am-releve > div { padding: 0 14px; }
  .am-releve dd b { font-size: 24px; }
  .am-ligne { grid-template-columns: minmax(0, 1fr) auto; }
  .am-lbl { text-align: left; grid-column: 1 / -1; }
  .am-track { grid-column: 1; }
  .am-val { grid-template-columns: auto auto 16px; }
  .am-val .am-det { display: none; }
  .am-scene-duo .am-terrains { grid-template-columns: minmax(0, 1fr); }
  .am-actions { grid-template-columns: minmax(0, 1fr); }
  .am-axe { font-size: 16px; }
  .am-comparer select { font-size: 16px; width: 100%; }
}

/* ── Vigie : ses derniers matchs (outil matchs_joueur) ── */
.asst-matchs-table th[scope=row] a { color: var(--ink); text-decoration: none; font-weight: 600; }
.asst-matchs-table th[scope=row] a:hover { color: var(--night); text-decoration: underline; text-underline-offset: 3px; }
.asst-matchs-date { display: inline-block; min-width: 52px; color: var(--muted); font-weight: 400; }
.asst-matchs-table .fitpct { min-width: 32px; text-align: center; font-size: 12.5px; }

/* ── /matchs/ : la cellule était-elle au stade ? ── */
.match-vu { display: inline-flex; align-items: center; gap: 5px; font-size: 12px; font-weight: 600; color: var(--night); white-space: nowrap; }
.match-vu .n { display: inline-flex; align-items: center; justify-content: center; width: 22px; height: 22px; border: 1px solid;
  border-radius: 5px; font-family: 'Barlow Condensed', sans-serif; font-weight: 800; font-size: 13px; }

/* ── Bilan complet du match en direct ── */
.ml-bilan-score { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 10px; margin: 0 0 16px; padding: 10px 12px;
  border: 1px solid var(--line); border-radius: var(--radius); background: var(--paper); }
.ml-score-eq { display: inline-flex; align-items: center; gap: 8px; font-weight: 600; font-size: 13.5px; color: var(--ink); }
.ml-score-eq span { max-width: 140px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ml-bilan-score input[type=number] { width: 52px; height: 40px; text-align: center; font-family: 'Barlow Condensed', sans-serif;
  font-weight: 800; font-size: 20px; border: 1px solid var(--line-2); border-radius: 6px; background: var(--surface); color: var(--night); }
.ml-score-tiret { font-weight: 800; color: var(--muted); }
.ml-bilan-score .btn { margin-left: auto; }
.ml-bilan-lab { font-family: 'Barlow Condensed', sans-serif; font-weight: 600; text-transform: uppercase; letter-spacing: .7px;
  font-size: 11.5px; color: var(--muted); }
.ml-bilan-propose { font-family: 'Barlow', sans-serif; font-style: normal; text-transform: none; letter-spacing: 0; color: var(--sand-fg); }
.ml-bilan-form { display: grid; gap: 12px; margin: 6px 0 0; }
.ml-bilan-champ { display: flex; flex-direction: column; gap: 5px; min-width: 0; }
.ml-bilan-notes { display: flex; flex-wrap: wrap; gap: 12px 24px; }
.ml-bilan-match { display: grid; grid-template-columns: minmax(230px, auto) 90px minmax(150px, 1fr); gap: 10px 14px; align-items: end; }
.rf-domaines > summary { flex-wrap: wrap; }
.ml-bilan-form input[type=number], .ml-bilan-form select, .ml-bilan-form textarea {
  font-family: 'Barlow', sans-serif; font-size: 14px; padding: 8px 10px; width: 100%;
  border: 1px solid var(--line-2); border-radius: 5px; background: var(--surface); color: var(--ink); }
.ml-bilan-form textarea { resize: vertical; line-height: 1.5; }
.ml-bilan-form .recos .reco-opt { flex: 1 1 140px; }
.ml-bilan-form .recos .reco-opt span { padding: 9px 12px; }
.ml-bilan-plus > summary { cursor: pointer; font-size: 13px; font-weight: 600; color: var(--night); min-height: 34px; display: flex; align-items: center; }
.ml-bilan-pied { display: flex; align-items: center; justify-content: space-between; gap: 10px; }
.ml-bilan-pied .btn { min-height: 40px; padding-left: 22px; padding-right: 22px; }

@media (max-width: 720px) {
  .rf-match-grille, .rf-domaines-grille, .ml-bilan-domaines { grid-template-columns: minmax(0, 1fr); }
  /* Un domaine = son nom au-dessus, ses cinq boutons sur toute la largeur. */
  .rf-domaine { flex-direction: column; align-items: stretch; gap: 4px; }
  .notes-vide-ok { display: flex; width: 100%; }
  .notes-vide-ok .note-opt { flex: 1 1 0; min-width: 0; }
  .notes-vide-ok .note-opt span { width: 100%; height: 40px; }
  .rf .rf-match input[type=number], .ml-bilan-form input[type=number], .ml-bilan-form select,
  .ml-bilan-form textarea, .ml-bilan-score input[type=number] { font-size: 16px; }
  .ml-bilan-match { grid-template-columns: minmax(0, 1fr) 90px; }
  .ml-bilan-poste { grid-column: 1 / -1; }
  .ml-bilan-notes { flex-direction: column; }
  /* Score : « Équipe A [ ] – [ ] Équipe B » sur une ligne, centré sur le tiret. */
  .ml-bilan-score { display: grid; grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr); }
  .ml-bilan-score > .ml-bilan-lab, .ml-bilan-score .btn { grid-column: 1 / -1; }
  .ml-score-eq { justify-self: end; }
  .ml-score-eq-ext { justify-self: start; }
  .ml-score-eq span { max-width: 92px; }
  .ml-bilan-score .btn { margin-left: 0; width: 100%; }
  .forme-corps--2 { grid-template-columns: minmax(0, 1fr); }
  .forme-axe { font-size: 11px; }
  .forme-matchs li { grid-template-columns: 44px minmax(0, 1fr) auto auto; }
  .forme-lien { grid-column: 2 / -1; justify-self: start; }
  .forme-dom { grid-template-columns: 70px minmax(0, 1fr) 34px; }
  .forme-dom-n { display: none; }
}
.ml-rapport-page { max-width: 920px; margin: 0 auto; }
.ml-rapport-retour { display: inline-flex; min-height: 44px; align-items: center; }
.ml-rapport-entete { display: flex; align-items: center; gap: 14px; margin: 8px 0 18px; }
.ml-rapport-entete h1 { margin: 0; font-size: clamp(24px, 6vw, 38px); }
.ml-rapport-entete p { margin: 3px 0 0; color: var(--muted); }
.ml-rapport-formulaire { display: block; }
.ml-brouillon-pastille {
  color: #201b12; background: var(--sand); border-radius: 999px;
  padding: .18rem .42rem; font-size: .68rem; font-weight: 700;
}
.brouillon-rappel { margin: .75rem 0; padding: .75rem 1rem; border-left: 3px solid var(--sand); background: rgba(224,192,144,.14); }
.brouillons-barre { position: sticky; bottom: .75rem; z-index: 40; display: flex; justify-content: center; padding: .55rem; pointer-events: none; }
.brouillons-barre[hidden] { display: none; } /* la classe pose display:flex : sans ça `hidden` ne masque rien */
.brouillons-barre button { pointer-events: auto; box-shadow: 0 8px 26px rgba(0,0,0,.28); }
.brouillon-etat { min-height: 1.25rem; margin: .4rem 0 0; color: var(--muted, #777); font-size: .8rem; }
.ml-rapport-navigation { display: flex; justify-content: space-between; gap: .75rem; margin-top: 1rem; }
.ml-rapport-panneau-fond { position: fixed; inset: 0; z-index: 880; background: rgba(11,18,29,.72); }
.ml-rapport-panneau-fond[hidden], .ml-rapport-panneau[hidden], .ml-rapport-erreur[hidden] { display: none; }
.ml-rapport-panneau { position: fixed; inset: 0; z-index: 890; overflow: auto; background: var(--paper, #fff); color: var(--ink, #172231); }
.ml-rapport-panneau-barre { position: sticky; top: 0; z-index: 2; display: flex; align-items: center; justify-content: space-between; min-height: 56px; padding: .5rem 1rem; background: var(--night); color: #fff; }
.ml-rapport-panneau-barre h2 { margin: 0; font-size: 1.2rem; }
.ml-rapport-fermer { width: 44px; height: 44px; border: 0; border-radius: 50%; background: transparent; color: inherit; font-size: 1.35rem; cursor: pointer; }
.ml-rapport-panneau-corps { padding: 1rem; outline: none; }
.ml-rapport-panneau .ml-rapport-retour { display: none; }
.ml-rapport-chargement { margin: 3rem auto; max-width: 32rem; text-align: center; }
.ml-rapport-erreur { padding: .75rem; border-left: 3px solid #b83a3a; background: #fff0f0; }
body.ml-rapport-ouvert { overflow: hidden; }
@media (min-width: 900px) {
  .ml-rapport-panneau { left: auto; width: min(860px, 86vw); box-shadow: -16px 0 42px rgba(0,0,0,.35); }
  .ml-rapport-panneau-corps { padding: 1.5rem 2rem 3rem; }
}
