/* ---------------------------------------------------------------------------
   Patte Blanche - source unique des tokens.

   Il y en avait deux : un :root dans front.py (public) et un autre dans
   front_pro.py (pro), portant les MEMES noms avec des valeurs DIFFERENTES -
   onze sur seize. Le public et le pro ne pouvaient pas ressembler au meme
   produit. C'est exactement le piege que front_render.py denonce pour les
   regles d'appariement : deux implementations des memes regles finissent par
   diverger. Ici c'etait le style qui divergeait.

   Reference retenue : les valeurs du public, sauf --gold - le #7E5A16 public
   tire au brun sale, le #C9962F du pro est l'or reel.

   REGLE : aucune valeur brute (hex, px) dans app.css ni pro.css. Ce qui
   manque se rajoute ICI, pas sur place.
--------------------------------------------------------------------------- */
:root{
  /* --- Fonds ----------------------------------------------------------- */
  /* Le blanc de l'IMPRIMANTE, et lui seul. --paper (#FFFDF9) est un
     blanc casse : magnifique a l'ecran, il ferait poser de l'encre sur
     toute la surface d'une feuille A4. Le certificat d'engagement doit
     s'imprimer, la mention devant etre manuscrite. */
  --impression:#FFFFFF;
  --paper:#FFFDF9; --cream:#F9F4EA; --cream2:#F1E7D6; --cream3:#EAE0CD;

  /* --- Encres ---------------------------------------------------------- */
  /* Echelle re-espacee le 01/09/2026 apres mesure de contraste.

     --warm portait les deux styles les plus repetes du produit : les
     micro-libelles en capitales et la ligne secondaire des cartes. Mesure
     sur les fonds reels, il donnait 3,75 sur creme et 3,14 sur cream3 - la
     norme WCAG AA demande 4,5 pour du texte de cette taille. Autrement dit
     le texte le plus present du site etait sous le seuil de lisibilite,
     partout, depuis le debut.

     Assombrir --warm seul l'aurait colle a --ink3 et aurait aplati la
     hierarchie. Les trois neutres clairs descendent donc ensemble, en
     gardant leur ecart relatif. Les deux encres sombres ne bougent pas :
     elles passaient deja largement.

     --warm2 n'etait utilise nulle part. Il est supprime plutot que
     corrige : un token que personne n'emploie est une valeur de plus a
     maintenir juste. */
  --ink:#33291F; --ink2:#4A3D2F; --ink3:#5F5142;
  --warm:#706149;

  /* --- Accents --------------------------------------------------------- */
  /* --terra a ete assombri de 2,4 % le 01/09/2026, sans bouger de teinte
     (17,3 deg). L'ancienne valeur #C0562B donnait 4,49 sur --paper : zero
     virgule zero un sous le seuil AA, sur la couleur qui porte le plus de
     petit texte du produit - libelles de groupe, frais d'adoption, bouton
     de copie, compteurs. Un echec par arrondi reste un echec, et corriger
     vingt selecteurs un par un se serait redefait au premier ajout.
     #B65229 : 4,89 sur --paper, 4,53 sur --cream. */
  --terra:#B65229; --terraLt:#E8926B; --terraDk:#9C3F1B;
  --green:#4C8050; --greenLt:#DFEBD9; --greenDk:#33552F;
  --gold:#C9962F;  --goldLt:#FBF3DC; --goldDk:#7A5C15;
  --rouge:#A6412C;
  /* Fonds tres pales, releves dans app.css ou ils trainaient en dur
     (#FBEDE7 pour un refus, #FBF6E9 pour un inconnu). Ce sont des
     SURFACES, pas des accents : elles portent du texte, jamais l'inverse. */
  --rougeLt:#FBEDE7; --goldPale:#FBF6E9;
  /* Deux crans du rouge que l'espace pro ecrivait en dur, faute de token :
     un trait clair pour les boutons de suppression, une encre sombre pour
     les messages d'erreur (7,02 sur --rougeLt, contre 5,38 pour --rouge).
     Ils sont nommes ici plutot que corriges sur place, comme l'exige
     CLAUDE.md : une valeur qui manque se decide, elle ne se contourne pas. */
  --rougeBord:#E4C6BD; --rougeDk:#8A3524;
  /* Voile des feuilles courtes : la couche au-dessus d'une page, sans
     introduire une nouvelle couleur locale dans chaque module. */
  --voile:rgba(51,41,31,.42);
  /* Le filet d'un drapeau : sans lui, la bande blanche de la France et de
     la Suisse se fond dans le creme et le drapeau parait ampute. Assez
     leger pour ne pas dessiner un cadre. */
  --filetDrapeau:rgba(51,41,31,.16);

  /* --- Sur fond encre --------------------------------------------------
     Le panneau lateral de l'espace structure et la carte des priorites
     posent du texte et des surfaces sur --ink. app.css ecrivait ces nuances
     a la main (quatorze rgba dans le heros d'une fiche) ; pro.css a un
     budget de zero valeur brute, et le nom vaut mieux que l'opacite : on
     relit « le second niveau de texte sur fond encre », pas « .72 ».
     Contrastes MESURES sur --ink #33291F, creme composee sur l'encre :
     plein 13,0 ; second 8,5 ; tertiaire 5,7. Tous au-dela de AA (4,5) ; le
     tertiaire ne l'est pas de AAA, donc il ne porte que des etiquettes,
     jamais une phrase qu'il faut lire. */
  --surInk:var(--cream);
  --surInk2:rgba(249,244,234,.78);
  --surInk3:rgba(249,244,234,.6);
  /* Deux surfaces posees SUR l'encre : la banale, et celle qui porte une
     bonne nouvelle (« rien ne vous attend »). La seconde emprunte sa teinte
     au vert, sinon « a jour » se lit comme un avertissement de plus. */
  --inkSur:rgba(249,244,234,.07);
  --inkSurVert:rgba(223,235,217,.12);
  /* L'element choisi dans le panneau lateral. Assez marque pour se voir du
     coin de l'oeil, assez sobre pour ne pas concurrencer le contenu. */
  --inkChoisi:rgba(249,244,234,.1);
  /* Le halo chaud derriere la carte des priorites : une lueur, pas un
     aplat. Sans lui la carte est un rectangle noir au milieu de la creme. */
  --inkHalo:rgba(192,86,43,.4);
  /* Encre legerement plus claire, pour la rayure du heros sans photo :
     elle doit se distinguer de --ink sans devenir un second fond. */
  --inkRaye:#3A2F24;

  /* --- Sante : le bleu qui ne fait pas peur ----------------------------
     Les regimes de pb/sante.py ont besoin d'une quatrieme famille, pour
     « ne se guerit pas, mais ne l'empeche pas de vivre » - le FIV, la
     surdite, l'amputation. Ni vert (ce serait mentir : ca ne se soigne
     pas), ni ambre (ce serait alarmer), et surtout pas rouge : un mot
     medical ne doit pas faire fuir AVANT d'avoir ete lu. C'est le seul
     endroit du produit ou la couleur porte une position editoriale. */
  --calm:#4A6D7C; --calmLt:#E2EBEE; --calmDk:#2E4B57;

  /* --- Couleurs imposees par l'Etat -------------------------------------
     Arrete du 28 juin 2023 : le message de sensibilisation se pose sur un
     jaune chaud (C0 M10 J100 N0) avec un texte noir. Ces deux valeurs ne
     sont PAS des choix de design et n'ont pas a s'accorder a la palette :
     les modifier serait ne plus appliquer le texte. Elles sont nommees ici
     pour que la feuille reste sans valeur brute, pas pour etre ajustees. */
  --jaune-etat:#FFE500; --noir-etat:#000000;
  /* Le bleu et le rouge du drapeau (nuances officielles du pavillon
     national). Employer les COULEURS de la France n'est pas employer un
     embleme : un liseré tricolore ne se confond avec aucune marque de
     l'Etat, la ou une Marianne dessinee par nous serait la fabrication
     d'un embleme officiel. */
  --bleu-france:#000091; --rouge-france:#E1000F;
  /* Depuis que plusieurs affections s'affichent cote a cote, « ne se
     guerit pas » et « plus serieux » ne peuvent plus porter la meme
     pastille : la distinction disparaissait a l'ecran. Le plus grave
     prend la teinte PLEINE de la meme famille - plus present, jamais
     alarmant. La regle du bloc ci-dessus tient : pas de rouge. */
  --calmPlein:var(--calm); --calmSurPlein:#FFFDF9;   /* 5,48 : AA */

  /* Releve sur la maquette : griffes terracotta FRANC, coussinets bruns,
     tous de la meme couleur. Une patte blanche aux griffes assumees. */
  --claw:var(--terra); --pad:var(--ink);

  /* ET LA MEME PATTE SUR UN FOND SOMBRE. Sur `--ink` - le panneau
     lateral des deux espaces, l'enseigne du portail pro - les
     coussinets valent `--ink` : ils sont invisibles, et il ne
     restait a l'ecran que les quatre griffes. Un site qui
     s'appelle Patte Blanche n'avait plus de patte (releve de
     Claire, 19/09/2026).

     Ce n'est pas le piege des deux `:root` : la valeur n'est pas
     redefinie sous le meme nom a la racine, c'est une VARIANTE
     nommee, posee ici une seule fois, et lue par les deux seuls
     selecteurs ou la marque est sur fond sombre. Les griffes
     passent au terracotta clair : `--terra` tombe a 2,4 sur
     l'encre, `--terraLt` tient. */
  --clawSur:var(--terraLt); --padSur:var(--cream);

  /* --- Sur une photo (prototype du 21/09/2026) --------------------------
     Le nom d'un animal se pose EN BAS de son portrait, sur un degrade
     d'encre : lisible sur n'importe quelle photo, sans assombrir le haut ou
     se trouve la tete. Le fort sert le fond encre de « Ceux que personne
     ne regarde ». Les pastilles posees sur la photo (le temps de route,
     « Aujourd'hui ») prennent un papier presque opaque : une photo claire
     ne doit pas les effacer. */
  /* Le degrade FINIT sur l'encre pleine : c'est la ou le texte se pose, et
     une teinte translucide laissait le contraste dependre de la photo
     (l'audit le mesurait a 1,21 sur le fond creme dessous). */
  --degrade-photo:linear-gradient(180deg,transparent,rgba(51,41,31,.88) 55%,#33291F);
  --degrade-photo-fort:linear-gradient(180deg,transparent,rgba(51,41,31,.9) 50%,#33291F);
  --papier-voile:rgba(255,253,249,.95);
  /* Le flou sur lequel une photo s'affiche entiere quand son cadre la
     couperait (fiche v5, 16/10/2026) : decoratif, il ne porte aucun texte. */
  --flou-photo:blur(28px) saturate(1.1);
  --voile-bouton:rgba(51,41,31,.55);
  /* Le voile derriere le message d'entree de l'arrete : un noir NEUTRE, pas
     l'encre brune de nos feuilles. Le cadre jaune et noir de l'Etat se pose
     sur la page sans lui emprunter sa teinte ; a .55 il rend le #706e6a de
     la maquette sur le creme (#f9f4ea), la ou l'encre rendait #8c857b
     (controle QA du 13/10/2026). */
  --voile-arrete:rgba(0,0,0,.55);
  /* Le filet du fond d'une preuve citee (« ✓ une maison avec jardin ») :
     l'or clair qui borde une question a poser. */
  --filet-or:rgba(201,150,47,.28);

  /* --- Elevation -------------------------------------------------------
     Une seule ombre servait a tout : carte, menu deroulant, fiche plein
     ecran. Trois objets a trois distances du lecteur portaient la meme,
     et rien ne disait lequel etait au-dessus de l'autre.

     Trois crans, et pas un de plus. L'ombre dit une distance, pas un
     style : au-dela de trois distances lisibles, on empile du flou. */
  --sh-1:0 1px 2px rgba(51,41,31,.05), 0 10px 30px -18px rgba(51,41,31,.28);
  --sh-2:0 2px 6px rgba(51,41,31,.07), 0 18px 44px -22px rgba(51,41,31,.36);
  --sh-3:0 4px 12px rgba(51,41,31,.1), 0 40px 90px -30px rgba(51,41,31,.5);
  --sh:var(--sh-1);          /* nom historique, garde pour l'existant */

  /* --- Mouvement -------------------------------------------------------
     Les durees etaient ecrites a la main : .14s, .16s, .4s, sans regle.
     Trois durees suffisent, et la courbe est la meme partout - c'est elle
     qui donne au produit sa maniere de bouger. */
  --t-court:.14s;            /* survol, pression : la reponse immediate */
  --t-moyen:.24s;            /* apparition d'un panneau, glissement */
  --t-long:.42s;             /* changement d'etat qu'on doit remarquer */
  --e:cubic-bezier(.22,.61,.36,1);

  /* --- Traits ----------------------------------------------------------
     « 1px solid var(--cream3) » etait ecrit 23 fois. Le jour ou la couleur
     des traits doit bouger, elle doit bouger d'un seul endroit. */
  --tr:1px solid var(--cream3);
  --tr-clair:1px solid var(--cream2);
  --tr-fort:1.5px solid var(--cream3);
  --tr-sombre:1px solid rgba(249,244,234,.16);   /* sur fond ink */
  /* Un filet plus marque sur l'encre : le contour d'un bouton secondaire
     pose sur un bandeau sombre (administration, 12/10/2026). */
  --tr-sombre-fort:1px solid rgba(249,244,234,.3);
  /* Contour des champs de saisie : --cream3 sur papier tenait a 1,15.
     --warm donne 4,6 sur --paper et 4,3 sur --cream : un champ se voit
     sans etre survole (maquette du 29/09/2026). Lu par socle.css. */
  --champ-bord:var(--warm);
  /* Le TRAIT d'un champ, en une declaration (maquette du 02/10/2026).
     La regle du socle ne pose que la COULEUR et perd contre toute regle
     de composant qui a une classe : treize d'entre elles reposaient le
     trait creme (1,19 a 1,29) - mesure de l'audit du 10/10/2026. Un champ
     dont un composant ecrit le bord l'ecrit avec ce jeton. */
  --tr-champ:1px solid var(--champ-bord);

  /* --- Plans -----------------------------------------------------------
     Les valeurs de z-index etaient posees au cas par cas (50, 60). Une
     echelle nommee evite la surenchere ou chacun ajoute 10. */
  --z-barre:10; --z-menu:50; --z-voile:60; --z-feuille:70;

  /* --- Focus -----------------------------------------------------------
     Il n'existait aucun anneau de focus : au clavier, rien n'indiquait ou
     l'on se trouvait. C'est une regle d'accessibilite, pas un ornement. */
  --focus:2px solid var(--terra);
  --focus-ecart:2px;
  /* Sur fond encre, --terra tombe a 2,4 : l'anneau passe au terracotta
     clair (5,1). Lu par socle.css. */
  --focus-sur:2px solid var(--terraLt);

  /* --- Mesures ---------------------------------------------------------
     La largeur de lecture confortable et la largeur de page, nommees une
     fois. 1180px etait repete a la main dans deux feuilles. */
  --mesure:65ch;             /* longueur de ligne au-dela de laquelle on perd */
  --page:1180px;
  /* L'espace de travail n'est pas une colonne de lecture : Le Coup de Patte
     compare un apercu et une file de publication. Sur un grand ecran, il
     peut respirer sans agrandir la prose elle-meme. */
  --page-large:1440px;

  /* --- Typographie -----------------------------------------------------
     33 tailles distinctes circulaient, dont des demi-pixels (9.5, 10.5,
     11.5, 12.5, 13.5, 14.5px). Ce n'etait pas une echelle : c'etait du
     reglage a l'oeil, ecran par ecran. */
  /* Les trois familles. Elles etaient ecrites en toutes lettres dans
     app.css - 'Public Sans' six fois, 'IBM Plex Mono' cinq fois - et
     nulle part ailleurs, si bien que la feuille legale generee par
     display.py tournait, elle, sur la pile systeme : deux typographies
     pour un seul produit. */
  --ff-corps:'Public Sans',-apple-system,BlinkMacSystemFont,sans-serif;
  --ff-titre:'Eczar',Georgia,serif;
  --ff-mono:'IBM Plex Mono',ui-monospace,monospace;

  /* Echelle unique (maquette du 29/09/2026), alignee sur l'espace pro :
     rien sous 13 px. L'ancienne descendait a 10,5 px pour les etiquettes
     mono et 12 px pour les notes - illisible a bout de bras sur un
     telephone, et deux demi-pixels de plus que ce que la regle permet. */
  --fs-xs:13px;    --fs-sm:14px;    --fs-base:15px;   --fs-md:16px;
  --fs-lg:17px;    --fs-xl:21.5px;  --fs-2xl:24px;    --fs-3xl:32px;
  --fs-4xl:44px;   --fs-display:clamp(27px,3.6vw,40px);
  /* Les trois titres du prototype du 21/09/2026 (« la maquette l'emporte »).
     Ce ne sont pas des crans pour arranger un ecran : ce sont les tailles
     que la maquette DECIDE, a largeur variable - le titre d'accueil, le
     titre d'une section, le nom d'un animal sur sa fiche. */
  --fs-hero:clamp(36px,4.6vw,58px);
  --fs-section:clamp(26px,3.2vw,36px);
  --fs-fiche:clamp(34px,5vw,48px);

  /* Taille MINIMALE d'un champ de saisie, et ce n'est pas un choix
     esthetique : sous 16 px, Safari iOS zoome la page a chaque prise de
     focus, puis laisse l'utilisateur dezoomer a la main. Nos champs etaient
     a 15 px cote public et 13,5 cote pro - donc chaque saisie de code postal
     sur iPhone deplacait la page. --fs-lg est le premier cran au-dessus. */
  --fs-champ:var(--fs-lg);

  /* --- Espacements -----------------------------------------------------
     90 valeurs distinctes de padding / margin / gap. Echelle posee ici ;
     la substitution reste a faire, ecran par ecran, a l'oeil. */
  --sp-1:4px; --sp-2:8px;  --sp-3:12px; --sp-4:16px;
  --sp-5:24px; --sp-6:34px; --sp-7:48px;

  /* Hauteur minimale d'une cible tactile.
     Mesure du 01/09/2026 a 360 px : les pastilles du panneau foyer faisaient
     36,9 px, les options deroulantes 37,6, la croix de fermeture 25,6 x 21,5,
     le bouton de pause 26 x 26. Un doigt adulte couvre environ 45 px : sous
     ce seuil, on vise a cote, et c'est un panneau qu'on parcourt d'un pouce.
     Applique sur le TACTILE seulement : a la souris, agrandir tout aurait
     dilate des ecrans deja denses. */
  --cible:44px;
  /* Une pastille de la barre des resultats, A LA SOURIS (maquette du
     24/09/2026 : « des pastilles de meme hauteur »). Au doigt, elle prend
     --cible comme toute commande ; c'est l'ecart voulu « 44 px en mode
     tactile seulement » (controle QA du 13/10/2026). */
  --pastille:40px;
  /* LA PATTE, une seule taille pour tout le site.
     Le meme SVG (`front.LOGO`, classe `.paw`) est pose par l'accueil, le
     dossier, l'espace pro et les pages legales - et sa taille etait ecrite
     DEUX fois : `.paw` dans `app.css`, `.marque svg` dans `pro.css`, trois
     declarations identiques dans deux feuilles qu'aucune page ne sert
     ensemble (/pro n'a pas `app.css`). Deux ecritures d'une meme regle
     finissent par en dire deux choses ; celle qui diverge aurait grandi la
     marque d'un seul cote. En `em` a dessein : la marque suit la taille du
     texte qui la porte, et l'enseigne du pro la grossit sans rien recopier.
     Mesure du 18/09/2026 - les deux feuilles portaient deja ces valeurs. */
  --logo-l:1.58em; --logo-h:1.70em;
  /* Tuiles d'espece (dossier, « Vous cherchez ») : la photo et la colonne. */
  --tuile:64px; --tuile-col:80px; --picto:38px;
  /* L'anneau d'une tuile cochee. */
  --anneau:3px solid var(--terra);

  /* --- Rayons --- 21 valeurs distinctes. */
  --r-xs:4px; --r-sm:8px; --r-md:12px; --r-lg:18px;
  --r-pill:999px; --r-circle:50%;
}

/* ==========================================================================
   La coquille des espaces connectes : panneau lateral, barre, colonne.

   Servie par /pro ET par /famille (maquette du 16/09/2026). Elle vivait dans
   pro.css, que /famille ne sert pas : la recopier dans foyer.css aurait fait
   deux ecritures du meme panneau, et elles auraient diverge - le piege des
   deux :root. Aucune valeur brute ; les jetons sont dans tokens.css.

   Le panneau s'appelle `.panneau`, et c'est le SEUL a porter ce nom : les
   encarts de la fiche d'un animal le portaient aussi, et leurs regles
   (rayon, marge interieure), ecrites plus bas dans pro.css, s'appliquaient
   au panneau lateral - il etait en retrait, les coins arrondis, quand la
   maquette le pose d'un bord a l'autre. Ils s'appellent `.encart`.
   ========================================================================== */
/* Un `display` pose par une classe BAT le [hidden] du navigateur : la
   coquille cachee etait dessinee quand meme, par-dessus le portail, et la
   page debordait de 519 px a 360. Le piege n'a rien de theorique - il est
   invisible a la lecture du CSS et se voit a la mesure. */
.coquille{display:flex;min-height:100vh;align-items:stretch}
.coquille[hidden]{display:none}

/* --- Le panneau lateral ---------------------------------------------- */
.panneau{flex:none;width:230px;background:var(--ink);color:var(--surInk);
 padding:var(--sp-5) 0;display:flex;flex-direction:column;gap:var(--sp-5);
 position:sticky;top:0;height:100vh;overflow-y:auto}
/* Mesure a 1440 : le panneau laisse 106 px au texte de la marque, et
   « Patte Blanche » en demande 150 a --fs-xl. Elle se cassait donc en deux
   lignes, et « ESPACE STRUCTURES » aussi. Dans le panneau la marque est un
   REPERE, pas un titre : le format heros appartient au portail, ou elle a
   toute la largeur. Un cran plus bas sur l'echelle, et elle tient. */
.panneau .marque{padding:0 var(--sp-5);font-size:var(--fs-lg);color:var(--surInk);
 text-decoration:none}
.panneau .brand{color:var(--surInk)}
/* Le sous-titre de la marque (« Espace structures », « Espace famille »).
   pro.css le pose pour toute la page ; /famille ne sert pas pro.css, et sans
   cette regle le sous-titre se collait au nom et sortait du panneau. */
.panneau .brand small{display:block;margin-top:var(--sp-1);
 font-family:var(--ff-mono);font-size:var(--fs-xs);letter-spacing:.16em;
 text-transform:uppercase;color:var(--surInk3)}
.panneau .marque:hover .brand,.panneau .marque:focus-visible .brand{
 color:var(--terraLt)}
/* La taille de la marque se LIT, elle ne se recopie pas : c'etait la
   troisieme copie des memes deux valeurs (18/09/2026). Et la patte
   prend ici sa variante de fond sombre - sans quoi les coussinets
   sont de la couleur du panneau. */
.panneau .marque svg{width:var(--logo-l);height:var(--logo-h);
 --claw:var(--clawSur); --pad:var(--padSur)}

/* Les cinq sections. Un bouton, pas un lien : on ne change pas de page, et
   un lien qui ne navigue pas ment au clic droit comme au lecteur d'ecran. */
.sections{display:flex;flex-direction:column;gap:2px}
.sections button{display:flex;align-items:center;gap:var(--sp-2);width:100%;
 background:none;border:0;text-align:left;cursor:pointer;color:var(--surInk2);
 font:inherit;font-size:var(--fs-base);padding:10px var(--sp-5);
 min-height:var(--cible);transition:background var(--t-court) var(--e)}
.sections button:hover{background:var(--inkSur);color:var(--surInk)}
.sections button[aria-current="page"]{background:var(--inkChoisi);
 color:var(--surInk);font-weight:600;box-shadow:inset 3px 0 0 var(--terraLt)}
/* Le titre d'un groupe de sections (« Plus » dans l'espace famille) : un
   repere, pas un bouton - il ne se prend pas au clavier. */
.sections .groupe{margin:var(--sp-4) 0 var(--sp-1);padding:0 var(--sp-5);
 font-family:var(--ff-mono);font-size:var(--fs-xs);letter-spacing:.14em;
 text-transform:uppercase;color:var(--surInk3)}
/* Le compteur d'une section. Il ne s'affiche que s'il vaut quelque chose :
   un « 0 » a cote de « Familles » attire l'oeil sur ce qui n'attend pas. */
.sections .n{margin-left:auto;font-family:var(--ff-mono);font-size:var(--fs-xs);
 background:var(--inkSur);color:var(--surInk2);border-radius:var(--r-pill);
 padding:2px 8px;min-width:22px;text-align:center}
.sections button[aria-current="page"] .n{background:var(--terra);
 color:var(--paper)}
/* Une section FINIE (le dossier complet) : une coche sur fond vert. */
.sections .n.fait,.sections button[aria-current="page"] .n.fait{background:var(--green);
 color:var(--paper);font-family:inherit;font-weight:700}

/* Le pied du panneau : qui est connecte, et par ou l'on sort. */
.qui{margin-top:auto;padding:0 var(--sp-5);display:flex;flex-direction:column;
 gap:var(--sp-2)}
.qui .ligne{display:flex;align-items:center;gap:var(--sp-2);min-width:0}
.qui .sigle{flex:none;width:34px;height:34px;border-radius:var(--r-pill);
  background-size:cover;background-position:center;
 background:var(--terra);color:var(--paper);display:flex;align-items:center;
 justify-content:center;font-family:var(--ff-titre);font-size:var(--fs-base);
 font-weight:600}
/* Le nom de la structure TIENT SUR DEUX LIGNES. Coupe par une ellipse, il
   donnait « Les Quatre Pat... » : une structure a le droit de lire son
   propre nom dans son propre espace (capture du 16/09/2026). */
.qui .nom{font-size:var(--fs-base);color:var(--surInk);font-weight:600;
 line-height:1.25;overflow-wrap:anywhere}
.qui .ou{font-size:var(--fs-xs);color:var(--surInk3);overflow:hidden;
 text-overflow:ellipsis;white-space:nowrap}
.qui .sortir{color:var(--surInk2);text-decoration:underline;
 background:none;border:0;padding:var(--sp-2) 0;cursor:pointer;font:inherit;
 font-size:var(--fs-sm);text-align:left;min-height:var(--cible)}
.qui .sortir:hover{color:var(--terraLt)}

/* --- La colonne de travail -------------------------------------------- */
.travail{flex:1;min-width:0;display:flex;flex-direction:column}
/* La barre est une GRILLE DE TROIS COLONNES depuis la maquette du
   22/09/2026 : le fil d'Ariane a gauche, ce qui se regle au centre, la date
   a droite. En `flex` avec `space-between`, le controle pays venait se
   coller au fil des qu'un ecran n'avait pas de champ de recherche, et sa
   place changeait d'un ecran a l'autre. Une colonne la fixe.

   La maquette empilait QUATRE `grid-template-columns` contradictoires et
   trois `!important` - la trace d'une seance d'iterations. Ce qui est ecrit
   ici est leur resultat effectif, en une seule regle : la recopier telle
   quelle aurait pose dans cette feuille ce que `tests/test_styles.py`
   existe pour empecher, et ses `!important` faisaient perdre les media
   queries, donc la barre ne se repliait plus. */
.barre{position:sticky;top:0;z-index:var(--z-barre);flex:none;
 min-height:56px;background:var(--cream);border-bottom:var(--tr);
 display:grid;grid-template-columns:auto minmax(0,1fr) auto;
 align-items:center;column-gap:var(--sp-4);box-sizing:border-box;width:100%;
 padding:0 var(--sp-5)}
.barre .fil{grid-column:1;justify-self:start;display:block;
 white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
 font-size:var(--fs-base);color:var(--ink)}
.barre .fil b,.barre .fil .sep,.barre .fil .ou{display:inline}
.barre .fil [hidden]{display:none}
.barre .fil .sep{color:var(--warm)}
.barre .fil .ou{color:var(--warm);max-width:14rem;overflow:hidden;
 text-overflow:ellipsis;white-space:nowrap}
/* Le groupe central : ce qui se REGLE (chercher, le pays, la langue). */
.barre .centre{grid-column:2;display:flex;align-items:center;gap:var(--sp-3);
 justify-content:flex-end;min-width:0;max-width:100%}
/* L'espace famille n'a pas de groupe central - sa barre ne porte que le
   fil, le controle et la date -, donc le controle prend la colonne lui-meme. */
.barre > .pz-barre-pays{grid-column:2;justify-self:end}
.barre .jour{grid-column:3;justify-self:end;min-width:0;max-width:100%;
 white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
 font-family:var(--ff-mono);font-size:var(--fs-xs);color:var(--warm);
 letter-spacing:.14em;text-transform:uppercase}

/* --- Telephone et tablette --------------------------------------------
   Le panneau passe en barre horizontale defilante. Le cacher derriere un
   bouton demanderait un menu, un piege a focus et une touche Echap ; une
   barre defilante montre les cinq sections tout de suite. */
@media (max-width:900px){
  /* `min-width:0` sur les deux enfants : sans lui, un enfant flex refuse de
     retrecir sous la taille de son contenu, et c'est la PAGE qui deborde -
     519 px pour 360 a la premiere mesure. */
  .coquille{flex-direction:column}
  /* La rangee des sections prend SA PROPRE LIGNE. Partagee avec la marque
     et le lien de sortie, il lui restait la largeur d'un bouton : trois
     sections sur quatre vivaient dans un defilement que rien n'annoncait. */
  .panneau{width:auto;min-width:0;height:auto;position:static;
   flex-direction:row;flex-wrap:wrap;align-items:center;gap:var(--sp-2);
   padding:var(--sp-2) var(--sp-4);overflow:hidden}
  .panneau .marque{padding:0;font-size:var(--fs-lg);flex:none;
   display:flex;align-items:center;min-height:var(--cible)}
  .panneau .brand small{display:none}
  /* Les quatre sections PASSENT A LA LIGNE, elles ne defilent pas. A 390 px
     elles font 445 px : en defilement lateral, trois etaient invisibles et
     rien ne disait qu'elles existaient. Une navigation qu'il faut decouvrir
     au doigt n'en est pas une. Deux rangs coutent 44 px de hauteur ; c'est
     le prix, et il est payé une fois. */
  .sections{flex-direction:row;flex-wrap:wrap;gap:var(--sp-1);
   flex:1 0 100%;min-width:0;order:3}
  /* `width:auto` neutralise le 100 % du panneau vertical : sans lui chaque
     section prend un rang entier et la barre en occupe quatre. */
  .sections button{padding:8px var(--sp-3);white-space:nowrap;flex:none;
   width:auto;border-radius:var(--r-pill);min-height:var(--cible)}
  .sections .groupe{display:none}
  .sections button[aria-current="page"]{box-shadow:none;background:var(--terra);
   color:var(--paper)}
  .qui{margin-top:0;padding:0;flex:none;margin-left:auto;flex-direction:row;
   align-items:center}
  /* MON COMPTE RESTE ACCESSIBLE (maquette du 02/10/2026) : le lien du bloc
     « qui » se reduit a son sigle, il ne disparait plus. Masque en entier,
     il laissait le compte sans aucun chemin sur telephone. */
  .qui .ou{display:none}
  .qui .ligne.qui-lien{display:flex;padding:0;margin:0;min-width:var(--cible);
   min-height:var(--cible);justify-content:center;background:none}
  .qui .qui-lien > span:not(.sigle):not(.qui-fl),.qui .qui-fl{display:none}
  .qui .sigle{width:40px;height:40px;font-size:var(--fs-sm)}
  /* Deux colonnes : la date part avec la troisieme. La garder aurait
     ouvert une colonne implicite, et la barre aurait deborde. */
  .barre{grid-template-columns:auto minmax(0,1fr);padding:0 var(--sp-4)}
  .barre .jour{display:none}
}
@media (max-width:560px){
  .barre .jour{display:none}
  .barre .fil{display:none}
  .barre{grid-template-columns:minmax(0,1fr)}
  /* UNE SEULE COLONNE, donc le groupe central y va : laisse en colonne 2,
     il ouvrait une colonne implicite et la barre debordait des qu'un
     element s'y ajoutait - la cloche l'a montre (14/10/2026, 373 px pour
     360). */
  .barre .centre{grid-column:1;justify-content:space-between;gap:var(--sp-2)}
  .barre > .pz-barre-pays{grid-column:1;justify-self:end}
}

/* La colonne du nom, dans le pied du panneau : sans `min-width:0` un nom
   long pousse la ligne au lieu de se laisser tronquer. `.qui .ligne` l'a
   deja ; l'enfant en a besoin AUSSI, et c'est ce qui etait ecrit en
   attribut dans `front_pro.py`. */
.qui .ligne > div{min-width:0}

/* La barre « pays · langue » des espaces connectés (maquette du 22/09/2026)
   -------------------------------------------------------------------------
   Elle vit ICI parce que `coquille.css` est la seule feuille que `/pro` et
   `/famille` servent tous les deux — c'est la leçon du panneau latéral du
   16/09, et du studio le 08/09 : une règle écrite dans une feuille que la
   page ne sert pas est un écran sans style, et la recopier dans les deux
   est le piège des deux `:root`.

   Ce qui est PROPRE à un espace reste chez lui : `pro.css` masque le nom du
   pays, parce que la barre des structures porte déjà un fil d'Ariane et un
   champ de recherche sur la même ligne. */
.pz-barre-pays{position:relative;display:inline-flex;margin-left:auto}
.pz-bp-bouton{display:inline-flex;align-items:center;gap:var(--sp-2);
  min-height:var(--cible);padding:6px 14px 6px 10px;border:var(--tr);
  border-radius:var(--r-pill);background:var(--paper);color:var(--ink);
  font:inherit;font-size:var(--fs-base);font-weight:600;cursor:pointer;
  white-space:nowrap}
.pz-bp-bouton:hover{border-color:var(--terraLt)}
.pz-bp-drap .drap{width:28px;height:20px;display:block}
.pz-bp-drap .drap-eu{width:28px;height:20px}
.pz-bp-lang{color:var(--warm);font-weight:400;font-family:var(--ff-mono);
  font-size:var(--fs-sm);letter-spacing:.06em}
.pz-bp-bouton > [aria-hidden]{color:var(--warm);font-weight:400;font-size:var(--fs-sm)}
.pz-bp-menu{position:absolute;top:calc(100% + 8px);right:0;z-index:var(--z-menu);
  width:min(92vw,340px);background:var(--paper);border:var(--tr);
  border-radius:var(--r-lg);box-shadow:var(--sh-2);padding:10px}
.pz-pays-lab{margin:0;padding:6px 8px 4px;font-family:var(--ff-mono);
  font-size:var(--fs-xs);letter-spacing:.12em;text-transform:uppercase;
  color:var(--warm)}
.pz-pays-liste{display:grid;gap:2px}
.pz-bp-menu .opt-pays{display:flex;align-items:center;gap:10px;width:100%;
  min-height:40px;padding:4px 8px;border:0;border-radius:var(--r-sm);
  background:none;font:inherit;font-size:var(--fs-base);color:var(--ink);
  cursor:pointer;text-align:left}
.pz-bp-menu .opt-pays:hover,
.pz-bp-menu .opt-pays[aria-selected="true"]{background:var(--cream2)}
.pz-bp-menu .opt-pays .drap{width:24px;height:16px}
.pz-bp-menu .opt-pays .op-n{flex:1}
.pz-bp-menu .opt-pays .op-c{font-size:var(--fs-sm);color:var(--warm)}
.pz-bp-langue{margin-top:6px;padding:10px 6px 6px;border-top:var(--tr-clair);
  display:flex;align-items:center;gap:var(--sp-2);flex-wrap:wrap}
.pz-bp-langue .pz-pays-lab{flex:1 1 auto;margin:0;padding:0}
.pz-bp-menu .seg{display:inline-flex;border:var(--tr);border-radius:var(--r-pill);
  overflow:hidden}
.pz-bp-menu .seg a{display:inline-flex;align-items:center;min-height:36px;
  padding:0 12px;color:var(--ink2);font-family:var(--ff-mono);
  font-size:var(--fs-sm);letter-spacing:.06em;text-decoration:none}
.pz-bp-menu .seg a[aria-current="true"]{background:var(--ink);color:var(--paper);
  font-weight:500}
/* La langue du pays est PROPOSÉE, pas imposée : soulignée, jamais cochée.
   Quelqu'un qui a choisi « FR » depuis l'Allemagne veut lire en français. */
.pz-bp-menu .seg a.proposee{text-decoration:underline;text-underline-offset:3px}
.pz-bp-note{margin:0;padding:6px 6px 2px;font-size:var(--fs-sm);
  color:var(--warm);line-height:1.5;text-wrap:pretty}

/* Le bloc du bas OUVRE le compte (maquette du 23/09/2026)
   -------------------------------------------------------------------------
   Il vit ICI, et pas dans `pro.css` ni dans `foyer.css` : les deux espaces
   portent le même bloc, et `coquille.css` est la seule feuille qu'ils
   servent tous les deux. La recopier deux fois est le piège des deux
   `:root`, pour la sixième fois dans ce dépôt.

   La ligne était un `div` avec deux `div` dedans ; c'est un `a` avec des
   `span`, parce qu'un lien ne peut pas contenir de bloc sans que le survol
   et le focus se déforment. Les deux règles ci-dessous rendent aux `span`
   la mise en colonne que les `div` donnaient d'eux-mêmes. */
.qui .qui-lien{color:inherit;text-decoration:none;border-radius:var(--r-md);
  padding:var(--sp-1) var(--sp-2);margin:0 calc(-1 * var(--sp-2));cursor:pointer}
.qui .qui-lien:hover{background:var(--inkSur)}
.qui .qui-lien:focus-visible{outline:2px solid var(--paper);outline-offset:1px}
.qui .qui-lien > span:not(.sigle):not(.qui-fl){display:flex;flex-direction:column;
  min-width:0;flex:1}
.qui .qui-lien .nom,.qui .qui-lien .ou{display:block}
.qui .qui-fl{margin-left:auto;color:var(--surInk3);font-size:var(--fs-lg);
  line-height:1;flex:none}
.qui .qui-lien[aria-current="page"]{background:var(--inkChoisi)}

/* LA CLOCHE de l'espace structure (14/10/2026, maquette du 23/09). La cible
   fait 44 px, le compteur se pose sur son coin, la liste s'ouvre dessous. */
.cloche-z{position:relative;flex:none}
.cloche{position:relative;display:inline-flex;align-items:center;justify-content:center;
 min-width:var(--cible);min-height:var(--cible);padding:0;border:0;border-radius:var(--r-circle);
 background:transparent;color:var(--ink);cursor:pointer}
.cloche:hover{background:var(--paper)}
.cloche svg{width:var(--sp-5);height:var(--sp-5)}
.cloche-n{position:absolute;top:var(--sp-1);right:var(--sp-1);min-width:var(--sp-4);
 padding:0 var(--sp-1);border-radius:var(--r-pill);background:var(--terra);color:var(--cream);
 font-size:var(--fs-xs);font-weight:700;line-height:1.4;text-align:center}
.cloche-liste{position:absolute;right:0;top:100%;z-index:var(--z-barre);
 width:min(22rem,calc(100vw - var(--sp-5)));max-height:70vh;overflow:auto;
 background:var(--cream);border:var(--tr);border-radius:var(--r-md);
 box-shadow:var(--sh);padding:var(--sp-2)}
.cloche-liste .cloche-h{margin:var(--sp-1) var(--sp-2) var(--sp-2);font-weight:700;color:var(--ink)}
.cloche-liste ul{list-style:none;margin:0;padding:0}
.cloche-it{display:block;width:100%;min-height:var(--cible);text-align:left;
 padding:var(--sp-2);border:0;border-radius:var(--r-sm);background:transparent;
 color:var(--ink);cursor:pointer}
.cloche-it:hover{background:var(--paper)}
.cloche-it b{display:block;font-size:var(--fs-sm)}
.cloche-it small{display:block;color:var(--ink3);font-size:var(--fs-xs)}
.cloche-liste .neuve .cloche-it{border-left:var(--sp-1) solid var(--terra)}

*{box-sizing:border-box}
body{margin:0;background:var(--cream);color:var(--ink2);
 font:16px/1.6 'Public Sans',system-ui,-apple-system,sans-serif}
h1,h2,h3{font-family:'Eczar',Georgia,serif;color:var(--ink);margin:0}
a{color:var(--terra)}
.wrap{max-width:940px;margin:0 auto;padding:26px 22px 80px}
/* Le portail reste volontairement sobre avant connexion. Une fois dans son
   espace, le studio est un plan de travail : le laisser dans une colonne de
   formulaire a 940 px ecrasait l'apercu et la file sur les grands ecrans.
   Cette largeur ne concerne donc ni l'accueil ni le certificat imprime. */
@media (min-width:1100px){
  body.pro-connecte .wrap{max-width:var(--page-large)}
}
/* La marque : un lien, a la taille du site public (--fs-display, patte en em),
   pas un texte un tiers plus petit. Meme repere des deux cotes du produit.

   LA TAILLE DE LA PATTE EST ICI, pas sur la barre qui la contenait. Elle
   vivait sur `.nav svg` ; la barre a disparu avec la refonte du 09/09, et
   la patte a rempli le bandeau entier faute de contrainte. C'est
   exactement ce qui venait d'arriver au tableau des annonces avec
   `.carte #fiches` : une regle ancree a l'ANCETRE depend de la page qui
   sert l'element. Elle vise donc la racine du composant. */
.marque{display:flex;align-items:center;gap:var(--sp-3);text-decoration:none;
  color:inherit;font-size:var(--fs-display)}
.marque:hover .brand,.marque:focus-visible .brand{color:var(--terraDk)}
.marque svg{width:var(--logo-l);height:var(--logo-h);flex:none}
.brand{font-family:var(--ff-titre);font-size:inherit;font-weight:600;line-height:1;
  color:var(--ink);transition:color var(--t-court) var(--e)}
.brand small{display:block;font-family:'IBM Plex Mono',ui-monospace,monospace;
 font-size:var(--fs-xs);letter-spacing:.16em;text-transform:uppercase;color:var(--warm)}
.lab{font-family:'IBM Plex Mono',ui-monospace,monospace;font-size:var(--fs-xs);
 letter-spacing:.14em;text-transform:uppercase;color:var(--warm)}
.carte{background:var(--paper);border:1px solid var(--cream3);
 border-radius:16px;padding:22px 24px;margin-bottom:18px}
.duo{display:grid;grid-template-columns:1fr 1fr;gap:18px}
@media(max-width:760px){.duo{grid-template-columns:1fr}}
label{display:block;font-size:var(--fs-base);color:var(--ink3);margin:12px 0 4px}
/* TOUS les champs de saisie, pas trois d'entre eux. `password` manquait a
   cette liste depuis toujours : le champ « Mot de passe » de la page de
   connexion tombait sur les valeurs par defaut du navigateur - 22 px de
   haut contre 46 pour le champ d'adresse juste au-dessus, police 13 px,
   rembourrage d'un pixel. `foyer.css` le stylait de son cote ; les deux
   feuilles avaient diverge, et c'est toujours celle qui diverge qui sert
   ce qu'il ne fallait pas.
   Mesure du 18/09/2026 a 375 px, pointeur tactile : six champs a 46 px et
   un seul a 22. `search`, `tel` et `date` etaient nus pour la meme raison.
   L'audit ne le voyait pas : il ENTRE dans l'espace, donc il ne mesure la
   page de connexion que les jours ou la session echoue. */
input[type=text],input[type=email],input[type=password],input[type=number],
input[type=search],input[type=tel],input[type=date],input[type=url],
select,textarea{
 width:100%;padding:9px 11px;border:var(--tr-champ);border-radius:var(--r-sm);
 background:var(--paper);font:inherit;font-size:var(--fs-champ);color:var(--ink)}
textarea{min-height:92px;resize:vertical}

/* L'espace pro n'avait aucun etat de focus : app.css ne lui est pas servie,
   donc la regle globale du site n'y existe pas, et le token --focus n'y
   etait employe nulle part. Les benevoles qui saisissent au clavier
   n'avaient que l'anneau par defaut du navigateur, variable selon la
   machine. */
:focus-visible{outline:var(--focus);outline-offset:var(--focus-ecart)}
.btn{background:var(--ink);color:var(--paper);border:0;border-radius:var(--r-pill);
 padding:11px 20px;font:inherit;font-size:var(--fs-base);font-weight:600;cursor:pointer}
.btn:hover{background:var(--terra)}
.btn.sec{background:none;color:var(--ink3);border:1px solid var(--cream3)}
.btn.sec:hover{background:var(--cream2);color:var(--ink)}
.btn.dang{background:none;color:var(--rouge);border:1px solid var(--rougeBord)}
.btn.dang:hover{background:var(--rougeLt)}
.btn[disabled]{opacity:.45;cursor:default}
.licence{background:var(--cream);border-radius:var(--r-md);padding:14px 16px;
 font-size:var(--fs-base);line-height:1.65;color:var(--ink3);margin:14px 0}
.coche{display:flex;gap:10px;align-items:flex-start;font-size:var(--fs-base);
 color:var(--ink2);margin:10px 0 16px}
/* Une case de 13 px se vise mal au doigt. `accent-color` la teinte sans
   la deformer, et la taille suit le pointeur : agrandir a la souris aurait
   epaissi tous les formulaires du back-office sans raison. */
.coche input{margin-top:3px;flex:none;accent-color:var(--terra)}
@media (pointer:coarse){
  .coche input{width:24px;height:24px;margin-top:0}
  .coche{align-items:center;min-height:var(--cible)}
  /* La marque est un lien, et le seul de l'en-tete de la page de connexion :
     elle se touche. Elle y mesurait 37 px (18/09/2026). Sur l'accueil public
     elle depasse deja 44 - elle y suit `--fs-display` - et cette page-ci ne
     sert pas `app.css` : la regle doit vivre dans la feuille que l'ecran
     sert, pas dans celle qui lui ressemble. */
  .marque{min-height:var(--cible)}
}
.msg{border-radius:10px;padding:11px 14px;font-size:var(--fs-base);margin:12px 0}
.msg.err{background:var(--rougeLt);color:var(--rougeDk)}
.msg.ok{background:var(--greenLt);color:var(--greenDk)}
.msg.info{background:var(--goldLt);color:var(--goldDk)}
.cand{display:flex;align-items:center;gap:14px;padding:12px 0;
 border-bottom:1px solid var(--cream2)}
.cand:last-child{border-bottom:0}
.cand b{font-size:var(--fs-md);color:var(--ink)}
.cand .src{font-size:var(--fs-sm);color:var(--warm)}
.cand .n{margin-left:auto;font-family:'Eczar',Georgia,serif;font-size:var(--fs-2xl);
 color:var(--terra);white-space:nowrap}
.cand .n small{font-size:var(--fs-sm);color:var(--warm);font-family:'Public Sans'}
.chiffres{display:flex;gap:28px;flex-wrap:wrap;margin:6px 0 0}
.chiffres b{display:block;font-family:'Eczar',Georgia,serif;font-size:var(--fs-3xl);
 line-height:1.1;color:var(--ink)}
table{width:100%;border-collapse:collapse;font-size:var(--fs-base);margin-top:10px}
th{text-align:left;font-weight:600;color:var(--warm);font-size:var(--fs-xs);
 letter-spacing:.1em;text-transform:uppercase;padding:6px 8px;
 border-bottom:1px solid var(--cream2)}
td{padding:7px 8px;border-bottom:1px solid var(--cream2);color:var(--ink2)}
tr:last-child td{border-bottom:0}
.pastille{display:inline-block;border-radius:var(--r-pill);padding:2px 9px;
 font-size:var(--fs-xs);font-weight:600}
.pastille.on{background:var(--greenLt);color:var(--greenDk)}
.pastille.off{background:var(--cream2);color:var(--warm)}

/* Les gestes rendus a la structure.
   -----------------------------------------------------------------------
   Cet ecran ne montrait qu'un tableau en lecture seule : quatre colonnes,
   aucune action possible. Une structure n'avait donc aucune raison de
   revenir apres sa revendication - or c'est la deuxieme visite qui fait la
   valeur du dispositif, pas la premiere. */
.pastille.attente{background:var(--goldLt);color:var(--goldDk)}

/* Le doré et non le rouge : un animal en pause n'est pas une erreur, c'est
   une adoption en cours. Le rouge est reserve a ce qui a mal tourne. */
.msg.alerte{background:var(--goldLt);color:var(--goldDk);
  border-left:var(--sp-1) solid var(--gold)}

/* Ancree a .carte : une classe seule qui impose une largeur atteint tous
   les elements qui la portent, y compris ceux qu'on ne regardait pas. C'est
   la regle verrouillee par tests/test_style.py, apprise d'un
   `footer{max-width:76ch}` qui avait reduit la barre d'action d'une fiche a
   558 px dans une fenetre de 1120. */
.carte .aide{color:var(--ink3);font-size:var(--fs-base);line-height:1.6;
  max-width:var(--mesure);margin:var(--sp-2) 0 var(--sp-4)}

/* Les gestes s'ENROULENT, ils ne s'alignent plus sur une seule ligne.
   Le sixieme bouton (« Photos a diffuser », 07/09/2026) a porte la ligne
   au-dela de la boite meme sur un ecran de 1440 : cliquer le dernier
   demandait de faire glisser le tableau, et le nom de l'animal sortait de
   vue au moment ou l'on agissait sur lui. Une ligne plus haute coute moins
   qu'une colonne qu'on doit aller chercher. */
.gestes{display:flex;flex-wrap:wrap;gap:var(--sp-2);align-items:center}
.gestes button{background:none;border:1px solid var(--cream3);color:var(--ink3);
  border-radius:var(--r-pill);padding:var(--sp-2) var(--sp-3);
  font-size:var(--fs-xs);cursor:pointer;
  font-family:inherit}
.gestes button:hover:not([disabled]){background:var(--cream2);color:var(--ink)}
/* « C'est signé » sort l'annonce definitivement. Il se distingue des deux
   autres, qui sont reversibles. */
.gestes button.fort{border-color:var(--rougeBord);color:var(--rougeDk)}
.gestes button.fort:hover:not([disabled]){background:var(--rougeLt)}
.gestes button.doux{border-style:dashed}
.gestes button[disabled]{opacity:.45;cursor:default}
/* Les trois reponses a « toujours disponible ? ». La derniere sort
   l'annonce de la diffusion : elle se distingue des deux autres. */
.gestes button[data-rep="adopte"]{border-color:var(--rougeBord);
  color:var(--rougeDk)}
.gestes button[data-rep="adopte"]:hover:not([disabled]){
  background:var(--rougeLt)}

.conf{font-size:var(--fs-xs);color:var(--greenDk);white-space:nowrap}

/* La declaration de SIREN.
   -----------------------------------------------------------------------
   Proposee seulement quand la demande reste en attente - le cas de 85 % des
   structures, celles dont l'adresse ne figure pas dans leurs propres
   annonces. Elle n'ouvre rien toute seule et le formulaire le dit : un SIREN
   est public, le declarer corrobore, ne prouve pas. */
/* La recherche de libelle : la porte d'entree reelle de cet ecran.
   Sans elle, une structure dont le compte ne porte pas exactement le libelle
   de ses annonces ne voyait rien du tout. */
.rech{display:flex;gap:var(--sp-3);align-items:flex-end;flex-wrap:wrap;
  margin-bottom:var(--sp-4)}
.rech label{flex:1 1 22ch;font-size:var(--fs-base);color:var(--ink2);
  font-weight:600}
.rech input{display:block;width:100%;margin-top:var(--sp-2);
  padding:var(--sp-3);border:var(--tr);border-radius:var(--r-md);
  font-family:inherit;font-size:var(--fs-champ);min-height:var(--cible);
  background:var(--paper);color:var(--ink);box-sizing:border-box}
.rech button{flex:none;min-height:var(--cible)}

/* Le certificat d'engagement : une page faite pour l'imprimante.
   -----------------------------------------------------------------------
   La mention doit etre MANUSCRITE (art. D214-32-4) : ce document ne peut pas
   se signer a l'ecran, il doit sortir sur papier. Tout ce qui suit est donc
   dimensionne pour une feuille A4, pas pour une fenetre. */
.gestes .lien-cert{display:inline-flex;align-items:center;
  min-height:var(--cible);padding:var(--sp-2) var(--sp-3);
  font-size:var(--fs-xs);color:var(--terra);white-space:nowrap}

/* Ancre a .wrap : une classe seule qui impose une largeur atteint tous
   les elements qui la portent. Regle verrouillee par test_style.py. */
.wrap.cert{max-width:52em}
.cert h1{font-size:var(--fs-2xl);margin:0 0 var(--sp-2)}
.cert h2{font-size:var(--fs-lg);margin:var(--sp-6) 0 var(--sp-2)}
.cert ul{margin:0;padding-left:var(--sp-5);line-height:1.6}
.cert li{margin-bottom:var(--sp-2)}
.cert-ref{color:var(--ink3);font-size:var(--fs-base);margin:0 0 var(--sp-5)}
.cert-vie{font-weight:600;margin:0 0 var(--sp-3)}
.cert-note{color:var(--warm);font-size:var(--fs-xs);margin-top:var(--sp-2)}

/* En TETE, pas en pied : il dit que nous ne delivrons pas ce certificat, et
   c'est ce qui conditionne l'usage de toute la page. Personne ne lit les
   pieds de page. */
.cert-avert{background:var(--goldLt);border-left:var(--sp-1) solid var(--gold);
  color:var(--goldDk);padding:var(--sp-4);margin-bottom:var(--sp-6);
  font-size:var(--fs-base);line-height:1.55}

.cert-t{width:100%;border-collapse:collapse;margin-top:var(--sp-2)}
.cert-t th{text-align:left;width:14em;font-weight:600;color:var(--ink2);
  padding:var(--sp-2) 0;vertical-align:top}
.cert-t td{padding:var(--sp-2) 0}
/* « — » dit qu'une case est vide, DANS sa ligne : la regle generale .vide
   (le vide d'un tableau entier, centre et rembourre) en faisait une ligne
   de 80 px, le tiret au milieu de la page (12/10/2026). */
.cert-t .vide{color:var(--warm);display:inline;padding:0;text-align:left;font-size:inherit}
.cert-nav{display:flex;align-items:center;justify-content:space-between;
  gap:var(--sp-3);flex-wrap:wrap;padding:var(--sp-4) 0 var(--sp-5)}

.cert-champ{display:inline-block;min-width:22em;border-bottom:1px solid var(--ink);
  min-height:1.4em}
.cert-manuscrite{background:var(--cream);padding:var(--sp-4);
  border-radius:var(--r-md);line-height:1.6}
.cert-manuscrite span{display:block;margin-top:var(--sp-2);font-weight:700;
  font-size:var(--fs-md)}
.cert-signature{display:flex;gap:var(--sp-6);margin-top:var(--sp-5);
  flex-wrap:wrap}
.cert-signature > div{flex:1 1 14em}
.cert-trait{border-bottom:1px solid var(--ink);height:2.4em}
.cert-trait.haut{height:5em}
.cert-pied{margin-top:var(--sp-6);color:var(--warm);font-size:var(--fs-xs)}

@media print{
  /* A l'impression, seul le document compte : ni fond colore qui vide une
     cartouche, ni ombre, ni marge d'ecran. */
  /* Blanc PUR, pas --paper : sur une feuille, --paper (#FFFDF9)
     ferait poser de l'encre sur toute la page pour rien. */
  body{background:var(--impression)}
  .wrap.cert{max-width:none}
  .cert-avert{border:1px solid var(--goldDk);background:none}
  .cert-manuscrite{background:none;border:1px solid var(--cream3)}
  .cert h2{break-after:avoid}
  .cert-signature{break-inside:avoid}
}


.sir{margin-top:var(--sp-4);padding-top:var(--sp-4);border-top:var(--tr)}
.sir label{display:block;font-size:var(--fs-base);color:var(--ink2);
  font-weight:600}
.sir .opt{font-weight:400;color:var(--warm);font-size:var(--fs-xs)}
.sir input{display:block;margin-top:var(--sp-2);padding:var(--sp-3);
  border:var(--tr);border-radius:var(--r-md);font-family:inherit;
  font-size:var(--fs-champ);min-height:var(--cible);width:14ch;
  background:var(--paper);color:var(--ink);box-sizing:border-box}
.carte .sir .aide{margin:var(--sp-3) 0}


/* Au doigt, les gestes deviennent de vraies cibles.
   Mesures au rendu : 31 px de haut, pour 44 exiges. Cet ecran est fait pour
   un benevole qui vient une fois par an, souvent depuis un telephone ; rater
   « C'est signe » et toucher « Adoption en cours » a la place lui ferait
   croire l'annonce sortie alors qu'elle est seulement en pause. */
@media (pointer:coarse){
  .gestes button{min-height:var(--cible);padding-left:var(--sp-4);
    padding-right:var(--sp-4)}
}

/* Le tableau defile DANS sa boite, la page ne defile jamais de travers.
   Mesure a 375 px : la cinquieme colonne (les gestes) portait la table a
   446 px dans un conteneur de 281, et c'est la PAGE qui debordait -
   493 px pour 375 disponibles. Un site qu'on doit faire glisser
   lateralement pour lire une ligne se referme.

   La regle etait ancree a `.carte`, et le tableau a change de boite le
   09/09 : le debordement est revenu a l'identique, 519 px pour 360. Une
   regle qui depend de l'ancetre de son element depend de la page qui le
   sert - c'est le piege de `studio.css`, deux fois deja. Elle vise
   maintenant l'element lui-meme, ou qu'il vive. */
#fiches{overflow-x:auto}
details summary{cursor:pointer;font-size:var(--fs-base);color:var(--terra);
 padding:4px 0;font-weight:600}
footer{margin-top:34px;font-size:var(--fs-sm);line-height:1.7;color:var(--warm)}
/* Le pied de l'espace prend la marge de l'ecran au-dessus (comparaison a la
   maquette du 15/10/2026) : nu, son texte collait au bord du panneau. Meme
   regle que le pied de l'espace famille (foyer.css). */
.travail > footer{margin-top:0;border-top:var(--tr);padding:var(--sp-6) var(--sp-6) var(--sp-7)}
@media (max-width:900px){ .travail > footer{padding:var(--sp-5) var(--sp-4) var(--sp-6)} }
/* Un bouton qui a la peau d'un lien. `.lien` n'etait style que dans app.css,
   que /pro ne sert pas : chaque composant le refaisait, et celui qui
   l'oubliait (« Modifier » le telephone d'Equipe) gardait l'apparence d'un
   bouton du navigateur (comparaison du 15/10/2026). La base vit ici ; un
   composant plus precis l'emporte toujours. */
.lien{appearance:none;background:none;border:0;padding:0;font:inherit;color:var(--terraDk);
  text-decoration:underline;text-underline-offset:3px;cursor:pointer}
.lien:hover{color:var(--terra)}


/* Ce que l'audit etendu du 02/09/2026 a vu le premier jour ou il a regarde
   les ecrans pro CONNECTES : trois cibles sous 44 px et un certificat qui
   debordait de 14 px a 360. Aucun de ces defauts n'existait sur l'ecran de
   connexion, le seul que l'outil auditait jusque-la. */
@media (pointer:coarse){
  /* « Se deconnecter » : un lien de texte de 22 px dans la barre. */
  .sortir,#sortir{display:inline-flex;align-items:center;
    min-height:var(--cible)}
  /* Les <select> du formulaire de depot : 42 px, a deux pixels de la cible.
     La bordure fractionnaire les faisait mesurer sous le seuil. */
  select{min-height:var(--cible)}
}

/* Le formulaire de correction du certificat : ses champs faisaient 21 px de
   haut, et a 360 px la rangee poussait la page a 374. */
.cert-edit{display:flex;flex-wrap:wrap;gap:var(--sp-3);align-items:flex-end;
  margin-bottom:var(--sp-5)}
.cert-edit > div{flex:1 1 12em;min-width:0}
.cert-edit label{display:block;font-size:var(--fs-xs);color:var(--ink3);
  font-weight:600;margin-bottom:var(--sp-1)}
.cert-edit input{display:block;width:100%;box-sizing:border-box;
  min-height:var(--cible);padding:var(--sp-2) var(--sp-3);border:var(--tr);
  border-radius:var(--r-md);font-family:inherit;font-size:var(--fs-base)}
.cert-edit .btn{min-height:var(--cible)}
@media print{.cert-edit,.cert-nav{display:none}}

/* « Je soussigne(e) ____ » : un champ de 22em dans une colonne de 316 px
   debordait. Sous 560 px il prend la ligne entiere. */
@media (max-width:560px){
  .cert-champ{display:block;min-width:0;width:100%;margin-top:var(--sp-2)}
  .cert-t th{width:9em}
}

/* Les candidatures recues, par animal, dans l'ordre d'arrivee (pb/front_pro.py
   rendreCandidatures). Chaque famille est une carte : son foyer tel que
   dossier.vue_structure() le rend, puis les deux gestes. */
.vue-f{display:grid;grid-template-columns:auto 1fr;gap:var(--sp-1) var(--sp-4);
  margin:0 0 var(--sp-3);font-size:var(--fs-base);line-height:1.5}
.vue-f dt{color:var(--ink3)}
.vue-f dd{margin:0;color:var(--ink);overflow-wrap:anywhere}

/* --- La boite de reception des candidatures (maquette, 17/09/2026) -------
   Une liste a gauche, une candidature a droite ; empilees sous 960 px. */
.bx-tete{display:flex;justify-content:space-between;align-items:flex-start;
  gap:var(--sp-4);flex-wrap:wrap;margin:0 0 var(--sp-4)}
.bx-tete p{margin:0 0 var(--sp-1)}
.bx-alerte{color:var(--rougeDk);font-weight:600}
/* LES DOSSIERS RECUS SANS ANIMAL (13/10/2026), en tete de la boite. */
.bx-recus{margin:0 0 var(--sp-4);padding:var(--sp-3) var(--sp-4);background:var(--cream);border:var(--tr);border-radius:var(--r-md)}
.bx-recus h3{margin:0 0 var(--sp-1);font-size:var(--fs-md);display:flex;flex-wrap:wrap;gap:var(--sp-1) var(--sp-3);align-items:baseline}
.bx-recu-n{font-weight:400;font-size:var(--fs-sm);color:var(--ink2)}
.bx-recu{border-top:var(--tr-clair)}
.bx-recu-t{display:flex;flex-wrap:wrap;gap:var(--sp-1) var(--sp-3);align-items:center;width:100%;text-align:left;
  background:none;border:0;padding:var(--sp-2) 0;min-height:var(--cible);font:inherit;color:var(--ink);cursor:pointer}
.bx-recu-t small{color:var(--ink2);font-size:var(--fs-sm)}
.bx-recu-e{margin-left:auto;font-family:var(--ff-mono);font-size:var(--fs-xs);color:var(--terraDk)}
.bx-recu.fait .bx-recu-e{color:var(--greenDk)}
.bx-recu-c{padding:0 0 var(--sp-3)}
.bx-recu-msg{margin:0 0 var(--sp-3);padding:var(--sp-2) var(--sp-3);border-left:3px solid var(--terra);
  background:var(--paper);font-size:var(--fs-sm);white-space:pre-wrap}
.bx-recu-g{display:flex;flex-wrap:wrap;gap:var(--sp-2);align-items:center;margin-top:var(--sp-3)}
.bx-recu-g label{flex:1 1 100%;font-size:var(--fs-sm);color:var(--ink2)}
.bx-recu-g select{min-height:var(--cible);max-width:100%;min-width:0;font-size:var(--fs-sm)}
/* A 360 px, un nom d'animal d'une source allemande (« Frohnatur Paul hofft auf
   Neuanfang ») ne tient pas dans un menu natif a cote de son bouton : le menu
   prend toute la ligne, et le bouton passe dessous (audit du 13/10/2026). */
@media (max-width:560px){ .bx-recu-g select{flex:1 1 100%} }
.bx-recu-g .note{flex:1 1 100%;margin:0}
/* CE QUI BLOQUE UNE SIGNATURE. La carte porte le ton d'alerte parce
   qu'une adoption attend : c'est le seul endroit de cet ecran ou le
   delai coute a quelqu'un. Chaque ligne tient l'animal, depuis quand
   on attend, et ce qui lui manque - la troisieme passe a la ligne
   plutot que de serrer les deux autres a 360 px. */
.cf-bloque{border-color:var(--rouge)}
.cf-u{display:flex;flex-wrap:wrap;align-items:baseline;gap:var(--sp-2)}
.cf-u-d{font-family:var(--ff-mono);font-size:var(--fs-xs);color:var(--rougeDk)}
.cf-u-m{flex:1 1 100%;font-size:var(--fs-xs);color:var(--ink3);
  overflow-wrap:anywhere}
.cf-apres{margin:var(--sp-3) 0}

/* LA TENDANCE, sous le taux. Elle ne porte PAS de couleur d'alarme :
   un recul de quelques points n'est pas une faute, c'est une mesure, et
   peindre en rouge le travail d'une structure sur un echantillon de
   cinq candidatures serait un jugement. Le vert du progres, lui, ne
   coute rien a personne. */
/* `.bx-sur` porte l'echantillon du taux (« 4 sur 5 candidatures ») et se
   lit comme la tendance : meme rang, meme discretion. Un second bloc de
   regles pour la meme apparence aurait diverge au premier reglage. */
.bx-tendance,.bx-sur{margin:0;font-size:var(--fs-xs);color:var(--ink2)}
.bx-tendance.plus{color:var(--greenDk)}
/* LA REGLE DU TAUX, repliee. `details summary` est deja style plus haut ;
   il ne manque que la taille du corps, qui ne doit pas peser plus que le
   chiffre qu'il explique. */
.bx-regle{margin:var(--sp-1) 0 0}
.bx-regle summary{font-size:var(--fs-xs)}
.bx-regle p{margin:var(--sp-1) 0 0;font-size:var(--fs-xs);color:var(--ink2);max-width:62ch}
.bx-taux{font-family:var(--ff-mono);font-size:var(--fs-xs);color:var(--warm)}
.bx-puces{margin:var(--sp-3) 0 var(--sp-4)}
.bx{display:grid;grid-template-columns:minmax(0,1fr);gap:var(--sp-4);align-items:start}
@media (min-width:960px){
  .bx{grid-template-columns:minmax(260px,320px) minmax(0,1fr)}
  .bx-liste{position:sticky;top:var(--sp-7)}
}
.bx-liste{list-style:none;margin:0;padding:0;background:var(--paper);border:var(--tr);
  border-radius:var(--r-md);overflow:hidden}
.bx-liste li+li{border-top:var(--tr)}
.bx-liste button{display:flex;flex-direction:column;gap:var(--sp-1);width:100%;
  text-align:left;background:none;border:0;padding:var(--sp-3) var(--sp-4);
  font:inherit;color:var(--ink);cursor:pointer;min-height:var(--cible)}
.bx-liste button:hover{background:var(--cream)}
.bx-liste button[aria-current="true"]{background:var(--cream2);
  box-shadow:inset 3px 0 0 var(--terra)}
.bx-l1{display:flex;justify-content:space-between;gap:var(--sp-2);flex-wrap:wrap}
.bx-l2{font-size:var(--fs-sm);color:var(--ink2)}
.bx-l3{font-size:var(--fs-xs);color:var(--warm)}
.bx-etat{font-family:var(--ff-mono);font-size:var(--fs-xs);border-radius:var(--r-pill);
  padding:0 var(--sp-2);background:var(--cream2);color:var(--ink2);white-space:nowrap}
.bx-etat.repondre{background:var(--rougeLt);color:var(--rougeDk)}
.bx-etat.preselection{background:var(--goldPale);color:var(--goldDk)}
.bx-etat.retenues{background:var(--greenLt);color:var(--greenDk)}
.bx-detail{background:var(--paper);border:var(--tr);border-radius:var(--r-md);
  padding:var(--sp-5);box-shadow:var(--sh-1);min-width:0}
.bx-dt{display:flex;justify-content:space-between;gap:var(--sp-3);flex-wrap:wrap}
.bx-dt h3{font-family:var(--ff-titre);font-size:var(--fs-xl);margin:0 0 var(--sp-1)}
.bx-dt .sous{margin:0}
.bx-nav{display:flex;align-items:center;gap:var(--sp-2);flex-wrap:wrap}
.bx-nav .n{font-family:var(--ff-mono);font-size:var(--fs-sm);color:var(--ink3)}
.bx-nav .note{width:100%;text-align:right;margin:0}
/* Un bouton desactive reste LISIBLE : « Precedente » a 2,12 de contraste
   (audit du 17/09/2026) disait seulement qu'il y avait quelque chose d'ecrit.
   Le trait tirete dit qu'il ne mene nulle part. */
.bx .btn.sec:disabled,.bx-animaux .btn.sec:disabled{opacity:1;color:var(--ink3);border-style:dashed;cursor:default}
.bx-frise{list-style:none;display:grid;grid-template-columns:repeat(4,minmax(0,1fr));
  gap:var(--sp-2);margin:var(--sp-4) 0 var(--sp-2);padding:0}
.bx-frise li{border-top:var(--tr-fort);padding-top:var(--sp-2);font-size:var(--fs-sm);
  color:var(--warm);display:flex;flex-direction:column;overflow-wrap:break-word}
.bx-frise li.fait{border-top-color:var(--terra);color:var(--ink)}
.bx-frise .j{font-family:var(--ff-mono);font-size:var(--fs-xs)}
.bx-frise-p{font-size:var(--fs-sm);color:var(--terraDk);margin:0 0 var(--sp-3)}
.bx-bloc{border-top:var(--tr);padding-top:var(--sp-4);margin-top:var(--sp-4)}
.bx-h4{display:block;font-family:var(--ff-mono);font-size:var(--fs-xs);
  letter-spacing:.08em;text-transform:uppercase;color:var(--ink3);margin:0 0 var(--sp-2)}
.bx-lect{display:flex;flex-wrap:wrap;gap:var(--sp-2);align-items:center}
.bx-pt{font-size:var(--fs-sm);border-radius:var(--r-pill);padding:var(--sp-1) var(--sp-3)}
.bx-pt.compatible,.bx-lect-d .compatible b{background:var(--greenLt);color:var(--greenDk)}
.bx-pt.a_verifier,.bx-lect-d .a_verifier b{background:var(--goldPale);color:var(--goldDk)}
.bx-pt.incompatible,.bx-lect-d .incompatible b{background:var(--rougeLt);color:var(--rougeDk)}
.bx-lect-d{list-style:none;margin:var(--sp-3) 0;padding:0;display:grid;gap:var(--sp-2)}
.bx-lect-d li{font-size:var(--fs-sm);line-height:1.5}
.bx-lect-d b{font-weight:600;border-radius:var(--r-pill);padding:0 var(--sp-2)}
.bx .lien,.bx-animaux .lien{background:none;border:0;color:var(--terraDk);cursor:pointer;font:inherit;
  text-decoration:underline;min-height:var(--cible);padding:0 var(--sp-2)}
.bx .note,.bx-animaux .note{font-size:var(--fs-sm);color:var(--warm);line-height:1.5}
.bx-decision .gestes{display:flex;flex-wrap:wrap;gap:var(--sp-2);align-items:center}
.bx-decision .gestes .btn{min-height:var(--cible)}
.bx-decision .gestes select{flex:1 1 220px;min-width:0;max-width:100%;
  font-family:inherit;font-size:var(--fs-base);min-height:var(--cible);
  padding:var(--sp-2) var(--sp-3);border:var(--tr);border-radius:var(--r-md);
  background:var(--paper);color:var(--ink)}
.bx .contact{background:var(--greenLt);color:var(--greenDk);border-radius:var(--r-md);
  padding:var(--sp-3) var(--sp-4);margin:0;line-height:1.5;overflow-wrap:anywhere}
.bx .contact a{color:inherit}
.bx-equipe{border-top:var(--tr);padding-top:var(--sp-4);margin-top:var(--sp-4)}
.bx-equipe textarea{width:100%;box-sizing:border-box;font:inherit;font-size:var(--fs-base);
  padding:var(--sp-3);border:var(--tr-champ);border-radius:var(--r-md);background:var(--paper);
  color:var(--ink);resize:vertical;margin-top:var(--sp-2)}
.bx-equipe .filtres{margin-bottom:var(--sp-2)}
.bx-aussi{border-top:var(--tr);padding-top:var(--sp-4);margin-top:var(--sp-4)}
.bx-aussi-l{display:flex;flex-wrap:wrap;gap:var(--sp-2);margin-bottom:var(--sp-2)}
.bx-mini{display:flex;flex-direction:column;align-items:flex-start;gap:var(--sp-1);
  background:var(--cream);border:var(--tr);border-radius:var(--r-md);
  padding:var(--sp-2) var(--sp-3);font:inherit;color:var(--ink);cursor:pointer;
  min-height:var(--cible);text-align:left}
.bx-mini span{font-size:var(--fs-xs);color:var(--warm)}
.bx-comp{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));
  gap:var(--sp-3);margin-top:var(--sp-3)}
.bx-comp-c{background:var(--cream);border-radius:var(--r-md);padding:var(--sp-3);min-width:0}
.bx-comp-c h5{font-family:var(--ff-titre);font-size:var(--fs-md);margin:0 0 var(--sp-2)}
.bx-comp-c .vue-f{grid-template-columns:1fr;font-size:var(--fs-sm)}
/* Une question d'un complement peut tenir deux lignes ; en `auto 1fr` elle
   prenait toute la largeur et la reponse tombait a un caractere par ligne
   (capture du 17/09/2026). La question au-dessus, la reponse dessous. */
.bx .vue-f.comp{grid-template-columns:minmax(0,1fr);gap:0}
.bx .vue-f.comp dd{font-weight:600;margin:0 0 var(--sp-2)}

/* Le point terracotta en fin de titre, comme sur le site et le dossier. Pas
   sur le certificat : c'est un document a imprimer et signer, pas un ecran. */
#accueil .carte h1::after,#accueil .carte h2::after,
#espace .carte h1::after,#espace .carte h2::after{content:".";color:var(--terra)}

/* ======================================================================
   LA COQUILLE DE L'ESPACE STRUCTURE
   ----------------------------------------------------------------------
   Un panneau lateral sombre qui tient les cinq sections, une barre qui dit
   ou l'on est, une colonne de travail. Elle ne s'applique que CONNECTE :
   avant, il n'y a rien a naviguer, et un panneau qui ne mene nulle part
   est un decor.

   Les tailles et les rayons de la maquette sont RABATTUS sur l'echelle.
   Elle en portait vingt et onze ; les echelles en ont dix et six. Un cran
   intermediaire ajoute pour arranger un ecran est l'origine ecrite des
   trente-trois tailles de police d'avant.

   Et aucune valeur brute : le panneau sombre passe par --surInk*,
   --inkSur*, --inkChoisi et --inkHalo, poses dans tokens.css.
   ====================================================================== */
body.pro-connecte{background:var(--cream)}
.page{padding:var(--sp-5) var(--sp-6) var(--sp-7);display:flex;
 flex-direction:column;gap:var(--sp-5);max-width:var(--page);width:100%}
/* Le Coup de Patte est un PLAN DE TRAVAIL, pas une lecture : un apercu de
   visuel et une file de contenus a cote. La maquette cadre a 1180 px, mais
   c'est la colonne d'une mise en page de 1410 - panneau compris. Recopiee
   telle quelle, elle ramenait l'atelier de 1396 a 1112 px utiles.
   `--page-large` existe depuis le 05/09 pour cette raison, et elle ne vaut
   que pour cette section : un tableau d'annonces se lit mieux borne. */
@media (min-width:1100px){
  .page:has(> section[data-sec="cdp"]:not([hidden])){max-width:var(--page-large);
   padding-left:var(--sp-4);padding-right:var(--sp-4)}
}

/* --- Le titre d'une section ------------------------------------------- */
.entete{display:flex;align-items:flex-start;justify-content:space-between;
 gap:var(--sp-5);flex-wrap:wrap}
.entete h1{font-size:var(--fs-3xl);line-height:1.08}
.entete .trait{display:block;margin:1px 0 2px}
/* Une longueur de ligne, pas une largeur de bloc : sans elle le sous-titre
   prenait toute la place et poussait les chiffres a la ligne suivante. */
.entete .sous{font-size:var(--fs-sm);color:var(--warm);line-height:1.5;
 display:block;max-width:var(--mesure)}
.entete .gestes{flex:none}

/* --- La carte des priorites ------------------------------------------- */
.priorites{background:var(--ink);border-radius:var(--r-lg);
 padding:var(--sp-4) var(--sp-5) var(--sp-5);display:flex;
 flex-direction:column;gap:var(--sp-3);position:relative;overflow:hidden}
.priorites .halo{position:absolute;right:-40px;top:-70px;width:240px;
 height:240px;border-radius:var(--r-circle);pointer-events:none;
 background:radial-gradient(circle,var(--inkHalo),transparent 70%)}
.priorites .titre{position:relative;font-family:var(--ff-titre);
 font-size:var(--fs-lg);font-weight:600;color:var(--surInk)}
.priorites .quand{position:relative;font-family:var(--ff-mono);
 font-size:var(--fs-xs);color:var(--terraLt);letter-spacing:.12em;
 text-transform:uppercase}
.priorites .haut{position:relative;display:flex;align-items:baseline;
 justify-content:space-between;gap:var(--sp-4);flex-wrap:wrap}
.prio{position:relative;display:flex;align-items:center;gap:var(--sp-4);
 background:var(--inkSur);border-radius:var(--r-md);padding:var(--sp-3) var(--sp-4);
 flex-wrap:wrap}
.prio .n{font-family:var(--ff-titre);font-size:var(--fs-3xl);line-height:1;
 color:var(--terraLt);min-width:34px;flex:none;font-variant-numeric:tabular-nums}
.prio .quoi{flex:1;min-width:200px;display:flex;flex-direction:column;gap:2px}
.prio .quoi b{font-size:var(--fs-base);color:var(--surInk);font-weight:600}
.prio .quoi span{font-size:var(--fs-sm);color:var(--surInk2);line-height:1.5}
.prio button{flex:none;background:var(--terra);color:var(--paper);border:0;
 border-radius:var(--r-pill);padding:9px 16px;font:inherit;
 font-size:var(--fs-sm);font-weight:600;cursor:pointer;min-height:var(--cible)}
.prio button:hover{background:var(--terraLt);color:var(--ink)}
/* Rien n'attend : ce n'est pas un avertissement, donc ce n'est pas dore. */
.prio.calme{background:var(--inkSurVert)}
.prio.calme span{color:var(--greenLt)}
.prio .etiq{flex:none;font-family:var(--ff-mono);font-size:var(--fs-xs);
 letter-spacing:.12em;text-transform:uppercase;color:var(--ink);
 background:var(--greenLt);border-radius:var(--r-xs);padding:4px 8px}

/* --- Le bandeau des filtres ------------------------------------------- */
.filtres{display:flex;align-items:center;gap:var(--sp-2);flex-wrap:wrap}
/* 44 px, pas 36 : ce sont des cibles tactiles, et la maquette les dessine
   a 34. L'audit l'a mesure des qu'il a pu voir cette section - il ne la
   voyait pas avant, elle etait `hidden` derriere la navigation. */
.filtres button{background:none;border:1px solid var(--cream3);
 border-radius:var(--r-pill);padding:7px 14px;font:inherit;
 font-size:var(--fs-sm);color:var(--ink3);cursor:pointer;
 min-height:var(--cible)}
.filtres button:hover{background:var(--cream2);color:var(--ink)}
.filtres button[aria-pressed="true"]{background:var(--ink);color:var(--paper);
 border-color:var(--ink)}
/* Le compteur d'un onglet. Sans cette regle il se COLLE au libelle
   (« À répondre3 ») : la marge du compteur du panneau est ancree a
   `.sections`, et une pastille posee ailleurs ne l'herite pas. Troisieme
   fois dans ce chantier qu'une regle ancree a un ancetre ne suit pas son
   element. */
.filtres button{display:inline-flex;align-items:center;gap:var(--sp-2)}
.filtres .n{font-family:var(--ff-mono);font-size:var(--fs-xs);
 background:var(--cream2);color:var(--ink2);border-radius:var(--r-pill);
 padding:2px 7px;min-width:20px;text-align:center}
.filtres button[aria-pressed="true"] .n{background:var(--terra);
 color:var(--paper)}

/* --- Le tableau des annonces ------------------------------------------
   Il DEFILE dans sa boite. C'est la lecon du 08/09 : elargir une colonne
   pour loger un bouton a fait deborder la page de 9 px a 360, et la vraie
   reponse n'etait pas la largeur du bouton. */
.tableau{background:var(--paper);border:var(--tr);border-radius:var(--r-md);
 overflow:hidden;box-shadow:var(--sh-1)}
.defile{overflow-x:auto}
.rangs{width:100%;border-collapse:collapse;font-size:var(--fs-base)}
.rangs th{text-align:left;font-family:var(--ff-mono);font-size:var(--fs-xs);
 letter-spacing:.12em;text-transform:uppercase;color:var(--warm);
 font-weight:500;padding:var(--sp-3) var(--sp-4);border-bottom:var(--tr);
 white-space:nowrap;background:var(--cream)}
.rangs td{padding:var(--sp-3) var(--sp-4);border-bottom:var(--tr-clair);
 color:var(--ink2);vertical-align:top}
.rangs tr:last-child td{border-bottom:0}
.rangs tbody tr{cursor:pointer}
.rangs tbody tr:hover{background:var(--cream)}
.rangs .nom{font-weight:600;color:var(--ink);font-size:var(--fs-md)}
.rangs .sous{display:block;font-size:var(--fs-sm);color:var(--warm);
 margin-top:2px}
.rangs .chev{color:var(--warm);text-align:right}
/* Le vide d'un tableau se dit DANS le tableau, pas au-dessus : sinon on
   cherche des lignes qui n'existent pas avant de lire la phrase. */
.vide{padding:var(--sp-6) var(--sp-4);display:flex;flex-direction:column;
 align-items:center;gap:var(--sp-2);text-align:center;color:var(--ink3);
 font-size:var(--fs-base)}

/* --- La note de bas de bloc -------------------------------------------
   Chaque section de la maquette se termine par une phrase qui dit ce que le
   produit NE fait pas. Elle n'est pas decorative : c'est elle qui empeche
   de prendre un ecran pour une promesse. */
.note{font-size:var(--fs-sm);color:var(--warm);line-height:1.6;
 max-width:var(--mesure)}

@media (max-width:900px){
  .page{padding:var(--sp-4) var(--sp-4) var(--sp-6)}
}
@media (max-width:560px){
  .entete h1{font-size:var(--fs-2xl)}
}

/* --- La fiche d'un animal ---------------------------------------------
   Elle vit dans la MEME section que la liste, l'une cachee quand l'autre
   est la. Une seconde surface est ce que la recomposition du 09/09 a
   retire du studio, et pour la meme raison : deux surfaces divergent. */
.retour{background:none;border:0;padding:var(--sp-2) 0;cursor:pointer;
 font:inherit;font-size:var(--fs-base);color:var(--terra);font-weight:600;
 min-height:var(--cible);text-align:left}
.retour:hover{color:var(--terraDk);text-decoration:underline}
.fiche-tete{display:flex;align-items:center;gap:var(--sp-3);flex-wrap:wrap;
 margin-bottom:var(--sp-2)}
.fiche-tete h2{font-size:var(--fs-2xl);line-height:1.1}
.fiche-tete .sous{display:block;font-size:var(--fs-sm);color:var(--warm);
 margin-top:2px}
#ficheAnimal .carte h3{font-size:var(--fs-lg);margin-bottom:var(--sp-3)}
#ficheAnimal .carte .note{margin-top:var(--sp-3)}

/* Une cellule qui ne dit rien le dit sans peser autant qu'une pastille -
   mais elle se LIT. Premier essai avec --cream3 : 1,19 de contraste pour
   4,5 exiges, mesure par l'audit. Un tiret invisible est pire que pas de
   tiret : le lecteur d'ecran l'annonce, et personne ne le voit. --warm est
   le registre du texte discret du produit, et il passe (5,48). */
.rangs .rien{color:var(--warm)}
/* La ligne se prend au clavier - elle remplace six boutons qui s'y
   prenaient tous. Sans anneau visible, la remplacer serait une
   regression franche, pas un detail de style. */
.rangs tbody tr:focus-visible{outline:var(--focus);outline-offset:-2px}

/* --- Le portail : l'ecran avant d'entrer -------------------------------
   La maquette ne le dessine pas - elle demarre connectee. C'est pourtant la
   premiere chose que voit une structure, et une rupture visuelle a cet
   instant precis coute la confiance qu'on vient de gagner.

   Il reprend donc la meme langue : un bandeau encre qui porte la marque et
   la promesse, deux cartes cote a cote sur la creme. Pas de panneau
   lateral : il n'y a rien a naviguer avant d'avoir un compte, et un menu
   qui ne mene nulle part est un decor. */
#portail{max-width:var(--page);padding-bottom:var(--sp-7)}
.enseigne{background:var(--ink);border-radius:var(--r-lg);
 padding:var(--sp-5) var(--sp-6) var(--sp-6);margin-bottom:var(--sp-5);
 position:relative;overflow:hidden;display:flex;flex-direction:column;
 gap:var(--sp-3)}
.enseigne .halo{position:absolute;right:-60px;top:-90px;width:300px;
 height:300px;border-radius:var(--r-circle);pointer-events:none;
 background:radial-gradient(circle,var(--inkHalo),transparent 70%)}
.enseigne .marque{position:relative;font-size:var(--fs-xl);color:var(--surInk)}
/* L'enseigne est sur l'encre elle aussi : meme variante. */
.enseigne .marque svg{--claw:var(--clawSur); --pad:var(--padSur)}
.enseigne .brand{color:var(--surInk)}
.enseigne .brand small{color:var(--surInk3)}
.enseigne .marque:hover .brand,
.enseigne .marque:focus-visible .brand{color:var(--terraLt)}
.enseigne h1{position:relative;font-size:var(--fs-3xl);line-height:1.08;
 color:var(--surInk);max-width:var(--mesure)}
.enseigne p{position:relative;margin:0;font-size:var(--fs-base);
 line-height:1.65;color:var(--surInk2);max-width:var(--mesure)}
.enseigne .fin{color:var(--surInk3);font-size:var(--fs-sm)}

/* Les deux cartes ne se valent pas : on vient BEAUCOUP plus souvent se
   reconnecter que s'inscrire. La connexion prend la place principale, et
   l'inscription reste entiere a cote - la reduire a un lien obligerait a
   un aller-retour pour la premiere visite, qui est justement celle ou
   l'on hesite le plus. */
.portes{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.15fr);
 gap:var(--sp-4);align-items:start}
@media (max-width:860px){.portes{grid-template-columns:1fr}}
.portes .carte{margin:0}
.portes h2{font-size:var(--fs-xl);margin-bottom:var(--sp-2)}
.portes .amorce{font-size:var(--fs-sm);color:var(--warm);line-height:1.6;
 margin:0 0 var(--sp-3)}

/* --- La section Familles ----------------------------------------------
   Les cartes etaient posees a nu sur la creme : cela allait quand la
   section entiere vivait dans une `.carte`. Sortie dans sa propre section,
   la meme carte flotte. */
/* Un titre de bloc dans une section : plus petit qu'un titre de section,
   plus present qu'un paragraphe. */
.titre-bloc{font-family:var(--ff-titre);font-size:var(--fs-lg);color:var(--ink);
 margin:0 0 var(--sp-2)}
/* Une ligne de questions ne s'ouvre pas : seuls ses trois boutons agissent.
   Le curseur de main du tableau des annonces mentirait. */
#questions .rangs tbody tr{cursor:default}
#questions .rangs tbody tr:hover{background:none}
#questions .rangs .gestes{white-space:nowrap}

/* --- Les faits d'une annonce -------------------------------------------
   Ce qui MANQUE se voit en premier, et se voit AUTREMENT : c'est la seule
   chose de ce bloc sur laquelle on peut agir. Un manque au meme gris que
   le reste se lit comme une donnee parmi d'autres. */
.carte-tete{display:flex;align-items:baseline;justify-content:space-between;
 gap:var(--sp-3);flex-wrap:wrap;margin-bottom:var(--sp-3)}
.faits{display:grid;grid-template-columns:auto 1fr;gap:var(--sp-2) var(--sp-4);
 margin:0;font-size:var(--fs-base)}
.faits dt{color:var(--ink3)}
.faits dd{margin:0;color:var(--ink);display:flex;align-items:center;gap:var(--sp-2);
 flex-wrap:wrap;overflow-wrap:anywhere}
.faits .rien{color:var(--warm);font-style:italic}
/* « Ce que vous pouvez corriger » : les animaux concernes, en ligne. Ceux
   qui se corrigent ici sont des boutons ; les autres viennent d'une source
   et ne sont que du texte - un bouton qui ne mene nulle part vaut moins que
   pas de bouton. La cible tactile tient les 44 px exiges par l'audit. */
.sd-liste{list-style:none;display:flex;flex-wrap:wrap;gap:var(--sp-2);
 margin:var(--sp-3) 0 0;padding:0}
.sd-liste li{display:flex}
.sd-liste .lien,.sd-liste .sd-ailleurs{display:inline-flex;align-items:center;
 min-height:var(--cible);padding:var(--sp-1) var(--sp-3);border-radius:var(--r-pill);
 font-size:var(--fs-sm)}
.sd-liste .lien{background:var(--cream);color:var(--ink);border:var(--tr);
 cursor:pointer}
.sd-liste .lien:hover{background:var(--cream2)}
.sd-liste .sd-ailleurs{color:var(--ink3);background:transparent;
 border:1px dashed var(--cream3)}
/* La mention legale n'est pas un avertissement de plus : elle DIT ce qui
   empeche la diffusion, et elle porte l'article pour qu'on puisse verifier. */
.faits .loi{font-size:var(--fs-sm);color:var(--goldDk);background:var(--goldLt);
 border-radius:var(--r-xs);padding:2px 8px}
.faits .etiq-ok{font-family:var(--ff-mono);font-size:var(--fs-xs);
 letter-spacing:.1em;text-transform:uppercase;color:var(--greenDk);
 background:var(--greenLt);border-radius:var(--r-xs);padding:2px 7px}

/* --- Où en est son annonce ---------------------------------------------
   Le plus recent en haut, comme partout ailleurs dans ce produit. */
.chrono{list-style:none;margin:0;padding:0;display:flex;flex-direction:column}
.chrono li{display:flex;align-items:baseline;justify-content:space-between;
 gap:var(--sp-4);padding:var(--sp-2) 0;border-bottom:var(--tr-clair);
 font-size:var(--fs-base)}
.chrono li:last-child{border-bottom:0}
.chrono .quoi{color:var(--ink2)}
.chrono .quand{flex:none;font-family:var(--ff-mono);font-size:var(--fs-sm);
 color:var(--warm);font-variant-numeric:tabular-nums}

/* --- Ses photos et leurs droits ----------------------------------------
   Une grille qui se remplit toute seule : autant de vignettes que la
   largeur en tient, jamais un nombre de colonnes ecrit en dur - une
   annonce peut porter une photo comme huit. */
.vignettes{display:grid;grid-template-columns:repeat(auto-fit,minmax(132px,1fr));
 gap:var(--sp-3);margin:var(--sp-3) 0}
.vignettes figure{margin:0;display:flex;flex-direction:column;gap:var(--sp-2)}
/* `contain` et non `cover` : une photo recadree par la grille montrerait
   autre chose que ce que la structure a confirme. */
.vignettes img{width:100%;aspect-ratio:4/3;object-fit:contain;
 background:var(--cream2);border-radius:var(--r-sm);display:block}
.vignettes figcaption{display:flex;flex-direction:column;align-items:center;
 gap:var(--sp-1);text-align:center}
.vignettes .src{font-size:var(--fs-xs);color:var(--warm)}

/* --- Les encarts de la fiche ------------------------------------------
   Ils remplacent `window.confirm`, dont les boutons parlaient la langue du
   NAVIGATEUR et non celle de la page. Ils vivent DANS la fiche, sans voile :
   ce sont des questions posees dans le contexte qui les motive, et on doit
   pouvoir relire la fiche en y repondant. */
.encart{border-radius:var(--r-md);padding:var(--sp-3) var(--sp-4);
 margin:var(--sp-3) 0;display:flex;flex-direction:column;gap:var(--sp-2)}
.encart b{font-size:var(--fs-base)}
.encart p{margin:0;font-size:var(--fs-sm);line-height:1.6;color:var(--ink3);
 max-width:var(--mesure)}
/* Le dore pour une question, le rouge pour ce qui ne se defait pas : la
   couleur dit le poids du geste avant qu'on lise le texte. */
.encart.attente{background:var(--goldLt);border:1px solid var(--goldPale)}
.encart.attente b{color:var(--goldDk)}
.encart.danger{background:var(--rougeLt);border:1px solid var(--rougeBord)}
.encart.danger b{color:var(--rougeDk)}
.encart .gestes{margin-top:var(--sp-1)}
.encart .lien{background:none;border:0;color:var(--ink3);cursor:pointer;
 font:inherit;font-size:var(--fs-sm);text-decoration:underline;
 min-height:var(--cible);padding:0 var(--sp-2)}
.encart .lien:hover{color:var(--ink)}

/* --- Santé de mes données ----------------------------------------------
   Une carte par source, avec son etat. La pastille ne se lit pas seule :
   la phrase en dessous dit ce que l'etat veut dire POUR LA STRUCTURE. */
.source h4{font-family:var(--ff-titre);font-size:var(--fs-lg);color:var(--ink);
 margin:0}
.source .faits{margin:var(--sp-2) 0}
#sante .chiffres{margin-bottom:var(--sp-4)}

/* --- Conformité ---------------------------------------------------------
   Les noms des animaux concernes par un manque passent par `.sd-liste`,
   comme ceux de « Sante de mes donnees » : meme geste, meme forme, une
   seule ecriture. `.noms` a servi jusqu'au 17/09/2026, quand les noms sont
   devenus cliquables. */
#conformite .chiffres{margin-bottom:var(--sp-4)}

/* Ce qui ressort des retours : une RÉPARTITION, jamais une note. Chaque
   réponse a sa barre, et le nombre est écrit à côté — une barre seule se lit
   comme un pourcentage, et cinq réponses n'en font pas un. */
.ret-crit { margin: 0 0 var(--sp-4); }
/* La reponse publique d'une structure, et son examen (18/09/2026). Trois
   etats se lisent d'un coup d'oeil : approuvee, en relecture, refusee. */
/* « A TRAITER » : la seule chose de cet ecran qui demande un geste. Elle
   prend le filet du refus (`--terraDk`, deja celui de `.ret-rep.non`) pour
   que l'oeil relie le bandeau au bloc ou il mene. Une couleur de plus
   aurait fait deux vocabulaires pour un meme etat. */
.ret-traiter { margin: 0 0 var(--sp-3); padding: var(--sp-2) var(--sp-3);
  border-left: 3px solid var(--terraDk); background: var(--cream2);
  font-size: var(--fs-sm); }
/* Son bouton est le SEUL geste de ce bandeau, et l'audit l'a mesure a
   21 px au doigt - dans les quatre langues, des la premiere passe. Un
   `.lien` est un lien de texte ; ici il ouvre le volet ou l'on repare.
   Meme remede que « Se deconnecter » et que les gestes d'une annonce :
   une boite en ligne, pas un bloc, pour qu'il reste dans sa phrase. */
@media (pointer:coarse){
  .ret-traiter .lien{display:inline-flex;align-items:center;
    min-height:var(--cible)}
}
.ret-bloc { margin-top: var(--sp-3); border-top: var(--tr); padding-top: var(--sp-3); }
.ret-rep { border-left: 3px solid var(--cream3); padding-left: var(--sp-3);
  margin: 0 0 var(--sp-3); }
.ret-rep.ok { border-left-color: var(--greenDk); }
.ret-rep.attente { border-left-color: var(--goldDk); }
.ret-rep.non { border-left-color: var(--terraDk); }
.ret-rep blockquote { margin: var(--sp-1) 0 0; color: var(--ink2);
  font-size: var(--fs-sm); line-height: 1.6; }
.ret-ecrire > summary { display: inline-flex; align-items: center;
  min-height: var(--cible); color: var(--ink2); font-size: var(--fs-sm);
  cursor: pointer; }
.ret-ecrire[open] > summary { font-weight: 600; color: var(--ink); }
.ret-lab { display: block; margin: var(--sp-2) 0; }
.ret-lab > span { display: block; color: var(--ink2); font-size: var(--fs-sm);
  margin-bottom: var(--sp-1); }
.ret-lab textarea { width: 100%; box-sizing: border-box; font: inherit;
  font-size: var(--fs-sm); padding: var(--sp-2); border: var(--tr-champ);
  border-radius: var(--r-sm); background: var(--paper); color: var(--ink); }
/* 44 px, comme toute cible tactile. Les quatre motifs de signalement sont
   des `.lien` : nus, ils faisaient 21 px de haut - le meme defaut que les
   gestes d'un membre dans Equipe, trouve le meme jour par le meme audit, et
   pour la meme raison : l'ecran n'etait pas mesure avec de quoi le
   dessiner. Aucun rembourrage horizontal : elargir une colonne a deja fait
   deborder la page a 360 px. */
.ret-bloc .gestes-rep .lien { display: inline-flex; align-items: center;
  min-height: var(--cible); }
/* La moyenne se lit SUR LA MEME LIGNE que la question, et la repartition
   juste dessous : elles ne se lisent jamais l'une sans l'autre (decision de
   Claire du 18/09/2026). */
.ret-crit-t { display: flex; flex-wrap: wrap; align-items: baseline;
  justify-content: space-between; gap: var(--sp-2); }
.ret-moy { flex: none; color: var(--ink2); font-family: var(--ff-mono);
  font-size: var(--fs-sm); }
.ret-crit h3 { margin: 0 0 var(--sp-1); color: var(--ink);
               font-size: var(--fs-sm); }
.ret-barres { display: grid; gap: var(--sp-1); margin-top: var(--sp-2); }
.ret-barre { display: grid; align-items: center; gap: var(--sp-2);
             grid-template-columns: 1.5rem minmax(0, 1fr) 2rem; }
.ret-barre b { color: var(--ink2); font-size: var(--fs-sm);
               font-variant-numeric: tabular-nums; }
.ret-barre i { display: block; height: var(--sp-2); min-width: 2px;
               border-radius: var(--r-pill); background: var(--terraLt); }
.ret-barre em { color: var(--ink2); font-size: var(--fs-sm);
                font-style: normal; text-align: end;
                font-variant-numeric: tabular-nums; }
/* Un retour cité : ce sont les mots d'une famille, pas notre texte. */
.ret-avis { margin: 0 0 var(--sp-3); padding: var(--sp-4);
            border: var(--tr); border-radius: var(--r-md); background: var(--paper); }
.ret-avis blockquote { margin: var(--sp-3) 0 var(--sp-2); color: var(--ink); }
.ret-tete { display: flex; align-items: center; gap: var(--sp-3); }
.ret-av { flex: none; width: 32px; height: 32px; border-radius: var(--r-circle);
  background: var(--cream2); color: var(--ink2); font-family: var(--ff-titre);
  font-weight: 600; display: grid; place-items: center; }
.ret-qui { display: flex; flex-direction: column; line-height: 1.3; min-width: 0; }
.ret-qui small { color: var(--warm); font-size: var(--fs-sm); }
.ret-sig-p { margin-left: auto; font-size: var(--fs-xs); font-weight: 600;
  color: var(--rougeDk); background: var(--rougeLt); border-radius: var(--r-pill);
  padding: 2px var(--sp-2); }
.ret-pub { margin: 0; color: var(--warm); font-size: var(--fs-xs); }
.ret-entete { display: flex; flex-wrap: wrap; align-items: center;
  justify-content: space-between; gap: var(--sp-2) var(--sp-3); }
.ret-filtres { display: flex; gap: var(--sp-2); }
.ret-f { min-height: var(--cible); padding: 0 var(--sp-3); border-radius: var(--r-pill);
  border: var(--tr); background: var(--paper); color: var(--ink2); font: inherit;
  font-size: var(--fs-sm); cursor: pointer; }
.ret-f span { color: var(--warm); font-variant-numeric: tabular-nums; }
.ret-f[aria-pressed="true"] { background: var(--ink); border-color: var(--ink); color: var(--paper); }
.ret-f[aria-pressed="true"] span { color: var(--cream2); }
/* Repondre a gauche, signaler a droite ; un volet ouvert prend la ligne. */
.ret-gestes { display: flex; flex-wrap: wrap; align-items: flex-start;
  justify-content: space-between; gap: var(--sp-2) var(--sp-3); }
.ret-gestes > details[open] { flex-basis: 100%; }
/* Repondre / Modifier la reponse : un bouton souligne d'un trait, comme la
   maquette ; signaler reste un lien discret. */
.ret-gestes .ret-ecrire > summary { border: var(--tr); border-radius: var(--r-pill);
  padding: 0 var(--sp-4); font-size: var(--fs-sm); font-weight: 600;
  color: var(--ink); background: var(--paper); }
.ret-gestes .ret-ecrire > summary:hover { border-color: var(--ink); }
/* La reponse de la structure : une boite sous le commentaire, son etat en
   pastille. */
.ret-avis .ret-rep { border: 0; border-radius: var(--r-sm); background: var(--cream);
  padding: var(--sp-3) var(--sp-4); margin: 0 0 var(--sp-3); }
.ret-avis .ret-rep.non { background: var(--rougeLt); }
.ret-rep-t { margin: 0 0 var(--sp-1); font-size: var(--fs-sm); color: var(--ink); }
.ret-pill { display: inline-block; margin-left: var(--sp-1); font-size: var(--fs-xs);
  font-weight: 600; border-radius: var(--r-pill); padding: 1px var(--sp-2); }
.ret-rep.ok .ret-pill { background: var(--greenLt); color: var(--greenDk); }
.ret-rep.attente .ret-pill { background: var(--goldLt); color: var(--goldDk); }
.ret-rep.non .ret-pill { background: var(--paper); color: var(--rougeDk); }
.ret-avis .ret-bloc { border-top: 0; padding-top: 0; }
.ret-sig > summary { cursor: pointer; color: var(--warm); font-size: var(--fs-sm);
  text-decoration: underline; min-height: var(--cible); display: inline-flex;
  align-items: center; list-style: none; }
.ret-sig > summary::-webkit-details-marker { display: none; }
.rx-interdits > summary { cursor: pointer; list-style: none; }
.rx-interdits > summary::-webkit-details-marker { display: none; }
.rx-interdits > summary h2 { display: inline; }

/* ==========================================================================
   L'equipe : qui a acces a cet espace, et ce que chacune peut faire
   --------------------------------------------------------------------------
   Cet ecran n'existe QUE dans l'espace des structures - une famille n'a pas
   d'equipe. Ses regles vivent donc ici, et non dans une feuille partagee :
   une feuille partagee porte ce dont son ecran depend, pas ce dont un seul
   des deux se sert.
   ========================================================================== */
.eq-m{padding:var(--sp-3) 0 var(--sp-3) var(--sp-3);
  border-top:1px solid var(--cream3);border-left:3px solid var(--green)}
.eq-m:first-of-type{border-top:0}
/* Un acces retire reste VISIBLE et nomme : sans lui, « qui a retenu cette
   famille ? » n'a plus de reponse. Il est seulement mis en retrait. */
.eq-m.parti{border-left-color:var(--cream3);opacity:.62}
.eq-m-t{display:flex;flex-wrap:wrap;align-items:baseline;gap:var(--sp-2)}
.eq-m-t b{font-family:var(--ff-titre);font-size:var(--fs-md);color:var(--ink)}
.eq-moi{font-family:var(--ff-mono);font-size:var(--fs-xs);color:var(--terra);
  letter-spacing:.06em;text-transform:uppercase}
.eq-statut{font-family:var(--ff-mono);font-size:var(--fs-xs);color:var(--ink3);
  letter-spacing:.06em;text-transform:uppercase}
.eq-gestes{display:flex;flex-wrap:wrap;gap:var(--sp-3);align-items:flex-end;
  margin-top:var(--sp-2)}
.eq-role{display:flex;flex-direction:column;gap:var(--sp-1);flex:1 1 16rem;
  min-width:0;font-size:var(--fs-sm);color:var(--ink2)}
.eq-form{display:flex;flex-wrap:wrap;gap:var(--sp-3);margin:var(--sp-3) 0}
.eq-form label{display:flex;flex-direction:column;gap:var(--sp-1);
  flex:1 1 14rem;min-width:0;font-size:var(--fs-sm);color:var(--ink2)}
.eq-form input,.eq-form select,.eq-role select{max-width:100%;
  min-height:var(--cible)}
.eq-msg{margin-bottom:var(--sp-3)}
.eq-msg:empty{display:none}
/* L'adresse et les droits d'un membre sont du TEXTE : `.lab` est en petites
   capitales et en chasse fixe - lisible sur trois mots, illisible sur une
   phrase de quinze (vu a la capture du 16/09/2026). */
.eq-mail{margin:var(--sp-1) 0 0;font-family:var(--ff-mono);
  font-size:var(--fs-xs);color:var(--ink3)}
.eq-droits{margin:var(--sp-1) 0 0;font-size:var(--fs-sm);line-height:1.55;
  color:var(--ink3)}

/* ==========================================================================
   La passe visuelle du 16/09/2026 : filtrer, chercher, et le geste en haut
   --------------------------------------------------------------------------
   Releve en mettant la maquette v2 et notre ecran cote a cote, a la meme
   largeur et avec de quoi remplir les deux. Rien de nouveau derriere : tout
   se calcule sur les annonces deja chargees.
   ========================================================================== */

/* Les pastilles de filtre. Le compte est DANS la pastille, comme dans la
   navigation laterale : « En pause » sans son chiffre n'aide pas a choisir. */
#filtres .note{margin:0 0 var(--sp-3)}

/* Le champ de recherche, dans la barre du haut. Il ne quitte jamais la page. */
/* Le champ vit dans le groupe central : il ne se pousse plus a droite
   lui-meme (c'est la colonne qui le fait) et il cede la place au
   controle pays quand la barre se resserre. */
/* Un champ de recherche a 26 px utiles n'est plus un champ (audit du
   14/10/2026, 1024 px) : il garde la place de son indication. */
.barre .cherche{flex:1 1 140px;min-width:8rem;max-width:320px}
.barre .cherche[hidden]{display:none}
.barre .cherche .hors{position:absolute;width:1px;height:1px;overflow:hidden;
  clip-path:inset(50%);white-space:nowrap}
.barre .cherche input{width:100%;box-sizing:border-box;font:inherit;
  font-size:var(--fs-sm);min-height:var(--cible);
  padding:var(--sp-2) var(--sp-3);border:1px solid var(--cream3);
  border-radius:var(--r-pill);background:var(--paper);color:var(--ink)}
.barre .cherche input{min-width:0}

/* Le geste principal prend la place des trois grands chiffres. */
.entete .chiffres{display:flex;align-items:flex-start;gap:var(--sp-3)}

/* Trois priorites au plus, et la phrase qui dit pourquoi. */
.prio-note{margin:var(--sp-3) 0 0;font-size:var(--fs-sm);
  color:var(--surInk2)}

/* « Tout retirer » finit la page, replie : c'est un geste de compte, pas un
   geste de travail. Il vivait en rouge au milieu de l'ecran. */
.fin-compte{margin-top:var(--sp-5)}
.fin-compte summary{cursor:pointer;font-weight:600;color:var(--ink3)}

/* --- Equipe : qui a acces, ce que chacun peut faire, le journal ---------
   Maquette du 17/09/2026. Une ligne par personne - et depuis le 18/09/2026,
   ses droits sur sa propre ligne : ils se reglaient par role dans une
   matrice a part, et deux personnes du meme role ne pouvaient pas differer. */
.eq-tete{display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between;gap:var(--sp-3)}
.eq-lab{font-family:var(--ff-mono);font-size:var(--fs-xs);letter-spacing:.1em;
  text-transform:uppercase;color:var(--ink3)}
.eq-m{display:flex;gap:var(--sp-3);align-items:flex-start;padding:var(--sp-3) 0;
  border-top:var(--tr)}
.eq-sigle.eq-photo{background-size:cover;background-position:center}
.eq-sigle{flex:none;display:flex;align-items:center;justify-content:center;
  width:var(--sp-6);height:var(--sp-6);border-radius:var(--r-circle);
  background:var(--cream2);color:var(--ink2);font-size:var(--fs-xs);font-weight:600}
.eq-m-c{flex:1;min-width:0}
/* Une adresse sans nom tient lieu de titre : sans point de coupure, elle
   poussait la page a 380 px pour 360 (audit du 02/10/2026, apres la
   nouvelle echelle de texte). */
.eq-m-t b,.eq-mail{overflow-wrap:anywhere}
.eq-m-t{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-2)}
.eq-chip{font-size:var(--fs-xs);font-weight:600;background:var(--ink);color:var(--paper);
  border-radius:var(--r-pill);padding:var(--sp-1) var(--sp-3)}
.eq-chip.attente{background:var(--goldLt);color:var(--goldDk)}
.eq-gestes{display:flex;flex-wrap:wrap;gap:var(--sp-2);align-items:center;justify-content:flex-end}
/* 44 px, comme toute cible tactile. « Passer contributeur » et « Renvoyer
   l'invitation » faisaient 21 px de haut depuis le 17/09/2026, et l'audit ne
   pouvait pas les voir : la structure auditee n'avait que son
   administratrice, donc aucune ligne ne portait ces gestes. Un audit ne
   mesure que ce que la base lui donne a dessiner. Aucun rembourrage
   horizontal : elargir une colonne a deja fait deborder la page a 360 px. */
.eq-gestes .lien{display:inline-flex;align-items:center;min-height:var(--cible)}
.eq-inviter{border-top:var(--tr);margin-top:var(--sp-3);padding-top:var(--sp-3)}
.eq-roles{display:flex;flex-wrap:wrap;gap:var(--sp-2);align-items:center;margin-top:var(--sp-2)}
.eq-r{min-height:var(--cible);padding:0 var(--sp-4);border:var(--tr-fort);border-radius:var(--r-pill);
  background:var(--paper);color:var(--ink2);font:inherit;font-size:var(--fs-sm);cursor:pointer}
.eq-r.on{background:var(--ink);border-color:var(--ink);color:var(--paper);font-weight:600}
/* Le volet « regler ses droits » d'une personne. Il vit DANS sa colonne :
   les droits d'une personne se lisent la ou on lit son nom. */
.eq-reg{margin-top:var(--sp-2)}
.eq-reg>summary{display:inline-flex;align-items:center;min-height:var(--cible);
  color:var(--ink2);font-size:var(--fs-sm);cursor:pointer}
.eq-reg>summary:hover{color:var(--ink)}
.eq-reg[open]>summary{font-weight:600;color:var(--ink)}
.eq-fige{margin:var(--sp-2) 0 0;color:var(--ink3);font-size:var(--fs-sm);line-height:1.5}
.eq-ligne{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-3);
  padding:var(--sp-3) 0;border-top:var(--tr)}
.eq-ligne-t{flex:1 1 20rem;min-width:0}
.eq-ligne-t b{display:block;color:var(--ink);font-size:var(--fs-base)}
.eq-ligne-t p{margin:var(--sp-1) 0 0;color:var(--ink3);font-size:var(--fs-sm);line-height:1.5}
.eq-engage{margin-left:var(--sp-2);font-family:var(--ff-mono);font-size:var(--fs-xs);
  letter-spacing:.08em;text-transform:uppercase;color:var(--terraDk);background:var(--rougeLt);
  border-radius:var(--r-xs);padding:var(--sp-1) var(--sp-2)}
.eq-ou{display:flex;gap:var(--sp-1);flex:none}
.eq-v{min-height:var(--cible);padding:0 var(--sp-4);border:var(--tr-fort);border-radius:var(--r-pill);
  background:var(--paper);color:var(--ink2);font:inherit;font-size:var(--fs-sm);cursor:pointer}
.eq-v.on{background:var(--ink);border-color:var(--ink);color:var(--paper);font-weight:600}
.eq-fixe{flex:none;color:var(--ink3);font-size:var(--fs-sm)}
.eq-change{flex:1 1 100%;color:var(--warm);font-size:var(--fs-xs);font-family:var(--ff-mono)}
.eq-journal{list-style:none;margin:0;padding:0}
.eq-journal li{display:flex;flex-wrap:wrap;gap:var(--sp-2) var(--sp-3);padding:var(--sp-2) 0;
  border-top:var(--tr);font-size:var(--fs-sm);color:var(--ink2)}
.eq-quand{font-family:var(--ff-mono);font-size:var(--fs-xs);color:var(--ink3)}
.eq-par{color:var(--ink3)}
@media (max-width:720px){
  .eq-m{flex-wrap:wrap}
  .eq-gestes{justify-content:flex-start;flex:1 1 100%}
}

/* Le portail : deux mesures qui vivaient en `style=` dans `front_pro.py`.
   Le pas de 10 px du couple SIREN/RNA n'etait pas un cran de l'echelle ; il
   rejoint `--sp-2`, verifie a l'audit sur les quatre largeurs. */
.deux-portes{margin-top:var(--sp-3)}
.duo.serre{gap:var(--sp-2)}

/* La barre « pays · langue » dans la barre des structures. Les regles
   partagees vivent dans `coquille.css` ; ici ne restent que les deux
   choses qui ne valent QUE pour cet ecran : la barre porte deja un fil
   d'Ariane et un champ de recherche sur la meme ligne, donc le nom du
   pays y ferait un troisieme bloc de texte - le drapeau et les deux
   lettres de la langue suffisent -, et le controle ne se pousse pas a
   droite puisqu'il vit dans le groupe central. */
.barre .cherche input,.barre .pz-bp-bouton{min-height:var(--cible);
  height:var(--cible);padding-top:0;padding-bottom:0}
.barre .pz-barre-pays{margin-left:0;flex:none}
/* Masque a l'oeil seulement, jamais `display:none` (controle QA du
   13/10/2026) : sans lui le bouton s'annoncait par la seule langue, « . FR »,
   au lieu du pays ou la structure se dit etablie. La regle vise la barre
   que pose `front_pays.barre_html` ([data-pz-barre-pays]) : l'administration
   sert aussi cette feuille, et la sienne montre le nom du pays. */
.barre [data-pz-barre-pays] .pz-bp-nom{position:absolute;width:1px;height:1px;overflow:hidden;
  clip:rect(0 0 0 0);white-space:nowrap}

/* ==========================================================================
   La mise en route d'une structure (maquette du 21/09/2026)
   --------------------------------------------------------------------------
   Cinq ecrans, un bandeau qui les propose, une barre d'avancement. Tout vit
   dans `pro.css` : c'est un ecran de l'espace des structures et de personne
   d'autre — le poser dans `coquille.css` l'aurait servi a `/famille`, qui
   n'a pas de mise en route.

   Aucune valeur brute : le bloc en est sorti tel quel de la maquette, et
   c'est le seul de sa taille qui n'en portait pas une.
   ========================================================================== */
.onb-bandeau .txt{display:flex;flex-direction:column;gap:3px;flex:1;min-width:240px}
.onb-bandeau b{font-size:var(--fs-base);color:var(--ink)}
.onb-bandeau span{font-size:var(--fs-sm);color:var(--ink2);line-height:1.5;text-wrap:wrap}
.onb-bandeau .btn{background:var(--terra)}
.onb-bandeau .btn:hover{background:var(--terraDk)}
/* « Plus tard » et « Quitter la mise en route » sont des liens, et un
   lien qu'on TOUCHE est un bouton : l'audit les a mesures a 31 et 21 px
   pour 44 attendus, aux quatre largeurs et dans les quatre langues. La
   maquette les ecrivait avec un rembourrage de 6 px et, pour le second,
   un style en ligne - dont ni elle ni nous n'aurions vu la hauteur. */
.onb-bandeau .lien,.onb .onb-quitter{background:none;border:0;font:inherit;
 font-size:var(--fs-sm);color:var(--ink3);text-decoration:underline;
 cursor:pointer;padding:0 var(--sp-2);min-height:var(--cible);
 display:inline-flex;align-items:center}
.onb .retour{align-self:flex-start}
.onb .rang{font-family:var(--ff-mono);font-size:var(--fs-xs);color:var(--warm);
 letter-spacing:.12em;text-transform:uppercase}
.onb h2{font-family:var(--ff-titre);font-size:var(--fs-2xl);line-height:1.1;margin:2px 0 0}
.onb .sous{font-size:var(--fs-sm);color:var(--warm);line-height:1.6;
 max-width:var(--mesure);text-wrap:wrap}
.onb .progression{height:3px;border-radius:var(--r-pill);background:var(--cream3)}
.onb .progression span{display:block;height:3px;border-radius:var(--r-pill);
 background:var(--terra);transition:width var(--t-moyen) var(--e)}
.onb .carte{margin:0;display:flex;flex-direction:column;gap:var(--sp-4)}
.onb .grille{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));
 gap:var(--sp-3) var(--sp-4)}
.onb label{display:flex;flex-direction:column;gap:6px;min-width:0}
.onb .lab{font-family:var(--ff-mono);font-size:var(--fs-xs);color:var(--warm);
 letter-spacing:.12em;text-transform:uppercase;font-weight:500}
.onb input{font:inherit;font-size:var(--fs-champ);padding:10px 12px;
 border:1px solid var(--cream3);border-radius:var(--r-sm);background:var(--paper);
 color:var(--ink);min-height:var(--cible)}
.onb input:focus-visible{outline:var(--focus)}
.onb .aide{font-size:var(--fs-sm);color:var(--warm);line-height:1.45}
.onb .puces{display:flex;gap:var(--sp-2);flex-wrap:wrap}
.onb .puce{font:inherit;font-size:var(--fs-sm);font-weight:500;padding:8px 14px;
 border:1px solid var(--cream3);border-radius:var(--r-pill);background:none;
 color:var(--ink2);cursor:pointer;min-height:var(--cible)}
.onb .puce.on{background:var(--ink);color:var(--paper);border-color:var(--ink);font-weight:600}
.onb .opts{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:var(--sp-3)}
.onb .opt{display:flex;flex-direction:column;gap:4px;text-align:left;
 background:var(--paper);border:1.5px solid var(--cream3);border-radius:var(--r-md);
 padding:13px 15px;font:inherit;cursor:pointer;color:var(--ink)}
.onb .opt:hover{border-color:var(--terra)}
.onb .opt b{font-size:var(--fs-base);font-weight:600}
.onb .opt span{font-size:var(--fs-sm);color:var(--warm);line-height:1.45}
.onb .opt.on{background:var(--ink);border-color:var(--ink);color:var(--paper)}
.onb .opt.on span{color:var(--surInk2)}
.onb .suite{font-size:var(--fs-sm);color:var(--ink2);background:var(--cream);
 border-radius:var(--r-sm);padding:12px 14px;line-height:1.55}
.onb .item{border:1px solid var(--cream3);border-radius:var(--r-md);padding:14px 16px;
 display:flex;flex-direction:column;gap:9px}
.onb .item .tete{display:flex;align-items:baseline;gap:var(--sp-3);flex-wrap:wrap}
.onb .item .tete b{font-family:var(--ff-titre);font-size:var(--fs-md)}
.onb .item .tete .ou{font-size:var(--fs-sm);color:var(--warm)}
.onb .item .tete .mono{margin-left:auto;font-family:var(--ff-mono);font-size:var(--fs-xs);color:var(--warm)}
.onb .item .suite{background:none;padding:0}
.onb .bilan{display:flex;flex-direction:column}
.onb .bilan div{display:grid;grid-template-columns:minmax(120px,.5fr) 1fr;gap:var(--sp-4);
 padding:11px 0;border-top:var(--tr-clair)}
.onb .bilan div:first-child{border-top:0;padding-top:0}
.onb .bilan .cle{font-family:var(--ff-mono);font-size:var(--fs-xs);color:var(--warm);
 letter-spacing:.1em;text-transform:uppercase;padding-top:3px}
.onb .bilan .val{font-size:var(--fs-base);color:var(--ink)}
.onb .pied{display:flex;align-items:center;gap:var(--sp-3);flex-wrap:wrap}
.onb .pied .btn.sec{margin-right:auto}

/* ---------------------------------------------------------------------
   LA SYNTHESE DES RETOURS (maquette du 23/09/2026, portee le 24/09)
   ---------------------------------------------------------------------
   Deux colonnes : ce qui va, ce qui ne va pas. Sur telephone elles
   s'empilent - deux colonnes de 180 px rendraient les libelles illisibles,
   et c'est la LISTE qui cede, jamais le titre.

   La barre double le chiffre, elle ne le remplace pas : un lecteur qui ne
   compare pas des nombres voit tout de suite laquelle est courte. Elle est
   `aria-hidden` et la moyenne reste en texte a cote - une barre ne
   s'annonce pas.
   --------------------------------------------------------------------- */
.rx-liste { list-style: none; margin: var(--sp-3) 0 var(--sp-4); padding: 0;
  display: grid; gap: var(--sp-3); }
.rx-ligne { display: grid; grid-template-columns: minmax(0, 1fr) 6rem auto;
  align-items: center; gap: var(--sp-3); }
.rx-c { min-width: 0; color: var(--ink); }
/* La piste de la barre : elle cede avant le libelle. */
.rx-b { height: var(--sp-2); border-radius: var(--r-pill);
  background: var(--cream2); overflow: hidden; }
.rx-b i { display: block; height: 100%; border-radius: var(--r-pill); }
.rx-l.haut .rx-b i { background: var(--green); }
.rx-l.moyen .rx-b i { background: var(--gold); }
.rx-l.bas .rx-b i { background: var(--terra); }
.rx-ligne b { font-family: var(--ff-mono); color: var(--ink); white-space: nowrap; }
.rx-ligne b small { color: var(--warm); font-weight: 400; }
/* Le conseil, sous la question qu'il vise, en retrait d'un filet. */
.rx-conseil { margin: var(--sp-2) 0 0; padding-left: var(--sp-3);
  border-left: 2px solid var(--cream3); color: var(--ink2); font-size: var(--fs-sm); }
.rx-tout { margin: 0 0 var(--sp-3); }
.rx-tout > summary { cursor: pointer; color: var(--terra);
  padding: var(--sp-2) 0; min-height: var(--cible);
  display: flex; align-items: center; }

/* LE GESTE D'UN CONSEIL SE TOUCHE (audit du 24/09/2026 : 21 px de haut
   pour 44 attendus, a 360 px et dans les quatre langues). Il est ecrit
   comme un lien - `.lien` - mais c'est un BOUTON : on le touche au doigt,
   sur un telephone, et c'est la seule porte vers l'ecran qui repare. */
/* Un geste ecrit comme un lien se LIT comme un lien : sans ces regles, le
   bouton gardait sa bordure de bouton au milieu d'une phrase. */
.rx-conseil .lien, .ret-traiter .lien { appearance: none; background: none;
  border: 0; padding: 0; font: inherit; color: var(--terra); cursor: pointer;
  text-decoration: underline; text-underline-offset: 2px; }
/* Sur le fond beige du bandeau, le terracotta tombait a 4,05 : on prend sa
   teinte foncee (audit du 12/10/2026). */
.ret-traiter .lien { color: var(--terraDk); }
/* A 360 px, un libelle long (« Luisterbereidheid en respect ») ne tenait
   plus a cote de la barre : la barre cede, et le mot peut se couper. */
@media (max-width: 480px) {
  .rx-ligne { grid-template-columns: minmax(0, 1fr) 3rem auto; }
  .rx-c { overflow-wrap: anywhere; }
}
.rx-conseil .lien { display: inline-flex; align-items: center;
  min-height: var(--cible); }

/* La porte de « Santé de mes données », dans l'en-tête des animaux : c'est
   de ces annonces-là qu'elle parle. Discrète — un lien, pas un bouton —
   mais avec une vraie cible tactile : elle est la SEULE porte de cet
   écran depuis qu'il a quitté le bandeau. */
.entete .sous-lien { display: inline-flex; align-items: center;
  min-height: var(--cible); margin-left: var(--sp-3);
  color: var(--terra); font-size: var(--fs-sm); }

/* L'ATTESTATION : cinq points, cinq cases, une signature (25/09/2026).
   -----------------------------------------------------------------------
   La surimpression elle-meme est celle de la feuille des photos
   (`.cdp-modal`, studio.css) : c'est la meme chose - un contenu que la
   fiche n'a pas - et en ecrire une seconde les aurait fait diverger. Ce
   bloc ne porte que ce qui est PROPRE a la declaration.

   La confirmation expiree se lit sur `.conf.manque` : le vert de `.conf`
   dirait « c'est fait » sur exactement le cas ou ce n'est plus vrai. */
.conf.manque { color: var(--goldDk); }

.att-decl { padding: 0 var(--sp-4) var(--sp-3); }
.att-leg { font-weight: 600; color: var(--ink); margin: 0 0 var(--sp-2); }
.att-pts { list-style: none; margin: 0 0 var(--sp-3); padding: 0; }
/* UNE CASE SE TOUCHE. Le libelle entier est cliquable - c'est le texte
   qu'on lit avant de cocher, pas une etiquette a cote. */
.att-pts li { margin: 0 0 var(--sp-1); }
.att-pts label { display: flex; gap: var(--sp-2); align-items: flex-start;
  min-height: var(--cible); padding: var(--sp-1) 0; cursor: pointer;
  color: var(--ink2); font-size: var(--fs-base); }
.att-pts input { width: var(--sp-4); height: var(--sp-4); margin-top: var(--sp-1);
  flex: 0 0 auto; accent-color: var(--terra); }
/* Ce que la signature engage, sous les cases : qui declare, au nom de qui,
   pour combien de temps, et ce qui l'annule. */
.att-sign { margin: 0; color: var(--ink3); font-size: var(--fs-sm);
  border-top: 1px solid var(--cream3); padding-top: var(--sp-2); }
.att .gestes { padding: 0 var(--sp-4) var(--sp-4); }
/* Un bouton desactive ne se lit pas comme un bouton en attente : tant
   qu'une case manque, il DIT qu'il ne part pas. */
.att .gestes button[disabled] { opacity: .55; cursor: not-allowed; }
.att .msg { padding: 0 var(--sp-4); }

/* LA RENCONTRE, sous le contact d'une famille retenue (25/09/2026).
   -----------------------------------------------------------------------
   Une liste de créneaux et un petit formulaire. Chaque geste se touche :
   retirer un créneau est un lien par sa forme, un bouton par son usage. */
.rc { margin-top: var(--sp-3); padding-top: var(--sp-3);
  border-top: 1px solid var(--cream3); }
.rc-l { list-style: none; margin: var(--sp-2) 0; padding: 0; }
.rc-l li { display: flex; align-items: center; justify-content: space-between;
  gap: var(--sp-2); min-height: var(--cible); flex-wrap: wrap; }
.rc-l li span { color: var(--ink2); font-size: var(--fs-base); }
.rc-l .lien { display: inline-flex; align-items: center;
  min-height: var(--cible); color: var(--terra); font-size: var(--fs-sm); }
.rc-pris { font-weight: 600; color: var(--greenDk); margin: var(--sp-2) 0; }
/* La question avant d'annuler le rendez-vous d'une famille (12/10/2026). */
.rc-confirme { background: var(--goldPale); border-radius: var(--r-md);
  padding: var(--sp-3); margin: var(--sp-2) 0 0; }
.rc-confirme p { margin: 0 0 var(--sp-2); color: var(--ink); }
/* Le formulaire s'enroule au téléphone : trois champs côte à côte à 360 px
   font déborder la page — le défaut mesuré trois fois dans ce dépôt. */
.rc-f { display: flex; gap: var(--sp-2); align-items: flex-end;
  flex-wrap: wrap; margin-top: var(--sp-2); }
.rc-f label { display: flex; flex-direction: column; gap: var(--sp-1);
  font-size: var(--fs-sm); color: var(--ink3); }
.rc-f input { min-height: var(--cible); }

/* CE QU'IL RESTE A REMETTRE, sous la visite d'une famille retenue
   (26/09/2026, maquette du 23/09, famille `dr-`).
   -----------------------------------------------------------------------
   Le certificat d'engagement n'a plus de bloc a lui : il est une LIGNE de
   cette liste, et ses deux regles mortes sont parties avec lui.

   Les pieces se dessinent par les regles de `.fc` ci-dessous, elargies a
   `.dr` : c'est le meme composant des deux cotes. Ce bloc ne pose que ce
   qui lui est propre - la pastille de l'avancement, les trois moments,
   l'etat et les gestes. */
.dr { margin-top: var(--sp-3); padding-top: var(--sp-3);
  border-top: 1px solid var(--cream3); }
.dr-tete { display: flex; align-items: baseline; gap: var(--sp-3);
  flex-wrap: wrap; }
.dr-compte { font-family: var(--ff-mono); font-size: var(--fs-xs);
  letter-spacing: .08em; text-transform: uppercase; color: var(--warm); }
.dr-m { margin-top: var(--sp-3); }
.dr-m h5 { margin: 0 0 var(--sp-2); font-size: var(--fs-xs);
  letter-spacing: .08em; text-transform: uppercase; color: var(--warm); }
/* « Selon l'espece » ne se place pas dans le temps : son bloc se distingue
   des trois moments, sans crier - ce n'est pas une alerte, c'est un doute
   que nous assumons. */
.dr-incertain { border-left: 2px solid var(--cream3);
  padding-left: var(--sp-3); }
.dr-liste { list-style: none; margin: 0; padding: 0;
  display: flex; flex-direction: column; gap: var(--sp-2); }
.dr-l { display: flex; align-items: center; gap: var(--sp-3); flex-wrap: wrap;
  border: 1px solid var(--cream3); border-radius: var(--r-sm);
  padding: var(--sp-2) var(--sp-3); }
/* CE QUI EST FAIT SE VOIT A SA COCHE, pas a un fond vert : la liste se lit
   d'un coup d'oeil par la colonne de gauche. */
.dr-l.fait { background: var(--greenLt); border-color: var(--greenLt); }
.dr-p { flex: none; width: 1.1em; color: var(--greenDk);
  font-size: var(--fs-base); }
.dr-etat { flex: none; font-size: var(--fs-xs); color: var(--warm); }
.dr-l.fait .dr-etat { color: var(--greenDk); }
.dr-papier { font-family: var(--ff-mono); font-size: var(--fs-xs);
  color: var(--warm); }
.dr-g { flex: none; display: flex; gap: var(--sp-2); flex-wrap: wrap; }
/* LA CIBLE TACTILE EST CELLE DU PRODUIT, pas celle de la maquette : un lien
   « Pas encore » de 8 px de rembourrage fait 30 px de haut. */
.dr-b { min-height: var(--cible); }
.dr .lien.dr-b { display: inline-flex; align-items: center;
  color: var(--terra); font-size: var(--fs-sm); }
.dr-delai { font-weight: 600; }

/* Les conseils à cocher, dans le formulaire de dépôt (chantier 4). */
.dp-soins { margin: var(--sp-3) 0; }
.dp-soins > summary { cursor: pointer; color: var(--terra);
  min-height: var(--cible); display: flex; align-items: center; }
.dp-soins-c { padding: var(--sp-2) 0; }
.dp-soins-g { font-weight: 600; color: var(--ink);
  margin: var(--sp-3) 0 var(--sp-1); }
/* Une case se touche, et son libellé entier est cliquable : c'est le texte
   qu'on lit avant de cocher, pas une étiquette à côté. */
.dp-soins-l { display: flex; gap: var(--sp-2); align-items: flex-start;
  min-height: var(--cible); padding: var(--sp-1) 0; cursor: pointer;
  font-size: var(--fs-sm); color: var(--ink2); }
.dp-soins-l input { width: var(--sp-4); height: var(--sp-4);
  margin-top: var(--sp-1); flex: 0 0 auto; accent-color: var(--terra); }

/* CHOISIR PLUSIEURS ANNONCES (25/09/2026).
   -----------------------------------------------------------------------
   La barre n'apparaît qu'avec une sélection : à zéro, elle dirait « rien de
   choisi » moins clairement que son absence. Elle reste au-dessus de la
   liste pendant qu'on défile — les gestes doivent rester sous la main. */
.an-sel { position: sticky; top: 0; z-index: 2;
  display: flex; gap: var(--sp-2); align-items: center; flex-wrap: wrap;
  padding: var(--sp-2) var(--sp-3); margin-bottom: var(--sp-2);
  background: var(--goldPale); border-radius: var(--r-md); }
.an-sel b { font-size: var(--fs-sm); color: var(--ink); }
.an-sel .btn, .an-sel .lien { min-height: var(--cible); }
/* La colonne des cases : étroite, et la case s'y touche. */
.rangs th.coche, .rangs td.coche { width: var(--sp-6); text-align: center;
  /* `.coche` (une case et son libelle) est un flex : sur une CELLULE il la
     sortait du tableau, et la colonne se dessinait en bande a part. */
  display: table-cell; vertical-align: middle; }
.rangs td.coche input, .rangs th.coche input {
  width: var(--sp-4); height: var(--sp-4); accent-color: var(--terra); }

/* LA BARRE DES FILTRES (maquette du 24/09/2026, portee le 12/10/2026).
   Les etats en onglets de texte, ce qui reste a faire dans « A traiter »,
   le tri et la vue dans « Affichage ». */
.an-barre { display: flex; flex-wrap: wrap; align-items: center;
  gap: var(--sp-2) var(--sp-4); margin: var(--sp-4) 0 var(--sp-4);
  border-bottom: var(--tr); }
.an-tabs { display: flex; flex-wrap: wrap; gap: 0 var(--sp-5); }
.an-tabs button { appearance: none; border: 0; background: none; font: inherit;
  font-size: var(--fs-base); color: var(--ink3); min-height: var(--cible);
  padding: 0; margin-bottom: -1px; border-bottom: 2px solid transparent;
  cursor: pointer; display: inline-flex; align-items: center; gap: var(--sp-2); }
.an-tabs button span { font-size: var(--fs-sm); color: var(--ink3);
  font-variant-numeric: tabular-nums; }
.an-tabs button:hover { color: var(--ink); }
.an-tabs button[aria-pressed="true"] { color: var(--ink); font-weight: 600;
  border-bottom-color: var(--ink); }
.an-tabs button[aria-pressed="true"] span { color: var(--ink2); }
.an-atr, .an-aff { position: relative; }
.an-aff { margin-left: auto; }
.an-atr > summary, .an-aff > summary { list-style: none; cursor: pointer;
  display: inline-flex; align-items: center; gap: var(--sp-2);
  min-height: var(--cible); padding: 0 var(--sp-3); border-radius: var(--r-sm);
  font-size: var(--fs-sm); }
.an-atr > summary::-webkit-details-marker,
.an-aff > summary::-webkit-details-marker { display: none; }
.an-atr > summary { color: var(--goldDk); font-weight: 600;
  background: var(--goldLt); border-radius: var(--r-pill); }
.an-atr > summary span { font-variant-numeric: tabular-nums; }
.an-atr.on > summary { background: var(--goldDk); color: var(--paper); }
.an-aff > summary { color: var(--ink2); }
.an-aff > summary:hover, .an-aff[open] > summary { background: var(--cream2); color: var(--ink); }
.an-atr > summary i, .an-aff > summary i { font-style: normal; font-size: var(--fs-xs); }
.an-atr > .an-atr-m, .an-aff > .an-aff-m { position: absolute; z-index: 20; top: calc(100% + var(--sp-1));
  min-width: 240px; padding: var(--sp-2); border-radius: var(--r-md);
  background: var(--paper); border: var(--tr); box-shadow: var(--sh-2);
  display: grid; gap: 2px; }
.an-atr > .an-atr-m { left: 0; }
.an-aff > .an-aff-m { right: 0; }
.an-atr-m button, .an-aff-m > button { appearance: none; border: 0; background: none;
  font: inherit; font-size: var(--fs-sm); color: var(--ink); text-align: left;
  min-height: var(--cible); padding: 0 var(--sp-3); border-radius: var(--r-sm);
  cursor: pointer; display: flex; justify-content: space-between;
  align-items: center; gap: var(--sp-3); }
.an-atr-m button span { color: var(--ink3); font-variant-numeric: tabular-nums; }
.an-atr-m button:hover, .an-atr-m button[aria-pressed="true"],
.an-aff-m > button:hover { background: var(--cream); }
.an-atr-m .an-atr-x { color: var(--ink3); border-top: var(--tr); }
.an-aff-m > button { padding-left: var(--sp-6); position: relative; }
.an-aff-m > button[aria-pressed="true"] { font-weight: 600; }
.an-aff-m > button[aria-pressed="true"]::before { content: "✓"; position: absolute;
  left: var(--sp-3); }
.an-aff-t { margin: var(--sp-2) var(--sp-3) var(--sp-1); font-size: var(--fs-xs);
  color: var(--ink3); font-weight: 600; }
.an-vue2 { display: grid; grid-template-columns: 1fr 1fr; gap: var(--sp-1);
  margin: 0 var(--sp-1) var(--sp-1); padding: 3px; border: var(--tr);
  border-radius: var(--r-sm); }
.an-vue2 button { appearance: none; border: 0; background: none; font: inherit;
  font-size: var(--fs-sm); color: var(--ink3); min-height: var(--cible);
  border-radius: var(--r-xs); cursor: pointer; }
.an-vue2 button[aria-pressed="true"] { background: var(--ink); color: var(--paper); }

/* LES PAQUETS : la liste rangee dans l'ordre du travail. */
.rangs .an-paquet { cursor: default; }
.rangs .an-paquet:hover { background: none; }
.rangs .an-paquet td { padding: 0; background: var(--cream);
  border-top: var(--tr); border-bottom: var(--tr); }
.an-paquet-w { display: flex; flex-wrap: wrap; align-items: center;
  gap: var(--sp-2) var(--sp-3); padding: var(--sp-2) var(--sp-4); }
.an-paquet-w h3 { margin: 0; font-family: var(--ff-titre); font-size: var(--fs-lg);
  font-weight: 600; color: var(--ink); line-height: 1.2; }
.an-paquet-n { font-family: var(--ff-mono); font-size: var(--fs-xs);
  border-radius: var(--r-pill); padding: 2px var(--sp-2);
  background: var(--cream2); color: var(--ink3); }
.an-paquet.rouge .an-paquet-n { background: var(--rougeLt); color: var(--rougeDk); }
.an-paquet.vert .an-paquet-n { background: var(--greenLt); color: var(--greenDk); }
.an-paquet.or .an-paquet-n { background: var(--goldLt); color: var(--goldDk); }
.an-paquet.muet h3 { color: var(--ink3); }
.an-paquet-s { font-size: var(--fs-xs); color: var(--warm); }
.an-paquet-g { margin-left: auto; display: flex; flex-wrap: wrap;
  align-items: center; gap: var(--sp-2) var(--sp-4); }

/* LA LIGNE : l'animal, son etat, sa prochaine etape. */
.an-animal { white-space: nowrap; }
.an-animal .an-vig { display: inline-block; vertical-align: middle;
  width: 40px; height: 40px; border-radius: var(--r-sm); overflow: hidden;
  background: var(--cream2); margin-right: var(--sp-3); text-align: center; }
.an-vig img { width: 100%; height: 100%; object-fit: cover; display: block; }
/* Le crayon des photos (19/10/2026) : la vignette est un bouton, la pastille
   du crayon se pose sur son coin. `overflow` reste masque sur l'image, pas
   sur le bouton, sinon le crayon serait coupe. */
.an-animal .an-vig-b { position: relative; overflow: visible; padding: 0; border: 0;
  cursor: pointer; font: inherit; }
.an-vig-b img, .an-vig-b .ga-vide { border-radius: var(--r-sm); }
.an-vig-b .an-crayon { position: absolute; right: calc(-1 * var(--sp-1)); bottom: calc(-1 * var(--sp-1));
  width: 18px; height: 18px; border-radius: var(--r-circle); background: var(--paper);
  color: var(--ink); border: var(--tr); display: flex; align-items: center;
  justify-content: center; }
.an-vig-b:hover .an-crayon, .an-vig-b:focus-visible .an-crayon {
  background: var(--terra); color: var(--paper); border-color: var(--terra); }
@media (pointer: coarse) { .an-animal .an-vig-b { width: var(--cible); height: var(--cible); } }
.an-vig .ga-vide { display: block; line-height: 40px; font-family: var(--ff-titre);
  font-size: var(--fs-md); color: var(--ink3); }
.an-nom { display: inline-block; vertical-align: middle; white-space: normal; }
.rangs .an-ligne.urgent td:first-child { box-shadow: inset 3px 0 0 var(--rouge); }
.rangs .an-ligne.inactive .nom { color: var(--ink3); }
.an-statut { display: inline-flex; align-items: center; gap: var(--sp-2); }
.an-statut i { width: 9px; height: 9px; border-radius: var(--r-circle);
  flex: none; background: var(--cream3); }
.an-statut.on i { background: var(--green); }
.an-statut.pause i { background: var(--gold); }
.an-statut.adoptee i { background: var(--ink); }
.an-statut-t { display: flex; flex-direction: column; line-height: 1.25; }
.an-statut-t b { font-size: var(--fs-sm); font-weight: 600; white-space: nowrap; }
.an-statut-t small { font-size: var(--fs-xs); color: var(--warm); white-space: nowrap; }
.an-statut.off .an-statut-t b { color: var(--warm); }
.an-suite-w { display: flex; align-items: center; justify-content: space-between;
  gap: var(--sp-2) var(--sp-3); }
.an-suite-t { min-width: 0; display: flex; flex-direction: column; gap: 1px; }
.an-suite-l { font-size: var(--fs-sm); color: var(--ink); line-height: 1.35; }
.an-suite-l.fort { font-weight: 600; }
.an-suite-l.rouge { color: var(--rougeDk); font-weight: 600; }
.an-suite-l.or { color: var(--goldDk); font-weight: 600; }
.an-suite-l.muet { color: var(--warm); }
.an-suite-l .ok { color: var(--greenDk); }
.an-suite-s { font-size: var(--fs-xs); color: var(--warm); line-height: 1.35; }
/* Un geste de la ligne ou d'un paquet : une pilule discrete, une seule. */
.an-g { flex: none; font: inherit; font-size: var(--fs-sm); font-weight: 600;
  min-height: var(--cible); padding: 0 var(--sp-4); border-radius: var(--r-pill);
  border: var(--tr); background: var(--paper); color: var(--ink);
  cursor: pointer; white-space: nowrap; }
.an-g:hover { border-color: var(--ink); }
.an-g.fort { background: var(--terra); border-color: var(--terra); color: var(--paper); }
.an-g.fort:hover { background: var(--ink); border-color: var(--ink); }
/* Un lien qui ne se donne pas pour un bouton, mais qui se touche. */
.lien-muet { appearance: none; background: none; border: 0; padding: 0; margin: 0;
  font: inherit; color: inherit; cursor: pointer; min-height: var(--cible);
  text-decoration: underline; text-decoration-color: transparent;
  text-underline-offset: 2px; }
.lien-muet:hover { color: var(--ink); text-decoration-color: currentColor; }
.an-paquet-g .lien-muet { color: var(--ink3); font-size: var(--fs-xs); font-weight: 600; }
/* Dans la phrase, confirmer et completer se lisent comme du texte : la
   pastille d'avant (police a chasse fixe, fond dore) gagnait sinon, ecrite
   plus bas dans la feuille. */
.rangs .an-suite-l .an-chip { font: inherit; background: none; padding: 0;
  border: 0; border-radius: 0; color: inherit; }
.rangs .an-suite-l .an-chip.rouge { color: var(--rougeDk); font-weight: 600; }
@media (max-width: 720px) {
  .an-aff { margin-left: 0; }
  .an-suite-w { flex-wrap: wrap; }
  .an-animal { white-space: normal; }
  .an-animal .an-vig { display: none; }
}

/* La galerie : on reconnaît l'animal, on clique, on ouvre. */
.galerie { list-style: none; margin: 0; padding: 0; display: grid;
  gap: var(--sp-3); grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); }
.ga { position: relative; background: var(--paper);
  border: 1px solid var(--cream3); border-radius: var(--r-md);
  overflow: hidden; }
.ga.sel { border-color: var(--terra); }
.ga.inactive { opacity: .6; }
/* La case par-dessus la photo : c'est là qu'on la cherche, et elle garde
   sa cible tactile. */
/* ANCRÉE SUR SA CARTE, pas seule : une classe nue qui impose
   `position:absolute` s'ancre sur la fenêtre le jour où son parent perd son
   `position:relative` — c'est le défaut n° 2 que `test_style` raconte. */
.ga .ga-coche { position: absolute; top: var(--sp-1); left: var(--sp-1); z-index: 1;
  display: flex; align-items: center; justify-content: center;
  min-width: var(--cible); min-height: var(--cible); }
.ga .ga-coche input { width: var(--sp-4); height: var(--sp-4);
  accent-color: var(--terra); }
.ga-ouvrir { display: block; width: 100%; padding: 0; text-align: left;
  background: none; border: 0; cursor: pointer; }
.ga .ga-img { position: relative; display: block; aspect-ratio: 4 / 3;
  background: var(--cream); }
.ga-img img { width: 100%; height: 100%; object-fit: cover; display: block; }
/* Pas de photo : l'initiale, jamais une image cassée. */
.ga-vide { display: flex; align-items: center; justify-content: center;
  width: 100%; height: 100%; font-family: var(--ff-titre);
  font-size: var(--fs-2xl); color: var(--ink3); }
.ga-img .pastille { position: absolute; left: var(--sp-1); bottom: var(--sp-1); }
.ga-txt { display: block; padding: var(--sp-2); }
.ga-txt b { display: block; color: var(--ink); }
.ga-txt span { display: block; font-size: var(--fs-sm); color: var(--ink3); }
.ga-pied { display: flex; gap: var(--sp-2); flex-wrap: wrap;
  padding: 0 var(--sp-2) var(--sp-2); }

/* CORRIGER UN FAIT SANS ROUVRIR LE FORMULAIRE (25/09/2026).
   -----------------------------------------------------------------------
   Le champ prend la place du texte, à l'endroit même où l'on a lu qu'il
   manquait. Chaque contrôle garde sa cible tactile : on corrige une puce
   sur un téléphone, debout, à côté du chenil. */
.faits .fd-in { min-height: var(--cible); max-width: 100%; }
.faits .fd-seg { display: inline-flex; flex-wrap: wrap; gap: var(--sp-1); }
.faits .fd-seg button { min-height: var(--cible); padding: 0 var(--sp-2);
  background: none; border: 1px solid var(--cream3); color: var(--ink3);
  border-radius: var(--r-pill); font-size: var(--fs-sm); cursor: pointer; }
/* Ce qui est répondu se voit : `aria-pressed` porte l'état pour qui écoute,
   la couleur pour qui regarde — les deux, jamais l'un sans l'autre. */
.faits .fd-seg button[aria-pressed="true"] { background: var(--ink);
  color: var(--paper); border-color: var(--ink); }
.fd-etat { margin-left: auto; font-size: var(--fs-sm); color: var(--ink3); }
.fd-etat.ok { color: var(--greenDk); }
.fd-etat.err { color: var(--rougeDk); }

/* --- LA FICHE D'UN ANIMAL, EN UN SEUL BLOC (maquette du 23/09/2026) -----
   Elle etait cinq cartes empilees : l'identite, les gestes, les faits, les
   photos, la chronologie. Il fallait descendre pour savoir si l'annonce
   etait en ligne, et remonter pour agir. Un seul bloc : l'identite, l'etat
   et les gestes se lisent d'un regard, le detail vient dessous.

   La maquette a ete dessinee a 1440 px pour une souris. Deux dettes sont
   payees ici : les paliers etroits, et les cibles tactiles - elle descend
   `.fu-pas` a 40 puis 36 px sous 760 px, ce qui est exactement ce que
   l'audit refuse. Elles restent a --cible partout, et la barre s'enroule. */
.fu { background: var(--paper); border: 1px solid var(--cream3);
  border-radius: var(--r-lg); overflow: hidden; margin-bottom: var(--sp-4); }
.fu-tete { display: grid; grid-template-columns: 132px minmax(0, 1fr) auto;
  gap: var(--sp-5); align-items: start;
  padding: var(--sp-5) var(--sp-5) var(--sp-4);
  background: var(--cream); border-bottom: 1px solid var(--cream3); }
/* LA PHOTO EST LE BOUTON DES PHOTOS : c'est l'endroit ou l'on regarde quand
   on veut les changer, et il portait jusqu'ici un bouton de plus a cote. */
.fu .fu-photo-b { display: block; padding: 0; border: 0; background: none;
  position: relative; cursor: pointer; border-radius: var(--r-md); }
.fu .fu-photo-b:focus-visible { outline: var(--focus); outline-offset: 2px; }
.fu .fu-photo img, .fu .fu-photo .ga-vide { width: 132px; height: 132px;
  object-fit: cover; border-radius: var(--r-md); display: block;
  background: var(--cream2); border: 1px solid var(--cream3); }
.fu .fu-photo .ga-vide { display: grid; place-items: center;
  font-family: var(--ff-titre); font-size: var(--fs-3xl); color: var(--warm); }
.fu .fu-photo-crayon { position: absolute; right: var(--sp-1);
  bottom: var(--sp-1); display: grid; place-items: center;
  width: var(--sp-5); height: var(--sp-5); border-radius: var(--r-circle);
  background: var(--paper); border: 1px solid var(--cream3);
  color: var(--ink3); }
.fu-id { min-width: 0; display: flex; flex-direction: column; gap: var(--sp-1); }
.fu-id h2 { font-size: var(--fs-2xl); line-height: 1.05; margin: 0; }
.fu-id .sous { font-size: var(--fs-sm); color: var(--warm); }
.fu-etat { display: flex; align-items: center; gap: var(--sp-2);
  flex-wrap: wrap; }
/* Le compteur de familles : un nombre, ce qu'il compte, et par ou y aller. */
.fu-fam { min-width: 170px; display: flex; flex-direction: column;
  align-items: flex-start; gap: var(--sp-1);
  padding: var(--sp-3) var(--sp-4); border-radius: var(--r-md);
  background: var(--paper); border: 1px solid var(--cream3); }
.fu-fam b { font-family: var(--ff-titre); font-size: var(--fs-3xl);
  line-height: 1; color: var(--warm); }
.fu-fam.on b { color: var(--terra); }
.fu-fam span { font-size: var(--fs-sm); color: var(--ink3); }
.fu-fam .btn { margin-top: var(--sp-2); }
.fu-fam .fu-fam-rien { font-size: var(--fs-xs); color: var(--warm);
  max-width: 22ch; line-height: 1.4; }
#fichePanneau:not(:empty) { padding: var(--sp-4) var(--sp-5) 0; }
.fu-corps { display: grid;
  grid-template-columns: minmax(0, 1.5fr) minmax(0, 1fr); }
.fu-sec { padding: var(--sp-4) var(--sp-5); min-width: 0; }
.fu-cote { border-left: 1px solid var(--cream3); display: flex;
  flex-direction: column; }
.fu-cote .fu-sec + .fu-sec { border-top: 1px solid var(--cream3); }
.fu-sec h3 { font-size: var(--fs-base); font-weight: 700; margin: 0; }
.fu-sec > h3 { margin-bottom: var(--sp-3); }
.fu-sec-tete { display: flex; align-items: center; gap: var(--sp-3);
  flex-wrap: wrap; margin-bottom: var(--sp-3); }
.fu-compte { font-family: var(--ff-mono); font-size: var(--fs-xs);
  letter-spacing: .08em; text-transform: uppercase; color: var(--greenDk);
  background: var(--greenLt); border-radius: var(--r-pill);
  padding: 2px 9px; }
.fu-compte.manque { color: var(--goldDk); background: var(--goldLt); }
/* Les faits en cases : ce qui manque se voit a son cadre, pas a sa place
   dans une liste. Le contenu reste celui de `champFait` (lot du 25/09). */
.fu-grille { display: grid;
  grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
  gap: var(--sp-2); margin: 0; }
.fu-fait { border: 1px solid var(--cream3); border-radius: var(--r-sm);
  padding: var(--sp-2) var(--sp-3); display: flex; flex-direction: column;
  gap: 2px; min-width: 0; }
.fu-fait dt { font-size: var(--fs-xs); color: var(--warm); }
.fu-fait dd { margin: 0; display: flex; align-items: center;
  gap: var(--sp-1); flex-wrap: wrap; font-size: var(--fs-sm);
  color: var(--ink); overflow-wrap: anywhere; }
.fu-fait.manque { border-style: dashed; background: var(--cream); }
.fu-fait.loi { border-color: var(--gold); background: var(--goldLt); }
.fu-fait .rien { color: var(--warm); font-style: italic; }
.fu-fait .loi { font-size: var(--fs-xs); color: var(--goldDk); }
.fu-chrono li { font-size: var(--fs-sm); padding: var(--sp-1) 0; }
.fu-chrono .quand { font-size: var(--fs-xs); }
.fu-chrono .quoi { min-width: 0; overflow-wrap: anywhere; }
.fu-note { margin: 0; padding: var(--sp-3) var(--sp-5);
  border-top: 1px solid var(--cream3); font-size: var(--fs-xs);
  color: var(--warm); line-height: 1.5; background: var(--cream); }

/* --- L'ETAT DE L'ANNONCE : trois etats, pas une progression --------------
   En pause, l'annonce n'est PAS en ligne : l'etape 1 ne porte donc pas de
   coche, elle devient « Hors ligne ». Seule l'adoption valide le chemin. */
.fu-cycle-w { display: flex; align-items: center; gap: var(--sp-2);
  margin-top: var(--sp-3); flex-wrap: wrap; }
.fu-cycle { display: flex; align-items: stretch; background: var(--paper);
  border: 1px solid var(--cream3); border-radius: var(--r-pill);
  padding: var(--sp-1); min-width: 0; flex-wrap: wrap; }
.fu-pas { display: flex; align-items: center; gap: var(--sp-2);
  padding: var(--sp-1) var(--sp-3) var(--sp-1) var(--sp-1);
  border-radius: var(--r-pill); border: 0; background: none; font: inherit;
  text-align: left; color: var(--ink3); min-height: var(--cible); }
.fu button.fu-pas { cursor: pointer; }
.fu button.fu-pas:hover { background: var(--cream); }
.fu button.fu-pas:hover .fu-pas-p { border-color: var(--ink); color: var(--ink); }
.fu button.fu-pas:focus-visible { outline: var(--focus); outline-offset: 1px; }
.fu-pas-p { flex: none; width: 26px; height: 26px;
  border-radius: var(--r-circle); display: grid; place-items: center;
  border: 1px solid var(--cream3); font-size: var(--fs-xs); font-weight: 700;
  color: var(--warm); background: var(--paper); }
.fu-pas-t { display: flex; flex-direction: column; line-height: 1.15; }
.fu-pas-t b { font-size: var(--fs-sm); font-weight: 600; color: inherit; }
.fu-pas-t small { font-size: var(--fs-xs); color: var(--warm); }
.fu-pas.on { background: var(--ink); color: var(--paper); }
.fu-pas.on .fu-pas-p { background: var(--green); border-color: var(--green);
  color: var(--surInk); }
.fu-pas.on .fu-pas-t small { color: var(--surInk3); }
.fu-pas.fait .fu-pas-p { background: var(--greenLt);
  border-color: var(--greenLt); color: var(--greenDk); }
.fu-pas-sep { width: 14px; align-self: center; height: 1px;
  background: var(--cream3); flex: none; }
.fu-plus { position: relative; }
.fu-plus summary { list-style: none; width: var(--cible);
  height: var(--cible); border-radius: var(--r-circle); display: grid;
  place-items: center; cursor: pointer; color: var(--ink3);
  font-size: var(--fs-lg); border: 1px solid transparent; }
.fu-plus summary::-webkit-details-marker { display: none; }
.fu-plus summary:hover, .fu-plus[open] summary { background: var(--paper);
  border-color: var(--cream3); color: var(--ink); }
.fu .fu-plus-m { position: absolute; right: 0; top: calc(100% + var(--sp-1));
  z-index: 5; min-width: 220px; background: var(--paper);
  border: 1px solid var(--cream3); border-radius: var(--r-md);
  box-shadow: var(--sh-2); padding: var(--sp-1); display: flex;
  flex-direction: column; }
.fu .fu-plus-m button { font: inherit; font-size: var(--fs-sm); text-align: left;
  border: 0; background: none; padding: var(--sp-2) var(--sp-3);
  border-radius: var(--r-sm); cursor: pointer; color: var(--ink);
  min-height: var(--cible); }
.fu .fu-plus-m button:hover { background: var(--cream); }
.fu .fu-plus-m button.danger { color: var(--rougeDk); }
/* Le certificat est un LIEN dans ce menu : il ouvre un document. Il se
   touche comme les autres entrees, donc il porte la meme cible. */
.fu .fu-plus-m a { font-size: var(--fs-sm); text-decoration: none;
  padding: var(--sp-2) var(--sp-3); border-radius: var(--r-sm);
  color: var(--ink); min-height: var(--cible); display: flex;
  align-items: center; }
.fu .fu-plus-m a:hover { background: var(--cream); text-decoration: underline; }
.fu-retiree { margin: 0; font-size: var(--fs-sm); color: var(--warm); }

/* --- Le bandeau de confirmation, dans la fiche ---------------------------
   La fenetre ne sert plus qu'au GROUPE, dont la liste de noms a besoin de
   place. Pour UNE annonce, la declaration vit la ou on la lit. */
.fu-att { padding: var(--sp-5); background: var(--goldLt);
  border-bottom: 1px solid var(--gold); display: flex;
  flex-direction: column; gap: var(--sp-3); }
.fu-att-l { display: flex; align-items: center; gap: var(--sp-3);
  flex-wrap: wrap; }
.fu-att-l p { margin: 0; font-size: var(--fs-sm); color: var(--ink3);
  max-width: 62ch; }
.fu-att-g { display: flex; align-items: center; gap: var(--sp-4);
  flex-wrap: wrap; }

/* UNE PHOTO SEULE NE PREND PAS TOUTE LA COLONNE. `.vignettes` s'etale en
   `auto-fit` : dans la colonne large d'avant elle tenait, dans celle-ci une
   seule photo occupait quatre cents pixels de haut. Vu sur le rendu, pas
   dans la feuille. */
.fu-cote .vignettes { grid-template-columns: repeat(auto-fill, minmax(96px, 1fr)); }

@media (max-width: 860px) {
  .fu-tete { grid-template-columns: 88px minmax(0, 1fr); }
  .fu .fu-photo img, .fu .fu-photo .ga-vide { width: 88px; height: 88px; }
  .fu-fam { grid-column: 1 / -1; flex-direction: row; align-items: center;
    flex-wrap: wrap; min-width: 0; }
  .fu-fam .btn { margin: 0 0 0 auto; }
  .fu-corps { grid-template-columns: minmax(0, 1fr); }
  .fu-cote { border-left: 0; border-top: 1px solid var(--cream3); }
  /* LA PASTILLE DEVIENT UNE LISTE. Enroulee sur trois rangs, un
     `--r-pill` fait un gros galet arrondi au milieu de l'ecran - vu sur le
     rendu a 390 px. Les trois etats s'empilent, chacun sur sa ligne, et
     gardent leur cible tactile entiere : c'est la dette de la maquette,
     dessinee a 1440 pour une souris. */
  .fu-cycle { border-radius: var(--r-md); gap: var(--sp-1); }
  .fu-pas { width: 100%; }
  .fu-pas-sep { display: none; }
  .fu-cycle-w { align-items: flex-start; }
}

/* CONFORMITE, DANS LA FICHE DE L'ANIMAL (decision de Claire du 24/09/2026).
   -------------------------------------------------------------------------
   DEUX COLONNES, PARCE QUE CE SONT DEUX GESTES : ce que l'annonce doit
   porter se corrige ici, en dix secondes ; ce qu'il faut remettre demande un
   rendez-vous. Cote a cote, on voit qu'on a deux choses a faire et non une
   liste de dix.

   La maquette a ete dessinee a 1440 px pour une souris : elle n'a ni regle
   etroite ni cible tactile. Les deux dettes sont payees plus bas, et elles
   se sont vues sur le rendu, pas dans la feuille. */
.fu-sec.fc { border-top: 1px solid var(--cream3); }
.fc .fc-verdict { margin: 0 0 var(--sp-3); font-size: var(--fs-sm);
  color: var(--ink3); max-width: 78ch; }
.fu-sec.fc.manque .fc-verdict { color: var(--goldDk); }
.fc .fc-cols { display: grid; gap: var(--sp-4);
  grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); }
.fc .fc-col { min-width: 0; }
.fc .fc-col h4 { margin: 0 0 var(--sp-2); font-size: var(--fs-xs);
  letter-spacing: .08em; text-transform: uppercase; color: var(--warm); }
.fc .fc-liste { list-style: none; margin: 0; padding: 0;
  display: flex; flex-direction: column; gap: var(--sp-2); }
.fc .fc-l { display: flex; align-items: center; justify-content: space-between;
  gap: var(--sp-3); flex-wrap: wrap;
  border: 1px solid var(--cream3); border-radius: var(--r-sm);
  padding: var(--sp-2) var(--sp-3); }
/* CE QUI MANQUE SE VOIT A SON CADRE, comme les faits juste au-dessus : le
   pointille est deja la langue de ce produit pour « on ne sait pas encore ».
   Un fond rouge en ferait une erreur ; c'est une chose a faire. */
.fc .fc-l.manque { border-style: dashed; background: var(--cream); }
.fc .fc-l.alerte { border-color: var(--rougeBord); background: var(--rougeLt); }
.fc .fc-q, .dr .fc-q { flex: 1; min-width: 0; display: flex; flex-direction: column;
  gap: 2px; font-size: var(--fs-sm); color: var(--ink);
  overflow-wrap: anywhere; }
/* LA LIGNE S'ENROULE SUR SA PROPRE LARGEUR, pas sur celle de la fenetre.
   La candidature s'affiche dans une COLONNE : a 1000 px de fenetre elle
   n'en fait que 316, et une regle etroite accrochee au viewport ne s'y
   declenche jamais. Mesure du 26/09 : le titre d'une piece tombait a un mot
   par ligne et sa phrase a vingt lignes, sur un ecran large. Une base de
   16rem fait passer l'etat et les gestes SOUS le texte des que la place
   manque, quelle que soit la fenetre. */
.dr .fc-q { flex: 1 1 16rem; }
.fc .fc-q b, .dr .fc-q b { font-family: var(--ff-titre); font-size: var(--fs-base); }
.fc .fc-q small, .dr .fc-q small { font-size: var(--fs-xs); color: var(--warm); }
.fc .fc-q em, .dr .fc-q em { font-style: normal; font-size: var(--fs-xs); color: var(--ink3);
  line-height: 1.45; }
.fc .fc-src, .dr .fc-src { font-family: var(--ff-mono); font-size: var(--fs-xs);
  color: var(--warm); }
/* UNE OBLIGATION SANS SON ARTICLE EST UNE AFFIRMATION : la nature et la
   source se lisent ensemble, jamais l'une sans l'autre. */
.fc .fc-nat, .dr .fc-nat { align-self: flex-start; font-family: var(--ff-mono);
  font-size: var(--fs-xs); letter-spacing: .08em; text-transform: uppercase;
  border-radius: var(--r-pill); padding: 2px 9px; }
.fc .fc-obligatoire, .dr .fc-obligatoire { color: var(--goldDk); background: var(--goldLt); }
.fc .fc-conseille, .dr .fc-conseille { color: var(--ink3); background: var(--cream2); }
.fc .fc-a_faire, .dr .fc-a_faire { color: var(--greenDk); background: var(--greenLt); }
/* « Selon l'espece » : ni une obligation ni un conseil. L'arrete du
   8 octobre 2018 range lui-meme les formalites en trois niveaux selon
   l'espece et le nombre, et notre canon est grossier - « Oiseau » couvre le
   canari, qui est domestique. La pastille est neutre a dessein. */
.fc .fc-selon_espece, .dr .fc-selon_espece { color: var(--warm); background: var(--cream2); }
.fc .fc-alerte { font-size: var(--fs-xs); color: var(--rougeDk);
  line-height: 1.45; }
.fc .fc-ou { font-size: var(--fs-xs); color: var(--warm); flex: none; }
/* LA CIBLE TACTILE EST CELLE DU PRODUIT, pas celle de la maquette. Un
   bouton de 8 px de rembourrage fait 30 px de haut : mesure a l'audit sur
   « Plus tard » et « Quitter la mise en route », trente-cinq defauts d'un
   coup le 23/09. */
.fc .fc-b, .dr .fc-b { flex: none; min-height: var(--cible); }

@media (max-width: 860px) {
  /* UNE SEULE COLONNE, ET LE GESTE PASSE SOUS SA LIGNE. Cote a cote, un
     libelle de trois mots et un bouton de 44 px ne laissent plus de place
     au libelle : c'est « Code pos... » sous une autre forme. */
  .fc .fc-cols { grid-template-columns: minmax(0, 1fr); }
  .fc .fc-l { align-items: stretch; }
  /* LE LIBELLE PREND LA LIGNE, LE GESTE PASSE DESSOUS. Cote a cote a
     390 px, « a corriger chez Seconde Chance » laissait 150 px a « le
     numero d'identification I-CAD », qui se cassait en trois lignes autour
     d'un trait d'union : c'est « Code pos... » sous une autre forme, et
     seule la capture le montre. */
  .fc .fc-q { flex: 1 0 100%; }
  .fc .fc-b, .fc .fc-ou { width: 100%; }
  .fc .fc-ou { text-align: right; }
}

/* LA BOITE DE RECEPTION, UNE CARTE PAR ANIMAL (maquette du 23/09/2026).
   -------------------------------------------------------------------------
   La colonne de gauche n'est plus une liste bordee d'un seul trait : c'est
   une PILE de cartes, une par animal. Le cadre passe donc de la colonne a la
   carte - `.bx-liste` perd le sien et devient une simple pile.

   Les regles de bouton de `.bx-liste` restent et servent les lignes de
   famille : elles portent deja la cible tactile, le survol et l'etat
   courant. Les recopier sous `.bx-an-l` en aurait fait deux ecritures du
   meme composant. */
.bx-liste { background: none; border: 0; border-radius: 0;
  overflow: visible; display: flex; flex-direction: column; gap: var(--sp-3); }
.bx-an { background: var(--paper); border: var(--tr);
  border-radius: var(--r-md); overflow: hidden; }
.bx-an-tete { display: flex; align-items: center; gap: var(--sp-3);
  flex-wrap: wrap; padding: var(--sp-3) var(--sp-4);
  border-bottom: var(--tr); background: var(--cream); }
/* LE VISAGE DE L'ANIMAL. Dans une boite a huit animaux, on le retrouve plus
   vite qu'un prenom - c'est la meme raison qui met une vignette sur les
   puces de filtre. */
.bx-vig { flex: none; width: 36px; height: 36px; border-radius: var(--r-sm);
  overflow: hidden; background: var(--cream2); display: flex;
  align-items: center; justify-content: center; }
.bx-vig img { width: 100%; height: 100%; object-fit: cover; display: block; }
.bx-vig .ga-vide { font-family: var(--ff-titre); font-size: var(--fs-sm);
  color: var(--warm); }
.bx-an-id { display: flex; flex-direction: column; min-width: 0; flex: 1 1 50%; }
.bx-an-id b { font-family: var(--ff-titre); font-size: var(--fs-md);
  color: var(--ink); }
/* `break-word`, PAS `anywhere` : la difference ne se voit que sur un rendu.
   `anywhere` entre dans le calcul de la largeur minimale du bloc, donc la
   colonne - 300 px partages avec la vignette et le compte - a laisse UN
   caractere par ligne a « Cheval ou âne · Cane corso ». `break-word` ne
   coupe un mot que s'il ne tient pas seul. */
.bx-an-id span { font-size: var(--fs-xs); color: var(--warm);
  overflow-wrap: break-word; }
/* LE COMPTE PREND SA LIGNE. Cote a cote avec le nom dans une colonne de
   300 px, « 4 familles · 3/3 preselectionnees » ne laissait rien a l'espece
   et a la race. */
.bx-an-n { font-family: var(--ff-mono); font-size: var(--fs-xs);
  color: var(--warm); flex: 1 1 100%; }
.bx-an-n.retard { color: var(--rougeDk); }
.bx-an .bx-an-pub { flex: none; font-size: var(--fs-xs);
  min-height: var(--cible); display: inline-flex; align-items: center; }
/* La regle de la preselection et ce que l'annonce ne dit pas : deux bandes
   sous la tete, jamais dans la liste des familles - elles parlent de
   l'ANIMAL, pas de l'une d'elles. */
.bx-an-aide, .bx-an-flou { margin: 0; padding: var(--sp-2) var(--sp-4);
  font-size: var(--fs-xs); color: var(--ink3); line-height: 1.5;
  border-bottom: var(--tr); }
.bx-an-aide { background: var(--goldPale); }
.bx-an-flou { background: var(--cream); }
.bx-an-sous { margin: 0; padding: var(--sp-3) var(--sp-4) var(--sp-1);
  font-family: var(--ff-mono); font-size: var(--fs-xs); letter-spacing: .08em;
  text-transform: uppercase; color: var(--warm); }
.bx-an-l { list-style: none; margin: 0; padding: 0; }
.bx-an-l li + li { border-top: var(--tr); }
/* Une preselectionnee se voit dans la pile : c'est celle qu'on compare. */
.bx-an-f.pre { background: var(--goldPale); }
.bx-an-f.pre button:hover { background: var(--goldLt); }
.bx-pre-b { font-family: var(--ff-mono); font-size: var(--fs-xs);
  border-radius: var(--r-pill); padding: 1px var(--sp-2);
  background: var(--goldLt); color: var(--goldDk); }
.bx-retard { font-size: var(--fs-xs); color: var(--rougeDk); font-weight: 600; }
.bx-suivi { font-size: var(--fs-xs); color: var(--ink3); }
/* LA LECTURE EN POINTS, sur la ligne : trois au plus, et elle s'enroule
   plutot que de pousser la ligne. */
.bx-lect-c { display: flex; gap: var(--sp-1); flex-wrap: wrap; }
.bx-lect-c .bx-pt { font-size: var(--fs-xs); padding: 1px var(--sp-2); }
.bx-lect-c .bx-pt.plus { background: var(--cream2); color: var(--warm); }
/* Les closes : un lien en pied, et leur propre en-tete quand on y est. */
.bx-closes-t { display: flex; align-items: center; gap: var(--sp-3);
  flex-wrap: wrap; margin-bottom: var(--sp-3); }
.bx-closes-l { margin: var(--sp-4) 0 0; }
.bx-puces .bx-vig { width: 22px; height: 22px; margin-right: var(--sp-1); }

@media (max-width: 860px) {
  /* LA TETE S'EMPILE. Cote a cote a 390 px, le nom, le compte et « Sa
     fiche » ne laissent plus rien au nom - la maquette a ete dessinee a
     1440 pour une souris, et c'est la meme dette a chaque lot. */
  .bx-an-tete { align-items: flex-start; }
  .bx-an-id { flex: 1 0 60%; }
  .bx-an .bx-an-pub { flex: 1 0 100%; }
}

@media (max-width: 860px) {
  /* L'ETAT ET LES GESTES PASSENT SOUS LA PIECE. Cote a cote a 390 px, il ne
     reste rien au titre de la piece - la maquette a ete dessinee a 1440 pour
     une souris, et c'est la meme dette a chaque lot. */
  .dr-l { align-items: flex-start; }
  .dr .fc-q { flex: 1 0 70%; }
  .dr-etat, .dr-g { flex: 1 0 100%; }
}

/* LES GESTES D'UNE LIGNE (26/09/2026, maquette du 23/09).
   -----------------------------------------------------------------------
   Deux pastilles et un menu, dans la liste des animaux. Elles disent un
   ETAT et ouvrent un geste : le dore dit « il reste quelque chose a
   faire », jamais le rouge - l'annonce est diffusee pendant ce temps, et
   c'est la meme nuance que « a confirmer » porte depuis le 25/09. */
.an-chips { display: flex; flex-wrap: wrap; gap: var(--sp-1);
  margin-top: var(--sp-1); }
.an-chip { display: inline-flex; align-items: center; gap: var(--sp-1);
  font-family: var(--ff-mono); font-size: var(--fs-xs);
  border-radius: var(--r-pill); padding: 2px var(--sp-2);
  border: 1px solid transparent; background: var(--cream2); color: var(--warm); }
.an-chip.ok { background: var(--greenLt); color: var(--greenDk); }
.an-chip.alerte, .an-chip.manque { background: var(--goldLt); color: var(--goldDk); }
/* UN BOUTON SE TOUCHE. La pastille reste petite a l'oeil - c'est une
   etiquette dans un tableau dense - et sa CIBLE fait la taille exigee :
   c'est ce que le champ de fichier du 18/09 a appris, ou corriger la seule
   boite aurait fait passer l'audit sans agrandir ce que le doigt atteint. */
button.an-chip { cursor: pointer; min-height: var(--cible);
  border-color: var(--goldLt); }
button.an-chip.ok { border-color: var(--greenLt); }
button.an-chip:hover { border-color: currentColor; }
.an-chip-f { font-size: var(--fs-xs); opacity: .7; }
.an-geste { white-space: nowrap; text-align: right; }
.an-plus { min-width: var(--cible); min-height: var(--cible);
  border: 0; background: none; cursor: pointer; color: var(--warm);
  border-radius: var(--r-sm); letter-spacing: .12em; }
.an-plus:hover { background: var(--cream2); color: var(--ink); }
.ga-pied .an-plus { margin-left: auto; }

/* LE PANNEAU ANCRE. Il vit dans le BODY : le tableau defile dans sa boite
   (`.defile`), et un panneau pose dedans y serait coupe. */
.pop { position: fixed; z-index: 40; min-width: 18rem; max-width: 24rem;
  background: var(--paper); border: var(--tr); border-radius: var(--r-md);
  box-shadow: var(--sh-2); padding: var(--sp-3); }
.pop-t { margin: 0 0 var(--sp-2); font-weight: 600; color: var(--ink); }
.pop-l { display: flex; align-items: center; justify-content: space-between;
  gap: var(--sp-2); flex-wrap: wrap; padding: var(--sp-1) 0; }
.pop-l + .pop-l { border-top: var(--tr); }
.pop-l-t { flex: 1 1 8rem; font-size: var(--fs-sm); color: var(--ink2); }
.pop-ou { font-size: var(--fs-xs); color: var(--warm); font-style: italic; }
.pop-b { min-height: var(--cible); padding: 0 var(--sp-3);
  border: var(--tr); border-radius: var(--r-sm); background: var(--cream);
  cursor: pointer; font-size: var(--fs-sm); }
.pop-b:hover { background: var(--cream2); }
.pop-ok { margin: 0; color: var(--greenDk); font-size: var(--fs-sm); }
.pop-msg { margin: var(--sp-2) 0 0; font-size: var(--fs-xs); min-height: 1em; }
/* Le menu : des lignes pleine largeur, pas des boutons cote a cote. */
.pop-menu { min-width: 14rem; padding: var(--sp-1); }
.an-menu { display: flex; flex-direction: column; }
.an-menu button { min-height: var(--cible); text-align: left;
  border: 0; background: none; cursor: pointer; padding: 0 var(--sp-3);
  border-radius: var(--r-sm); font-size: var(--fs-sm); color: var(--ink2); }
.an-menu button:hover { background: var(--cream2); color: var(--ink); }
.an-menu button.fort { color: var(--terraDk); font-weight: 600; }

/* LE PANNEAU PREND LA LARGEUR DE L'ECRAN, moins ses gouttieres, quand il
   n'y a plus la place de l'ancrer : ancre sous une pastille a 360 px, il
   sortait par la droite. C'est le SCRIPT qui pose la classe apres avoir
   mesure, parce que c'est lui qui ecrit `left` en ligne - une regle de
   media devrait alors le battre a coups de `!important`, et la maquette a
   montre ou mene cette surenchere (quatre declarations contradictoires
   pour une seule barre). */
.pop.pop-large { left: var(--sp-2); right: var(--sp-2);
  min-width: 0; max-width: none; width: auto; }

/* LA FRISE PASSE A DEUX RANGS AU TELEPHONE (26/09/2026).
   Quatre colonnes egales font 64 px a 360 px : aucun libelle de deux mots
   n'y tient, dans aucune langue - « Herinnering aan uw organisatie » et
   « Platz der Familie freigegeben » sortaient de leur boite de deux a
   quatre pixels. Ce n'est pas la traduction qui est trop longue, c'est la
   colonne qui est trop etroite : la maquette a ete dessinee a 1440 pour
   une souris, et c'est la meme dette a chaque lot. */
@media (max-width: 560px) {
  .bx-frise { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

/* SANTE DE MES DONNEES (maquette du 22/09/2026).
   -----------------------------------------------------------------------
   Le verdict est un bloc d'encre : c'est la premiere chose qu'on lit, et un
   titre sombre sur creme n'a aucun moment a lui - meme raison que le bloc de
   tete de la carte du Coup de Patte (19/09). Sur l'encre, l'accent n'est pas
   le meme : `--terra` tombe a 2,3 de contraste, donc c'est `--terraLt` qui
   porte l'etiquette. */
.sd-verdict { display: grid; grid-template-columns: auto minmax(0, 1fr);
  gap: var(--sp-3) var(--sp-5); align-items: center;
  background: var(--ink); color: var(--surInk); border-radius: var(--r-lg);
  padding: var(--sp-5); }
.sd-score { position: relative; width: 96px; height: 96px; grid-row: 1 / span 2; }
.sd-score svg { width: 100%; height: 100%; transform: rotate(-90deg); }
.sd-score circle { fill: none; stroke-width: 3.2; }
.sd-score .fond { stroke: var(--inkSur); }
.sd-score .arc { stroke: var(--greenLt); stroke-linecap: round;
  transition: stroke-dasharray var(--t-long) var(--e); }
.sd-verdict.or .sd-score .arc { stroke: var(--goldLt); }
.sd-verdict.rouge .sd-score .arc { stroke: var(--terraLt); }
.sd-score b { position: absolute; inset: 0; display: flex;
  align-items: center; justify-content: center; font-family: var(--ff-titre);
  font-size: var(--fs-2xl); font-weight: 600; color: var(--surInk); }
.sd-score small { font-size: var(--fs-sm); margin-left: 2px;
  color: var(--surInk2); }
.sd-vl { font-family: var(--ff-mono); font-size: var(--fs-xs);
  letter-spacing: .12em; text-transform: uppercase; color: var(--terraLt); }
.sd-vtxt h2 { margin: 4px 0 6px; font-size: var(--fs-xl); line-height: 1.15;
  color: var(--surInk); }
.sd-vtxt p { margin: 0; font-size: var(--fs-sm); color: var(--surInk2);
  line-height: 1.5; max-width: var(--mesure); }
.sd-chiffres { display: flex; gap: var(--sp-2); flex-wrap: wrap; }
/* UN CHIFFRE SE TOUCHE quand il mene quelque part. `min-height` sur le
   bouton lui-meme : c'est ce que le doigt atteint, et la lecon du champ de
   fichier du 18/09 est qu'une boite agrandie sans sa cible passe l'audit
   sans rien corriger. */
.sd-ch { display: flex; flex-direction: column; gap: 1px;
  background: var(--inkSur); border: 0; border-radius: var(--r-md);
  padding: 10px 16px; min-height: var(--cible); color: var(--surInk);
  cursor: pointer; font: inherit; text-align: left; }
.sd-ch:hover { background: var(--inkChoisi); }
.sd-ch.muet { cursor: default; }
.sd-ch.muet:hover { background: var(--inkSur); }
.sd-ch b { font-family: var(--ff-titre); font-size: var(--fs-xl);
  line-height: 1; }
.sd-ch b.vert { color: var(--greenLt); }
.sd-ch b.or { color: var(--goldLt); }
.sd-ch b.rouge { color: var(--terraLt); }
.sd-ch span { font-size: var(--fs-xs); color: var(--surInk2); }

.sd-bloc { display: flex; flex-direction: column; gap: var(--sp-3);
  margin-top: var(--sp-5); }
.sd-bt { display: flex; align-items: baseline; gap: var(--sp-3);
  flex-wrap: wrap; }
.sd-bt h3 { margin: 0; font-family: var(--ff-titre); font-size: var(--fs-lg); }
.sd-bt span { font-size: var(--fs-sm); color: var(--warm); }
.sd-sources { display: grid;
  grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
  gap: var(--sp-3); }
.sd-src { background: var(--paper); border: var(--tr);
  border-radius: var(--r-md); padding: var(--sp-4); display: flex;
  flex-direction: column; gap: var(--sp-2); box-shadow: var(--sh-1); }
.sd-src.silence { border-color: var(--rougeBord); }
.sd-src.retarde { border-color: var(--gold); }
.sd-src-t { display: flex; align-items: flex-start; gap: var(--sp-2); }
.sd-src-t > div { flex: 1; min-width: 0; display: flex;
  flex-direction: column; gap: 2px; }
.sd-src-t b { font-size: var(--fs-base); font-weight: 600; color: var(--ink); }
.sd-src-s { font-size: var(--fs-xs); color: var(--warm); }
.sd-src .point { width: 10px; height: 10px; border-radius: var(--r-circle);
  flex: none; margin-top: 6px; background: var(--green); }
.sd-src.retarde .point { background: var(--gold); }
.sd-src.silence .point { background: var(--rouge); }
.sd-src .etat { flex: none; font-size: var(--fs-xs); font-weight: 600;
  border-radius: var(--r-xs); padding: 3px 9px; background: var(--greenLt);
  color: var(--greenDk); }
.sd-src.retarde .etat { background: var(--goldLt); color: var(--goldDk); }
.sd-src.silence .etat { background: var(--rougeLt); color: var(--rougeDk); }
/* LA SEMAINE EN TROIS ETATS. « Rien » n'est pas « echec » : une nuit sans
   passe se dessine en creux, pas en rouge - accuser une source qui va tres
   bien serait pire que ne rien montrer. */
.sd-jours { display: flex; align-items: center; gap: var(--sp-2);
  flex-wrap: wrap; }
.sd-jours > span { font-family: var(--ff-mono); font-size: var(--fs-xs);
  color: var(--warm); letter-spacing: .06em; text-transform: uppercase; }
.sd-j { display: flex; gap: 4px; }
.sd-j i { width: 18px; height: 8px; border-radius: var(--r-xs);
  background: var(--green); display: block; }
.sd-j i.echec { background: var(--rouge); }
.sd-j i.rien { background: var(--cream3); }
.sd-src-q { margin: 0; font-size: var(--fs-sm); color: var(--ink2); }
/* LES GESTES D'UNE SOURCE QUI NE REPOND PLUS. Ils s'enroulent : a
   360 px, deux boutons cote a cote debordent de leur carte. */
.sd-gestes{display:flex;flex-wrap:wrap;gap:var(--sp-2);
  margin-top:var(--sp-2)}
.sd-gestes>*{min-height:var(--cible)}
/* Un `<a>` stylé en bouton ne centre pas son texte tout seul. */
.sd-gestes a{display:inline-flex;align-items:center;
  justify-content:center;text-decoration:none}
.sd-dit { margin: 0; font-size: var(--fs-sm); color: var(--warm);
  line-height: 1.5; padding-top: var(--sp-2); border-top: var(--tr-clair); }

.sd-annonces { list-style: none; margin: 0; padding: 0;
  background: var(--paper); border: var(--tr); border-radius: var(--r-md);
  overflow: hidden; box-shadow: var(--sh-1); }
.sd-a { display: flex; align-items: center; gap: var(--sp-3);
  padding: 10px var(--sp-4); border-top: var(--tr-clair); flex-wrap: wrap; }
.sd-a:first-child { border-top: 0; }
.sd-a-v { width: 40px; height: 40px; border-radius: var(--r-sm);
  background: var(--cream2); flex: none; overflow: hidden; display: flex;
  align-items: center; justify-content: center; }
.sd-a-v img.picto { width: 28px; height: 28px; object-fit: contain; }
.sd-a-t { display: flex; flex-direction: column; gap: 1px;
  flex: 0 1 180px; min-width: 120px; }
.sd-a-t b { font-weight: 600; color: var(--ink); }
.sd-a-t span { font-size: var(--fs-xs); color: var(--warm); }
.sd-a-m { display: flex; gap: 6px; flex-wrap: wrap; flex: 1 1 200px; }
.sd-m { font-size: var(--fs-xs); font-weight: 600;
  border-radius: var(--r-pill); padding: 3px 10px; background: var(--goldPale);
  color: var(--goldDk); white-space: nowrap; }
/* CE QUI EMPECHE DE PUBLIER SE VOIT AUTREMENT. L'ordre des defauts est
   celui de l'effet (`orgs.CORRECTIONS`) ; la couleur le redit a l'oeil. */
.sd-m.mentions { background: var(--rougeLt); color: var(--rougeDk); }
.sd-m.photo { background: var(--cream2); color: var(--ink2); }
.sd-a-b { padding: 7px 14px; font-size: var(--fs-xs);
  min-height: var(--cible); flex: none; }
.sd-a-ou { font-size: var(--fs-xs); color: var(--warm); font-style: italic;
  flex: none; }

.sd-dbl { background: var(--paper); border: 1px solid var(--rougeBord);
  border-radius: var(--r-md); padding: var(--sp-4); display: flex;
  flex-direction: column; gap: var(--sp-2); }
.sd-dbl > b { font-family: var(--ff-titre); font-size: var(--fs-md); }
.sd-dbl > span { font-size: var(--fs-xs); color: var(--warm);
  margin-top: -6px; }
.sd-dbl-2 { display: grid;
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  gap: var(--sp-3); }
.sd-dbl-2 > div { background: var(--cream); border-radius: var(--r-sm);
  padding: 10px 12px; display: flex; flex-direction: column; gap: 2px; }
.sd-dbl-s { font-weight: 600; font-size: var(--fs-sm); }
.sd-dbl-q { font-size: var(--fs-xs); color: var(--warm); }
.sd-dbl .note { margin: 0; }
.sd-pourquoi { margin-top: var(--sp-5); }
.sd-pourquoi summary { font-size: var(--fs-sm); color: var(--warm);
  cursor: pointer; min-height: var(--cible); display: flex;
  align-items: center; }
.sd-pourquoi .note { margin-top: var(--sp-1); }

/* AU TELEPHONE, LE SCORE PASSE AU-DESSUS. Deux colonnes dont la premiere
   fait 96 px ne laissent pas de quoi ecrire un verdict a 360 px : le titre
   se cassait en quatre lignes. */
@media (max-width: 560px) {
  .sd-verdict { grid-template-columns: minmax(0, 1fr); }
  .sd-score { grid-row: auto; }
}

/* LA PART DE COMPLETUDE D'UNE LIGNE (maquette du 22/09/2026).
   -----------------------------------------------------------------------
   Une barre et un rapport, pas une note : « 4/6 » se lit, « 67 % » se
   compare. Le remplissage est pose en variable par le script parce qu'il
   vient d'une DONNEE - c'est la seule frontiere que la regle du 19/09
   laisse a un style en ligne. */
.an-comp-cell { white-space: nowrap; }
.an-comp { display: inline-flex; align-items: center; gap: var(--sp-2);
  font-family: var(--ff-mono); font-size: var(--fs-xs); color: var(--warm); }
.an-comp i { display: block; width: 44px; height: 6px;
  border-radius: var(--r-xs); background: var(--cream3); position: relative;
  overflow: hidden; }
/* LE REMPLISSAGE EST UN VRAI ELEMENT, pas un `::after` : sa largeur
   vient d'une DONNEE, et un pseudo-element ne se style pas en ligne.
   Passer par une variable `--p` aurait demande de declarer un faux
   jeton dans `tokens.css` pour satisfaire la garde - c'est-a-dire
   ranger une valeur d'execution parmi les decisions de design. */
.an-comp i b { display: block; height: 100%; background: var(--gold);
  border-radius: var(--r-xs); }
.an-comp.ok i b { background: var(--green); }
.an-comp.ok { color: var(--greenDk); }

/* LE PANNEAU DES FAMILLES. Il est plus etroit que celui des manques : il
   ne porte que des noms de communes et des delais. */
/* ANCREE SUR `.pop` A DESSEIN : ce n'est pas un composant, c'est une
   VARIANTE du panneau, et elle n'existe jamais sans lui. Ecrite seule,
   une classe qui impose une largeur maximale atteint tout ce qui
   portera ce nom un jour - c'est le `footer{max-width:76ch}` qui a
   rogne une barre d'action de fiche. */
.pop.pop-liste { min-width: 16rem; max-width: 20rem; }
.pop-fam { gap: var(--sp-3); }
.pop-tout { width: 100%; justify-content: center; margin-top: var(--sp-2);
  border-top: var(--tr); border-radius: 0 0 var(--r-sm) var(--r-sm); }

/* CE QU'IL PREND, sur la carte de la galerie. Discret : c'est un fait de
   plus, pas une alerte - un traitement en cours n'est pas un probleme, et
   le peindre en rouge ferait hesiter une famille pour rien. */
.ga-soin { margin: 0; padding: 0 var(--sp-3) var(--sp-2); font-size: var(--fs-xs);
  color: var(--warm); line-height: 1.4; }
.ga-pied .an-comp { margin-right: auto; }

/* ===================================================================== */
/* LA DECISION DIT CE QU'ELLE DECLENCHE (27/09/2026)                     */
/*                                                                       */
/* Deux panneaux qui s'ouvrent AVANT un geste irreversible : ce que      */
/* « retenir » declenche, et ce que la famille lira d'un refus. Ils ne   */
/* sont ni une alerte ni une reussite - ils enoncent un fait -, donc ni  */
/* rouge ni vert : un encadre creme, et le trait d'encre qui dit         */
/* « lisez ceci avant ».                                                 */
/* ===================================================================== */
.bx-conf, .bx-refus { margin: 0 0 var(--sp-3); padding: var(--sp-3);
  border-left: var(--tr-fort); border-left-color: var(--ink);
  border-radius: 0 var(--r-md) var(--r-md) 0; background: var(--cream);
  flex: 1 1 100%; }
.bx-conf-t { display: block; margin: 0 0 var(--sp-2); color: var(--ink); }
.bx-conf-l { margin: 0; padding-left: var(--sp-5); }
/* Pas de retenue sans telephone (13/10/2026) : la boite le demande sur place. */
.bx-tel-manque { display: flex; flex-direction: column; gap: var(--sp-2); margin: 0 0 var(--sp-3); }
.bx-tel { display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-2); }
.bx-tel label { font-size: var(--fs-sm); }
.bx-tel input { flex: 1 1 12rem; min-height: var(--cible); }
.bx-conf-l li { margin: 0 0 var(--sp-1); line-height: 1.45; }
.bx-conf-n { margin: var(--sp-2) 0 0; font-size: var(--fs-sm);
  color: var(--ink2); line-height: 1.45; }

/* CE QUE LA FAMILLE LIRA. La phrase est au-dessus des motifs, pas en
   dessous : on la lit AVANT de choisir, sinon elle ne sert a rien. */
/* ANCRE SUR SON PANNEAU : `test_style` refuse un selecteur nu qui impose
   une largeur maximale, et il a raison - cette phrase ne met en page
   qu'elle-meme, dans le panneau de refus et nulle part ailleurs. */
/* LES DEUX PANNEAUX LA PORTENT : avant de choisir un motif de refus, et
   avant de retenir. L'ancre reste - `test_style` refuse un selecteur nu
   qui impose une largeur maximale, et il a raison : cette phrase ne met
   en page qu'elle-meme. */
.bx-refus .bx-lira, .bx-conf .bx-lira { margin: var(--sp-2) 0 0;
  font-size: var(--fs-sm); color: var(--ink2); line-height: 1.5;
  max-width: var(--mesure); }
.bx-refus .bx-lira b, .bx-conf .bx-lira b { color: var(--ink); }
.bx-motifs { display: flex; flex-wrap: wrap; gap: var(--sp-2);
  margin: 0 0 var(--sp-2); }
/* UN MOTIF EST UN BOUTON, plus une ligne de liste deroulante : derouler
   une liste pour LIRE les motifs suffisait a refuser la famille. */
.bx-motif { min-height: var(--cible); padding: 0 var(--sp-3);
  border: var(--tr); border-radius: var(--r-pill); background: var(--paper);
  color: var(--ink); font: inherit; font-size: var(--fs-sm);
  text-align: left; cursor: pointer; }
.bx-motif:hover { border-color: var(--terra); color: var(--terraDk); }
.bx-motif:focus-visible { outline: var(--focus); outline-offset: 2px; }

/* La regle se replie : elle explique les trois gestes, et elle n'a pas a
   occuper la place a chaque ouverture d'une candidature. */
.bx-regle { margin: var(--sp-3) 0 0; }
.bx-regle summary { min-height: var(--cible); display: flex;
  align-items: center; font-size: var(--fs-sm); color: var(--ink2);
  cursor: pointer; }
.bx-regle p { margin: 0 0 var(--sp-2); max-width: var(--mesure); }

/* LA BOITE DE RECEPTION PLEINE LARGEUR (comparaison a la maquette du
   11/10/2026) : quatre chiffres en tete, une rangee de pastilles par
   animal, puis une carte par animal sur toute la largeur - le dossier
   d'une famille se deplie dessous (`.bx-seul`) quand on la choisit. */
.kpis { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr));
  margin: var(--sp-1) 0 var(--sp-5); border-top: 2px solid var(--ink);
  border-bottom: var(--tr); }
.kpi { display: flex; flex-direction: column; align-items: flex-start;
  gap: var(--sp-1); padding: var(--sp-4); min-width: 0; }
.kpi:first-child { padding-left: 0; }
.kpi:last-child { padding-right: 0; }
.kpi + .kpi { border-left: var(--tr); }
.kpi-l { font-family: var(--ff-mono); font-size: var(--fs-xs);
  letter-spacing: .1em; text-transform: uppercase; color: var(--warm); }
.kpi-v { display: flex; align-items: baseline; flex-wrap: wrap;
  gap: var(--sp-1) var(--sp-2); }
.kpi-n { font-family: var(--ff-titre); font-size: var(--fs-4xl);
  font-weight: 700; line-height: 1; }
.kpi-note { font-size: var(--fs-sm); color: var(--ink3); }
.kpi-note.alerte { color: var(--terraDk); font-weight: 600; }
.kpi-jauge { display: flex; align-items: center; gap: var(--sp-2);
  font-size: var(--fs-sm); color: var(--ink3); }
.kpi-j { display: block; width: 70px; height: 6px; border-radius: var(--r-pill);
  background: var(--cream3); overflow: hidden; flex: none; }
.kpi-j span { display: block; height: 100%; background: var(--green); }
.kpi-a { margin-top: auto; padding: 0; border: 0; background: none; font: inherit;
  font-size: var(--fs-sm); font-weight: 600; color: var(--terraDk); cursor: pointer;
  min-height: var(--cible); display: inline-flex; align-items: center;
  text-decoration: none; text-align: left; }
.kpi-a:hover { color: var(--ink); text-decoration: underline; }
@media (max-width: 1000px) {
  .kpis { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .kpi:nth-child(odd) { padding-left: 0; border-left: 0; }
  .kpi:nth-child(even) { padding-right: 0; }
  .kpi:nth-child(n+3) { border-top: var(--tr); }
}
@media (max-width: 560px) {
  .kpis { grid-template-columns: minmax(0, 1fr); }
  .kpi { padding: var(--sp-3) 0; border-left: 0; }
  .kpi + .kpi { border-top: var(--tr); }
}

/* Les pastilles d'animaux : une rangee compacte, chacune avec son visage. */
.bxp-barre { display: flex; flex-wrap: wrap; align-items: center;
  gap: var(--sp-1); margin: 0 0 var(--sp-4); }
.bxp { font: inherit; display: inline-flex; align-items: center; gap: var(--sp-2);
  min-height: var(--cible); padding: 0 var(--sp-3); border-radius: var(--r-pill);
  border: 1px solid transparent; background: none; color: var(--ink2);
  font-size: var(--fs-sm); cursor: pointer; }
.bxp.a-vig { padding-left: var(--sp-1); }
.bxp:hover { background: var(--cream); }
.bxp[aria-pressed="true"] { background: var(--ink); color: var(--paper);
  border-color: var(--ink); }
.bxp .bx-vig { width: 28px; height: 28px; border-radius: var(--r-circle); }
.bxp-t { font-weight: 600; white-space: nowrap; }
.bxp-c { font-size: var(--fs-xs); color: var(--ink3); }
.bxp[aria-pressed="true"] .bxp-c { color: inherit; }
.bxp-sep { width: 1px; height: 20px; background: var(--cream3); margin: 0 var(--sp-1); }
.bxp-plus { position: relative; }
.bxp-plus > summary { list-style: none; cursor: pointer; display: inline-flex;
  align-items: center; gap: var(--sp-1); min-height: var(--cible);
  padding: 0 var(--sp-3); border-radius: var(--r-pill); color: var(--ink2);
  font-size: var(--fs-sm); }
.bxp-plus > summary::-webkit-details-marker { display: none; }
.bxp-plus > summary:hover, .bxp-plus[open] > summary { background: var(--cream); }
.bxp-plus.on > summary { background: var(--ink); color: var(--paper); }
.bxp-plus i { font-style: normal; font-size: var(--fs-xs); }
.bxp-plus .bxp-m { position: absolute; z-index: var(--z-voile); top: calc(100% + var(--sp-1));
  left: 0; min-width: 200px; padding: var(--sp-1); border-radius: var(--r-md);
  background: var(--paper); border: var(--tr); box-shadow: var(--sh-2);
  display: grid; gap: 2px; }
.bxp-plus .bxp-m .bxp { justify-content: flex-start; }
.bxp-plus .bxp-m .bxp-c { margin-left: auto; }

/* Les cartes, pleine largeur : le compte se pose a cote du nom. */
.bx-animaux { display: flex; flex-direction: column; gap: var(--sp-4); }
.bx-animaux .bx-an { box-shadow: var(--sh-1); }
.bx-animaux .bx-an-n { flex: 1 1 auto; }
.bx-an-f { display: flex; align-items: center; gap: var(--sp-2) var(--sp-3);
  flex-wrap: wrap; padding: var(--sp-2) var(--sp-4); }
.bx-an-f.on { background: var(--cream2); box-shadow: inset 3px 0 0 var(--terra); }
.bx-an-qui { flex: 1 1 260px; min-width: 0; display: flex; align-items: center;
  gap: var(--sp-3); text-align: left; background: none; border: 0; padding: 0;
  font: inherit; color: var(--ink); cursor: pointer; min-height: var(--cible); }
.bx-an-qui:hover b { text-decoration: underline; }
.bx-an-txt { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.bx-an-qui .bx-l1 { display: flex; flex-wrap: wrap; align-items: center;
  gap: var(--sp-1) var(--sp-2); }
.bx-an-qui .bx-l3 { font-size: var(--fs-xs); color: var(--warm); }
.bx-av-f { flex: none; width: 32px; height: 32px; border-radius: var(--r-circle);
  display: inline-flex; align-items: center; justify-content: center;
  background: var(--cream2); color: var(--ink2); font-family: var(--ff-titre);
  font-weight: 600; }
.bx-gi { display: flex; align-items: center; gap: var(--sp-2); flex-wrap: wrap;
  margin-left: auto; }
.bx-gi .lien { background: none; border: 0; color: var(--terraDk); cursor: pointer;
  font: inherit; font-size: var(--fs-sm); text-decoration: underline;
  min-height: var(--cible); padding: 0 var(--sp-1); }
.bx-seul { margin-top: var(--sp-4); }
/* Le type de compte a l'inscription (20/10/2026, maquette du 10/10). */
.segments { border: 0; padding: 0; margin: 0 0 var(--sp-4); min-width: 0; }
.segments legend { font-size: var(--fs-base); color: var(--ink2); font-weight: 600;
  padding: 0; margin-bottom: var(--sp-2); }
.segments .seg-type { display: flex; gap: var(--sp-3); align-items: flex-start;
  border: var(--tr-fort); border-radius: var(--r-md); padding: var(--sp-3) var(--sp-4);
  margin-bottom: var(--sp-2); cursor: pointer; background: var(--paper);
  min-height: var(--cible); }
.segments .seg-type:hover { border-color: var(--terra); }
.segments .seg-type:has(input:checked) { border-color: var(--terra); background: var(--cream); }
.segments .seg-type input { margin-top: var(--sp-1); accent-color: var(--terra); }
.segments .seg-type b { display: block; color: var(--ink); font-size: var(--fs-base); }
.segments .seg-type small { display: block; color: var(--ink3); font-size: var(--fs-sm); }
/* Un geste et « Decider ▾ » (19/10/2026, maquette du 02/10). Le menu se pose
   sous la fleche, au-dessus de la ligne suivante. */
.bx-menu-w { position: relative; display: inline-flex; }
.bx-plus { min-height: var(--cible); min-width: var(--cible); padding: 0 var(--sp-2);
  border: var(--tr); border-radius: var(--r-pill); background: var(--paper);
  color: var(--ink); font: inherit; font-size: var(--fs-sm); cursor: pointer; }
.bx-plus[aria-expanded="true"] { border-color: var(--ink); }
.bx-menu-w .bx-menu { position: absolute; right: 0; top: calc(100% + var(--sp-1)); z-index: 5;
  display: flex; flex-direction: column; min-width: 15rem; padding: var(--sp-2);
  background: var(--paper); border: var(--tr); border-radius: var(--r-md);
  box-shadow: var(--sh-2); }
.bx-menu-w .bx-menu[hidden] { display: none; }
.bx-menu-t { font-size: var(--fs-xs); color: var(--warm); padding: var(--sp-1) var(--sp-2); }
.bx-mi { text-align: left; background: none; border: 0; font: inherit; color: var(--ink);
  min-height: var(--cible); padding: 0 var(--sp-2); border-radius: var(--r-sm); cursor: pointer; }
.bx-mi:hover, .bx-mi:focus-visible { background: var(--cream2); }
.bx-mi.danger { color: var(--rougeDk); }
.bx-plein { font-size: var(--fs-sm); color: var(--warm); }
/* Une famille retenue : ses coordonnees, l'etape, et la suite. */
.bx-gi-ret { gap: var(--sp-2) var(--sp-3); }
.bx-coord summary { cursor: pointer; min-height: var(--cible); display: inline-flex;
  align-items: center; gap: var(--sp-1); font-size: var(--fs-sm); color: var(--terraDk); }
.bx-coord-l { display: flex; flex-wrap: wrap; gap: var(--sp-1) var(--sp-3);
  font-size: var(--fs-sm); padding-bottom: var(--sp-2); }
.bx-coord-l a { display: inline-flex; align-items: center; min-height: var(--cible); }
.bx-etape { font-size: var(--fs-sm); color: var(--ink2); }
.bx-etape.fort { color: var(--ink); font-weight: 600; }
.bx-etape.rouge { color: var(--rougeDk); font-weight: 600; }
@media (max-width: 640px) {
  .bx-gi { margin-left: 0; flex: 1 1 100%; }
}
.bx-animaux .bx-an-id { flex: 0 1 auto; }
/* Le detail deplie sous les cartes prend toute la largeur : la grille a
   deux colonnes de `.bx` (liste + detail) ne vaut plus ici. */
.bx.bx-seul { grid-template-columns: minmax(0, 1fr); }

/* EQUIPE (maquette du 23/09/2026, portee le 12/10/2026) : l'invitation
   s'ouvre depuis l'en-tete, les gestes sur une personne vivent dans un menu,
   le journal se replie. */
.eq-tete > div { min-width: 0; }
.eq-tete .note { margin: var(--sp-1) 0 0; }
.eq-liste { margin-top: var(--sp-3); }
.eq-act { position: relative; }
.eq-act > summary { list-style: none; cursor: pointer; display: inline-flex;
  align-items: center; gap: var(--sp-1); min-height: var(--cible);
  padding: 0 var(--sp-3); border: var(--tr); border-radius: var(--r-pill);
  font-size: var(--fs-sm); color: var(--ink); background: var(--paper); }
.eq-act > summary::-webkit-details-marker { display: none; }
.eq-act > summary i { font-style: normal; font-size: var(--fs-xs); }
.eq-act > .eq-act-m { position: absolute; right: 0; top: calc(100% + var(--sp-1));
  z-index: 20; min-width: 220px; padding: var(--sp-2); display: grid; gap: 2px;
  background: var(--paper); border: var(--tr); border-radius: var(--r-md);
  box-shadow: var(--sh-2); }
.eq-act-m button { appearance: none; border: 0; background: none; font: inherit;
  font-size: var(--fs-sm); color: var(--ink); text-align: left;
  min-height: var(--cible); padding: 0 var(--sp-3); border-radius: var(--r-sm);
  cursor: pointer; }
.eq-act-m button:hover { background: var(--cream); }
.eq-act-m .eq-act-retirer { color: var(--rougeDk); }
.eq-journal-c > summary { list-style: none; cursor: pointer; display: flex;
  flex-wrap: wrap; align-items: baseline; gap: var(--sp-1) var(--sp-3); }
.eq-journal-c > summary::-webkit-details-marker { display: none; }
.eq-journal-c > summary h2 { margin: 0; }

/* La ligne d'une personne se lit comme du texte (maquette du 23/09) ; et
   un repli dit qu'il s'ouvre. */
.eq-liste .eq-mail { font-family: var(--ff-corps); font-size: var(--fs-sm); color: var(--warm); }
.rx-interdits > summary::after { content: "▾"; margin-left: var(--sp-2);
  color: var(--warm); font-size: var(--fs-sm); }
.rx-interdits[open] > summary::after { content: "▴"; }

/* Le telephone de la structure, en tete d'Equipe (maquette du 24/09/2026,
   portee le 12/10/2026) : une ligne, le champ qui s'ouvre sur place, et la
   ligne en rouge tant qu'il manque. */
.coord2{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-2) var(--sp-4);
  margin:0 0 var(--sp-4);padding:var(--sp-2) var(--sp-4);border-radius:var(--r-md);
  background:var(--paper);border:var(--tr);font-size:var(--fs-base)}
.coord2.vide{border-color:var(--rougeBord);background:var(--rougeLt)}
/* L'adresse peut etre longue, et son libelle aussi selon la langue : en
   `nowrap`, elle poussait la page a 385 px a 360 en neerlandais (audit
   du 14/10/2026). Elle passe a la ligne, l'adresse se coupe ou il faut. */
.coord2-t{flex:0 1 auto;min-width:0;overflow-wrap:anywhere}
.coord2-t b{margin-left:var(--sp-1);font-weight:700}
.coord2-i{flex:1 1 14rem;min-width:0;font-size:var(--fs-sm);color:var(--ink3)}
.coord2 .lien{flex:none;margin-left:auto;display:inline-flex;align-items:center;
  min-height:var(--cible)}
.coord2-f{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-2) var(--sp-3);width:100%}
.coord2-f label{font-weight:600}
.coord2-f input{font:inherit;font-size:var(--fs-champ);min-height:var(--cible);
  padding:0 var(--sp-3);border-radius:var(--r-sm);border:var(--tr-champ);
  background:var(--paper);width:12rem;max-width:100%}
.coord2-f .lien{margin-left:0}
.coord2-m{font-size:var(--fs-sm)}
.coord2-m:empty{display:none}

/* ---- lot A (19/10/2026) ---------------------------------------------------
   La pause riche, le motif d'un retrait, le journal d'equipe par jour, et
   la decision dans la comparaison. */
.pp-reprise,.pr-note{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-2) var(--sp-3);
  margin:var(--sp-2) 0}
.pp-reprise span,.pr-note span{font-weight:600}
.pp-reprise input,.pr-note input{font:inherit;font-size:var(--fs-champ);min-height:var(--cible);
  padding:0 var(--sp-3);border-radius:var(--r-sm);border:var(--tr-champ);background:var(--paper);
  max-width:100%}
.pr-note input{flex:1 1 14rem;min-width:0}
[data-retrait][aria-pressed="true"]{background:var(--ink);color:var(--paper)}
.eq-j-jour{font-family:var(--ff-titre);font-size:var(--fs-md);margin:var(--sp-4) 0 var(--sp-1);
  color:var(--ink)}
.eq-j-jour:first-letter{text-transform:uppercase}
.eq-j-cat{margin-left:auto;font-size:var(--fs-xs);color:var(--ink3);border:var(--tr);
  border-radius:var(--r-pill);padding:0 var(--sp-2)}
.eq-j-f{margin:var(--sp-2) 0}
.eq-j-f button span{color:var(--ink3);margin-left:var(--sp-1)}
/* Sur le filtre choisi (fond sombre), le compte suit la couleur du bouton. */
.eq-j-f button[aria-pressed="true"] span{color:inherit}
.bx-comp-g{display:flex;flex-wrap:wrap;gap:var(--sp-2);margin-top:var(--sp-3)}

/* ==========================================================================
   Le studio du Coup de Patte
   --------------------------------------------------------------------------
   UNE feuille pour UN ecran, servie par `/pro` ET par `/foyer`.

   Ces regles vivaient dans `pro.css`. Le script, lui, avait deja demenage
   dans `pb/front_studio.py` pour servir les deux cotes - et le studio de la
   famille s'affichait donc SANS AUCUN STYLE : vignettes en pleine taille,
   sections sans hierarchie, boutons nus (releve du 08/09/2026). Les tests
   de navigateur ne l'avaient pas vu : ils mesurent le debordement et la
   console, pas la mise en forme.

   Meme raison que `pb/front_studio.py` : recopier ces regles dans
   `foyer.css` aurait fait deux ecritures d'un meme ecran, et elles auraient
   diverge - c'est le piege des deux `:root`, pour la troisieme fois.

   Aucune valeur brute : les jetons sont dans `tokens.css`, et nulle part
   ailleurs.
   ========================================================================== */
/* Le Coup de Patte : confirmer les photos qu'on a le droit de diffuser.
   Des vignettes, toutes cochees, une seule phrase - pas une procedure
   (decision de Claire du 07/09/2026). */
.cdp { margin-top: var(--sp-5); padding-top: var(--sp-4);
       border-top: 1px solid var(--cream3); }
.cdp-sec { margin: var(--sp-4) 0 var(--sp-2); font-weight: 600;
           color: var(--ink2); }
.cdp-grille { display: flex; flex-wrap: wrap; gap: var(--sp-3); }
.cdp-vig { position: relative; display: inline-flex; flex-direction: column;
           align-items: center; gap: var(--sp-2); cursor: pointer; }
.cdp-vig img { width: 104px; height: 104px; object-fit: cover;
               border-radius: var(--r-md); border: 2px solid var(--cream3); }
.cdp-vig input { align-self: flex-start; }
.cdp-vig input:checked ~ img { border-color: var(--terra); }
.cdp-vig.prete img { border-color: var(--green); }
/* Les deux gestes d'une vignette prete - arreter la diffusion, supprimer la
   photo - tiennent sur une ligne et s'enroulent au telephone. La vignette
   est une colonne : sans cette regle ils s'empilaient et doublaient sa
   hauteur. */
.cdp-vig .gestes { display: flex; flex-wrap: wrap; gap: var(--sp-2);
                   justify-content: center; }
.cdp .cdp-phrase { margin: var(--sp-3) 0; max-width: 62ch; color: var(--ink2); }
.cdp .cdp-note { margin-top: var(--sp-3); font-size: var(--fs-sm);
            color: var(--warm); max-width: 62ch; }

/* Le tableau historique est partage avec l'administration. */
.cdp-hist { width: 100%; border-collapse: collapse; margin: var(--sp-3) 0; }
.cdp-hist td { padding: var(--sp-2) var(--sp-3); border-bottom: var(--tr); }

/* --------------------------------------------------------------------------
   La file de publication

   Le premier ecran ne demande plus de fabriquer ni de telecharger quoi que
   ce soit : une carte est prete a partager, les suivantes attendent
   calmement a cote. La marque vit une seule fois dans l'en-tete de page ;
   les détails restent dans la carte, sans second studio.
   -------------------------------------------------------------------------- */
.cdp-file { display: grid; grid-template-columns: minmax(0, 2fr) minmax(0, 1fr);
            gap: var(--sp-4); margin: var(--sp-4) 0; padding: var(--sp-4);
            border: var(--tr); border-radius: var(--r-lg);
            background: var(--cream); box-shadow: var(--sh-1); }
.cdp-file-heading { grid-column: 1 / -1; display: flex; flex-wrap: wrap;
                    align-items: flex-start; justify-content: space-between;
                    gap: var(--sp-3); }
.cdp-file-heading h2 { margin: 0; color: var(--ink); font-family: var(--ff-titre);
                       font-size: var(--fs-2xl); line-height: 1.1; }
.cdp-file-heading .aide { max-width: var(--mesure); margin: var(--sp-2) 0 0;
                          color: var(--ink2); }
.cdp-marque { display: inline-flex; align-items: center; gap: var(--sp-2);
              min-width: 0; color: var(--ink); }
.cdp-marque svg { flex: none; width: var(--sp-6); height: var(--sp-6);
                  color: var(--terra); }
.cdp-marque .brand { font-size: var(--fs-xl); }
.cdp-file-compteurs { display: inline-flex; flex-wrap: wrap; align-items: center;
                       min-height: var(--cible); padding: 0 var(--sp-3);
                       border: var(--tr); border-radius: var(--r-pill);
                       background: var(--paper); color: var(--ink2);
                       font-size: var(--fs-sm); max-width: 100%; text-align: center; }

/* La carte active est volontairement plus calme qu'un outil de creation :
   une image, une decision, un geste.

   L'aperçu est une vraie fenêtre sur le contenu qui sera partagé, pas un fond
   décoratif. `cover` étirait l'image verticale jusqu'à la hauteur des boutons,
   coupait le visage de l'animal et transformait la carte en un long couloir.
   Le cadre 4:5 garde une proportion sociale familière ; `contain` montre
   toujours le rendu entier, y compris son nom, son logo et son appel à l'action. */
.cdp-active { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.15fr);
              min-width: 0; overflow: hidden; border: var(--tr);
              border-radius: var(--r-md); background: var(--paper);
              box-shadow: var(--sh-1); }
.cdp-active-media { display: grid; place-items: center; align-self: center;
                    aspect-ratio: 4 / 5; overflow: hidden; background: var(--cream2); }
.cdp-active-media img { display: block; width: 100%; height: 100%;
                        min-height: 0; object-fit: contain; }
.cdp-active-candidat .cdp-active-media { aspect-ratio: 3 / 2; }
.cdp-active-media > .cdp-file-mini { width: 100%; height: 100%; min-height: 0;
                                     border-radius: 0; color: var(--terra);
                                     font-family: var(--ff-titre); font-size: var(--fs-sm); }
img.cdp-active-media { display: block; width: 100%; height: 100%;
                       aspect-ratio: 4 / 5; min-height: 0; object-fit: contain;
                       background: var(--cream2); }
.cdp-active-body { display: flex; flex-direction: column; align-items: flex-start;
                   min-width: 0; padding: var(--sp-5); }
.cdp-active-body h2, .cdp-active-body h3 { margin: 0; color: var(--ink);
                                           font-family: var(--ff-titre);
                                           font-size: var(--fs-2xl);
                                           line-height: 1.1; }
.cdp-active-body p { margin: var(--sp-2) 0 0; color: var(--ink2); }
.cdp-file-etat { display: inline-flex; align-items: center; gap: var(--sp-1);
                 margin-bottom: var(--sp-3); padding: var(--sp-1) var(--sp-2);
                 border-radius: var(--r-pill); background: var(--greenLt);
                 color: var(--greenDk); font-size: var(--fs-sm); font-weight: 600; }
.cdp-file-etat[data-etat="preparation"] { background: var(--goldLt);
                                           color: var(--goldDk); }
.cdp-file-etat[data-etat="attention"] { background: var(--rougeLt);
                                         color: var(--rougeDk); }
.cdp-file-meta { display: flex; flex-wrap: wrap; gap: var(--sp-2);
                 margin-top: var(--sp-3); color: var(--warm);
                 font-size: var(--fs-sm); }
.cdp-file-actions { display: flex; flex-wrap: wrap; gap: var(--sp-2);
                    align-items: center; margin-top: auto; padding-top: var(--sp-5); }
.cdp-file-actions > :first-child { display: inline-flex; align-items: center;
                                   justify-content: center; min-height: var(--cible);
                                   padding: 0 var(--sp-4); border: var(--tr);
                                   border-radius: var(--r-pill); background: var(--green);
                                   color: var(--paper); font-weight: 700;
                                   text-decoration: none; }
.cdp-file-actions > :first-child:hover:not([disabled]),
.cdp-file-actions > :first-child:focus-visible { background: var(--greenDk);
                                                  color: var(--paper); }
.cdp-file-actions > :not(:first-child) { display: inline-flex; align-items: center;
                                         justify-content: center; min-height: var(--cible);
                                         padding: 0 var(--sp-3); border: var(--tr);
                                         border-radius: var(--r-pill); background: var(--paper);
                                         color: var(--ink2); text-decoration: none; }
.cdp-file-actions > :not(:first-child):hover:not([disabled]),
.cdp-file-actions > :not(:first-child):focus-visible { background: var(--cream2);
                                                        color: var(--ink); }

/* Les reseaux sont des choix de destination, jamais un ecran de parametres. */
.cdp-reseaux { display: flex; flex-wrap: wrap; gap: var(--sp-2);
               margin-top: var(--sp-4); }
.cdp-reseau { display: inline-flex; align-items: center; justify-content: center;
              min-height: var(--cible); padding: 0 var(--sp-3); border: var(--tr);
              border-radius: var(--r-pill); background: var(--paper);
              color: var(--ink2); font-size: var(--fs-sm); font-weight: 600;
              cursor: pointer; }
.cdp-reseau:hover:not([disabled]), .cdp-reseau:focus-visible { background: var(--cream2);
                                                               color: var(--ink); }
.cdp-reseau[aria-pressed="true"] { border-color: var(--ink); background: var(--ink);
                                    color: var(--paper); }

/* A droite, les publications suivantes restent lisibles sans devenir une
   seconde liste de controles. */
.cdp-file-suite { display: flex; flex-direction: column; align-self: start;
                  gap: var(--sp-2); min-width: 0; padding-inline-start: var(--sp-4);
                  border-inline-start: var(--tr); }
.cdp-file-suite > h2, .cdp-file-suite > h3 { margin: 0 0 var(--sp-1);
                                             color: var(--ink2); font-size: var(--fs-sm);
                                             text-transform: uppercase; }
.cdp-file-item { display: grid; grid-template-columns: auto minmax(0, 1fr);
                 align-items: center; gap: var(--sp-3); padding: var(--sp-3);
                 border: var(--tr); border-radius: var(--r-sm); background: var(--paper); }
.cdp-file-item:hover { border-color: var(--terraLt); }
.cdp-file-mini { display: grid; place-items: center; width: var(--sp-6); height: var(--sp-6);
                 overflow: hidden; border-radius: var(--r-sm); background: var(--cream2);
                 color: var(--terra); }
.cdp-file-mini svg, .cdp-file-mini img { display: block; width: 100%; height: 100%;
                                         object-fit: cover; }
.cdp-file-item > span:last-child { min-width: 0; }
.cdp-file-item strong { display: block; overflow: hidden; color: var(--ink);
                        text-overflow: ellipsis; white-space: nowrap; }
.cdp-file-item small { display: block; margin-top: var(--sp-1); color: var(--warm);
                       font-size: var(--fs-sm); overflow-wrap: anywhere;
                       white-space: normal; }
.cdp-file-vide { grid-column: 1 / -1; padding: var(--sp-5); border: var(--tr);
                 border-style: dashed; border-radius: var(--r-md); background: var(--paper);
                 color: var(--ink2); text-align: center; }
.cdp-file-vide p { max-width: var(--mesure); margin: var(--sp-2) auto 0; }
.cdp-file-plus { display: inline-flex; align-items: center; min-height: var(--cible);
                 margin-top: var(--sp-2); padding: 0; border: 0; background: transparent;
                 color: var(--terraDk); font: inherit; font-weight: 600; cursor: pointer; }
.cdp-file-plus:hover, .cdp-file-plus:focus-visible { color: var(--ink); }
.cdp-file-options { margin-top: var(--sp-4); padding-top: var(--sp-3);
                    border-top: var(--tr-clair); color: var(--ink2); }
.cdp-file-options > summary { cursor: pointer; color: var(--ink2); font-size: var(--fs-sm); }

/* « Détails » se déplie sous la même carte : format, état, puis au besoin
   le seul geste exceptionnel — gérer les photos. */
.cdp-file-details { width: 100%; margin-top: var(--sp-3); padding-top: var(--sp-3);
                    border-top: var(--tr-clair); }
.cdp-file-details > .lab { margin: 0; }
.cdp-file-formats { display: grid; gap: var(--sp-2); margin: var(--sp-2) 0 var(--sp-3);
                    padding: 0; list-style: none; color: var(--ink2); }
.cdp-file-formats li { display: flex; flex-wrap: wrap; justify-content: space-between;
                       gap: var(--sp-2); }

/* Ce que le post dit en premier. Les pastilles reprennent exactement la
   forme des réseaux au-dessus : deux écritures d'un même contrôle finissent
   par se ressembler de moins en moins, et c'est le même geste. */
.cdp-file-details h3 { margin: var(--sp-4) 0 var(--sp-2); color: var(--ink);
                       font-size: var(--fs-base); }
.cdp-angles { display: flex; flex-wrap: wrap; gap: var(--sp-2); }
.cdp-angle { display: inline-flex; align-items: center; justify-content: center;
             min-height: var(--cible); padding: 0 var(--sp-3); border: var(--tr);
             border-radius: var(--r-pill); background: var(--paper);
             color: var(--ink2); font-size: var(--fs-sm); font-weight: 600;
             cursor: pointer; }
.cdp-angle:hover:not([disabled]), .cdp-angle:focus-visible { background: var(--cream2);
                                                             color: var(--ink); }
.cdp-angle[aria-pressed="true"] { border-color: var(--ink); background: var(--ink);
                                  color: var(--paper); }
/* Le texte se relit et se réécrit dans la carte. Une largeur pleine, parce
   qu'une légende se juge à la ligne où elle se coupera. */
.cdp-file-details label { display: block; margin: var(--sp-3) 0 var(--sp-1);
                          color: var(--ink2); font-size: var(--fs-sm);
                          font-weight: 600; }
.cdp-file-details textarea { display: block; width: 100%; box-sizing: border-box;
                             padding: var(--sp-2); border: var(--tr);
                             border-radius: var(--r-sm); background: var(--paper);
                             color: var(--ink); font: inherit;
                             font-size: var(--fs-sm); resize: vertical; }

/* Les photos sont une feuille courte, pas une seconde page cachée plus bas.
   Elle referme toujours vers la même file, y compris sur Échap. */
.cdp-modal { position: fixed; inset: 0; z-index: var(--z-feuille); display: grid;
             place-items: center; padding: var(--sp-4); }
/* La règle de mise en page ne doit jamais gagner contre l'attribut HTML
   `hidden` : sinon le voile invisible capture les clics de la file. */
.cdp-modal[hidden] { display: none; }
.cdp-modal-voile { position: absolute; inset: 0; background: var(--voile); }
.cdp-modal-carte { position: relative; width: min(100%, var(--mesure));
                    max-height: calc(100dvh - var(--sp-7)); overflow: auto;
                    padding: var(--sp-5); border: var(--tr); border-radius: var(--r-lg);
                    background: var(--paper); box-shadow: var(--sh-3); }
.cdp-modal-entete { display: flex; flex-wrap: wrap; align-items: flex-start;
                     justify-content: space-between; gap: var(--sp-3); }
.cdp-modal-entete h2 { margin: 0; color: var(--ink); font-family: var(--ff-titre);
                        font-size: var(--fs-2xl); line-height: 1.1; }
.cdp-modal-entete .aide { max-width: var(--mesure); margin: var(--sp-2) 0 0;
                           color: var(--ink2); }

/* Le panneau doit etre aussi immediat au pouce qu'au clavier ou a la souris. */
@media (max-width: 48em){
  .cdp-file { grid-template-columns: minmax(0, 1fr); padding: var(--sp-3); }
  .cdp-file-heading, .cdp-file-vide { grid-column: auto; }
  .cdp-active { grid-template-columns: minmax(0, 1fr); }
  .cdp-active-body { padding: var(--sp-4); }
  .cdp-file-suite { padding-inline-start: 0; padding-top: var(--sp-4);
                    border-inline-start: 0; border-top: var(--tr); }
  .cdp-modal { padding: var(--sp-3); }
  .cdp-modal-carte { padding: var(--sp-4); }
}

/* Au doigt, les gestes du studio deviennent de vraies cibles.
   Mesure a l'audit : « Ouvrir » faisait 21 px de haut pour 44 exiges, a
   360 et a 768 px. Le tableau de l'espace pro avait deja sa regle dans
   `pro.css` ; le studio n'en avait aucune, et `/foyer` ne sert pas
   `pro.css` - les gestes des photos d'une famille n'etaient donc couverts
   nulle part. Une feuille partagee porte ce dont son ecran depend. */
@media (pointer:coarse){
  /* La HAUTEUR, et rien de plus. Le rembourrage horizontal, recopie de
     `pro.css` ou le tableau a la place, elargissait la colonne « Ouvrir »
     et faisait deborder la page de 9 px a 360 - une correction
     d'accessibilite qui en casse une autre n'en est pas une. */
  .cdp-hist button,
  .cdp-vig .gestes button,
  .cdp-file button,
  .cdp-file a{ min-height: var(--cible); }

  /* Ajouter une photo : le champ natif est masque, c'est l'etiquette
     `.fichier-b` (socle.css) qui fait la cible de 44 px - le doigt touche
     ce qu'il voit, et tout le bouton ouvre le choix (02/10/2026). */
}

/* La formule et ce qu'elle permet : une liste, pas un tableau de bord. */
.cdp-quota { list-style: none; margin: var(--sp-2) 0; padding: 0;
             display: flex; flex-wrap: wrap; gap: var(--sp-4);
             font-size: var(--fs-base); color: var(--ink2); }
.cdp-quota b { font-family: var(--ff-titre); font-size: var(--fs-lg);
               color: var(--ink); }

/* Le bouton qui ferme la feuille. `.lien` n'est style que par les feuilles
   de chaque espace, et l'editeur ouvrait la feuille avec un bouton natif :
   la feuille partagee porte ce dont elle depend. */
.cdp-modal .cdp-modal-entete .lien{background:none;border:0;padding:0 var(--sp-2);
  min-height:var(--cible);font:inherit;font-size:var(--fs-sm);font-weight:600;
  color:var(--terraDk);text-decoration:underline;cursor:pointer}
.cdp-modal .cdp-modal-entete .lien:hover{color:var(--ink)}

/* --- La feuille des droits : une ligne par photo, deux cases ------------
   (maquette du 16/09/2026). La vignette, ce qu'est la photo, puis les deux
   destinations ; au telephone les cases passent sous la vignette. */
.cdp-droits-aide{margin:0 0 var(--sp-3);color:var(--ink2);font-size:var(--fs-sm)}
.cdp-droits{list-style:none;margin:0 0 var(--sp-3);padding:0;display:grid;gap:var(--sp-2)}
.cdp-droit{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-3);
  padding:var(--sp-2) 0;border-top:var(--tr)}
.cdp-droit img{width:var(--cible);height:var(--cible);object-fit:cover;
  border-radius:var(--r-sm);flex:none}
.cdp-droit-txt{flex:1 1 8rem;min-width:0;display:flex;flex-direction:column}
.cdp-droit-txt b{font-size:var(--fs-base);color:var(--ink)}
.cdp-droit-txt small{font-size:var(--fs-xs);color:var(--ink3)}
.cdp-droit-cases{display:flex;flex-wrap:wrap;gap:var(--sp-2);align-items:center}
.cdp-case{display:inline-flex;align-items:center;gap:var(--sp-2);min-height:var(--cible);
  padding:0 var(--sp-3);border:var(--tr);border-radius:var(--r-pill);
  font-size:var(--fs-sm);color:var(--ink);cursor:pointer;background:var(--paper)}
.cdp-case:has(input:checked){border-color:var(--terra);background:var(--cream2)}
.cdp-case input{margin:0;width:auto}

/* L'etiquette d'une case a cocher ne prend pas la marge des etiquettes de
   formulaire : elle est POSEE a cote de sa case. La regle vivait en
   `style="margin:0"` dans deux modules Python - donc hors de portee de
   `tests/test_styles.py`, qui ne lit que les feuilles.

   Elle est ICI et pas dans `pro.css` parce que `/foyer` ne sert pas
   `pro.css` : c'est la seule feuille que les deux ecrans partagent. */
.coche label{margin:0}

/* ==========================================================================
   Communications : les preferences de contact et leurs preuves datees
   --------------------------------------------------------------------------
   UNE feuille pour UN ecran, servie par `/pro` ET par `/famille`, comme
   `studio.css`. Le script vit dans `pb/front_comms.py` et sert les deux
   espaces : poser ces regles dans `pro.css` aurait laisse l'ecran de la
   famille sans aucun style, exactement comme le studio le 08/09/2026 -
   « une feuille partagee doit porter ce dont son ecran depend ».

   DEPUIS LE 12/10/2026 (maquette du 24/09/2026), L'ECRAN EST UNE CARTE DE
   « MON COMPTE » : des interrupteurs groupes, pas une ligne par finalite.
   Ses classes commencent par `cmx-` et vivent ici ; ses boutons sont ceux
   de l'ecran de compte (`cpt-lien`, `cpt-b`, dans `compte.css`), parce que
   cette carte vit DANS cet ecran-la, qui est partage lui aussi par les deux
   espaces. Aucune classe de page hote n'est reutilisee : `.sec`, `.ind`,
   `.note` portent le meme nom des deux cotes et ne veulent pas dire la meme
   chose (capture du 10/10/2026).

   Aucune valeur brute : les jetons sont dans `tokens.css`, et nulle part
   ailleurs.
   ========================================================================== */

.cm-note { margin: var(--sp-2) 0 0; color: var(--ink3);
           font-size: var(--fs-sm); line-height: 1.55; }
.cm-msg { margin-bottom: var(--sp-3); }
.cm-msg:empty { display: none; }

/* La phrase de tete : ou ca part, et ce qui part toujours. */
.cmx-sous { margin: 0 0 var(--sp-2); color: var(--ink2);
            font-size: var(--fs-sm); line-height: 1.55; }

/* L'opposition active : un bandeau au-dessus de la liste, et la liste
   eteinte dessous. Le mot « Suspendu » est ecrit sur chaque ligne : la
   couleur ne dit jamais seule ce qui se passe. */
.cmx-coupe { display: flex; flex-wrap: wrap; align-items: center;
             justify-content: space-between; gap: var(--sp-2);
             margin: 0 0 var(--sp-2); padding: var(--sp-2) var(--sp-3);
             border-radius: var(--r-md); background: var(--goldLt);
             color: var(--ink); font-size: var(--fs-sm); }

/* Une ligne par groupe : le titre, sa phrase, sa preuve ; l'interrupteur a
   droite. */
.cmx-liste { display: grid; }
.cmx-l { display: flex; align-items: center; justify-content: space-between;
         gap: var(--sp-3); padding: var(--sp-3) 0; border-bottom: var(--tr); }
.cmx-l.off { opacity: .6; }
.cmx-t { display: flex; flex-direction: column; gap: var(--sp-1); min-width: 0; }
.cmx-t b { color: var(--ink); font-size: var(--fs-base); font-weight: 600; }
.cmx-t span { color: var(--ink2); font-size: var(--fs-sm); line-height: 1.45; }
.cmx-t small { color: var(--ink3); font-size: var(--fs-xs); }

/* L'INTERRUPTEUR. Le bouton fait la cible tactile entiere (`--cible` de
   cote) ; la piste visible, plus basse, est dessinee dedans. Un bouton de
   26 px de haut passerait a l'oeil et tomberait a l'audit : ce qu'on touche
   est le bouton, pas la piste. L'etat est aussi dans `aria-checked`, que le
   test relit, et le nom accessible porte le titre du groupe. */
.cmx-sw { flex: none; position: relative; width: var(--cible);
          height: var(--cible); border: 0; padding: 0; background: none;
          cursor: pointer; border-radius: var(--r-pill); }
.cmx-sw::before { content: ""; position: absolute; left: 0; right: 0;
                  top: 50%; height: 26px; transform: translateY(-50%);
                  border-radius: var(--r-pill); background: var(--cream3);
                  transition: background var(--t-court) var(--e); }
.cmx-sw span { position: absolute; top: 50%; left: 3px; width: 20px;
               height: 20px; margin-top: -10px; border-radius: 50%;
               background: var(--paper); border: 1px solid var(--cream3);
               transition: transform var(--t-court) var(--e); }
.cmx-sw[aria-checked="true"]::before { background: var(--greenDk); }
.cmx-sw[aria-checked="true"] span { transform: translateX(18px);
                                    border-color: var(--greenDk); }
.cmx-sw:disabled { cursor: default; }

/* Le pied : langue, pays, heure - et « tout desactiver », a l'ecart. */
.cmx-pied { display: flex; flex-wrap: wrap; align-items: center;
            gap: var(--sp-1) var(--sp-3); padding-top: var(--sp-3);
            font-size: var(--fs-sm); color: var(--ink2); }
.cmx-tout { margin-left: auto; color: var(--ink3); }

/* Langue, pays, fuseau : trois listes qui s'enroulent au telephone. */
.cmx-locf { display: flex; flex-wrap: wrap; align-items: flex-end;
            gap: var(--sp-2) var(--sp-3); margin-top: var(--sp-3);
            padding: var(--sp-3); border-radius: var(--r-md);
            background: var(--cream); }
.cmx-locf label { display: flex; flex-direction: column; gap: var(--sp-1);
                  font-size: var(--fs-xs); color: var(--ink2); }
.cmx-locf select { max-width: 100%; min-height: var(--cible);
                   font: inherit; font-size: var(--fs-champ);
                   padding: 0 var(--sp-2); border: var(--tr-champ);
                   border-radius: var(--r-sm); background: var(--paper);
                   color: var(--ink); }

/* ==========================================================================
   Mon compte : qui vous etes, la securite, vos donnees, la sortie
   --------------------------------------------------------------------------
   UNE feuille pour UN ecran, servie par `/famille` ET par `/pro`, comme
   `comms.css`. Le gabarit et le script vivent dans `pb/front_compte.py`.
   Elle porte TOUT ce dont l'ecran depend, boutons compris : `.sec`, `.btn`,
   `.lien` et `.dang` existent des deux cotes et n'y veulent pas dire la meme
   chose. Toutes les classes commencent par `cpt-`. Maquette du 17/09/2026.
   ========================================================================== */

.cpt :is(h1,h2)::after{content:none}
/* `display:flex` sur un formulaire l'emporterait sur l'attribut `hidden` :
   un formulaire replie restait ouvert cote structure. */
.cpt [hidden]{display:none !important}
.cpt-tete{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:flex-end;
  gap:var(--sp-3) var(--sp-4);margin:0 0 var(--sp-4)}
.cpt-tete h1{margin:0;font-family:var(--ff-titre);color:var(--ink)}
.cpt-trait{display:block;margin:var(--sp-1) 0 var(--sp-2);stroke:var(--terra)}
.cpt-chapo{margin:0;color:var(--ink2);font-size:var(--fs-base)}

.cpt-grille{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--sp-4);
  align-items:start}
.cpt-carte{background:var(--paper);border:var(--tr);border-radius:var(--r-lg);
  padding:var(--sp-4) var(--sp-5);min-width:0}
.cpt-carte h2{margin:0 0 var(--sp-3);font-family:var(--ff-titre);font-size:var(--fs-lg);color:var(--ink)}
.cpt-carte p{margin:0 0 var(--sp-3);color:var(--ink2);font-size:var(--fs-sm);line-height:1.6}

/* Les boutons de l'ecran, definis une fois, et precedes de `.cpt` : les
   regles des pages (`.carte-fy summary`, `.carte-fy details`) sont aussi
   precises qu'une classe seule et gagnaient - le bouton rouge de la famille
   s'ecrivait en brun sur rouge. */
.cpt .cpt-b{display:inline-flex;align-items:center;justify-content:center;min-height:var(--cible);
  padding:var(--sp-2) var(--sp-4);border:0;border-radius:var(--r-pill);cursor:pointer;
  font:inherit;font-size:var(--fs-sm);font-weight:600;background:var(--ink);color:var(--paper);
  text-decoration:none}
.cpt .cpt-b:hover{background:var(--terra)}
.cpt .cpt-b.cpt-sec{background:var(--paper);color:var(--ink2);border:var(--tr-fort)}
.cpt .cpt-b.cpt-sec:hover{background:var(--cream2);color:var(--ink)}
.cpt .cpt-lien{display:inline-flex;align-items:center;min-height:var(--cible);padding:0;border:0;
  background:none;font:inherit;font-size:var(--fs-sm);color:var(--terraDk);
  text-decoration:underline;cursor:pointer}
.cpt .cpt-lien:hover{color:var(--terra)}
.cpt .cpt-dang{display:inline-flex;align-items:center;min-height:var(--cible);cursor:pointer;
  list-style:none;padding:0 var(--sp-4);border:0;border-radius:var(--r-pill);
  background:var(--rouge);color:var(--paper);font:inherit;font-weight:600;font-size:var(--fs-sm)}
.cpt .cpt-dang::-webkit-details-marker{display:none}
.cpt-cmd{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-2) var(--sp-3)}
.cpt-ind{margin:var(--sp-1) 0 var(--sp-2);color:var(--ink3);font-size:var(--fs-xs);line-height:1.5}
.cpt-opt{font-weight:400;color:var(--warm);font-size:var(--fs-xs)}
.cpt-champ{display:flex;flex-direction:column;gap:var(--sp-1);font-size:var(--fs-sm);
  color:var(--ink2);font-weight:600}
.cpt .cpt-champ input{min-height:var(--cible);padding:var(--sp-2) var(--sp-3);border:var(--tr-fort);
  border-radius:var(--r-md);background:var(--paper);font:inherit;font-size:var(--fs-base);
  color:var(--ink);font-weight:400}
.cpt .cpt-champ input:focus-visible{outline:var(--focus);outline-offset:var(--focus-ecart)}

/* Qui vous etes */
.cpt-qui{display:flex;align-items:center;gap:var(--sp-3);padding-bottom:var(--sp-3);
  border-bottom:var(--tr)}
/* UN ENFANT FLEX NE RETRECIT PAS SOUS SON CONTENU SANS `min-width:0`.
   `#cptNom` vaut le nom du membre OU son adresse : sans nom, c'est une
   adresse entiere qui s'affiche en titre, et
   « structure@audit.patteblanche.invalid » poussait la page a 407 px
   pour 360 (28/09/2026). Le bloc d'en dessous portait deja les deux
   regles - `.cpt-l{min-width:0}`, `.cpt-val{overflow-wrap:anywhere}` -
   et celui-ci les avait manquees, faute d'avoir jamais ete dessine avec
   une valeur longue. */
.cpt-qui>div{min-width:0}
/* La photo de profil (19/10/2026) : le cercle EST le bouton, le crayon se
   pose sur son coin, et l'anneau de focus suit le champ masque. */
.cpt .cpt-avatar{flex:none;border-radius:var(--r-circle)}
.cpt .cpt-avatar .cpt-sigle{background-size:cover;background-position:center}
.cpt .cpt-avatar-c{position:absolute;right:calc(-1 * var(--sp-1));bottom:calc(-1 * var(--sp-1));
  width:24px;height:24px;border-radius:var(--r-circle);background:var(--paper);color:var(--ink);
  border:var(--tr);display:flex;align-items:center;justify-content:center}
.cpt .cpt-avatar:hover .cpt-avatar-c{background:var(--terra);color:var(--paper);border-color:var(--terra)}
.cpt .cpt-avatar:focus-within{outline:var(--focus);outline-offset:var(--focus-ecart)}
.cpt .cpt-avatar-l{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-2);
  color:var(--warm)}
.cpt-qui h2{margin:0;overflow-wrap:anywhere}
.cpt-qui p{margin:var(--sp-1) 0 0}
.cpt-sigle{flex:none;display:flex;align-items:center;justify-content:center;
  width:var(--tuile);height:var(--tuile);border-radius:var(--r-circle);background:var(--ink);
  color:var(--paper);font-family:var(--ff-titre);font-size:var(--fs-lg)}
.cpt-ligne{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;
  gap:var(--sp-2);padding:var(--sp-3) 0;border-bottom:var(--tr)}
.cpt-l{display:flex;flex-direction:column;gap:var(--sp-1);min-width:0}
.cpt-cle{font-family:var(--ff-mono);font-size:var(--fs-xs);letter-spacing:.1em;
  text-transform:uppercase;color:var(--ink3)}
.cpt-val{color:var(--ink);font-size:var(--fs-base);overflow-wrap:anywhere}
.cpt-edit{flex:1 1 100%;display:flex;flex-direction:column;gap:var(--sp-2)}
/* Le changement d'adresse en attente : sous la ligne, sur toute sa largeur,
   pour qu'on lise d'abord l'adresse que le compte porte ENCORE. */
.cpt-attente{flex:1 1 100%;display:flex;flex-wrap:wrap;align-items:center;
  gap:var(--sp-2);margin:0;padding:var(--sp-2) var(--sp-3);
  background:var(--goldPale);border-radius:var(--r-md);
  color:var(--ink2);font-size:var(--fs-sm)}

/* La securite */
.cpt-bloc{background:var(--cream);border-radius:var(--r-md);padding:var(--sp-3);
  margin:0 0 var(--sp-3)}
.cpt-bloc-t{display:flex;justify-content:space-between;align-items:center;gap:var(--sp-2)}
.cpt-bloc-t b,.cpt-appareils b{display:block;color:var(--ink);font-size:var(--fs-sm);font-weight:600}
.cpt-bloc-t small,.cpt-appareils small{display:block;color:var(--ink3);font-size:var(--fs-xs)}
.cpt-bloc .cpt-edit{margin-top:var(--sp-3)}
.cpt-carte .cpt-sur{margin:var(--sp-4) 0 var(--sp-1);font-family:var(--ff-mono);font-size:var(--fs-xs);
  font-weight:400;letter-spacing:.1em;text-transform:uppercase;color:var(--ink2)}
.cpt-appareils{list-style:none;margin:0;padding:0}
.cpt-appareils li{display:flex;justify-content:space-between;align-items:center;gap:var(--sp-2);
  padding:var(--sp-2) 0;border-bottom:var(--tr)}
.cpt-etiq{flex:none;font-family:var(--ff-mono);font-size:var(--fs-xs);letter-spacing:.08em;
  text-transform:uppercase;color:var(--greenDk);background:var(--greenLt);
  border-radius:var(--r-xs);padding:var(--sp-1) var(--sp-2)}

/* Vos donnees, la sortie */
.cpt-sortie{border-top:var(--tr);margin-top:var(--sp-4);padding-top:var(--sp-3)}
.cpt-carte .cpt-sortie-t{margin:0 0 var(--sp-2);font-family:var(--ff-corps);font-size:var(--fs-sm);
  font-weight:400;color:var(--ink)}
.cpt .cpt-sortie details{margin:0;padding:0;border:0}
.cpt-sortie details[open] > .cpt-dang{margin-bottom:var(--sp-3)}
/* Le bilan de suppression (14/10/2026) : trois groupes, du plus definitif
   au plus durable. */
.cpt-bilan{margin:0 0 var(--sp-3)}
.cpt-bilan-g{margin:0 0 var(--sp-2)}
.cpt-bilan-g b{display:block;font-size:var(--fs-sm);color:var(--ink)}
.cpt-bilan-g ul{margin:var(--sp-1) 0 0;padding-left:var(--sp-4);color:var(--ink2);
  font-size:var(--fs-sm);line-height:1.5}

/* L'administration de la structure */
.cpt-admin{grid-column:1 / span 1;background:var(--cream2)}
.cpt-admin .cpt-cmd{margin-bottom:var(--sp-3)}
.cpt-fermeture{border-top:var(--tr);padding-top:var(--sp-3)}
.cpt-carte .cpt-alerte{color:var(--ink);font-weight:600}
.cpt-journal{background:var(--paper);border-radius:var(--r-md);padding:var(--sp-2) var(--sp-3);
  margin:0 0 var(--sp-3);max-height:24rem;overflow:auto}
.cpt-journal-l{list-style:none;margin:0;padding:0}
.cpt-journal-l li{display:flex;flex-wrap:wrap;gap:var(--sp-1) var(--sp-3);padding:var(--sp-2) 0;
  border-bottom:var(--tr);font-size:var(--fs-sm);color:var(--ink2)}
.cpt-journal-l b{color:var(--ink);font-weight:600}
.cpt-quand{font-family:var(--ff-mono);font-size:var(--fs-xs);color:var(--ink3)}
.cpt-journal-l small{flex:1 1 100%;font-family:var(--ff-mono);font-size:var(--fs-xs);
  color:var(--ink3);overflow-wrap:anywhere}

@media (max-width:1100px){
  .cpt-grille{grid-template-columns:repeat(2,minmax(0,1fr))}
}
@media (max-width:700px){
  .cpt-grille{grid-template-columns:minmax(0,1fr)}
  .cpt-carte{padding:var(--sp-3) var(--sp-4)}
}

/* La double authentification : le QR, la cle en clair a cote (si le QR ne
   se lit pas, on recopie), et les codes de secours montres UNE fois. */
.cpt-qr{display:flex;justify-content:center;background:var(--paper);
  border-radius:var(--r-md);padding:var(--sp-3);margin:var(--sp-2) 0}
.cpt-qr svg{width:100%;max-width:12rem;height:auto}
.cpt-secret{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-2);
  margin:0 0 var(--sp-2)}
.cpt-secret code{font-family:var(--ff-mono);font-size:var(--fs-sm);color:var(--ink);
  background:var(--paper);border-radius:var(--r-xs);padding:var(--sp-1) var(--sp-2);
  overflow-wrap:anywhere}
.cpt-codes{list-style:none;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));
  gap:var(--sp-1);margin:var(--sp-2) 0;padding:0}
.cpt-codes li{font-family:var(--ff-mono);font-size:var(--fs-sm);color:var(--ink);
  background:var(--paper);border-radius:var(--r-xs);padding:var(--sp-1) var(--sp-2);
  text-align:center;letter-spacing:.06em}
.cdeux{display:flex;flex-direction:column;gap:var(--sp-1);margin:var(--sp-2) 0}

/* LE LOGO D'UNE STRUCTURE (24/09/2026). Un carré, pas un rond : un rond
   rogne les angles d'un logo, et un logo est dessiné pour être vu entier.
   Le fond reste clair — une image transparente doit se poser sur quelque
   chose, et le crème est ce sur quoi elle s'affichera ailleurs. */
.cpt .cpt-logo { display: flex; align-items: center; gap: var(--sp-3);
  margin: var(--sp-3) 0 var(--sp-4); }
.cpt .cpt-logo-vue { flex: none; width: 56px; height: 56px;
  border-radius: var(--r-sm); border: var(--tr); background: var(--cream);
  background-size: contain; background-position: center;
  background-repeat: no-repeat;
  display: flex; align-items: center; justify-content: center;
  font-family: var(--ff-mono); color: var(--warm); }
.cpt .cpt-logo-txt { min-width: 0; }
.cpt .cpt-logo-txt small { display: block; color: var(--warm);
  margin: var(--sp-1) 0 var(--sp-2); }
/* Les deux gestes se touchent : « Ajouter un logo » est un `label`, donc
   il n'a aucune hauteur propre. */
.cpt .cpt-logo .cpt-lien { display: inline-flex; align-items: center;
  min-height: var(--cible); }

/* MON COMPTE EN PAGE DE REGLAGES (maquette du 24/09/2026, portee le
   12/10/2026) : une colonne, une section par ligne - le titre et sa phrase a
   gauche (`.cpt-sh`, collante), le contenu a droite. L'ordre suit la
   frequence : profil, communications, securite, administration, donnees,
   puis la zone sensible, isolee en dernier. La grille a trois colonnes
   d'avant reste ecrite plus haut : ces regles la remplacent par leur poids
   (`.cpt .cpt-grille`), sans `!important`. Sous 560 px de conteneur, une
   seule colonne et l'en-tete au-dessus de son contenu. */
.cpt{container-type:inline-size}
.cpt-tete,.cpt-grille,#cptMsg{max-width:60rem}
.cpt .cpt-grille{display:flex;flex-direction:column;align-items:stretch;gap:var(--sp-3)}
.cpt .cpt-carte{display:grid;grid-template-columns:minmax(0,12rem) minmax(0,1fr);
  column-gap:var(--sp-5);align-items:start;padding:var(--sp-4) var(--sp-5)}
.cpt .cpt-carte>*{grid-column:2}
.cpt .cpt-carte>.cpt-sh{grid-column:1;grid-row:1 / span 40;position:sticky;top:var(--sp-4)}
.cpt .cpt-carte>*:not(.cpt-sh){min-width:0}
.cpt .cpt-carte .cpt-sh h2{margin:0 0 var(--sp-1);font-size:var(--fs-md)}
.cpt .cpt-carte .cpt-sh p{margin:0;color:var(--ink3);font-size:var(--fs-sm);line-height:1.5;text-wrap:pretty}
.cpt .cpt-qui{padding-top:0}
.cpt .cpt-ligne:last-child{border-bottom:0}
.cpt .cpt-admin{grid-column:auto;background:var(--paper)}
.cpt .cpt-sortie{border-top:0;margin-top:0;padding-top:0}
.cpt .cpt-sortie .cpt-sortie-t{display:none}
.cpt .cpt-danger{border-color:var(--rougeBord);background:var(--paper)}
.cpt .cpt-danger .cpt-sh h2{color:var(--rougeDk)}
#cptDonnees>p:last-child,#cptSecurite>.cpt-ind:last-child{margin-bottom:0}
@container (max-width:560px){
  .cpt .cpt-carte{grid-template-columns:minmax(0,1fr);row-gap:var(--sp-3);padding:var(--sp-3) var(--sp-4)}
  .cpt .cpt-carte>*,.cpt .cpt-carte>.cpt-sh{grid-column:1;grid-row:auto;position:static}
}

/* Quitter bloque : seule administratrice (maquette du 24/09/2026). Le bouton
   reste visible, inactif, et le cartouche dit pourquoi et quoi faire. */
.cpt .cpt-dang:disabled{background:var(--cream3);color:var(--ink3);cursor:not-allowed}
.cpt-bloque{display:flex;flex-direction:column;gap:var(--sp-1);margin:0 0 var(--sp-3);
  padding:var(--sp-3);border-radius:var(--r-md);background:var(--goldPale);
  font-size:var(--fs-sm);color:var(--ink2);line-height:1.5}
.cpt-bloque b{color:var(--ink);font-weight:600}

/* ==========================================================================
   Le depot d'une annonce, en etapes
   --------------------------------------------------------------------------
   UNE feuille pour UN ecran, servie par `/pro` ET par `/famille`, comme
   `studio.css` et `comms.css`. Le script vit dans `pb/front_depot.py` et
   sert les deux espaces.

   ET ELLE PORTE TOUT. Lecon du 16/09, payee sur l'ecran Communications :
   `.carte`, `.ind`, `.note`, `.cmd` et `.sec` existent des deux cotes et ne
   veulent pas dire la meme chose - `.sec` designe meme une SECTION dans
   `app.css`. Toutes les classes d'ici commencent par `dp-`.

   Aucune valeur brute : les jetons sont dans `tokens.css`.
   ========================================================================== */

/* ---- l'entete : ou l'on en est, et combien il en reste ---- */
.dp-tete { margin-bottom: var(--sp-4); }
.dp-rang { margin: 0; font-family: var(--ff-mono); font-size: var(--fs-xs);
           letter-spacing: .08em; text-transform: uppercase;
           color: var(--ink3); }
.dp-tete h2 { font-family: var(--ff-titre); font-size: var(--fs-2xl);
              margin: var(--sp-1) 0 var(--sp-2); color: var(--ink); }
.dp-barre { height: 3px; border-radius: var(--r-pill);
            background: var(--cream3); overflow: hidden; }
.dp-barre i { display: block; height: 100%; background: var(--terra);
              transition: width var(--t-moyen) var(--e); }

/* ---- les champs ---- */
.dp-grille { display: flex; flex-wrap: wrap; gap: var(--sp-3);
             margin-bottom: var(--sp-3); }
.dp-l { display: flex; flex-direction: column; gap: var(--sp-1);
        flex: 1 1 15rem; min-width: 0; }
.dp-grille + .dp-l, .dp-l + .dp-l { margin-bottom: var(--sp-3); }
.dp-l > span { font-size: var(--fs-sm); font-weight: 600; color: var(--ink2); }
.dp-l > span i { font-weight: 400; font-style: normal; color: var(--ink3); }
.dp-l input, .dp-l select, .dp-l textarea {
  font: inherit; font-size: var(--fs-champ); color: var(--ink);
  background: var(--paper); border: var(--tr-champ);
  border-radius: var(--r-sm); padding: var(--sp-2);
  min-height: var(--cible); width: 100%; box-sizing: border-box; }
.dp-l textarea { min-height: 8rem; resize: vertical; line-height: 1.5; }
.dp-aide { display: block; font-style: normal; font-size: var(--fs-xs);
           line-height: 1.5; color: var(--ink3); }
.dp-note { margin: 0 0 var(--sp-3); font-size: var(--fs-sm);
           line-height: 1.55; color: var(--ink3); }
/* La declaration d'une famille, juste avant de publier : une case qu'on
   coche, avec sa phrase entiere, et toute la ligne qui se touche. */
.dp-decl { display: flex; align-items: flex-start; gap: var(--sp-2);
           min-height: var(--cible); margin: 0 0 var(--sp-3);
           font-size: var(--fs-sm); line-height: 1.5; color: var(--ink2);
           cursor: pointer; flex-basis: 100%; }
.dp-decl input { flex: none; width: 1.25rem; height: 1.25rem;
                 margin-top: var(--sp-1); }

/* ---- la relecture : ce qui sera ENREGISTRE, pas ce qui a ete tape ---- */
.dp-relu { border: 1px solid var(--cream3); border-radius: var(--r-md);
           overflow: hidden; margin-bottom: var(--sp-3); }
.dp-r { display: flex; flex-wrap: wrap; gap: var(--sp-2);
        align-items: baseline; padding: var(--sp-2) var(--sp-3);
        border-top: 1px solid var(--cream3); }
.dp-r:first-child { border-top: 0; }
.dp-r > span { flex: 0 0 14rem; font-size: var(--fs-sm); color: var(--ink3); }
.dp-r > b { flex: 1 1 12rem; min-width: 0; color: var(--ink);
            font-size: var(--fs-sm); overflow-wrap: anywhere; }

/* ---- le bilan : ce qui manque, ce qui vient ensuite ---- */
.dp-bilan { border: 1px solid var(--cream3); border-left: 3px solid var(--cream3);
            border-radius: var(--r-md); padding: var(--sp-3);
            margin-bottom: var(--sp-3); }
.dp-bilan.oui { border-left-color: var(--green); }
.dp-bilan.non { border-left-color: var(--terra); }
.dp-bilan h3 { font-family: var(--ff-titre); font-size: var(--fs-md);
               margin: 0 0 var(--sp-2); color: var(--ink); }
.dp-bilan p { margin: 0; font-size: var(--fs-sm); line-height: 1.55;
              color: var(--ink3); }
.dp-bilan ul { margin: 0 0 var(--sp-2); padding-left: var(--sp-4);
               color: var(--ink); font-size: var(--fs-sm); }
.dp-bilan li { margin: var(--sp-1) 0; }

/* ---- les gestes ---- */
.dp-cmd { display: flex; flex-wrap: wrap; gap: var(--sp-2);
          margin-top: var(--sp-4); align-items: center; }
.dp-b { display: inline-flex; align-items: center; justify-content: center;
        min-height: var(--cible); padding: var(--sp-2) var(--sp-4);
        border: 0; border-radius: var(--r-pill); cursor: pointer;
        font: inherit; font-size: var(--fs-sm); font-weight: 600;
        background: var(--ink); color: var(--paper);
        transition: background var(--t-court) var(--e); }
.dp-b:hover { background: var(--terra); }
.dp-b.sec { background: none; color: var(--ink2);
            border: 1px solid var(--cream3); }
.dp-b.sec:hover { background: var(--cream2); color: var(--ink); }
.dp-b.lien { background: none; color: var(--ink3); text-decoration: underline;
             padding-inline: var(--sp-2); margin-left: auto; }
.dp-b.lien:hover { background: none; color: var(--ink); }
.dp-b[disabled] { opacity: .45; cursor: default; }
.dp-b[disabled]:hover { background: var(--ink); }

.dp-msg { margin-bottom: var(--sp-3); }
.dp-msg:empty { display: none; }

/* Au telephone, un geste prend toute la largeur : deux boutons cote a cote
   a 360 px font deux cibles de 150 px que l'on manque une fois sur deux. */
@media (max-width: 560px) {
  .dp-b { width: 100%; }
  .dp-b.lien { margin-left: 0; }
  .dp-r > span { flex: 1 1 100%; }
}

/* CE QUE COUTE UN BLOC, a cote de son titre (maquette du 22/09/2026).
   -----------------------------------------------------------------------
   Une benevole qui ouvre le formulaire entre deux visites a besoin de
   savoir si elle a le temps de commencer. La duree est discrete : c'est une
   indication, pas une promesse, et elle ne doit pas peser autant que le
   titre qu'elle accompagne. */
.dz-duree { margin-left: var(--sp-2); font-family: var(--ff-mono);
  font-size: var(--fs-xs); font-weight: 400; letter-spacing: .06em;
  color: var(--warm); white-space: nowrap; }

/* LES PASTILLES D'UNE QUESTION FERMEE (maquette du 22/09/2026).
   -----------------------------------------------------------------------
   LA CIBLE EST LE SPAN, PAS LA CASE. Le bouton radio est couche par-dessus
   toute la pastille en opacite nulle : c'est lui qu'on touche, et c'est le
   `span` qui se voit. Poser `min-height` sur la seule case aurait donne une
   pastille de la bonne taille et une cible de dix-huit pixels - la lecon du
   champ de fichier du 18/09, ou corriger la boite sans sa cible faisait
   passer l'audit sans rien agrandir. */
.dz-chips { display: flex; flex-wrap: wrap; gap: var(--sp-2); }
.dz-chip { position: relative; display: inline-flex; margin: 0; }
.dz-chip input { position: absolute; inset: 0; width: 100%; height: 100%;
  opacity: 0; margin: 0; cursor: pointer; }
.dz-chip span { display: flex; align-items: center;
  min-height: var(--cible); padding: 6px 14px;
  border: 1px solid var(--cream3); border-radius: var(--r-pill);
  font-size: var(--fs-base); color: var(--ink2); background: var(--paper); }
.dz-chip:hover span { border-color: var(--terra); }
.dz-chip input:checked + span { background: var(--terra);
  border-color: var(--terra); color: var(--paper); font-weight: 600; }
.dz-chip input:focus-visible + span { outline: var(--focus);
  outline-offset: 2px; }

/* LA QUESTION REPLIEE. Le contour appuye dit qu'une reponse est la, sans
   crier : ce n'est ni une alerte ni une reussite, c'est un fait. */
.dz-chip-dit { display: inline-flex; align-items: center; gap: var(--sp-2);
  min-height: var(--cible); padding: 6px 14px; border: var(--tr-fort);
  border-color: var(--ink); border-radius: var(--r-pill);
  background: var(--paper); color: var(--ink); font: inherit;
  font-weight: 600; cursor: pointer; }
.dz-chip-dit span { color: var(--ink3); font-weight: 400; }
.dz-chip-dit:hover { border-color: var(--terra); color: var(--terra); }
.dz-chip-dit:focus-visible { outline: var(--focus); outline-offset: 2px; }

/* Une question garde la forme d'un champ : son intitule au-dessus, sa
   reponse en dessous. Sans cela les pastilles s'alignaient a cote du
   libelle et la grille se decalait d'une ligne sur deux. */
.dz-q { display: flex; flex-direction: column; gap: var(--sp-2); }

/* ---- lot A (19/10/2026) : le foyer qu'il lui faut, et ce qu'il ouvre ---- */
.dp-sous { font-family: var(--ff-titre); font-size: var(--fs-md);
           margin: var(--sp-4) 0 var(--sp-2); color: var(--ink); }
.dp-corr { border-left-color: var(--calm); }
.dp-corr p b { color: var(--ink); font-size: var(--fs-lg); margin-right: var(--sp-1); }
.dp-corr .dp-note { margin-top: var(--sp-2); }

/* ==========================================================================
   L'editeur du Coup de Patte (maquette du 16/09/2026)
   --------------------------------------------------------------------------
   Servi par /pro. Le script vit dans `pb/front_editeur.py`. Ce qui est
   propre a l'editeur commence par `ed-` ; il reprend `.btn`, `.lien`,
   `.msg` et `.note` de pro.css.

   Aucune valeur brute : les jetons sont dans `tokens.css`.
   ========================================================================== */

.ed { display: flex; flex-direction: column; gap: var(--sp-4); }
/* Un geste secondaire se lit comme un lien, et se touche comme un bouton. */
.ed .lien { background: none; border: 0; padding: var(--sp-1) var(--sp-2); font: inherit;
            font-size: var(--fs-sm); font-weight: 600; color: var(--terraDk); cursor: pointer;
            min-height: var(--cible); }
.ed .lien:hover { color: var(--ink); text-decoration: underline; }

.ed-panneau { background: var(--paper); border: var(--tr); border-radius: var(--r-lg);
              box-shadow: var(--sh-1); overflow: hidden; }
.ed-bas { display: grid; gap: var(--sp-4);
          grid-template-columns: repeat(auto-fit, minmax(min(100%, 18rem), 1fr));
          align-items: start; }

.ed-lab { font-family: var(--ff-mono); font-size: var(--fs-xs); letter-spacing: .14em;
          text-transform: uppercase; color: var(--ink3); }

/* ---- l'animal ---- */
.ed-tete { display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-3);
           padding: var(--sp-3) var(--sp-4); border-bottom: var(--tr-clair); }
.ed-choix { flex: 1 1 16rem; min-width: 0; display: flex; align-items: center; gap: var(--sp-3);
            text-align: left; font: inherit; color: var(--ink); cursor: pointer;
            background: var(--paper); border: var(--tr); border-radius: var(--r-md);
            padding: var(--sp-2); min-height: var(--cible); }
.ed-choix:hover, .ed-choix[aria-expanded="true"] { border-color: var(--terra); background: var(--cream2); }
.ed-choix-txt { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 1px; }
/* UN NOM ALLEMAND EST LONG, ET UN SEUL DE SES MOTS PEUT NE PAS
   TENIR. « Spring möchte mit dir die Welt erkunden » - un vrai titre
   de Tiervermittlung, notre deuxieme source - rendait 95 px de
   contenu pour 90 visibles a 360 px : rien n'empechait le retour a
   la ligne, c'est « erkunden » seul qui depassait. */
.ed-choix-txt b { font-family: var(--ff-titre); font-size: var(--fs-xl);
                  font-weight: 600; overflow-wrap: anywhere; }
/* La ligne du dessous aussi : en chasse fixe a 13 px (echelle du 29/09),
   « toegestaan » demandait 80 px dans une colonne de 56 (audit du
   02/10/2026, en neerlandais). */
.ed-choix-txt small { font-family: var(--ff-mono); font-size: var(--fs-xs); color: var(--ink3);
                      overflow-wrap: anywhere; }
.ed-chevron { flex: none; font-size: var(--fs-sm); font-weight: 600; color: var(--terraDk);
              background: var(--cream2); border-radius: var(--r-pill); padding: var(--sp-1) var(--sp-3); }
.ed-vign { flex: none; width: 40px; height: 40px; border-radius: var(--r-sm); object-fit: cover;
           border: var(--tr); background: var(--cream2); display: block; }

/* ---- le selecteur ---- */
.ed-sel { background: var(--cream); border-bottom: var(--tr-clair);
          padding: var(--sp-3) var(--sp-4); display: flex; flex-direction: column; gap: var(--sp-2); }
.ed-sel-tete { display: flex; flex-wrap: wrap; gap: var(--sp-2); align-items: center; }
.ed-sel-tete input { flex: 1 1 12rem; min-width: 0; font: inherit; font-size: var(--fs-champ);
                     color: var(--ink); background: var(--paper); border: var(--tr);
                     border-radius: var(--r-pill); padding: var(--sp-2) var(--sp-4);
                     min-height: var(--cible); box-sizing: border-box; }
.ed-sel-liste { display: flex; flex-direction: column; gap: 2px; max-height: 22rem; overflow: auto; }
.ed-sel-groupe { margin: var(--sp-2) 0 0; font-family: var(--ff-mono); font-size: var(--fs-xs);
                 letter-spacing: .14em; text-transform: uppercase; color: var(--ink3); }
.ed-sel-carte { display: flex; align-items: center; gap: var(--sp-3); width: 100%; text-align: left;
                font: inherit; color: var(--ink); background: transparent; cursor: pointer;
                border: 1.5px solid transparent; border-radius: var(--r-md);
                padding: var(--sp-2); min-height: var(--cible); }
.ed-sel-carte:hover { background: var(--cream2); }
.ed-sel-carte.on { background: var(--ink); color: var(--cream); border-color: var(--terra); }
.ed-sel-carte.bloque .ed-vign { filter: grayscale(1); }
.ed-sel-txt { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.ed-sel-nom { font-family: var(--ff-titre); font-size: var(--fs-md); font-weight: 600; }
.ed-sel-angle { font-size: var(--fs-sm); color: inherit; }
.ed-sel-sous { font-family: var(--ff-mono); font-size: var(--fs-xs); color: var(--ink3); }
.ed-sel-carte.on .ed-sel-sous { color: var(--cream3); }
.ed-sel-carte.bloque .ed-sel-sous { color: var(--rougeDk); }
.ed-force { font-family: var(--ff-mono); font-size: var(--fs-xs); background: var(--ink);
            color: var(--terraLt); border-radius: var(--r-xs); padding: 1px var(--sp-1); }

/* ---- les reseaux ---- */
.ed-reseaux { display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-2);
              padding: var(--sp-3) var(--sp-4) 0; }
.ed-puce { font: inherit; font-size: var(--fs-sm); font-weight: 600; color: var(--ink2);
           background: transparent; border: 1.5px solid var(--cream3); border-radius: var(--r-pill);
           padding: var(--sp-1) var(--sp-3); min-height: var(--cible); cursor: pointer; }
.ed-puce.on { background: var(--ink); color: var(--cream); border-color: var(--ink); }
.ed-puce[disabled] { opacity: .45; cursor: default; }
.ed-note-reseau { margin: var(--sp-1) var(--sp-4) 0; font-family: var(--ff-mono);
                  font-size: var(--fs-xs); color: var(--ink3); line-height: 1.5; }

/* ---- le corps : apercu a gauche, reglages a droite ---- */
.ed-corps { display: grid; gap: var(--sp-4); padding: var(--sp-4);
            grid-template-columns: repeat(auto-fit, minmax(min(100%, 20rem), 1fr));
            align-items: start; }
.ed-visuel { display: flex; flex-direction: column; gap: var(--sp-3); align-items: center; min-width: 0; }
.ed-apercu { margin: 0; display: flex; flex-direction: column; gap: var(--sp-2); align-items: center;
             max-width: 100%; }
.ed-apercu img { display: block; max-width: 100%; height: auto; border-radius: var(--r-md);
                 border: var(--tr); box-shadow: var(--sh-1); background: var(--cream2); }
.ed-apercu figcaption { font-family: var(--ff-mono); font-size: var(--fs-xs); color: var(--ink3);
                        text-align: center; line-height: 1.5; }
.ed-photos { display: flex; flex-wrap: wrap; align-items: center; justify-content: center;
             gap: var(--sp-2); }
.ed-photo { padding: 0; width: var(--cible); height: var(--cible); border-radius: var(--r-sm);
            overflow: hidden; border: 2px solid var(--cream3); cursor: pointer; background: var(--cream2); }
.ed-photo img { width: 100%; height: 100%; object-fit: cover; display: block; }
.ed-photo.on { border-color: var(--terra); }

.ed-reglages { display: flex; flex-direction: column; gap: var(--sp-3); background: var(--cream);
               border-radius: var(--r-md); padding: var(--sp-3); min-width: 0; }
.ed-props-nav { display: flex; align-items: center; gap: var(--sp-2); }
.ed-props-txt { flex: 1; min-width: 0; display: flex; flex-direction: column; }
/* « Formatfüllend » en allemand ne tenait pas dans sa colonne (audit du
   14/10/2026) : un nom de mise en page se coupe plutot que de deborder. */
.ed-props-txt b { font-family: var(--ff-titre); font-size: var(--fs-md); font-weight: 600;
  overflow-wrap: anywhere; hyphens: auto; }
.ed-props-txt small { font-family: var(--ff-mono); font-size: var(--fs-xs); color: var(--terraDk); }
.ed-rond { flex: none; width: var(--cible); height: var(--cible); border-radius: var(--r-circle);
           font: inherit; font-size: var(--fs-lg); color: var(--ink); background: var(--paper);
           border: 1.5px solid var(--cream3); cursor: pointer; }
.ed-rond:hover { border-color: var(--terra); }
.ed-props-grille { display: grid; gap: var(--sp-2);
                   grid-template-columns: repeat(auto-fit, minmax(4.5rem, 1fr)); }
.ed-mini { display: flex; flex-direction: column; gap: var(--sp-1); padding: var(--sp-1);
           font: inherit; text-align: left; cursor: pointer; background: var(--paper);
           border: 1.5px solid var(--cream3); border-radius: var(--r-sm); min-width: 0;
           min-height: var(--cible); }
/* min-height : tant que l'apercu n'est pas arrive, la vignette ne tenait que
   par son libelle - 31 px de haut, puis 35 avec l'echelle du 29/09 (audit). */
.ed-mini img { width: 100%; height: auto; display: block; border-radius: var(--r-xs); }
.ed-mini span { font-size: var(--fs-xs); font-weight: 600; color: var(--ink);
                overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ed-mini.on { background: var(--ink); border-color: var(--terra); }
.ed-mini.on span { color: var(--cream); }

.ed-curseurs { display: grid; gap: var(--sp-2) var(--sp-3);
               grid-template-columns: repeat(auto-fit, minmax(8rem, 1fr));
               border-top: var(--tr-clair); padding-top: var(--sp-2); }
.ed-curseur { display: flex; flex-direction: column; gap: var(--sp-1); min-width: 0; }
.ed-curseur > span { display: flex; justify-content: space-between; align-items: baseline; gap: var(--sp-2); }
.ed-curseur b { font-family: var(--ff-mono); font-size: var(--fs-xs); color: var(--terraDk); font-weight: 500; }
.ed-curseur input { width: 100%; accent-color: var(--terra); min-height: var(--cible); }

.ed-palettes { display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-2);
               border-top: var(--tr-clair); padding-top: var(--sp-2); }
.ed-pal { display: flex; padding: 0; overflow: hidden; cursor: pointer; min-height: var(--cible);
          border: 2px solid var(--cream3); border-radius: var(--r-sm); background: transparent; }
.ed-pal i { display: block; width: 12px; }
.ed-pal.on { border-color: var(--terra); }
.ed-pal-creme i:nth-child(1) { background: var(--cream); }
.ed-pal-creme i:nth-child(2) { background: var(--ink); }
.ed-pal-creme i:nth-child(3) { background: var(--terra); }
.ed-pal-encre i:nth-child(1) { background: var(--ink); }
.ed-pal-encre i:nth-child(2) { background: var(--cream); }
.ed-pal-encre i:nth-child(3) { background: var(--terraLt); }
.ed-pal-terracotta i:nth-child(1) { background: var(--terra); }
.ed-pal-terracotta i:nth-child(2) { background: var(--paper); }
.ed-pal-terracotta i:nth-child(3) { background: var(--cream); }
.ed-pal-sauge i:nth-child(1) { background: var(--greenLt); }
.ed-pal-sauge i:nth-child(2) { background: var(--greenDk); }
.ed-pal-sauge i:nth-child(3) { background: var(--terra); }

/* ---- les gestes ---- */
.ed-actions { display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-2);
              padding: var(--sp-3) var(--sp-4) 0; border-top: var(--tr-clair); }
.ed-actions .btn, .ed-actions .lien { min-height: var(--cible); }
.ed-primaire { background: var(--terraDk); }
.ed-espace { flex: 1; }
.ed-msg { padding: 0 var(--sp-4); }
.ed-attente { padding: var(--sp-4); }

/* ---- la legende, telle qu'elle apparaitra ---- */
.ed-fil { display: flex; flex-direction: column; gap: var(--sp-2); padding: var(--sp-3) var(--sp-4);
          border-top: var(--tr-clair); margin-top: var(--sp-3); }
.ed-fil-tete { display: flex; align-items: center; gap: var(--sp-2); }
.ed-fil-tete b { display: block; font-size: var(--fs-sm); }
.ed-fil-tete small { font-family: var(--ff-mono); font-size: var(--fs-xs); color: var(--ink3); }
.ed-fil-logo { width: 26px; height: 26px; border-radius: var(--r-circle); background: var(--cream2); flex: none; }
.ed-fil textarea { font: inherit; font-size: var(--fs-champ); color: var(--ink); background: var(--paper);
                   border: var(--tr-champ); border-radius: var(--r-sm); padding: var(--sp-2);
                   width: 100%; box-sizing: border-box; resize: vertical; min-height: 6rem; }
.ed-lien { margin: 0; font-family: var(--ff-mono); font-size: var(--fs-sm); color: var(--terraDk);
           overflow-wrap: anywhere; }
.ed-compte { margin: 0; font-family: var(--ff-mono); font-size: var(--fs-xs); color: var(--ink3); }
.ed-compte.trop { color: var(--rougeDk); }
.ed-fil-gestes { margin: 0; }
.ed-alt { display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-2);
          border-top: var(--tr-clair); padding-top: var(--sp-2); }
/* LE TEXTE ALTERNATIF EST UN TEXTAREA depuis le 28/09/2026 : un champ
   d'une ligne rognait 448 px de contenu sur 214 visibles. Il garde la
   meme apparence, et il s'agrandit a la main plutot qu'a l'horizontale. */
.ed-alt textarea { flex: 1 1 12rem; min-width: 0; font: inherit; font-size: var(--fs-champ);
                color: var(--ink); background: var(--paper); border: var(--tr-champ);
                border-radius: var(--r-sm); padding: var(--sp-2); min-height: var(--cible);
                box-sizing: border-box; resize: vertical; }
.ed-cache { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); }

.ed-suite { padding: var(--sp-3) var(--sp-4); background: var(--cream); border-top: var(--tr-clair); }
.ed-enchainer { background: var(--terraLt); color: var(--ink); min-height: var(--cible); }

/* ---- sous le panneau ---- */
.ed-carte { background: var(--paper); border: var(--tr); border-radius: var(--r-lg);
            padding: var(--sp-3) var(--sp-4); }
.ed-carte h3 { margin: 0 0 var(--sp-1); font-family: var(--ff-titre); font-size: var(--fs-lg); }
.ed-parti-ligne { display: flex; align-items: center; gap: var(--sp-3); padding: var(--sp-2) 0;
                  border-top: var(--tr-clair); }
.ed-parti-txt { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 1px; }
.ed-parti-txt b { font-size: var(--fs-sm); }
.ed-parti-txt small { font-size: var(--fs-xs); color: var(--ink3); }
.ed-etat { flex: none; font-size: var(--fs-xs); font-weight: 600; border-radius: var(--r-xs);
           padding: 2px var(--sp-2); background: var(--cream2); color: var(--ink2); }
.ed-etat-telecharge { background: var(--greenLt); color: var(--greenDk); }
.ed-etat-indisponible { background: var(--rougeLt); color: var(--rougeDk); }

.ed-pb { background: var(--ink); border-color: var(--ink); color: var(--cream); }
.ed-pb h3 { color: var(--cream); }
.ed-pb p { font-size: var(--fs-sm); line-height: 1.55; margin: 0 0 var(--sp-2); }
.ed-bascule { display: flex; align-items: center; justify-content: space-between; gap: var(--sp-3);
              background: var(--ink2); border-radius: var(--r-md); padding: var(--sp-2) var(--sp-3);
              min-height: var(--cible); cursor: pointer; }
.ed-bascule span { color: var(--cream); font-size: var(--fs-sm); font-weight: 500; }
.ed-bascule input { width: 22px; height: 22px; accent-color: var(--terraLt); }
.ed-pb-note { color: var(--terraLt); }

.ed-vide { padding: var(--sp-4); display: flex; flex-direction: column; gap: var(--sp-2);
           align-items: flex-start; }
.ed-vide h3 { margin: 0; font-family: var(--ff-titre); font-size: var(--fs-lg); }
.ed-vide p { margin: 0; max-width: var(--mesure); }

/* Les cartes de la liste défilante ne se compriment pas (23/09/2026) :
   `flex-direction:column` sur une boîte à hauteur bornée écrase les
   dernières, et on croit que la liste s'arrête là. */
.ed-sel-liste > * { flex: none; }
.ed-sel-carte { height: auto; }

/* DEUX COLONNES (12/10/2026, maquette du 16/09) : l'apercu et sa legende a
   gauche, les reglages et les gestes a droite. Les blocs qui tenaient toute
   la largeur du panneau perdent leur marge de panneau et se separent d'un
   filet, comme les sections de la maquette. */
.ed-corps { grid-template-columns: repeat(auto-fit, minmax(min(100%, 22rem), 1fr)); }
.ed-visuel > .ed-fil { align-self: stretch; margin: 0; padding: var(--sp-3) 0 0;
  border-top: var(--tr-clair); }
.ed-reglages { background: none; padding: 0; gap: var(--sp-3); }
.ed-reglages > .ed-reseaux { padding: 0; }
.ed-reglages .ed-note-reseau { margin: var(--sp-1) 0 0; padding: var(--sp-2) var(--sp-3);
  background: var(--cream); border-radius: var(--r-sm); }
.ed-reglages > .ed-props, .ed-reglages > .ed-photos, .ed-reglages > .ed-alt,
.ed-reglages > .ed-actions { border-top: var(--tr-clair); padding-top: var(--sp-3); }
.ed-reglages > .ed-photos { justify-content: flex-start; }
.ed-reglages > .ed-actions { padding-left: 0; padding-right: 0; }
.ed-reglages > .ed-msg { padding: 0; }
.ed-reglages > .ed-suite { padding: var(--sp-3) 0 0; background: none; }

/* ---- lot A (19/10/2026) : la photo ne couvre pas le format choisi ---- */
.ed-q { flex: 1 1 100%; margin: 0; font-size: var(--fs-sm); color: var(--ink2); }
.ed-q.bas { color: var(--terraDk); font-weight: 600; }

/* L'ecran « Ma formule » d'un eleveur (20/10/2026, pb/front_eleveur.py).
   Toutes ses regles commencent par `el-` : il vit dans /pro, a cote de
   regles qu'il ne doit pas toucher. Aucune valeur brute (CLAUDE.md). */
.el-tete{margin-bottom:var(--sp-4)}
.el-tete h1{margin:0}
.el-carte{margin-bottom:var(--sp-4)}
.el-carte h2{margin:0 0 var(--sp-2)}
.el-sur{font-family:var(--ff-mono);font-size:var(--fs-xs);letter-spacing:.1em;
  text-transform:uppercase;color:var(--ink3);margin:0 0 var(--sp-1)}
.el-tuiles{display:grid;grid-template-columns:repeat(auto-fit,minmax(10rem,1fr));
  gap:var(--sp-2);margin-top:var(--sp-3)}
.el-tuile{background:var(--cream);border-radius:var(--r-md);padding:var(--sp-3);
  display:flex;flex-direction:column;gap:var(--sp-1)}
.el-tuile-c{font-family:var(--ff-mono);font-size:var(--fs-xs);letter-spacing:.08em;
  text-transform:uppercase;color:var(--ink3)}
.el-tuile b{font-size:var(--fs-xl);color:var(--ink)}
.el-tuile small{color:var(--ink3)}
.el-liste{list-style:none;padding:0;margin:var(--sp-3) 0}
.el-portee{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-2) var(--sp-3);
  padding:var(--sp-3) 0;border-bottom:var(--tr)}
.el-portee > div{flex:1 1 16rem;min-width:0}
.el-portee small{display:block;color:var(--ink3);overflow-wrap:anywhere}
.el-etat{display:inline-flex;align-items:center;min-height:var(--sp-5);padding:0 var(--sp-2);
  border-radius:var(--r-pill);font-size:var(--fs-sm);background:var(--cream2);color:var(--ink2)}
.el-etat.el-active{background:var(--greenLt);color:var(--greenDk)}
.el-etat.el-close{background:var(--cream2);color:var(--ink3)}
.el-nouvelle summary{cursor:pointer;min-height:var(--cible);display:inline-flex;
  align-items:center;color:var(--terraDk);font-weight:600}
.el-form{display:grid;grid-template-columns:repeat(auto-fit,minmax(14rem,1fr));
  gap:var(--sp-2) var(--sp-3);margin-top:var(--sp-2)}
.el-form label{display:flex;flex-direction:column;gap:var(--sp-1);font-size:var(--fs-sm);
  color:var(--ink2)}
.el-form p{grid-column:1/-1;margin:0}
.el-offres{display:grid;grid-template-columns:repeat(auto-fit,minmax(14rem,1fr));
  gap:var(--sp-3)}
.el-offre{position:relative;border:var(--tr);border-radius:var(--r-md);padding:var(--sp-4);
  background:var(--paper)}
.el-offre.actuelle{border-color:var(--ink)}
.el-offre h3{margin:0 0 var(--sp-1)}
.el-offre ul{padding-left:var(--sp-4);margin:var(--sp-2) 0;color:var(--ink2);font-size:var(--fs-sm)}
.el-prix{font-size:var(--fs-lg);font-weight:600;color:var(--ink);margin:0}
.el-badge-f{display:inline-block;margin-bottom:var(--sp-2);padding:var(--sp-1) var(--sp-2);
  border-radius:var(--r-pill);background:var(--ink);color:var(--paper);font-family:var(--ff-mono);
  font-size:var(--fs-xs);letter-spacing:.08em;text-transform:uppercase}
.el-badge-etat{font-weight:600;color:var(--ink)}

/* ---------------------------------------------------------------------------
   SOCLE - ce qui vaut pour TOUTES les pages, servi en DERNIER par chaque
   feuille composee (front.css, css_pro, css_foyer, css_admin, la feuille
   legale). Maquette du 29/09/2026, reprise sans sa couche commerciale.

   Trois regles, et seulement celles qui ne dependent d'aucun ecran :

   1. le contour d'un champ se voit sans etre survole (3:1 au moins) ;
   2. l'anneau de focus se voit aussi sur fond encre ;
   3. les deux messages de l'arrete du 28 juin 2023, sur toutes les pages.

   Rien ici ne met en page un ecran. Une regle propre a un ecran va dans la
   feuille de cet ecran ; une valeur va dans tokens.css.
--------------------------------------------------------------------------- */

/* 1. Champs : --cream3 sur papier tenait a 1,15 de contraste. Une seule regle,
   apres les feuilles de page : elle gagne sur les « border:var(--tr) » ecrits
   a cote de chaque formulaire, sans toucher a l'epaisseur ni au rayon. */
html input:not([type=checkbox]):not([type=radio]):not([type=file]):not([type=range]):not([type=submit]):not([type=button]):not([type=hidden]),
html select,html textarea{border-color:var(--champ-bord)}
html input:not([type=checkbox]):not([type=radio]):not([type=file]):not([type=range]):not([type=submit]):not([type=button]):not([type=hidden])::placeholder,
html textarea::placeholder{color:var(--ink3)}

/* 2. Focus sur fond sombre : panneau lateral des espaces, enseigne du
   portail. L'anneau terracotta y tombe a 2,4 ; le terracotta clair tient 5,1. */
/* Et toutes les surfaces sombres qui portent une commande : la marche au
   clavier de l'audit (10/10/2026) en a trouve neuf ou l'anneau terracotta
   tombait a 2,86 - la regle ne connaissait que le panneau et l'enseigne.
   Une surface encre de plus se nomme ici ; l'audit la trouvera sinon.
   On nomme la SURFACE, pas le bloc qui la contient : `.qma-trois` porte
   une grille de cartes claires, et l'anneau clair y tombait a 2,36. */
.panneau :focus-visible,.enseigne :focus-visible,.bloc-alerte :focus-visible,
.carte .hero :focus-visible,.carte .agir :focus-visible,.carte .ct :focus-visible,
.fam-prio :focus-visible,.cd-prio :focus-visible,.qma-trois-tete :focus-visible,.qma-trois-suite :focus-visible,
.sd-verdict :focus-visible,.ed-pb :focus-visible,
.priorites :focus-visible,.me-carte.str :focus-visible{outline:var(--focus-sur);outline-offset:var(--focus-ecart)}

/* 3. Les messages de l'arrete du 28 juin 2023. Forme imposee par l'arrete,
   pas par nous : fond jaune, texte noir, bandeau permanent pleine largeur
   d'au moins 7 % de la hauteur de la fenetre ; le message d'entree occupe au
   moins 70 % de la fenetre. Il vivait dans app.css, que /pro et /admin ne
   servent pas : depuis le 02/10/2026 il est sur toutes les pages (decision
   de Claire), donc ici.

   L'arrete nomme la police Marianne. Nous ne l'embarquons pas : c'est la
   police de la marque de l'Etat, dont l'usage est reserve a ses services.
   Le texte, qui est l'obligation de fond, passe dans la police du site. */
/* Un liseré tricolore en tête du bandeau : les couleurs de la France, sans
   emblème. C'est ce qui signale « ceci vient de l'État » sans reproduire
   une marque que le secteur privé n'a pas le droit d'employer. */
.sensib{position:relative;background:var(--jaune-etat);
  color:var(--noir-etat);min-height:7vh;display:flex;align-items:center;
  gap:var(--sp-5);padding:var(--sp-3) var(--sp-5)}
.sensib::before{content:"";position:absolute;top:0;left:0;right:0;height:4px;
  background:linear-gradient(90deg,
    var(--bleu-france) 0 33.34%,
    var(--paper) 33.34% 66.67%,
    var(--rouge-france) 66.67% 100%)}
.sensib .sensib-message{flex:1 1 auto;max-width:96ch;display:grid;gap:var(--sp-1)}
.sensib p{margin:0;max-width:96ch;
  font-size:var(--fs-base);line-height:1.5;font-weight:500}
.sensib a{color:var(--noir-etat);text-underline-offset:3px}
.sensib .sensib-traduction{font-size:var(--fs-sm);font-weight:400}
/* La source du message, pas un emblème.
   Elle occupait un grand rectangle blanc, en capitales monospace, et criait
   plus fort que le message qu'elle accompagne - alors qu'elle n'est qu'une
   note de bas de page. Elle redevient ce qu'elle est : une mention discrète,
   posée sur le jaune, sans encadré. */
.sensib .sensib-src{font-size:var(--fs-xs);line-height:1.4;font-weight:700;
  color:var(--noir-etat)}
@media (max-width:700px){
  .sensib{flex-direction:column-reverse;align-items:flex-start}
  .sensib .sensib-message{max-width:none}
}

/* Le certificat s'imprime seul : pas de bandeau sur le papier. */
@media print{ .sensib{display:none} }

/* 4. Vingt-cinq langues ne tiennent pas dans une pilule (lot 4, 02/10/2026).
   Le menu pays des espaces connectes est style deux fois (coquille.css et
   parlez.css, servie apres) : la grille vit donc ici, servie en dernier. */
.pz-bp-menu .seg{display:grid;grid-template-columns:repeat(5,1fr);width:100%;
  gap:1px;background:var(--cream3);border-radius:var(--r-md)}
.pz-bp-menu .seg a{justify-content:center;padding:0;background:var(--paper)}

/* 5. La barre pays a 390 px (maquette du 02/10/2026) : le code, pas le nom.
   Le nom reste lisible au lecteur d'ecran (masque visuellement).
   LES DEUX BARRES, pas une seule (controle QA du 13/10/2026) : celle des
   espaces connectes (`.pz-bp-nom`) le faisait deja ; celle de l'accueil et
   des resultats (`#paysNom`) passait en `display:none`, qui retire le texte
   de l'arbre d'accessibilite. Drapeau et fleche etant decoratifs, le bouton
   s'annoncait « bouton, reduit » sans dire quel pays il porte. */
.pz-bp-code{display:none;font-family:var(--ff-mono);font-size:var(--fs-sm);
  letter-spacing:.06em;color:var(--ink)}
@media (max-width:560px){
  .pz-bp-code{display:inline}
  .pz-bp-nom,.nav-pays #paysNom{position:absolute;width:1px;height:1px;overflow:hidden;
    clip:rect(0 0 0 0);white-space:nowrap}
}

/* 6. Mouvement reduit (maquette du 02/10/2026) : une seule regle, valable
   pour toutes les pages qui servent cette feuille. Une personne que les
   animations rendent malade l'a demande a son systeme ; nous le suivons. */
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation-duration:.01ms !important;
    animation-iteration-count:1 !important;transition-duration:.01ms !important;
    scroll-behavior:auto !important}
}

/* LA BARRE DES PAGES PUBLIQUES (front_legal._page, 02/10/2026) : la langue
   dans un <details>, « Mon espace » en lien. Le menu s'ancre a la barre :
   ancre au bouton, il sortirait de l'ecran a gauche sur telephone. */
.nav:has(.nav-legal){position:relative;display:flex;align-items:center;gap:var(--sp-2);flex-wrap:wrap}
.nav-legal{margin-left:auto}
.nav-legal-code{font-family:var(--ff-mono);font-size:var(--fs-sm)}
.nav-legal summary{display:inline-flex;align-items:center;gap:var(--sp-2);min-height:var(--cible);
  padding:0 var(--sp-4);border:var(--tr);border-radius:var(--r-pill);cursor:pointer;list-style:none;
  background:var(--paper);color:var(--warm);font-weight:600}
.nav-legal summary .car{font-weight:400}
.nav-legal summary:hover{border-color:var(--terraLt)}
.nav-legal summary::-webkit-details-marker{display:none}
.nav-legal[open] .seg{position:absolute;right:0;top:100%;z-index:5;display:grid;
  grid-template-columns:repeat(5,1fr);width:min(100%,24rem);background:var(--paper);border-radius:var(--r-md)}
.nav-legal .seg a{justify-content:center;padding:0;border:0;margin:0}
.nav-espace-l{display:inline-flex;align-items:center;min-height:var(--cible);padding:0 var(--sp-4);
  border-radius:var(--r-pill);background:var(--terra);color:var(--paper);font-weight:600;
  text-decoration:none;white-space:nowrap}
.nav-espace-l:hover{background:var(--terraDk);color:var(--paper)}
/* La marque est un lien sur ces pages : ni soulignee, ni bleue. */
a.marque,a.marque:visited{text-decoration:none;color:inherit}
a.marque:hover .brand{color:var(--terraDk)}
/* Un lien seul dans son paragraphe n'est pas un lien dans le texte : c'est
   une commande qu'on touche, donc une cible tactile (audit du 02/10/2026,
   « Tarifs » a 19 px sur /cgu). */
a.lien-seul{display:inline-flex;align-items:center;min-height:var(--cible)}
/* UN CHAMP DE FICHIER DIT SON GESTE DANS LA LANGUE DE LA PAGE (maquette du
   29/09/2026). Le bouton natif parle la langue du NAVIGATEUR (« Parcourir… »,
   « Choose file ») et s'annonce « bouton, parcourir » : on le masque, sans le
   retirer - il reste focalisable et garde son nom accessible - et l'etiquette
   montre le geste. Le fichier part des le choix, donc aucun nom de fichier a
   afficher. Un champ de 1 px n'est pas une cible : c'est le bouton visible
   qui l'est, et c'est lui que l'audit mesure. */
.fichier{position:relative;display:inline-flex;align-items:center;cursor:pointer}
.fichier input[type=file]{position:absolute;inset:0 auto auto 0;width:1px;height:1px;
  opacity:0;overflow:hidden}
.fichier-b{display:inline-flex;align-items:center;min-height:var(--cible);
  padding:0 var(--sp-4);border:1px solid var(--champ-bord);border-radius:var(--r-sm);
  background:var(--paper);color:var(--ink);font-weight:600;box-sizing:border-box}
.fichier:hover .fichier-b{border-color:var(--terra)}
.fichier:focus-within .fichier-b{outline:var(--focus);outline-offset:var(--focus-ecart)}

/* Le champ de commune est un textarea d'une ligne qui s'agrandit
   (front_ecrans.champCommune, 05/10/2026) : il passe a la ligne au lieu de
   rogner « Saint-Rémy-de-Provence (13210) ». Sa hauteur suit son contenu
   (ajusterCommune) ; il ne se redimensionne pas a la main et ne defile
   jamais. */
textarea.cp-champ{resize:none;overflow:hidden;line-height:1.35;white-space:pre-wrap;
  overflow-wrap:anywhere;vertical-align:top}

/* Un champ DATE ou HEURE n'avait pas d'anneau (quatre ecrans, audit du 10/10/2026).
   Le focus porte sur une partie INTERNE (le jour, le mois), et selon
   l'historique de la page Chromium ne fait pas correspondre `:focus` sur
   l'hote - mesure : element actif, page focalisee, `:focus` faux,
   `:focus-within` vrai. Une regle ecrite sur `:focus` ne pouvait rien. */
html :is(input[type=date],input[type=time],input[type=datetime-local],
  input[type=month],input[type=week]):focus-within{outline:var(--focus);outline-offset:var(--focus-ecart)}

/* 7. UN bouton principal, terracotta, sur toutes les pages (maquette du
   29/09/2026, « regle 3 »). Les espaces le peignaient a l'encre : c'etait
   l'ancien habillage, la maquette l'a unifie. Le texte papier sur terracotta
   tient 4,9:1. Le secondaire (.sec, .cpt-sec) et le danger (.dang) gardent
   leur peau ; seule la couleur du plein change ici, pas sa taille.
   Deux boutons de la fiche n'en sont pas, et la maquette les garde ainsi :
   « Ecrire au refuge », secondaire a contour, et « Decrire ma situation »,
   a l'encre dans son pli. Repeints en terracotta, trois pleins se suivaient
   et l'appel principal ne se distinguait plus (QA du 13/10/2026). Ils sont
   exclus par `:not(:where(...))`, qui ne pese RIEN : la regle garde son
   poids (0,3,1) pour tous les autres boutons. */
html .nav-espace,html .btn:not(.sec):not(.dang):not(:where(.f-agir .ecrire,.dial.vide .btn)),
html .cpt .cpt-b:not(.cpt-sec):not(.cpt-dang){
  background:var(--terra);color:var(--paper)}
html .nav-espace:hover,html .btn:not(.sec):not(.dang):not(:where(.f-agir .ecrire,.dial.vide .btn)):hover,
html .cpt .cpt-b:not(.cpt-sec):not(.cpt-dang):hover{background:var(--terraDk);color:var(--paper)}
html .nav-espace .car{color:currentColor}

/* Dans la colonne du site (.wrap), un titre legal allemand
   (« Allgemeine Nutzungsbedingungen ») ne tenait plus a 360 px : 254 px pour
   250. Il se coupe a la syllabe dans la langue de la page, jamais au milieu
   d'une lettre (audit du 11/10/2026). */
.wrap > main :is(h1,h2){hyphens:auto;overflow-wrap:break-word}

/* LE PIED, L'ESSENTIEL SUR UNE LIGNE (15/10/2026), sur l'accueil et
   l'espace famille : ici, la feuille que toutes les pages servent. La marque puis les
   liens que la loi demande, qui s'enroulent sur un telephone. */
footer.pied-min{padding:var(--sp-5) 0;border-top:var(--tr)}
.pied-min .pied-liens{display:flex;flex-wrap:wrap;align-items:center;gap:0 var(--sp-3);margin:0;font-size:var(--fs-sm)}
@media (max-width:700px){ .pied-min .pied-logo{flex-basis:100%} }

/* CE QUE DIT L'ANNONCE, EN PASTILLES (15/10/2026) : cartes des resultats,
   de « Qui m'attend » et tete de la fiche - ici, la feuille que toutes
   les pages servent. Vert dit oui, rouge dit non, or ne dit rien ; la sante
   n'est jamais rouge : neutre, ou orange quand elle est serieuse. */
.pastilles{display:flex;flex-wrap:wrap;gap:var(--sp-1);margin:var(--sp-2) 0 0;padding:0;list-style:none}
.past{display:inline-flex;align-items:center;gap:5px;padding:3px 9px 3px 5px;border-radius:var(--r-pill);
  border:1px solid transparent;font-family:var(--ff-corps);font-size:var(--fs-xs);font-weight:600;line-height:1.3;white-space:nowrap}
.past svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:1.4;stroke-linecap:round}
.past svg ellipse,.past svg circle{fill:none}
.past-img{width:18px;height:18px;border-radius:var(--r-circle);object-fit:cover}
.past-eur{display:inline-grid;place-items:center;width:16px;font-weight:700}
.past b{font-weight:700}
.past.oui{background:var(--greenLt);color:var(--greenDk);border-color:var(--greenLt)}
.past.non{background:var(--rougeLt);color:var(--rougeDk);border-color:var(--rougeBord)}
.past.q{background:var(--goldPale);color:var(--goldDk);border-color:var(--filet-or)}
.past.info{background:var(--cream);color:var(--ink2);border-color:var(--cream3)}
.past.attn{background:var(--goldLt);color:var(--goldDk);border-color:var(--gold)}

/* Le texte reserve aux lecteurs d'ecran, sur TOUTES les pages : les
   pastilles de l'espace famille en portent aussi (15/10/2026). */
.hors-ecran{position:absolute;width:1px;height:1px;padding:0;margin:-1px;
  overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}
