/* =============================================================================================
   KISMAIN — FEUILLE DE BASE DE L'APPLICATION

   Un seul fichier décide de l'habillage des soixante et un gabarits. Il porte trois peaux, pas
   une : le membre, l'opérateur, et l'invité qui arrive par un jeton. Les trois partagent la
   marque et la grammaire des formes ; elles ne partagent ni la couleur de fond, ni la densité,
   ni la typographie des chiffres. Un opérateur qui ouvre un dossier ne doit jamais pouvoir
   croire qu'il est dans l'écran d'un membre.

   Les jetons de couleur viennent de sites/kismain/index.html et des deux planches de maquettes
   (sites/kismain-app/maquettes/). Ils ne sont pas redéfinis ailleurs : une page qui invente sa
   propre teinte est un défaut, pas une variante.
   ============================================================================================= */

/* --- FONTES ---------------------------------------------------------------------------------

Auto-hébergées. Un @font-face qui pointe vers fonts.gstatic.com fait partir une requête vers un
tiers américain à chaque affichage de chaque page, porteuse de l'IP du membre et de l'adresse
consultée. La règle qui a fait écarter Fly.io et Didit vaut aussi pour une fonte.

Les `unicode-range` sont recopiés de la réponse de l'API Google : ce sont eux qui font qu'une
page en français ne télécharge que le jeu latin, et rien d'autre. Voir fontes/LISEZMOI.md. */

@font-face{font-family:"Source Serif 4";font-style:normal;font-weight:200 900;font-display:swap;
  src:url("fontes/serif-latin.62f0a26ced41.woff2") format("woff2");
  unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,
    U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:"Source Serif 4";font-style:normal;font-weight:200 900;font-display:swap;
  src:url("fontes/serif-latin-ext.ab6e1dbe7b75.woff2") format("woff2");
  unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,
    U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,
    U+A720-A7FF}
@font-face{font-family:"IBM Plex Mono";font-style:normal;font-weight:400;font-display:swap;
  src:url("fontes/mono-400-latin.814fe1615d4d.woff2") format("woff2");
  unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,
    U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:"IBM Plex Mono";font-style:normal;font-weight:400;font-display:swap;
  src:url("fontes/mono-400-latin-ext.17a5b2a15bf5.woff2") format("woff2");
  unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,
    U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,
    U+A720-A7FF}
@font-face{font-family:"IBM Plex Mono";font-style:normal;font-weight:500;font-display:swap;
  src:url("fontes/mono-500-latin.6708425c446b.woff2") format("woff2");
  unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,
    U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:"IBM Plex Mono";font-style:normal;font-weight:500;font-display:swap;
  src:url("fontes/mono-500-latin-ext.216ee1a35b06.woff2") format("woff2");
  unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,
    U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,
    U+A720-A7FF}

/* --- JETONS --------------------------------------------------------------------------------- */

/* --- LA PALETTE A ÉTÉ RÉCHAUFFÉE — 17/09/2026, décision du Fondateur -------------------------
   « Revois les couleurs afin qu'elles soient encore plus chaleureuses. »

   CE QUI A CHANGÉ, ET COMMENT. Les verts tirent désormais sur l'olive plutôt que sur le
   conifère : quelques points de bleu en moins, quelques points de rouge en plus. Le papier passe
   de #FAF7F0 à #FDF8EE, l'encre de #141A17 à #1C1811. À l'œil nu on ne nomme pas la différence,
   on la ressent — c'est exactement ce qu'on demande à un fond et à une encre.

   CE QUI N'A PAS CHANGÉ. Les VALEURS bougent, les NOMS et les RÔLES ne bougent pas. Aucune règle
   de cette feuille n'a été touchée : c'est ce qui permet de réchauffer quatre mille lignes sans
   en relire une seule.

   POURQUOI CES VALEURS-LÀ ET PAS D'AUTRES. Le premier jet passait par une formule qui conservait
   la luminance en décalant la teinte. Élégant, et faux : elle rendait le vert de marque en kaki
   (#27331F) et l'encre en brun (#26190F). Un vert de marque ne se calcule pas, il se choisit —
   et l'écart admissible est bien plus étroit sur un ton pâle que sur un vert profond, ce qu'une
   force unique ne sait pas voir.

   LE CONTRÔLE EST AILLEURS, ET IL EST AUTOMATIQUE. `tests/test_contraste_aa.py` apparie les
   rôles d'écriture aux fonds et vérifie le seuil sur chaque paire. Réchauffer sans le lancer
   serait changer une palette à l'aveugle.
   -------------------------------------------------------------------------------------------- */

:root{
  /* Verts de la marque — réchauffés vers l'olive le 17/09/2026, rôles inchangés. */
  --vert-950:#0E251A; --vert-900:#153727; --vert-800:#1B422D; --vert-700:#244F39;
  --vert-600:#2A5C42; --vert-500:#336C4F; --vert-300:#88AA93; --vert-100:#E7EFE5; --vert-50:#F3F8F1;

  /* --- LES DEUX RÔLES DU VERT (LOT F, 08/09/2026) --------------------------------------------
     La gamme `--vert-*` ci-dessus est la MARQUE. Elle ne bascule pas en Veille : un vert de
     marque qui changerait de valeur selon l'heure ne serait plus une marque, et surtout ces
     mêmes valeurs servent de FOND aux surfaces sombres du produit (la barre de navigation, le
     volet de la porte, le bandeau de saison, le bloc de promesse). Les faire pâlir retournait
     ces surfaces : fond clair, texte blanc, illisible.

     Ce qui bascule, ce sont les deux rôles d'ÉCRITURE, et eux seuls :
       `--titre`  — les titres, sur fond de page ;
       `--accent` — les liens, les marques, tout ce qui écrit en vert dans le texte courant.
     En clair ils valent exactement ce qu'ils valaient (`--vert-900` et `--vert-700`) : aucun
     pixel ne change en thème Papier. En Veille ils s'éclaircissent, pendant que les fonds
     sombres restent sombres. */
  --titre:#153727; --accent:#244F39;

  /* --- LE FOCUS CLAVIER (refonte UI, 15/09/2026) ----------------------------------------------
     Le contour de focus avait une valeur fixe, `--vert-500` : 6,4:1 sur le papier clair, mais
     2,3:1 sur le papier de Veille et 2,6:1 sur la barre du haut, sombre dans les deux thèmes.
     WCAG 2.2 (1.4.11) demande 3:1 à un indicateur de focus.
       `--focus`             — suit le thème : `--vert-500` en Papier, `--vert-300` en Veille ;
       `--focus-sur-sombre`  — fixe, pour les surfaces sombres en permanence (même logique que
                               `--sur-sombre` ci-dessous). Ces surfaces redéfinissent `--focus`
                               localement : toutes les règles de focus qui lisent `--focus`
                               changent d'elles-mêmes, sans course à la spécificité. */
  --focus:var(--vert-500); --focus-sur-sombre:var(--sur-sombre);

  /* --- CE QUI EST POSÉ SUR UNE SURFACE SOMBRE EN PERMANENCE ----------------------------------
     La barre de navigation, le volet de la porte, le bloc de promesse, la tuile de visio : leur
     fond est sombre dans les DEUX thèmes. Ce qui s'écrit dessus ne doit donc jamais basculer,
     sinon il vire au sombre sur sombre le jour où le reste passe en Veille. Ces jetons-là sont
     volontairement absents du bloc `body.veille` : c'est leur définition qui est unique, pas un
     oubli. */
  --sur-sombre:#E9F0E4;
  --ardoise-claire:#C6CED8; --ardoise-pale:#E6EAEF; --ardoise-moyenne:#5A7189;

  /* --- LE VERT DE REMPLISSAGE, SÉPARÉ DU VERT D'ÉCRITURE (LOT F, 08/09/2026) ------------------
     `--vert-700` faisait deux métiers : il écrivait (21 déclarations de `color`, plus des
     bordures et des traits) et il remplissait (un bouton, ma bulle de message, un jeton coché).
     Tant qu'il n'y avait qu'un thème clair, les deux allaient ensemble. En thème sombre ils
     divergent : le vert qui écrit doit s'éclaircir pour rester lisible, le vert qui remplit doit
     rester assez sombre pour porter du blanc. Un seul jeton ne peut pas faire les deux.

     `--vert-plein` est donc le vert des surfaces pleines, et lui seul. Il ne s'éclaircit qu'un
     peu en Veille — juste de quoi se détacher du fond sombre sans perdre le texte blanc. */
  --vert-plein:#244F39; --vert-plein-2:#1B422D;

  /* Neutres chauds — le papier et le sable. */
  --sable:#FDF8EE; --sable-2:#FFFCF4; --paper:#FFFDF7;
  /* `--ink-mute` valait #8A948F jusqu'au 08/09/2026. Il tombait à 3,1:1 sur le papier blanc et à
     2,6:1 sur les fonds pâles — sous le seuil AA que le brief des écrans exige lui-même, alors
     qu'il écrit des libellés réels (le rang d'un palier, la date d'une mesure, l'en-tête d'une
     colonne de tableau). #646B68 tient 4,5:1 sur les HUIT fonds clairs du produit, le plus
     exigeant étant `--stop-pale`. La hiérarchie à trois niveaux se resserre par le bas, et
     c'est le prix : un gris trop clair pour être lu n'est pas une nuance, c'est un texte absent. */
  --ink:#1C1811; --ink-soft:#5B584C; --ink-mute:#6A675B;
  --line:#EADFC8; --line-soft:#F4EBD9;

  /* Neutres froids, repris de la planche Claude Design. Ils coexistent avec les lignes sable :
     le sable sépare deux blocs de contenu, le froid sépare deux lignes d'un même tableau. Les
     confondre donnait des tableaux qui semblaient rayés. */
  --ligne-froide:#DCE5D9; --vert-25:#F0F4EC;

  --laiton:#A8863F; --laiton-2:#C7A159; --laiton-pale:#F6EFDE; --laiton-texte:#806217;
  /* Le filet qui accompagne `--laiton-pale`. Il était écrit var(--laiton-filet) en clair à huit endroits :
     invisible tant que le produit n'avait qu'un thème, bloquant dès qu'il en a deux. */
  --laiton-filet:#E7D6A9;
  --stop:#8C3A32; --stop-pale:#F6E7E5; --stop-ligne:#E0B6B0;
  /* Le rouge a le même double métier que le vert : il écrit (« Raccrocher », un refus) et il
     remplit (le bouton lui-même). En Veille, celui qui écrit doit s'éclaircir pour se détacher
     du fond, celui qui remplit doit rester assez sombre pour porter du blanc — sur le rouge
     clair, le blanc tombait à 2,6:1. Deux jetons, donc. */
  --stop-plein:#8C3A32; --stop-plein-2:#7A3029;

  /* --- BLEU ARDOISE — LA STRUCTURE (LOT F, 08/09/2026) --------------------------------------
     La seule teinte vraiment neuve de la refonte. Elle existe parce qu'il manquait une couleur
     pour dire « ouverte » : une étape en cours, disponible, qui ne réclame rien. Sans elle, il
     ne restait que le laiton (qui veut dire « à vous de jouer ») ou le gris (qui dit « éteint »,
     ce qu'une étape ouverte n'est pas) — et le laiton finissait par tout peindre.

     Elle est choisie loin du laiton ET du vert, les deux couleurs déjà signifiantes : un bleu
     froid ne se confond avec aucune des deux, même vu de biais ou par un œil qui distingue mal
     les rouges. Contraste vérifié : --structure-texte sur --structure-pale passe AA. */
  --structure:#2E4256; --structure-clair:#5A7189; --structure-pale:#E6EAEF;
  --structure-texte:#223345; --structure-filet:#C6CED8;

  /* Le pointillé d'une étape à venir. Ni un gris de désactivation, ni un cadenas : un contour
     qui dit « pas encore tracé ». La condition d'ouverture est toujours écrite en clair à côté. */

  /* --- LES TEINTES CHAUDES (02/09/2026) -----------------------------------------------------
     Le vert, le sable et le laiton restent la marque, et ils ne bougent pas. Ces quatre-là
     s'ajoutent en accent seulement : un filet, une pastille, un fond de vignette, jamais un fond
     de page. Elles existent parce que le produit paraissait juste et froid, et qu'un service qui
     parle de mariage a le droit d'avoir l'air content.

     Le rose et le rouge romantiques restent exclus. Ce n'était pas une conséquence de l'interdit
     de figuration — c'est un choix de positionnement, écrit en août, que la réouverture du 01/09
     n'a pas touché. `--terre` est une terre cuite, pas un rouge : elle est désaturée et sourde,
     et elle ne se confond avec aucune application de rencontre.

     Contrastes vérifiés sur le sable et sur le papier : `--abricot-texte`, `--terre` et
     `--safran-texte` passent AA en corps de texte, les trois pâles ne servent que de fond. */
  --abricot:#D99A5B; --abricot-pale:#FBEFE1; --abricot-texte:#96541C;
  --terre:#A85842;
  --safran:#D9A93F; --safran-pale:#FAF1D9; --safran-texte:#8A6410;
  --sarcelle:#2E6B6B; --sarcelle-pale:#E3F0EF;

  /* --- LES ENCRES DES ILLUSTRATIONS (17/09/2026) ----------------------------------------------
     UNE FAMILLE À PART, ET C'EST VOULU. Ces dix jetons ne servent qu'aux dessins du parcours.
     Ils ne sont pas des couleurs d'interface : aucun texte ne s'écrit dedans, aucun bouton ne
     s'en peint, et ils échappent donc aux règles de contraste qui tiennent le reste de cette
     feuille. Les confondre avec `--vert` ou `--sable` reviendrait à interdire à une illustration
     ce qu'on autorise à une photographie.

     POURQUOI UN PRÉFIXE. La première version des dessins appelait `var(--miel)`, `var(--vert)`,
     `var(--voile)` — des noms repris du prototype, dont HUIT n'existaient pas dans cette
     feuille. Une propriété personnalisée absente rend la déclaration invalide au calcul, et
     `fill` retombe alors sur sa valeur initiale, qui est le NOIR. Tous les dessins de
     l'application se sont donc affichés sur un disque noir, et personne ne l'a vu avant que le
     Fondateur n'ouvre l'écran sur son téléphone.

     `tests/test_encres_des_dessins.py` vérifie maintenant que chaque `var(--d-…)` écrit dans un
     dessin est déclaré ici ET dans le bloc de nuit. C'est la seule protection qui vaille : un
     jeton oublié ne se voit pas en relisant du SVG, il se voit sur un écran.

     LA NUIT N'EST PAS UNE INVERSION. Les encres sombres ne sont pas les claires retournées : le
     papier devient brun très sombre, les verts s'éclaircissent pour rester lisibles dessus, et
     les chaudes perdent en clarté ce qu'elles gardent en chaleur. */
  --d-papier:#FBF1DC;  /* le fond de la vignette */
  --d-brume:#EFE2C8;   /* le second fond, pour les compositions en deux plans */
  --d-miel:#F3D49B;
  --d-safran:#E9AE3E;
  --d-abricot:#DE8F4E;
  --d-terre:#BE5B3D;
  --d-sauge:#A7C6B0;
  --d-vert-2:#4E8C6B;
  --d-vert:#1E5540;    /* le trait dessiné, celui qui porte la forme */
  --d-nuit:#123A2C;
  /* Comment les encres se mélangent, et combien de grain. DEUX JETONS PLUTÔT QU'UNE SECONDE
     REQUÊTE DE MÉDIA : la palette de nuit doit vivre à un seul endroit de cette feuille, et un
     test le tient depuis le lot F. Le multiplié ne vaut que sur fond clair — sur le papier
     sombre de la nuit, multiplier des encres déjà sombres les écrase en noir, c'est-à-dire
     exactement la tache que l'on vient de corriger. */
  --melange-encres:multiply; --grain-opacite:.55;

  /* Graphite — la console opérateur. Un métier distinct, donc une palette distincte : froide,
     dense, sans sable. Le laiton et le rouge y restent les deux seules couleurs, et ils ne
     veulent dire qu'une chose chacun (voir .poste-nb plus bas). */
  --gr-950:#1C2226; --gr-900:#2A3238; --gr-800:#39424A; --gr-600:#4A5459;
  --gr-400:#7C868B; --gr-300:#98A2A7; --gr-200:#CFD6D9; --gr-100:#E2E6E8;
  /* Le gris qui écrit sur fond CLAIR. `--gr-400` reste celui du rail sombre, où il tient
     4,7:1 ; sur le papier il tombait à 3,7:1, et il y écrivait de vrais libellés. */
  --gr-500:#5A6469;
  --gr-50:#F4F6F7; --gr-25:#FAFBFB;

  /* --- LA CONSOLE PREND DES COULEURS (05/09/2026) --------------------------------------------
     Demande du Fondateur : « une interface fluide, moderne, futuriste, ludique et claire ».
     Les quatre premiers adjectifs sont faciles à mal servir, et le cinquième les arbitre — une
     console où l'on décide du sort de vraies personnes ne doit jamais ressembler à un jeu.

     Ce qui change : le graphite reste la structure, et six accents froids s'y ajoutent. Chacun
     ne veut dire qu'une chose, et c'est cela qui rend l'écran lisible plutôt que décoré :
       cyan     — l'action, le focus, la donnée vivante ;
       violet   — la simulation, ce qui n'est pas encore décidé ;
       menthe   — ce qui est en règle ;
       ambre    — ce qui attend un geste ;
       corail   — ce qui est en retard ou en défaut ;
       ardoise  — le reste, c'est-à-dire l'essentiel.

     Ce qui NE change pas : la zone membre. Elle garde son sable et son vert. Personne n'a demandé
     de la rendre futuriste, et un service qui parle de mariage n'y gagnerait rien. */
  /* --- LES TROIS RÔLES D'ÉCRITURE DE LA CONSOLE (09/09/2026) --------------------------------
     Même partage que le vert, le rouge et le violet ailleurs dans cette feuille : une couleur qui
     REMPLIT n'est pas la même que celle qui ÉCRIT. La console n'avait jamais fait ce partage, et
     le brief `23_` signalait que rien ne vérifiait ses contrastes. Mesuré : `--op-menthe`
     tombait à 3,3:1 en texte sur le papier, `--op-cyan-sombre` à 4,3:1 sur les fonds teintés, et
     `--gr-400` à 3,7:1 — trois textes sous le seuil AA que le produit s'impose partout ailleurs.
     Les valeurs ci-dessous tiennent 4,5:1 sur les NEUF fonds clairs de la console, le plus
     exigeant étant `--gr-100`. `tests/test_contraste_aa.py` les vérifie une par une. */
  /* --- LA RÈGLE DE COULEUR DE LA RÉGIE, 12/09/2026 (brief 24, §6) ------------------------------
     Une couleur, un sens, et rien d'autre. Le cyan, l'ambre, la menthe et le violet du 05/09
     deviennent l'azur, le safran, le jade et l'iris : mêmes métiers, valeurs revues pour que
     la console se reconnaisse en une seconde comme n'étant pas le produit. Le cuivre est neuf et
     ne veut dire qu'une chose : le mode admin.
       azur    la Régie elle-même : entrée courante, focus, lien, donnée vivante ;
       safran  attend un geste de l'opérateur ;
       jade    fait, valide, franchi ;
       corail  alerte, échec, mesure ;
       iris    un geste définitif, qui ne se défait pas ;
       cuivre  le mode admin.
     Chaque jeton qui ÉCRIT tient AA sur les dix fonds clairs de la console, et
     `tests/test_contraste_aa.py` le mesure. */
  --op-azur:#2F7FE0; --op-azur-clair:#7FB2F0; --op-azur-pale:#E4EEFB; --op-azur-sombre:#1F5FB0;
  --op-azur-texte:#1D5AA6;
  --op-safran:#D99A1E; --op-safran-pale:#FBF1DA; --op-safran-texte:#7A5406;
  --op-jade:#2E9E7A; --op-jade-pale:#E3F3EC; --op-jade-texte:#1B6B52;
  --op-corail:#D65B4F; --op-corail-pale:#FBE9E6; --op-corail-texte:#9B3A31;
  --op-iris:#6F63D6; --op-iris-pale:#ECEAF9; --op-iris-texte:#4A42A8;
  --op-cuivre:#B8672B; --op-cuivre-pale:#F8EADF; --op-cuivre-texte:#8A4A1A;
  /* L'encre : le rail, et rien d'autre de sombre. */
  --op-nuit:#0F1A22;
  /* `--op-relief` vivait ici, déclaré et employé zéro fois depuis l'origine. Retiré le
     09/09/2026 sur avis de Claude Design : « il ne nommait pas un sens mais une élévation ». Ce
     que l'élévation devait dire est désormais une règle de forme — la carte que l'état commande
     porte une ombre et une bordure haute cyan, aucune autre carte n'a d'ombre. Un jeton mort est
     une intention que personne n'a tenue, et il finit par être réemployé de travers parce qu'il
     était libre : `test_contraste_aa.py` en refuse maintenant l'apparition. */

  /* Ardoise chaude — la zone des invités (tiers de confiance, entremetteur, proche qui
     recommande). Ni membre ni opérateur : ils arrivent par un jeton, pour une seule tâche, et
     ils doivent le voir sans avoir à le lire. */
  --tz-900:#2E2A24; --tz-700:#4A4237; --tz-300:#B3A894;
  --tz-100:#EFE9DE; --tz-50:#F8F4EC;

  /* Refonte UI, 16/09/2026 : l'app membre et le portail invité lisent `--radius-*`. `--r` et
     `--r-sm` ne servent plus qu'à la console (et à `.chiffre`, `.jetons`) ; ils partiront avec un
     éventuel lot console. `--r-lg` a été retiré (lot de clôture). */
  --r:14px; --r-sm:8px;

  /* --- L'ÉCHELLE D'ESPACEMENT (08/09/2026) ----------------------------------------------------
     Elle n'existait pas : les marges étaient écrites en dur, 16, 22 ou 26 px selon l'endroit et
     le jour. Sept pas, dont chacun vaut environ 1,45 fois le précédent à partir de 13 px.

     CES VALEURS DÉCRIVENT CE QUI EST DÉJÀ LÀ, elles ne le corrigent pas. 8, 13, 18 et 26 sont les
     quatre valeurs qui dominent déjà cette feuille : une échelle en base 4 (16, 24, 48) serait
     plus pure et obligerait à réécrire trente écrans pour que les nouveaux ne jurent pas avec les
     anciens. Le code neuf s'y adosse ; l'ancien y vient quand on le touche, jamais par principe. */
  /* Refonte UI, 16/09/2026 : l'app membre lit désormais `--space-*` (refonte/DESIGN-SYSTEM.md).
     `--e1` à `--e6` ne servent plus qu'à la console (et à `body.porte`) ; ils partiront avec un
     éventuel lot console. `--e7`, jamais lu, a été retiré (lot de clôture). */
  --e1:4px; --e2:8px; --e3:13px; --e4:18px; --e5:26px; --e6:38px;

  /* L'ÉCHELLE TYPOGRAPHIQUE DE LA CONSOLE — 10/09/2026, passe visuelle.
     Elle en comptait DIX-SEPT tailles distinctes, dont onze entre 0,75 et 1,02 rem : des écarts
     d'un pixel, invisibles pris un par un, incohérents pris ensemble. C'est ce qui faisait qu'un
     écran ne ressemblait pas tout à fait au précédent sans qu'on sache dire pourquoi.
     Quatre degrés pour le texte. Chaque valeur remplacée s'écartait d'au plus 1 px de la sienne,
     et le rendu ne saute donc nulle part — c'est la cohérence qui change, pas la taille. */
  --op-t1:.75rem;   /* 12 px, le plancher du produit : étiquettes, chasse fixe, mentions */
  --op-t2:.82rem;   /* texte secondaire */
  --op-t3:.9rem;    /* texte courant */
  --op-t4:1rem;     /* titres de carte */
  --shadow-op:0 1px 2px rgba(15,20,23,.05),0 14px 34px -18px rgba(15,20,23,.4);

  --serif:"Source Serif 4","Iowan Old Style","Palatino Linotype",Palatino,Georgia,serif;
  --sans:-apple-system,BlinkMacSystemFont,"Inter","Segoe UI",Roboto,Helvetica,Arial,sans-serif;
  --mono:"IBM Plex Mono",ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
  /* L'arabe n'est employé qu'à un seul endroit, l'invocation qui ouvre l'engagement. Rien n'est
     téléchargé pour lui : la pile va chercher ce que le système possède déjà, dans l'ordre
     iOS/macOS puis Android puis Windows, et retombe sur le serif du navigateur. Une police
     d'affichage chargée pour trois mots coûterait plus qu'elle ne rapporte. */
  --arabe:"Geeza Pro","Noto Naskh Arabic","Scheherazade New","Traditional Arabic","Amiri",serif;
  --ease:cubic-bezier(.22,.61,.36,1);

  /* --- DESIGN SYSTEM, TEMPS 1 (refonte UI, 15/09/2026) ----------------------------------------
     Nouvelles échelles déclarées, AUCUNE règle ne les lit encore : rien ne change à l'écran.
     Les règles y passent lot par lot (temps 2). Temps 3 (16/09/2026) : `--shadow`, `--shadow-lg`,
     `--r-lg` et `--e7` retirés ; `--e1…6`, `--r`, `--r-sm` gardés pour la console.
     Valeurs écrites en littéral, jamais en `var()` d'un jeton qui bascule en Veille : un `var()`
     déclaré sur `:root` se résout sur `:root`, et ne suivrait pas le bloc de nuit. */

  /* Espacements — 10 marches. Remplaceront `--e1…--e7` (4/8/13/18/26/38/56). */
  --space-1:4px; --space-2:8px; --space-3:12px; --space-4:16px; --space-5:24px;
  --space-6:32px; --space-7:40px; --space-8:48px; --space-9:64px; --space-10:80px;

  /* Texte — 8 degrés, corps à 18 px (`--text-4`). Plancher : 12 px ; seule dérogation, écrite en
     clair ailleurs : les 11,2 px de l'état de palier (`.arc-l .quoi`). Le plancher des jetons est surveillé
     par refonte/verifier_contrat.py (règle M6). La console garde `--op-t1…4`. */
  --text-1:.75rem; --text-2:.875rem; --text-3:1rem; --text-4:1.125rem;
  --text-5:1.25rem; --text-6:1.5rem; --text-7:1.75rem; --text-8:2.25rem;
  --leading-titre:1.2; --leading-dense:1.45; --leading-corps:1.6;

  /* Rayons. Remplaceront `--r-sm`, `--r`, `--r-lg`, `99px` et les rayons écrits en dur. */
  --radius-champ:8px; --radius-carte:14px; --radius-grand:18px; --radius-pilule:999px;

  /* --- LE FILET N'EST PAS LE CONTOUR — 17/09/2026 -------------------------------------------
     Deux métiers qu'un seul jeton faisait, et mal.

     `--line` SÉPARE : le trait sous une section, le bord d'une carte, le cadre d'un tableau.
     WCAG l'exempte explicitement, c'est de la décoration, et il a le droit d'être discret —
     c'est même tout ce qu'on lui demande.

     `--contour-champ` DÉLIMITE UN CONTRÔLE : le bord d'une pastille, d'une case, d'un champ.
     Là, 1.4.11 exige 3:1, et pour une bonne raison : une pastille du parcours a le même fond
     que la page derrière elle. Son bord est LA seule chose qui dit qu'on peut appuyer dessus.
     À 1,3:1, il ne le disait à personne.

     Les valeurs tiennent 3:1 sur les fonds clairs du produit, et `--contour-actif` sur les
     mêmes : un état de survol qu'on ne distingue pas n'est pas un état. */
  --contour-champ:#8F8779; --contour-actif:#7D9684;

  /* Ombres (valeurs Papier ; la Veille redéclare les deux premières). */
  --shadow-1:0 1px 2px rgba(20,26,23,.04),0 12px 32px -8px rgba(20,26,23,.10);
  --shadow-2:0 2px 4px rgba(20,26,23,.05),0 24px 60px -20px rgba(20,26,23,.22);
  --shadow-pied:0 -14px 30px -16px rgba(20,26,23,.5);
  --halo-focus:0 0 0 3px rgba(44,106,84,.13); /* halo des champs au focus (lot composants) */

  /* Couches — l'ordre actuel à l'identique, avec des noms. 0 à 2 restent locaux à un composant. */
  /* La bande de regard, quand un opérateur regarde. Déclarée ici parce que DEUX choses la
     lisent : le décalage du corps, et la hauteur du châssis du parcours. */
  --h-regard:34px;
  --z-collant:10; --z-collant-onglets:11; --z-popover:12; --z-bandeau:20; --z-barre:40;
  --z-flottant:60; --z-flottant-haut:61; --z-calque:70;

  /* Dimensions qui ne sont pas des espacements. */
  --cible-min:44px;   /* cible tactile minimale */
  --barre-basse:52px; /* barre des lieux sur téléphone ; écrite aussi en clair dans le bloc
                         plein écran, où deux tests la lisent mot pour mot */

  /* Couleurs fixes sur surfaces pleines ou sombres (ne basculent pas en Veille). */
  --sur-plein:#FFFFFF; --sur-sombre-chaud:#FFFDF9; --fond-scene:#0B1A14;
  --voile-1:rgba(255,255,255,.07); --voile-2:rgba(255,255,255,.10); --voile-3:rgba(255,255,255,.14);
}

/* =============================================================================================
   VEILLE — RETIRÉE LE 14/09/2026, décision du Fondateur.

   Depuis le 08/09/2026, `body.veille` imposait le thème sombre à l'appel et à la visio même en
   plein jour, au motif qu'un écran clair éclaire le visage de qui regarde. Le Fondateur a
   tranché autrement : « en mode normal, sombre uniquement si le téléphone est paramétré avec la
   vue sombre ». L'appel et la visio suivent donc le système comme tout le reste de la zone
   membre, par le bloc `prefers-color-scheme:dark` ci-dessous, et aucun écran ne force plus une
   peau. Le bloc de jetons qui vivait ici était une copie exacte de celui du système ; il n'a
   plus de raison d'exister, et `tests/test_lotf_aucune_peau_forcee.py` garde qu'il ne revient
   pas.

   CE QUI NE BASCULE PAS. La console opérateur (`body.op`, palette graphite, `color-scheme:light`
   assumé) et le portail des invités (`body.tiers`, ardoise chaude) gardent leur identité : ce
   sont deux métiers distincts, pas deux humeurs du même écran.

   CONTRASTES VÉRIFIÉS (WCAG AA, calculés et non estimés) : `tests/test_contraste_aa.py` refait
   le calcul pour chaque rôle d'écriture sur chaque fond, dans les deux thèmes.
   ============================================================================================= */


/* =============================================================================================
   LE PRODUIT SUIT LE THÈME DU SYSTÈME — arbitrage du Fondateur, 08/09/2026.

   La question laissée ouverte au-dessus est tranchée : quand le téléphone passe en sombre, le
   soir, la zone membre passe avec lui. Un membre qui consulte la nuit ne reçoit plus une page
   blanche en pleine figure, et la raison qui imposait déjà Veille sur la visio (un écran clair
   éclaire le visage de qui regarde) vaut un peu partout ailleurs.

   CE QUI NE SUIT PAS, ET POURQUOI. La console opérateur et le portail des invités sont exclus
   par `:not(.op):not(.tiers)`. Ce sont deux métiers, pas deux humeurs du même écran : la console
   assume `color-scheme:light`, et un invité qui arrive par un jeton pour une seule tâche n'a
   aucune raison de recevoir l'apparence de nuit d'un produit dont il n'est pas membre.

   `body.veille` N'EXISTE PLUS (14/09/2026) : l'appel et la visio suivent ce bloc comme les
   autres écrans. C'est donc ici, et ici seulement, que vit la palette de nuit ; les contrastes
   sont recalculés dessus par `tests/test_contraste_aa.py`.
   ============================================================================================= */
@media (prefers-color-scheme:dark){
  body:not(.op):not(.tiers){
    color-scheme:dark;

    /* Le sol, et les deux surfaces qui s'en détachent. Un vert très sombre plutôt qu'un gris :
       la marque reste la marque quand la lumière baisse. */
    /* Réchauffés le 17/09/2026, comme la palette claire : un noir bleuté sous un contenu qui
       parle de mariage est un contresens, et la nuit n'a pas de raison d'être plus froide que
       le jour. Mêmes luminances, donc mêmes rapports de contraste. */
    --sable:#161B15; --sable-2:#1B201A; --paper:#232821;
    --ink:#EBEBE4; --ink-soft:#BDBDAF; --ink-mute:#A6A599;
    --line:#3B4034; --line-soft:#2C3028;
    --ligne-froide:#3C4239; --vert-25:#1F241C;

    /* Les deux contours de contrôle. Mêmes seuils qu'en Papier : 3:1 sur les fonds où un
       contrôle se pose, parce qu'une pastille y a le même fond que la page derrière elle. */
    --contour-champ:#7B6552; --contour-actif:#487056;

    /* La gamme de marque ne bouge pas : elle porte les fonds sombres, qui restent sombres. Seuls
       les deux rôles d'écriture s'éclaircissent, et le vert de remplissage se relève d'un cran
       pour se détacher du sol. `--vert-50` et `--vert-100`, eux, sont des FONDS pâles en Papier :
       à ce titre ils basculent, comme le sable. */
    --titre:#BCD0BA; --accent:#88AA93;
    --focus:#88AA93; /* --vert-300 : mêmes rapports qu'avant réchauffement (17/09/2026) */
    --vert-plein:#2C6A54; --vert-plein-2:#245A47;
    --vert-50:#152220; --vert-100:#22322C;

    /* Le laiton garde son unique sens — « à vous de jouer » — et le tient dans le noir. */
    --laiton:#D9B978; --laiton-2:#C7A159; --laiton-pale:#2A2417; --laiton-texte:#E3C688;
    --laiton-filet:#4A3D1F;

    --stop:#E08A80; --stop-pale:#2E1C19; --stop-ligne:#5C332E;
    --stop-plein:#A34A40; --stop-plein-2:#8C3A32;

    --structure:#8FA6BE; --structure-clair:#A9BCCE; --structure-pale:#1E2833;
    --structure-texte:#C9D6E2; --structure-filet:#33465A;

    /* Les accents chauds : seuls leurs fonds pâles basculent, les teintes de texte s'éclaircissent
       juste assez. Ils ne servent qu'en accent, jamais en fond de page — la règle ne change pas. */
    --abricot:#E0A96F; --abricot-pale:#2C2119; --abricot-texte:#E8BA86;
    --terre:#C97D66;
    --safran:#DFB55C; --safran-pale:#2B2415; --safran-texte:#E5C275;
    --sarcelle:#5FA2A2; --sarcelle-pale:#152A2A;

    /* Les encres des illustrations, de nuit. Le papier de la vignette devient un brun très
       sombre plutôt qu'un gris : une vignette grise sur un fond vert-nuit se verrait comme un
       trou. Le vert du trait s'inverse — il éclaire au lieu d'assombrir — et les chaudes
       descendent en clarté, sans quoi elles brilleraient seules au milieu d'un écran éteint. */
    --d-papier:#221A11; --d-brume:#2C2318;
    --d-miel:#5C4626; --d-safran:#BE8C33; --d-abricot:#B5723F; --d-terre:#A8503A;
    --d-sauge:#3F5C4A; --d-vert-2:#6FA98A; --d-vert:#A6CFB7; --d-nuit:#C9E4D4;
    --melange-encres:normal; --grain-opacite:.28;

    --shadow-1:0 1px 2px rgba(0,0,0,.5); --shadow-2:0 10px 30px -12px rgba(0,0,0,.7); /* design system, temps 1 */
    --halo-focus:0 0 0 3px rgba(127,168,149,.28); /* lot composants : le halo Papier ne se voyait pas sur --paper */
  }
}


/* --- SOCLE ----------------------------------------------------------------------------------- */

*{box-sizing:border-box}
*:focus-visible{outline:2px solid var(--focus);outline-offset:2px;border-radius:3px}
/* Les surfaces sombres dans les deux thèmes prennent le focus clair (refonte UI, 15/09/2026). */
.topnav,.lieux-bloc,.tiersnav,.bandeau-saison,.box.promesse,.acces>.sombre,.volet-sombre,
body.en-session .scene{--focus:var(--focus-sur-sombre)}
html{scroll-behavior:smooth}
@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}}

/* 18 px, pas 17 : le cahier des charges (§16) l'exige sur téléphone, et l'entourage du Fondateur
   n'a pas vingt ans. Mesuré le 12/09/2026 : 16,6 px de corps, 12 px de mentions. */
body{margin:0;background:var(--sable);color:var(--ink);font-family:var(--sans);
  font-size:var(--text-4);line-height:var(--leading-corps);-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}

h1,h2,h3{font-family:var(--serif);font-weight:600;color:var(--titre);line-height:var(--leading-titre);
  margin:0 0 .5em;letter-spacing:-.012em;text-wrap:balance}
h1{font-size:var(--text-7)}h2{font-size:var(--text-5)}h3{font-size:var(--text-3)}
p{margin:0 0 .9em;max-width:66ch;text-wrap:pretty}
a{color:var(--accent);text-underline-offset:2px}
a:hover{color:var(--vert-800)}
strong{font-weight:600}
.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}

/* Les chiffres qui se comparent — durées, montants, volumes de travail — passent en chasse fixe.
   Un « 14 » et un « 6 » alignés se lisent d'un coup ; en proportionnelle il faut les compter. */
.nb{font-family:var(--mono);font-variant-numeric:tabular-nums;font-feature-settings:"tnum"}

/* =============================================================================================
   CHÂSSIS — trois peaux
   ============================================================================================= */

/* --- Peau membre : barre sombre, repère de saison permanent ---------------------------------

L'ancienne barre était blanche sur fond sable : elle flottait, et le repère de saison n'y avait
pas de place lisible. Sombre, elle devient un châssis — on sait toujours où l'on est, dans quelle
semaine, et à quelle date la décision tombe, sans que cette information dispute la page. */

.topnav{background:var(--vert-950);color:var(--sur-sombre);position:sticky;top:0;z-index:var(--z-barre);
  box-shadow:0 1px 0 rgba(255,255,255,.05)}
.topnav-in{max-width:1280px;margin:0 auto;padding:0 var(--space-5);min-height:56px;
  display:flex;align-items:center;gap:var(--space-4);flex-wrap:wrap}

.topnav-brand{display:inline-flex;align-items:center;gap:var(--space-2);font-family:var(--serif);
  font-weight:600;font-size:var(--text-4);color:#FFFDF9;text-decoration:none;letter-spacing:.01em;
  padding:var(--space-2) 0}
.topnav-brand svg{flex:0 0 auto}

.lieux{display:flex;gap:2px;flex-wrap:wrap;align-items:center}
.lieux a{color:var(--vert-300);text-decoration:none;font-size:var(--text-2);font-weight:600;
  padding:var(--space-2) var(--space-3);border-radius:var(--radius-pilule);white-space:nowrap;position:relative;
  transition:color .18s ease,background .18s ease}
.lieux a:hover{color:#FFFDF9;background:rgba(255,255,255,.07)}
.lieux a.on{color:#FFFDF9;background:rgba(255,255,255,.10)}
/* Le repère de la page courante : un filet laiton sous l'entrée, qui s'étire à l'arrivée. */
.lieux a.on::after{content:"";position:absolute;left:11px;right:11px;bottom:2px;height:2px;
  border-radius:2px;background:var(--laiton-2)}

/* --- LE BLOC DES LIEUX : dans la barre du haut sur bureau, en bas sur téléphone -------------

   Un seul balisage, deux places. Sur bureau il reste ce qu'il était, une rangée d'onglets dans
   la barre sombre, et la cinquième cellule est masquée : la sortie rapide garde son bouton
   flottant, il n'y a pas de barre basse pour le gêner.

   Sur téléphone il descend au pied de l'écran et prend la place du bandeau de secours. La sortie
   rapide y devient la cinquième cellule, séparée par un filet et en couleur d'arrêt. Elle n'est
   pas une destination : elle ne prend jamais l'état de page courante, et elle vit hors du
   `<nav>`. */
.lieux-bloc{display:contents}
.lieu-sortir{display:none}
.lieux .court{display:none}
/* LES ICÔNES NE SERVENT QUE LA BARRE DU BAS — 20/09/2026, demande du Fondateur : « des icônes,
   visibles, jolies et claires, au niveau du menu en bas ». Dans la barre du HAUT, les onglets
   sont écrits en toutes lettres, au milieu d'une ligne qui porte déjà la marque et le repère de
   saison : une icône n'y ajouterait qu'un ornement de plus à une rangée qui n'en manque pas.

   `color:inherit` est ici, et pas plus bas avec les autres pictogrammes, pour deux raisons. La
   règle d'écran étroit qui les allume vient APRÈS : une déclaration de base écrite après elle la
   réécrirait, et c'est exactement ce que refuse `test_feuilles_de_style.py`. Et l'icône doit
   suivre son onglet — claire sur celui où l'on est, en retrait sur les autres : cinq icônes
   laiton diraient que les cinq cellules sont allumées. Les exceptions `body.op` et `body.tiers`
   plus bas ne la reprennent pas : cette barre n'existe que sur les pages membre. */
.lieux a .pi,.lieu-sortir .pi{display:none;color:inherit}

/* --- LE REPLI DES RÉGLAGES : téléphone seulement ---------------------------------------------
   Sur bureau, « Mon compte » et la déconnexion restent écrits dans la barre. Sur téléphone ils
   se replient ici, avec les deux accès de secours dont le bandeau du bas s'occupait avant de
   céder la place aux lieux. */
.reglages{display:none;position:relative}

/* Le repère de saison. Il dit une durée et une date, jamais une activité ni un décompte de
   personnes : ce serait exactement le compteur que la charte s'interdit. */
.topnav-saison{margin-left:auto;display:flex;align-items:center;gap:var(--space-3);font-size:var(--text-1);
  color:var(--vert-300);min-width:0}
.topnav-saison b{color:#FFFDF9;font-weight:600}
/* UNE BANDE, PLUS DES SEGMENTS — 08/09/2026. C'étaient huit segments, un par semaine. La saison
   comptant cinquante jours, le huitième n'aurait duré qu'un jour tout en occupant la même
   largeur que les sept autres : un segment qui ment sur sa propre durée. Une bande unique
   remplie à la proportion du jour ne peut pas mentir. */
.topnav-saison .jauge{display:block;width:84px;height:5px;border-radius:var(--radius-pilule);
  background:rgba(255,255,255,.18);overflow:hidden;flex:0 0 auto}
.topnav-saison .jauge i{display:block;height:100%;border-radius:var(--radius-pilule);background:var(--vert-300)}
/* Sous 1180 px la jauge n'a plus la place : le texte suffit. Cette ligne
   était écrite AVANT la déclaration ci-dessus, qui la réécrivait — la jauge restait donc
   affichée et poussait le menu hors de l'écran. Trouvé par test_feuilles_de_style.py. */
@media (max-width:1180px){.topnav-saison .jauge{display:none}}

/* « Mon compte » et la déconnexion partagent le bout de la barre : ce sont les deux seules
   choses qui concernent l'accès plutôt que la démarche. Ensemble, ils tiennent sur une ligne de
   téléphone, ce que cinq onglets ne faisaient pas. */
.topnav-fin{margin-left:auto;display:flex;align-items:center;gap:var(--space-2)}
.topnav-fin>a{color:var(--vert-300);text-decoration:none;font-size:var(--text-1);font-weight:600;
  padding:var(--space-2) var(--space-3);border-radius:var(--radius-pilule);white-space:nowrap}
.topnav-fin>a:hover{color:#FFFDF9;background:rgba(255,255,255,.07)}
.topnav-fin>a.on{color:#FFFDF9;background:rgba(255,255,255,.10)}

.topnav-out button{background:none;border:1px solid rgba(255,255,255,.22);color:var(--vert-300);
  font-size:var(--text-1);font-weight:600;padding:var(--space-2) var(--space-4);border-radius:var(--radius-pilule);cursor:pointer;
  font-family:var(--sans);transition:border-color .18s ease,color .18s ease,background .18s ease}
.topnav-out button:hover{border-color:var(--stop-plein);color:#fff;background:var(--stop-plein)}
.topnav-optag{font-size:var(--text-1);text-transform:uppercase;letter-spacing:.1em;font-weight:700;
  color:var(--laiton-2);border:1px solid rgba(255,255,255,.2);border-radius:var(--radius-pilule);padding:var(--space-1) var(--space-3)}

@media (max-width:720px){
  .topnav-in{padding:var(--space-3) var(--space-3);gap:var(--space-2)}
  .topnav-saison{width:100%;margin-left:0;order:3;font-size:var(--text-1)}
  /* Le menu défile horizontalement, et le disait mal : la barre de défilement est masquée, si
     bien que le dernier lien paraissait simplement coupé par le bord de l'écran. Un dégradé sur
     la droite dit qu'il reste quelque chose, et il disparaît une fois arrivé au bout
     (`scroll-timeline` n'est pas nécessaire : le masque suit le défilement du conteneur). */
  .lieux{order:4;width:100%;overflow-x:auto;flex-wrap:nowrap;
    scrollbar-width:none;-ms-overflow-style:none;padding-bottom:var(--space-1);
    -webkit-mask-image:linear-gradient(90deg,#000 calc(100% - 34px),transparent);
    mask-image:linear-gradient(90deg,#000 calc(100% - 34px),transparent)}
  .lieux::-webkit-scrollbar{display:none}
  .lieux a{scroll-snap-align:start}
  .lieux::after{content:"";flex:0 0 26px}  /* de quoi voir le dernier lien en entier */
  /* Quatre onglets à tenir sur 390 px : c'est la largeur qui décide de la taille, pas le goût.
     En dessous, le défilement et son dégradé prennent le relais. */
  .lieux a{font-size:var(--text-1);padding:var(--space-2) var(--space-2)}
  .topnav-fin{order:2;margin-left:auto;gap:var(--space-1)}
  .topnav-fin>a{padding:var(--space-2) var(--space-2);font-size:var(--text-1)}
}

/* --- TÉLÉPHONE : les lieux passent en bas ------------------------------------------------------

   Deux barres au pied de l'écran seraient une de trop. Celle-ci remplace le bandeau de secours,
   qui portait Signaler, Confidentialité et la sortie rapide : les deux premiers se replient dans
   « ··· », la sortie devient la cinquième cellule.

   Le seuil est 720 px, le même que celui de la barre du haut : au-dessus, rien ne bouge. */
@media (max-width:720px){
  .lieux-bloc{display:flex;position:fixed;left:0;right:0;bottom:0;z-index:var(--z-flottant);
    background:var(--vert-950);border-top:1px solid rgba(255,255,255,.10);
    box-shadow:0 -10px 26px -20px rgba(0,0,0,.8);
    padding-bottom:env(safe-area-inset-bottom)}
  .lieux{order:0;flex:1 1 auto;width:auto;display:flex;overflow:visible;padding:0;
    -webkit-mask-image:none;mask-image:none}
  .lieux::after{content:none}
  /* L'ICÔNE AU-DESSUS DU MOT, ET LES DEUX DANS LES 52 PX — 20/09/2026.
     La cellule passe en colonne : 23 px de dessin, deux d'écart, le mot en 11 px. Avec 4 px de
     réserve au-dessus et au-dessous, l'ensemble tient dans la hauteur que la barre avait déjà —
     c'est ce qui fait que rien d'autre ne bouge : ni la réserve du bas de page, ni le composeur
     de l'échange, ni le plein écran, qui lisent tous « 52px » en toutes lettres.
     C'est aussi la mesure des barres d'onglets de téléphone, qui donnent 49 pt à la même chose.

     LE MOT RESTE. Trois de ces cinq lieux sont des notions propres à Kismain : « Mon dossier »,
     « Ma préparation » et « Mon apprentissage » ne se devinent pas à un dessin, quel qu'il soit,
     et une barre qui se devine est une barre qu'on n'ose pas toucher. L'icône donne la
     reconnaissance immédiate, le mot donne la certitude. */
  .lieux a{flex:1 1 0;justify-content:center;text-align:center;border-radius:0;
    padding:6px 2px;font-size:var(--text-1);display:flex;flex-direction:column;
    align-items:center;gap:2px;line-height:1.2}
  .lieux a .pi{display:block;width:23px;height:23px}
  /* LA PASTILLE SE POSE SUR L'ICÔNE. En colonne, elle devenait une TROISIÈME ligne : la cellule
     de « Ma saison » passait à 69 px quand les autres en faisaient 52, et la barre entière avec
     elle. Posée sur le coin de l'icône — là où toutes les applications la mettent — elle ne coûte
     plus un pixel de hauteur. Sa taille ne bouge pas : douze pixels est le plancher de lisibilité
     du produit, et il vaut ici comme ailleurs (`tests/test_contraste_aa.py`). */
  .lieux a .pt-nouveau{position:absolute;top:2px;left:50%;margin-left:5px}
  .lieux a.on{background:rgba(255,255,255,.07)}
  .lieux .long{display:none}
  .lieux .court{display:inline}
  /* Le filet laiton passe du bas au HAUT de la cellule : en bas d'écran il tomberait sous le
     doigt et sous le bord de l'appareil. */
  .lieux a.on::after{top:0;bottom:auto;left:14px;right:14px}

  /* La cinquième cellule. Filet à gauche pour la détacher des quatre lieux, couleur d'arrêt pour
     dire ce qu'elle fait. Un appui par erreur ne coûte rien : la sortie ne déconnecte pas, elle
     quitte la page. */
  .lieu-sortir{display:flex;flex-direction:column;align-items:center;justify-content:center;flex:0 0 auto;gap:2px;
    padding:6px var(--space-3);font-size:var(--text-1);font-weight:700;text-decoration:none;
    line-height:1.2;color:var(--stop-plein-2);background:var(--sable-2);
    border-left:1px solid rgba(255,255,255,.14)}
  .lieu-sortir .pi{display:block;width:23px;height:23px}

  /* La page se termine par une réserve de la hauteur de la barre, sinon la dernière ligne se
     glisse dessous. Même principe que le bandeau qu'elle remplace. */
  body:not(.op):not(.tiers){padding-bottom:calc(52px + env(safe-area-inset-bottom))}
  /* Le bandeau de secours et le bouton flottant s'effacent ici, mais leur masquage est écrit
     plus bas, APRÈS leur déclaration de base : écrit ici, il se ferait réécrire. */

  /* Le repli. `<details>` natif : il fonctionne au clavier et sans une ligne de JavaScript. */
  .topnav-fin{display:none}
  .reglages{display:block;order:2;margin-left:auto}
  .reglages>summary{list-style:none;cursor:pointer;color:var(--vert-300);font-size:var(--text-4);
    line-height:1;letter-spacing:.12em;padding:var(--space-2) var(--space-3);border-radius:var(--radius-pilule);
    border:1px solid rgba(255,255,255,.22)}
  .reglages>summary::-webkit-details-marker{display:none}
  .reglages[open]>summary{color:#FFFDF9;background:rgba(255,255,255,.10)}
  .reglages-menu{position:absolute;right:0;top:calc(100% + 8px);z-index:var(--z-calque);min-width:190px;
    display:flex;flex-direction:column;gap:2px;padding:var(--space-2);
    background:var(--paper);border:1px solid var(--line);border-radius:var(--radius-carte);
    box-shadow:var(--shadow-2)}
  .reglages-menu a{color:var(--ink);text-decoration:none;font-size:var(--text-2);font-weight:600;
    padding:var(--space-2) var(--space-3);border-radius:var(--radius-champ)}
  .reglages-menu a:hover{background:var(--sable)}
  .reglages-menu form{margin:var(--space-2) 0 0;padding-top:var(--space-2);border-top:1px solid var(--line-soft)}
  .reglages-menu button{width:100%;text-align:left;background:none;border:0;cursor:pointer;
    font-family:var(--sans);font-size:var(--text-2);font-weight:600;color:var(--stop);
    padding:var(--space-2) var(--space-3);border-radius:var(--radius-champ)}
  .reglages-menu button:hover{background:var(--stop-pale)}
}

/* CINQ LIEUX SUR UN PETIT TÉLÉPHONE — 19/09/2026, « Mon apprentissage ». Cinq lieux et la sortie
   tiennent à 390 px sans un pixel de marge ; à 360 px, « Sortie rapide » sortait de l'écran, ce qui
   est l'échec n° 5 du brief `18_`. Sous 400 px, et seulement quand cinq lieux sont là (`a-cinq`),
   elle passe sur deux lignes : mêmes mots, même place, même couleur, et aucun lieu ne défile.
   Vérifié à 360, 375 et 390 px avec le rendu réel de l'accueil. */
@media (max-width:399px){
  .lieux-bloc.a-cinq .lieu-sortir{width:min-content;white-space:normal;text-align:center;line-height:1.15;
    padding-left:var(--space-2);padding-right:var(--space-2)}
  /* ET C'EST LE SEUL ENDROIT OÙ LA SORTIE N'A PAS SON ICÔNE — 20/09/2026. Deux lignes de mots
     SOUS un dessin font 66 px : la cellule de sortie devenait la plus haute de la barre et la
     tirait de 52 à 66 px, ce que trois autres règles ne savent pas suivre (la réserve du bas de
     page, le composeur de l'échange, le plein écran, qui lisent « 52px » en toutes lettres).

     Entre retirer le dessin et retirer les mots, on retire le dessin : c'est la seule cellule
     dont le libellé porte à lui seul une consigne de sécurité, pour qui est regardé par-dessus
     l'épaule. Une porte fléchée peut se lire « déconnexion » ; « Sortie rapide » ne se lit que
     d'une façon. Le cas est étroit — cinq lieux ET moins de 400 px — et il se voit à la lecture,
     pas au raisonnement : vérifié à 360, 375 et 390 px. */
  .lieux-bloc.a-cinq .lieu-sortir .pi{display:none}
}

/* LE PLEIN ÉCRAN SUR TÉLÉPHONE — 14/09/2026, demande du Fondateur.
   « Passe le chat, l'appel et la visio en plein écran lorsque j'utilise ces fonctionnalités. »

   Sur un téléphone de 390 px, l'échange perdait environ 150 px de hauteur en décor : la barre de
   marque en haut, le fil d'ariane, le cartouche de saison, et les marges de la colonne. Sur une
   fenêtre de 700 px utiles, c'est plus d'un cinquième de l'écran donné à ce qui ne se lit pas.

   CE QUI NE DISPARAÎT PAS, ET NE DISPARAÎTRA JAMAIS : la barre basse, parce qu'elle porte la
   SORTIE RAPIDE. Un plein écran qui retire l'issue de secours n'est pas un plein écran, c'est
   un piège. C'est aussi pourquoi ce bloc ne touche pas à `.lieux-bloc` : la règle est ailleurs,
   et elle doit le rester pour qu'on la voie en lisant celle-ci.

   Le seuil est celui de la barre basse, 720 px : au-dessus, l'écran a la place et rien ne bouge. */
@media (max-width:720px){
  body.plein-ecran .topnav{display:none}
  body.plein-ecran .lieu-fil,
  body.plein-ecran .frise-saison{display:none}
  /* La réserve pour la barre basse est portée UNE fois, par `body:not(.op):not(.tiers)` plus
     haut : la porter aussi ici la comptait deux fois, safe-area comprise, et c'était le vide
     que le Fondateur entourait sur sa capture (14/09/2026). */
  body.plein-ecran .wrap{padding:0;max-width:none}
  /* Sous 720 px, la barre du bas n'est plus la barre de secours (56 px) mais celle des lieux,
     52 px plus le safe-area : le composeur se pose sur celle qui est là. C'est ici, et une seule
     fois, que la réserve du bas s'écrit. */
  body.plein-ecran .fil-pied{bottom:calc(52px + env(safe-area-inset-bottom))}
  /* La conversation, l'appel et la visio touchent les deux bords : plus de coin arrondi ni de
     filet latéral, comme le fait toute application de messagerie sur un téléphone. */
  body.plein-ecran .fil,
  body.plein-ecran .card{border-radius:0;border-left:0;border-right:0}
  /* Et elle prend la hauteur laissée par la barre basse. `dvh` et non `vh` : sur un téléphone,
     `vh` compte la barre d'adresse du navigateur même quand elle s'est rétractée, et le dernier
     message finissait sous le pli. */
  body.plein-ecran .fil{min-height:calc(100dvh - 52px - env(safe-area-inset-bottom))}
}

/* --- Écrans membres : quelques détails ajoutés le 04/09/2026 ---------------------------------- */

/* L'identité déclarée, relue à côté de la photo. Sous 560 px, la photo passe au-dessus. */
.duo-ident{display:flex;gap:var(--space-4);align-items:flex-start;flex-wrap:wrap}
.duo-ident table{flex:1 1 240px;margin:0}
.photo-moi{flex:0 0 auto;width:132px;height:132px;object-fit:cover;border-radius:var(--radius-carte);
  border:1px solid var(--line)}

/* L'aide sous un champ : elle explique une conséquence, elle ne répète pas l'étiquette. */
.aide-champ{display:block;margin-top:var(--space-1);font-weight:400}

/* Un lien à recopier : il doit pouvoir déborder sans pousser la page de côté. */
.lien-copie code{display:block;word-break:break-all;background:var(--sable-2);
  border:1px solid var(--line);border-radius:var(--radius-champ);padding:var(--space-3) var(--space-3);font-size:var(--text-2)}

/* --- Le corps de page ------------------------------------------------------------------------

Trois largeurs, choisies par le gabarit via {% block wrap_classe %} :
  (défaut)  680 px — une colonne de lecture et de formulaire ;
  .large   1180 px — quand il faut comparer plusieurs personnes ou plusieurs lignes ;
  .plein          — la page prend la hauteur de la fenêtre (échange, appel). */

.wrap{max-width:680px;margin:0 auto;padding:32px 22px 120px}
/* Avec un rail, la colonne de lecture ne rétrécit pas : c'est la page qui s'élargit de la
   largeur du rail. `:not(.large)` parce que les écrans larges, eux, gardent leurs 1136 px utiles
   et laissent le rail les entamer — 216 + 32 + 888, ce sont les chiffres du modèle. */
.wrap.avec-rail:not(.large){max-width:960px}
.wrap.large{max-width:1180px}
.wrap.plein{max-width:none;padding:0;height:calc(100vh - 56px);display:flex;flex-direction:column}

/* --- LE FIL : où l'on est, et le retour d'un niveau (08/09/2026) -------------------------------

   Discret par construction : il informe, il n'appelle pas. Le nom du lieu est un lien parce
   qu'il EST le retour ; la feuille ne l'est pas, on y est déjà. */
/* `.lieu-fil` et non `.fil` : `.fil` est le fil de CONVERSATION de l'écran d'échange, avec ses
   `.fil-tete`, `.fil-corps` et `.fil-pied`. Deux choses différentes sous le même nom, c'est
   l'incident de `.rail` que raconte l'en-tête de `test_feuilles_de_style.py`, et c'est ce même
   test qui a arrêté celui-ci. */
.lieu-fil{display:flex;align-items:baseline;gap:var(--space-2);margin:0 0 var(--space-4);font-size:var(--text-2);
  color:var(--ink-mute);flex-wrap:wrap}
.lieu-fil a{color:var(--ink-soft);text-decoration:none;font-weight:600;
  border-bottom:1px solid transparent;transition:color .16s ease,border-color .16s ease}
.lieu-fil a:hover{color:var(--accent);border-bottom-color:var(--vert-300)}
.lieu-fil .sep{color:var(--line)}
.lieu-fil .ici{color:var(--ink)}

/* Sur téléphone le rail n'existe pas : le fil devient la seule indication de lieu, et surtout le
   seul retour. Il prend donc la forme d'un retour — un chevron devant — et laisse tomber la
   feuille, que le titre de la page répète immédiatement en dessous. */
@media (max-width:1000px){
  .lieu-fil{margin-bottom:var(--space-4)}
  .lieu-fil a::before{content:"‹ ";color:var(--ink-mute)}
  .lieu-fil .sep,.lieu-fil .ici{display:none}
}

/* --- L'INDEX D'UN LIEU, RENDU COMME ÉCRAN ------------------------------------------------------
   Le même contenu que le rail, à la taille du doigt. Une colonne, des lignes séparées par un
   filet, rien d'autre : ni compteur, ni état, ni pastille. */
.index-lieu{display:flex;flex-direction:column;background:var(--paper);
  border:1px solid var(--line);border-radius:var(--radius-carte);overflow:hidden}
.index-lieu a{padding:var(--space-4) var(--space-4);font-size:var(--text-3);font-weight:600;color:var(--titre);
  text-decoration:none;border-bottom:1px solid var(--line-soft);
  display:flex;align-items:center;justify-content:space-between;gap:var(--space-3);
  transition:background .16s ease}
/* --- UN INTERTITRE N'EST PAS UNE PORTE — 17/09/2026 -------------------------------------------
   Le Fondateur, sur « Ma saison » : « on doit distinguer les titres des boutons qui renvoient sur
   chacune des pages ». Ils se ressemblaient trop : même carte, même largeur, même bord inférieur,
   et l'intertitre portait un fond `--sable-2` qui le faisait lire comme une ligne pressable de
   plus — la plus pâle du lot, donc celle qu'on prend pour désactivée.

   DEUX DIFFÉRENCES, ET AUCUNE N'EST UNE NUANCE. L'intertitre SORT de la carte : il se pose
   au-dessus d'elle, sans fond, sans bord, dans la voix des indications. La porte, elle, prend un
   chevron dans une pastille de laiton — la couleur que le Fondateur a demandée pour tout ce qui
   se presse. On ne peut plus les confondre du coin de l'œil, ce qui est le seul usage qu'on en
   fait en parcourant un index. */
.index-lieu a::after{
  content:"›";flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;
  width:26px;height:26px;border-radius:50%;
  background:var(--laiton-pale);color:var(--laiton-texte);
  font-weight:700;font-size:var(--text-4);line-height:1;padding-bottom:2px;
  transition:background .16s ease,color .16s ease;
}
.index-lieu a:last-child{border-bottom:0}
.index-lieu a:hover{background:var(--sable-2)}
.index-lieu a:hover::after{background:var(--laiton);color:var(--vert-950)}

/* L'intertitre se pose HORS de la carte : la liste se referme au-dessus de lui et se rouvre
   dessous. C'est ce qui le fait lire comme un titre, et non comme une ligne pâle de la liste. */
.index-lieu{background:none;border:0;border-radius:0;overflow:visible;gap:0}
.index-lieu a{background:var(--paper);border-left:1px solid var(--line);border-right:1px solid var(--line)}
.index-lieu a:first-of-type{border-top:1px solid var(--line)}
.index-lieu .index-famille+a{border-top:1px solid var(--line);
  border-top-left-radius:var(--radius-carte);border-top-right-radius:var(--radius-carte)}
.index-lieu a:last-child{border-bottom:1px solid var(--line);
  border-bottom-left-radius:var(--radius-carte);border-bottom-right-radius:var(--radius-carte)}
.index-lieu .index-famille{margin:var(--space-6) 0 var(--space-2);padding:0 var(--space-1);
  font-family:var(--mono);font-size:var(--text-1);font-weight:500;text-transform:uppercase;
  letter-spacing:.11em;color:var(--ink-mute);background:none;border:0}
.index-lieu .index-famille:first-child{margin-top:0}
/* Le numéro d'étape, dans les seuls lieux qui en ont un. En laiton, jamais en vert : le vert
   veut dire « franchie », et un numéro dit un ordre, pas un avancement. L'écran hors série garde
   sa case vide, ce qui suffit à le distinguer sans lui coller une étiquette de plus. */
.index-lieu .index-nom{flex:1}
.index-lieu.numerote .index-num{flex:0 0 auto;width:22px;font-family:var(--serif);
  font-weight:600;color:var(--laiton-texte)}

/* --- LES CONVERSATIONS EN COURS, SUR L'INDEX DU LIEU (09/09/2026) ------------------------------
   L'onglet « Ma saison » mène désormais à l'index, et non plus droit à la conversation la plus
   récente. Cette liste évite que le geste le plus fréquent du produit y perde son évidence.

   `.frisette` est le plus petit membre de la famille de l'arc : six repères, aucun libellé, la
   même signification pour chaque état. Elle ne porte pas les classes de `.arc` parce qu'elle
   n'obéit pas à sa règle de bascule — six ronds tiennent sur un téléphone, six libellés non. */
.index-titre{font-family:var(--sans);font-size:var(--text-1);font-weight:700;text-transform:uppercase;
  letter-spacing:.1em;color:var(--ink-mute);margin:0 0 var(--space-3)}
.binomes{display:flex;flex-direction:column;background:var(--paper);
  border:1px solid var(--line);border-radius:var(--radius-carte);overflow:hidden;margin:0 0 var(--space-7)}
.binome{display:grid;grid-template-columns:minmax(0,1fr);gap:var(--space-3);align-items:center;
  padding:var(--space-3) var(--space-4);border-bottom:1px solid var(--line-soft);text-decoration:none;
  transition:background .16s ease}
.binome:last-child{border-bottom:0}
.binome:hover{background:var(--sable-2)}
.binome .qui b{display:block;font-family:var(--serif);font-size:var(--text-3);font-weight:600;
  color:var(--titre)}
.binome .qui .quand{display:block;font-size:var(--text-2);color:var(--ink-mute);margin-top:2px}
@media(min-width:640px){.binome{grid-template-columns:minmax(0,1fr) 220px;gap:var(--space-5)}}

.frisette{display:grid;grid-auto-flow:column;grid-auto-columns:1fr;position:relative;
  align-items:center;--fond-frisette:var(--paper)}
.binome:hover .frisette{--fond-frisette:var(--sable-2)}
.frisette::before{content:"";position:absolute;left:8%;right:8%;top:50%;height:1px;
  background:var(--line);transform:translateY(-50%)}
/* Même correction que la rangée, pour la même raison : le repère couvre le filet, il ne le
   troue pas. Ici le filet ne fait qu'un pixel, donc neuf suffisent largement. */
.frisette .pt{position:relative;z-index:1;box-sizing:border-box;width:9px;height:9px;
  border-radius:50%;margin:0 auto;background:var(--fond-frisette)}
.frisette .pt.franchie{background:var(--vert-plein)}
.frisette .pt.action{background:var(--laiton);box-shadow:inset 0 0 0 2px var(--fond-frisette)}
.frisette .pt.ouverte{border:2px solid var(--ink-soft)}
.frisette .pt.pasencore,.frisette .pt.avenir{border:1.5px dashed var(--ink-mute)}
/* Un seul repère : sur les quatre écrans de moment (Mon appel, Ma visio…), la ligne d'un binôme
   ne montre que l'état de CETTE étape-là. Le trait qui relie n'a alors rien à relier. */
/* LA LISTE QUI AGIT, sur « Ma décision » et « Ma rencontre » (09/09/2026). Une carte par binôme,
   sa tête nommant la personne et l'état de l'étape, puis le geste lui-même — le même bloc que
   dans la conversation. Elle ne peut pas être un lien comme `.binome` : elle CONTIENT des liens
   et des formulaires, et un lien dans un lien n'existe pas. */
.binomes-agir{display:flex;flex-direction:column;gap:var(--space-5);margin:0 0 var(--space-7)}
.binome-agir{border:1px solid var(--line);border-radius:var(--radius-carte);background:var(--paper);
  padding:var(--space-4) var(--space-5)}
.binome-agir>header{display:flex;align-items:center;justify-content:space-between;gap:var(--space-4);
  padding-bottom:var(--space-3);margin-bottom:var(--space-4);border-bottom:1px solid var(--line-soft)}
.binome-agir>header .qui b{display:block;font-family:var(--serif);font-size:var(--text-3);
  font-weight:600;color:var(--titre)}
.binome-agir>header .qui .quand{display:block;font-size:var(--text-2);color:var(--ink-mute);
  margin-top:2px}
.binome-agir>header .frisette{flex:0 0 auto;width:12px}
/* La section d'outil perd sa tête : le nom de l'étape est déjà le titre de l'écran, et celui de
   la personne est juste au-dessus. Trois titres pour un bloc en feraient un empilement. */
.binome-agir .outil>.outil-titre{display:none}
.binome-agir .outil>.corps{display:block}

.frisette.une{justify-self:end}
.frisette.une::before{display:none}

/* --- LES QUATRE MOMENTS DE LA SAISON (09/09/2026) ---------------------------------------------
   Mon appel, Ma visio, Ma décision, Ma rencontre : quatre écrans de RÈGLES, atteints par les
   paliers de la frise. Une règle par bloc, titrée, sans repli — on vient les lire, pas les
   déplier. Le filet à gauche les relie sans les enfermer dans quatre cartes, ce qui donnerait
   quatre objets là où il y a une seule liste. */
/* Depuis le 14/09/2026 chaque règle est un repli (`.repli`) : le Fondateur voulait « des
   bannières déroulantes » sur Mon appel, Ma visio et Ma décision. Le titre se lit d'un coup
   d'œil, le texte s'ouvre à la demande. */
.regles-phase{display:flex;flex-direction:column;gap:var(--space-3);margin:0 0 var(--space-7)}
.regles-phase .regle{border-left:2px solid var(--laiton-filet);padding-left:var(--space-4)}
.regles-phase .regle h2{margin:0 0 var(--space-2);font-family:var(--serif);font-size:var(--text-4);
  font-weight:600;color:var(--titre);line-height:1.25}
.regles-phase .regle p{margin:0;color:var(--ink-soft)}

/* --- ARRÊTER UNE SESSION EN COURS (09/09/2026) -------------------------------------------------
   Le bouton qui suspend l'appel ou la visio, et le signe qu'un tiers peut adresser aux deux.

   LE BOUTON EST ROUGE ET SEUL SUR SA LIGNE. Il ne doit ressembler à aucune action ordinaire de
   l'écran, et il ne doit jamais se trouver à côté d'un bouton qu'on presse souvent : c'est le
   geste qu'on cherche une fois, quand tout le reste a échoué. Même famille que « Raccrocher »,
   dont il se distingue par le contour plein — raccrocher termine, celui-ci interrompt. */
.arret-session{display:flex;flex-direction:column;align-items:flex-start;gap:var(--space-2);
  margin:var(--space-7) 0 var(--space-4);padding-top:var(--space-4);border-top:1px solid var(--line)}
.btn-arret{font:inherit;font-size:var(--text-2);font-weight:600;cursor:pointer;
  background:var(--stop-plein);color:#FFF;border:0;border-radius:var(--radius-pilule);padding:var(--space-2) var(--space-5);
  transition:background .16s ease}
.btn-arret:hover{background:var(--stop-plein-2)}
.btn-arret:focus-visible{outline:2px solid var(--stop);outline-offset:2px}

/* Le signe reçu. Laiton, et c'est exactement son sens habituel — « à vous de jouer » : quelqu'un
   attend un geste de vous deux. Il n'est pas rouge : ce n'est ni une panne ni une sanction, et
   le rouge du produit dit « ça s'arrête », ce que ce bandeau ne dit justement pas. */
.signe-tiers{display:flex;align-items:center;gap:var(--space-3);margin:0 0 var(--space-4);
  padding:var(--space-3) var(--space-4);border-radius:var(--radius-champ);
  background:var(--laiton-pale);border:1px solid var(--laiton-filet);
  color:var(--laiton-texte);font-size:var(--text-3);font-weight:600}
.signe-tiers::before{content:"";flex:0 0 auto;width:11px;height:11px;border-radius:50%;
  background:var(--laiton)}
/* `display:flex` l'emportait sur l'attribut `hidden` : le bandeau s'affichait vide, un point
   laiton dans une boîte sans mot, au bas de chaque appel et de chaque visio. C'était le « pavé »
   de la capture du Fondateur (14/09/2026). */
.signe-tiers[hidden]{display:none}

/* --- LE LIEU : son index à gauche, sa pièce à droite (08/09/2026) ------------------------------

   Niveau 2 du modèle de navigation. Le rail liste TOUS les écrans du lieu, jamais replié, et ne
   dit rien d'autre : ni ce qui est fait, ni ce qui attend. Un index n'est pas un tableau de bord.

   `align-items:start` sans quoi le rail s'étirerait sur toute la hauteur de la pièce et son fond
   descendrait sous le dernier lien, jusqu'au pied d'une page de deux mille pixels. */
/* `max-content` et non `216px` : la première colonne se règle sur ce qu'elle contient, donc elle
   se réduit d'elle-même à la largeur du bouton quand le rail est rabattu. Aucun `:has()`, aucune
   classe posée par un script — c'est la grille qui suit le repli, pas l'inverse. */
.lieu{display:grid;grid-template-columns:max-content minmax(0,1fr);gap:32px;align-items:start}
/* `min-width:0` : sans lui, un tableau large ou un bloc de code dans la pièce refuse de se
   rétrécir et pousse la grille au-delà de l'écran, rail compris. */
.piece{min-width:0}

/* --- LE RAIL SE RABAT — 09/09/2026 ------------------------------------------------------------
   Demande du Fondateur : « le rail de gauche, qu'il puisse se fermer, se cacher, se rabattre sur
   la gauche à ma demande, pour plus de lisibilité ».

   `<details>` natif, et non un panneau écrit à la main : le repli fonctionne au clavier, se lit
   correctement, et surtout il fonctionne SANS JavaScript. La règle du produit est que toute la
   navigation en soit indépendante, celle-ci comprise. Le script n'ajoute qu'une chose qu'un
   `<details>` ne sait pas faire seul : se souvenir du choix d'un écran au suivant.

   Ouvert par défaut : un index qui s'ouvre fermé n'est plus un index. */
.rail-repli{position:sticky;top:74px}
.rail-repli>summary{display:flex;align-items:center;gap:var(--space-2);cursor:pointer;
  list-style:none;padding:var(--space-2) var(--space-3);border:1px solid var(--line);border-radius:var(--radius-champ);
  background:var(--sable-2);font-size:var(--text-1);font-weight:700;text-transform:uppercase;
  letter-spacing:.11em;color:var(--ink-mute);transition:color .16s ease}
.rail-repli>summary::-webkit-details-marker{display:none}
.rail-repli>summary::marker{content:""}
.rail-repli>summary:hover{color:var(--ink)}
.rail-repli>summary:focus-visible{outline:2px solid var(--focus);outline-offset:2px}
/* Les trois barres, dessinées : un caractère « ☰ » n'a pas la même chasse d'une police à
   l'autre et sautait d'un système à l'autre. */
.rail-repli>summary .barres{position:relative;flex:none;width:14px;height:2px;
  background:currentColor}
.rail-repli>summary .barres::before,.rail-repli>summary .barres::after{content:"";
  position:absolute;left:0;width:14px;height:2px;background:currentColor}
.rail-repli>summary .barres::before{top:-5px}
.rail-repli>summary .barres::after{top:5px}
.rail-repli:not([open])>summary .mot{display:none}
.rail-repli[open]>summary{margin-bottom:var(--space-2)}

.rail-lieu{width:216px;display:flex;flex-direction:column;gap:1px;
  background:var(--sable-2);border:1px solid var(--line);border-radius:var(--radius-carte);padding:var(--space-2)}
.rail-lieu a{display:block;padding:var(--space-2) var(--space-3);border-radius:var(--radius-champ);font-size:var(--text-2);
  color:var(--ink-soft);text-decoration:none;
  transition:background .16s ease,color .16s ease}
.rail-lieu a:hover{background:var(--paper);color:var(--ink)}
/* L'entrée courante : un aplat, un texte plein, et un filet à gauche. Trois marqueurs, jamais la
   couleur seule — c'est la règle du modèle et celle de l'accessibilité. */
.rail-lieu a.ici{background:var(--paper);color:var(--titre);font-weight:600;
  box-shadow:inset 3px 0 0 var(--laiton-2)}

/* LES FAMILLES DE PORTES — 08/09/2026, « Ma saison ».
   Treize portes au même poids dans un ordre qui ne disait rien. Ce sont des intertitres de TEXTE,
   sans lien et sans repli : l'échec n°5 du `18_` venait d'un onglet par famille, qui avait fait
   passer la barre à cinq entrées et déborder sur téléphone. Ici aucune entrée de navigation n'est
   créée, et aucune porte ne part dans un sous-lieu. */
.rail-lieu .rail-famille{margin:var(--space-4) 0 var(--space-1);padding:0 var(--space-3);font-family:var(--sans);
  font-size:var(--text-1);font-weight:700;text-transform:uppercase;letter-spacing:.1em;
  color:var(--ink-mute)}
.rail-lieu .rail-famille:first-of-type{margin-top:var(--space-2)}

/* Sous 1000 px le rail n'a plus la place : la pièce prend toute la largeur, et l'index du lieu
   est alors un écran à part entière, que le fil atteint en un geste. Le bouton de repli s'en va
   avec lui — un bouton qui replie ce qui n'est pas affiché ne replie rien. */
@media (max-width:1000px){
  .lieu{display:block}
  .rail-repli{display:none}
}

/* L'en-tête d'une page : un mot de situation, un titre, une phrase. Le même partout, pour que le
   regard sache où se poser dès l'arrivée. */
.tete{margin:0 0 var(--space-5)}
.tete .kick{margin-bottom:var(--space-2)}
/* LE RETOUR AU LIEU, ÉCRIT SUR LA PAGE — 14/09/2026. Le Fondateur, sur le chat, l'appel et la
   visio : « comment je fais pour revenir sur la page principale de ma saison ? ». La barre du
   bas y mène, mais le plein écran a retiré le fil de niveau, et rien sur la page ne nommait le
   retour. Une ligne au-dessus du titre, sobre : c'est un chemin, pas un bouton. */
.retour-lieu{display:inline-block;margin:0 0 10px;font-size:.83rem;font-weight:600;
  color:var(--accent);text-decoration:none}
.retour-lieu::before{content:"";display:inline-block;width:0;height:0;margin-right:var(--space-2);
  vertical-align:middle;border-top:5px solid transparent;border-bottom:5px solid transparent;
  border-right:6px solid currentColor}
.retour-lieu:hover{text-decoration:underline;text-underline-offset:2px}
.tete h1{margin:0 0 .32em}
.tete .lede{margin:0}
.tete-ill{display:flex;align-items:flex-start;gap:var(--space-5)}
.tete-ill>svg,.tete-ill>.ill{flex:0 0 auto;width:56px;height:56px}
@media (max-width:560px){.tete-ill{gap:var(--space-4)}.tete-ill>svg,.tete-ill>.ill{width:42px;height:42px}}

/* --- Peau opérateur : la console -------------------------------------------------------------

Ce n'était qu'une surcharge de gris sur la barre du membre. Six des douze écrans n'étaient
atteignables que par leur adresse : le détail d'une saison, le dossier de qualification, le
scellé, les dispenses, les finances, la fiche d'une personne. La barre latérale les rend tous
joignables, groupés par métier, et porte les volumes de travail.

Le code couleur des compteurs est strict, et c'est tout ce qu'ils veulent dire :
  laiton — une file qui attend un geste de l'opérateur ;
  rouge  — un signalement, seul cas où le délai compte ;
  gris   — un état, sans action attendue.
Aucun compteur n'est jamais posé sur une personne : seuls les volumes de travail portent un
nombre. */

body.op{background:var(--gr-50);color:var(--gr-950);display:flex;min-height:100vh;align-items:stretch}
/* Tout ce qui colore le texte de la console vise `.plan`, jamais `body.op`.
   `body.op h2` compte un élément de plus que `.poste-groupe>h2` : il gagnait, et peignait les
   intertitres de la barre latérale en `--gr-950`, c'est-à-dire exactement la couleur du fond de
   cette barre. « Ce matin », « Candidatures », « Confiance » étaient là, invisibles.
   Même cause pour les liens, en `--gr-900` sur `--gr-950`. Trouvé le 02/09/2026, à la relecture
   visuelle — aucun test ne peut voir qu'un texte a la couleur de son fond. */
body.op .plan h1,body.op .plan h2,body.op .plan h3{color:var(--gr-950)}
body.op .plan a{color:var(--gr-900)}
body.op .plan a:hover{color:var(--laiton-texte)}

.poste{flex:0 0 252px;background:var(--gr-950);color:var(--gr-200);display:flex;
  flex-direction:column;position:sticky;top:0;height:100vh;overflow-y:auto;
  scrollbar-width:thin;scrollbar-color:var(--gr-800) transparent}
.poste-tete{text-decoration:none;padding:18px 18px 16px;border-bottom:1px solid var(--gr-900);display:flex;
  align-items:center;gap:10px}
.poste-tete .k{width:26px;height:26px;border-radius:5px;background:var(--laiton);display:flex;
  align-items:center;justify-content:center;font-family:var(--serif);font-size:15px;
  font-weight:600;color:var(--gr-950);flex:0 0 auto}
.poste-tete .t{display:flex;flex-direction:column;min-width:0}
.poste-tete .t b{font-family:var(--serif);font-size:var(--op-t3);font-weight:600;color:#fff}
.poste-tete .t span{font-family:var(--mono);font-size:var(--op-t1);color:var(--gr-400)}

/* LE CORPS DU POSTE — tout ce qui se replie au pouce, et rien d'autre : les cinq groupes et le
   pied. L'emblème et le bouton restent dehors, ce sont eux la barre quand le reste est fermé.
   Sur un écran large, ce conteneur n'est qu'une colonne de plus dans une colonne, et le bouton
   qui le commande n'existe pas. */
.poste-corps{display:flex;flex-direction:column;flex:1;min-height:0}
.poste-bascule,.poste-bouton{display:none}

.poste-groupe{padding:14px 10px 4px}
.poste-groupe>h2{font-family:var(--mono);font-size:var(--op-t1);letter-spacing:.12em;
  text-transform:uppercase;color:var(--gr-300);padding:0 8px 8px;margin:0;font-weight:400}
.poste a{display:flex;align-items:center;gap:10px;padding:9px 10px;border-radius:6px;
  color:var(--gr-200);text-decoration:none;font-size:var(--op-t2);
  transition:background .16s ease,color .16s ease}
.poste a:hover{background:var(--gr-900);color:#fff}
.poste a.on{background:var(--gr-900);color:#fff}
.poste a.on::before{content:"";width:5px;height:5px;border-radius:50%;background:var(--laiton);
  flex:0 0 auto}
/* Une sous-entrée : l'écran où l'on travaille en ce moment, atteint depuis une liste. Elle
   disparaît dès qu'on quitte l'écran — ce n'est pas un onglet, rien n'est empilé. */
.poste a.sous{padding-left:26px;font-size:var(--op-t2);color:var(--gr-300)}
.poste a.sous.on{color:#fff;background:transparent}
.poste a.sous.on::before{display:none}
.poste-nb{margin-left:auto;font-family:var(--mono);font-size:var(--op-t1);color:var(--gr-400)}
.poste-nb.attend{color:var(--laiton)}
.poste-nb.urgent{color:#D0736A}
.poste-pied{margin-top:auto;padding:16px 18px 20px;border-top:1px solid var(--gr-900);
  display:flex;flex-direction:column;gap:5px}
.poste-pied span{font-family:var(--mono);font-size:var(--op-t1);color:var(--gr-400)}
.poste-pied b{font-size:var(--op-t2);color:var(--gr-200);font-weight:400}
.poste-pied form{margin:10px 0 0}
.poste-pied button{width:100%;background:none;border:1px solid var(--gr-800);color:var(--gr-300);
  font:inherit;font-size:var(--op-t2);padding:7px 12px;border-radius:6px;cursor:pointer;
  transition:border-color .16s ease,color .16s ease}
.poste-pied button:hover{border-color:var(--stop);color:#D0736A}

/* --- Le rail : un poste de pilotage ------------------------------------------------------------ */
.poste{background:linear-gradient(180deg,var(--op-nuit) 0%,var(--gr-950) 44%,#1A2329 100%);
  position:relative}
.poste::after{content:"";position:absolute;top:0;right:0;bottom:0;width:1px;
  background:linear-gradient(180deg,rgba(47,127,224,.55),rgba(47,127,224,.08) 40%,transparent)}
.poste-tete .k{background:linear-gradient(140deg,var(--op-azur-clair),var(--op-azur-sombre));
  box-shadow:0 2px 10px -2px rgba(47,127,224,.7)}
.poste-groupe>h2{color:var(--gr-400)}

/* L'ENTRÉE, AU-DESSUS DES GROUPES — 10/09/2026. Le tableau de bord n'est pas une famille de
   travail, c'est la porte : il perd son titre de groupe et gagne un filet qui le sépare du
   reste. */
.poste-groupe.poste-entree{margin-bottom:var(--e3);padding-bottom:var(--e3);
  border-bottom:1px solid rgba(255,255,255,.07)}

/* LES ÉCRANS QUI N'ONT PAS D'ENTRÉE À EUX, déclarés sous leur parent plutôt que tus. Ils
   s'atteignent depuis une liste, et c'est très bien ; ce qui ne va pas, c'est de ne pas savoir
   qu'ils existent. Ce n'est pas un lien : cliquer demanderait de choisir QUEL dossier, et il n'y
   a pas de réponse hors contexte. */
.poste-pend{display:block;padding:2px 0 6px 26px;font-size:var(--op-t1);line-height:1.45;
  color:var(--gr-400)}
/* LE BANDEAU DE SITUATION — 11/09/2026. Trois faits sur l'écran où l'on se trouve : avant, ici,
   ensuite. Discret par construction : il oriente celui qui cherche, il ne doit pas encombrer
   celui qui sait. D'où le gris, la petite taille, et le repli en colonne sur téléphone. */
.console-situation{display:flex;flex-wrap:wrap;gap:4px 18px;margin:0 0 18px;padding:10px 14px;
  border-left:2px solid var(--gr-800);font-size:var(--op-t1);line-height:1.5;color:var(--gr-400)}
.console-situation b{display:inline-block;margin-right:6px;font-weight:600;color:var(--gr-300);
  text-transform:uppercase;letter-spacing:.06em;font-size:.88em}
@media (max-width:720px){.console-situation{flex-direction:column;gap:6px}}

/* LES ÉTAPES DU GUIDE. Un bloc par écran, séparé par un filet plutôt que par une carte : une
   carte par écran en ferait vingt et une, et le guide se lirait comme une liste de boîtes au
   lieu d'un parcours. */
.guide-etape{padding:14px 0;border-top:1px solid var(--gr-800)}
.guide-etape:first-child{padding-top:0;border-top:0}
.guide-etape h3{margin:0 0 6px;font-size:var(--op-t3)}
.guide-etape p{margin:0 0 4px}

.poste a{position:relative;transition:background .16s ease,color .16s ease,transform .16s var(--ease)}
.poste a:hover{transform:translateX(2px)}
.poste a.on{background:linear-gradient(90deg,rgba(47,127,224,.16),rgba(47,127,224,.02))}
.poste a.on::before{background:var(--op-azur-clair);
  box-shadow:0 0 8px 1px rgba(127,178,240,.9)}
.poste-nb{padding:1px 7px;border-radius:99px;font-size:var(--op-t1);line-height:1.5;
  background:rgba(255,255,255,.06);color:var(--gr-300)}
.poste-nb.attend{background:rgba(217,169,63,.16);color:#E8C275}
.poste-nb.urgent{background:rgba(208,99,90,.18);color:#EE9086}


body.op .plan{flex:1;min-width:0;display:flex;flex-direction:column}
body.op .wrap{max-width:1420px;margin:0;padding:26px 30px 96px;width:100%}
body.op .wrap.large{max-width:1420px}

/* ==================================================================================================
   LA RÉGIE, 12/09/2026 (brief 24).

   La console devient une console admin et opérateur, avec sa propre marque (le monogramme, un R
   barré d'un trait à curseur), un rail encre, une bande cuivre quand le mode admin est ouvert, et
   une recherche dans le rail. Tout ce qui suit est porté par `.poste` ou `body.op`, et ne touche
   à aucun écran membre.
   ================================================================================================== */
.poste{background:linear-gradient(180deg,var(--op-nuit) 0%,#16232D 100%)}
.poste::after{background:linear-gradient(180deg,rgba(47,127,224,.6),rgba(47,127,224,.08) 40%,transparent)}
.poste-tete{gap:10px;padding:16px 16px 14px}
.poste-tete .k{width:28px;height:28px;background:none;box-shadow:none;color:#fff;border-radius:0}
.poste-tete .t b{font-size:var(--op-t4);letter-spacing:.01em}
.poste-groupe{padding:10px 10px 2px}
.poste a{padding:6px 10px}
.poste a.on{background:linear-gradient(90deg,rgba(47,127,224,.18),rgba(47,127,224,.03))}
/* Un écran réservé est dans le rail, grisé, et le dit : mieux qu'un écran absent, qu'on croit
   oublié. */
.poste a.reserve{color:var(--gr-400)}
.poste-reserve{margin-left:auto;font-family:var(--mono);font-size:var(--op-t1);letter-spacing:.08em;
  color:var(--gr-400)}
.poste-nb.attend{background:rgba(217,154,30,.18);color:#EFC46A}
.poste-nb.urgent{background:rgba(214,91,79,.2);color:#F09A90}

/* LA RECHERCHE VIT DANS LE RAIL. Elle mène à une fiche, jamais à une file. */
.poste-recherche{margin:12px 10px 0}
.poste-recherche input{width:100%;background:rgba(255,255,255,.06);border:1px solid var(--gr-800);
  color:var(--gr-100);border-radius:6px;padding:7px 10px;font-size:var(--op-t2);font-family:inherit}
.poste-recherche input::placeholder{color:var(--gr-400)}
.poste-recherche input:focus{border-color:var(--op-azur);box-shadow:0 0 0 3px rgba(47,127,224,.25);
  outline:none}

/* LE MODE ADMIN SE VOIT EN PERMANENCE : une bande cuivre en tête du rail, le mot, et le bouton
   pour en sortir. Le groupe « Régie » n'existe qu'alors, sous un intertitre cuivre. Aucun autre
   élément de la console n'est cuivre. */
.poste-admin{margin:12px 10px 0;background:var(--op-cuivre);color:#fff;border-radius:6px;
  padding:7px 10px;display:flex;align-items:center;justify-content:space-between;
  font-family:var(--mono);font-size:var(--op-t1);letter-spacing:.1em;text-transform:uppercase;
  font-weight:600}
.poste-admin button{font:inherit;font-size:var(--op-t1);letter-spacing:.06em;
  border:1px solid rgba(255,255,255,.55);background:transparent;color:#fff;border-radius:4px;
  padding:2px 8px;cursor:pointer}
.poste-admin button:hover{background:rgba(255,255,255,.14)}
.poste.admin::after{background:linear-gradient(180deg,rgba(184,103,43,.85),rgba(184,103,43,.12) 40%,transparent)}
.poste-admin-groupe{margin-top:auto;border-top:1px solid rgba(255,255,255,.07)}
.poste-admin-groupe>h2{color:#E0955E}
.poste-pied-groupe{border-top:1px solid rgba(255,255,255,.07);margin-top:6px;padding-top:8px}
.poste .poste-lien-admin{padding:6px 0;color:#E0955E;font-size:var(--op-t2)}
.poste .poste-lien-admin:hover{background:none;color:#F0B27E}


/* --- LE POSTE AU POUCE : UNE COLONNE REPLIÉE, PLUS UNE RANGÉE QUI DÉFILE -----------------------

   Signalé par le Fondateur le 10/09/2026, capture à l'appui : la barre horizontale était tronquée
   des deux côtés. C'est arithmétique et non accidentel — quinze liens ne tiennent pas dans 390 px,
   quoi qu'on fasse de leur graisse ou de leurs marges. Le défilement horizontal donnait une
   fenêtre d'un lien et demi, sans rien pour dire qu'il y en avait treize autres.

   Le poste redevient donc EXACTEMENT la colonne du bureau, repliée derrière un bouton. Ce qui
   avait été retiré faute de place revient : les titres des quatre familles, et les lignes qui
   déclarent les écrans contextuels. Les trois règles posées le matin même pour rattraper la
   rangée s'en vont avec elle — elles corrigeaient les symptômes d'un axe qui n'existe plus. */

@media (max-width:900px){
  body.op{flex-direction:column}
  .poste{flex:0 0 auto;height:auto;position:static;flex-direction:row;flex-wrap:wrap;
    align-items:center;gap:0;padding:0 var(--e3);overflow:visible}
  /* Le filet cyan longeait le bord droit d'une colonne. Ici il souligne la barre. */
  .poste::after{top:auto;right:0;bottom:0;left:0;width:auto;height:1px;
    background:linear-gradient(90deg,rgba(47,127,224,.55),rgba(47,127,224,.08) 45%,transparent)}
  .poste-tete{border-bottom:none;padding:10px 0;flex:1 1 auto;min-width:0}

  /* LA CASE : invisible, jamais retirée. Un `display:none` la sortirait du parcours au clavier,
     et le bouton ne serait alors plus qu'une image. Même traitement que `.rang>.bascule`. */
  .poste-bascule{position:absolute;width:1px;height:1px;opacity:0;margin:0}
  .poste-bouton{display:flex;align-items:center;gap:var(--e2);flex:0 0 auto;cursor:pointer;
    margin-left:auto;padding:9px 13px;border:1px solid var(--gr-800);border-radius:var(--r-sm);
    color:var(--gr-200);font-size:var(--op-t1);font-weight:700;text-transform:uppercase;
    letter-spacing:.11em;transition:border-color .16s ease,color .16s ease}
  /* Les trois barres, dessinées et non écrites : un « ☰ » n'a pas la même chasse d'une police à
     l'autre. C'est la leçon déjà tirée sur le repli du rail membre. */
  .poste-bouton .barres{position:relative;flex:none;width:15px;height:2px;background:currentColor}
  .poste-bouton .barres::before,.poste-bouton .barres::after{content:"";position:absolute;left:0;
    width:15px;height:2px;background:currentColor}
  .poste-bouton .barres::before{top:-5px}
  .poste-bouton .barres::after{top:5px}
  .poste-bascule:focus-visible~.poste-bouton{outline:2px solid var(--op-azur-clair);
    outline-offset:2px}
  .poste-bascule:checked~.poste-bouton{border-color:var(--op-azur);color:#fff}

  /* LE PANNEAU. Fermé, il n'occupe rien ; ouvert, il prend toute la largeur sous la barre et
     déroule la colonne telle quelle. `flex:0 0 100%` le renvoie à la ligne dans la barre. */
  .poste-corps{display:none;flex:0 0 100%;width:100%;padding-bottom:var(--e3);
    border-top:1px solid var(--gr-900)}
  .poste-bascule:checked~.poste-corps{display:block}
  .poste-pied{padding:var(--e4) 10px 0;margin-top:var(--e2)}

  body.op .wrap{padding:22px 18px 96px}
}

/* --- Peau invité : les portails à jeton ------------------------------------------------------

Un tiers de confiance, un entremetteur, un proche qui écrit une recommandation : ils arrivent par
un lien, pour une tâche, et repartent. Leur donner l'écran du membre laissait croire qu'ils
avaient un compte ; leur donner la console laissait croire qu'ils administraient quelque chose.
L'ardoise chaude ne ressemble ni à l'un ni à l'autre. */

body.tiers{background:var(--tz-50)}
body.tiers h1,body.tiers h2,body.tiers h3{color:var(--tz-900)}
body.tiers .card{border-color:var(--tz-100);background:var(--paper)}
body.tiers .kick{color:var(--tz-700)}
body.tiers a{color:var(--tz-700)}
body.tiers a:hover{color:var(--tz-900)}
body.tiers .btn{background:var(--tz-900)}
body.tiers .btn:hover{background:var(--tz-700)}
body.tiers .btn.n{background:var(--paper);color:var(--tz-900);border-color:var(--tz-100)}
/* 06/09/2026 — le tableau de bord du tiers emprunte `.chiffres`/`.pill`/`.panneaux`, jusqu'ici
   vus seulement en vert (membre) ou en gris (opérateur). Sans ces surcharges, l'ardoise chaude
   de cette troisième peau aurait laissé passer ces couleurs-là plutôt que la sienne. */
body.tiers .chiffre{border-top-color:var(--tz-300)}
body.tiers .chiffre>.quoi{color:var(--tz-700)}
body.tiers .chiffre>.combien{color:var(--tz-900)}
body.tiers .pill{background:var(--tz-50);color:var(--tz-700);border-color:var(--tz-100)}
body.tiers .pill.ouvert{background:var(--tz-100);color:var(--tz-900);border-color:var(--tz-300)}
body.tiers .panneaux,body.tiers .panneaux details{border-color:var(--tz-100)}
body.tiers .panneaux summary:hover{background:var(--tz-50)}

/* Le fil que lit un tiers de confiance, dans son tableau de bord (tiers_dashboard.html). Vivait
   jusqu'ici dans un `<style>` posé au milieu du gabarit — seul CSS du produit écrit hors de ce
   fichier. Nommé `.fil-tiers`, distinct de `.fil` (l'écran d'échange lui-même) : les deux
   composants n'ont ni la même structure ni les mêmes règles, un nom partagé aurait laissé croire
   le contraire. */
.fil-tiers p{margin:0 0 12px;padding:10px 14px;border-radius:10px;background:var(--sable-2);
  border:1px solid var(--line-soft)}
.fil-tiers p.sien{background:var(--tz-50);border-color:var(--tz-100)}
.fil-tiers .qui{display:block;font-size:.75rem;text-transform:uppercase;letter-spacing:.1em;
  color:var(--ink-mute);margin-bottom:4px}
/* La marque d'attention, 13/09/2026 : une ligne sobre sous le message, un seul style, jamais de
   couleur graduée. Une couleur qui monterait avec la gravité serait une note, et rien ici n'en
   porte. */
.fil-tiers .signale{display:block;margin-top:6px;font-size:.78rem;color:var(--ink-mute);
  font-style:italic}

/* LE FIL ACCOMPAGNÉ — 21/09/2026 (planche `reponses-design/2026-09-21_Tiers-et-Regie`).
   Le portail du tiers se lit souvent sur le téléphone d'un père ou d'un oncle. Trois choses :
   des caractères plus grands, une conversation en bulles comme dans sa messagerie, et trois
   destinations sous le pouce. Tout est cantonné à `body.tiers` : ni le membre ni la Régie ne
   changent d'un pixel. */
body.tiers main{font-size:1.06rem;padding-bottom:96px}
body.tiers .t-afaire{display:grid;gap:14px;margin:0 0 22px}
body.tiers .t-afaire:empty{display:none}
body.tiers .t-afaire>.box{margin:0}
body.tiers .t-lieu{scroll-margin-top:84px;margin-top:34px}
body.tiers .t-titre{font-family:var(--serif);font-size:1.5rem;margin:0 0 14px;padding-bottom:8px;
  border-bottom:2px solid var(--tz-300);color:var(--tz-900)}
/* Les bulles. `.sien` est la personne qu'il accompagne : elle parle à droite, comme « moi » dans
   une messagerie, parce que c'est de son côté qu'il se tient. La marque d'attention garde son
   style unique (13/09) : elle n'a pas de couleur ici non plus. */
body.tiers .fil-tiers{display:flex;flex-direction:column;gap:8px}
body.tiers .fil-tiers p{margin:0;max-width:86%;border-radius:18px 18px 18px 6px;align-self:flex-start;
  font-size:1.02rem;line-height:1.45}
body.tiers .fil-tiers p.sien{align-self:flex-end;border-radius:18px 18px 6px 18px;background:var(--tz-900);
  border-color:var(--tz-900);color:var(--paper)}
body.tiers .fil-tiers p.sien .qui,body.tiers .fil-tiers p.sien .signale{color:var(--tz-100)}
body.tiers .fil-tiers p.jour-fil,body.tiers .fil-tiers p.nouveau-fil{align-self:center;max-width:none;background:none;
  border:0;padding:6px 0 2px;font-family:var(--mono);font-size:.78rem;letter-spacing:.08em;text-transform:uppercase;
  color:var(--tz-700)}
body.tiers .fil-tiers p.nouveau-fil{align-self:stretch;text-align:center;color:var(--tz-900);
  border-top:2px solid var(--tz-300);margin-top:6px;padding-top:10px}
/* La barre du bas : trois lieux, toujours au même endroit. 56 px de haut, pour un pouce. */
body.tiers .t-barre{position:fixed;left:0;right:0;bottom:0;z-index:30;display:grid;grid-template-columns:repeat(3,1fr);
  background:var(--tz-900);padding:6px 6px calc(6px + env(safe-area-inset-bottom))}
body.tiers .t-onglet{display:grid;justify-items:center;gap:2px;min-height:56px;align-content:center;border-radius:12px;
  color:var(--tz-100);text-decoration:none;font-size:.84rem;font-weight:600}
body.tiers .t-onglet:hover{color:var(--paper)}
body.tiers .t-onglet.ici{background:var(--tz-700);color:var(--paper)}
body.tiers .t-ico{font-size:1.25rem;line-height:1}
@media (min-width:760px){body.tiers .t-barre{left:50%;right:auto;bottom:16px;translate:-50% 0;width:min(440px,92vw);
  border-radius:18px;box-shadow:0 12px 32px rgba(46,42,36,.35)}}
@media print{body.tiers .t-barre{display:none}}

/* LE BADGE DE MESSAGES NON LUS, 13/09/2026, second état.
   Le point de huit pixels, sans nombre, a tenu une demi-journée : « elle est encore trop
   discrète, reprends les codes des notifications des applications ». Ce sont donc ces codes,
   à la lettre : rond quand le nombre tient sur un chiffre, gélule au-delà, chiffres blancs sur
   le rouge de la maison (--stop), et jamais au-delà de « 99+ ». Rien d'inventé, et rien de
   clignotant : un badge qu'on remarque une fois, pas un qui appelle.
   Douze pixels, pas onze : le plancher de lisibilité du produit vaut ici comme partout, et la
   gélule s'agrandit pour lui, jamais l'inverse (`tests/test_contraste_aa.py`). */
.pt-nouveau{display:inline-flex;align-items:center;justify-content:center;
  min-width:20px;height:20px;padding:0 6px;border-radius:10px;box-sizing:border-box;
  background:var(--stop);color:#fff;font-size:.75rem;font-weight:600;line-height:1;
  font-variant-numeric:tabular-nums;margin-left:6px;vertical-align:middle}

/* Le compteur d'un champ borné, 13/09/2026 : discret, à droite, et il ne parle qu'à partir de
   la moitié. */
.compteur{display:block;text-align:right;font-size:.75rem;color:var(--ink-mute);margin-top:4px}
.compteur.limite{color:var(--stop)}
.compteur[hidden]{display:none}

/* Le repli « mettre sur l'écran d'accueil » disparaît quand c'est déjà fait, sans une ligne de
   script : le navigateur sait s'il est en mode application, et il est le seul à le savoir. */
@media all and (display-mode: standalone){ .repli.installer{display:none} }
@media all and (display-mode: fullscreen){ .repli.installer{display:none} }

/* Et son exact inverse, 14/09/2026 : le nombre sur l'icône ne se règle que DANS l'application
   installée, puisque c'est son icône. `[hidden]` est retiré par le script quand le navigateur
   sait poser un badge ; sans script, ce repli reste invisible et ne promet rien. */
@media all and (display-mode: standalone){ .repli.pastille:not([hidden]){display:block} }
@media all and (display-mode: fullscreen){ .repli.pastille:not([hidden]){display:block} }
.repli.pastille{display:none}

/* Un récit long replié, 13/09/2026 : le repli est natif, sans script, et « lire » dit ce qu'il
   fait. Ouvert, il montre tout. */
details.recit>summary{cursor:pointer;list-style:none;display:flex;justify-content:space-between;
  align-items:baseline;gap:12px}
details.recit>summary::-webkit-details-marker{display:none}
.recit .lire{font-size:.78rem;color:var(--accent);text-decoration:underline;white-space:nowrap}
details.recit[open] .lire{display:none}

.tiersnav{background:var(--tz-900);color:var(--tz-100)}
.tiersnav-in{max-width:760px;margin:0 auto;padding:14px 22px;display:flex;align-items:center;
  gap:14px;flex-wrap:wrap}
.tiersnav-in .marque{display:inline-flex;align-items:center;gap:9px;font-family:var(--serif);
  font-weight:600;font-size:1.1rem;color:#FFFDF9;text-decoration:none}
.tiersnav-in .role{margin-left:auto;font-size:.78rem;color:var(--tz-300);text-align:right;
  line-height:1.45}
.tiersnav-in .role b{display:block;color:#FFFDF9;font-weight:600;font-size:.84rem}
body.tiers .wrap{max-width:760px}

/* =============================================================================================
   VOCABULAIRE PARTAGÉ
   ============================================================================================= */

.card{background:var(--paper);border:1px solid var(--line);border-radius:var(--radius-carte);padding:var(--space-5);
  margin:0 0 var(--space-4);box-shadow:var(--shadow-1);
  transition:box-shadow .28s var(--ease),transform .28s var(--ease),border-color .2s ease}
:where(body.op) .card{margin:0 0 18px}
.card.flat{box-shadow:none}
.card.pose{background:var(--sable-2)}
/* Une carte qui mène quelque part se soulève ; une carte qui ne fait que dire ne bouge pas. */
.card.cliquable:hover{transform:translateY(-3px);box-shadow:var(--shadow-2);
  border-color:var(--vert-300)}
body.op .card{border-color:var(--gr-100);border-radius:var(--r-sm);box-shadow:none;padding:0;
  overflow:hidden;background:var(--paper)}
body.op .card>.corps{padding:18px 20px}

/* --- CE QUI VIVAIT EN ATTRIBUT `style=` — console, 09/09/2026 ---------------------------------

   Le brief `23_` comptait quarante-deux attributs `style=` dans douze des vingt et un gabarits de
   la console, et demandait à Claude Design lesquels devenaient des classes. Sa réponse en
   supposait la nature (des grilles, des mises en monospace) ; le relevé réel en donne d'autres,
   et ce sont les vraies qui sont traitées ici.

   TREIZE `margin:0` — huit sur une mention, trois sur un champ, deux ailleurs. Ils disaient tous
   la même chose : « je suis le dernier, n'ajoute pas de marge sous moi ». Une classe utilitaire
   aurait recopié le symptôme treize fois ; `:last-child` traite la cause, et vaut pour les
   suivants qu'on écrira. */
body.op .card>.corps>*:last-child{margin-bottom:0}

/* SIX `text-align:right`, tous sur la DERNIÈRE cellule d'une ligne de tableau, celle qui porte le
   lien vers l'écran suivant. Elle n'est pas numérique — `.nb` existe déjà pour cela — elle est
   terminale : l'œil descend la colonne des liens sans la chercher. */
body.op td.op-fin,body.op th.op-fin{text-align:right;white-space:nowrap}

/* QUATRE TAILLES ÉCRITES À LA MAIN SUR DU `<code>`, à 11,8 px. Sous le plancher de douze que le
   produit s'impose partout, et invisibles pour le test qui le tient : il ne lisait que la feuille
   de style, jamais les gabarits. Ils sont remontés au plancher, et le test lit désormais les deux
   (voir `tests/test_contraste_aa.py`). */
body.op code.op-code{font-family:var(--mono);font-size:var(--op-t1);color:var(--gr-900);
  background:var(--gr-50);border:1px solid var(--gr-100);border-radius:4px;padding:1px 5px}

/* --- « CE QUI TOURNE » : DEUX LISTES, PLUS UN TABLEAU DE CINQ COLONNES ------------------------
   10/09/2026. Le Fondateur : « l'onglet "ce qui tourne" est illisible et peut-être pas à jour ».

   Il montrait cinq colonnes, dont deux de chemins de fichiers et de noms de tables, dans un
   défilement horizontal. Sur un téléphone on en lisait une et demie. La densité n'était pas le
   défaut : le RANG l'était. Ce qu'on vient chercher — ce que la chose fait — était à égalité
   visuelle avec la mécanique de retrait, qu'on ne consulte qu'au moment de retirer.

   Tout tient donc dans une colonne, et la mécanique descend dans un repli. Aucune largeur
   minimale, aucun défilement de côté : la même page se lit au pouce et sur un écran large. */
.registre-famille{font-family:var(--mono);font-size:var(--op-t1);letter-spacing:.1em;
  text-transform:uppercase;margin:var(--e5) 0 var(--e2);font-weight:400}
.registre-famille:first-of-type{margin-top:var(--e3)}
.registre{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:var(--e2)}
.registre>li{display:flex;flex-wrap:wrap;gap:2px var(--e2);align-items:baseline}
/* Le nom d'abord, à largeur fixe tant qu'il y a la place : deux colonnes optiques qui redeviennent
   deux lignes quand la place manque, sans requête média — c'est `flex-wrap` qui décide. */
.registre .nom{flex:0 0 auto;min-width:190px;font-weight:600;font-size:var(--op-t3)}
.registre .quoi{flex:1 1 340px;font-size:var(--op-t2)}

.registre-entree{padding:var(--e4) 0;border-bottom:1px solid var(--gr-100)}
.registre-entree:first-of-type{padding-top:var(--e2)}
.registre-entree:last-of-type{border-bottom:0;padding-bottom:0}
.registre-titre{margin:0 0 var(--e1);display:flex;align-items:baseline;gap:var(--e2)}
.registre-titre .ref{font-size:var(--op-t1);color:var(--gr-500)}
.registre-entree .repli{margin-top:var(--e3)}
.registre-pieces{display:flex;flex-wrap:wrap;gap:var(--e1);margin:var(--e2) 0 0}

/* DEUX `border-bottom:1px solid #EDF0F1` — les deux seules couleurs écrites en dur dans un
   gabarit de la console. C'était le trait entre deux entrées d'une même carte. Le gris le plus
   proche de la palette est `--gr-100`, à trois points près. */
body.op .card>.corps.entree{border-bottom:1px solid var(--gr-100)}
body.op .card>.corps.entree:last-of-type{border-bottom:0}
body.op .card>h2{margin:0;padding:14px 20px;border-bottom:1px solid var(--gr-100);
  background:var(--gr-25);font-size:var(--op-t4)}

.grid{display:grid;gap:16px}
@media(min-width:600px){.grid.g2{grid-template-columns:1fr 1fr}}
@media(min-width:820px){.grid.g3{grid-template-columns:repeat(3,1fr)}}
.grid.auto{grid-template-columns:repeat(auto-fit,minmax(230px,1fr))}

.kick{font-size:var(--text-1);text-transform:uppercase;letter-spacing:.13em;color:var(--ink-soft);
  font-weight:700;margin-bottom:var(--space-2)}
.kick.laiton{color:var(--laiton-texte)}
/* =============================================================================================
   LA VOIX DES INDICATIONS — 17/09/2026, deuxième passe

   Le Fondateur : « toutes les informations utiles et autres indications doivent être dans la même
   police, petite, discrète mais visible et distinctive des autres (titres, questions) ». Ses deux
   exemples : « Deux autorisations, séparées… » et « Vous avez pris cet engagement… ».

   CE QUI N'ALLAIT PAS. Il n'y avait pas UNE voix mais cinq, arrivées une par une : `.lede` à
   16 px, `.mention` à 16 px, `.aide-champ` à 14 px, `.p-chapeau` à 18 px, `.p-mention-question` à
   14 px. Toutes dans la famille des questions, donc distinguées par la seule couleur — ce qui ne
   suffit ni de loin, ni en plein soleil, ni pour qui distingue mal les gris.

   PREMIÈRE TENTATIVE, ÉCARTÉE : tout passer en chasse fixe. C'était distinctif, et froid pour un
   produit qui parle de mariage. Le Fondateur : « propose un autre format ; à défaut, laisse
   l'ancien, mets simplement assez d'espace ».

   CE QUI EST RETENU, ET C'EST MIEUX QUE LES DEUX. La police du corps, plus petite — donc
   parfaitement lisible sur quatre lignes comme sur une. Ce qui la distingue n'est plus la
   FAMILLE mais la FORME : un filet de laiton marque l'aparté. Un lecteur voit qu'il change de
   voix avant d'avoir lu un mot, ce qu'une nuance de gris ne fait pas.

   ET L'ESPACE, qui était la vraie plainte : `--space-4` au-dessus et `--space-3` en dessous,
   partout. Une indication collée sous son titre se lit comme la suite du titre.

   DEUX PLACEMENTS, UNE SEULE VOIX. Le filet ne va qu'aux indications de BLOC, celles qui suivent
   un titre et parlent de l'écran. Celles qui sont attachées à un contrôle — l'aide sous un champ,
   la mention sous une case — n'en portent pas : leur champ dit déjà de quoi elles parlent, et un
   filet par champ ferait une échelle de barreaux.

   Contrastes mesurés, pas estimés : `--ink-soft` sur `--sable` donne 6,74:1, sur `--paper` 7,01:1.
   AA de jour comme de nuit.
   ============================================================================================= */
.lede,.mention,.aide-champ,.p-chapeau,.p-mention-question,.hs-dit,.ls-dit,.fa-dit,
.hall-index span,.es-fil .quoi,.acces .quoi,.cadran-faits li,.hall-ville{
  font-family:var(--sans);font-size:var(--text-2);line-height:1.62;color:var(--ink-soft);
}
/* L'INDICATION DE BLOC : le filet, et l'air autour. */
.lede,.p-chapeau{
  margin:var(--space-4) 0 var(--space-3);padding-left:var(--space-4);
  border-left:2px solid var(--laiton);max-width:60ch;
}
.p-centre .p-chapeau{
  border-left:0;padding-left:0;margin-left:auto;margin-right:auto;text-align:center;
}
.mention{max-width:70ch;margin-top:var(--space-3)}
/* Une carte, un encadré ou un repli posent déjà leur propre marge haute : une seconde ici
   doublerait l'écart au lieu de le régler. */
.card>.mention:first-child,.box .mention,.dedans>.mention:first-child,
.repli .dedans .mention{margin-top:0}

.mention a{display:inline-block;padding:10px 0;margin:-10px 0}
body.op .kick{color:var(--gr-600)}
body.op .lede,body.op .mention{color:var(--gr-600)}

/* --- Encadrés : quatre voix, jamais mélangées ---------------------------------------------- */
.box{border-radius:var(--radius-carte);padding:var(--space-4) var(--space-4);border:1px solid;margin:0 0 var(--space-4)}
.box .tag{font-size:var(--text-1);text-transform:uppercase;letter-spacing:.12em;font-weight:700;
  display:block;margin-bottom:var(--space-2)}
:where(body.op) .box{padding:16px 18px}
:where(body.op) .box .tag{margin-bottom:6px}
.box p:last-child{margin-bottom:0}
.box.ok{background:var(--vert-50);border-color:var(--vert-100);border-left:4px solid var(--vert-700)}
.box.ok .tag{color:var(--accent)}
.box.warn{background:var(--laiton-pale);border-color:var(--laiton-filet);border-left:4px dashed var(--laiton-texte)}
.box.warn .tag{color:var(--laiton-texte)}
.box.stop{background:var(--stop-pale);border-color:var(--stop-ligne);border-left:4px solid var(--stop)}
.box.stop .tag{color:var(--stop)}
.box.neutre{background:var(--sable-2);border-color:var(--line)}
.box.neutre .tag{color:var(--ink-soft)}
/* Employées par la formation depuis le LOT 7, jamais définies : elles retombaient sur un `.box`
   nu, à la bordure transparente. « agir » demande un geste au lecteur, « secours » porte les
   numéros d'aide — le rouge y dit l'urgence possible, pas l'interdit. */
.box.agir{background:var(--laiton-pale);border-color:var(--laiton-filet);border-left:4px solid var(--laiton)}
.box.agir .tag{color:var(--laiton-texte)}
.box.secours{background:var(--stop-pale);border-color:var(--stop-ligne);
  border-left:4px double var(--stop)}
.box.secours .tag{color:var(--stop)}
/* Un encadré qui dit ce que l'interface ne fera jamais. Vert très sombre, inversé : c'est une
   promesse tenue par le produit, pas un avertissement adressé à la personne. */
.box.promesse{background:var(--vert-900);border-color:var(--vert-900);color:var(--sur-sombre)}
.box.promesse .tag{color:var(--laiton-2)}
.box.promesse a{color:#fff}

/* --- Le repli : une explication qu'on ouvre si on la veut ---------------------------------
   LOT 21 — 05/09/2026. Une douzaine d'écrans portaient un encadré permanent qui expliquait
   quelque chose : ce que l'écran ne fait pas, comment un nombre est calculé, pourquoi une
   question est posée. Utile une fois, du bruit les dix fois suivantes, et surtout : cela
   repoussait vers le bas ce que la personne était venue faire.

   L'explication ne disparaît pas, elle se replie derrière sa propre question — le même geste
   que sur le site vitrine, où « Pourquoi huit semaines ? » s'ouvre au clic. Un `<details>`
   natif : il s'ouvre au clavier, il s'imprime ouvert, et il ne coûte pas une ligne de script. */
.repli{border:1px solid var(--line);border-radius:var(--radius-champ);background:var(--sable-2);
  margin:0 0 var(--space-4)}
.repli>summary{list-style:none;cursor:pointer;padding:var(--space-3) var(--space-4);display:flex;gap:var(--space-3);
  align-items:center;font-size:var(--text-2);font-weight:600;color:var(--ink-soft);
  border-radius:var(--radius-champ)}
:where(body.op) .repli>summary{padding:11px 15px;font-size:var(--op-t3)}
.repli>summary::-webkit-details-marker{display:none}
.repli>summary::marker{content:""}
.repli>summary:hover{color:var(--ink)}
.repli>summary:focus-visible{outline:2px solid var(--focus);outline-offset:2px}
.repli>summary .plus{margin-left:auto;flex:0 0 auto;width:20px;height:20px;border-radius:50%;
  border:1px solid var(--line);display:flex;align-items:center;justify-content:center;
  color:var(--ink-soft);transition:transform .18s var(--ease),border-color .18s ease}
.repli[open]>summary .plus{transform:rotate(45deg);border-color:var(--ink-soft)}
.repli .dedans{padding:0 var(--space-4) var(--space-4);font-size:var(--text-3);line-height:var(--leading-corps);color:var(--ink-soft)}
:where(body.op) .repli .dedans{padding:0 15px 14px}
.repli .dedans>p{margin:0 0 .7em}
.repli .dedans>p:last-child{margin-bottom:0}
.repli .dedans table{margin:var(--space-2) 0 0}
:where(body.op) .repli .dedans table{margin:6px 0 0}
body.op .repli{background:var(--paper);border-color:var(--gr-100)}
body.op .repli>summary{color:var(--gr-600)}
body.op .repli .dedans{color:var(--gr-600)}
body.tiers .repli{background:var(--paper);border-color:var(--tz-100)}
@media (prefers-reduced-motion:reduce){.repli>summary .plus{transition:none}}

/* --- Boutons -------------------------------------------------------------------------------- */
.btn{display:inline-flex;align-items:center;justify-content:center;gap:var(--space-2);border-radius:var(--radius-champ);
  padding:var(--space-3) var(--space-5);font-weight:600;font-size:var(--text-3);font-family:var(--sans);
  border:1px solid transparent;cursor:pointer;background:var(--vert-plein);color:#fff;
  text-decoration:none;position:relative;
  box-shadow:0 1px 0 rgba(255,255,255,.14) inset,0 2px 8px -3px rgba(18,53,42,.5);
  transition:transform .16s var(--ease),background .18s ease,box-shadow .2s ease}
.btn:hover{background:var(--vert-plein-2);color:#fff;transform:translateY(-2px);
  box-shadow:0 1px 0 rgba(255,255,255,.14) inset,0 10px 22px -8px rgba(18,53,42,.55)}
.btn:active{transform:translateY(0);box-shadow:0 1px 3px rgba(18,53,42,.4) inset}
.btn[disabled],.btn:disabled{opacity:.5;cursor:not-allowed;transform:none;box-shadow:none}
/* --- LE BOUTON SECONDAIRE PASSE À L'OR — 17/09/2026 -------------------------------------------
   Le Fondateur : « je veux que tous les boutons soient soit en vert ou en couleur orange/or/dorée
   pour que cela soit visible ». Il était `--paper` sur `--sable` avec un filet `--line` : sur une
   page de la même couleur, il ne restait qu'un rectangle à peine dessiné, et sur un téléphone en
   plein soleil il disparaissait tout à fait.

   VERT POUR CE QU'ON FAIT, OR POUR CE QU'ON PEUT FAIRE AUSSI. Les deux sont pleins et tiennent
   AA : l'or à 4,73:1 contre `--vert-950`, mesuré et non estimé. La hiérarchie ne tient plus à ce
   que l'un soit visible et l'autre pas, mais à la couleur de la marque — le vert reste celle de
   l'action qu'on est venu faire.

   LE ROUGE NE BOUGE PAS, et c'est un arbitrage explicite du Fondateur le 17/09 quand je lui ai
   posé la question : un bouton qui efface ne doit pas ressembler à un bouton qui continue. Voir
   `.btn.danger` juste dessous. */
.btn.n{background:var(--laiton);color:var(--vert-950);border-color:var(--laiton);
  box-shadow:0 1px 0 rgba(255,255,255,.2) inset,0 2px 8px -3px rgba(126,99,40,.5)}
.btn.n:hover{background:var(--laiton-2);color:var(--vert-950);border-color:var(--laiton-2);
  box-shadow:0 1px 0 rgba(255,255,255,.2) inset,0 10px 22px -8px rgba(126,99,40,.55)}
.btn.n:focus-visible{outline-color:var(--laiton-texte)}
.btn.danger{background:var(--stop-plein);border-color:var(--stop-plein)}
.btn.danger:hover{background:var(--stop-plein-2)}
.btn.petit{padding:var(--space-2) var(--space-4);font-size:var(--text-2);border-radius:var(--radius-champ)}
.btnrow{display:flex;gap:var(--space-3);flex-wrap:wrap;margin-top:var(--space-4);align-items:center}
:where(body.op) .btnrow{gap:10px}
.btnrow.egal>*{flex:1;min-width:150px}
body.op .btn{border-radius:var(--r-sm);background:var(--gr-900);box-shadow:none;padding:10px 18px;
  font-size:var(--op-t3)}
body.op .btn:hover{background:var(--gr-950)}
body.op .btn.n{background:var(--paper);color:var(--gr-900);border-color:var(--gr-200)}
body.op .btn.n:hover{background:var(--gr-25);border-color:var(--gr-400)}

/* --- Formulaires ---------------------------------------------------------------------------- */
label.f{display:block;margin:0 0 var(--space-4);font-size:var(--text-3);font-weight:600;color:var(--ink)}
label.f span.h{display:block;font-weight:400;color:var(--ink-soft);font-size:var(--text-2);margin:var(--space-1) 0 var(--space-2)}
input[type=text],input[type=email],input[type=password],input[type=number],input[type=date],
input[type=tel],select,textarea{
  width:100%;padding:var(--space-3) var(--space-3);border:1px solid var(--line);border-radius:var(--radius-champ);font:inherit;
  font-size:var(--text-3);background:var(--sable-2);color:var(--ink);
  transition:border-color .18s ease,background .18s ease,box-shadow .18s ease}
textarea{resize:vertical;font-family:var(--serif);font-size:var(--text-3);line-height:1.65;min-height:120px}
input:hover,select:hover,textarea:hover{border-color:var(--vert-300)}
input:focus,select:focus,textarea:focus{outline:none;border-color:var(--focus);
  background:var(--paper);box-shadow:var(--halo-focus)}
body.op input,body.op select,body.op textarea{background:var(--paper);border-color:var(--gr-200);
  border-radius:var(--r-sm)}
body.op textarea{font-family:var(--sans);font-size:var(--op-t3)}
body.op input:focus,body.op select:focus,body.op textarea:focus{border-color:var(--gr-600);
  box-shadow:0 0 0 3px rgba(74,84,89,.12)}
/* La console garde ses mesures d'avant le lot composants (Régie hors périmètre). `:where()` ne
   pèse rien : chaque ligne vaut la règle membre qu'elle suit, et toute règle de console qui la
   battait la bat encore. */
:where(body.op) label.f{margin:0 0 18px}
:where(body.op) label.f span.h{margin:3px 0 6px;font-size:var(--op-t2)}
:where(body.op) input[type=text],:where(body.op) input[type=email],:where(body.op) input[type=password],:where(body.op) input[type=number],:where(body.op) input[type=date],:where(body.op) input[type=tel],:where(body.op) select{font-size:var(--op-t4)}

.chk{display:flex;gap:var(--space-3);align-items:flex-start;margin:0 0 var(--space-3);font-size:var(--text-2)}
.chk input{margin-top:var(--space-1);flex:0 0 auto;width:18px;height:18px;accent-color:var(--vert-700)}
.chk.plustard{opacity:.7;border-left:3px solid var(--line);padding-left:var(--space-3)}
/* L'ATTESTATION DÉJÀ DONNÉE — 09/09/2026, l'engagement d'honneur relu en cours de saison.
   Pas une case désactivée : un constat. Le vert est ici légitime, c'est le seul sens qu'il a
   dans ce produit — « franchie ». Il ne dit pas qu'une étape est réussie, il dit qu'un geste a
   eu lieu, à une date écrite juste à côté. */
/* La pastille d'un fait vérifié, sur « Mon identité » (09/09/2026). Verte, et c'est le seul sens
   que le vert a dans ce produit : « franchie ». Elle ne félicite personne, elle constate qu'une
   étape a eu lieu — et c'est justement pour cela que le champ ne se modifie plus. */
.pill.fige{background:var(--vert-50);color:var(--accent);border-color:var(--vert-100)}

.chk.fige{align-items:flex-start;background:var(--vert-50);border:1px solid var(--vert-100);
  border-radius:var(--radius-champ);padding:var(--space-3);margin:0 0 var(--space-3)}
.chk.fige .coche{flex:0 0 auto;width:18px;height:18px;border-radius:4px;margin-top:2px;
  background:var(--vert-plein);color:#FFF;font-size:var(--text-1);line-height:18px;text-align:center}
.chk.fige p{margin:0;color:var(--ink)}
.chk.fige .mention{display:block;margin-top:var(--space-1)}
.err{color:var(--stop);font-size:var(--text-2);margin:var(--space-2) 0 0}
:where(body.op) .chk{gap:10px;margin:0 0 13px;font-size:var(--op-t3)}
:where(body.op) .err{margin:6px 0 0;font-size:var(--op-t2)}

/* --- LA SITUATION — l'unité de lecture de l'étape 4, 08/09/2026 -------------------------------

Cinq questions, dans une étape qui en côtoie une de vingt-trois champs. L'écart de charge est
irréductible et l'égaliser serait du remplissage : ce qui tient la série des huit étapes, c'est
que l'unité de lecture se ressemble d'une étape à l'autre, pas que les écrans fassent la même
longueur.

La question passe au serif et à la taille d'un titre parce que c'est elle qu'on vient lire. Elle
était jusqu'ici l'étiquette d'un champ, dans le même gris que « Nombre d'enfants existants ».
Le numéro est en laiton, comme dans l'index : il dit un ordre, jamais un avancement. */
.situation{padding:var(--space-5) 0;border-top:1px solid var(--line-soft)}
.situation:first-of-type{padding-top:0;border-top:0}
.situation-rang{font-family:var(--serif);font-size:var(--text-2);font-weight:600;letter-spacing:.08em;
  text-transform:uppercase;color:var(--laiton-texte);margin:0 0 var(--space-3)}
.situation-q{display:block;font-family:var(--serif);font-size:var(--text-4);line-height:var(--leading-dense);
  color:var(--titre);margin:0 0 var(--space-2);max-width:60ch}
.situation-aide{font-size:var(--text-2);color:var(--ink-soft);margin:0 0 var(--space-3)}

/* --- L'EXIGENCE DURE — la seule case de l'écran qui retire quelqu'un, 08/09/2026 --------------

Les neuf dimensions des contraintes portent chacune trois réglages, et un seul a des
conséquences : la case « exigence dure ». Cochée, elle retire réellement des personnes de la vue
du membre ; tout le reste se lit et n'écarte personne. Elle avait pourtant exactement le même
poids visuel qu'une case d'acceptation ordinaire — même `.chk`, même taille, même gris.

Elle devient un bloc à part, et cochée elle s'inverse. L'inversion, et non une couleur : le
laiton veut dire « à vous de jouer » et le vert « franchie ». Une exigence active n'est ni l'un
ni l'autre, et lui donner l'une des deux teintes aurait abîmé les deux sens à la fois. L'encre
n'a pas de sens d'état dans ce produit, c'est précisément ce qui la rend disponible ici.

L'état est porté par le fond ET par le texte de l'étiquette, jamais par la seule couleur.
`:has()` est du CSS : cet écran fonctionne sans JavaScript, comme tout le reste du produit. */
.dure{display:flex;gap:var(--space-3);align-items:flex-start;margin:var(--space-4) 0 0;
  padding:var(--space-3) var(--space-4);border:1px solid var(--line);border-radius:var(--radius-champ);
  background:var(--sable-2);font-size:var(--text-2);
  transition:background .18s ease,border-color .18s ease,color .18s ease}
.dure input{flex:0 0 auto;width:20px;height:20px;margin:2px 0 0;accent-color:var(--ink)}
.dure label{cursor:pointer}
.dure:has(input:checked){background:var(--ink);border-color:var(--ink);color:var(--sable-2)}
.dure:has(input:checked) input{accent-color:var(--sable-2)}

/* --- LE PALIER — motif de formulaire dense, 08/09/2026 ----------------------------------------

Vingt-trois champs à la suite se lisaient comme un mur. Des titres de section, posés le 06/09,
donnaient un repère mais pas un endroit où s'arrêter : il fallait toujours descendre jusqu'au
bout avant de pouvoir enregistrer quoi que ce soit.

Un palier est une rubrique, ses champs, et SON PROPRE enregistrement. Cinq paliers sur un écran,
pas cinq écrans : le parcours annonce « sur 8 » et ce compteur est une promesse qu'un découpage
en pages ferait mentir. La table qui les décrit est dans `declaratif/services.py::PALIERS_SOCLE`,
lue à la fois par le gabarit et par la vue — écrite deux fois, elle effacerait des réponses en
silence le jour où elle divergerait.

CE QUE LA RUBRIQUE DIT, ET CE QU'ELLE NE DIT PAS. Son rang (« Section 2 sur 6 ») et son volume
(« 3 champs ») sont des faits, vérifiables en regardant l'écran. Ni l'un ni l'autre n'annonce un
avancement : le produit ne sait pas si un champ rempli l'est vraiment, et une coche verte sur un
dossier incomplet serait un mensonge d'interface. Aucun vert ici, donc, et aucune pastille. */
.palier{margin:0 0 var(--space-4)}
.palier-rubrique{display:flex;align-items:baseline;justify-content:space-between;gap:var(--space-3);
  margin:0 0 var(--space-4);padding:0 0 var(--space-3);border-bottom:1px solid var(--line)}
.palier-rubrique h2{margin:0}
/* `.palier-rang` et non `.repere` : ce dernier existe déjà, ce sont les huit marques du sceau
   (`_volet_promesse.html`), dont le brief d'identité dit qu'« elles ne comptent rien ». Celui-ci
   compte, précisément. Deux sens opposés sous un même mot, c'est ainsi qu'on se trompe plus tard.
   Le rang sert aussi hors d'une rubrique, dans le résumé d'un repli de nationalités : la règle
   d'écriture est donc sur la classe, et le seul comportement de disposition sur le contexte. */
.palier-rang{font-size:var(--text-1);text-transform:uppercase;letter-spacing:.11em;font-weight:700;
  color:var(--ink-soft)}
.palier-rubrique .palier-rang{flex:0 0 auto}
.palier-pied{display:flex;align-items:center;gap:var(--space-3);flex-wrap:wrap;
  margin:var(--space-5) 0 0;padding:var(--space-4) 0 0;border-top:1px solid var(--line-soft)}
@media (max-width:560px){
  .palier-rubrique{flex-direction:column;gap:var(--space-1)}
  .palier-pied .btn{width:100%}
}

/* CENT QUATRE-VINGT-DIX-HUIT CASES DANS UN REPLI — 08/09/2026, la liste exhaustive des
   nationalités. Une seule colonne en aurait fait deux mille pixels de haut ; `columns` les range
   sans grille et sans script, et le nombre de colonnes suit la largeur disponible. `break-inside`
   empêche qu'une case soit coupée entre deux colonnes, ce qui séparerait une coche de son mot. */
.cases-serrees{columns:2 190px;column-gap:var(--space-5);padding-top:var(--space-2)}
.cases-serrees .chk{break-inside:avoid;margin:0 0 var(--space-2)}
.repli .dedans.cases-serrees .chk label{color:var(--ink)}

/* L'état de l'appel (comptes/appel.html, tiers_appel.html) — 06/09/2026. Avant, « Connexion... »,
   « Vous êtes en ligne. » et un avertissement réseau étaient trois lignes de texte brut
   identiques. Une pastille dit lequel sans lire la phrase, même vocabulaire que `.etats li`. */
.etat-appel{display:inline-flex;align-items:center;gap:8px;font-size:var(--op-t3);margin:6px 0;min-height:1.2em}
.etat-appel:empty{margin:0}
.etat-appel::before{content:"";width:8px;height:8px;border-radius:50%;flex:0 0 auto;
  background:var(--ink-mute)}
.etat-appel.ok{color:var(--accent)}
.etat-appel.ok::before{background:var(--vert-700)}
.etat-appel.avertissement{color:var(--laiton-texte)}
.etat-appel.avertissement::before{background:var(--laiton)}
/* Le micro coupé ne changeait que son libellé texte (« Reprendre la parole ») : facilement
   manqué en cours de conversation. */
.btn.n.coupe{background:var(--stop-pale);border-color:var(--stop-ligne);color:var(--stop)}

/* 06/09/2026 — la carte d'appel ressemblait à un formulaire, pas à un appel : boutons ronds à
   icône (comme sur un téléphone), anneau qui pulse tant qu'on attend l'autre, et une onde qui
   bouge avec la voix plutôt qu'un simple texte d'état. */
.ligne-visuel{display:flex;flex-direction:column;align-items:center;gap:14px;margin:18px 0}
.ligne-anneau{position:relative;width:88px;height:88px;border-radius:50%;
  background:radial-gradient(circle,var(--vert-800),var(--vert-950));
  display:flex;align-items:center;justify-content:center}
.ligne-anneau::before{content:"";position:absolute;inset:0;border-radius:50%;
  border:2px solid var(--vert-700)}
.ligne-anneau-pulse{position:absolute;inset:0;border-radius:50%;border:2px solid var(--laiton-2);
  opacity:0}
.ligne-anneau.sonnerie .ligne-anneau-pulse{animation:anneau-pulse 1.6s ease-out infinite}
@keyframes anneau-pulse{
  0%{transform:scale(.85);opacity:.7}
  100%{transform:scale(1.45);opacity:0}
}
.onde-vocale{display:flex;align-items:flex-end;gap:4px;height:26px}
.onde-vocale span{width:4px;min-height:4px;border-radius:2px;background:var(--vert-700);
  transition:height .09s ease-out}
.ligne-anneau.parle::before{border-color:var(--laiton-2)}

/* 06/09/2026 — le libellé en `position:absolute` sous chaque rond ne réservait aucune place dans
   la ligne : les textes de deux boutons voisins se recouvraient. Le rond et le libellé sont
   maintenant empilés dans le flux normal, chacun dans une colonne de largeur fixe. */
/* 06/09/2026 — les trois gestes d'un appel (rejoindre/micro/raccrocher) doivent rester sur une
   seule ligne même sur un petit écran : rond et police réduits plutôt que de laisser passer à
   la ligne suivante, qui avait fait chevaucher les libellés. */
/* 14/09/2026 — `.btnrow` ne porte qu'une marge haute, et `.mention` n'en porte aucune : le
   texte sous les trois boutons touchait leurs libellés. Deux gabarits compensaient à la main
   avec un `style=` ; la marge est ici, une fois. */
.btnrow-appel{align-items:flex-start;justify-content:center;flex-wrap:nowrap;gap:6px;margin-bottom:14px}
.btn-appel{display:inline-flex;flex-direction:column;align-items:center;gap:4px;width:74px;
  background:none;border:none;padding:0;cursor:pointer;font-family:inherit;color:var(--ink)}
.btn-appel .rond{width:52px;height:52px;border-radius:50%;display:flex;align-items:center;
  justify-content:center;border:1px solid var(--line);background:var(--paper);
  transition:transform .12s ease,box-shadow .12s ease,background .12s ease}
.btn-appel .pi{width:22px;height:22px;flex:0 0 auto;color:inherit}
.btn-appel .libelle{font-size:.75rem;color:var(--ink-soft);text-align:center;line-height:1.15}
.btn-appel:hover .rond{transform:translateY(-2px)}
.btn-appel:active .rond{transform:translateY(0)}
.btn-appel.decrocher .rond{background:var(--vert-plein);border-color:var(--vert-plein);color:#fff;
  box-shadow:0 3px 10px rgba(31,77,61,.35)}
.btn-appel.decrocher:hover .rond{background:var(--vert-plein-2)}
.btn-appel.raccrocher .rond{background:var(--stop-plein);border-color:var(--stop-plein);color:#fff;
  box-shadow:0 3px 10px rgba(140,58,50,.35)}
.btn-appel.raccrocher:hover .rond{background:var(--stop-plein-2)}
.btn-appel.n:hover .rond{background:var(--sable-2);border-color:var(--vert-300)}
.btn-appel.n.coupe .rond{background:var(--stop-pale);border-color:var(--stop-ligne);color:var(--stop)}
.btn-appel:disabled{opacity:.5;cursor:not-allowed}
.btn-appel:disabled .rond{transform:none}

/* Présence dans la salle : silhouette pleine (pi-personne), jamais de trait de visage — seule
   limite désormais (06/09/2026). Grise tant que la personne n'est pas là, vert une fois entrée. */
.presence-appel{display:flex;flex-wrap:wrap;gap:10px 18px;margin:4px 0 14px;font-size:.86rem;
  color:var(--ink-soft)}
.presence-appel .qui{display:flex;align-items:center;gap:7px}
.presence-appel .qui .pi{width:18px;height:18px;flex:0 0 auto;color:var(--ink-mute)}
/* Le motif remplace le pictogramme « personne », identique pour tout le monde : deux lignes de
   présence qui ne se distinguaient que par leur texte se distinguent maintenant du premier
   coup d'oeil. Il pâlit tant que la personne n'est pas là, comme le reste de la ligne. */
.presence-appel .qui .motif{width:26px;height:26px;opacity:.5;border-radius:50%;
  box-shadow:0 0 0 2.5px transparent;transition:opacity .2s ease,box-shadow .2s ease}
/* UN CERCLE VERT AUTOUR DE QUI EST LÀ — 14/09/2026, demande du Fondateur : « la présence n'est
   pas assez visible sur l'écran du téléphone ». L'opacité seule ne se lisait pas en plein
   soleil ; le cercle, si. */
.presence-appel .qui.present .motif{opacity:1;box-shadow:0 0 0 2.5px var(--vert-plein)}
.presence-appel .qui.present .pi{color:var(--accent)}
.presence-appel .qui.present{color:var(--ink)}
/* Les tiers de confiance, un cran plus discrets que les deux membres : ils accompagnent, ils ne
   parlent pas. Même motif, même règle de présence. */
.presence-appel .qui.tiers{font-size:.8rem}
/* Les cinq mentions du courtage matrimonial sous le nom, et le professionnel au pied du pool
   (L224-93, 14/09/2026). Discrets, mais toujours là. */
.mentions-fiche{display:block}
.pied-professionnel{margin:var(--space-5) 0 0;font-size:var(--text-1)}
/* L'aperçu de sa propre fiche, sur la notice de saison, avant d'accepter qu'elle soit montrée. */
.apercu-fiche{margin:var(--space-3) 0;padding:var(--space-4) var(--space-4);border:1px dashed var(--line);border-radius:var(--radius-champ);
  background:var(--sable-2)}
.apercu-fiche dl{margin:0;display:grid;grid-template-columns:auto 1fr;gap:var(--space-1) var(--space-4);font-size:var(--text-2)}
.apercu-fiche dt{color:var(--ink-mute)}
.apercu-fiche dd{margin:0}
.presence-appel .qui.tiers .motif{width:22px;height:22px}

/* --- LE CALQUE DE SESSION — 14/09/2026, décision du Fondateur ---------------------------------
   « Je veux que l'utilisateur ait vraiment le sentiment d'être entré dans un vrai appel, comme
   WhatsApp, qui prend tout son écran, puis dès qu'on en sort on revient à la page concernée. »

   Caché tant qu'on n'a pas rejoint (`hidden`). Dès que le script pose `body.en-session`, il
   couvre l'écran entier, au-dessus de tout, y compris de la barre basse et de la sortie rapide,
   que le formulaire d'arrêt remplace pendant la session. Au raccroché, la classe part, le calque
   se cache, et la page est là où on l'a laissée. Le fond est celui de la page, dans le thème du
   téléphone : la peau sombre imposée est retirée le même jour. */
.session{display:flex;flex-direction:column;gap:14px}
.session[hidden]{display:none}
.session-tete{display:flex;flex-direction:column;gap:2px;align-items:center;text-align:center}
.session-tete strong{font-family:var(--serif);font-size:1.3rem;color:var(--titre)}
.accord-enregistrement{margin:0 0 6px;text-align:center}
.appel-passe{margin-bottom:14px}
.appel-passe audio{display:block;width:100%;margin-top:6px}
body.en-session .session{position:fixed;inset:0;z-index:70;background:var(--sable);
  padding:max(18px,env(safe-area-inset-top)) 18px max(18px,env(safe-area-inset-bottom));
  overflow:auto;justify-content:flex-start;align-items:stretch}
body.en-session .session .presence-appel{justify-content:center}
body.en-session .session .ligne-visuel{flex:1 1 auto;display:flex;flex-direction:column;
  align-items:center;justify-content:center;min-height:160px}
body.en-session .session .visio-grille{flex:1 1 auto}
body.en-session .session .arret-session{margin-top:auto}
body.en-session{overflow:hidden}
/* LA CARTE ANIMÉE ÉTAIT LE RÉFÉRENTIEL DU CALQUE — 14/09/2026, deuxième capture du Fondateur.
   `ac-monte` (bloc MOUVEMENT, plus bas) anime `transform` sur `.wrap>.card` et le garde
   (`both`). Or un ancêtre dont la transformation est animée devient le bloc conteneur de tout
   descendant en `position:fixed` : `inset:0` se mesurait alors sur la carte, pas sur l'écran, et
   la visio « en plein écran » restait une carte au milieu de la page, sous le bandeau et
   au-dessus de « Avant d'entrer ». Pendant la session, la carte ne s'anime pas : le calque
   retrouve la fenêtre pour référentiel. `appel.js` demande en plus le plein écran du navigateur
   SUR LE CALQUE lui-même, qui passe alors dans la couche supérieure, hors de tout référentiel. */
body.en-session .wrap>.card{animation:none}

/* --- LA SCÈNE DE LA VISIO — 14/09/2026, troisième capture du Fondateur : « comme WhatsApp » ---
   Le calque de la visio n'est plus une colonne de page mais une scène : le flux de l'autre
   remplit l'écran, le mien est une vignette dans le coin, et tout le reste, nom, état,
   présences, commandes, se pose par-dessus, en haut et en bas, sur deux dégradés. Elle est
   sombre par nature, quel que soit le thème : c'est la surface de la vidéo, comme dans toute
   application d'appel, pas une peau imposée à la page, qui garde la sienne autour. */
body.en-session .scene{background:#0B1A14;color:#E4EEE9;padding:0;gap:0;overflow:hidden}
body.en-session .scene .visio-grille{position:absolute;inset:0;margin:0;display:grid;
  grid-template-columns:1fr;gap:0}
body.en-session .scene .visio-grille .visio-tuile{aspect-ratio:auto;border:0;border-radius:0;
  height:100%;background:#0B1A14}
body.en-session .scene .visio-grille .visio-tuile-silhouette{background:#0B1A14}
body.en-session .scene .visio-grille .visio-tuile-silhouette .motif{width:38vmin;height:38vmin}
body.en-session .scene .visio-grille .visio-tuile-nom{display:none}
body.en-session .scene .pip{position:absolute;right:14px;top:calc(186px + env(safe-area-inset-top));
  width:28vw;max-width:140px;aspect-ratio:3/4;border-radius:14px;z-index:2;
  border:1px solid rgba(255,255,255,.28);box-shadow:0 6px 20px rgba(0,0,0,.45)}
body.en-session .scene .scene-haut,
body.en-session .scene .scene-bas{position:absolute;left:0;right:0;z-index:1;display:flex;
  flex-direction:column;align-items:center;gap:8px}
body.en-session .scene .scene-haut{top:0;padding:max(14px,env(safe-area-inset-top)) 18px 30px;
  background:linear-gradient(rgba(11,26,20,.94),rgba(11,26,20,0))}
body.en-session .scene .scene-bas{bottom:0;padding:34px 18px max(14px,env(safe-area-inset-bottom));
  background:linear-gradient(rgba(11,26,20,0),rgba(11,26,20,.95) 40%);max-height:62vh;overflow:auto}
body.en-session .scene .session-tete strong{color:#fff}
body.en-session .scene .kick,
body.en-session .scene .mention,
body.en-session .scene .btn-appel .libelle{color:rgba(228,238,233,.8)}
body.en-session .scene .etat-appel,
body.en-session .scene .etat-appel.ok,
body.en-session .scene .etat-appel.avertissement{color:#E4EEE9}
body.en-session .scene .presence-appel{margin:0;color:rgba(228,238,233,.72)}
body.en-session .scene .presence-appel .qui.present{color:#fff}
body.en-session .scene .presence-appel .qui.present .motif{box-shadow:0 0 0 2.5px #4CD97B}
/* La vignette se déplace au doigt (`visio.js`, `rendreDeplacable`) : sans `touch-action`, le
   navigateur prendrait le geste pour un défilement. */
body.en-session .scene .pip{touch-action:none;cursor:grab;user-select:none}
body.en-session .scene .pip.deplace{cursor:grabbing;box-shadow:0 10px 28px rgba(0,0,0,.6)}
body.en-session .scene .btn-appel.n .rond{background:rgba(255,255,255,.12);
  border-color:rgba(255,255,255,.3);color:#fff}
body.en-session .scene .btn-appel.n.coupe .rond{background:var(--stop-plein);
  border-color:var(--stop-plein);color:#fff}
body.en-session .scene .btnrow{margin:0;justify-content:center}
body.en-session .scene .btn.n{background:rgba(255,255,255,.1);border-color:rgba(255,255,255,.32);
  color:#fff}
body.en-session .scene .box.agir{background:rgba(255,255,255,.08);border-color:rgba(255,255,255,.2);
  color:#E4EEE9;margin:0}
body.en-session .scene .arret-session{margin:6px 0 0;padding-top:10px;
  border-top:1px solid rgba(255,255,255,.16);align-items:center}
body.en-session .scene .scene-note{margin:0;font-size:.78rem;text-align:center}
/* Les motifs des présences, sur la scène sombre : la même remontée vers le clair que sur la
   tuile (voir la gamme de `.visio-tuile-silhouette`, plus bas). */
.scene .presence-appel .motif.sobre.t1{--m-trait:var(--ardoise-claire);--m-coeur:var(--ardoise-pale);--m-accent:var(--ardoise-moyenne)}
.scene .presence-appel .motif.sobre.t2{--m-trait:var(--ardoise-moyenne);--m-coeur:var(--ardoise-claire);--m-accent:var(--ardoise-pale)}
.scene .presence-appel .motif.sobre.t3{--m-trait:var(--ardoise-pale);--m-coeur:var(--ardoise-moyenne);--m-accent:var(--ardoise-claire)}
.scene .presence-appel .motif.sobre.t4{--m-trait:var(--ardoise-claire);--m-coeur:var(--ardoise-moyenne);--m-accent:var(--ardoise-pale)}
.scene .presence-appel .motif.sobre.t5{--m-trait:var(--ardoise-moyenne);--m-coeur:var(--ardoise-pale);--m-accent:var(--ardoise-claire)}

/* La grille vidéo de la visio (LOT 24, 07/09/2026) — chaque tuile montre soit le flux vidéo
   réel, soit une silhouette pleine (pi-personne, jamais de trait de visage) tant que la caméra
   distante n'est pas encore arrivée ou a été coupée. */
.visio-grille{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:10px;
  margin:16px 0}
.visio-tuile{position:relative;aspect-ratio:4/3;border-radius:14px;overflow:hidden;
  background:var(--vert-950);border:1px solid var(--line)}
.visio-tuile.parle{border-color:var(--laiton-2)}
.visio-tuile video{width:100%;height:100%;object-fit:cover;display:block}
.visio-tuile .visio-tuile-silhouette{position:absolute;inset:0;display:flex;align-items:center;
  justify-content:center;background:var(--vert-950)}
.visio-tuile .visio-tuile-silhouette .pi{width:44%;height:44%;color:var(--accent)}
.visio-tuile .visio-tuile-silhouette .motif{width:46%;height:46%}
/* La gamme sobre est faite pour un fond clair : posée sur la tuile, vert très sombre, son cœur
   bleu ardoise devenait presque invisible — défaut vu en navigateur, pas dans le balisage. Les
   cinq couples sont conservés et remontés d'un cran vers les valeurs claires : le motif garde
   ses cinq axes, et se lit sur le fond auquel il est destiné. */
.visio-tuile-silhouette .motif.sobre.t1{--m-trait:var(--ardoise-claire);--m-coeur:var(--ardoise-pale);--m-accent:var(--ardoise-moyenne)}
.visio-tuile-silhouette .motif.sobre.t2{--m-trait:var(--ardoise-moyenne);--m-coeur:var(--ardoise-claire);--m-accent:var(--ardoise-pale)}
.visio-tuile-silhouette .motif.sobre.t3{--m-trait:var(--ardoise-pale);--m-coeur:var(--ardoise-moyenne);--m-accent:var(--ardoise-claire)}
.visio-tuile-silhouette .motif.sobre.t4{--m-trait:var(--ardoise-claire);--m-coeur:var(--ardoise-moyenne);--m-accent:var(--ardoise-pale)}
.visio-tuile-silhouette .motif.sobre.t5{--m-trait:var(--ardoise-moyenne);--m-coeur:var(--ardoise-pale);--m-accent:var(--ardoise-claire)}

/* La ligne « Repère » du portail du tiers : le motif tient dans la cellule, à hauteur de texte. */
.repere-motif{display:flex;align-items:center;gap:9px}
.repere-motif .motif{width:28px;height:28px}
.visio-tuile.a-video .visio-tuile-silhouette{display:none}
.visio-tuile .visio-tuile-nom{position:absolute;left:8px;bottom:8px;font-size:.75rem;
  color:#fff;background:rgba(10,20,16,.55);padding:2px 8px;border-radius:999px}
.visio-tuile.moi video{transform:scaleX(-1)}

/* Un choix parmi peu : des jetons, pas une liste déroulante. On voit toutes les options en même
   temps, ce qui est le seul intérêt d'avoir peu d'options. */
.jetons{display:flex;gap:9px;flex-wrap:wrap;margin:6px 0 0}
.jetons label{display:inline-flex;align-items:center;gap:7px;font-size:.9rem;padding:9px 15px;
  border-radius:var(--r-sm);border:1px solid var(--line);background:var(--paper);cursor:pointer;
  transition:border-color .16s ease,background .16s ease,color .16s ease}
.jetons label:hover{border-color:var(--vert-300);background:var(--vert-50)}
.jetons input{position:absolute;opacity:0;width:0;height:0}
.jetons input:checked+span,.jetons label:has(input:checked){background:var(--vert-plein-2);
  color:#fff;border-color:var(--vert-900)}
.jetons label:has(input:focus-visible){outline:2px solid var(--focus);outline-offset:2px}

/* --- Aperçu d'e-mail ------------------------------------------------------------------------ */
.mail{border:1px solid var(--line);border-radius:10px;background:var(--sable-2);overflow:hidden;
  margin:0 0 16px}
.mail .hd{background:var(--paper);border-bottom:1px solid var(--line-soft);padding:10px 14px;
  font-size:.82rem}
.mail .hd b{color:var(--ink-soft);font-weight:600;display:inline-block;min-width:6ch}
.mail .bd{padding:14px;font-size:.9rem}

/* Les mots de quelqu'un, rapportés tels quels. En serif et détachés par un filet : on doit voir
   au premier coup d'œil que c'est une personne qui parle et non l'interface. Le retour à la
   ligne est conservé — reformater ce que quelqu'un a écrit, c'est déjà le réécrire. */
.cite{font-family:var(--serif);font-size:var(--text-3);line-height:1.55;white-space:pre-wrap;
  border-left:3px solid var(--vert-100);padding-left:var(--space-4);margin:0 0 var(--space-4)}
:where(body.op) .cite{padding-left:15px;margin:0 0 14px}
body.op .cite{border-left-color:var(--laiton);font-size:var(--op-t4)}
body.tiers .cite{border-left-color:var(--tz-100)}

/* --- Pastilles ------------------------------------------------------------------------------ */
.pill{display:inline-block;font-size:var(--text-1);text-transform:uppercase;letter-spacing:.08em;
  font-weight:700;padding:var(--space-1) var(--space-3);border-radius:var(--radius-pilule);background:var(--vert-50);
  color:var(--accent);border:1px solid var(--vert-100)}
:where(body.op) .pill{padding:3px 10px}
.pill.dit{background:var(--sable-2);color:var(--ink-soft);border-color:var(--line)}
.pill.sain{background:transparent;color:var(--ink-mute);border-color:var(--line)}
.pill.moi{background:var(--laiton-pale);color:var(--laiton-texte);border-color:var(--laiton-filet)}
/* 06/09/2026 — même teinte que `.btn.vers-echange` : un seul langage visuel pour « mène vers un
   échange », que ce soit un bouton ou, ici, un simple repère posé à côté d'un nom dans une
   liste de vingt profils. */
.pill.ouvert{background:var(--sarcelle-pale);color:var(--sarcelle);border-color:var(--sarcelle)}

/* --- Tableaux ------------------------------------------------------------------------------- */
table{width:100%;border-collapse:collapse;font-size:var(--text-2);margin:0 0 var(--space-1)}
:where(body.op) table{font-size:var(--op-t3)}
table th{text-align:left;font-family:var(--serif);font-weight:600;color:var(--titre);
  padding:var(--space-2) var(--space-3);border-bottom:2px solid var(--line);font-size:var(--text-2)}
table td{padding:var(--space-2) var(--space-3);border-bottom:1px solid var(--line-soft);vertical-align:top}
table tr:last-child td{border-bottom:none}
body.op table th{color:var(--gr-600);font-family:var(--mono);font-weight:400;font-size:var(--op-t1);
  letter-spacing:.06em;text-transform:uppercase;border-bottom:1px solid var(--gr-100);
  background:var(--gr-50);padding:9px 20px}
body.op table td{border-bottom:1px solid #EDF0F1;padding:11px 20px;font-size:var(--op-t2)}
body.op table tbody tr{transition:background .14s ease}
body.op table tbody tr:hover{background:var(--gr-25)}

/* Un tableau large ne fait jamais déborder la page : il défile dans sa propre boîte. */
.defile{overflow-x:auto;-webkit-overflow-scrolling:touch}

.sess{display:flex;gap:var(--space-3);align-items:baseline;justify-content:space-between;
  border-bottom:1px solid var(--line-soft);padding:var(--space-3) 0;font-size:var(--text-2)}
.sess:last-of-type{border-bottom:none}
.op-row{display:flex;justify-content:space-between;align-items:baseline;gap:12px;
  padding:14px 0;border-bottom:1px solid var(--line-soft)}
.op-row:last-child{border-bottom:none}
.op-empty{color:var(--ink-soft);font-size:var(--op-t3);padding:18px 0}

/* Une liste de faits, pas une énumération d'arguments : ni puce ni retrait. */
/* Les numéros masqués : une ligne, son geste de retrait à droite. Le numéro n'est pas gardé,
   seuls ses deux derniers chiffres le sont, donc la ligne est courte par construction. */
.masque-ligne{display:flex;align-items:center;justify-content:space-between;gap:var(--space-4);
  padding:var(--space-2) 0;border-bottom:1px solid var(--line-soft);font-size:var(--text-2)}
.masque-ligne:last-child{border-bottom:0}
.liste-nue{list-style:none;margin:0;padding:0}
.liste-nue>li{padding:0 0 2px}
.liste-nue audio{max-width:100%}

/* =============================================================================================
   COMPOSANTS VENUS DES MAQUETTES
   ============================================================================================= */

/* --- Bandeau de saison (Main.dc.html) --------------------------------------------------------

Les huit semaines en segments, dans un dégradé profond. Il dit une durée et une échéance : deux
choses connues d'avance, écrites au contrat. Rien qui bouge selon ce que font les autres. */

.bandeau-saison{background:linear-gradient(157deg,var(--vert-950) 0%,var(--vert-700) 62%,var(--vert-800) 100%);
  border-radius:var(--radius-grand);padding:var(--space-5) var(--space-5);margin:0 0 var(--space-5);color:#fff;display:flex;align-items:center;
  gap:var(--space-5);position:relative;overflow:hidden;flex-wrap:wrap}
.bandeau-saison::before{content:"";position:absolute;inset:0;pointer-events:none;
  background:radial-gradient(120% 90% at 88% 6%,rgba(199,161,89,.24),transparent 58%),
             radial-gradient(70% 60% at 4% 100%,rgba(127,168,149,.18),transparent 60%)}
.bandeau-saison>*{position:relative}
.bandeau-saison .kick{color:rgba(255,255,255,.62);margin-bottom:var(--space-1)}
.bandeau-saison .titre{font-family:var(--serif);font-size:var(--text-5);font-weight:600}
.bandeau-saison .sous{font-size:var(--text-2);color:rgba(255,255,255,.72);margin-top:2px}
.bandeau-saison .segments{flex:1;min-width:200px;height:6px;border-radius:var(--radius-pilule);
  background:rgba(255,255,255,.17);overflow:hidden}
.bandeau-saison .segments i{display:block;height:100%;border-radius:var(--radius-pilule);background:var(--vert-300)}

/* --- Cartes chiffrées de la console (op_tableau_de_bord, op_finances) ------------------------

Le filet du haut porte le sens : laiton, il attend un geste ; rouge, le délai court ; gris, c'est
un état. Le nombre est en chasse fixe pour que deux cartes se comparent sans être lues. */

.chiffres{display:grid;gap:14px;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));
  margin:0 0 22px}
.chiffre{background:var(--paper);border:1px solid var(--gr-100);border-top:3px solid var(--gr-200);
  border-radius:var(--r-sm);padding:16px 18px;display:flex;flex-direction:column;gap:6px;
  text-decoration:none;color:inherit;transition:transform .2s var(--ease),box-shadow .2s ease}
a.chiffre:hover{transform:translateY(-2px);box-shadow:var(--shadow-op)}
.chiffre.attend{border-top-color:var(--laiton)}
.chiffre.urgent{border-top-color:var(--stop)}
.chiffre>.quoi{font-size:.8rem;color:var(--gr-600)}
.chiffre>.combien{font-family:var(--mono);font-size:1.9rem;font-weight:500;line-height:1.1;
  font-variant-numeric:tabular-nums}
.chiffre.urgent>.combien{color:var(--stop)}
.chiffre>.depuis{font-size:.75rem;color:var(--gr-500)}
.chiffre.urgent>.depuis{color:var(--stop)}

/* ==================================================================================================
   LA CONSOLE OPÉRATEUR, REVUE — LOT 23, 05/09/2026.

   Tout ce qui suit est portée par `body.op` et ne touche à aucun écran membre. Cinq choses
   changent, et elles répondent chacune à un mot de la demande.

   « MODERNE, FUTURISTE » — le rail passe en dégradé de nuit avec un liseré cyan, les cartes
   gagnent une lueur au survol, et les surfaces se détachent par la lumière plutôt que par le
   trait. Le vocabulaire est celui d'un poste de pilotage, pas celui d'un jeu.

   « CHIFFRES EN 3D » — les nombres des cartes sont remplis d'un dégradé et posés sur une ombre
   basse, ce qui leur donne du relief sans les rendre illisibles. La chasse fixe reste : deux
   cartes doivent se comparer d'un coup d'œil, et une police fantaisie l'empêcherait.

   « LES CHAMPS DE DATE » — le sélecteur natif est conservé (aucun composant maison ne vaut le
   calendrier du système sur un téléphone), mais habillé : icône cyan, champ haut, teinte
   d'accent posée pour que le calendrier du navigateur reprenne la couleur de la console.

   « LES CHAMPS À RENSEIGNER PLUS VISIBLES » — un champ obligatoire porte une barre ambre tant
   qu'il est vide, et elle passe menthe dès qu'il est rempli. C'est la seule animation d'état de
   la console, et elle dit quelque chose de vrai.

   « LUDIQUE, MAIS CLAIRE » — le mouvement est court (.16 s à .22 s), il ne se déclenche qu'au
   survol ou au focus, et `prefers-reduced-motion` le retire entièrement.
   ================================================================================================== */

/* --- Les cartes et les tableaux : la lumière plutôt que le trait ------------------------------- */
body.op .card{box-shadow:0 1px 2px rgba(20,26,31,.04),0 8px 24px -18px rgba(20,26,31,.45);
  transition:box-shadow .2s ease,border-color .2s ease}
body.op .card:hover{border-color:var(--gr-200);
  box-shadow:0 1px 2px rgba(20,26,31,.05),0 16px 40px -24px rgba(20,26,31,.55)}
body.op .card>h2{background:linear-gradient(180deg,var(--gr-25),var(--paper));
  letter-spacing:.01em}
body.op table thead th,body.op table tr:first-child th{
  background:var(--gr-25);position:sticky;top:0;z-index:1}
body.op table tbody tr:hover{background:var(--op-azur-pale)}

/* --- Les chiffres, en relief -------------------------------------------------------------------- */
body.op .chiffre{background:linear-gradient(170deg,var(--paper) 0%,var(--gr-25) 100%);
  border-top-width:3px;overflow:hidden;position:relative}
body.op .chiffre::after{content:"";position:absolute;inset:auto -30% -60% -30%;height:120%;
  background:radial-gradient(closest-side,rgba(47,127,224,.10),transparent);
  opacity:0;transition:opacity .25s ease;pointer-events:none}
body.op a.chiffre:hover::after{opacity:1}
body.op a.chiffre:hover{transform:translateY(-3px)}
/* LE RELIEF SE FAIT PAR L'OMBRE, PAS PAR UN DÉGRADÉ DÉCOUPÉ — corrigé le 05/09/2026.
   La première version remplissait le chiffre d'un dégradé via `background-clip:text`, avec la
   couleur du texte à `transparent`. À la première capture d'écran, les nombres apparaissaient en
   gris fantôme : seule l'ombre se voyait. Un chiffre illisible dans une console où l'on décide
   n'est pas un effet, c'est un défaut.
   Trois ombres empilées suffisent à extruder le glyphe, et la couleur reste pleine : cela marche
   partout, y compris à l'impression et en contraste élevé. */
body.op .chiffre>.combien{font-size:2.6rem;font-weight:700;letter-spacing:-.025em;
  color:var(--gr-950);padding-bottom:3px;
  text-shadow:0 1px 0 #fff,0 2px 0 var(--gr-100),0 3px 1px rgba(20,26,31,.20),
              0 6px 12px rgba(20,26,31,.10)}
body.op .chiffre.attend{border-top-color:var(--op-safran)}
body.op .chiffre.attend>.combien{color:var(--op-safran-texte)}
body.op .chiffre.urgent{border-top-color:var(--op-corail)}
body.op .chiffre.urgent>.combien{color:var(--op-corail-texte)}
body.op .chiffre>.quoi{text-transform:uppercase;letter-spacing:.09em;font-size:var(--op-t1);
  font-weight:700;color:var(--gr-600)}

/* --- Les champs : ce qui reste à remplir se voit ------------------------------------------------ */
body.op input,body.op select,body.op textarea{
  border-radius:var(--r-sm);padding:10px 12px;transition:border-color .16s ease,box-shadow .16s ease;
  accent-color:var(--op-azur)}
body.op input:focus,body.op select:focus,body.op textarea:focus{
  border-color:var(--op-azur);box-shadow:0 0 0 3px var(--op-azur-pale);outline:none}
/* La barre d'état d'un champ obligatoire. Ambre tant qu'il est vide, menthe dès qu'il est rempli :
   la console dit ce qu'il reste à faire sans qu'on ait à soumettre pour l'apprendre. */
body.op input:required,body.op select:required,body.op textarea:required{
  border-left:3px solid var(--op-safran)}
body.op input:required:valid,body.op select:required:valid,body.op textarea:required:valid{
  border-left-color:var(--op-jade)}
body.op label.f>span.h,body.op .aide-champ{color:var(--gr-600)}

/* Les dates. Le calendrier natif est conservé — aucun composant maison n'égale celui du système
   sur un téléphone —, mais il prend la couleur de la console : `color-scheme` et `accent-color`
   suffisent sur les navigateurs récents, l'icône est recolorée sur ceux de la famille WebKit. */
body.op input[type="date"],body.op input[type="datetime-local"],body.op input[type="time"]{
  color-scheme:light;accent-color:var(--op-azur);font-family:var(--mono);
  font-variant-numeric:tabular-nums;letter-spacing:.02em;
  background:linear-gradient(180deg,var(--paper),var(--gr-25))}
body.op input[type="date"]::-webkit-calendar-picker-indicator,
body.op input[type="datetime-local"]::-webkit-calendar-picker-indicator{
  filter:invert(52%) sepia(72%) saturate(1200%) hue-rotate(196deg) brightness(88%) contrast(88%);
  cursor:pointer;padding:4px;border-radius:5px;transition:background .16s ease}
body.op input[type="date"]::-webkit-calendar-picker-indicator:hover,
body.op input[type="datetime-local"]::-webkit-calendar-picker-indicator:hover{
  background:var(--op-azur-pale)}

/* --- Les boutons -------------------------------------------------------------------------------- */
/* `body.op .plan a{color:var(--gr-900)}` bat `.btn{color:#fff}` en spécificité : un bouton écrit
   en balise <a> sortait donc en graphite sur un fond graphite, c'est-à-dire invisible. Vu sur la
   première capture, dans l'encadré « en retard ». */
body.op .plan a.btn{color:#fff}
body.op .plan a.btn.n{color:var(--gr-900)}
body.op .btn{background:linear-gradient(175deg,var(--gr-800),var(--gr-950));
  box-shadow:0 1px 0 rgba(255,255,255,.12) inset,0 2px 8px -3px rgba(20,26,31,.6);
  transition:transform .16s var(--ease),box-shadow .16s ease,background .16s ease}
body.op .btn:hover{background:linear-gradient(175deg,var(--op-azur-sombre),var(--gr-950));
  transform:translateY(-1px);box-shadow:0 4px 14px -4px rgba(47,127,224,.55)}
body.op .btn:active{transform:translateY(0)}
body.op .btn.n:hover{border-color:var(--op-azur);color:var(--op-azur-texte);background:var(--op-azur-pale)}
body.op .btn.danger{background:linear-gradient(175deg,var(--op-corail),#8C3A32)}

/* --- L'ÉCHELLE DU GESTE — console, 09/09/2026 -------------------------------------------------

   Planche 1e de la réponse de Claude Design au brief `23_`. Vingt-huit formulaires d'action, et
   aucune confirmation, alors que cinq détruisent, débitent ou suspendent.

   POURQUOI LE VIOLET, CONTRE L'ÉCHEC DU BLEU ARDOISE. Le bleu avait été rejeté côté membre parce
   qu'il attirait l'œil autant que le laiton sans rien vouloir dire. Le violet ne dit ici qu'UNE
   chose — « ceci ne se défait pas » — et il n'apparaît qu'à cinq endroits de la console : le
   contour d'un bouton qui n'agit pas, et le bandeau de l'écran qui suit. S'il s'étendait à un
   sixième usage, il faudrait le retirer. `--op-violet` était déclaré et employé nulle part depuis
   l'origine ; il prend ce métier, et lui seul.

   ET PAS DE ROUGE. Le corail de la console dit « en retard ou en échec », c'est-à-dire un FAIT
   PASSÉ. L'emprunter pour annoncer un danger à venir brouillerait les deux sens d'un coup. */
body.op .btn.definitif{background:var(--paper);color:var(--op-iris-texte);
  border:2px solid var(--op-iris);box-shadow:none}
body.op .btn.definitif:hover{background:var(--op-iris-pale);color:var(--op-iris-texte);
  border-color:var(--op-iris-texte);transform:none}
body.op .btn.definitif:focus-visible{outline:2px solid var(--op-iris);outline-offset:3px}

/* La carte de l'écran de confirmation. Sobre : elle énumère, elle ne plaide pas. Le violet y est
   un filet en tête, pas un fond — un fond coloré se lit comme une alarme. */
body.op .geste-definitif{border-top:3px solid var(--op-iris)}
body.op .geste-definitif .geste-lede{margin:0 0 var(--e5);font-size:var(--op-t4);line-height:1.6;
  color:var(--gr-900);max-width:68ch}

/* LES CONSÉQUENCES SONT NUMÉROTÉES ET ORDONNÉES PAR GRAVITÉ. Une liste à puces suggère un
   inventaire sans ordre ; ici l'ordre est l'information. */
body.op .geste-degats{margin:0 0 var(--e5);padding:0 0 0 var(--e5);max-width:68ch}
body.op .geste-degats li{margin:0 0 var(--e3);line-height:1.6;color:var(--gr-900)}
body.op .geste-degats li::marker{font-family:var(--mono);font-weight:700;color:var(--op-iris-texte)}

/* CE QUI SURVIT, EN DERNIER ET EN MENTHE. Un écran qui n'énumère que des dégâts se lit comme une
   menace, et on finit par cliquer sans lire. */
body.op .geste-survit{margin:0 0 var(--e5);max-width:68ch}
body.op .geste-survit ul{margin:var(--e2) 0 0;padding-left:var(--e4)}
body.op .geste-survit li{margin:0 0 var(--e1);line-height:1.55}

/* DEGRÉ 2 : la case qui arme le bouton. Elle est en ambre, la couleur qui dit « attend un geste
   de vous » dans cette console, et sur un fond pâle pour qu'on ne la saute pas en descendant vers
   le bouton. `required` sur une case native suffit à la rendre bloquante : aucun script, et le
   navigateur écrit lui-même le refus. */
body.op .chk.chk-degre2{margin:var(--e4) 0;padding:var(--e3) var(--e4);border-radius:var(--r-sm);
  background:var(--op-safran-pale);border:1px solid #EBD7A4;max-width:68ch;line-height:1.55}
body.op .chk.chk-degre2 input{accent-color:var(--op-safran)}

/* --- LA PORTE DE SERVICE — 10/09/2026 ---------------------------------------------------------

   Planche 1f. Trois écrans hors du produit et hors de la console : ni marque, ni promesse, ni
   lien. Fond NUIT, celui du poste de travail, qui veut dire « hors du travail » dans la règle de
   couleur de la console — et ici, littéralement, « pas encore dedans ».

   La carte est étroite et centrée sur la hauteur : rien d'autre ne partage l'écran, et il n'y a
   rien d'autre à y regarder. */
body.porte{background:var(--op-nuit);color:var(--gr-100);min-height:100vh;
  display:flex;align-items:center;justify-content:center}
body.porte .wrap{max-width:none;width:100%;padding:var(--e5)}
body.porte .topnav,body.porte .lieux,body.porte .exit,body.porte .frise-saison{display:none}
/* 14/09/2026 — la porte de service vit sous `op/` depuis que la Régie s'installe comme une
   application. Elle est donc dans la zone opérateur, qui dessine le rail : un rail de navigation
   au-dessus d'un formulaire de connexion propose douze écrans qu'on ne peut pas ouvrir. */
body.porte .poste{display:none}
body.porte.op{flex-direction:column}
.porte-carte{max-width:34ch;margin:0 auto;background:var(--gr-950);border:1px solid var(--gr-800);
  border-radius:var(--r);padding:var(--e6) var(--e5)}
.porte-carte h1{margin:0 0 var(--e5);font-size:1.3rem;color:var(--gr-100)}
.porte-carte .mention{color:var(--gr-300)}
.porte-carte label.f{color:var(--gr-300)}
.porte-carte input{background:var(--op-nuit);border:1px solid var(--gr-800);color:var(--gr-100)}
.porte-carte input:focus{border-color:var(--op-azur);box-shadow:0 0 0 3px rgba(47,127,224,.25);
  outline:none}
.porte-carte .btn{width:100%;background:var(--op-azur-sombre);border-color:var(--op-azur-sombre)}
.porte-carte .btn:hover{background:var(--op-azur);border-color:var(--op-azur);transform:none}
.porte-carte .err{background:transparent;border:1px solid #5C332E;color:#E08A80;
  padding:var(--e3);border-radius:var(--r-sm)}

/* --- LA TÊTE D'UNE FILE DE TRAVAIL — console, 09/09/2026 -------------------------------------

   Planche 1d. Un seul motif pour les deux files que le critère A-31 protège, la qualification et
   les dispenses : elles avaient la même nature et deux formes.

   LE CHIFFRE À GAUCHE, LES FAITS À DROITE, et jamais l'inverse : la profondeur se lit d'un coup
   d'œil en entrant, le reste se lit en s'asseyant. L'ambre dit « attend un geste de vous », qui
   est exactement ce qu'une file veut dire ; une file vide retombe en gris, sans vert — « rien
   n'attend » n'est pas une réussite, c'est un état. */
body.op .file-tete{display:flex;gap:var(--e5);align-items:center;margin:0 0 var(--e5);
  padding:var(--e4) var(--e5);background:var(--paper);border:1px solid var(--gr-100);
  border-left:3px solid var(--op-safran);border-radius:var(--r-sm)}
body.op .file-tete:has(.combien:empty),body.op .file-tete.vide{border-left-color:var(--gr-200)}
body.op .file-chiffre{flex:0 0 auto;text-align:center;min-width:5ch}
body.op .file-chiffre .quoi{display:block;font-size:var(--op-t1);text-transform:uppercase;
  letter-spacing:.09em;color:var(--gr-500)}
body.op .file-chiffre .combien{display:block;font-family:var(--mono);font-size:2.1rem;
  font-variant-numeric:tabular-nums;line-height:1.1;color:var(--gr-950)}
/* --- POURQUOI CETTE SAISON N'AVANCE PAS — console, 10/09/2026 --------------------------------

   Planche 1c. Une phrase en tête du détail d'une saison, avant les onze cartes.

   TROIS TONS, ET « AVANCE » EST NEUTRE. C'est le point : une saison qui suit son cours ne doit
   pas ressembler à une saison bloquée, sans quoi l'ambre finit par ne plus rien vouloir dire.
   L'ambre est le seul signal d'appel de cette console, et il se dépense une fois. */
body.op .blocage{margin:0 0 var(--e5);padding:var(--e3) var(--e4);border-radius:var(--r-sm);
  border:1px solid var(--gr-100);background:var(--paper);line-height:1.55;max-width:68ch}
body.op .blocage.attend{background:var(--op-safran-pale);border-color:#EBD7A4;
  border-left:3px solid var(--op-safran)}
body.op .blocage.finie{color:var(--gr-500)}

/* La référence courte, partout où elle accompagne un nom : en mono, plus petite, et jamais de la
   couleur du nom. Elle sert à désigner, pas à nommer. */
body.op .ref{font-family:var(--mono);font-size:var(--op-t2);font-weight:400;color:var(--gr-500);
  letter-spacing:.03em}

/* --- OÙ EN EST CE MEMBRE — console, 10/09/2026 ------------------------------------------------

   Planche 1i. Jusqu'à trois conversations, chacune avec son propre arc, empilées sous l'arc
   nominal de la saison. La machine à états `.etats` est réemployée telle quelle : c'est la même
   grammaire, et une seconde en aurait fait deux là où il n'en faut qu'une.

   PAS DE CADRE PAR CONVERSATION, juste un filet à gauche. Trois cartes dans une carte donneraient
   trois objets de même poids que celle qui les contient, et l'œil ne saurait plus laquelle est la
   personne et lesquelles sont ses conversations. */
body.op .convo{margin:0 0 var(--e4);padding-left:var(--e4);border-left:2px solid var(--gr-100)}
body.op .convo:last-of-type{margin-bottom:var(--e4)}
body.op .convo-tete{display:flex;align-items:baseline;gap:var(--e3);flex-wrap:wrap;
  margin:0 0 var(--e3)}

body.op .file-faits{min-width:0}
body.op .file-faits p{margin:0 0 var(--e2);line-height:1.55;max-width:68ch}
body.op .file-faits p:last-child{margin-bottom:0}

@media (max-width:719px){
  body.op .file-tete{flex-direction:column;align-items:flex-start;gap:var(--e3)}
}

body.op .geste-recopie{max-width:34ch}
body.op .geste-recopie input{font-family:var(--mono);letter-spacing:.04em}

/* LE RETOUR EST UN LIEN, LA VALIDATION UN BOUTON : le doute est le chemin facile. Un second
   bouton, même secondaire, mettrait les deux issues à égalité de poids — ce qui est la règle des
   trois décisions côté membre, et exactement l'inverse de ce qu'il faut ici. */
body.op .lien-retour{margin-right:auto;color:var(--gr-600);text-decoration:underline;
  text-underline-offset:3px}
body.op .lien-retour:hover{color:var(--gr-950)}

/* --- Les encadrés de la console prennent l'accent qui leur correspond ---------------------------- */
body.op .box.ok{background:var(--op-jade-pale);border-color:#BFE3D3;border-left-color:var(--op-jade)}
body.op .box.ok .tag{color:var(--op-jade-texte)}
body.op .box.agir,body.op .box.warn{background:var(--op-safran-pale);border-color:#EBD7A4;
  border-left-color:var(--op-safran)}
body.op .box.stop{background:var(--op-corail-pale);border-color:#EFC3BE;border-left-color:var(--op-corail)}
body.op .box.stop .tag{color:var(--op-corail-texte)}
body.op .box.neutre{background:var(--gr-25);border-color:var(--gr-100)}

/* Les pastilles d'état d'une ligne de tableau. `.moi` sert d'alerte dans la console, `.sain` de
   confirmation : deux mots qui viennent de la zone membre, et dont le sens tient ici aussi. */
body.op .pill.moi{background:var(--op-corail-pale);color:var(--op-corail-texte);border-color:#EFC3BE}
body.op .pill.sain{background:var(--op-jade-pale);color:var(--op-jade-texte);border-color:#BFE3D3}
body.op .pill.dit{background:var(--op-azur-pale);color:var(--op-azur-texte);border-color:#BEE5EE}

/* La frise d'une saison : l'étape courante respire, les autres se taisent. */
body.op .etats .etat.ici{position:relative}
body.op .etats .etat.ici .trait{background:var(--op-azur);
  box-shadow:0 0 0 3px var(--op-azur-pale)}
body.op .etats .etat.faite .trait{background:var(--op-jade)}

@media (prefers-reduced-motion:reduce){
  body.op .poste a:hover,body.op a.chiffre:hover,body.op .btn:hover{transform:none}
  body.op .chiffre::after{transition:none}
}

/* Une cellule de montant : alignée à droite, en chiffres de largeur fixe, insécable. Sans
   `tabular-nums`, « 8 700 € » et « 300 € » ne s'alignent pas sur la virgule et une colonne de
   montants devient illisible. */
.montant{text-align:right;font-family:var(--mono);font-variant-numeric:tabular-nums;
  white-space:nowrap}
th.montant{text-align:right}

/* Un bouton qui n'est pas une action de premier plan : il se lit comme un lien, mais il poste
   un formulaire. Employé pour retirer une ligne saisie à la main. */
.lien-bouton{background:none;border:none;padding:0;font:inherit;font-size:.82rem;
  color:var(--gr-600);text-decoration:underline;text-underline-offset:2px;cursor:pointer}
.lien-bouton:hover{color:var(--stop)}

/* --- Frise d'états (op_saison_detail) -------------------------------------------------------

La machine à états du modèle Saison, mise à plat. Franchie, courante, à venir : trois aspects,
lisibles sans légende. */

.etats{display:flex;gap:0;margin:0 0 22px;overflow-x:auto;padding-bottom:4px}
.etats .etat{flex:1;min-width:104px;display:flex;flex-direction:column;gap:7px;padding:0 4px}
.etats .etat .trait{height:4px;border-radius:99px;background:var(--gr-200)}
.etats .etat.faite .trait{background:var(--gr-600)}
.etats .etat.ici .trait{background:var(--laiton)}
.etats .etat b{font-size:var(--op-t2);font-weight:600;line-height:1.3}
.etats .etat.avenir b{color:var(--gr-500);font-weight:400}
.etats .etat span{font-family:var(--mono);font-size:var(--op-t1);color:var(--gr-500)}
.etats .etat.ici b{color:var(--laiton-texte)}

/* `.switch-echanges` est retiré le 09/09/2026 : la rangée de pastilles qui servait à changer de
   binôme est devenue la liste `.binomes`, la même que sur l'index du lieu, avec la frisette de
   chacun. Une pastille disait qui ; une ligne dit qui ET où en est la conversation. */

/* --- L'ARC : LA GRAMMAIRE DU TEMPS, UNIQUE (08/09/2026) --------------------------------------

Ce bloc remplace TROIS mécaniques qui disaient la même chose de trois façons : la pile de mesures
de l'écran d'échange (`.saison-mesures`, à l'échelle des cinquante jours), la frise horizontale de
la réservation (`.etats`, qui reste à la console opérateur et à elle seule), et les listes à puces
d'états. Un seul motif, trois emplois : l'arc de la saison dans le cartouche, l'arc de la
réservation, et la pile d'outils d'une conversation, qui EST l'arc du binôme.

CE QUI CHANGE VRAIMENT : PLUS RIEN N'EST PROPORTIONNEL AU TEMPS. La piste à l'échelle collait la
Décision (29e jour) et la Rencontre (30e) à 2 % l'une de l'autre, quelle que soit la largeur ; on
avait fait descendre une étiquette sur deux pour masquer la collision. La mesure par étape, qui
lui a succédé, gardait l'échelle dans la longueur d'une bande. Ici il n'y a plus d'échelle du
tout : une ligne par palier, séparée de la suivante par un cran fixe. Deux paliers distants d'un
jour sont deux lignes voisines. La collision n'est plus contournée, elle est impossible.

La durée est ÉCRITE, jamais dessinée : « S'ouvre au jour 29 », et jamais « dans 6 jours ». Le
produit s'interdit tout compte à rebours, et la date de fin ne se met pas en scène.

QUATRE ÉTATS, DEUX COULEURS. Le laiton dit « à vous de jouer », le vert dit « franchie », et ces
deux sens restent exclusifs. Les deux autres états s'en passent : repère creux à trait PLEIN pour
« ouverte », creux à trait POINTILLÉ pour « pas encore ». Le bleu ardoise avait été essayé pour ce
rôle et rejeté — il criait autant que le laiton sans rien vouloir dire. Un trait ne crie pas.

Et aucune information ne tient à la seule couleur, ni au seul trait : chaque ligne porte son détail
en toutes lettres à droite (`declaratif/arc.py`, `MOT_DE_L_ETAT` et `detail`). */

.arc{display:flex;flex-direction:column;margin:0 0 var(--space-5)}
.arc-l{display:grid;grid-template-columns:13px 1fr;gap:var(--space-3);align-items:baseline;
  padding:var(--space-3) 0;border-bottom:1px solid var(--line-soft)}
.arc-l:last-child{border-bottom:0}
.arc-l .nom{font-family:var(--serif);font-size:var(--text-3);font-weight:600;color:var(--ink);
  line-height:1.25}
/* L'ÉTAT D'UN PALIER, DÉCLARÉ ICI ET NULLE PART AILLEURS — 09/09/2026, troisième passage.
   Demande du Fondateur : « dans les frises, change la police des statuts de chaque phase (plus
   petit) et avec une couleur différente des phases/étapes ». Au pluriel : toutes les frises, et
   non la seule rangée déjà traitée le matin même.

   Il n'y a donc plus qu'UNE déclaration de la voix de l'état, celle-ci ; la rangée ne redit que
   sa mise en place (centrée, sous le titre). Écrite à deux endroits, elle avait divergé en une
   demi-journée : .75 rem droit ici, .72 rem italique là.

   QUATRE MARQUEURS SÉPARENT L'ÉTAT DU TITRE, et aucun ne suffit seul : la famille (mono contre
   serif), la graisse, l'italique, la taille. La couleur est le cinquième, traitée plus bas — et
   c'est celui qui manquait.

   LA TAILLE : .7 rem, soit 11,2 px. Troisième réduction demandée, et la deuxième sous le plancher
   de douze pixels que `tests/test_contraste_aa.py` tient sur toute la feuille. La dérogation y
   est nommée, bornée et comptée, avec ce qu'elle coûte. */
.arc-l .quoi{display:block;font-family:var(--mono);font-size:.7rem;font-style:italic;
  letter-spacing:.03em;line-height:1.4;color:var(--ink-mute);margin-top:var(--space-1)}

/* LE REPÈRE. Onze pixels, aligné sur la première ligne du libellé et non sur son centre : une
   ligne de titre qui passe sur deux lignes ferait descendre un repère centré au milieu de nulle
   part. `margin-top` cale la pastille sur la hauteur d'x du serif. */
.arc-l .rep{width:11px;height:11px;border-radius:50%;margin-top:var(--space-1)}

/* DEUX JEUX DE COULEURS QUI NE SE CROISENT JAMAIS — 09/09/2026, troisième passage.
   « Une couleur différente des phases/étapes. » Le défaut était réel et je ne l'avais pas vu :
   sur un palier « pas encore », le titre et l'état s'écrivaient tous les deux en `--ink-mute`,
   au pixel près la même couleur. Sur la frise d'un binôme, où la plupart des paliers sont encore
   à venir, c'était le cas de presque toute la ligne.

   La règle, désormais tenue par `tests/test_arc_du_temps.py` :
     un TITRE se peint en --ink (courant), --titre (rangée) ou --ink-soft (état atténué) ;
     un ÉTAT se peint en --ink-mute, et en --laiton-texte quand c'est à vous de jouer.
   Deux ensembles disjoints. Aucun état ne peut donc rendre les deux identiques.

   Ce qui disparaît au passage : l'état d'un palier franchi s'écrivait en vert d'accent. Le vert
   dit « franchie » et le disait déjà par le repère ; le redire en toutes lettres et en couleur
   faisait de l'état la ligne la plus voyante d'un palier qui, justement, est derrière nous. */
.arc-l.franchie .rep{background:var(--vert-plein)}
.arc-l.franchie .nom{font-weight:400;color:var(--ink-soft)}

.arc-l.action .rep{background:var(--laiton);box-shadow:0 0 0 3px var(--laiton-pale)}
.arc-l.action .nom{color:var(--ink)}
.arc-l.action .quoi{color:var(--laiton-texte);font-weight:500}

/* 09/09/2026 — le trait passe de 1,5 à 2 px. Verdict du Fondateur sur la vue de nuit : « les
   codes couleurs ne sont pas assez perceptibles ». Sur quatre états, trois sont des anneaux, et
   dans le noir un anneau de 1,5 px se lisait comme un anneau de 1,5 px pointillé. L'épaisseur
   sépare désormais « ouverte » de « pas encore » AVANT même que le trait soit lu : deux
   marqueurs plutôt qu'un, ce qui est la règle du produit. */
.arc-l.ouverte .rep{border:2px solid var(--ink-soft)}

.arc-l.pasencore .rep{border:1.5px dashed var(--ink-mute)}
.arc-l.pasencore .nom{font-weight:400;color:var(--ink-soft)}

/* `avenir` est le mot de `parcours.py` pour ce que l'arc appelle « pas encore ». Les deux
   vocabulaires coexistent le temps que le parcours d'un binôme et l'arc d'une saison se disent
   dans les mêmes mots ; ils se peignent déjà pareil, ce qui est le point. */
.arc-l.avenir .rep{border:1.5px dashed var(--ink-mute)}
.arc-l.avenir .nom{font-weight:400;color:var(--ink-soft)}

/* Dans l'écran d'échange, chaque palier est un BOUTON : il filtre les ressources par étape. Le
   motif ne change pas pour autant — un bouton qui ne ressemble pas à ses voisins ferait deux
   grammaires là où on vient d'en poser une. */
button.arc-l{width:100%;text-align:left;font:inherit;color:inherit;background:none;
  border:0;border-bottom:1px solid var(--line-soft);cursor:pointer}
button.arc-l:hover .nom{color:var(--titre)}
button.arc-l:focus-visible{outline:2px solid var(--focus);outline-offset:-2px}
.arc-l.choisie{background:var(--sable-2)}

/* Au-delà du pouce, le détail passe à droite du libellé plutôt qu'en dessous. C'est le SEUL
   point de bascule du motif : la grille tombe de trois colonnes à deux, aucune variante de
   composant, aucune règle par emploi. */
@media(min-width:640px){
  .arc-l{grid-template-columns:13px 1fr auto;column-gap:var(--space-4)}
  .arc-l .quoi{margin-top:0;text-align:right;white-space:nowrap}
  /* Sauf dans l'échange : les détails y sont des phrases entières (« Une rencontre en personne
     peut s'organiser. »), qu'un `nowrap` pousserait hors de l'écran. */
  button.arc-l .quoi{white-space:normal;max-width:34ch}
}

/* --- L'ARC EN RANGÉE — 09/09/2026 -------------------------------------------------------------

   Le même motif, tourné d'un quart de tour. Verdict du Fondateur devant l'arc vertical en
   ligne : « la frise avec la jauge était plus visuelle et plus claire pour moi ».

   CE QUI NE CHANGE PAS, ET C'EST L'ESSENTIEL : rien n'est proportionnel au temps. Six colonnes
   de largeur ÉGALE, quel que soit l'écart de jours entre deux paliers. La décision du jour 29 et
   la rencontre du jour 30 restent donc deux colonnes voisines, exactement comme elles étaient
   deux lignes voisines. C'est l'échec n°2 du `18_` qui reste écarté, et il l'est pour la même
   raison : la géométrie ne porte pas la durée. La jauge, elle, la porte — et elle ne mesure que
   la saison entière, jamais un palier.

   LE TRAIT QUI RELIE passe DERRIÈRE les repères, et chaque repère porte un halo de la couleur du
   fond pour le masquer : sans ce halo, la ligne traverserait les ronds creux.

   SOUS 720 PX, LA RANGÉE REDEVIENT UNE PILE. Six colonnes sur un téléphone donneraient six
   colonnes de quarante pixels, c'est-à-dire des libellés coupés au milieu d'un mot. Ce n'est pas
   une variante du motif : c'est le motif d'origine, retrouvé quand la largeur manque. */
.arc.rangee{display:grid;grid-auto-flow:column;grid-auto-columns:minmax(0,1fr);
  position:relative;margin:0;--fond-frise:var(--paper)}
/* UN CHEMIN, ET NON UN FILET — 09/09/2026, second tour. Verdict du Fondateur sur la frise en
   ligne : « je veux une frise plus jolie visuellement qu'un simple trait avec un peu de couleur ».

   Le trait unique de un pixel devient un chemin de trois, EN SEGMENTS : un par palier, reliant le
   précédent au sien. Il se peint en vert jusqu'où l'on est passé, et reste gris devant. Le
   parcours se lit alors sans lire un mot.

   CE N'EST TOUJOURS PAS UNE MESURE, et c'est ce qui permet de l'embellir sans rouvrir l'échec
   n°2 du `18_` : chaque segment fait la largeur d'une colonne, quel que soit l'écart de jours
   qu'il couvre. Deux paliers distants d'un jour ont le même segment que deux paliers distants de
   sept. Le chemin dit un ORDRE ; la jauge, en dessous, dit la durée, et elle seule.

   Le segment part à `left:-50%` — du centre de la colonne précédente au centre de la sienne —
   d'où l'absence de segment sur le premier palier, qui n'a rien à sa gauche. */
/* Pas de `background` sur `.arc-l`, et ce n'est pas un oubli : `.arc-l.choisie` peint le palier
   que le script a retenu, et une couleur posée ici l'emporterait sur lui par spécificité. Le fond
   du bouton est déjà neutralisé par `button.arc-l` plus bas. */
/* ⚠ `display:flex` ET NON `block` — 09/09/2026, troisième passage. C'est la cause du décalage
   que le Fondateur voit entre le repère et la ligne, et elle n'était pas dans la ligne.

   La frise du binôme est faite de `<button>`. Un bouton n'empile pas ses enfants comme un bloc
   ordinaire : son contenu vit dans une boîte anonyme que le navigateur CENTRE verticalement.
   Le repère ne partait donc pas du haut du palier, comme le calcul de la ligne le suppose, mais
   du milieu — et il descendait d'autant que le palier était haut. D'où un décalage variable
   d'un palier à l'autre : un libellé sur deux lignes déplaçait son repère, pas celui du voisin.

   Déclarer `display:flex` supprime cette boîte anonyme : les enfants redeviennent des enfants,
   posés du haut vers le bas. Le repère retrouve alors exactement la position que la ligne
   calcule — retrait du haut, puis la moitié d'un repère de quinze. */
.arc.rangee .arc-l{display:flex;flex-direction:column;align-items:center;
  position:relative;z-index:1;text-align:center;
  padding:var(--space-2);border-bottom:0;border-radius:var(--radius-champ);text-decoration:none}
/* 5 px et non 3 : « épaissir la ligne de la frise » (09/09/2026). À trois pixels, le chemin se
   lisait comme un filet de tableau ; à cinq, il se lit comme un chemin. Le décalage du haut suit
   l'épaisseur, sinon il ne passe plus au centre des repères. */
.arc.rangee .arc-l::before{content:"";position:absolute;z-index:0;
  top:calc(var(--space-2) + 5px);left:-50%;width:100%;height:5px;border-radius:3px;
  background:var(--line)}
.arc.rangee .arc-l:first-child::before{display:none}
.arc.rangee .arc-l.franchie::before{background:var(--vert-plein)}
.arc.rangee .arc-l.action::before{background:var(--laiton-filet)}
/* ⚠ `display:block`, ET C'EST LA CORRECTION D'UN VRAI DÉFAUT — 09/09/2026.

   Le repère est un `<span>`, donc INLINE par défaut. Dans la pile verticale il ne s'en apercevait
   pas : il y est enfant d'une grille, donc bloqué d'office par la mise en page. En rangée, le
   palier passe en `display:block` — et le repère redevient inline, où `width`, `height` et
   `margin:0 auto` ne veulent plus rien dire. Un span vide et inline n'occupe rien : il ne restait
   qu'un filet vertical, arrondi par le `border-radius` en une olive.

   Le Fondateur l'a vu sur trois écrans à la fois : « revoir les points/puces d'étape partout, sur
   toutes les pages où il y a une frise ». C'était un seul défaut, à un seul endroit.

   Il grossit au passage de 11 à 15 px : c'est lui qu'on regarde, et il portait jusqu'ici la
   taille qu'il avait dans une pile, où il n'a qu'à ponctuer une ligne de texte. */
/* LE REPÈRE COUVRE LA LIGNE, IL NE LA MASQUE PLUS — 09/09/2026, second tour.
   Verdict du Fondateur : « le cercle et le point débordent de la ligne, ce n'est pas le seul
   endroit, à corriger partout ».

   Il avait raison, et la cause était un halo. Chaque repère portait une ombre portée de la
   couleur du fond, pour trouer la ligne derrière lui : quinze pixels de repère plus deux fois
   cinq de halo faisaient un trou blanc de vingt-cinq, dans lequel le repère flottait sans
   toucher ses voisins. Les deux états qui ajoutaient un anneau de plus — le vert de « franchie »,
   le laiton de « à vous de jouer » — élargissaient encore le trou, chacun d'une largeur
   différente : d'où l'impression de débordement, et son irrégularité d'un palier à l'autre.

   PLUS DE MASQUE DU TOUT. Le repère fait quinze pixels, la ligne cinq : il la couvre entièrement
   par sa seule opacité, `z-index` faisant le reste. Le chemin devient continu, et les quatre
   états gardent exactement le même encombrement — c'est ce qui les rend comparables d'un coup
   d'œil, ce qu'un halo par état empêchait.

   Le halo du laiton survit, seul, parce qu'il ne masque rien : il DIT quelque chose, « à vous de
   jouer », et il est opaque, donc il couvre la ligne comme le repère. */
.arc.rangee .arc-l .rep{display:block;position:relative;z-index:1;box-sizing:border-box;
  width:15px;height:15px;margin:0 auto var(--space-3);background:var(--fond-frise);box-shadow:none}
.arc.rangee .arc-l.franchie .rep{background:var(--vert-plein);box-shadow:none}
/* Le halo du laiton disparaît à son tour : « j'ai toujours le problème avec l'ombre ». Il était
   le dernier, et il ajoutait trois pixels à un seul des quatre états — donc un repère plus large
   que ses voisins, qui semblait déborder de la ligne.

   L'état garde une forme à lui, sans rien ajouter à son encombrement : une ombre INTÉRIEURE, qui
   par définition ne sort jamais de la boîte. « À vous de jouer » se lit comme un anneau laiton
   plein, « ouverte » comme un cercle fin et neutre. Deux formes, deux couleurs, même diamètre. */
.arc.rangee .arc-l.action .rep{background:var(--laiton);
  box-shadow:inset 0 0 0 3.5px var(--fond-frise)}
.arc.rangee .arc-l.ouverte .rep{border-width:2.5px}
.arc.rangee .arc-l.pasencore .rep{border-width:2px}

/* LE TITRE ET SON ÉTAT NE SE RESSEMBLENT PLUS — 09/09/2026 : « les titres des phases en gras
   dans une couleur différente que le statut, qui doit être dans une police plus petite ».

   Le titre est en serif, la famille des titres du produit ; l'état est en mono, la famille des
   faits datés. On les distingue avant même de les lire.

   `width:100%` : enfant de flex, le libellé ne prendrait que sa largeur propre, et un détail long
   déborderait de sa colonne au lieu d'y revenir à la ligne. */
.arc.rangee .arc-l .nom{display:block;width:100%;font-family:var(--serif);font-size:var(--text-2);
  font-weight:600;color:var(--titre);line-height:1.25}
.arc.rangee .arc-l.pasencore .nom{color:var(--ink-soft)}
/* La rangée ne redit plus la VOIX de l'état — famille, taille, italique, couleur sont déclarées
   une seule fois, sur `.arc-l .quoi`, et valent pour toutes les frises (09/09, troisième
   passage). Ne reste ici que sa MISE EN PLACE : sous le titre, centrée, et libre de revenir à la
   ligne dans une colonne étroite. */
.arc.rangee .arc-l .quoi{margin-top:var(--space-1);text-align:center;white-space:normal;
  max-width:none}
.arc.rangee .arc-l.action .quoi{color:var(--laiton-texte);font-weight:500}
/* Un palier ouvert est une PORTE (09/09/2026). Un palier pas encore ouvert n'en est pas une, et
   ne se peint donc pas comme un lien : il n'a ni survol, ni curseur, ni cible de clavier. */
a.arc-l{cursor:pointer}
a.arc-l:hover .nom{color:var(--titre)}
a.arc-l:hover .rep{transform:scale(1.12)}
a.arc-l:focus-visible{outline:2px solid var(--focus);outline-offset:3px;border-radius:var(--radius-champ)}

@media(max-width:719px){
  .arc.rangee{grid-auto-flow:row;grid-auto-columns:auto}
  .arc.rangee .arc-l{display:grid;grid-template-columns:17px 1fr;gap:var(--space-3);
    align-items:baseline;text-align:left;padding:var(--space-3) 0;
    border-bottom:1px solid var(--line-soft)}
  .arc.rangee .arc-l:last-child{border-bottom:0}
  /* Le chemin se redresse avec la pile : le segment relie deux repères empilés, donc à la
     verticale, sur la gouttière de gauche. Il dit la même chose dans l'autre sens. */
  .arc.rangee .arc-l::before{top:auto;bottom:100%;left:8px;width:3px;height:var(--space-3)}
  .arc.rangee .arc-l .rep{margin:var(--space-1) 0 0;box-shadow:none}
  .arc.rangee .arc-l.franchie .rep{box-shadow:none}
  /* L'anneau intérieur suit en pile : une ombre extérieure y déborderait sur le chemin vertical
     exactement comme elle débordait sur l'horizontal. */
  .arc.rangee .arc-l.action .rep{box-shadow:inset 0 0 0 3.5px var(--fond-frise)}
  .arc.rangee .arc-l .quoi{text-align:left}
}

/* --- LA FRISE DE LA SAISON (09/09/2026) -----------------------------------------------------

Elle a été, du 08 au 09/09, un cartouche VERTICAL en tête du rail. Verdict du Fondateur devant
l'écran en ligne : « j'ai du mal avec la navigation sur cette page : la frise avec la jauge était
plus visuelle et plus claire pour moi. Peut-on combiner les deux approches ? ». Celle-ci les
combine, et c'est le format 5 qu'il a retenu sur maquettes.

TROIS OBJETS, DANS CET ORDRE, ET AUCUN NE DOUBLE UN AUTRE :
  1. la rangée des six paliers (`.arc.rangee`), qui dit ce qui est ouvert et où cela mène ;
  2. la jauge, SEULE mesure proportionnelle de la page, qui ne mesure que le jour de la saison ;
  3. le repère « vous êtes ici », posé dessus.

ELLE EST PLEINE LARGEUR, AU-DESSUS DU RAIL ET NON DEDANS. Une rangée de six n'existe pas dans une
colonne de 216 px. Et c'est son rang exact : la frise vaut pour le lieu entier, le rail ne fait
que lister ses portes.

DEUX FORMES, UNE SEULE RÈGLE POUR CHOISIR — inchangée depuis le 08/09. Elle se replie sur la
famille « Votre dossier » (Ma réservation, Mon contrat, Quitter la saison) et nulle part ailleurs :
là, on ne vit pas sa saison, on fait de la paperasse. L'ancre ne disparaît jamais pour autant,
« jour N sur 50 » reste dans la barre du haut, sur tous les écrans du produit. */

/* `.frise-binome` est la même carte, pour l'arc d'UNE conversation : quatre états, deux couleurs,
   le même trait, la même rangée. La différence n'est pas de forme mais de sujet — l'une dit ce
   qui est ouvert pour tout le groupe, l'autre ce qui vous est demandé à vous, dans ce binôme-ci.
   C'est pour cela que l'une porte le laiton et l'autre jamais (voir `arc.arc_de_la_saison`).
   Elles ne paraissent d'ailleurs pas ensemble en entier : sur l'écran d'échange, celle de la
   saison se replie, et la carte pleine est celle du binôme. */
.frise-saison,.frise-binome{border:1px solid var(--line);background:var(--paper);
  border-radius:var(--radius-carte);padding:var(--space-4) var(--space-5) var(--space-4);margin:0 0 var(--space-5);
  box-shadow:var(--shadow-1)}

/* --- L'ARC DE LA SAISON, DERRIÈRE SA BANNIÈRE — 17/09/2026 ------------------------------------
   Demande du Fondateur : « recustomise l'arc de votre saison partout où elle est présente et
   cache-la derrière une bannière ».

   FERMÉE, ELLE COÛTE UNE LIGNE et répond déjà à la question : quel jour, et quel palier vient.
   La frise entière est la réponse longue, et elle attend qu'on la demande. Le filet de laiton à
   gauche est ce qui la distingue d'un repli ordinaire : c'est le temps de la saison, pas une
   explication qu'on déplie.

   Elle perd son ombre et son fond de carte tant qu'elle est fermée : une carte pleine pour une
   ligne de texte redonnerait à l'arc la place qu'on vient justement de lui retirer. */
details.frise-saison{padding:0;box-shadow:none;background:var(--laiton-pale);
  border-color:var(--laiton-filet);border-left:3px solid var(--laiton);overflow:hidden}
details.frise-saison>summary{
  list-style:none;cursor:pointer;display:flex;align-items:center;gap:var(--space-3);
  padding:var(--space-3) var(--space-4);min-height:44px;
}
details.frise-saison>summary::-webkit-details-marker{display:none}
details.frise-saison>summary:hover{background:var(--sable-2)}
.fa-mots{flex:1 1 auto;min-width:0;display:flex;flex-wrap:wrap;align-items:baseline;gap:2px var(--space-3)}
.fa-titre{font-family:var(--serif);font-size:var(--text-3);font-weight:600;color:var(--titre)}
/* La voix des indications : voir `.dit` plus bas dans cette feuille. */
.fa-dit{color:var(--laiton-texte)}
details.frise-saison>.dedans{padding:0 var(--space-5) var(--space-4);background:var(--paper);
  border-top:1px solid var(--laiton-filet)}
details.frise-saison[open]>.dedans{padding-top:var(--space-4)}

/* LA RANGÉE DEVIENT UN FIL. Six pastilles alignées sans rien entre elles se lisaient comme une
   liste à puces ; un arc est une CONTINUITÉ, et c'est le trait qui la dit. Il court derrière les
   repères, du premier au dernier, et s'arrête au dernier — un fil qui dépasse promettrait un
   palier de plus. */
details.frise-saison .arc{position:relative}
details.frise-saison .arc::before{
  content:"";position:absolute;left:6px;top:18px;bottom:20px;width:2px;
  background:linear-gradient(180deg,var(--vert-plein),var(--laiton) 55%,var(--line-soft));
  border-radius:var(--radius-pilule);
}
details.frise-saison .arc-l{position:relative;border-bottom:0;padding:var(--space-2) 0}
/* Le repère se pose SUR le fil, donc il lui faut un fond : sans cela le trait le traverserait. */
details.frise-saison .arc-l .rep{box-shadow:0 0 0 4px var(--paper)}
details.frise-saison .arc-l.action .rep{box-shadow:0 0 0 4px var(--paper),0 0 0 7px var(--laiton-pale)}

/* 09/09/2026 — « titre à mettre en gras pour plus de visibilité ». Il était en mono, petit,
   éteint et en capitales espacées : c'est-à-dire habillé comme une étiquette, alors qu'il nomme
   le bloc le plus important de l'écran. Il prend la forme des titres du produit — serif, plein,
   couleur de titre. */
/* 09/09/2026, second passage : « revoir, harmoniser les polices de L'arc de votre saison ».
   Le titre et les noms de paliers étaient tous deux en serif à 600, à huit centièmes de rem
   l'un de l'autre : deux choses au même rang, dans un bloc qui en a trois. Le titre monte, les
   paliers descendent, et l'écart se voit.

   DEUX FAMILLES DANS TOUT LE BLOC, ET DEUX SEULEMENT — c'est cela, l'harmonie demandée. Le serif
   pour ce qui NOMME (le titre, les paliers), le mono pour ce qui DATE (l'état d'un palier, les
   bornes de la jauge). Aucun troisième registre. */
.frise-tete{margin:0 0 var(--space-5);font-family:var(--serif);font-size:var(--text-5);font-weight:600;
  color:var(--titre);letter-spacing:-.01em;line-height:var(--leading-titre)}

.jauge-saison{margin:var(--space-5) 0 0}
/* Le retrait du bas loge le marcheur, qui est posé SOUS la piste : sans lui, il chevaucherait la
   ligne des bornes. C'est la seule dimension de ce bloc qui dépende d'un glyphe. */
.jauge-saison .piste{position:relative;height:6px;border-radius:var(--radius-pilule);background:var(--line-soft);
  margin:0 0 var(--space-7)}
.jauge-saison .piste i{display:block;height:100%;border-radius:var(--radius-pilule);
  background:linear-gradient(90deg,var(--vert-plein-2),var(--vert-plein))}
/* LE REPÈRE « VOUS ÊTES ICI » — arbitré par le Fondateur le 09/09/2026 : le vrai emoji, tourné
   vers la droite. Le marcheur est retourné par `scaleX(-1)` plutôt que par la séquence Unicode
   🚶‍➡️, qui n'est dessinée que sur les systèmes récents et rend deux glyphes ailleurs.

   IL EST POSÉ SOUS LA PISTE ET NON DESSUS. Un emoji fait sa propre hauteur, qu'on ne contrôle
   pas : centré sur un trait de six pixels, il l'aurait recouvert. Sous la piste, il l'accompagne,
   et la jauge reste lisible d'un bout à l'autre.

   Aucune couleur ne lui est donnée, et c'est volontaire : le laiton dirait « à vous de jouer »
   et le vert « franchie ». Il ne dit ni l'un ni l'autre, il dit « vous ». */
.jauge-saison .ici{position:absolute;top:100%;margin-left:-11px;line-height:1;
  pointer-events:none}
.jauge-saison .marcheur{display:block;font-size:var(--text-5);line-height:1;
  transform:scaleX(-1);
  /* Une pile de fontes explicite : sans elle, un système sans emoji couleur retomberait sur un
     rectangle vide, et le repère disparaîtrait sans rien dire. */
  font-family:"Apple Color Emoji","Segoe UI Emoji","Noto Color Emoji","Twemoji Mozilla",sans-serif}
.jauge-saison .bornes{display:flex;justify-content:space-between;align-items:baseline;
  gap:var(--space-3);margin:0;font-family:var(--mono);font-size:var(--text-1);color:var(--ink-mute)}
.jauge-saison .bornes .ou{color:var(--ink);font-variant-numeric:tabular-nums}
.jauge-saison .bornes .ou b{font-weight:500}

/* --- LA LÉGENDE DES QUATRE ÉTATS (09/09/2026) --------------------------------------------------
   Demandée par le Fondateur : « ajouter une légende pour expliquer les codes couleur ».

   Elle n'existait qu'ailleurs — dans l'artefact de décision, et dans la tête de qui a écrit le
   code. Un membre, lui, devait deviner qu'un rond creux à trait plein ne veut pas dire la même
   chose qu'un rond creux à trait pointillé. Rien dans l'écran ne le lui disait.

   ELLE RÉEMPLOIE LES REPÈRES EUX-MÊMES (`.rep` et ses quatre états), et ne les redessine pas :
   une légende peinte à la main divergerait de ce qu'elle explique au premier changement de
   palette, ce qui est pire que pas de légende du tout.

   La phrase sur la jauge y est parce que c'est la question suivante : si la couleur dit l'état,
   que dit la barre ? Elle ne dit qu'une chose, le jour de la saison, et jamais une étape. */
.legende-arc{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-2) var(--space-5);
  margin:var(--space-5) 0 0;padding:var(--space-4) 0 0;border-top:1px solid var(--line-soft)}
.legende-arc .cle{display:inline-flex;align-items:center;gap:var(--space-2);
  font-size:var(--text-2);color:var(--ink-soft);white-space:nowrap}
/* `border-radius` est répété ici : hors d'un `.arc-l`, le repère ne reçoit aucune de ses
   dimensions de base, et un carré expliquerait mal un rond. */
.legende-arc .cle .rep{flex:0 0 auto;width:12px;height:12px;border-radius:50%;margin:0}
.legende-arc .cle.franchie .rep{background:var(--vert-plein)}
.legende-arc .cle.action .rep{background:var(--laiton);box-shadow:0 0 0 3px var(--laiton-pale)}
.legende-arc .cle.ouverte .rep{border:2.5px solid var(--ink-soft)}
.legende-arc .cle.pasencore .rep{border:2px dashed var(--ink-mute)}
.legende-arc .note{flex:1 1 100%;margin:var(--space-2) 0 0;font-family:var(--mono);font-size:var(--text-1);
  color:var(--ink-mute)}

/* Le mode d'emploi de la frise du binôme (09/09/2026) : six outils ont quitté l'index des
   ressources parce qu'un clic sur leur palier les ouvre déjà. Sans cette phrase, le raccourci
   existerait sans que personne ne l'apprenne. Discrète, centrée sous la rangée, et sans
   encadré : c'est une indication, pas un avertissement. */
/* `text-wrap:balance` — 09/09/2026 : « un décalage, un semblant de renvoi à la ligne ». Centrée
   et libre de couper où elle veut, la phrase laissait une première ligne pleine et une seconde de
   trois mots, ce qui se lit comme une coupure accidentelle. Équilibrée, elle répartit ses mots
   entre ses lignes. La largeur maximale la borne avant que la fenêtre ne s'en charge. */
.frise-mode-emploi{margin:var(--space-4) auto 0;padding-top:var(--space-3);max-width:54ch;
  border-top:1px solid var(--line-soft);text-align:center;font-size:var(--text-2);
  color:var(--ink-mute);text-wrap:balance}

/* La forme repliée : le prochain palier en une phrase, et le retour vers l'index qui porte la
   frise entière — pas un quatorzième écran inventé pour l'occasion. */
.frise-saison.mince{display:flex;align-items:baseline;justify-content:space-between;
  gap:var(--space-3);flex-wrap:wrap;padding:var(--space-3) var(--space-4);box-shadow:none}
.frise-saison.mince .suite{font-size:var(--text-2);color:var(--ink-soft)}
.frise-saison .voir{font-family:var(--mono);font-size:var(--text-1);color:var(--laiton-texte);
  text-decoration:none;border-bottom:1px solid var(--laiton-filet);white-space:nowrap}
.frise-saison .voir:hover{color:var(--ink)}

@media(max-width:719px){
  .frise-saison,.frise-binome{padding:var(--space-3) var(--space-4)}
  .jauge-saison{margin-top:var(--space-4)}
  .jauge-saison .bornes{flex-wrap:wrap}
}

/* --- Jauges de cohorte ---------------------------------------------------------------------- */
.jauge-l{display:flex;flex-direction:column;gap:var(--space-2);margin:0 0 var(--space-4)}
.jauge-l .ligne{display:flex;align-items:baseline;gap:var(--space-3);font-size:var(--text-2)}
.jauge-l .ligne b{margin-left:auto;font-family:var(--mono);font-size:var(--text-1);font-weight:500}
.jauge-l .piste{height:7px;border-radius:var(--radius-pilule);background:var(--gr-100);overflow:hidden}
.jauge-l .piste i{display:block;height:100%;border-radius:var(--radius-pilule);background:var(--gr-600);
  transition:width .8s var(--ease)}
.jauge-l .piste i.plein{background:var(--laiton)}
:where(body.op) .jauge-l{gap:6px;margin:0 0 14px}
:where(body.op) .jauge-l .ligne{gap:10px;font-size:var(--op-t2)}
:where(body.op) .jauge-l .ligne b{font-size:var(--op-t2)}

/* --- Rail latéral d'un écran (échange, socle, formation) ------------------------------------

Une colonne qui accompagne le travail sans le disputer : où l'on en est, ce qui reste ouvert.
Elle passe sous le contenu au pouce, jamais en tiroir caché. */

.duo{display:grid;gap:22px;align-items:start}
@media(min-width:900px){
  .duo{grid-template-columns:1fr 320px}
  .duo.volet{grid-template-columns:1fr 360px}
}
.rail-bloc{background:var(--paper);border:1px solid var(--line);border-radius:var(--radius-carte);
  padding:var(--space-4) var(--space-4);margin:0 0 var(--space-4);flex-shrink:0}
.rail-bloc:last-child{margin-bottom:0}
.rail-bloc>.kick{margin-bottom:var(--space-2)}
.rail-bloc p{font-size:var(--text-2);margin:0 0 var(--space-2)}
.rail-bloc p:last-child{margin-bottom:0}
.rail-bloc.appel{background:var(--vert-50);border-color:var(--vert-100)}
.rail-bloc.appel>.kick{color:var(--accent)}
body.op .rail-bloc{border-color:var(--gr-100);border-radius:var(--r-sm)}

/* Une liste d'états : fait, en cours, pas encore. Le pastillage dit lequel sans mot de plus. */
.etats{display:flex;flex-direction:column;gap:9px;margin:12px 0 0;list-style:none;padding:0}
.etats li{display:flex;align-items:center;gap:10px;font-size:var(--op-t2)}
.etats li::before{content:"";width:9px;height:9px;border-radius:50%;flex:0 0 auto;
  background:var(--vert-700)}
.etats li.attente{color:var(--ink-soft)}
.etats li.attente::before{background:none;border:1.5px solid var(--laiton)}
.etats li.plustard{color:var(--ink-mute)}
.etats li.plustard::before{background:none;border:1.5px dashed var(--ink-mute)}

/* Un panneau replié : un titre, un état à droite. Six d'entre eux tiennent dans la hauteur d'un
   écran là où six cartes dépliées en demandaient trois.

   06/09/2026 — `overflow:hidden` datait d'avant que `.echange` n'ait une hauteur bornée sur grand
   écran (voir plus bas, @media(min-width:1200px)) : anodin alors. Devenu enfant flex de
   `.rail-echange` (overflow:auto) sous une hauteur désormais contrainte, ce panneau se faisait
   comprimer par flexbox bien en dessous de la hauteur réelle de son contenu — huit `<details>`,
   dont un ouvert par défaut — et `overflow:hidden` coupait l'excédent SANS jamais faire remonter
   de barre de défilement à `.rail-echange` : une troncature nette, invisible en dessous de
   960px où `.echange` repasse en `overflow:visible` sans hauteur fixée. `flex-shrink:0`, ici et
   sur `.rail-bloc`, empêche les deux de se faire comprimer et reporte tout excédent sur le
   défilement déjà fonctionnel de `.rail-echange`. */
.panneaux{border:1px solid var(--line);border-radius:var(--radius-carte);overflow:hidden;background:var(--paper);
  flex-shrink:0}
.panneaux details{border-bottom:1px solid var(--line-soft)}
.panneaux details:last-child{border-bottom:none}
.panneaux summary{padding:var(--space-4) var(--space-4);display:flex;align-items:center;gap:var(--space-3);cursor:pointer;
  font-family:var(--serif);font-size:var(--text-3);list-style:none;
  transition:background .16s ease}
.panneaux summary::-webkit-details-marker{display:none}
.panneaux summary:hover{background:var(--sable-2)}
.panneaux summary>span:first-child{flex:1 1 auto;min-width:0}
.panneaux summary .etat{margin-left:auto;font-family:var(--sans);font-size:var(--text-1);
  color:var(--ink-soft);font-weight:400;text-align:right;flex:0 1 auto;min-width:0}
.panneaux summary::after{content:"+";color:var(--ink-mute);font-size:var(--text-3);width:12px;
  text-align:center;transition:transform .25s var(--ease)}
.panneaux details[open]>summary::after{transform:rotate(45deg)}
.panneaux .corps{padding:2px var(--space-4) var(--space-4);font-size:var(--text-2)}
.panneaux .corps p{font-size:var(--text-2)}

/* --- Les ressources de l'échange — LOT F, tour 5 (08/09/2026) -------------------------------
   Les douze outils ne sont plus des accordéons dans une colonne : un index (à gauche, 216px sur
   grand écran) et un panneau de lecture qui montre UN outil à la fois. `.groupe-etape` et
   `.outil` portent `hidden` une fois le script actif ; sans lui, tout s'affiche à la suite.
   Sur téléphone, `.echange.js[data-vue]` choisit entre Messages et Ressources, et
   `.ressources.en-lecture` entre l'index et l'outil lu — voir le bloc @media plus bas. */
.ressources{display:flex;flex-direction:column;min-width:0;min-height:0;background:var(--paper)}
.res-index{background:var(--vert-50);padding:var(--space-4) var(--space-3) var(--space-4)}
.res-kick{margin:0 var(--space-2) var(--space-3);font-family:var(--mono);font-size:var(--text-1);letter-spacing:.14em;
  text-transform:uppercase;color:var(--accent)}
.res-liste{display:flex;flex-direction:column}
.res-groupe{margin:0 0 var(--space-3)}
.res-etape{margin:0 var(--space-2) var(--space-1);font-family:var(--mono);font-size:var(--text-1);letter-spacing:.12em;
  text-transform:uppercase;color:var(--ink-mute)}
.res-groupe.avenir .res-etape::after{content:" · à venir"}
.res-entree{display:flex;flex-direction:column;align-items:flex-start;gap:1px;width:100%;
  padding:var(--space-2) var(--space-3);border:0;border-radius:var(--radius-champ);background:none;text-align:left;cursor:pointer;
  font-family:var(--serif);font-size:var(--text-3);color:var(--ink);transition:background .16s ease}
.res-entree:hover{background:var(--sable-2)}
.res-entree.choisie{background:var(--paper);box-shadow:0 1px 2px rgba(20,26,23,.08)}
.res-entree .etat{font-family:var(--mono);font-size:var(--text-1);letter-spacing:.08em;
  text-transform:uppercase;color:var(--ink-soft)}
.res-entree.choisie .etat{color:var(--accent)}
.res-note{margin:var(--space-2) var(--space-2) 0;font-size:var(--text-1)}
.res-lecture{padding:var(--space-5) var(--space-5) var(--space-6);min-width:0}
.etapes-groupees,.panneaux-permanents{display:block}
.groupe-etape[hidden],.outil[hidden]{display:none}
.res-retour{display:inline-flex;align-items:center;gap:var(--space-2);margin:0 0 var(--space-4);padding:var(--space-2) 0;
  border:0;background:none;cursor:pointer;font-family:var(--mono);font-size:var(--text-1);
  letter-spacing:.12em;text-transform:uppercase;color:var(--accent)}
.res-retour::before{content:"←"}
.res-retour[hidden]{display:none}
.outil-titre{display:flex;align-items:baseline;gap:var(--space-3);flex-wrap:wrap;margin:0 0 var(--space-3);
  font-family:var(--serif);font-size:var(--text-5);font-weight:600;color:var(--titre)}
.outil-titre .etat{font-family:var(--mono);font-size:var(--text-1);letter-spacing:.1em;
  text-transform:uppercase;color:var(--ink-soft);font-weight:400}
.outil .corps{font-size:var(--text-2);max-width:64ch}
.outil .corps p{font-size:var(--text-2)}

/* TROIS COMPOSANTS D'`echange.html` SORTIS DU GABARIT — 16/09/2026 (chantier 1). Ils portaient
   chacun une déclaration en ligne à plusieurs propriétés, que les classes d'espacement seules ne
   pouvaient pas reprendre.

   `.pistes` : les suggestions de questions, groupées par catégorie et repliables. Le texte du
   paragraphe au-dessus les nomme « des pistes, jamais un questionnaire ».
   `.enonce` : la question de la semaine, en serif parce qu'elle se lit comme une phrase adressée
   et non comme un libellé d'interface.
   `.rubrique` : un formulaire par rubrique du projet commun, séparé du précédent par un trait. */
.pistes>summary{cursor:pointer;font-weight:600;font-size:var(--text-2);padding:0}
.pistes>ul{margin:var(--space-2) 0 0;padding-left:var(--space-4);
  color:var(--ink-soft);font-size:var(--text-2)}
.enonce{font-family:var(--serif);font-size:var(--text-3);margin:0 0 var(--space-3)}
.rubrique{border-top:1px solid var(--line-soft);padding-top:var(--space-3);margin-top:var(--space-3)}
/* Le trait entre sections n'existe que sans script, quand tout s'affiche à la suite : avec
   lui, une section masquée compte encore comme voisine et le trait flotterait seul en haut. */
.echange:not(.js) .outil+.outil,.echange:not(.js) .groupe-etape+.groupe-etape,
.echange:not(.js) .panneaux-permanents{margin-top:var(--space-6);padding-top:var(--space-5);border-top:1px solid var(--line-soft)}
.etape-verrouillee{margin:0 0 var(--space-4)}
.copier{display:inline-flex;margin:var(--space-2) 0 0;padding:var(--space-1) 0;border:0;background:none;cursor:pointer;
  font-family:var(--mono);font-size:var(--text-1);letter-spacing:.12em;text-transform:uppercase;
  color:var(--accent);border-bottom:1px solid var(--vert-300);transition:color .16s ease}
.copier:hover{color:var(--titre);border-bottom-color:var(--vert-700)}
li>.copier{display:inline-flex;margin:0 0 0 var(--space-2);vertical-align:baseline}
.copie-note{margin:0;padding:var(--space-2) var(--space-3);border-radius:var(--radius-champ);font-size:var(--text-2);
  background:var(--vert-50);border:1px solid var(--vert-100);color:var(--accent)}
.copie-note[hidden]{display:none}
.vues{display:flex;background:var(--paper);border-bottom:1px solid var(--line)}
.vues .vue{flex:1;padding:var(--space-3) var(--space-3);border:0;background:none;cursor:pointer;
  font-family:var(--mono);font-size:var(--text-1);letter-spacing:.14em;text-transform:uppercase;
  color:var(--ink-soft);border-bottom:2px solid transparent}
.vues .vue[aria-selected="true"]{color:var(--titre);border-bottom-color:var(--vert-700)}
.vues[hidden]{display:none}

/* La frise plate des étapes, conservée pour les parcours courts (création d'accès). */
.phases{display:flex;gap:var(--space-1);margin:0 0 var(--space-5);flex-wrap:wrap}
.phases div{flex:1;min-width:70px;font-size:var(--text-1);padding:var(--space-2) var(--space-1);text-align:center;
  background:var(--paper);border:1px solid var(--line);border-radius:var(--radius-champ);color:var(--ink-soft);
  line-height:1.3;transition:background .3s var(--ease),color .3s var(--ease)}
.phases div.on{background:var(--vert-plein);color:#fff;border-color:var(--vert-plein);font-weight:700}
.phases div.done{background:var(--vert-50);color:var(--accent);border-color:var(--vert-100)}

/* =============================================================================================
   MES ACCÈS — l'écran où l'on reprend la main

   C'était onze cartes identiques dans une grille. Toutes du même poids, donc aucune ne se
   trouvait : « Discrétion » et « Vos contraintes » se ressemblaient trait pour trait alors que
   l'une protège et l'autre décrit.

   Trois groupes, et deux cartes qui sortent du rang : la discrétion en vert inversé, parce
   qu'elle est ce que le produit tient de plus engageant ; la sortie cerclée de rouge, parce que
   §17.4 impose que partir soit aussi visible qu'entrer.
   ============================================================================================= */

/* =============================================================================================
   LE HALL — refondu le 17/09/2026

   Il portait quinze vignettes de cent pixels au même rang : huit étapes de dossier, neuf cartes
   de saison, trois de préparation. Un mur de portes équivalentes ne se lit pas, il se balaie —
   c'est la « masse d'information » que le Fondateur a nommée deux fois.

   Il répond maintenant à une seule question, et dans cet ordre : que dois-je faire maintenant,
   qu'est-ce qui a bougé, où en est mon dossier, et pour finir l'index, replié.
   ============================================================================================= */

/* --- LE HAUT DU HALL : UNE PHOTOGRAPHIE, PUIS UNE VIGNETTE ------------------------------------
   J'avais remplacé la photographie par un bandeau dessiné. Le Fondateur la veut de nouveau et
   veut garder les dessins : « réintègre les photos initiales (la tasse de café, le thé) ». Ils ne
   se disputent plus la même place parce qu'ils ne font pas le même travail — la photographie pose
   une ATMOSPHÈRE, le dessin dit DE QUOI PARLE l'écran.

   Les trois dessins concernés ont donc été RECOMPOSÉS au format des vignettes (200x150) : réduite
   à 72 px avec `slice`, une composition en 400x150 n'aurait montré qu'un quart d'elle-même, pris
   au milieu. */
.hall-tete{margin:0 0 var(--space-5)}
.hall-mots,.lieu-tete{display:flex;align-items:flex-start;gap:var(--space-4)}
.hall-mots>div,.hall-mots>h1,.lieu-tete>h1{flex:1 1 auto;min-width:0}
.hall-mots h1{margin:0 0 var(--space-2)}
.hall-jour{margin:0 0 var(--space-2)}
.hall-jour b{color:var(--titre)}
.hall-bande{
  display:block;height:6px;border-radius:var(--radius-pilule);
  background:var(--line-soft);overflow:hidden;
}
.hall-bande>i{
  display:block;height:100%;border-radius:var(--radius-pilule);
  background:linear-gradient(90deg,var(--terre) 0%,var(--abricot) 52%,var(--safran) 100%);
}

/* LA PROCHAINE CHOSE, ET ELLE EST SEULE. Grande, pressable en entier, et la seule de cet écran à
   porter une couleur pleine : si deux blocs criaient, aucun ne serait entendu. */
.hall-suite{
  display:grid;gap:4px;margin:0 0 var(--space-6);padding:var(--space-5);
  border-radius:var(--radius-grand);text-decoration:none;
  /* `--vert-900` ne bascule pas avec le thème : cette surface est sombre le jour comme la nuit.
     Ses couleurs de texte ne doivent donc PAS être des jetons qui basculent — `--sable` passe de
     crème à vert très sombre à la nuit tombée, et le bloc deviendrait illisible sur lui-même.
     `--sur-sombre` et `--laiton-2` sont faits pour ces surfaces-là, et `.box.promesse` les
     emploie déjà de la même façon. */
  background:var(--vert-900);color:var(--sur-sombre);
  box-shadow:var(--shadow-2);
  transition:transform .16s ease,box-shadow .16s ease;
}
a.hall-suite:hover{transform:translateY(-2px);box-shadow:var(--shadow-2),0 14px 30px -18px rgba(0,0,0,.4)}
.hs-quoi{
  font-family:var(--mono);font-size:var(--text-1);letter-spacing:.09em;text-transform:uppercase;
  color:var(--laiton-2);
}
.hs-titre{font-family:var(--serif);font-size:var(--text-5);line-height:1.18;font-weight:600}
.hs-dit{color:var(--sur-sombre);opacity:.82}
.hs-aller{
  justify-self:start;margin-top:var(--space-3);padding:9px 18px;min-height:40px;
  display:inline-flex;align-items:center;
  border-radius:var(--radius-pilule);background:var(--laiton-2);color:var(--vert-950);
  font-weight:600;font-size:var(--text-2);
}
/* Rien à faire est une réponse, pas un vide à meubler : elle se dit posément, sans couleur. */
.hall-suite-calme{
  background:var(--paper);color:var(--ink);border:1px solid var(--line-soft);box-shadow:none;
}
.hall-suite-calme .hs-quoi{color:var(--ink-mute)}
.hall-suite-calme .hs-titre{color:var(--titre)}
.hall-suite-calme .hs-dit{color:var(--ink-soft);opacity:1}

/* L'INDEX D'UN LIEU : son bandeau, et la ligne qui dit ce qui vient. Elle reprend la forme du
   hall en plus discret — un index n'a pas à crier ce qu'un accueil annonce. */
.lieu-tete{margin:0 0 var(--space-5)}
.lieu-tete h1{margin:0}
.lieu-suite{
  display:grid;gap:2px;margin:0 0 var(--space-5);padding:var(--space-4) var(--space-5);
  border:1px solid var(--laiton-filet);border-left:4px solid var(--laiton);
  border-radius:var(--radius-carte);background:var(--laiton-pale);
  text-decoration:none;color:var(--ink);
}
.lieu-suite:hover{border-color:var(--laiton);background:var(--sable-2)}
.ls-quoi{
  font-family:var(--mono);font-size:var(--text-1);letter-spacing:.09em;text-transform:uppercase;
  color:var(--laiton-texte);
}
.ls-titre{font-family:var(--serif);font-size:var(--text-4);font-weight:600;color:var(--titre)}
.ls-dit{color:var(--ink-soft)}

/* --- LES DEUX CADRANS DU TABLEAU DE BORD — 17/09/2026 -----------------------------------------
   Ils remplacent trois sections qui listaient douze portes vers des écrans que les quatre onglets
   du bas desservent déjà. Un cadran porte un NOMBRE, une jauge, deux ou trois faits, et une seule
   porte — celle du geste qui presse.

   Côte à côte dès 640 px, empilés en dessous : deux colonnes de 150 px ne montrent ni un nombre
   ni une jauge, elles montrent deux colonnes. */
.cadrans{display:grid;gap:var(--space-4);margin:0 0 var(--space-6)}
@media (min-width:640px){.cadrans{grid-template-columns:1fr 1fr}}
.cadran{
  padding:var(--space-5);border:1px solid var(--line);border-radius:var(--radius-carte);
  background:var(--paper);box-shadow:var(--shadow-1);
  display:flex;flex-direction:column;gap:var(--space-3);
}
.cadran>h2{
  display:flex;align-items:center;gap:var(--space-3);
  margin:0;font-size:var(--text-2);font-family:var(--sans);font-weight:700;
  text-transform:uppercase;letter-spacing:.09em;color:var(--ink-mute);
}
.cadran>h2 .pi{width:18px;height:18px}
/* LE NOMBRE EST CE QU'ON VIENT LIRE : il se voit d'un coup d'œil, et son unité se range derrière
   lui en petit. « 20 » et « e jour sur 50 » ne sont pas au même rang. */
.cadran-gros{
  margin:0;font-family:var(--serif);font-size:clamp(34px,8vw,44px);font-weight:600;
  line-height:1;color:var(--titre);display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;
}
.cadran-sur{font-family:var(--sans);font-size:var(--text-2);font-weight:400;color:var(--ink-soft);
  letter-spacing:0;text-transform:none}
.cadran-faits{list-style:none;margin:0;padding:0;display:grid;gap:4px}
.cadran-faits li{color:var(--ink-soft)}
.cadran-faits b{color:var(--titre);font-weight:600}
/* CE QUI PRESSE PORTE LE LAITON, et rien d'autre sur cet écran ne le porte en texte : un délai
   qui court est la seule chose du tableau de bord qui change tout seul. */
.cadran-faits .presse b{color:var(--laiton-texte)}
.cadran-porte{
  align-self:flex-start;margin-top:auto;padding:9px 18px;min-height:40px;
  display:inline-flex;align-items:center;
  border-radius:var(--radius-pilule);background:var(--vert-plein);color:#fff;
  font-weight:600;font-size:var(--text-2);text-decoration:none;
}
.cadran-porte:hover{background:var(--vert-plein-2);color:#fff}
.cadran .repli{margin-top:auto}
.hall-ville{margin:0;color:var(--ink-soft)}

/* --- L'ÉCLAIRAGE D'UN MODULE DE PRÉPARATION — 17/09/2026 --------------------------------------
   Une phrase qui apprend quelque chose, en ouverture de module, avec sa source cliquable. Elle
   porte le laiton et le serif : c'est la seule carte du module qui ne demande rien au lecteur, et
   elle doit se distinguer des huit qui lui parlent de lui.

   LA SOURCE EST DANS LA CARTE, jamais en note de bas de page. Une phrase frappante sans
   provenance est un slogan ; c'est la provenance qui en fait un fait. */
.eclairage{
  margin:0 0 var(--space-6);padding:var(--space-5);
  border:1px solid var(--laiton-filet);border-left:4px solid var(--laiton);
  border-radius:var(--radius-carte);background:var(--laiton-pale);
}
.ec-quoi{
  margin:0 0 var(--space-2);font-family:var(--mono);font-size:var(--text-1);
  letter-spacing:.1em;text-transform:uppercase;color:var(--laiton-texte);
}
.ec-texte{
  margin:0;font-family:var(--serif);font-size:var(--text-4);line-height:1.5;color:var(--titre);
  text-wrap:pretty;
}
.ec-source{
  margin:var(--space-3) 0 0;font-family:var(--sans);font-size:var(--text-2);line-height:1.5;
  color:var(--ink-soft);
}
.ec-source a{color:var(--laiton-texte)}
/* La seule porte du tableau de bord que les quatre onglets du bas ne portent pas : le module de
   préparation en accès libre, tant que l'onglet « Prépa. » n'existe pas. */
.hall-porte{
  display:flex;align-items:center;gap:var(--space-4);margin:0 0 var(--space-6);
  padding:var(--space-4) var(--space-5);
  border:1px solid var(--line);border-radius:var(--radius-carte);background:var(--paper);
  text-decoration:none;color:var(--ink);
}
.hall-porte:hover{border-color:var(--vert-300);background:var(--sable-2)}
.hall-porte b{display:block;color:var(--accent)}
.hall-porte .quoi{display:block;font-family:var(--sans);font-size:var(--text-2);color:var(--ink-soft)}

.hall-bloc{margin:0 0 var(--space-6)}
/* LA PUCE ET SON TITRE SUR UNE SEULE LIGNE — 17/09/2026. `_picto.html` rend un `<svg>` en
   `display:block` : posé dans un `<h2>` sans mise en page, il tombait à la ligne au-dessus du
   mot. Le Fondateur : « mets sur la même ligne les puces et les titres avec un espace suffisant
   qui les sépare ». `--space-3` est cet espace, le même que celui des titres de `.groupe`. */
.hall-bloc>h2{display:flex;align-items:center;gap:var(--space-3);
  font-size:var(--text-3);margin:0 0 var(--space-3)}
.hall-compte{margin:0 0 var(--space-2);color:var(--ink-soft)}
.hall-compte b{font-family:var(--serif);font-size:var(--text-5);color:var(--titre)}
.hall-bloc .repli{margin-top:var(--space-3)}

/* L'INDEX. Des lignes, pas des vignettes. On n'ouvre pas ce repli par hasard : on l'ouvre parce
   qu'on cherche quelque chose de précis, et une liste se parcourt plus vite qu'une grille. */
.hall-index{display:grid}
.hall-index a{
  display:grid;gap:2px;padding:12px 2px;
  border-bottom:1px solid var(--line-soft);text-decoration:none;color:var(--ink);
}
.hall-index a:last-child{border-bottom:0}
.hall-index b{color:var(--accent);font-weight:600}
.hall-index span{color:var(--ink-soft)}
.hall-index a:hover b{text-decoration:underline}

.groupe{margin:0 0 var(--space-6)}
.groupe>h2{display:flex;align-items:center;gap:var(--space-3);font-size:var(--text-3);margin:0 0 var(--space-1)}
.groupe>.mention{margin:0 0 var(--space-4)}

/* --- L'ÉTAT DE LA SAISON, EN TÊTE DU HALL (08/09/2026) --------------------------------------
   Le premier bloc de l'accueil, et le seul qui change d'un jour à l'autre. Il porte le jour de
   la saison et l'état de chaque conversation. Le laiton n'y apparaît que sur une conversation qui
   attend vraiment un geste : c'est le même sens que partout ailleurs, et il ne devait pas se
   diluer sur un écran de hall. */
.etat-saison{display:flex;flex-direction:column;gap:var(--space-4);margin:0 0 var(--space-5);padding:var(--space-4) var(--space-5);
  border:1px solid var(--line);border-radius:var(--radius-carte);background:var(--paper);
  box-shadow:var(--shadow-1)}
.es-jour{display:flex;align-items:baseline;flex-wrap:wrap;gap:var(--space-2) var(--space-3)}
.es-jour .kick{flex:1 0 100%;margin:0}
.es-jour b{font-family:var(--serif);font-size:var(--text-5);font-weight:600;color:var(--titre)}
.es-quand{font-size:var(--text-2);color:var(--ink-soft)}
.es-bande{flex:1 0 100%;height:6px;border-radius:var(--radius-pilule);background:var(--vert-25);
  box-shadow:inset 0 0 0 1px var(--line);overflow:hidden;margin-top:var(--space-1)}
.es-bande i{display:block;height:100%;border-radius:var(--radius-pilule);background:var(--vert-500)}
.es-fils{display:grid;gap:var(--space-2)}
@media(min-width:700px){.es-fils{grid-template-columns:repeat(auto-fit,minmax(240px,1fr))}}
.es-fil{display:flex;flex-direction:column;gap:2px;padding:var(--space-3) var(--space-4);border-radius:var(--radius-champ);
  border:1px solid var(--line-soft);background:var(--sable-2);text-decoration:none;
  transition:border-color .16s ease,background .16s ease}
.es-fil:hover{border-color:var(--vert-300);background:var(--vert-50)}
.es-fil .qui{font-family:var(--serif);font-size:var(--text-3);font-weight:600;color:var(--titre);
  display:flex;align-items:center;gap:0}
.es-fil .quoi{font-size:var(--text-2);color:var(--ink-soft)}
/* 14/09/2026 — une conversation où quelqu'un attend d'être lu se distingue de celles qui
   dorment, sur l'écran d'accueil. Le liseré rouge et le nom en gras : le badge dit combien,
   la ligne dit laquelle, sans qu'on ait à lire le nombre. */
.es-fil.alire{border-color:var(--stop-ligne);background:var(--stop-pale)}
.es-fil.alire .quoi{color:var(--stop);font-weight:600}
.es-fil.agir{border-color:var(--laiton-filet);background:var(--laiton-pale)}
.es-fil.agir .quoi{color:var(--laiton-texte);font-weight:600}

.acces{display:grid;gap:var(--space-4);grid-template-columns:repeat(auto-fit,minmax(258px,1fr))}
.acces>a,.acces>div{background:var(--paper);border:1px solid var(--line);border-radius:var(--radius-carte);
  padding:var(--space-5);display:flex;flex-direction:column;gap:var(--space-3);text-decoration:none;color:inherit;
  min-height:168px;transition:transform .22s var(--ease),box-shadow .22s ease,border-color .2s ease}
.acces>a:hover{transform:translateY(-3px);box-shadow:var(--shadow-2);border-color:var(--vert-300)}
.acces .titre{display:flex;align-items:center;gap:var(--space-3);font-family:var(--serif);font-size:var(--text-3);
  font-weight:600;color:var(--titre)}
.acces .quoi{font-size:var(--text-2);line-height:1.55;color:var(--ink-soft);margin:0}
.acces .aller{margin-top:auto;font-size:var(--text-2);font-weight:600;color:var(--accent);
  display:inline-flex;align-items:center;gap:var(--space-2)}
.acces .aller::after{content:"";width:0;height:0;border-left:5px solid currentColor;
  border-top:4px solid transparent;border-bottom:4px solid transparent;
  transition:transform .2s var(--ease)}
.acces>a:hover .aller::after{transform:translateX(3px)}
/* Sur la notice, la flèche est un vrai lien (14/09/2026 : « plusieurs phrases ressemblent à des
   liens » sans l'être). Même dessin que dans une carte cliquable, et le survol le dit. */
.acces a.aller{text-decoration:none}
.acces a.aller:hover{text-decoration:underline;text-underline-offset:2px}
.acces a.aller:hover::after{transform:translateX(3px)}

.acces>.sombre{background:var(--vert-900);border-color:var(--vert-900);color:var(--sur-sombre)}
.acces>.sombre .titre{color:#FFFDF9}
.acces>.sombre .quoi{color:var(--vert-300)}
.acces>.sombre .aller{color:var(--laiton-2)}
.acces>a.sombre:hover{border-color:var(--laiton);box-shadow:0 20px 44px -22px rgba(12,36,28,.8)}

.acces>.sortie{background:var(--sable-2);border-color:var(--stop-ligne)}
.acces>.sortie .titre{color:var(--stop)}
.acces>.sortie .aller{color:var(--stop)}
.acces>a.sortie:hover{border-color:var(--stop)}

/* =============================================================================================
   LA PORTE — entrée, création, vérification, connexion, accès perdu

   Six écrans qui font tous la même chose : laisser entrer, ou apprendre à entrer. La maquette
   les pose en deux volets. Le volet sombre porte la promesse — huit semaines, un groupe fermé,
   une date connue d'avance — et il ne change pas d'un écran à l'autre : c'est le même contrat
   qu'on relit à chaque étape. Le volet clair porte la seule action de l'écran.

   Aucun compteur de membres, aucune activité récente, aucune preuve sociale : elles n'existent
   pas ici, et leur absence est le premier engagement que le produit tient.
   ============================================================================================= */

.volets{display:grid;border:1px solid var(--line);border-radius:var(--radius-grand);overflow:hidden;
  box-shadow:var(--shadow-2);min-height:520px;margin:0 0 22px}
@media(min-width:880px){.volets{grid-template-columns:1fr 1fr}}

.volet-sombre{position:relative;overflow:hidden;padding:44px 44px 40px;display:flex;
  flex-direction:column;color:#FFFDF9;
  background:linear-gradient(160deg,var(--vert-900) 0%,var(--vert-950) 72%)}
/* Décalé vers le coin haut-droit : on ne voit qu'un quadrant du cadran, ce qui est le propre
   d'un filigrane. Assez dedans, tout de même, pour que les repères et le secteur entrent dans le
   champ — sinon la rotation ne ferait passer que des arcs de cercle, indiscernables entre eux. */
.volet-sombre .anneaux{position:absolute;right:-104px;top:-84px;width:496px;height:496px;
  opacity:.6;pointer-events:none}
/* Le filigrane parle le vocabulaire du motif F20 : anneau plein, anneau pointillé, cadran,
   secteur épaissi, accent. Monochrome — le laiton du volet est réservé au repère de la date de
   décision, sur le sceau au premier plan. */
.volet-sombre .anneaux circle,.volet-sombre .anneaux line,.volet-sombre .anneaux path{
  fill:none;stroke:var(--vert-700);stroke-width:1}
.volet-sombre .anneaux .pointille{stroke-dasharray:7 10}
.volet-sombre .anneaux .repere{stroke-width:1.6}
.volet-sombre .anneaux .secteur{stroke-width:3.2;stroke-linecap:round}
.volet-sombre .anneaux .accent{fill:var(--vert-700);stroke:none}
.volet-sombre>*{position:relative}
.volet-sombre .sceau{width:82px;height:82px;margin:0 0 26px}
.volet-sombre .promesse{font-family:var(--serif);font-size:clamp(1.55rem,2.9vw,2.15rem);
  line-height:1.26;font-weight:400;color:#FFFDF9;max-width:19ch;margin:0 0 20px;
  letter-spacing:-.01em;text-wrap:balance}
.volet-sombre .dit{font-size:.95rem;line-height:1.62;color:var(--vert-300);max-width:40ch;margin:0}
.volet-sombre .pousse{margin-top:auto}
.volet-sombre .contrat{margin:26px 0 0;padding:14px 0 0;border-top:1px solid rgba(255,255,255,.13);
  display:flex;flex-direction:column;gap:8px}
.volet-sombre .contrat span{font-size:.83rem;color:var(--vert-300);display:flex;gap:10px;
  align-items:flex-start;line-height:1.5}
.volet-sombre .contrat span::before{content:"";width:5px;height:5px;border-radius:50%;
  background:var(--laiton-2);flex:0 0 auto;margin-top:8px}

.volet-clair{background:var(--sable-2);padding:44px;display:flex;flex-direction:column;
  justify-content:center;gap:22px}
.volet-clair>h1{margin:0}
.volet-clair .lede{margin:0}
.volet-clair form{margin:0}
.volet-clair label.f:last-of-type{margin-bottom:0}

@media(max-width:879px){
  .volets{min-height:0}
  .volet-sombre{padding:34px 26px 30px}
  .volet-sombre .sceau{width:58px;height:58px;margin-bottom:18px}
  .volet-clair{padding:30px 26px}
}

/* =============================================================================================
   FONDATIONS — COMPARER PLUTÔT QUE FAIRE DÉFILER

   L'écran existe pour choisir trois personnes parmi quarante. Il les rendait en cartes empilées :
   mille pixels par personne, et comparer deux profils sur un même critère obligeait à traverser
   mille pixels en retenant la valeur de tête. Le seul travail que cet écran doit rendre facile
   était celui qu'il empêchait.

   Rien n'est retiré : §9.1 impose la liste intégrale et la fiche complète. Ce sont trois
   critères choisis qui passent en colonnes, où l'œil les compare, pendant que la fiche entière
   s'ouvre sur place, sous la ligne, sans quitter la page ni perdre le rang.
   ============================================================================================= */

/* Quatorze cases en permanence, c'était du bruit une fois le choix fait — et huit lignes de haut
   sur un téléphone. Le sélecteur se replie derrière un résumé qui nomme les colonnes en cours :
   compact partout, et il dit ce qu'il fait sans qu'on l'ouvre. */
.comparer{margin:0 0 var(--space-4);border:1px solid var(--line);border-radius:var(--radius-pilule);background:var(--paper);
  transition:border-radius .2s ease}
.comparer[open]{border-radius:var(--radius-carte)}
@media(max-width:700px){.comparer{border-radius:var(--radius-carte)}}
.comparer>summary{list-style:none;cursor:pointer;padding:var(--space-2) var(--space-4);display:flex;
  align-items:baseline;gap:var(--space-3);flex-wrap:wrap}
.comparer>summary::-webkit-details-marker{display:none}
.comparer>summary:hover .changer{color:var(--accent)}
.comparer .quoi{font-size:var(--text-1);text-transform:uppercase;letter-spacing:.09em;font-weight:700;
  color:var(--ink-mute)}
.comparer .actuelles{font-size:var(--text-2);color:var(--ink);flex:1;min-width:0}
.comparer .changer{font-size:var(--text-1);font-weight:600;color:var(--ink-soft);white-space:nowrap}
.comparer[open] .changer::after{content:" ×"}
.comparer form{padding:2px var(--space-4) var(--space-4);border-top:1px solid var(--line-soft);margin-top:var(--space-1)}
.comparer .choix{display:flex;gap:var(--space-2) var(--space-4);flex-wrap:wrap;padding-top:var(--space-3)}
.comparer label{display:inline-flex;align-items:center;gap:var(--space-2);font-size:var(--text-2);cursor:pointer}
.comparer .btnrow{margin-top:var(--space-4);align-items:center}

.pool{border:1px solid var(--line);border-radius:var(--radius-carte);overflow:hidden;background:var(--paper);
  box-shadow:var(--shadow-1);margin:0 0 var(--space-5)}
.pool-tete{display:grid;gap:0;padding:0 var(--space-5);height:40px;align-items:center;
  background:var(--vert-50);border-bottom:1px solid var(--ligne-froide);
  font-size:var(--text-1);letter-spacing:.08em;text-transform:uppercase;color:var(--ink-soft);
  font-weight:700}
.pool-tete>span:last-child{text-align:right}
.rang{border-bottom:1px solid var(--vert-25);position:relative}
.rang:last-child{border-bottom:none}
/* La bascule du dépliant. Une case à cocher, pas un <details> : il faut des boutons et un
   formulaire sur la ligne, et le navigateur referme le dépliant dès qu'on clique dedans quand
   ils sont dans un <summary>. Elle reste atteignable au clavier — invisible, pas retirée. */
.rang>.bascule{position:absolute;width:1px;height:1px;opacity:0;margin:0}
.rang>.ligne{display:grid;gap:0;padding:var(--space-4) var(--space-5);align-items:center;
  transition:background .16s ease}
.rang>.ligne:hover{background:var(--sable-2)}
.rang>.bascule:checked~.ligne{background:var(--sable-2)}
.rang>.bascule:focus-visible~.ligne{outline:2px solid var(--focus);outline-offset:-2px}
.rang .ouvrir{cursor:pointer}
.rang>.bascule:checked~.ligne .ouvrir .ouvre{display:none}
.rang>.bascule:not(:checked)~.ligne .ouvrir .ferme{display:none}
.pool-tete,.rang>.ligne{grid-template-columns:230px repeat(3,1fr) 180px}
.rang .qui{display:flex;align-items:center;gap:var(--space-3);min-width:0}
.rang .qui .nom{font-family:var(--serif);font-size:var(--text-3);font-weight:600;color:var(--titre);
  display:block}
.rang .qui .ou{font-size:var(--text-1);color:var(--ink-mute);display:block}
/* LA PHRASE QUI TIENT LA LIGNE — 08/09/2026. Deux lignes au plus, coupées proprement : ce n'est
   pas un extrait, c'est une phrase entière écrite pour cette place. Le décrochage typographique
   (italique, encre douce, retrait) dit qu'elle vient de la personne et non du produit — c'est ce
   qui remplace le visage dans une liste de quarante lignes sans photo.
   `align-items:center` du parent recentrerait un bloc de trois lignes sur le motif : la ligne
   passe donc en haut dès qu'une phrase est là. */
.rang .qui:has(.dit){align-items:flex-start}
.rang .qui .dit{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;
  overflow:hidden;margin-top:var(--space-1);font-size:var(--text-2);line-height:var(--leading-dense);color:var(--ink-soft);
  font-style:italic;max-width:52ch}
/* L'ESPACE DES FAMILLES — 19/09/2026 (`_outil_familles.html`, `famille_proche_invite.html`). */
.familles-titre{font-size:var(--text-3);margin:var(--space-4) 0 var(--space-2)}
.familles-proches li{display:flex;align-items:center;justify-content:space-between;gap:var(--space-3);
  padding:var(--space-2) 0;border-bottom:1px solid var(--line)}
.familles-proches form{margin:0}
/* Un proche dans un échange ouvert sur signalement, avec son formulaire de révocation (Régie). */
.proche-revocable{padding:var(--space-3) 0;border-bottom:1px solid var(--line)}
.lien-a-copier code{display:block;padding:var(--space-3);background:var(--sable-2);border-radius:var(--radius-champ);
  overflow-wrap:anywhere;user-select:all}

/* « MON APPRENTISSAGE » — 19/09/2026 (`apprentissage.html`, `op_assise.html`). L'enregistrement d'un
   intervenant est au format paysage, à l'inverse des vidéos d'étape ; le lecteur est celui du
   navigateur, avec son plein écran. */
.assise-video{display:block;width:100%;height:auto;aspect-ratio:16/9;margin:var(--space-3) 0;
  border-radius:var(--radius-champ);background:#000}
.assise textarea{width:100%}
.question-assise{padding:var(--space-3) 0;border-bottom:1px solid var(--line)}
.question-assise .btnrow{margin-top:var(--space-2)}

/* LA PRIÈRE DE CONSULTATION — 19/09/2026 (`formation_consultation.html`). L'arabe dans une police
   du système : aucune fonte ni ressource tierce n'est chargée, et chaque téléphone en a une. Plus
   grand que la prose et largement interligné, pour que ses signes vocaliques ne se chevauchent pas. */
.consultation .invocation-ar{font-family:"Geeza Pro","Noto Naskh Arabic","Arabic Typesetting","Traditional Arabic",serif;
  font-size:1.45rem;line-height:2.1;text-align:right;color:var(--ink);margin:var(--space-3) 0 var(--space-4)}
.consultation .invocation-trans,.consultation .invocation-fr{margin:0 0 var(--space-4)}
.consultation .invocation-trans{font-style:italic;color:var(--ink-soft)}
.consultation .invocation-trans .kick,.consultation .invocation-fr .kick{display:block;font-style:normal;margin-bottom:var(--space-1)}

/* LA VIDÉO DE L'ÉTAPE — 18/09/2026 (`_video_etape.html`). Repliée : une ligne et sa vignette.
   Ouverte : le lecteur du navigateur, à la largeur de la colonne, carré comme la vidéo ; le fond
   est celui de sa bande de sous-titres, pour qu'aucun blanc ne clignote avant la première image. */
.video-etape>summary{gap:var(--space-3)}
.video-etape .vignette{width:48px;height:48px;border-radius:8px;flex:0 0 auto;object-fit:cover;display:block}
.video-etape .quoi{display:flex;flex-direction:column;gap:2px;color:var(--ink)}
.video-etape .duree{font-size:var(--text-1);font-weight:400;color:var(--ink-mute)}
.video-etape video{display:block;width:100%;height:auto;aspect-ratio:1/1;border-radius:var(--radius-champ);
  background:var(--vert-950)}

/* À PART, SOUS LA LISTE — 18/09/2026. Ce qui écarte la personne, en encre douce et non en alerte :
   c'est un fait sur les critères du membre, pas un défaut de l'autre. Dans le repli, la liste
   retrouve l'encre et la taille de la liste principale, que `.repli .dedans` adoucit. */
.rang .qui .hors-criteres{color:var(--ink-soft)}
.repli.a-part .dedans .pool{margin:var(--space-3) 0 0;font-size:var(--text-4);color:var(--ink)}
/* La fiche de la ligne a aussi son `.dedans` : sans cette remise à zéro, le retrait du repli
   s'y ajoutait et la fiche fermée laissait dépasser un liseré sous chaque ligne. */
.repli.a-part .rang .fiche>.dedans{padding:0;font-size:inherit;line-height:inherit;color:inherit}
.rang .val{font-size:var(--text-2);padding-right:var(--space-4)}
.rang .val:empty::before{content:"—";color:var(--ink-mute)}
.rang .agir{display:flex;justify-content:flex-end;gap:var(--space-2);align-items:center}
.rang .agir form{margin:0}

/* Le dépliant. `grid-template-rows` s'anime, contrairement à `height:auto` : la fiche s'ouvre
   sans qu'on ait à mesurer sa hauteur en JavaScript. */
.rang .fiche{display:grid;grid-template-rows:0fr;transition:grid-template-rows .38s var(--ease)}
.rang>.bascule:checked~.fiche{grid-template-rows:1fr}
.rang .fiche>.dedans{overflow:hidden;min-height:0}
.rang .fiche .contenu{padding:2px var(--space-5) var(--space-5)}

@media (max-width:900px){
  /* Au pouce, il n'y a plus d'en-tête de tableau au-dessus : une valeur seule ne dirait pas de
     quoi elle parle. Chaque cellule porte donc son libellé, et les trois colonnes choisies
     restent visibles — les masquer rendait le sélecteur incompréhensible, puisque son effet ne
     se voyait nulle part. */
  .pool-tete{display:none}
  .rang>.ligne{grid-template-columns:1fr;gap:var(--space-2);padding:var(--space-4) var(--space-4)}
  .rang .val{padding-right:0;display:flex;gap:var(--space-2);align-items:baseline}
  .rang .val::before{content:attr(data-colonne);flex:0 0 auto;font-size:var(--text-1);
    text-transform:uppercase;letter-spacing:.07em;color:var(--ink-mute);font-weight:700}
  .rang .agir{justify-content:flex-start;margin-top:var(--space-1)}
  .rang .fiche .contenu{padding:2px var(--space-4) var(--space-5)}
  /* UNE SEULE RUBRIQUE : LA VALEUR REMONTE SUR LA LIGNE DU NOM — 08/09/2026.

     Avec trois colonnes, chacune a besoin de son libellé et de sa ligne. Avec une seule, le
     libellé est déjà écrit dans le sélecteur juste au-dessus, et la valeur peut se poser à droite
     du nom. Une personne tient alors en deux lignes au lieu de trois, et l'on peut enfin
     parcourir quarante valeurs d'un même œil sur un téléphone.

     Les boutons restent : choisir quelqu'un ne doit jamais demander d'ouvrir sa fiche d'abord. */
  .pool.une-rubrique>.rang>.ligne{grid-template-columns:minmax(0,1fr) auto;
    align-items:baseline;column-gap:var(--space-4);row-gap:var(--space-2);padding:var(--space-3) var(--space-4)}
  .pool.une-rubrique .val{grid-column:2;grid-row:1;justify-self:end;text-align:right;
    display:block;font-weight:600;color:var(--ink)}
  .pool.une-rubrique .val::before{content:none}
  .pool.une-rubrique .agir{grid-column:1 / -1;grid-row:2;margin-top:0}

  /* Le sélecteur de colonnes, dense sur un écran étroit : il se replie sous son intitulé. */
  .comparer{gap:var(--space-2)}
  .comparer .choix{gap:var(--space-1)}
  .comparer label{font-size:var(--text-1);padding:var(--space-2) var(--space-3)}
}

/* --- La fiche d'une personne, dépliée -------------------------------------------------------- */
.faits{display:grid;grid-template-columns:1fr;gap:0;margin:var(--space-4) 0 var(--space-1)}
@media (min-width:620px){.faits{grid-template-columns:1fr 1fr;column-gap:var(--space-5)}}
@media (min-width:1000px){.faits{grid-template-columns:repeat(4,1fr);column-gap:var(--space-5)}}
.faits>div{padding:var(--space-2) 0;border-bottom:1px solid var(--line-soft);min-width:0}
.faits dt{font-size:var(--text-1);text-transform:uppercase;letter-spacing:.07em;color:var(--ink-mute);
  font-weight:700;margin:0 0 1px}
.faits dd{margin:0;font-size:var(--text-2)}

/* Les champs rédactionnels gardent de la largeur : un paragraphe ne se lit pas en colonne
   étroite. Deux colonnes au maximum, en serif, parce que ce sont des mots choisis. */
.recits{display:grid;gap:var(--space-4) var(--space-6);margin:var(--space-4) 0 0;padding-top:var(--space-4);
  border-top:1px solid var(--line-soft)}
@media (min-width:760px){.recits{grid-template-columns:1fr 1fr}}
.recit{margin:0}
.recit .kick{display:block;margin:0 0 var(--space-1);color:var(--laiton-texte)}
.recit p{margin:0;font-family:var(--serif);font-size:var(--text-3);line-height:1.55;max-width:52ch}

.fiche-outils{margin-top:var(--space-4);padding-top:var(--space-3);border-top:1px solid var(--line-soft);
  display:flex;flex-wrap:wrap;gap:var(--space-4)}
.fiche-outils details{flex:1 1 240px;min-width:0}
.fiche-outils summary{cursor:pointer;font-size:var(--text-2);color:var(--ink-soft);
  display:flex;align-items:center;gap:var(--space-2);list-style:none}
.fiche-outils summary::-webkit-details-marker{display:none}
.fiche-outils summary::before{content:"";width:0;height:0;flex:0 0 auto;
  border-left:5px solid var(--ink-mute);border-top:4px solid transparent;
  border-bottom:4px solid transparent;transition:transform .22s var(--ease)}
.fiche-outils details[open]>summary::before{transform:rotate(90deg)}

.identite{flex:1 1 auto;min-width:0}
.identite .nom-ligne{display:flex;align-items:center;gap:var(--space-3)}
.identite .nom{font-family:var(--serif);font-size:var(--text-5);font-weight:600;color:var(--titre)}
.identite .age{color:var(--ink-soft);margin-left:var(--space-2);font-size:var(--text-3)}
.identite .pastilles{display:flex;flex-wrap:wrap;gap:var(--space-2);margin-top:var(--space-2)}
:where(body.op) .identite .pastilles{gap:6px;margin-top:7px}

/* --- Pictogrammes de section ------------------------------------------------------------------

Le trait principal suit `color`, donc le picto reste lisible partout où on le pose sans qu'on ait
à en dessiner une variante sombre. L'accent laiton, lui, tient sur les deux fonds. */

.pi{width:24px;height:24px;flex:0 0 auto;color:var(--accent);display:block}
/* UNE PUCE DE TITRE RESTE SUR LA LIGNE DE SON TITRE — 17/09/2026. Le Fondateur : « mets sur la
   même ligne les puces et les titres avec un espace suffisant qui les sépare ».

   `.pi` est `display:block` (c'est ce qu'il lui faut partout ailleurs) : posée dans un titre sans
   mise en page, elle tombait à la ligne AU-DESSUS du mot. Trois conteneurs le corrigeaient déjà
   chacun de leur côté, et le quatrième — « Mon compte » — avait été oublié, ce qui est la façon
   dont ce genre de règle se perd.

   Elle est donc déclarée UNE fois, sur la forme du titre et non sur son conteneur : tout titre
   qui porte une puce en premier enfant s'aligne, où qu'il soit, y compris celui qu'on écrira
   demain. `--space-3` est l'espace, le même partout. */
h2:has(>.pi),h3:has(>.pi){display:flex;align-items:center;gap:var(--space-3)}
.pi.grand{width:40px;height:40px}
.pi.tres-grand{width:56px;height:56px}
.pi.pale{color:var(--vert-300)}
.pi.clair{color:#FFFDF9}
body.op .pi{color:var(--gr-600)}
body.tiers .pi{color:var(--tz-700)}
/* Sauf dans le rond d'un bouton d'appel, qui porte sa propre couleur : la règle précédente y
   posait une icône sombre sur le vert de « décrocher », à peine visible. Vu le 19/09/2026 à la
   lecture à 390 px de la salle des familles ; les pages d'appel et de visio du tiers l'avaient aussi. */
body.tiers .btn-appel .rond .pi{color:inherit}
.tete-ill>.pi{width:52px;height:52px}
@media (max-width:560px){.tete-ill>.pi{width:40px;height:40px}}

/* --- MOTIF D'IDENTITÉ (F20) ------------------------------------------------------------------

Chaque profil porte un motif calculé, jamais choisi, et différent selon qui regarde. Sa raison
est de sécurité et non de goût : un avatar fixe se montrerait et se décrirait exactement comme
une photographie, et permettrait d'identifier quelqu'un hors de la plateforme.

Cinq couples de teintes, tous en milieu de gamme. Aucun ne doit pouvoir se lire comme meilleur
qu'un autre, et la teinte d'alerte est exclue : elle signifie autre chose partout ailleurs. */

.motif{width:44px;height:44px;flex:0 0 auto;display:block}
/* LE VISAGE QUI REMPLACE LE MOTIF, UNE FOIS DÉVOILÉ — 09/09/2026. Même encombrement que lui, au
   pixel près : il prend sa place dans la ligne sans la redessiner. Rond, comme le motif, parce
   qu'un carré au milieu de ronds se lirait comme une catégorie de personnes. */
.visage{width:44px;height:44px;flex:0 0 auto;display:block;border-radius:50%;object-fit:cover;
  background:var(--vert-50);border:1.5px solid var(--vert-100)}
.motif.petit{width:34px;height:34px}
.motif.grand{width:58px;height:58px}
.motif .cercle{fill:none;stroke:var(--m-trait);stroke-width:1.6}
.motif .secteur{fill:none;stroke:var(--m-accent);stroke-width:3.4;stroke-linecap:round;opacity:.8}
.motif .coeur{fill:var(--m-coeur)}
.motif .coeur.creux{fill:none;stroke:var(--m-coeur);stroke-width:3.2;stroke-linecap:round}
.motif .accent{fill:var(--m-accent)}
.motif.tr-pointille .cercle{stroke-dasharray:5 4}
.motif.tr-double .cercle{stroke-width:3.4;stroke-opacity:.35}
.motif.t1{--m-trait:var(--vert-300);--m-coeur:var(--vert-700);--m-accent:var(--laiton)}
.motif.t2{--m-trait:var(--laiton-2);--m-coeur:var(--laiton-texte);--m-accent:var(--vert-500)}
.motif.t3{--m-trait:var(--vert-300);--m-coeur:var(--vert-500);--m-accent:var(--vert-900)}
.motif.t4{--m-trait:var(--ink-mute);--m-coeur:var(--vert-800);--m-accent:var(--laiton-2)}
.motif.t5{--m-trait:var(--laiton-2);--m-coeur:var(--vert-600);--m-accent:var(--ink-soft)}

/* LA VARIANTE SOBRE — LOT F (08/09/2026).

   Les cinq couples ci-dessus tirent dans le vert et le laiton. Dans la liste de sélection
   (`fondations.html`), où ils ont été dessinés, ces deux teintes ne veulent rien dire d'autre
   qu'elles-mêmes. Ailleurs, si : le laiton dit « à vous de jouer » et le vert dit « franchie »
   sur les mesures de la saison, le laiton dit « parle » sur une tuile de visio, le vert dit
   « présent » sur une ligne de présence. Un accent laiton posé à côté serait un faux signal,
   lu comme une consigne alors qu'il ne dit que « cette personne-ci ».

   La règle : le motif coloré vit dans la liste de sélection ; partout où l'interface parle
   déjà laiton et vert, le motif se tait et prend le bleu ardoise et les neutres. Les cinq
   couples restent cinq — l'axe des teintes ne disparaît pas, il change de gamme — parce qu'un
   motif à teinte unique perdrait un de ses cinq axes et deviendrait plus facile à confondre. */
.motif.sobre.t1{--m-trait:var(--structure-filet);--m-coeur:var(--structure);--m-accent:var(--structure-clair)}
.motif.sobre.t2{--m-trait:var(--structure-clair);--m-coeur:var(--structure-texte);--m-accent:var(--ink-mute)}
.motif.sobre.t3{--m-trait:var(--ink-mute);--m-coeur:var(--structure-clair);--m-accent:var(--structure)}
.motif.sobre.t4{--m-trait:var(--structure-filet);--m-coeur:var(--ink-soft);--m-accent:var(--structure-texte)}
.motif.sobre.t5{--m-trait:var(--structure-clair);--m-coeur:var(--structure);--m-accent:var(--ink-soft)}

/* =============================================================================================
   L'ENGAGEMENT — l'invocation qui ouvre, le rappel qui ralentit (08/09/2026)

   Deux blocs demandés par le Fondateur, sur le seul écran du produit où l'on engage sa parole.
   Ils encadrent le texte de l'engagement : l'un accueille avant, l'autre retient juste avant la
   case à cocher.

   AUCUN LAITON ICI, ET C'EST DÉLIBÉRÉ. Le laiton veut dire « à vous de jouer » et rien d'autre ;
   l'employer pour souligner une invocation ou une parole prophétique lui ferait dire deux
   choses, et le rendrait muet là où il compte. Ces deux blocs se distinguent par la composition
   et le silence autour d'eux, pas par une couleur de plus.
   ============================================================================================= */

/* Centré, sans cadre et sans fond : un encadré en aurait fait un bloc d'information parmi les
   autres, alors que c'est l'ouverture de la page. Le filet du bas est la seule frontière, et il
   dit simplement que l'accueil est fini et que le texte commence. */
.preambule{max-width:60ch;margin:0 auto var(--space-6);padding:var(--space-1) 0 var(--space-6);text-align:center;
  border-bottom:1px solid var(--line)}
.preambule p{font-family:var(--serif);font-size:var(--text-3);line-height:1.7;color:var(--ink-soft);
  margin:0 0 var(--space-4);text-wrap:pretty}
.preambule p:last-child{margin-bottom:0;color:var(--ink)}
.preambule .bismillah{font-family:var(--arabe);font-size:clamp(1.55rem,5.4vw,2.15rem);
  line-height:1.95;font-weight:400;color:var(--titre);margin:0 0 var(--space-1)}
.preambule .traduction{font-family:var(--sans);font-size:var(--text-2);line-height:1.5;
  color:var(--ink-mute);margin:0 0 var(--space-5)}

/* La ligature de l'éloge (U+FDFA) tombe sinon sur la police latine, qui la rend minuscule ou pas
   du tout. Elle est réclamée explicitement à la pile arabe, et relevée d'un cran : c'est un mot
   entier dans un seul signe, il ne peut pas faire la taille d'une virgule. */
.salawat{font-family:var(--arabe);font-size:1.28em;line-height:1}

/* Le fond froid, et pas le sable : il sépare ce bloc du texte de l'engagement qui le précède
   immédiatement, sans ajouter de teinte au produit. */
.rappel-intention{margin:var(--space-6) 0 var(--space-5);padding:var(--space-5) var(--space-5);border-radius:var(--radius-carte);
  background:var(--vert-25);border:1px solid var(--ligne-froide)}
.rappel-intention .hadith{margin:0 0 var(--space-3);font-family:var(--serif);font-size:var(--text-4);
  line-height:var(--leading-corps);color:var(--titre);text-wrap:pretty}
.rappel-intention .rapporte{margin:0 0 var(--space-4);font-size:var(--text-1);line-height:1.5;color:var(--ink-mute)}
.rappel-intention .apres{margin:0;font-size:var(--text-2);line-height:var(--leading-corps);color:var(--ink-soft)}

@media(max-width:640px){
  .preambule{margin-bottom:var(--space-5);padding-bottom:var(--space-5)}
  .rappel-intention{padding:var(--space-4) var(--space-4)}
}

/* =============================================================================================
   L'ÉCHANGE — la conversation prend la page
   ============================================================================================= */

/* La page reste une page qui défile, pas une application qui prend la fenêtre. Une hauteur
   fixée à 100vh casse dès qu'une bannière de rappel s'affiche, et le clavier des téléphones la
   fait sauter. C'est le fil des messages, à l'intérieur, qui a sa propre hauteur bornée.

   REFONTE DU 06/09/2026 — « c'est le cœur de notre produit, c'est là qu'il faut mettre le
   paquet ». Ce qui a changé, et pourquoi, dans l'ordre où l'œil le voit :

   1. LE RYTHME. C'est ce qui distingue un chat d'une liste, avant la couleur et avant la forme.
      Trois pixels entre deux bulles d'une même prise de parole, seize entre deux prises. L'œil
      lit les groupes sans lire les noms.
   2. UNE SEULE HEURE PAR PRISE DE PAROLE, posée au pied du groupe et hors de la bulle, en
      IBM Plex Mono. Les heures s'alignent alors verticalement : le fil se lit comme un registre,
      ce qu'il est. Avant, chaque bulle portait « 06/09/2026 14:31 », trois fois de suite.
   3. LA JOURNÉE EN PASTILLE, au centre. Pas de filet traversant : le vocabulaire de la maison,
      ce sont les pastilles (`.pill`, `.tag`), et un filet horizontal coupe un fil qu'on veut
      continu.
   4. LES BULLES REÇUES ONT UNE OMBRE, PAS UN CADRE. Une bordure pleine sur fond sable donnait
      un tableau ; une ombre basse pose la bulle sur le papier.
   5. SUR TÉLÉPHONE, UN SEUL DÉFILEMENT. Le fil avait sa propre hauteur bornée à l'intérieur
      d'une page qui défilait déjà : deux ascenseurs imbriqués, et le doigt qui prend le mauvais.
      La tête et le composeur deviennent collants, le fil s'étire, la page défile seule. */
.echange{display:grid;border:1px solid var(--line);border-radius:var(--radius-carte);overflow:hidden;
  background:var(--paper);box-shadow:var(--shadow-1);margin:0 0 var(--space-5)}
/* UN ÉCHANGE FERMÉ SE RELIT, ET SE VOIT FERMÉ — 09/09/2026. La carte perd son relief : elle ne
   porte plus aucun geste, seulement une conversation qui a eu lieu. Rien n'est grisé pour
   autant — le texte se lit exactement comme avant, c'est le cadre qui recule, pas les mots. */
.echange.close{box-shadow:none;border-color:var(--line-soft)}
.fil{display:flex;flex-direction:column;min-width:0;min-height:0;background:var(--sable)}
/* La carte a une hauteur bornée sur grand écran, et c'est elle qui la porte — pas le fil.
   Le fil avait sa propre borne (58vh) : quand le volet de droite était plus haut, il restait un
   vide de deux cents pixels sous le composeur, et la conversation semblait posée en haut d'une
   carte vide. Les deux colonnes défilent maintenant chacune dans la hauteur commune. */
/* TROIS COLONNES SEULEMENT QUAND IL Y A LA PLACE — 08/09/2026.

   Le point de bascule était à 960 px. Sur un portable ordinaire, cela donnait un index de
   216 px, un panneau de lecture de ~330 px et une conversation de 380 px : trois ascenseurs
   côte à côte, aucun assez large. Le Fondateur : « illisible et pas simple pour la navigation ».

   À 1200 px, la disposition à deux onglets (Messages / Ressources) sert désormais tous les
   portables, et elle est lisible. Au-dessus, il y a vraiment la place pour trois colonnes, et la
   conversation y gagne 60 px. Un seul nombre porte l'essentiel du gain. */
/* DEUX ZONES, ET NON TROIS — modèle de navigation, 08/09/2026.

   Ce qui précédait : index 216 px, panneau de lecture ~480 px, conversation 440 px. Trois
   ascenseurs indépendants, dont aucun n'était vraiment large. Verdict du Fondateur : « illisible
   et pas simple pour la navigation ».

   Le modèle retenu n'en garde que deux. La conversation prend la place qui reste, environ
   700 px, et ne bouge plus jamais. Le panneau de droite fait 380 px et montre UNE chose à la
   fois : l'index des douze outils, ou l'outil ouvert. Ouvrir un outil ne comprime rien, il
   remplace l'index dans le même panneau — c'est un niveau de plus, pas une colonne de plus.

   Les douze pavés de l'index sont visibles d'un coup, aucun replié. Un index n'est pas un
   accordéon : c'était le verdict du tour précédent, et il tient toujours.

   L'alternation index / lecture est désormais écrite hors requête média : elle vaut à toutes les
   largeurs, puisque c'est le modèle et non un accommodement d'écran étroit. */
.echange.js .ressources.en-lecture .res-index{display:none}
.echange.js .ressources:not(.en-lecture) .res-lecture{display:none}

/* --- LA COLONNE DE DROITE DISPARAÎT — 09/09/2026 -----------------------------------------------

   Verdict du Fondateur devant l'écran en ligne : « j'ai du mal avec le chat en plein milieu de
   l'écran et la liste déroulante à droite du chat ». Il a retenu, sur maquettes, le format qui
   supprime la colonne : la conversation prend toute la largeur, et les outils passent SOUS elle.

   TROIS CHOSES QUE CELA RÈGLE D'UN COUP :
     — la conversation n'est plus prise en étau entre un rail et un panneau ;
     — l'ordre du balisage devient l'ordre de lecture, donc plus aucune règle d'écran n'a besoin
       de déplacer un bloc pour rétablir le sens ;
     — les onglets Messages / Ressources n'ont plus d'objet : les deux sont sur la page.

   CE QUI SURVIT INTACT : l'alternance index / lecture, écrite juste au-dessus, et le script qui
   la pilote. Il ne connaissait la disposition par aucun endroit — c'est ce qui permet de la
   changer entièrement sans y toucher une ligne. La place ainsi libérée est exactement celle que
   le rail occupe : c'est pour cela que l'échange a pu rejoindre le châssis le même jour. */
.fil{order:1}
.ressources{order:2;border-top:1px solid var(--line)}
/* Les onglets ne servaient qu'à choisir entre deux colonnes. Il n'y en a plus qu'une. */
.vues{display:none}
/* `pleine-largeur` (le témoin scellé, seul outil à porter un tableau de quatre colonnes) était
   une exception à la colonne de 380 px. Sans colonne, il n'y a plus d'exception : tous les
   outils s'ouvrent sur toute la largeur. La classe reste posée par le script, elle ne peint
   plus rien, et c'est le bon sens de la dépendance. */

.fil-tete{flex:0 0 auto;background:var(--paper);border-bottom:1px solid var(--line-soft);
  padding:var(--space-4) var(--space-5);display:flex;align-items:center;gap:var(--space-4);flex-wrap:wrap}
/* L'EN-TÊTE NE SE CASSE PLUS MOT PAR MOT — 08/09/2026.

   Signalé par le Fondateur, capture à l'appui : « Appel / ouvert · / 112 / minutes / restantes ».
   La colonne des messages fait 380 px, moins 52 px de marges : 328 px pour loger le motif
   (44 px), le nom, la ligne d'état et le bouton « Ouvrir la page de l'appel ». Il restait ~86 px
   au texte, et `flex:1` sur `.qui` le laissait se comprimer jusqu'à la largeur d'un mot pendant
   que le bouton gardait la sienne.

   Le bouton prend maintenant sa propre ligne, et le motif y est petit. Défaut introduit en
   posant le motif F20 : le rendu de contrôle ne portait pas de bouton d'appel, donc rien ne
   comprimait le nom. */
.fil-tete .motif,.fil-tete .visage{margin-right:2px;width:34px;height:34px}
.fil-tete .qui{flex:1 1 auto;min-width:11ch}
/* LES GESTES DE L'EN-TÊTE — 14/09/2026, idée du Fondateur : « ajouter le bouton téléphone (vert)
   quand l'appel est possible et à côté un bouton caméra dès que la visio le devient, comme
   WhatsApp ». Le bouton « Ouvrir la page de l'appel » prenait une ligne entière de l'en-tête
   collant, et la visio n'en avait pas. Deux ronds, à droite du nom, qui n'existent que quand
   l'appel ou la visio est ouvert : l'en-tête reste sur une ligne, et le geste est là où l'œil
   le cherche. */
.fil-actes{display:flex;gap:var(--space-2);flex:0 0 auto;margin-left:auto}
.fil-actes .acte{width:40px;height:40px;border-radius:50%;display:flex;align-items:center;
  justify-content:center;background:var(--vert-plein);color:#fff;text-decoration:none;
  transition:background .16s ease,transform .12s ease}
.fil-actes .acte:hover{background:var(--vert-plein-2);color:#fff;transform:translateY(-1px)}
/* `.pi` impose la couleur d'accent à tout pictogramme (plus bas) : vert sur le rond vert, le
   combiné était invisible (capture du Fondateur, 14/09/2026 au soir). Ici il prend la couleur
   du rond, comme dans les boutons ronds de l'appel. */
.fil-actes .acte .pi{width:22px;height:22px;color:inherit}
/* Une ligne d'état seulement quand il y a un état à dire (clos, moins disponible) : « Échange
   écrit » et « lu par un tiers de confiance » sont partis, le pied du chat dit déjà qui lit. */
.fil-tete .qui span:empty{display:none}
.fil-tete .qui b{font-family:var(--serif);font-size:var(--text-4);font-weight:600;color:var(--titre);
  display:block}
.fil-tete .qui span{font-size:var(--text-1);color:var(--ink-soft)}
/* LA DISPONIBILITÉ EST DANS L'EN-TÊTE, PLUS SOUS LUI — 14/09/2026. Elle vivait sur sa propre
   ligne (`.fil-note`), entre la tête et le fil : dès qu'on avait défilé de trois messages, elle
   était partie, et le Fondateur la voyait « tantôt oui, tantôt non ». Elle est maintenant la
   ligne d'état sous le nom, dans l'en-tête qui colle : visible tant que la conversation l'est.
   `.fil-note` reste : c'est aussi la ligne du `<noscript>`, une information sur la page, pas un
   message de quelqu'un. */
.fil-note{margin:0;padding:var(--space-2) var(--space-5);font-size:var(--text-2);color:var(--ink-soft);
  background:var(--sable-2);border-bottom:1px solid var(--line-soft)}

.fil-corps{flex:1 1 auto;min-height:260px;overflow-y:auto;padding:var(--space-5) var(--space-5) var(--space-5);
  display:flex;flex-direction:column;gap:var(--space-4)}
.fil-pied{flex:0 0 auto;background:var(--paper);border-top:1px solid var(--line);padding:var(--space-4) var(--space-5)}

/* --- QUI LIT, ET COMMENT ARRÊTER — 09/09/2026 -------------------------------------------------
   Sous le composeur, et non plus en boîte d'avertissement au-dessus de la conversation :
   « en bas du chat, le nom du ou des tiers de confiance ». C'est au moment d'écrire qu'il faut
   savoir qui lira, pas cent pixels plus haut et une fois pour toutes.

   Discret par construction. Ce n'est pas une alerte : un accompagnement est la règle du produit,
   pas un incident. Le point vert dit « quelqu'un lit en ce moment » — le seul vert du bloc, et
   il garde son sens, « franchie » au sens de « c'est en place ». */
.fil-tiers{flex:0 0 auto;display:flex;align-items:baseline;gap:var(--space-3);flex-wrap:wrap;
  padding:var(--space-3) var(--space-5);background:var(--sable-2);border-top:1px solid var(--line-soft);
  font-size:var(--text-2);color:var(--ink-soft)}
.fil-tiers .qui-lit{flex:1 1 22ch;min-width:0}
.fil-tiers .qui-lit b{color:var(--ink);font-weight:600}
.fil-tiers .pt{display:inline-block;width:7px;height:7px;border-radius:50%;margin-right:var(--space-2);
  background:var(--vert-plein);box-shadow:0 0 0 3px var(--vert-50);vertical-align:1px}
.fil-tiers a{color:var(--accent)}
/* Le signalement était en pied de page, sous un repli et deux paragraphes. Il est ici, à portée
   du geste. Rouge sourd et contour seul : il doit se trouver sans avoir à être cherché, et ne
   jamais ressembler à l'action ordinaire de l'écran. */
.fil-tiers .signaler-ici{flex:0 0 auto;font-size:var(--text-1);color:var(--stop);text-decoration:none;
  border:1px solid var(--stop-ligne);border-radius:var(--radius-pilule);padding:var(--space-1) var(--space-3);
  transition:background .16s ease}
.fil-tiers .signaler-ici:hover{background:var(--stop-pale)}

/* La ligne du binôme courant, dans la liste en tête de l'écran d'échange : ce n'est pas un lien,
   on y est déjà. Même filet à gauche que l'entrée courante du rail, pour la même raison. */
.binome.ici{background:var(--sable-2);box-shadow:inset 3px 0 0 var(--laiton-2)}

/* --- La journée ---------------------------------------------------------------------------- */
.jour{align-self:center;margin:var(--space-2) 0 0;padding:var(--space-1) var(--space-3);border-radius:var(--radius-pilule);
  background:var(--sable-2);border:1px solid var(--line);
  font-family:var(--mono);font-size:var(--text-1);font-weight:500;text-transform:uppercase;
  letter-spacing:.11em;color:var(--ink-soft)}
.jour:first-child{margin-top:0}

/* --- Une prise de parole --------------------------------------------------------------------- */
.grappe{display:flex;flex-direction:column;gap:var(--space-1);max-width:76%;align-self:flex-start;
  min-width:0}
.grappe.moi{align-self:flex-end;align-items:flex-end}
/* Le `.quand` est toujours le dernier enfant : la dernière bulle est donc l'avant-dernier. */
.grappe .quand{font-family:var(--mono);font-size:var(--text-1);color:var(--ink-mute);margin-top:var(--space-1);
  padding:0 var(--space-1)}

.msg{padding:var(--space-3) var(--space-4);border-radius:var(--radius-grand);background:var(--paper);border:1px solid var(--line-soft);
  box-shadow:0 1px 2px rgba(20,26,23,.05);align-self:flex-start;max-width:100%;min-width:0}
.msg p{margin:0;font-size:var(--text-3);line-height:1.55;overflow-wrap:anywhere}
.grappe .msg:nth-last-child(2){border-bottom-left-radius:5px}
.grappe.moi .msg{align-self:flex-end;background:var(--vert-plein-2);border-color:var(--vert-plein-2);
  color:#fff;box-shadow:0 1px 2px rgba(12,36,28,.18)}
.grappe.moi .msg p{color:#fff}
.grappe.moi .msg:nth-last-child(2){border-bottom-left-radius:16px;border-bottom-right-radius:5px}
/* Le message part : la bulle est posée pâle, et se confirme quand le serveur a répondu. Si le
   filtre refuse, elle disparaît et le texte revient dans le champ. */
.msg.attente{opacity:.5}
.msg{transition:opacity .18s ease}

/* Une note du système, adressée aux deux personnes à l'identique. Elle ne dit jamais qui. */
.msg.systeme{align-self:center;max-width:82%;background:var(--laiton-pale);border-color:var(--laiton-filet);
  border-left:4px solid var(--laiton-texte);border-radius:var(--radius-carte);text-align:left;box-shadow:none}
.msg.systeme .tag{font-size:var(--text-1);text-transform:uppercase;letter-spacing:.12em;font-weight:700;
  color:var(--laiton-texte);display:block;margin-bottom:var(--space-1)}
.msg.systeme p{font-size:var(--text-2);color:var(--ink-soft)}
.msg.trace{align-self:center;background:var(--laiton-pale);border-color:var(--laiton-filet);border-radius:var(--radius-pilule);
  padding:var(--space-2) var(--space-4);font-size:var(--text-1);color:var(--ink-soft);max-width:none;box-shadow:none}
.msg.trace p{font-size:var(--text-1)}

/* Un fil sans message n'est pas une erreur : c'est le moment où tout reste à écrire. */
.fil-vide{align-self:center;max-width:34ch;text-align:center;margin:auto 0;color:var(--ink-soft);
  font-size:var(--text-2)}
.fil-vide .titre{font-family:var(--serif);font-size:var(--text-3);color:var(--titre);margin:0 0 var(--space-2)}
.fil-vide p{margin:0}

/* --- Le composeur ---------------------------------------------------------------------------
   Deux gestes très différents portaient le même bouton gris : envoyer maintenant, et garder
   jusqu'à demain 7 h. Un seul est plein ; l'autre est un bouton de texte, à l'autre bout de la
   ligne. On ne les confond plus du doigt. */
.composeur{display:flex;flex-direction:column;gap:var(--space-2)}
.composeur textarea{min-height:58px;max-height:200px;border-radius:var(--radius-carte);background:var(--sable-2);
  resize:none;line-height:1.55}
/* Une seule ligne sous le champ : la pastille des symboles, le départ différé, l'envoi. Elle en
   portait deux, la palette ayant la sienne, et la règle du filtre en occupait trois de plus en
   texte fixe. Sur un téléphone, le pied du chat mangeait la moitié de la hauteur utile.
   `margin-right:auto` tient l'envoi à droite sans `space-between`, qui écarterait la palette. */
.composeur .sous{display:flex;align-items:center;gap:var(--space-3)}
.composeur .differer{background:none;border:0;padding:var(--space-2) 2px;font-family:var(--sans);
  font-size:var(--text-2);color:var(--ink-soft);cursor:pointer;text-align:left;margin-right:auto;
  border-bottom:1px solid var(--line);transition:color .16s ease,border-color .16s ease}
.composeur .differer:hover{color:var(--accent);border-bottom-color:var(--vert-300)}
.composeur .btn.envoyer{border-radius:var(--radius-pilule);padding:var(--space-3) var(--space-5)}

/* L'avertissement du filtre est un conseil avant l'envoi, pas un échec : il était rouge, il est
   laiton. Le refus réel, lui, garde le rouge. */
.avis-filtre{margin:0;padding:var(--space-2) var(--space-3);border-radius:var(--radius-champ);font-size:var(--text-2);
  background:var(--laiton-pale);border:1px solid var(--laiton-filet);color:var(--laiton-texte)}
.avis-filtre.refus{background:var(--stop-pale);border-color:var(--stop-ligne);color:var(--stop)}
.avis-filtre[hidden]{display:none}

/* --- Sur téléphone : un seul défilement ------------------------------------------------------
   `overflow:hidden` sur `.echange` empêcherait tout `sticky` à l'intérieur ; les coins arrondis
   partent avec, sinon les fonds des enfants dépasseraient. La barre de secours est fixée en bas
   de l'écran (`.secours-flottant`, ~56 px) : le composeur se pose au-dessus d'elle, pas dessous. */
@media(max-width:1199px){
  /* 14/09/2026 — la carte est bord à bord et rien ne vient après elle : sa marge basse de
     20 px n'était plus qu'un vide sous le dernier message. */
  .echange{overflow:visible;border-radius:0;box-shadow:none;margin-bottom:0}
  /* Deux onglets, une seule chose à l'écran. Les onglets sont collants au-dessus de la tête
     du fil, qui l'était déjà : elle descend d'autant. */
  .vues{position:sticky;top:0;z-index:var(--z-collant-onglets)}
  .echange.js[data-vue="messages"] .ressources{display:none}
  .echange.js[data-vue="ressources"] .fil{display:none}
  .res-index{padding:var(--space-4) var(--space-3) var(--space-4)}
  .res-lecture{padding:var(--space-4) var(--space-4) var(--space-5)}
  .fil-tete{position:sticky;top:45px;z-index:var(--z-collant);padding:var(--space-3) var(--space-4)}
  .fil-note{padding:var(--space-2) var(--space-4)}
  .fil-corps{min-height:200px;overflow-y:visible;padding:var(--space-4) var(--space-4) var(--space-4)}
  .fil-pied{position:sticky;bottom:56px;z-index:var(--z-collant);padding:var(--space-3) var(--space-3);
    box-shadow:0 -12px 22px -20px rgba(20,26,23,.6)}
  .grappe{max-width:88%}
  .composeur .btn.envoyer{padding:var(--space-3) var(--space-5)}

  /* --- LE PIED REND SA PLACE AU FIL — 14/09/2026 -----------------------------------------------
     « Réduis cette vue, particulièrement lorsque j'arrive en fin de page, je ne vois plus vraiment
     les messages. » Et c'était vrai : sous le dernier message s'empilaient le champ, la palette
     sur sa ligne, les deux boutons, trois lignes de règle du filtre, la bande du tiers et le
     repli. Sur un écran de 390 px, près de la moitié de la hauteur.

     Le champ repart d'une ligne et grandit au texte, comme il le faisait déjà : `min-height` ne
     décidait que de son repos, et 58 px réservaient deux lignes à quelqu'un qui n'en avait pas
     encore écrit une. */
  .composeur{gap:var(--space-2)}
  .composeur textarea{min-height:44px}
  /* La bande du tiers gardait les 26 px de marge d'un écran large : cinquante-deux pixels de
     largeur perdus sur trois cent quatre-vingt-dix, soit une ligne de texte en plus. */
  .fil-tiers{padding:8px 12px;gap:var(--space-2)}
}

/* =============================================================================================
   SECOURS — toujours au même endroit, jamais recouverts
   ============================================================================================= */

.exit{position:fixed;right:16px;bottom:16px;z-index:60}
/* C'est un lien depuis le 08/09/2026, plus un bouton : il faut donc lui retirer le
   soulignement et le tenir en blanc, que la règle générale des liens ferait virer au vert. */
.exit a{text-decoration:none;background:var(--stop-plein);color:#fff;border:1px solid var(--stop-plein);padding:10px 18px;
  border-radius:99px;font-size:.85rem;font-weight:600;cursor:pointer;font-family:var(--sans);
  display:inline-flex;align-items:center;gap:9px;
  box-shadow:0 8px 20px -8px rgba(140,58,50,.7);
  transition:transform .16s var(--ease),box-shadow .2s ease}
.exit a::before{content:"";width:8px;height:8px;border-radius:50%;background:#fff;
  flex:0 0 auto}
.exit a:hover{color:#fff;transform:translateY(-2px);box-shadow:0 12px 26px -8px rgba(140,58,50,.8)}
body.op .exit a{background:var(--gr-600);border-color:var(--gr-600);
  box-shadow:0 8px 20px -8px rgba(15,20,23,.6)}
body.op .exit{bottom:16px}

/* `.secours-flottant`, et non `.secours` : le module 4 de la formation rend un bloc
   `<div class="box secours ...">` pour les numéros d'aide. Sous l'ancien nom, ce bloc de contenu
   héritait du `position:fixed` de ce conteneur et allait se coller en bas à droite de l'écran,
   par-dessus la page. Deux choses différentes portaient le même nom.

   UN BANDEAU, PLUTÔT QUE DES PASTILLES FLOTTANTES — 02/09/2026.

   C'étaient trois pastilles posées à droite, en `position:fixed`, à mi-hauteur. §17.4 impose leur
   présence permanente ; leur emplacement, lui, n'était imposé par rien, et il coûtait cher :

     - sur un téléphone, elles recouvraient le texte des cartes et en masquaient des phrases ;
     - sur Fondations en 1280 px, elles se posaient exactement sur trois boutons « Choisir ».
       Viser une personne et toucher « Quitter cette page », qui vide l'écran, n'est pas un
       défaut d'esthétique.

   Elles forment maintenant un bandeau au pied de l'écran, à toutes les largeurs, et la page se
   termine par une réserve de la même hauteur. Un bandeau au bord bas se lit comme un bandeau ;
   rien d'interactif ne se retrouve sous le doigt là où l'on visait autre chose. */
.secours-flottant{position:fixed;left:0;right:0;bottom:0;z-index:60;display:flex;
  flex-direction:row;align-items:center;justify-content:flex-end;gap:9px;
  padding:9px 16px;padding-right:196px;
  background:var(--sable-2);border-top:1px solid var(--line);
  box-shadow:0 -8px 22px -18px rgba(20,26,23,.55)}
.secours-flottant .signaler{background:var(--paper);color:var(--ink);border:1px solid var(--line);
  padding:8px 14px;border-radius:99px;font-size:.82rem;font-weight:600;text-decoration:none;
  white-space:nowrap;transition:border-color .16s ease,color .16s ease}
.secours-flottant .signaler:hover{border-color:var(--stop);color:var(--stop)}

/* La sortie rapide reste à droite du bandeau, et rouge : c'est le seul bouton de l'application
   dont on doive se souvenir sans le chercher. */
.exit{right:16px;bottom:9px;z-index:61}

/* La réserve de bas de page. Sans elle, la dernière carte passe sous le bandeau. */
.wrap{padding-bottom:76px}

/* La console opérateur n'a pas de bandeau — les deux écrans de secours exigent une session
   membre, que l'opérateur n'a pas. Sa sortie rapide reprend donc sa place d'origine. Sa réserve
   de bas de page, elle, est déjà posée plus haut (96 px) et n'est pas retouchée ici : la
   réécrire écraserait la version écran étroit, écrite avant. */
body.op .exit{right:16px;bottom:16px}

@media (max-width:700px){
  .secours-flottant{justify-content:flex-start;padding:9px 12px;padding-right:168px;gap:8px}
  .secours-flottant .signaler{padding:7px 12px;font-size:.78rem}
  .exit{right:12px}
  .exit a{padding:8px 14px;font-size:.79rem}
}

/* Sur téléphone, la barre des lieux occupe le pied de l'écran : ces deux-là lui cèdent la place.
   Signaler et Confidentialité se replient dans « ··· », la sortie devient la cinquième cellule.
   Le seuil est celui de la barre des lieux, 720 px, et non les 700 px du bloc ci-dessus. */
@media (max-width:720px){
  .secours-flottant{display:none}
  .exit{display:none}
  .wrap{padding-bottom:12px}
}

/* =============================================================================================
   LES IMAGES (02/09/2026)

   L'application était entièrement géométrique, comme le site : c'est la directive d'août qui
   l'avait voulu, et le Fondateur l'a rouverte le 01/09.

   Une seule frontière, et elle tient. Aucune photographie sur un écran qui montre une personne —
   Fondations, la fiche, l'échange, l'appel. Là, les marques de profil restent abstraites, et pour
   une raison de sécurité, pas de goût : un motif figuratif fixe se montre et se décrit exactement
   comme une photographie, ce qui rendrait quelqu'un identifiable hors de la plateforme (F20).

   Les images vont donc sur les seuils : l'entrée en saison, la notice du premier jour, le hall,
   la formation, la fin de parcours. Là où l'on arrive et là où l'on repart.
   ============================================================================================= */

.vignette{position:relative;margin:0 0 22px;border-radius:var(--radius-grand);overflow:hidden;
  background:var(--laiton-pale)}
.vignette img{display:block;width:100%;height:clamp(150px,20vw,240px);object-fit:cover}
.vignette.haute img{height:clamp(210px,30vw,340px)}
.vignette::after{content:"";position:absolute;left:0;right:0;top:0;height:3px;
  background:linear-gradient(90deg,var(--abricot),var(--safran),var(--laiton-2))}
.vignette.froide::after{background:linear-gradient(90deg,var(--sarcelle),var(--vert-500),var(--vert-300))}
.vignette.terre::after{background:linear-gradient(90deg,var(--terre),var(--abricot),var(--safran))}

@media (prefers-reduced-motion:no-preference){
  .vignette img{animation:ac-vignette .6s var(--ease) both}
}
@keyframes ac-vignette{from{opacity:0;transform:scale(1.02) translateY(6px)}to{opacity:1;transform:none}}

/* =============================================================================================
   MOUVEMENT

   Le mouvement sert la lecture : il dit d'où une chose vient et où elle va. Il ne réclame
   jamais l'attention, ne pulse pas, ne rebondit pas, et ne signale aucune activité d'autrui —
   ce serait exactement le compteur que la charte s'interdit.

   Tout est désarmé d'un bloc sous prefers-reduced-motion, à la fin du fichier.
   ============================================================================================= */

@keyframes ac-monte{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}
@keyframes ac-fondu{from{opacity:0}to{opacity:1}}
@keyframes ac-tourne{from{transform:rotate(0)}to{transform:rotate(360deg)}}
@keyframes ac-trace{from{stroke-dashoffset:var(--long,300)}to{stroke-dashoffset:0}}

@media (prefers-reduced-motion:no-preference){
  .wrap>.tete,.wrap>.card,.wrap>.box,.wrap>.grid,.wrap>.chiffres,.wrap>.pool,.wrap>.duo,
  .wrap>.bandeau-saison,.wrap>.etats,.wrap>.panneaux{animation:ac-monte .42s var(--ease) both}
  .wrap>*:nth-child(2){animation-delay:.05s}
  .wrap>*:nth-child(3){animation-delay:.10s}
  .wrap>*:nth-child(4){animation-delay:.15s}
  .wrap>*:nth-child(5){animation-delay:.20s}
  .wrap>*:nth-child(6){animation-delay:.25s}
  .wrap>*:nth-child(n+7){animation-delay:.3s}

  .chiffres>.chiffre{animation:ac-monte .4s var(--ease) both}
  .chiffres>.chiffre:nth-child(2){animation-delay:.06s}
  .chiffres>.chiffre:nth-child(3){animation-delay:.12s}
  .chiffres>.chiffre:nth-child(4){animation-delay:.18s}
  .chiffres>.chiffre:nth-child(5){animation-delay:.24s}

  .rang{animation:ac-fondu .5s ease both}
  .rang:nth-child(2){animation-delay:.04s}
  .rang:nth-child(3){animation-delay:.08s}
  .rang:nth-child(4){animation-delay:.12s}
  .rang:nth-child(n+5){animation-delay:.16s}

  /* Seule la bulle qu'on vient d'écrire monte. Animer les vingt messages d'un fil à
     chaque ouverture, c'est faire bouger ce qu'on vient lire. */
  .msg.entrant{animation:ac-monte .28s var(--ease) both}

  /* L'anneau du sceau, en fond d'écran d'entrée. Cent soixante secondes par tour : on ne le voit
     pas tourner, on le voit avoir tourné en revenant sur la page. */
  .anneaux{animation:ac-tourne 160s linear infinite}
}


/* =============================================================================================
   LA FORMATION — rythme, blocs, compositions de phase

   Ce vocabulaire vivait dans `declaratif/static/declaratif/formation.css`, chargée par un
   `{% block tete %}` de deux gabarits sur quatre. Deux défauts en sont sortis, tous deux visibles
   à l'écran et invisibles aux tests :

     - `formation_sommaire.html` inclut les dix compositions de phase mais ne chargeait pas la
       feuille qui les dessine. Un SVG sans style prend sa taille par défaut (300 × 150) et son
       remplissage par défaut (noir) : les dix repères géométriques du sommaire sortaient en
       disques noirs pleine colonne.
     - la barre de progression du module s'appelait `.rail`, nom que la présente feuille donnait
       depuis le 01/09 à la barre latérale de la console opérateur. Les segments héritaient donc
       de `flex-direction:column` et se rendaient en gélules géantes. Exactement l'accident de
       `.secours`, une semaine plus tôt.

   La cause commune est une feuille par gabarit, à côté d'une feuille partagée. Elle disparaît
   ici : tout est dans ce fichier, que tous les gabarits chargent. La barre de progression
   s'appelle `.jalons`. La console, elle, a cessé d'appeler la sienne `.rail` le 09/09/2026 :
   elle s'appelle `.poste`, parce que c'est un poste de travail, et parce que le mot `.rail` a
   pris un second sens côté membre le 08/09 — la colonne claire d'un lieu. Un mot, un objet.
   ============================================================================================= */

/* ------------------------------------------------------------------ RYTHME */

@media screen {
  [data-rythme="on"] .etape { display: none; }
  [data-rythme="on"] .etape.active { display: block; animation: etape-entre .22s ease-out both; }
  [data-rythme="on"] .etape:focus { outline: none; }
}

@keyframes etape-entre {
  from { opacity: 0; transform: translateY(6px); }
  to   { opacity: 1; transform: none; }
}

@media (prefers-reduced-motion: reduce) {
  [data-rythme="on"] .etape.active { animation: none; }
}

.jalons {
  display: flex;
  gap: var(--space-1);
  margin: 0 0 var(--space-2);
}

.jalons .seg {
  flex: 1;
  height: 5px;
  min-width: 0;
  padding: 0;
  border: 0;
  border-radius: var(--radius-pilule);
  background: var(--line);
  cursor: pointer;
  transition: background .18s, transform .18s;
}

.jalons .seg.fait { background: var(--vert-300); }
.jalons .seg.ici  { background: var(--vert-700); transform: scaleY(1.8); }
.jalons .seg:disabled { cursor: default; }
.jalons .seg:not(:disabled):hover { background: var(--vert-500); }
.jalons .seg:focus-visible { outline: 2px solid var(--focus); outline-offset: 3px; }

.rythme-tete {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: var(--space-3);
  margin: 0 0 var(--space-4);
}

.rythme-nav {
  display: flex;
  justify-content: space-between;
  gap: var(--space-3);
  margin: var(--space-1) 0 var(--space-4);
}

.rythme-nav .btn:disabled { opacity: .4; cursor: default; }

/* --------------------------------------------------------- MÉMOIRE DES NOTES */

.memoire {
  border: 1px solid var(--line);
  border-left: 4px solid var(--laiton-2);
  background: var(--laiton-pale);
  border-radius: var(--radius-carte);
  padding: var(--space-4) var(--space-4);
  margin: var(--space-4) 0 0;
}

.memoire .bascule {
  display: flex;
  align-items: flex-start;
  gap: var(--space-3);
  font-size: var(--text-2);
  font-weight: 600;
  color: var(--vert-900);
  cursor: pointer;
}

.memoire .bascule input { margin: 2px 0 0; flex: none; }
.memoire p { margin: var(--space-2) 0 0; }
.memoire [data-memoire-effacer] { margin-top: var(--space-3); }

/* ------------------------------------------------------------ RÉCAPITULATIF */

.recap-module {
  border-top: 1px solid var(--line-soft);
  padding-top: var(--space-4);
  margin-top: var(--space-4);
}

.recap-module:first-child { border-top: 0; padding-top: 0; margin-top: 0; }
.recap-module h3 { margin: 0 0 2px; font-size: var(--text-3); }
.recap-module .kick { display: block; margin: 0 0 var(--space-3); }

.recap-label {
  margin: var(--space-3) 0 2px;
  font-size: var(--text-1);
  color: var(--ink-mute);
}

.recap-valeur {
  margin: 0;
  font-family: var(--serif);
  font-size: var(--text-3);
  line-height: 1.5;
  white-space: pre-wrap; /* la mise en page du membre est son propos, pas un accident */
  border-left: 3px solid var(--vert-100);
  padding-left: var(--space-3);
}

/* ------------------------------------------------------------------ IMPRESSION */

@media print {
  .jalons, .rythme-tete, .rythme-nav, .memoire { display: none !important; }
  .recap-module { break-inside: avoid; }
}

/* ------------------------------------------------------ TYPOLOGIE DES BLOCS (LOT 9)

Le contenu de la formation distingue quatorze types de blocs — pourquoi, repère, exemple,
arrêt, à vérifier, divergence... — et le rendu les confondait : cinq se rendaient en carte
plate identique, et trois paires partageaient la même couleur. Un avertissement de sécurité
ressemblait à un exemple.

La lecture se fait carte par carte, une seule à l'écran : le repère ne sert donc pas à parcourir
une colonne, il sert à savoir en un coup d'œil, avant d'avoir lu un mot, sur quoi on vient de
tomber. Un exercice, une règle, un danger.

Aucune couleur nouvelle. La marque a déjà sa palette et je n'y touche pas — la distinction vient
de trois choses combinées : un repère géométrique, un fond, une épaisseur de filet.

Les repères sont dessinés dans le vocabulaire du sceau (le cercle, les repères du cadran, l'arc,
le seuil), jamais empruntés à une bibliothèque d'icônes. Ils sont posés en masque CSS et non en
SVG dans le gabarit — même technique que `.eyebrow::before` sur kismain.fr : la couleur reste
un token, et le gabarit ne se remplit pas de balises. */

.bloc {
  position: relative;
  padding-left: var(--space-8);
}

.bloc::before {
  content: "";
  position: absolute;
  left: 16px;
  top: 20px;
  width: 18px;
  height: 18px;
  /* Transparent par défaut : un bloc sans repère garde la gouttière et n'y dessine rien. La
     colonne de lecture ne bouge donc pas d'un type de bloc à l'autre — sans cela le texte
     sautait de vingt-huit pixels entre un exemple et un simple paragraphe. */
  background-color: var(--marque, transparent);
  -webkit-mask: var(--repere) no-repeat center / contain;
  mask: var(--repere) no-repeat center / contain;
}

/* Sous 520 px la gouttière mange trop de largeur : le repère passe au-dessus du texte, à la
   hauteur de l'étiquette, plutôt que de comprimer la colonne de lecture. */
@media (max-width: 520px) {
  .bloc { padding-left: var(--space-4); }
  .bloc::before { left: 18px; top: 14px; width: 15px; height: 15px; }
  .bloc .tag, .bloc .kick { padding-left: var(--space-5); }
}

/* --- Ce qui explique : fond papier, repère discret ------------------------------------- */
.bloc-pourquoi { --marque: var(--vert-500); }
.bloc-exemple  { --marque: var(--ink-mute); }
.bloc-schema   { --marque: var(--vert-300); }

/* --- Ce qui fait autorité : le sceau, et le fond vert pâle ----------------------------- */
.bloc-repere { --marque: var(--vert-700); }
.bloc-resume { --marque: var(--vert-700); }

/* --- Ce qui demande un geste : fond sable, repère laiton ------------------------------- */
.bloc-preparer  { --marque: var(--laiton-texte); }
.bloc-verifier  { --marque: var(--laiton-texte); }
.bloc-reflexion { --marque: var(--laiton-texte); }
.bloc-tri       { --marque: var(--laiton-texte); }

/* --- Ce qui avertit, et ce qui secourt : deux choses différentes ----------------------- */
.bloc-arret      { --marque: var(--stop); }
.bloc-ressources { --marque: var(--stop); }

/* --- Ce qui nuance --------------------------------------------------------------------- */
.bloc-divergence { --marque: var(--ink-soft); }

/* Les tracés. Un point de départ, un losange pour le cas particulier, le sceau pour la règle,
   trois points pour les trois idées, un chevron pour ce qui précède, une case pour ce qui se
   contrôle, un cercle vide pour ce qu'on remplit soi-même, deux arcs qui s'écartent pour la
   divergence, le triangle pour le danger, la croix pour le secours. */
.bloc-pourquoi   { --repere: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='6'/%3E%3C/svg%3E"); }
.bloc-exemple    { --repere: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 3 L21 12 L12 21 L3 12 Z' fill='none' stroke='%23000' stroke-width='2'/%3E%3C/svg%3E"); }
.bloc-schema     { --repere: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M3 18 L10 8 L17 15 L22 6' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E"); }
.bloc-repere     { --repere: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='13' r='9' fill='none' stroke='%23000' stroke-width='2'/%3E%3Cpath d='M12 0 L12 5' stroke='%23000' stroke-width='3' stroke-linecap='round'/%3E%3C/svg%3E"); }
.bloc-resume     { --repere: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Ccircle cx='4' cy='12' r='2.6'/%3E%3Ccircle cx='12' cy='12' r='2.6'/%3E%3Ccircle cx='20' cy='12' r='2.6'/%3E%3C/svg%3E"); }
.bloc-preparer   { --repere: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M8 4 L16 12 L8 20' fill='none' stroke='%23000' stroke-width='2.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E"); }
.bloc-verifier   { --repere: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Crect x='3' y='3' width='18' height='18' rx='3' fill='none' stroke='%23000' stroke-width='2'/%3E%3Cpath d='M7 12 L11 16 L17 8' fill='none' stroke='%23000' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E"); }
.bloc-reflexion  { --repere: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='9' fill='none' stroke='%23000' stroke-width='2' stroke-dasharray='3 3.4'/%3E%3C/svg%3E"); }
.bloc-tri        { --repere: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M3 6 H21 M3 12 H15 M3 18 H9' stroke='%23000' stroke-width='2.4' stroke-linecap='round'/%3E%3C/svg%3E"); }
.bloc-arret      { --repere: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 3 L22 20 H2 Z' fill='none' stroke='%23000' stroke-width='2' stroke-linejoin='round'/%3E%3Cpath d='M12 9 V14' stroke='%23000' stroke-width='2.4' stroke-linecap='round'/%3E%3Ccircle cx='12' cy='17' r='1.3'/%3E%3C/svg%3E"); }
.bloc-ressources { --repere: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 4 V20 M4 12 H20' stroke='%23000' stroke-width='3.4' stroke-linecap='round'/%3E%3C/svg%3E"); }
.bloc-divergence { --repere: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M3 12 C9 12 11 5 21 4' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round'/%3E%3Cpath d='M3 12 C9 12 11 19 21 20' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round'/%3E%3C/svg%3E"); }

/* ------------------------------------------- OUVERTURE DE PHASE (LOT 9)

Une composition par phase, montrée au premier module de chacune. Elle marque un passage : dix
phases, dix moments distincts, et la formation se lit sur plusieurs séances — savoir qu'on entre
dans « Se protéger » plutôt que de continuer à faire défiler des cartes vaut mieux qu'un titre
seul.

Le tracé se dessine une fois, à l'arrivée sur la page. C'est la seule animation du parcours et
elle a une raison : elle dit qu'on franchit quelque chose. Ailleurs, les cartes se contentent
d'apparaître. Sous `prefers-reduced-motion`, tout est dessiné d'emblée. */

.compo {
  display: block;
  width: 190px;
  max-width: 100%;
  height: auto;
  margin: 0 0 var(--space-3);
}

.compo .anneau {
  fill: none;
  stroke: var(--line);
  stroke-width: 1.5;
}

.compo .cadran line {
  stroke: var(--vert-300);
  stroke-width: 2.4;
  stroke-linecap: round;
}

/* Le vert est celui qui lit, le laiton est l'autre. La même convention que le wordmark, où les
   deux points du mot « Kismain » portent déjà ces deux couleurs. */
.compo .soi   { fill: var(--vert-700); }
.compo .autre { fill: var(--laiton); }
.compo .temoin { fill: var(--ink-soft); }

.compo .halo {
  fill: none;
  stroke: var(--vert-100);
  stroke-width: 6;
}

.compo .lien,
.compo .bouclier,
.compo .reparation,
.compo .regard {
  fill: none;
  stroke: var(--vert-500);
  stroke-width: 2.2;
  stroke-linecap: round;
}

.compo .bouclier { stroke: var(--vert-700); stroke-width: 5; }
.compo .horizon  { stroke: var(--laiton-2); stroke-width: 1.8; opacity: .8; }
/* Phase 10 : le trait sort par la brèche. Sans lui, l'anneau ouvert dit que le cadre s'est
   desserré, pas qu'on le franchit — et « Commencer » est la conclusion de toute la série. Vert
   plein et non laiton pâle, à la différence de l'horizon de la phase 5 : là on imaginait, ici
   on y va. */
.compo .sortie   { stroke: var(--vert-700); }
.compo .scelle   { stroke: var(--laiton); }
.compo .reparation { stroke: var(--laiton); stroke-width: 2.6; }
.compo .regard   { stroke: var(--ink-mute); stroke-width: 1.4; }
/* Phase 10, « Commencer » : l'anneau s'ouvre. La brèche est portée par le tracé lui-même, en
   pointillé calculé, et non peinte par-dessus avec la couleur du fond — celle-ci dépendrait de
   la carte sur laquelle la composition est posée, et la brèche sortirait beige sur du blanc. */
.compo .anneau.ouvert { stroke-dasharray: 250 39; }
.compo .pointille { stroke-dasharray: 4 4; }

@media (prefers-reduced-motion: no-preference) {
  .compo .anneau:not(.ouvert) { stroke-dasharray: 290; stroke-dashoffset: 290; animation: tracer .9s ease-out .05s forwards; }
  .compo .anneau.ouvert { opacity: 0; animation: paraitre .6s ease-out .2s forwards; }
  .compo .cadran line { opacity: 0; animation: paraitre .3s ease-out forwards; }
  .compo .cadran line:nth-child(1) { animation-delay: .5s }
  .compo .cadran line:nth-child(2) { animation-delay: .56s }
  .compo .cadran line:nth-child(3) { animation-delay: .62s }
  .compo .cadran line:nth-child(4) { animation-delay: .68s }
  .compo .cadran line:nth-child(5) { animation-delay: .74s }
  .compo .cadran line:nth-child(6) { animation-delay: .8s }
  .compo .cadran line:nth-child(7) { animation-delay: .86s }
  .compo .cadran line:nth-child(8) { animation-delay: .92s }
  .compo circle:not(.anneau):not(.halo) { opacity: 0; animation: paraitre .35s ease-out .75s forwards; }
  .compo .halo { stroke-dasharray: 115; stroke-dashoffset: 115; animation: tracer .7s ease-out .8s forwards; }
  /* Le lien vient en dernier : c'est ce que la phase raconte, pas ce par quoi elle commence. */
  .compo path { stroke-dasharray: 200; stroke-dashoffset: 200; animation: tracer .8s ease-out 1s forwards; }
}

@keyframes tracer { to { stroke-dashoffset: 0 } }
@keyframes paraitre { to { opacity: 1 } }

/* L'en-tête de phase : la composition, puis le titre. Sur écran étroit elle passe au-dessus,
   jamais à côté — 190 px de large ne laisseraient plus assez de place au titre. */
.ouverture-phase {
  display: flex;
  align-items: center;
  gap: var(--space-5);
  margin: 0 0 var(--space-5);
  padding: 0 0 var(--space-4);
  border-bottom: 1px solid var(--line-soft);
}
.ouverture-phase .compo { margin: 0; flex: 0 0 auto; }
.ouverture-phase .titre { margin: 0; }
.ouverture-phase .numero { display: block; }

@media (max-width: 560px) {
  .ouverture-phase { display: block; }
  .ouverture-phase .compo { margin: 0 0 var(--space-3); }
}

/* Au sommaire, la même composition en petit. Elle donne aux dix phases un air de famille et
   rend la liste parcourable : on retrouve d'un coup d'œil où l'on s'était arrêté, sans relire
   les titres. Le cadran devient illisible à cette taille et disparaît, le reste tient. */
.phase-tete {
  display: flex;
  align-items: center;
  gap: var(--space-3);
  margin: var(--space-5) 0 var(--space-2);
}
.phase-tete h2 { margin: 0; }
.phase-tete .compo { width: 62px; margin: 0; flex: 0 0 auto; }
.phase-tete .compo .cadran { display: none; }
.phase-tete .compo .anneau { stroke-width: 2.4; }

.tri-etiq{display:flex;flex-wrap:wrap;gap:var(--space-2);margin:0 0 var(--space-4)}
.tri-et{background:var(--paper);border:1px solid var(--line);border-radius:var(--radius-pilule);padding:var(--space-2) var(--space-3);font-size:var(--text-2);cursor:pointer;font-family:inherit}
.tri-et[aria-pressed="true"]{border-color:var(--vert-700);background:var(--vert-50);font-weight:600}
.tri-et.placed{opacity:.35;pointer-events:none;text-decoration:line-through}
.tri-bacs{display:grid;gap:var(--space-3);margin:0 0 var(--space-3)}
@media(min-width:640px){.tri-bacs{grid-template-columns:repeat(4,1fr)}}
.tri-bac{border:2px dashed var(--line);border-radius:var(--radius-champ);padding:var(--space-3);min-height:110px;background:var(--sable-2);cursor:pointer;text-align:left;width:100%;font-family:inherit}
.tri-bac h5{margin:0 0 var(--space-1);font-family:var(--serif);font-size:var(--text-2);color:var(--titre)}
.tri-bac .d{font-size:var(--text-1);color:var(--ink-soft);margin-bottom:var(--space-2)}
.tri-bac .it{background:var(--paper);border:1px solid var(--line);border-radius:var(--radius-champ);padding:var(--space-1) var(--space-2);font-size:var(--text-1);margin-bottom:var(--space-1);display:flex;justify-content:space-between;gap:var(--space-2)}
.tri-bac .it button{background:none;border:0;color:var(--ink-soft);padding:0 var(--space-1);cursor:pointer;font-family:inherit}
.tri-bac[data-k="0"]{border-style:dotted}.tri-bac[data-k="1"]{border-style:dashed;border-color:var(--vert-100)}
.tri-bac[data-k="2"]{border-style:solid;border-color:#E4CDBB}.tri-bac[data-k="3"]{border-style:double;border-width:4px;border-color:#E0B6B0}
.skip{background:var(--paper);border:1px solid var(--line);border-radius:var(--radius-pilule);padding:var(--space-2) var(--space-4);font-size:var(--text-2);color:var(--ink-soft);cursor:pointer;font-family:inherit}
.skip:hover{border-color:var(--vert-500);color:var(--accent)}
.refl-bloc.skipped .refl-champ{opacity:.5}
.q{border:1px solid var(--line);border-radius:var(--radius-champ);padding:var(--space-4);margin-bottom:var(--space-3);background:var(--paper)}
.q .qq{font-weight:600;margin-bottom:var(--space-2)}
.opt{display:block;width:100%;text-align:left;background:var(--sable-2);border:1px solid var(--line);border-radius:var(--radius-champ);padding:var(--space-3) var(--space-3);margin-bottom:var(--space-2);font-size:var(--text-3);cursor:pointer;font-family:inherit}
.opt:hover{border-color:var(--vert-500)}
.opt.ok{background:var(--vert-50);border-color:var(--vert-700);border-left:5px solid var(--vert-700);font-weight:600}
.opt.no{background:var(--stop-pale);border-color:#E0B6B0;border-left:5px solid var(--stop)}
.fb{font-size:var(--text-2);margin-top:var(--space-2);padding:var(--space-3) var(--space-3);border-radius:var(--radius-champ);background:var(--sable-2);border:1px solid var(--line-soft);color:var(--ink-soft)}
.fb.ok{background:var(--vert-50);border-color:var(--vert-100);color:var(--accent)}

/* Le désarmement. Un seul bloc, à la fin, qui gagne sur tout ce qui précède. */
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation-duration:.001ms!important;animation-iteration-count:1!important;
    transition-duration:.001ms!important;scroll-behavior:auto!important}
}

/* Impression : ni châssis, ni boutons flottants, ni ombres. */
@media print{
  .topnav,.poste,.tiersnav,.exit,.secours-flottant,.jalons,.rythme-tete,.rythme-nav,
  .memoire,.btnrow,.no-print{display:none!important}
  body,body.op,body.tiers{background:#fff}
  .wrap{max-width:none;padding:0}
  .card{box-shadow:none;border-color:#ccc;break-inside:avoid}
}

/* Un sujet à aborder, dans le rail de l'échange (LOT 14, 02/09/2026). Le titre, la raison, puis
   la question telle qu'on pourrait l'écrire — entre guillemets, en serif, parce que ce sont des
   mots à reprendre et non une consigne à suivre. */
.sujet{padding:var(--space-3) 0;border-top:1px solid var(--ligne-froide)}
.sujet:first-of-type{border-top:0;padding-top:2px}
.sujet b{display:block;font-family:var(--serif);font-size:var(--text-3);color:var(--titre);
  font-weight:600;line-height:1.3}
.sujet .pourquoi{display:block;font-size:var(--text-2);color:var(--ink-soft);margin:2px 0 0}
.sujet .question{margin:var(--space-2) 0 0;font-family:var(--serif);font-size:var(--text-3);line-height:1.5;
  color:var(--ink);border-left:2px solid var(--safran);padding-left:var(--space-3)}

/* LA RELECTURE D'AVANT FIGEAGE — LOT 14, 03/09/2026.
   Console opérateur uniquement, dans la carte « Publier ». Quatre natures d'observation, et la
   couleur dit laquelle : une contradiction avec les paramètres réels de la saison n'a pas le
   même poids qu'une phrase ambiguë. Rien ici n'est un verrou — l'opérateur publie s'il veut,
   et le ton des règles le dit. */
.relecture{border:1px solid var(--line);border-radius:var(--radius-carte);background:var(--sable-2);
  padding:14px 16px;margin:0 0 14px}
.relecture h3{margin:0 0 10px;font-family:var(--serif);font-size:.95rem;font-weight:600;
  color:var(--titre)}
.relecture .mention{margin:10px 0 0}
.obs{padding:9px 0;border-top:1px solid var(--line)}
.obs:first-of-type{border-top:0;padding-top:0}
.obs p{margin:var(--space-1) 0 0;font-size:.88rem;line-height:1.5;color:var(--ink)}
.obs .nature{display:inline-block;font-size:var(--text-1);text-transform:uppercase;
  letter-spacing:.11em;font-weight:700;padding:2px 7px;border-radius:var(--radius-pilule);
  background:var(--sable);color:var(--ink-soft)}
.obs .extrait{display:inline;margin-left:7px;font-family:var(--serif);font-size:.88rem;
  color:var(--ink-soft);font-style:italic}
.obs.contradiction .nature{background:var(--stop-pale);color:var(--stop)}
.obs.manque .nature{background:var(--safran-pale);color:var(--safran-texte)}
.obs.engagement .nature{background:var(--abricot-pale);color:var(--abricot-texte)}
.obs.ambiguite .nature{background:var(--sarcelle-pale);color:var(--sarcelle)}
.mention.ok{color:var(--accent)}

/* Une étiquette discrète accolée à une valeur dans un tableau — « non vérifiée » à côté d'une
   adresse, dans la liste des comptes. Elle nuance, elle n'alerte pas. */
.etiq{display:inline-block;margin-left:7px;font-size:var(--text-1);text-transform:uppercase;
  letter-spacing:.09em;font-weight:700;padding:1px 6px;border-radius:var(--radius-pilule);
  background:var(--laiton-pale);color:var(--laiton-texte);vertical-align:middle}

/* La seconde ligne d'une entrée de liste d'attente : ce que la personne a écrit en clair, sous
   ses réponses fermées. Elle appartient à la ligne du dessus, et le rendu doit le dire. */
tr.dit td{padding-top:0;border-top:0}
tr.dit p{margin:0 0 var(--space-1);font-size:var(--text-2);color:var(--ink-soft);line-height:1.5}
tr.dit p:last-child{margin-bottom:0}
tr.dit b{color:var(--ink);font-weight:600}

.vignette.illustree{background:var(--vert-900)}
.vignette .ill{display:block;width:100%;height:clamp(180px,26vw,300px)}
.vignette.haute .ill{height:clamp(240px,38vw,430px)}

/* L'AVANCEMENT DE LA FORMATION — LOT 22, 03/09/2026.
   Un module non lu n'avait aucune marque : l'œil ne distinguait pas « pas encore » de « rien à
   faire ». Et le compte par phase n'existait nulle part, alors qu'il tient en trois mots. */
.pill.attente{background:transparent;color:var(--ink-mute);border-color:var(--line);
  font-weight:500}
.compte-phase{font-family:var(--mono);font-size:var(--text-1);font-weight:500;letter-spacing:.06em;
  color:var(--ink-soft);margin-left:var(--space-3);white-space:nowrap;vertical-align:middle}
.ou-jen-suis{font-family:var(--mono);font-size:var(--text-1);letter-spacing:.08em;color:var(--ink-soft);
  white-space:nowrap}

/* --- LE SUIVI DES SAISONS, CONSOLE OPÉRATEUR — 04/09/2026 ---------------------------------
   Deux états signalés sur une ligne de tableau : celui qui bloquera la prochaine réservation,
   et celui qui en est à une saison du seuil. La couleur double le texte, elle ne le remplace
   pas : la colonne « sans suite d'affilée » porte déjà le nombre. */
tr.ligne-stop td{background:var(--stop-pale)}
tr.ligne-warn td{background:var(--laiton-pale)}
.pill.stop{background:var(--stop-pale);color:var(--stop);border-color:var(--stop-ligne)}

/* =============================================================================================
   M11 · LA LISTE DES ÉCHANGES — 05/09/2026

   Un objet qui se répète, et une seule information par ligne : qui, quand, et s'il y a quelque
   chose à faire. Pas de vignette, pas d'avatar, pas de compteur : le produit n'en a aucun, et
   en inventer un ici contredirait la charte à l'endroit le plus visible.
   ============================================================================================= */
.echs{display:grid;gap:0;border:1px solid var(--line);border-radius:var(--radius-carte);overflow:hidden;
  background:var(--paper);margin:0 0 var(--space-4)}
.ech{display:flex;align-items:center;gap:var(--space-4);padding:var(--space-4) var(--space-4);text-decoration:none;
  color:inherit;border-bottom:1px solid var(--line-soft)}
.ech:last-child{border-bottom:none}
.ech:hover{background:var(--sable-2)}
.ech-qui{display:flex;flex-direction:column;gap:var(--space-1);min-width:0;flex:1}
.ech-qui b{font-size:var(--text-3);font-weight:600}
.ech-quand{font-size:var(--text-2);color:var(--ink-soft)}
.ech-etats{display:flex;gap:var(--space-2);flex-wrap:wrap;justify-content:flex-end;flex:0 1 auto}
.ech-fleche{flex:0 0 auto;color:var(--ink-mute);display:flex}
.ech:hover .ech-fleche{color:var(--accent)}
.ech.clos{opacity:.62}
.ech .pill.a_vous{background:var(--vert-plein);color:#fff;border-color:var(--vert-plein)}
.ech .pill.pause{background:var(--laiton-pale);color:var(--laiton-texte);border-color:var(--laiton-filet)}
.ech .pill.differe{background:var(--sable-2);color:var(--ink-soft);border-color:var(--line)}
/* LOT 24bis (07/09/2026) — le résumé de la frise de parcours : neutre, jamais vert (qui dit déjà
   « à vous » sur cette même ligne), simplement le repère de où on en est. */
.ech .pill.etape{background:var(--sable-2);color:var(--ink-soft);border-color:var(--line)}

/* Le bouton qui mène à une conversation ne doit pas ressembler à celui qui en ouvre une :
   dans une liste de vingt profils, c'est le seul repère qu'on cherche. */
.btn.vers-echange{background:var(--sarcelle,#2E6B6B);border-color:var(--sarcelle,#2E6B6B)}
.btn.vers-echange:hover{background:#1F5555;border-color:#1F5555}

@media (max-width:620px){
  .ech{flex-wrap:wrap;gap:var(--space-2)}
  .ech-etats{flex-basis:100%;justify-content:flex-start}
  .ech-fleche{display:none}
}

/* Le fil d'appels de l'opérateur — 10/09/2026. Une liste fermée et un bouton, sur une ligne de
   tableau : il n'y a rien d'autre à saisir, et c'est le sujet (aucun champ de note, A-10). */
body.op .appel-fil{display:flex;gap:var(--e2);align-items:center;margin:0}
body.op .appel-fil select{font:inherit;font-size:var(--op-t2);padding:5px 8px;border-radius:var(--r-sm);
  border:1px solid var(--gr-100);background:var(--paper);color:var(--gr-900)}

/* LE FILTRE DE CRITÈRES DE LA CONCORDANCE — 10/09/2026.
   Un formulaire GET, sans script. Il ne retire aucune personne de la liste : il choisit ce qu'on
   mesure. La distinction est écrite dans le gabarit, elle est le cœur de l'arbitrage A-31. */
body.op .criteres-filtre{margin:var(--e4) 0;padding:var(--e3) var(--e4);border:1px solid var(--gr-100);
  border-radius:var(--r-sm);background:var(--gr-25)}
body.op .criteres-cases{display:flex;flex-wrap:wrap;gap:var(--e2) var(--e4);margin:var(--e2) 0 0}
body.op .criteres-cases label{display:inline-flex;align-items:center;gap:var(--e1);font-size:var(--op-t2);
  cursor:pointer}
body.op .criteres-agir{display:flex;align-items:center;gap:var(--e3);margin-top:var(--e3)}

/* =============================================================================================
   LES HUIT ÉTAPES DU DOSSIER, COCHÉES — accueil du membre, 11/09/2026 (declaratif/dossier.py).
   Une liste, pas des cartes : le récapitulatif doit se lire d'un coup d'œil.
   ============================================================================================= */
.dossier-etapes{list-style:none;margin:var(--space-2) 0 var(--space-2);padding:0;display:grid;gap:var(--space-2)}
.dossier-etapes a{display:flex;align-items:baseline;gap:var(--space-3);padding:var(--space-3) var(--space-3);border:1px solid var(--line);
  border-radius:var(--radius-carte);background:var(--paper);color:var(--ink);text-decoration:none}
.dossier-etapes a:hover{border-color:var(--accent)}
.dossier-etapes .coche{width:1.4em;text-align:center;flex:0 0 auto}
.dossier-etapes .num{color:var(--ink-mute);font-variant-numeric:tabular-nums}
.dossier-etapes .fait a{border-color:var(--vert-plein)}
.dossier-etapes .lecture a{color:var(--ink-soft)}
.dossier-etapes .a-faire .coche{color:var(--ink-mute)}

/* =============================================================================================
   LE PARCOURS DU DOSSIER — 11/09/2026.

   Le retour d'une étape à la précédente, et de l'air au-dessus des titres de section : sur
   « Vos contraintes », huit rubriques se suivaient sans respiration, et le titre de l'une
   collait à la dernière question de la précédente. Un filet fin suffit à séparer.
   ============================================================================================= */
.retour-etape{margin:var(--space-4) 0 var(--space-2)}
.index-coche{margin-left:auto;padding-left:var(--space-3);display:flex;align-items:center}

/* --- LE SCEAU D'UNE ÉTAPE REMPLIE, ET SES DEUX ABSENCES — 17/09/2026 --------------------------
   L'emoji ✅ marquait les étapes remplies, à l'accueil et sur l'index du dossier. Le Fondateur :
   « enlève la case verte cochée ou remplace-la par quelque chose de plus joli, plus singulier et
   en phase avec notre univers ».

   Trois états, et ils se distinguent par la FORME avant la couleur : un sceau plein pour ce qui
   est fait, un anneau vide pour ce qui attend, un point pour ce qui se lit sans se remplir.
   Quelqu'un qui ne distingue pas le laiton du vert voit encore trois choses différentes. */
.coche-fait{width:20px;height:20px}
.coche-vide,.coche-lecture{
  width:20px;height:20px;flex:0 0 auto;display:inline-block;border-radius:50%;
}
.coche-vide{border:2px solid var(--contour-champ)}
/* Une étape qui se LIT n'attend rien : ni sceau, ni anneau à remplir, un simple repère. */
.coche-lecture{position:relative}
.coche-lecture::after{
  content:"";position:absolute;inset:0;margin:auto;width:6px;height:6px;border-radius:50%;
  background:var(--ink-mute);
}

.retour-etape a{color:var(--ink-soft);text-decoration:none;font-size:var(--text-3)}
.retour-etape a:hover{color:var(--ink);text-decoration:underline}
body:not(.op):not(.tiers) .card>h2~h2{margin-top:var(--space-6);padding-top:var(--space-5);border-top:1px solid var(--line-soft)}

/* --- LA RÉGIE, SUITE : boutons admin, pastilles, bande cuivre (12/09/2026) -------------------- */
/* Les boutons admin : cuivre, quel que soit leur degré. */
body.op .btn.adm{background:linear-gradient(175deg,var(--op-cuivre),#8A4A1A);border-color:var(--op-cuivre)}
body.op .btn.adm:hover{background:linear-gradient(175deg,#C97A3B,#8A4A1A);
  box-shadow:0 4px 14px -4px rgba(184,103,43,.55)}
body.op .btn.n.adm,body.op .plan a.btn.n.adm{background:var(--paper);color:var(--op-cuivre-texte);
  border:1px solid var(--op-cuivre)}
body.op .btn.n.adm:hover{background:var(--op-cuivre-pale);color:var(--op-cuivre-texte)}
body.op .card.admin-carte{border-color:rgba(184,103,43,.4)}
body.op .bande-cuivre{display:flex;align-items:center;gap:10px;font-family:var(--mono);
  font-size:var(--op-t1);letter-spacing:.12em;text-transform:uppercase;color:var(--op-cuivre-texte);
  margin:var(--e4) 0 var(--e2)}
body.op .bande-cuivre::before{content:"";flex:none;width:28px;height:3px;background:var(--op-cuivre);
  border-radius:2px}

/* Les pastilles d'état, nommées par leur sens et non par leur couleur. */
body.op .pill.etat{background:var(--gr-50);color:var(--gr-600);border-color:var(--gr-100)}
body.op .pill.attend{background:var(--op-safran-pale);color:var(--op-safran-texte);border-color:#F0DDB0}
body.op .pill.fait{background:var(--op-jade-pale);color:var(--op-jade-texte);border-color:#BFE3D3}
body.op .pill.alerte{background:var(--op-corail-pale);color:var(--op-corail-texte);border-color:#EFC3BE}
body.op .pill.admin{background:var(--op-cuivre-pale);color:var(--op-cuivre-texte);border-color:#E7C7AE}

body.op .mono-champ{font-family:var(--mono)}
body.op table.journal td{font-size:var(--op-t2)}
body.op form.filtres .btnrow{margin-top:var(--e3)}

/* --- LES MEMBRES (brief 24, §4.2) : le tableau avec panneau, la fiche à volets --------------- */
body.op .filtres-ligne{display:flex;flex-wrap:wrap;gap:var(--e2) var(--e3);align-items:flex-end;
  margin:0 0 var(--e4);padding:var(--e3) var(--e4);background:var(--paper);
  border:1px solid var(--gr-100);border-radius:var(--r-sm)}
body.op .filtres-ligne label.f{margin:0;flex:0 1 160px;font-size:var(--op-t2)}
body.op .filtres-ligne label.chk{margin:0 0 6px}
body.op .avec-panneau{display:grid;grid-template-columns:minmax(0,1fr);gap:var(--e4);align-items:start}
body.op .avec-panneau.ouvert{grid-template-columns:minmax(0,1fr) 340px}
body.op .panneau{position:sticky;top:var(--e4);background:var(--paper);border:1px solid var(--gr-100);
  border-left:3px solid var(--op-azur);border-radius:var(--r-sm);padding:var(--e4);
  box-shadow:var(--shadow-op)}
body.op .panneau-tete{display:flex;flex-wrap:wrap;gap:var(--e2);align-items:center;margin:0 0 var(--e3)}
body.op .panneau-tete h3{margin:0;flex-basis:100%;font-size:var(--op-t4)}
body.op .panneau-fermer{margin-left:auto;font-size:var(--op-t1);color:var(--gr-500)}
body.op .panneau-faits{margin:0 0 var(--e3);display:grid;grid-template-columns:auto 1fr;gap:4px var(--e3);
  font-size:var(--op-t2)}
body.op .panneau-faits dt{color:var(--gr-500);font-family:var(--mono);font-size:var(--op-t1);
  letter-spacing:.06em;text-transform:uppercase;padding-top:2px}
body.op .panneau-faits dd{margin:0}
body.op tr.ouverte td{background:var(--op-azur-pale)}
body.op .barre-groupe{display:flex;flex-wrap:wrap;gap:var(--e2);align-items:center;
  padding:var(--e3) var(--e4);border-top:1px solid var(--gr-100);background:var(--gr-25)}
body.op .barre-groupe select{padding:6px 10px;font-size:var(--op-t2)}
body.op .identite{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:var(--e3);
  margin:0 0 var(--e4)}
body.op .identite>div{background:var(--paper);border:1px solid var(--gr-100);border-radius:var(--r-sm);
  padding:var(--e2) var(--e3);font-size:var(--op-t2)}
body.op .identite span{display:block;font-family:var(--mono);font-size:var(--op-t1);letter-spacing:.08em;
  text-transform:uppercase;color:var(--gr-500)}
body.op .fiche-volets{display:flex;gap:2px;border-bottom:1px solid var(--gr-100);margin:0 0 var(--e4)}
body.op .plan a.fiche-volet{padding:8px 14px;font-size:var(--op-t3);color:var(--gr-500);
  border-bottom:2px solid transparent;margin-bottom:-1px;text-decoration:none}
body.op .plan a.fiche-volet.on{color:var(--gr-950);border-bottom-color:var(--op-azur);font-weight:600}
body.op .plan a.fiche-volet:hover{color:var(--gr-950)}
body.op .groupe-gestes{background:var(--paper);border:1px solid var(--gr-100);border-radius:var(--r-sm);
  padding:var(--e4);display:grid;grid-template-columns:200px minmax(0,1fr);gap:var(--e4);
  align-items:start;margin:0 0 var(--e4)}
body.op .groupe-gestes .lib{font-size:var(--op-t2);color:var(--gr-500)}
body.op .groupe-gestes .lib b{display:block;color:var(--gr-950);font-size:var(--op-t3);margin:0 0 2px}
body.op .groupe-gestes .lib .bande-cuivre{margin:0 0 var(--e2)}
body.op .groupe-gestes.adm{border-color:rgba(184,103,43,.4);
  background:linear-gradient(90deg,var(--op-cuivre-pale),var(--paper) 40%)}
body.op .gestes-corps{display:flex;flex-direction:column;gap:var(--e3);min-width:0}
body.op .geste-ligne{display:flex;flex-wrap:wrap;gap:var(--e2) var(--e3);align-items:flex-end;
  padding:var(--e2) 0;border-bottom:1px solid var(--gr-100)}
body.op .geste-ligne:last-child{border-bottom:0}
body.op .geste-ligne label.f{margin:0;flex:0 1 220px;font-size:var(--op-t2)}
body.op .geste-ligne>span{flex:1 1 260px}
body.op .geste-bloc{padding:var(--e3) 0;border-bottom:1px solid var(--gr-100)}
body.op .geste-bloc:last-child{border-bottom:0}
body.op .geste-bloc h3{margin:0 0 var(--e2);font-size:var(--op-t4)}
body.op .geste-bloc label.f{max-width:60ch}
/* --- LA BANDE DE REGARD — refondue le 17/09/2026 ---------------------------------------------
   Le Fondateur : « j'ai encore les travers de ma Régie qui se confond encore avec
   l'application ». C'était vrai deux fois.

   D'ABORD PARCE QU'ELLE S'AFFICHAIT À TORT. Les écrans du parcours passaient au gabarit une clé
   `regard` qui désignait autre chose — le marqueur « qui lira cette réponse » — et qui ÉCRASAIT
   celle du processeur de contexte. `{% if regard %}` devenait donc vrai pour n'importe quel
   membre, et un compte ordinaire voyait « Vous voyez cette interface comme la personne . » avec
   une référence vide, faute de la clé attendue. Le marqueur a été retiré ; il ne reste qu'un
   `regard`, celui de l'opérateur, et `tests/test_parcours_en_ecrans.py` le vérifie.

   ENSUITE PARCE QU'ELLE ÉTAIT HABILLÉE EN MEMBRE. `.box.stop` est le vocabulaire de
   l'application : sable, vert, arrondis. Une bande qui dit « vous n'êtes pas chez vous » doit
   porter la livrée de la Régie — graphite et azur, la fonte à chasse fixe — sinon elle se lit
   comme un message de l'application à son membre, ce qu'elle n'est pas.

   ELLE EST FIXE, ET C'EST AUSSI UNE CORRECTION DE MISE EN PAGE. Collante, elle restait un enfant
   du flux : dans la grille à trois bandes du parcours, elle devenait un QUATRIÈME enfant, la
   scène glissait d'une rangée et venait se peindre par-dessus le bandeau, avalant le clic sur
   « Mon dossier ». Hors du flux, elle ne peut plus décaler quoi que ce soit, nulle part. */
.regard-bandeau{
  position:fixed;top:0;left:0;right:0;z-index:var(--z-bandeau);
  display:flex;align-items:center;gap:10px;
  min-height:var(--h-regard);padding:4px var(--space-4);
  background:var(--gr-950);border-bottom:2px solid var(--op-azur);
  color:var(--gr-100);font-family:var(--mono);font-size:var(--text-1);letter-spacing:.03em;
}
.regard-marque{
  flex:0 0 auto;padding:2px 8px;border-radius:var(--radius-pilule);
  background:var(--op-azur);color:#fff;font-weight:700;text-transform:uppercase;
  letter-spacing:.08em;font-size:var(--text-0,11px);
}
.regard-dit{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.regard-dit b{color:#fff}
.regard-bandeau .regard-quitter{flex:0 0 auto;margin:0}
.regard-sortir{
  border:1px solid var(--gr-600);border-radius:var(--radius-pilule);background:none;
  color:var(--gr-100);font:inherit;padding:3px 11px;cursor:pointer;min-height:26px;
}
.regard-sortir:hover{border-color:var(--op-azur-clair);color:#fff}
/* Le corps se décale d'autant, puisque la bande ne prend plus de place dans le flux. */
body.regarde{padding-top:var(--h-regard)}

/* --- LA SAISON ET LE TABLEAU DE BORD (brief 24, §4.3 et §5, patrons 5 et 7) ------------------- */
body.op .tete-pills{display:flex;flex-wrap:wrap;gap:var(--e2);margin-top:var(--e2)}
body.op .plan a.pill{text-decoration:none}
/* LE BANDEAU D'ALERTE : une seule, en tête, avec son geste. Il descend, en CSS, coupé par
   prefers-reduced-motion. Corail : alerte, échec, mesure. */
body.op .bandeau-alerte{display:flex;align-items:center;gap:var(--e4);margin:0 0 var(--e4);
  padding:var(--e3) var(--e4);border-radius:var(--r-sm);background:var(--op-corail);color:#fff;
  animation:bandeau-descend .24s ease-out both}
body.op .bandeau-alerte .sur{display:block;font-family:var(--mono);font-size:var(--op-t1);
  letter-spacing:.12em;text-transform:uppercase;opacity:.85}
body.op .bandeau-alerte b{display:block;font-family:var(--serif);font-size:var(--op-t4);font-weight:600;
  line-height:1.25}
body.op .mono{font-family:var(--mono);font-size:var(--op-t1)}
body.op .bandeau-alerte .btn,body.op .plan .bandeau-alerte a.btn{margin-left:auto;background:#fff;
  color:var(--op-corail-texte);border-color:#fff;box-shadow:none;white-space:nowrap}
@keyframes bandeau-descend{from{transform:translateY(-10px);opacity:0}to{transform:none;opacity:1}}
/* LES TUILES : un nombre, une tendance, une phrase. Le filet du haut porte le sens. */
/* LE PILOTAGE DE LA RÉGIE — 21/09/2026. Les saisons dans le temps, puis le parcours en nombres.
   Une voie par saison, une seule échelle pour toutes, un trait pour aujourd'hui. Trois repères,
   trois FORMES avant trois couleurs : losange (décision de seuil), barre (saison), triangle (jour
   de décision des membres). Qui ne distingue pas le safran du corail voit encore trois choses. */
body.op .pilotage{background:var(--paper);border:1px solid var(--line);border-radius:var(--radius-carte);padding:var(--e4);
  margin:0 0 var(--e4)}
body.op .pilotage-tete{display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between;gap:6px 16px}
body.op .pilotage h2{font-family:var(--serif);font-size:var(--op-t4);margin:0}
body.op .pilotage-second{margin-top:var(--e4)!important;padding-top:var(--e4);border-top:1px solid var(--line-soft)}
body.op .pilotage-fenetre{font-family:var(--mono);font-size:var(--op-t1);color:var(--ink-mute)}
body.op .voies{position:relative;margin-top:var(--e3);display:grid;gap:4px}
body.op .voies-regle{position:relative;height:22px;margin-left:clamp(120px,22%,220px);border-bottom:1px solid var(--line)}
body.op .voies-regle span{position:absolute;top:0;translate:-50% 0;font-family:var(--mono);font-size:var(--op-t1);color:var(--ink-mute)}
body.op .voies-auj{position:absolute;top:0;bottom:0;width:2px;translate:-1px 0;background:var(--op-azur);z-index:2}
body.op .voies-auj b{position:absolute;bottom:100%;left:50%;translate:-50% 0;font:600 var(--op-t1) var(--sans);color:var(--op-azur-sombre);
  white-space:nowrap;background:var(--paper);padding:0 4px}
body.op .plan a.voie{display:grid;grid-template-columns:clamp(120px,22%,220px) 1fr;align-items:center;min-height:40px;
  text-decoration:none;color:inherit;border-radius:8px}
body.op .plan a.voie:hover{background:var(--op-azur-pale)}
body.op .voie-nom{display:grid;padding:3px 10px 3px 6px;line-height:1.2;min-width:0}
body.op .voie-nom b{font-size:var(--op-t2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
body.op .voie-nom span{font-size:var(--op-t1);color:var(--ink-mute);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
body.op .voie.test .voie-nom b{color:var(--ink-mute);font-weight:500}
body.op .voie-piste{position:relative;height:40px;border-left:1px solid var(--line-soft);
  background:repeating-linear-gradient(90deg,transparent 0 calc(16.666% - 1px),var(--line-soft) calc(16.666% - 1px) 16.666%)}
body.op .voie-barre{position:absolute;top:13px;height:14px;border-radius:7px;background:var(--op-jade)}
body.op .voie.test .voie-barre{background:repeating-linear-gradient(45deg,var(--op-jade) 0 6px,var(--op-jade-pale) 6px 10px)}
body.op .voie-seuil{position:absolute;top:13px;width:14px;height:14px;translate:-7px 0;rotate:45deg;background:var(--op-safran);
  border-radius:2px;z-index:1}
body.op .voie-decision{position:absolute;top:9px;translate:-8px 0;width:0;height:0;border-left:8px solid transparent;
  border-right:8px solid transparent;border-top:12px solid var(--op-corail);z-index:1}
body.op .pilotage-legende{display:flex;flex-wrap:wrap;gap:6px 18px;margin:var(--e3) 0 0;font-size:var(--op-t1);color:var(--ink-mute)}
body.op .pilotage-legende span{display:inline-flex;align-items:center;gap:8px}
body.op .pilotage-legende i{position:static;display:inline-block;translate:none}
body.op .pilotage-legende i.voie-barre{width:22px;height:8px}
body.op .pilotage-legende i.voie-seuil{width:9px;height:9px}
body.op .pilotage-vide{margin:var(--e3) 0 0;color:var(--ink-mute)}
body.op .parcours-nombres{display:grid;grid-template-columns:repeat(auto-fit,minmax(118px,1fr));gap:0;margin-top:var(--e3)}
body.op .plan a.parcours-nombre{display:grid;gap:2px;padding:10px 14px;text-decoration:none;color:inherit;
  border-left:3px solid var(--op-azur-pale)}
body.op .plan a.parcours-nombre:hover{background:var(--op-azur-pale);border-left-color:var(--op-azur)}
body.op .parcours-nombre b{font-family:var(--mono);font-size:2.1rem;font-weight:500;line-height:1.1}
body.op .parcours-nombre span{font-size:var(--op-t1);color:var(--ink-mute);line-height:1.25}
@media (max-width:640px){body.op .voies-regle,body.op .plan a.voie{grid-template-columns:96px 1fr}body.op .voies-regle{margin-left:96px}}

/* LA PALETTE — 21/09/2026. Le bouton du rail, puis la boîte. */
body.op .poste-palette{display:flex;align-items:center;justify-content:space-between;width:calc(100% - 20px);margin:0 10px 8px;
  padding:7px 10px;border-radius:8px;border:1px solid rgba(255,255,255,.14);background:transparent;color:rgba(255,255,255,.72);
  font:500 var(--op-t2) var(--sans);cursor:pointer}
body.op .poste-palette:hover{background:rgba(255,255,255,.07);color:#fff}
body.op .poste-palette kbd,.palette-pied kbd{font-family:var(--mono);font-size:var(--op-t1);padding:1px 6px;border-radius:5px;
  border:1px solid currentColor;opacity:.8}
.palette{width:min(560px,92vw);margin-top:12vh;padding:0;border:0;border-radius:16px;background:var(--paper);color:var(--ink);
  box-shadow:0 24px 80px rgba(15,26,34,.45)}
.palette::backdrop{background:rgba(15,26,34,.55)}
.palette-champ{width:100%;border:0;border-bottom:1px solid var(--line);padding:18px 20px;font:500 var(--op-t3) var(--sans);
  background:transparent;color:inherit;outline:none}
.palette-liste{list-style:none;margin:0;padding:6px;max-height:52vh;overflow:auto}
.palette-choix{display:flex;align-items:baseline;justify-content:space-between;gap:14px;padding:10px 14px;border-radius:10px;cursor:pointer}
.palette-choix b{font-weight:600}
.palette-choix span{font-size:var(--op-t1);color:var(--ink-mute);white-space:nowrap}
.palette-choix.ici{background:var(--op-azur-pale)}
.palette-choix.reserve b{color:var(--ink-mute);font-weight:500}
.palette-pied{margin:0;padding:10px 18px;border-top:1px solid var(--line-soft);font-size:var(--op-t1);color:var(--ink-mute);
  display:flex;flex-wrap:wrap;gap:6px;align-items:center}

body.op .tuiles{display:grid;gap:var(--e3);grid-template-columns:repeat(auto-fit,minmax(200px,1fr));
  margin:0 0 var(--e4)}
body.op .plan a.tuile{display:flex;flex-direction:column;gap:2px;padding:var(--e3) var(--e4);
  background:var(--paper);border:1px solid var(--gr-100);border-top:3px solid var(--gr-200);
  border-radius:var(--r-sm);text-decoration:none;color:var(--gr-950);
  transition:transform .2s var(--ease),box-shadow .2s ease}
body.op .plan a.tuile:hover{transform:translateY(-2px);box-shadow:var(--shadow-op);color:var(--gr-950)}
body.op .tuile.attend{border-top-color:var(--op-safran)}
body.op .tuile.urgent{border-top-color:var(--op-corail)}
body.op .tuile .quoi{font-size:var(--op-t2);color:var(--gr-500)}
body.op .tuile b{font-family:var(--mono);font-size:2.6rem;font-weight:500;line-height:1.1;
  font-variant-numeric:tabular-nums}
body.op .tuile.urgent b{color:var(--op-corail-texte)}
body.op .tuile .tendance{font-size:var(--op-t1);color:var(--gr-500)}
body.op .btn.petit.attend,body.op .plan a.btn.petit.attend{background:var(--op-safran);
  border-color:var(--op-safran);color:#fff}
body.op .btn.petit.alerte,body.op .plan a.btn.petit.alerte{background:var(--op-corail);
  border-color:var(--op-corail);color:#fff}
body.op .op-row.echeance{padding:var(--e2) 0;border-bottom:1px solid var(--gr-100)}
body.op .op-row.echeance:last-child{border-bottom:0}
body.op .op-row.echeance.retard b{color:var(--op-corail-texte)}
/* LA FRISE DATÉE : les neuf états, la date réelle en gras, la date prévue en gris, l'état
   courant en azur. Le trait franchi se remplit en jade, 400 ms, coupé par reduced-motion. */
body.op .frise-datee{display:flex;gap:0;overflow-x:auto;padding-bottom:4px}
body.op .frise-datee .etape{flex:1;min-width:104px;display:flex;flex-direction:column;gap:6px;padding:0 4px}
body.op .frise-datee .trait{height:4px;border-radius:99px;background:var(--gr-200)}
body.op .frise-datee .faite .trait{background:var(--op-jade);transform-origin:left;
  animation:frise-remplit .4s ease-out both}
body.op .frise-datee .ici .trait{background:var(--op-azur);box-shadow:0 0 0 3px var(--op-azur-pale)}
body.op .frise-datee .avenir .trait{background:repeating-linear-gradient(90deg,var(--gr-200) 0 6px,transparent 6px 10px)}
body.op .frise-datee b{font-size:var(--op-t2);font-weight:600;line-height:1.3}
body.op .frise-datee .avenir b{color:var(--gr-500);font-weight:400}
body.op .frise-datee .ici b{color:var(--op-azur-texte)}
body.op .frise-datee .quand{font-family:var(--mono);font-size:var(--op-t1);color:var(--gr-500)}
body.op .frise-datee .faite .quand,body.op .frise-datee .ici .quand{color:var(--gr-900);font-weight:500}
@keyframes frise-remplit{from{transform:scaleX(0)}to{transform:scaleX(1)}}
body.op .gestes-etat .gestes{display:flex;flex-wrap:wrap;gap:var(--e3);align-items:flex-start}
body.op .gestes-etat .gestes form{margin:0}
body.op .gestes-etat .geste-bloc h3 .mention{font-weight:400;font-size:var(--op-t2);margin-left:var(--e2)}
body.op .admin-liens{margin-top:var(--e3)}
body.op details.repli .repli-nb{margin-left:var(--e2);color:var(--gr-500);font-size:var(--op-t1)}
body.op tr.a-alerte td:first-child{box-shadow:inset 3px 0 0 var(--op-safran)}
/* --- LA SANTÉ DU SYSTÈME : une carte par brique (brief 24, §4.7) ---------------------------- */
body.op .briques{display:grid;gap:var(--e3);grid-template-columns:repeat(auto-fit,minmax(300px,1fr));
  margin:0 0 var(--e4)}
body.op .brique{background:var(--paper);border:1px solid var(--gr-100);border-top:3px solid var(--gr-200);
  border-radius:var(--r-sm);padding:var(--e3) var(--e4)}
body.op .brique.ok{border-top-color:var(--op-jade)}
body.op .brique.attend{border-top-color:var(--op-safran)}
body.op .brique.alerte{border-top-color:var(--op-corail)}
body.op .brique-tete{display:flex;align-items:center;gap:var(--e2);margin:0 0 var(--e2)}
body.op .brique-tete h3{margin:0;font-size:var(--op-t4);flex:1}
body.op .brique-faits{margin:0 0 var(--e2);display:grid;grid-template-columns:auto 1fr;gap:3px var(--e3);
  font-size:var(--op-t2)}
body.op .brique-faits dt{color:var(--gr-500);font-family:var(--mono);font-size:var(--op-t1);
  letter-spacing:.06em;text-transform:uppercase;padding-top:2px}
body.op .brique-faits dd{margin:0}
body.op .brique .gestes{display:flex;flex-direction:column;gap:var(--e2)}
body.op .brique .geste-ligne{border-bottom:0;padding:0}
body.op pre.sortie{margin:var(--e2) 0 0;padding:var(--e3);background:var(--gr-950);color:var(--gr-100);
  border-radius:var(--r-sm);font-family:var(--mono);font-size:var(--op-t1);line-height:1.5;
  white-space:pre-wrap;overflow-x:auto;max-height:420px}
@media (prefers-reduced-motion:reduce){
  body.op .bandeau-alerte,body.op .frise-datee .faite .trait{animation:none}
  body.op .plan a.tuile:hover{transform:none}
}
@media (max-width:900px){
  body.op .avec-panneau.ouvert{grid-template-columns:minmax(0,1fr)}
  body.op .panneau{position:static}
  body.op .groupe-gestes{grid-template-columns:minmax(0,1fr)}
}

/* --- UTILITAIRES D'ESPACEMENT (refonte UI, 15/09/2026) ----------------------------------------
   Remplacent les `style="margin…"` des gabarits. Placés après les composants pour l'emporter sur
   leur marge propre (`.btnrow{margin-top:16px}`), et AVANT la Régie au pouce, que deux tests
   veulent en dernier grand bloc. Nom en `-sN` = marche `--space-N` (lot B). */
/* `.sans-marge` d'abord : combinée à une `.marge-*` (ex. `sans-marge marge-haut-s2` = 8px 0 0),
   c'est la marge nommée qui doit l'emporter, donc être écrite après (lot D). */
.sans-marge{margin:0}
.marge-haut-s1{margin-top:var(--space-1)}
.marge-haut-s2{margin-top:var(--space-2)}
.marge-haut-s3{margin-top:var(--space-3)}
.marge-haut-s4{margin-top:var(--space-4)}
.marge-haut-s5{margin-top:var(--space-5)}
.marge-bas-s1{margin-bottom:var(--space-1)}
.marge-bas-s2{margin-bottom:var(--space-2)}
.marge-bas-s3{margin-bottom:var(--space-3)}
.marge-bas-s5{margin-bottom:var(--space-5)}
.en-bloc{display:block}
/* `.en-ligne` : deux formulaires qui doivent tenir sur la même ligne. Son contraire `.en-bloc`
   existe depuis le lot B ; celle-ci naît le 16/09/2026 pour le portail invité, où deux boutons
   d'action sont des formulaires distincts et non des enfants d'un `.btnrow`. */
.en-ligne{display:inline}

/* LE LIEN D'ÉVITEMENT — 16/09/2026, lot I1. Hors de l'écran tant qu'il n'a pas le focus, et
   ramené dessus dès qu'il l'a. Jamais `display:none` ni `visibility:hidden` : ces deux-là le
   retireraient du parcours au clavier, c'est-à-dire du seul public qui s'en sert. */
.evitement{position:absolute;left:var(--space-2);top:calc(var(--space-2) * -6);z-index:100;
  padding:var(--space-2) var(--space-3);border-radius:var(--radius-champ);
  background:var(--paper);color:var(--accent);font-weight:600;text-decoration:none;
  transition:top .12s ease}
.evitement:focus{top:var(--space-2);outline:2px solid var(--focus);outline-offset:2px}

/* TROIS COMPOSANTS DU PORTAIL INVITÉ — 16/09/2026 (chantier 2), sortis de `tiers_dashboard.html`.

   `.etiquettes` : la rangée d'étiquettes d'état (« Échange ouvert », la décision). Sa marge
   haute est NÉGATIVE, et c'est voulu : elle remonte les étiquettes sous le bloc qu'elles
   qualifient, pour qu'on les lise comme son prolongement et non comme une section nouvelle.
   `.telephone` : un numéro, en chasse fixe parce qu'on le recopie chiffre à chiffre.
   `.lecteur` : le lecteur d'un appel enregistré, sur toute la largeur de sa ligne. */
.btnrow.etiquettes{margin:calc(var(--space-3) * -1) 0 var(--space-5)}
.telephone{font-family:var(--mono);font-size:var(--text-4);margin:var(--space-1) 0 var(--space-2)}
.lecteur{display:block;width:100%;margin-top:var(--space-2)}
.marge-bas-s4{margin-bottom:var(--space-4)}
.centre{text-align:center}
.sans-marge-haut{margin-top:0}
/* La photo d'un membre, une fois l'identité dévoilée. Bornée en largeur pour qu'un portrait en
   haute définition ne prenne pas tout l'écran d'une conversation. */
.photo-membre{max-width:200px}

/* LA PASTILLE DE LA MARQUE — sortie de `_marque.html` le 16/09/2026 (chantier 1).
   `background` est un HEX EN CLAIR et non `var(--sable)`, et ce n'est pas un oubli : en Veille,
   `--sable` vaut #131C19, et les traits verts de l'emblème disparaîtraient dessus. La pastille
   reste claire dans les deux thèmes — c'est la raison d'être du gabarit, écrite dans son
   commentaire depuis le 09/09/2026.
   Seules la largeur et la hauteur restent en ligne : elles viennent du paramètre `taille`. */
.marque-pastille{display:inline-flex;align-items:center;justify-content:center;
  border-radius:22%;background:#FAF7F0;flex:0 0 auto}
.marque-pastille img{width:84%;height:auto;display:block}

/* Le texte de l'engagement, lu tel qu'il a été écrit (retours à la ligne gardés). Lot B, 15/09/2026. */
.texte-engagement{font-family:var(--serif);font-size:var(--text-3);line-height:var(--leading-corps);white-space:pre-line}

/* Le bloc « Repère » d'un module de formation, et le numéro du tiers dans l'outil de décision (lot D). */
.texte-repere{margin:0;font-family:var(--serif);font-size:var(--text-4);line-height:1.5}
.chiffre-telephone{margin:0 0 var(--space-2);font-family:var(--mono);font-size:var(--text-4)}

/* ================================================================================================
   LA RÉGIE AU POUCE — 14/09/2026, demande du Fondateur.

   « Je veux que cette version soit exploitable sur mobile : lisibilité, ergonomie, intuitif,
   simple et clair pour la navigation, fluidité. »

   CE QUI EXISTAIT, ET CE QUI MANQUAIT. Le rail se replie depuis le 10/09 derrière un bouton, et
   c'est du bon travail : quinze liens ne tiennent pas dans 390 px. Mais le repli ne porte que la
   NAVIGATION. Les quarante-deux écrans qu'elle dessert n'avaient, à eux tous, que trois lignes de
   style d'écran étroit. Le document de conception de la Régie assume d'ailleurs le contraire :
   « poste de travail, sur grand écran », maquettes à 1440 px. Cette page est donc un changement
   de parti pris, pas un rattrapage d'oubli.

   LE SEUIL EST 900 px, CELUI DU RAIL. Deux seuils pour une même bascule se désynchronisent le
   jour où l'un des deux bouge, et l'on se retrouve avec un rail replié au-dessus d'un tableau de
   douze colonnes, ou l'inverse.

   TOUT CE BLOC EST ÉCRIT ICI, EN FIN DE FEUILLE, ET C'EST VOULU. `test_feuilles_de_style` exige
   qu'une règle d'écran étroit vienne APRÈS la règle de base qu'elle surcharge ; en fin de fichier,
   la question ne se pose plus jamais. Et le bloc du rail, ancré sur une chaîne littérale par
   `test_poste_au_pouce`, n'est pas touché : on n'élargit pas un bloc que sept tests tiennent.
   ================================================================================================ */

@media (max-width:900px){
  /* --- LES TABLEAUX DEVIENNENT DES CARTES ------------------------------------------------------
     Quarante-huit tableaux dans la Régie, trente et un à plus de trois colonnes, dont un à douze.
     Le patron `.defile` les faisait défiler de côté : à 390 px, lire une ligne de douze colonnes
     demandait trois écrans de balayage, et l'on perdait le nom de la personne dès la deuxième.

     Chaque ligne devient donc une carte, et chaque valeur reprend son libellé par `data-colonne`.
     C'est le même geste que le pool côté membre (plus haut dans cette feuille), transposé d'une
     grille CSS à un vrai `<table>`.

     `.defile` garde son `overflow-x:auto` : il ne sert plus à rien ici, mais il sert encore aux
     tableaux de trois colonnes qu'on laisse en tableaux, et le retirer demanderait de distinguer
     deux conteneurs là où un seul suffit. */
  body.op .defile table,
  body.op .defile tbody,
  body.op .defile tr,
  body.op .defile td{display:block;width:auto}
  body.op .defile thead{display:none}
  body.op .defile tbody tr{border:1px solid var(--gr-200);border-radius:var(--r-sm);
    padding:var(--e2) 0;margin:0 0 var(--e2);background:#fff}
  body.op .defile tbody tr:hover{background:#fff}
  body.op .defile td{border-bottom:0;padding:5px var(--e3);font-size:var(--op-t2)}
  /* Le libellé devant la valeur, et non au-dessus : deux lignes par cellule feraient douze lignes
     pour une personne, et l'on ne parcourrait plus rien. */
  body.op .defile td[data-colonne]::before{content:attr(data-colonne) " ";
    color:var(--gr-600);font-family:var(--mono);font-size:var(--op-t1);
    text-transform:uppercase;letter-spacing:.06em;margin-right:6px}
  /* Une cellule vide ne mérite pas sa ligne : elle dirait « tiers » suivi de rien. */
  body.op .defile td:empty{display:none}
  /* Les valeurs alignées à droite ne le sont plus : dans une carte, tout part de la gauche. */
  body.op .defile td.op-fin,body.op .defile td.nb{text-align:left;white-space:normal}
  /* Un formulaire dans une cellule, cas de `_personne_gestes` : il prend la largeur. */
  body.op .defile td form{margin-top:6px}

  /* --- LES CHAMPS DE FILTRE ET DE GESTE ---------------------------------------------------------
     `flex:0 1 160px` et `flex:0 1 220px` produisent, dans 354 px utiles, une colonne et demie :
     un champ, un bout de champ, et le bouton orphelin en bas. Un champ par ligne, et le bouton
     sous eux, pleine largeur. */
  body.op .filtres-ligne label.f,
  body.op .geste-ligne label.f,
  body.op .geste-ligne>span{flex:1 1 100%}
  body.op .filtres-ligne .btn,body.op .geste-ligne .btn{width:100%}
  body.op .barre-groupe{flex-wrap:wrap}
  body.op .barre-groupe select,body.op .barre-groupe .btn{width:100%}

  /* --- LES LISTES DE FAITS ----------------------------------------------------------------------
     `auto 1fr` laisse un libellé long écraser sa valeur : « Dernière connexion » contre une date,
     et la date passe à la ligne caractère par caractère. */
  body.op .panneau-faits,body.op .brique-faits{grid-template-columns:minmax(0,1fr)}
  body.op .panneau-faits dd,body.op .brique-faits dd{margin-bottom:var(--e2)}

  /* --- LES VOLETS D'UNE FICHE -------------------------------------------------------------------
     Trois onglets sans retour à la ligne tenaient tout juste, et plus du tout dès qu'un libellé
     s'allongeait. */
  body.op .fiche-volets{flex-wrap:wrap}

  /* --- LES DEUX FRISES --------------------------------------------------------------------------
     Neuf étapes à 104 px font 936 px, soit deux écrans et demi de balayage latéral pour lire où en
     est une saison. C'est le composant qui allait le plus mal. Elles passent en colonne : une
     étape par ligne, la pastille à gauche. La frise membre a exactement ce repli depuis le
     08/09, et c'est sa forme qui est reprise plutôt qu'une seconde inventée ici. */
  body.op .frise-datee,body.op .etats{flex-direction:column;overflow-x:visible;gap:2px}
  body.op .frise-datee .etape,body.op .etats .etat{min-width:0;width:100%;
    display:flex;align-items:baseline;gap:8px;text-align:left}
  body.op .frise-datee .trait,body.op .etats .trait{display:none}

  /* --- LE PANNEAU PASSE DEVANT LA LISTE ---------------------------------------------------------
     Rendu `static` plus haut, il atterrissait SOUS un tableau de dix colonnes : la fiche qu'on
     venait d'ouvrir était invisible sans un très long défilement, et rien ne disait qu'elle était
     là. En écran étroit, c'est elle qu'on vient lire ; la liste attend en dessous. */
  body.op .avec-panneau.ouvert>.panneau{order:-1;border-left:0;border-top:3px solid var(--op-azur)}
}

/* LA PALETTE DE SYMBOLES — 14/09/2026.
   Un repli natif, posé SUR la ligne des deux boutons d'envoi. Fermé, il ne coûte qu'une pastille ;
   ouvert, il montre ses vingt symboles sur quatre colonnes au pouce et davantage au-delà.
   Les boutons font 44 px de côté, la cible minimale d'un doigt.

   SA GRILLE S'OUVRE AU-DESSUS, en surimpression — 14/09/2026. Dans le flux, elle poussait le
   champ, les boutons et tout le pied de deux cents pixels vers le bas : on ouvrait la palette et
   la conversation disparaissait. Elle se pose maintenant par-dessus le fil, qui reste là où on
   l'a laissé, et se referme sans rien avoir déplacé. */
.palette{position:relative;margin:0;flex:0 0 auto}
.palette>summary{list-style:none;cursor:pointer;display:inline-flex;align-items:center;
  justify-content:center;width:38px;height:38px;border-radius:50%;
  border:1px solid var(--line);background:var(--sable-2);color:var(--ink-soft);font-size:var(--text-4)}
.palette>summary::-webkit-details-marker{display:none}
.palette>summary:hover{border-color:var(--vert-300);color:var(--accent)}
.palette[open]>summary{background:var(--vert-50);border-color:var(--vert-300);color:var(--accent)}
.palette-grille{display:grid;grid-template-columns:repeat(auto-fill,minmax(44px,1fr));gap:var(--space-1);
  position:absolute;bottom:calc(100% + 8px);left:0;z-index:var(--z-popover);
  width:min(300px,calc(100vw - 46px));margin:0;padding:var(--space-2);
  border:1px solid var(--line-soft);border-radius:var(--radius-champ);background:var(--paper);
  box-shadow:var(--shadow-pied)}
.palette-choix{width:100%;min-height:44px;border:0;border-radius:var(--radius-champ);background:none;
  cursor:pointer;font-size:var(--text-5);line-height:1;transition:background .14s ease}
.palette-choix:hover{background:var(--sable)}
.palette-choix:focus-visible{outline:2px solid var(--accent);outline-offset:1px}

/* =============================================================================================
   LE PARCOURS DU DOSSIER, EN ÉCRANS — 17/09/2026

   « Votre profil » était un gabarit de 347 lignes portant vingt-huit champs en sept rubriques,
   sur un écran qui défile. Sur un téléphone, le bouton « Enregistrer et continuer » se trouvait
   à environ 3 800 px du haut, et le repère de progression était parti depuis longtemps. C'est
   l'écran que le retour d'usage désignait : « la masse d'information entache fortement
   l'expérience ».

   TROIS BANDES, ET UNE SEULE DÉFILE. Le bandeau en haut et la barre d'action en bas ne bougent
   jamais. Conséquence directe : on voit toujours où on en est, et toujours comment continuer.

   `body.parcours` n'existe que sur ces écrans. Le reste de l'application garde son châssis.
   ============================================================================================= */

body.parcours{
  overflow:hidden;overscroll-behavior:none;
  /* --- LE BAS DE L'ÉCRAN EST DISPUTÉ, ET IL FAUT L'ARBITRER ------------------------------------
     Trois choses veulent le bas : la barre d'action de ce parcours, la barre de secours
     (« Signaler », « Confidentialité ») et la sortie rapide. Les deux dernières existent sur TOUS
     les écrans membre et ne se négocient pas : la sortie rapide est un geste de sécurité, et une
     personne en danger ne doit jamais avoir à la chercher.

     `.secours-flottant` réserve déjà 196 px à sa droite pour que `.exit` se pose dedans : ces
     deux-là cohabitent depuis toujours. Le seul conflit neuf est la barre d'action, qui viendrait
     se poser par-dessus. On retire donc au châssis la hauteur exacte de la barre de secours,
     plutôt que de superposer et d'espérer.

     La hauteur est déclarée ICI, en un seul endroit : 9 px de marge, un lien de 34 px, 9 px de
     marge, 1 px de filet. Si la barre de secours change, c'est cette ligne qu'on corrige, et rien
     d'autre ne bouge. */
  --h-secours:53px;
}
body.parcours .topnav,body.parcours .lieux,body.parcours .pied-site{display:none}
body.parcours main.wrap{
  max-width:none;margin:0;padding:0;
  height:calc(100dvh - var(--h-secours));
  display:grid;grid-template-rows:auto minmax(0,1fr) auto;
}
/* DEUX CONTENEURS, UN SEUL RÔLE. Les trois étapes découpées posent un `<form>` : la barre
   d'action porte son bouton d'envoi, donc elle doit être dedans. Les cinq autres posent un
   simple `<div>` : leurs formulaires vivent dans le contenu, parfois trois à la fois, et la
   barre d'action les atteint par `form="…"`. Dans les deux cas le conteneur s'efface, et ce sont
   ses trois enfants qui deviennent les trois bandes de la grille. */
body.parcours .parcours-forme,
body.parcours .parcours-cadre{display:contents}

/* --- LE BANDEAU — la frise réduite à une ligne -----------------------------------------------
   `.frise-saison` occupait une carte pleine sur chaque écran du parcours : entre 180 et 240 px
   pris en haut, avant la première question, pour répondre à « où en suis-je » une fois et
   continuer de le répondre les trente fois suivantes. Quarante-quatre pixels suffisent. */

.p-bandeau{
  position:relative;
  background:color-mix(in oklab,var(--sable) 88%,transparent);
  backdrop-filter:blur(14px) saturate(140%);
  border-bottom:1px solid var(--line-soft);
}
.p-bandeau-ligne{
  display:flex;align-items:center;gap:12px;
  max-width:760px;margin:0 auto;padding:10px var(--space-4) 12px;
}
.p-bandeau-texte{flex:1 1 auto;min-width:0}
.p-bandeau-titre{
  display:block;font-family:var(--serif);font-size:var(--text-4);font-weight:600;line-height:1.2;
  color:var(--titre);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
.p-bandeau-rang{
  display:block;font-family:var(--mono);font-size:var(--text-1);letter-spacing:.04em;
  color:var(--ink-soft);
}
/* LA SORTIE. Elle portait la même fonte et la même taille que le rang d'étape posé juste à
   gauche, sans contour ni soulignement : deux textes voisins dont un seul était pressable, et
   rien ne disait lequel. Le Fondateur : « la mention Mon dossier en haut n'est pas un lien ».
   Elle l'était ; elle n'en avait pas l'air, et sur un écran tactile c'est la même chose.

   Un contour à 3:1 (WCAG 1.4.11 — c'est la limite d'un CONTRÔLE, pas d'un filet), la cible à
   36 px de haut, et le picto du lieu vers lequel elle mène. */
.p-quitter{
  flex:0 0 auto;display:inline-flex;align-items:center;gap:6px;
  min-height:36px;padding:6px 12px;
  font-family:var(--mono);font-size:var(--text-1);color:var(--accent);text-decoration:none;
  border:1px solid var(--contour-actif);border-radius:var(--radius-pilule);
  background:var(--paper);transition:background .14s ease,border-color .14s ease;
}
.p-quitter .pi{width:14px;height:14px;flex:0 0 auto}
.p-quitter:hover{background:var(--vert-50);border-color:var(--accent)}
/* Sous 380 px, le mot cède et le picto reste : la cible ne rétrécit pas, elle se resserre. */
@media (max-width:380px){
  .p-quitter span{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)}
  .p-quitter{padding:6px 10px}
}

/* LA JAUGE. Un `<progress>` et non un `<div>` : elle est lue par les lecteurs d'écran sans
   qu'on ait à lui poser un rôle, et elle existe sans JavaScript. Le dégradé chaud court de la
   terre au safran — il avance ET il change de couleur, donc il dit deux choses d'une forme. */
.p-jauge{
  position:absolute;left:0;right:0;bottom:-1px;
  width:100%;height:3px;border:0;display:block;
  background:var(--line-soft);
  appearance:none;-webkit-appearance:none;
}
.p-jauge::-webkit-progress-bar{background:var(--line-soft)}
.p-jauge::-webkit-progress-value{
  background:linear-gradient(90deg,var(--terre) 0%,var(--abricot) 48%,var(--safran) 100%);
  border-radius:0 var(--radius-pilule) var(--radius-pilule) 0;
  transition:width 560ms ease;
}
.p-jauge::-moz-progress-bar{
  background:linear-gradient(90deg,var(--terre) 0%,var(--abricot) 48%,var(--safran) 100%);
}

/* --- LA SCÈNE — la SEULE zone qui défile -----------------------------------------------------
   `overscroll-behavior:contain` empêche le geste d'aller tirer sur la page derrière quand on
   arrive en bout de course : sur iOS, sans lui, l'écran entier rebondit et donne l'impression
   que quelque chose a cassé. */

.p-scene{
  min-height:0;overflow-y:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch;
  padding:clamp(20px,5vh,44px) var(--space-4) var(--space-6);
  animation:p-entre 340ms cubic-bezier(.22,1,.36,1) both;
}
@keyframes p-entre{from{opacity:0;transform:translate3d(0,18px,0)}to{opacity:1;transform:none}}

.p-dedans{width:100%;max-width:560px;margin:0 auto}
/* Une étape qui tient en un écran porte des tableaux, des listes de cases et des replis, pas une
   question unique : 560 px y serrent trop. Elle garde la largeur de lecture du reste du produit. */
.p-dedans-large{max-width:720px}
.p-centre{text-align:center;max-width:460px}

/* --- LES DESSINS, EN SÉRIGRAPHIE (17/09/2026) --------------------------------------------------
   Ils ne sont plus des symboles d'un sprite mais des gabarits insérés dans la page : voir la
   note en tête de `declaratif/_dessin_de_carte.html`, qui dit pourquoi, et ce que ça a coûté de
   ne pas le faire d'emblée (tous les dessins se sont affichés sur fond NOIR en production).

   LE LANGAGE EST CELUI DE L'IMPRESSION. Des aplats d'encre qui se recouvrent, l'aire commune
   plus dense que chacune, et un grain par-dessus. C'est ce qui sépare une illustration d'un
   pictogramme agrandi — et la version d'avant était vingt-huit fois le même disque beige, ce que
   le Fondateur a nommé sans détour : « j'aimerais que les dessins soient plus modernes, plus
   artistiques ».

   `slice` plutôt que `meet` : la vignette est un CADRE, et une composition qui déborde un peu
   par les bords se lit comme une image, là où une composition entièrement contenue se lit comme
   une icône. Les fichiers sont dessinés pour ça, avec des formes qui sortent volontairement. */
.p-dessin{
  display:block;width:100%;max-width:300px;aspect-ratio:4/3;height:auto;
  margin:0 auto var(--space-5);border-radius:var(--radius-carte);
}
/* LE MULTIPLIE NE VAUT QUE SUR FOND CLAIR. Sur le papier sombre de la nuit, multiplier des
   encres déjà sombres les écrase en noir : le dessin redeviendrait la tache que l'on vient de
   corriger. De nuit, les encres se superposent par leur seule opacité, ce qui suffit. */
.p-dessin .melange{mix-blend-mode:var(--melange-encres)}
.p-dessin .grain{mix-blend-mode:multiply;opacity:var(--grain-opacite);pointer-events:none}

/* Les encres « montent » à l'ouverture de l'écran, comme des couches posées l'une sur l'autre.
   SEULE LA TRANSFORMATION est animée : chaque aplat porte sa propre `opacity` dans le fichier,
   et l'animer l'écraserait — toutes les encres finiraient opaques et la composition tomberait. */
.p-dessin .melange{transform-origin:center;animation:p-encre 620ms cubic-bezier(.22,1,.36,1) both}
@keyframes p-encre{from{transform:scale(.86)}to{transform:scale(1)}}

/* L'EN-TÊTE À DEUX COLONNES. Au-delà de six réponses, le dessin passe à côté du titre au lieu
   de le surmonter : sur un téléphone, 270 px de dessin repoussaient les dernières réponses hors
   de l'écran. Il décorait la question en cachant ce qu'on venait y faire. */
.p-tete{margin:0 0 clamp(18px,3.4vh,30px)}
.p-tete-en-ligne{display:flex;align-items:flex-start;gap:var(--space-4)}
.p-mots{flex:1 1 auto;min-width:0}
.p-dessin-cote{flex:0 0 auto;width:72px;max-width:72px;margin:0}

.p-titre{
  font-family:var(--serif);font-size:clamp(26px,6vw,36px);font-weight:600;
  line-height:1.14;letter-spacing:-.018em;margin:0 0 var(--space-2);color:var(--titre);
  text-wrap:balance;
}
.p-chapeau{
  margin:0;max-width:52ch;text-wrap:pretty;
}
.p-centre .p-chapeau{margin-left:auto;margin-right:auto}

/* --- QUI LIRA CETTE RÉPONSE ------------------------------------------------------------------
   Trois tons, et ils ne se ressemblent pas : c'est ce qui permet de les distinguer du coin de
   l'œil sans lire la phrase. Le ton FERMÉ est vert, celui de la marque — ne pas être lu est une
   promesse tenue, pas une privation. Le ton LARGE est chaud : dire « tout le monde lira ceci »
   demande de l'attention, pas de l'alarme, et le rouge en aurait fait une faute. */

.p-regard{
  display:inline-flex;align-items:center;gap:6px;
  margin:var(--space-3) 0 0;padding:4px 11px 4px 8px;border-radius:var(--radius-pilule);
  font-family:var(--mono);font-size:var(--text-1);letter-spacing:.02em;
}
.p-regard .pi{width:13px;height:13px}
.p-regard-tous{background:var(--laiton-pale);color:var(--laiton-texte)}
.p-regard-choisis{background:var(--sable-2);color:var(--ink-soft);box-shadow:inset 0 0 0 1px var(--line)}
.p-regard-nul{background:var(--vert-50);color:var(--accent)}

/* --- LES PASTILLES ---------------------------------------------------------------------------
   Une liste déroulante de quatre réponses coûte trois gestes sur un téléphone — ouvrir, faire
   tourner la roue, valider — et cache les réponses jusqu'au premier. Quatre pastilles côte à
   côte coûtent un geste et montrent tout.

   Ce sont de VRAIS boutons radio, masqués visuellement mais présents : le clavier, le lecteur
   d'écran et la validation du navigateur continuent de fonctionner, et la page vit sans script. */

.p-q{margin:0 0 clamp(20px,3.4vh,30px)}
.p-q:last-child{margin-bottom:0}

.p-puces{display:flex;flex-wrap:wrap;gap:9px;margin:var(--space-3) 0 0}
.p-puces.colonne{flex-direction:column;gap:8px}
.p-puce{display:contents}
.p-puce input{position:absolute;width:1px;height:1px;opacity:0;pointer-events:none}

.p-puce label{
  display:inline-flex;align-items:center;gap:9px;padding:12px 17px;
  /* LE CONTOUR N'EST PAS LE FILET. Une pastille a le même fond que la page derrière elle : son
     bord est LA seule chose qui dit qu'on peut appuyer dessus, et 1.4.11 y exige 3:1. `--line`
     sépare (décoration, exemptée), `--contour-champ` délimite un contrôle. */
  border:1.5px solid var(--contour-champ);border-radius:var(--radius-pilule);
  background:var(--paper);
  font-size:var(--text-3);line-height:1.3;color:var(--ink);
  cursor:pointer;user-select:none;
  transition:border-color 180ms ease,background 180ms ease,transform 180ms cubic-bezier(.34,1.56,.64,1),box-shadow 180ms ease;
}
.p-puces.colonne .p-puce label{border-radius:var(--radius-carte);width:100%}
.p-puce label:hover{border-color:var(--contour-actif);transform:translateY(-1px)}
.p-puce label:active{transform:translateY(0) scale(.985)}
.p-puce input:checked + label{
  border-color:var(--vert-plein);background:var(--vert-50);color:var(--titre);font-weight:500;
  box-shadow:0 0 0 3px color-mix(in oklab,var(--vert-plein) 14%,transparent);
}
.p-puce input:focus-visible + label{outline:2.5px solid var(--focus);outline-offset:2px}

/* Le point qui confirme. Sa place est réservée dès le départ : il ne pousse rien. */
.p-puce label::before{
  content:"";flex:0 0 auto;width:16px;height:16px;border-radius:var(--radius-pilule);
  border:1.5px solid var(--contour-champ);background:var(--sable);
  transition:border-color 180ms ease,background 180ms ease,box-shadow 180ms ease;
}
.p-puce input:checked + label::before{
  border-color:var(--vert-plein);background:var(--vert-plein);
  box-shadow:inset 0 0 0 3.5px var(--paper);
}

.p-libre{margin:var(--space-3) 0 0;animation:p-libre 340ms cubic-bezier(.22,1,.36,1) both}
.p-libre[hidden]{display:none}
@keyframes p-libre{from{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:none}}

/* --- LES CHAMPS LIBRES -----------------------------------------------------------------------
   Un trait sous le texte, pas un cadre fermé : un rectangle de plus par question donnait des
   écrans en damier. */

.p-champ-cadre{position:relative;margin:var(--space-3) 0 0}
.p-champ{
  display:block;width:100%;padding:13px 2px;
  border:0;border-bottom:2px solid var(--contour-champ);background:transparent;
  font-family:inherit;font-size:var(--text-4);line-height:1.5;color:var(--ink);resize:none;
}
.p-champ:hover{border-bottom-color:var(--contour-actif)}
.p-champ:focus{outline:0;border-bottom-color:var(--vert-plein)}
.p-champ-cadre::after{
  content:"";position:absolute;left:0;bottom:0;height:2px;width:0;
  background:linear-gradient(90deg,var(--vert-plein),var(--vert-500));
  transition:width 340ms cubic-bezier(.22,1,.36,1);
}
.p-champ-cadre:focus-within::after{width:100%}

.p-fait{
  display:flex;gap:13px;align-items:flex-start;padding:15px 17px;margin:var(--space-3) 0 0;
  border:1.5px solid var(--contour-champ);border-radius:var(--radius-carte);
  background:var(--paper);cursor:pointer;
  transition:border-color 180ms ease,background 180ms ease;
}
.p-fait:hover{border-color:var(--contour-actif)}
.p-fait input{flex:0 0 auto;width:21px;height:21px;margin:1px 0 0;accent-color:var(--vert-plein);cursor:pointer}
.p-fait-texte{flex:1 1 auto;font-size:var(--text-3);line-height:1.45}
.p-fait:has(input:checked){border-color:var(--vert-plein);background:var(--vert-50)}
.p-fait:has(input:focus-visible){outline:2.5px solid var(--focus);outline-offset:2px}

.p-mention-question{
  margin:var(--space-2) 0 0;
}

/* --- L'AIDE, REPLIÉE PAR DÉFAUT --------------------------------------------------------------
   Dix-neuf champs portaient une explication affichée en permanence. Additionnées, elles
   faisaient plus de texte que les questions qu'elles accompagnaient, et elles sont utiles à
   celui qui hésite, à personne d'autre. Toutes conservées, mot pour mot, aucune imposée. */

.p-aide{margin:var(--space-3) 0 0}
.p-aide > summary{
  display:inline-flex;align-items:center;gap:6px;list-style:none;cursor:pointer;
  padding:4px 11px 4px 8px;border:1px solid var(--contour-champ);border-radius:var(--radius-pilule);
  background:var(--sable-2);color:var(--ink-soft);
  font-family:var(--mono);font-size:var(--text-1);letter-spacing:.03em;
}
.p-aide > summary::-webkit-details-marker{display:none}
.p-aide > summary:hover{background:var(--laiton-pale);color:var(--laiton-texte);border-color:var(--laiton-texte)}
.p-aide[open] > summary{background:var(--laiton-pale);color:var(--laiton-texte);border-color:var(--laiton-texte)}
.p-aide > p{
  margin:var(--space-2) 0 0;padding:11px 14px;
  border-left:2px solid var(--abricot);border-radius:0 var(--radius-champ) var(--radius-champ) 0;
  background:var(--laiton-pale);
  font-size:var(--text-2);line-height:1.5;color:var(--ink-soft);
}

.p-pays{border:0;margin:var(--space-3) 0 0;padding:0}
.p-invisible{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}

/* --- LA BARRE D'ACTION — toujours là, jamais à chercher --------------------------------------
   Dans l'écran remplacé, « Enregistrer et continuer » était le dernier élément du document : sur
   un téléphone, l'atteindre demandait de traverser vingt-huit champs, et y revenir après une
   hésitation demandait de les retraverser. `env(safe-area-inset-bottom)` le tient au-dessus de
   la barre de gestes de l'iPhone. */

.p-pied{
  background:color-mix(in oklab,var(--sable) 92%,transparent);
  backdrop-filter:blur(14px) saturate(140%);
  border-top:1px solid var(--line-soft);
  padding:12px var(--space-4) calc(12px + env(safe-area-inset-bottom,0px));
}
.p-pied-dedans{display:flex;align-items:center;gap:12px;max-width:560px;margin:0 auto}
.p-continuer{flex:1 1 auto;justify-content:center}
.p-retour{
  flex:0 0 auto;width:50px;height:50px;padding:0;
  display:inline-flex;align-items:center;justify-content:center;
  font-size:20px;line-height:1;text-decoration:none;
}
.p-mention{
  display:block;text-align:center;max-width:560px;margin:9px auto 0;
  font-family:var(--mono);font-size:var(--text-1);letter-spacing:.04em;color:var(--ink-mute);
}

@media (min-width:800px){
  .p-scene{padding:clamp(28px,6vh,64px) var(--space-6) var(--space-7)}
  .p-dessin{max-width:320px}
}
/* Écran très bas — téléphone en paysage, ou clavier ouvert. Le dessin est la première chose
   qu'on sacrifie : il décore, il n'informe pas. */
@media (max-height:560px){
  .p-dessin{display:none}
  .p-tete{margin-bottom:var(--space-4)}
  .p-titre{font-size:var(--text-5)}
}
/* Une carte qui glisse déclenche une nausée réelle chez qui est sujet au vertige vestibulaire.
   Tout le mouvement tombe, rien de ce qu'il portait ne se perd. */
@media (prefers-reduced-motion:reduce){
  .p-scene,.p-libre{animation:none}
  .p-dessin .melange{animation:none}
}

/* Le châssis pose son « ← Revenir à l'étape » APRÈS le bloc de contenu, donc après la barre
   d'action de ce parcours : dans une grille à trois bandes, il devenait un quatrième enfant qui
   débordait sous l'écran. Il est masqué ici, et la promesse qu'il porte est reprise par le
   bouton de retour du PREMIER écran, qui mène à l'étape d'avant au lieu de reculer d'une
   question. Masquer sans reprendre aurait retiré un geste que le Fondateur a demandé. */
body.parcours .retour-etape:not(.p-retour){display:none}
body.parcours .rail-lieu{display:none}

/* --- LA GRILLE COMPTE TROIS RANGÉES : LE FLUX DOIT LUI DONNER TROIS ENFANTS -------------------
   C'est le défaut qui a produit la capture du 17/09. `main.wrap` n'est pas à nous : le châssis y
   pose, AVANT `{% block content %}`, tout ce que l'écran peut avoir à porter — bandeau de regard,
   bannières de signalement, fil de lieu, bloc `phases`, frise de saison, rail du lieu — et APRÈS
   lui le retour d'étape. Chacun est un enfant de plus. Avec quatre enfants pour trois rangées, le
   bandeau hérite de la rangée souple, la scène tombe dans la rangée « auto » et déborde : elle
   vient se peindre PAR-DESSUS le bandeau, et avale au passage le clic sur « Mon dossier ».

   Masquer un à un ce qu'on connaît serait recommencer au prochain élément ajouté au châssis, et
   personne ne pense au parcours en ajoutant une bannière. On inverse donc la règle : SEUL le
   formulaire subsiste. La bande de regard est la seule exception, et elle n'en est plus une
   depuis qu'elle est en position fixe — elle n'est plus un enfant de flux du tout.

   Si l'on veut un jour montrer autre chose ici, il faudra l'écrire dans ce gabarit, dans une des
   trois bandes. C'est exactement la contrainte qu'on veut : ce parcours tient parce qu'il n'a
   que trois bandes. */
/* LES DEUX CONTENEURS SONT EXEMPTÉS, PAS UN SEUL. La règle ne nommait que `.parcours-forme` et
   sa spécificité (0,3,2) l'emportait sur le `display:contents` de `.parcours-cadre` (0,2,1) :
   les cinq étapes qui tiennent en un écran se seraient rendues entièrement masquées. Trouvé par
   le test qui compte les cases de la grille, jamais en relisant cette feuille. */
body.parcours main.wrap > *:not(.parcours-forme):not(.parcours-cadre){display:none}
/* Et si un opérateur regarde, le châssis rend à la bande fixe la hauteur qu'elle occupe. */
body.parcours.regarde main.wrap{height:calc(100dvh - var(--h-secours) - var(--h-regard))}

/* --- UN ÉCRAN DE CONTRAINTE ------------------------------------------------------------------
   Il rend un fragment extrait de l'écran unique, qui parle la langue de la feuille historique :
   `.f`, `.chk`, `.dure`, `.repli`. On ne le retraduit pas — ce balisage porte des correctifs
   datés, et deux versions de la même question divergeraient. On l'accorde seulement au rythme du
   parcours : les titres de section n'ont plus lieu d'être, puisque le titre de l'écran les dit.

   `.dure` reçoit le seul soin particulier. C'est la case qui écarte réellement des gens, et elle
   se multiplie avec les autres : la garantie d'éligibilité rembourse la cohorte entière sous cinq
   profils éligibles. Sur l'écran unique, elle avait l'allure d'une case parmi dix-huit. Ici elle
   se distingue, parce que la cocher coûte quelque chose. */

.p-contrainte > h2{display:none}
.p-contrainte > .mention:first-of-type{
  margin:0 0 var(--space-4);font-size:var(--text-3);line-height:1.5;color:var(--ink-soft);
}
.p-contrainte .f{margin-top:var(--space-4)}
.p-contrainte .dure{
  display:flex;gap:13px;align-items:flex-start;
  margin:var(--space-5) 0 0;padding:15px 17px;
  border:1.5px solid var(--laiton-filet);border-radius:var(--radius-carte);
  background:var(--laiton-pale);
}
.p-contrainte .dure input{
  flex:0 0 auto;width:21px;height:21px;margin:1px 0 0;accent-color:var(--laiton-texte);
}
.p-contrainte .dure label{flex:1 1 auto;font-size:var(--text-3);line-height:1.45;color:var(--ink)}
.p-contrainte .dure:has(input:checked){
  border-color:var(--laiton-texte);
  box-shadow:0 0 0 3px color-mix(in oklab,var(--laiton) 20%,transparent);
}
.p-contrainte .dure:has(input:focus-visible){outline:2.5px solid var(--focus);outline-offset:2px}

/* UNE EXIGENCE EST SECRÈTE, ET C'EST UNE BONNE NOUVELLE. Personne n'apprend jamais qu'il a été
   écarté, ni par quoi. Le ton est celui de la marque, comme « personne ne le lit » : ne pas être
   vu est ici une promesse tenue, pas une privation — et c'est exactement ce qu'on veut savoir au
   moment de cocher « exigence ferme ». Le seul coût est de voir moins de monde. */
.p-regard-exigence{background:var(--vert-50);color:var(--accent)}
