/* Statsmaker v2 — écran Glossaire.
 *
 * 🛑 POURQUOI CETTE FEUILLE A TRIPLÉ DE TAILLE.
 *
 * `v2/glossaire.html` était le SEUL des sept gabarits v2 à porter des styles en
 * ligne — 22 occurrences, contre 2 ou 3 pour chacun des six autres. Il est
 * aussi le seul des sept à avoir dérivé de la maquette, et ce n'est pas une
 * coïncidence : les deux écarts les plus visibles relevés par la partie 10 du
 * design étaient précisément deux valeurs restées en dur dans ce gabarit —
 * `top: 52px` sur la barre de catégories (recopié de la maquette, jamais
 * recalculé quand les contrôles sont passés à 44 px) et le `<div>` d'enrobage
 * qui avait sorti le bouton PDF de l'en-tête.
 *
 * Une valeur écrite dans un gabarit n'est révisée par personne le jour où le
 * système change autour d'elle. Tout est ici, et tout ce qui peut l'être passe
 * par un jeton.
 *
 * La maquette pose l'état des puces de catégorie en style en ligne calculé par
 * du JavaScript (`bg`, `color`, `border` recalculés à chaque rendu). Ici l'état
 * est porté par `aria-pressed` — donc annoncé aux technologies d'assistance —
 * et le style en découle. Une seule source de vérité, et l'information ne passe
 * plus par la seule couleur.
 */

/* ── Chapeau de page ────────────────────────────────────────────────────── */
.sm-gloss-titre { font-size: var(--fs-score); margin: 0 0 6px; }
.sm-gloss-chapeau {
  color: var(--color-neutral-700); font-size: 15px;
  margin: 0 0 20px; text-wrap: pretty;
}

/* Bouton « Télécharger en PDF », rendu dans la FENTE D'ACTIONS de l'en-tête
   (`v2/partials/_actions_glossaire.html`) et non dans le corps — É-1. Valeurs
   de la maquette (`Glossary.dc.html:28-32`). `.btn` lui impose déjà
   `min-height: var(--sm-tap-min)`, ce qui ne coûte rien : la barre d'en-tête
   est haute de 44 px à cause de ses icônes. */
.sm-gloss-pdf { padding: 7px 15px; font-size: var(--fs-ui); }

/* ── Champ de filtre ────────────────────────────────────────────────────── */
/* La bordure n'est PAS dans la maquette et elle reste : la pilule blanche sur
   fond `--color-bg` y a un contraste de limite de 1,06:1, sous le 3:1 de WCAG
   1.4.11 (arbitrage F-4 / F-4bis, partie 7 §6.6). En revanche le
   `min-height: 36px` que portait l'input n'était prescrit nulle part — ni la
   maquette (aucune hauteur) ni la règle maison (44 px) : 21 px de haut gagnés
   pour rien. Il est remplacé par `.sm-touch-champ` (`sm-tokens.css`), qui donne
   la cible de 44 px sans changer un pixel visible. */
.sm-gloss-filtre {
  display: flex; align-items: center; gap: var(--sp-3);
  background: var(--color-surface);
  border: 1px solid var(--sm-border-field); border-radius: var(--r-pill);
  padding: 8px 16px; max-width: 360px; margin-bottom: 20px;
}
.sm-gloss-loupe { display: flex; color: var(--color-neutral-500); }
.sm-gloss-q {
  border: none; background: none;
  font-size: var(--fs-body); width: 100%;
  color: inherit; font-family: inherit;
}
/* 🛑 DÉFAUT TROUVÉ EN SORTANT LES STYLES EN LIGNE, et c'est la démonstration
   de §3 : l'`outline: none` du champ vivait dans un `style=` du gabarit, donc
   HORS DE PORTÉE de `test_v2_css.PorteeEtSpecificiteTests`, qui balaye les
   feuilles. Il a rougi à la seconde où la déclaration est entrée dans un
   fichier CSS. Servi tel quel, le champ de filtre du glossaire n'avait
   AUCUN repère au clavier (WCAG 2.4.7) — troisième occurrence de ce motif
   sur ce chantier, et la première qu'aucun test ne pouvait voir.

   L'anneau est posé sur la PILULE, qui est le contrôle visible ; l'annuler sur
   le champ est alors borné à l'état de focus, pas au composant.
   `:focus-within` et non `:has(:focus-visible)` : l'audience est en 3G sur des
   navigateurs anciens, et `:focus-within` est disponible depuis 2018. Le prix
   est de montrer l'anneau aussi au clic — un anneau de trop vaut mieux qu'un
   anneau manquant. */
.sm-gloss-q:focus-visible { outline: none; }
.sm-gloss-filtre:focus-within {
  outline: 2px solid var(--color-accent); outline-offset: 2px;
}

/* ── Barre de catégories (collante) ─────────────────────────────────────── */
/* ⚠️ `top: var(--sm-shell-h)` et JAMAIS un nombre. Ce `top` valait `52px`,
   recopié de la maquette dont l'en-tête fait 62 px ; le nôtre en fait 67 (63
   sous 640 px) depuis que les contrôles sont passés à 44 px. La barre passait
   donc 15 px sous un en-tête translucide à `backdrop-filter: blur(10px)` : les
   puces apparaissaient rognées et floues par le haut dès qu'on défilait. Le
   jeton est CALCULÉ à partir du padding et de la hauteur de contrôle réels
   (`sm-tokens.css`) : il suit tout seul le prochain changement. */
/* ⚠️ Le `gap` de 7 px est PLUS PETIT que le débord de `.sm-touch` (8,5 px pour
   une puce de 27) : c'est le seul endroit du produit où R-T (b) n'est pas tenu,
   et c'est un arbitrage, pas un oubli — 1,5 px de recouvrement entre deux
   lignes de puces, mesurés, contre une densité que le client a choisie (le
   détail est plus bas, sur `.sm-gloss-chip`). Les deux variables ci-dessous
   déclarent le cas pour que la garde le VOIE au lieu de l'ignorer :
   `test_socle_cibles_tactiles.py` le porte dans ses arbitrages écrits. */
/* ── `--sm-collant-h` : cette barre EST le second étage collant du glossaire.
 * Déclarée sur `:root` — licite ici, cette feuille n'étant chargée que par
 * `v2/glossaire.html` — et DÉRIVÉE de ses trois composants réels :
 * 2 × 10 (padding) + 27 (hauteur visible d'une puce) + 1 (filet) = 48 px.
 * Elle sert le décalage d'ancre de `.sm-gloss-terme`, plus bas, qui annonçait
 * jusqu'ici une valeur « dérivée » de 53 px… écrite à la main, et fausse de
 * 5 px. `--sm-collant-top` en découle aussi, pour tout collant de 3ᵉ rang que
 * l'écran gagnerait. */
:root {
  --sm-gloss-barre-pad-y: 10px;
  --sm-gloss-chip-h: 27px;      /* hauteur visible d'une `.sm-gloss-chip` */
  --sm-gloss-barre-filet: 1px;
  --sm-collant-h: calc(var(--sm-gloss-barre-pad-y) * 2
                       + var(--sm-gloss-chip-h)
                       + var(--sm-gloss-barre-filet));
}
.sm-gloss-barre {
  --sm-touch-h: var(--sm-gloss-chip-h);
  --sm-touch-membre: sm-gloss-chip; /* le membre qui porte `.sm-touch` */
  position: sticky; top: var(--sm-shell-h); z-index: 15;
  background: color-mix(in srgb, var(--color-bg) 92%, transparent);
  backdrop-filter: blur(8px);
  display: flex; gap: 7px; flex-wrap: wrap; align-items: center;
  padding: var(--sm-gloss-barre-pad-y) 0; margin-bottom: 10px;
  border-bottom: var(--sm-gloss-barre-filet) solid var(--color-divider);
}
.sm-gloss-compteur {
  margin-left: auto; font-size: var(--fs-cap); color: var(--color-neutral-700);
}

/* 🛑 D-B — SUR TÉLÉPHONE, LA BARRE SE REPLIE EN UN SEUL RANG DÉFILANT.
 *
 * Ce que la mesure montrait (rapport 14, §5.2), à hauteur d'écran réelle :
 *
 *   320×568 : en-tête 63 + barre 245 + onglets 66 = 374 figés → 194 px de lecture
 *   360×640 : en-tête 63 + barre 212 + onglets 66 = 341 figés → 299 px de lecture
 *
 * Soit 66 % et 53 % de l'écran gelés, pour UNE fiche de terme lisible à 320 px.
 * Le design pose en partie 3 §E.5 un engagement chiffré — « sur 360×640, après
 * l'en-tête, il reste environ 580 px » — que la fidélité à la maquette (neuf
 * puces sur six lignes) contredit frontalement. Le client a tranché pour §E.5,
 * sur téléphone SEULEMENT : au-dessus de 640 px, rien ne change ici.
 *
 * POURQUOI UN RANG DÉFILANT PLUTÔT QU'UNE BARRE DÉCOLLÉE. Les deux récupèrent
 * de la lecture, mais pas au même moment :
 *
 *   - décoller la barre (`position: static`) ne rend RIEN au premier écran :
 *     les 212 px sont toujours dans le flux, en haut du document. Le gain
 *     n'arrive qu'après avoir fait défiler — c'est-à-dire après avoir traversé
 *     la barre — et il se paie en perdant l'accès aux catégories ;
 *   - un seul rang défilant fait tomber la barre de 212 à 48 px TOUT DE SUITE,
 *     garde les neuf puces atteignables (au doigt par le défilement, au clavier
 *     par la tabulation, qui fait défiler le conteneur toute seule puisque les
 *     puces sont de vrais `<button>`), et la barre reste collante.
 *
 * `flex-wrap: nowrap` est sans danger ICI, contrairement à l'en-tête : cette
 * barre n'alimente aucune constante dérivée. C'est l'inverse qui était le
 * problème — c'est le REPLI sur six lignes qui faisait varier sa hauteur.
 *
 * ⚠️ `overflow-x: auto` force `overflow-y` à `auto` : la hauteur du rang doit
 * donc contenir le pseudo-élément de `.sm-touch` (44 px centrés sur une puce
 * de 27), sans quoi une barre de défilement verticale apparaîtrait. Le padding
 * de 10 px de la barre y suffit (10 + 27 + 10 = 47 ≥ 44) — ne pas le réduire.
 *
 * `.sm-gloss-compteur` perd son `margin-left: auto` : dans un conteneur qui
 * défile, « à droite » n'existe plus, et la marge automatique le repoussait
 * hors de vue derrière les neuf puces. Il suit la dernière puce. */
@media (max-width: 640px) {
  .sm-gloss-barre { flex-wrap: nowrap; overflow-x: auto; overscroll-behavior-x: contain; }
  .sm-gloss-compteur { margin-left: 0; }
}

/* Puces de catégorie — `padding: 5px 13px` est la valeur de la maquette
   (`Glossary.dc.html:41`), soit une puce de 27 px. Le `min-height: 36px` qui
   était ici n'était ni la maquette ni les 44 px de la règle maison : une valeur
   intermédiaire arbitraire, qui coûtait 9 px par puce et, à 360 px où les neuf
   puces tiennent sur six lignes, 54 px de bandeau figé en haut de l'écran.
   `.sm-touch` (posé dans le gabarit) rend la cible de 44 px sans changer un
   pixel visible — c'est l'outil que la partie 3 du design (l. 320-328) prescrit
   pour ce cas exact.

   ⚠️ Ce qu'il faut savoir : le pseudo-élément de `.sm-touch` fait 44 px de haut
   pour une puce de 27, soit 8,5 px de débord de part et d'autre, pour un
   `gap` de 7 px entre les lignes — donc 1,5 px de recouvrement entre deux
   lignes de puces. Une puce reste attribuée à la dernière ligne peinte sur ces
   1,5 px. C'est le prix de la règle, il est mesuré, et il est très inférieur au
   défaut qu'elle remplace (une cible de 27 px de haut). */
.sm-gloss-chip {
  cursor: pointer; white-space: nowrap; flex: none;
  padding: 5px 13px;
  border: 1px solid var(--sm-border-field); border-radius: var(--r-pill);
  font-family: inherit; font-size: var(--fs-meta); font-weight: 600;
  background: transparent; color: var(--color-text);
}
.sm-gloss-chip:hover { background: var(--color-neutral-200); }
.sm-gloss-chip[aria-pressed="true"] {
  background: var(--color-accent); border-color: var(--color-accent); color: var(--color-bg);
}

/* ── Catégories et fiches de terme ──────────────────────────────────────── */
/* ⚠️ NE RIEN TOUCHER ICI SANS LA MAQUETTE SOUS LES YEUX. La partie 10 du design
   a comparé douze propriétés de la fiche de terme, valeur par valeur, avec
   `Glossary.dc.html:48-53` : écart ZÉRO. C'est la seule partie de l'écran qui
   soit fidèle au pixel, et c'est celle qui porte le contenu. */
.sm-gloss-cats { display: flex; flex-direction: column; gap: var(--sp-9); }
.sm-gloss-cat-titre {
  margin: 0 0 10px; font-size: 15px; text-transform: uppercase;
  letter-spacing: .05em; color: var(--color-accent-700);
}
.sm-gloss-cat-compte { color: var(--color-neutral-600); font-weight: 400; }
.sm-gloss-colonnes { columns: 300px 3; column-gap: var(--sp-5); }
.sm-gloss-terme {
  break-inside: avoid; margin: 0 0 var(--sp-5);
  /* Décalage d'ancre : la barre collante recouvre le haut du document. Il est
     DÉRIVÉ d'elle — en-tête + hauteur de la barre — au lieu du `120px` en dur
     qui vivait dans le gabarit et qui, lui non plus, n'avait pas suivi le
     passage des contrôles à 44 px.
     ⚠️ Et il ne l'était PAS encore quand on l'a écrit : le `+ 53px` qui vivait
     ici se disait dérivé et ne l'était pas — la barre mesure 48 px, 58 si l'on
     compte sa marge basse ; 53 était la moyenne des deux, donc faux dans les
     deux cas. Le mensonge tenait dans le seul fichier qui explique pourquoi il
     ne faut pas écrire de nombre. */
  scroll-margin-top: calc(var(--sm-shell-h) + var(--sm-collant-h));
  background: var(--color-surface); border-radius: var(--r-card);
  padding: 16px 18px; box-shadow: var(--shadow-sm);
}
.sm-gloss-terme-titre { margin: 0; font-size: var(--fs-h4); text-wrap: balance; }
.sm-gloss-alias {
  font-size: var(--fs-cap); color: var(--color-neutral-700);
  margin-top: 4px; line-height: 1.45; text-wrap: pretty;
}
.sm-gloss-def {
  font-size: var(--fs-body); line-height: 1.55; margin: 8px 0 0;
  color: var(--color-neutral-800); text-wrap: pretty;
}
.sm-gloss-formule {
  margin-top: 10px; font-size: var(--fs-meta); font-family: var(--font-heading);
  background: var(--color-bg); border-radius: var(--r-icon);
  padding: 8px 12px; display: inline-block;
}
.sm-gloss-vide {
  text-align: center; color: var(--color-neutral-700);
  padding: 30px; font-size: var(--fs-body);
}


/* ── Barème de la note de match (design §9.2) ────────────────────────────
 * Les règles vivent dans `css/glossaire-bareme.css`, partagée avec le front
 * v1. Ne restent ici que les deux lignes qui dépendent de CE gabarit-ci.
 */
/* Le padding horizontal réel de la carte de terme (`.sm-gloss-terme` : 16px
   18px) — déclaré par le front, jamais deviné par la feuille du barème. Le
   panneau s'en sert pour reprendre les marges et récupérer 36 px de largeur
   utile à 360 px. */
[data-sm-terme] { --glo-bareme-pad: 18px; }
/* La seule fiche qui porte un barème traverse le multicolonnes. Sur un moteur
   qui ignorerait `column-span`, on retombe exactement sur le rendu d'avant —
   plus le style, qui lui fonctionne. */
.glo-terme-large { column-span: all; }
