/* ---------------------------------------------------------------------------
   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%;
}

*{box-sizing:border-box}
/* `hidden` doit gagner contre tout `display` pose par une classe.
   Sans cette regle, .sec{display:flex} l'emporte sur la valeur par defaut
   du navigateur et la section reste visible : l'accueil affichait le titre
   « Ils s'epanouiraient chez vous » au-dessus d'une liste vide. */
[hidden]{display:none !important}
body{margin:0;background:var(--cream);color:var(--ink);
  font-family:var(--ff-corps);
  font-size:var(--fs-md);line-height:1.55;-webkit-font-smoothing:antialiased}
h1,h2,h3{font-family:var(--ff-titre);font-weight:600;margin:0;
  line-height:1.12;letter-spacing:-.005em;text-wrap:balance}
a{color:var(--terra)}
.wrap{max-width:1180px;margin:0 auto;padding:0 26px}

/* micro-libelles en mono capitales, tres espaces */
.lab{font-family:var(--ff-mono);font-size:var(--fs-xs);
  letter-spacing:.16em;text-transform:uppercase;color:var(--warm)}

/* barre */
.nav{display:flex;align-items:center;gap:var(--sp-3);
  padding:var(--sp-5) 0 var(--sp-4)}
/* Le logo est un bouton : il doit donc annuler l'habillage du navigateur
   sans perdre l'apparence qu'il avait quand il n'en etait pas un. */
.marque{display:flex;align-items:center;gap:var(--sp-3);background:none;border:0;
  padding:0;color:inherit;cursor:pointer}
.marque:hover .brand{color:var(--terraDk)}
/* La marque est a la taille du titre : --fs-display, soit le meme
   clamp(27px, 3,6vw, 40px). Les deux grandissent donc ensemble d'un
   telephone a un grand ecran, au lieu de diverger.

   La patte est dimensionnee en `em` et non en pixels : c'est ce qui la fait
   suivre le clamp. Des pixels fixes l'auraient laissee minuscule a cote
   d'une marque de 40 px sur grand ecran, et enorme a cote de 27 sur
   telephone. Les rapports (1,58 et 1,70) sont ceux d'origine. */
.marque{font-size:var(--fs-display)}
.paw{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;white-space:nowrap;transition:color var(--t-court) var(--e)}
/* La baseline est un cran SOUS la marque, pas a sa hauteur.
   A --fs-display elle mesurait 496 px contre 251 pour « Patte Blanche » :
   son interlettrage de petite capitale la rend deux fois plus large a
   taille egale, si bien qu'elle criait plus fort que le nom qu'elle
   accompagne. A --fs-3xl elle reste presente sans dominer.
   L'interlettrage est reduit de .16em a .02em : a cette taille, l'espacement
   des petites capitales etirait la ligne sans rien ajouter a la lecture. */
.nav .right{margin-left:auto;display:flex;gap:var(--sp-4);align-items:center;
  font-size:var(--fs-sm);color:var(--ink3);letter-spacing:.14em}
/* --fs-3xl, c'etait la taille d'un titre pour une baseline : elle
   concurrencait la marque au lieu de la souligner (porteur du projet,
   02/09/2026). Une etiquette : petite, espacee, en retrait. */

/* Entree de l'espace des structures.
   -----------------------------------------------------------------------
   Cet espace existait, servait sur /pro, et RIEN n'y menait : ni la barre,
   ni le pied de page. Il etait joignable en tapant l'adresse, c'est-a-dire
   par personne - zero compte cree.

   Traite comme une cible tactile a part entiere (--cible) : le benevole qui
   le cherche le fait souvent depuis un telephone, une fois par an, et rate
   un lien de texte serre entre deux autres. */
.pro-lien{display:inline-flex;align-items:center;min-height:var(--cible);
  padding:var(--sp-2) var(--sp-4);margin-left:var(--sp-4);
  font-size:var(--fs-base);color:var(--terra);text-decoration:none;
  border:var(--tr);border-radius:var(--r-pill);white-space:nowrap}
.pro-lien:hover,.pro-lien:focus-visible{background:var(--cream);
  color:var(--terraDk)}
/* Cible tactile pleine : mesure a 360 px, le lien faisait moins de 44 px
   de haut. C'est la porte d'entree des structures ; la rater au doigt
   revient a ne pas l'avoir. */
.pied-lien{display:inline-flex;align-items:center;min-height:var(--cible);
  color:var(--terra);font-weight:600}
.pied-lien:hover,.pied-lien:focus-visible{color:var(--terraDk)}
/* Et la LARGEUR, au doigt (QA du 13/10/2026) : « Tarifs » faisait 37 px de
   large pour 44 de haut - un libelle court fait une cible etroite. Ce n'est
   pas un lien au milieu d'une phrase, c'est une ligne de liens. */
@media (pointer:coarse){
  .pied-lien{min-width:var(--cible);justify-content:center}
}

/* bandeau d'entete : titre + panneau foyer
   -----------------------------------------------------------------------
   Mesure a 1 440 : la prose tenait sur 477 px dans une colonne qui en offre
   660, et le panneau foyer, haut de 131 px a cote d'un texte de 173,
   laissait un trou sous lui a droite. Tout le poids tombait a gauche alors que la place
   existait. Deux corrections, aucune n'ajoute d'ornement :
     - la prose reprend la mesure de lecture du produit (--mesure, 65
       caracteres) au lieu d'un 52ch pose a la main : deux lignes au lieu de
       trois, et la colonne est occupee jusqu'au bout ;
     - le panneau s'etire a la hauteur du texte (`align-items:stretch`) : les
       deux moities du bandeau se terminent ensemble. */
.top{background:var(--cream2);border-radius:var(--r-lg);padding:var(--sp-6);
  display:flex;gap:var(--sp-6);align-items:stretch;flex-wrap:wrap}
/* min-width:300px + 72 px de padding du panneau + 52 px de la page = 424 px
   de largeur minimale. En dessous, la page deborde : mesure 362 px de
   contenu pour 360 de fenetre. `min()` laisse la colonne se replier au lieu
   de pousser. */
.top .txt{flex:1 1 420px;min-width:min(300px,100%)}
.top h1{font-size:var(--fs-display)}
.top h1 em{font-style:italic;color:var(--terra);display:block}
.top p{color:var(--ink3);margin:var(--sp-4) 0 0;max-width:var(--mesure);
  font-size:var(--fs-md)}
.foyer{background:var(--paper);border-radius:var(--r-md);padding:var(--sp-4);
  min-width:min(290px,100%);flex:0 1 360px}
.foyer .hd{display:flex;align-items:center;margin-bottom:var(--sp-3)}
/* Vise la COMMANDE, pas la balise. « Modifier » etait un `<a href="#">` -
   un lien sans destination - et la regle le ciblait par `a`. Le jour ou il
   est devenu le bouton qu'il aurait toujours du etre, il s'est colle au
   libelle « Votre foyer ». Un selecteur qui depend de la balise casse des
   qu'on corrige la balise. */
.foyer .hd .lien{margin-left:auto;font-size:var(--fs-base);
  text-decoration:none}
.foyer .hd .lien:hover{text-decoration:underline}
.chips{display:flex;flex-wrap:wrap;gap:var(--sp-2);align-content:flex-start}
.chip{background:var(--cream);border:var(--tr);border-radius:var(--r-pill);
  padding:var(--sp-1) var(--sp-3);font-size:var(--fs-sm);color:var(--ink2)}

/* filtres */
.filters{display:flex;gap:8px;align-items:center;flex-wrap:wrap;
  padding:26px 0 4px}
.f{border:var(--tr-fort);background:var(--paper);border-radius:var(--r-pill);
  padding:8px 16px;font:inherit;font-size:var(--fs-base);color:var(--ink2);
  cursor:pointer;transition:var(--t-court) var(--e);white-space:nowrap}
.f:hover{border-color:var(--terraLt)}
select.f{max-width:230px}


.f[aria-pressed="true"]{background:var(--ink);border-color:var(--ink);
  color:var(--paper)}
.f.app{border-color:var(--terra);color:var(--terra);background:var(--paper)}
/* .7 ramenait la croix a 2,47 de contraste : le geste le plus utile de la
   barre - retirer un filtre - etait le moins lisible. L'attenuation la
   distinguait du libelle ; une taille legerement moindre y suffit. */
.f.app .x{margin-left:7px;font-size:var(--fs-sm)}
/* « Réinitialiser » retire les pastilles voisines : il ne doit pas leur
   ressembler, sinon on le prend pour un filtre de plus et on le coche.
   Trait discontinu, encre sourde, aucune couleur de marque. */
.f.raz{border:1px dashed var(--cream3);color:var(--warm);background:none}
.f.raz:hover{border-color:var(--warm);color:var(--ink3)}
/* Meme faute que sur .f.app, commise le meme jour : .6 ramenait la croix
   a 2,47. La pastille est deja discrete par son trait discontinu et son
   encre sourde ; attenuer en plus le seul symbole qu'on doit reconnaitre
   etait une attenuation de trop. */
.f.raz .x{margin-left:7px;font-size:var(--fs-sm)}
.filters .note{margin-left:auto;font-size:var(--fs-sm);color:var(--warm);
  text-align:right}

/* titre de section + compte */
.sec{display:flex;align-items:baseline;gap:12px;padding:26px 0 14px;
  flex-wrap:wrap}
.sec h2{flex:0 0 auto}
.sec h2{font-size:var(--fs-2xl)}
.sec .cnt{background:var(--cream3);border-radius:var(--r-pill);padding:2px 10px;
  font-size:var(--fs-sm);color:var(--ink3)}
.sec .sub{margin-left:auto;font-size:var(--fs-sm);color:var(--warm)}

/* grille de cartes */
.grid{display:grid;gap:20px;padding-bottom:56px;
  grid-template-columns:repeat(auto-fill,minmax(300px,1fr))}
.card{background:var(--paper);border:var(--tr);
  border-radius:14px;overflow:hidden;display:flex;flex-direction:column;
  box-shadow:var(--sh);cursor:pointer;transition:var(--t-court) var(--e)}
.card:hover{transform:translateY(-2px);border-color:var(--terraLt)}
.card.sale{border-top:3px solid var(--terra)}
/* L'image est sortie du flux : sinon une photo en portrait impose sa
   propre hauteur au conteneur et le rapport 4/3 saute. */
/* Sur sa propre ligne : `width:100%` ne suffit pas dans un conteneur
   flex, il faut imposer la base pour provoquer le retour. */
.ph{position:relative;aspect-ratio:4/3;background:var(--cream2);
  overflow:hidden}
.ph img{position:absolute;inset:0;width:100%;height:100%;
  object-fit:cover;display:block}
.ph .badge{position:absolute;top:10px;left:10px;background:rgba(255,253,249,.95);
  border-radius:var(--r-pill);padding:4px 11px;font-size:var(--fs-sm);font-weight:600;
  color:var(--greenDk);display:flex;align-items:center;gap:5px}
.ph .badge .dot{width:6px;height:6px;border-radius:var(--r-circle);background:var(--green)}
.ph .badge.att{background:var(--paper);color:var(--gold)}
.ph .badge.att .dot{background:var(--gold)}
.ph .badge.v{color:var(--terraDk)}
.ph .badge.urgent{color:var(--rouge)}
.ph .badge.v .dot{background:var(--terra)}
/* Attente longue. Pleine et terracotta, pas discrete : c'est la seule
   information qu'aucun autre site n'affiche, et celle qui change un regard.
   Au-dela d'un an, on cesse de la murmurer. */
.ph .badge.long{background:var(--terra);color:var(--paper);font-weight:700}

/* Nouveau. Vert plein : c'est la seule vignette de la carte qui annonce une
   bonne nouvelle, et elle ne peut jamais coexister avec l'attente longue.
   Voir front.est_nouveau - elle ne s'affiche que lorsque le corpus est
   assez ancien pour que « nouveau » veuille dire quelque chose. */
.ph .badge.neuf{background:var(--green);color:var(--paper);font-weight:700}

/* Le mot medical, et ce qu'il veut dire, sur la carte. Toutes les affections
   sont montrees, chacune de sa couleur ; le libelle explicatif n'apparait
   qu'une fois, pour la plus lourde. */
.mal{align-self:flex-start;display:inline-flex;align-items:baseline;gap:var(--sp-1);
  border-radius:var(--r-pill);padding:3px 10px;
  font-size:var(--fs-xs);font-weight:600}
/* L'opacite .85 faisait tomber « · se gère » a 4,10 sur le fond ambre de
   la pastille. C'est le mot qui explique l'affection - ce que le produit
   promet d'expliquer justement. La graisse le distingue deja du nom du
   mal ; l'attenuer en plus ne servait qu'a le rendre penible a lire. */
.mal span{font-weight:400}
.mal.soigne{background:var(--greenLt);color:var(--greenDk)}
.mal.gere{background:var(--goldLt);color:var(--goldDk)}
.mal.vit{background:var(--calmLt);color:var(--calmDk)}
.mal.serieux{background:var(--calmPlein);color:var(--calmSurPlein)}
/* Une affection citee sans certitude porte un « ? » et un trait
   interrompu : le doute se voit sur la pastille, il n'a pas besoin
   d'etre re-ecrit a cote de chaque nom. */
.mal.doute{background:none;box-shadow:inset 0 0 0 1px currentColor;
  opacity:.85}
/* « Serieux » est le seul regime dont l'encre est CLAIRE : elle vit sur un
   fond plein. Sans cette ligne, la variante douteuse - qui retire le fond -
   ecrivait du creme sur du creme, contraste 1,00, texte invisible. Et ce
   n'est pas un cas rare : la leucose est mentionnee sans resultat sur 447
   fiches contre 136 affirmees, donc c'etait le cas DOMINANT du regime. */
.mal.serieux.doute{color:var(--calmDk)}
.mal i{font-style:normal;font-weight:700;margin-left:3px}
.maux{display:flex;flex-wrap:wrap;align-items:baseline;gap:var(--sp-1)}
.maux .mal{margin:0}
.mq{flex:1 0 100%;color:var(--warm);font-size:var(--fs-xs)}
/* Deux contraintes qu'aucun autre site n'affiche : la zone d'adoption, et la
   date a laquelle nous avons constate l'annonce en ligne. Elles ne
   s'affichent que lorsqu'elles CONTRAIGNENT - la norme ne merite pas de
   pixels, l'exception oui. */
/* Visible seulement pour les technologies d'assistance. `display:none` les
   cacherait aussi : il faut sortir du cadre, pas disparaitre. */
/* Petits ecrans : rendre au CONTENU la place que prend l'habillage.
   Mesure a 360 x 640 : le panneau foyer faisait 572 px dont 174 d'en-tete et
   148 de pied - 56 % de decor - et n'exposait que 250 px des 1 736 px de
   questions, soit 14 % a la fois. Le bloc sombre, lui, depensait 34 px de
   marge de chaque cote, soit 19 % de la largeur d'un telephone. */
@media (max-width:560px){
  /* `white-space:nowrap` sur « Vous etes une structure ? » poussait le
     bord droit du document a 471 px pour une fenetre de 360 : la PAGE
     entiere defilait de travers, sur tous les ecrans, parce que la barre
     est partout. Mesure par tools/audit.py, invisible a la relecture.
     La barre passe donc a la ligne et le lien s'y etale. */
  .nav{flex-wrap:wrap}
  .pro-lien{white-space:normal;margin-left:0;flex:1 1 100%;
    justify-content:center;text-align:center}
  /* A 27 px, « Patte Blanche » et la baseline ne tiennent pas cote a cote :
     le nom se cassait en deux lignes. La baseline est un ornement, le nom
     est la marque - c'est l'ornement qui cede. */
  .nav .right{display:none}
  .foyer-form .fh{padding:14px 18px 12px}
  .foyer-form .fh h2{font-size:var(--fs-xl)}
  .foyer-form .fh p{display:none}
  .foyer-form .ff{padding:12px 18px}
  .foyer-form .fb{padding-left:18px;padding-right:18px}
  .bloc-alerte{padding:var(--sp-5) var(--sp-4) var(--sp-4)}
  .top{padding:var(--sp-5) var(--sp-4)}
}

/* Cibles tactiles.
   Le pointeur grossier - un doigt - vise moins bien qu'une souris. La regle
   ne s'applique donc QUE la : `pointer:coarse`. Elle agrandit sans rien
   deplacer, en jouant sur la hauteur minimale et l'alignement vertical. */
@media (pointer:coarse){
  /* Une REGLE, plus une liste de selecteurs.
     La premiere version enumerait les commandes connues, et ne couvrait donc
     que celles auxquelles j'avais pense. L'audit etendu aux ecrans ouverts
     par le script en a trouve quatre qui manquaient - dont « Annonce
     d'origine », le lien vers la source, c'est-a-dire l'action la plus
     importante du produit. Une enumeration oublie ; une regle non.
     Les liens en PROSE sont exclus : imposer 44 px a un mot souligne au
     milieu d'un paragraphe casserait l'interligne sans rien gagner. */
  button, input, select, textarea, [role="button"], summary,
  a.sec, a.btn, a.f, a.cta{
    min-height:var(--cible);
  }
  .pills .f, .opt, .dd-t, .f, .lien, a.sec{
    display:inline-flex;align-items:center}
  .foyer-form .close, .doc .close{min-width:var(--cible);
    display:inline-grid;place-items:center;padding:0}
  .carrousel .pause{width:var(--cible);height:var(--cible)}
  /* Une case a cocher ne grossit pas : c'est sa LIGNE qu'on touche. */
  input[type=checkbox], input[type=radio]{min-height:0}
}

/* Un bouton qui a l'apparence d'un lien.
   `<a href="#">` etait employe pour trois commandes - « Modifier »,
   « Toutes les questions », « Revoir mes reponses » - qui ne menent nulle
   part. Un lecteur d'ecran annoncait « lien », et la barre d'espace ne les
   activait pas. Ce sont des boutons ; seule leur peau est celle d'un lien. */
.lien{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)}


/* Le lien d'evitement ne se montre qu'une fois atteint au clavier. */
.evitement{position:absolute;left:var(--sp-2);top:-100px;z-index:var(--z-barre);
  background:var(--paper);color:var(--ink);padding:var(--sp-2) var(--sp-4);
  border-radius:var(--r-sm);box-shadow:var(--sh-2);
  font-size:var(--fs-md);font-weight:600;transition:top var(--t-court) var(--e)}
.evitement:focus{top:var(--sp-2)}

.zn{align-self:flex-start;display:inline-flex;align-items:center;gap:6px;
  color:var(--ink3);font-size:var(--fs-xs);font-weight:600}
.zn::before{content:"";width:6px;height:6px;border-radius:var(--r-circle);
  background:var(--calm);flex:none}
.zn.vieille{color:var(--goldDk)}
/* De l'autre cote de la frontiere : le drapeau tient lieu de pastille. */
.zn.frontiere::before{content:none}
.zn.frontiere svg{width:1.15em;height:auto;flex:none}
.zn.vieille::before{background:var(--goldDk)}
.verif.vieille{color:var(--goldDk)}

/* Date de mise a jour publiee par le refuge.
   -----------------------------------------------------------------------
   481 annonces diffusees n'avaient pas bouge depuis 2023 ou avant, dont 69
   depuis 2017 et 2 depuis 2009. La carte n'en disait rien d'explicite : sa
   duree relative, « 8 ans et 11 mois qu'elle attend », se lit comme un long
   sejour en refuge et non comme une annonce probablement morte.

   Discret par defaut - c'est une mention de provenance, pas une alerte -
   mais souligne au-dela de deux ans, la ou la question change de nature.
   Le doré, pas le rouge : nous ne savons PAS que l'annonce est caduque, la
   source la diffuse toujours. Le rouge affirmerait ce que nous ignorons. */
.maj{margin:var(--sp-2) 0 0;font-size:var(--fs-xs);color:var(--ink3)}
.maj.ancienne{color:var(--goldDk);font-weight:600}
.maj.muette{color:var(--warm);font-style:italic}

/* Confirmee par la structure elle-meme.
   Le vert, et non le doré de la date : ce n'est pas une reserve, c'est le
   seul endroit du produit ou l'information ne vient pas d'un crawl mais du
   refuge lui-meme. Sobre malgre tout - un badge tapageur ferait passer les
   autres annonces pour douteuses, alors qu'elles ne le sont pas : elles
   n'ont simplement pas encore de structure inscrite. */
.conf-pb{margin:var(--sp-2) 0 0;font-size:var(--fs-xs);color:var(--greenDk);
  font-weight:600}
.conf-pb::before{content:"";display:inline-block;width:var(--sp-2);
  height:var(--sp-2);border-radius:var(--r-circle);background:var(--green);
  margin-right:var(--sp-2);vertical-align:middle}

/* L'animal n'est pas encore la.
   -----------------------------------------------------------------------
   2 406 annonces diffusees. Le fait change la decision - on ne s'engage pas
   de la meme facon pour un chien qu'on voit samedi et pour un chien qui
   arrive dans trois mois - donc il se lit avant le reste de la carte.

   Le doré : c'est une reserve, pas un defaut. L'animal existe, l'annonce est
   vraie, il faut seulement du temps. Le rouge est garde pour ce qui empeche.

   `.mur` : la structure ne fait PAS voyager l'animal. Ce n'est plus une
   attente, c'est une impossibilite pour qui n'est pas sur place - alors le
   ton durcit d'un cran. */
.loin{margin:var(--sp-2) 0 0;font-size:var(--fs-xs);color:var(--goldDk);
  font-weight:600;line-height:1.45}
.loin::before{content:"";display:inline-block;width:var(--sp-2);
  height:var(--sp-2);border-radius:var(--r-circle);background:var(--gold);
  margin-right:var(--sp-2);vertical-align:middle;flex:none}
.loin.mur{color:var(--rougeDk)}
.loin.mur::before{background:var(--rouge)}
.ph .route{position:absolute;top:10px;right:10px;background:rgba(255,253,249,.95);
  border-radius:var(--r-pill);padding:4px 11px;font-size:var(--fs-sm);font-weight:600;
  color:var(--ink2)}
/* La page de la source relue a l'ouverture dit que l'animal n'y est plus. */
.carte .retiree{margin:0 0 var(--sp-3);padding:var(--sp-3);border-radius:var(--r-md);
  background:var(--cream2);color:var(--terraDk);font-weight:600;line-height:1.45}
/* L'animal arrive de l'etranger : une pastille dans le corps de la carte. */
/* --goldDk, pas --gold : 2,62 de contraste pour 4,5 exiges a cette taille
   (audit du 21/09/2026, les premieres cartes etrangeres de l'accueil). */
.card .etranger{margin:0;font-size:var(--fs-xs);font-weight:600;color:var(--goldDk)}
/* Le niveau de confiance du lieu, colle au temps : « 1 h 05 · estimé ». */
.ph .route .fiab{font-weight:400;font-size:var(--fs-xs);color:var(--ink3)}
.carte .ct .fiab-note{display:block;margin-top:6px;font-size:var(--fs-xs);
  line-height:1.4;color:var(--paper);opacity:.7}
.body{padding:15px 16px 16px;display:flex;flex-direction:column;gap:7px;flex:1}
.line1{display:flex;align-items:baseline;gap:10px}
/* Le nom prend la place : c'est par lui qu'on reconnait l'animal. */
.line1 h3{font-size:var(--fs-2xl);line-height:1.15}
/* Les sources ecrivent « milou » ou « TIGROU » ; l'initiale est
   normalisee a l'affichage sans toucher a la donnee. */
.line1 h3::first-letter,.doc .hi h2::first-letter{
  text-transform:uppercase}
/* La reference de gestion du refuge sert a retrouver l'animal sur place, pas
   a le reconnaitre : petite, grise, jamais en gras. */
.ref{margin:2px 0 0;font-family:var(--ff-mono);
  font-size:var(--fs-xs);letter-spacing:.08em;color:var(--warm);font-weight:400}
.doc .hi .ref{margin:4px 0 0}
.line1 .fee{margin-left:auto;color:var(--terra);font-weight:600;font-size:var(--fs-base);
  white-space:nowrap}
.line1 .fee small{display:block;font-weight:400;font-size:var(--fs-xs);
  color:var(--warm);text-align:right}
.line2{color:var(--ink3);font-size:var(--fs-base)}

/* Pastille de source : monogramme + nom court, une couleur par source.
   Aucun logo tiers - voir pb/front.SOURCES pour le motif. */
.src-p{display:inline-flex;align-items:center;gap:6px;font-size:var(--fs-sm);
  color:var(--ink3)}
.src-p .mono{display:inline-flex;align-items:center;justify-content:center;
  min-width:26px;height:18px;padding:0 5px;border-radius:var(--r-xs);
  font-family:var(--ff-mono);font-size:var(--fs-xs);
  font-weight:500;letter-spacing:.06em;color:var(--paper)}
.src-p.t-terra .mono{background:var(--terra)}
.src-p.t-green .mono{background:var(--green)}
.src-p.t-gold  .mono{background:var(--gold)}
.src-p.t-warm  .mono{background:var(--warm)}
.app{background:var(--cream);border:var(--tr);border-radius:var(--r-sm);
  padding:8px 10px;font-size:var(--fs-sm);color:var(--ink2)}
.app .lab{display:block;margin-bottom:3px;color:var(--terra)}
.mini{margin-top:auto;padding-top:11px;border-top:var(--tr-clair);
  font-size:var(--fs-sm);color:var(--warm);display:flex;gap:8px;
  justify-content:space-between}

/* fiche */



/* ================= LA FICHE ================= */
/* Elle ne liste plus des criteres : elle met face a face ce que le foyer a
   declare et ce que l'annonce repond. Le verdict est lisible sans defiler,
   et l'inconnu n'est jamais affiche deux fois - il devient une question. */
.doc.carte{max-width:1120px;background:var(--paper);overflow:visible}

/* ---- en-tete immersif ---- */
/* La photo prend sa propre colonne.

   En fond du bandeau, elle subissait un rapport de 2,6:1 (1120 x 430) :
   `cover` y decoupait une bande horizontale au milieu d'une photo carree,
   et l'on voyait une tranche de l'animal, le crane coupe. Aucun reglage de
   `background-position` ne rattrape ce rapport - c'est le rapport qu'il
   fallait changer.

   A gauche la photo, a 46 % de la largeur, soit environ 1,2:1. A droite le
   nom sur l'encre pleine : plus lisible que du blanc sur photo, et la photo
   n'a plus besoin d'etre assombrie pour porter du texte. */
.carte .hero{display:grid;grid-template-columns:46% 1fr;
  background:var(--ink);color:var(--paper);border-radius:18px 18px 0 0;
  overflow:hidden}
.carte .hph{background:var(--ink) center 38%/cover no-repeat;min-height:430px}
/* 38 % et non 50 % : sur une photo d'animal la tete est dans le tiers
   superieur, et c'est elle qu'on regarde. */
.carte .hin{display:flex;flex-direction:column;justify-content:space-between;
  gap:var(--sp-5);padding:22px 34px 30px;min-width:0}
.carte .hero.sans .hph{background:
  repeating-linear-gradient(135deg,var(--inkRaye) 0 10px,var(--ink) 10px 20px)}
.carte .htop{display:flex;align-items:center;gap:12px;flex-wrap:wrap}
.carte .verif,.carte .att{display:inline-flex;align-items:center;gap:8px;
  background:rgba(249,244,234,.12);border:1px solid rgba(249,244,234,.18);
  border-radius:var(--r-pill);padding:7px 14px;font-size:var(--fs-sm);
  color:rgba(249,244,234,.92);backdrop-filter:blur(6px)}
.carte .verif .lm{width:16px;height:17px;flex:none}
.carte .verif .lm ellipse,.carte .verif .lm path:not(.cl){fill:var(--paper)}
.carte .verif .lm .cl{fill:var(--terraLt)}
/* Une case par mois : l'attente se voit avant de se lire. */
.carte .att .mois{display:inline-flex;gap:3px}
.carte .att .mois i{width:7px;height:13px;border-radius:2px;
  background:rgba(249,244,234,.2)}
.carte .att .mois i.on{background:var(--terraLt)}
.carte .hero .close{position:static;margin-left:auto;flex:none;background:rgba(249,244,234,.14);
  color:var(--paper);border:0;width:36px;height:36px;border-radius:var(--r-circle);
  font-size:var(--fs-md);cursor:pointer}
.carte .hero .close:hover{background:rgba(249,244,234,.26)}

.carte .hbas{display:flex;align-items:flex-end;gap:28px;flex-wrap:wrap}
.carte .hnom{flex:1 1 320px;min-width:0}
.carte .hnom h2{font-size:clamp(34px,3.4vw,52px);line-height:1;margin:0;color:var(--paper);
  letter-spacing:-.02em}
.carte .hnom h2::first-letter{text-transform:uppercase}
.carte .hnom .ref{color:rgba(249,244,234,.45);margin:6px 0 0}
.carte .hnom .sous{margin:10px 0 0;font-size:var(--fs-md);color:rgba(249,244,234,.82)}
.carte .hscore{display:flex;flex-direction:column;align-items:flex-start;gap:12px}
/* Le pattometre : une foulee qui marche vers l'utilisateur. */
.carte .pattes{display:flex;gap:6px}
.carte .pt{width:26px;height:28px;display:block;opacity:.28}
.carte .pt.on{opacity:1}
.carte .pt .pw{width:100%;height:100%}
.carte .pt .pw ellipse,.carte .pt .pw path{fill:rgba(249,244,234,.55)}
.carte .pt.on .pw ellipse,.carte .pt.on .pw path{fill:var(--green)}
.carte .accord{background:var(--green);color:var(--paper);border-radius:var(--r-pill);
  padding:9px 18px;font-size:var(--fs-base);font-weight:600}
/* L'invitation prend la place du verdict quand il n'y a pas de verdict a
   rendre. Elle n'est PAS verte : le vert dit « ca s'accorde », et rien ne
   s'accorde encore. Terracotta, comme tout ce qui appelle une action. */
.carte .accord.invite{background:var(--terra);border:0;cursor:pointer;
  font-family:inherit;text-align:left;line-height:1.25;
  transition:background var(--t-court) var(--e)}
.carte .accord.invite:hover{background:var(--terraDk)}

/* ---- corps : dialogue + rail ---- */
.carte .corps{display:grid;grid-template-columns:1fr 330px;gap:20px;
  padding:22px 34px 8px;background:var(--cream)}
.carte .col{min-width:0}

.dial{background:var(--paper);border:var(--tr);
  border-radius:16px;padding:20px 22px}
.dial .dh{display:flex;align-items:center;gap:14px;padding-bottom:14px;
  border-bottom:var(--tr-clair);margin-bottom:16px}
.dial .chez,.dial .rep-t{font-family:var(--ff-mono);
  font-size:var(--fs-xs);letter-spacing:.14em;text-transform:uppercase;
  color:var(--warm)}
.dial .rep-t{margin-left:auto}
.dial .griffe .gr{width:40px;height:14px;color:var(--terraLt)}

/* Chaque critere : une bulle du foyer a gauche, la reponse de l'annonce a
   droite. La citation est la seule source de verite. */
.ech{display:grid;grid-template-columns:minmax(0,42%) minmax(0,1fr);
  gap:14px;align-items:start;margin-bottom:12px}
.ech .vous{background:var(--cream2);border-radius:14px 14px 14px 4px;
  padding:12px 15px;font-size:var(--fs-base);color:var(--ink2)}
.ech .rep{background:var(--greenLt);border-radius:14px 14px 4px 14px;
  padding:12px 15px;font-size:var(--fs-base);color:var(--ink2)}
.ech .rep.non{background:var(--rougeLt)}
.ech .rep.calc{background:var(--cream2)}
.ech .rep i{font-style:italic}
.ech .rep b{font-family:var(--ff-titre);font-size:var(--fs-lg)}
.ech .rep .src{display:block;margin-top:6px;
  font-family:var(--ff-mono);font-size:var(--fs-xs);
  color:var(--warm);letter-spacing:.04em}

/* L'inconnu devient une action, jamais un constat repete. */
.aquest{margin-top:16px;background:var(--goldLt,var(--goldLt));border-radius:14px;
  padding:15px 17px}
.aquest .qt{margin:0 0 12px;font-size:var(--fs-base);color:var(--ink2);
  display:flex;align-items:center;gap:9px}
.aquest .qt .gr{width:26px;height:10px;color:var(--gold);flex:none}
.aquest .qs{display:flex;gap:10px;flex-wrap:wrap;align-items:center}
.aquest .q{flex:1 1 220px;background:var(--paper);border-radius:var(--r-md);
  padding:11px 14px;font-size:var(--fs-base);color:var(--ink2);
  border:1px solid rgba(201,150,47,.28)}
.aquest .copier{background:none;border:0;font:inherit;font-size:var(--fs-base);
  /* --terraDk et non --terra : sur le fond --goldLt du bloc, la terracotta
     franche mesure 4,48 pour 4,5 exige (audit du 04/09/2026). */
  font-weight:600;color:var(--terraDk);cursor:pointer;padding:8px 4px}
.aquest .copier:hover{text-decoration:underline}
.aquest .copier.ok{color:var(--green)}

/* Le texte source, avec ce qui fonde chaque preuve surligne. */
.source{margin-top:18px;background:var(--paper);border:var(--tr);
  border-radius:16px;padding:18px 22px}
.source .lab{display:block;margin-bottom:10px}
.source p{margin:0;font-size:var(--fs-base);line-height:1.75;color:var(--ink3);
  font-style:italic}
.source mark{background:var(--greenLt);color:var(--ink);padding:1px 3px;
  border-radius:var(--r-xs);font-style:normal}

/* ---- rail droit ---- */
.carte .rail{display:flex;flex-direction:column;gap:14px;min-width:0}
.carte .ct{background:var(--ink);color:var(--paper);border-radius:16px;
  padding:18px 20px}
.carte .ct b{display:block;font-family:var(--ff-titre);font-size:var(--fs-3xl);
  line-height:1;color:var(--terraLt)}
.carte .ct b small{font-size:var(--fs-md);color:rgba(249,244,234,.6)}
.carte .ct .km{display:block;margin-top:4px;font-size:var(--fs-sm);
  color:rgba(249,244,234,.6)}
.carte .ct .route{display:flex;align-items:center;gap:6px;margin:14px 0 12px}
.carte .ct .dep{width:8px;height:8px;border-radius:var(--r-circle);
  background:var(--terraLt);flex:none}
.carte .ct .trait{flex:1;height:0;border-top:2px dashed rgba(249,244,234,.28)}
.carte .ct .pw{width:18px;height:19px;flex:none}
.carte .ct .pw ellipse,.carte .ct .pw path{fill:rgba(249,244,234,.55)}
.carte .ct p{margin:0;font-size:var(--fs-sm);line-height:1.55;
  color:rgba(249,244,234,.68)}
.carte .ct.muet b{color:rgba(249,244,234,.5)}

.carte .cs,.carte .cq{background:var(--paper);border:var(--tr);
  border-radius:16px;padding:16px 18px}
.carte .cq ol{margin:10px 0 0;padding-left:0;list-style:none;counter-reset:e}
.carte .cq li{counter-increment:e;position:relative;padding-left:26px;
  margin-bottom:9px;font-size:var(--fs-base);color:var(--ink2);line-height:1.5}
.carte .cq li:last-child{margin-bottom:0}
.carte .cq li::before{content:counter(e) ".";position:absolute;left:0;
  font-weight:700;color:var(--terra)}
.carte .cq li small{display:block;color:var(--warm);font-size:var(--fs-xs)}

/* ---- barre d'action ---- */
/* Patte Blanche ne gere jamais l'adoption : elle prepare, l'utilisateur agit. */
.carte .agir{display:flex;align-items:center;gap:20px;flex-wrap:wrap;
  background:var(--ink);color:var(--paper);padding:20px 34px;
  border-radius:0 0 18px 18px;margin-top:14px}
.carte .agir .btn{background:var(--terraLt);color:var(--ink);flex:none}
.carte .agir .btn:hover{background:var(--terra);color:var(--paper)}
.carte .agir p{margin:0;flex:1 1 260px;font-size:var(--fs-base);
  color:rgba(249,244,234,.72);line-height:1.5}
.carte .agir p b{color:var(--paper)}
.carte .agir .sec{color:rgba(249,244,234,.8);font-size:var(--fs-base);
  border:1px solid rgba(249,244,234,.28);border-radius:var(--r-pill);
  padding:9px 16px;text-decoration:none;white-space:nowrap}
.carte .agir .sec:hover{border-color:var(--terraLt);color:var(--paper)}

/* Signaler un probleme.
   -----------------------------------------------------------------------
   Discret, et volontairement : il ne s'adresse pas a la personne qui
   decouvre l'animal, mais a celle qui revient apres coup. Un bouton criard
   ferait douter de toutes les structures, y compris des 1 500 qui font leur
   travail. Il doit rester TROUVABLE, pas visible - d'ou une cible tactile
   pleine malgre la sobriete. */
.carte .agir .signal{background:none;border:0;padding:var(--sp-2) 0;
  color:var(--cream3);font-size:var(--fs-base);font-family:inherit;
  text-decoration:underline;cursor:pointer;min-height:var(--cible)}
.carte .agir .signal:hover,.carte .agir .signal:focus-visible{
  color:var(--paper)}

/* « Est-il toujours disponible ? »
   -----------------------------------------------------------------------
   Beaucoup plus present que « signaler un probleme », et pour une raison
   simple : c'est la question que tout le monde se pose sur une annonce de
   2017, et la seule que nous puissions faire remonter a quelqu'un capable
   d'y repondre. */
.carte .agir .dispo{background:none;color:var(--paper);
  border:1px solid var(--terraLt);border-radius:var(--r-pill);
  padding:var(--sp-2) var(--sp-4);font-size:var(--fs-base);
  font-family:inherit;cursor:pointer;min-height:var(--cible);white-space:nowrap}
.carte .agir .dispo:hover:not([disabled]){background:var(--terraLt);
  color:var(--ink)}
.carte .agir .dispo.ok{border-color:var(--green);color:var(--paper);
  cursor:default;white-space:normal}
.carte .agir .dispo.ko{border-color:var(--rougeBord);white-space:normal}

/* Le formulaire, sous la barre d'action et non dedans : il change la nature
   de la page - on ne cherche plus un animal, on raconte ce qui s'est passe. */
.sig-zone{padding:var(--sp-5) var(--sp-6) var(--sp-6)}
.sig h3{margin:0 0 var(--sp-3);font-size:var(--fs-lg)}
/* Ce que nous ne pouvons PAS faire, avant de demander quoi que ce soit.
   Recueillir un signalement en laissant croire qu'on agira a la place de
   l'Etat ferait renoncer la famille a la seule demarche qui compte. */
.sig-cadre{background:var(--goldPale);border-left:var(--sp-1) solid var(--gold);
  padding:var(--sp-3) var(--sp-4);margin:0 0 var(--sp-4);
  font-size:var(--fs-base);line-height:1.55;color:var(--ink2)}
.sig label{display:block;margin-bottom:var(--sp-4);font-size:var(--fs-base);
  color:var(--ink2);font-weight:600}
.sig select,.sig textarea,.sig 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);
  font-weight:400;background:var(--paper);color:var(--ink);
  min-height:var(--cible);box-sizing:border-box}
.sig textarea{resize:vertical;line-height:1.5}
.sig .opt{font-weight:400;color:var(--warm);font-size:var(--fs-xs)}
.sig-cmd{display:flex;gap:var(--sp-3);align-items:center;flex-wrap:wrap}
.sig-msg .err{color:var(--rougeDk);font-size:var(--fs-base)}
.sig-fin{background:var(--greenLt);border-radius:var(--r-md);
  padding:var(--sp-4);color:var(--greenDk)}
.sig-fin h3{margin:0 0 var(--sp-2)}
.sig-fin p{margin:0 0 var(--sp-2);line-height:1.55;font-size:var(--fs-base)}
.sig-fin a{color:var(--greenDk)}

@media (max-width:900px){
  .carte .corps{grid-template-columns:1fr;padding:18px 20px 8px}
  /* Sous 900 px la photo passe AU-DESSUS, en 4/3 : une colonne de 46 % sur
     un telephone ne laisserait ni a la photo ni au texte de quoi exister. */
  .carte .hero{grid-template-columns:1fr}
  .carte .hph{min-height:0;aspect-ratio:4/3}
  .carte .hin{padding:18px 20px 24px}
  /* Empile, le rang de badges passe a la ligne et le bouton de fermeture
     se retrouvait seul sur la sienne. Il reprend la place qu'on lui cherche
     d'instinct : en haut a droite, sur la photo. */
  .carte .hero{position:relative}
  .carte .hero .close{position:absolute;top:12px;right:12px;
    background:rgba(42,33,26,.55);backdrop-filter:blur(4px)}
  .carte .hnom h2{font-size:var(--fs-4xl)}
  .carte .hbas{gap:16px}
  .carte .hscore{align-items:flex-start}
  .ech{grid-template-columns:1fr}
  .carte .agir{padding:18px 20px}
}

/* ---------- ce que la structure documente ---------- */
.struct{margin:0 30px 4px;padding:18px 20px;background:var(--cream2);
  border-radius:14px}
.struct .sh{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;
  margin-bottom:14px}
.struct .sh b{font-family:var(--ff-titre);font-size:var(--fs-lg)}
.struct .sh .cnt{margin-left:auto;font-size:var(--fs-sm);color:var(--warm)}
.mesures{display:grid;gap:8px}
.mes{display:grid;grid-template-columns:1fr 120px 46px;align-items:center;
  gap:12px;font-size:var(--fs-sm);color:var(--ink3)}
.mb{height:6px;border-radius:var(--r-pill);background:var(--cream3);overflow:hidden}
.mb i{display:block;height:100%;border-radius:var(--r-pill)}
.mb i.hi{background:var(--green)}
.mb i.mi{background:var(--gold)}
.mb i.lo{background:var(--terra)}
.mv{text-align:right;font-variant-numeric:tabular-nums;font-weight:600;
  color:var(--ink2)}
.struct .avert{margin:14px 0 0;font-size:var(--fs-sm);color:var(--warm);
  line-height:1.5}
@media (max-width:720px){
  .struct{margin:0 22px 4px}
  .mes{grid-template-columns:1fr 70px 42px}
}

/* ---------- menu deroulant a choix multiple ---------- */
/* Des pastilles pour 16 especes noyaient la barre, et tronquer les 316 races
   a 8 rendait les 308 autres inatteignables. Le menu montre tout, avec un
   filtre de saisie quand la liste est longue. */
.dd{position:relative;display:inline-block}
.dd-t{display:inline-flex;align-items:center;gap:10px;min-width:210px;
  justify-content:space-between;text-align:left}
.dd-t .cv{color:var(--warm);font-size:var(--fs-xs)}
.dd-t[aria-expanded="true"]{border-color:var(--terra)}
/* Position fixe, calculee par placerDD() : en absolu le menu etait rogne
   par le corps defilant du formulaire. */
.dd-p{position:fixed;z-index:var(--z-voile);min-width:280px;box-shadow:var(--sh-2);
  max-width:340px;background:var(--paper);border:var(--tr);
  border-radius:var(--r-md);padding:8px;box-shadow:0 18px 40px -18px rgba(51,41,31,.4)}
.dd-p[hidden]{display:none}
.dd-s{width:100%;box-sizing:border-box;margin-bottom:6px;padding:7px 10px;
  border:var(--tr);border-radius:var(--r-sm);font:inherit;font-size:var(--fs-champ);
  background:var(--cream)}
.dd-l{max-height:230px;overflow-y:auto}
.dd-o{display:flex;align-items:center;gap:9px;padding:6px 8px;border-radius:var(--r-sm);
  font-size:var(--fs-base);color:var(--ink2);cursor:pointer}
.dd-o:hover{background:var(--cream)}
.dd-o[data-on="1"]{background:var(--cream2);color:var(--ink);font-weight:600}
.dd-o input{accent-color:var(--terra);width:14px;height:14px;flex:none}
/* Les deux commandes du menu, cote a cote et de meme poids : ni l'une ni
   l'autre n'est le geste « normal ». Desactivees quand elles n'ont rien a
   faire, plutot que retirees - un bouton qui disparait deplace le bas du
   panneau sous le curseur. */
.dd-cmd{display:flex;gap:var(--sp-2);margin-top:var(--sp-2);
  padding-top:var(--sp-2);border-top:var(--tr-clair)}
.dd-cmd button{flex:1 1 0;background:none;border:var(--tr);
  border-radius:var(--r-sm);padding:7px 10px;font:inherit;
  font-size:var(--fs-sm);color:var(--terraDk);cursor:pointer;
  transition:var(--t-court) var(--e)}
.dd-cmd button:hover:not(:disabled){background:var(--cream);
  border-color:var(--terraLt)}
/* Un bouton desactive reste un bouton qu'il faut pouvoir LIRE : c'est en le
   lisant qu'on comprend pourquoi il ne sert a rien pour l'instant. L'opacite
   de .55 le ramenait a 2,34 de contraste pour 4,5 exige - mesure par
   tools/audit.py aux quatre largeurs, jamais visible a la relecture du CSS.
   La couleur seule suffit a le donner pour inactif. */
.dd-cmd button:disabled{color:var(--warm);cursor:default}

/* ---------- panneau foyer : une seule fenetre ---------- */
/* Neuf ecrans successifs : on repondait sans rien voir, et le nombre de
   resultats n'apparaissait qu'a la fin. Tout tient ici, et le compteur du
   pied de panneau se met a jour a chaque clic. */
.foyer-form{max-width:760px;display:flex;flex-direction:column;
  /* `vh` d'abord, en repli : il fige la hauteur sur la fenetre barre d'URL
     DEPLOYEE, donc le panneau depassait le visible des qu'elle se retractait.
     `dvh` suit la hauteur reellement affichee ; les moteurs qui l'ignorent
     gardent la premiere ligne. */
  max-height:calc(100vh - 68px);
  max-height:calc(100dvh - 68px)}
.foyer-form .fh{position:relative;padding:22px 28px 18px;background:var(--paper);
  border-bottom:var(--tr)}
.foyer-form .fh h2{font-size:var(--fs-2xl);margin:8px 0 4px}
.foyer-form .fh p{color:var(--ink3);font-size:var(--fs-base);margin:0;max-width:52ch}
.foyer-form .fb{overflow-y:auto;padding:6px 28px 20px}
.grp{padding:18px 0 4px;border-bottom:var(--tr)}
.grp:last-child{border-bottom:0}
.gt{display:block;font-family:var(--ff-mono);
  font-size:var(--fs-xs);letter-spacing:.16em;text-transform:uppercase;
  color:var(--terra);margin-bottom:12px}
/* --warm donnait 4,25 sur le fond du panneau : c'est la CONFIRMATION que
   le code postal a ete reconnu, le seul retour que recoit la personne qui
   vient de saisir. --ink3 la porte a 6,25. */
.etat{font-size:var(--fs-sm);color:var(--ink3)}
/* Le MEME indicateur portait deux couleurs selon l'endroit : --green dans
   le panneau, --greenDk dans l'accueil. La variante claire tombait a 4,25 -
   sur la confirmation que le code postal a ete reconnu, c'est-a-dire le
   seul retour que recoit la personne qui vient de saisir. On aligne sur la
   variante sombre, qui passe partout. */
.etat.ok{color:var(--greenDk)}
.etat.ko{color:var(--terraDk)}
.foyer-form .ff{display:flex;align-items:center;gap:16px;flex-wrap:wrap;
  padding:16px 28px;background:var(--paper);border-top:var(--tr)}
.compte{font-size:var(--fs-base);color:var(--ink3)}
.compte b{font-family:var(--ff-titre);font-size:var(--fs-xl);color:var(--ink);
  margin-right:4px}
.foyer-form .ff .btn{margin-left:auto}
.sheet{position:fixed;inset:0;background:rgba(51,41,31,.42);z-index:var(--z-menu);
  display:flex;align-items:flex-start;justify-content:center;overflow-y:auto;
  padding:34px 20px}
.sheet[hidden]{display:none}
.doc{background:var(--cream);border-radius:var(--r-lg);max-width:960px;width:100%;
  overflow:hidden;box-shadow:0 30px 80px -30px rgba(51,41,31,.5)}
.doc .hd{position:relative;display:flex;gap:22px;padding:24px 28px 20px;background:var(--paper);
  border-bottom:var(--tr);flex-wrap:wrap}
.doc .hd img{width:190px;height:150px;object-fit:cover;border-radius:var(--r-md);
  flex:none}
.doc .hi{flex:1 1 280px;display:flex;flex-direction:column;gap:9px}
.doc .hi h2{font-size:var(--fs-3xl)}
/* Le bouton de fermeture du PANNEAU FOYER, et lui seul.

   Ecrit `.close{position:absolute}` il visait aussi celui de la fiche, qui
   vit dans le flux du bandeau. Tant que le bandeau etait `position:relative`
   l'ecart passait inapercu ; sa restructuration en grille l'a supprime, et
   le bouton s'est ancre sur la fenetre - il flottait au-dessus du document,
   hors du bandeau sombre, a 16 px du haut de l'ecran.

   Deuxieme collision de la meme famille que footer{} : un selecteur trop
   large qui atteint un composant qu'il n'a jamais vise. On l'ancre a son
   parent, et la fiche redefinit explicitement ce qu'elle attend. */
.foyer-form .close{position:absolute;top:16px;right:18px;background:none;
  border:0;font-size:var(--fs-xl);color:var(--warm);cursor:pointer;
  line-height:1;padding:0 4px}
.two{display:flex;gap:10px;flex-wrap:wrap}
.two>div{flex:1 1 190px;border-radius:10px;padding:9px 12px}
.declared{background:var(--cream2)}
.detected{background:var(--paper);border:1.5px solid var(--terraLt)}
.two b{display:block;font-size:var(--fs-base);font-weight:600;margin-top:2px}
.verdict{margin:0;padding:16px 28px 18px;background:var(--greenLt);
  font-size:var(--fs-base)}
.verdict .vh{display:flex;align-items:center;gap:12px}
/* Aucune raison etablie : le vert promettrait une verification qui n'a pas eu
   lieu. On passe a l'ambre, la couleur de l'inconnu dans tout le produit. */
.verdict.muet{background:var(--goldPale)}
.verdict.muet .ring{background:var(--gold)}

/* Les raisons verifiees, c'est le coeur de la promesse : « on lit chaque
   annonce pour vous ». Elles etaient calculees par le moteur et jamais
   montrees. Chacune porte la coche-griffe. */
ul.raisons{list-style:none;margin:14px 0 0;padding:0;display:grid;
  gap:7px;grid-template-columns:repeat(auto-fit,minmax(260px,1fr))}
ul.raisons li{display:flex;align-items:flex-start;gap:8px;font-size:var(--fs-base);
  line-height:1.45;padding:7px 11px;border-radius:var(--r-sm);background:var(--paper)}
ul.raisons li.oui{color:var(--ink2);box-shadow:inset 3px 0 0 var(--green)}
ul.raisons li.non{color:var(--ink2);box-shadow:inset 3px 0 0 var(--terra)}
ul.raisons li.ask{color:var(--ink3);box-shadow:inset 3px 0 0 var(--gold)}
ul.raisons li .t::first-letter{text-transform:uppercase}
.mini-cg{flex:none;width:14px;height:14px;color:var(--green);margin-top:2px}
.mini-cg .cg{width:14px;height:14px}
ul.raisons .b{flex:none;width:14px;text-align:center;font-weight:700;
  font-family:var(--ff-mono);font-size:var(--fs-sm);
  margin-top:1px}
ul.raisons li.non .b{color:var(--terra)}
ul.raisons li.ask .b{color:var(--gold)}
.verdict .ring{width:30px;height:30px;border-radius:var(--r-circle);background:var(--green);
  color:var(--paper);display:flex;align-items:center;justify-content:center;
  flex:none}
.verdict .cg{width:16px;height:16px}
.verdict b{font-family:var(--ff-titre);font-size:var(--fs-lg);font-weight:600}
.verdict span{color:var(--ink3);font-size:var(--fs-base)}
.doc .bd{padding:22px 28px 28px}
.doc .bd h3{font-size:var(--fs-xl);margin-bottom:14px}
.doc .bd h3 span{font-family:var(--ff-mono);
  font-size:var(--fs-xs);letter-spacing:.14em;text-transform:uppercase;
  color:var(--warm);margin-left:10px}
table.crit{width:100%;border-collapse:collapse;font-size:var(--fs-base)}
table.crit td{padding:11px 12px 11px 0;border-bottom:var(--tr);
  vertical-align:top}
table.crit tr:last-child td{border-bottom:0}
/* Le libelle est lu, pas debogue : « Entente chats » et non « ok_chat ».
   Le mono reste pour les micro-libelles, pas pour le contenu. */
td.k{width:auto;min-width:170px;font-weight:600;font-size:var(--fs-base);
  color:var(--ink);white-space:nowrap}
td.k .dot{display:inline-block;width:6px;height:6px;border-radius:var(--r-circle);
  margin-right:8px;vertical-align:middle}
/* Cette colonne n'apparait que si elle porte une citation : voir
   front_client.fiche(). Elle n'a donc plus qu'un seul contenu. */
td.q{color:var(--ink3);font-style:italic}
td.v{width:120px;text-align:right;font-weight:600;white-space:nowrap}
td.v small{display:block;font-weight:400;font-size:var(--fs-xs);color:var(--warm);
  font-style:normal}
tr.unknown td{background:var(--goldPale)}
tr.unknown td.q{font-style:normal;color:var(--gold)}
.contact{margin-top:22px;background:var(--paper);border:var(--tr);
  border-radius:var(--r-md);padding:16px 18px;display:flex;gap:18px;
  align-items:center;flex-wrap:wrap}
.contact .t{flex:1 1 260px;font-size:var(--fs-base);color:var(--ink3)}
.contact .t b{display:block;color:var(--ink);font-size:var(--fs-base)}
.btn{border:0;border-radius:var(--r-pill);padding:12px 24px;font:inherit;
  font-size:var(--fs-base);font-weight:600;cursor:pointer;background:var(--terra);
  color:var(--paper);text-decoration:none;display:inline-block}
.btn:hover{background:var(--terraDk)}

/* zero resultat */
.zero{background:var(--paper);border:var(--tr);border-radius:var(--r-lg);
  padding:30px 32px;max-width:660px;margin:16px 0 60px;box-shadow:var(--sh-3)}
.zero h2{font-size:var(--fs-2xl);margin-bottom:8px}
.zero h2 em{font-style:italic;color:var(--terra)}
.zero p{color:var(--ink3);margin:0 0 18px;font-size:var(--fs-md)}
.widen{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;
  gap:9px}
.widen button{width:100%;text-align:left;background:var(--cream);
  border:var(--tr-fort);border-radius:var(--r-md);padding:12px 15px;
  font:inherit;font-size:var(--fs-base);color:var(--ink2);cursor:pointer;display:flex;
  gap:12px;align-items:center;transition:var(--t-court) var(--e)}
.widen button:hover{border-color:var(--terraLt);background:var(--paper)}
.widen .g{background:var(--greenLt);color:var(--greenDk);font-weight:700;
  border-radius:var(--r-pill);padding:2px 10px;font-size:var(--fs-base);white-space:nowrap}

/* separateur-griffure */
.scratch{height:12px;margin:8px 0 0;position:relative;overflow:hidden}
.scratch::before{content:"";position:absolute;inset:0;background:
  repeating-linear-gradient(74deg,var(--cream3) 0 2px,transparent 2px 14px)}

/* Le pied de PAGE, et lui seul.

   Ecrit `footer{...}` il visait tous les <footer> du document - dont
   <footer class="agir">, la barre d'action sombre de la fiche. Son
   max-width:76ch la reduisait a 558 px dans une fiche de 1120, ses trois
   elements debordaient d'elle, et elle heritait au passage d'un filet
   superieur et d'une couleur de texte prevus pour autre chose.

   C'est exactement le piege que CLAUDE.md decrit : un selecteur d'element
   qui ecrase une classe. On l'ancre donc a son parent. */
/* Le pied de page tenait dans une colonne de 76 caracteres, collee a
   gauche, sur un ecran qui en offre trois fois plus. Trois blocs egaux
   occupent la largeur et rendent lisible ce qui etait un pave : ce qu'une
   adoption engage, ce que nous ne faisons pas, comment se faire retirer. */
/* `margin-top` : le filet touchait le bas du bloc sombre de l'accueil
   (0 px), la ou la maquette laisse --sp-6 (QA du 13/10/2026). */
.wrap > footer{border-top:var(--tr);margin-top:var(--sp-6);padding:var(--sp-6) 0 var(--sp-7);
  color:var(--ink3);font-size:var(--fs-sm)}
.pied{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));
  gap:var(--sp-6)}
.pied-c p{margin:var(--sp-2) 0 0;line-height:1.6;max-width:46ch}
/* La ligne de liens des pages legales tient sur la largeur du pied : bornee
   a 46 caracteres comme un paragraphe, elle s'empilait en quatre lignes
   (comparaison a la maquette du 12/10/2026). */
.pied-c p.pied-liens{max-width:none}
/* LES LIENS DU PIED, EN FLEX (maquette du 02/10/2026, QA du 13/10/2026).
   Les « · » sont des noeuds de texte entre des liens : sans ecart, ils
   collaient a leurs voisins (10 px d'un lien a l'autre, 19 dans la
   maquette) et deux rangees de liens de 44 px se touchaient. Le meme ecart
   sur l'accueil, les resultats et les pages publiques : la classe est posee
   par front_render.py et front_legal.py, la regle vit ici, une fois. */
/* PLUS DE « · » ENTRE LES LIENS (QA du 13/10/2026, constat 36) : un point
   ecrit dans le texte finissait chaque rangee quand la ligne s'enroulait
   (« Mentions legales · Vos donnees · »). L'ecart seul separe les liens, et
   aucune rangee ne peut plus finir par un separateur. */
.pied-c p.pied-liens{display:flex;flex-wrap:wrap;align-items:center;
  gap:var(--sp-1) var(--sp-4)}
.pied-c .lab{display:block}
.pied-min .pied-logo{display:inline-flex;align-items:center;gap:var(--sp-2);margin-right:var(--sp-3)}
.pied-min .pied-logo .brand{font-family:var(--ff-titre);font-weight:600;font-size:var(--fs-lg);color:var(--ink)}
/* La regle du produit - ce que l'adoption engage - n'est pas une mention
   de bas de page parmi d'autres. */
.pied-fort{color:var(--ink);font-weight:600}

/* Le bandeau de l'arrete du 28 juin 2023 vit dans socle.css depuis le
   02/10/2026 : il est sur TOUTES les pages, et /pro ne sert pas app.css. */
:focus-visible{outline:var(--focus);outline-offset:var(--focus-ecart);
  border-radius:var(--r-sm)}
@media (prefers-reduced-motion:reduce){*{transition:none!important}}

/* ---------------- Sante : le mot medical, explique ----------------------
   Place entre le dialogue et l'annonce d'origine, parce que c'est la que
   l'objection se leve : l'adoptant vient de voir que l'animal lui convient,
   il lit « FIV », et tout s'arrete la s'il n'a pas l'explication.
   Aucun rouge : voir --calm dans tokens.css. */
.sante{margin-top:var(--sp-4);background:var(--paper);
  border:var(--tr);border-radius:var(--r-lg);
  padding:var(--sp-4) var(--sp-5)}
.sante .lab{display:block;margin-bottom:var(--sp-3)}
.aff{border-radius:var(--r-md);padding:var(--sp-3) var(--sp-4);
  margin-bottom:var(--sp-2)}
.aff:last-of-type{margin-bottom:0}
.aff.soigne{background:var(--greenLt)}
.aff.gere{background:var(--goldLt)}
.aff.vit,.aff.serieux{background:var(--calmLt)}
.ah{display:flex;align-items:baseline;gap:var(--sp-2);flex-wrap:wrap}
.ah b{font-family:var(--ff-titre);font-size:var(--fs-lg);color:var(--ink)}
.ah .st{font-size:var(--fs-xs);font-weight:600}
.aff.soigne .ah .st{color:var(--greenDk)}
.aff.gere .ah .st{color:var(--goldDk)}
.aff.vit .ah .st,.aff.serieux .ah .st{color:var(--calmDk)}
/* La parole du refuge d'abord, notre explication ensuite. Jamais l'inverse. */
.aff .cit{margin:var(--sp-2) 0 0;font-size:var(--fs-sm);font-style:italic;
  color:var(--ink2);border-left:2px solid var(--cream3);
  padding-left:var(--sp-3);line-height:1.55}
.aff .exp{margin:var(--sp-2) 0 0;font-size:var(--fs-sm);line-height:1.65;
  color:var(--ink2)}
.aff .quo{margin:var(--sp-2) 0 0;font-size:var(--fs-sm);line-height:1.55;
  color:var(--ink2);display:flex;gap:var(--sp-2);
  /* L'etiquette ne retrecit pas (`flex:none`) : en allemand a 360 px, elle
     laissait au texte moins que son plus long mot, et la citation debordait
     de 11 px (audit du 10/10/2026). Le texte se coupe, l'etiquette reste. */
  overflow-wrap:anywhere}
.aff .quo span{flex:none;font-family:var(--ff-mono);
  font-size:var(--fs-xs);letter-spacing:.08em;text-transform:uppercase;
  color:var(--warm);padding-top:2px}
.sante .garde{margin:var(--sp-3) 0 0;font-size:var(--fs-xs);line-height:1.6;
  color:var(--warm)}

/* ================= LA DECOUVERTE =========================================
   Ce que voit quelqu'un qui arrive sans avoir rien demande. Deux blocs, et
   l'ordre est un choix : les vedettes donnent envie d'entrer, l'alerte vient
   apres - dans un traitement plus fort, jamais reléguée en bas de page. */
#decouverte{padding-bottom:var(--sp-6)}
.grid.vg,.grid.ag{grid-template-columns:repeat(auto-fill,minmax(212px,1fr));
  gap:var(--sp-3);padding-bottom:0}

/* Vignette : la photo occupe presque tout. On tombe amoureux avec les yeux,
   le texte vient repondre a la question que la photo pose - pas l'inverse. */
.vig{background:var(--paper);border:var(--tr);
  border-radius:var(--r-md);overflow:hidden;display:flex;
  flex-direction:column;cursor:pointer;box-shadow:var(--sh);transition:var(--t-court) var(--e)}
/* `outline:none` etait pose ici pour les DEUX etats. Or `:focus-visible` ne
   se declenche qu'au clavier : l'anneau global de la ligne 591 etait donc
   annule precisement pour ceux qui n'ont que lui. Il ne restait qu'un liseré
   identique au survol, a 2,36 de contraste - la norme en demande 3. */
.vig:hover,.vig:focus-visible{transform:translateY(-3px);box-shadow:var(--sh-2);
  border-color:var(--terraLt)}
.vig:hover{outline:none}
.vig .ph{aspect-ratio:1/1}
.vig .body{padding:var(--sp-3) var(--sp-3) var(--sp-4)}
.vig h3{font-size:var(--fs-xl);line-height:1.1}
.vig h3::first-letter{text-transform:uppercase}
.vig .line2{margin-top:3px;font-size:var(--fs-sm);color:var(--warm)}

/* ---- le bloc d'alerte ----
   Fond sombre : il isole ces animaux du flux ordinaire sans les enterrer.
   Aucun rouge, aucun point d'exclamation - on ne culpabilise pas celui qui
   lit, on lui montre une duree qu'aucun autre site n'affiche. */
.bloc-alerte{margin-top:var(--sp-6);background:var(--ink);
  border-radius:var(--r-lg);padding:var(--sp-6) var(--sp-6) var(--sp-5)}
.bloc-alerte .ah{max-width:64ch;margin-bottom:var(--sp-5)}
/* .5 donnait 4,42 sur l'encre du bloc : deux centiemes sous le seuil, sur
   le libelle qui NOMME la section. .56 le passe a 4,72. */
.bloc-alerte .ah .lab{color:rgba(249,244,234,.56)}
.bloc-alerte h2{color:var(--paper);font-size:var(--fs-3xl);margin-top:var(--sp-2)}
.bloc-alerte .ah p{margin-top:var(--sp-3);color:rgba(249,244,234,.72);
  font-size:var(--fs-base);line-height:1.7}
.bloc-alerte .vig{background:rgba(249,244,234,.06);
  border-color:rgba(249,244,234,.14)}
.bloc-alerte .vig:hover{border-color:var(--terraLt)}
.bloc-alerte .vig h3{color:var(--paper)}
.bloc-alerte .vig .line2{color:rgba(249,244,234,.55)}
/* `.zn` a ete ajoutee au bloc clair sans sa variante sombre : encre --ink3
   sur un fond quasi noir, contraste 1,56. « Adoption réservée au
   département » etait donc invisible exactement la ou elle compte le plus -
   sur les animaux que personne ne regarde. */
.bloc-alerte .vig .zn{color:rgba(249,244,234,.72)}
.bloc-alerte .vig .zn::before{background:var(--terraLt)}
.vig.al .ph{position:relative}
/* La duree d'abord, en pleine largeur : c'est elle qui justifie le bloc. */
/* Le degrade partait de `rgba(192,86,43,0)` - l'ANCIENNE valeur de --terra,
   figee en dur. Invisible parce que son alpha vaut zero, mais elle aurait
   diverge en silence a chaque retouche de la couleur de marque. Un
   `transparent` s'interpole correctement en alpha premultiplie depuis 2018,
   sans le liseré gris des vieux moteurs. */
.vig.al .depuis{position:absolute;left:0;right:0;bottom:0;
  background:linear-gradient(180deg,transparent,var(--terra) 55%);
  color:var(--paper);padding:var(--sp-5) var(--sp-3) var(--sp-2);
  font-size:var(--fs-md);font-weight:700;line-height:1.15}
/* L'opacite .85 ramenait ce libelle a 3,98 sur --terra, sous le seuil AA.
   Il est deja distingue par sa taille et sa graisse : l'attenuer davantage
   ne servait qu'a le rendre illisible. A pleine encre : 4,89. */
.vig.al .depuis small{display:block;font-weight:400;font-size:var(--fs-xs)}
/* Sans date publiee par la source, le bandeau change de ton : il ne peut
   plus annoncer une duree, il dit seulement pourquoi l'animal est ici. */
.vig.al .depuis.muet{background:linear-gradient(180deg,transparent,
  rgba(51,41,31,.92) 55%)}
.vig.al .mal{margin-top:var(--sp-2)}
.vig.al .pq{margin-top:var(--sp-2);font-size:var(--fs-xs);
  color:rgba(249,244,234,.6)}

/* ================= LE TOURNIQUET ==========================================
   Une grille montrait dix animaux et s'arretait la. Une piste qui defile en
   montre autant qu'on veut sans allonger la page - et surtout, le geste de
   faire defiler est celui qu'on a devant des animaux : on regarde le suivant.

   Defilement natif : accrochage par vignette, molette et glissement du doigt
   fonctionnent sans une ligne de JavaScript. Les fleches ne sont qu'un
   confort ajoute par-dessus, pas le mecanisme. */
.carrousel{position:relative}
.piste{display:flex;gap:var(--sp-3);overflow-x:auto;overflow-y:hidden;
  scroll-snap-type:x mandatory;scroll-behavior:smooth;
  padding:var(--sp-1) var(--sp-1) var(--sp-4);
  scrollbar-width:none;-ms-overflow-style:none}
.piste::-webkit-scrollbar{display:none}
.piste .vig{flex:0 0 224px;scroll-snap-align:start}
/* Le survol souleve la vignette : sans marge, le relief serait rogne par le
   bord de la piste. */
.piste .vig:hover,.piste .vig:focus-visible{transform:translateY(-3px)}

.carrousel .nav{position:absolute;top:34%;z-index:var(--z-barre);
  width:38px;height:38px;border-radius:var(--r-circle);border:var(--tr);
  background:var(--paper);color:var(--ink);cursor:pointer;
  font-size:var(--fs-md);line-height:1;display:grid;place-items:center;
  box-shadow:var(--sh-2);transition:var(--t-court) var(--e)}
.carrousel .nav:hover{background:var(--ink);color:var(--paper);
  border-color:var(--ink)}
.carrousel .nav.prec{left:calc(var(--sp-4) * -1)}
.carrousel .nav.suiv{right:calc(var(--sp-4) * -1)}
/* Bout de piste : la fleche s'efface au lieu de disparaitre - un bouton qui
   saute deplace tout ce qui l'entoure. */
.carrousel .nav[disabled]{opacity:0;pointer-events:none}
/* Sur le fond sombre du bloc d'alerte, les fleches s'inversent. */
.bloc-alerte .carrousel .nav{background:var(--ink);color:var(--paper);
  border:var(--tr-sombre)}
.bloc-alerte .carrousel .nav:hover{background:var(--paper);color:var(--ink)}

@media (max-width:900px){
  .carrousel .nav{display:none}      /* le doigt suffit */
  .piste{scroll-padding-left:var(--sp-1)}
}
@media (prefers-reduced-motion:reduce){
  .piste{scroll-behavior:auto}
}

/* ================= L'ENTREE ================================================
   Le formulaire EST l'accueil. Il etait dans une fenetre modale, et beaucoup
   partaient sans jamais l'ouvrir : ils n'obtenaient donc jamais ce que le
   produit sait faire. Trois questions numerotees, en grand, dans le flux.

   Traitement editorial assume : la typo porte, l'espace respire, le chiffre
   des questions sert de reperage. Meme structure sur telephone - ce n'est
   pas une adaptation, ce sont les memes blocs qui s'empilent. */
.entree-h{background:var(--cream2);border-radius:var(--r-lg);
  padding:var(--sp-7) var(--sp-6);margin-top:var(--sp-2)}
.entree{max-width:calc(var(--page) * .78)}

/* Grand ecran : deux colonnes, l'argument a gauche, le formulaire a droite.
   Tout etait empile dans une colonne plafonnee a 78 % du conteneur : sur
   1 440 px de large, l'accueil occupait 920 px et 673 px de haut, avec un
   tiers de l'ecran vide a droite et le premier champ sous la ligne de
   flottaison. Le titre et le formulaire se repondent maintenant cote a
   cote, et la page tient d'un seul regard.
   Le seuil est a 1000 px : en deca, deux colonnes rendraient chaque moitie
   trop etroite pour des pastilles qui ne se coupent pas.

   TROIS RANGEES, et la troisieme est vide - c'est elle qui repare le trou.
   Avec deux rangees seulement, le formulaire qui les enjambe (587 px) etait
   plus haut que leur contenu (212 px) : la grille distribuait les 375 px
   restants ENTRE les deux rangees. Mesure a 1 440 : le titre finissait a
   y=309 et son sous-titre commencait a y=491. 182 px de creme entre une
   phrase et celle qui l'explique, sans que rien ne les separe - on lisait
   deux blocs sans rapport. La rangee `1fr` absorbe maintenant tout le
   surplus SOUS le texte, la ou du vide est du silence et non une panne.

   Les colonnes passent de 1 / 1,1 a 1 / 1,35. Ce n'est pas un reglage a
   l'oeil : la ligne finale du formulaire mesure 509 px (bouton 340 + ecart
   24 + lien 145) pour une colonne de 530, et les quatre pastilles de trajet
   351 px pour 476 - le formulaire etait a deux doigts de se replier a chaque
   cran de largeur perdu. Il passe a 581 px et respire. Le titre, lui, gagne
   a etre plus etroit : a 431 px il tient sur quatre lignes pleines au lieu
   de trois lignes qui s'arretaient au milieu de leur colonne.

   Le filet vertical, enfin. Le texte fait 260 px de haut contre 587 au
   formulaire : quoi qu'on fasse, il reste du vide en bas a gauche. Un filet
   entre les deux colonnes le transforme en marge - on lit deux colonnes,
   pas un trou. C'est le MEME trait que celui qui separe les questions
   (--tr) : il prolonge une structure existante au lieu d'en inventer une,
   et il ne coute pas un gramme de couleur en plus. */
@media (min-width:1000px){
  .entree{max-width:none;display:grid;
    grid-template-columns:minmax(0,1fr) minmax(0,1.35fr);
    grid-template-rows:auto auto 1fr;
    column-gap:var(--sp-6);align-items:start}
  .entree h1{grid-column:1;grid-row:1}
  .entree .amene{grid-column:1;grid-row:2;max-width:var(--mesure)}
  .entree .qf{grid-column:2;grid-row:1 / -1;margin-top:0;
    border-left:var(--tr);padding-left:var(--sp-6)}
}
.entree h1{font-size:var(--fs-4xl);line-height:1.02;margin-top:var(--sp-3);
  letter-spacing:-.02em}
.entree h1 em{display:block;font-style:italic;color:var(--terra)}
/* Le chapeau, et non un paragraphe de plus. Il etait a --fs-md, la taille du
   corps de texte : entre un titre de 44 px et des intitules de questions de
   16,5 px, la seule phrase qui explique ce que fait le produit se lisait au
   meme niveau qu'une legende. Un cran au-dessus du corps (--fs-lg) suffit a
   le poser comme chapeau, sans jamais concurrencer le titre. */
.entree .amene{margin-top:var(--sp-4);max-width:var(--mesure);
  font-size:var(--fs-lg);line-height:1.7;color:var(--ink3)}

.qf{margin-top:var(--sp-7);display:flex;flex-direction:column;gap:var(--sp-3)}
/* Un menu ferme doit dire ce qu'il CONTIENT, pas seulement son intitule. */
.dd-t.rempli{border-color:var(--terra);color:var(--ink);font-weight:600}
.dd-t.rempli .cv{color:var(--terra)}
.qf .fin{display:flex;align-items:center;gap:var(--sp-5);flex-wrap:wrap;
  padding-top:var(--sp-4);border-top:var(--tr)}
.qf .cta{background:var(--terra);color:var(--paper);border:0;
  border-radius:var(--r-pill);padding:15px 30px;font:inherit;
  font-size:var(--fs-md);font-weight:700;cursor:pointer;
  transition:var(--t-court) var(--e)}
.qf .cta:hover{background:var(--ink)}
.qf .cta[disabled]{opacity:.5;cursor:default}
.qf .fin a{font-size:var(--fs-base);color:var(--ink3)}

/* Le bouton pause du tourniquet : discret, mais toujours atteignable. */
.carrousel .pause{position:absolute;right:0;top:calc(var(--sp-6) * -1);
  width:26px;height:26px;border-radius:var(--r-circle);border:var(--tr);
  background:var(--paper);color:var(--ink3);font-size:var(--fs-xs);cursor:pointer;
  display:grid;place-items:center;transition:var(--t-court) var(--e)}
.carrousel .pause:hover{background:var(--ink);color:var(--paper)}
.bloc-alerte .carrousel .pause{background:transparent;border:var(--tr-sombre);
  color:rgba(249,244,234,.7)}

/* La liste de communes proposees.
   Elle se pose SOUS le champ, hors du flux, pour ne pas repousser les
   questions suivantes a chaque frappe - un formulaire qui saute pendant
   qu'on ecrit se remplit mal.

   Ces six regles etaient ecrites A L'INTERIEUR du bloc @media (max-width:760px).
   Elles n'existaient donc PAS sur bureau, c'est-a-dire exactement la ou le
   commentaire ci-dessus dit qu'elles servent : mesure a 1 440 px,
   `position` valait `static` et le bandeau d'entree passait de 683 a 852 px
   des la premiere lettre tapee dans le champ de ville. Le formulaire sautait
   de 169 px pendant qu'on ecrivait. Meme faute, meme cause et meme
   emplacement que pour `.q.repondue` : une regle de bureau posee dans le
   bloc mobile. Le fichier de test connait deja `.sugg` comme sortie du flux
   assumee (tests/test_style.AUTORISES) - la regle etait juste au mauvais
   endroit. */
.cbox{position:relative}
.sugg{position:absolute;top:calc(100% + var(--sp-2));left:0;z-index:var(--z-menu);
  margin:0;padding:var(--sp-1);list-style:none;min-width:min(320px,100%);
  background:var(--paper);border:var(--tr);border-radius:var(--r-md);
  box-shadow:var(--sh-2);max-height:280px;overflow-y:auto}
.sugg li{display:flex;align-items:baseline;justify-content:space-between;
  gap:var(--sp-3);padding:var(--sp-2) var(--sp-3);border-radius:var(--r-sm);
  cursor:pointer;font-size:var(--fs-base)}
.sugg li b{font-weight:600;color:var(--ink)}
.sugg li span{font-family:var(--ff-mono);font-size:var(--fs-sm);
  color:var(--ink3)}
.sugg li:hover,.sugg li.on{background:var(--cream2)}

@media(max-width:760px){
  .entree-h{padding:var(--sp-5) var(--sp-4)}
  .entree h1{font-size:var(--fs-3xl)}
  .qf{margin-top:var(--sp-5);gap:var(--sp-4)}
  /* Le numero passe au-dessus : a 375 px, deux colonnes volent la moitie
     de la largeur au contenu. */
  .qf .q{grid-template-columns:1fr;gap:var(--sp-2)}
  .qf .n{font-size:var(--fs-lg)}
  /* Le champ tronquait son propre placeholder a 11ch. Sur telephone il n'y
     a rien a economiser en largeur. */
  .qf input[type=text],.qf textarea.cp-champ{width:100%}
  .qf .ch{display:block}
  /* Le champ occupe toute la largeur : la confirmation de code postal passe
     dessous au lieu de se serrer a cote. */
  .qf .etat{display:block;margin-top:var(--sp-2)}
  .qf .cta{width:100%}
  /* Sur telephone, le bouton « Voir les N animaux » reste visible quel que
     soit le defilement (maquette v2 du 06/09/2026) : le pied du formulaire
     colle au bas de l'ecran, sur le fond de la page pour ne rien laisser
     transparaitre dessous. */
  .qf .fin{flex-direction:column;align-items:stretch;text-align:center;
    position:sticky;bottom:0;background:var(--cream);
    padding-block:var(--sp-3);margin-inline:calc(-1 * var(--sp-3));padding-inline:var(--sp-3)}
  /* L'ecran de depart tient dans 360 x 640 : le paragraphe d'amenee
     s'efface et le titre se resserre, sinon le formulaire commencait a
     700 px et le bouton colle ne pouvait pas remonter au-dessus de lui. */
  .entree.depart .amene{display:none}
  .entree.depart h1{font-size:var(--fs-2xl);margin-top:var(--sp-2)}
  .entree.depart .qf{margin-top:var(--sp-3)}
  /* Le numero d'etape et le sous-titre repetent le titre sur l'ecran de
     depart : sur telephone ils s'effacent, les tuiles remontent au-dessus
     du bouton. Le lien « Vous etes une structure ? » de la barre s'efface
     aussi : il est au pied de page, et la barre prenait trois rangs. */
  .entree.depart .etape-n{display:none}
  /* Le sous-titre reste dans l'arbre d'accessibilite (le focus s'y pose a
     chaque ecran) : hors ecran, pas display:none. */
  .entree.depart .qf-t{position:absolute;width:1px;height:1px;overflow:hidden;
    clip:rect(0 0 0 0);white-space:nowrap;margin:0}
  .nav .pro-lien:not(.duo){display:none}
  /* Sous les tuiles, « des milliers vous attendent » se coupait en trois
     lignes a trois tuiles par rang : le nombre est dans le bouton. */
  .entree.depart .tuile-c{display:none}
}

/* ---- l'impasse a une porte ----------------------------------------------
   L'ecran « aucun animal » affichait les issues en simple texte : on lisait
   qu'ouvrir les especes debloquerait 1 308 animaux, et on devait retrouver
   seul ou faire la manipulation. Ce sont des boutons. */
.issues{display:flex;flex-wrap:wrap;gap:var(--sp-3);margin-top:var(--sp-4)}
.issue{display:flex;align-items:baseline;gap:var(--sp-3);text-align:left;
  background:var(--paper);border:var(--tr-fort);border-radius:var(--r-md);
  padding:var(--sp-3) var(--sp-4);font:inherit;color:var(--ink2);
  cursor:pointer;transition:var(--t-court) var(--e)}
.issue:hover{border-color:var(--terra);background:var(--cream)}
.issue b{font-family:var(--ff-titre);font-size:var(--fs-xl);
  color:var(--terra);line-height:1}
.issue span{font-size:var(--fs-base)}
.empty .rev{margin-top:var(--sp-5)}
.empty .rev .lien{font-size:var(--fs-base)}

/* Fiche ouverte sans foyer declare : on ne laisse pas la place vide.
   Sans echange ni question, la fiche ne montrait rien de ce que le produit
   sait faire - un extrait d'annonce et un rail, comme n'importe quel site. */
.dial.vide{text-align:left}
.dial.vide p{margin:var(--sp-3) 0 var(--sp-4);font-size:var(--fs-base);
  line-height:1.7;color:var(--ink3);max-width:52ch}
.dial.vide .btn{background:var(--ink);color:var(--paper);border:0;
  border-radius:var(--r-pill);padding:12px 24px;font:inherit;
  font-size:var(--fs-base);font-weight:600;cursor:pointer;
  transition:var(--t-court) var(--e)}
.dial.vide .btn:hover{background:var(--terra)}

/* Candidater, depuis la fiche. Plein la ou « toujours disponible ? » est
   creux : c'est l'acte principal, l'autre est une question. Le meme gabarit
   que .dispo pour que les deux tiennent sur une ligne. */
.carte .agir .candidater{background:var(--terraLt);color:var(--ink);
  border:1px solid var(--terraLt);border-radius:var(--r-pill);
  padding:var(--sp-2) var(--sp-4);font-size:var(--fs-base);font-weight:600;
  font-family:inherit;cursor:pointer;min-height:var(--cible);white-space:nowrap}
.carte .agir .candidater:hover:not([disabled]){background:var(--terra);
  color:var(--paper);border-color:var(--terra)}
.carte .agir .candidater.ok{background:none;border-color:var(--green);
  color:var(--paper);cursor:default;white-space:normal;font-weight:400}
.carte .agir .candidater.ko{background:none;border-color:var(--rougeBord);
  color:var(--paper);white-space:normal;font-weight:400}

/* Deux liens dans la barre (« Mon compte », « Vous êtes une structure ? ») :
   avec la marque et la baseline, 846 px pour 768 de fenêtre - la page
   entière défilait de travers sur tablette (audit du 02/09/2026). La
   baseline est un ornement, les liens sont des portes : l'ornement cède
   dès qu'il manque de place, pas seulement sur téléphone. */
@media (max-width: 960px){
  .nav .right{display:none}
}
/* Le lien du dossier quand la personne est connectee : il porte son prenom
   et ses candidatures, il devient un repere, pas un appel - fond plein,
   texte encre, plus de bordure terracotta. */
.pro-lien.connecte{background:var(--cream);color:var(--ink);border-color:var(--cream)}
.pro-lien.connecte:hover,.pro-lien.connecte:focus-visible{background:var(--cream2);color:var(--ink)}

/* La pilule a deux segments de l'entree du dossier : « Créer mon dossier »
   et « Se connecter » dans un seul contour, separes d'un trait. Celui qui
   revient sur un autre appareil se connecte d'un geste au lieu de passer
   par « creer » pour trouver « j'en ai deja un » (porteur du projet,
   02/09/2026). Sur telephone la pilule prend la ligne et les deux
   segments se la partagent. */
.pro-lien.duo{padding:0;overflow:hidden;gap:0}
.pro-lien.duo a{display:inline-flex;align-items:center;justify-content:center;
  min-height:var(--cible);padding:var(--sp-2) var(--sp-4);color:inherit;
  text-decoration:none;white-space:nowrap}
.pro-lien.duo a+a{border-left:var(--tr);color:var(--ink2)}
/* La langue courante du bouton FR / EN : dite a l'oeil, pas seulement au
   lecteur d'ecran (aria-current). */
.pro-lien.duo a[aria-current="true"]{background:var(--cream2);color:var(--ink)}
.pro-lien.duo a:hover,.pro-lien.duo a:focus-visible{background:var(--cream);
  color:var(--terraDk)}
@media (max-width:560px){
  .pro-lien.duo a{flex:1 1 50%}
}

/* Chaque titre finit par un point terracotta, pose par la feuille. Les
   textes n'en portent plus : deux points, ce serait une faute. Le meme
   geste sur le site, le dossier (foyer.css) et l'espace pro (pro.css). */
/* Sur les deux grands titres, la derniere phrase est un <em> en bloc : le
   point se pose sur lui, sinon il tomberait seul a la ligne suivante. */
.entree h1 em::after,.top h1 em::after,.sec h2::after,#foyerTitre::after,
.hnom h2::after,.ah h2::after{content:".";color:var(--terra)}

/* En tete du panneau foyer : la marque, petite, puis « Votre foyer » en
   titre plein. L'etiquette mono en capitales tenait lieu de titre et la
   phrase d'accroche prenait la place du nom (porteur du projet, 02/09/2026). */
.foyer-form .fh .fy-marque{display:flex;align-items:center;gap:var(--sp-2);
  font-family:var(--ff-titre);font-weight:600;font-size:var(--fs-lg);
  color:var(--ink2);margin-bottom:var(--sp-3)}
.foyer-form .fh .fy-marque svg{width:1.4em;height:1.5em;flex:none}
.foyer-form .fh h2{font-size:var(--fs-3xl);font-weight:700;margin:0 0 var(--sp-2)}

/* Les questions propres a l'animal, avant l'envoi d'une candidature
   (pb/complements.py). Sous la barre d'action, comme le signalement : on
   change de registre, on ne cherche plus, on se presente pour lui. */
.cand-zone{padding:var(--sp-5) var(--sp-6) var(--sp-6);background:var(--cream)}
.cand-form h3{font-family:var(--ff-titre);font-size:var(--fs-xl);margin:0 0 var(--sp-3);
  color:var(--ink)}
.cand-form fieldset{border:0;padding:0;margin:0 0 var(--sp-4);min-width:0}
.cand-form legend{font-size:var(--fs-base);font-weight:600;color:var(--ink);
  padding:0;margin-bottom:var(--sp-2);line-height:1.45}
.cand-form .fac{font-weight:400;color:var(--warm);font-size:var(--fs-xs)}
.cand-form .cand-aide{margin:0 0 var(--sp-2);color:var(--ink3);font-size:var(--fs-sm);
  line-height:1.5}
.cand-opt{display:flex;gap:var(--sp-3);align-items:flex-start;min-height:var(--cible);
  padding:var(--sp-1) 0;color:var(--ink2);line-height:1.45;cursor:pointer}
.cand-opt input{margin-top:var(--sp-1);flex:none}
.cand-avert{background:var(--goldLt);color:var(--goldDk);border-radius:var(--r-md);
  padding:var(--sp-3) var(--sp-4);margin:0 0 var(--sp-4);line-height:1.5;
  font-size:var(--fs-base)}
.cand-msg{color:var(--rougeDk);margin:0 0 var(--sp-3);min-height:1em;font-size:var(--fs-base)}
.cand-form .btn{display:inline-flex;align-items:center;min-height:var(--cible);
  padding:var(--sp-3) var(--sp-5);background:var(--terra);color:var(--paper);border:0;
  border-radius:var(--r-pill);font-family:inherit;font-size:var(--fs-base);font-weight:600;
  cursor:pointer}
.cand-form .btn:hover{background:var(--terraDk)}
.cand-form .lien{background:none;border:0;color:var(--ink3);font-family:inherit;
  font-size:var(--fs-base);cursor:pointer;text-decoration:underline;
  margin-left:var(--sp-4);min-height:var(--cible)}
/* « Vos réponses précédentes sont reprises » : une indication, pas une
   alerte - vert doux, pas doré. */
.cand-memo{background:var(--greenLt);color:var(--greenDk);border-radius:var(--r-md);
  padding:var(--sp-3) var(--sp-4);margin:0 0 var(--sp-4);line-height:1.5;
  font-size:var(--fs-base)}

/* Photo de repli : le portrait de l'espece quand celle de la source ne
   repond plus. Il n'occupe pas le cadre comme une photo - il s'y pose. */
.ph img.repli{object-fit:contain;padding:var(--sp-4);background:var(--paper)}

/* Curseur de trajet : la piste aux couleurs du site, la valeur ecrite a
   cote - « ≤ 1 h 30 » -, jamais un chiffre nu. */
.curseur{display:flex;align-items:center;gap:var(--sp-4);flex-wrap:wrap;margin-top:var(--sp-2)}
.curseur input[type="range"]{flex:1 1 200px;min-width:160px;accent-color:var(--terra);height:28px;margin:0}
.curseur output{font-weight:600;color:var(--ink);font-size:var(--fs-base);min-width:9ch}
.curseur output em{font-weight:400;font-style:normal;color:var(--warm);font-size:var(--fs-sm)}
/* Le tri, dans la barre au-dessus des resultats. */
.filters .tri{display:inline-flex;align-items:center;gap:var(--sp-2);font-size:var(--fs-sm);color:var(--warm)}
.filters .tri select{font:inherit;font-size:var(--fs-base);color:var(--ink);background:var(--paper);
  border:var(--tr-fort);border-radius:var(--r-pill);padding:6px 12px;cursor:pointer}

/* ---------- les ecrans partages (pb/front_ecrans.py) ----------
   Les memes questions a l'accueil (le formulaire d'entree .qf, le panneau
   « Modifier » .fb) et dans le dossier (.carte-fy) : les briques sont
   stylees UNE fois, sous .ecrans. Elles vivaient dans foyer.css, servie au
   seul dossier ; l'accueil les reprend depuis l'etape B (05/09/2026). */
.ecrans fieldset{border:0;padding:0;margin:0 0 var(--sp-5);min-width:0}
/* UNE QUESTION NE SE COLLE PAS A L'INDICATION DE LA PRECEDENTE.
   Un cadre porte sa marge EN BAS ; quand il suit une indication -
   qui n'en a pas - les deux se touchent. Mesure au navigateur :
   24 px apres le cadre du pays, 0 px entre « nous gardons la
   commune, pas l'adresse » et « Jusqu'ou iriez-vous le chercher ? ».
   Le meme cran que partout ailleurs, pas un cran invente. */
.ecrans .ind + fieldset{margin-top:var(--sp-5)}
.ecrans legend{font-size:var(--fs-md);color:var(--ink);font-weight:600;padding:0;
  margin-bottom:var(--sp-2)}
.ecrans label{display:block;font-size:var(--fs-base);color:var(--ink2);font-weight:600}
/* « facultatif », « pour votre candidature » : une indication dans
   l'intitule, pas un bouton. */
.ecrans .opt{font-weight:400;color:var(--warm);font-size:var(--fs-xs);
  margin-left:var(--sp-1)}
.ecrans .ind{color:var(--warm);font-size:var(--fs-xs);line-height:1.5;
  margin:var(--sp-2) 0 0;max-width:var(--mesure)}
.ecrans select,.ecrans input[type=text],.ecrans textarea.cp-champ{display:block;width:100%;margin-top:var(--sp-2);
  padding:var(--sp-3);border:var(--tr-champ);border-radius:var(--r-md);font-family:inherit;
  font-size:var(--fs-champ);font-weight:400;background:var(--paper);color:var(--ink);
  min-height:var(--cible);box-sizing:border-box}
.ecrans .lien{background:none;border:0;color:var(--terraDk);font-family:inherit;
  font-size:var(--fs-base);cursor:pointer;text-decoration:underline;
  padding:var(--sp-2) 0;min-height:var(--cible)}
.ecrans .case{display:flex;gap:var(--sp-3);align-items:flex-start;font-weight:400;
  color:var(--ink2);line-height:1.5;padding:var(--sp-2) 0;min-height:var(--cible)}
.ecrans .case input{margin-top:var(--sp-1);flex:none;width:auto;min-height:0}
/* La liste de communes se positionne par rapport au champ, pas a la carte. */
.ecrans .cp-wrap{position:relative;display:block}
.ecrans .cp-wrap .sugg{right:0}
.ecrans label .etat{display:block;margin-top:var(--sp-2);font-weight:400}
/* Une question repondue, la suivante vient a soi (defilement sur mobile) :
   une marge pour ne pas la coller au bord. */
.ecrans fieldset,.ecrans .animal{scroll-margin-top:var(--sp-5)}

/* Les enfants : une ligne par enfant (age + retirer). */
.ecrans .enfants label{margin-bottom:0}
.ecrans .enfant{display:flex;align-items:flex-end;gap:var(--sp-3);margin-bottom:var(--sp-3)}
.ecrans .enfant label{flex:1 1 auto;min-width:0}
.ecrans .enfant .lien{flex:none;padding:var(--sp-2) 0;min-height:var(--cible);color:var(--ink3)}
.ecrans .enfants [data-ajouter-enfant]{padding:var(--sp-2) 0}

/* Les animaux presents : une carte par espece cochee, son compteur, et au
   dossier la sante du groupe. */
.ecrans .animal{background:var(--cream);border:var(--tr);border-radius:var(--r-md);
  padding:var(--sp-3) var(--sp-4);margin-bottom:var(--sp-3)}
.ecrans .animal-t{display:flex;align-items:center;justify-content:space-between;
  gap:var(--sp-3);margin-bottom:var(--sp-3)}
.ecrans .animal-t:last-child{margin-bottom:0}
.ecrans .animal-n{font-weight:600;color:var(--ink);font-size:var(--fs-md)}
.ecrans .compteur{display:inline-flex;align-items:center;gap:var(--sp-1)}
.ecrans .compteur button{width:var(--cible);height:var(--cible);border:var(--tr-fort);
  border-radius:var(--r-circle);background:var(--paper);color:var(--terra);
  font-family:inherit;font-size:var(--fs-lg);line-height:1;cursor:pointer}
.ecrans .compteur button:hover{border-color:var(--terra)}
.ecrans .compteur button:disabled{color:var(--ink3);border-color:var(--cream3);cursor:default}
.ecrans .compteur button:focus-visible{outline:var(--focus);outline-offset:var(--focus-ecart)}
.ecrans .compteur output{min-width:var(--sp-5);text-align:center;font-weight:600;
  font-size:var(--fs-md);font-variant-numeric:tabular-nums;color:var(--ink)}
.ecrans .animal fieldset{margin-bottom:0}
.ecrans .animal .chips-fy{margin-bottom:var(--sp-3)}
/* La liste deroulante « precisez » (maladie ou handicap) : un bouton qui
   resume ce qui est coche, un panneau de cases. */
.ecrans .dd-fy{position:relative}
.ecrans .animal .precis{margin-bottom:var(--sp-3)}
.ecrans .dd-fy-t{display:flex;align-items:center;justify-content:space-between;
  gap:var(--sp-3);width:100%;min-height:var(--cible);padding:var(--sp-3);
  border:var(--tr);border-radius:var(--r-md);background:var(--paper);
  font-family:inherit;font-size:var(--fs-base);color:var(--ink3);
  cursor:pointer;text-align:left}
.ecrans .dd-fy-t.rempli{color:var(--ink);font-weight:600}
.ecrans .dd-fy-t .cv{color:var(--terra);flex:none}
.ecrans .dd-fy-p{position:absolute;left:0;right:0;top:calc(100% + var(--sp-1));
  z-index:var(--z-menu);background:var(--paper);border:var(--tr);
  border-radius:var(--r-md);box-shadow:var(--sh-2);padding:var(--sp-2) var(--sp-3)}
.ecrans .dd-fy-p .case{padding:var(--sp-1) 0;margin:0}
.ecrans .dd-fy-p .dd-g{margin:var(--sp-2) 0 var(--sp-1);font-family:var(--ff-mono);
  font-size:var(--fs-xs);letter-spacing:.06em;text-transform:uppercase;color:var(--ink3)}
.ecrans .dd-fy-p .dd-g:first-child{margin-top:0}
.ecrans .animal .precis-t{margin-bottom:var(--sp-3)}
/* La sante d'une espece, point par point : la question a gauche, les
   reponses a droite ; sur petit ecran, l'une au-dessus de l'autre. */
.ecrans .comp{display:flex;align-items:center;justify-content:space-between;
  gap:var(--sp-3);flex-wrap:wrap;margin-bottom:var(--sp-2)}
.ecrans .comp-l{color:var(--ink2);font-weight:600;font-size:var(--fs-base)}
.ecrans .comp .chips-fy{margin-bottom:0}

/* Pastilles de reponse : l'input est dans le label, invisible mais present
   pour le clavier et les lecteurs d'ecran ; la pastille suit :checked. Un
   geste par question, pas une liste a lire. Sans ancre : l'etape « la vie
   avec l'animal » du dossier les emploie hors des ecrans partages. */
.chips-fy{display:flex;flex-wrap:wrap;gap:var(--sp-2);margin-bottom:var(--sp-4)}
.chip-fy{display:inline-flex;align-items:center;min-height:var(--cible);
  padding:var(--sp-2) var(--sp-4);border:var(--tr-fort);border-radius:var(--r-pill);
  background:var(--paper);color:var(--ink2);font-size:var(--fs-base);font-weight:400;
  cursor:pointer;margin:0;line-height:1.3}
.chip-fy input{position:absolute;opacity:0;width:0;height:0;margin:0}
.chip-fy:has(input:checked){background:var(--terra);border-color:var(--terra);
  color:var(--paper);font-weight:600}
.chip-fy:has(input:focus-visible){outline:var(--focus);outline-offset:var(--focus-ecart)}
.chip-fy:hover{border-color:var(--terra)}
/* Des tuiles (« vous cherchez », « animaux deja au foyer ») : le portrait de
   l'espece dans un rond, le nom dessous, et ce qui attend ; cochee, un
   anneau terracotta, le nom en gras, et l'animal qui sourit. */
.tuiles{display:grid;grid-template-columns:repeat(auto-fill,minmax(var(--tuile-col),1fr));
  gap:var(--sp-2);margin-bottom:var(--sp-4)}
.tuile{position:relative;display:flex;flex-direction:column;align-items:center;
  gap:var(--sp-2);padding:var(--sp-2);border-radius:var(--r-md);cursor:pointer;
  text-align:center;color:var(--ink2);font-size:var(--fs-sm);font-weight:400;margin:0;
  line-height:1.2}
.tuile input{position:absolute;opacity:0;width:0;height:0;margin:0}
.tuile-ph{position:relative;display:flex;align-items:center;justify-content:center;
  width:var(--tuile);height:var(--tuile);border-radius:var(--r-circle);background:var(--cream2);
  color:var(--ink3);font-family:var(--ff-titre);font-size:var(--fs-xl);overflow:hidden;
  border:var(--tr-fort);box-sizing:border-box}
.tuile-ph img{width:var(--picto);height:var(--picto);display:block}
.tuile-ph:has(img) .tuile-i{display:none}
.tuile-ph .picto-pleine{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
.tuile-ph .picto-happy{opacity:0}
.tuile:has(input:checked) .tuile-ph .picto-happy{opacity:1}
@media (prefers-reduced-motion: no-preference){
  .tuile-ph .picto-happy{transition:opacity .18s ease}
}
.tuile-c{display:block;color:var(--ink3);font-size:var(--fs-xs);line-height:1.2;
  margin-top:calc(-1 * var(--sp-1))}
.tuile:hover .tuile-ph{border-color:var(--terra)}
.tuile:has(input:checked) .tuile-ph{outline:var(--anneau);outline-offset:var(--sp-1);
  border-color:var(--terra)}
/* Le nom en terracotta SOMBRE, pas claire : sur le fond creme de l'accueil
   (--cream2) la terracotta mesurait 4,05 pour 4,5 exiges (audit du
   05/09/2026) ; sur le papier du dossier elle passait, et le defaut ne se
   voyait donc pas avant que l'accueil reprenne les tuiles. */
.tuile:has(input:checked) .tuile-n{color:var(--terraDk);font-weight:600}
.tuile:has(input:focus-visible){outline:var(--focus);outline-offset:var(--focus-ecart)}

/* L'entree en trois ecrans : le pas (« 1 sur 3 »), le titre de l'ecran, et
   le pied avec ses deux portes - continuer, ou voir les animaux tout de
   suite. Personne n'est oblige de traverser les trois ecrans. */
.etape-n{font-family:var(--ff-mono);font-size:var(--fs-xs);color:var(--ink3);
  letter-spacing:.04em;text-transform:uppercase;margin:0 0 var(--sp-2)}
.qf .etape-n{margin:0}
.qf .qf-t{font-size:var(--fs-2xl);margin:0 0 var(--sp-2);text-wrap:balance}
.qf .qf-t::after{content:".";color:var(--terra)}
.qf .qf-t:focus-visible{outline:var(--focus);outline-offset:var(--focus-ecart)}
.qf .fin .lien{font-size:var(--fs-base);color:var(--terraDk);text-decoration:underline}
.qf .fin .retour{margin-left:auto;color:var(--ink3);text-decoration:none}
/* Le panneau « Modifier » empile les trois ecrans : un titre de groupe
   au-dessus de chacun, et de l'air entre eux. */
.foyer-form .fb.ecrans .grp{padding:var(--sp-4) 0 var(--sp-2)}

/* Le cœur d'une fiche : mettre de côté, sans rien engager. Il ne porte pas
   la couleur d'action — « Candidater » est le geste, celui-ci ne l'est pas,
   et deux boutons pleins côte à côte diraient deux gestes équivalents. */
.favori{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}
.favori:hover:not([disabled]),.favori:focus-visible{background:var(--cream2);
  color:var(--ink)}
.favori[aria-pressed="true"]{border-color:var(--terra);color:var(--terraDk);
  background:var(--cream2)}

/* La pagination est une barre de filtres CENTREE, et son compteur n'a pas
   de marge. Les deux etaient en `style=` dans `front_client.py`. */
.filters.pag{justify-content:center}
.filters.pag .note{margin:0}


/* UNE PASTILLE EST UN CONTENEUR FLEX, et elle ne l'etait plus.
   `.chip-fy` le declare depuis toujours ; `.ecrans label{display:block}`,
   ecrit pour les libelles ordinaires, le BAT en specificite (0,1,1 contre
   0,1,0). Toutes les pastilles du produit etaient donc en `block` :
   invisible tant qu'elles ne portent qu'un mot, criant des qu'elles en
   portent deux - le drapeau etait colle a « France », sans le `gap` que
   la regle d'a cote demandait pourtant.
   Mesure au navigateur : `display: block`, `gap: 8px`, ecart reel 0 px.
   Corollaire heureux : `align-items:center` reprend aussi, donc le texte
   d'une pastille est enfin centre dans ses 44 px de cible. */
.ecrans label.chip-fy{display:inline-flex}

/* Le choix du pays : un drapeau et son nom, un seul a la fois. Le drapeau
   est un SVG en ligne - Windows ne rend pas les emoji de drapeau, il
   affiche les deux lettres du pays, et une famille aurait lu « FR » la ou
   on lui promet un drapeau. */
.ecrans .drapeaux{gap:var(--sp-3)}
.ecrans label.chip-fy.drap-l{gap:var(--sp-3);padding-left:var(--sp-3)}
/* Un pastel pose a vif se salit : le drapeau porte un filet, comme les
   portraits d'especes portent leur anneau creme. */
.ecrans .drap{flex:none;border-radius:var(--r-xs);
  box-shadow:0 0 0 1px var(--filetDrapeau)}
/* Coche, le fond passe en terracotta : le filet du drapeau doit alors se
   detacher sur LUI, pas sur le papier. */
.ecrans label.chip-fy.drap-l:has(input:checked) .drap{
  box-shadow:0 0 0 1px var(--paper)}

/* =========================================================================
   LE PROTOTYPE DU 21/09/2026 (« Patte Blanche - Prototype nouveau parcours »)
   La barre allegee, l'accueil en une question, deux vitrines, les resultats
   en portraits et la fiche dont les preuves se deplient. « La maquette
   l'emporte » : ces regles passent APRES l'ancien habillage, et chaque bloc
   porte sa propre classe pour ne rien heriter par accident.
   ========================================================================= */

/* ---------- la barre ---------- */
.nav{padding:var(--sp-5) 0 var(--sp-3);gap:var(--sp-3);flex-wrap:nowrap}
.nav .marque{font-size:clamp(24px,3vw,32px);min-width:0;min-height:var(--cible)}
.nav .brand{white-space:nowrap}
.nav-menu{position:relative;flex:none}
.nav-menu[data-menu="pays"]{margin-left:auto}
.nav-pays,.nav-espace{display:inline-flex;align-items:center;gap:var(--sp-2);
  min-height:var(--cible);border-radius:var(--r-pill);font:inherit;
  font-size:var(--fs-base);font-weight:600;cursor:pointer;white-space:nowrap}
.nav-pays{padding:6px 14px 6px 10px;color:var(--ink);border:var(--tr);background:var(--paper)}
.nav-pays:hover{border-color:var(--terraLt)}
.nav-lang{color:var(--warm);font-weight:400;font-family:var(--ff-mono);
  font-size:var(--fs-sm);letter-spacing:.06em}
.nav-pays .car,.nav-espace .car{color:var(--warm);font-weight:400}
.nav-espace{padding:8px 16px;color:var(--paper);border:0;background:var(--ink)}
.nav-espace .car{color:var(--surInk3)}
.nav-espace:hover{background:var(--ink2)}
.drap-b{display:inline-flex}
.drap{border-radius:var(--r-xs);box-shadow:0 0 0 1px var(--filetDrapeau);flex:none}
.nav .drap{width:24px;height:16px}
/* Sur telephone, la marque prend sa ligne (maquette du 29/09/2026). Avec
   l'echelle de texte du 29/09, marque + pays + « Mon espace » demandaient
   358 px pour 308 utiles a 360 : `min-width:0` laissait la marque se
   reduire, et son nom insecable passait SOUS le bouton du pays. Les deux
   boutons restent a droite : leurs menus s'ouvrent vers la gauche
   (`right:0`), et poses a gauche ils sortiraient de l'ecran. */
@media (max-width:640px){
  .nav{flex-wrap:wrap;row-gap:var(--sp-2)}
  .nav .marque{flex:1 1 100%}
}

.nav .menu{position:absolute;right:0;top:calc(100% + var(--sp-2));z-index:var(--z-voile);
  background:var(--paper);border:var(--tr);box-shadow:var(--sh-2)}
.nav .menu-pays{min-width:280px;border-radius:var(--r-md);padding:6px}
.menu-lab{display:block;font-family:var(--ff-mono);font-size:var(--fs-xs);
  letter-spacing:.14em;text-transform:uppercase;color:var(--warm)}
.menu-pays > .menu-lab{padding:8px 10px 6px}
.opt-pays{display:flex;align-items:center;gap:10px;width:100%;min-height:var(--cible);
  padding:6px 10px;border:0;border-radius:var(--r-sm);background:transparent;
  color:var(--ink);font:inherit;font-size:var(--fs-base);cursor:pointer;text-align:left}
.opt-pays:hover{background:var(--cream2)}
.opt-pays[aria-selected="true"]{background:var(--cream2);font-weight:600}
.opt-pays .drap{width:24px;height:16px}
.op-n{flex:1}
.op-c{font-size:var(--fs-sm);color:var(--warm);font-weight:400}
.menu-langue{margin-top:6px;padding:10px 10px 6px;border-top:var(--tr-clair);
  display:flex;align-items:center;gap:var(--sp-2);flex-wrap:wrap}
.menu-langue .menu-lab{flex:1 1 auto}
.seg{display:inline-flex;border:var(--tr);border-radius:var(--r-pill);overflow:hidden}
.seg a{display:inline-flex;align-items:center;min-height:var(--cible);padding:0 12px;
  border-left:var(--tr);margin-left:-1px;background:var(--paper);color:var(--ink3);
  font-family:var(--ff-mono);font-size:var(--fs-sm);letter-spacing:.06em;text-decoration:none}
.seg a[aria-current="true"]{background:var(--ink);color:var(--paper);font-weight:500}
.menu-note{margin:0;padding:6px 10px 4px;font-size:var(--fs-sm);color:var(--warm);line-height:1.5}

.nav .menu-espace{width:min(92vw,560px);border-radius:var(--r-lg);padding:14px;
  box-shadow:var(--sh-3);display:grid;gap:10px;
  grid-template-columns:repeat(auto-fit,minmax(min(100%,240px),1fr))}
.me-carte{border-radius:var(--r-md);padding:var(--sp-4);display:flex;flex-direction:column;gap:var(--sp-2)}
.me-carte b{font-family:var(--ff-titre);font-weight:600;font-size:var(--fs-xl);line-height:1.1}
.me-carte p{margin:0;font-size:var(--fs-sm);line-height:1.5}
.me-carte.fam{background:var(--cream2)}
.me-carte.fam p{color:var(--ink2)}
.me-carte.str{background:var(--ink);color:var(--paper)}
.me-carte.str .menu-lab{color:var(--surInk3)}
.me-carte.str p{color:var(--surInk2)}
.me-gestes{display:flex;gap:var(--sp-2);flex-wrap:wrap;margin-top:var(--sp-1)}
.me-plein,.me-trait{display:inline-flex;align-items:center;min-height:var(--cible);padding:0 14px;
  border-radius:var(--r-pill);font-size:var(--fs-base);font-weight:600;text-decoration:none}
.me-plein{background:var(--terra);color:var(--paper)}
.me-plein:hover{background:var(--terraDk);color:var(--paper)}
.me-carte.str .me-plein{background:var(--terraLt);color:var(--ink)}
.me-trait{border:1.5px solid var(--ink);color:var(--ink)}

/* ---------- l'accueil ---------- */
.acc{background:var(--cream2);border-radius:var(--r-lg);margin-top:var(--sp-1);
  padding:clamp(24px,3.5vw,44px) clamp(18px,3.5vw,44px);display:grid;
  grid-template-columns:repeat(auto-fit,minmax(min(100%,340px),1fr));
  gap:clamp(20px,3.5vw,48px);align-items:start}
.acc-g{display:flex;flex-direction:column;gap:var(--sp-4);min-width:0}
.acc-sur{font-size:var(--fs-xs);color:var(--warm);font-weight:600}
.acc h1{font-family:var(--ff-titre);font-weight:600;font-size:var(--fs-hero);line-height:.98;
  margin:0;letter-spacing:-.025em;text-wrap:balance}
.acc h1 em{display:block;font-style:italic;color:var(--terra)}
.acc .acc-lead{margin:0;font-size:var(--fs-lg);line-height:1.6;color:var(--ink2);max-width:44ch}
.acc .acc-lead b{color:var(--ink)}
/* Le point final d'un titre, en terracotta. `.point` et non `.pt` : `.pt`
   est une empreinte du pattometre, et un nom porte par deux composants
   finit par styler l'autre (CLAUDE.md, 16/09/2026). */
.point{color:var(--terra)}

/* LE CARROUSEL « AUJOURD'HUI » (16/10/2026, demande de Claire). Un cadre
   FIXE - le carrousel ne saute pas d'une diapositive a l'autre -, la photo
   posee entiere dedans, et le reste du cadre porte la meme photo floutee :
   jamais une bande unie autour d'un animal. Les commandes vivent dans une
   zone qui a exactement la taille de la photo (`.car-zone`), pour se poser
   sur elle et pas sur le texte. */
.vedette{position:relative;margin:var(--sp-2) 0 0;background:var(--paper);border:var(--tr);
  border-radius:var(--r-lg);overflow:hidden;box-shadow:var(--sh-2)}
.car-piste{display:flex;overflow-x:auto;scroll-snap-type:x mandatory;scrollbar-width:none;
  overscroll-behavior-x:contain}
.car-piste::-webkit-scrollbar{display:none}
.car-diapo{flex:0 0 100%;min-width:0;scroll-snap-align:start;cursor:pointer}
.ved-ph{position:relative;aspect-ratio:4/3;overflow:hidden;background:var(--ink)}
.ved-ph .ved-fond{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;
  filter:blur(22px) brightness(.78);transform:scale(1.15)}
.ved-ph .ved-cadre{position:absolute;inset:0;overflow:hidden}
.ved-cadre img{position:absolute;inset:0;width:100%;height:100%;object-fit:contain;max-width:none}
.ved-cadre img.repli{background:var(--paper);padding:var(--sp-5)}
.vedette .car-zone{position:absolute;top:0;left:0;right:0;aspect-ratio:4/3;pointer-events:none}
.vedette .car-zone > *{pointer-events:auto}
.vedette .ved-jour{position:absolute;top:var(--sp-2);
  left:calc(var(--sp-2) + var(--cible) + var(--sp-2));
  display:inline-flex;align-items:center;min-height:var(--cible);
  background:var(--papier-voile);border-radius:var(--r-pill);padding:0 var(--sp-3);
  font-family:var(--ff-mono);font-size:var(--fs-xs);letter-spacing:.12em;
  text-transform:uppercase;color:var(--ink3);pointer-events:none}
.vedette .car-nav{position:absolute;top:50%;transform:translateY(-50%);width:var(--cible);height:var(--cible);
  display:grid;place-items:center;border:0;border-radius:var(--r-circle);padding:0;
  background:var(--papier-voile);color:var(--ink);font-size:var(--fs-2xl);line-height:1;
  cursor:pointer;box-shadow:var(--sh-1)}
.vedette .car-prec{left:var(--sp-2)}
.vedette .car-suiv{right:var(--sp-2)}
.vedette .car-nav:hover{background:var(--paper)}
.vedette .car-pied{position:absolute;right:var(--sp-2);bottom:var(--sp-2);display:flex;align-items:center;
  gap:var(--sp-2)}
.car-pos{background:var(--papier-voile);border-radius:var(--r-pill);padding:var(--sp-1) var(--sp-3);
  font-family:var(--ff-mono);font-size:var(--fs-xs);color:var(--ink2)}
.car-pause{width:var(--cible);height:var(--cible);display:grid;place-items:center;border:0;
  border-radius:var(--r-circle);padding:0;background:var(--papier-voile);color:var(--ink);
  font-size:var(--fs-sm);cursor:pointer;box-shadow:var(--sh-1)}
.vedette .ved-bas{display:flex;align-items:center;gap:var(--sp-2) var(--sp-3);
  padding:var(--sp-3) var(--sp-4);flex-wrap:wrap}
.ved-nom{font-family:var(--ff-titre);font-weight:600;font-size:var(--fs-2xl);line-height:1;white-space:nowrap}
.ved-nom span{font-family:var(--ff-corps);font-weight:400;font-size:var(--fs-base);color:var(--warm)}
.ved-org{font-size:var(--fs-sm);color:var(--ink3)}
.vedette .ved-bas .pastilles{flex:1 1 100%;margin:0}

/* LE COEUR, SUR CHAQUE VIGNETTE (16/10/2026, demande de Claire) : en haut a
   gauche de la photo, une cible tactile entiere. Plein quand l'animal est
   mis de cote. Les badges se posent a sa droite. */
.ph .coeur,.vig .coeur,.ved-ph .coeur{position:absolute;top:var(--sp-2);left:var(--sp-2);z-index:2;width:var(--cible);height:var(--cible);
  display:grid;place-items:center;border:0;border-radius:var(--r-circle);padding:0;
  background:var(--papier-voile);color:var(--ink2);cursor:pointer;box-shadow:var(--sh-1)}
.coeur svg{width:var(--sp-5);height:var(--sp-5);fill:none;stroke:currentColor;stroke-width:2}
.coeur:hover,.coeur:focus-visible{color:var(--terraDk)}
/* Sur une photo, on ne sait pas ce qui passe derriere : un anneau d'encre
   doublé d'un liseré papier se voit sur le clair comme sur le sombre. */
.coeur:focus-visible{outline:3px solid var(--ink);outline-offset:2px;
  box-shadow:0 0 0 2px var(--paper),var(--sh-1)}
/* Le cadre du carrousel est sombre sous la photo floutee : l'anneau s'y
   inverse. */
.vedette .coeur:focus-visible{outline-color:var(--paper);
  box-shadow:0 0 0 2px var(--ink),var(--sh-1)}
.coeur.on{color:var(--terra)}
.coeur.on svg{fill:currentColor}
.ph .coeur ~ .badge,.vitrine .vig .coeur ~ .badge,.res .card .ph .coeur ~ .badge{
  left:calc(var(--sp-2) + var(--cible) + var(--sp-2))}

/* L'invitation d'un coeur sans compte : une phrase et la connexion, posee
   en bas de l'ecran, sans voile - on peut continuer a regarder. */
.coeur-invite{position:fixed;left:50%;bottom:var(--sp-4);transform:translateX(-50%);z-index:60;
  width:min(30rem, calc(100% - 2 * var(--sp-4)));background:var(--paper);border:var(--tr);
  border-radius:var(--r-lg);box-shadow:var(--sh-3);padding:var(--sp-4)}
.coeur-invite p{margin:0 0 var(--sp-3);font-size:var(--fs-base);color:var(--ink)}
.coeur-invite-g{display:flex;flex-wrap:wrap;gap:var(--sp-2);align-items:center}
.coeur-invite-g .lien{display:inline-flex;align-items:center;min-height:var(--cible);padding:0 var(--sp-2)}
.coeur-invite .btn{display:inline-flex;align-items:center;min-height:var(--cible);padding:0 var(--sp-4);
  background:var(--ink);color:var(--paper);border-radius:var(--r-pill);font-weight:600;text-decoration:none}
.coeur-invite-x{min-height:var(--cible);padding:0 var(--sp-3);border:var(--tr);border-radius:var(--r-pill);
  background:var(--paper);color:var(--ink2);font:inherit;cursor:pointer}

/* Le formulaire. Il reste colle en haut en defilant sur un grand ecran :
   c'est lui qu'on vient utiliser, la vedette n'est qu'une invitation. */
.acc-f{background:var(--paper);border-radius:var(--r-lg);padding:22px 20px 18px;
  box-shadow:var(--sh-2);display:flex;flex-direction:column;gap:var(--sp-4);align-self:start;
  position:sticky;top:var(--sp-4);min-width:0}
.acc-f .qf-t{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap}
.acc-f .qf-t h2{font-family:var(--ff-titre);font-weight:600;font-size:var(--fs-xl);line-height:1;margin:0}
.acc-f .qf-t h2:focus{outline:0}
.acc-f .qf-t .opt{font-size:var(--fs-sm);color:var(--warm)}
/* Les especes en pastilles : un petit portrait rond, le nom a cote. Le
   meme composant que les tuiles du dossier (EC.tuiles) - seul l'habillage
   change ici. */
.ecrans .tuiles.pilules{display:flex;flex-wrap:wrap;gap:var(--sp-2);grid-template-columns:none}
.ecrans .pilules .tuile{display:inline-flex;flex-direction:row;align-items:center;gap:var(--sp-2);
  width:auto;min-height:var(--cible);padding:4px 14px 4px 4px;border:var(--tr-fort);
  border-radius:var(--r-pill);background:var(--paper);color:var(--ink2);
  font-size:var(--fs-base);cursor:pointer}
.ecrans .pilules .tuile:has(input:checked){border-color:var(--terra);background:var(--terra);
  color:var(--paper);font-weight:600}
.ecrans .pilules .tuile-ph{width:36px;height:36px;flex:none;border:0;box-shadow:none;margin:0}
.ecrans .pilules .tuile:has(input:checked) .tuile-ph{outline:0;box-shadow:none}
.ecrans .pilules .tuile-n,.ecrans .pilules .tuile:has(input:checked) .tuile-n{font-size:var(--fs-base);
  margin:0;color:inherit;font-weight:inherit}
.ecrans .pilules .tuile-c{display:none}
.pil-plus{display:inline-flex;align-items:center;min-height:var(--cible);padding:4px 14px;
  border:1.5px dashed var(--cream3);border-radius:var(--r-pill);background:none;
  color:var(--warm);font:inherit;font-size:var(--fs-base);cursor:pointer;white-space:nowrap;
  margin-top:var(--sp-2)}
.pil-plus:hover{border-color:var(--warm);color:var(--ink3)}

.pres-de{display:flex;align-items:center;gap:10px;border:var(--tr-champ);border-radius:var(--r-md);
  padding:0 10px 0 8px;background:var(--paper);min-height:52px;margin-top:var(--sp-4);position:relative}
.pres-de:focus-within{border-color:var(--terra)}
/* Le champ commune n'a pas d'anneau : c'est son conteneur qui le porte.
   Un trait d'un pixel qui passe du brun au terracotta ne se voit plus
   depuis que le trait de repos est fonce (10/10/2026) : un anneau. */
.pres-de:has(.cp-champ:focus){outline:var(--focus);outline-offset:var(--focus-ecart)}
.pd-pays{display:inline-flex;align-items:center;gap:5px;border:0;background:var(--cream);
  border-radius:var(--r-pill);padding:6px 8px;cursor:pointer;font:inherit;font-size:var(--fs-sm);
  color:var(--warm);flex:none;min-height:var(--cible)}
.pd-pays .drap{width:24px;height:16px}
.pd-l{font-family:var(--ff-mono);font-size:var(--fs-xs);letter-spacing:.12em;text-transform:uppercase;
  color:var(--warm);flex:none;margin:0}
.pres-de .cp-wrap{flex:1;min-width:0;position:static}
.pres-de input[type=text],.pres-de textarea.cp-champ{width:100%;border:0;background:none;font:inherit;
  font-size:var(--fs-champ);color:var(--ink);min-width:0;outline:none;padding:10px 0;box-shadow:none}
.pres-de .sugg{left:0;right:0;top:calc(100% + 4px)}
/* `.ecrans select, .ecrans input` les mettaient a 100 % et a la ligne :
   ici ils partagent une seule ligne avec le drapeau. */
.pres-de input[type=text],.pres-de textarea.cp-champ{display:block;margin:0}
/* LA COMMUNE GARDE SA PLACE, QUELLE QUE SOIT LA LARGEUR DU FORMULAIRE.
   A 360 px le drapeau, l'etiquette et le trajet laissaient 36 px a la
   commune ; a 1024 px, dans une colonne etroite, 62. « Commune ou code
   postal » et « Villers-le-Bouillet (4530) » y etaient rognes (audit du
   21/09/2026). C'est la largeur du FORMULAIRE qui decide, pas celle de
   l'ecran : une requete de conteneur. Sous 520 px, la commune prend toute
   la premiere ligne, drapeau et trajet passent dessous, et l'etiquette
   « Pres de » quitte l'ecran - elle reste lue par un lecteur d'ecran. */
.acc-f{container-type:inline-size}
@container (max-width:520px){
  .pres-de{gap:var(--sp-2);padding:4px 6px;flex-wrap:wrap}
  .pres-de .cp-wrap{flex:1 1 100%;order:-1}
  .pres-de .pd-trajet{max-width:none;flex:1 1 auto;padding:6px 10px}
  .pres-de .pd-l{position:absolute;width:1px;height:1px;overflow:hidden;
    clip:rect(0 0 0 0);white-space:nowrap}
}
.pres-de .pd-trajet{display:inline-block;width:auto;min-width:0;max-width:9.5em;margin:0;flex:0 0 auto}
.pd-trajet{border:var(--tr-champ);background:var(--cream);border-radius:var(--r-pill);padding:6px 10px;
  font:inherit;font-size:var(--fs-base);color:var(--ink);flex:none;min-height:var(--cible);cursor:pointer}

.acc-f .cta{background:var(--terra);color:var(--paper);border:0;border-radius:var(--r-pill);
  padding:14px 24px;font:inherit;font-size:var(--fs-md);font-weight:700;cursor:pointer;
  min-height:54px;display:block;width:100%;text-align:center;line-height:1.25;
  transition:var(--t-court) var(--e)}
.acc-f .cta:hover:not(:disabled){background:var(--ink)}
.acc-f .cta:disabled{opacity:.6;cursor:default}
.acc-f .cta #qn{font-family:var(--ff-titre);font-weight:600;font-size:var(--fs-xl);
  line-height:1;vertical-align:-2px;white-space:nowrap}
.acc-note{margin:0;font-size:var(--fs-sm);color:var(--warm);text-align:center;line-height:1.5}
/* « Autour de moi » dans la phrase qui demande la commune (16/10/2026) :
   l'habit du lien de « Pres de », une cible entiere au doigt. */
#qf .acc-note .acc-indice-b{display:inline-flex;align-items:center;min-height:var(--cible);
  margin:0;padding:0 var(--sp-2);border:0;border-radius:var(--r-sm);background:none;
  color:var(--terra);font:inherit;font-weight:600;text-decoration:underline;
  text-underline-offset:var(--sp-1);cursor:pointer}
#qf .acc-note .acc-indice-b:hover{background:var(--cream)}
.acc-pro{margin:var(--sp-1) 0 0;padding-top:var(--sp-3);border-top:var(--tr-clair);
  font-size:var(--fs-sm);color:var(--ink3);text-align:center}
.acc-pro a{font-weight:600}

#rayures{margin:14px 0 0}

/* ---------- les vitrines ---------- */
#decouverte{padding:var(--sp-5) 0 0}
.sec2{display:flex;align-items:flex-end;gap:var(--sp-4);flex-wrap:wrap;margin-bottom:18px}
.sec2 h2{font-family:var(--ff-titre);font-weight:600;font-size:var(--fs-section);margin:4px 0 0;line-height:1.05}
.sec2 .sub{margin-left:auto;font-size:var(--fs-base);color:var(--warm);max-width:38ch;text-align:right}
/* Rangees toujours pleines : huit portraits sur bureau, six sur tablette,
   quatre sur telephone - le serveur en envoie huit, la feuille masque. */
.vitrine{display:grid;gap:14px;grid-template-columns:repeat(4,minmax(0,1fr))}
/* `.vitrine > .vig` et non `.vitrine > *` : la regle d'affichage de la
   vignette, plus loin, l'emportait a specificite egale et montrait huit
   portraits sur un telephone. */
@media (max-width:1000px){.vitrine{grid-template-columns:repeat(3,minmax(0,1fr))}
  .vitrine>.vig:nth-child(n+7){display:none}}
@media (max-width:640px){.vitrine{gap:10px;grid-template-columns:repeat(2,minmax(0,1fr))}
  .vitrine>.vig:nth-child(n+5){display:none}}
.vitrine .vig{position:relative;aspect-ratio:4/5;border-radius:var(--r-lg);overflow:hidden;
  background:var(--cream2);cursor:pointer;box-shadow:var(--sh-1);border:0;padding:0;
  display:block;transition:var(--t-court) var(--e)}
.vitrine .vig:hover{transform:translateY(-3px)}
.vitrine .vig img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
.vitrine .vig img.repli{object-fit:contain;padding:18%}
.vitrine .vig .badge{position:absolute;top:10px;left:10px;border-radius:var(--r-pill);
  padding:4px 10px;font-size:var(--fs-sm);font-weight:700;color:var(--paper)}
.vitrine .vig .badge.v{background:var(--terraDk)}
.vitrine .vig .badge.urgent{background:var(--rouge)}
.vitrine .vig .badge.neuf{background:var(--green)}
.vitrine .vig .badge.long{background:var(--terra)}
.vig .vig-bas{position:absolute;left:0;right:0;bottom:0;padding:44px 14px 14px;
  background:var(--degrade-photo);color:var(--paper);pointer-events:none}
.vig .vig-bas h3{overflow-wrap:anywhere;font-family:var(--ff-titre);font-weight:600;font-size:var(--fs-2xl);line-height:1;margin:0;
  color:var(--paper)}
.vig .vig-bas p{margin:5px 0 0;font-size:var(--fs-sm);color:var(--surInk2)}

.bloc-alerte{margin:var(--sp-6) 0 0;background:var(--ink);border-radius:var(--r-lg);
  padding:clamp(22px,3vw,34px)}
.bloc-alerte .ah{display:flex;align-items:flex-end;gap:var(--sp-4);flex-wrap:wrap;margin-bottom:18px}
.bloc-alerte .ah-t{flex:1 1 320px}
.bloc-alerte .lab{color:var(--surInk3)}
.bloc-alerte h2{font-family:var(--ff-titre);font-weight:600;color:var(--paper);
  font-size:var(--fs-section);margin:4px 0 0;line-height:1.05}
.bloc-alerte h2 .point{color:var(--terraLt)}
.bloc-alerte p{margin:10px 0 0;color:var(--surInk2);font-size:var(--fs-md);line-height:1.65;max-width:56ch}
/* Le fond terracotta du « bouton unique » de la maquette (ecart voulu
   « Boutons » : la couleur seule, ni sa taille ni sa graisse). C'etait un
   bouton fantome, borde de --terraLt (QA du 13/10/2026). */
.al-voir{background:var(--terra);color:var(--paper);border:0;border-radius:var(--r-pill);
  padding:10px 18px;font:inherit;font-size:var(--fs-base);font-weight:600;cursor:pointer;
  min-height:var(--cible);white-space:nowrap}
.al-voir:hover{background:var(--terraLt);color:var(--ink)}
.vitrine .vig.al{background:var(--inkRaye);border-radius:var(--r-md);box-shadow:none}
/* Dans le bloc sombre, chaque classe qui porte du texte redit sa couleur
   (tests/test_style.py) : un texte fonce y serait invisible. */
.bloc-alerte .vig-bas{padding:40px 12px 10px;background:var(--degrade-photo-fort);color:var(--paper)}
.vig.al .vig-bas b{overflow-wrap:anywhere;display:block;font-family:var(--ff-titre);font-weight:600;font-size:var(--fs-xl);line-height:1.05}
.vig.al .depuis{display:block;font-size:var(--fs-sm);color:var(--terraLt);font-weight:600;margin-top:2px;
  position:static;background:none;padding:0}
/* LE PAYS D'UN ANIMAL HORS DU PAYS DE REFERENCE (lot C du 19/10/2026) :
   le drapeau et le nom, sous la ligne de la structure. Dans le bloc sombre
   la couleur se redit (tests/test_style.py). */
.vig .vig-pays{display:flex;align-items:center;gap:var(--sp-1);margin-top:var(--sp-1);
  font-size:var(--fs-sm);font-weight:600;color:var(--paper)}
.bloc-alerte .vig .vig-pays{color:var(--paper)}
.vig .vig-pays .drap,.ved-org .vig-pays .drap{width:20px;height:14px}
.ved-org .vig-pays{display:inline-flex;align-items:center;gap:var(--sp-1);margin-left:var(--sp-2);
  font-weight:600;color:var(--ink2);vertical-align:middle}
/* L'ancien habillage posait un point terracotta en `::after` sur ces
   titres ; le prototype l'ecrit dans le texte (<span class="pt">). Deux
   points a l'ecran, sinon. */
.bloc-alerte .ah h2::after,.acc-f .qf-t::after{content:none}

/* ---------- les resultats ---------- */
.res{padding-top:var(--sp-1)}
.barre-res{position:sticky;top:0;z-index:var(--z-barre);background:var(--cream);
  padding:8px 0 12px;display:flex;gap:var(--sp-2);align-items:center;flex-wrap:wrap;
  border-bottom:var(--tr)}
.barre-res .pastilles{display:flex;gap:var(--sp-2);flex-wrap:wrap;align-items:center;flex:1 1 auto;min-width:0}
/* 40 px et 14 px a la souris, comme la maquette ; 44 px au doigt (plus bas,
   apres le tri). La regle posait 44 px sans condition et 15 px de texte :
   la grille descendait de 21 px sur un ecran de bureau (QA du 13/10/2026). */
.barre-res .f{display:inline-flex;align-items:center;gap:var(--sp-2);min-height:var(--pastille);
  font-size:var(--fs-sm);white-space:nowrap}
.barre-res .f.app{border:1.5px solid var(--ink);background:var(--ink);color:var(--paper);
  padding:6px 8px 6px 14px}
.barre-res .f.app .drap{width:20px;height:14px}
.barre-res .f.app .x{width:22px;height:22px;border-radius:var(--r-circle);background:var(--inkChoisi);
  display:inline-grid;place-items:center;font-size:var(--fs-sm);margin:0}
.barre-res .f.affiner{border:1.5px solid var(--terra);background:var(--paper);color:var(--terra);font-weight:600}
.barre-res .f.affiner:hover{background:var(--terra);color:var(--paper)}
.barre-res .f.raz{padding:6px 12px}
/* Un groupe deplie (21/09/2026) : sous la rangee, sur toute la largeur, et
   borne en hauteur - quatre-vingt-dix races defilent dans leur boite au
   lieu de repousser les resultats. */
.barre-res .grp-detail{flex:1 1 100%;display:flex;flex-wrap:wrap;gap:var(--sp-2);
  max-height:12.5rem;overflow-y:auto;padding:var(--sp-2);background:var(--paper);
  border:var(--tr);border-radius:var(--r-md)}
/* LES RUBRIQUES DU GROUPE « Vos criteres » (28/09/2026). Le panneau des
   races n'en a pas - une seule liste n'a pas besoin d'un titre - et celui
   des criteres en a trois, parce qu'une liste de quatorze reponses
   melangees ne se relit pas. Chacune prend toute la largeur pour que les
   pastilles de la rubrique suivante ne remontent pas a cote du titre. */
.barre-res .grp-detail .grp-sec{flex:1 1 100%;margin:0;
  font-size:var(--fs-xs);color:var(--warm)}
.barre-res .grp-detail .grp-sec ~ .grp-sec{margin-top:var(--sp-2)}
.barre-res .grp-detail .grp-l{flex:1 1 100%;display:flex;flex-wrap:wrap;gap:var(--sp-2)}
.barre-res .f.app.mini{font-size:var(--fs-sm);padding:var(--sp-1) var(--sp-2) var(--sp-1) var(--sp-3)}
/* UN GROUPE LONG S'OUVRE EN PANNEAU (lot C du 19/10/2026) : au-dessus des
   resultats, sous la barre, avec un champ qui filtre la liste. Il ne
   repousse rien ; un clic dehors ou Echap le referme (front_client.py).
   Le champ reste en tete quand la liste defile. */
.barre-res .grp-panneau{position:absolute;top:100%;left:0;right:0;z-index:var(--z-menu);
  max-height:min(24rem,70vh);overflow-y:auto;flex-direction:column;flex-wrap:nowrap;
  align-items:stretch;box-shadow:var(--sh-2)}
.barre-res .grp-panneau .grp-tete{position:sticky;top:0;display:flex;gap:var(--sp-2);
  align-items:center;background:var(--paper);padding-bottom:var(--sp-2)}
.barre-res .grp-panneau .grp-q{flex:1 1 auto;min-width:0;min-height:var(--cible);font:inherit;
  font-size:var(--fs-base);color:var(--ink);background:var(--paper);border:var(--tr-champ);
  border-radius:var(--r-pill);padding:var(--sp-1) var(--sp-3)}
.barre-res .grp-panneau .grp-c{display:flex;flex-wrap:wrap;gap:var(--sp-2)}
.barre-res .grp-panneau .grp-aucun{margin:0;font-size:var(--fs-sm);color:var(--ink3)}
.barre-res .grp-panneau [hidden]{display:none}
.barre-res .grp-panneau [data-tout]{align-self:flex-start}
.barre-res .tri{margin-left:auto;display:inline-flex;align-items:center;gap:var(--sp-2);
  font-size:var(--fs-sm);color:var(--warm)}
.barre-res .tri select{font:inherit;font-size:var(--fs-base);color:var(--ink);background:var(--paper);
  border:var(--tr-champ);border-radius:var(--r-pill);padding:6px 12px;min-height:var(--cible);max-width:260px}
.tete-res{display:flex;align-items:baseline;gap:var(--sp-3);padding:22px 0 14px;flex-wrap:wrap}
.tete-res h1{font-family:var(--ff-titre);font-weight:600;font-size:clamp(24px,3vw,32px);margin:0;line-height:1.15}
.tete-res h1:focus{outline:0}
.tete-res .sub{font-size:var(--fs-base);color:var(--warm)}

.res .grid{gap:18px;grid-template-columns:repeat(auto-fill,minmax(min(100%,270px),1fr))}
.res .card{border-radius:var(--r-lg);box-shadow:var(--sh-1)}
.res .card:hover{transform:translateY(-3px);border-color:var(--terraLt)}
.res .card.sale{border-top:var(--tr)}
.res .card .ph{aspect-ratio:4/5;background:var(--cream2)}
.res .card .ph img.repli{object-fit:contain;padding:18%}
.res .card .ph .badge{top:10px;left:10px;border-radius:var(--r-pill);padding:4px 11px;
  font-weight:700;color:var(--paper)}
.res .card .ph .badge.v{background:var(--terraDk)}
.res .card .ph .badge.urgent{background:var(--rouge)}
.res .card .ph .badge.neuf{background:var(--green)}
.res .card .ph .badge.long{background:var(--terra)}
.res .card .ph .route{position:absolute;top:10px;right:10px;background:var(--papier-voile);
  border-radius:var(--r-pill);padding:4px 11px;font-size:var(--fs-sm);font-weight:600;color:var(--ink2)}
.res .card .ph .route small{font-weight:400;color:var(--warm)}
.res .card .body{padding:14px 16px 16px;display:flex;flex-direction:column;gap:var(--sp-2);flex:1}
.res .card .line1{display:flex;align-items:baseline;gap:10px}
.res .card h3{overflow-wrap:anywhere;min-width:0;font-family:var(--ff-titre);font-weight:600;font-size:var(--fs-2xl);line-height:1.1;margin:0}
.res .card h3 .age{font-family:var(--ff-corps);font-weight:400;font-size:var(--fs-base);color:var(--warm)}
.res .card .fee{margin-left:auto;font-size:var(--fs-sm);color:var(--warm);white-space:nowrap;text-align:right}
.res .card .org{margin:0;color:var(--ink3);font-size:var(--fs-base)}
.verdicts{list-style:none;margin:var(--sp-1) 0 0;padding:0;display:grid;gap:6px}
.verdicts li{display:flex;gap:var(--sp-2);align-items:flex-start;font-size:var(--fs-base);
  line-height:1.45;color:var(--ink2)}
.verdicts .sg{flex:none;width:18px;height:18px;border-radius:var(--r-circle);display:inline-grid;
  place-items:center;font-size:var(--fs-xs);font-weight:700;margin-top:2px}
.verdicts .oui .sg{background:var(--greenLt);color:var(--greenDk)}
.verdicts .non .sg{background:var(--rougeLt);color:var(--rougeDk)}
.verdicts .q .sg{background:var(--goldLt);color:var(--goldDk)}
.res .card .etranger,.res .card .zn,.res .card .maj{margin:0;font-size:var(--fs-sm)}
.res .pag{padding:0 0 var(--sp-7)}

/* ---------- la fiche ---------- */
.doc.fiche2{max-width:920px;background:var(--paper);border-radius:var(--r-lg);overflow:hidden;
  box-shadow:var(--sh-3)}
/* Une hauteur, pas un rapport : `aspect-ratio` + `max-height` limitait la
   LARGEUR a 832 px dans une fiche de 920, et la photo laissait une bande. */
.f-hero{position:relative;width:100%;height:clamp(240px,58vw,520px);background:var(--cream2)}
/* Le cadre est en paysage et beaucoup de photos d'animaux sont en
   portrait : centree, la coupe tombait sur les yeux et emportait le haut du
   crane (QA du 13/10/2026). La coupe se cale plus haut ; une photo en
   paysage, presque pas coupee en hauteur, n'en bouge guere. */
.f-hero img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;
  object-position:50% 25%}
.f-hero img.repli{object-fit:contain;object-position:50% 50%;padding:12%}
.f-hero .close{position:absolute;top:12px;right:12px;background:var(--ink);color:var(--paper);
  border:0;width:var(--cible);height:var(--cible);border-radius:var(--r-circle);font-size:var(--fs-lg);cursor:pointer}
.f-hero .badge{position:absolute;top:12px;left:12px;border-radius:var(--r-pill);padding:5px 12px;
  font-size:var(--fs-sm);font-weight:700;color:var(--paper)}
.f-hero .badge.v{background:var(--terraDk)}
.f-hero .badge.urgent{background:var(--rouge)}
.f-hero .badge.neuf{background:var(--green)}
.f-hero .badge.long{background:var(--terra)}
.f-corps{padding:clamp(18px,3vw,28px) clamp(16px,3vw,32px) 24px}
/* La galerie d'une annonce deposee (15/10/2026) : une rangee de vignettes
   sous la grande photo, qui defile dans sa boite plutot que d'elargir la
   page. Chaque vignette est une cible entiere. */
.f-gal{display:flex;gap:var(--sp-2);padding:var(--sp-2) clamp(16px,3vw,32px) 0;
  overflow-x:auto;scrollbar-width:thin}
.f-gal button{flex:0 0 auto;width:76px;height:56px;padding:0;border:2px solid transparent;
  border-radius:var(--r-sm);overflow:hidden;background:var(--cream2);cursor:pointer}
.f-gal button[aria-pressed="true"]{border-color:var(--terra)}
.f-gal img{display:block;width:100%;height:100%;object-fit:cover}
/* Ce que la loi demande, replie en une ligne sous l'animal et TOUJOURS
   avant les gestes (16/10/2026) : le texte ne change pas, il se deplie. */
.f-loi{margin:var(--sp-4) 0 0;padding:var(--sp-1) 0 0;border-top:var(--tr-clair)}
.f-loi > summary{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-2);
  min-height:var(--cible);cursor:pointer;list-style:none}
.f-loi > summary::-webkit-details-marker{display:none}
.f-loi > summary .dep{font-size:var(--fs-sm);color:var(--ink3)}
.f-loi[open] > summary .dep{display:none}
.f-loi .f-ue,.f-loi .f-cedant{margin-top:var(--sp-2)}
/* Un departement impose : la seule contrainte qui ecarte une famille, en
   rouge sous les pastilles plutot que perdue dans la ligne d'identite. */
.fiche2 .f-zone{display:inline-block;margin:var(--sp-2) 0 0;padding:var(--sp-1) var(--sp-3);
  border:var(--tr);border-color:var(--terraDk);border-radius:var(--r-pill);
  font-size:var(--fs-sm);font-weight:600;color:var(--terraDk)}
/* Une seule invitation au foyer, discrete : un lien, pas un second bouton. */
.fiche2 .lien-invite{background:none;border:0;padding:0;min-height:var(--cible);font:inherit;
  font-weight:600;color:var(--terraDk);text-decoration:underline;cursor:pointer;text-align:right}
/* Du meme refuge : des cartes qui ouvrent une fiche, en rangee. */
.f-meme{margin:var(--sp-5) 0 0;padding:var(--sp-4) 0 0;border-top:var(--tr-clair)}
.f-meme h3{margin:0;font-family:var(--ff-titre);font-weight:600;font-size:var(--fs-2xl)}
.f-meme .note{margin:var(--sp-1) 0 0;font-size:var(--fs-sm);color:var(--ink3)}
.f-meme-r{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(100%,140px),1fr));
  gap:var(--sp-3);margin-top:var(--sp-3)}
.f-mc{display:flex;flex-direction:column;align-items:flex-start;gap:2px;padding:0 0 var(--sp-2);
  border:var(--tr);border-radius:var(--r-md);background:var(--paper);overflow:hidden;
  cursor:pointer;text-align:left;font:inherit;color:var(--ink)}
.f-mc:hover,.f-mc:focus-visible{box-shadow:var(--sh-2)}
.f-mc-ph{position:relative;display:block;width:100%;aspect-ratio:1/1;background:var(--cream2)}
.f-mc-ph img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
.f-mc-ph img.repli{object-fit:contain;padding:14%}
.f-mc b{padding:0 var(--sp-2);font-family:var(--ff-titre);font-weight:600;font-size:var(--fs-lg);
  overflow-wrap:anywhere}
.f-mc b::first-letter{text-transform:uppercase}
.f-mc span{padding:0 var(--sp-2);font-size:var(--fs-sm);color:var(--ink3)}
.f-tete{display:flex;align-items:flex-start;gap:var(--sp-4);flex-wrap:wrap}
.f-id{flex:1 1 280px;min-width:0}
.f-id h2{font-family:var(--ff-titre);font-weight:600;font-size:var(--fs-fiche);line-height:1;margin:0;
  letter-spacing:-.02em}
.f-id h2::first-letter{text-transform:uppercase}
.f-id .ref{margin:6px 0 0}
.f-id .sous{margin:8px 0 0;font-size:var(--fs-md);color:var(--ink3)}
.f-route{margin:6px 0 0;font-size:var(--fs-base);color:var(--ink3)}
.f-route b{color:var(--ink)}
.f-route .fiab{color:var(--warm);font-size:var(--fs-sm)}
.fiche2 .f-note{margin:6px 0 0;font-size:var(--fs-sm);color:var(--ink3);line-height:1.5;max-width:60ch}
.f-verif{font-size:var(--fs-sm);color:var(--warm)}
.f-verif.vieille{color:var(--terraDk)}
.f-score{display:flex;flex-direction:column;align-items:flex-end;gap:var(--sp-2)}
.fiche2 .pattes{display:flex;gap:5px}
.fiche2 .pt{width:22px;height:24px;display:block;opacity:.25}
.fiche2 .pt.on{opacity:1}
.fiche2 .pt .pw{width:100%;height:100%}
.fiche2 .pt .pw ellipse,.fiche2 .pt .pw path{fill:var(--warm)}
.fiche2 .pt.on .pw ellipse,.fiche2 .pt.on .pw path{fill:var(--green)}
.fiche2 .accord{border-radius:var(--r-pill);padding:8px 16px;font-size:var(--fs-base);font-weight:600;
  white-space:nowrap;color:var(--paper);background:var(--green)}
.fiche2 .accord.q{background:var(--goldDk)}
.fiche2 .accord.invite{background:var(--terra);border:0;cursor:pointer;font:inherit;font-weight:600;
  white-space:normal;text-align:center}
.fiche2 .accord.invite:hover{background:var(--terraDk)}

/* LA FICHE, VERSION 4 (16/10/2026) : en haut la photo et l'essentiel, puis
   « chez vous, ca colle ? », « faire connaissance », le trajet et les etapes.
   Les couleurs d'etat sont celles des pastilles (socle.css) : vert l'annonce
   dit oui, rouge elle dit non, ambre elle ne dit rien. */
.fiche2.v4{position:relative}
.fiche2.v4 > .close{position:absolute;top:var(--sp-3);right:var(--sp-3);z-index:3;background:var(--ink);
  color:var(--paper);border:0;width:var(--cible);height:var(--cible);border-radius:var(--r-circle);
  font-size:var(--fs-lg);cursor:pointer}
.fiche2 .f-haut{display:grid;grid-template-columns:minmax(0,1fr)}
.fiche2 .f-photo{position:relative;min-width:0}
.fiche2 .f-vu{position:absolute;left:var(--sp-3);bottom:var(--sp-3);display:inline-flex;align-items:center;
  gap:var(--sp-1);max-width:calc(100% - var(--sp-5));padding:var(--sp-1) var(--sp-3);border-radius:var(--r-pill);
  background:var(--greenLt);color:var(--greenDk);font-size:var(--fs-sm);font-weight:600}
.fiche2 .f-vu.vieille{background:var(--goldPale);color:var(--goldDk)}
.fiche2 .f-vu svg{flex:none;width:var(--fs-md);height:var(--fs-md)}
.fiche2 .f-ess{display:flex;flex-direction:column;gap:var(--sp-3);padding:var(--sp-5) var(--sp-5) var(--sp-4);min-width:0}
.fiche2 .f-ess h2{margin:0;font-family:var(--ff-titre);font-weight:600;font-size:var(--fs-fiche);line-height:1;
  letter-spacing:-.02em;overflow-wrap:anywhere}
.fiche2 .f-ess h2::first-letter{text-transform:uppercase}
.fiche2 .f-ess .sous{margin:calc(var(--sp-2) * -1) 0 0;font-size:var(--fs-md);color:var(--ink3)}
.fiche2 .f-tuiles{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--sp-2)}
.fiche2 .f-tuile{display:flex;flex-direction:column;align-items:flex-start;gap:2px;min-width:0;padding:var(--sp-3);
  border:0;border-radius:var(--r-md);background:var(--cream);color:var(--ink);font:inherit;text-align:left}
.fiche2 button.f-tuile{cursor:pointer}
.fiche2 .f-tuile svg{width:var(--fs-lg);height:var(--fs-lg);color:var(--ink3)}
.fiche2 .f-tuile b{font-size:var(--fs-xl);line-height:1.1;overflow-wrap:anywhere}
.fiche2 .f-tuile span{font-size:var(--fs-sm);color:var(--ink3);overflow-wrap:anywhere}
.fiche2 .f-tuile.oui{background:var(--greenLt);color:var(--greenDk)}
.fiche2 .f-tuile.non{background:var(--rougeLt);color:var(--rougeDk)}
.fiche2 .f-tuile.q{background:var(--goldPale);color:var(--goldDk)}
.fiche2 .f-tuile.oui svg,.fiche2 .f-tuile.oui span,.fiche2 .f-tuile.non svg,.fiche2 .f-tuile.non span,
.fiche2 .f-tuile.q svg,.fiche2 .f-tuile.q span{color:inherit}

.f-agir{display:flex;flex-direction:column;gap:var(--sp-3)}
.f-agir .candidater,.f-agir .ecrire.principal{display:flex;align-items:center;justify-content:center;width:100%;
  min-height:var(--cible);padding:var(--sp-3) var(--sp-4);border:0;border-radius:var(--r-pill);
  background:var(--terra);color:var(--paper);font:inherit;font-size:var(--fs-md);font-weight:700;
  text-decoration:none;cursor:pointer;box-shadow:var(--sh-1)}
.f-agir .candidater:hover,.f-agir .ecrire.principal:hover{background:var(--terraDk)}
.f-agir .fc-sec{display:flex;gap:var(--sp-2);flex-wrap:wrap}
.f-agir .fc-sec .ecrire,.f-agir .favori,.f-agir .copier{display:inline-flex;align-items:center;gap:var(--sp-1);
  min-height:var(--cible);padding:0 var(--sp-4);border:var(--tr);border-radius:var(--r-pill);background:var(--paper);
  color:var(--ink2);font:inherit;font-size:var(--fs-sm);font-weight:600;text-decoration:none;cursor:pointer}
.f-agir .favori.on{background:var(--terraLt);border-color:var(--terraLt);color:var(--ink)}
.f-agir .retiree{margin:0;font-weight:600;color:var(--terraDk)}
.f-agir svg{flex:none;width:var(--fs-md);height:var(--fs-md)}
.f-agir .fc-part{display:flex;align-items:center;gap:var(--sp-1);flex-wrap:wrap}
.f-agir .fc-part .fc-lab{flex-basis:100%;font-size:var(--fs-sm);font-weight:600;color:var(--ink2)}
.f-agir .fc-r{display:inline-flex;align-items:center;justify-content:center;width:var(--cible);height:var(--cible);
  border:var(--tr);border-radius:var(--r-circle);background:var(--paper);color:var(--ink);cursor:pointer;padding:0}
.f-agir .fc-r svg{width:var(--fs-lg);height:var(--fs-lg)}
.f-agir .fc-r:hover{background:var(--cream2)}
.f-agir .fc-natif{display:flex;align-items:center;justify-content:center;gap:var(--sp-2);width:100%;
  min-height:var(--cible);border:var(--tr);border-radius:var(--r-pill);background:var(--paper);color:var(--ink);
  font:inherit;font-weight:600;cursor:pointer}
.f-agir .fc-copie{flex-basis:100%;font-size:var(--fs-sm);color:var(--greenDk)}
.f-agir .fc-copie:empty{display:none}
.f-agir .fc-par{display:flex;align-items:center;gap:var(--sp-2);margin:0;font-size:var(--fs-sm);color:var(--ink3)}
.f-agir .fc-par span{display:flex;flex-direction:column;min-width:0}
.f-agir .fc-par b{color:var(--terraDk);overflow-wrap:anywhere}
.f-agir .fc-par small{font-size:var(--fs-sm);color:var(--warm)}
.f-agir .fc-logo{flex:none;width:var(--cible);height:var(--cible);border-radius:var(--r-md);background:var(--cream2);
  object-fit:contain;padding:var(--sp-1);display:inline-flex;align-items:center;justify-content:center}
.f-agir .fc-logo svg{width:60%;height:60%}
.f-agir .fc-logo svg ellipse,.f-agir .fc-logo svg path{fill:var(--warm)}
.f-agir .fc-cond{display:flex;gap:var(--sp-2);align-items:flex-start;margin:0;font-size:var(--fs-sm);color:var(--ink3)}

.fiche2 .f-h{margin:var(--sp-5) 0 var(--sp-3);font-family:var(--ff-titre);font-weight:600;font-size:var(--fs-2xl)}
.fiche2 .f-lab{margin:var(--sp-4) 0 var(--sp-2);font-size:var(--fs-sm);font-weight:600;color:var(--ink3)}
.fiche2 .f-ct-g,.fiche2 .f-pt-g{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(100%,135px),1fr));gap:var(--sp-2)}
.fiche2 .f-ct,.fiche2 .f-pt{display:flex;flex-direction:column;gap:2px;padding:var(--sp-3);border-radius:var(--r-md);min-width:0}
.fiche2 .f-ct svg,.fiche2 .f-pt svg{width:var(--fs-xl);height:var(--fs-xl)}
.fiche2 .f-ct b,.fiche2 .f-pt b{font-size:var(--fs-base);overflow-wrap:anywhere}
.fiche2 .f-ct span,.fiche2 .f-pt span{font-size:var(--fs-sm);overflow-wrap:anywhere}
/* Au telephone, trois tuiles dans 320 px : un nom de commune se coupait au
   milieu (« Compiegn e »). Moins de marge, et une coupure de mot plutot
   qu'une coupure de lettre. Le pied aligne son lien de retrait a gauche. */
@media (max-width:560px){
  .fiche2 .f-tuile{padding:var(--sp-2)}
  .fiche2 .f-tuile span{overflow-wrap:break-word;hyphens:auto}
}
.fiche2 .f-pied .relai-retrait{text-align:left}
.fiche2 .f-ct.oui,.fiche2 .f-pt.oui{background:var(--greenLt);color:var(--greenDk)}
.fiche2 .f-ct.non{background:var(--rougeLt);color:var(--rougeDk)}
.fiche2 .f-ct.q,.fiche2 .f-pt.q{background:var(--goldPale);color:var(--goldDk)}
.fiche2 .f-pt.attn{background:var(--goldLt);color:var(--goldDk)}
.fiche2 .f-pt.info{background:var(--cream);color:var(--ink2)}
.fiche2 .f-traits{display:flex;flex-wrap:wrap;gap:var(--sp-2);margin:0;padding:0;list-style:none}
.fiche2 .f-traits li{padding:var(--sp-1) var(--sp-3);border-radius:var(--r-pill);background:var(--cream2);
  color:var(--ink);font-weight:600}
.fiche2 .f-cite{margin:var(--sp-4) 0 0;padding:var(--sp-1) 0 var(--sp-1) var(--sp-4);border-left:3px solid var(--terraLt);
  font-family:var(--ff-titre);font-size:var(--fs-lg);line-height:1.5;color:var(--ink)}
.fiche2 .f-tout{margin-top:var(--sp-4);border-top:var(--tr-clair)}
.fiche2 .f-tout > summary{display:flex;align-items:center;gap:var(--sp-2);min-height:var(--cible);cursor:pointer;
  font-weight:600;list-style:none}
.fiche2 .f-tout > summary::-webkit-details-marker{display:none}
.fiche2 .f-tout svg{width:var(--fs-md);height:var(--fs-md)}
.fiche2 .f-texte{line-height:1.6;color:var(--ink2);overflow-wrap:anywhere}
.fiche2 .f-duo{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,280px),1fr));gap:var(--sp-3);
  margin-top:var(--sp-5)}
.fiche2 .fr-carte{display:flex;flex-direction:column;gap:var(--sp-2);padding:var(--sp-4);border:var(--tr);
  border-radius:var(--r-lg);background:var(--paper)}
.fiche2 .fr-carte .f-h{margin:0;font-size:var(--fs-xl)}
.fiche2 .fr-carte b{color:var(--ink);overflow-wrap:anywhere}
.fiche2 .fr-carte small{color:var(--warm)}
.fiche2 .fr-l{display:inline-flex;align-items:flex-start;gap:var(--sp-1);font-size:var(--fs-sm);color:var(--ink3)}
.fiche2 .fr-l svg{flex:none;width:var(--fs-md);height:var(--fs-md)}
.fiche2 .fr-svg{width:100%;height:auto}
.fiche2 .fr-svg path{fill:none;stroke:var(--warm);stroke-width:3;stroke-dasharray:6 5}
.fiche2 .fr-svg circle.v{fill:var(--cream);stroke:var(--ink3);stroke-width:2}
.fiche2 .fr-svg circle.r{fill:var(--terraLt);stroke:var(--terraDk);stroke-width:2}
.fiche2 .fr-svg rect{fill:var(--paper);stroke:var(--cream3)}
.fiche2 .fr-svg text{fill:var(--ink);font-weight:600;font-size:var(--fs-sm)}
.fiche2 .fr-itin{display:flex;flex-wrap:wrap;gap:var(--sp-2)}
.fiche2 .fr-itin a{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);color:var(--ink);font-weight:600;text-decoration:none}
.fiche2 .fr-itin a:hover{background:var(--cream2)}
.fiche2 .fr-itin svg{width:var(--fs-md);height:var(--fs-md)}
.fiche2 .fr-note{margin:0;font-size:var(--fs-sm);color:var(--warm)}
.fiche2 .f-etapes ol{display:grid;gap:var(--sp-3);margin:0;padding:0;list-style:none}
.fiche2 .f-etapes li{display:flex;align-items:flex-start;gap:var(--sp-3)}
.fiche2 .f-etapes li > b{flex:none;display:inline-flex;align-items:center;justify-content:center;
  width:calc(var(--sp-5) + var(--sp-1));height:calc(var(--sp-5) + var(--sp-1));border-radius:var(--r-circle);
  background:var(--cream2);color:var(--ink)}
.fiche2 .f-etapes li:first-child > b{background:var(--terra);color:var(--paper)}
.fiche2 .f-etapes li span{display:flex;flex-direction:column;font-weight:600}
.fiche2 .f-etapes small{font-weight:400;font-size:var(--fs-sm);color:var(--warm)}
.fiche2 .f-barre{position:fixed;left:0;right:0;bottom:0;z-index:5;display:flex;align-items:center;gap:var(--sp-2);
  padding:var(--sp-2) var(--sp-3);background:var(--paper);border-top:var(--tr);box-shadow:var(--sh-2)}
.fiche2 .f-barre[hidden]{display:none}
.fiche2 .f-barre button{display:inline-flex;align-items:center;justify-content:center;flex:none;width:var(--cible);
  height:var(--cible);border:var(--tr);border-radius:var(--r-circle);background:var(--paper);color:var(--ink);cursor:pointer}
.fiche2 .f-barre button svg{width:var(--fs-lg);height:var(--fs-lg)}
.fiche2 .f-barre .f-barre-p{flex:1;width:auto;border:0;border-radius:var(--r-pill);background:var(--terra);
  color:var(--paper);font:inherit;font-weight:700;padding:0 var(--sp-4)}

/* Sur un grand ecran, la photo et l'essentiel cote a cote. */
@media (min-width: 900px){
  .fiche2 .f-haut{grid-template-columns:minmax(0,1.1fr) minmax(0,1fr)}
  .fiche2 .f-haut .f-hero{height:100%;min-height:440px}
}

/* LA FICHE, VERSION 5 (16/10/2026, Claire : « plus percutant et visuel »).
   La photo en grand avec le nom pose dessus, les ententes en trois tuiles,
   une carte d'action qui reste a l'ecran au bureau - le trajet et les frais
   en grand, la loi PUIS le geste -, et le corps : caractere, sante,
   « chez vous, ca colle ? », la rencontre. La feuille ne coupe plus son
   contenu (`clip`, pas `hidden`) : sinon la carte ne pourrait pas coller. */
.doc.fiche2.v5{max-width:1160px;overflow:clip}
.fiche2.v5{position:relative}
.fiche2.v5 > .close{position:absolute;top:var(--sp-3);right:var(--sp-3);z-index:4;background:var(--ink);
  color:var(--paper);border:0;width:var(--cible);height:var(--cible);border-radius:var(--r-circle);
  font-size:var(--fs-lg);cursor:pointer;box-shadow:var(--sh-1)}
.fiche2.v5 .f-grille{display:grid;grid-template-columns:minmax(0,1fr);
  grid-template-areas:"photo" "coup" "act" "corps"}
.fiche2.v5 .f-photo{grid-area:photo}
.fiche2.v5 .f-coup{grid-area:coup}
.fiche2.v5 .f-act{grid-area:act}
.fiche2.v5 .f-corps{grid-area:corps;min-width:0}

/* le portrait */
.fiche2.v5 .f-hero{height:min(64vh,620px);min-height:360px;overflow:hidden;background:var(--ink)}
.fiche2.v5 .f-hero.sans{background:var(--cream2)}
.fiche2.v5 .f-hero .f-flou{inset:-8%;width:116%;height:116%;object-position:50% 50%;
  filter:var(--flou-photo);opacity:.7}
.fiche2.v5 .f-hero.entiere img:not(.f-flou){object-fit:contain;object-position:50% 50%}
.fiche2.v5 .f-badges{position:absolute;top:var(--sp-3);left:var(--sp-3);right:72px;display:flex;
  flex-wrap:wrap;gap:var(--sp-2);align-items:flex-start}
.fiche2.v5 .f-badges .badge,.fiche2.v5 .f-badges .f-vu{position:static;max-width:100%}
/* Un fond OPAQUE : sur une photo, un fond translucide laisse le contraste
   dependre de l'image (l'audit le mesurait a 2,28). */
.fiche2.v5 .f-badges .f-vu{background:var(--paper);color:var(--greenDk)}
.fiche2.v5 .f-badges .f-vu.vieille{color:var(--goldDk)}
.fiche2.v5 .f-legende{position:absolute;left:0;right:0;bottom:0;padding:var(--sp-7) var(--sp-5) var(--sp-5);
  background:var(--degrade-photo)}
.fiche2.v5 .f-legende h2{margin:0;font-family:var(--ff-titre);font-weight:600;font-size:var(--fs-fiche);
  line-height:1;letter-spacing:-.02em;color:var(--paper);overflow-wrap:anywhere}
.fiche2.v5 .f-legende h2::first-letter{text-transform:uppercase}
.fiche2.v5 .f-legende .point{color:var(--terraLt)}
.fiche2.v5 .f-legende .sous{margin:var(--sp-1) 0 0;font-size:var(--fs-lg);color:var(--surInk2)}
.fiche2.v5 .f-gal{padding:var(--sp-2) var(--sp-4) 0}
/* Mettre de cote : le coeur des cartes, pose sur la photo de la fiche, en
   bas a droite - la legende lui laisse sa place (16/10/2026). Plein quand
   l'animal est mis de cote. */
.fiche2.v5 .f-hero .f-coeur{position:absolute;right:var(--sp-4);bottom:var(--sp-4);z-index:3;
  display:grid;place-items:center;width:52px;height:52px;padding:0;border:0;border-radius:var(--r-circle);
  background:var(--paper);color:var(--ink2);box-shadow:var(--sh-2);cursor:pointer}
.fiche2.v5 .f-hero .f-coeur svg{width:var(--sp-5);height:var(--sp-5);fill:none;stroke:currentColor;stroke-width:2}
.fiche2.v5 .f-hero .f-coeur:hover{color:var(--terraDk)}
.fiche2.v5 .f-hero .f-coeur[aria-pressed="true"]{color:var(--terra)}
.fiche2.v5 .f-hero .f-coeur[aria-pressed="true"] svg{fill:currentColor}
/* Le coeur est pose sur la photo, au-dessus du degrade sombre de la
   legende : l'anneau clair des surfaces encre s'y voit, l'encre non. */
.fiche2.v5 .f-hero .f-coeur:focus-visible{outline:var(--focus-sur);outline-offset:3px;
  box-shadow:var(--sh-2)}
.fiche2.v5 .f-legende{padding-right:84px}

/* en un coup d'oeil */
.fiche2.v5 .f-coup{padding:var(--sp-4) var(--sp-4) 0}
.fiche2.v5 .f-ents{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--sp-2)}
.fiche2.v5 .f-ent{display:flex;flex-direction:column;align-items:center;gap:var(--sp-2);min-width:0;
  padding:var(--sp-3) var(--sp-1);border-radius:var(--r-md);background:var(--goldPale);color:var(--goldDk);
  text-align:center}
.fiche2.v5 .f-ent.oui{background:var(--greenLt);color:var(--greenDk)}
.fiche2.v5 .f-ent.non{background:var(--rougeLt);color:var(--rougeDk)}
.fiche2.v5 .f-ent-p{position:relative;flex:none;display:grid;place-items:center;width:52px;height:52px;
  border-radius:var(--r-circle);background:var(--cream2);color:var(--ink2)}
.fiche2.v5 .f-ent-p img{width:52px;height:52px;border-radius:var(--r-circle);object-fit:cover}
.fiche2.v5 .f-ent-p svg{width:28px;height:28px}
.fiche2.v5 .f-ent-e{position:absolute;right:-4px;bottom:-4px;display:grid;place-items:center;width:24px;height:24px;
  border:2px solid var(--paper);border-radius:var(--r-circle);background:var(--gold);color:var(--ink);
  font-size:var(--fs-xs);font-weight:700}
.fiche2.v5 .f-ent.oui .f-ent-e{background:var(--green);color:var(--paper)}
.fiche2.v5 .f-ent.non .f-ent-e{background:var(--rouge);color:var(--paper)}
.fiche2.v5 .f-ent-t{display:flex;flex-direction:column;min-width:0}
.fiche2.v5 .f-ent-t b{font-size:var(--fs-md);color:var(--ink)}
.fiche2.v5 .f-ent-t span{font-size:var(--fs-sm);overflow-wrap:break-word;hyphens:auto}
.fiche2.v5 .f-pils{display:flex;flex-wrap:wrap;gap:var(--sp-2);margin:var(--sp-3) 0 0;padding:0;list-style:none}
.fiche2.v5 .f-pil{display:inline-flex;align-items:center;gap:var(--sp-1);padding:var(--sp-1) var(--sp-3);
  border-radius:var(--r-pill);background:var(--cream);color:var(--ink2);font-size:var(--fs-sm);font-weight:600}
.fiche2.v5 .f-pil svg{flex:none;width:var(--fs-md);height:var(--fs-md)}
.fiche2.v5 .f-pil.oui{background:var(--greenLt);color:var(--greenDk)}
.fiche2.v5 .f-pil.q{background:var(--goldPale);color:var(--goldDk)}
.fiche2.v5 .f-pil.attn{background:var(--goldLt);color:var(--goldDk)}
.fiche2.v5 .f-pil.calme{background:var(--calmLt);color:var(--calmDk)}
.fiche2.v5 .f-pil.grave{background:var(--calmPlein);color:var(--calmSurPlein)}

/* la carte d'action */
.fiche2.v5 .f-act{margin:var(--sp-5) var(--sp-4) 0;border:var(--tr);border-radius:var(--r-lg);
  background:var(--paper);box-shadow:var(--sh-2);overflow:hidden}
.fiche2.v5 .f-ess{gap:var(--sp-3);padding:var(--sp-4)}
.fiche2.v5 .f-tuiles{grid-template-columns:repeat(2,minmax(0,1fr))}
.fiche2.v5 .f-tuile b{font-family:var(--ff-titre);font-weight:600;font-size:var(--fs-2xl)}
.fiche2.v5 .f-zone{margin:0}
.fiche2.v5 .f-loi{margin:0;padding:var(--sp-3);border:1px solid var(--filet-or);
  border-radius:var(--r-md);background:var(--goldPale)}
.fiche2.v5 .f-loi .lab{display:block;margin:0 0 var(--sp-1)}
.fiche2.v5 .f-loi .f-ue{margin:0;padding:0;background:none;border:0}
.fiche2.v5 .f-loi .f-ue p{font-size:var(--fs-sm)}
.fiche2.v5 .f-cedant{margin:var(--sp-2) 0 0;padding:0;border:0;border-top:1px solid var(--filet-or);
  border-radius:0;background:none}
.fiche2.v5 .f-cedant > summary{display:flex;align-items:center;min-height:var(--cible);cursor:pointer;
  font-size:var(--fs-sm);font-weight:600;color:var(--ink)}
.fiche2.v5 .f-cedant p{padding-bottom:var(--sp-2)}
.fiche2.v5 .f-agir{gap:var(--sp-2)}
.fiche2.v5 .f-agir .candidater,.fiche2.v5 .f-agir .ecrire.principal{min-height:56px;font-size:var(--fs-lg);
  box-shadow:var(--sh-2)}
.fiche2.v5 .f-agir .fc-part{position:relative;display:block}
.fiche2.v5 .f-agir .fc-natif{border:var(--tr-fort);font-size:var(--fs-sm);list-style:none;padding:0 var(--sp-2)}
.fiche2.v5 .f-agir .fc-natif::-webkit-details-marker{display:none}
.fiche2.v5 .f-agir .fc-icones{display:flex;flex-wrap:wrap;gap:var(--sp-1);margin-top:var(--sp-2)}
.fiche2.v5 .f-agir .copier{justify-content:center;border:0;background:none;color:var(--ink2);
  text-decoration:underline;text-underline-offset:3px}
/* ECRIRE DEPUIS PATTE BLANCHE (16/10/2026) : le bouton principal deplie,
   dans la carte, le message pret et les moyens que la structure publie. */
.fiche2.v5 .fc-contact > summary{list-style:none}
.fiche2.v5 .fc-autres-l{align-self:center;min-height:var(--cible);padding:0 var(--sp-2);border:0;background:none;
  color:var(--ink2);font:inherit;font-size:var(--fs-sm);font-weight:600;text-decoration:underline;
  text-underline-offset:3px;cursor:pointer}
.fiche2.v5 .fc-etat-direct{margin:0;font-size:var(--fs-sm);line-height:1.45;color:var(--ink2);text-align:center}
.fiche2.v5 .fc-etat-direct:empty{display:none}
.fiche2.v5 .fc-contact > summary::-webkit-details-marker{display:none}
.fiche2.v5 .fc-contact[open] > summary.principal{border-radius:var(--r-md) var(--r-md) 0 0;box-shadow:none}
.fiche2.v5 .fc-canaux{display:flex;flex-direction:column;gap:var(--sp-2);padding:var(--sp-3);
  border:var(--tr);border-top:0;border-radius:0 0 var(--r-md) var(--r-md);background:var(--paper)}
.fiche2.v5 .fc-contact.second[open] > summary{border-radius:var(--r-md) var(--r-md) 0 0}
.fiche2.v5 .fc-canaux p{margin:0;font-size:var(--fs-sm);color:var(--ink2)}
.fiche2.v5 .fc-canaux .fc-intro{font-size:var(--fs-base);color:var(--ink)}
.fiche2.v5 .fc-msg-l{font-size:var(--fs-sm);font-weight:600;color:var(--ink)}
.fiche2.v5 .fc-msg{width:100%;box-sizing:border-box;padding:var(--sp-2);border:var(--tr-champ);
  border-radius:var(--r-sm);background:var(--paper);color:var(--ink);font:inherit;font-size:var(--fs-base);
  line-height:1.45;resize:vertical}
/* UNE ACTION, PUIS « OU PAR » (16/10/2026) : l'apercu de ce qui part, un
   bouton plein pour le meilleur moyen, les autres en petites puces. */
.fiche2.v5 .fc-apercu{display:flex;flex-direction:column;gap:var(--sp-1);padding:var(--sp-3);
  border-radius:var(--r-md);background:var(--cream)}
.fiche2.v5 .fc-canaux .fc-apercu-t{font-size:var(--fs-sm);font-weight:700;color:var(--ink)}
.fiche2.v5 .fc-apercu-t span{font-weight:600;color:var(--ink3)}
.fiche2.v5 .fc-canaux .fc-extrait{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;
  overflow:hidden;font-style:italic;color:var(--ink2)}
.fiche2.v5 .fc-canal{display:flex;align-items:center;text-decoration:none}
.fiche2.v5 .fc-ic{display:grid;place-items:center;flex:none}
.fiche2.v5 .fc-ic svg{width:var(--fs-lg);height:var(--fs-lg)}
.fiche2.v5 .fc-prim{justify-content:center;gap:var(--sp-2);min-height:52px;padding:0 var(--sp-4);
  border-radius:var(--r-pill);background:var(--terra);color:var(--paper);font-size:var(--fs-md);font-weight:700;
  box-shadow:var(--sh-1)}
.fiche2.v5 .fc-prim:hover{background:var(--terraDk)}
.fiche2.v5 .fc-autres{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-1)}
.fiche2.v5 .fc-ou{margin-right:var(--sp-1);font-size:var(--fs-sm);color:var(--ink3)}
.fiche2.v5 .fc-puce{gap:var(--sp-1);min-height:var(--cible);padding:0 var(--sp-3) 0 var(--sp-1);
  border:var(--tr);border-radius:var(--r-pill);background:var(--paper);color:var(--ink);
  font-size:var(--fs-sm);font-weight:600}
.fiche2.v5 .fc-puce:hover{background:var(--cream2)}
.fiche2.v5 .fc-puce .fc-ic{width:32px;height:32px;border-radius:var(--r-circle);background:var(--cream2)}
.fiche2.v5 .fc-puce .fc-ic svg{width:var(--fs-md);height:var(--fs-md)}
.fiche2.v5 .fc-puce[data-canal="whatsapp"] .fc-ic{background:var(--greenLt);color:var(--greenDk)}
.fiche2.v5 .fc-puce[data-canal="messenger"] .fc-ic{background:var(--calmLt);color:var(--calmDk)}
.fiche2.v5 .fc-puce[data-canal="instagram"] .fc-ic{background:var(--terraLt);color:var(--ink)}
.fiche2.v5 .fc-puce[data-canal="courriel"] .fc-ic{background:var(--terraLt);color:var(--terraDk)}
.fiche2.v5 .fc-recours{display:inline-flex;align-items:center;gap:var(--sp-2);min-height:var(--cible);
  color:var(--ink);font-size:var(--fs-sm);font-weight:700;text-decoration:underline;text-underline-offset:3px}
.fiche2.v5 .fc-recours svg{flex:none;width:var(--fs-md);height:var(--fs-md)}
.fiche2.v5 .fc-msg-pli{border-top:var(--tr);padding-top:var(--sp-1)}
.fiche2.v5 .fc-msg-pli > summary{display:flex;align-items:center;min-height:var(--cible);cursor:pointer;
  font-size:var(--fs-sm);font-weight:600;color:var(--ink2)}
.fiche2.v5 .fc-msg-pli[open]{display:flex;flex-direction:column;gap:var(--sp-2)}
.fiche2.v5 .fc-canaux .copier{display:inline-flex;align-items:center;gap:var(--sp-1);min-height:var(--cible)}
.fiche2.v5 .f-act-pied{display:flex;flex-direction:column;gap:var(--sp-2);padding:var(--sp-3) var(--sp-4);
  border-top:var(--tr);background:var(--cream)}
.fiche2.v5 .f-act-pied .fc-par{display:flex;align-items:center;gap:var(--sp-2);margin:0;font-size:var(--fs-sm);color:var(--ink3)}
.fiche2.v5 .f-act-pied .fc-par span{display:flex;flex-direction:column;min-width:0}
.fiche2.v5 .f-act-pied .fc-par b{color:var(--terraDk);overflow-wrap:anywhere}
.fiche2.v5 .f-act-pied .fc-par small{font-size:var(--fs-sm);color:var(--warm)}
.fiche2.v5 .f-act-pied .fc-logo{flex:none;width:var(--cible);height:var(--cible);border-radius:var(--r-md);
  background:var(--paper);object-fit:contain;padding:var(--sp-1);display:inline-flex;align-items:center;justify-content:center}
.fiche2.v5 .f-act-pied .fc-logo svg{width:60%;height:60%}
.fiche2.v5 .f-act-pied .fc-logo svg ellipse,.fiche2.v5 .f-act-pied .fc-logo svg path{fill:var(--warm)}
.fiche2.v5 .f-act-pied .fc-logo.pb svg{width:72%;height:72%}
.fiche2.v5 .f-act-pied .fc-logo.pb svg ellipse,.fiche2.v5 .f-act-pied .fc-logo.pb svg path{fill:var(--pad)}
.fiche2.v5 .f-act-pied .fc-logo.pb svg .cl{fill:var(--claw)}
.fiche2.v5 .f-act-pied .fc-cond{display:flex;gap:var(--sp-2);align-items:flex-start;margin:0;font-size:var(--fs-sm);color:var(--ink3)}
.fiche2.v5 .f-act-pied .fc-cond svg{flex:none;width:var(--fs-md);height:var(--fs-md)}

/* le corps */
.fiche2.v5 .f-corps{padding:0 var(--sp-4) var(--sp-5)}
.fiche2.v5 .f-h{margin:var(--sp-7) 0 var(--sp-3)}
.fiche2.v5 .f-traits li{background:var(--ink);color:var(--surInk)}
.fiche2.v5 .f-traits.robe li{background:var(--cream2);color:var(--ink)}
.fiche2.v5 .f-cite{position:relative;margin:var(--sp-4) 0 0;padding:var(--sp-5) var(--sp-5) var(--sp-4) var(--sp-6);
  border:0;border-radius:var(--r-lg);background:var(--cream);font-size:var(--fs-xl);line-height:1.4}
.fiche2.v5 .f-cite::before{content:"\201C";position:absolute;left:var(--sp-3);top:var(--sp-1);
  font-size:var(--fs-4xl);line-height:1;color:var(--terraLt)}
.fiche2.v5 .f-cite p{margin:0}
.fiche2.v5 .f-cite p + p{margin-top:var(--sp-2)}
.fiche2.v5 .f-cite footer{margin-top:var(--sp-3);font-family:var(--ff-corps);font-size:var(--fs-sm);color:var(--ink3)}
.fiche2.v5 .f-sante .sante{margin:0;padding:0;border:0;background:none;display:grid;
  grid-template-columns:repeat(auto-fit,minmax(min(100%,260px),1fr));gap:var(--sp-3)}
.fiche2.v5 .f-sante .sante > .lab{display:none}
.fiche2.v5 .f-sante .aff{margin:0}
.fiche2.v5 .f-sante .garde{grid-column:1/-1}
.fiche2.v5 .f-colle{display:grid;grid-template-columns:minmax(0,1fr);gap:var(--sp-4);padding:var(--sp-5);
  border-radius:var(--r-lg);background:var(--ink);color:var(--surInk)}
.fiche2.v5 .f-colle-g{display:flex;align-items:center;gap:var(--sp-3);font-size:var(--fs-sm);color:var(--surInk2)}
.fiche2.v5 .f-anneau{position:relative;flex:none;width:112px;height:112px}
.fiche2.v5 .f-anneau svg{width:100%;height:100%;transform:rotate(-90deg)}
.fiche2.v5 .f-anneau circle{fill:none;stroke-width:10}
.fiche2.v5 .f-anneau .fond{stroke:var(--inkRaye)}
.fiche2.v5 .f-anneau .plein{stroke:var(--terraLt);stroke-linecap:round}
.fiche2.v5 .f-anneau b{position:absolute;inset:0;display:grid;place-items:center;font-family:var(--ff-titre);
  font-weight:600;font-size:var(--fs-3xl);color:var(--paper)}
.fiche2.v5 .f-colle-t{margin:0 0 var(--sp-3);font-family:var(--ff-titre);font-weight:600;font-size:var(--fs-xl);color:var(--paper)}
.fiche2.v5 .f-ct-l{display:grid;gap:var(--sp-2);margin:0;padding:0;list-style:none}
.fiche2.v5 .f-ct{display:flex;flex-direction:row;align-items:flex-start;gap:var(--sp-3);padding:0;background:none;
  color:var(--surInk)}
.fiche2.v5 .f-ct > span:last-child{display:flex;flex-direction:column;min-width:0}
.fiche2.v5 .f-ct b{font-size:var(--fs-base)}
.fiche2.v5 .f-ct span span{font-size:var(--fs-sm);color:var(--surInk2)}
.fiche2.v5 .f-ct-e{flex:none;display:grid;place-items:center;width:22px;height:22px;margin-top:2px;
  border-radius:var(--r-circle);background:var(--gold);color:var(--ink);font-size:var(--fs-xs);font-weight:700}
.fiche2.v5 .f-ct.oui .f-ct-e{background:var(--green);color:var(--paper)}
.fiche2.v5 .f-ct.non .f-ct-e{background:var(--rouge);color:var(--paper)}
.fiche2.v5 .f-colle.vide{background:var(--cream);color:var(--ink);align-items:center}
.fiche2.v5 .f-colle.vide .f-colle-t{color:var(--ink);margin-bottom:var(--sp-1)}
.fiche2.v5 .f-colle.vide p{margin:0;color:var(--ink3)}
.fiche2.v5 .f-colle-p{display:flex}
.fiche2.v5 .f-colle-p img{width:48px;height:48px;margin-right:calc(var(--sp-2) * -1);
  border:2px solid var(--cream);border-radius:var(--r-circle)}
.fiche2.v5 .f-colle-b{justify-self:start;min-height:var(--cible);padding:0 var(--sp-4);border:0;border-radius:var(--r-pill);
  background:var(--ink);color:var(--paper);font:inherit;font-weight:700;cursor:pointer}
.fiche2.v5 .f-duo{margin-top:var(--sp-6)}
.fiche2.v5 .f-meme-r{grid-template-columns:repeat(auto-fill,minmax(min(100%,128px),1fr))}

@media (max-width: 899px){
  .fiche2.v5 .f-cite{padding:var(--sp-4) var(--sp-4) var(--sp-4) var(--sp-6);font-size:var(--fs-lg)}
}
/* au bureau : deux colonnes, la carte collee pendant la lecture */
@media (min-width: 900px){
  .fiche2.v5 .f-grille{grid-template-columns:minmax(0,1fr) minmax(300px,360px);
    grid-template-areas:"photo act" "coup act" "corps act";column-gap:var(--sp-6);
    padding:var(--sp-5) var(--sp-6) 0 var(--sp-5)}
  .fiche2.v5 .f-hero{height:clamp(420px,42vw,560px);border-radius:var(--r-lg)}
  .fiche2.v5 .f-gal{padding:var(--sp-2) 0 0}
  .fiche2.v5 .f-coup{padding:var(--sp-4) 0 0}
  .fiche2.v5 .f-ent{flex-direction:row;padding:var(--sp-3);text-align:left}
  .fiche2.v5 .f-act{position:sticky;top:var(--sp-5);align-self:start;margin:var(--sp-7) 0 var(--sp-5)}
  /* Le panneau « Ecrire » ouvert rend la carte plus haute que l'ecran : une
     carte collee cacherait alors ses boutons d'envoi jusqu'au bas de la
     fiche. Ouverte, elle defile avec la page (16/10/2026). */
  .fiche2.v5 .f-act:has(.fc-contact[open]){position:static}
  .fiche2.v5 .f-corps{padding:0 0 var(--sp-5)}
  .fiche2.v5 .f-colle{grid-template-columns:auto minmax(0,1fr);gap:var(--sp-5)}
  .fiche2.v5 .f-colle-g{flex-direction:column;max-width:132px;text-align:center}
  /* Le bouton passe sous le texte : a 1024 px, trois colonnes laissaient
     72 px a la phrase (audit du 16/10/2026). */
  .fiche2.v5 .f-colle.vide{grid-template-columns:auto minmax(0,1fr)}
  .fiche2.v5 .f-colle.vide .f-colle-b{grid-column:2}
}

.f-plis{display:grid;gap:12px;padding-top:var(--sp-2)}
.pli{background:var(--paper);border:var(--tr);border-radius:var(--r-lg);padding:0 18px}
.pli.accord-pli{background:var(--cream)}
.pli > summary{list-style:none;cursor:pointer;display:flex;align-items:center;gap:12px;flex-wrap:wrap;
  padding:16px 0;font-family:var(--ff-titre);font-weight:600;font-size:var(--fs-xl);min-height:var(--cible)}
.pli > summary::-webkit-details-marker{display:none}
.pli .pil{font-family:var(--ff-corps);font-size:var(--fs-sm);font-weight:600;border-radius:var(--r-pill);
  padding:3px 10px}
.pli .pil.v{color:var(--greenDk);background:var(--greenLt)}
.pli .pil.q{color:var(--goldDk);background:var(--goldLt)}
.pli .dep{margin-left:auto;color:var(--warm);font-size:var(--fs-base);font-family:var(--ff-corps);font-weight:400}
.pli[open] > summary .dep{visibility:hidden}
.pli-c{padding:0 0 18px;display:grid;gap:10px}
.pli-c.dial{background:none;border:0;padding:0 0 18px}
.fiche2 .ech{grid-template-columns:repeat(auto-fit,minmax(min(100%,220px),1fr))}
.fiche2 .ech .lab{display:block;margin-bottom:3px}
.fiche2 .aquest .q{border:1px solid var(--filet-or)}
.pli-c .source,.pli-c .sante{margin-top:0;border:0;padding:0;background:none}
.pli-c.refuge{grid-template-columns:repeat(auto-fit,minmax(min(100%,260px),1fr));gap:14px}
.pli-c.refuge .cs,.pli-c.refuge .cq{background:none;border:0;padding:0}
.pli-c.refuge .cq ol{margin:10px 0 0;padding-left:0;list-style:none;counter-reset:e}
.pli-c.refuge .cq li{counter-increment:e;position:relative;padding-left:24px;margin-bottom:8px;
  font-size:var(--fs-base);color:var(--ink2)}
.pli-c.refuge .cq li::before{content:counter(e) ".";position:absolute;left:0;font-weight:700;color:var(--terra)}
.pli-c.refuge .cq li small{display:block;color:var(--warm);font-size:var(--fs-xs)}
.pli.dial.vide{padding:18px}
.f-pied{margin:6px 0 0;display:flex;gap:14px;flex-wrap:wrap;font-size:var(--fs-sm);color:var(--warm);align-items:center}
.f-pied .sec{color:var(--ink3)}
.f-pied .dispo,.f-pied .signal,.f-pied .relai-retrait{background:none;border:0;padding:0;font:inherit;font-size:var(--fs-sm);
  color:var(--ink3);text-decoration:underline;cursor:pointer;min-height:var(--cible)}
.f-pied .signal{margin-left:auto;color:var(--warm)}
/* La notification d'un contenu illicite (DSA art. 16, lot C du
   19/10/2026) : un lien a part, juste apres « Signaler un probleme », avec
   la meme cible tactile. */
.f-pied .illicite{display:inline-flex;align-items:center;min-height:var(--cible);
  font-size:var(--fs-sm);color:var(--warm);text-decoration:underline}
/* Le retrait d'une annonce relayee (pb/relai.py) : la reponse remplace le
   bouton et prend toute la ligne - c'est une phrase, pas un lien. */
.f-pied .relai-msg{flex-basis:100%;margin:0;color:var(--ink2);line-height:1.5}
.f-pied .relai-msg.err{color:var(--rougeDk)}
.fiche2 .cand-zone,.fiche2 .sig-zone{padding:var(--sp-4) 0 0}

/* ---------- le pied ---------- */
.pied-petit{font-size:var(--fs-sm);color:var(--warm)}

/* ---------- telephone ---------- */
@media (max-width:560px){
  .nav{gap:var(--sp-2)}
  .nav .marque{font-size:var(--fs-lg);gap:var(--sp-2)}
  .nav-lang{display:none}
  /* Le nom du pays quitte l'ecran, pas le bouton : socle.css le masque a
     l'oeil seulement, pour que le bouton dise encore quel pays il porte. */
  .nav-pays{padding:6px 10px}
  .nav-espace{padding:8px 12px}
  .acc{padding:var(--sp-5) var(--sp-4)}
  .acc-f{position:static}
  .sec2 .sub{margin-left:0;text-align:left}
  .barre-res .tri{margin-left:0}
  /* Collante, la barre prenait le tiers d'un ecran de telephone en
     defilant : elle reste en tete de liste, sans suivre. */
  .barre-res{position:static}
  /* Le panneau d'un groupe long se pose sous la barre : il lui faut un
     ancetre place, sans que la barre recolle pour autant. */
  .barre-res:has(.grp-panneau){position:relative}
  .f-score{align-items:flex-start}
  .fiche2 .accord{white-space:normal}
  .f-pied .signal{margin-left:0}
}

/* « Autour de moi » : la porte vers la position, dans le bloc du lieu.
   Discret a cote du champ de commune - c'est un raccourci, pas le chemin
   principal - mais avec une vraie cible tactile : on le touche au doigt,
   sur un telephone, qui est justement l'appareil qui sait ou il est. */
/* IL PREND SA PROPRE LIGNE, ET « grid-column » N'Y SUFFISAIT PAS.
   `.pres-de` est un FLEX, pas une grille : la propriete etait inerte, le
   bouton restait sur la ligne du drapeau et du trajet, et il prenait sa
   place a la commune - qui est le seul element elastique de la rangee.
   Mesure de l'audit du 24/09/2026, a 768 px : « Commune ou code postal »
   demandait 193 px pour 166 utiles, et « Villers-Le-Bouillet (4530) »
   195 px pour 166 visibles. Le defaut fondateur de l'audit, « Code
   pos… », refabrique par un bouton ajoute dans une rangee pleine.

   `flex-basis: 100 %` le pousse donc a la ligne, et `flex-wrap` autorise
   ce passage - sans lui, `nowrap` ecrase tout le monde au lieu de
   reporter. Les autres elements de la rangee ne bougent pas : ils sont
   tous `flex: none` sauf la commune, et ils tenaient deja. */
.ecrans .pres-de { flex-wrap: wrap; }
.ecrans .pres-de .pd-autour { flex: 0 0 100%; align-self: flex-start;
  width: fit-content;
  min-height: var(--cible); padding: var(--sp-2) var(--sp-3);
  border: 1px solid var(--terra); border-radius: var(--r-pill);
  background: transparent; color: var(--terra);
  font-family: var(--ff-mono); font-size: var(--fs-xs);
  letter-spacing: .06em; text-transform: uppercase; cursor: pointer; }
.ecrans .pres-de .pd-autour:hover { background: var(--voile-bouton); }
.ecrans .pres-de .pd-autour[disabled] { opacity: .6; cursor: default; }

/* « PRES DE » SUR L'ACCUEIL, EN DEUX RANGEES (maquette du 24/09/2026, portee
   le 10/10/2026). Le comparatif maquette - site l'a montre : trois rangees
   chez nous - la commune seule, puis drapeau et trajet, puis « Autour de
   moi » en gros bouton pleine largeur - la ou la maquette tient en deux :
   le drapeau et la commune, un filet, le trajet et un lien discret.

   Seule la MISE EN PAGE est reprise. Les elements sont les notres, et leur
   raison d'etre aussi : le drapeau ouvre le menu de pays de la barre - un
   seul endroit choisit le pays, deux portes y menent - la ou la maquette
   ajoutait un second choix de pays dans la case.

   La commune garde toute la largeur que le drapeau lui laisse : c'est
   l'element que les deux corrections precedentes protegeaient (« Code
   pos… », 21/09 ; un bouton qui l'ecrasait, 24/09). Et elle passe a la
   ligne plutot que d'etre rognee (05/10). */
#qf .pres-de{display:grid;grid-template-columns:auto minmax(0,1fr) auto;
  grid-template-areas:"pays champ champ" "trajet trajet autour";
  gap:0;padding:0;align-items:center}
#qf .pres-de::after{content:"";grid-column:1/-1;grid-row:2;align-self:start;
  border-top:var(--tr);pointer-events:none}
#qf .pres-de .pd-pays{grid-area:pays;margin:var(--sp-1) 0 var(--sp-1) var(--sp-2)}
#qf .pres-de .cp-wrap{grid-area:champ;order:0;padding:0 var(--sp-3) 0 var(--sp-2)}
/* Un menu natif ne retrecit pas sous sa plus longue option : dans une
   grille, son `min-width: auto` elargissait la piste, et la page allemande
   debordait de 53 px a 360 (« ohne Begrenzung »). Il se loge dans sa piste. */
#qf .pres-de .pd-trajet{grid-area:trajet;justify-self:start;min-width:0;max-width:100%;
  margin:var(--sp-2) 0 var(--sp-2) var(--sp-3)}
/* `align-self:center` : la regle `.ecrans .pres-de .pd-autour` plus haut
   pose `align-self:flex-start`, que la grille lit « start » - le lien
   montait de 8 px au-dessus de « Trajet max » et de son menu (QA du
   13/10/2026). Il se centre sur la rangee, comme dans la maquette. */
#qf .pres-de .pd-autour{grid-area:autour;justify-self:end;align-self:center;flex:none;width:auto;
  margin:0 var(--sp-1) 0 0;padding:var(--sp-2) var(--sp-3);min-height:var(--cible);
  border:0;border-radius:var(--r-sm);background:none;color:var(--terra);
  font-family:inherit;font-size:var(--fs-sm);font-weight:600;letter-spacing:0;
  text-transform:none;text-decoration:underline;text-underline-offset:var(--sp-1)}
#qf .pres-de .pd-autour:hover{background:var(--cream)}
/* « Trajet max » et son menu en pastille (maquette du 02/10/2026) : le
   libelle dit de quoi parle la duree, le menu perd son habit natif. */
#qf .pres-de .pd-tr{grid-area:trajet;display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-1) var(--sp-2);
  margin:0;padding:var(--sp-2) var(--sp-2) var(--sp-2) var(--sp-4);min-width:0;cursor:pointer}
#qf .pres-de .pd-tr-l{font-size:var(--fs-sm);color:var(--warm);white-space:nowrap}
/* Le menu RETRECIT jusqu'a sa duree la plus longue, puis le libelle passe
   au-dessus (« Max. Fahrzeit » a 360 px). Sa largeur naturelle est celle de
   « sans limite de distance » : il faisait passer « Trajet max » sur sa
   propre ligne meme a 1440 px, la ou la maquette les tient sur une seule
   (comparaison du 12/10/2026). Et une rangee qui peut passer a la ligne y
   passe AVANT de retrecir : c'est la base du menu qui decide, donc elle
   part de zero et grandit jusqu'a sa largeur naturelle. */
#qf .pres-de .pd-tr .pd-trajet{margin:0;flex:1 1 0;min-width:7em;width:auto;max-width:max-content;
  appearance:none;-webkit-appearance:none;border:var(--tr-champ);border-radius:var(--r-pill);
  background:var(--cream) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 8'%3E%3Cpath d='M1 1l5 5 5-5' fill='none' stroke='%23706149' stroke-width='1.6'/%3E%3C/svg%3E") right var(--sp-3) center/10px no-repeat;
  padding:var(--sp-1) var(--sp-6) var(--sp-1) var(--sp-3);font-weight:600;color:var(--ink)}
#qf .pres-de .pd-autour{display:inline-flex;align-items:center;gap:var(--sp-1)}
#qf .pres-de .pd-autour::before{content:"";width:16px;height:16px;flex:none;background:currentColor;
  -webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round'%3E%3Ccircle cx='12' cy='12' r='7'/%3E%3Ccircle cx='12' cy='12' r='2' fill='black'/%3E%3Cpath d='M12 2v3M12 19v3M2 12h3M19 12h3'/%3E%3C/svg%3E") center/contain no-repeat;
  mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round'%3E%3Ccircle cx='12' cy='12' r='7'/%3E%3Ccircle cx='12' cy='12' r='2' fill='black'/%3E%3Cpath d='M12 2v3M12 19v3M2 12h3M19 12h3'/%3E%3C/svg%3E") center/contain no-repeat}
#qf .pres-de .pd-autour[disabled]::before{display:none}
/* Masque quand la commune est sure (17/10/2026) : la regle du dessus pose
   `display:inline-flex`, qui l'emporterait sur l'attribut `hidden`. */
#qf .pres-de .pd-autour[hidden]{display:none}
/* SOUS 330 PX DE FORMULAIRE, LA COMMUNE REPREND TOUTE LA PREMIERE RANGEE.
   Le drapeau a cote d'elle lui laissait 149 px a 360 : « Ville ou code
   postal » en demande 154 - le « Code pos… » du 21/09, refabrique par le
   portage meme qui devait l'eviter, et vu par l'audit dans la minute. Le
   drapeau rejoint le trajet, et le lien passe dessous. */
@container (max-width:330px){
  #qf .pres-de{grid-template-columns:auto minmax(0,1fr);
    grid-template-areas:"champ champ" "pays trajet" "autour autour"}
  #qf .pres-de .cp-wrap{padding:0 var(--sp-3)}
  #qf .pres-de .pd-trajet{margin-left:var(--sp-2)}
  #qf .pres-de .pd-autour{justify-self:start;margin:0 0 var(--sp-1) var(--sp-1)}
}

/* LA LANGUE PROPOSEE PAR LE PAYS, sur la barre publique (24/09/2026).
   Soulignee, jamais imposee : c'est une suggestion, et le choix manuel la
   ferme. Le meme trait que dans les espaces connectes (coquille.css) -
   deux soulignements differents pour une meme idee se liraient comme deux
   choses. */
.nav .menu-langue .seg a.proposee { text-decoration: underline;
  text-underline-offset: 3px; }
/* Un pays plurilingue le DIT. La phrase vit sous le segment des langues,
   dans le ton des autres notes du menu. */
.nav .menu-langue .locale { margin: var(--sp-2) 0 0; color: var(--warm);
  font-size: var(--fs-xs); }

/* OÙ NOUS VOUS SITUONS (chantier 5, 24/09/2026). Un bandeau discret sous
   la barre : il DIT ce qu'on a déduit et laisse corriger. Il ne se montre
   qu'une fois, et il ne réserve pas sa place — sinon la page sauterait au
   chargement, pour un bandeau qui la plupart du temps n'apparaît pas. */
#geoBandeau .geo-bandeau { display: flex; align-items: center; gap: var(--sp-3);
  flex-wrap: wrap; margin: 0 auto var(--sp-3);
  max-width: var(--mesure); padding: var(--sp-3) var(--sp-4);
  background: var(--cream2); border-radius: var(--r-md); }
#geoBandeau .geo-bandeau .geo-drap { flex: none; display: inline-flex; }
#geoBandeau .geo-bandeau p { flex: 1 1 14rem; min-width: 0; margin: 0;
  color: var(--ink); }
#geoBandeau .geo-bandeau .geo-gestes { display: flex; align-items: center;
  gap: var(--sp-3); flex: none; }
/* Les deux gestes se touchent : c'est la seule façon de corriger. */
#geoBandeau .geo-bandeau .geo-gestes > * { min-height: var(--cible);
  display: inline-flex; align-items: center; }

/* LE RÈGLEMENT (UE) 2026/1818, sur la fiche d'un chien ou d'un chat.
   -----------------------------------------------------------------------
   Deux faits, pas un encadré d'alerte : l'identification est une bonne
   nouvelle quand elle est là, et l'avertissement sur l'engagement n'est pas
   un reproche. Le doré le dit ; le rouge mentirait.
   Sous la photo, avant le nom et les gestes, bordé d'un trait clair
   (maquette du 02/10/2026, QA du 13/10/2026) : seul le libellé de tête, en
   gras, porte la couleur. */
.f-ue { display: grid; gap: var(--sp-2); margin: var(--sp-3) 0 0; padding: var(--sp-3);
  background: var(--cream); border: var(--tr-clair); border-radius: var(--r-md); }
.f-ue p { margin: 0; font-size: var(--fs-base); line-height: 1.45; color: var(--ink2); }
.f-ue-id b { color: var(--greenDk); }
.f-ue-id.manque b { color: var(--goldDk); }
/* La source de l'avertissement, sous lui : on dit d'où il vient, sans en
   faire le sujet. */
.f-ue-av small { display: block; margin-top: var(--sp-1);
  font-size: var(--fs-xs); font-weight: 600; color: var(--warm); }
/* Qui cède cet animal et quels sont vos droits (pb/cedant.py) : un
   encadré sous la ligne de vérification, avant les gestes. */
.f-cedant { margin: var(--sp-3) 0 0; padding: var(--sp-3);
  border: var(--tr); border-radius: var(--r-md); background: var(--paper); }
.f-cedant .lab { display: block; margin-bottom: var(--sp-1); }
.f-cedant p { margin: 0; font-size: var(--fs-sm); line-height: 1.55;
  color: var(--ink2); text-wrap: pretty; }
/* Ce que la structure conseille : une liste, pas un pavé. */
.f-soins { margin: var(--sp-2) 0 0; padding-left: var(--sp-4);
  font-size: var(--fs-sm); color: var(--ink2); }
.f-soins li { margin-bottom: var(--sp-1); }
/* Un traitement en cours, sur la vignette. */
.card .zn.soin { color: var(--goldDk); }

/* « A la une » (pb/unes.py, 02/10/2026) : en haut a gauche de la photo, la
   ou le badge d'attente ne va pas - les deux peuvent coexister. Encre sur
   creme : le contraste est celui du texte courant. */
.ph .une,.vig .une,.f-badges .une{position:absolute;left:var(--sp-2);bottom:var(--sp-2);background:var(--ink);
  color:var(--cream);font-size:var(--fs-xs);font-weight:600;letter-spacing:.04em;
  padding:var(--sp-1) var(--sp-2);border-radius:var(--r-pill)}
/* Dans la vitrine, le bas de la photo porte le nom : la une monte en haut a
   droite ; en haut de fiche, elle suit les autres badges (19/10/2026). */
.vig .une{bottom:auto;top:var(--sp-2);left:auto;right:var(--sp-2)}
.f-badges .une{position:static}
.une-note{margin:var(--sp-3) 0 0;font-size:var(--fs-sm)}
/* « Comment les annonces sont classees », sous la pagination (maquette du
   02/10/2026). Un lien seul sur sa ligne est une commande : 44 px au doigt,
   la hauteur de son texte a la souris. */
.res-classement{margin:var(--sp-4) 0 0;text-align:center;font-size:var(--fs-sm)}
.res-classement a{color:var(--ink3)}
@media (pointer:coarse){
  .res-classement a{display:inline-flex;align-items:center;min-height:var(--cible)}
}

/* VINGT-CINQ LANGUES NE TIENNENT PAS DANS UNE PILULE (lot 4, 02/10/2026) :
   la rangee debordait du menu, et le menu de l'ecran, a gauche, a 360 px.
   Une grille de cinq colonnes, des filets d'un pixel faits par l'ecart. */
.nav .menu-pays{max-width:min(92vw,340px)}
.menu-langue .seg{display:grid;grid-template-columns:repeat(5,1fr);width:100%;
  gap:1px;background:var(--cream3);border-radius:var(--r-md)}
.menu-langue .seg a{justify-content:center;padding:0;border:0;margin:0}
/* Sous 640 px, le bouton du pays n'est plus au bord droit (la marque prend
   sa ligne) : ancre sur lui, son menu sortait de l'ecran PAR LA GAUCHE - ce
   que l'audit ne voit pas, il ne mesure que le debordement a droite. Le menu
   s'ancre donc sur la barre entiere, a droite. */
@media (max-width:640px){
  .nav{position:relative}
  .nav .nav-menu[data-menu="pays"]{position:static}
}

/* LA BARRE DES RESULTATS, comme la maquette du 02/10/2026 : « Affiner » est
   une pastille sobre avec son icone, « Reinitialiser » un lien, et le tri
   rejoint le titre des resultats, sans cadre. */
.barre-res .f.affiner{gap:var(--sp-1);padding:var(--sp-1) var(--sp-3);border:1.5px solid var(--cream3);
  color:var(--ink);background:var(--paper);font-weight:600}
.barre-res .f.affiner:hover{border-color:var(--ink);background:var(--paper);color:var(--ink)}
.barre-res .f.raz{border:0;background:none;padding:var(--sp-1);color:var(--warm);
  text-decoration:underline;text-underline-offset:3px}
.barre-res .f.raz:hover{color:var(--ink)}
.tete-res .tri{margin-left:auto;display:inline-flex;align-items:center;gap:var(--sp-1);
  font-size:var(--fs-sm);color:var(--warm)}
.tete-res .tri select{font:inherit;font-size:var(--fs-sm);font-weight:600;color:var(--ink);
  background:transparent;border:0;padding:6px var(--sp-1);cursor:pointer;max-width:240px}
@media (max-width:640px){ .tete-res .tri{margin-left:0} }
/* Liste ou carte (15/10/2026) : deux boutons, celui qui est choisi plein. */
.tete-res .vue-res{display:inline-flex;border:var(--tr);border-radius:var(--r-pill);padding:2px;
  background:var(--paper)}
.tete-res .vue-res button{min-height:var(--cible);padding:0 var(--sp-3);border:0;border-radius:var(--r-pill);
  background:transparent;color:var(--ink2);font:inherit;font-size:var(--fs-sm);font-weight:600;cursor:pointer}
.tete-res .vue-res button[aria-pressed="true"]{background:var(--ink);color:var(--paper)}
/* La carte des resultats : dessinee chez nous, aucune ressource d'un tiers. */
.carte-res{margin:var(--sp-2) 0 var(--sp-5)}
.carte-res svg{display:block;width:100%;height:auto;border-radius:var(--r-lg);border:var(--tr)}
.carte-fond{fill:var(--cream)}
.carte-dep{fill:var(--warm);font-family:var(--ff-mono);font-size:var(--fs-xs)}
.carte-cercle{fill:none;stroke:var(--terra);stroke-width:1.5;stroke-dasharray:5 7}
.carte-cercle.rayon{stroke:var(--green);stroke-dasharray:none}
.carte-cercle-l{fill:var(--terraDk);font-family:var(--ff-mono);font-size:var(--fs-xs);font-weight:600;
  paint-order:stroke;stroke:var(--cream);stroke-width:4}
.carte-pt circle{fill:var(--ink);stroke:var(--paper);stroke-width:2}
.carte-pt text{fill:var(--cream);font-family:var(--ff-corps);font-size:var(--fs-xs);font-weight:700}
.carte-moi circle{fill:var(--terra);stroke:var(--paper);stroke-width:4}
.carte-res .carte-legende{margin:var(--sp-2) 0 0;font-size:var(--fs-sm);color:var(--ink3);max-width:70ch}
.carte-res .note{margin:var(--sp-1) 0 0;font-size:var(--fs-sm);color:var(--ink3)}
.carte-lieux-t{margin:var(--sp-4) 0 0;font-family:var(--ff-titre);font-weight:600;font-size:var(--fs-lg)}
.carte-lieux{margin:var(--sp-2) 0 0;padding-left:var(--sp-4);font-size:var(--fs-base);color:var(--ink2)}
.carte-lieux li{margin:2px 0}
/* Le complement du titre cede la place au tri plutot que de le pousser a la
   ligne suivante (« … · 3 060 arrivent de l'etranger »). */
.tete-res .sub{flex:1 1 16em;min-width:0}
/* Sans cadre, comme la maquette, mais pas sans limite : un menu doit se
   reconnaitre comme un champ (WCAG 1.4.11, 3:1). Un trait dessous suffit,
   au contraste du contour des champs (audit du 11/10/2026). */
.tete-res .tri select{border-bottom:1px solid var(--champ-bord);border-radius:0}
/* Au doigt, les pastilles et le tri reprennent leurs 44 px. Pour les
   pastilles, la regle generale (`button, select` sous pointer:coarse) ne
   suffit pas : leur selecteur, plus precis, poserait la hauteur de souris
   par-dessus. Le tri est nomme avec elles pour que la regle se lise ici. */
@media (pointer:coarse){
  .barre-res .f,.tete-res .tri select{min-height:var(--cible)}
}

/* ==========================================================================
   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)}

/* Ecrans du compte foyer.
   =========================================================================
   Charges APRES tokens.css et app.css : la famille retrouve le site qu'elle
   vient de parcourir, pas l'austerite du portail des structures. Un benevole
   d'association vient faire une tache administrative ; une famille est au
   milieu d'une decision qui l'engage pour quinze ans, et le changement
   brutal de decor a cet endroit-la ferait douter d'etre au bon endroit.

   Aucune valeur brute : tout vient de tokens.css. */

.fy{max-width:var(--mesure);margin:0 auto;padding:var(--sp-6) var(--sp-5)}

.carte-fy{background:var(--paper);border:var(--tr);border-radius:var(--r-lg);
  padding:var(--sp-6);margin-bottom:var(--sp-5)}
.carte-fy :is(h1,h2){font-size:var(--fs-2xl);margin:0 0 var(--sp-3)}
/* Le titre recoit le focus au changement d'etape : sans anneau visible, un
   utilisateur au clavier ne saurait pas ou il vient d'atterrir. Sans
   `outline:none` non plus - c'est la faute classique qui rend un site
   inutilisable au clavier. */
.carte-fy :is(h1,h2):focus-visible{outline:2px solid var(--terra);
  outline-offset:var(--sp-1)}
.carte-fy .chapo{color:var(--ink2);line-height:1.6;margin:0 0 var(--sp-4)}

/* Ce que la structure verra, avant le premier champ. */
.promesse{list-style:none;margin:0 0 var(--sp-5);padding:0}
.promesse li{position:relative;padding-left:var(--sp-5);
  margin-bottom:var(--sp-3);line-height:1.6;color:var(--ink2);
  font-size:var(--fs-base)}
.promesse li::before{content:"";position:absolute;left:0;top:.55em;
  width:var(--sp-2);height:var(--sp-2);border-radius:var(--r-circle);
  background:var(--green)}
.promesse b{color:var(--ink)}

.carte-fy label{display:block;margin-bottom:var(--sp-4);
  font-size:var(--fs-base);color:var(--ink2);font-weight:600}
.carte-fy input[type=email],.carte-fy input[type=password],
.carte-fy input[type=text],.carte-fy input[type=tel],.carte-fy select,
.carte-fy textarea.cp-champ,
.carte-fy input:not([type]){
  display:block;width:100%;margin-top:var(--sp-2);padding:var(--sp-3);
  border:var(--tr-champ);border-radius:var(--r-md);font-family:inherit;
  font-size:var(--fs-champ);font-weight:400;background:var(--paper);
  color:var(--ink);min-height:var(--cible);box-sizing:border-box}
/* « facultatif » est une indication, pas un bouton : app.css definit .opt
   comme la pastille des options de l'accueil, et la feuille du dossier
   heritait de sa bordure et de son fond (vu sur l'etape 3, 02/09/2026). */
.carte-fy .opt{font-weight:400;color:var(--warm);font-size:var(--fs-xs);
  border:0;background:none;padding:0;border-radius:0;display:inline;
  min-height:0;margin-left:var(--sp-1)}
.carte-fy .ind{color:var(--warm);font-size:var(--fs-xs);line-height:1.5;
  margin:calc(-1 * var(--sp-2)) 0 var(--sp-4)}

/* Cases a cocher : la cible tactile est la LIGNE entiere, pas le carre de
   13 px. C'est la meme lecon que dans l'audit du site public. */
.carte-fy .case{display:flex;gap:var(--sp-3);align-items:flex-start;
  font-weight:400;color:var(--ink2);line-height:1.5;
  padding:var(--sp-2) 0;min-height:var(--cible)}
.carte-fy .case input{margin-top:var(--sp-1);flex:none;width:auto;
  min-height:0}
.carte-fy .case .ind{display:block;margin:var(--sp-1) 0 0}

/* La force du mot de passe se dit PENDANT la saisie. Decouvrir au bout du
   formulaire qu'il faut recommencer est la meilleure facon de faire
   abandonner. */
.jauge{display:block;margin-top:var(--sp-2);font-size:var(--fs-xs);
  font-weight:600}
.jauge.court{color:var(--goldDk)}
.jauge.ok{color:var(--greenDk)}

.carte-fy .cmd{display:flex;gap:var(--sp-3);flex-wrap:wrap;
  align-items:center;margin-top:var(--sp-4)}
.carte-fy .btn{display:inline-flex;align-items:center;justify-content:center;
  min-height:var(--cible);padding:var(--sp-3) var(--sp-5);
  background:var(--terra);color:var(--paper);border:0;
  border-radius:var(--r-pill);font-family:inherit;font-size:var(--fs-base);
  font-weight:600;cursor:pointer;text-decoration:none}
.carte-fy .btn:hover{background:var(--terraDk)}
.carte-fy .sec{display:inline-flex;align-items:center;
  min-height:var(--cible);padding:var(--sp-3) var(--sp-5);background:none;
  color:var(--ink2);border:var(--tr);border-radius:var(--r-pill);
  font-family:inherit;font-size:var(--fs-base);cursor:pointer}
.carte-fy .sec:hover{background:var(--cream)}
.carte-fy .lien{background:none;border:0;color:var(--terra);
  font-family:inherit;font-size:var(--fs-base);cursor:pointer;
  text-decoration:underline;padding:var(--sp-2) 0;min-height:var(--cible)}

/* Le retour d'etape. Il double le geste de retour du navigateur plutot que
   de le remplacer : sur ordinateur, personne ne pense a appuyer sur Retour
   au milieu d'un formulaire. */
.carte-fy .retour{background:none;border:0;color:var(--ink3);
  font-family:inherit;font-size:var(--fs-base);cursor:pointer;
  padding:var(--sp-2) 0 var(--sp-3);min-height:var(--cible)}
.carte-fy .retour:hover{color:var(--terra)}

.carte-fy .msg{border-radius:var(--r-md);padding:var(--sp-3) var(--sp-4);
  font-size:var(--fs-base);line-height:1.5;margin:var(--sp-3) 0}
.carte-fy .msg.err{background:var(--rougeLt);color:var(--rougeDk)}
.carte-fy .msg.ok{background:var(--greenLt);color:var(--greenDk)}
.carte-fy .msg.info{background:var(--goldLt);color:var(--goldDk)}

/* Le parcours se fait majoritairement au telephone. A 360 px, les anciennes
   gouttieres + le double rembourrage de carte laissaient moins de 250 px de
   contenu utile : les questions longues et les boutons devenaient penibles
   a lire et a toucher. */
@media (max-width:560px){
  .fy{padding:var(--sp-4) var(--sp-3)}
  .carte-fy{padding:var(--sp-4)}
  .carte-fy .cmd{flex-direction:column;align-items:stretch}
  .carte-fy .cmd > :is(.btn,.sec,.dang){width:100%;box-sizing:border-box}
}

/* Pages legales (pb/front_legal.py), qui reprennent cette feuille.
   ---------------------------------------------------------------------- */
.carte-fy h3{font-size:var(--fs-lg);margin:var(--sp-5) 0 var(--sp-2)}
/* /tarifs (QA design du 13/10/2026). Ses intertitres sont des h2 - la page
   passait de h1 a h3 - et `.carte-fy :is(h1,h2)` leur donne la taille et le
   point terracotta, mais aucune marge haute : un titre colle au paragraphe
   qui le precede ne separe rien. */
.carte-fy.tarifs h2{margin:var(--sp-6) 0 var(--sp-3)}
/* Les paliers du boost. Le tableau DEFILE DANS SA BOITE plutot que de faire
   deborder la page a 360 px - la reponse du 05/09 et du 08/09, ecrite ici
   parce que `.defile` vit dans pro.css, que ces pages ne servent pas. Les
   colonnes ne s'ecartent QUE vers la droite, et la derniere pas du tout :
   quatre colonnes tiennent ainsi dans les 250 px de texte d'une carte a
   360 px (estime le 13/10/2026 : 229 px en francais), la ou un rembourrage
   des deux cotes les faisait defiler. */
.paliers-defile{overflow-x:auto;margin:var(--sp-3) 0 var(--sp-4)}
.paliers{width:100%;border-collapse:collapse;font-size:var(--fs-sm)}
.paliers caption{padding-bottom:var(--sp-2)}
.paliers :is(th,td){text-align:left;vertical-align:top;
  padding:var(--sp-2) var(--sp-2) var(--sp-2) 0;border-bottom:var(--tr)}
.paliers :is(th,td):last-child{padding-right:0}
.paliers thead th{font-weight:600;color:var(--ink2)}
.paliers tbody th{font-weight:400}
.paliers tbody tr:last-child :is(th,td){border-bottom:0}
/* Un champ que la LCEN exige et qui n'est pas encore renseigne s'affiche
   comme tel, en toutes lettres : mieux vaut une page qui avoue un trou
   qu'une page qui invente. Le doré, pas le rouge : c'est un inachevement,
   pas une erreur d'affichage. */
.acompleter{color:var(--goldDk);font-weight:600;font-style:italic}

/* Le dossier, en trois etapes (pb/front_foyer.py).
   ---------------------------------------------------------------------- */
/* « Plus tard », en haut a droite de la premiere etape : la seule qu'on
   atteint sans historique, donc sans Retour possible. */
.carte-fy .fin{float:right;margin-top:calc(-1 * var(--sp-2))}
.carte-fy fieldset{border:0;padding:0;margin:0 0 var(--sp-4);min-width:0}
.carte-fy legend{font-size:var(--fs-base);color:var(--ink2);font-weight:600;
  padding:0;margin-bottom:var(--sp-1)}
/* La liste de communes se positionne par rapport au champ, pas a la carte. */
.carte-fy .cp-wrap{position:relative;display:block}
.carte-fy .cp-wrap .sugg{right:0}
.carte-fy label .etat{display:block;margin-top:var(--sp-2);font-weight:400}
/* Nom et courriel, deja connus : rappeles, pas re-demandes. */
.carte-fy .fixe{display:grid;grid-template-columns:auto 1fr;
  gap:var(--sp-1) var(--sp-4);margin:0 0 var(--sp-4);font-size:var(--fs-base);
  line-height:1.5}
.carte-fy .fixe dt{color:var(--ink3)}
.carte-fy .fixe dd{margin:0;color:var(--ink);overflow-wrap:anywhere}

/* Le recapitulatif du compte : une ligne par rubrique, « Modifier » au bout.
   Une rubrique vide le dit en toutes lettres, en dore - c'est un
   inachevement, pas une erreur. */
.recap{margin:0 0 var(--sp-5)}
.recap .rg{display:grid;grid-template-columns:auto 1fr auto;gap:var(--sp-3);
  align-items:center;padding:var(--sp-2) 0;border-bottom:var(--tr-clair)}
.recap dt{color:var(--ink3);font-size:var(--fs-sm)}
.recap dd{margin:0;color:var(--ink);line-height:1.5;overflow-wrap:anywhere}
.recap dd.act{justify-self:end}
.vide{color:var(--goldDk);font-style:italic}

/* Ce que la structure verra : montre tel quel, pas raconte. */
.vue{list-style:none;margin:0 0 var(--sp-5);padding:var(--sp-4);
  background:var(--cream);border-radius:var(--r-md)}
.vue li{line-height:1.6;color:var(--ink2)}
.vue b{color:var(--ink);margin-right:var(--sp-2)}

/* Un lien DANS un message prend la couleur du message : la terracotta sur
   le fond dore mesurait 4,48 pour 4,5 exiges (audit du 02/09/2026). */
.carte-fy .msg .lien{color:inherit}
/* « Se déconnecter » est un <button>, pas un <a> comme sur le site public :
   sans cette remise a zero il garde le fond gris du navigateur, et la
   terracotta dessus mesurait 4,36 pour 4,5 exiges. */
button.pro-lien{background:transparent;font-family:inherit;cursor:pointer}
/* Dans un groupe de cases, chaque ligne a deja sa hauteur tactile : la marge
   d'un label ordinaire les eloignait d'un ecran entier a quatre options. */
.carte-fy fieldset .case{margin-bottom:0}

/* Supprimer son compte : un bouton secondaire, rouge, en bas de l'ecran du
   compte. Pas cache - la promesse « vous partez quand vous voulez » se tient
   avec un bouton, pas avec une phrase - mais pas en tete non plus. */
.carte-fy .dang{display:inline-flex;align-items:center;min-height:var(--cible);
  padding:var(--sp-3) var(--sp-5);background:none;color:var(--rougeDk);
  border:1px solid var(--rougeBord);border-radius:var(--r-pill);
  font-family:inherit;font-size:var(--fs-base);cursor:pointer}
.carte-fy .dang:hover{background:var(--rougeLt)}
.carte-fy details{margin-top:var(--sp-6);border-top:var(--tr-clair);
  padding-top:var(--sp-4)}
.carte-fy summary{cursor:pointer;color:var(--ink3);font-size:var(--fs-base);
  min-height:var(--cible);display:flex;align-items:center}

/* Les candidatures de la famille : une ligne par animal, l'etat en clair, le
   motif d'un refus tel que la structure l'a choisi. */
.cands{list-style:none;margin:0 0 var(--sp-5);padding:0}
.cands .tete{font-family:var(--ff-mono);font-size:var(--fs-xs);color:var(--ink3);
  text-transform:uppercase;letter-spacing:.04em;padding:var(--sp-2) 0}
.cands .cand{display:grid;grid-template-columns:1fr auto;gap:var(--sp-1) var(--sp-3);
  padding:var(--sp-3) 0;border-bottom:var(--tr-clair);line-height:1.5}
.cands .cand b{color:var(--ink)}
.cands .qui{color:var(--ink3);font-size:var(--fs-sm);margin-left:var(--sp-2)}
.cands .etat-c{grid-column:1;color:var(--ink2);font-size:var(--fs-sm)}
.cands .cand.retenue .etat-c{color:var(--greenDk);font-weight:600}
.cands .cand.refusee .etat-c{color:var(--ink3)}
.cands .lien{grid-column:2;grid-row:1 / span 2;align-self:center}
/* Deux gestes sur une annonce de replacement : la regle ci-dessus est
   ecrite pour UN bouton et les superposait. Ils s'alignent, et s'enroulent
   au telephone. */
.cands .gestes-rep{grid-column:2;grid-row:1 / span 2;align-self:center;
  display:flex;flex-wrap:wrap;gap:var(--sp-3);justify-content:flex-end}
.cands .gestes-rep .lien{grid-column:auto;grid-row:auto}
/* Les formules proposees : une carte par offre, le prix bien lisible, et un
   badge sur celle que le marche souscrit le plus. Cochee, elle prend le
   terracotta comme le reste des reponses du dossier. */
.carte-fy .formules{display:flex;flex-direction:column;gap:var(--sp-2);
  margin-bottom:var(--sp-3)}
.carte-fy .formule{position:relative;display:flex;flex-direction:column;gap:var(--sp-1);
  padding:var(--sp-3) var(--sp-4);border:var(--tr-fort);border-radius:var(--r-md);
  background:var(--paper);cursor:pointer;margin:0}
.carte-fy .formule input{position:absolute;opacity:0;width:0;height:0;margin:0}
.carte-fy .formule:hover{border-color:var(--terra)}
.carte-fy .formule:has(input:checked){border-color:var(--terra);background:var(--cream)}
.carte-fy .formule:has(input:focus-visible){outline:var(--focus);outline-offset:var(--focus-ecart)}
.carte-fy .formule-t{display:flex;align-items:center;gap:var(--sp-2);flex-wrap:wrap}
.carte-fy .formule-n{font-weight:600;color:var(--ink)}
.carte-fy .formule:has(input:checked) .formule-n{color:var(--terra)}
.carte-fy .formule-badge{padding:var(--sp-1) var(--sp-2);border-radius:var(--r-pill);
  background:var(--terra);color:var(--paper);font-family:var(--ff-mono);
  font-size:var(--fs-xs);letter-spacing:.04em}
.carte-fy .formule-p{color:var(--ink);font-size:var(--fs-md);font-weight:600}
.carte-fy .formule-d{color:var(--ink3);font-size:var(--fs-sm);line-height:1.35}
.carte-fy .formule-vide{padding:var(--sp-3) var(--sp-4)}
.carte-fy .formule-vide .formule-n{font-weight:400;color:var(--ink2)}
.carte-fy .formule-avert{margin:0 0 var(--sp-4);color:var(--ink3);font-size:var(--fs-xs)}

/* « Vous accompagner » (etape 3) : un bloc a part, separe d'un filet, avec
   sa legende et sa note - la famille voit que ce n'est pas pour la structure. */
.carte-fy .accomp{border-top:var(--tr);padding-top:var(--sp-4);margin-top:var(--sp-2)}
.carte-fy .accomp > legend{font-size:var(--fs-md);color:var(--ink)}
.carte-fy .accomp > .ind{margin-bottom:var(--sp-4)}
.carte-fy .accomp fieldset legend .aide{display:block;font-weight:400;color:var(--ink3);
  font-size:var(--fs-sm);margin-top:var(--sp-1)}
/* Sous la candidature, sur toute la largeur : la trace de consultation du
   dossier par la structure (pb/acces.py). */
.cands .vue{grid-column:1 / -1;color:var(--ink3);font-size:var(--fs-sm)}
/* Sur l'accueil du dossier, les promesses viennent SOUS le geste : un peu
   d'air entre les deux, et un titre qui peut se casser en deux lignes. */
.carte-fy .cmd + .promesse{margin-top:var(--sp-6)}
.carte-fy :is(h1,h2){text-wrap:balance}

/* L'animal qu'on vient de quitter, en tete du dossier : sa photo, son nom,
   et pour qui l'on remplit. Une photo vaut mieux que toute accroche. */
.retour-animal{display:flex;gap:var(--sp-4);align-items:center;
  background:var(--cream);border-radius:var(--r-lg);padding:var(--sp-4);
  margin-bottom:var(--sp-5)}
.retour-animal img,.retour-animal .sans{flex:none;width:var(--sp-7);
  height:var(--sp-7);border-radius:var(--r-md);object-fit:cover;
  background:var(--cream2)}
.retour-animal > div{display:flex;flex-direction:column;gap:var(--sp-1);
  min-width:0}
.retour-animal .pour{font-family:var(--ff-mono);font-size:var(--fs-xs);
  text-transform:uppercase;letter-spacing:.04em;color:var(--ink3)}
.retour-animal b{font-family:var(--ff-titre);font-size:var(--fs-xl);
  color:var(--ink);line-height:1.1}
.retour-animal .ou{font-size:var(--fs-sm);color:var(--ink2)}
.retour-animal .lien{align-self:flex-start;padding:0;min-height:0;
  font-size:var(--fs-sm)}

/* Chaque titre finit par un point terracotta, pose par la feuille : le
   texte n'en porte pas, sinon il y en aurait deux. Meme geste sur les trois
   faces du produit (porteur du projet, 02/09/2026). */
.carte-fy :is(h1,h2)::after{content:".";color:var(--terra)}

/* Les briques des ecrans (tuiles, pastilles, enfants, animaux presents,
   listes deroulantes) sont dans app.css, sous .ecrans, depuis l'etape B :
   l'accueil les emploie aussi. Ne reste ici que ce qui est propre au
   dossier. */
.carte-fy fieldset,.carte-fy details.plus{scroll-margin-top:var(--sp-5)}
/* « Deja rempli - rien n'a change, continuer » : une ligne pour l'habitue. */
.carte-fy .raccourci{margin:calc(-1 * var(--sp-3)) 0 var(--sp-4);color:var(--ink3);
  font-size:var(--fs-sm)}
.carte-fy .raccourci .lien{padding:0;font-size:var(--fs-sm)}
.carte-fy details.plus{margin:0 0 var(--sp-4);border-top:0;padding-top:0}
.carte-fy details.plus summary{color:var(--terra);font-weight:600}
.carte-fy details.plus[open] summary{margin-bottom:var(--sp-3)}
.carte-fy fieldset legend{margin-bottom:var(--sp-2)}

/* ------------------------------------------------------------------ */
/* Chez moi : une chose a faire, deux resumes, trois animaux.          */
/* ------------------------------------------------------------------ */
/* La priorite est la SEULE chose qui demande un geste : elle porte la
   couleur d'accent, et rien d'autre sur cet ecran ne la porte. Deux
   encadres a egalite auraient fait deux priorites. */
/* « À faire maintenant » : la carte sombre de la maquette du 16/09/2026.
   C'est la seule chose de l'ecran qui demande un geste ; elle se distingue
   par le fond, pas par une bordure de plus. */
.fam-prio{margin:var(--sp-3) 0 var(--sp-5);padding:var(--sp-5);
  border-radius:var(--r-lg);background:var(--ink);color:var(--surInk)}
.fam-prio .lab{color:var(--terraLt);margin:0 0 var(--sp-2)}
.carte-fy .fam-prio h2{margin:0 0 var(--sp-3);font-family:var(--ff-titre);
  font-size:var(--fs-2xl);color:var(--surInk)}
.fam-prio p{margin:0 0 var(--sp-4);color:var(--surInk2);max-width:var(--mesure);
  line-height:1.6}
.carte-fy .fam-prio .sec{background:none;color:var(--surInk);
  border-color:var(--surInk3)}
.carte-fy .fam-prio .sec:hover{background:var(--inkSur)}
.fam-bloc{margin:0 0 var(--sp-5);padding:var(--sp-4);border:var(--tr);
  border-radius:var(--r-md);background:var(--paper)}
.fam-bloc h3{margin:0 0 var(--sp-2);font-size:var(--fs-md);color:var(--ink)}
.fam-bloc p{margin:0 0 var(--sp-3);color:var(--ink2)}
/* Ce que la liste n'est PAS : dit en phrase simple, pas en etiquette. */
.fam-note{margin:var(--sp-2) 0 0;font-size:var(--fs-sm);color:var(--ink3);
  line-height:1.5}
.fam-animaux{display:grid;gap:var(--sp-2);margin:0 0 var(--sp-3);padding:0;
  list-style:none}
/* Les liens partenaires (03/10/2026, pb/affiliation.py). Le lien est une
   cible : il prend la hauteur d'un doigt. La mention vit SOUS chaque lien,
   jamais dans une note commune qu'on ne lit pas. */
.fam-aff{display:grid;gap:var(--sp-3);margin:0 0 var(--sp-3);padding:0;
  list-style:none}
.fam-aff li{display:flex;flex-wrap:wrap;align-items:baseline;
  gap:var(--sp-1) var(--sp-2)}
.fam-aff a{display:inline-flex;align-items:center;min-height:var(--cible);
  color:var(--ink)}
.fam-aff small{color:var(--ink3);font-size:var(--fs-xs)}
.fam-aff span{flex-basis:100%;font-size:var(--fs-sm);color:var(--ink2)}
.fam-aff .aff-mention{flex-basis:100%;font-style:italic}
/* `center` et non `baseline` : la photo est haute, et aligner sa base sur
   celle du nom la faisait dépasser sous la ligne. */
.fam-animaux a{display:flex;flex-wrap:wrap;align-items:center;
  gap:var(--sp-3);min-height:var(--cible);padding:var(--sp-2);
  border-radius:var(--r-sm);color:var(--ink);text-decoration:none}
.fam-animaux a:hover,.fam-animaux a:focus-visible{background:var(--cream2)}
/* La vignette. Carrée et de taille fixe : trois photos de proportions
   différentes alignées feraient trois hauteurs de ligne. Une image qui ne
   charge pas laisse la place, elle ne casse pas la carte. */
.fam-animaux .fam-an-photo{flex:none;width:4.5rem;height:4.5rem;
  border-radius:var(--r-sm);overflow:hidden;background:var(--cream2)}
.fam-animaux .fam-an-photo img{width:100%;height:100%;object-fit:cover;
  display:block}
.fam-animaux .fam-an-photo img.picto{object-fit:contain;padding:var(--sp-1);
  box-sizing:border-box}
.fam-animaux .fam-an-txt{display:flex;flex-direction:column;min-width:0;
  gap:var(--sp-1)}
.fam-animaux .fam-an-str{color:var(--ink3);font-size:var(--fs-xs)}
/* Le temps d'attente a droite, comme la maquette : c'est lui qui dit
   pourquoi cet animal est la. */
.fam-animaux .attente{margin-left:auto;font-family:var(--ff-mono);
  font-size:var(--fs-xs);color:var(--warm);white-space:nowrap}
.fam-animaux strong{font-family:var(--ff-titre);font-size:var(--fs-md)}
.fam-animaux small{color:var(--ink2);font-size:var(--fs-sm)}

/* Ce qui se passe ENSUITE, sous chaque candidature : la seule chose qu'une
   famille vient chercher ici. L'etat dit ou elle en est ; il ne dit pas la
   suite. */
.cands .suite{display:block;margin-top:var(--sp-2);color:var(--ink2);
  font-size:var(--fs-sm)}
.cands .cand.retenue .suite{color:var(--ink)}
/* La charte des delais, en tete : elle decrit ce que le code fait, donc
   elle se lit avant la liste et non en note de bas de page. */
.fam-charte{margin:0 0 var(--sp-4);padding:var(--sp-3);
  border-inline-start:3px solid var(--terra);background:var(--cream2);
  border-radius:var(--r-sm)}
.fam-charte p{margin:0;color:var(--ink2);font-size:var(--fs-sm)}

/* Les six questions d'un retour : une par bloc, ses réponses en ligne. Aucun
   regroupement visuel ne suggère une note globale — il n'y en a pas, et une
   barre unique en aurait dessiné une. */
.ret-q{margin:0 0 var(--sp-3);padding:var(--sp-3) 0 0;border:0;
  border-top:var(--tr-clair)}
.ret-q legend{padding:0;color:var(--ink);font-size:var(--fs-sm);
  font-weight:600}
.ret-n{display:inline-flex;align-items:center;gap:var(--sp-1);
  min-height:var(--cible);margin:var(--sp-2) var(--sp-3) 0 0;
  color:var(--ink2);font-size:var(--fs-sm)}
.fam-bloc h4{margin:var(--sp-4) 0 var(--sp-2);color:var(--ink);
  font-size:var(--fs-sm)}
.fam-bloc .coche,.pres-panneau .coche{display:flex;gap:var(--sp-2);margin:0 0 var(--sp-3);
  align-items:flex-start}
/* Sous un doigt, c'est la LIGNE qu'on touche, pas la case - la sonde de
   `tools/audit.py` le modelise deja. `pro.css` donne cette hauteur a ses
   `.coche` depuis toujours ; celle-ci ne l'avait pas, et les quatre choix
   de visibilite d'un retour mesuraient 41 px a 768 px (18/09/2026). L'ecran
   n'etait jamais dessine par l'audit : la famille d'audit n'avait aucune
   adoption de plus de 21 jours. */
@media (pointer:coarse){
  .fam-bloc .coche,.pres-panneau .coche{min-height:var(--cible);align-items:center}
}
.fam-bloc .coche label{display:block;margin:0;font-weight:400}
.fam-bloc .coche label b{display:block;color:var(--ink);font-size:var(--fs-sm)}
.fam-bloc .coche label small{display:block;margin-top:var(--sp-1);
  color:var(--ink2);font-size:var(--fs-sm)}
/* LES ZONES DE TEXTE DES DEUX ECRANS, UNE SEULE REGLE. Les cartes de
   retour ne sont plus des `.fam-bloc` depuis le 27/09 : recopier ces six
   lignes en aurait fait deux champs qui se ressemblent aujourd'hui et
   divergent demain. On etend le selecteur. */
.fam-bloc textarea,.ret-texte textarea{display:block;width:100%;box-sizing:border-box;
  padding:var(--sp-2);border:var(--tr-champ);border-radius:var(--r-sm);
  background:var(--paper);color:var(--ink);font:inherit;
  font-size:var(--fs-sm);resize:vertical}

/* --- L'espace connecte (maquette du 16/09/2026) ------------------------
   Le panneau et la barre sont ceux des structures (coquille.css). Ici, la
   seule chose propre a la famille : la colonne de travail s'elargit, parce
   qu'un accueil a deux colonnes et une liste ne tient pas dans une mesure
   de lecture. */
body.fam-connecte{background:var(--cream)}
.fam-connecte .fy{max-width:var(--page);margin:0;
  padding:var(--sp-5) var(--sp-6) var(--sp-7)}
.qui .qui-txt{min-width:0}
/* Connecte, les ecrans sont poses sur la creme comme ceux des structures :
   la carte blanche de l'accueil public encadrait un ecran dans un ecran. */
.fam-connecte .carte-fy{background:none;border:0;border-radius:0;padding:0}
.barre .pro-lien.duo{margin-left:auto}
/* Le pied de page vit dans la colonne de travail (comparaison a la maquette
   du 17/09/2026) : il prend la meme marge que les ecrans, sinon son texte
   colle au bord du panneau. */
.fam-connecte .travail > footer{border-top:var(--tr);color:var(--ink3);
  font-size:var(--fs-sm);padding:var(--sp-6) var(--sp-6) var(--sp-7)}
@media (max-width:900px){
  .fam-connecte .fy{padding:var(--sp-4) var(--sp-4) var(--sp-6)}
  .fam-connecte .travail > footer{padding:var(--sp-5) var(--sp-4) var(--sp-6)}
}

/* --- Je confie un animal : les pieces de la cession (pb/cession.py) ------
   Une ligne par piece : son statut, ce qu'elle est, qui la fournit, pourquoi
   et d'ou vient la regle ; a droite, le geste. */
.ces h3{margin:0 0 var(--sp-2)}
.ces-liste{list-style:none;margin:var(--sp-3) 0;padding:0;display:grid;gap:var(--sp-2)}
.ces-p{display:flex;flex-wrap:wrap;gap:var(--sp-3);align-items:center;
  justify-content:space-between;padding:var(--sp-3) 0;border-top:var(--tr)}
.ces-txt{flex:1 1 20rem;min-width:0;display:flex;flex-direction:column;gap:var(--sp-1)}
.ces-txt b{color:var(--ink);font-size:var(--fs-base)}
.ces-txt small{color:var(--ink2);font-size:var(--fs-sm)}
.ces-txt p{margin:0;color:var(--ink3);font-size:var(--fs-sm);line-height:1.5;
  max-width:var(--mesure)}
.ces-src{font-family:var(--ff-mono);font-size:var(--fs-xs);color:var(--warm);
  white-space:nowrap}
.ces-nature{font-family:var(--ff-mono);font-size:var(--fs-xs);letter-spacing:.12em;
  text-transform:uppercase}
.ces-obligatoire{color:var(--terraDk)}
.ces-conseille{color:var(--ink3)}
.ces-a_faire{color:var(--greenDk)}
/* « 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. La pastille est neutre a dessein : la teinte de
   l'obligation ferait porter a un canari une autorisation prefectorale. */
.ces-selon_espece{color:var(--warm)}
.ces-gestes{display:flex;gap:var(--sp-2);align-items:center;flex-wrap:wrap}
.carte-fy .ces-prep{text-decoration:none}
.carte-fy .ces-case{display:inline-flex;align-items:center;gap:var(--sp-2);
  margin:0;min-height:var(--cible);font-size:var(--fs-sm);cursor:pointer}
.ces-case input{width:auto;margin:0}
.ces-p.fait .ces-txt b{color:var(--ink2)}
.ces-compte{margin:0;font-size:var(--fs-sm);color:var(--ink3)}

/* --- Le Coup de Patte de la famille : la presentation du dossier --------
   L'apercu a gauche, le message a droite ; les angles dessous. Au
   telephone, tout s'empile, l'apercu d'abord. */
.pres-duo{display:grid;gap:var(--sp-5);grid-template-columns:repeat(auto-fit,minmax(min(100%,18rem),1fr));
  align-items:start;margin:0 0 var(--sp-5)}
.pres-apercu{margin:0;display:flex;flex-direction:column;gap:var(--sp-2);align-items:flex-start}
.pres-apercu img{width:100%;max-width:27rem;height:auto;border-radius:var(--r-md);
  border:var(--tr);background:var(--paper)}
.pres-apercu figcaption{font-family:var(--ff-mono);font-size:var(--fs-xs);color:var(--warm)}
.carte-fy .pres-apercu .sec{text-decoration:none}
.pres-message h3,.pres-angles h3{margin:0 0 var(--sp-2)}
.carte-fy .pres-message textarea{width:100%;box-sizing:border-box;font:inherit;
  font-size:var(--fs-base);line-height:1.6;color:var(--ink);background:var(--paper);
  border:var(--tr-champ);border-radius:var(--r-md);padding:var(--sp-3);resize:vertical}
.pres-angles ul{list-style:none;margin:0 0 var(--sp-2);padding:0;display:grid;gap:var(--sp-2)}
.pres-angle{width:100%;text-align:left;display:flex;flex-direction:column;gap:var(--sp-1);
  background:var(--paper);border:var(--tr);border-radius:var(--r-md);padding:var(--sp-3) var(--sp-4);
  font:inherit;color:var(--ink);cursor:pointer;min-height:var(--cible)}
.pres-angle b{font-size:var(--fs-base)}
.pres-angle small{font-size:var(--fs-xs);color:var(--warm)}
.pres-angle span{font-size:var(--fs-sm);color:var(--ink2);line-height:1.5}
.pres-angle.on{border-color:var(--terra);box-shadow:inset 3px 0 0 var(--terra)}
/* Le choix de l'espece : des pastilles, comme partout ailleurs dans le
   dossier. Une liste deroulante pour trois valeurs cacherait le choix. */
.pres-espece{margin-top:var(--sp-5)}
.pres-espece h3{margin:0 0 var(--sp-2)}
.pres-choix-esp{display:flex;flex-wrap:wrap;gap:var(--sp-2);
 margin:var(--sp-2) 0}
.pres-esp{font:inherit;font-size:var(--fs-sm);min-height:var(--cible);
 padding:var(--sp-1) var(--sp-3);border:1px solid var(--cream3);
 border-radius:var(--r-pill);background:var(--paper);color:var(--ink);
 cursor:pointer}
.pres-esp:hover,.pres-esp:focus-visible{border-color:var(--terra)}
.pres-esp.on{border-color:var(--terra);background:var(--cream2);
 font-weight:600}
/* LE NOM DE L'ANIMAL ET L'OBJET : deux champs d'une ligne. L'objet est
   en lecture seule - il se copie, il ne se redige pas ici - et il
   garde la meme hauteur de cible que le champ voisin. */
/* LE COUP DE PATTE DE LA FAMILLE, grammaire de l'editeur (17/10/2026).
   La bascule Image | Video : deux boutons colles, celui qui est choisi en
   encre ; chacun garde sa cible de 44 px. */
.pres-panneau .ed-fil-tete{flex-wrap:wrap}
.ed-seg{display:inline-flex;margin-left:auto;border:var(--tr-champ);
  border-radius:var(--r-pill);overflow:hidden}
.ed-seg button{min-height:var(--cible);padding:0 var(--sp-3);border:0;
  background:var(--paper);color:var(--ink);font:inherit;font-size:var(--fs-sm);
  cursor:pointer}
.ed-seg button.on{background:var(--ink);color:var(--paper)}
/* La video a la taille de sa colonne, jamais a celle de son fichier
   (1080 x 1920) ; elle n'apparait qu'une fois prete. */
.pres-video video{display:block;width:100%;max-width:22rem;height:auto;
  border-radius:var(--r-md)}
.pres-video video[hidden]{display:none}
/* TROIS ETAPES, PUIS LE GESTE (17/10/2026). Les decisions portent un
   numero, et ce qui va se passer est dit au-dessus du bouton. Le bloc ne
   colle PAS : colle par le bas, il recouvrait les boutons « Par ou » qu'il
   suit, et il ne remonte jamais avec ce qu'on retouche plus bas. */
.pres-panneau .ed-reglages{counter-reset:pres-etape}
.pres-panneau .pres-etape{counter-increment:pres-etape}
.pres-panneau .pres-etape>.ed-lab:first-child{display:flex;align-items:center;gap:var(--sp-2)}
.pres-panneau .pres-etape>.ed-lab:first-child::before{content:counter(pres-etape);
  display:inline-grid;place-items:center;width:1.7em;height:1.7em;flex:none;
  border-radius:var(--r-circle);background:var(--ink);color:var(--paper);
  letter-spacing:0;font-weight:700}
.pres-action{display:grid;gap:var(--sp-2);padding:var(--sp-3);background:var(--paper);
  border:var(--tr);border-radius:var(--r-md);box-shadow:var(--sh-1)}
/* SES FAVORIS COMME DESTINATAIRES (18/10/2026) : une rangee de pastilles,
   puis le favori vise a la place de l'annuaire. */
.pres-favs{display:grid;gap:var(--sp-1);margin:0 0 var(--sp-3)}
.pres-favs-h{font-size:var(--fs-sm);color:var(--warm)}
.pres-favs .ed-puce small{font-weight:400;color:inherit;opacity:.8}
.pres-favori{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-1) var(--sp-3);
  padding:var(--sp-2) var(--sp-3);border:var(--tr);border-radius:var(--r-md);background:var(--paper)}
.pres-favori span{color:var(--warm);font-size:var(--fs-sm)}
.pres-favori .lien{margin-left:auto;min-height:var(--cible)}
/* UN BOUTON PAR CANAL, ET IL ENVOIE (18/10/2026) : un logo dans sa
   pastille et le nom du canal, comme les moyens d'ecrire au refuge sur la
   fiche d'un animal - memes couleurs par canal. */
.pres-format{display:flex;justify-content:center;margin:0 0 var(--sp-2)}
.pres-envois{display:grid;grid-template-columns:repeat(auto-fill,minmax(10rem,1fr));gap:var(--sp-2)}
/* « Ecrire » puis « faire passer le mot » (18/10/2026) : deux rangees,
   chacune sous son petit titre. */
.pres-envois-h{font-size:var(--fs-sm);color:var(--ink2)}
/* Le message qui part « Sur Patte Blanche », lisible avant l'envoi
   (19/10/2026). */
.pres-msg-pb{margin:var(--sp-2) 0;font-size:var(--fs-sm)}
.pres-msg-pb summary{cursor:pointer;min-height:var(--cible);display:flex;align-items:center}
.pres-msg{white-space:pre-wrap;margin:var(--sp-2) 0 0;padding:var(--sp-2) var(--sp-3);
  border-left:var(--tr-fort);border-left-color:var(--warm);background:var(--paper)}
.pres-envois+.pres-envois-h{margin-top:var(--sp-2)}
.pres-canal{display:flex;align-items:center;gap:var(--sp-2);min-height:var(--cible);
  padding:var(--sp-1) var(--sp-3) var(--sp-1) var(--sp-1);border:var(--tr);border-radius:var(--r-pill);
  background:var(--paper);font:inherit;font-weight:600;color:var(--ink);text-align:left;cursor:pointer}
.pres-canal:hover{border-color:var(--ink)}
.pres-canal-ic{display:grid;place-items:center;flex:none;width:36px;height:36px;
  border-radius:var(--r-circle);background:var(--cream2);color:var(--ink)}
.pres-canal-ic svg{width:var(--fs-md);height:var(--fs-md)}
.pres-canal[data-pres-canal="pb"] .pres-canal-ic{background:var(--ink)}
.pres-canal[data-pres-canal="pb"] .pres-canal-ic svg{width:var(--fs-lg);height:var(--fs-lg)}
.pres-canal[data-pres-canal="pb"] .lm ellipse,.pres-canal[data-pres-canal="pb"] .lm path:not(.cl){fill:var(--paper)}
.pres-canal[data-pres-canal="pb"] .lm .cl{fill:var(--terraLt)}
.pres-canal[data-pres-canal="whatsapp"] .pres-canal-ic{background:var(--greenLt);color:var(--greenDk)}
.pres-canal[data-pres-canal="messenger"] .pres-canal-ic{background:var(--calmLt);color:var(--calmDk)}
/* FAIRE PASSER LE MOT, comme le partage d'une fiche (18/10/2026) : un
   bouton plein largeur, puis une icone ronde par reseau. */
.pres-partage{display:grid;gap:var(--sp-2)}
.pres-partager{display:flex;align-items:center;justify-content:center;gap:var(--sp-2);width:100%;
  min-height:var(--cible);border:var(--tr-fort);border-radius:var(--r-pill);background:var(--paper);
  color:var(--ink);font:inherit;font-size:var(--fs-sm);font-weight:600;cursor:pointer}
.pres-partager svg{width:var(--fs-md);height:var(--fs-md)}
.pres-partager:hover,.pres-r:hover{background:var(--cream2)}
.pres-icones{display:flex;flex-wrap:wrap;gap:var(--sp-1)}
.pres-r{display:inline-flex;align-items:center;justify-content:center;width:var(--cible);height:var(--cible);
  border:var(--tr);border-radius:var(--r-circle);background:var(--paper);color:var(--ink);cursor:pointer;padding:0}
.pres-r svg{width:var(--fs-lg);height:var(--fs-lg)}
.pres-partage-m{margin:0;font-size:var(--fs-sm)}
.pres-partage-m:empty{display:none}
.pres-canal[data-pres-canal="email"] .pres-canal-ic{background:var(--terraLt);color:var(--terraDk)}
.pres-telecharger{justify-self:start;margin-top:var(--sp-1)}
/* « .carte-fy details » pose un trait et 34 px au-dessus de tout repli de
   carte : dans le panneau, la liste de l'annuaire et « Autres gestes »
   flottaient sous un trait vide (vu le 17/10/2026). */
.carte-fy .pres-panneau details{margin-top:0;border-top:0;padding-top:0}
/* ETAPE 1, CE QU'ON MET EN AVANT (18/10/2026) : les angles, puis
   l'espece et le clin d'oeil, chacun sous son petit titre. */
.pres-avant{display:grid;gap:var(--sp-2)}
.pres-avant>.ed-lab:not(:first-child){margin-top:var(--sp-2)}
.pres-panneau .ed-mots summary{display:flex;justify-content:space-between;
  align-items:center;gap:var(--sp-2);min-height:var(--cible);cursor:pointer;
  list-style:none}
.pres-panneau .ed-mots summary::-webkit-details-marker{display:none}
.pres-panneau .ed-mots-c{display:grid;gap:var(--sp-3);padding-top:var(--sp-2)}
.pres-panneau .ed-mots-c textarea{width:100%;box-sizing:border-box;font:inherit;
  font-size:var(--fs-champ);border:var(--tr-champ);border-radius:var(--r-sm);
  padding:var(--sp-2);background:var(--paper);color:var(--ink);resize:vertical}
.pres-animal,.pres-objet{display:block;margin-top:var(--sp-3)}
.pres-animal span,.pres-objet span{display:block;
  font-size:var(--fs-sm);color:var(--ink2);margin-bottom:var(--sp-1)}
.pres-animal input{width:100%;min-height:var(--cible)}
/* L'OBJET SE LIT EN ENTIER. Il etait dans un champ d'une ligne, et a
   360 px la famille lisait « Candidature pour adopter un an » : c'est le
   defaut fondateur de l'audit, dans un champ ecrit la nuit meme. Une
   INDICATION plus large que son champ se raccourcit ; une VALEUR qu'on
   doit copier, non - elle passe a la ligne. */
.pres-objet p{margin:0;padding:var(--sp-2) var(--sp-3);
  font-family:var(--ff-mono);font-size:var(--fs-sm);color:var(--ink);
  background:var(--cream2);border-radius:var(--r-sm);
  overflow-wrap:anywhere}
.pres-objet .cmd{margin-top:var(--sp-1)}
.pres-objet .lien{min-height:var(--cible);padding:0;font-size:var(--fs-sm)}
.pres-usage .pres-choix-esp{margin-top:0}

.pres-clin{margin-top:var(--sp-2)}
/* LE CLIN SE LIT COMME UNE CITATION - c'est un mot de la famille, pas
   une etiquette. Ses deux commandes sont des CIBLES : la regle de la
   maquette leur pose `min-height:0`, ce qui a deja coute 23 px pour 44
   sur le bouton de la mise en garde, ce matin meme. */
.pres-clin-l{display:flex;align-items:baseline;
  justify-content:space-between;gap:var(--sp-3);flex-wrap:wrap}
.pres-clin-q{font-family:var(--ff-mono);font-size:var(--fs-sm);
  color:var(--terraDk);quotes:"\00AB\00A0" "\00A0\00BB";line-height:1.5}
.pres-clin-off{font-size:var(--fs-sm);color:var(--ink3)}
.pres-clin-g{display:flex;gap:var(--sp-3);flex:none;align-items:center}
.pres-clin-g .lien{min-height:var(--cible);padding:0;
  font-size:var(--fs-sm)}
/* ETAPE 4, LA PHOTO DE FAMILLE, ET ON LA VEND (18/10/2026) : un encart
   chaud, la promesse en clair, trois conseils, puis le geste. Une fois la
   photo posee, l'encart le dit et garde « changer » et « retirer ». */
.pres-photo{display:grid;gap:var(--sp-2);padding:var(--sp-3);
  background:var(--cream2);border-radius:var(--r-md)}
.pres-photo.posee{background:var(--paper);border:var(--tr)}
.pres-photo-vente{margin:0;font-size:var(--fs-base);color:var(--ink);line-height:1.5}
.pres-photo-conseils{margin:0;font-size:var(--fs-sm);color:var(--ink2)}
.pres-photo .ed-note-reseau{margin:0}
/* Le champ de fichier est ENVELOPPE dans son etiquette : c'est elle qui
   porte le mot visible, et c'est le meme mot que le nom accessible du
   champ. Un champ de fichier nu s'annonce « bouton, parcourir » et se
   touche mal - la cible vaut ici `--cible` sur la boite ET sur le bouton
   du navigateur, comme dans studio.css : taper a cote du bouton
   n'ouvre rien. */
/* CE QU'UN REFUGE LIRA AVEC PRUDENCE. Deux tons, et l'ecart entre les
   deux est le message : creme quand le dossier dit quelque chose de
   fragile - c'est un fait, pas un reproche - dore quand il MANQUE une
   reponse, parce que la il y a un geste a faire. */
.pres-alerte{margin-top:var(--sp-3);padding:var(--sp-2) var(--sp-3);
  border-radius:var(--r-sm);background:var(--cream2);
  border-left:3px solid var(--warm)}
.pres-alerte.manque{background:var(--goldLt);border-left-color:var(--goldDk)}
.pres-alerte p{margin:0;font-size:var(--fs-sm);line-height:1.5;
  color:var(--ink2)}
.pres-alerte.manque p{color:var(--goldDk)}
/* LE BOUTON EST UNE CIBLE, ET IL DOIT PORTER SA COULEUR. La regle venue
   de la maquette lui posait `min-height:0` : 23 px de haut pour 44 exiges,
   sur quatre largeurs et quatre langues - c'est « Ouvrir » de l'historique
   des kits, le 08/09. Et elle ne disait rien de sa couleur, donc il
   heritait du `--terra` de `.carte-fy .lien` : 4,48 sur le fond dore, pour
   4,5 exiges. L'encre doree tient a 5,63, et c'est la sienne. */
.pres-alerte .lien{min-height:var(--cible);padding:var(--sp-1) 0 0;
  font-size:var(--fs-sm)}
.pres-alerte.manque .lien{color:var(--goldDk)}

.pres-manque{margin-top:var(--sp-5)}
.pres-note{margin:var(--sp-2) 0 0;font-size:var(--fs-sm);color:var(--ink3);line-height:1.5}

/* --- Qui m'attend : les cartes (maquette, 17/09/2026) --------------------
   Quatre colonnes au bureau, une au telephone. L'attente en badge sur la
   photo, le coeur en haut a droite, « Me manifester » en pied de carte. */
.qma-criteres p{margin:0 0 var(--sp-2)}
.qma-criteres .cmd{display:flex;flex-wrap:wrap;gap:var(--sp-3);align-items:center}
.qma-grille{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));
  gap:var(--sp-4);margin:0 0 var(--sp-4)}
.qma-carte{display:flex;flex-direction:column;background:var(--paper);border:var(--tr);
  border-radius:var(--r-lg);overflow:hidden;box-shadow:var(--sh-1);min-width:0}
.qma-photo{position:relative;aspect-ratio:4/3;background:var(--cream2);overflow:hidden}
.qma-photo img{width:100%;height:100%;object-fit:cover;display:block}
.qma-photo img.picto{object-fit:contain;padding:var(--sp-4);box-sizing:border-box}
/* Le coeur en haut a gauche sur toutes les vignettes (16/10/2026) : le badge
   d'attente se pose a sa droite. */
.qma-attente{position:absolute;left:calc(var(--sp-2) + var(--cible) + var(--sp-2));top:var(--sp-2);background:var(--ink);
  color:var(--paper);font-family:var(--ff-mono);font-size:var(--fs-xs);
  letter-spacing:.06em;text-transform:uppercase;border-radius:var(--r-xs);
  padding:var(--sp-1) var(--sp-2)}
.qma-coeur{position:absolute;left:var(--sp-2);top:var(--sp-2);width:var(--cible);
  height:var(--cible);border-radius:var(--r-circle);border:0;background:var(--paper);
  color:var(--terraDk);font-size:var(--fs-lg);cursor:pointer;box-shadow:var(--sh-1)}
.qma-coeur[aria-pressed="true"]{background:var(--terra);color:var(--paper)}
.qma-corps{display:flex;flex-direction:column;gap:var(--sp-1);padding:var(--sp-3) var(--sp-4) var(--sp-4);flex:1}
.qma-corps h3{font-family:var(--ff-titre);font-size:var(--fs-lg);margin:0;color:var(--ink)}
.qma-corps p{margin:0}
.qma-l1{color:var(--ink2);font-size:var(--fs-sm)}
.qma-l2{font-family:var(--ff-mono);font-size:var(--fs-xs);color:var(--ink3)}
.qma-conf{color:var(--warm)}
.qma-ext{font-size:var(--fs-sm);color:var(--ink2);line-height:1.5}
.qma-rep{font-size:var(--fs-sm);color:var(--terraDk)}
/* Plus une seule question a poser : le ton le dit avant la phrase. */
.qma-rep.ok{color:var(--greenDk)}
.qma-str{font-size:var(--fs-xs);color:var(--warm)}
.qma-cand{font-size:var(--fs-sm);color:var(--greenDk)}
/* Le geste en PIED de carte, aligne d'une carte a l'autre quelle que soit
   la longueur du texte au-dessus. */
.carte-fy .qma-corps .qma-gestes{margin-top:auto;display:flex;flex-direction:column;
  align-items:stretch;gap:var(--sp-2)}
.carte-fy .qma-corps .qma-geste{justify-content:center}
.carte-fy .qma-fiche{align-self:center;font-size:var(--fs-sm);min-height:var(--cible);
  display:inline-flex;align-items:center}
.qma-corps .qma-str{margin-bottom:var(--sp-3)}
.qma-suite{display:flex;justify-content:center;margin:0 0 var(--sp-5)}
.qma-elargir{margin:0;padding-left:var(--sp-4)}

/* --- Mon dossier : une seule page (maquette du 17/09/2026) ----------------
   Trois cartes : qui vous cherchez, chez vous en quatre colonnes, le reste
   en une ligne chacun. Les questions sont les briques des ecrans partages
   (.ecrans, app.css) ; ici, seulement leur disposition et leur taille. */
.carte-fy.dos :is(h1,h2)::after{content:none}
.dos-tete{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:flex-end;
  gap:var(--sp-4);margin:0 0 var(--sp-4)}
.dos-titre h1{margin:0}
.dos-trait{display:block;margin:var(--sp-1) 0 var(--sp-2);stroke:var(--terra)}
.dos-titre .chapo{margin:0;color:var(--ink2)}
.dos-prog{display:flex;flex-direction:column;align-items:flex-end;gap:var(--sp-1)}
.dos-jauge-l{display:flex;align-items:center;gap:var(--sp-3);color:var(--ink);font-size:var(--fs-sm)}
.dos-jauge{display:flex;gap:var(--sp-1)}
.dos-jauge span{display:block;width:var(--sp-5);height:var(--sp-1);border-radius:var(--r-pill);
  background:var(--cream3)}
.dos-jauge span.ok{background:var(--terra)}
.dos-maj{font-family:var(--ff-mono);font-size:var(--fs-xs);color:var(--ink3)}

.dos-manque{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-2);
  margin:0 0 var(--sp-4);padding:var(--sp-3) var(--sp-4);border-radius:var(--r-md);
  background:var(--cream2)}
.dos-manque.requis{background:var(--goldPale)}
.dos-manque p{flex:1 1 100%;margin:0;color:var(--ink2);font-size:var(--fs-sm)}
.dos-pastille{min-height:var(--cible);padding:var(--sp-1) var(--sp-3);border:var(--tr-fort);
  border-radius:var(--r-pill);background:transparent;color:var(--ink2);font:inherit;
  font-size:var(--fs-sm);cursor:pointer}
.dos-pastille.requis{background:var(--goldLt);border-color:var(--gold);color:var(--goldDk);
  font-weight:600}
.dos-pastille:hover{border-color:var(--terra)}

.dos-page{margin:0}
.dos-carte{background:var(--paper);border:var(--tr);border-radius:var(--r-lg);
  padding:var(--sp-4) var(--sp-5);margin:0 0 var(--sp-4)}
.dos .dos-n{font-family:var(--ff-mono);font-size:var(--fs-xs);font-weight:400;
  letter-spacing:.1em;text-transform:uppercase;color:var(--ink2);margin:0 0 var(--sp-3)}
.dos-ent{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;
  gap:var(--sp-2) var(--sp-4);margin:0 0 var(--sp-2)}
.dos-ent .dos-n{margin:0}
.dos-ent .lien{min-height:var(--cible);color:var(--terraDk);font-size:var(--fs-sm)}
.dos .dos-famille{margin:calc(-1 * var(--sp-3)) 0 var(--sp-4);padding:0 var(--sp-5)}

/* Les criteres : une rangee de petites questions, pas quatre blocs. */
.dos .dos-criteres{display:flex;flex-wrap:wrap;gap:var(--sp-2) var(--sp-5)}
.dos .dos-criteres fieldset{margin:0}
.dos .ecrans legend{font-size:var(--fs-sm);color:var(--ink2)}
.dos .chips-fy{gap:var(--sp-1);margin-bottom:var(--sp-2)}
.dos .chip-fy{display:inline-flex;align-items:center;padding:var(--sp-1) var(--sp-3);
  font-size:var(--fs-sm);font-weight:400}
/* Le portrait choisi : son anneau ne doit pas mordre sur le nom. */
#zDosCherchez .tuiles{grid-template-columns:repeat(auto-fill,minmax(7rem,1fr))}
/* `.ecrans label` pose display:block, plus precis que `.tuile` : sans ceci
   le nom passait sous l'anneau du portrait choisi. */
#zDosCherchez .tuile{display:flex;gap:var(--sp-3)}
.dos .chip-fy:has(input:checked){background:var(--ink);border-color:var(--ink);color:var(--paper)}
.dos .dos-criteres .dd{min-width:14rem}

/* Chez vous : quatre colonnes, deux sur tablette, une au telephone. */
.dos-cols{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:var(--sp-5)}
.dos-col{min-width:0}
.dos-col-t{margin:0 0 var(--sp-3);font-family:var(--ff-corps);font-size:var(--fs-base);
  font-weight:600;color:var(--ink)}
.dos .dos-col fieldset{margin-bottom:var(--sp-3)}
.dos .dos-col .enfant{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-2);
  margin-bottom:var(--sp-2)}
/* Les animaux deja la : TROIS tuiles avec leur portrait, et « + N autres »
   ouvre les suivantes (20/09/2026). La colonne cachait les portraits parce
   qu'elle « n'en tient pas quatorze » - elle en tient trois, et c'est le
   nombre qu'elle recoit desormais. */
.dos .dos-col .tuiles{display:flex;flex-wrap:wrap;gap:var(--sp-1);margin-bottom:var(--sp-3)}
.dos .dos-col .tuile{display:flex;flex-direction:row;align-items:center;min-height:var(--cible);padding:var(--sp-1) var(--sp-3);
  border:var(--tr-fort);border-radius:var(--r-pill);background:var(--paper)}
.dos .dos-col .tuile:has(input:checked){background:var(--ink);border-color:var(--ink)}
.dos .dos-col .tuile:has(input:checked) .tuile-n{color:var(--paper)}
.dos .dos-col .animal{background:var(--cream);border-radius:var(--r-md);
  padding:var(--sp-3);margin-bottom:var(--sp-2)}
.dos .dos-col .comp{flex-direction:column;align-items:flex-start;gap:var(--sp-1)}
.dos .dos-col .comp-l,.dos .dos-col .a-maladie legend{font-size:var(--fs-sm)}

.dos-vie{align-self:start;border-radius:var(--r-lg);padding:var(--sp-3) var(--sp-4);background:var(--cream)}
.dos-vie.manque{background:var(--goldLt);border:var(--tr-fort);border-color:var(--gold)}
.dos-vie-ent{display:flex;flex-wrap:wrap-reverse;justify-content:space-between;align-items:flex-start;gap:var(--sp-2)}
.dos-vie-ent .dos-col-t{flex:1 1 9rem}
.dos-etiq{flex:none;font-family:var(--ff-mono);font-size:var(--fs-xs);letter-spacing:.08em;
  text-transform:uppercase;color:var(--goldDk);background:var(--paper);
  border-radius:var(--r-xs);padding:var(--sp-1) var(--sp-2)}
.dos-vie.ok .dos-etiq{color:var(--greenDk)}
.dos .dos-vie .ind{margin-top:0;color:var(--ink2)}

/* Le reste : une ligne par sujet, qui s'ouvre sur place. */
.dos-reste{padding:var(--sp-4) 0 0}
.dos-reste .dos-ent{padding:0 var(--sp-5)}
.dos-ligne{border-top:var(--tr)}
.dos-ligne > button{display:flex;align-items:center;gap:var(--sp-4);width:100%;
  min-height:var(--cible);padding:var(--sp-3) var(--sp-5);border:0;background:transparent;
  font:inherit;text-align:left;cursor:pointer}
.dos-ligne > button:hover,.dos-ligne > button[aria-expanded="true"]{background:var(--cream)}
.dos-cle{flex:0 0 14rem;font-family:var(--ff-mono);font-size:var(--fs-xs);letter-spacing:.08em;
  text-transform:uppercase;color:var(--ink2)}
.dos-val{flex:1;min-width:0;color:var(--ink);font-size:var(--fs-sm)}
.dos-val.vide{color:var(--goldDk)}
.dos-chev{color:var(--terraDk);font-weight:600}
.dos-ligne > button[aria-expanded="true"] .dos-chev{transform:rotate(90deg)}
.dos-panneau{padding:var(--sp-3) var(--sp-5) var(--sp-4);background:var(--cream)}
.dos-panneau .lien{min-height:var(--cible);color:var(--terraDk)}

.dos-pied{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-3) var(--sp-4);
  margin:var(--sp-5) 0 var(--sp-3)}
.dos-pied .lien{min-height:var(--cible);color:var(--terraDk)}
.dos-pied .ind{flex:1 1 16rem;color:var(--ink3);font-size:var(--fs-sm)}
.dos-vue{margin:0 0 var(--sp-4);padding:var(--sp-4);border:var(--tr);border-radius:var(--r-md);
  background:var(--paper)}
.dos-jamais{border-top:var(--tr);padding-top:var(--sp-3);color:var(--ink2);font-size:var(--fs-sm)}
.dos-jamais summary{cursor:pointer;min-height:var(--cible);display:flex;align-items:center}
.dos-jamais ul{margin:var(--sp-2) 0 0;padding-left:var(--sp-4)}

@media (max-width:1100px){
  .dos-cols{grid-template-columns:repeat(2,minmax(0,1fr))}
}
@media (max-width:640px){
  .dos-cols{grid-template-columns:minmax(0,1fr)}
  .dos-carte{padding:var(--sp-3) var(--sp-4)}
  .dos-prog{align-items:flex-start}
  .dos-ligne > button{flex-wrap:wrap;gap:var(--sp-1) var(--sp-3);padding:var(--sp-3) var(--sp-4)}
  .dos-cle{flex:1 1 100%}
  .dos-reste .dos-ent,.dos-panneau{padding-left:var(--sp-4);padding-right:var(--sp-4)}
  .dos .dos-famille{padding:0}
}

/* --- Mes candidatures : une carte par candidature (maquette 17/09/2026) --
   L'animal qu'on reconnait, ce qu'on a repondu, la frise des delais reels,
   ce qui s'est passe, et le seul geste qui reste. */
.cands .cd{display:block;padding:var(--sp-4);margin:0 0 var(--sp-4);
  background:var(--paper);border:var(--tr);border-radius:var(--r-lg)}
.cd-tete{display:flex;gap:var(--sp-3);align-items:center}
.cd-photo{width:var(--sp-7);height:var(--sp-7);border-radius:var(--r-md);object-fit:cover;
  background:var(--cream2);flex:none}
.cd-photo.vide{display:block}
.cd-nom{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-2)}
.cd-nom b{font-family:var(--ff-titre);font-size:var(--fs-lg);color:var(--ink)}
.cd-etat{font-size:var(--fs-xs);font-weight:600;border-radius:var(--r-pill);
  padding:var(--sp-1) var(--sp-3);background:var(--greenLt);color:var(--greenDk)}
.cd.refusee .cd-etat,.cd.retiree .cd-etat{background:var(--cream2);color:var(--ink2)}
.cd.retenue .cd-etat{background:var(--terra);color:var(--paper)}
.cd-ligne{margin:var(--sp-1) 0 0;color:var(--ink3);font-size:var(--fs-sm)}
.cd-lab{margin:0 0 var(--sp-2);font-family:var(--ff-mono);font-size:var(--fs-xs);
  letter-spacing:.1em;text-transform:uppercase;color:var(--ink3)}
.cd-echange{background:var(--cream);border-radius:var(--r-md);padding:var(--sp-3);
  margin:0 0 var(--sp-3)}
.cd-echange dl{margin:0;display:grid;gap:var(--sp-1)}
.cd-echange dt{color:var(--ink3);font-size:var(--fs-sm)}
.cd-echange dd{margin:0 0 var(--sp-2);color:var(--ink);font-size:var(--fs-sm)}
.cd-motif{margin:0 0 var(--sp-2);color:var(--ink);font-size:var(--fs-sm)}
.cd-suite{margin:0 0 var(--sp-3);color:var(--ink2);font-size:var(--fs-sm)}
.cd-geste{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-3)}
.cd-geste .ind{flex:1 1 16rem;margin:0;color:var(--ink3);font-size:var(--fs-xs)}

/* LA VISITE, sur la carte d'une candidature retenue (25/09/2026).
   -----------------------------------------------------------------------
   Les créneaux sont des boutons : on en choisit un. Ils s'enroulent, parce
   qu'une date écrite en toutes lettres est longue et qu'un téléphone fait
   360 px. */
.cd-rc { margin-top: var(--sp-3); padding-top: var(--sp-3);
  border-top: 1px solid var(--cream3); }
.cd-rc-pris { font-weight: 600; color: var(--greenDk); margin: var(--sp-1) 0; }
.cd-rc-note { color: var(--ink3); font-size: var(--fs-sm); margin: var(--sp-1) 0; }
.cd-rc-g { display: flex; gap: var(--sp-2); flex-wrap: wrap;
  margin-top: var(--sp-2); }
.cd-rc-g button { min-height: var(--cible); }
.cd-rc-m { color: var(--rougeDk); font-size: var(--fs-sm); margin: var(--sp-2) 0 0; }

/* LE CERTIFICAT D'ENGAGEMENT, sur la carte d'une candidature retenue
   (25/09/2026). Le texte se déplie ; la signature se fait dessous. */
.cd-doc { margin-top: var(--sp-3); padding-top: var(--sp-3);
  border-top: 1px solid var(--cream3); }
.cd-doc-ok { font-weight: 600; color: var(--greenDk); margin: var(--sp-1) 0; }
.cd-doc-err { color: var(--rougeDk); font-size: var(--fs-sm); }
.cd-doc-d > summary { cursor: pointer; color: var(--terra);
  min-height: var(--cible); display: flex; align-items: center; }
/* Le texte du certificat défile dans sa boîte : il est long, et une page
   qui s'allonge de trois écrans fait perdre le bouton de signature. */
.cd-doc-t { max-height: 40vh; overflow: auto; padding: var(--sp-2);
  background: var(--cream); border-radius: var(--r-sm);
  font-size: var(--fs-sm); color: var(--ink2); }
.cd-doc-t dt { font-weight: 600; color: var(--ink); }
.cd-doc-t dd { margin: 0 0 var(--sp-1); }
.cd-doc-t ul { margin: 0 0 var(--sp-2); padding-left: var(--sp-4); }
.doc-st { font-weight: 600; color: var(--ink); margin: var(--sp-2) 0 var(--sp-1); }
.doc-mention { font-style: italic; }
.doc-avert { color: var(--ink3); }
/* Une case se touche, et son libellé entier est cliquable. */
.cd-doc-l { display: flex; gap: var(--sp-2); align-items: center;
  min-height: var(--cible); margin-top: var(--sp-2); flex-wrap: wrap;
  font-size: var(--fs-sm); color: var(--ink2); }
.cd-doc-l input[type="checkbox"] { width: var(--sp-4); height: var(--sp-4);
  flex: 0 0 auto; accent-color: var(--terra); }
.cd-doc-m { color: var(--rougeDk); font-size: var(--fs-sm); margin: var(--sp-2) 0 0; }

/* ===================================================================== */
/* RETOURS D'EXPERIENCE (27/09/2026, maquette du 22/09)                  */
/*                                                                       */
/* LA MAQUETTE DESSINE SES CRANS A 38 px. Elle est composee a 1440 pour  */
/* une souris ; nos cibles font `--cible` (44 px) et l'audit les mesure   */
/* aux quatre largeurs. C'est la meme dette que chaque lot de ce portage  */
/* paie, avec les points d'arret etroits.                                */
/* ===================================================================== */

/* Les pastilles de tete : combien dans chaque etat, et de quoi n'en voir
   qu'un. Grisee, une pastille dit qu'elle existe encore. */
.ret-resume { display: flex; gap: var(--sp-2); flex-wrap: wrap;
  margin: 0 0 var(--sp-4); }
.ret-resume:empty { display: none; }
.ret-chip { 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); background: var(--paper); color: var(--ink2);
  font: inherit; font-size: var(--fs-sm); cursor: pointer; }
.ret-chip b { font-family: var(--ff-titre); font-size: var(--fs-lg);
  line-height: 1; color: var(--ink); }
.ret-chip.on { border-color: var(--ink); background: var(--ink);
  color: var(--paper); }
.ret-chip.on b { color: var(--paper); }
.ret-resume:has(.on) .ret-chip:not(.on) { opacity: .55; }
.ret-chip:focus-visible { outline: var(--focus); outline-offset: 2px; }

.ret-liste { display: grid; gap: var(--sp-4); }
.ret-carte { background: var(--paper); border: var(--tr);
  border-radius: var(--r-lg); overflow: hidden; }
.ret-carte.ret-ouvert { border-color: var(--terraLt); box-shadow: var(--sh-2); }
.ret-carte.ret-attente { background: var(--cream); box-shadow: none; }

/* L'en-tete : la photo, qui, et ou en est le retour. */
.ret-tete { display: flex; align-items: center; gap: var(--sp-4);
  flex-wrap: wrap; padding: var(--sp-3) var(--sp-4);
  border-bottom: var(--tr-clair); }
.ret-attente .ret-tete { border-bottom: 0; }
.ret-photo { width: 64px; height: 64px; border-radius: var(--r-md);
  object-fit: cover; flex: none; background: var(--cream2); }
/* Une photo absente ou qui ne charge pas : une place, jamais un cadre
   casse. Des hachures disent « pas d'image » sans imiter une image. */
.ret-sans-photo { background: repeating-linear-gradient(135deg,
  var(--cream3) 0 6px, var(--cream2) 6px 12px); }
.ret-qui { flex: 1 1 12rem; min-width: 0; }
.ret-qui h3 { margin: 0; font-size: var(--fs-lg); }
.ret-qui p { margin: var(--sp-1) 0 0; font-size: var(--fs-sm);
  color: var(--warm); }
.ret-etat { flex: none; padding: var(--sp-1) var(--sp-3);
  border-radius: var(--r-pill); font-size: var(--fs-sm); font-weight: 600; }
.ret-etat-ouvert { background: var(--terra); color: var(--paper); }
.ret-etat-recu { background: var(--greenLt); color: var(--greenDk); }
.ret-etat-attente { background: var(--goldLt); color: var(--goldDk); }
.ret-compte { font-family: var(--ff-titre); font-size: var(--fs-md);
  color: var(--warm); white-space: nowrap; }
.ret-compte b { font-size: var(--fs-2xl); color: var(--ink);
  font-weight: 600; }

.ret-corps { padding: var(--sp-4); }
.ret-intro { margin: 0 0 var(--sp-4); color: var(--ink2);
  max-width: var(--mesure); }

/* Une question = une ligne : son mot-cle, la question, puis les crans. */
.ret-qs { list-style: none; margin: 0; padding: 0; display: grid; }
.ret-q2 { display: grid; gap: var(--sp-2); padding: var(--sp-4) 0;
  border-top: var(--tr-clair); }
.ret-q2:first-child { border-top: 0; padding-top: 0; }
.ret-qt { display: grid; grid-template-columns: 2.2rem minmax(0, 1fr);
  gap: var(--sp-3); align-items: start; min-width: 0; }
.ret-num { font-family: var(--ff-titre); font-weight: 600;
  font-size: var(--fs-xl); color: var(--terra); line-height: 1.1; }
/* Une question repondue se voit de loin : c'est ce qui dit ou l'on en est
   dans une liste de six lignes qui se ressemblent. */
.ret-q2.rep .ret-num { color: var(--greenDk); }
.ret-qtx { display: flex; flex-direction: column; gap: var(--sp-1);
  min-width: 0; }
.ret-qtx b { font-family: var(--ff-mono); font-size: var(--fs-xs);
  letter-spacing: .14em; text-transform: uppercase; color: var(--warm); }
.ret-qtx span { font-size: var(--fs-base); color: var(--ink);
  line-height: 1.4; }

.ret-ech { display: flex; align-items: center; gap: var(--sp-2);
  flex-wrap: wrap; padding-left: calc(2.2rem + var(--sp-3)); }
.ret-ech-lab { font-size: var(--fs-xs); color: var(--warm);
  white-space: nowrap; }
.ret-crans { display: inline-flex; gap: var(--sp-1); padding: var(--sp-1);
  border-radius: var(--r-pill); background: var(--cream); }
/* LA CIBLE EST LE SPAN, PAS LA CASE : le bouton radio est couche par-dessus
   en opacite nulle. La meme mecanique que les pastilles du depot, et la
   meme raison - poser la taille sur la seule case donnerait une pastille
   juste et une cible de rien du tout. */
.carte-fy .ret-cran, .carte-fy .ret-nc { position: relative;
  display: inline-flex; margin: 0; }
.ret-cran input, .ret-nc input { position: absolute; inset: 0; opacity: 0;
  margin: 0; width: 100%; height: 100%; cursor: pointer; }
.ret-cran span { display: inline-flex; align-items: center;
  justify-content: center; width: var(--cible); height: var(--cible);
  border-radius: var(--r-circle); color: var(--ink2); font-weight: 600;
  font-size: var(--fs-base);
  transition: background var(--t-court) var(--e),
              color var(--t-court) var(--e); }
.ret-cran:hover span { background: var(--paper); color: var(--terraDk); }
.ret-cran input:checked + span { background: var(--terra);
  color: var(--paper); }
.ret-cran input:focus-visible + span,
.ret-nc input:focus-visible + span { outline: var(--focus);
  outline-offset: 2px; }
/* « Non concerne » est a l'ECART des cinq crans, et en pointille : ce
   n'est pas une note basse, c'est l'absence de question. */
.ret-nc span { display: inline-flex; align-items: center;
  min-height: var(--cible); padding: 0 var(--sp-3);
  border-radius: var(--r-pill); border: 1px dashed var(--cream3);
  color: var(--warm); font-size: var(--fs-sm); white-space: nowrap; }
.ret-nc:hover span { border-color: var(--warm); color: var(--ink2); }
.ret-nc input:checked + span { border-style: solid; border-color: var(--ink);
  background: var(--ink); color: var(--paper); }
/* LE MOT DU CRAN. Un « 4 » ne dit rien ; il apparait au choix, et il est
   vide avant - une boite vide qui occupe la place serait un trou. */
.ret-mot { flex-basis: 100%; font-family: var(--ff-titre);
  font-style: italic; font-size: var(--fs-md); color: var(--terraDk); }
.ret-mot:empty { display: none; }

.ret-sans { margin: var(--sp-3) 0 var(--sp-5); padding-top: var(--sp-3);
  border-top: var(--tr-clair); }

/* Les deux textes, et ce que chacun devient. */
.ret-textes { display: grid; gap: var(--sp-4);
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 260px), 1fr)); }
.ret-texte { display: flex; flex-direction: column; gap: var(--sp-2); }
.ret-tl { display: flex; align-items: center; gap: var(--sp-2);
  font-size: var(--fs-sm); font-weight: 600; color: var(--ink); }
.ret-tag { font-style: normal; font-family: var(--ff-mono);
  font-size: var(--fs-xs); letter-spacing: .14em; text-transform: uppercase;
  padding: 0 var(--sp-2); border-radius: var(--r-pill); }
.ret-texte-prive .ret-tag { background: var(--ink); color: var(--paper); }
.ret-texte-public .ret-tag { background: var(--terra); color: var(--paper); }
/* Le compteur se pose SOUS la zone, aligne a droite. A cote, il lui
   passait dessus des que la colonne se resserrait. */
.ret-cpt { align-self: flex-end; font-family: var(--ff-mono);
  font-size: var(--fs-xs); color: var(--warm); }
/* Ces deux-la se LISENT : ce sont des phrases, pas des etiquettes. */
.ret-sans, .ret-pied-note, .ret-reserve { font-size: var(--fs-sm);
  color: var(--warm); line-height: 1.5; }
.ret-cit { margin: 0; padding: var(--sp-3);
  border-left: var(--tr-fort); border-left-color: var(--terraLt);
  background: var(--cream); border-radius: 0 var(--r-md) var(--r-md) 0; }
.ret-vide { color: var(--warm); font-size: var(--fs-sm); }
.ret-texte > p.ret-vide { margin: 0; }

/* La relecture : chaque reponse avec son mot, jamais un total. */
.ret-bilan { list-style: none; margin: 0 0 var(--sp-5); padding: 0;
  display: grid; }
.ret-bilan li { display: flex; align-items: center;
  justify-content: space-between; gap: var(--sp-3); flex-wrap: wrap;
  padding: var(--sp-2) 0; border-top: var(--tr-clair); }
.ret-bilan li:first-child { border-top: 0; }
.ret-bilan-q { font-family: var(--ff-mono); font-size: var(--fs-xs);
  letter-spacing: .14em; text-transform: uppercase; color: var(--warm); }
.ret-pts { display: inline-flex; align-items: center; gap: var(--sp-1); }
.ret-pts i { width: 10px; height: 10px; border-radius: var(--r-circle);
  background: var(--cream3); }
.ret-pts i.on { background: var(--terra); }
.ret-pts b { margin-left: var(--sp-1); font-size: var(--fs-sm);
  color: var(--ink); white-space: nowrap; }

/* Les quatre choix de visibilite, en tuiles. Ils restent : la maquette les
   a retires du formulaire, et son envoi partait avec une liste ecrite en
   dur que notre serveur refuse - un refus que la famille ne pourrait ni
   comprendre ni corriger, l'ecran ne montrant plus les choix. */
.ret-vis { display: grid; gap: var(--sp-2); margin: 0 0 var(--sp-4); }
.ret-tuile { position: relative; }
.ret-tuile label { display: flex; flex-direction: column; gap: var(--sp-1);
  min-height: var(--cible); padding: var(--sp-3); border: var(--tr);
  border-radius: var(--r-md); cursor: pointer; }
.ret-tuile input { position: absolute; inset: 0; width: 100%; height: 100%;
  opacity: 0; margin: 0; cursor: pointer; }
.ret-tuile input:checked + label { border-color: var(--terra);
  background: var(--cream); }
.ret-tuile input:focus-visible + label { outline: var(--focus);
  outline-offset: 2px; }
.ret-tuile label small { color: var(--ink3); font-size: var(--fs-sm); }

.ret-pied { display: flex; align-items: center; gap: var(--sp-4);
  flex-wrap: wrap; margin-top: var(--sp-5); }
.ret-pied-etat { font-family: var(--ff-titre); font-style: italic;
  font-size: var(--fs-md); color: var(--ink3); }
.ret-pied-note { margin: var(--sp-3) 0 0; max-width: var(--mesure); }
.ret-corps .msg:empty { display: none; }
.ret-corps .msg { margin: var(--sp-3) 0 0; }

/* L'ATTENTE : ou l'on en est, et pourquoi. La largeur de la jauge est une
   DONNEE - c'est le seul style calcule de cet ecran. */
.ret-att { flex: 1 1 14rem; min-width: 0; max-width: 22rem; }
.ret-jauge { height: 6px; border-radius: var(--r-pill);
  background: var(--cream3); overflow: hidden; }
.ret-jauge i { display: block; height: 100%; background: var(--gold); }
.ret-jauge-l { display: flex; justify-content: space-between;
  gap: var(--sp-3); margin: var(--sp-1) 0 0; font-size: var(--fs-sm); }
.ret-jauge-l b { color: var(--ink); }
.ret-jauge-l span { color: var(--warm); white-space: nowrap; }
/* `.carte-fy details` pose une marge de --sp-6 et un filet : c'est la
   regle des SEPARATEURS de section, et « pourquoi cette attente ? » n'en
   est pas un - il explique la ligne du dessus. La carte gagnait cinquante
   pixels de vide et un trait qui ne separait rien. `details.plus` a deja
   du la defaire une fois, pour la meme raison. */
.carte-fy .ret-pourquoi { margin: 0; border-top: 0; padding-top: 0; }
.ret-attente .ret-corps { padding: 0 var(--sp-4) var(--sp-3); }
.ret-pourquoi summary { min-height: var(--cible); display: flex;
  align-items: center; font-size: var(--fs-sm); color: var(--ink2);
  cursor: pointer; }
.ret-pourquoi p { margin: 0 0 var(--sp-2); font-size: var(--fs-sm);
  color: var(--ink2); max-width: var(--mesure); }
.ret-reserve { margin: var(--sp-4) 0 0; }

/* AU TELEPHONE. L'echelle perd son retrait - cinq cibles de 44 px, deux
   reperes et « non concerne » ne tiennent pas dans 320 px utiles avec
   cinquante pixels de marge en plus. Mesure a 360. */
@media (max-width: 560px) {
  .ret-ech { padding-left: 0; }
  .ret-tete { gap: var(--sp-3); padding: var(--sp-3); }
  .ret-corps { padding: var(--sp-3); }
  .ret-photo { width: 44px; height: 44px; border-radius: var(--r-sm); }
  .ret-compte { flex: 1 1 100%; }
}

/* ===================================================================== */
/* « À RENCONTRER D'ABORD » (27/09/2026, maquette « site réel »)         */
/*                                                                       */
/* UN BLOC D'ENCRE, ET DES CARTES DE PAPIER DESSUS. Le plateau doit se   */
/* distinguer de la liste qu'il surplombe, sinon il n'est qu'un premier  */
/* rang. La photo y est une VIGNETTE : ce qui sort, c'est le cas, en     */
/* mono capitales, et la phrase qui le dit.                              */
/*                                                                       */
/* JAMAIS LE ROUGE. Il dit « refus » partout ailleurs dans ce produit ;  */
/* l'employer pour attirer l'oeil ici lui ferait dire deux choses.       */
/* ===================================================================== */
.qma-trois { margin: 0 0 var(--sp-6); padding: var(--sp-5);
  border-radius: var(--r-lg); background: var(--ink); color: var(--surInk); }
.qma-trois-tete { display: flex; flex-direction: column; gap: var(--sp-1);
  margin: 0 0 var(--sp-4); }
.qma-trois-tete .lab { color: var(--terraLt); }
.carte-fy .qma-trois-tete h2 { margin: 0; font-family: var(--ff-titre);
  font-weight: 600; font-size: var(--fs-2xl); line-height: 1.05;
  color: var(--surInk); }
.carte-fy .qma-trois-tete h2::after { color: var(--terraLt); }
.qma-trois-tete p { margin: 0; color: var(--surInk2);
  max-width: var(--mesure); line-height: 1.55; }
/* LA PORTE VERS LA SUITE, sur l'encre. Elle reprend EXACTEMENT la variante
   deja ecrite pour `.fam-prio` quatre cents lignes plus haut : memes
   jetons, meme survol. Un second vocabulaire pour un bouton sur fond
   sombre aurait diverge au premier reglage - et `--terra` ne tient pas sur
   l'encre (2,3 de contraste), ce qui est ecrit depuis les kits du 07/09.
   La cible tactile vient de `.carte-fy .sec`, qui porte deja `--cible`. */
.qma-trois-suite { margin: var(--sp-4) 0 0; }
.carte-fy .qma-trois-suite .sec { background: none; color: var(--surInk);
  border-color: var(--surInk3); }
.carte-fy .qma-trois-suite .sec:hover { background: var(--inkSur); }
.carte-fy .qma-reste-h { margin: 0 0 var(--sp-4);
  font-family: var(--ff-titre); font-weight: 600; font-size: var(--fs-xl);
  line-height: 1.1; color: var(--ink); }

/* Jusqu'à sept cartes : les rangs se remplissent de gauche à droite. */
.qma-trois-grille { display: grid; gap: var(--sp-3);
  grid-template-columns: repeat(auto-fill, minmax(min(100%, 236px), 1fr)); }
.qma-trois-grille:has(.qma-mise:nth-child(2):last-child),
.qma-trois-grille:has(.qma-mise:nth-child(3):last-child) {
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 236px), 1fr)); }
/* Trois cartes sur deux rangs laisseraient la dernière seule et étroite :
   elle prend toute la largeur, jusqu'à ce qu'il y ait la place pour trois. */
.qma-trois-grille .qma-mise:nth-child(3):last-child { grid-column: 1 / -1; }
@media (min-width: 1000px) {
  .qma-trois-grille .qma-mise:nth-child(3):last-child { grid-column: auto; }
}

.qma-mise { position: relative; display: flex; flex-direction: column;
  gap: var(--sp-3); min-width: 0; padding: var(--sp-4);
  background: var(--paper); color: var(--ink); border-radius: var(--r-md); }
/* Le rembourrage à droite laisse la place au coeur, qui est posé dessus. */
.qma-cas { display: flex; align-items: baseline; gap: var(--sp-2); margin: 0;
  padding-right: calc(var(--cible) + var(--sp-2));
  font-family: var(--ff-mono); font-size: var(--fs-xs); letter-spacing: .14em;
  text-transform: uppercase; color: var(--terraDk); font-weight: 500;
  line-height: 1.4; }
.qma-cas .qma-num { color: var(--ink3); letter-spacing: .08em; }
.qma-mise .qma-coeur { left: auto; right: var(--sp-3); top: var(--sp-3); }
.qma-id { display: flex; gap: var(--sp-3); align-items: center; }
.qma-thumb { flex: none; position: relative; width: 72px; height: 72px;
  border-radius: var(--r-md); overflow: hidden; background: var(--cream2); }
.qma-thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
/* Un portrait d'espèce se CONTIENT : le recadrer comme une photo lui
   couperait les oreilles. */
.qma-thumb img.picto { object-fit: contain; padding: var(--sp-2);
  box-sizing: border-box; }
.qma-id-t { min-width: 0; display: flex; flex-direction: column; }
.qma-id-t h3 { margin: 0; font-family: var(--ff-titre);
  font-size: var(--fs-xl); line-height: 1.05; color: var(--ink); }
.qma-id-t p { margin: 0; font-size: var(--fs-sm); color: var(--ink2); }
.qma-id-t .qma-l2 { font-family: var(--ff-mono); font-size: var(--fs-xs);
  color: var(--ink3); }
.qma-raison { margin: 0; color: var(--ink); line-height: 1.5; }
.qma-faits { display: flex; flex-wrap: wrap; gap: var(--sp-2); margin: 0;
  padding: 0; list-style: none; }
.qma-faits li { font-family: var(--ff-mono); font-size: var(--fs-xs);
  letter-spacing: .05em; text-transform: uppercase; line-height: 1.3;
  padding: var(--sp-1) var(--sp-2); border-radius: var(--r-xs);
  background: var(--cream2); color: var(--ink2); }
.qma-faits li.attente { background: var(--ink); color: var(--paper); }
.qma-faits li.ok { background: var(--greenLt); color: var(--greenDk); }
.qma-mise .qma-str, .qma-mise .qma-cand { margin: 0; }
/* Le geste se colle au bas : sept cartes de hauteurs différentes
   aligneraient sinon sept boutons à sept hauteurs. */
.qma-mise .qma-gestes { margin-top: auto; display: flex; flex-direction: column;
  gap: var(--sp-2); }
.qma-mise .qma-fiche { align-self: center; font-size: var(--fs-sm);
  min-height: var(--cible); display: inline-flex; align-items: center; }
/* En petit, sur l'accueil, le bouton suffit : le lien doublerait le geste
   dans une carte qui n'a pas la place (maquette du 02/10/2026). */
.qma-trois.qma-petit .qma-fiche { display: none; }

/* L'ACCUEIL LE MONTRE EN PETIT. C'est le même bloc : trois cartes, la
   même grille, moins de place. En écrire un second aurait fait deux
   plateaux qui finiraient par ne pas dire la même chose. */
.qma-trois.qma-petit { padding: var(--sp-4); margin: 0 0 var(--sp-4); }
.qma-trois.qma-petit .qma-trois-tete { margin: 0 0 var(--sp-3); }
.qma-trois.qma-petit .qma-trois-tete p { font-size: var(--fs-sm); }
.qma-trois.qma-petit .qma-trois-grille,
.qma-trois.qma-petit .qma-trois-grille:has(.qma-mise:nth-child(2):last-child),
.qma-trois.qma-petit .qma-trois-grille:has(.qma-mise:nth-child(3):last-child) {
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 172px), 1fr));
  gap: var(--sp-2); }
.qma-trois.qma-petit .qma-mise { padding: var(--sp-3); gap: var(--sp-2); }
.qma-trois.qma-petit .qma-mise:nth-child(3):last-child { grid-column: auto; }
.qma-trois.qma-petit .qma-thumb { width: 56px; height: 56px;
  border-radius: var(--r-sm); }
.qma-trois.qma-petit .qma-id-t h3 { font-size: var(--fs-lg); }
.qma-trois.qma-petit .qma-raison { font-size: var(--fs-sm); line-height: 1.45; }
.qma-trois.qma-petit .qma-str { display: none; }
.qma-trois.qma-petit .qma-geste { padding-left: var(--sp-3);
  padding-right: var(--sp-3); font-size: var(--fs-sm); text-align: center;
  line-height: 1.25; }

/* SANS SESSION, la page Famille se tient dans la colonne du site
   (comparaison a la maquette du 11/10/2026) : la barre et le pied partaient
   des bords de la fenetre quand l'accueil et les pages legales les posent
   dans `.wrap`. Connectee, la coquille prend la main et ces regles se taisent. */
body:not(.fam-connecte) > .nav,
body:not(.fam-connecte) #espace footer{max-width:var(--page);margin-left:auto;margin-right:auto;
  padding-left:var(--sp-5);padding-right:var(--sp-5);box-sizing:border-box}
body:not(.fam-connecte) #espace footer{border-top:var(--tr)}

/* QUI M'ATTEND, ISO MAQUETTE (12/10/2026). Le badge d'attente, le cas d'une
   rencontre et ses faits se lisaient en capitales a chasse fixe : le badge
   etait coupe (« 1 AN ET 10 MOIS D'ATTEN… ») et le cas se dechiffrait. La
   maquette les ecrit en texte ; le badge laisse la place du coeur et passe
   a la ligne plutot que de se couper. Trois colonnes, comme elle. */
.qma-attente { font-family: var(--ff-corps); text-transform: none;
  letter-spacing: 0; font-weight: 600; white-space: normal;
  max-width: calc(100% - var(--cible) - var(--sp-5)); line-height: 1.3; }
.qma-cas { font-family: var(--ff-corps); text-transform: none;
  letter-spacing: 0; font-size: var(--fs-xs); font-weight: 600; }
.qma-cas .qma-num { font-family: var(--ff-mono); letter-spacing: 0; font-weight: 400; }
.qma-faits li { font-family: var(--ff-corps); text-transform: none;
  letter-spacing: 0; font-weight: 600; }
.qma-grille { grid-template-columns: repeat(auto-fill, minmax(min(100%, 280px), 1fr)); }
.qma-trois-grille { grid-template-columns: repeat(auto-fill, minmax(min(100%, 280px), 1fr)); }

/* « Mes annonces » (12/10/2026, maquette du 21/09) : une carte, le geste
   « Confier un animal » dans son en-tete. */
.rep-carte { background: var(--paper); border: var(--tr); border-radius: var(--r-lg);
  box-shadow: var(--sh-1); padding: var(--sp-4); margin: var(--sp-3) 0 var(--sp-4); }
.rep-tete { display: flex; flex-wrap: wrap; align-items: center;
  justify-content: space-between; gap: var(--sp-2) var(--sp-3); margin: 0 0 var(--sp-2); }
.carte-fy .rep-tete h2 { margin: 0; }
.rep-carte .ind { margin: var(--sp-2) 0 0; }

/* LE TABLEAU DES MENTIONS LEGALES (12/10/2026). Il portait la classe
   .cert-t, stylee dans pro.css - que les pages legales ne servent pas : il
   s'affichait sans style, intitules centres, et l'adresse de contact ne se
   coupait pas, ce qui elargissait la page de 13 px a 390. Sa classe, ses
   regles, dans la feuille que ces pages servent vraiment. */
.ml-t{width:100%;border-collapse:collapse;margin-top:var(--sp-2);font-size:var(--fs-sm)}
.ml-t th{text-align:left;font-weight:600;color:var(--ink2);white-space:normal;
  padding:var(--sp-2) var(--sp-3) var(--sp-2) 0;vertical-align:top;width:12em}
.ml-t td{padding:var(--sp-2) 0;vertical-align:top;overflow-wrap:anywhere}
@media (max-width:560px){ .ml-t th{width:7.5em} }
/* Ce que le site enregistre sur l'appareil (« Vos donnees », 15/10/2026) :
   trois colonnes au bureau ; sous 560 px chaque ligne s'empile, le nom
   d'abord - trois colonnes a 360 px couperaient chaque mot. */
.vd-t{width:100%;border-collapse:collapse;margin-top:var(--sp-2);font-size:var(--fs-sm)}
.vd-t th,.vd-t td{text-align:left;vertical-align:top;padding:var(--sp-2) var(--sp-3) var(--sp-2) 0;
  border-bottom:var(--tr)}
.vd-t th{font-weight:600;color:var(--ink2)}
.vd-t td:last-child{color:var(--ink3)}
.vd-t code{overflow-wrap:anywhere}
@media (max-width:560px){
  .vd-t thead{display:none}
  .vd-t tr{display:block;padding:var(--sp-2) 0;border-bottom:var(--tr)}
  .vd-t td{display:block;border:0;padding:var(--sp-1) 0}
}
/* UNE ADRESSE DE COURRIEL NE SE COUPE PAS TOUTE SEULE (12/10/2026). Les
   pages legales citent l'adresse de contact dans leurs paragraphes : a
   360 px, « claire.vandesype@patteblanche.io » depassait sa colonne de 6 a
   15 px. Elle passe a la ligne la ou il le faut, et seulement la. */
.carte-fy p{overflow-wrap:break-word}

/* Le contact de la structure sur la carte d'une candidature RETENUE
   (12/10/2026) : un encart calme, deux liens. */
.cd-contact{margin:var(--sp-3) 0;padding:var(--sp-3);border-radius:var(--r-md);background:var(--cream)}
.cd-contact h3{margin:0 0 var(--sp-1);font-size:var(--fs-base)}
.cd-contact p{margin:0 0 var(--sp-1)}
.cd-contact p:last-child{margin-bottom:0}
/* Deux liens qui passent a la ligne l'un sous l'autre plutot que de
   deborder : sous pointeur grossier chacun est une boite de 44 px, et
   une boite ne se coupe pas au milieu de son texte (audit du 14/10/2026,
   273 px pour 270). */
.cd-contact-l{display:flex;flex-wrap:wrap;align-items:center;
  column-gap:var(--sp-2);overflow-wrap:anywhere}
.cd-contact-l a{min-width:0;max-width:100%}
/* Le texte d'un lien devenu boite flexible (pointeur grossier) ne
   retrecit pas sous sa largeur minimale : une adresse sans espace
   debordait encore de 3 px. Le `span` est un element flexible qui, lui,
   peut retrecir - et l'adresse se coupe. */
.cd-contact-l a>span{min-width:0;overflow-wrap:anywhere}

/* --- Les cartes de candidature (maquette du 02/10/2026, portees le 12/10) --
   La tete mene a la fiche ; quatre points relies et le prochain pas en
   clair ; « Le detail » replie la frise datee et l'echange. Les places
   libres sont des cartes, les groupes des en-tetes de liste. La maquette
   rangeait ces regles dans parlez.css, qui est aussi servie a l'accueil
   public : elles vivent ici, dans la feuille de la famille, la seule qui
   dessine une candidature. */
.cd-photo-lien{display:inline-flex;flex:none;border-radius:var(--r-md)}
.cd-photo-lien:hover .cd-photo{outline:var(--anneau);outline-offset:2px}
.cd-nom-lien{color:inherit;text-decoration:none}
.cd-nom-lien:hover b{color:var(--terra);text-decoration:underline}
.cd-voir{margin-left:auto;font-size:var(--fs-sm);font-weight:600;color:var(--terra);
  text-decoration:none;white-space:nowrap}
.cd-voir:hover{text-decoration:underline}
/* CE QU'ON TOUCHE SUR UNE CARTE (audit du 12/10/2026, a 360 et 768 px) : le
   nom de l'animal, « Voir sa fiche » et le courriel de la structure sont les
   COMMANDES de la carte, pas des mots soulignes au milieu d'un paragraphe -
   la regle generale d'app.css exclut la prose, a raison, et ne les voyait
   donc pas : 26, 22 et 19 px pour 44. */
@media (pointer:coarse){
  .cd-nom-lien,.cd-voir,.cd-contact a{min-height:var(--cible);display:inline-flex;align-items:center}
}
.cd-mini{display:flex;flex-direction:column;gap:var(--sp-2);margin:var(--sp-3) 0}
.cd-points{list-style:none;margin:0;padding:0;display:flex;align-items:center}
.cd-points li{position:relative;width:12px;height:12px;border-radius:var(--r-circle);
  border:2px solid var(--cream3);background:var(--paper);flex:none}
.cd-points li + li{margin-left:22px}
.cd-points li + li::before{content:"";position:absolute;right:100%;top:50%;width:22px;
  height:2px;margin-top:-1px;background:var(--cream3)}
.cd-points li.fait{background:var(--green);border-color:var(--green)}
.cd-points li.fait + li::before{background:var(--green)}
.cd-points li.attente{border-color:var(--gold);border-style:dashed}
.cd-points li.prevu{border-style:dashed}
.cd-mini-t{font-size:var(--fs-sm);font-weight:600;color:var(--ink2)}
.cd-etapes{list-style:none;margin:var(--sp-2) 0 var(--sp-3);padding:0;display:grid}
.cd-etapes li{display:grid;grid-template-columns:18px minmax(0,1fr) auto;gap:var(--sp-3);
  align-items:center;padding:var(--sp-2) 0;border-top:var(--tr);font-size:var(--fs-sm);
  color:var(--ink)}
.cd-etapes li:first-child{border-top:0}
.cd-pt{width:12px;height:12px;border-radius:var(--r-circle);border:2px solid var(--cream3);
  background:var(--paper);justify-self:center}
.cd-etapes .fait .cd-pt{background:var(--green);border-color:var(--green)}
.cd-etapes .attente .cd-pt{border-color:var(--gold);border-style:dashed}
.cd-etapes .prevu{color:var(--ink3)}
.cd-etapes .prevu .cd-pt{border-style:dashed}
.cd-l{min-width:0}
.cd-d{font-weight:600;white-space:nowrap;color:var(--ink)}
/* LA FRISE DATEE (19/10/2026) porte aussi des phrases (« 7 jours pleins
   apres le certificat ») : la colonne de droite se partage et passe a la
   ligne, sinon elle prenait toute la largeur et l'etape disparaissait. */
.cd-etapes li{grid-template-columns:18px minmax(0,1fr) minmax(0,1fr)}
.cd-etapes .cd-d{white-space:normal;text-align:right}
.cd-etapes .prevu .cd-d,.cd-etapes .attente .cd-d{font-weight:400;color:var(--ink3)}
.cd-details{margin:0 0 var(--sp-3)}
.cd-details summary{cursor:pointer;color:var(--terra);font-weight:600;font-size:var(--fs-sm);
  min-height:var(--cible);display:flex;align-items:center;list-style:none}
.cd-details summary::-webkit-details-marker{display:none}
.cd-details summary::after{content:" ▾";color:var(--warm)}
.cd-details[open] summary::after{content:" ▴"}
.cd-details .cd-echange{margin-top:var(--sp-2)}
.cands .tete.cd-places{display:flex;align-items:center;gap:var(--sp-3);flex-wrap:wrap;
  margin:0 0 var(--sp-3);font-family:var(--ff-corps);text-transform:none;letter-spacing:0;
  font-size:var(--fs-base);color:var(--ink)}
.cd-places-l{font-weight:600}
.cd-places-j{display:inline-grid;grid-auto-flow:column;gap:4px}
.cd-places-j span{width:22px;height:6px;border-radius:var(--r-pill);background:var(--cream3)}
.cd-places-j span.prise{background:var(--terra)}
.cd-places-n{color:var(--ink3)}
.cands .tete.cd-groupe{margin:var(--sp-4) 0 var(--sp-2)}
.cands .cd.cd-libre{padding:0;border-style:dashed;background:transparent}
.cd-libre-lien{display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:var(--sp-1);width:100%;min-height:118px;text-decoration:none;color:var(--warm);
  border-radius:var(--r-lg)}
.cd-libre-lien:hover{color:var(--terra)}
.cd-libre-n{font-family:var(--ff-titre);font-weight:600;font-size:var(--fs-lg);color:var(--ink3)}
.cd-libre-t{font-size:var(--fs-sm);font-weight:600;color:var(--terra)}
/* Sur l'accueil : les cartes resserrees, et la priorite dans la sienne - la
   candidature RETENUE sort du rang, en sombre, avec le geste. */
.acc-sec{margin:0 0 var(--sp-5)}
.acc-tete{display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between;
  gap:var(--sp-1) var(--sp-4);margin:0 0 var(--sp-3)}
.carte-fy .acc-tete h2{margin:0;font-size:var(--fs-xl)}
.acc-tete p{flex:1 1 100%;margin:0;color:var(--ink2);font-size:var(--fs-base);line-height:1.5}
.carte-fy .acc-lien{min-height:var(--cible);display:inline-flex;align-items:center;
  padding:0;font-size:var(--fs-sm)}
.acc-cands{display:grid;grid-template-columns:minmax(0,1fr);gap:var(--sp-2);margin:0}
.carte-fy .acc-cands .cd{margin:0;padding:var(--sp-3) var(--sp-4)}
.carte-fy .acc-cands .cd.cd-petit{display:grid;grid-template-columns:minmax(0,1fr) 20rem;
  align-items:center;gap:var(--sp-2) var(--sp-5)}
.cd.cd-petit .cd-photo{width:48px;height:48px;border-radius:var(--r-sm)}
.cd.cd-petit .cd-nom{gap:var(--sp-1) var(--sp-2)}
.cd.cd-petit .cd-nom b{font-size:var(--fs-md)}
.cd.cd-petit .cd-ligne{margin:2px 0 0;font-size:var(--fs-xs)}
.cd.cd-petit .cd-mini{min-width:0;margin:0;gap:var(--sp-1)}
.cd.cd-petit .cd-mini-t{font-size:var(--fs-xs)}
.cd.cd-petit .cd-points li{width:10px;height:10px}
.cd.cd-petit .cd-points li + li{margin-left:16px}
.cd.cd-petit .cd-points li + li::before{width:16px}
@media (max-width:640px){.carte-fy .acc-cands .cd.cd-petit{grid-template-columns:1fr}}
.carte-fy .acc-cands .cd.cd-prio{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.3fr);
  gap:var(--sp-4) var(--sp-6);align-items:center;padding:var(--sp-5);
  background:var(--ink);border-color:var(--ink);color:var(--surInk)}
.cd-prio .cd-tete{align-items:flex-start}
.cd-prio .cd-photo{width:72px;height:72px;border-radius:var(--r-md)}
.cd-prio .cd-nom b{color:var(--surInk);font-size:var(--fs-xl)}
.cd-prio .cd-nom-lien:hover b{color:var(--terraLt)}
.cd-prio .cd-ligne{color:var(--surInk3);margin:var(--sp-1) 0 0}
.cd-prio .cd-mini{margin:var(--sp-3) 0 0}
.cd-prio .cd-mini-t{color:var(--surInk2)}
.cd-prio .cd-points li{background:transparent;border-color:var(--surInk3)}
.cd-prio .cd-points li + li::before{background:var(--surInk3)}
.cd-prio .cd-points li.fait{background:var(--green);border-color:var(--green)}
.cd-prio .cd-points li.fait + li::before{background:var(--green)}
.cd-prio .cd-points li.attente{border-color:var(--gold)}
.cd-prio-faire{min-width:0}
.cd-prio-faire .lab{color:var(--terraLt);margin:0 0 var(--sp-2)}
.carte-fy .cd-prio-faire h2{margin:0 0 var(--sp-2);font-family:var(--ff-titre);font-size:var(--fs-xl);
  line-height:1.15;color:var(--surInk);text-wrap:pretty}
.cd-prio-faire p:not(.lab){margin:0 0 var(--sp-3);color:var(--surInk2);line-height:1.55;
  font-size:var(--fs-base)}
.cd-prio-faire .cmd{margin:0}
@media (max-width:720px){.carte-fy .acc-cands .cd.cd-prio{grid-template-columns:1fr;padding:var(--sp-4)}}

/* --- « Mes candidatures » en grille (maquette du 02/10/2026, portee le 12/10)
   Des cartes cote a cote des 260 px de colonne ; la jauge des places et les
   en-tetes de groupe prennent toute la largeur ; les places libres sont des
   cartes de la grille. Les cibles gardent leurs 44 px : la maquette
   rapetisse « Retirer » a 30 px, et c'est exactement ce que l'audit refuse. */
.cands.cd-grille{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,260px),1fr));
  gap:var(--sp-3);list-style:none;padding:0;margin:0}
.cands.cd-grille .tete{grid-column:1 / -1}
.cands.cd-grille .cd{margin:0;padding:var(--sp-3) var(--sp-4);display:flex;flex-direction:column;
  gap:var(--sp-2)}
.cands.cd-grille .cd .cd-tete{align-items:flex-start}
.cands.cd-grille .cd .cd-photo{width:52px;height:52px}
.cands.cd-grille .cd .cd-qui{display:flex;flex-direction:column;gap:2px;min-width:0}
.cands.cd-grille .cd .cd-nom{gap:var(--sp-1) var(--sp-2)}
.cands.cd-grille .cd .cd-nom .cd-voir{margin-left:0}
.cands.cd-grille .cd .cd-ligne{margin:2px 0 0;font-size:var(--fs-sm)}
.cands.cd-grille .cd .cd-mini,.cands.cd-grille .cd .cd-details,.cands.cd-grille .cd .cd-suite,
.cands.cd-grille .cd .cd-motif{margin:0}
.cands.cd-grille .cd .cd-geste{margin-top:auto}
.cands.cd-grille .cd.cd-libre{padding:0;min-height:150px}

/* A QUI, PAR OU, LE DOSSIER EN LIGNE, LE SUIVI (13/10/2026, maquette du
   26/09). La liste de l'annuaire defile dans sa boite ; une structure
   choisie se lit sur un filet terracotta ; les canaux reprennent les
   pastilles de l'editeur (`editeur.css`, servie par /famille) a 44 px. */
.pres-liste{margin:0 0 var(--sp-3)}
.carte-fy .pres-liste-s{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-3);
 min-height:var(--cible);padding:var(--sp-2) var(--sp-3);border:var(--tr-champ);border-radius:var(--r-md);
 background:var(--paper);cursor:pointer;list-style:none}
.pres-liste-s::-webkit-details-marker{display:none}
.pres-liste-txt{display:flex;flex-direction:column;min-width:0}
.pres-liste-txt b,.pres-liste-txt small{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pres-liste-txt small{color:var(--warm);font-size:var(--fs-xs)}
.pres-liste-n{display:flex;align-items:center;gap:var(--sp-2);flex:none}
.pres-liste-badge{display:inline-flex;align-items:center;justify-content:center;min-width:22px;height:22px;
 padding:0 var(--sp-1);border-radius:var(--r-pill);background:var(--terra);color:var(--cream);
 font-family:var(--ff-mono);font-size:var(--fs-xs)}
.pres-liste-c{padding:var(--sp-3);border:var(--tr);border-top:0;border-radius:0 0 var(--r-md) var(--r-md);background:var(--paper)}
.pres-liste-c .note{margin:0 0 var(--sp-2)}
.pres-orgs{display:flex;flex-direction:column;max-height:17rem;overflow-y:auto}
.carte-fy .pres-org{display:flex;align-items:center;gap:var(--sp-2);padding:var(--sp-2) var(--sp-1);
 min-height:var(--cible);font-size:var(--fs-sm);cursor:pointer;border-top:var(--tr-clair)}
.carte-fy .pres-org input{width:18px;height:18px;accent-color:var(--terra);flex:none;margin:0}
.carte-fy .pres-org-tout{border-top:0;font-weight:600}
.pres-org-txt{display:flex;flex-direction:column;min-width:0;flex:1}
.pres-org-tete{display:flex;align-items:center;gap:var(--sp-1)}
.pres-org-txt small{color:var(--warm);font-size:var(--fs-xs)}
.pres-org-badge{display:inline-block;width:9px;height:9px;border-radius:var(--r-circle);background:var(--greenDk);flex:none}
.pres-org-route{font-family:var(--ff-mono);font-size:var(--fs-xs);color:var(--greenDk);background:var(--greenLt);
 padding:2px var(--sp-2);border-radius:var(--r-pill);flex:none;white-space:nowrap}
.pres-org-route.loin{color:var(--ink2);background:var(--cream2)}
.pres-orgs-sep{margin:var(--sp-2) 0 0;font-family:var(--ff-mono);font-size:var(--fs-xs);color:var(--warm)}
.pres-choisies{display:flex;flex-direction:column;gap:var(--sp-2)}
.pres-choisie{display:flex;justify-content:space-between;gap:var(--sp-2);padding:var(--sp-2) var(--sp-3);
 background:var(--cream);border-left:3px solid var(--terra);border-radius:var(--r-sm)}
.pres-choisie > div{display:flex;flex-direction:column;gap:2px;min-width:0}
.pres-choisie small{color:var(--ink2);font-size:var(--fs-xs);overflow-wrap:anywhere}
.pres-choisie-envoye{font-family:var(--ff-mono);font-size:var(--fs-xs);color:var(--terraDk)}
.carte-fy .pres-choisie-x{flex:none;width:var(--cible);height:var(--cible);border:0;background:none;
 font:inherit;font-size:var(--fs-lg);color:var(--warm);cursor:pointer}
.pres-canaux .ed-puces{display:flex;flex-wrap:wrap;gap:var(--sp-2);margin:0 0 var(--sp-2)}
.carte-fy .pres-canaux .ed-puce{min-height:var(--cible)}
/* Un canal grise dit pourquoi SOUS son nom : sans ces regles, « Lien de mon
   dossierActivez d'abord... » se lisait d'un bloc (17/10/2026, la refonte
   avait retire le conteneur .pres-canaux que les regles visaient). */
#presentation .ed-puce.off{opacity:.6;display:inline-flex;flex-direction:column;align-items:flex-start;gap:0;cursor:default}
#presentation .ed-puce.off small{font-weight:400;font-size:var(--fs-xs)}
.pres-vit-lien{margin:0 0 var(--sp-2)}
.pres-vit-lien code{display:block;overflow-wrap:anywhere;padding:var(--sp-2) var(--sp-3);background:var(--paper);
 border:var(--tr);border-radius:var(--r-md);font-size:var(--fs-sm)}
.pres-partages{list-style:none;margin:0;padding:0;display:grid;gap:var(--sp-2)}
.pres-partages .partage{padding:var(--sp-2) var(--sp-3);background:var(--paper);border:var(--tr);border-radius:var(--r-md);
 display:flex;flex-wrap:wrap;gap:var(--sp-1) var(--sp-3);align-items:baseline}
.pres-partages .partage small{color:var(--warm);font-size:var(--fs-xs)}
.pres-partages .partage span{flex:1 1 100%;font-size:var(--fs-sm)}
.pres-partages .partage.animal span b{color:var(--greenDk)}
@media (pointer:coarse){
  .pres-choisie a,.pres-partages a,.pres-vitrine .cmd a{min-height:var(--cible);display:inline-flex;align-items:center}
}
/* LA VITRINE D'UNE FAMILLE, /f/<code> (pb/vitrine.py) : le bloc d'encre en
   tete, les forces, le dossier en grille, le pied qui dit ou vont les
   coordonnees. Servie avec cette feuille par la coquille des pages legales. */
.vf{padding:0;overflow:hidden}
.vf-page{margin:0}
.vf-h{background:var(--ink);color:var(--cream);padding:var(--sp-5) var(--sp-5) var(--sp-4)}
.vf-h h1{margin:0 0 var(--sp-1);color:var(--cream);font-size:var(--fs-2xl)}
.vf-etiq{margin:0 0 var(--sp-2);font-family:var(--ff-mono);font-size:var(--fs-xs);letter-spacing:.14em;
 text-transform:uppercase;color:var(--terraLt)}
.vf-sous{margin:0 0 var(--sp-2);color:var(--cream2)}
.vf-etat{display:inline-block;padding:2px var(--sp-2);border-radius:var(--r-pill);background:var(--goldLt);color:var(--ink);
 font-family:var(--ff-mono);font-size:var(--fs-xs)}
.vf-etat.ok{background:var(--greenLt);color:var(--greenDk)}
.vf-forces{display:grid;gap:var(--sp-3);grid-template-columns:repeat(auto-fit,minmax(min(100%,14rem),1fr));
 padding:var(--sp-4) var(--sp-5) 0}
.vf-force{padding:var(--sp-3);background:var(--cream);border-radius:var(--r-md)}
.vf-force b{display:block;margin:0 0 var(--sp-1)}
.vf-force p{margin:0;color:var(--ink2);font-size:var(--fs-sm)}
.vf-clin{margin:var(--sp-4) var(--sp-5) 0;font-style:italic;color:var(--terraDk)}
.vf-h2{margin:var(--sp-5) var(--sp-5) var(--sp-2);font-size:var(--fs-md)}
.vf-points{display:grid;gap:var(--sp-2) var(--sp-5);grid-template-columns:repeat(auto-fit,minmax(min(100%,16rem),1fr));
 padding:0 var(--sp-5)}
.vf-point{display:flex;flex-direction:column;gap:2px;padding:var(--sp-2) 0;border-top:var(--tr-clair)}
.vf-point-t{font-family:var(--ff-mono);font-size:var(--fs-xs);color:var(--warm)}
.vf-point-v{font-size:var(--fs-sm)}
.vf-manque{margin:var(--sp-3) var(--sp-5) 0;font-size:var(--fs-sm);color:var(--warm)}
.vf-pied{display:flex;flex-wrap:wrap;gap:var(--sp-3);align-items:center;justify-content:space-between;
 margin:var(--sp-5) 0 0;padding:var(--sp-4) var(--sp-5);background:var(--cream)}
.vf-pied p{margin:0;font-size:var(--fs-xs);color:var(--ink2);flex:1 1 16rem}
.vf-btn{min-height:var(--cible);display:inline-flex;align-items:center;text-decoration:none}
.vf-note{margin:var(--sp-3) 0 0;font-size:var(--fs-xs);color:var(--warm)}
/* « Ce que vous cherchez » en une rangee de pastilles (15/10/2026) : une
   icone et la valeur ; le titre et « Modifier » sur la meme ligne. */
.qma-tete{display:flex;align-items:baseline;justify-content:space-between;gap:var(--sp-3)}
.qma-tete h3{margin:0}
.qma-tete .lien{min-height:var(--cible);white-space:nowrap}
.qma-chips{display:flex;flex-wrap:wrap;gap:var(--sp-2);margin:var(--sp-3) 0 0;padding:0;list-style:none}
.qma-chips li{display:inline-flex;align-items:center;gap:6px;min-height:36px;padding:0 var(--sp-3) 0 var(--sp-2);
  background:var(--cream);border:var(--tr-clair);border-radius:var(--r-pill);font-size:var(--fs-sm);
  color:var(--ink);font-weight:600;max-width:100%}
.qma-chips svg{width:16px;height:16px;flex:none;fill:none;stroke:var(--terra);stroke-width:1.4;
  stroke-linecap:round;stroke-linejoin:round}
.qma-eur{display:inline-grid;place-items:center;width:16px;color:var(--terra);font-weight:700}
.qma-tout{margin:var(--sp-2) 0 0;font-size:var(--fs-sm)}

/* Le score d'une carte (15/10/2026) : une jauge, « k/n », et la phrase au
   survol. Vert quand tout est confirme, terracotta quand rien ne l'est. */
.qma-score{display:flex;align-items:center;gap:var(--sp-2);margin:var(--sp-2) 0 0;
  font-size:var(--fs-sm);color:var(--ink2)}
.qma-score-l{font-weight:600}
.qma-jauge{display:inline-flex;gap:3px}
.qma-jauge i{width:12px;height:8px;border-radius:var(--r-pill);background:var(--cream2);
  border:1px solid var(--warm)}
.qma-jauge i.on{background:var(--gold);border-color:var(--gold)}
.qma-score.ok .qma-jauge i.on{background:var(--green);border-color:var(--green)}
.qma-score b{font-family:var(--ff-mono);color:var(--ink)}
.qma-score.ok b{color:var(--greenDk)}

/* Le bandeau « ce qui manque », en pastilles a icone */
.dos-pastilles{display:flex;flex-wrap:wrap;gap:var(--sp-2)}
.dos-pastille{display:inline-flex;align-items:center;gap:var(--sp-1)}
.dos-pastille svg{width:16px;height:16px;flex:none;fill:none;stroke:currentColor;stroke-width:1.4;
  stroke-linecap:round;stroke-linejoin:round}

/* Le guide par espece du bloc 05 (17/10/2026) : une selection editoriale,
   un volet par sujet ; ce que la famille a coche s'ouvre en premier. */
.gd{display:flex;flex-direction:column;gap:var(--sp-4);margin-top:var(--sp-3)}
.gd-principe{margin:0;color:var(--ink2);font-size:var(--fs-sm);line-height:1.5}
.gd-espece{border:var(--tr);border-radius:var(--r-md);background:var(--paper);padding:var(--sp-4)}
.gd-titre{display:flex;align-items:center;gap:var(--sp-3);margin:0 0 var(--sp-3);
  font-family:var(--ff-titre);font-size:var(--fs-xl);color:var(--ink)}
.gd-titre img{width:3em;height:3em;border-radius:var(--r-circle);flex:none}
.gd-volet{border-top:var(--tr)}
.gd-volet > summary{cursor:pointer;min-height:var(--cible);display:flex;align-items:center;gap:var(--sp-2);
  font-weight:600;color:var(--ink);font-size:var(--fs-md);list-style:none}
.gd-volet > summary::-webkit-details-marker{display:none}
.gd-volet > summary::after{content:"+";margin-left:auto;color:var(--terra);font-size:var(--fs-xl);line-height:1}
.gd-volet[open] > summary::after{content:"−"}
.gd-volet.gd-coche > summary::before{content:"";width:var(--sp-2);height:var(--sp-2);
  border-radius:var(--r-circle);background:var(--terra);flex:none;order:2}
.gd-corps{padding:0 0 var(--sp-4);color:var(--ink2);font-size:var(--fs-base);line-height:1.55}
.gd-corps h4{margin:var(--sp-4) 0 var(--sp-2);font-size:var(--fs-base);color:var(--ink)}
.gd-liste{margin:0;padding-left:var(--sp-5);display:flex;flex-direction:column;gap:var(--sp-2)}
.gd-marques{list-style:none;margin:0;padding:0;display:grid;gap:var(--sp-3);
  grid-template-columns:repeat(auto-fill,minmax(16rem,1fr))}
.gd-marque{display:flex;flex-direction:column;gap:var(--sp-1);border:var(--tr);border-radius:var(--r-sm);
  padding:var(--sp-3);background:var(--cream)}
.gd-marque b{color:var(--ink)}
.gd-pour{color:var(--ink3);font-size:var(--fs-sm)}
.gd-note{margin:var(--sp-2) 0 0;color:var(--ink3);font-size:var(--fs-sm)}
.gd-src{white-space:nowrap;font-size:var(--fs-xs)}
.gd-src a,.gd-verif a{color:var(--calmDk)}
.gd-pro{margin-bottom:var(--sp-3)}
.gd-pro p{margin:0 0 var(--sp-2)}
.gd-verif{font-size:var(--fs-sm)}
.gd-avert{margin:0 0 var(--sp-3);padding:var(--sp-3);border-radius:var(--r-sm);background:var(--goldLt);
  color:var(--ink);font-size:var(--fs-sm)}
@media (pointer:coarse){
  .gd-src a,.gd-verif a{min-height:var(--cible);display:inline-flex;align-items:center}
}

/* ---- lot A (19/10/2026) : l'animal est en pause, la candidature est gardee */
.cd-pause{margin:0 0 var(--sp-2);padding:var(--sp-2) var(--sp-3);border-radius:var(--r-sm);
  background:var(--calmLt);color:var(--calmDk);font-size:var(--fs-sm)}

/* ==========================================================================
   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; }

/* « Parlez-nous de vous » : la coquille des cinq blocs du questionnaire
   d'une famille (maquette du 22/09/2026, voir pb/front_parlez.py).

   Elle est SERVIE PAR L'ACCUEIL, et le sera par l'espace famille : c'est le
   meme ecran des deux cotes. La recopier dans app.css puis dans foyer.css
   en aurait fait deux, et elles auraient diverge - le piege des deux
   `:root`, pour la septieme fois dans ce depot.

   Les briques (.chip-fy, .tuiles, .compteur, .enfant, .animal) restent
   stylees sous `.ecrans` dans app.css : ce fichier ne fait que les
   resserrer. Aucune valeur brute : les jetons sont dans tokens.css. */
.pz{display:flex;flex-direction:column;gap:0}
.pz-phrase{margin:0 0 var(--sp-4);font-family:var(--ff-titre);font-size:var(--fs-lg);line-height:1.35;color:var(--ink)}
.pz-phrase-t{display:flex;justify-content:space-between;gap:var(--sp-3);flex-wrap:wrap;font-family:var(--ff-corps);font-size:var(--fs-base);color:var(--warm);margin-bottom:2px}
.pz-reste{color:var(--terra);font-weight:600}
.pz-phrase-x{display:block}
.pz-rang{display:grid;grid-template-columns:36px minmax(0,1fr);gap:0 var(--sp-3)}
.pz-rail{display:flex;flex-direction:column;align-items:center;padding-top:var(--sp-4)}
.pz-patte{width:22px;height:24px;display:block}
.pz-patte-on{display:none}
.pz-rang.ok .pz-patte-on{display:block}
.pz-rang.ok .pz-patte-off{display:none}
.pz-fil{flex:1;width:1.5px;background:var(--cream3);margin-top:6px;min-height:12px}
.pz-rang.ok .pz-fil{background:var(--ink)}
.pz-rang:last-child .pz-fil{display:none}
.pz-bloc{background:var(--paper);border:var(--tr);border-radius:var(--r-lg);margin:0 0 10px;box-shadow:var(--sh-1);overflow:hidden;transition:box-shadow var(--t-moyen) var(--e),border-color var(--t-moyen) var(--e)}
.pz-rang.ouvert .pz-bloc{border-color:var(--terraLt);box-shadow:var(--sh-2)}
.pz-tete{display:flex;align-items:center;gap:var(--sp-3);width:100%;background:none;border:0;padding:14px 18px;font:inherit;color:inherit;text-align:left;cursor:pointer}
.pz-tete:focus-visible{outline:var(--focus);outline-offset:-4px}
.pz-titres{display:flex;flex-direction:column;gap:3px;min-width:0;flex:1}
.pz-ligne{display:flex;align-items:baseline;gap:var(--sp-3);flex-wrap:wrap;line-height:1.15}
.pz-num{font-family:var(--ff-titre);font-weight:600;font-size:var(--fs-2xl);color:var(--terra);letter-spacing:-.02em;min-width:1.1em}
.pz-rang.ouvert .pz-num{font-size:var(--fs-3xl)}
.pz-titre{font-family:var(--ff-titre);font-weight:600;font-size:var(--fs-xl);line-height:1.1}
.pz-rang.ouvert .pz-titre{font-size:var(--fs-2xl)}
.pz-duree{font-size:var(--fs-sm);color:var(--warm)}
.pz-resume{font-family:var(--ff-titre);font-style:italic;font-size:var(--fs-md);color:var(--ink2);line-height:1.35;margin-top:2px}
.pz-rang.ouvert .pz-resume{display:none}
.pz-rang:not(.ok) .pz-resume{color:var(--goldDk)}
.pz-etat{font-size:var(--fs-sm);border-radius:var(--r-pill);padding:3px 10px;font-weight:600;white-space:nowrap;color:var(--goldDk);background:var(--goldLt)}
.pz-etat.ok{color:var(--greenDk);background:var(--greenLt)}
.pz-chev{color:var(--warm);font-size:var(--fs-sm);flex:none}
.pz-rang.ouvert .pz-chev{transform:rotate(180deg)}
.pz-corps{display:none;border-top:var(--tr-clair)}
.pz-rang.ouvert .pz-corps{display:block}
.pz-note{margin:var(--sp-3) 18px 0;font-size:var(--fs-sm);color:var(--warm)}
.pz-grille{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,220px),1fr));gap:0 var(--sp-5);padding:var(--sp-4) 18px 0}
.pz-large{grid-column:1 / -1}
.pz .pz-grille fieldset{margin-bottom:var(--sp-4)}
.pz legend{font-weight:600;font-size:var(--fs-md);margin-bottom:var(--sp-2);line-height:1.35}
.pz-cand{font-weight:400;font-size:var(--fs-sm);color:var(--warm)}
.pz .chip-fy{flex-direction:column;align-items:flex-start;justify-content:center;line-height:1.25}
.pz .chip-fy small{display:block;font-weight:400;font-size:var(--fs-xs);opacity:.85}
.pz .chips-fy{margin-bottom:var(--sp-2)}
.pz .ind{margin:var(--sp-2) 0 0;font-size:var(--fs-sm);color:var(--warm)}
.pz-plus .lien{padding:0;font-weight:600}
.pz-plus-corps{margin-top:var(--sp-3)}
.pz-pied{display:flex;align-items:center;gap:var(--sp-4);flex-wrap:wrap;padding:6px 18px 16px}
.pz-suivant{min-height:var(--cible);padding:0 20px;border:0;border-radius:var(--r-pill);background:var(--terra);color:var(--paper);font:inherit;font-weight:600;font-size:var(--fs-base);cursor:pointer}
.pz-suivant:hover{background:var(--terraDk)}
.pz-resume-bas{font-family:var(--ff-titre);font-style:italic;font-size:var(--fs-md);color:var(--ink3)}
.pz-compte{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-4);background:var(--cream2);border-radius:var(--r-lg);padding:var(--sp-4) 18px;margin-bottom:var(--sp-4)}
.pz-compte p{margin:0;flex:1 1 240px;font-size:var(--fs-base);color:var(--ink2)}
.pz-creer{display:inline-flex;align-items:center;min-height:var(--cible);padding:0 18px;border-radius:var(--r-pill);background:var(--ink);color:var(--paper);font-weight:600;text-decoration:none;font-size:var(--fs-base)}
.pz-formules{display:grid;gap:var(--sp-3);margin-top:var(--sp-3)}
.pz-formule-bloc{border:var(--tr) !important;border-radius:var(--r-lg);padding:var(--sp-3) var(--sp-4) !important;margin:0 !important;background:var(--paper)}
.pz-formule-bloc legend{padding:0 6px;font-size:var(--fs-base)}
.pz .formules{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,200px),1fr));gap:var(--sp-2)}
.pz .formule{position:relative;display:flex;flex-direction:column;gap:4px;padding:12px 14px;border:var(--tr-fort);border-radius:var(--r-md);background:var(--paper);cursor:pointer}
.pz .formule input{position:absolute;opacity:0;width:0;height:0}
.pz .formule:has(input:checked){border-color:var(--terra);background:var(--terra);color:var(--paper)}
.pz .formule:has(input:checked) .formule-d{color:var(--surInk2)}
.pz .formule:has(input:checked) .formule-badge{background:var(--paper);color:var(--terra)}
.pz .formule:hover{border-color:var(--terra)}
.pz .formule-t{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.pz .formule-n{font-weight:600;font-size:var(--fs-base)}
.pz .formule-badge{font-family:var(--ff-mono);font-size:var(--fs-xs);letter-spacing:.1em;text-transform:uppercase;border-radius:var(--r-pill);padding:2px 7px;background:var(--greenLt);color:var(--greenDk)}
.pz .formule-p{font-family:var(--ff-titre);font-weight:600;font-size:var(--fs-lg);line-height:1.1}
.pz .formule-d{font-size:var(--fs-sm);line-height:1.45;color:var(--ink3)}
.pz .formule-vide{border-style:dashed}
.pz .formule-avert{margin:var(--sp-2) 0 0;font-size:var(--fs-sm);color:var(--warm);font-style:italic}
.pz legend{font-size:var(--fs-md);color:var(--ink);font-weight:600;margin-bottom:var(--sp-2);padding:0}
.pz .ind{font-size:var(--fs-sm);color:var(--warm);margin:var(--sp-2) 0 0}
.pz .chip-fy{background:var(--paper);color:var(--ink2);font-size:var(--fs-base);font-weight:400;border:var(--tr-fort);border-radius:var(--r-pill);min-height:var(--cible);padding:var(--sp-2) var(--sp-4)}
.pz .chip-fy:has(input:checked){background:var(--terra);border-color:var(--terra);color:var(--paper);font-weight:600}
.pz .chip-fy:hover{border-color:var(--terra)}
.pz .lien{padding:var(--sp-1) 0;font-size:var(--fs-base);font-weight:600}
.pz input[type=text],.pz input[type=tel],.pz select{display:inline-block;width:auto;margin-top:0}
.pz .formules{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,200px),1fr));gap:var(--sp-2);margin:0}
.pz .formule:has(input:checked){background:var(--terra);border-color:var(--terra);color:var(--paper)}
.pz .formule:has(input:checked) .formule-n,.pz .formule:has(input:checked) .formule-p{color:var(--paper)}
.pz .formule:has(input:checked) .formule-d{color:var(--surInk2)}
.pz .formule:has(input:checked) .formule-badge{background:var(--paper);color:var(--terra)}
.pz .formule-badge{background:var(--greenLt);color:var(--greenDk);font-size:var(--fs-xs);letter-spacing:.1em;text-transform:uppercase}
.pz .formule-p{font-family:var(--ff-titre);font-size:var(--fs-lg);line-height:1.1}
.pz .formule-vide .formule-n{font-weight:600;color:inherit}
.pz .formule-avert{margin:var(--sp-2) 0 0;font-style:italic;font-size:var(--fs-sm);color:var(--warm)}
.pz .tuile{color:var(--ink2);font-size:var(--fs-sm)}
.pz .pz-suivant{font-size:var(--fs-base)}
.pz fieldset:has(> .tuiles){display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-2)}
.pz fieldset:has(> .tuiles) legend{flex:1 1 100%}
.pz fieldset:has(> .tuiles) .ind,.pz fieldset:has(> .tuiles) [data-ec="animaux_liste"]{flex:1 1 100%}
.pz .tuiles,.pz .tuiles.pilules{display:inline-flex;flex-wrap:wrap;gap:var(--sp-1);margin:0;grid-template-columns:none}
.pz .tuiles.pilules .tuile,.pz .tuiles .tuile{flex-direction:column;width:72px;padding:var(--sp-1);border:0;background:none;border-radius:var(--r-md);min-height:0;gap:6px}
.pz .pil-plus,.pz [data-animaux-plus]{margin:0;align-self:center;min-height:36px;padding:4px 12px;font-size:var(--fs-sm)}
.pz .tuiles.pilules .tuile-ph{width:var(--tuile);height:var(--tuile);border:var(--tr-fort);border-radius:var(--r-circle)}
.pz .tuiles.pilules .tuile:has(input:checked) .tuile-ph{border:var(--anneau)}
.pz .tuiles.pilules .tuile-ph img{width:100%;height:100%}
.pz .tuiles.pilules .tuile:has(input:checked){background:none;color:var(--ink);font-weight:600}
.pz legend{display:flex;flex-wrap:wrap;align-items:baseline;gap:0 6px}
.pz-cand{white-space:nowrap}
.pz .pz-grille{padding-top:var(--sp-3)}
.pz .pz-grille fieldset{margin-bottom:var(--sp-3)}
.pz .ecrans .ind + fieldset,.pz .ind + fieldset{margin-top:0}
.pz .chips-fy{margin-bottom:0;gap:6px}
.pz .chip-fy{min-height:38px;padding:5px 12px}
.pz legend{margin-bottom:6px}
.pz .ind{margin-top:6px}
.pz-note{margin-top:var(--sp-2)}
.pz .animal{margin-top:var(--sp-2)}
.pz-pied{padding:2px 18px 14px}
.pz .pz-plus{margin-bottom:var(--sp-2)}
.pz .chip-fy{min-height:38px;padding:5px 12px;line-height:1.25;gap:0}
.pz .chip-fy span{display:block}
.pz .chip-fy small{display:block;line-height:1.2;margin-top:1px}
.pz .pz-grille{grid-template-columns:repeat(auto-fit,minmax(min(100%,300px),1fr))}
.pz .pd-pays-fixe{cursor:default}
.pz-pays-menu{position:absolute;top:calc(100% + 6px);left:0;z-index:var(--z-menu);min-width:260px;background:var(--paper);border:var(--tr);border-radius:var(--r-lg);box-shadow:var(--sh-2);padding:10px}
.pz-pays-lab{margin:0 0 6px;padding:0 6px;font-family:var(--ff-mono);font-size:var(--fs-xs);letter-spacing:.14em;text-transform:uppercase;color:var(--warm)}
.pz-pays-liste{display:grid;gap:2px}
.pz .formule{align-items:flex-start}
.pz .formule-d{max-height:0;overflow:hidden;opacity:0;margin:0;transition:max-height var(--t-moyen) var(--e),opacity var(--t-moyen) var(--e),margin var(--t-moyen) var(--e)}
.pz .formule:hover .formule-d,.pz .formule:focus-within .formule-d,.pz .formule:has(input:checked) .formule-d{max-height:6em;opacity:1;margin-top:2px}
@media (hover:none){.pz .formule-d{max-height:none;opacity:1}}
.pz .formules{align-items:start}
.pz-formules{grid-template-columns:repeat(auto-fit,minmax(min(100%,300px),1fr))}
.pz .dos-prog{align-items:flex-end}
.pz .dos-jauge-l:has(#dosJauge[hidden]){display:none}
.pz .dos-maj{margin:0}
.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-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-bp-menu .pz-pays-liste{display:grid;gap:2px}
.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}
.pz-bp-note{margin:0;padding:6px 6px 2px;font-size:var(--fs-sm);color:var(--warm);line-height:1.5}
.pz .ind,.ecrans .pz .ind{max-width:none;text-wrap:pretty}
.pz-note,.pz-bp-note{text-wrap:pretty}
.pz-foyer{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-2) var(--sp-4)}
.pz-adultes{display:inline-flex;align-items:center;gap:var(--sp-2)}
.pz-adultes-l{font-size:var(--fs-base);color:var(--ink2)}
.pz .compteur{display:inline-flex;align-items:center;border:var(--tr-fort);border-radius:var(--r-pill);background:var(--paper);overflow:hidden}
.pz .compteur button{width:38px;height:38px;border:0;background:none;font:inherit;font-size:var(--fs-lg);color:var(--ink2);cursor:pointer}
.pz .compteur button:hover{background:var(--cream)}
.pz .compteur output{min-width:28px;text-align:center;font-family:var(--ff-titre);font-size:var(--fs-xl);font-weight:600;line-height:1}
.pz-enfants{display:inline-flex;flex-wrap:wrap;align-items:center;gap:var(--sp-2)}
.pz-enfants [data-ec="enfants"]{display:contents}
.pz .enfant{display:inline-flex;align-items:center;gap:2px;margin:0;padding:0 4px 0 0;border:var(--tr-fort);border-radius:var(--r-pill);background:var(--paper);min-height:38px}
.pz .enfant label{display:inline-flex;align-items:center;margin:0;font-weight:400}
.pz .enfant select{border:0;background:transparent;min-height:36px;padding:0 6px 0 12px;margin:0;font:inherit;font-size:var(--fs-base);color:var(--ink);width:auto}
.pz .enfant [data-retirer-enfant]{width:30px;height:30px;min-height:0;padding:0;border:0;border-radius:var(--r-circle);background:none;color:var(--warm);font-size:var(--fs-sm);text-decoration:none;cursor:pointer;display:inline-flex;align-items:center;justify-content:center}
.pz .enfant [data-retirer-enfant]:hover{background:var(--cream2);color:var(--ink)}
.pz-enfants .lien{min-height:38px;padding:0 4px}
.pz .animal{border:var(--tr);border-radius:var(--r-lg);background:var(--paper);padding:var(--sp-3) var(--sp-4);margin-top:var(--sp-2)}
.pz .animal-t{display:flex;align-items:center;gap:var(--sp-3);margin:0}
.pz .animal-n{font-weight:600;font-size:var(--fs-md)}
.pz-portrait{display:inline-flex;width:40px;height:40px;border-radius:var(--r-circle);overflow:hidden;background:var(--cream2);border:var(--tr-fort);flex:none}
.pz-portrait img{width:100%;height:100%;object-fit:cover;display:block}
.pz .animal .compteur{margin-left:auto}
.pz .animal .compteur button{width:34px;height:34px;font-size:var(--fs-md)}
.pz .animal .compteur output{font-size:var(--fs-lg);min-width:22px}
.pz .a-sante,.pz .a-maladie{margin:var(--sp-3) 0 0;padding:var(--sp-3) 0 0;border-top:var(--tr-clair)}
.pz .a-sante legend{display:flex;align-items:center;gap:var(--sp-3);width:100%;font-size:var(--fs-base);margin-bottom:var(--sp-2)}
.pz .comps{display:flex;flex-wrap:wrap;gap:var(--sp-2) var(--sp-4)}
.pz .comp{display:inline-flex;align-items:center;gap:var(--sp-2)}
.pz .comp-l{font-size:var(--fs-base);color:var(--ink2);white-space:nowrap}
.pz .comp .chips-fy{display:inline-flex;gap:0;margin:0}
.pz .comp .chip-fy{min-height:32px;padding:3px 11px;border-radius:0;margin-left:-1.5px;font-size:var(--fs-sm)}
.pz .comp .chip-fy:first-child{border-radius:var(--r-pill) 0 0 var(--r-pill);margin-left:0}
.pz .comp .chip-fy:last-child{border-radius:0 var(--r-pill) var(--r-pill) 0}
.pz .a-maladie{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-2) var(--sp-3)}
.pz .a-maladie legend{float:left;margin:0;font-size:var(--fs-base);color:var(--ink2);font-weight:400;line-height:32px}
.pz .a-maladie > .chips-fy{display:inline-flex;gap:0}
.pz .a-maladie > .chips-fy .chip-fy{min-height:32px;padding:3px 11px;border-radius:0;margin-left:-1.5px;font-size:var(--fs-sm)}
.pz .a-maladie > .chips-fy .chip-fy:first-child{border-radius:var(--r-pill) 0 0 var(--r-pill);margin-left:0}
.pz .a-maladie > .chips-fy .chip-fy:last-child{border-radius:0 var(--r-pill) var(--r-pill) 0}
.pz .a-maladie .precis,.pz .a-maladie .precis-t{flex:1 1 100%}
.pz .comp .comp-l,.pz .comp .chips-fy{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);margin:0}
.pz .comp{position:relative}
.pz-etat3{display:inline-flex;align-items:center;white-space:nowrap;min-height:36px;padding:5px 14px;border:var(--tr-fort);border-radius:var(--r-pill);background:var(--paper);color:var(--ink2);font:inherit;font-size:var(--fs-base);cursor:pointer}
.pz-etat3:hover{border-color:var(--terra)}
.pz-etat3.oui{background:var(--terra);border-color:var(--terra);color:var(--paper);font-weight:600}
.pz-etat3.non{background:var(--cream2);border-color:var(--cream2);color:var(--ink3);text-decoration:line-through;text-decoration-color:var(--warm)}
.pz-etat3.vide{border-style:dashed}
.pz .comps{gap:var(--sp-2)}
.pz .a-maladie legend{display:inline-flex;float:left;width:auto;margin:0 var(--sp-3) 0 0;padding:0;line-height:32px;min-height:32px}
.pz .a-maladie > .chips-fy{display:inline-flex;margin:0}
.pz .a-maladie{display:block}
.pz .a-maladie::after{content:"";display:block;clear:both}
.pz .a-maladie .precis,.pz .a-maladie .precis-t{clear:both;margin-top:var(--sp-2)}
.pz .a-sante,.pz .a-maladie{margin-top:var(--sp-2);padding-top:var(--sp-2)}
.pz .comps{gap:6px}
.pz .comp .chips-fy{display:inline-flex}
.pz-resultat{display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin-top:var(--sp-2)}
.pz-resultat-l{font-size:var(--fs-sm);color:var(--warm);margin-right:4px}
.pz .a-maladie .precis-t{display:none !important}
.pz-vrais-l{display:flex;flex-wrap:wrap;gap:6px}
.pz-vrais .pz-etat3.non{text-decoration:none}
.pz-pilule.oui{background:var(--paper);color:var(--ink);border-color:var(--ink);font-weight:600}
.pz-pilule.oui:hover{border-color:var(--terra);color:var(--terra)}
.pz-vie-choix{margin-top:var(--sp-3);padding:var(--sp-3) var(--sp-4);border:var(--tr);border-radius:var(--r-lg);background:var(--cream)}
.pz-vie-q{margin:0 0 var(--sp-2);font-weight:600;font-size:var(--fs-base)}
.pz .pz-choix{cursor:pointer;font:inherit;font-size:var(--fs-base)}
.pz .pz-choix.on{background:var(--terra);border-color:var(--terra);color:var(--paper);font-weight:600}
.pz .pz-vie-ouverte{grid-column:auto}
.pz .pz-pilules legend{margin-bottom:6px}
.pz-pilule.vide{border-style:dashed;color:var(--ink2)}
.pz-pilule.vide:hover{border-color:var(--terra);color:var(--terra)}
.pz-logement-pilules{margin-top:var(--sp-2)}
.pz .pz-logement .pz-grille{padding:0}
.pz-rang.ouvert .pz-bloc{overflow:visible}
.pz .a-maladie .precis{flex:1 1 100%;margin-top:var(--sp-2)}
.pz .a-maladie .dd-fy-p{max-height:320px;overflow-y:auto;min-width:min(100%,360px);z-index:var(--z-menu)}
.pz .a-maladie .dd-g{font-family:var(--ff-mono);font-size:var(--fs-xs);letter-spacing:.14em;text-transform:uppercase;color:var(--warm)}
.pz .dos-pied{margin:var(--sp-3) 0 0;padding-top:var(--sp-3)}
.pz details.dos-jamais{margin-top:var(--sp-3);padding-top:var(--sp-2)}
.pz details.dos-jamais summary{min-height:36px}
.pz .dos-vue[hidden],.pz .dos-vue:empty{margin:0}
.pz details.dos-jamais{margin-top:var(--sp-2);padding:0}
.pz details.dos-jamais summary{min-height:32px;padding:4px 0}
.pz .dos-pied{margin-top:var(--sp-2);padding-top:var(--sp-2)}

/* LES CHOIX DE SANTE NE LAISSENT PAS DE CIBLE D'UN PIXEL.
   La maquette les couche sous un `clip` d'un pixel pour que la pastille a
   trois etats prenne leur place : ils restent alors des controles pour un
   lecteur d'ecran ET une cible tactile de 1 px pour l'audit. `display:none`
   les retire des deux - c'est la PASTILLE qui porte le nom, et `EC.lire`
   lit `input:checked` en JavaScript, sans passer par un envoi de
   formulaire.

   ELLE EST ICI, dans la queue ecrite a la main : posee au milieu de la
   feuille, elle etait rallumee vingt lignes plus bas par
   `.pz .comp .chips-fy{display:inline-flex}`, et perdue a la premiere
   regeneration (24/09/2026, deux fois). */
.pz .comp .comp-l,.pz .comp .chips-fy{display:none}

/* LE CHAMP DE COMMUNE PREND SA COLONNE (audit du 24/09/2026).
   `.pz input[type=text]{width:auto}` vient de la maquette : dans la carte
   de l'espace famille, un champ ne prend pas toute la largeur. Cette regle
   ne visait QUE cet espace (`.carte-fy .pz`) ; elle vaut maintenant pour
   les deux, et « Où est-ce qu'il vous rejoindrait ? » demandait 225 px
   pour 198 - le libelle et le champ sur une ligne, le texte rogne.

   Le bloc « lieu » fait exception, et c'est le seul : son champ porte un
   nom de commune entier avec son code postal, « Saint-Rémy-de-Provence
   (13210) ». Il prend sa colonne. */
.pz .cp-wrap{display:block;width:100%}
.pz .cp-wrap input[type=text],.pz .cp-wrap textarea.cp-champ{width:100%}
/* Le champ est un textarea depuis le 05/10/2026 (front_ecrans.champCommune) :
   il prend sa colonne, sans la marge que `.ecrans` donne a un champ sous son
   libelle - la regle generee `.pz input[type=text]` la retirait au champ
   d'une ligne. Ecrite ICI, dans la queue a la main, pour survivre a une
   regeneration. */
.pz textarea.cp-champ{margin-top:0}

/* UNE PASTILLE DE QUESTION PEUT ETRE LONGUE, ET ELLE NE DOIT PAS DEBORDER.
   `.pz-etat3` est `nowrap` - « Vacciné ✓ » ne se coupe pas en deux - mais une
   pastille qui porte une REPONSE en porte le texte entier : « Weniger als 2
   Stunden am Tag allein ↻ » demandait 376 px pour 360 a l'ecran (mesure du
   24/09/2026, en allemand). Elle revient donc a la ligne.

   La pastille d'une AFFIRMATION aussi (`[data-pz-vrai]`) : c'est une phrase.
   « Zu Hause sind alle einverstanden ✓ » demandait 369 px pour 360 avec
   l'echelle de texte du 29/09 (audit du 02/10/2026). */
.pz-pilule,.pz-etat3[data-pz-vrai]{white-space:normal;text-align:left;max-width:100%}@media (max-width:560px){.pz-tete{flex-wrap:wrap;gap:var(--sp-2)}.pz-titres{flex:1 1 100%;order:1}.pz-etat{order:2}.pz-chev{order:3;margin-left:auto}.pz-titre{font-size:var(--fs-lg)}.pz-rang.ouvert .pz-titre{font-size:var(--fs-xl)}.pz-num{font-size:var(--fs-xl)}.pz-rang.ouvert .pz-num{font-size:var(--fs-2xl)}.pz-rang{grid-template-columns:28px minmax(0,1fr)}.pz-grille, .pz-pied{padding-left:var(--sp-3);padding-right:var(--sp-3)}
}/* LES CIBLES TACTILES, RENDUES (audit du 24/09/2026).
   `app.css` pose `button{min-height:var(--cible)}` sous pointeur grossier ;
   cette feuille est concatenee APRES elle et ses hauteurs compactes - 36 px
   pour « + 11 autres especes », 38 pour « + Ajouter un enfant », 36 pour
   une pastille ou une liste d'age - l'emportaient. La maquette a ete
   dessinee a 1440 px, pour une souris.

   ET IL A FALLU DEUX ESSAIS, POUR LA MEME RAISON. `.pz button` compte une
   classe et un type (0,1,1) quand `.pz .pil-plus` en compte deux (0,2,0),
   et c'est la plus FORTE qui gagne, pas la derniere. `:is(button, summary)`
   n'y change rien : `:is()` prend la specificite de son argument le plus
   fort, et ses arguments sont des types - toujours 0,1,1. `.pz.pz` designe
   exactement les memes elements et compte DEUX classes : 0,2,1, au-dessus
   de tout ce que cette feuille ecrit. Mesure avant / apres, et non lecture
   du CSS : 36 px, puis 44.

   UNE REGLE, PAS UNE LISTE : c'est ce qu'`app.css` dit au-dessus du meme
   media, et pour la meme raison - une enumeration oublie celle a laquelle
   on n'a pas pense. `select` y a ete ajoute le jour meme, justement parce
   qu'il manquait.

   Les pastilles de choix (`.chip-fy`) N'Y SONT PAS, et c'est le meme
   arbitrage qu'`app.css` : ce sont des `<label>` autour d'un bouton radio,
   qu'il n'exige pas a 44 px non plus. Les grossir couterait la densite que
   la maquette a cherchee, sans que rien ne le demande. */
@media (pointer:coarse){
  .pz.pz :is(button, summary, select){min-height:var(--cible)}
  .pz .compteur button,
  .pz .enfant [data-retirer-enfant]{width:var(--cible);height:var(--cible)}
  .pz .enfant{min-height:var(--cible)}
  .pz :is(input[type=checkbox], input[type=radio]){min-height:0}
  /* Sauf dans « Pour aller plus loin » (16/10/2026) : la, une pastille
     EST la reponse (taille, sterilisation, refuges, fraicheur), elle ne
     devient pas un segment, et l'audit la mesurait a 38 px au doigt. */
  .pz .pz-plus-corps .chip-fy{min-height:var(--cible)}
}

/* LE SEGMENT (maquette du 02/10/2026) : la question, puis ses reponses
   cote a cote. Remplace la pastille qui tournait. */
.pz .pz-seg{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-1) var(--sp-2);
  margin:0 0 var(--sp-2)}
.pz .pz-seg-l{flex:1 1 12rem;min-width:0;font-size:var(--fs-sm);color:var(--ink2)}
/* Des filets d'un pixel faits par l'ecart, et un rayon moyen : une pilule
   qui passe a la ligne dessinait un cercle autour de quatre reponses. */
.pz .pz-seg-b{display:inline-flex;flex-wrap:wrap;gap:1px;border:var(--tr);
  border-radius:var(--r-md);overflow:hidden;background:var(--cream3);max-width:100%}
.pz .pz-seg-b button{flex:1 1 auto;min-height:var(--cible);padding:0 var(--sp-3);border:0;
  background:var(--paper);color:var(--ink2);font:inherit;font-size:var(--fs-sm);cursor:pointer}
.pz .pz-seg-b button[aria-pressed="true"]{background:var(--ink);color:var(--paper);font-weight:600}

/* L'age d'un enfant est un champ dont le conteneur porte le trait
   (`.pz .enfant`) : il gardait le trait creme, 1,29 (audit du 10/10/2026).
   Ici, dans la queue ecrite a la main, pour survivre a une regeneration. */
.pz .enfant{border:var(--tr-champ)}

/* Un bloc qu'on ouvre est ramene en haut de l'ecran (front_parlez.amener) :
   il s'arrete SOUS la barre collee en haut des espaces, pas dessous.
   Ici, dans la queue ecrite a la main, pour survivre a une regeneration. */
.pz [data-pz-bloc]{scroll-margin-top:calc(var(--sp-7) * 2)}

/* Ce que vous nous avez confie : les pastilles des vignettes d'animaux
   (`.past`, socle.css). Seule la patte, pleine, garde son remplissage. */
.pz-synth .past svg g ellipse{fill:currentColor}
.pz-synth .past{white-space:normal;max-width:100%}

/* ---------------------------------------------------------------------------
   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}
