/* `UIV3_TARGETS_44_01` — fermeture des cibles tactiles.
 *
 * POURQUOI CETTE FEUILLE EXISTE SÉPARÉMENT
 * =========================================
 * Ces règles ont d'abord été écrites dans `interaction.css`, dont l'en-tête
 * porte déjà la doctrine « cible tactile 44px ». La CI a refusé :
 * `test_the_family_stays_small` garde ce fichier à SIX primitives réutilisables,
 * et y voyait apparaître quatre racines neuves — `btn`, `topbar`, `foot`,
 * `method-reminder`.
 *
 * La garde avait raison. `interaction.css` CRÉE des primitives ; cette feuille
 * FERME des surfaces héritées. Ce sont deux métiers, et les mélanger aurait
 * transformé le fichier des primitives en dépotoir transversal. La réponse
 * juste était de déménager, pas d'élargir la liste autorisée.
 *
 * Chargée APRÈS `interaction.css` — mais l'ordre importe peu : presque tout
 * ici est enveloppé de `:where()`, donc de spécificité nulle.
 *
 * CE QUI EST FERMÉ, ET CE QUI NE L'EST PAS — `FOUNDATION_CONTRACT §3.2`
 *
 *   A  FREQUENT_SEQUENTIAL     44 requis, chrome inclus : on vise ce qu'on
 *                              voit, et un bouton de 27 px se rate même avec
 *                              une zone étendue.
 *   B  SECONDARY_STANDALONE    zone tactile 44 SANS toucher au chrome — un
 *                              pseudo-élément étend la surface, la
 *                              typographie ne bouge pas.
 *   C  INLINE                  intouché. Gonfler un lien dans une phrase
 *                              casse l'interligne. Exception WCAG 2.5.8.
 *   D  HIDDEN_IMPLEMENTATION   c'est le LABEL qu'on dimensionne, jamais
 *                              l'input clippé qui vit derrière.
 *   E  USER_AGENT_OR_EDITABLE  l'aire éditable elle-même.
 *
 * 44 EST UN STANDARD PRODUIT, PAS UNE OBLIGATION WCAG AA. Le seuil WCAG 2.2
 * niveau AA est 24 × 24 (SC 2.5.8), ou une exception valide — notamment
 * l'espacement. Mesuré sur les sept surfaces : ZÉRO non-conformité AA, avant
 * comme après. Ce qui suit relève du confort en salle, une main occupée.
 *
 * Ce seuil n'est PAS décrit ici comme une obligation juridique : le W3C ne
 * produit pas les lois, et les obligations dépendent de la juridiction
 * (`EN 301 549` / European Accessibility Act en UE).
 *
 * POURQUOI PAS UN `min-height: 44px` GLOBAL
 * ------------------------------------------
 * Le décompte de dette est passé de 161 à 69 sur une seule mesure fraîche :
 * l'original comptait des `input[type=radio]` de 1 × 1 px cachés derrière
 * leurs labels. Une règle générique aurait gonflé 19 étiquettes de champs
 * texte de `/profile` — du texte statique que personne ne touche — et
 * maintenu la vraie dette ailleurs.
 *
 * CE QUE CETTE FEUILLE NE TOUCHE PAS
 * -----------------------------------
 * La console de séance (`.console`, `.dock`, `.setline`, `.session-head`) est
 * un `reference consumer` : 0 violation au dogfood accepté. Aucun sélecteur
 * ci-dessous ne l'atteint, et une garde le vérifie.
 */

/* ── A — commandes et navigation : 44 visible ──────────────────────────────
 * `.btn` mesurait 26,8 px de haut. Sur `/library`, c'est le bouton
 * « Démarrer » de chaque carte de gabarit — l'action la plus fréquente de la
 * surface, répétée 13 fois.
 *
 * `--sm` est délibérément exclu : c'est la variante des actions rares et
 * denses, et l'y inclure reviendrait à supprimer la variante.
 *
 * ⚠ `:where()` N'EST PAS UNE COQUETTERIE — C'EST LE CŒUR DE LA RÈGLE.
 *
 * Écrite en `.btn:not(.btn--sm)`, cette règle a fait RÉTRÉCIR
 * `TERMINER LA SÉANCE` de 56 à 44 px. `.btn--end` portait déjà un
 * `min-height: 56px` délibéré ; ma règle, plus spécifique ET chargée après,
 * l'a ABAISSÉ. Un plancher de 44 posé par-dessus un plancher de 56 rabote la
 * commande dominante de l'état `SESSION REVIEW` — acceptée au dogfood de
 * phase 2.
 *
 * `:where()` compte pour ZÉRO en spécificité : la règle devient un plancher
 * de dernier recours, que n'importe quelle déclaration explicite écrase. Elle
 * ne peut plus que RELEVER.
 *
 * Une garde qui lit des noms de sélecteurs ne voyait rien : la collision est
 * dans la CASCADE, pas dans le texte. Seule la comparaison de géométrie
 * avant/après l'a rendue visible — d'où `scripts/geometry_manifest.py`. */
:where(.btn:not(.btn--sm)) {
  min-height: 44px;
}

/* Onglets de filtre d'historique — navigation séquentielle.
 * `inline-flex` est conservé ICI : `.filter-bar__item` est un `<a>`, qui ne
 * centre pas verticalement son contenu tout seul. Mesuré : 31,5 → 44, rien
 * ne rétrécit. */
:where(.filter-bar__item) {
  min-height: 44px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
}

/* ── D — le label est la cible, l'input est clippé ─────────────────────────
 * `.segmented__option` mesurait 31,5 px. La hauteur se pose sur le `span`
 * visible, qui est ce que le doigt rencontre ; le radio derrière reste
 * masqué-mais-focusable (déclaration unique en tête d'`interaction.css`).
 *
 * La variante `--stacked` porte déjà ses 44 px depuis
 * `Sb_UI_SESSION_CHOICES_DISCLOSURES_01` — elle n'est pas redéclarée. */
:where(.segmented:not(.segmented--stacked) .segmented__option span) {
  min-height: 44px;
  display: flex;
  align-items: center;
  justify-content: center;
}

/* ── E — l'aire éditable ───────────────────────────────────────────────────
 * 39 px mesurés. Cinq pixels manquants sur des champs qu'on remplit au doigt,
 * en salle.
 *
 * CIBLÉ SUR CE QUI EST ÉDITABLE, PAS SUR UN CONTENEUR. La première écriture
 * visait `.field input` : les 19 champs de `/profile` vivent dans
 * `.body-profile__field` et n'ont pas bougé d'un pixel. Poursuivre conteneur
 * par conteneur aurait produit une liste sans fin et un CSS illisible.
 *
 * LES EXCLUSIONS SONT LE CŒUR DE LA RÈGLE, pas un détail. Un `min-height`
 * global sur `input` gonflerait les radios masqués-mais-focusables de 1 × 1 px
 * (`interaction.css`) : ils sortiraient de leur label et casseraient les
 * groupes segmentés. C'est LITTÉRALEMENT l'erreur du décompte 161 — compter,
 * puis gonfler, des objets que personne ne touche.
 *
 * `min-height` ne fait que RELEVER un plancher : un champ déjà à 44 ou plus
 * n'est pas touché. La console de séance, à 0 violation, est donc inchangée —
 * et une garde le vérifie plutôt que de l'espérer. */
:where(input:not([type="radio"]):not([type="checkbox"]):not([type="hidden"]):not([type="submit"]):not([type="button"])),
:where(textarea),
:where(select) {
  min-height: 44px;
}

/* ── B — zone tactile étendue, chrome inchangé ─────────────────────────────
 * `§3.3` : le standard porte sur la surface qui reçoit le doigt, pas sur la
 * taille apparente. Ces liens gardent leur graisse et leur taille de
 * caractère — un pseudo-élément centré porte la zone à 44 px.
 *
 * C'est la forme qui préserve la densité gagnée en phase 2. Grossir le texte
 * de la marque ou du pied de page pour atteindre 44 échangerait un défaut
 * d'accessibilité contre un défaut de densité.
 *
 * `position: relative` est nécessaire au positionnement du pseudo-élément ;
 * `pointer-events` n'est pas touché — le pseudo-élément hérite du lien.
 *
 * `inline-block` N'EST PAS COSMÉTIQUE ICI. Un lien `inline` qui passe sur
 * deux lignes n'a pas UNE boîte mais deux fragments, et un pseudo-élément
 * absolu se cale sur le premier — mesuré sur « Comment c'est calculé → » à
 * 390 px : 4 points sondés sur 5, le cinquième reçu par le conteneur. Ces
 * liens sont tous des actions autonomes sur leur propre ligne ; leur
 * interdire de se scinder rend l'extension fiable sans rien changer au rendu.
 */
.topbar__brand,
.foot__contact,
.method-reminder__more a,
a.text-muted {
  position: relative;
  display: inline-block;
}

/* `.btn--sm` EST la variante des actions rares et denses — c'est sa
 * définition, donc catégorie `B` par construction. Trois usages où elle
 * portait l'action PRINCIPALE d'une surface ont été corrigés au gabarit
 * (« Démarrer » sur `library`, `launcher`, `template_detail`) ; ce qui reste
 * est authentiquement rare : rouvrir un bilan, supprimer, éditer, imprimer.
 *
 * Les grossir inviterait la frappe accidentelle sur des actions dont
 * plusieurs sont destructrices. On étend donc la zone sans toucher au chrome.
 *
 * FRONTIÈRE A/B — « Rouvrir pour éditer » (`session_done`) est un `<button>`,
 * donc `A` à la lettre de la taxonomie, mais ni fréquent ni séquentiel.
 * Classé `B` par l'opérateur le 2026-08-20 : une action rare et potentiellement
 * disruptive ne doit pas recevoir le poids visuel de l'action principale. */
.btn--sm {
  position: relative;
}

.topbar__brand::after,
.foot__contact::after,
.method-reminder__more a::after,
a.text-muted::after,
.btn--sm::after {
  content: "";
  position: absolute;
  left: 50%;
  top: 50%;
  min-width: 44px;
  min-height: 44px;
  width: 100%;
  height: 100%;
  transform: translate(-50%, -50%);
}

/* ══════════════════════════════════════════════════════════════════════════
   UIV3_VISUAL_BASELINE_01 — ce que B8 ne POUVAIT pas voir
   ══════════════════════════════════════════════════════════════════════════

   Chromium verrouille la mise en page dans un `<details>` fermé
   (`content-visibility`) : y mesurer une géométrie rend des faux positifs —
   23 en phase 2. B8 les a donc exclus, et son inventaire était un PLANCHER
   assumé, jamais un total.

   B9 ouvre chaque disclosure, mesure, et fait l'UNION avec l'état par défaut.
   Résultat : **214 occurrences sous le standard, 7 sélecteurs**, entièrement
   invisibles jusqu'ici. Et l'essentiel n'est pas un détail périphérique :
   c'est la NAVIGATION GLOBALE, présente sur les sept surfaces.

   Piège de mesure payé ici : identifier une cible par `chemin|texte|y` fait
   passer pour « révélé » tout ce qu'une disclosure ouverte DÉCALE. La clé
   ignore désormais `y` — sans quoi `topbar__brand`, réparé en B8,
   réapparaissait comme fautif.
   ────────────────────────────────────────────────────────────────────────── */

/* ── A — la navigation globale ─────────────────────────────────────────────
 * `.topbar__link` mesurait 37 px de haut, sur SEPT surfaces. C'est le menu
 * principal du produit : rien n'est plus fréquent ni plus séquentiel.
 *
 * Ici la croissance visible est la bonne réponse, pas une extension : les
 * liens vivent dans un panneau déroulant qui n'est en concurrence avec rien,
 * et on vise ce qu'on voit. */
:where(.topbar__link) {
  min-height: 44px;
  display: flex;
  align-items: center;
}

/* Le déclencheur du menu mesurait 39,4 × 41 — court sur les DEUX axes.
 * `min-width` autant que `min-height` : un glyphe étroit ne devient pas
 * touchable en grandissant seulement en hauteur. */
:where(.topbar__toggle) {
  min-width: 44px;
  min-height: 44px;
  display: flex;
  align-items: center;
  justify-content: center;
}

/* ── SIX CIBLES NON FERMÉES, NOMMÉES ET JUSTIFIÉES (`§3.4`) ────────────────
 *
 * Une extension par pseudo-élément a été écrite ici pour ces `<summary>`,
 * mesurée SANS EFFET, puis retirée. Elle est restée dans deux versions
 * successives avant d'être mesurée correctement — un rappel que du CSS mort
 * accompagné d'un commentaire assuré se lit exactement comme du CSS qui
 * marche.
 *
 * Et elle n'aurait pas pu marcher, pour une raison PHYSIQUE plutôt que
 * technique.
 *
 * Trois `<summary>` empilés à 19,5 px d'intervalle ne peuvent pas recevoir
 * chacun 44 px de zone tactile : les zones SE CHEVAUCHERAIENT, et un appui
 * atterrirait sur le contrôle voisin. Une extension qui se recouvre est pire
 * que pas d'extension — elle déplace le défaut au lieu de le corriger, et
 * elle le rend invisible à la mesure.
 *
 * Ce qui reste ouvert, mesuré sous disclosure ouverte :
 *
 *   .method-reminder details > summary        19,5–39 px   × 3
 *   .session-feedback__note > summary         27,5 px      × 1
 *   .history-item__actions > summary          26 px        × 1
 *   .history-item__actions .btn--ghost        26,8 px      × 1  (voisins)
 *
 * Ce ne sont PAS des défauts de feuille de style : ce sont des densités de
 * mise en page. Les fermer demande de l'ESPACE entre les contrôles, donc un
 * changement structurel.
 *
 *   · `method-reminder` et `session-feedback` vivent sur `session-active`,
 *     mais HORS de la console — la console elle-même est à 0. Les retoucher
 *     ici violerait le statut `reference consumer` de la surface.
 *   · `history` est `TRANSITIONAL` : sa mise en page est déjà programmée pour
 *     `UX4_03`, et lui imposer un espacement maintenant reviendrait à
 *     contractualiser une architecture qu'on prévoit de refaire.
 *
 * Reportées à `UX4`, avec leur mesure. Une exception nommée et chiffrée n'est
 * pas une dette cachée. */

/* ═══ `TRAIN1-E` / C6 — L'HISTORIQUE SORT DE LA LISTE DES REPORTÉES ═══════════
 *
 * L'exception ci-dessus tenait par deux arguments. L'un était juste et le
 * reste ; l'autre a expiré.
 *
 *   · JUSTE — « les fermer demande de l'ESPACE, donc un changement
 *     structurel ». Mesuré à nouveau ici : le `<summary>` fait 26 px, avec
 *     8 px au-dessus (la carte) et 4 px en dessous (les boutons, une fois
 *     dépliés). Un remplissage portant la zone à 44 px chevaucherait les deux.
 *     Aucune astuce de feuille de style ne contourne cela.
 *
 *   · EXPIRÉ — « `history` est `TRANSITIONAL`, sa mise en page est programmée
 *     pour `UX4_03` ». `UX4_03` a été livré, et n'a pas touché l'Historique.
 *     L'arbitrage C6 tranche désormais explicitement sa forme : la LIGNE est
 *     l'action primaire, la gestion est rare et vit derrière une divulgation.
 *     L'espacement n'est donc plus une contractualisation prématurée — c'est
 *     la forme décidée.
 *
 * CE QUE LA MESURE A CORRIGÉ. L'exception comptait « × 1 » pour les boutons
 * voisins. Vérifié au `checkVisibility()` : repliés, les deux boutons rendent
 * `false`, et `elementFromPoint` à leur centre renvoie la carte. Ils ne sont
 * PAS tapables tant que la divulgation est fermée. Par défaut, il n'y a donc
 * qu'UNE cible sous le standard par ligne, pas trois.
 *
 * COÛT ASSUMÉ : +18 px par ligne repliée. Six lignes → +108 px, soit ~0,13
 * écran à 390 px. C'est le prix du standard produit, et C6 le commande.
 *
 * ⚠ 44 px est le STANDARD PRODUIT AUREN, pas le seuil WCAG 2.2 (24×24 avec
 * exception d'espacement, déjà satisfait avant cette tranche). Aucune
 * non-conformité réglementaire n'est corrigée ici. */

.history-item__actions {
  margin-top: var(--space-xs);
  margin-bottom: var(--space-sm);
}

/* Le déclencheur devient un contrôle à part entière : 44 px de haut, pleine
 * largeur, et sa zone ne déborde sur rien puisqu'elle est sa propre hauteur. */
.history-item__toggle {
  display: flex;
  align-items: center;
  min-height: 44px;
  cursor: pointer;
  font-size: 12px;
  color: var(--fg-dim);
}

/* Les boutons ne sont tapables que la divulgation ouverte — c'est là qu'il
 * faut leur donner leurs 44 px, et l'espace existe alors. `gap` sépare les
 * zones : deux cibles de 44 px collées se toucheraient sans se recouvrir,
 * mais un pouce n'a pas cette précision. */
.history-item__buttons {
  display: flex;
  gap: var(--space-sm);
  margin-top: var(--space-xs);
  flex-wrap: wrap;
}

.history-item__btn {
  min-height: 44px;
  display: inline-flex;
  align-items: center;
  font-size: 12px;
}

/* Un lien DANS une phrase : sa zone doit atteindre 44 px sans casser
 * l'interligne du paragraphe qui l'entoure. Le remplissage l'étend, la marge
 * négative le réabsorbe — la ligne garde sa hauteur, la cible non.
 *
 * ⚠ Ne convient qu'à un lien SEUL dans son paragraphe. Deux liens inline
 * voisins verraient leurs zones se recouvrir, et une zone qui se recouvre est
 * pire que pas de zone : elle déplace le défaut au lieu de le corriger. */
.inline-target {
  display: inline-block;
  padding: 14px 2px;
  margin: -14px -2px;
}
