/* styles/happia-v5.css — LA FONTE GRAPHIQUE V5 DU BACK-OFFICE
 *
 * 2026-09-11 — Christophe :
 *   « la première des choses, c'est de refaire la fonte graphique parce qu'en
 *     fonction du graphisme qu'on va donner, on va trouver des solutions sur
 *     les informations. »
 *   « on donne une information. Il faut qu'en face, on ait une action. »
 *   « c'était parfait avec les bulles mais faut qu'on arrive à le rendre plus
 *     clair… juste ça »
 *
 * ── LA RÈGLE QUI A TOUT DÉBLOQUÉ ─────────────────────────────────────────
 * LA COULEUR N'EST PAS DANS LA BULLE, ELLE EST DANS LA PASTILLE.
 *
 * Première version : une bulle rouge pleine (le constat) contre une bulle
 * verte pleine (la réponse). Deux surfaces saturées par action, six à l'écran
 * pour trois actions — aucune ne reculait, l'œil ne savait pas où se poser.
 * Christophe : « c'est hyper surchargé, on n'arrive pas à comprendre où l'œil
 * doit aller. »
 *
 * Maintenant : UNE bulle par action, neutre (--v5-bulle), et des pastilles de
 * 11 px qui portent le sens et la couleur — ● CE QUI NE VA PAS, ● AUJOURD'HUI,
 * ● PROPOSÉ, ● CE QU'ON FAIT. Une seule chose reste pleine et colorée dans
 * tout l'écran : le bouton.
 *
 * Trois conséquences à ne pas défaire :
 *   - une bulle ne prend JAMAIS de couleur de fond ; si tu veux signaler
 *     quelque chose, ajoute une pastille ;
 *   - il n'y a qu'un seul bouton plein par bulle ;
 *   - le bouton est toujours au même endroit — en haut à droite d'une bulle
 *     courte, au pied d'une bulle ouverte. On sait où cliquer sans chercher.
 * ─────────────────────────────────────────────────────────────────────────
 *
 * Le fichier est PORTÉ PAR `body.hv5` : tant qu'une page ne porte pas cette
 * classe, rien ici ne la touche. C'est ce qui permet de refaire le back-office
 * écran par écran sans casser les autres au passage.
 */

/* 🆕 11/09 — LES TROIS NIVEAUX SE VOYAIENT PLUS.
 * Mesure faite dans la page : fond→bulle 1,11 · bulle→bulle-2 1,07 · fond→bulle-2
 * 1,03. Trois plans posés l'un sur l'autre et aucun ne se détachait — et pire,
 * la bulle INTÉRIEURE (une voie, un bloc de code) était plus SOMBRE que la carte
 * qui la contient : l'inverse de ce que l'œil attend, il lit ça comme un trou.
 * On remonte les deux bulles (fond inchangé, il tient au bleu) pour retrouver un
 * écart franc, et on remonte le filet et l'encre 4 d'autant, sinon ils se noient
 * dans la bulle éclaircie. Nouvelle mesure : fond→bulle 1,34 · bulle→bulle-2 1,21
 * · fond→bulle-2 1,63, et la plus faible encre reste à 3,17 sur la bulle-2. */

/* ════════════════════════════════════════════════════════════════════════════
   13/09/2026, fin de journée — « Ok tu repasses tout le back-office en Papier. »

   Ce matin il avait tranché l'inverse : « Encre, c'est sûr, l'œil voit immédiatement
   les infos. » On a passé la journée à appliquer Encre, et à chaque écran il est
   revenu sur la même chose — « trop de gris », « plus de noir », « le minimum de gris
   partout ». Le gris était le symptôme ; le fond sombre était la cause.

   CE QUI CHANGE ICI, ET RIEN D'AUTRE : les valeurs des jetons. Pas une règle, pas un
   sélecteur, pas un écran. C'était la promesse du système V5 depuis le début, et c'est
   la première fois qu'on la met à l'épreuve pour de vrai.

   🚨 UN THEME CLAIR NE S'OBTIENT PAS EN INVERSANT UN THEME SOMBRE. Une pastille
   sombre-sur-couleur devient une pastille couleur-sur-tache-claire ; l'ambre doit
   descendre de #E8B15C à #8A5A12 pour rester lisible sur du blanc cassé ; le vert
   monte en profondeur au lieu de descendre en saturation. Les fonds de pastille sont
   REDERIVES, pas retournés.

   🚨 ET LE PIEGE DU CLAIR : fond #FBFBF9 contre bulle #F2F2EE, c'est 1,05 — trois plans
   posés l'un sur l'autre dont aucun ne se détache, exactement le défaut mesuré le 11/09
   sur le bleu nuit. Sur fond clair on ne le rattrape pas en éclaircissant la bulle : il
   n'y a plus de place au-dessus. On la borde d'un filet — d'où --v5-bulle-bord, qui vaut
   `transparent` en Encre (là, la bulle se détache par sa clarté) et #DEDED6 en Papier.

   POUR REVENIR EN ENCRE : la palette est conservée entière sous `body.hv5.encre`.
   Une classe sur le <body> suffit, et rien d'autre n'a besoin de bouger.
   ════════════════════════════════════════════════════════════════════════════ */

body.hv5 {
  /* ══ 19/09/2026, soir — LE BACK-OFFICE PASSE AU SOMBRE. ══
     Christophe a fourni « Happia-reference-sombre » : la proposition A dans son apparence
     sombre, « c'est ce rendu qu'il attend ». Valeurs exactes de la référence : fond
     #242321, cartes et en-tête #302F2D, texte #F5F2EC / #C2BFB7, bordures #4A4741, accent
     et liens #A7B7FF, surfaces d'accent #303850. Le reste est dérivé pour tenir les mêmes
     contrastes. Le rendu reste sombre quel que soit le thème du système : aucune
     dépendance à prefers-color-scheme. Le clair V6 est conservé sous body.hv5.clair. */
  /* 🐛 18/09/2026 — CE COMMENTAIRE ÉTAIT OUVERT DEUX FOIS, ET IL MANGEAIT UN JETON.
     Sa première ligne ouvrait un commentaire, puis en rouvrait un second juste après.
     Le CSS ne sait pas les imbriquer : la première fermeture rencontrée referme tout,
     et les quarante lignes suivantes deviennent une déclaration invalide qui court
     jusqu'au point-virgule suivant. Ce point-virgule était celui de --v5-fond : #242321; qu'il retrouve la
     meme maison des deux cotes de la connexion n'est pas une preference, c'est la
     seule chose qu'on n'avait pas encore essayee.

     🚨 LE VERT DU SITE EST DOUBLE, ET UN SEUL DES DEUX PORTE DU TEXTE. La menthe
     vive #19CE84 sert d'ornement (anneaux, points, jauges) ; en fond de bouton avec
     du blanc dessus elle tombe a 1,9 de contraste. Le site l'a corrige de son cote
     il y a longtemps : ses boutons sont en #0E7A52 (5,4). C'est CE vert-la qui
     devient l'accent, pas la menthe.

     🚨 ET L'AMBRE RESTE DEHORS. Le site n'a pas d'ambre du tout — marine, creme,
     vert, et c'est tout. L'etat « aujourd'hui » garde donc l'encre neutre : c'est le
     mot qui le dit, pas la couleur. */
  /* ══ V6 — COULEURS VIVANTES. Maquette validée par Christophe le 18/09. ══
     Les NOMS des jetons ne bougent pas : trois cents règles les lisent. On change
     ce qu'ils VALENT, ici, une fois. Le fond devient le papier, la carte reste
     blanche : c'est le filet qui la détache, 1,41 de contraste contre 1,29 en V5.

     🚨 LE VERT NE DEVIENT PAS LE CORAIL. Relevé avant d'y toucher : --v5-vert sert
     au SUCCÈS et à la marque (pastille « fait », --etat-ok, une hausse d'impact, les
     liens, le focus), jamais à un bouton d'action. Le corail est donc un jeton NEUF,
     qui ne prend la place de rien. Les confondre aurait teinté en rouge tout ce qui
     va bien. */
  --v5-fond:#242321;
  --v5-fond-image:none;
  --v5-bulle:#302F2D;
  --v5-bulle-2:#3A3937;
  /* 🚨 EN CLAIR, LA CARTE NE SE DETACHE PAS PAR SA SURFACE. Blanc sur creme, c'est
     1,07 — il n'y a plus de place au-dessus du fond. C'est le FILET qui la detache
     (1,29), et c'est pour ca que le cliquet mesure « par la surface OU par le filet ». */
  --v5-bulle-bord:#4A4741;
  --v5-bulle-2-bord:#54514B;
  --v5-filet:#4A4741;
  --v5-filet-2:#3A3937;

  --v5-verre:none;
  --v5-verre-2:none;
  --v5-verre-sous:var(--v5-bulle);
  --v5-verre-bord:var(--v5-bulle-bord);
  --v5-verre-ombre:0 1px 2px rgba(0,0,0,.28);

  --v5-encre:#F5F2EC;
  --v5-encre-2:#C2BFB7;
  --v5-encre-3:#ABA79E;
  --v5-encre-4:#AFABA2;

  /* L'ACCENT — le vert des boutons du site. Les jetons gardent leurs noms
     (--v5-vert*) : trois cents regles les lisent. */
  --v5-vert:var(--v6-corail);
  --v5-vert-2:var(--v6-corail-2);
  --v5-vert-encre:var(--v6-corail-encre);
  /* 19/09 : un fond doux est du papier en V6 ; le rose corail se lisait comme une alerte. */
  --v5-vert-sol:var(--v5-bulle-2);  /* 19/09 : « trop de couleurs partout » : un fond doux est neutre, plus bleu */
  --v5-vert-txt:var(--v6-corail-texte);
  --v5-vert-doux:var(--v6-corail-2);
  --v5-vert-fil:#46507A;

  /* L'ETAT « AUJOURD'HUI » — neutre. Voir la note plus haut. */
  --v5-ambre:#E8B656;
  --v5-ambre-sol:#3A301C;
  --v5-ambre-encre:#171717;
  --v5-ambre-fil:#5E4B25;

  /* L'ALERTE — la brique du site (--coral, descendue jusqu'a etre lisible sur creme). */
  --v5-rouge:#F2877B;
  --v5-rouge-sol:#3E2522;
  --v5-rouge-doux:#F4968B;
  --v5-rouge-encre:#171717;
  --v5-rouge-fil:#6A3630;

  --v5-neutre-sol:#3A3937;

  --v5-violet:#B8A6FF;
  --v5-ciel:#7CC4EE;
  --v5-rose:#F08DBE;

  --v5-survol:#3A3937;

  --v5-voile:rgba(36,35,33,.93);

  /* ——— V6 : LE CORAIL, L'ACTION ———
     Il ne sert QU'EN FOND. Sur le papier il tombe à 3,31 de contraste : en couleur de
     texte il serait illisible. Avec l'encre par-dessus il donne 4,77 ; avec du blanc,
     3,76 seulement — d'où le texte encre sur les boutons pleins. */
  --v6-corail:#F04438;
  --v6-corail-encre:#171717;
  --v6-corail-2:#D93B30;
  --v6-corail-sol:#3E2522;
  --v6-corail-fil:#6A3630;

  /* ——— V6 : LES HUIT AGENTS ———
     Une couleur par poste, tirée de son personnage : le cobalt d'Orvan est son costume,
     le jaune de Bolen son gilet, le teal de Tomel son sweat. Les -sol sont les fonds
     doux des cartes secondaires ; les -encre disent avec quoi on écrit DESSUS, et c'est
     le seul jeton qui change pour Bolen.

     🚨 AUCUNE N'APPROCHE LE CORAIL. La plus proche est celle de Nélia, à ΔE 40 : un
     bandeau ne peut pas se lire comme un bouton. Et le bleu de Juna s'est éloigné du
     cobalt d'Orvan, sans quoi deux voisins de la même barre auraient porté le même bleu.
     Ces valeurs sont AUSSI dans scripts/postes.js ; un cliquet tient les deux d'accord. */
  --v6-ag-direction:#3155D9;     --v6-ag-direction-encre:#FFFFFF;     --v6-ag-direction-sol:#303858;
  --v6-ag-communication:#C2185B; --v6-ag-communication-encre:#FFFFFF; --v6-ag-communication-sol:#542938;
  --v6-ag-seo:#237A52;           --v6-ag-seo-encre:#FFFFFF;           --v6-ag-seo-sol:#2D4236;
  --v6-ag-ia:#3A3531;            --v6-ag-ia-encre:#FFFFFF;            --v6-ag-ia-sol:#3A3937;
  --v6-ag-site:#0E7C86;          --v6-ag-site-encre:#FFFFFF;          --v6-ag-site-sol:#284243;
  --v6-ag-analyse:#E8C85A;       --v6-ag-analyse-encre:#171717;       --v6-ag-analyse-sol:#5E5538;
  --v6-ag-veille:#5B6B7C;        --v6-ag-veille-encre:#FFFFFF;        --v6-ag-veille-sol:#3B3E41;
  --v6-ag-secretariat:#8C4A2F;   --v6-ag-secretariat-encre:#FFFFFF;   --v6-ag-secretariat-sol:#47362E;

  /* ——— V6 : LES RAYONS ———
     Trois valeurs, pas douze. Le bandeau est plus rond que la carte, la carte plus ronde
     que le bouton : c'est ce qui dit lequel contient lequel. */
  --v6-r-bandeau:16px;
  --v6-r-carte:12px;
  --v6-r-bouton:9px;
  --v5-voile-bulle:rgba(48,47,45,.93);

  /* LA COLONNE DE GAUCHE — blanche a filet, exactement comme la maquette du site. */
  --v5-nav:#302F2D;
  --v5-nav-voile:none;
  --v5-nav-fond-actif:#F5F2EC;
  --v5-nav-encre:#C2BFB7;
  --v5-nav-encre-2:#ABA79E;
  --v5-nav-actif:#171717;
  --v5-nav-fil:#4A4741;

  --v5-sur-accent:#171717;
  --v5-encre-sur-clair:#171717;

  --pf-head:"Sora",-apple-system,BlinkMacSystemFont,system-ui,sans-serif;

  /* 🐛 13/09, tres tard (Christophe : « y'a plein d'endroits ou on n'utilise pas la
     totalite de la page ») — ONZE LARGEURS POUR VINGT-QUATRE ECRANS, de 760 px a
     1500 px. Une seule largeur utile, declaree ici ; les autres palettes en heritent. */
  --v5-page:1560px;

  --v5-r:16px;
  --v5-r-2:12px;

  background:var(--v5-fond);
  background-image:var(--v5-fond-image);
  color:var(--v5-encre);
  /* 19/09/2026 — le vert ne dit plus qu'une chose : c'est réussi. L'action est corail. */
  --v5-succes: #5FCB94;
  --v5-succes-2: #4BB07E;
  --v5-succes-encre: #171717;
  --v5-succes-sol: #22362C;
  --v5-succes-txt: #7FDBA9;
  --v5-succes-doux: #5FCB94;
  --v5-succes-fil: #2F5A45;
  --v6-corail-texte: #A7B7FF;
}
/* ——————————————————— V6 CLAIR (papier), conservée ———————————————————
   `<body class="hv5 clair">`. Livrée le 18/09, remplacée le 19/09 au soir par la référence
   sombre que Christophe a fournie (« Happia-reference-sombre ») : même maison, fond sombre.
   Elle tient ses contrastes, on la garde. */
body.hv5.clair{
  --v5-fond:#F4F0E8;
  --v5-fond-image:none;
  --v5-bulle:#FFFFFF;
  --v5-bulle-2:#FAF8F3;
  --v5-bulle-bord:#DED9CF;
  --v5-bulle-2-bord:#DED9CF;
  --v5-filet:#DED9CF;
  --v5-filet-2:#EDE8DE;
  --v5-verre:none;
  --v5-verre-2:none;
  --v5-verre-sous:var(--v5-bulle);
  --v5-verre-bord:var(--v5-bulle-bord);
  --v5-verre-ombre:0 1px 2px rgba(12,31,78,.04), 0 1px 3px rgba(12,31,78,.06);
  --v5-encre:#171717;
  --v5-encre-2:#65615A;
  --v5-encre-3:#6F6A62;
  --v5-encre-4:#726C64;
  --v5-vert:var(--v6-corail);
  --v5-vert-2:var(--v6-corail-2);
  --v5-vert-encre:var(--v6-corail-encre);
  --v5-vert-sol:var(--v5-fond);
  --v5-vert-txt:var(--v6-corail-texte);
  --v5-vert-doux:var(--v6-corail-2);
  --v5-vert-fil:var(--v6-corail-fil);
  --v5-ambre:#9A5E08;
  --v5-ambre-sol:#FFF8E8;
  --v5-ambre-encre:#FFFFFF;
  --v5-ambre-fil:#F0E0BB;
  --v5-rouge:#B3392A;
  --v5-rouge-sol:#FCEDEA;
  --v5-rouge-doux:#BD4A3B;
  --v5-rouge-encre:#FFFFFF;
  --v5-rouge-fil:#F0CFC8;
  --v5-neutre-sol:#FAF8F3;
  --v5-violet:#5B3FBF;
  --v5-ciel:#1B6E9C;
  --v5-rose:#A8386E;
  --v5-survol:#FBF9F5;
  --v5-voile:rgba(255,255,255,.93);
  --v6-corail:#F04438;
  --v6-corail-encre:#171717;
  --v6-corail-2:#D93B30;
  --v6-corail-sol:#FCEAE8;
  --v6-corail-fil:#F7C6C1;
  --v6-ag-direction:#3155D9;     --v6-ag-direction-encre:#FFFFFF;     --v6-ag-direction-sol:#EAF0FF;
  --v6-ag-communication:#C2185B; --v6-ag-communication-encre:#FFFFFF; --v6-ag-communication-sol:#FCE7EF;
  --v6-ag-seo:#237A52;           --v6-ag-seo-encre:#FFFFFF;           --v6-ag-seo-sol:#E7EFE4;
  --v6-ag-ia:#3A3531;            --v6-ag-ia-encre:#FFFFFF;            --v6-ag-ia-sol:#EEEBE6;
  --v6-ag-site:#0E7C86;          --v6-ag-site-encre:#FFFFFF;          --v6-ag-site-sol:#E3F1F2;
  --v6-ag-analyse:#E8C85A;       --v6-ag-analyse-encre:#171717;       --v6-ag-analyse-sol:#FAEDBC;
  --v6-ag-veille:#5B6B7C;        --v6-ag-veille-encre:#FFFFFF;        --v6-ag-veille-sol:#E9ECEF;
  --v6-ag-secretariat:#8C4A2F;   --v6-ag-secretariat-encre:#FFFFFF;   --v6-ag-secretariat-sol:#F3E5DE;
  --v6-r-bandeau:16px;
  --v6-r-carte:12px;
  --v6-r-bouton:9px;
  --v5-voile-bulle:rgba(255,255,255,.93);
  --v5-nav:#FFFFFF;
  --v5-nav-voile:none;
  --v5-nav-fond-actif:#171717;
  --v5-nav-encre:#65615A;
  --v5-nav-encre-2:#726C64;
  --v5-nav-actif:#FFFFFF;
  --v5-nav-fil:#DED9CF;
  --v5-sur-accent:#FFFFFF;
  --v5-encre-sur-clair:#171717;
  --pf-head:"Sora",-apple-system,BlinkMacSystemFont,system-ui,sans-serif;
  --v5-page:1560px;
  --v5-r:16px;
  --v5-r-2:12px;
  --v5-succes: #0E7A52;
  --v5-succes-2: #0B5A40;
  --v5-succes-encre: #FFFFFF;
  --v5-succes-sol: #EEFAF3;
  --v5-succes-txt: #0E7A52;
  --v5-succes-doux: #14805A;
  --v5-succes-fil: #CDEADB;
  --v6-corail-texte: #BF3228;
}

/* ——————————————————— OR & ENCRE, conservee ———————————————————
   `<body class="hv5 or">` et tout repasse au noir et or. Elle tient ses contrastes,
   elle reste livree — on ne jette pas une palette qui passe le cliquet. */
body.hv5.or{
  /* ——————————————————— OR & ENCRE (body.hv5.or) ———————————————————
     13/09/2026, tard — choisi sur planche, apres dix propositions.

     🚨 CE QUE CETTE PALETTE CORRIGE, ET QUI N'ETAIT PAS UNE QUESTION DE GOUT.
     Dans Verre, l'accent (menthe, 11,6 de contraste sur le fond) et l'alerte (saumon, 7,9)
     avaient presque la meme clarte ET la meme temperature. Deux couleurs qui crient au meme
     volume : l'oeil ne sait pas laquelle regarder en premier. Ici l'accent est CHAUD (or) et
     l'alerte FROIDE (corail) — elles ne se confondent plus jamais, quelle que soit la taille
     de la tache a l'ecran.

     🚨 ET L'AMBRE A DISPARU DES ETATS. Avec un accent dore, un etat ambre serait une
     troisieme teinte chaude sur le meme ecran — exactement ce que Christophe a signale ce
     soir (« trop de couleurs qui vont pas ensemble »). L'etat « aujourd'hui » est donc
     NEUTRE : c'est le mot qui le dit, pas la couleur. --v5-ambre reste declare pour ne rien
     casser, mais il vaut le neutre.

     🚨 LE PIEGE DU NOIR, POUR LA DEUXIEME FOIS. Premier essai a bulle #1D1D20 : fond→bulle
     tombait a 1,16. Pres du noir, le terme +0,05 de la formule de contraste ecrase les
     ecarts — un ecart qui se voit a 8 % de luminance disparait a 0,4 %. La bulle est donc
     remontee de deux crans. Mesure : fond→bulle 1,26 · bulle→bulle-2 1,23. */
  --v5-fond:#0C0C0D;
  --v5-fond-image:none;
  --v5-bulle:#242428;
  --v5-bulle-2:#33333A;
  --v5-bulle-bord:transparent;
  --v5-bulle-2-bord:transparent;
  --v5-filet:#3C3C44;
  --v5-filet-2:#4A4A53;
  --v5-verre:none;
  --v5-verre-2:none;
  --v5-verre-bord:transparent;
  --v5-verre-ombre:none;

  --v5-encre:#FAFAFA;
  --v5-encre-2:#C6C6CB;
  --v5-encre-3:#9A9AA3;
  --v5-encre-4:#86868F;

  /* L'ACCENT — l'or. Il ne dit qu'une chose : c'est ici qu'on agit.
     Les jetons gardent leurs noms (--v5-vert*) : trois cents regles les lisent, et une
     palette se change par ses VALEURS, jamais par ses noms. */
  --v5-vert:#E3B95F;
  --v5-vert-2:#CFA44A;
  --v5-vert-encre:#241A06;
  --v5-vert-sol:#2A2313;
  --v5-vert-txt:#E3B95F;
  --v5-vert-doux:#B99A4E;
  --v5-vert-fil:#5A4A24;

  /* L'ETAT « AUJOURD'HUI » — neutre, volontairement. Voir la note plus haut. */
  --v5-ambre:#C6C6CB;
  --v5-ambre-sol:#232326;
  --v5-ambre-encre:#0C0C0D;
  --v5-ambre-fil:#3C3C44;

  /* L'ALERTE — froide, pour ne jamais se confondre avec l'or. */
  --v5-rouge:#F0897C;
  --v5-rouge-sol:#2A1718;
  --v5-rouge-doux:#F5A9A0;
  --v5-rouge-encre:#2A0D0F;
  --v5-rouge-fil:#5A2F2C;

  --v5-neutre-sol:#232326;

  --v5-violet:#C4B5FD;
  --v5-ciel:#7DD3FC;
  --v5-rose:#F9A8D4;

  --v5-survol:#3A3A41;

  --v5-voile:rgba(12,12,13,.93);
  --v5-voile-bulle:rgba(36,36,40,.93);

  --v5-nav:#141416;
  --v5-nav-fond-actif:#26262A;
  --v5-nav-encre:rgba(250,250,250,.62);
  --v5-nav-encre-2:rgba(250,250,250,.40);
  --v5-nav-actif:#FAFAFA;
  --v5-nav-fil:rgba(255,255,255,.07);

  --v5-sur-accent:#0C0C0D;
  --v5-encre-sur-clair:#101828;

  /* 🐛 13/09, tres tard (Christophe : « y'a plein d'endroits ou on n'utilise pas la totalite
     de la page ») — ONZE LARGEURS POUR VINGT-QUATRE ECRANS, de 760 px a 1500 px. Chaque page
     decidait dans son coin. Mesure sur son ecran d'audit, fenetre 1470 : 1 230 px disponibles,
     contenu plafonne a 1 080 — 150 px perdus a droite, et 600 sur un 1920.
     Une seule largeur utile, declaree ici. Les autres palettes en heritent. */
  --v5-verre-sous:var(--v5-bulle);
  --v5-nav-voile:linear-gradient(180deg,rgba(255,255,255,.035),rgba(255,255,255,0));

  /* 19/09/2026 — palette de réserve : le succès y garde la couleur qu'elle donnait à « vert ». */
  --v5-succes:var(--v5-vert); --v5-succes-2:var(--v5-vert-2); --v5-succes-encre:var(--v5-vert-encre); --v5-succes-sol:var(--v5-vert-sol); --v5-succes-txt:var(--v5-vert-txt); --v5-succes-doux:var(--v5-vert-doux); --v5-succes-fil:var(--v5-vert-fil);
}

/* ——————————————————— VERRE, conservée ———————————————————
   `<body class="hv5 verre">` — le degrade et les surfaces translucides. */
body.hv5.verre{
  --v5-fond:#12161F;
  --v5-fond-image:radial-gradient(120% 90% at 10% 0%,#243043 0%,#12161F 55%,#0C0F16 100%);
  --v5-bulle:#242730; --v5-bulle-2:#32353D; --v5-bulle-bord:#33373E; --v5-bulle-2-bord:#3F434B;
  --v5-filet:#33373E; --v5-filet-2:#3F434B;
  --v5-verre:linear-gradient(180deg,rgba(255,255,255,.085),rgba(255,255,255,.045));
  --v5-verre-2:linear-gradient(180deg,rgba(255,255,255,.15),rgba(255,255,255,.09));
  --v5-verre-bord:rgba(255,255,255,.12);
  --v5-verre-ombre:0 10px 30px -18px rgba(0,0,0,.85);
  --v5-encre:#EEF1F6; --v5-encre-2:#B4BAC6; --v5-encre-3:#8E96A6; --v5-encre-4:#7C8496;
  --v5-vert:#7DE3B0; --v5-vert-2:#5BC894; --v5-vert-encre:#062015; --v5-vert-sol:#203132;
  --v5-vert-txt:#7DE3B0; --v5-vert-doux:#63A88A; --v5-vert-fil:#2F5A4C;
  --v5-ambre:#E8B15C; --v5-ambre-sol:#2E2A27; --v5-ambre-encre:#2A1D07; --v5-ambre-fil:#544733;
  --v5-rouge:#FF8A7A; --v5-rouge-sol:#31252B; --v5-rouge-doux:#FFB3A8; --v5-rouge-encre:#2A0D0F;
  --v5-rouge-fil:#5C3B39;
  --v5-neutre-sol:#1F232B;
  --v5-violet:#C4B5FD; --v5-ciel:#7CE0FF; --v5-rose:#F9A8D4;
  --v5-survol:#3F424A;
  --v5-voile:rgba(18,22,31,.93); --v5-voile-bulle:rgba(36,39,48,.93);
  --v5-nav:#0E121A; --v5-nav-fond-actif:#232733;
  --v5-nav-encre:rgba(238,241,246,.62); --v5-nav-encre-2:rgba(238,241,246,.40);
  --v5-nav-actif:#FFFFFF; --v5-nav-fil:rgba(255,255,255,.08);
  --v5-sur-accent:#0A0A0B;
  --v5-verre-sous:transparent;
  --v5-nav-voile:linear-gradient(180deg,rgba(255,255,255,.035),rgba(255,255,255,0));

  /* 19/09/2026 — palette de réserve : le succès y garde la couleur qu'elle donnait à « vert ». */
  --v5-succes:var(--v5-vert); --v5-succes-2:var(--v5-vert-2); --v5-succes-encre:var(--v5-vert-encre); --v5-succes-sol:var(--v5-vert-sol); --v5-succes-txt:var(--v5-vert-txt); --v5-succes-doux:var(--v5-vert-doux); --v5-succes-fil:var(--v5-vert-fil);
}


/* ——————————————————— PAPIER, conservée ———————————————————
   `<body class="hv5 papier">`. Écartée le 13/09 au soir — « nos couleurs pâles, ça va
   pas » — mais elle tient ses contrastes, on la garde pour un éventuel thème clair. */
body.hv5.papier{
  --v5-fond:#E8E8E4;
  --v5-fond-image:none;
  --v5-bulle:#FFFFFF;
  --v5-bulle-2:#EFEFEC;
  --v5-bulle-bord:#E0E0DB;
  --v5-bulle-2-bord:#E4E4E0;
  --v5-filet:#E0E0DB;
  --v5-filet-2:#CFCFC9;
  --v5-verre:none;
  --v5-verre-2:none;
  --v5-verre-bord:#E0E0DB;
  --v5-verre-ombre:none;

  --v5-encre:#16161A;
  --v5-encre-2:#4A4A52;
  --v5-encre-3:#6E6E78;
  --v5-encre-4:#75757F;

  --v5-vert:#0E6B44; --v5-vert-2:#0B5537; --v5-vert-encre:#FFFFFF; --v5-vert-sol:#E2F0E8;
  --v5-vert-txt:#0E6B44; --v5-vert-doux:#3F8C68; --v5-vert-fil:#B9D9C8;
  --v5-ambre:#8A5A12; --v5-ambre-sol:#F6EEDF; --v5-ambre-encre:#FFFFFF; --v5-ambre-fil:#E4D2AE;
  --v5-rouge:#A32226; --v5-rouge-sol:#FAE9E8; --v5-rouge-doux:#C24B4E; --v5-rouge-encre:#FFFFFF;
  --v5-rouge-fil:#EFC9C7;
  --v5-neutre-sol:#EFEFEA;
  --v5-violet:#5B3FBF; --v5-ciel:#1B6E9C; --v5-rose:#A8386E;
  --v5-survol:#F2F2EF;
  --v5-voile:rgba(232,232,228,.93); --v5-voile-bulle:rgba(255,255,255,.93);
  --v5-sur-accent:#FFFFFF;
  --v5-verre-sous:var(--v5-bulle);
  --v5-nav-voile:none;
  --v5-nav:#FFFFFF; --v5-nav-fond-actif:#E2F0E8;
  --v5-nav-encre:#4A4A52; --v5-nav-encre-2:#75757F;
  --v5-nav-actif:#0E6B44; --v5-nav-fil:#E0E0DB;

  /* 19/09/2026 — palette de réserve : le succès y garde la couleur qu'elle donnait à « vert ». */
  --v5-succes:var(--v5-vert); --v5-succes-2:var(--v5-vert-2); --v5-succes-encre:var(--v5-vert-encre); --v5-succes-sol:var(--v5-vert-sol); --v5-succes-txt:var(--v5-vert-txt); --v5-succes-doux:var(--v5-vert-doux); --v5-succes-fil:var(--v5-vert-fil);
}

/* ——————————————————— ENCRE, conservée ———————————————————
   `<body class="hv5 encre">` et tout repasse en noir neutre.

   🚨 Ce que le noir a coûté, pour mémoire : premiers essais à #1D1D20 / #282830,
   fond→bulle tombait à 1,18 quand le bleu nuit tenait 1,34. Le rapport de contraste écrase
   les écarts près du noir (le terme +0,05 de la formule domine) : un écart visible sur un
   bleu à 8 % de luminance disparaît à 0,3 %. Les deux bulles ont dû remonter de deux crans. */
body.hv5.encre {
  --v5-fond:#0A0A0B;
  --v5-fond-image:none;
  --v5-bulle:#27272B;
  --v5-bulle-2:#33333B;
  --v5-bulle-bord:transparent;
  --v5-bulle-2-bord:transparent;
  --v5-filet:#45454F;
  --v5-filet-2:#4E4E5A;
  --v5-verre:none;
  --v5-verre-2:none;
  --v5-verre-bord:transparent;
  --v5-verre-ombre:none;

  --v5-encre:#FAFAFA;
  --v5-encre-2:#C9C9CF;
  --v5-encre-3:#9D9DA7;
  --v5-encre-4:#8B8B95;

  --v5-vert:#7DE3B0; --v5-vert-2:#5BC894; --v5-vert-encre:#062015; --v5-vert-sol:#10291F;
  --v5-vert-txt:#7DE3B0; --v5-vert-doux:#63A88A; --v5-vert-fil:#2A6B4C;
  --v5-ambre:#E8B15C; --v5-ambre-sol:#2A2113; --v5-ambre-encre:#2A1D07; --v5-ambre-fil:#5A4A22;
  --v5-rouge:#F87171; --v5-rouge-sol:#2A1518; --v5-rouge-doux:#FCA5A5; --v5-rouge-encre:#2A0D0F;
  --v5-rouge-fil:#5A2A2E;
  --v5-neutre-sol:#232329;
  --v5-violet:#C4B5FD; --v5-ciel:#7DD3FC; --v5-rose:#F9A8D4;
  --v5-survol:#3C3C46;
  --v5-voile:rgba(10,10,11,.93); --v5-voile-bulle:rgba(39,39,43,.93);
  --v5-nav:#141416; --v5-nav-fond-actif:#26262A;
  --v5-nav-encre:rgba(250,250,250,.62); --v5-nav-encre-2:rgba(250,250,250,.40);
  --v5-nav-actif:#FAFAFA; --v5-nav-fil:rgba(255,255,255,.07);
  --v5-sur-accent:#0A0A0B;
  --v5-verre-sous:var(--v5-bulle);
  --v5-nav-voile:linear-gradient(180deg,rgba(255,255,255,.035),rgba(255,255,255,0));

  /* 19/09/2026 — palette de réserve : le succès y garde la couleur qu'elle donnait à « vert ». */
  --v5-succes:var(--v5-vert); --v5-succes-2:var(--v5-vert-2); --v5-succes-encre:var(--v5-vert-encre); --v5-succes-sol:var(--v5-vert-sol); --v5-succes-txt:var(--v5-vert-txt); --v5-succes-doux:var(--v5-vert-doux); --v5-succes-fil:var(--v5-vert-fil);
}


/* ——————————————————— ENCRE, conservée entière ——————————————————— */

/* La bulle porte son filet — transparent en Encre, visible en Papier. Une seule règle
   pour les deux palettes : c'est le jeton qui décide, pas un thème dans le CSS. */
/* (la bulle porte desormais le traitement verre, defini avec la palette) */


/* Space Grotesk seulement là où il porte : un titre d'écran, un constat en
 * grand. Le corps de texte reste dans la police système — elle se lit mieux
 * sur un paragraphe et ne coûte pas un chargement. */
body.hv5 .hv5-titre{
  font-family:"Sora",-apple-system,BlinkMacSystemFont,system-ui,sans-serif;
  font-weight:600; letter-spacing:-.035em; color:var(--v5-encre); margin:0;
  font-size:30px; line-height:1.1;
}
@media(max-width:620px){ body.hv5 .hv5-titre{font-size:24px} }
body.hv5 .hv5-sstitre{ font-size:14px; color:var(--v5-encre-3); margin:5px 0 0 }

/* ═══════════════════════════════════════════════════════════════════════
 * LA PASTILLE — l'objet qui porte la couleur, et le seul.
 * ═══════════════════════════════════════════════════════════════════════ */
body.hv5 .hv5-past{
  display:inline-flex; align-items:center; gap:8px; white-space:nowrap;
  font-size:11px; letter-spacing:.13em; font-weight:700;
  border-radius:999px; padding:4px 12px 4px 8px;
}
body.hv5 .hv5-past::before{
  content:""; width:6px; height:6px; border-radius:50%;
  background:currentColor; flex:0 0 auto;
}
body.hv5 .hv5-past.mal{ background:var(--v5-rouge-sol); color:var(--v5-rouge) }

/* 🆕 13/09 — « SEULE » : LA PASTILLE QUI NE DIT RIEN QUE LES AUTRES NE DISENT DEJA.
   Christophe, sur « À faire » : « là on voit plus ce qui ne va pas que le titre, c'est pas
   possible ». Le libellé était identique sur les quinze cartes — donc porteur d'aucune
   information — et c'était l'objet le plus fort de l'écran, pendant que le titre, seule
   chose qui varie d'une carte à l'autre, reculait.
   On garde la couleur (elle distingue encore « à corriger » de « c'est réglé ») et on retire
   les mots. Les mots restent dans le code, masqués à l'œil : une personne qui ne perçoit pas
   la couleur ne doit pas perdre l'information avec elle. */
body.hv5 .hv5-past.seule{
  padding:0; gap:0; background:transparent !important;
  width:7px; height:7px; min-width:7px; border-radius:999px; vertical-align:middle;
}
body.hv5 .hv5-past.seule::before{ width:7px; height:7px }
/* Le point vit SUR la ligne du titre : une pastille seule sur son étage coûtait une quinzaine
   de pixels par carte, sur un écran qu'on a déjà resserré deux fois à sa demande. */
body.hv5 .hv5-b-titre > .hv5-past.seule{ display:inline-flex; margin-right:9px; position:relative; top:-1px }
body.hv5 .hv5-past.seule i{
  position:absolute; width:1px; height:1px; margin:-1px; padding:0;
  overflow:hidden; clip-path:inset(50%); white-space:nowrap; border:0;
}
body.hv5 .hv5-past.auj{ background:var(--v5-ambre-sol); color:var(--v5-ambre) }
body.hv5 .hv5-past.prop{ background:var(--v5-vert-sol); color:var(--v5-vert-txt) }
body.hv5 .hv5-past.fait{ background:var(--v5-succes-sol); color:var(--v5-succes) }

/* ═══════════════════════════════════════════════════════════════════════
 * LA BULLE
 * ═══════════════════════════════════════════════════════════════════════ */
body.hv5 .hv5-bulles{ display:flex; flex-direction:column; gap:12px }
body.hv5 .hv5-bulle{ background:var(--v5-bulle); border-radius:var(--v5-r); padding:20px 24px }
@media(max-width:620px){ body.hv5 .hv5-bulle{padding:16px 16px; border-radius:14px} }

body.hv5 .hv5-b-tete{ display:flex; align-items:center; gap:12px; flex-wrap:wrap; margin-bottom:13px }
body.hv5 .hv5-b-tete .num{
  margin-left:auto; font-size:12px; font-weight:700;
  color:var(--v5-encre-4); font-variant-numeric:tabular-nums;
}
body.hv5 .hv5-b-titre{
  font-size:19px; font-weight:600; line-height:1.35; letter-spacing:-.01em;
  /* 34ch cassait « Ta présence dans Google sur tes questions cibles » en deux lignes
     alors que la carte en offre trois fois plus. Un titre coupé pour rien, c'est une
     ligne de hauteur perdue sur chacune des vingt-trois cartes. */
  margin:0; max-width:60ch; color:var(--v5-encre);
}
@media(max-width:620px){ body.hv5 .hv5-b-titre{font-size:16px} }
/* Desserré de 56ch à 92ch le 11/09 : sur un écran large, 56ch s'arrêtait au milieu et
   doublait la hauteur de chaque carte. On garde une limite — une ligne de 1400 px se
   lit mal — mais assez haute pour qu'elle ne se voie qu'en très grand. */
body.hv5 .hv5-b-sous{ font-size:14px; line-height:1.55; color:var(--v5-encre-3); margin:8px 0 0; max-width:92ch }

/* Le face-à-face : deux petites bulles DANS la grande. */
body.hv5 .hv5-duo{ display:grid; grid-template-columns:1fr 38px 1fr; align-items:stretch; margin-top:18px }
@media(max-width:760px){
  body.hv5 .hv5-duo{ grid-template-columns:1fr; gap:8px }
  body.hv5 .hv5-duo-fleche{ transform:rotate(90deg); justify-self:center }
}
body.hv5 .hv5-mini{
  background:var(--v5-bulle-2); border-radius:var(--v5-r-2); padding:16px 16px;
  min-width:0; display:flex; flex-direction:column; gap:8px;
}
body.hv5 .hv5-mini .txt{ font-size:14px; line-height:1.55; color:var(--v5-encre-2); margin:0; word-break:break-word }
body.hv5 .hv5-mini.neuve .txt{ color:var(--v5-vert-txt) }
body.hv5 .hv5-mini.neuve .txt.attendu{ color:var(--v5-encre-3) }
body.hv5 .hv5-mini .compte{ font-size:12px; color:var(--v5-encre-4); margin-top:auto }
body.hv5 .hv5-mini .compte a{ color:var(--v5-encre-4) }
body.hv5 .hv5-duo-fleche{ display:flex; align-items:center; justify-content:center; color:var(--v5-encre-4) }

/* « Ce que ça change » — une étiquette, une phrase. */
body.hv5 .hv5-change{
  display:flex; gap:12px; align-items:baseline; flex-wrap:wrap; margin-top:16px;
  font-size:13px; line-height:1.55; color:var(--v5-encre-3);
}
body.hv5 .hv5-change .cle{
  flex:0 0 auto; font-size:11px; letter-spacing:.1em; font-weight:700; color:var(--v5-encre-4);
}
body.hv5 .hv5-change .val{ flex:1 1 300px; min-width:0 }

/* Le pied : ce qu'on fait, le bouton, le gain. */
body.hv5 .hv5-b-pied{ margin-top:18px; padding-top:17px; box-shadow:inset 0 1px 0 var(--v5-filet) }
body.hv5 .hv5-b-faire{ font-size:14px; line-height:1.5; color:var(--v5-encre-2); margin:11px 0 0; max-width:92ch }
body.hv5 .hv5-b-agir{ display:flex; align-items:center; gap:16px; flex-wrap:wrap; margin-top:16px }

/* ——— le bouton : un seul plein par bulle ——— */
body.hv5 .hv5-btn{
  display:inline-flex; align-items:center; justify-content:center; gap:8px;
  background:var(--v5-encre); color:#FFFFFF;
  font-family:inherit; font-size:14px; font-weight:700; line-height:1;
  border:none; border-radius:999px; padding:12px 24px; cursor:pointer; text-decoration:none;
}
body.hv5 .hv5-btn:hover{ background:var(--v5-vert-2); color:var(--v5-vert-encre) }
body.hv5 .hv5-btn:focus-visible{ outline:2px solid var(--v5-encre); outline-offset:3px }
body.hv5 .hv5-btn .cout{ opacity:.58; font-weight:500 }
body.hv5 .hv5-btn.petit{ font-size:14px; padding:12px 20px }
body.hv5 .hv5-gain{ font-size:13px; color:var(--v5-succes) }
body.hv5 .hv5-lien{
  background:none; border:none; padding:0; cursor:pointer; text-decoration:none;
  font-family:inherit; font-size:13px; font-weight:600; color:var(--v5-encre-4);
}
body.hv5 .hv5-lien:hover{ color:var(--v5-encre-2) }

/* Une bulle EN ATTENTE : le même objet, en plus court, bouton à droite. */
body.hv5 .hv5-bulle.attente{ display:flex; align-items:center; gap:16px; flex-wrap:wrap; padding:20px 24px }
body.hv5 .hv5-bulle.attente .corps{ flex:1 1 260px; min-width:0 }
body.hv5 .hv5-bulle.attente .hv5-b-tete{ margin-bottom:9px }
body.hv5 .hv5-bulle.attente .hv5-b-titre{ font-size:16px; font-weight:550 }
body.hv5 .hv5-bulle.attente .hv5-b-sous{ margin-top:5px; font-size:13px }
body.hv5 .hv5-bulle.attente .hv5-btn{ flex:0 0 auto }
body.hv5 .hv5-bulle.done{ opacity:.5 }
body.hv5 .hv5-bulle.done .hv5-b-titre{ text-decoration:line-through; color:var(--v5-encre-3) }

/* ——— le tiroir technique : ce qui relève du code, et rien d'autre ———
 * Christophe : « voir le travail fait, c'est plus quand tu codes […] quand on
 * est sur la fiche Google, c'est dommage de ne pas avoir directement le truc ».
 * D'où la règle : une preuve VISUELLE s'affiche (le face-à-face ci-dessus),
 * un fichier à copier se replie (ici). */
body.hv5 details.hv5-tech{ margin-top:16px }
body.hv5 details.hv5-tech>summary{
  list-style:none; cursor:pointer; display:inline-flex; align-items:center; gap:8px;
  font-size:13px; font-weight:600; color:var(--v5-encre-4);
}
body.hv5 details.hv5-tech>summary::-webkit-details-marker{ display:none }
body.hv5 details.hv5-tech>summary:hover{ color:var(--v5-encre-2) }
body.hv5 details.hv5-tech>summary:focus-visible{ outline:2px solid var(--v5-vert); outline-offset:3px; border-radius:6px }
body.hv5 details.hv5-tech .chev{ transition:transform .15s }
body.hv5 details.hv5-tech[open] .chev{ transform:rotate(180deg) }
body.hv5 .hv5-tech-corps{ margin-top:13px }

/* Un fichier livrable, prêt à copier. */
body.hv5 .hv5-fichier{ background:var(--v5-bulle-2); border-radius:var(--v5-r-2); overflow:hidden; margin-top:12px }
body.hv5 .hv5-fichier-tete{
  display:flex; align-items:center; gap:12px; flex-wrap:wrap;
  padding:12px 16px; box-shadow:inset 0 -1px 0 var(--v5-filet);
}
body.hv5 .hv5-fichier-nom{ font-family:ui-monospace,SFMono-Regular,Menlo,monospace; font-size:12px; color:var(--v5-encre-2) }
body.hv5 .hv5-fichier-ou{ font-size:12px; color:var(--v5-encre-4) }
body.hv5 .hv5-fichier-corps{
  margin:0; padding:16px 16px; overflow-x:auto; max-height:260px; white-space:pre;
  font-family:ui-monospace,SFMono-Regular,Menlo,monospace; font-size:12px; line-height:1.7;
  color:var(--v5-encre-3);
}
body.hv5 .hv5-copier{
  margin-left:auto; background:transparent; border:1px solid var(--v5-vert-fil); color:var(--v5-vert-txt);
  font-family:inherit; font-size:12px; font-weight:700; border-radius:999px; padding:4px 12px; cursor:pointer;
}
body.hv5 .hv5-copier:hover{ background:var(--v5-vert-sol) }

/* ═══════════════════════════════════════════════════════════════════════
 * LE MODE « UNE PAR UNE » — une seule bulle, seule au milieu.
 *   Christophe : « l'affichage une par une, en plein écran. Quand tu dis,
 *   tiens, je veux faire juste une seule action. »
 * C'est la MÊME bulle, juste plus grande : un écran qui ne ressemblerait à
 * rien du reste serait un deuxième langage à apprendre.
 * ═══════════════════════════════════════════════════════════════════════ */
body.hv5 .hv5-focus{ display:none; min-height:100vh; flex-direction:column }
body.hv5.mode-focus .app{ display:none }
body.hv5.mode-focus .hv5-focus{ display:flex }
body.hv5 .hv5-f-haut{ display:flex; align-items:center; gap:20px; flex-wrap:wrap; padding:20px 40px }
@media(max-width:640px){ body.hv5 .hv5-f-haut{padding:16px 16px; gap:12px} }
body.hv5 .hv5-compteur{ margin-left:auto; display:flex; align-items:center; gap:12px; font-size:13px; color:var(--v5-encre-4) }
body.hv5 .hv5-jauge{ display:flex; gap:4px }
body.hv5 .hv5-jauge i{ display:block; width:24px; height:3px; border-radius:6px; background:var(--v5-filet) }
body.hv5 .hv5-jauge i.on{ background:var(--v5-encre) }
body.hv5 .hv5-f-corps{ flex-grow:1; display:flex; align-items:center; justify-content:center; padding:32px 40px }
@media(max-width:640px){ body.hv5 .hv5-f-corps{padding:24px 16px} }
body.hv5 .hv5-f-corps .hv5-bulle{ max-width:760px; width:100%; padding:28px 32px }
@media(max-width:620px){ body.hv5 .hv5-f-corps .hv5-bulle{padding:20px 16px} }
body.hv5 .hv5-f-corps .hv5-b-titre{
  font-family:"Sora",-apple-system,BlinkMacSystemFont,system-ui,sans-serif;
  font-weight:600; font-size:clamp(24px,4vw,34px); line-height:1.16; letter-spacing:-.03em; max-width:20ch;
}
body.hv5 .hv5-f-bas{
  padding:20px 40px; display:flex; align-items:center; gap:12px; flex-wrap:wrap;
  font-size:13px; color:var(--v5-encre-4); box-shadow:inset 0 1px 0 var(--v5-filet);
}
@media(max-width:640px){ body.hv5 .hv5-f-bas{padding:16px 16px} }
body.hv5 .hv5-f-bas .fin{ margin-left:auto }

/* ——— la bascule d'affichage ——— */
body.hv5 .hv5-bascule{ display:flex; gap:4px }
body.hv5 .hv5-bascule button{
  background:transparent; border:none; cursor:pointer; font-family:inherit;
  color:var(--v5-encre-4); font-size:13px; font-weight:600; border-radius:999px; padding:8px 16px;
}
body.hv5 .hv5-bascule button.on{ background:var(--v5-bulle); color:var(--v5-encre) }
body.hv5 .hv5-bascule button:hover{ color:var(--v5-encre-2) }
body.hv5 .hv5-bascule button:focus-visible{ outline:2px solid var(--v5-vert); outline-offset:2px }

/* ════════════════════════════════════════════════════════════════════════
 * LA BARRE HAPPY — toujours ouverte, en bas, au milieu.
 *   Christophe : « en bas de page au milieu toujours ouvert c'est la discussion
 *   happy pour qu'il puisse lui demander des conseils comme une vraie IA »
 * ════════════════════════════════════════════════════════════════════════ */
body.hv5 .hv5-happy{
  position:fixed; left:50%; transform:translateX(-50%); bottom:20px; z-index:8000;
  width:min(580px, calc(100vw - 32px));
  display:flex; align-items:center; gap:8px;
  background:rgba(19,28,66,.96); backdrop-filter:blur(12px);
  border-radius:999px; padding:4px 4px 4px 16px;
  box-shadow:0 20px 44px -20px rgba(0,0,0,.8);
}
body.hv5 .hv5-happy input{
  flex:1; min-width:0; background:none; border:none; outline:none;
  font-family:inherit; font-size:14px; color:var(--v5-encre);
}
body.hv5 .hv5-happy input::placeholder{ color:var(--v5-encre-4) }
body.hv5 .hv5-happy button{
  flex:0 0 auto; background:var(--v5-encre); color:#FFFFFF; border:none;
  border-radius:999px; width:38px; height:38px; cursor:pointer;
  display:flex; align-items:center; justify-content:center;
}
body.hv5 .hv5-happy button:hover{ background:var(--v5-vert-2) }
/* De l'air sous la dernière bulle, pour que la barre n'en recouvre jamais une. */
body.hv5 .hv5-fond-de-page{ height:104px }

body.hv5 .hv5-bilan{
  display:flex; align-items:center; gap:12px; margin-top:8px; padding:0 4px;
  font-size:13px; color:var(--v5-encre-4);
}

/* ═══════════════════════════════════════════════════════════════════════════
 * LE CHROME — LA BARRE DE GAUCHE ET LA COLONNE
 *
 * 2026-09-11, vu à l'écran : sur la page passée en V5, LES TITRES DES BULLES
 * ÉTAIENT INVISIBLES — marine sur marine. Christophe lisait « CE QUI NE VA PAS »
 * et le bouton, mais pas ce qui n'allait pas.
 *
 * Cause : trois feuilles anciennes habillent encore tout le back-office, et
 * elles imposent leurs couleurs en !important —
 *   modern.css         .main h2 { color: var(--m-ink) !important }
 *   espace-client.css  body.happia-fun .sidebar { background:#FAFAF8 !important }
 *   sidebar-render.js  une feuille injectée qui peint l'entrée active en vert clair
 *
 * Deux remèdes, dans cet ordre :
 *   1. une page V5 NE PORTE PLUS la classe happia-fun. Cela éteint d'un coup
 *      toutes les règles « body.happia-fun … » — sans décharger les feuilles,
 *      donc sans casser les bandeaux ni les écrans qui attendent leur tour.
 *   2. ce qui reste (modern.css vise aside.sidebar et .main h2 sans préfixe)
 *      est repris ici, nommément. Le !important n'est pas une facilité : il
 *      répond à un !important. La liste est EXHAUSTIVE et FERMÉE — le jour où
 *      modern.css disparaît, tout ce bloc disparaît avec.
 * ═══════════════════════════════════════════════════════════════════════════ */

/* Lues par la feuille que sidebar-render.js injecte : elle garde des valeurs de
 * repli pour les écrans encore en clair, et prend celles-ci sur une page V5. */
body.hv5{
  --sb-actif-fond:var(--v5-nav-fond-actif);
  --sb-actif-encre:var(--v5-nav-actif);
  --sb-actif-trait:var(--v5-vert);
}

body.hv5 aside.sidebar{ background:var(--sidebar-bg) !important; border-right:1px solid var(--v5-filet) !important }
body.hv5 aside.sidebar .brand img{ filter:brightness(0) invert(1) !important }
body.hv5 aside.sidebar nav a{ color:var(--v5-encre-3) !important; border-radius:10px !important; font-weight:500 !important }
body.hv5 aside.sidebar nav a:hover{ background:var(--v5-bulle) !important; color:var(--v5-encre) !important }
body.hv5 aside.sidebar nav a.active{ background:var(--sb-actif-fond) !important; color:var(--sb-actif-encre) !important; font-weight:600 !important }
body.hv5 aside.sidebar nav a svg{ stroke:currentColor !important }
body.hv5 aside.sidebar nav a.active svg{ stroke:var(--v5-vert) !important }
body.hv5 aside.sidebar .nav-label,
body.hv5 aside.sidebar .nav-group-toggle{ color:var(--v5-encre-4) !important }
body.hv5 aside.sidebar .nav-group-toggle:hover{ color:var(--v5-encre-3) !important }
body.hv5 aside.sidebar .footer{ border-top:1px solid var(--v5-filet) !important }
body.hv5 aside.sidebar .avatar{ background:var(--v5-encre) !important; color:#FFFFFF !important }
body.hv5 aside.sidebar .user-info .nm{ color:var(--v5-encre) !important }
body.hv5 aside.sidebar .user-info .em{ color:var(--v5-encre-4) !important }
body.hv5 aside.sidebar .logout{ color:var(--v5-encre-4) !important }
body.hv5 aside.sidebar .logout:hover{ color:var(--v5-encre) !important }
/* Les deux blocs que sidebar-render.js pose en styles en ligne écrivent déjà
 * color:inherit et des blancs translucides : ils suivent le fond sombre tout
 * seuls. On ne retouche que leur fond, trop pâle sur ce bleu. */
body.hv5 #sb-credits{ background:rgba(255,255,255,.07) !important }
body.hv5 #sb-whatsapp{ background:rgba(37,211,102,.14) !important }

/* La colonne. Même raison : modern.css impose taille ET couleur sur .main h1/h2/h3. */
body.hv5 .main h1,
body.hv5 .page-head h1{ color:var(--v5-encre) !important }
body.hv5 .page-head .sub{ color:var(--v5-encre-3) !important }
body.hv5 .a-sec-head{ color:var(--v5-encre) !important }
body.hv5 .a-sec .sec-count,
body.hv5 .a-sec .sec-chev{ color:var(--v5-encre-4) !important }

/* LE TITRE DE LA BULLE — c'est celui-ci qui était illisible. Il reste en <h2>
 * (c'est un titre, un lecteur d'écran doit le savoir), donc il tombe sous
 * « .main h2 » de modern.css : 16 px et encre marine, les deux forcés. */
body.hv5 .hv5-b-titre{
  color:var(--v5-encre) !important;
  font-size:19px !important;
  font-weight:600 !important;
  line-height:1.35 !important;
  letter-spacing:-.01em !important;
}
@media(max-width:620px){ body.hv5 .hv5-b-titre{ font-size:16px !important } }
body.hv5 .hv5-bulle.attente .hv5-b-titre{ font-size:16px !important; font-weight:550 !important; line-height:1.3 !important }
body.hv5 .hv5-f-corps .hv5-b-titre{
  font-family:"Sora",-apple-system,BlinkMacSystemFont,system-ui,sans-serif !important;
  font-size:clamp(24px,4vw,34px) !important;
  line-height:1.16 !important;
  letter-spacing:-.03em !important;
}
body.hv5 .hv5-bulle.done .hv5-b-titre{ color:var(--v5-encre-3) !important }

/* ——— UNE BULLE EN ATTENTE SE CLIQUE ———
 * Christophe, devant l'écran : « quand tu appuies sur une bande il ne se passe
 * rien ». Une bulle courte cache un face-à-face et un tiroir : elle doit donc
 * dire, sans un mot, qu'on peut l'ouvrir. Le curseur et le léger éclaircissement
 * au survol suffisent — un chevron de plus serait un objet de plus. */
body.hv5 .hv5-bulle.attente{ cursor:pointer; transition:background .15s }
body.hv5 .hv5-bulle.attente:hover{ background:var(--v5-survol) }
body.hv5 .hv5-bulle.attente:focus-visible{ outline:2px solid var(--v5-vert); outline-offset:3px }
/* Le bouton et les liens gardent leur propre curseur : ils font autre chose
 * que déplier, et le clic ne doit pas se confondre. */
body.hv5 .hv5-bulle.attente .hv5-btn{ cursor:pointer }
body.hv5 .hv5-bulle.ouverte{ cursor:default }

/* ═══════════════════════════════════════════════════════════════════════════
 * LE PONT — COMMENT TOUT LE BACK-OFFICE BASCULE SANS ÊTRE RÉÉCRIT
 *
 * 2026-09-11 — Christophe : « on refait tout le back office ».
 *
 * 23 écrans, chacun avec sa propre feuille en ligne écrite pour un fond blanc.
 * Les repeindre un par un, c'était des heures et autant d'occasions de laisser
 * du texte marine sur du marine, comme sur « À corriger ».
 *
 * Sauf qu'en les inventoriant, une chose saute aux yeux : DIX-NEUF DE CES
 * VINGT-TROIS ÉCRANS DÉCLARENT LA MÊME PALETTE — --bg, --surface, --surface-2,
 * --border, --ink, --ink-2, --ink-3, --brand… soit environ 1 300 usages.
 * Chacun l'écrit dans son propre :root.
 *
 * Alors on ne touche pas aux écrans : on redéfinit ces variables ICI, sur
 * body.hv5. Une déclaration sur <body> l'emporte sur celle de :root pour tout
 * ce qui est dans la page, et les 1 300 usages suivent d'un coup.
 *
 * Ce que le pont NE règle pas, ce sont les couleurs écrites en dur dans ces
 * feuilles — d'où la liste de surfaces blanches qui suit, relevée
 * automatiquement dans les 23 écrans. Elle est le prix de l'ancien code ; elle
 * rétrécira à mesure qu'on réécrira les écrans pour de bon.
 *
 * RIEN DE TOUT CELA NE S'APPLIQUE tant qu'un écran ne porte pas `hv5` sur son
 * <body>. On bascule donc écran par écran, et on peut revenir en arrière sur
 * un seul en retirant une classe.
 * ═══════════════════════════════════════════════════════════════════════════ */

body.hv5{
  /* Les fonds */
  --bg:var(--v5-fond);
  --surface:var(--v5-bulle);
  --surface-2:var(--v5-bulle-2);
  --sidebar-bg:var(--v5-nav);     /* 🆕 13/09 : la colonne passe JUSTE AU-DESSUS du fond,
                               plus en dessous — sur un noir neutre, descendre encore
                               donnait un trou noir sans limite lisible. */

  /* Les traits. Sur fond sombre un filet clair fait du bruit : on descend. */
  --border:var(--v5-filet);
  --border-strong:var(--v5-filet-2);
  --line:var(--v5-filet);

  /* L'encre. Inversée, en gardant les trois niveaux de gris que les écrans
     utilisent pour hiérarchiser — sinon tout revient au même ton. */
  --ink:var(--v5-encre);
  --ink-2:var(--v5-encre-2);
  --ink-3:var(--v5-encre-3);

  /* La marque. --brand servait de couleur de TEXTE sombre sur blanc : sur fond
     sombre il devient l'encre claire, sinon il disparaît dans le fond. */
  --brand:var(--v5-encre);
  --brand-2:var(--v5-vert);
  --brand-soft:var(--v5-vert-sol);
  --mint:var(--v5-vert);
  --mint-dark:var(--v5-vert-txt);
  --mint-text:var(--v5-vert-txt);
  --grad:linear-gradient(135deg,var(--v5-bulle) 0%,var(--v5-survol) 55%,var(--v5-vert) 100%);

  /* Les trois états. Les fonds pâles deviennent des fonds sourds, les encres
     montent en luminosité : un vert foncé sur un bleu nuit ne se lit pas. */
  --etat-ok:var(--v5-succes);   --etat-ok-bg:var(--v5-succes-sol);   --etat-ok-line:var(--v5-succes-fil);
  --etat-warn:var(--v5-encre-2);  --etat-warn-bg:var(--v5-neutre-sol);  --etat-warn-line:var(--v5-survol);
  --etat-bad:var(--v5-rouge-doux);  --etat-bad-bg:var(--v5-rouge-sol);  --etat-bad-line:var(--v5-rouge-fil);
  --ok:var(--v5-succes);   --ok-bg:var(--v5-succes-sol);   --ok-line:var(--v5-succes-fil);
  --warn:var(--v5-encre-2); --warn-bg:var(--v5-neutre-sol);
  --bad:var(--v5-rouge);  --bad-bg:var(--v5-rouge-sol);
  --sunny:var(--v5-ambre); --coral:var(--v5-rouge);

  /* 🆕 13/09 — TROIS JETONS QUI SERVAIENT DE FOND SANS ÊTRE DÉFINIS ICI.
   *
   * Christophe, sur « Mes réseaux » : sa bio Instagram était illisible. La règle disait
   * `background: var(--cream-2, #EFF1F6)` et `color: var(--ink)`. Le pont reprend bien
   * `--ink` (presque blanc) mais ignorait `--cream-2` : la règle tombait sur son repli, un
   * blanc cassé. Encre blanche sur fond blanc.
   *
   * 🚨 C'est la forme la plus sournoise du problème : la règle est correcte, la couleur de
   * repli est correcte pour le thème pour lequel elle a été écrite, et RIEN ne signale que le
   * jeton manque. C'est le repli qui trahit, jamais la règle. */
  --cream:var(--v5-bulle);
  --cream-2:var(--v5-bulle-2);
  --eb-bg:var(--v5-bulle-2);

  /* Les ombres ne servent à rien sur fond sombre : elles salissent. */
  /* 🆕 13/09 — lg et xl manquaient : deux ombres marine survivaient au pont, et une
     ombre bleue sur un fond noir ne creuse rien, elle salit. */
  --shadow-sm:none; --shadow-md:none; --shadow-lg:none; --shadow-xl:none;
}

/* ═══════════════════════════════════════════════════════════════════════════
 * LE PONT — LES COULEURS ÉCRITES EN DUR DANS L'ANCIEN CODE
 *
 * Relevé dans styles */

/*.css, scripts */

/*.js (feuilles injectées) et les <style>
 * des 31 écrans, en calculant la LUMINANCE : toute encre sous 0,22 est
 * éclaircie, tout fond au-dessus de 0,78 devient une bulle. Chercher des codes
 * couleur précis ne marchait pas — l'ancien code écrit vingt nuances de marine.
 *
 * L'analyseur DÉPLIE maintenant les blocs @media : il lisait « sélecteur {
 * corps } » à plat, et tout ce qui vivait dans une media query lui échappait.
 * .perf-card en faisait partie — d'où huit cartes restées blanches sur l'écran
 * Performance après le premier passage.
 *
 * Les contenants (body, main, aside, .app…) sont exclus : ce sont des fonds de
 * page, pas des cartes.
 * ═══════════════════════════════════════════════════════════════════════════ */

/* 🆕 13/09 — LES SURFACES TRANSLUCIDES, QUE L'ANALYSEUR NE POUVAIT PAS VOIR.
 * Il releve les couleurs en hexa et calcule leur luminance ; une surface ecrite en
 * `rgba(...)` lui est invisible. happia-fun.css sert aussi le site public, qui garde sa
 * palette creme : on la couvre ici plutot que de la modifier la-bas. */
body.hv5 .hf-topbar{ background:var(--v5-voile) !important }

/* les fonds clairs (423) */
body.hv5 #croise tr.toi,
body.hv5 #croise.pcard,
body.hv5 #haOverlay .box,
body.hv5 #m-photo-remove,
body.hv5 #m-photo-zone,
body.hv5 #perception .mini,
body.hv5 #perception .mq-row.moi,
body.hv5 #perception .mq-sent.bad,
body.hv5 #perception .mq-sent.good,
body.hv5 #perception .mq-sent.grey,
body.hv5 #perception .mq-sent.mid,
body.hv5 #perception .mq-you,
body.hv5 #perception .pcard,
body.hv5 #perception .pnote,
body.hv5 #perception .pnote.warn,
body.hv5 #perception tr.moi td,
body.hv5 #trash-bar,
body.hv5 .a-actor.happia,
body.hv5 .a-btn.agent,
body.hv5 .a-btn.agent:hover,
body.hv5 .a-btn.ok,
body.hv5 .a-btn.ok:hover,
body.hv5 .a-card,
body.hv5 .a-impact,
body.hv5 .a-impact .cav,
body.hv5 .a-impact .m,
body.hv5 .a-impactlvl,
body.hv5 .a-list .a-row:first-of-type .a-row-body,
body.hv5 .a-roi,
body.hv5 .a-row,
body.hv5 .a-row-sum:hover,
body.hv5 .a-sec-body .a-row:first-of-type .a-row-body,
body.hv5 .act.blog,
body.hv5 .act.facebook,
body.hv5 .act.google_posts,
body.hv5 .act.instagram,
body.hv5 .act.linkedin,
body.hv5 .act.tiktok,
body.hv5 .act:hover,
body.hv5 .action-card,
body.hv5 .alert-card,
body.hv5 .app .badge.done,
body.hv5 .app .badge.ok,
body.hv5 .app .badge.success,
body.hv5 .app .btn-ghost,
body.hv5 .app .btn-secondary,
body.hv5 .app .btn.ghost,
body.hv5 .app .pill.ok,
body.hv5 .app .status.ok,
body.hv5 .app aside.sidebar,
body.hv5 .app aside.sidebar nav a.active,
body.hv5 .app aside.sidebar nav a:hover:not(.active),
body.hv5 .arow select,
body.hv5 .askrow input,
body.hv5 .audit-block,
body.hv5 .audit-card,
body.hv5 .audit-draft-card,
body.hv5 .audit-list-item,
body.hv5 .audit-row,
body.hv5 .audit-section,
body.hv5 .avis-tag,
body.hv5 .b-ai,
body.hv5 .b-copy,
body.hv5 .b-reuse,
body.hv5 .back-link,
body.hv5 .badge-status.done,
body.hv5 .badge-status.scheduled,
body.hv5 .banner-warn,
body.hv5 .bench-card,
body.hv5 .bio-card,
body.hv5 .bo-card,
body.hv5 .bot-tile,
body.hv5 .bot-tile .t.ent,
body.hv5 .bot-tile .t.rep,
body.hv5 .btn-danger,
body.hv5 .btn-ghost,
body.hv5 .btn-mini,
body.hv5 .btn-refresh,
body.hv5 .btn-sec,
body.hv5 .btn-secondary,
body.hv5 .btn-secondary:hover,
body.hv5 .btn.btn-outline,
body.hv5 .btn.danger:hover,
body.hv5 .btn.ghost,
body.hv5 .cal-day,
body.hv5 .cal-recent-item,
body.hv5 .callout.advice,
body.hv5 .callout.clear,
body.hv5 .catalog-card,
body.hv5 .catalog-modal,
body.hv5 .catalog-plan-badge.lock,
body.hv5 .cc-badge.bad,
body.hv5 .cc-badge.good,
body.hv5 .cc-badge.grey,
body.hv5 .cc-row,
body.hv5 .ch-logo,
body.hv5 .channel,
body.hv5 .chapter,
body.hv5 .chart-card,
body.hv5 .chart-section,
body.hv5 .chat,
body.hv5 .chat-input,
body.hv5 .check-label.info,
body.hv5 .check-label.verify,
body.hv5 .cmt-card,
body.hv5 .cmt-me,
body.hv5 .cmt-per,
body.hv5 .cmt-rank.cmt-r1,
body.hv5 .cockpit-card,
body.hv5 .column,
body.hv5 .comp-card,
body.hv5 .comp-card.you,
body.hv5 .comp-card.you .comp-metric,
body.hv5 .comp-metric .delta.down,
body.hv5 .comp-metric .delta.flat,
body.hv5 .comp-metric .delta.up,
body.hv5 .competitor-card,
body.hv5 .composer,
body.hv5 .conn-hint.on,
body.hv5 .connector-card,
body.hv5 .conv-card,
body.hv5 .cop-bar,
body.hv5 .cop-sugg button,
body.hv5 .del-act,
body.hv5 .del-act.danger:hover,
body.hv5 .deliverable,
body.hv5 .demande-block,
body.hv5 .diff-btn,
body.hv5 .digest,
body.hv5 .draft-card,
body.hv5 .empty,
body.hv5 .empty-card,
body.hv5 .empty-state,
body.hv5 .eng,
body.hv5 .eng.multi,
body.hv5 .err,
body.hv5 .err-block,
body.hv5 .err-card,
body.hv5 .est-card,
body.hv5 .evolution-card,
body.hv5 .ex,
body.hv5 .ex:hover,
body.hv5 .exec-card,
body.hv5 .f-cta-outline,
body.hv5 .f-cta-outline:hover,
body.hv5 .factures-card,
body.hv5 .false,
body.hv5 .fbtn,
body.hv5 .fiche,
body.hv5 .field input,
body.hv5 .field select,
body.hv5 .filter-btn,
body.hv5 .finding,
body.hv5 .flash.ko,
body.hv5 .fld,
body.hv5 .form-card,
body.hv5 .fseg,
body.hv5 .fseg-btn.on,
body.hv5 .ftag,
body.hv5 .grid-stack > .grid-stack-item > .grid-stack-item-content,
body.hv5 .group-title.required .gt-badge,
body.hv5 .ha-adcard,
body.hv5 .ha-alert,
body.hv5 .ha-card,
body.hv5 .ha-chip,
body.hv5 .ha-chip.no,
body.hv5 .ha-field input,
body.hv5 .ha-field select,
body.hv5 .ha-field textarea,
body.hv5 .ha-intent,
body.hv5 .ha-tag,
body.hv5 .hag-actions button,
body.hv5 .hag-attach-chip,
body.hv5 .hag-attach-chip .thumb,
body.hv5 .hag-drawer,
body.hv5 .hag-fab .dot,
body.hv5 .hag-form,
body.hv5 .hag-form button.attach-btn,
body.hv5 .hag-form button.attach-btn:hover,
body.hv5 .hag-form button.mic-btn,
body.hv5 .hag-form button.mic-btn:hover,
body.hv5 .hag-form textarea,
body.hv5 .hag-form textarea:focus,
body.hv5 .hag-icon-btn:hover,
body.hv5 .hag-msg .tools,
body.hv5 .hag-msg.assistant,
body.hv5 .hag-msg.assistant code,
body.hv5 .hag-msg.assistant pre,
body.hv5 .hag-msgs,
body.hv5 .hag-preset-btn:hover,
body.hv5 .hag-status,
body.hv5 .hag-typing,
body.hv5 .happia-tour-arrow,
body.hv5 .happia-tour-tooltip,
body.hv5 .hc-act,
body.hv5 .hc-note,
body.hv5 .hc-rien,
body.hv5 .hero,
body.hv5 .hero .hero-pill,
body.hv5 .hero .pill,
body.hv5 .hf-banner,
body.hv5 .hf-btn-ghost,
body.hv5 .hf-card,
body.hv5 .hf-card-big,
body.hv5 .hf-card.hf-tint-lavender,
body.hv5 .hf-card.hf-tint-rose,
body.hv5 .hf-card.hf-tint-sunny,
body.hv5 .hf-hero .hf-badge,
body.hv5 .hf-midcta-card .hf-btn-white,
body.hv5 .hf-mobile-menu,
body.hv5 .hf-pill,
body.hv5 .hf-pill.hf-pill-lavender,
body.hv5 .hf-pill.hf-pill-rose,
body.hv5 .hf-pill.hf-pill-sunny,
body.hv5 .hf-topbar-row,
body.hv5 .hi-eng.cited,
body.hv5 .hi-eng.not,
body.hv5 .hi-eng.off,
body.hv5 .hi-score.none,
body.hv5 .hi-score.some,
body.hv5 .hint,
body.hv5 .hp-gate-modal,
body.hv5 .hp-gate-required,
body.hv5 .ia-block,
body.hv5 .ia-state.bad,
body.hv5 .ia-state.grey,
body.hv5 .ia-state.mid,
body.hv5 .ia-tile,
body.hv5 .info-band,
body.hv5 .insight-card,
body.hv5 .invoice-card,
body.hv5 .item-card,
body.hv5 .item-status.unanswered,
body.hv5 .kpi,
body.hv5 .kpi-card,
body.hv5 .kpi-card .delta.down,
body.hv5 .kpi-card .delta.flat,
body.hv5 .kpi-card .delta.up,
body.hv5 .kpi.alerte,
body.hv5 .lane.rep,
body.hv5 .level-card,
body.hv5 .lever-card,
body.hv5 .link-row .lr-remove,
body.hv5 .live-bio .lb-tag,
body.hv5 .loader,
body.hv5 .loading-card,
body.hv5 .loc-row.checked,
body.hv5 .loc-row:hover,
body.hv5 .logo-prev,
body.hv5 .mb-seg,
body.hv5 .mb-seg button.on,
body.hv5 .md .copy-block,
body.hv5 .media-card,
body.hv5 .message-card,
body.hv5 .metho-stat,
body.hv5 .metric-select button,
body.hv5 .modal,
body.hv5 .modal .box,
body.hv5 .modal-body input:focus,
body.hv5 .modal-body input[type="date"],
body.hv5 .modal-body input[type="text"],
body.hv5 .modal-body select,
body.hv5 .modal-body select:focus,
body.hv5 .modal-body textarea,
body.hv5 .modal-body textarea:focus,
body.hv5 .modal-card,
body.hv5 .modal-foot,
body.hv5 .modal-head,
body.hv5 .modal-overlay,
body.hv5 .mode-banner.template,
body.hv5 .msg .type-tag.recap,
body.hv5 .nap-table tr.divergent td,
body.hv5 .network-card,
body.hv5 .next-audit .ico,
body.hv5 .next-block,
body.hv5 .notif-modal,
body.hv5 .pack-card,
body.hv5 .page-head h1 .hl,
body.hv5 .partner-card,
body.hv5 .paywall,
body.hv5 .pci-dim,
body.hv5 .pci-lecture,
body.hv5 .pci-provisoire,
body.hv5 .perf-card,
body.hv5 .period-toggle button,
body.hv5 .pf-btn-ghost,
body.hv5 .pf-btn-white,
body.hv5 .pf-header,
body.hv5 .pf-nav-panel,
body.hv5 .photo-prev,
body.hv5 .placeholder-card,
body.hv5 .plan-locked,
body.hv5 .plat-chip,
body.hv5 .platform-card,
body.hv5 .platform-note,
body.hv5 .post-card,
body.hv5 .pri-basse,
body.hv5 .pri-haute,
body.hv5 .pri-moyenne,
body.hv5 .product-card,
body.hv5 .profile-card,
body.hv5 .progress-card,
body.hv5 .projection,
body.hv5 .proto-tag,
body.hv5 .quota-card,
body.hv5 .quota-card.over .bar-fill,
body.hv5 .quota-card.warn .bar-fill,
body.hv5 .range-tabs,
body.hv5 .range-tabs .range-tab.active,
body.hv5 .range-tabs button.active,
body.hv5 .reputation-card,
body.hv5 .reseau-card,
body.hv5 .retry-btn,
body.hv5 .review-card,
body.hv5 .row-gain,
body.hv5 .row-pts,
body.hv5 .rp-input,
body.hv5 .rp-input:focus,
body.hv5 .rp-ph .ico,
body.hv5 .rp-seg,
body.hv5 .rp-seg button.on,
body.hv5 .rp-textarea,
body.hv5 .rp-textarea:focus,
body.hv5 .rv-load .rv-bar,
body.hv5 .score-card,
body.hv5 .score-ring,
body.hv5 .section,
body.hv5 .section-card,
body.hv5 .section-nav a,
body.hv5 .selects select,
body.hv5 .sidebar nav a:hover,
body.hv5 .snap-cell.st-bad,
body.hv5 .snap-cell.st-ok,
body.hv5 .snap-cell.st-partial,
body.hv5 .snap-ring,
body.hv5 .snap-src-card,
body.hv5 .source-block,
body.hv5 .source-card,
body.hv5 .src-actions-box,
body.hv5 .src-actions-cta a,
body.hv5 .src-check .box,
body.hv5 .src-group,
body.hv5 .src-inscribe,
body.hv5 .src-row.is-on,
body.hv5 .src-row.is-on:hover,
body.hv5 .src-url,
body.hv5 .stat-pill.absent,
body.hv5 .stat-pill.bad,
body.hv5 .stat-pill.mute,
body.hv5 .stat-pill.ok,
body.hv5 .stat-pill.partial,
body.hv5 .status-generation,
body.hv5 .status-idee,
body.hv5 .status-publie,
body.hv5 .step-card,
body.hv5 .suggest-row .threat.faible,
body.hv5 .suggest-row .threat.fort,
body.hv5 .suggest-row .threat.moyen,
body.hv5 .suggest-row.checked,
body.hv5 .suggest-row.threat-hot:hover,
body.hv5 .suggest-row:hover,
body.hv5 .suggest-section,
body.hv5 .summary-card,
body.hv5 .sw-btn-ghost,
body.hv5 .sw-chip,
body.hv5 .sw-conn,
body.hv5 .sw-field input,
body.hv5 .sw-textarea,
body.hv5 .ta-wrap,
body.hv5 .test-block,
body.hv5 .tier,
body.hv5 .timeline-card,
body.hv5 .toast.err,
body.hv5 .toc a,
body.hv5 .toolbar .btn,
body.hv5 .toolbar .btn.ghost:hover,
body.hv5 .top-actions,
body.hv5 .topbar-row,
body.hv5 .trend-row,
body.hv5 .true,
body.hv5 .upgrade,
body.hv5 .urgency-block,
body.hv5 .v-cited,
body.hv5 .v-err,
body.hv5 .v-not,
body.hv5 .veille-cat.autre,
body.hv5 .veille-cat.cybersecurite,
body.hv5 .veille-cat.facturation,
body.hv5 .veille-cat.social,
body.hv5 .visi-cell,
body.hv5 .visi-empty,
body.hv5 .visi-mini,
body.hv5 .warning-card,
body.hv5 .widget,
body.hv5 .widget-remove-btn,
body.hv5 .widget.actions .w-icon,
body.hv5 .widget.avis .w-icon,
body.hv5 .widget.compte .w-icon,
body.hv5 .widget.reseaux .w-icon,
body.hv5 [class*="wg-card"],
body.hv5 body.happia-fun,
body.hv5 details.hist-item,
body.hv5 input.pub-img,
body.hv5 input[type="email"],
body.hv5 input[type="number"],
body.hv5 input[type="password"],
body.hv5 input[type="search"],
body.hv5 input[type="tel"],
body.hv5 input[type="text"],
body.hv5 input[type="url"],
body.hv5 pre,
body.hv5 select,
body.hv5 textarea,
body.hv5 textarea.bio-ta,
body.hv5 textarea.pub-ta,
body.hv5 tr.rouge td{ background:var(--v5-bulle) !important }

/* les encres sombres (295) */
body.hv5 #croise .psub,
body.hv5 #croise h2,
body.hv5 #haOverlay h2,
body.hv5 #haOverlay p,
body.hv5 #perception .ecart.neg,
body.hv5 #perception .legend,
body.hv5 #perception .mini + .val,
body.hv5 #perception .mq-bar .val,
body.hv5 #perception .mq-legend,
body.hv5 #perception .mq-more summary,
body.hv5 #perception .mq-name,
body.hv5 #perception .mq-rank,
body.hv5 #perception .mq-resume,
body.hv5 #perception .mq-sent.bad,
body.hv5 #perception .mq-sent.good,
body.hv5 #perception .mq-sent.mid,
body.hv5 #perception .mq-you,
body.hv5 #perception .pnote,
body.hv5 #perception .pnote.warn,
body.hv5 #perception .psub,
body.hv5 #perception th,
body.hv5 #trash-bar,
body.hv5 .a-actor.happia,
body.hv5 .a-btn.agent,
body.hv5 .a-btn.agent:hover,
body.hv5 .a-btn.ok,
body.hv5 .a-btn.ok:hover,
body.hv5 .a-impact,
body.hv5 .a-impact .cav,
body.hv5 .a-impact .m .l,
body.hv5 .a-impact .m.down .v,
body.hv5 .a-impact .m.flat .v,
body.hv5 .a-impactlvl,
body.hv5 .a-list .a-row:first-of-type .row-gain,
body.hv5 .a-list .a-row:first-of-type .row-num,
body.hv5 .a-roi,
body.hv5 .a-sec-body .a-row:first-of-type .row-gain,
body.hv5 .a-sec-body .a-row:first-of-type .row-num,
body.hv5 .a-urgency.asap,
body.hv5 .a-urgency.urgent,
body.hv5 .alert .alert-title,
body.hv5 .alert p,
body.hv5 .app .badge.done,
body.hv5 .app .badge.ok,
body.hv5 .app .badge.success,
body.hv5 .app .pill.ok,
body.hv5 .app .status.ok,
body.hv5 .app aside.sidebar .footer,
body.hv5 .app aside.sidebar .nav-label,
body.hv5 .app aside.sidebar .nav-label.admin,
body.hv5 .app aside.sidebar nav a,
body.hv5 .app aside.sidebar nav a.active,
body.hv5 .app aside.sidebar nav a:hover:not(.active),
body.hv5 .arow select.set-yes,
body.hv5 .arrow-down,
body.hv5 .arrow-up,
body.hv5 .audit-card .type-pill,
body.hv5 .avis-tag.good,
body.hv5 .avis-tag.warn,
body.hv5 .b-ai,
body.hv5 .badge-status.done,
body.hv5 .badge-status.scheduled,
body.hv5 .badge.warn,
body.hv5 .big-number,
body.hv5 .bot-tile .t.ent,
body.hv5 .bot-tile .t.rep,
body.hv5 .bot-tile.ent .em,
body.hv5 .bot-tile.rep .em,
body.hv5 .btn-ai,
body.hv5 .btn-danger,
body.hv5 .btn-ink,
body.hv5 .btn-mint,
body.hv5 .btn-primary,
body.hv5 .btn-product,
body.hv5 .btn-published,
body.hv5 .btn.add,
body.hv5 .btn.btn-copy,
body.hv5 .btn.danger,
body.hv5 .btn.ghost,
body.hv5 .canonical h3,
body.hv5 .catalog-plan-badge.lock,
body.hv5 .cc-badge.bad,
body.hv5 .cc-ia,
body.hv5 .ce-down,
body.hv5 .chart-card .delta.down,
body.hv5 .chart-card .delta.flat,
body.hv5 .chart-card .delta.up,
body.hv5 .check-label.info,
body.hv5 .check-label.verify,
body.hv5 .cmt-rank.cmt-r1,
body.hv5 .comp-metric .delta.down,
body.hv5 .comp-metric .delta.flat,
body.hv5 .comp-metric .delta.up,
body.hv5 .comp-metric.leader .val,
body.hv5 .conn-hint.on,
body.hv5 .cop-bar input,
body.hv5 .cop-hint,
body.hv5 .cop-sugg b,
body.hv5 .cop-sugg span,
body.hv5 .copilot .cop-sub,
body.hv5 .copilot h1,
body.hv5 .counter.over,
body.hv5 .del-act.danger,
body.hv5 .diff-btn.active,
body.hv5 .digest .lbl,
body.hv5 .digest ul,
body.hv5 .digest ul b,
body.hv5 .divergence-item .issue,
body.hv5 .divergence-item .issue b,
body.hv5 .divergence-item .src,
body.hv5 .donut-legend-row .muette,
body.hv5 .eng,
body.hv5 .eng.multi,
body.hv5 .err,
body.hv5 .err a,
body.hv5 .err-block,
body.hv5 .err-card h2,
body.hv5 .err-card p,
body.hv5 .f-cta-ink,
body.hv5 .false,
body.hv5 .fbtn.danger,
body.hv5 .field-tile.bad .val,
body.hv5 .field-tile.ok .val,
body.hv5 .field-tile.warn .val,
body.hv5 .filter-btn.active,
body.hv5 .flash.ko,
body.hv5 .freemium-banner .txt h3,
body.hv5 .freemium-banner .txt p,
body.hv5 .ftag,
body.hv5 .group-title.required .gt-badge,
body.hv5 .ha-adcard .cnt,
body.hv5 .ha-adcard .meta,
body.hv5 .ha-adcard .sp,
body.hv5 .ha-adcard .ti,
body.hv5 .ha-adcard .tx,
body.hv5 .ha-alert,
body.hv5 .ha-btn,
body.hv5 .ha-card h2,
body.hv5 .ha-chip,
body.hv5 .ha-chip.no,
body.hv5 .ha-field input,
body.hv5 .ha-field label,
body.hv5 .ha-field select,
body.hv5 .ha-field textarea,
body.hv5 .ha-head h1,
body.hv5 .ha-head p,
body.hv5 .ha-intent .c,
body.hv5 .ha-intent .q,
body.hv5 .ha-muted,
body.hv5 .ha-note,
body.hv5 .hag-actions button,
body.hv5 .hag-actions button svg,
body.hv5 .hag-attach-chip,
body.hv5 .hag-attach-chip .size,
body.hv5 .hag-drawer-head .ico-meta .name,
body.hv5 .hag-drawer-head h3,
body.hv5 .hag-form button.attach-btn,
body.hv5 .hag-form button.mic-btn,
body.hv5 .hag-form textarea,
body.hv5 .hag-icon-btn,
body.hv5 .hag-icon-btn:hover,
body.hv5 .hag-msg .tools,
body.hv5 .hag-msg.assistant,
body.hv5 .hag-preset-btn,
body.hv5 .hag-typing-label,
body.hv5 .happia-tour-progress,
body.hv5 .happia-tour-skip,
body.hv5 .happia-tour-skip:hover,
body.hv5 .happia-tour-tooltip,
body.hv5 .happia-tour-tooltip p,
body.hv5 .hc-act-1 .hc-num,
body.hv5 .heat.warm,
body.hv5 .hero .hero-pill,
body.hv5 .hero .pill,
body.hv5 .hero-meta .verdict,
body.hv5 .hero-meta .verdict.bad,
body.hv5 .hero-meta .verdict.ok,
body.hv5 .hf-btn-primary,
body.hv5 .hf-hero .hf-badge,
body.hv5 .hf-mobile-menu a,
body.hv5 .hf-pill,
body.hv5 .hi-eng.cited,
body.hv5 .hi-eng.not,
body.hv5 .hi-eng.off,
body.hv5 .hi-score.none,
body.hv5 .hi-score.some,
body.hv5 .hp-gate-btn-ghost,
body.hv5 .hp-gate-btn-ghost:hover,
body.hv5 .hp-gate-feature,
body.hv5 .hp-gate-msg,
body.hv5 .hp-gate-required,
body.hv5 .ia-state.bad,
body.hv5 .ia-state.good,
body.hv5 .ia-state.mid,
body.hv5 .info-band,
body.hv5 .info-banner,
body.hv5 .intro-banner,
body.hv5 .intro-banner b,
body.hv5 .item-status.unanswered,
body.hv5 .kpi-card .delta.down,
body.hv5 .kpi-card .delta.flat,
body.hv5 .kpi-card .delta.up,
body.hv5 .kpi-value,
body.hv5 .kpi.alerte .v,
body.hv5 .lane.rep .big,
body.hv5 .loading,
body.hv5 .modal .err,
body.hv5 .modal-body .hashtag,
body.hv5 .mode-banner,
body.hv5 .next-action .impact,
body.hv5 .next-action .urgency.asap,
body.hv5 .next-action .urgency.urgent,
body.hv5 .next-hint,
body.hv5 .no-agent .btn-up,
body.hv5 .no-agent h3,
body.hv5 .no-agent p,
body.hv5 .note.warn,
body.hv5 .notif-close-btn,
body.hv5 .page-sub,
body.hv5 .partner-cta,
body.hv5 .pci-hero-text .level-badge,
body.hv5 .pci-provisoire,
body.hv5 .pci-provisoire b,
body.hv5 .period-toggle button.active,
body.hv5 .pill.divergent-tag,
body.hv5 .plan-locked p,
body.hv5 .platform-note,
body.hv5 .preview-body .peyebrow,
body.hv5 .pri-basse,
body.hv5 .pri-haute,
body.hv5 .pri-moyenne,
body.hv5 .prog-gain .pg-val,
body.hv5 .projection,
body.hv5 .proto-tag,
body.hv5 .qia-ko,
body.hv5 .qia-l li.mienne,
body.hv5 .qia-l li.mienne .dom,
body.hv5 .qia-l li.mienne a,
body.hv5 .qia-ok,
body.hv5 .row-gain,
body.hv5 .row-pts,
body.hv5 .row-sub,
body.hv5 .rv-load h3,
body.hv5 .rv-load p,
body.hv5 .section-paywall .lock-txt,
body.hv5 .section-paywall .lock-txt b,
body.hv5 .slotfull a,
body.hv5 .snap-canon .lbl,
body.hv5 .src-discovered-pill,
body.hv5 .stat-pill.absent,
body.hv5 .stat-pill.bad,
body.hv5 .stat-pill.mute,
body.hv5 .stat-pill.ok,
body.hv5 .stat-pill.partial,
body.hv5 .stat-value,
body.hv5 .status-generation,
body.hv5 .status-mini.ok,
body.hv5 .status-pret,
body.hv5 .status-publie,
body.hv5 .status.live,
body.hv5 .steal.hot,
body.hv5 .steal.warm,
body.hv5 .subtitle,
body.hv5 .suggest-row .threat.faible,
body.hv5 .suggest-row .threat.fort,
body.hv5 .suggest-row .threat.moyen,
body.hv5 .true,
body.hv5 .v-cited,
body.hv5 .v-err,
body.hv5 .v-not,
body.hv5 .veille-cat.autre,
body.hv5 .veille-cat.cybersecurite,
body.hv5 .veille-cat.facturation,
body.hv5 .veille-cat.social,
body.hv5 .visi-empty,
body.hv5 .visi-mini,
body.hv5 .wg-action.asap .wg-action-urg,
body.hv5 .wg-empty-v4 .wg-empty-msg,
body.hv5 .wg-title,
body.hv5 .widget.actions .w-icon,
body.hv5 .widget.audits .w-icon,
body.hv5 .widget.avis .w-icon,
body.hv5 .widget.compte .w-icon,
body.hv5 .widget.reseaux .w-icon,
body.hv5 [class*="score-val"],
body.hv5 [class*="stat-num"],
body.hv5 a:not([href^="#"]):not([href^="javascript:"])::after,
body.hv5 details.info-repliee > summary,
body.hv5 h1 + p{ color:var(--v5-encre) !important }

/* ═══════════════════════════════════════════════════════════════════════════
 * LES RETOUCHES À LA MAIN
 * Le relevé automatique ne sait pas SUR QUOI un texte est posé. Tout ce qui
 * suit corrige ce qu'il ne pouvait pas voir — et chaque règle vient d'une
 * mesure faite dans le navigateur, pas d'une intuition.
 * ═══════════════════════════════════════════════════════════════════════════ */

/* Le fond de page. modern.css l'impose en clair ; sans ce !important, toute la
   colonne de Performance restait sur #F7F8FB et l'encre claire disparaissait. */
body.hv5{ background:var(--v5-fond) !important; color:var(--v5-encre) !important }

/* CE QUI EST POSÉ SUR DU VERT REPREND L'ENCRE FONCÉE.
   Le relevé éclaircit toute encre sombre — y compris celle, VOULUE, des boutons
   verts. Un bouton vert à texte blanc cassé, c'est 1,89 de contraste. */
body.hv5 .hv5-btn,
body.hv5 .btn.primary,
body.hv5 .a-btn.primary,
body.hv5 .filter-btn.active,
body.hv5 .diff-btn.active,
body.hv5 .period-toggle button.active,
body.hv5 .range-tabs button.active,
body.hv5 .metric-select button.on,
body.hv5 .hag-fab,
body.hv5 .hag-fab span,
body.hv5 aside.sidebar .avatar,
body.hv5 .hag-drawer-head .ico,
body.hv5 .nav .pill{ color:var(--v5-vert-encre) !important }
body.hv5 .hag-fab,
body.hv5 .metric-select button.on{ background:var(--v5-encre) !important }

body.hv5 .wg-empty-cta, body.hv5 .wg-action-imp, body.hv5 .hc-voir{ color:var(--v5-vert-txt) !important }
body.hv5 .hc-gain, body.hv5 .prog-gain .pg-val, body.hv5 .a-impact .m.up .v{ color:var(--v5-succes) !important }

/* La barre latérale donne son encre à ce qu'elle contient : les blocs WhatsApp
   et crédits sont posés en styles EN LIGNE, avec color:inherit. */
body.hv5 aside.sidebar{ color:var(--v5-encre-3) !important; background:var(--sidebar-bg) !important }
body.hv5 aside.sidebar b{ color:var(--v5-encre) !important }
body.hv5 aside.sidebar .nav-label,
body.hv5 aside.sidebar .nav-group-toggle{ color:var(--v5-encre-4) !important }

/* Le tiroir Happy pose son propre fond clair. */
body.hv5 .hag-drawer,
body.hv5 .hag-msgs,
body.hv5 .hag-drawer-head,
body.hv5 .hag-empty{ background:var(--v5-fond) !important }
body.hv5 .hag-msg.assistant{ background:var(--v5-bulle) !important; color:var(--v5-encre-2) !important }
body.hv5 .hag-drawer-head .status{ color:var(--v5-vert-txt) !important }

/* Les champs de saisie : le fond seul ne suffit pas, l'encre doit suivre. */
body.hv5 input,body.hv5 textarea,body.hv5 select{
  color:var(--v5-encre) !important; border-color:var(--v5-filet) !important;
}
body.hv5 input::placeholder,body.hv5 textarea::placeholder{ color:var(--v5-encre-4) !important }

/* Les tuiles d'action des widgets, restées claires sous leur texte vert. */
body.hv5 .wg-action,
body.hv5 .wg-actions-grid > a{ background:var(--v5-bulle-2) !important }

/* L'onglet de période actif doit rester REPÉRABLE. */
body.hv5 .range-tabs{ background:var(--v5-bulle-2) !important }
body.hv5 .range-tabs .range-tab.active,
body.hv5 .range-tabs button.active{ background:var(--v5-neutre-sol) !important }

body.hv5 .etat-ok, body.hv5 .ok, body.hv5 [class*="-ok"]{ color:var(--v5-succes-txt) !important }
body.hv5 .etat-bad,body.hv5 .bad,body.hv5 [class*="-bad"]{ color:var(--v5-rouge-doux) !important }

/* ── halo et payfit : les deux feuilles injectées par _worker.js ──────────
 * Elles étaient invisibles à mes relevés : aucune page ne les déclare, c'est
 * le worker qui les ajoute à la volée dans chaque <head>. Elles y sont posées
 * EN DERNIER — à dessein, pour gagner sur les styles en ligne — ce qui les
 * faisait aussi gagner sur la V5. Le worker injecte désormais la V5 après
 * elles ; il reste à reprendre ce qu'elles peignent en clair. */
body.hv5 .a-actor.happia,
body.hv5 .a-btn.agent,
body.hv5 .a-btn.agent:hover,
body.hv5 .a-btn.ok,
body.hv5 .a-btn.ok:hover,
body.hv5 .a-impact,
body.hv5 .a-impactlvl,
body.hv5 .a-roi,
body.hv5 .app .badge.done,
body.hv5 .app .badge.ok,
body.hv5 .app .badge.success,
body.hv5 .app .btn-ghost,
body.hv5 .app .btn-secondary,
body.hv5 .app .btn.ghost,
body.hv5 .app .pill.ok,
body.hv5 .app .status.ok,
body.hv5 .app aside.sidebar,
body.hv5 .app aside.sidebar nav a.active,
body.hv5 .app aside.sidebar nav a:hover:not(.active),
body.hv5 .banner-warn,
body.hv5 .hf-banner,
body.hv5 .hf-topbar-row,
body.hv5 .mode-banner.template,
body.hv5 .pf-btn-ghost,
body.hv5 .pf-btn-white,
body.hv5 .pf-header,
body.hv5 .pf-nav-panel,
body.hv5 .sidebar nav a:hover,
body.hv5 .topbar-row{ background:var(--v5-bulle) !important }
body.hv5 .a-actor.happia,
body.hv5 .a-btn.agent,
body.hv5 .a-btn.agent:hover,
body.hv5 .a-btn.ok,
body.hv5 .a-btn.ok:hover,
body.hv5 .a-impact,
body.hv5 .a-impactlvl,
body.hv5 .a-roi,
body.hv5 .app .badge.done,
body.hv5 .app .badge.ok,
body.hv5 .app .badge.success,
body.hv5 .app .pill.ok,
body.hv5 .app .status.ok,
body.hv5 .app aside.sidebar .footer,
body.hv5 .app aside.sidebar .nav-label,
body.hv5 .app aside.sidebar .nav-label.admin,
body.hv5 .app aside.sidebar nav a,
body.hv5 .app aside.sidebar nav a.active,
body.hv5 .app aside.sidebar nav a:hover:not(.active),
body.hv5 .btn-ai,
body.hv5 .btn-mint,
body.hv5 .btn-primary,
body.hv5 .hf-btn-primary{ color:var(--v5-encre) !important }
body.hv5 h1,body.hv5 h2,body.hv5 h3,body.hv5 h4,body.hv5 .h1,body.hv5 .h2,body.hv5 .h3{ color:var(--v5-encre) !important }
body.hv5 .hv5-b-titre{ color:var(--v5-encre) !important }
/* payfit redéfinit sa propre encre : on la bascule à la source, ce qui rattrape
   tout ce qui la lit sans qu'on ait à nommer chaque sélecteur. */
body.hv5{ --pf-ink:var(--v5-encre) !important; --pf-line:var(--v5-filet) !important; --pf-bg:var(--v5-fond) !important; --pf-card:var(--v5-bulle) !important }

/* ═══════════════════════════════════════════════════════════════════════════
 * LES JETONS DES FEUILLES ANCIENNES, BASCULÉS À LA SOURCE
 *
 * Mesuré : les huit cartes .perf-card restaient blanches malgré une règle V5
 * en !important. La coupable, trouvée en désactivant les feuilles une par une
 * dans le navigateur, est modern.css :
 *
 *   [class*="-card"]:not(.next-action):not(.del-head):not(.hf-card):not(.hf-card-big)
 *
 * Quatre :not() portent chacun la spécificité d'une classe : (0,5,0) contre
 * (0,2,1) pour « body.hv5 .perf-card ». Elle gagne, et aucun !important n'y
 * change rien — l'importance ne départage que les règles de même spécificité.
 *
 * Courir après chaque sélecteur serait sans fin. On retourne donc les JETONS
 * que ces feuilles lisent : une déclaration sur body.hv5 l'emporte sur leur
 * :root, et toutes leurs règles suivent d'un coup, quelle que soit leur
 * spécificité. C'est le même geste que pour les 19 palettes des écrans et
 * pour --pf-ink de payfit — et c'est le seul qui passe à l'échelle.
 * ═══════════════════════════════════════════════════════════════════════════ */
body.hv5{
  --m-cream:var(--v5-fond);
  --m-cream-2:var(--v5-bulle-2);
  --m-cream-3:var(--v5-bulle-2);
  --m-surface:var(--v5-bulle);
  --m-border:var(--v5-filet);
  --m-border-2:var(--v5-filet-2);
  --m-ink:var(--v5-encre);
  --m-ink-2:var(--v5-encre-2);
  --m-ink-3:var(--v5-encre-3);
  --m-mint:var(--v5-vert);
  --m-mint-dark:var(--v5-vert);
  --m-mint-soft:var(--v5-vert-sol);
  --m-sunny:var(--v5-vert);
  --m-sunny-soft:var(--v5-vert-sol);
  --m-coral:var(--v5-rouge);
  --m-coral-soft:var(--v5-rouge-sol);
  /* Sur fond sombre, une ombre portée ne creuse pas : elle salit. */
  --m-shadow-sm:none;
  --m-shadow-md:none;
}

/* ── les derniers, mesurés un par un ─────────────────────────────────────── */
/* Un texte posé sur le vert prend l'encre foncée — y compris quand il est
   écrit en blanc : blanc sur #4ADE80, c'est 1,74. */
body.hv5 [style*="4ADE80"] a,
body.hv5 [style*="19CE84"] a,
body.hv5 .hv5-btn a,
body.hv5 a.hv5-btn{ color:var(--v5-vert-encre) !important }
/* La pastille ronde de Happy : elle portait l'encre foncée sans son fond vert. */
body.hv5 .ico,
body.hv5 .hag-fab .ico{ background:var(--v5-encre) !important; color:#FFFFFF !important }
/* #0F6E56 : encore un vert pensé pour du blanc. */
body.hv5 .perf-doc-link{ color:var(--v5-vert-txt) !important }


body.hv5 .b-pub, body.hv5 .b-save, body.hv5 .btn-go, body.hv5 .btn-mint, body.hv5 .btn-pri, body.hv5 .btn-pri:hover, body.hv5 .btn-send, body.hv5 .btn.btn-mint, body.hv5 .btn.mint, body.hv5 .btn:hover:not(:disabled), body.hv5 .catalog-add-btn, body.hv5 .check-meta .cm-actor.happia, body.hv5 .cmt-per.on, body.hv5 .cop-bar button, body.hv5 .est-card .badge, body.hv5 .f-cta-mint, body.hv5 .freemium-banner .cta, body.hv5 .hag-drawer-head .ico, body.hv5 .hag-fab, body.hv5 .hag-form button.send-btn, body.hv5 .hf-btn-primary, body.hv5 .hf-btn-primary:hover, body.hv5 .hp-btn, body.hv5 .hp-gate-head, body.hv5 .item-av, body.hv5 .metric-select button.on, body.hv5 .msg.from-client .bubble, body.hv5 .partner-card.recommended .partner-cta, body.hv5 .quota-banner, body.hv5 .range-tabs button.on, body.hv5 .rp-cta, body.hv5 .section-paywall .lock-cta, body.hv5 .sidebar .avatar, body.hv5 .src-actions-cta a:hover, body.hv5 .sw-btn-primary, body.hv5 .sw-chip.on, body.hv5 .sw-conn .conn-btn, body.hv5 .upgrade a.cta, body.hv5 .veille-paywall .btn-cta, body.hv5 .wg-happy-form button, body.hv5 .wg-happy-me, body.hv5 .wg-lock-cta{ color:var(--v5-vert-encre) !important }
body.hv5 .hag-actions button.ok, body.hv5 .section-nav a.done .chk{ color:var(--v5-succes-encre) !important }
body.hv5 #perception .mq-you, body.hv5 .a-urgency.asap, body.hv5 .app aside.sidebar nav a.active, body.hv5 .arow select.set-yes, body.hv5 .audit-card .type-pill, body.hv5 .b-ai, body.hv5 .badge-status.scheduled, body.hv5 .bot-tile .t.rep, body.hv5 .bot-tile.rep .em, body.hv5 .btn-published, body.hv5 .catalog-plan-badge.lock, body.hv5 .ch-status.on, body.hv5 .cmt-rank.cmt-r1, body.hv5 .comp-metric.leader .val, body.hv5 .eng.multi, body.hv5 .freemium-banner .txt p, body.hv5 .ftag, body.hv5 .ha-adcard .cnt, body.hv5 .ha-chip, body.hv5 .hag-msg .tools, body.hv5 .hero-meta .verdict, body.hv5 .hf-hero .hf-badge, body.hv5 .hf-pill, body.hv5 .hi-score.some, body.hv5 .hp-gate-required, body.hv5 .info-banner, body.hv5 .lane.rep .big, body.hv5 .modal-body .hashtag, body.hv5 .mode-banner, body.hv5 .next-action .impact, body.hv5 .next-action .urgency.asap, body.hv5 .next-hint, body.hv5 .no-agent p, body.hv5 .pci-hero-text .level-badge, body.hv5 .preview-body .peyebrow, body.hv5 .pri-basse, body.hv5 .qia-l li.mienne, body.hv5 .qia-l li.mienne .dom, body.hv5 .qia-l li.mienne a, body.hv5 .row-pts, body.hv5 .saved-msg, body.hv5 .slotfull a, body.hv5 .snap-canon .lbl, body.hv5 .src-discovered-pill, body.hv5 .status-pret, body.hv5 .wg-action.asap .wg-action-urg, body.hv5 .widget.audits .w-icon, body.hv5 .widget.avis .w-icon, body.hv5 body.happia-fun .hero .hero-pill, body.hv5 body.happia-fun .hero .pill, body.hv5 body.happia-fun .pill, body.hv5 details.info-repliee > summary{ color:var(--v5-vert-txt) !important }
body.hv5 #perception .mq-sent.good, body.hv5 .app .badge.done, body.hv5 .app .badge.ok, body.hv5 .app .badge.success, body.hv5 .app .pill.ok, body.hv5 .app .status.ok, body.hv5 .arrow-up, body.hv5 .avis-tag.good, body.hv5 .cc-badge.good, body.hv5 .field-tile.ok .val, body.hv5 .hero-meta .verdict.ok, body.hv5 .hi-eng.cited, body.hv5 .ia-state.good, body.hv5 .qia-ok, body.hv5 .stat-pill.ok, body.hv5 .status-mini.ok, body.hv5 .v-cited, body.hv5 body.happia-fun .row-gain{ color:var(--v5-succes) !important }

/* Les repères sans classe à eux : un élément dont le style EN LIGNE porte un
   vert de marque en FOND — là, l'encre foncée est sûre. */
body.hv5 [style*="background:#4ADE80"],body.hv5 [style*="background:var(--v5-encre)"],
body.hv5 [style*="background:#22C08A"],body.hv5 [style*="background: #19CE84"]{
  background:var(--v5-encre) !important; color:#FFFFFF !important }
/* Les cartes d'avis restées claires sous leurs étoiles dorées. */
body.hv5 .rv-card,body.hv5 .rv-item,body.hv5 .rv-row,
body.hv5 .item-card,body.hv5 .lab,body.hv5 .b-wrap{ background:var(--v5-bulle) !important }

/* ── les boutons verts NOMMÉS, fond et encre posés ensemble ──────────────
   Pour ceux-là on ne devine pas : on déclare le fond vert ET l'encre foncée
   dans la même règle. Le couple ne peut plus se défaire, et aucune classe
   réutilisée ailleurs ne peut hériter de la moitié du réglage. */
body.hv5 .btn.primary,
body.hv5 .btn-primary,
body.hv5 .b-pub,
body.hv5 .b-save,
body.hv5 .a-btn.primary,
body.hv5 .hc-cta,
body.hv5 .send-btn,
body.hv5 .hag-form button.send-btn{
  background:var(--v5-encre) !important;
  color:#FFFFFF !important;
  border-color:var(--v5-vert) !important;
}
/* 🐛 17/09/2026 — Christophe, sur son tableau de bord : « regarde le bouton ». Le bouton
   « Corriger » de la première action était un rectangle bleu nuit VIDE.
   Mesuré : fond #0C1F4E, texte #0C1F4E. Bleu nuit sur bleu nuit.
   La cause n'est pas une couleur mal choisie, c'est une accumulation : .hc-cta apparaissait
   dans CINQ listes de sélecteurs de cette feuille, écrites à cinq moments différents pour
   cinq contextes différents. Quatre ne fixaient que la couleur du texte, sans savoir quel
   fond s'appliquerait, et la dernière de la feuille gagnait. Elle posait l'encre du texte
   sur fond clair, sur un bouton devenu sombre entre-temps.
   LA RÈGLE : un bouton déclare son fond ET son encre AU MÊME ENDROIT. Une règle qui ne
   change que la couleur du texte d'un bouton est un pari sur ce que fera une autre règle. */
body.hv5 .btn.primary *,
body.hv5 .b-pub *,
body.hv5 .b-save *,
body.hv5 .send-btn *,
body.hv5 .hag-form button.send-btn *{ color:var(--v5-vert-encre) !important }
/* La barre d'outils du tableau de bord : boutons neutres, encre claire. */
body.hv5 .toolbar .btn,
body.hv5 .toolbar .btn.ghost{ background:var(--v5-bulle-2) !important; color:var(--v5-encre) !important }

/* ── les derniers repérés au balayage ────────────────────────────────────── */
/* #0F6E56 posé sans classe à lui : un lien nu dans un gabarit. */
body.hv5 .wg-action-ttl,
body.hv5 .pc-cap,
body.hv5 .hc-actes a,
body.hv5 .wg-empty a,
body.hv5 .widget a{ color:var(--v5-vert-txt) !important }
/* Un lien EN BLANC posé sur le vert : c'est l'encre foncée qu'il lui faut. */
body.hv5 [style*="background:var(--mint"] a,
body.hv5 [style*="background:var(--brand-2"] a,
body.hv5 .pc-cta a,
body.hv5 .pc-cta{ color:var(--v5-vert-encre) !important }
/* Les cartes d'avis : il en restait en blanc sous les étoiles. */
body.hv5 .rvf,body.hv5 .rvf-card,body.hv5 .rv-block,
body.hv5 .sentiment-card,body.hv5 #reviewSentimentBlock,
body.hv5 #reviewSentimentBlock > div{ background:var(--v5-bulle) !important }
/* Le lien « → Profil Happia » avait pris l'encre des boutons verts alors qu'il
   est posé sur une bulle : il reprend l'encre claire. */
body.hv5 .perf-card a:not(.hv5-btn):not(.btn):not([class*="cta"]):not([style*="background"]){ color:var(--v5-vert-txt) !important }

/* ── LA DERNIÈRE CACHETTE : LES FEUILLES QUE LES PAGES S'INJECTENT ────────
 * Mon analyseur cherchait « textContent = ` … ` » dans scripts */

/*.js, mais pas
 * dans les <script> des pages elles-mêmes. C'est là que vivait .rv-stats, la
 * carte qui tenait les étoiles d'avis sur du blanc. */
body.hv5 .rv-goal,
body.hv5 .rv-goal.top,
body.hv5 .rv-stats,
body.hv5 .rvf-pill{ background:var(--v5-bulle) !important }
body.hv5 .rv-goal,
body.hv5 .rv-goal-note,
body.hv5 .rv-note b,
body.hv5 .rv-total,
body.hv5 .rv-total b,
body.hv5 .rvf-pill,
body.hv5 .rvf-pill.on{ color:var(--v5-encre) !important }

/* ── les trois derniers, nommément ───────────────────────────────────────── */
/* Le lien « Voir les 20 autres » du tableau de bord : #0F6E56 sur le fond. */
body.hv5 .hc-pied a{ color:var(--v5-vert-txt) !important }
/* Sur Performance, ce lien-ci porte son PROPRE fond vert en style en ligne :
   il est donc exclu de la règle qui éclaircit les liens de carte, sinon on
   écrit du vert sur du vert (rapport 1,0 — mesuré). */
body.hv5 .perf-card a[style*="background"]{ color:var(--v5-vert-encre) !important }

/* ── les quatre derniers, chacun pour une raison différente ──────────────── */
/* 1. Un filtre ACTIF avait perdu son fond vert : ma propre règle « les
      .filter-btn deviennent des bulles » est plus spécifique que la règle
      d'origine qui les peint en vert à l'état actif. Je repose le couple. */
body.hv5 .filter-btn.active,
body.hv5 .diff-btn.active{ background:var(--v5-neutre-sol) !important; color:var(--v5-encre) !important }

/* 2. Un lien sans couleur à lui, dans une bulle, doit se voir : vert.
      Sans !important — toute règle explicite reste prioritaire. */
body.hv5 .main a:not([class*="btn"]):not([class*="cta"]):not(.hv5-btn){ color:var(--v5-vert-txt) }

/* 3. Mes propres liens discrets prenaient le #0F6E56 d'une feuille ancienne. */
body.hv5 .hv5-lien{ color:var(--v5-encre-3) !important }
body.hv5 .hv5-lien:hover{ color:var(--v5-encre) !important }

/* 4. Une teinte verte TRANSPARENTE (#19CE8418 = vert à 9 %) n'est pas un fond
      vert : sur bleu nuit elle reste sombre. Le texte qu'elle porte garde donc
      le vert clair, pas l'encre foncée des boutons pleins. */
body.hv5 [style*="--brand-soft"]{ color:var(--v5-vert-txt) !important }

/* Même règle, spécificité relevée d'un cran (un type d'élément en plus).
   La version précédente était à égalité avec « [style*="19CE84"] » et je
   comptais sur l'ordre du fichier pour trancher — un départage trop fragile,
   qui n'a d'ailleurs pas tenu. Mieux vaut gagner par la spécificité que par
   la position. */
body.hv5 a[style*="--brand-soft"],
body.hv5 span[style*="--brand-soft"],
body.hv5 div[style*="--brand-soft"],
body.hv5 b[style*="--brand-soft"]{ color:var(--v5-vert-txt) !important }

/* ── CE QUI PORTE UN FOND VERT EN STYLE EN LIGNE ─────────────────────────
   Beaucoup de boutons déclarent « background:var(--brand-2);color:white ».
   Le vert de la V5 est clair : le blanc y tombe à 1,74. On force l'encre
   foncée sur l'élément LUI-MÊME, pas seulement sur ses descendants — c'est ce
   qui manquait à ma règle précédente. */
body.hv5 [style*="background:var(--brand-2"],
body.hv5 [style*="background: var(--brand-2"],
body.hv5 [style*="background:var(--mint"],
body.hv5 [style*="background: var(--mint"],
body.hv5 a[style*="background:var(--brand-2"],
body.hv5 button[style*="background:var(--brand-2"],
body.hv5 button[style*="background:var(--mint"]{ color:var(--v5-vert-encre) !important }
body.hv5 [style*="background:var(--v5-encre)"],
body.hv5 [style*="background:#4ADE80"]{
  background:var(--v5-encre) !important; color:#FFFFFF !important }
/* Les puces de ton, de période, de filtre : vertes à l'état actif. */
body.hv5 .tone-chip.on,
body.hv5 .cmt-per.on,
body.hv5 .seg.on,
body.hv5 [class*="chip"].on,
body.hv5 [class*="-per"].on{ background:var(--v5-neutre-sol) !important; color:var(--v5-encre) !important }

/* Les teintes vertes très claires (#E7FBF1, #EAF9F2, #ECFAF3, #EAF7F1) servaient
   de fond « succès » sur une page blanche. Sous une encre devenue claire, elles
   donnent 1,01. Elles prennent le fond de pastille verte de la fonte. */
body.hv5 [style*="#E7FBF1"],body.hv5 [style*="#EAF9F2"],body.hv5 [style*="#ECFAF3"],
body.hv5 [style*="#EAF7F1"],body.hv5 [style*="#e7fbf1"],body.hv5 [style*="#eaf9f2"]{
  background:var(--v5-vert-sol) !important;
}
body.hv5 [style*="#E7FBF1"] *,body.hv5 [style*="#EAF9F2"] *{ color:var(--v5-vert-txt) !important }
/* Les contrôles natifs (select, option) gardent le rendu du système : on les
   habille explicitement, sinon ils restent blancs quoi qu'on écrive. */
body.hv5 select,body.hv5 option{ background:var(--v5-bulle) !important; color:var(--v5-encre) !important }

body.hv5 #perception .mini.vis i, body.hv5 .a-card .a-btn.agent, body.hv5 .b-pub, body.hv5 .b-save, body.hv5 .bar-row .bar i, body.hv5 .btn-add, body.hv5 .btn-go, body.hv5 .btn-ink, body.hv5 .btn-mint, body.hv5 .btn-pri, body.hv5 .btn-pri:hover, body.hv5 .btn-primary, body.hv5 .btn-product, body.hv5 .btn-send, body.hv5 .btn.add, body.hv5 .btn.btn-copy, body.hv5 .btn.btn-mint, body.hv5 .btn.mint, body.hv5 .catalog-add-btn, body.hv5 .check-meta .cm-actor.happia, body.hv5 .cmt-per.on, body.hv5 .cop-bar button, body.hv5 .diff-btn.active, body.hv5 .est-card .badge, body.hv5 .f-cta-ink, body.hv5 .f-cta-mint, body.hv5 .filter-btn.active, body.hv5 .freemium-banner .cta, body.hv5 .freemium-banner .cta:hover, body.hv5 .goal-chip::before, body.hv5 .ha-btn, body.hv5 .hag-drawer-head .ico, body.hv5 .hag-drawer-head .ico::after, body.hv5 .hag-fab, body.hv5 .hag-form button.send-btn, body.hv5 .hc-surl::after, body.hv5 .hf-accent, body.hv5 .hf-btn-primary, body.hv5 .hf-hero .hf-accent, body.hv5 .hf-hero .hf-badge .hf-dot, body.hv5 .hf-midcta-card, body.hv5 .hp-btn, body.hv5 .hp-gate-head, body.hv5 .ia-row .bar i, body.hv5 .item-av, body.hv5 .md .copy-block .cb-copy.copied, body.hv5 .metric-select button.on, body.hv5 .mini-bar i, body.hv5 .msg.from-client .bubble, body.hv5 .notif-close-btn, body.hv5 .partner-cta, body.hv5 .period-toggle button.active, body.hv5 .preview-topbar .dotr, body.hv5 .progress-bar .fill, body.hv5 .progress-fill, body.hv5 .progress-step .dot, body.hv5 .prop-bar i, body.hv5 .prop-legend .dot.mint, body.hv5 .quota-banner, body.hv5 .quota-card .bar-fill, body.hv5 .range-tabs button.on, body.hv5 .rp-cta, body.hv5 .rv-load .rv-bar span, body.hv5 .rvf-pill.on, body.hv5 .section-paywall .lock-cta, body.hv5 .section-paywall .lock-cta:hover, body.hv5 .sidebar .avatar, body.hv5 .src-actions-cta a:hover, body.hv5 .src-check input[type="checkbox"]:checked + .box, body.hv5 .sw-btn-primary, body.hv5 .sw-chip.on, body.hv5 .sw-conn .conn-btn, body.hv5 .toggle-pill.on .check, body.hv5 .upgrade a.cta, body.hv5 .veille-paywall .btn-cta, body.hv5 .wg-happy-form button, body.hv5 .wg-happy-me, body.hv5 .wg-lock-cta, body.hv5 body.happia-fun .wg-empty-v4 .wg-empty-cta:hover{ color:var(--v5-vert-encre) !important }
body.hv5 .hag-actions button.ok, body.hv5 .no-agent .btn-up, body.hv5 .section-nav a.done .chk, body.hv5 .sw-progress .seg.done, body.hv5 .toast.ok, body.hv5 body.happia-fun .a-list .a-row:first-of-type .row-gain, body.hv5 body.happia-fun .a-sec-body .a-row:first-of-type .row-gain{ color:var(--v5-succes-encre) !important }

/* ── les jetons « soft » : des fonds pâles lus 100 fois ──────────────────
   --brand-soft (64 usages), --mint-soft (26), --coral-soft, --sunny-soft :
   des teintes pâles faites pour une page blanche. Une seule d'entre elles
   oubliée, et c'est une carte entière qui reste claire sous une encre claire
   (.comp-metric.leader sur Mes concurrents : rapport 1,01). */
body.hv5{
  --mint-soft:var(--v5-vert-sol);
  --coral-soft:var(--v5-rouge-sol);
  --sunny-soft:var(--v5-ambre-sol);
  --m-mint-soft:var(--v5-vert-sol);
}
body.hv5 .comp-metric.leader .val,
body.hv5 [style*="mint-soft"] *,
body.hv5 .comp-metric.leader .lbl{ color:var(--v5-vert-txt) !important }
/* Les champs de saisie de Profil : « background:white » écrit en dur. */
body.hv5 .field input,
body.hv5 .field select,
body.hv5 .field textarea{ background:var(--v5-bulle) !important; color:var(--v5-encre) !important }

/* ── LES DEUX DERNIERS ────────────────────────────────────────────────────
   1. Sur Profil, les cases de catégorie (« Restaurant / Bar », « Hôtel /
      Camping »…) sont des <label> à fond blanc : dix-sept étiquettes de texte
      clair posées dessus. Ce sont des cases à cocher présentées en cartes —
      elles prennent la bulle interne. */
body.hv5 .card label:has(input[type="checkbox"]),
body.hv5 .card label:has(input[type="radio"]),
body.hv5 .field label[style*="display"]{
  background:var(--v5-bulle-2) !important;
  color:var(--v5-encre) !important;
  border-color:var(--v5-filet) !important;
}
/* 2. Sur Performance, ces petits liens portent un fond vert TRANSPARENT
      (--brand-soft, devenu sombre) : leur texte doit rester vert clair, pas
      prendre l'encre sur-vert des boutons pleins.
      Deux attributs plutôt qu'un : la règle des fonds verts, plus large, avait
      la même spécificité et l'emportait par sa position. On tranche par la
      spécificité — ça ne dépend plus de l'ordre du fichier. */
body.hv5 a[style*="background"][style*="brand-soft"],
body.hv5 span[style*="background"][style*="brand-soft"],
body.hv5 div[style*="background"][style*="brand-soft"]{ color:var(--v5-vert-txt) !important }

/* ── les quatre derniers de tout le back-office ──────────────────────────
   Tous le même défaut, vu depuis quatre écrans : l'encre sur-vert donnée à un
   élément qui n'est pas sur du vert. Ces classes-là sont nommées à la main,
   avec l'état qui les rend vraiment vertes. */
body.hv5 .periode button.active,
body.hv5 .period-toggle .active,
body.hv5 .evo-periode .active{ background:var(--v5-neutre-sol) !important; color:var(--v5-encre) !important }
body.hv5 .coach-stat .label,
body.hv5 .coach-stat .value{ color:var(--v5-encre) !important }
body.hv5 .btn-attach{ color:var(--v5-encre) !important; border-color:var(--v5-filet) !important }

/* Les variantes vertes de ces classes génériques, fond ET encre ensemble. */
body.hv5 .btn.add,
body.hv5 .btn.primary,
body.hv5 .btn.vert,
body.hv5 .b.b-pub,
body.hv5 .b.b-save{ background:var(--v5-encre) !important; color:#FFFFFF !important }
body.hv5 .btn.add *,
body.hv5 .btn.primary *{ background:transparent !important; color:inherit !important }
/* Et leurs variantes neutres : bulle interne, encre claire. */
body.hv5 .btn,body.hv5 .card,body.hv5 .chip,body.hv5 .tag,body.hv5 .pill{
  background:var(--v5-bulle) !important; color:var(--v5-encre) !important;
}
body.hv5 .btn.add{ background:var(--v5-encre) !important }
body.hv5 .btn.primary{ background:var(--v6-corail) !important }

/* ═══════════════════════════════════════════════════════════════════════════
 * L'ÉTAT SÉLECTIONNÉ — FOND ET ENCRE, ENSEMBLE, ET SEULEMENT SUR UN CONTRÔLE
 *
 * Première version : « [class*="tab"].active ». Elle attrapait .tab-pane.active
 * — le PANNEAU visible, pas une pastille — et peignait tout son contenu en vert
 * foncé. Mes avis est passé de 2 défauts à 14. Un sélecteur par sous-chaîne ne
 * distingue pas un onglet de son panneau : c'est à moi de le faire.
 *
 * La règle ne vise donc plus que des ÉLÉMENTS DE CONTRÔLE — button, a, span, li,
 * label — et jamais un div. Un état sélectionné vit sur un bouton ou un lien ;
 * un div qui porte .active, c'est presque toujours un conteneur.
 * ═══════════════════════════════════════════════════════════════════════════ */
body.hv5 :is(button,a,span,li,label):is([class*="pill"],[class*="chip"],[class*="tag"],[class*="seg"],[class*="tab"],[class*="per"],[class*="btn"],[class*="filt"]):is(.on,.active){
  /* 🐛 18/09 soir, refonte V6 — CE CONTRÔLE NE DISAIT PLUS QU'IL ÉTAIT CHOISI.
     Le fond sélectionné était passé au clair (--v5-neutre-sol) sans que l'encre des
     ENFANTS suive : la règle d'à côté leur donnait --v5-vert-encre, c'est-à-dire du blanc,
     juste quand le fond était vert. Résultat mesuré sur les écrans réels : « 6 mois » sur
     Évolution et « Toutes urgences » sur Mes actions sortaient à 1,06 de contraste, blanc
     sur presque blanc. Personne ne pouvait dire quel filtre était choisi, et le défaut est
     antérieur à cette refonte : 1,06 avant, 1,06 après.
     Un état choisi se dit maintenant par un aplat d'encre, comme les onglets de la
     maquette, et ses enfants HÉRITENT au lieu de recevoir une couleur à eux. */
  background:var(--v5-encre) !important;
  color:var(--v5-sur-accent) !important;
  border-color:var(--v5-encre) !important;
}
body.hv5 :is(button,a,span,li,label):is([class*="pill"],[class*="chip"],[class*="tag"],[class*="seg"],[class*="tab"],[class*="per"],[class*="btn"],[class*="filt"]):is(.on,.active) *{
  color:inherit !important;
}

/* ── UNE PASTILLE DANS UN CONTRÔLE VERT ──────────────────────────────────
   Le compteur « 0 » de l'onglet actif de Mes avis porte SON PROPRE fond —
   --mint-soft, devenu vert sombre — et recevait l'encre sur-vert de son
   parent. Sombre sur sombre : 1,04.
   Une pastille posée sur un contrôle vert ne peut pas garder un fond pensé
   pour du blanc : elle prend un voile foncé translucide, qui la détache du
   vert sans quitter la famille de couleur. */
body.hv5 :is(button,a,span,li,label):is([class*="pill"],[class*="chip"],[class*="tag"],[class*="seg"],[class*="tab"],[class*="per"],[class*="btn"],[class*="filt"]):is(.on,.active)
  :is([class*="count"],[class*="badge"],[class*="num"],[class*="pastille"]){
  background:rgba(6,40,15,.20) !important;
  color:var(--v5-vert-encre) !important;
  border-color:transparent !important;
}

/* ── LES DÉGRADÉS CLAIRS ─────────────────────────────────────────────────
   Dernière famille, et le dernier angle mort du relevé : il lisait les fonds
   UNIS (« background:#FFF8E0 ») et passait à côté des DÉGRADÉS
   (« background:linear-gradient(135deg,#FFF8E0,#FFE498) »). Le bandeau
   d'intro de Partenaires en portait un, doré et très clair, sous une encre
   devenue claire : rapport 1,03.
   Relevé en calculant la luminance de chaque arrêt du dégradé — huit blocs
   dans tout le back-office. Ils prennent une bulle unie : un dégradé pâle
   n'a plus de sens sur un fond sombre, il ne ferait qu'un halo sale. */
body.hv5 .intro-banner,
body.hv5 .freemium-banner,
body.hv5 .no-agent,
body.hv5 .rp-hint,
body.hv5 .section-paywall,
body.hv5 .est-card.active,
body.hv5 .skel{
  background:var(--v5-bulle) !important;
  background-image:none !important;
  border-color:var(--v5-filet) !important;
  color:var(--v5-encre-2) !important;
}
body.hv5 .intro-banner b,
body.hv5 .freemium-banner b,
body.hv5 .no-agent b,
body.hv5 .section-paywall b{ color:var(--v5-encre) !important }
/* L'en-tête du tiroir Happy garde son dégradé : il est vert, donc il reste
   dans la fonte — on lui remet seulement l'encre sur-vert. */
body.hv5 .hag-drawer-head{ background-image:none !important; background:var(--v5-fond) !important }

/* ═══════════════════════════════════════════════════════════════════════════
 * LE DERNIER ANGLE MORT : LE CSS RANGÉ DANS UNE VARIABLE
 *
 * Mon extracteur cherchait « textContent = ` … ` ». Or bloc-perception-ia.js
 * et onglets-presence.js écrivent « const CSS = ` … ` » puis, plus loin,
 * « style.textContent = CSS ». Deux fichiers — et sept écrans restés habillés
 * pour un fond blanc : Tester dans les IA en comptait 38.
 *
 * Il lit maintenant TOUS les gabarits d'un fichier et garde ceux qui
 * ressemblent à du CSS. On ne cherche plus une écriture, on cherche du CSS.
 * ═══════════════════════════════════════════════════════════════════════════ */
body.hv5 #croise tr.toi,
body.hv5 #croise.pcard,
body.hv5 #haOverlay .box,
body.hv5 #m-photo-remove,
body.hv5 #m-photo-zone,
body.hv5 #perception .mini,
body.hv5 #perception .mq-row.moi,
body.hv5 #perception .mq-sent.bad,
body.hv5 #perception .mq-sent.good,
body.hv5 #perception .mq-sent.grey,
body.hv5 #perception .mq-sent.mid,
body.hv5 #perception .mq-you,
body.hv5 #perception .pcard,
body.hv5 #perception .pnote,
body.hv5 #perception .pnote.warn,
body.hv5 #perception tr.moi td,
body.hv5 #trash-bar,
body.hv5 .a-card,
body.hv5 .a-impact,
body.hv5 .a-impact .cav,
body.hv5 .a-impact .m,
body.hv5 .a-row,
body.hv5 .a-row-sum:hover,
body.hv5 .act.blog,
body.hv5 .act.facebook,
body.hv5 .act.google_posts,
body.hv5 .act.instagram,
body.hv5 .act.linkedin,
body.hv5 .act.tiktok,
body.hv5 .act:hover,
body.hv5 .arow select,
body.hv5 .askrow input,
body.hv5 .audit-card,
body.hv5 .avis-tag,
body.hv5 .b-ai,
body.hv5 .b-copy,
body.hv5 .b-reuse,
body.hv5 .back-link,
body.hv5 .badge-status.done,
body.hv5 .badge-status.scheduled,
body.hv5 .bot-tile,
body.hv5 .bot-tile .t.ent,
body.hv5 .bot-tile .t.rep,
body.hv5 .btn-danger,
body.hv5 .btn-ghost,
body.hv5 .btn-mini,
body.hv5 .btn-refresh,
body.hv5 .btn-sec,
body.hv5 .btn-secondary,
body.hv5 .btn-secondary:hover,
body.hv5 .btn.btn-outline,
body.hv5 .btn.danger:hover,
body.hv5 .btn.ghost,
body.hv5 .cal-day,
body.hv5 .cal-recent-item,
body.hv5 .callout.advice,
body.hv5 .callout.clear,
body.hv5 .catalog-card,
body.hv5 .catalog-modal,
body.hv5 .catalog-plan-badge.lock,
body.hv5 .cc-badge.bad,
body.hv5 .cc-badge.good,
body.hv5 .cc-badge.grey,
body.hv5 .cc-row,
body.hv5 .ch-logo,
body.hv5 .channel,
body.hv5 .chapter,
body.hv5 .chart-card,
body.hv5 .chart-section,
body.hv5 .chat,
body.hv5 .chat-input,
body.hv5 .check-label.info,
body.hv5 .check-label.verify,
body.hv5 .cmt-card,
body.hv5 .cmt-me,
body.hv5 .cmt-per,
body.hv5 .cmt-rank.cmt-r1,
body.hv5 .col,
body.hv5 .column,
body.hv5 .comp-card,
body.hv5 .comp-card.you,
body.hv5 .comp-card.you .comp-metric,
body.hv5 .comp-metric .delta.down,
body.hv5 .comp-metric .delta.flat,
body.hv5 .comp-metric .delta.up,
body.hv5 .composer,
body.hv5 .conn-hint.on,
body.hv5 .cop-bar,
body.hv5 .cop-sugg button,
body.hv5 .del-act,
body.hv5 .del-act.danger:hover,
body.hv5 .deliverable,
body.hv5 .diff-btn,
body.hv5 .digest,
body.hv5 .empty,
body.hv5 .empty-state,
body.hv5 .eng,
body.hv5 .eng.multi,
body.hv5 .err,
body.hv5 .err-block,
body.hv5 .err-card,
body.hv5 .est-card,
body.hv5 .ex,
body.hv5 .ex:hover,
body.hv5 .exec-card,
body.hv5 .f-cta-outline,
body.hv5 .f-cta-outline:hover,
body.hv5 .false,
body.hv5 .fbtn,
body.hv5 .fiche,
body.hv5 .field input,
body.hv5 .field select,
body.hv5 .filter-btn,
body.hv5 .finding,
body.hv5 .flash.ko,
body.hv5 .fld,
body.hv5 .fseg,
body.hv5 .fseg-btn.on,
body.hv5 .ftag,
body.hv5 .grid-stack > .grid-stack-item > .grid-stack-item-content,
body.hv5 .group-title.required .gt-badge,
body.hv5 .ha-adcard,
body.hv5 .ha-alert,
body.hv5 .ha-card,
body.hv5 .ha-chip,
body.hv5 .ha-chip.no,
body.hv5 .ha-field input,
body.hv5 .ha-field select,
body.hv5 .ha-field textarea,
body.hv5 .ha-intent,
body.hv5 .ha-tag,
body.hv5 .hag-actions button,
body.hv5 .hag-attach-chip,
body.hv5 .hag-attach-chip .thumb,
body.hv5 .hag-drawer,
body.hv5 .hag-fab .dot,
body.hv5 .hag-form,
body.hv5 .hag-form button.attach-btn,
body.hv5 .hag-form button.attach-btn:hover,
body.hv5 .hag-form button.mic-btn,
body.hv5 .hag-form button.mic-btn:hover,
body.hv5 .hag-form textarea,
body.hv5 .hag-form textarea:focus,
body.hv5 .hag-icon-btn:hover,
body.hv5 .hag-msg .tools,
body.hv5 .hag-msg.assistant,
body.hv5 .hag-msg.assistant code,
body.hv5 .hag-msg.assistant pre,
body.hv5 .hag-msgs,
body.hv5 .hag-preset-btn:hover,
body.hv5 .hag-status,
body.hv5 .hag-typing,
body.hv5 .happy-head .av,
body.hv5 .happy-input,
body.hv5 .happy-m.h .bub,
body.hv5 .happy-msgs,
body.hv5 .happy-panel,
body.hv5 .happy-quick,
body.hv5 .happy-quick button,
body.hv5 .happy-redirect,
body.hv5 .hero,
body.hv5 .hi-eng.cited,
body.hv5 .hi-eng.not,
body.hv5 .hi-eng.off,
body.hv5 .hi-score.none,
body.hv5 .hi-score.some,
body.hv5 .hint,
body.hv5 .hpy-body,
body.hv5 .hpy-chip,
body.hv5 .hpy-chip:hover,
body.hv5 .hpy-foot,
body.hv5 .hpy-msg.bot,
body.hv5 .hpy-panel,
body.hv5 .hpy-sugg,
body.hv5 .ia-block,
body.hv5 .ia-raw-response::-webkit-scrollbar-thumb,
body.hv5 .ia-state.bad,
body.hv5 .ia-state.grey,
body.hv5 .ia-state.mid,
body.hv5 .ia-tile,
body.hv5 .info-band,
body.hv5 .item-card,
body.hv5 .item-status.unanswered,
body.hv5 .kpi,
body.hv5 .kpi-card,
body.hv5 .kpi-card .delta.down,
body.hv5 .kpi-card .delta.flat,
body.hv5 .kpi-card .delta.up,
body.hv5 .kpi.alerte,
body.hv5 .lane.rep,
body.hv5 .link-row .lr-remove,
body.hv5 .live-bio .lb-tag,
body.hv5 .loader,
body.hv5 .loading-card,
body.hv5 .loc-row.checked,
body.hv5 .loc-row:hover,
body.hv5 .logo-prev,
body.hv5 .mb-seg,
body.hv5 .mb-seg button.on,
body.hv5 .md .copy-block,
body.hv5 .metho-stat,
body.hv5 .metric-select button,
body.hv5 .modal,
body.hv5 .modal .box,
body.hv5 .modal-body input:focus,
body.hv5 .modal-body input[type="date"],
body.hv5 .modal-body input[type="text"],
body.hv5 .modal-body select,
body.hv5 .modal-body select:focus,
body.hv5 .modal-body textarea,
body.hv5 .modal-body textarea:focus,
body.hv5 .modal-foot,
body.hv5 .modal-head,
body.hv5 .modal-overlay,
body.hv5 .mode-banner.template,
body.hv5 .msg .type-tag.recap,
body.hv5 .nap-table tr.divergent td,
body.hv5 .next-audit .ico,
body.hv5 .note,
body.hv5 .notif-modal,
body.hv5 .page-head h1 .hl,
body.hv5 .partner-card,
body.hv5 .paywall,
body.hv5 .pci-dim,
body.hv5 .pci-lecture,
body.hv5 .pci-provisoire,
body.hv5 .perf-card,
body.hv5 .period-toggle button,
body.hv5 .photo-prev,
body.hv5 .placeholder-card,
body.hv5 .plat-chip,
body.hv5 .platform-note,
body.hv5 .post-card,
body.hv5 .pri-basse,
body.hv5 .pri-haute,
body.hv5 .pri-moyenne,
body.hv5 .progress-card,
body.hv5 .projection,
body.hv5 .proto-tag,
body.hv5 .quota-card,
body.hv5 .quota-card.over .bar-fill,
body.hv5 .quota-card.warn .bar-fill,
body.hv5 .range-tabs,
body.hv5 .retry-btn,
body.hv5 .row-pts,
body.hv5 .rp-input,
body.hv5 .rp-input:focus,
body.hv5 .rp-ph .ico,
body.hv5 .rp-seg,
body.hv5 .rp-seg button.on,
body.hv5 .rp-textarea,
body.hv5 .rp-textarea:focus,
body.hv5 .rv-goal,
body.hv5 .rv-goal.top,
body.hv5 .rv-load .rv-bar,
body.hv5 .rv-stats,
body.hv5 .rvf-pill,
body.hv5 .score-ring,
body.hv5 .section,
body.hv5 .section-card,
body.hv5 .section-nav a,
body.hv5 .selects select,
body.hv5 .snap-cell.st-bad,
body.hv5 .snap-cell.st-ok,
body.hv5 .snap-cell.st-partial,
body.hv5 .snap-ring,
body.hv5 .snap-src-card,
body.hv5 .source-block,
body.hv5 .src-actions-box,
body.hv5 .src-actions-cta a,
body.hv5 .src-check .box,
body.hv5 .src-group,
body.hv5 .src-inscribe,
body.hv5 .src-row.is-on,
body.hv5 .src-row.is-on:hover,
body.hv5 .src-url,
body.hv5 .stat-pill.absent,
body.hv5 .stat-pill.bad,
body.hv5 .stat-pill.mute,
body.hv5 .stat-pill.ok,
body.hv5 .stat-pill.partial,
body.hv5 .status-generation,
body.hv5 .status-idee,
body.hv5 .status-publie,
body.hv5 .suggest-row .threat.faible,
body.hv5 .suggest-row .threat.fort,
body.hv5 .suggest-row .threat.moyen,
body.hv5 .suggest-row.checked,
body.hv5 .suggest-row.threat-hot:hover,
body.hv5 .suggest-row:hover,
body.hv5 .suggest-section,
body.hv5 .sw-btn-ghost,
body.hv5 .sw-chip,
body.hv5 .sw-conn,
body.hv5 .sw-field input,
body.hv5 .sw-textarea,
body.hv5 .ta-wrap,
body.hv5 .tier,
body.hv5 .toast.err,
body.hv5 .toc a,
body.hv5 .toolbar .btn,
body.hv5 .toolbar .btn.ghost:hover,
body.hv5 .top-actions,
body.hv5 .trend-row,
body.hv5 .true,
body.hv5 .upgrade,
body.hv5 .v-cited,
body.hv5 .v-err,
body.hv5 .v-not,
body.hv5 .veille-cat.autre,
body.hv5 .veille-cat.cybersecurite,
body.hv5 .veille-cat.facturation,
body.hv5 .veille-cat.social,
body.hv5 .visi-cell,
body.hv5 .visi-empty,
body.hv5 .visi-mini,
/* 🚨 12/09 — CE SÉLECTEUR A TUÉ 324 AUTRES RÈGLES PENDANT DES SEMAINES.
   Il portait une balise HTML ouvrante collée devant « .cmt-card » : le générateur
   qui ramasse les sélecteurs des pages avait avalé la balise et l'avait recopiée.
   En CSS, UN sélecteur invalide dans une liste séparée par des virgules invalide
   LA RÈGLE ENTIÈRE. Les 324 corrections de fond qui suivent n'ont donc jamais été
   appliquées — sans une erreur, sans un avertissement, et aucun balayage de
   contraste écrit sur `color` ne pouvait le voir : c'est le FOND qui restait clair.
   Christophe, 12/09, sur trafic-ia : « là y'a un problème de visibilité ». */
body.hv5 .cmt-card,
body.hv5 details.hist-item,
body.hv5 input.pub-img,
body.hv5 mark.mk,
body.hv5 pre,
body.hv5 textarea.bio-ta,
body.hv5 textarea.pub-ta,
body.hv5 tr.rouge td{ background:var(--v5-bulle) !important; background-image:none !important }
body.hv5 #croise .psub,
body.hv5 #croise h2,
body.hv5 #haOverlay h2,
body.hv5 #haOverlay p,
body.hv5 #perception .ecart.neg,
body.hv5 #perception .legend,
body.hv5 #perception .mini + .val,
body.hv5 #perception .mq-bar .val,
body.hv5 #perception .mq-legend,
body.hv5 #perception .mq-name,
body.hv5 #perception .mq-rank,
body.hv5 #perception .mq-resume,
body.hv5 #perception .mq-sent.bad,
body.hv5 #perception .mq-sent.mid,
body.hv5 #perception .pnote,
body.hv5 #perception .pnote.warn,
body.hv5 #perception .psub,
body.hv5 #perception th,
body.hv5 #trash-bar,
body.hv5 .a-impact .cav,
body.hv5 .a-impact .m .l,
body.hv5 .a-impact .m.down .v,
body.hv5 .a-impact .m.flat .v,
body.hv5 .alert .alert-title,
body.hv5 .alert p,
body.hv5 .arrow-down,
body.hv5 .avis-tag.warn,
body.hv5 .badge.warn,
body.hv5 .bot-tile .t.ent,
body.hv5 .bot-tile.ent .em,
body.hv5 .btn-danger,
body.hv5 .btn.danger,
body.hv5 .btn.ghost,
body.hv5 .cc-badge.bad,
body.hv5 .cc-ia,
body.hv5 .ce-down,
body.hv5 .chart-card .delta.down,
body.hv5 .chart-card .delta.flat,
body.hv5 .check-label.info,
body.hv5 .check-label.verify,
body.hv5 .comp-metric .delta.down,
body.hv5 .comp-metric .delta.flat,
body.hv5 .conn-hint.on,
body.hv5 .cop-bar input,
body.hv5 .cop-hint,
body.hv5 .cop-sugg b,
body.hv5 .cop-sugg span,
body.hv5 .copilot .cop-sub,
body.hv5 .copilot h1,
body.hv5 .counter.over,
body.hv5 .del-act.danger,
body.hv5 .digest .lbl,
body.hv5 .digest ul,
body.hv5 .digest ul b,
body.hv5 .divergence-item .issue,
body.hv5 .divergence-item .issue b,
body.hv5 .divergence-item .src,
body.hv5 .donut-legend-row .muette,
body.hv5 .eng,
body.hv5 .err,
body.hv5 .err a,
body.hv5 .err-block,
body.hv5 .err-card h2,
body.hv5 .err-card p,
body.hv5 .f-cta-ink,
body.hv5 .false,
body.hv5 .fbtn.danger,
body.hv5 .field-tile.bad .val,
body.hv5 .field-tile.warn .val,
body.hv5 .flash.ko,
body.hv5 .freemium-banner .txt h3,
body.hv5 .group-title.required .gt-badge,
body.hv5 .ha-adcard .meta,
body.hv5 .ha-adcard .sp,
body.hv5 .ha-adcard .ti,
body.hv5 .ha-adcard .tx,
body.hv5 .ha-alert,
body.hv5 .ha-btn,
body.hv5 .ha-card h2,
body.hv5 .ha-chip.no,
body.hv5 .ha-field input,
body.hv5 .ha-field label,
body.hv5 .ha-field select,
body.hv5 .ha-field textarea,
body.hv5 .ha-head h1,
body.hv5 .ha-head p,
body.hv5 .ha-intent .c,
body.hv5 .ha-intent .q,
body.hv5 .ha-muted,
body.hv5 .ha-note,
body.hv5 .hag-actions button,
body.hv5 .hag-actions button svg,
body.hv5 .hag-attach-chip,
body.hv5 .hag-attach-chip .size,
body.hv5 .hag-drawer-head .ico-meta .name,
body.hv5 .hag-drawer-head h3,
body.hv5 .hag-form button.attach-btn,
body.hv5 .hag-form button.mic-btn,
body.hv5 .hag-form textarea,
body.hv5 .hag-icon-btn,
body.hv5 .hag-icon-btn:hover,
body.hv5 .hag-msg.assistant,
body.hv5 .hag-preset-btn,
body.hv5 .hag-typing-label,
body.hv5 .happy-head .av,
body.hv5 .happy-input textarea,
body.hv5 .happy-m.h .bub,
body.hv5 .happy-panel,
body.hv5 .happy-quick button,
body.hv5 .happy-quick button:hover,
body.hv5 .happy-redirect,
body.hv5 .happy-redirect a,
body.hv5 .heat.warm,
body.hv5 .hero-meta .verdict.bad,
body.hv5 .hi-eng.not,
body.hv5 .hi-eng.off,
body.hv5 .hi-score.none,
body.hv5 .hpy-msg.bot,
body.hv5 .hpy-typing,
body.hv5 .ia-state.bad,
body.hv5 .ia-state.mid,
body.hv5 .info-band,
body.hv5 .intro-banner,
body.hv5 .intro-banner b,
body.hv5 .item-status.unanswered,
body.hv5 .kpi-card .delta.down,
body.hv5 .kpi-card .delta.flat,
body.hv5 .kpi.alerte .v,
body.hv5 .loading,
body.hv5 .modal .err,
body.hv5 .no-agent h3,
body.hv5 .note.warn,
body.hv5 .partner-cta,
body.hv5 .pci-provisoire,
body.hv5 .pci-provisoire b,
body.hv5 .pill.divergent-tag,
body.hv5 .plan-locked p,
body.hv5 .platform-note,
body.hv5 .pri-haute,
body.hv5 .pri-moyenne,
body.hv5 .projection,
body.hv5 .proto-tag,
body.hv5 .qia-ko,
body.hv5 .rv-goal,
body.hv5 .rv-goal-note,
body.hv5 .rv-load h3,
body.hv5 .rv-load p,
body.hv5 .rv-note b,
body.hv5 .rv-total,
body.hv5 .rv-total b,
body.hv5 .rvf-pill,
body.hv5 .section-paywall .lock-txt,
body.hv5 .section-paywall .lock-txt b,
body.hv5 .stat-pill.absent,
body.hv5 .stat-pill.bad,
body.hv5 .stat-pill.mute,
body.hv5 .stat-pill.partial,
body.hv5 .status-generation,
body.hv5 .status-publie,
body.hv5 .steal.hot,
body.hv5 .steal.warm,
body.hv5 .suggest-row .threat.faible,
body.hv5 .suggest-row .threat.fort,
body.hv5 .suggest-row .threat.moyen,
body.hv5 .v-err,
body.hv5 .v-not,
body.hv5 .veille-cat.autre,
body.hv5 .veille-cat.cybersecurite,
body.hv5 .veille-cat.facturation,
body.hv5 .veille-cat.social,
body.hv5 .visi-empty,
body.hv5 .visi-mini,
body.hv5 a:not([href^="#"]):not([href^="javascript:"])::after{ color:var(--v5-encre) !important }
body.hv5 #perception .mq-more summary, body.hv5 #perception .mq-you, body.hv5 .arow select.set-yes, body.hv5 .audit-card .type-pill, body.hv5 .b-ai, body.hv5 .badge-status.scheduled, body.hv5 .bot-tile .t.rep, body.hv5 .bot-tile.rep .em, body.hv5 .btn-ink, body.hv5 .btn-primary, body.hv5 .btn-product, body.hv5 .btn-published, body.hv5 .btn.add, body.hv5 .btn.btn-copy, body.hv5 .canonical h3, body.hv5 .catalog-plan-badge.lock, body.hv5 .ch-status.on, body.hv5 .cmt-rank.cmt-r1, body.hv5 .comp-metric.leader .val, body.hv5 .diff-btn.active, body.hv5 .eng.multi, body.hv5 .filter-btn.active, body.hv5 .freemium-banner .txt p, body.hv5 .ftag, body.hv5 .ha-adcard .cnt, body.hv5 .ha-chip, body.hv5 .hag-msg .tools, body.hv5 .hero-meta .verdict, body.hv5 .hi-score.some, body.hv5 .hpy-chip, body.hv5 .info-banner, body.hv5 .lane.rep .big, body.hv5 .modal-body .hashtag, body.hv5 .mode-banner, body.hv5 .next-hint, body.hv5 .no-agent p, body.hv5 .notif-close-btn, body.hv5 .pci-hero-text .level-badge, body.hv5 .period-toggle button.active, body.hv5 .preview-body .peyebrow, body.hv5 .pri-basse, body.hv5 .qia-l li.mienne, body.hv5 .qia-l li.mienne .dom, body.hv5 .qia-l li.mienne a, body.hv5 .row-pts, body.hv5 .rvf-pill.on, body.hv5 .saved-msg, body.hv5 .slotfull a, body.hv5 .snap-canon .lbl, body.hv5 .src-discovered-pill, body.hv5 .status-pret, body.hv5 .wg-action.asap .wg-action-urg, body.hv5 details.info-repliee > summary{ color:var(--v5-vert-txt) !important }
body.hv5 #perception .mq-sent.good, body.hv5 .arrow-up, body.hv5 .avis-tag.good, body.hv5 .badge-status.done, body.hv5 .cc-badge.good, body.hv5 .chart-card .delta.up, body.hv5 .comp-metric .delta.up, body.hv5 .field-tile.ok .val, body.hv5 .hero-meta .verdict.ok, body.hv5 .hi-eng.cited, body.hv5 .ia-state.good, body.hv5 .kpi-card .delta.up, body.hv5 .no-agent .btn-up, body.hv5 .qia-ok, body.hv5 .stat-pill.ok, body.hv5 .status-mini.ok, body.hv5 .status.live, body.hv5 .true, body.hv5 .v-cited{ color:var(--v5-succes) !important }
body.hv5 #perception .mini.vis i, body.hv5 $, body.hv5 .b-pub, body.hv5 .b-save, body.hv5 .bar-row .bar i, body.hv5 .btn-add, body.hv5 .btn-go, body.hv5 .btn-ink, body.hv5 .btn-mint, body.hv5 .btn-pri, body.hv5 .btn-pri:hover, body.hv5 .btn-primary, body.hv5 .btn-product, body.hv5 .btn-send, body.hv5 .btn.add, body.hv5 .btn.btn-copy, body.hv5 .btn.btn-mint, body.hv5 .btn.btn-mint:hover, body.hv5 .btn.mint, body.hv5 .btn.mint:hover, body.hv5 .btn:hover:not(:disabled), body.hv5 .catalog-add-btn, body.hv5 .check-meta .cm-actor.happia, body.hv5 .check-meta .cm-chain, body.hv5 .cmt-per.on, body.hv5 .comp-metric.leader, body.hv5 .cop-bar button, body.hv5 .cta-actions, body.hv5 .diff-btn.active, body.hv5 .est-card .badge, body.hv5 .f-cta-ink, body.hv5 .f-cta-mint, body.hv5 .filter-btn.active, body.hv5 .freemium-banner .cta, body.hv5 .freemium-banner .cta:hover, body.hv5 .ha-btn, body.hv5 .hag-drawer-head .ico, body.hv5 .hag-drawer-head .ico::after, body.hv5 .hag-fab, body.hv5 .hag-form button.send-btn, body.hv5 .happy-bubble, body.hv5 .happy-head, body.hv5 .happy-m.h .av, body.hv5 .hp-btn, body.hv5 .hpy-av, body.hv5 .hpy-msg.me, body.hv5 .hpy-send, body.hv5 .ia-row .bar i, body.hv5 .item-av, body.hv5 .md .copy-block .cb-copy.copied, body.hv5 .metric-select button.on, body.hv5 .mini-bar i, body.hv5 .msg.from-client .bubble, body.hv5 .notif-close-btn, body.hv5 .partner-card.recommended .partner-cta, body.hv5 .partner-card.recommended .partner-cta:hover, body.hv5 .partner-cta, body.hv5 .period-toggle button.active, body.hv5 .preview-topbar .dotr, body.hv5 .progress-bar .fill, body.hv5 .progress-fill, body.hv5 .progress-step .dot, body.hv5 .prop-bar i, body.hv5 .prop-legend .dot.mint, body.hv5 .quota-banner, body.hv5 .quota-card .bar-fill, body.hv5 .range-tabs button.on, body.hv5 .rp-cta, body.hv5 .rv-load .rv-bar span, body.hv5 .rvf-pill.on, body.hv5 .section-nav a:hover, body.hv5 .section-paywall .lock-cta, body.hv5 .section-paywall .lock-cta:hover, body.hv5 .sidebar .avatar, body.hv5 .src-actions-cta a:hover, body.hv5 .src-check input[type="checkbox"]:checked + .box, body.hv5 .sw-btn-primary, body.hv5 .sw-btn-primary:hover, body.hv5 .sw-chip.on, body.hv5 .sw-conn .conn-btn, body.hv5 .sw-conn .conn-btn:hover, body.hv5 .toggle-pill.on .check, body.hv5 .upgrade a.cta, body.hv5 .veille-cat, body.hv5 .veille-cat.ia, body.hv5 .veille-paywall, body.hv5 .veille-paywall .btn-cta, body.hv5 .wg-happy-form button, body.hv5 .wg-happy-me, body.hv5 .wg-lock-cta, body.hv5 .why{ color:var(--v5-vert-encre) !important }
body.hv5 .hag-actions button.ok, body.hv5 .no-agent .btn-up, body.hv5 .section-nav a.done .chk, body.hv5 .status-mini.ok, body.hv5 .status.live, body.hv5 .sw-progress .seg.done, body.hv5 .toast.ok{ color:var(--v5-succes-encre) !important }

/* ═══════════════════════════════════════════════════════════════════════════
 * LES FONDS PASTEL — NI CLAIRS, NI SOMBRES
 *
 * Dernière famille, et la plus sournoise : les pastilles de catégorie de la
 * Veille (#B8A6FF, un lilas), les bandeaux d'état, les jetons de couleur.
 * Leur luminance tourne autour de 0,5 : trop sombre pour mon seuil « fond
 * clair » (0,72), trop clair pour le seuil « encre sombre » (0,22). Elles
 * traversaient donc les deux relevés sans être vues, et recevaient l'encre
 * claire du thème : 1,94 de contraste.
 *
 * Un pastel garde sa couleur — c'est elle qui porte le sens — mais il exige
 * une encre FONCÉE, sur fond sombre comme sur fond clair. C'est la seule
 * famille où le thème ne change rien : le contraste se joue avec le pastel,
 * pas avec la page.
 * ═══════════════════════════════════════════════════════════════════════════ */
body.hv5 #perception .mini.poids i,
body.hv5 .b-save,
body.hv5 .btn-add:hover,
body.hv5 .cop-bar button,
body.hv5 .ha-btn,
body.hv5 .ha-tag .dot,
body.hv5 .hag-attach-chip .remove:hover,
body.hv5 .hag-drawer-head .ico::after,
body.hv5 .hag-form button.send-btn:disabled,
body.hv5 .hag-typing span,
body.hv5 .happy-bubble .pulse,
body.hv5 .happy-m .typing span,
body.hv5 .hc-surl::after,
body.hv5 .hpy-av,
body.hv5 .hpy-msg.me,
body.hv5 .hpy-send,
body.hv5 .ia-logo.ppx,
body.hv5 .rv-load .rv-bar span,
body.hv5 body.happia-fun .a-list .a-row:first-of-type .row-gain,
body.hv5 body.happia-fun .a-sec-body .a-row:first-of-type .row-gain{ color:var(--v5-encre-sur-clair) !important }

/* ── les derniers, nommément ─────────────────────────────────────────────── */
body.hv5 .qpm-barre{ background:var(--v5-bulle-2) !important }
body.hv5 .qpm-onglet{ background:transparent !important; color:var(--v5-encre-3) !important }
body.hv5 .qpm-onglet.actif{ background:var(--v5-neutre-sol) !important; color:var(--v5-encre) !important }
body.hv5 .bpi-tampon,body.hv5 .bpi-tete,body.hv5 .bpi-num{ color:var(--v5-encre-3) !important }
body.hv5 .preset{ background:var(--v5-bulle-2) !important; color:var(--v5-encre-2) !important }
body.hv5 .f-cta-ink{ background:var(--v5-encre) !important; color:#FFFFFF !important }
body.hv5 .f-cta-outline{ background:transparent !important; color:var(--v5-vert-txt) !important; border:1px solid var(--v5-filet) !important }
/* Un lien sans couleur déclarée prend le bleu du navigateur — illisible ici. */
body.hv5 a:not([class]){ color:var(--v5-vert-txt) }

/* ── LES QUATRE DERNIERS DU BACK-OFFICE ──────────────────────────────────
   1. Les pastilles de catégorie de la Veille portent chacune un modificateur
      (.eaa lilas, .rgpd rouge, …) qui pose SA couleur après la règle de base.
      Le modificateur gagne : il faut donc viser le couple, pas la classe. */
/* 2. Un chapitre du bloc « Qui parle de moi » et un bouton de Tester dans les
      IA : deux fonds blancs isolés, qui n'ont pas de classe commune avec le
      reste et qu'aucune famille ne rattrape. */
/* 13/09 — le chapitre n'est plus une carte : c'est la page. Le module dit lui-meme ses
   couleurs en jetons V5, le pont n'a plus rien a rattraper. Ce !important-ci etait ce qui
   peignait en gris un rectangle de 2199 px de haut. */
body.hv5 .bpi-chapitre{ color:var(--v5-encre-2) !important }
body.hv5 button[style*="border:1px solid var(--border"]{ background:var(--v5-bulle-2) !important; color:var(--v5-encre) !important }

/* ── LES PASTILLES DE CATÉGORIE DE LA VEILLE ─────────────────────────────
   Huit catégories, huit fonds pastel pensés pour une page blanche. Une partie
   est passée au sombre avec la bascule des jetons (--coral-soft, --mint-soft),
   l'autre est restée pastel (--lavender). Résultat : deux moitiés qui
   demandaient l'inverse l'une de l'autre.
   On tranche : le fond devient la bulle interne pour toutes, et c'est le TEXTE
   qui porte la couleur de catégorie. On garde l'information, on gagne le
   contraste, et il n'y a plus qu'une règle au lieu de huit exceptions. */
body.hv5 [class*="veille-cat"]{
  background:var(--v5-bulle-2) !important;
  color:var(--v5-encre-2) !important;
  border:1px solid var(--v5-filet) !important;
}
body.hv5 .veille-cat.eaa{ color:var(--v5-violet) !important }
body.hv5 .veille-cat.rgpd,
body.hv5 .veille-cat.cybersecurite{ color:var(--v5-rouge) !important }
body.hv5 .veille-cat.fiscalite{ color:var(--v5-ambre) !important }
body.hv5 .veille-cat.ia{ color:var(--v5-vert-txt) !important }
body.hv5 .veille-cat.facturation{ color:var(--v5-ciel) !important }
body.hv5 .veille-cat.social{ color:var(--v5-rose) !important }
body.hv5 .veille-cat.autre{ color:var(--v5-encre-3) !important }
/* --lavender n'était mappé nulle part : il restait pastel là où tout le reste
   avait basculé. */
body.hv5{ --lavender:var(--v5-bulle-2) }

/* ════════════════════════════════════════════════════════════════════════════
 * LE « EN FACE » — la colonne d'actions posée À CÔTÉ des chiffres.
 *
 * Christophe : « On donne une information. Il faut qu'en face, on ait une action. »
 * Et, pour Search Console : « on garde la graphique, les info, mais on va ajouter
 * les actions à mener. » Donc : on n'enlève rien, on AJOUTE une colonne.
 *
 * À partir de 1180px, la carte de mesure devient deux colonnes : les chiffres
 * gardent toute leur largeur utile à gauche, les actions tiennent dans 336px à
 * droite. En dessous, elles passent SOUS les chiffres — sur un téléphone, « en
 * face » n'existe pas, « juste après » est la même promesse.
 *
 * Les bulles sont celles d'« À corriger » (.hv5-bulle), en plus petit : c'est le
 * même objet, il doit se reconnaître d'un écran à l'autre. Fond .hv5-bulle-2 pour
 * qu'elles se détachent de la carte de mesure qui les contient.
 * ════════════════════════════════════════════════════════════════════════════ */
/* ═══════════════════════════════════════════════════════════════════════════
 * 🔄 12/09 — LES ACTIONS PASSENT SOUS LES CHIFFRES.
 *
 * Christophe : « là c'est pas bien organisé ». Mesuré dans la page avant de toucher :
 * la colonne des chiffres faisait 452 px de haut, celle des actions 764 — soit 312 px
 * de vide sous le graphique, pendant que les trois actions s'empilaient dans une bande
 * de 336 px. Deux colonnes de hauteurs très différentes ne se lisent pas côte à côte :
 * elles se lisent l'une après l'autre.
 *
 * Les actions passent donc dessous, sur toute la largeur, et se rangent en rangée. Même
 * largeur de carte qu'avant, plus de vide, et l'ordre de lecture devient celui de la
 * phrase qu'on répète depuis le début : on donne une information, et EN FACE — ici,
 * en dessous — on met l'action.
 * ═══════════════════════════════════════════════════════════════════════════ */
body.hv5 .mesure-duo{ display:grid; grid-template-columns:minmax(0,1fr); gap:20px; align-items:start }
body.hv5 .mesure-agir .hv5-bulles{ display:grid; grid-template-columns:repeat(auto-fit,minmax(300px,1fr)); align-items:start }

/* La pastille Happy dans une carte d'action : même icône et même rondeur que le lanceur
   posé en bas à droite de tous les écrans. Elle reste DISCRÈTE — creuse, pas pleine :
   le seul objet plein et coloré de la carte est le bouton qui dit ce qu'on fait. */
body.hv5 .hv5-bulle-happy{
  flex:0 0 auto; width:34px; height:34px; padding:0; border-radius:50%;
  background:none; border:1px solid var(--v5-filet); color:var(--v5-encre-2);
  display:inline-flex; align-items:center; justify-content:center; cursor:pointer;
  transition:background .12s, color .12s, border-color .12s;
}
body.hv5 .hv5-bulle-happy svg{ width:17px; height:17px; display:block }
body.hv5 .hv5-bulle-happy:hover{ background:var(--v5-bulle-2); color:var(--v5-encre); border-color:var(--border-strong) }
body.hv5 .hv5-bulle-happy:focus-visible{ outline:2px solid var(--v5-vert); outline-offset:2px }
body.hv5 .mesure-chiffres{ min-width:0 }
body.hv5 .mesure-agir{ min-width:0 }
body.hv5 .mesure-agir-titre{
  font-size:11px; font-weight:700; letter-spacing:.11em; text-transform:uppercase;
  color:var(--v5-encre-4); margin:0 0 12px;
}
body.hv5 .mesure-agir .hv5-bulles{ gap:12px }
body.hv5 .mesure-agir .hv5-bulle{ background:var(--v5-bulle-2); padding:16px 16px; border-radius:var(--v5-r-2) }
body.hv5 .mesure-agir .hv5-b-tete{ margin-bottom:9px }
body.hv5 .mesure-agir .hv5-b-titre{ font-size:16px !important; line-height:1.35 }
body.hv5 .mesure-agir .hv5-b-sous{ font-size:13px; line-height:1.5; margin-top:6px }
body.hv5 .mesure-agir .hv5-b-pied{ margin-top:13px; padding-top:13px }
body.hv5 .mesure-agir .hv5-b-agir{ gap:12px; margin-top:0 }
body.hv5 .mesure-agir .hv5-btn{ font-size:13px; padding:8px 16px }
body.hv5 .mesure-agir .hv5-lien{ font-size:13px }
body.hv5 .mesure-agir .vide{
  font-size:13px; line-height:1.55; color:var(--v5-encre-3);
  background:var(--v5-bulle-2); border-radius:var(--v5-r-2); padding:16px 16px; margin:0;
}
body.hv5 .mesure-agir-reste{ margin:12px 2px 0; font-size:13px }

/* ═══════════════════════════════════════════════════════════════════════════
 * LE COPILOTE DE L'ADMIN — la barre qui remplace un sommaire de douze files.
 *
 * Christophe : « je préférerais parler avec un agent qui gère », « y a trop de choses à
 * mon goût ». Le mot du matin est écrit GRAND (19px) parce que c'est la seule chose
 * qu'il doit lire pour savoir quoi faire ; tout le reste de l'écran est de la
 * vérification. Même grammaire que les bulles : fond sombre, une seule couleur d'accent.
 * ═══════════════════════════════════════════════════════════════════════════ */
body.hv5 .copilote{
  background:var(--v5-bulle); border-radius:var(--v5-r);
  padding:20px 24px; margin:0 0 22px;
}
@media(max-width:620px){ body.hv5 .copilote{ padding:16px 16px; border-radius:14px } }
/* 🐛 17/09/2026 — Christophe : « c'est quoi ce gros bloc d'écriture tout moche ».
 *
 * Ce bloc était écrit en 19px gras sur 62 caractères, pour UNE phrase. Le copilote y
 * mettait quatre lignes enchaînant trois consignes : à cette longueur, le gras
 * n'insiste plus sur rien, il fait juste une masse noire en haut de l'écran, et le
 * lecteur doit re-découper lui-même ce que le modèle avait déjà trié.
 *
 * Il rend maintenant une accroche et des points (voir routes/copiloteAdmin.js). Les
 * deux tailles restent sur l'échelle de l'interface — 16 pour l'accroche, 14 pour les
 * gestes, 12 pour la précision — et c'est la HIÉRARCHIE qui porte le sens, plus le
 * poids du trait. La règle `.copilote-mot` garde sa taille de repli : quand le modèle
 * ne tient pas la forme, on réaffiche un paragraphe, et il doit rester lisible. */
body.hv5 .copilote-mot{
  font-size:16px; line-height:1.55; color:var(--v5-encre);
  margin:0 0 16px; max-width:62ch;
}
/* 62ch est la largeur de lecture d'un PARAGRAPHE, elle n'a rien à faire sur une liste :
   au rendu, elle coupait « Happia, Greensushi, Manon V. C., Codapia » en deuxième ligne
   alors qu'il restait un tiers d'écran vide à droite. Les lignes de gestes respirent
   donc plus large ; le repli en paragraphe garde sa largeur de lecture. */
body.hv5 .copilote-mot:has(.copilote-points){ max-width:76ch }
body.hv5 .copilote-mot.attente{ color:var(--v5-encre-3) }

body.hv5 .copilote-accroche{
  font-size:16px; line-height:1.45; font-weight:600; color:var(--v5-encre);
  margin:0 0 12px; max-width:52ch;
}
body.hv5 .copilote-points{
  list-style:none; margin:0; padding:0; display:flex; flex-direction:column; gap:4px;
}
body.hv5 .copilote-points li{
  display:flex; align-items:baseline; gap:12px; flex-wrap:wrap;
  padding:12px 16px; border-radius:var(--v5-r-2);
  background:var(--v5-bulle-2); font-size:14px; color:var(--v5-encre-2);
}
/* Le numéro dit l'ORDRE, pas la gravité : il ne prend donc pas le rouge des alertes.
   Un « 1 » rouge ferait croire à une urgence là où il n'y a qu'un rang. */
body.hv5 .copilote-points .n{
  flex:0 0 auto; width:20px; height:20px; border-radius:999px;
  background:var(--v5-encre); color:#FFFFFF;
  display:grid; place-items:center; font-size:11px; font-weight:700;
}
body.hv5 .copilote-points .q{ font-weight:600; color:var(--v5-encre) }
/* La précision suit le geste au lieu d'être poussée à droite. Collée au bord, elle
   changeait de place d'une ligne à l'autre selon la longueur du texte, et l'œil devait
   la chercher à chaque fois. */
body.hv5 .copilote-points .p{ font-size:12px; color:var(--v5-encre-3) }
/* Cliquable seulement quand la file existe vraiment dans la page : sans cette classe,
   la ligne reste un simple rappel, et rien ne promet un clic qui ne ferait rien. */
body.hv5 .copilote-points li.va{ cursor:pointer }
body.hv5 .copilote-points li.va:hover,
body.hv5 .copilote-points li.va:focus-visible{
  background:var(--v5-bulle); box-shadow:inset 0 0 0 1px var(--v5-filet); outline:none;
}
@media(max-width:620px){
  body.hv5 .copilote-points .p{ margin-left:32px; flex-basis:100%; margin-top:4px }
}
body.hv5 .copilote-barre{ display:flex; gap:8px; align-items:center; flex-wrap:wrap }
body.hv5 .copilote-barre input{
  flex:1 1 260px; min-width:0;
  background:var(--v5-bulle-2); border:1px solid var(--v5-filet); border-radius:var(--v5-r-2);
  padding:12px 16px; font-size:14px; font-family:inherit; color:var(--v5-encre);
}
body.hv5 .copilote-barre input::placeholder{ color:var(--v5-encre-4) }
body.hv5 .copilote-barre input:focus{ outline:none; border-color:var(--v5-vert) }
body.hv5 .copilote-barre input:disabled{ opacity:.55 }
body.hv5 .copilote-barre .btn{
  background:var(--v5-encre) !important; color:#FFFFFF !important;
  border:none !important; border-radius:var(--v5-r-2) !important;
  padding:12px 22px !important; font-weight:600 !important; font-size:14px !important;
  cursor:pointer;
}
body.hv5 .copilote-barre .btn:disabled{ opacity:.5; cursor:default }
body.hv5 .copilote-fil{
  margin-top:16px; padding-top:16px; box-shadow:inset 0 1px 0 var(--v5-filet);
  max-height:340px; overflow-y:auto; display:flex; flex-direction:column; gap:12px;
}
body.hv5 .copilote-ligne{
  font-size:14px; line-height:1.55; white-space:pre-wrap;
  border-radius:var(--v5-r-2); padding:12px 16px; max-width:min(56ch,100%);
}
body.hv5 .copilote-ligne.moi{
  align-self:flex-end; background:var(--v5-vert-sol); color:var(--v5-vert-txt);
}
body.hv5 .copilote-ligne.lui{
  align-self:flex-start; background:var(--v5-bulle-2); color:var(--v5-encre-2);
}
body.hv5 .copilote-ligne.rate{ color:var(--v5-rouge-doux); background:var(--v5-rouge-sol) }

/* ═══════════════════════════════════════════════════════════════════════════
 * LES DEUX PASTILLES D'ALERTE DE L'ADMIN, REMISES À L'ENDROIT — 11/09/2026.
 *
 * « 12 en attente » était écrit en blanc sur un rouge clair (2,77) et le chiffre des
 * files critiques en rouge sombre sur le bleu nuit (2,78) : les deux juste sous la
 * barre, pour la même raison inversée. Un rouge clair ne porte rien — ni le blanc, ni
 * un rouge sombre. C'est le FOND qui doit descendre, pas l'encre qu'il faut pousser.
 * On applique donc la grammaire des pastilles (.hv5-past.mal) : fond sombre teinté,
 * encre vive.
 * ═══════════════════════════════════════════════════════════════════════════ */
/* Le compteur reste seul après la suppression du titre « À traiter » : il se pose au-dessus
   du copilote, discret, sans occuper une ligne de titre pour lui tout seul. */
body.hv5 .pr-head.compteur-seul{ margin:0 0 12px; padding:0; min-height:0 }
body.hv5 .pr-head.compteur-seul:empty{ display:none }
/* 🐛 17/09/2026 — « le 21 en attente, il fait tache ». Depuis que chaque écran porte la
 * couleur de son agent, un aplat corail posé dessus devient une tache, quelle que soit la
 * couleur en dessous. La tentation serait de le repeindre dans la couleur de l'agent : ce
 * serait perdre le signal, parce que le rouge ne voudrait plus dire « du retard », il
 * voudrait dire « page de Marc ». On garde donc le ROUGE — c'est un état, il doit rester
 * lisible comme tel — et on retire l'APLAT : un contour, un point, et le chiffre. Le
 * message est le même, la tache a disparu. */
body.hv5 .total-pill{
  background:transparent !important;
  color:var(--v5-rouge-doux) !important;
  border:1px solid var(--v5-rouge-fil) !important;
  font-weight:600 !important;
}
body.hv5 .total-pill::before{
  content:"";
  display:inline-block;
  width:6px; height:6px;
  border-radius:50%;
  background:var(--v5-rouge) ;
  margin-right:8px;
  vertical-align:middle;
}
body.hv5 .kpi.crit .val{ color:var(--v5-rouge) !important }
body.hv5 .kpi.crit .lab{ color:var(--v5-encre-2) !important }

/* ═══════════════════════════════════════════════════════════════════════════
 * LES VOIES — plusieurs chemins vers le même résultat, et c'est le client qui tranche.
 *
 * Christophe : « il en choisit une, ou deux, ou les 3, et nous on propose les solutions
 * ensuite. Là on apporte de la valeur. » Donc : des choix côte à côte, de poids visuel
 * ÉGAL. Aucune n'est mise en avant — la plus légère est juste la première. Mettre la
 * « bonne » en vert et les autres en gris reviendrait à reprendre la décision qu'on
 * vient de lui rendre.
 * ═══════════════════════════════════════════════════════════════════════════ */
/* L'état visé arrive quelques secondes après la carte : en attendant, et quand le modèle
   n'en fournit pas, la ligne est plus discrète — elle dit ce qu'on sait, pas plus. */
body.hv5 .hv5-mini .txt.attendu.sans-vise{ color:var(--v5-encre-4) }
body.hv5 .voies{ margin-top:16px }
body.hv5 .voies:empty{ display:none }
body.hv5 .voies-tete{
  font-size:11px; font-weight:700; letter-spacing:.11em; text-transform:uppercase;
  color:var(--v5-encre-4); margin:0 0 10px;
}
body.hv5 .voies-attente{ font-size:14px; color:var(--v5-encre-3); margin:0 }

/* ═══════════════════════════════════════════════════════════════════════════
   « C'EST FAIT » REVIENT SUR LA CARTE — 14/09/2026

   Christophe : « que se passe-t-il lorsque j'ai executé une tache ? »

   Reponse mesuree dans le code : RIEN, parce qu'il n'avait aucun moyen de le dire.
   Le 11/09 le tiroir technique a ete retire de « A faire » (« completement inutile,
   ajoute des surcouches pour rien ») et les boutons Demarrer / Terminer / Reprendre
   sont partis avec lui. Le commentaire laisse sur place le disait noir sur blanc :
   « plus aucun moyen, depuis A faire, de marquer une action faite ».

   Or toute la brique de preuve depend de ce clic : cocher declenche une photo des
   chiffres, un rendez-vous a J+30, puis le calcul de l'ecart. Sans le bouton, cette
   mecanique ne s'est jamais mise en route pour personne.

   Le pied revient donc sur la carte, pas dans un tiroir. Il reste SOBRE : la carte n'a
   qu'un seul bouton plein, celui de la voie qu'on choisit. Dire « c'est fait » est un
   second geste, d'une autre nature, et il se lit comme tel.
   ═══════════════════════════════════════════════════════════════════════════ */
body.hv5 .a-fait{
  display:flex; align-items:center; justify-content:flex-end; gap:12px; flex-wrap:wrap;
  margin-top:16px; padding-top:12px; border-top:1px solid var(--v5-filet);
}
body.hv5 .a-fait .dit{ font-size:13px; color:var(--v5-encre-3); margin-right:auto }
body.hv5 .a-fait .btn{
  font-family:inherit; font-size:13px; font-weight:600; cursor:pointer;
  padding:8px 16px; border-radius:var(--v5-r-2);
  background:transparent; color:var(--v5-succes-txt);
  border:1px solid var(--v5-succes-fil);
  transition:background .12s, border-color .12s;
}
body.hv5 .a-fait .btn:hover{ background:var(--v5-succes-sol); border-color:var(--v5-succes) }
body.hv5 .a-fait .btn.neutre{ color:var(--v5-encre-3); border-color:var(--v5-filet) }
body.hv5 .a-fait .btn.neutre:hover{ background:var(--v5-survol); border-color:var(--v5-filet-2) }

/* ✂️ UNE VOIE TIENT SUR UNE LIGNE — 11/09/2026, « c'est beaucoup beaucoup trop gros ».
   Titre, levier, durée et bouton sur la même rangée ; tout le reste sous un pli. Trois
   voies tiennent désormais dans la hauteur qu'une seule occupait. */
/* ✂️ 2026-09-11 — LA LIGNE DU TITRE EST LE BOUTON D'OUVERTURE.
   Il y avait une ligne « ce que ça donne » sous chaque titre, uniquement pour déplier.
   C'est le titre qui déplie maintenant : une hauteur de texte gagnée par voie, et le
   geste est plus évident qu'un lien souligné de 13px. Le chevron le dit. */
body.hv5 .voie{
  background:var(--v5-bulle-2); border-radius:var(--v5-r-2);
  padding:8px 12px 8px 16px; margin-bottom:7px;
  display:flex; align-items:flex-start; gap:16px;
}
body.hv5 .voie:last-child{ margin-bottom:0 }
body.hv5 .voie-plus{ flex:1 1 auto; min-width:0; margin:0; font-size:13px }
body.hv5 .voie-tete{
  display:flex; align-items:center; gap:12px; flex-wrap:wrap;
  cursor:pointer; list-style:none; padding:8px 0;
}
body.hv5 .voie-plus.sans-pli .voie-tete{ cursor:default }
body.hv5 .voie-tete::-webkit-details-marker{ display:none }
body.hv5 .voie-titre{
  flex:1 1 240px; margin:0; font-size:16px; font-weight:600; line-height:1.35;
  color:var(--v5-encre) !important;
}
@media(max-width:620px){ body.hv5 .voie-titre{ font-size:14px !important; flex-basis:100% } }
/* Le chevron : le seul signe que la ligne s'ouvre. Il pivote, donc il dit aussi l'état. */
body.hv5 details.voie-plus > .voie-tete::after{
  content:"›"; flex:0 0 auto; font-size:19px; line-height:1;
  color:var(--v5-encre-4); transform:rotate(90deg); transition:transform .15s;
}
body.hv5 details.voie-plus[open] > .voie-tete::after{ transform:rotate(-90deg) }
/* Le bouton ne porte plus le prix : il redevient court. Le prix se lit à côté, en gris. */
body.hv5 .voie-action{ flex:0 0 auto; display:flex; align-items:center; gap:8px; padding-top:9px }
body.hv5 .voie .hv5-btn.petit{ font-size:13px; padding:8px 16px }
body.hv5 .voie-cout{ font-size:12px; color:var(--v5-encre-4); white-space:nowrap }
body.hv5 .voie-corps{ padding-bottom:7px }
body.hv5 .voie-effort{ flex:0 0 auto; font-size:13px; color:var(--v5-encre-4) }
/* Le levier du référentiel : petit, sobre, mais présent — c'est lui qui distingue une
   proposition Happia d'un conseil SEO trouvé n'importe où. */
body.hv5 .voie-levier{
  flex:0 0 auto; font-size:11px; font-weight:600; letter-spacing:.03em;
  color:var(--v5-vert-txt); background:var(--v5-vert-sol);
  border-radius:999px; padding:3px 8px; white-space:nowrap;
}
/* (l'ancien résumé « ce que ça donne » posé SOUS le titre a été supprimé le 11/09 :
   c'est la ligne du titre qui joue ce rôle, voir plus haut) */
/* ✂️ 2026-09-11 (Christophe : « pourquoi l'explication s'arrête à la moitié ?
   c'est dommage et surtout ça agrandit l'ouverture ») — PLUS DE BRIDE ICI.
   58ch, c'est la largeur de lecture confortable d'un article. Mais ces lignes-là ne sont
   pas un article : ce sont deux ou trois phrases dans une carte qui borne déjà la
   largeur. La bride ne rendait rien plus lisible, elle doublait la hauteur du pli. */
body.hv5 .voie-ligne{
  margin:5px 0 0; font-size:13px; line-height:1.5; color:var(--v5-encre-3);
}
body.hv5 .voie-ligne b{ color:var(--v5-encre-4); font-weight:600 }

/* Le bloc PROPOSÉ porte la liste des chemins : c'est ce qui répond du premier coup d'œil. */
body.hv5 .vise-liste{ margin:0; padding-left:19px; font-size:14px; line-height:1.65 }
body.hv5 .vise-liste li{ color:var(--v5-encre-2); margin:0 }
body.hv5 .vise-duree{ color:var(--v5-encre-4); font-size:13px }

/* ═══════════════════════════════════════════════════════════════════════════
 * ⏳ 11/09 — L'ATTENTE SE MONTRE, ELLE NE SE RACONTE PAS.
 *
 * Christophe : « le double message, à droite "voyons où ça nous mène" et en bas
 * à gauche "ça va prendre 20 secondes" : trop de lecture. Tu me mets un truc animé
 * qui montre que c'est en train de charger, de réfléchir. Ça, tout le monde comprend. »
 *
 * Deux phrases à lire pour apprendre qu'il n'y a rien à lire, c'était une de trop
 * et probablement deux. Le squelette dit l'attente sans un mot, et il dit en plus
 * la forme de ce qui arrive : quand le contenu se pose, rien ne saute de place.
 *
 * Le scintillement est un dégradé qui traverse la barre, pas un clignotement :
 * il se lit comme « ça travaille », pas comme « ça a planté ». Sous
 * prefers-reduced-motion, tout s'arrête et les barres restent posées.
 * ═══════════════════════════════════════════════════════════════════════════ */
body.hv5 .squelette{ display:flex; flex-direction:column; gap:8px; padding:3px 0 }
body.hv5 .squelette i,
body.hv5 .voie-fantome i{
  display:block; border-radius:999px;
  background:var(--v5-filet);
  background-image:linear-gradient(90deg, transparent 0%, rgba(255,255,255,.16) 50%, transparent 100%);
  background-size:200% 100%; background-repeat:no-repeat;
  animation:hv5-scintille 1.35s ease-in-out infinite;
}
body.hv5 .squelette i{ height:11px }
body.hv5 .squelette i:nth-child(2){ width:84%; animation-delay:.14s }
body.hv5 .squelette i:nth-child(3){ width:62%; animation-delay:.28s }
@keyframes hv5-scintille{
  from{ background-position:130% 0 }
  to{ background-position:-130% 0 }
}

/* Trois rangées à la hauteur exacte d'une voie : le contenu prendra la place
   du fantôme, pas celle d'à côté. */
body.hv5 .voie-fantome{ align-items:center; gap:16px; pointer-events:none }
body.hv5 .voie-fantome .f-titre{ flex:1 1 auto; height:13px }
body.hv5 .voie-fantome .f-btn{ flex:0 0 auto; width:96px; height:31px; border-radius:999px }
body.hv5 .voie-fantome:nth-child(2) i{ animation-delay:.16s }
body.hv5 .voie-fantome:nth-child(3) i{ animation-delay:.32s }

@media (prefers-reduced-motion: reduce){
  body.hv5 .squelette i,
  body.hv5 .voie-fantome i{ animation:none; background-image:none }
}

/* ═══════════════════════════════════════════════════════════════════════════
 * 🆕 11/09 — LA LIGNE À FAIRE TIENT SUR UNE SEULE HAUTEUR
 *
 * Christophe : « le bouton “le faire avec Happy” ne sert à rien … le petit nombre
 * en blanc, on ne sait pas ce que c'est … du coup si on enlève tout ça on peut
 * peut-être décaler l'explication à droite et donc réduire encore les rectangles ».
 *
 * Les deux objets sont partis du HTML. La place qu'ils occupaient à droite sert
 * maintenant au CONSTAT : le problème à gauche, ce qu'on a mesuré à droite, sur
 * la même ligne. La carte passe de trois hauteurs de texte à une seule, et la
 * liste se lit d'un coup d'œil — ce qu'il demandait depuis le début.
 *
 * Sous 860px les deux colonnes se remettent l'une sous l'autre : à cette largeur,
 * 42 % d'écran ne tient plus un titre.
 * ═══════════════════════════════════════════════════════════════════════════ */
body.hv5 .hv5-bulle.attente{ display:block; padding:12px 20px }
body.hv5 .hv5-bulle.attente .corps{
  /* 🔄 13/09 — 26 → 22 puis 34. Un ecart horizontal ne coute AUCUNE hauteur : le
     resserrer ne gagnait rien et faisait se toucher deux colonnes de texte. */
  display:flex; align-items:baseline; gap:32px; flex:1 1 auto; min-width:0;
}
/* 🚨 42 % faisait finir le titre EXACTEMENT sur le bord de sa colonne — sans filet ni
   changement de fond pour marquer la separation, l'oeil lit un chevauchement. 40 %
   lui laisse de quoi respirer a droite, et ne change pas la hauteur de la carte. */
body.hv5 .hv5-bulle.attente .ligne-probleme{ flex:0 1 40%; min-width:0; padding-right:4px }
body.hv5 .hv5-bulle.attente .ligne-probleme .hv5-b-tete{ margin-bottom:7px }
body.hv5 .hv5-bulle.attente .hv5-b-sous{
  flex:1 1 0; min-width:0; margin:0; max-width:none;
}
@media(max-width:860px){
  body.hv5 .hv5-bulle.attente .corps{ display:block }
  body.hv5 .hv5-bulle.attente .hv5-b-sous{ margin-top:6px }
}

/* ═══════════════════════════════════════════════════════════════════════════
 * 🆕 11/09 — LES ENCRES ÉCRITES EN DUR DANS UN attribut style=""
 *
 * Relevé au balayage après l'éclaircissement des bulles : quelques pastilles
 * sont peintes par les scripts injectés (bloc-perception-ia.js) avec des
 * couleurs choisies pour le thème CLAIR — un vert foncé, un ambre foncé, un
 * gris moyen — posées sur un fond qui, lui, suit bien `var(--surface)` et est
 * donc devenu la bulle sombre. « Rapide » sortait à 2,55, « Moyen » à 2,7.
 *
 * Le style inline bat n'importe quel sélecteur : on ne peut le reprendre qu'en
 * ciblant l'attribut lui-même, avec !important. Le drapeau `i` attrape aussi
 * les variantes en minuscules. On ne touche PAS au script : ces couleurs
 * restent justes sur le site public, qui n'a pas la classe hv5.
 * ═══════════════════════════════════════════════════════════════════════════ */
body.hv5 [style*="0E7A52" i]{ color:var(--v5-vert-txt) !important }
body.hv5 [style*="9A6314" i]{ color:var(--v5-ambre) !important }
body.hv5 [style*="5E6A80" i]{ color:var(--v5-encre-3) !important }
body.hv5 [style*="B2453A" i]{ color:var(--v5-rouge-doux) !important }
/* Le filet de ces pastilles était un blanc cassé : 11,7 de contraste pour un
   trait d'1px, c'est-à-dire une ligne qui crie plus fort que le texte. */
body.hv5 [style*="EAEEF3" i]{ border-color:var(--v5-filet) !important }

/* ═══════════════════════════════════════════════════════════════════════════
 * 🚨 12/09 — LA MOITIÉ DU BACK-OFFICE ÉTAIT ÉCRITE EN INVISIBLE, ET L'AUDIT
 *            DISAIT QUE TOUT ALLAIT BIEN.
 *
 * Christophe envoie twal.ai : « regarde comme c'est agréable ça ». En mesurant
 * ce qui sépare leur écran du nôtre, la vraie trouvaille n'est pas graphique.
 *
 * `happia-payfit.css` pose `-webkit-text-fill-color` sur toute la barre de
 * navigation, avec des valeurs pensées pour le thème CLAIR (#3A4A63, #5E6A80,
 * #0B5A40). Or CETTE propriété l'emporte sur `color` quelle que soit la
 * spécificité : une déclaration `color` peut gagner la cascade, être renvoyée
 * par getComputedStyle... et ne rien peindre du tout.
 *
 * Conséquence mesurée dans la page : 18 libellés de navigation entre 1,52 et
 * 2,50 de contraste. « Tableau de bord », « Profil », « Factures », « Mes
 * établissements » — du gris ardoise sur du bleu nuit. Et tous nos balayages
 * de contraste lisaient `color`, donc annonçaient 12,49. L'audit ne mentait
 * pas, il regardait la mauvaise propriété.
 *
 * ⚠️ RÈGLE : sur une page V5, le remplissage du texte suit TOUJOURS `color`.
 * Toute feuille qui pose un `-webkit-text-fill-color` chiffré pose une couleur
 * de thème clair sur un fond sombre, sans exception à ce jour.
 * ═══════════════════════════════════════════════════════════════════════════ */
body.hv5 .app aside.sidebar nav a,
body.hv5 .app aside.sidebar nav a:hover:not(.active),
body.hv5 .app aside.sidebar nav a.active,
body.hv5 .app aside.sidebar .nav-label,
body.hv5 .app aside.sidebar .nav-label.admin,
body.hv5 .app aside.sidebar .footer,
body.hv5 h1 .mint, body.hv5 h2 .mint, body.hv5 .hero h1 .mint,
body.hv5 h2.h .mint, body.hv5 .h .mint,
body.hv5 .hf-accent,
/* Le filet de sécurité : les six sélecteurs ci-dessus sont ceux qui posent le
   problème AUJOURD'HUI. Celui-ci couvre ceux qu'on ajoutera demain. Il est
   volontairement large — dans le périmètre `hv5`, aucun élément n'a de raison
   légitime d'avoir un remplissage différent de son encre. */
body.hv5 .app *{ -webkit-text-fill-color:currentColor !important }

/* ═══════════════════════════════════════════════════════════════════════════
 * 🚨 12/09, LE MÊME PIÈGE PAR UN TROISIÈME CANAL : `fill`.
 *
 * Christophe, sur l'écran Performance : « en dessous on ne voit pas les chiffres ».
 *
 * Les chiffres des anneaux d'audit étaient peints en `fill="#0C1F4E"` — l'encre du
 * thème CLAIR — sur la bulle bleu nuit. Contraste 1,17 : ce qu'il prenait pour « 00 »
 * n'était pas des chiffres, c'était le blanc de l'anneau. Seize nombres invisibles sur
 * cette seule page.
 *
 * Un texte SVG ne se peint NI par `color` NI par `-webkit-text-fill-color`, mais par
 * `fill`. C'est donc le troisième canal qui échappe à un balayage de contraste écrit
 * autour de `color` — comme celui du matin même. La leçon vaut plus que le correctif :
 * avant d'affirmer qu'un écran est lisible, il faut savoir par quels canaux son texte
 * peut être peint.
 *
 * La source est corrigée (`var(--ink, …)`, `var(--line, …)` dans performance.html et
 * audits.html). Ceci est le filet pour ce qui passera au travers demain.
 * ═══════════════════════════════════════════════════════════════════════════ */
body.hv5 svg text[fill*="0C1F4E" i],
body.hv5 svg text[fill*="5E6A80" i],
body.hv5 svg text[fill*="3A4A63" i],
body.hv5 svg tspan[fill*="0C1F4E" i]{ fill:var(--v5-encre) !important }
/* Les anneaux et les grilles peints dans un gris de thème clair : sur fond sombre, un
   trait presque blanc crie plus fort que le chiffre qu'il entoure. */
body.hv5 svg [stroke*="EDEFF4" i],
body.hv5 svg [stroke*="E7E9F0" i],
body.hv5 svg [stroke*="EAEEF3" i]{ stroke:var(--v5-filet) !important }

/* ═══════════════════════════════════════════════════════════════════════════
 * 🆕 12/09 — CE QUI REND UNE INTERFACE « AGRÉABLE », MESURÉ PLUTÔT QUE DEVINÉ
 *
 * Relevé sur l'écran des actions avant ce bloc :
 *   · le texte explicatif sortait à 4,42 — SOUS le seuil de lisibilité (4,5).
 *     L'effet « corps de texte assourdi » que Christophe admire ailleurs, on
 *     l'appliquait déjà, et d'un cran de trop.
 *   · ONZE taches vertes dans un seul écran, en TROIS verts différents
 *     (#4ADE80, #19CE84, #25D366) — et pas un seul bouton parmi elles. La
 *     règle « une seule chose reste pleine et colorée » était respectée par la
 *     feuille et démentie par l'écran.
 *
 * On ne touche NI à la palette, NI aux marges : « réduire vraiment la taille
 * des rectangles » a été demandé deux fois, et l'air supplémentaire d'une page
 * de présentation n'a pas de sens sur une liste de 23 actions.
 * ═══════════════════════════════════════════════════════════════════════════ */
/* 🐛 13/09, soir — CETTE REDECLARATION A REPEINT PAPIER EN ENCRE.
 *
 * Le matin, ces deux jetons etaient redeclares ici avec les anciennes valeurs bleutees.
 * Je les ai corriges au lieu de les SUPPRIMER, en me disant que la redeclaration
 * « documentait » le relevement decide le 11/09. C'etait une erreur, et elle a mis huit
 * heures a se voir : au passage en Papier, `--v5-encre-3` valait toujours #9D9DA7 —
 * l'encre d'Encre — trois mille lignes plus bas que la palette. Mesure sur la page en
 * ligne : 2,3 de contraste, tout le texte secondaire du back-office delave.
 *
 * Un jeton de palette se declare dans UN bloc de palette, et nulle part ailleurs. Ce qui
 * doit etre documente se documente en commentaire, pas en redeclarant une valeur.
 * Cliquet : la-palette-tient-toute-seule, section « un jeton ne se declare qu'une fois ».
 *
 * (Pour memoire, le relevement du 11/09 : l'encre tertiaire est remontee pour repasser
 *  au-dessus de 4,5 sur la bulle interieure, qui est la surface la plus dure.) */

/* ——— UN SEUL VERT, ET IL DÉSIGNE QUELQUE CHOSE ———
   Restent verts : le bouton, l'état sélectionné, l'anneau de progression, la
   pastille « terminées » et le gain estimé. Tout le reste était du vert
   décoratif — un logo, une entrée de menu, un avatar — qui usait l'accent sans
   rien désigner. */
body.hv5 aside.sidebar .brand a,
body.hv5 aside.sidebar .brand a svg,
body.hv5 aside.sidebar .brand a path{ color:var(--v5-encre) !important; stroke:var(--v5-encre) !important }

/* L'entrée active se signale par son FOND, comme le reste de la feuille le fait
   déjà ailleurs : une couleur de texte pour dire « tu es ici », c'est un accent
   dépensé sur une information que la position donne déjà. */
body.hv5 .app aside.sidebar nav a.active,
body.hv5 .app aside.sidebar nav a.active *{ color:var(--v5-encre) !important }
body.hv5 .app aside.sidebar nav a.active{ background:var(--v5-bulle) !important; font-weight:600 !important }
body.hv5 .app aside.sidebar nav a.active svg,
body.hv5 .app aside.sidebar nav a.active path{ stroke:var(--v5-encre) !important }

body.hv5 aside.sidebar .avatar,
body.hv5 .sidebar .avatar{ background:var(--v5-bulle-2) !important; color:var(--v5-encre) !important }

/* Les deux pastilles de la barre portaient chacune leur propre vert, hérité du
   site public. Un seul vert dans tout le périmètre, et en veilleuse : ce sont
   des voyants d'état, pas des appels à l'action. */
body.hv5 aside.sidebar a span[style*="25D366" i],
body.hv5 aside.sidebar a span[style*="19CE84" i]{ background:var(--v5-encre) !important }

/* ——— LE MOUVEMENT ———
   Huit lignes, et c'est ce qui change le plus le ressenti : les cartes montent
   et se révèlent au lieu d'apparaître d'un bloc. Décalage volontairement court
   (18 ms maxi entre deux) — au-delà, sur une liste de 23 actions, on attend.
   Une animation d'ENTRÉE, pas de défilement : `animation-timeline: view()` n'est
   pas tenu par tous les navigateurs de nos clients. */
@keyframes hv5-entre{ from{ opacity:0; transform:translateY(10px) } to{ opacity:1; transform:none } }
body.hv5 .hv5-bulle,
body.hv5 .progress-card,
body.hv5 article.voie{ animation:hv5-entre .42s cubic-bezier(.22,.61,.36,1) both }
body.hv5 .hv5-bulle:nth-of-type(1){ animation-delay:.02s }
body.hv5 .hv5-bulle:nth-of-type(2){ animation-delay:.06s }
body.hv5 .hv5-bulle:nth-of-type(3){ animation-delay:.10s }
body.hv5 .hv5-bulle:nth-of-type(4){ animation-delay:.14s }
body.hv5 .hv5-bulle:nth-of-type(n+5){ animation-delay:.18s }
@media (prefers-reduced-motion:reduce){
  body.hv5 .hv5-bulle,
  body.hv5 .progress-card,
  body.hv5 article.voie{ animation:none }
}

/* L'interligne du texte courant : 1,55 → 1,62. C'est le seul endroit où on
   ajoute de l'air, parce qu'il se prend sur la ligne et non sur la hauteur de
   la carte quand le texte tient sur une ligne. */
/* 🔄 13/09 — 1,62 avait ete pose pour aerer un titre lourd ; le titre est affine,
   l'interligne redescend. Sans ca on remplace un poids par un autre. */
body.hv5 .hv5-b-sous{ line-height:1.55 }

/* ═══════════════════════════════════════════════════════════════════════════
 * 🔄 12/09 — « COMMENT PROGRESSER SUR CE SCORE ? » PREND LA FORME DE « À FAIRE »
 *
 * Christophe : « là on doit faire comme dans À faire ». Les leviers de l'écran
 * Performance étaient rendus en cartes hautes : un émoji, un titre, trois lignes
 * d'explication, et des boutons verts pleins. Empilés à cinq, c'est exactement ce
 * qu'il avait fait retirer de « À faire » la veille.
 *
 * Ils reprennent donc la carte de « À faire » — bulle neutre, pastille de 11 px,
 * titre à gauche, constat à droite. Deux différences assumées, et elles tiennent au
 * fait qu'un levier n'est pas une action facturée :
 *   · la bulle n'est PAS cliquable (rien à ouvrir), donc ni curseur main ni survol ;
 *   · la destination est un lien discret, pas un bouton plein — on ouvre une page,
 *     on ne dépense pas de crédit.
 * ═══════════════════════════════════════════════════════════════════════════ */
/* La bulle d'un levier vit DANS la carte de la section : elle prend donc la bulle
   intérieure, plus claire que sa mère — la règle du fichier depuis le premier jour.
   Mesuré : 1,21 d'écart, exactement l'écart prévu par la palette. Sans ça, les cinq
   leviers étaient peints dans la couleur EXACTE de leur conteneur (écart 1,00) et ne
   se lisaient plus comme des cartes. */
body.hv5 .hv5-bulle.attente.levier,
body.hv5 .hv5-bulle.attente.levier:hover{ background:var(--v5-bulle-2) }
body.hv5 .hv5-bulle.attente.levier{ cursor:default }
/* « Optionnel » n'est ni un problème ni une réussite : il ne prend donc ni le rouge
   du constat ni le vert de la réponse. */
body.hv5 .hv5-past.opt{ background:var(--v5-bulle-2); color:var(--v5-encre-3) }
body.hv5 .hv5-past.opt::before{ background:var(--v5-encre-4) }
/* 🆕 13/09 — LES FICHES PAR MOTEUR.
   La preuve (les domaines que ce moteur a vraiment ouverts) vit SOUS le constat, en plus
   discret : c'est ce qui rend le chiffre vérifiable, mais ça ne se lit qu'en second. */
body.hv5 .fm-preuve{
  display:block; margin-top:5px; font-size:12px; line-height:1.5;
  color:var(--v5-encre-4); font-variant-numeric:tabular-nums;
}
/* La grille marque × moteur ne disparaît pas : elle se replie. On ne perd aucune
   information présente dans le back-office — la garantie posée le 11/09. */
body.hv5 details.detail-grille > summary{
  list-style:none; cursor:pointer; display:inline-flex; align-items:center; gap:8px;
  font-size:12px; font-weight:600; color:var(--v5-encre-3); padding:4px 0;
}
body.hv5 details.detail-grille > summary::-webkit-details-marker{ display:none }
body.hv5 details.detail-grille > summary::before{ content:"\203A"; transition:transform .15s }
body.hv5 details.detail-grille[open] > summary::before{ transform:rotate(90deg) }
body.hv5 details.detail-grille > summary:hover{ color:var(--v5-encre) }

body.hv5 .lev-dest{ margin-top:7px; display:flex; flex-wrap:wrap; gap:12px }
body.hv5 .lev-lien{ font-size:12px; font-weight:600; color:var(--v5-vert-txt); text-decoration:none }
body.hv5 .lev-lien:hover{ text-decoration:underline }

/* ═══════════════════════════════════════════════════════════════════════════
 * 🔄 12/09 — LES ICÔNES DE CANAL, EN BLANC.
 *
 * Christophe : « là les icônes, il faut les mettre en blanc ». Mesure faite dans la
 * page avant de toucher quoi que ce soit, et il avait raison au-delà de ce qu'il
 * voyait — c'est toute la tuile qui avait été dessinée pour le thème clair :
 *
 *   · l'icône « Blog / site » était tracée en #0C1F4E, l'encre du thème CLAIR, sur
 *     une pastille sombre : 1,14 de contraste, donc rien du tout ;
 *   · les cinq autres portaient leur couleur de marque, entre 2,12 et 3,11 — visibles,
 *     mais en dessous du seuil de 3:1 d'un élément graphique ;
 *   · et les pastilles rondes, teintées à 16 % de la couleur de marque, ressortaient
 *     entre 1,03 et 1,23 sur la tuile. Autant dire qu'elles n'existaient pas.
 *
 * La teinte de marque à 16 % marche sur un fond blanc ; sur un fond bleu nuit, elle se
 * dissout. On passe donc à un traitement unique : pastille neutre, glyphe en encre.
 * C'est aussi ce que dit la règle du matin — l'accent désigne une action, il ne décore
 * pas six pastilles côte à côte. Le nom du canal est écrit dessous, il suffit à
 * l'identifier. Mesuré après : icône sur pastille 10,31 · pastille sur tuile 1,21.
 * ═══════════════════════════════════════════════════════════════════════════ */
/* 🐛 13/09/2026, la nuit — ET CES QUATRE REGLES EFFACAIENT LES VRAIS LOGOS. Mesure : le badge
   LinkedIn, `<rect fill="#0A66C2">`, sortait a `rgb(12,31,78)` — l'encre de la palette. Un
   attribut de presentation SVG a une specificite de zero : N'IMPORTE quelle regle CSS le bat,
   et aucune valeur CSS ne veut dire « reprends l'attribut ». Un logo repeint est un logo perdu,
   sans recours. La seule issue est que la regle ne le touche pas.
   D'ou le `:not(.logo-marque)` : la pastille neutre garde son traitement en encre — c'est ce
   qu'il faut pour un glyphe monochrome — et un logo de marque n'est jamais repeint.
   Cliquet : une-source-un-visage-une-url, section « aucun ecran ne redessine les marques ». */
body.hv5 .ia-tile .em:not(.logo-marque){ background:var(--v5-bulle-2); color:var(--v5-encre) }
body.hv5 .ia-tile .em:not(.logo-marque) svg{ color:var(--v5-encre); stroke:var(--v5-encre) }
body.hv5 .ia-tile .em:not(.logo-marque) svg [stroke]:not([stroke="none"]){ stroke:var(--v5-encre) }
body.hv5 .ia-tile .em:not(.logo-marque) svg [fill]:not([fill="none"]){ fill:var(--v5-encre) }

/* ═══════════════════════════════════════════════════════════════════════════
 * 🆕 12/09 — UN LEVIER QUI DEMANDE DE PRODUIRE QUELQUE CHOSE S'OUVRE.
 *
 * Christophe : « quand je dis pareil que À faire, c'est PAREIL : cliquable, avec
 * avant/après et les propositions. » Les leviers « livrable » deviennent donc des
 * cartes qu'on ouvre, et qui montrent les voies du même moteur que « À faire ».
 *
 * Les leviers « champ » (ajouter son téléphone, harmoniser une adresse) restent des
 * cartes fermées avec leur lien direct : le client ne paie pas pour ce qu'il fait en
 * dix secondes. La distinction se voit donc, et c'est voulu : seule la carte ouvrable
 * prend le curseur main et le survol.
 * ═══════════════════════════════════════════════════════════════════════════ */
body.hv5 details.hv5-bulle.attente.levier.ouvrable{ cursor:pointer; padding:0 }
body.hv5 details.levier.ouvrable > summary{
  list-style:none; display:block; padding:16px 20px; border-radius:var(--v5-r);
  transition:background .15s;
}
body.hv5 details.levier.ouvrable > summary::-webkit-details-marker{ display:none }
body.hv5 details.levier.ouvrable > summary:hover{ background:var(--v5-survol) }
/* Le chevron dit que la carte s'ouvre — sans lui, rien ne distingue à l'œil un levier
   ouvrable d'un levier qui ne l'est pas. */
body.hv5 details.levier.ouvrable > summary .ligne-probleme{ position:relative }
body.hv5 details.levier.ouvrable > summary .hv5-b-titre::after{
  content:"⌄"; margin-left:9px; font-size:14px; color:var(--v5-encre-3);
  display:inline-block; transition:transform .15s;
}
body.hv5 details.levier.ouvrable[open] > summary .hv5-b-titre::after{ transform:rotate(180deg) }
body.hv5 .lev-voies{ padding:0 20px 16px }
body.hv5 .lev-voies:empty{ padding:0 }
body.hv5 .lev-attente{ font-size:13px; color:var(--v5-encre-3); padding:4px 0 8px }

/* ——— L'« AVANT » D'UNE PAGE À FORT POTENTIEL ———
   12/09, Christophe : « je comprends la lecture de ces informations, mais concrètement
   en tant que client je fais quoi ». Chaque page du bloc s'ouvre désormais comme une
   action, et la règle « avant / après » vaut ici comme ailleurs : on montre le titre
   ACTUEL de la page avant de proposer mieux. Sans lui, le client ne peut pas juger si
   ce qu'on lui propose vaut mieux que ce qu'il a déjà.
   Le fond est la bulle intérieure — plus CLAIRE que sa mère, la règle de la feuille —
   pour qu'on voie d'un coup que c'est un relevé et non une proposition. */
/* ════════════════════════════════════════════════════════════════════════════
 * 🚨 12/09 — L'AUTRE MOITIÉ DE L'ANGLE MORT : ON CORRIGEAIT L'ENCRE, PAS LE FOND.
 *
 * Christophe, capture de « Trafic venu des IA » : « là y'a un problème de visibilité ».
 * Mesuré dans la page : la pastille « mesure Happia » sortait à 1,02 de contraste —
 * c'est-à-dire RIEN, du blanc sur du jaune pâle — et l'encadré « Deux précisions sur ce
 * tableau » à 1,47.
 *
 * La cause est symétrique de celle du 12/09 au matin, et le cliquet
 * `rien-ne-secrit-en-invisible` ne pouvait pas la voir : il vérifie que toute couleur
 * de TEXTE figée a sa réponse dans V5. Ici le texte va bien — V5 le repeint en clair,
 * comme il doit. C'est le FOND qui est resté une couleur de thème clair.
 *
 * ⚠️ LA RÈGLE : sur une page V5 l'encre est TOUJOURS claire, donc un fond clair est
 * toujours une faute. Un composant qui pose son propre fond doit avoir sa réponse ici,
 * exactement comme pour le remplissage du texte.
 * ════════════════════════════════════════════════════════════════════════════ */
/* `--amber-soft` est déclaré DANS les pages (trafic-ia, sources-ia) à #FEF3C7. On le
   retourne au niveau du thème plutôt que de nommer chaque composant qui s'en sert :
   une valeur à changer, et les pages qui l'utiliseront demain suivent toutes seules. */
body.hv5{ --amber-soft:var(--v5-ambre-sol); --amber:var(--v5-ambre) }

/* L'encadré d'avertissement garde son ambre — c'est un signal, il doit rester
   distinct de l'encadré neutre — mais sur le sol sombre. Sans cette ligne, la règle
   générale de `.note` le repeindrait comme un encadré ordinaire et le signal se perdrait. */
body.hv5 .note.warn{
  background:var(--v5-ambre-sol) !important;
  border-left-color:var(--v5-ambre) !important;
}

/* ——— « TES PAGES QUE LES IA VIENNENT LIRE » (Trafic venu des IA) ———
   12/09. Le tableau est devenu une liste d'actions ouvrables : mêmes bulles que partout
   ailleurs, donc rien de neuf à habiller sauf l'intertitre, le repli technique et la
   phrase de cadrage sous le compteur de lectures. */
body.hv5 .lues-tete{ font-size:14px; font-weight:600; color:var(--v5-encre); margin-bottom:2px }

/* Le bloc technique : présent, lisible, et visiblement secondaire. Il ne disparaît pas
   — « on ne perd aucune information présente dans le back-office ». */
body.hv5 details.tech-lues > summary{
  cursor:pointer; list-style:none; font-size:13px; color:var(--v5-encre-3);
  padding:8px 12px; border:1px solid var(--v5-filet); border-radius:10px; user-select:none;
}
body.hv5 details.tech-lues > summary::-webkit-details-marker{ display:none }
body.hv5 details.tech-lues > summary::after{ content:" \2304"; color:var(--v5-encre-3) }
body.hv5 details.tech-lues[open] > summary{ border-radius:10px 10px 0 0 }
body.hv5 details.tech-lues .tech-corps{
  border:1px solid var(--v5-filet); border-top:none; border-radius:0 0 10px 10px;
  padding:12px 12px 4px;
}
body.hv5 details.tech-lues .tech-corps table{ width:100% }
body.hv5 details.tech-lues .pth{ color:var(--v5-encre-3) }

/* La phrase qui explique pourquoi 1 025 lectures donnent 6 visites, et où aller voir. */
body.hv5 .lane-suite{
  font-size:13px; line-height:1.6; color:var(--v5-encre-2);
  margin:10px 0 0; padding-top:10px; border-top:1px solid var(--v5-filet);
}
body.hv5 .lane-suite a{ color:var(--v5-vert-txt); text-decoration:none; font-weight:600 }
body.hv5 .lane-suite a:hover{ text-decoration:underline }
/* 🐛 12/09, soir — Christophe : « les deux blocs se chevauchent ». Mesuré : pas de
   chevauchement géométrique, le bas de la première carte tombe EXACTEMENT sur le haut de
   la seconde (3386 px pour les deux). Marge nulle, même fond, même rayon : deux cartes
   collées bord à bord se lisent comme une seule boîte qui déborde. `details.page-lue`
   avait sa marge, les cartes ajoutées après ne l'avaient pas — chaque nouvelle sorte de
   carte repartait de zéro. Une seule règle, pour toutes les cartes ouvrables en liste. */
body.hv5 details.page-lue,
body.hv5 details.constat-trafic,
body.hv5 details.cible-citation,
body.hv5 details.page-pot{ margin:0 0 10px }
/* Une carte OUVERTE se détache un peu plus : c'est elle qu'on lit. */
body.hv5 details.levier.ouvrable[open]{ margin-bottom:16px }

/* ════════════════════════════════════════════════════════════════════════════
 * 12/09, soir — LA DESCRIPTION À CÔTÉ DU TITRE, PAS DESSOUS.
 *
 * Christophe : « on peut mettre la description à côté, pas en dessous, pour réduire les
 * cases ». Troisième fois qu'il demande des rectangles plus petits.
 *
 * 📏 MESURÉ EN DIRECT SUR SES DOUZE CARTES, PARCE QUE LA PREMIÈRE VERSION ÉTAIT PIRE.
 *   · empilé (avant) .................................. 898 px
 *   · `minmax(0,42%) minmax(0,1fr)` .................. 909 px — PLUS HAUT de 11 px
 *   · `fit-content(46%) minmax(0,1fr)` ............... 646 px — −28 %
 *
 * Une colonne à largeur fixe réserve 42 % à un titre qui dit « /tarifs », et comprime la
 * description au point de lui faire prendre deux lignes là où elle en tenait une : on
 * gagne en largeur ce qu'on reperd en hauteur. `fit-content()` donne au titre la largeur
 * de SON texte, plafonnée — les titres courts libèrent la place, les longs ne mangent
 * jamais plus de 46 %.
 *
 * ⚠️ Ne s'applique qu'aux cartes bâties sur `.hv5-b-corps` (les listes ouvrables). Les
 * cartes ouvertes de « À faire » posent titre et sous-titre en frères directs de la bulle,
 * à côté du avant/après et des boutons : y mettre une grille casserait la carte, et elles
 * n'ont de toute façon qu'une ligne de sous-titre.
 * ════════════════════════════════════════════════════════════════════════════ */
body.hv5 .hv5-b-corps{
  display:grid;
  grid-template-columns:fit-content(46%) minmax(0,1fr) auto;
  column-gap:20px;
  align-items:baseline;
}
body.hv5 .hv5-b-corps .hv5-b-sous{ margin-top:0 }

/* 🐛 LE CHEVRON ORPHELIN. Il vivait dans le titre (`::after`). Dès que le titre passe
   à la ligne — ce qui arrive maintenant que sa colonne est étroite — il se retrouvait SEUL
   sur la dernière ligne, une flèche flottant sous le texte. Un espace insécable ne suffit
   pas : la coupure peut tomber à la frontière entre le texte et le pseudo-élément. Il
   quitte donc le titre et devient la TROISIÈME COLONNE de la grille, où il ne peut plus
   être emporté par un retour à la ligne. Vérifié dans Chrome sur un titre de 54 signes. */
body.hv5 details.levier.ouvrable > summary .hv5-b-corps .hv5-b-titre::after{ content:none }
body.hv5 details.levier.ouvrable > summary .hv5-b-corps::after{
  content:"\2304"; font-size:14px; line-height:1; display:block;
  color:var(--v5-encre-3); transition:transform .15s;
}
body.hv5 details.levier.ouvrable[open] > summary .hv5-b-corps::after{ transform:rotate(180deg) }

/* Sous 820 px, deux colonnes deviennent deux bandes étroites : chacune prend alors plus de
   lignes que l'empilement qu'elles remplaçaient. On rempile — le chevron, lui, reste à
   droite du titre, là où le pouce le cherche. */
@media(max-width:820px){
  body.hv5 .hv5-b-corps{ grid-template-columns:minmax(0,1fr) auto; column-gap:8px }
  body.hv5 .hv5-b-corps .hv5-b-sous{ margin-top:5px; grid-column:1 / -1 }
}

/* ——— LA VOIE QUI EST UN PARI ———
   12/09, Christophe : « on a aussi le droit d'être audacieux, de tenter des choses
   nouvelles ». La dernière voie est désormais obligée d'être inattendue — et une
   proposition étrange sans étiquette se lit comme une erreur. L'ambre plutôt que le vert :
   ce n'est pas une recommandation, c'est un pari, et ça peut ne rien donner. */
body.hv5 .voie-pari{
  display:inline-block; font-size:11px; font-weight:600; letter-spacing:.04em;
  text-transform:uppercase; padding:2px 8px; border-radius:999px;
  background:var(--v5-ambre-sol); color:var(--v5-ambre);
  border:1px solid var(--v5-ambre); margin-right:8px;
}

body.hv5 .lev-avant{
  font-size:13px; line-height:1.55; color:var(--v5-encre-2);
  background:var(--v5-bulle-2); border-radius:10px;
  padding:8px 12px; margin:2px 0 12px;
}
body.hv5 .lev-avant b{ color:var(--v5-encre); font-weight:600 }

/* Les lignes du bloc « Pages à fort potentiel » vivent DANS l'accordéon « Détail par
   page », dont le contenu est mis en page en dur. Elles reprennent donc l'espacement
   des bulles sans hériter du tableau qui les précède. */
body.hv5 details.page-pot{ margin:0 0 8px }
body.hv5 details.page-pot > summary .hv5-b-titre{
  font-family:ui-monospace,SFMono-Regular,Menlo,monospace; font-size:13px;
  overflow-wrap:anywhere;
}

/* ═══════════════════════════════════════════════════════════════════════════
 * 🔄 12/09 — LIRE LES CITATIONS, REQUÊTE PAR REQUÊTE.
 *
 * Christophe : « là, pour lire les citations, ça ne va pas du tout ». Mesuré : le détail
 * s'ouvrait DANS la carte du pilier, large de 256 px, pendant que les trois cartes
 * voisines restaient vides. Vingt requêtes × cinq IA empilées dans une colonne de la
 * largeur d'un téléphone, avec un défilement intérieur de 340 px par-dessus.
 *
 * C'est une matrice : une ligne par requête, une colonne par IA. Elle se lit d'un coup
 * d'œil à pleine largeur, et pas du tout en colonne. La carte prend donc toute la
 * rangée quand elle s'ouvre, et les noms d'IA ne sont écrits que sur la première ligne —
 * les vingt suivantes n'en ont plus besoin, les colonnes sont alignées.
 *
 * ⚠️ PAS DE `:has()` ICI, ET C'EST DÉLIBÉRÉ. Il aurait suffi, mais la classe est posée
 * en JS (voir performance.html) : après le piège Safari de ce matin, une mise en page
 * qui décide de la lisibilité ne repose pas sur un sélecteur dont le support varie.
 * Sous 900 px la matrice n'a plus la place : elle redevient une pile, et les noms d'IA
 * reviennent sur chaque ligne puisque les colonnes n'existent plus.
 * ═══════════════════════════════════════════════════════════════════════════ */
body.hv5 .pci-dim.citations-ouvertes{ grid-column:1 / -1 }
body.hv5 .pci-dim.citations-ouvertes .cc-list{ max-height:none; gap:2px }
body.hv5 .pci-dim.citations-ouvertes .cc-row{
  display:grid; grid-template-columns:minmax(220px,2fr) repeat(5, minmax(104px,1fr));
  align-items:center; gap:8px; padding:8px 12px;
}
body.hv5 .pci-dim.citations-ouvertes .cc-q{ margin:0; font-size:13px }
/* `display:contents` fait remonter les cinq cellules dans la grille de la ligne :
   sans ça elles resteraient groupées dans une seule colonne. */
body.hv5 .pci-dim.citations-ouvertes .cc-meta-grid{ display:contents }
body.hv5 .pci-dim.citations-ouvertes .cc-cell{ flex-direction:column; align-items:flex-start; gap:2px }
body.hv5 .pci-dim.citations-ouvertes .cc-ia{ font-size:11px; font-weight:600; opacity:.6; letter-spacing:.03em }
body.hv5 .pci-dim.citations-ouvertes .cc-row:not(:first-child) .cc-ia{ display:none }
@media(max-width:900px){
  body.hv5 .pci-dim.citations-ouvertes .cc-row{ display:block }
  body.hv5 .pci-dim.citations-ouvertes .cc-meta-grid{ display:flex }
  body.hv5 .pci-dim.citations-ouvertes .cc-row .cc-ia{ display:inline }
}


/* ═══════════════════════════════════════════════════════════════════════════
 * LA DERNIÈRE RÈGLE DU FICHIER — ET ELLE DOIT LE RESTER
 *
 * « Ce qui est posé sur du vert prend l'encre sur-vert » est la règle qui
 * arbitre le plus de conflits : un bouton vert peut être attrapé par la liste
 * des encres sombres (son encre d'origine était foncée), par celle des verts
 * sombres (son encre était un vert), ou par celle des fonds clairs (son fond
 * l'était avant). Trois listes, trois verdicts contradictoires.
 *
 * Elle est donc écrite ICI, à la fin : à spécificité égale, la dernière règle
 * l'emporte. Tout ce qu'on ajoutera après devra passer devant elle
 * délibérément, pas par accident.
 * ═══════════════════════════════════════════════════════════════════════════ */
body.hv5 .partner-cta,
body.hv5 .evo-periode .active,
body.hv5 .periode .active,
body.hv5 :is(button,a,span,li,label).active:not([class*="pane"]):not([class*="panel"]),
body.hv5 :is(button,a).primary,
body.hv5 .btn.add,
body.hv5 .f-cta-ink,
body.hv5 .b-pub,
body.hv5 .b-save,
body.hv5 .hv5-btn,
/* 🆕 11/09 — la pastille verte de la barre de gauche. Son chiffre était posé en
   blanc dans le script (1,9), puis repeint en rouge clair par une règle d'alerte de
   cette feuille (1,08) : deux encres successives, aucune lisible. Elle a un fond
   vert, donc elle tombe ici, comme tout le reste. */
body.hv5 .sb-todo-badge,
body.hv5 .sb-todo-total{
  color:var(--v5-vert-encre) !important;
}
/* `a.cta` recevait l'encre sur-vert de la règle ci-dessus, mais gardait le vert
   FONCÉ de happia-payfit.css (#0E7A52, pensé pour du texte blanc) : encre sombre
   sur vert sombre, 2,98. L'encre et le fond voyagent ensemble ou pas du tout. */
body.hv5 a.cta:not(.topbar .cta),
body.hv5 button.cta,
body.hv5 .partner-cta,
body.hv5 .evo-periode .active,
body.hv5 .periode .active{ background:var(--v5-encre) !important }


/* ════════════════════════════════════════════════════════════════════════════
   LE MINIMUM DE GRIS — 13/09/2026

   Christophe, trois fois dans la journée, la dernière devant « Cohérence de mes infos » :
   « Y a le cadre gris au fond qui prend de la place pour rien. Trop de gris partout. Je veux
   le minimum de gris, partout où c'est possible on enlève. »

   Ce qu'on avait : tout portait le gris des bulles — le conteneur de section, la carte, la
   liste, et la bulle dedans. Le gris ne disait donc plus rien, puisqu'il était partout, et
   le noir de la palette Encre n'apparaissait nulle part.

   LA RÈGLE : le gris est réservé à ce qui porte UNE information et UNE action — la bulle.
   Un conteneur, une section, une carte de regroupement n'ont qu'un filet. La structure reste
   lisible, la page redevient noire.

   Ce qu'on NE touche pas : `.hv5-bulle` (la bulle du système, c'est elle qui garde le gris),
   les champs de saisie (le gris dit « tu peux écrire ici »), les survols, et le mobilier.
   ════════════════════════════════════════════════════════════════════════════ */
body.hv5 .card,
body.hv5 .tier,
body.hv5 .section,
body.hv5 .perf-card,
body.hv5 .src-group{
  background:transparent !important;
  background-image:none !important;
  border:1px solid var(--v5-filet) !important;
  box-shadow:none !important;
}

/* ════════════════════════════════════════════════════════════════════════════
   LA COLONNE DE GAUCHE EST DU MOBILIER — 13/09/2026, au passage en Papier

   Elle était peinte avec --v5-bulle : sur fond noir ça donnait la bonne couleur par
   accident, et son encre venait de --v5-encre. Au passage en clair, les deux ont suivi
   la page — colonne blanche, et quelques lignes plus bas une encre sombre sur un fond
   qu'on croyait sombre. Mesuré avant de toucher : fond de la colonne #F2F2EE.

   Le menu ne suit pas la page. Il reste sombre dans les deux palettes — c'est ce que
   Christophe a comparé et gardé. Il a donc ses propres jetons (--v5-nav*), et ce bloc
   est en fin de feuille pour passer devant les ~20 règles qui le peignaient avant.
   ════════════════════════════════════════════════════════════════════════════ */
body.hv5 aside.sidebar,
body.hv5 .app aside.sidebar{
  background:var(--v5-nav) !important;
  color:var(--v5-nav-encre) !important;
  border-right:1px solid var(--v5-nav-fil) !important;
}
body.hv5 aside.sidebar nav a,
body.hv5 .app aside.sidebar nav a,
body.hv5 aside.sidebar .nav-group-toggle{ color:var(--v5-nav-encre) !important }
body.hv5 aside.sidebar .nav-label,
body.hv5 .app aside.sidebar .nav-label,
body.hv5 .app aside.sidebar .nav-label.admin,
body.hv5 aside.sidebar .user-info .em,
body.hv5 aside.sidebar .logout{ color:var(--v5-nav-encre-2) !important }
body.hv5 aside.sidebar nav a:hover,
body.hv5 .app aside.sidebar nav a:hover:not(.active),
body.hv5 .sidebar nav a:hover{ background:var(--v5-nav-fond-actif) !important; color:var(--v5-nav-actif) !important }
body.hv5 aside.sidebar nav a.active,
body.hv5 .app aside.sidebar nav a.active,
body.hv5 .app aside.sidebar nav a.active *{ background-color:var(--v5-nav-fond-actif) !important; color:var(--v5-nav-actif) !important }
body.hv5 aside.sidebar nav a.active svg,
body.hv5 .app aside.sidebar nav a.active svg,
body.hv5 .app aside.sidebar nav a.active path{ stroke:var(--v5-vert) !important }
body.hv5 aside.sidebar b,
body.hv5 aside.sidebar .user-info .nm,
body.hv5 aside.sidebar .brand a,
body.hv5 aside.sidebar .brand a svg,
body.hv5 aside.sidebar .brand a path{ color:var(--v5-nav-actif) !important; stroke:var(--v5-nav-actif) !important }
body.hv5 aside.sidebar .footer{ border-top:1px solid var(--v5-nav-fil) !important }
body.hv5 aside.sidebar .avatar,
body.hv5 .sidebar .avatar{ background:var(--v5-encre) !important; color:#FFFFFF !important }


/* ════════════════════════════════════════════════════════════════════════════
   LA TYPOGRAPHIE DE LA BANDE DE GAUCHE, PARTOUT — 13/09/2026

   Christophe : « Le typo c'est pareil, ça va pas. La seule que j'aime bien c'est celle
   de la bande de gauche. Là c'est gras, ça fait pas pro du tout. »

   Relevé dans son navigateur avant de toucher quoi que ce soit, sur « À faire » :

                        la bande de gauche        la zone principale
     police             Space Grotesk             Inter ×106 · Space Grotesk ×2
     graisses           600                       400 · 600 · 700
     dont graisse 700   aucune                    34 éléments
     tailles            11 · 13,5 · 16            11·12·13·14·16·21·24·28

   Il avait raison, et le chiffre qui explique tout est le 700 : un tiers du texte de
   l'écran était dans la graisse la plus lourde. Le menu qu'il aime n'en emploie AUCUNE —
   une seule police, une seule graisse, trois tailles. La hiérarchie y passe par la
   police et la taille, jamais par le poids.

   LA REGLE : les titres prennent la police du menu (Space Grotesk 600), le texte courant
   reste en Inter 400, et plus rien ne dépasse 600. Un gras de plus n'est pas une
   hiérarchie de plus, c'est du bruit.
   ════════════════════════════════════════════════════════════════════════════ */

/* Les titres : la police du menu, sa graisse, sa chasse serrée. */
body.hv5 h1, body.hv5 h2, body.hv5 h3, body.hv5 h4, body.hv5 h5,
body.hv5 .hv5-titre, body.hv5 .hv5-b-titre,
body.hv5 .a-sec-head, body.hv5 .sec-title,
body.hv5 .card > h3, body.hv5 .card-title, body.hv5 .kpi-title,
body.hv5 .voie-titre, body.hv5 .act-title, body.hv5 .a-title{
  font-family:var(--pf-head) !important;
  font-weight:600 !important;
  letter-spacing:-.02em !important;
}

/* Les intitulés de section reprennent la petite capitale espacée de « MA VISIBILITÉ ».
   🆕 15/09/2026 (Christophe : « les blocs site, réputation etc. ne sont pas assez lisibles »).
   MESURE, sur « À faire » : ces intitulés sortaient à 12 px, en gris #5B6472, chasse .4 px.
   Une capitale grise de 12 px avec si peu d'air, c'est lisible quand on la cherche, pas quand
   on parcourt. Et ce sont EUX qui découpent la page en familles : s'ils s'effacent, la liste
   redevient une seule coulée de cartes.
   On ne touche pas à la graisse (rien ne dépasse 600 dans ce back-office, règle plus bas) :
   la lisibilité vient de la taille, de l'encre pleine, et de l'air entre les lettres. */
body.hv5 .a-sec-head, body.hv5 .sec-title, body.hv5 .hv5-groupe-titre{
  font-size:14px !important; text-transform:uppercase !important;
  letter-spacing:1px !important; color:var(--v5-encre) !important;
}

/* 🚨 PLUS RIEN AU-DESSUS DE 600. C'est la seule règle qui fait le travail : le 700
   arrivait de vingt endroits différents, pas d'un seul. On le ramène à 600 partout,
   y compris là où il est écrit en style en ligne par un script. */
body.hv5 b, body.hv5 strong,
body.hv5 h1, body.hv5 h2, body.hv5 h3, body.hv5 h4, body.hv5 h5, body.hv5 h6,
body.hv5 .hv5-btn, body.hv5 .btn, body.hv5 button,
body.hv5 .sec-chev, body.hv5 .sec-count,
body.hv5 [style*="font-weight:700"], body.hv5 [style*="font-weight: 700"],
body.hv5 [style*="font-weight:800"], body.hv5 [style*="font-weight: 800"]{
  font-weight:600 !important;
}
body.hv5 svg text{ font-weight:500 !important }

/* Le texte courant garde Inter : deux rôles, deux polices, et rien d'autre. */
body.hv5 p, body.hv5 li, body.hv5 td, body.hv5 .hv5-b-sous,
body.hv5 .a-desc, body.hv5 .act-desc{
  font-family:"Inter",-apple-system,BlinkMacSystemFont,system-ui,sans-serif !important;
  font-weight:400 !important;
}

/* ════════════════════════════════════════════════════════════════════════════
   LE VERRE — la peinture, en fin de feuille

   Il faut qu'elle passe APRÈS `body.hv5 .hv5-bulle{background:var(--v5-bulle)}` posé plus
   haut : ce fond-là est la couleur COMPOSITE, celle que les cliquets mesurent. Si on la
   laissait sous la couche translucide, on additionnerait deux fois la même lumière et la
   bulle sortirait trop claire. Ici on remet le fond à transparent et c'est le dégradé qui
   peint — le composite ne sert plus qu'à la mesure.

   En Papier comme en Encre, --v5-verre vaut `none` : la règle s'annule d'elle-même et la
   bulle retrouve son aplat. Une seule règle pour les trois palettes.
   ════════════════════════════════════════════════════════════════════════════ */
body.hv5 .hv5-bulle,
body.hv5 .card, body.hv5 .perf-card, body.hv5 .tier{
  background-color:var(--v5-verre-sous) !important;
  background-image:var(--v5-verre) !important;
  border:1px solid var(--v5-verre-bord) !important;
  box-shadow:var(--v5-verre-ombre) !important;
}
body.hv5 .hv5-bulle .hv5-bulle-2,
body.hv5 .hv5-sous-bulle{
  background-color:var(--v5-bulle-2) !important;
  background-image:var(--v5-verre-2) !important;
  border:1px solid var(--v5-verre-bord) !important;
}
/* Le menu est un plan de verre posé sur le même dégradé, pas un aplat rapporté. */
body.hv5 aside.sidebar,
body.hv5 .app aside.sidebar{
  background-color:var(--v5-nav) !important;
  background-image:var(--v5-nav-voile) !important;
}

/* ════════════════════════════════════════════════════════════════════════════
   UNE SEULE LARGEUR UTILE — 13/09/2026

   Vingt-quatre ecrans, onze plafonds : 760, 880, 900, 920, 980, 1080, 1100, 1120,
   1180, 1280, 1500. Le contenu changeait donc de largeur d'un ecran a l'autre, et
   laissait du vide a droite sur les plus etroits.

   LA REGLE : le conteneur prend la page. C'est le TEXTE qui limite sa propre ligne —
   une colonne de prose au-dela de ~78 signes devient penible a lire, mais un tableau
   ou une grille de cartes n'a aucune raison de s'arreter avant le bord.
   ════════════════════════════════════════════════════════════════════════════ */
body.hv5 .main,
body.hv5 .app .main{
  max-width:var(--v5-page) !important;
  width:100% !important;
}
/* La prose se limite elle-meme ; les cartes, tableaux et grilles prennent toute la place. */
body.hv5 .main > p,
body.hv5 .main > .sub,
body.hv5 .main .hv5-chapo,
body.hv5 .main .page-head p{ max-width:78ch }


/* ════════════════════════════════════════════════════════════════════════════
   UN LOGO DE MARQUE A UN SEUL VISAGE — 13/09/2026, la nuit

   Christophe, capture de « Coherence de mes infos » : « la les logos sont pas les memes
   que sur les autres pages ».

   Releve dans son navigateur, sur le MEME Instagram, le MEME jour :

                          taille        coins      fond
     mes-reseaux          46 × 46 px    14 px      blanc
     nap-check, fiches    24 × 24 px     6 px      aucun
     nap-check, liste     30 × 30 px     6 px      gris

   La table de logos etait pourtant deja partagee (scripts/logos-de-marque.js) — c'est le
   travail du 13 au matin. Ce qui ne l'etait pas, c'est le CADRE : le fichier disait
   explicitement « la classe de l'ecran decide de la taille, pas ce fichier ». Trois ecrans,
   trois decisions, trois visages pour la meme marque.

   LA REGLE : une source a un seul visage. Le cadre appartient au systeme, pas a l'ecran.
   Deux tailles seulement, declarees ici : le logo posé dans une liste ou une fiche (28 px),
   et le logo SUJET de sa carte (46 px, `.grand` — ou `.ch-logo`, qui l'est par nature).
   Le repli neutre — une lettre, quand la source n'a pas de logo connu — prend exactement le
   meme cadre : sans quoi les deux tiers d'une grille sont des logos et le reste des taches.
   ════════════════════════════════════════════════════════════════════════════ */
/* 🚨 ON NE VISE QUE LES DEUX CLASSES DU SYSTEME. Premier jet : la regle listait aussi
   `.card-badge`, `.src-badge` et `.ch-logo`, les classes des ecrans. Or `.src-badge` designe
   AUSSI, sur l'ecran d'audit, une pastille d'etat en forme de pilule (« Identique »,
   « Divergent ») : elle serait devenue un carre de 28 px. Un nom de classe n'est pas un
   contrat — c'est la classe posee par logos-de-marque.js qui l'est. */
body.hv5 .logo-marque,
body.hv5 .logo-neutre{
  --logo-t:28px; --logo-r:8px;
  width:var(--logo-t) !important;
  height:var(--logo-t) !important;
  border-radius:var(--logo-r) !important;
  display:inline-flex !important;
  align-items:center; justify-content:center;
  flex-shrink:0; padding:0; overflow:hidden; box-sizing:border-box;
}
body.hv5 .logo-marque.grand,
body.hv5 .logo-neutre.grand{ --logo-t:46px; --logo-r:14px }

/* Le SVG de marque porte deja son propre fond et ses propres coins : le cadre ne lui
   ajoute ni gris ni filet, sinon on voit une bordure autour de chaque logo. */
body.hv5 .logo-marque{ background:transparent !important; border:0 !important }
body.hv5 .logo-marque > svg{ width:100% !important; height:100% !important; display:block; border-radius:inherit }

/* Le repli : une lettre dans la palette, jamais un logo invente. */
body.hv5 .logo-neutre{
  background:var(--v5-bulle-2) !important;
  border:1px solid var(--v5-filet) !important;
  color:var(--v5-encre-2) !important;
  font-weight:600; letter-spacing:-.02em;
  font-size:calc(var(--logo-t) * .46);
}


/* ════════════════════════════════════════════════════════════════════════════
   LES ECRANS D'ADMINISTRATION SUIVENT LA MEME GRAMMAIRE — 15/09/2026

   Christophe, devant le cockpit : « que c'est moche quelle horreur, pourquoi tu me fais
   pas un truc propre comme le site ou le back-office » — puis, le lendemain : « la page est
   toujours aussi moche, j'y comprends rien, elle me saoule », avec la capture de l'ecran
   ADMIN et cette phrase : « je veux un truc propre et simple comme ca ».

   Il a donc donne le modele lui-meme, et ce modele existe deja dans le produit
   (espace-client/admin.html, refait le 31/07 sur « annees 80, moche, trop d'info ») :

       un TITRE de famille en petites capitales grises, et sous lui
       des CARTES toutes identiques : un filet, un libelle, un compteur, une fleche.

   UNE SEULE SURFACE EST PEINTE : la carte. La famille, elle, n'est qu'un titre.

   Ce que le cockpit faisait au lieu de ca : une grosse carte par famille, contenant des
   lignes elles-memes peintes. Mesure du 15/09 : 70 surfaces peintes, dont 56 posees sur une
   autre a MOINS de 1,20 de contraste — et toutes portaient deja un filet. Deux plans
   empiles qui ne se distinguent pas, ca ne se lit pas comme une hierarchie, ca se lit
   comme une salissure.

   🚨 PREMIERE CORRECTION, LE 15/09 AU MATIN, ET ELLE N'ETAIT QU'A MOITIE JUSTE : j'avais
   garde la grosse carte et vide les lignes. Ca reglait le contraste, pas la lecture. Le
   modele qu'il montre fait l'inverse, et il a raison : c'est la LIGNE qui porte une
   information et une action, donc c'est elle qui merite la carte. La famille ne porte
   qu'un nom : elle n'a pas besoin d'etre peinte pour ca.

   L'EXCEPTION, ecrite le 13/09 et maintenue : un CHAMP DE SAISIE se peint, c'est ce qui le
   distingue d'une etiquette.
   ════════════════════════════════════════════════════════════════════════════ */

/* La famille n'est plus une carte : c'est un titre. */
body.hv5 details.sec,
body.hv5 .sec{
  background:transparent !important; background-image:none !important;
  border:0 !important; box-shadow:none !important; padding:0 !important;
  margin:0 0 28px !important;
}
body.hv5 .sec > .sec-head{
  border:0 !important; padding:0 0 12px !important; margin:0 !important;
  display:flex !important; align-items:center; gap:8px; list-style:none; cursor:pointer;
}
body.hv5 .sec > .sec-head::-webkit-details-marker{ display:none }
body.hv5 .sec .sec-title{
  font-size:11px !important; font-weight:700 !important; text-transform:uppercase;
  letter-spacing:1.3px; color:var(--v5-encre-4) !important;
}
body.hv5 .sec .sec-count{
  font-size:11px; font-weight:700; letter-spacing:0;
  background:var(--v5-neutre-sol) !important; color:var(--v5-encre-2) !important;
  border-radius:999px; padding:2px 8px;
}
body.hv5 .sec.sec-critical .sec-count{
  background:var(--v5-rouge-sol) !important; color:var(--v5-rouge) !important;
}

/* La ligne redevient la carte, comme sur l'ecran Admin. */
body.hv5 .sec .items{ list-style:none; padding:0 !important; margin:0 !important }
body.hv5 .sec .item,
body.hv5 .sec .items li,
body.hv5 .sec li.item{
  background:var(--v5-bulle) !important; background-image:none !important;
  border:1px solid var(--v5-filet) !important;
  /* 14 px, comme la carte de l'ecran Admin qu'il a montre — et c'est un cran de l'echelle
     des rayons (6 · 10 · 14 · 20). Le 12 du premier jet n'en etait pas un. */
  border-radius:14px !important; padding:12px 16px !important;
  margin:0 0 8px !important; box-shadow:none !important;
}
body.hv5 .sec .item:last-child,
body.hv5 .sec .items li:last-child{ margin-bottom:0 !important }

/* 🚨 ET DANS UNE CARTE, ON NE REMET PAS DE CARTES. Les exemples listes sous une remarque du
   gardien ressortaient en blanc sur blanc (1,00) avec leur propre filet : une carte dans une
   carte, le defaut qu'on vient de retirer, reapparu un niveau plus bas. Ce sont des lignes,
   elles se separent par l'espace. */
body.hv5 .sec .item li{
  background:transparent !important; background-image:none !important;
  border:0 !important; border-radius:0 !important;
  padding:4px 0 !important; margin:0 !important;
}

/* Ce qui vit DANS la carte ne se repeint pas : le filet de la carte suffit. */
body.hv5 .sec .lnk,
body.hv5 .item .lnk,
body.hv5 .items li .lnk{
  background:transparent !important; background-image:none !important; box-shadow:none !important;
  border:1px solid var(--v5-filet-2) !important; color:var(--v5-encre) !important;
}

/* Un champ de saisie, lui, se peint : c'est ce qui le distingue d'une etiquette. */
body.hv5 .sec input, body.hv5 .item input, body.hv5 .copilote input,
body.hv5 .sec textarea, body.hv5 .copilote textarea{
  background:var(--v5-neutre-sol) !important;
  border:1px solid var(--v5-filet-2) !important;
  color:var(--v5-encre) !important;
}


/* ════════════════════════════════════════════════════════════════════════════
   🚨 CE BLOC EST LE DERNIER DE LA FEUILLE, ET IL DOIT LE RESTER.

   Premiere tentative, le 16/09 : une huitieme feuille, happia-bo.css, injectee
   par le worker apres la V5. Deux cliquets l'ont refusee dans la minute, et ils
   avaient raison :

     · `la-palette-tient-toute-seule` : une feuille injectee par le worker qui
       declare des couleurs pose des fonds et des filets sur tout le back-office,
       en !important, sans apparaitre dans aucun <link>. C'est exactement ce que
       halo et payfit ont fait, et ce qu'on a mis des semaines a demeler.
     · `le-gris-ne-contient-pas-de-gris` : la regle de peinture doit etre injectee
       au meme endroit que la V5 ; une ligne glissee entre les deux la separait.

   La bonne place n'etait donc pas une huitieme feuille : c'est la fin de
   celle-ci. Meme effet — elle arrive apres tout le reste — sans un fichier de
   plus et sans casser deux garanties existantes.
   ════════════════════════════════════════════════════════════════════════════ */
/* ═══════════════════════════════════════════════════════════════════════════
 * LE CONTRAT DU BOUTON, ET IL EST ÉCRIT EN DERNIER
 *
 * 17/09/2026. Christophe : « les boutons mets-les aux couleurs des pages ou en
 * transparence, comme tu préfères ».
 *
 * MESURÉ SUR MES AVIS, avant d'écrire une ligne :
 *   « Copier la réponse »        fond transparent, encre #FFFFFF  → invisible sur la carte
 *   « Supprimer définitivement » fond transparent, encre #0C1F4E  → contraste 1,32
 * Un bouton blanc sur blanc, et un bouton de suppression qui n'a plus l'air
 * dangereux. Aucun des deux n'était voulu.
 *
 * LA CAUSE N'EST PAS UNE COULEUR MAL CHOISIE, C'EST UNE ACCUMULATION, la même
 * qu'au « Corriger » bleu sur bleu de ce matin. Trois listes géantes, écrites à
 * trois moments pour trois contextes, matchent le même bouton :
 *   « body.hv5 .btn, .refresh-btn, … »   → background:transparent !important
 *   « body.hv5 .btn, .card, .chip, … »   → color:var(--v5-encre) !important
 *   « … .a-btn.ag…, .btn-mint, … »       → color:var(--v5-vert-encre) !important
 * La dernière gagne et pose du blanc, sans rien savoir du fond que la première a
 * effacé. Personne n'avait tort en écrivant sa règle. C'est la somme qui est
 * fausse, et une somme ne se relit pas.
 *
 * ON NE RAJOUTE DONC PAS UNE QUATRIÈME LISTE AU MILIEU. On écrit le contrat
 * ENTIER, fond ET encre ensemble, à la toute fin de la feuille, là où plus rien
 * ne peut passer derrière.
 *
 * CE QUE DIT LE CONTRAT, et c'est la doctrine V5 d'origine, tenue jusqu'au bout :
 *   un seul plein par écran, « .primary », que nav-equipe.js repeint ensuite à la
 *   couleur de l'agent qui tient l'écran ;
 *   tout le reste est un contour, encre lisible, jamais blanche ;
 *   « .danger » garde son rouge, parce que le danger n'est pas du décor. C'est la
 *   seule exception, et elle est la même que dans la règle des couleurs.
 * ═══════════════════════════════════════════════════════════════════════════ */
body.hv5 .btn:not(.primary):not(.danger),
body.hv5 .hv5-btn:not(.primary):not(.danger),
body.hv5 .btn-export:not(.primary):not(.danger){
  background:transparent !important; background-image:none !important;
  color:var(--v5-encre-2) !important;
  border:1px solid var(--v5-filet) !important;
}
body.hv5 .btn:not(.primary):not(.danger) *,
body.hv5 .hv5-btn:not(.primary):not(.danger) *,
body.hv5 .btn-export:not(.primary):not(.danger) *{ color:inherit !important }

/* 🆕 18/09 soir — L'ACTION PRINCIPALE PASSE AU CORAIL (V6).
   Elle était en encre depuis ce matin, et l'encre ne se voyait pas comme une action :
   elle se voyait comme du texte en gras. */
body.hv5 .btn.primary,
body.hv5 .hv5-btn.primary,
body.hv5 .btn-export.primary{
  background:var(--v6-corail) !important; border:1px solid var(--v6-corail) !important;
  color:var(--v6-corail-encre) !important;
}
body.hv5 .btn.primary *,
body.hv5 .hv5-btn.primary *,
body.hv5 .btn-export.primary *{ color:inherit !important }

/* Le seul bouton qui garde une couleur à lui, sur les huit écrans et les huit
   teintes : celui qui détruit quelque chose. */
body.hv5 .btn.danger,
body.hv5 .hv5-btn.danger{
  background:var(--v5-rouge) !important; border:1px solid var(--v5-rouge) !important;
  color:var(--v5-rouge-encre) !important;
}
body.hv5 .btn.danger *,
body.hv5 .hv5-btn.danger *{ color:inherit !important }

/* ============================================================================
   LA GRAMMAIRE DU BACK-OFFICE — le dernier bloc de cette feuille.
   16/09/2026. Christophe : « fais tout le back-office et on verra bien, fais de
   ton mieux ». Avant ca : « je veux exactement comme The Pick, pas a moitie »,
   et « j'en peux plus de ces gros boutons vert et orange, je veux de la
   transparence ».

   ────────────────────────────────────────────────────────────────────────────
   POURQUOI CETTE FEUILLE EXISTE, ET POURQUOI ELLE EST LA DERNIERE

   Mesure du 16/09, avant d'ecrire une ligne :

       happia-fun.css            391 lignes        modern.css              1 065
       espace-client.css       1 108               admin-modern-plus.css     143
       happia-halo.css           168               happia-payfit.css         236
       happia-v5.css           4 237
       ───────────────────────────────────────────────────────────────────────
       7 348 lignes, sept feuilles, dont TROIS injectees par le worker apres
       celles que la page declare. Plus 5 840 lignes de <style> dans les 72
       pages. The Pick, tout son produit compris : 490 lignes.

   Sept feuilles qui se contredisent, ca ne se corrige pas en ajoutant une
   huitieme regle au bon endroit : on a passe la soiree a le verifier, et chaque
   correctif se faisait ecraser par une feuille chargee plus tard.

   ON NE SUPPRIME RIEN CE SOIR. Les sept feuilles restent chargees : elles
   portent encore la geometrie, les composants et mille details qu'on ne peut
   pas verifier a cette heure sur 72 ecrans. Cette feuille-ci arrive EN DERNIER
   et ne dit qu'une chose : la grammaire. Le fond, les titres, les boutons, les
   onglets, les tuiles, les tableaux, les etats, les champs.

   ⚠ LES !important SONT PROVISOIRES, ET C'EST ECRIT NOIR SUR BLANC.
   Les anciennes feuilles en contiennent des centaines : sans eux cette feuille
   perdrait, meme en dernier. Ils partent au fur et a mesure qu'on retire les
   anciennes feuilles — et on retire chaque feuille en verifiant qu'elle ne
   change plus rien, exactement comme on l'a fait pour les 238 regles mortes de
   la barre laterale.

   Tout est portee par `body.hv5` : le site public n'est pas concerne.
   ============================================================================ */

/* Les jetons, eux, ont bouge dans la PALETTE (bloc « LE SITE » plus haut) : un jeton
   declare deux fois, c'est la derniere declaration qui gagne, et la palette affichee
   n'est plus celle qu'on croit. Le cliquet `la-palette-tient-toute-seule` l'a refuse
   dans la minute — a raison. Ici, on ne fait que la grammaire. */

/* ---------- LE FOND EST BLANC, PARTOUT ---------- */
body.hv5 .app,
body.hv5 .main{ background:transparent !important }

/* ---------- LA BARRE LATERALE ---------- */
body.hv5 aside.sidebar,
body.hv5 .sidebar{
  background:#FFFFFF !important; background-image:none !important;
  border-right:1px solid var(--v5-filet) !important; box-shadow:none !important;
  color:var(--v5-encre-2) !important;
}
body.hv5 aside.sidebar nav a,
body.hv5 .sidebar nav a{
  color:var(--v5-encre-2) !important; background:transparent !important;
  border-radius:10px !important; font-weight:500 !important;
}
body.hv5 aside.sidebar nav a:hover,
body.hv5 .sidebar nav a:hover{ background:var(--v5-neutre-sol) !important; color:var(--v5-encre) !important }
body.hv5 aside.sidebar nav a.active,
body.hv5 .sidebar nav a.active{ background:var(--v5-encre) !important; color:#FFFFFF !important }
body.hv5 aside.sidebar .nav-label,
body.hv5 aside.sidebar .nav-group-toggle,
body.hv5 .sidebar .nav-label{
  color:var(--v5-encre-4) !important; background:transparent !important;
  font-size:11px !important; letter-spacing:.08em !important; font-weight:600 !important;
}
body.hv5 aside.sidebar .brand,
body.hv5 aside.sidebar .brand *{ color:var(--v5-encre) !important }
body.hv5 aside.sidebar .brand img{ filter:none !important; opacity:1 !important }
body.hv5 aside.sidebar .footer,
body.hv5 aside.sidebar .footer *{ color:var(--v5-encre-3) !important }
body.hv5 aside.sidebar .user-info .nm{ color:var(--v5-encre) !important }
body.hv5 aside.sidebar .logout{ color:var(--v5-encre-3) !important }
body.hv5 aside.sidebar .logout:hover{ color:var(--v5-encre) !important }

/* ---------- LE TITRE DE PAGE DOMINE ----------
   Quatre !important le clouaient a 28 px au mieux (.app .main h1 dans
   happia-payfit.css, .main h3 dans modern.css). On repond avec la meme arme :
   c'est la seule qui passe, et elle part avec ces feuilles-la. */
body.hv5 .main .page-head h1,
body.hv5 .page-head h1{
  font-size:34px !important; font-weight:640 !important;
  letter-spacing:-.02em !important; line-height:1.15 !important; color:var(--v5-encre) !important;
}
body.hv5 .page-head .sous{ font-size:14px !important; color:var(--v5-encre-3) !important; font-weight:400 !important }

/* ---------- LES BOUTONS. TRANSPARENTS, SAUF UN ----------
   Vingt-deux surfaces pleines comptees sur le seul Cockpit : vert, ambre,
   menthe, toutes disant « c'est moi le geste important » en meme temps. Quand
   tout crie, plus rien ne s'entend. */
body.hv5 .btn,
body.hv5 .refresh-btn,
body.hv5 .btn-export,
body.hv5 .ntc-cta,
body.hv5 .ntc-seg-btn,
body.hv5 button.lnk,
body.hv5 .hv5-btn{
  background:transparent !important; background-image:none !important;
  border:1px solid var(--v5-filet) !important; color:var(--v5-encre-2) !important;
  border-radius:999px !important; box-shadow:none !important; font-weight:500 !important;
}
body.hv5 .btn:hover,
body.hv5 .refresh-btn:hover,
body.hv5 .btn-export:hover,
body.hv5 .ntc-cta:hover,
body.hv5 .ntc-seg-btn:hover,
body.hv5 .hv5-btn:hover{
  /* 🐛 18/09 soir — CETTE RÈGLE DÉCIDAIT L'ENCRE SANS RIEN SAVOIR DU FOND.
     Au survol elle passait le texte à l'encre, quel que soit le fond du bouton dessous.
     Tant que tous les boutons survolés étaient clairs, ça marchait par chance. Le contrat
     du matin l'interdit, et son cliquet l'a rattrapée dès que l'ordre des blocs a bougé :
     elle déclare donc maintenant les deux, comme tout le reste. */
  background:var(--v5-survol) !important;
  border-color:var(--v5-encre) !important;
  color:var(--v5-encre) !important;
}
/* Le seul plein de l'ecran. On le demande, il n'arrive jamais tout seul. */
body.hv5 .btn.primary,
body.hv5 .btn-export.primary,
body.hv5 .hv5-btn.primary{
  background:var(--v5-encre) !important; border-color:var(--v5-encre) !important; color:#FFFFFF !important;
}
/* Un segment choisi se marque par son filet, pas par un aplat. */
body.hv5 .ntc-seg-btn.on{
  background:var(--v5-neutre-sol) !important; border-color:var(--v5-encre) !important; color:var(--v5-encre) !important;
}

/* ---------- LES ONGLETS : UN TRAIT, PAS UNE PILULE PLEINE ---------- */
body.hv5 .tabs,
body.hv5 .subtabs,
body.hv5 .prog-tabs{
  background:transparent !important; border-bottom:1px solid var(--v5-filet) !important;
  border-radius:0 !important; padding:0 !important; gap:4px;
}
body.hv5 .tabs .tab,
body.hv5 .tabs .tab-group,
body.hv5 .subtabs .tab,
body.hv5 .prog-tabs .tab{
  background:transparent !important; border:0 !important;
  border-bottom:2px solid transparent !important; border-radius:0 !important;
  color:var(--v5-encre-3) !important; font-weight:500 !important; box-shadow:none !important;
}
body.hv5 .tabs .tab.active,
body.hv5 .tabs .tab-group.on,
body.hv5 .subtabs .tab.active,
body.hv5 .prog-tabs .tab.active{
  background:transparent !important; color:var(--v5-encre) !important;
  border-bottom-color:var(--v5-encre) !important;
}
/* 🐛 17/09/2026 — Christophe, sur « Mes avis » : « on ne voit rien quand c'est cliqué ».
   Mesuré : l'onglet actif « Avis Google » avait un texte BLANC SUR BLANC. Contraste 1,00.

   DEUX RÈGLES QUI NE SE PARLENT PAS, ENCORE. Plus haut dans cette feuille, l'état
   sélectionné pose un fond sombre et écrit SES ENFANTS en blanc — parce que le libellé
   d'un onglet vit souvent dans un <span>, et qu'il fallait bien le retourner avec le fond.
   Ce bloc-ci, écrit plus tard pour les onglets soulignés, REND LE FOND TRANSPARENT mais
   ne touche que la couleur du bouton. L'enfant, lui, restait blanc.

   Le bouton était donc à l'encre, correctement, et le mot qu'on lit était invisible.
   C'est la même faute que le bouton « Corriger » du tableau de bord, à un autre endroit :
   qui change le fond d'un contrôle répond de TOUT ce qui s'écrit dessus, enfants compris. */
body.hv5 .tabs .tab.active *,
body.hv5 .tabs .tab-group.on *,
body.hv5 .subtabs .tab.active *,
body.hv5 .prog-tabs .tab.active *{ color:inherit !important }

/* ---------- LES CHIFFRES ---------- */
body.hv5 .kpi{
  background:transparent !important; border:1px solid var(--v5-filet) !important;
  border-radius:14px !important; box-shadow:none !important;
}
body.hv5 .kpi .lab{ font-size:12px !important; color:var(--v5-encre-3) !important; font-weight:400 !important }
body.hv5 .kpi .val{
  font-size:24px !important; font-weight:600 !important; letter-spacing:-.02em;
  font-variant-numeric:tabular-nums; color:var(--v5-encre) !important;
}
/* Un chiffre n'est pas un etat : il reste en encre, quelle que soit sa classe. */
body.hv5 .kpi .val.mint,
body.hv5 .kpi .val.good,
body.hv5 .kpi .val.bad{ color:var(--v5-encre) !important }
body.hv5 .kpi .delta{ background:var(--v5-neutre-sol) !important; color:var(--v5-encre-2) !important }

/* ---------- UNE LISTE EST UN TABLEAU ---------- */
body.hv5 table{ border-collapse:collapse }
body.hv5 thead th{
  background:var(--v5-bulle-2) !important; color:var(--v5-encre-3) !important;
  font-size:12px !important; font-weight:600 !important;
  letter-spacing:.05em; text-transform:uppercase;
  border-bottom:1px solid var(--v5-filet) !important; text-align:left;
}
body.hv5 tbody td{ border-bottom:1px solid var(--v5-filet-2) !important }
body.hv5 tbody tr:hover{ background:var(--v5-survol) !important }

/* ---------- LES CARTES : UN FILET, PAS UNE OMBRE ---------- */
body.hv5 .card,
body.hv5 .sec .item,
body.hv5 .hv5-bulle,
body.hv5 .source-block,
body.hv5 .perf-card{ box-shadow:none !important }
body.hv5 *{ text-shadow:none !important }

/* ---------- LES ETATS. TROIS, PAS SIX ---------- */
body.hv5 .pill,
body.hv5 .ia-state,
body.hv5 .chip{ box-shadow:none !important; font-weight:600 !important }

/* ---------- LES CHAMPS ---------- */
body.hv5 input,
body.hv5 textarea,
body.hv5 select{
  background:var(--v5-neutre-sol) !important; border:1px solid var(--v5-filet) !important;
  color:var(--v5-encre) !important; box-shadow:none !important;
}
body.hv5 input:focus,
body.hv5 textarea:focus,
body.hv5 select:focus{ outline:0; border-color:var(--v5-encre) !important; background:var(--v5-bulle) !important }

/* ---------- LES QUATRE DERNIERS BLANCS SUR BLANC ----------
   Mesure de contraste sur le Cockpit, une fois la grammaire posee : quatre
   textes seulement passent sous 2,5.

       « À traiter »  (onglet actif)   blanc sur blanc      1,00
       « Illimité »   (credits)        blanc sur blanc      1,00
       « WhatsApp »                    blanc sur vert pale  1,98
       « C »          (avatar)         gris sur vert        1,23

   Les trois derniers sont ecrits en style EN LIGNE par sidebar-render.js, pour
   la barre sombre : `color:inherit` sur un fond `rgba(255,255,255,.08)`. Une
   declaration de feuille marquee !important passe devant un style en ligne qui
   ne l'est pas : c'est la seule chose qui les rattrape sans toucher au script.
   Meme famille que les 37 infobulles du 13/09 et que le titre invisible du
   tableau de bord : un texte ecrit en blanc sans dire sur quoi. */
body.hv5 aside.sidebar b,
body.hv5 aside.sidebar span,
body.hv5 aside.sidebar small,
body.hv5 aside.sidebar div{ color:inherit !important }
body.hv5 aside.sidebar a.active,
body.hv5 aside.sidebar a.active *{ background:var(--v5-encre) !important; color:#FFFFFF !important }
body.hv5 aside.sidebar #sb-credits{ background:var(--v5-neutre-sol) !important }
body.hv5 aside.sidebar .avatar{ background:var(--v5-neutre-sol) !important; color:var(--v5-encre) !important }
/* L'onglet actif : le trait dit qu'il est actif, l'encre le rend lisible. */
body.hv5 #tabs .tab.active,
body.hv5 .tabs button.tab.active{ color:var(--v5-encre) !important; background:transparent !important }
/* Le compteur du groupe Admin heritait de la couleur de l'etiquette (--v5-encre-4,
   2,11 de contraste). Un chiffre qu'on pose pour alerter doit d'abord se lire. */
body.hv5 aside.sidebar .sb-todo-total{ color:var(--v5-encre-2) !important; font-weight:600 }

/* ---------- LES DERNIERS BLANCS, MESURES SUR L'ESPACE CLIENT ----------
   Balayage de contraste sur « A faire », une fois la grammaire posee : six textes
   sous 2,5. Tous de la meme famille, et toujours la meme : un texte ecrit en blanc
   parce qu'il vivait sur un aplat plein, et l'aplat est parti.

       « Choisir » (×3)   .hv5-btn        blanc sur transparent   1,06
       le nom du compte   .nm             blanc sur blanc         1,00
       les deux compteurs .sb-todo-*      gris pale               1,06 et 2,03

   Un bouton qui perd son fond doit reprendre l'encre : c'est la contrepartie de la
   transparence, et elle n'est pas optionnelle. Apres : zero texte sous 2,5. */
body.hv5 button.hv5-btn,
body.hv5 a.hv5-btn,
body.hv5 button.hv5-btn.petit,
body.hv5 a.hv5-btn.petit{
  background:transparent !important; border:1px solid var(--v5-filet) !important;
  color:var(--v5-encre-2) !important; box-shadow:none !important;
}
body.hv5 button.hv5-btn.primary,
body.hv5 a.hv5-btn.primary{
  background:var(--v5-encre) !important; border-color:var(--v5-encre) !important; color:#FFFFFF !important;
}
body.hv5 aside.sidebar .sb-todo-total,
body.hv5 aside.sidebar .sb-todo-badge{ color:var(--v5-encre-2) !important; background:var(--v5-neutre-sol) !important }
body.hv5 aside.sidebar .user-info .nm,
body.hv5 aside.sidebar .nm{ color:var(--v5-encre) !important }

/* ═══════════════════════════════════════════════════════════════════════════
 * LE CONTRAT DU BOUTON, ET IL EST ÉCRIT EN DERNIER
 *
 * 17/09/2026. Christophe : « les boutons mets-les aux couleurs des pages ou en
 * transparence, comme tu préfères ».
 *
 * MESURÉ SUR MES AVIS, avant d'écrire une ligne :
 *   « Copier la réponse »        fond transparent, encre #FFFFFF  → invisible sur la carte
 *   « Supprimer définitivement » fond transparent, encre #0C1F4E  → contraste 1,32
 * Un bouton blanc sur blanc, et un bouton de suppression qui n'a plus l'air
 * dangereux. Aucun des deux n'était voulu.
 *
 * LA CAUSE N'EST PAS UNE COULEUR MAL CHOISIE, C'EST UNE ACCUMULATION, la même
 * qu'au « Corriger » bleu sur bleu de ce matin. Trois listes géantes, écrites à
 * trois moments pour trois contextes, matchent le même bouton :
 *   « body.hv5 .btn, .refresh-btn, … »   → background:transparent !important
 *   « body.hv5 .btn, .card, .chip, … »   → color:var(--v5-encre) !important
 *   « … .a-btn.ag…, .btn-mint, … »       → color:var(--v5-vert-encre) !important
 * La dernière gagne et pose du blanc, sans rien savoir du fond que la première a
 * effacé. Personne n'avait tort en écrivant sa règle. C'est la somme qui est
 * fausse, et une somme ne se relit pas.
 *
 * ON NE RAJOUTE DONC PAS UNE QUATRIÈME LISTE AU MILIEU. On écrit le contrat
 * ENTIER, fond ET encre ensemble, à la toute fin de la feuille, là où plus rien
 * ne peut passer derrière.
 *
 * CE QUE DIT LE CONTRAT, et c'est la doctrine V5 d'origine, tenue jusqu'au bout :
 *   un seul plein par écran, « .primary », que nav-equipe.js repeint ensuite à la
 *   couleur de l'agent qui tient l'écran ;
 *   tout le reste est un contour, encre lisible, jamais blanche ;
 *   « .danger » garde son rouge, parce que le danger n'est pas du décor. C'est la
 *   seule exception, et elle est la même que dans la règle des couleurs.
 * ═══════════════════════════════════════════════════════════════════════════ */
body.hv5 .btn:not(.primary):not(.danger),
body.hv5 .hv5-btn:not(.primary):not(.danger),
body.hv5 .btn-export:not(.primary):not(.danger){
  background:transparent !important; background-image:none !important;
  color:var(--v5-encre-2) !important;
  border:1px solid var(--v5-filet) !important;
}
body.hv5 .btn:not(.primary):not(.danger) *,
body.hv5 .hv5-btn:not(.primary):not(.danger) *,
body.hv5 .btn-export:not(.primary):not(.danger) *{ color:inherit !important }

body.hv5 .btn.primary,
body.hv5 .hv5-btn.primary,
body.hv5 .btn-export.primary{
  background:var(--v5-encre) !important; border:1px solid var(--v5-encre) !important;
  color:#FFFFFF !important;
}
body.hv5 .btn.primary *,
body.hv5 .hv5-btn.primary *,
body.hv5 .btn-export.primary *{ color:inherit !important }

/* Le seul bouton qui garde une couleur à lui, sur les huit écrans et les huit
   teintes : celui qui détruit quelque chose. */
body.hv5 .btn.danger,
body.hv5 .hv5-btn.danger{
  background:var(--v5-rouge) !important; border:1px solid var(--v5-rouge) !important;
  color:var(--v5-rouge-encre) !important;
}
body.hv5 .btn.danger *,
body.hv5 .hv5-btn.danger *{ color:inherit !important }

/* ═══ FIN DE LA GRAMMAIRE DU BACK-OFFICE ═══
   Ce qui suit n'en fait pas partie : ce sont les contrats de la V6, qui doivent passer
   APRÈS pour avoir le dernier mot sur les boutons. La grammaire se mesure donc d'ici à
   son titre, et pas jusqu'à la fin du fichier. */

/* ═══════════════════════════════════════════════════════════════════════════
   V6 — LA FORME DES BOUTONS, ET L'ÉTAT DÉSACTIVÉ.
   Mesuré avant d'écrire : le primaire sortait en 999px de rayon et 1px 6px de marge
   intérieure — la marge par défaut du navigateur. Personne n'avait donné de FORME aux
   boutons, seulement des couleurs. Et « désactivé » rendait exactement le même corail
   qu'actif : un bouton mort qui appelle autant qu'un bouton vivant.
   Le danger, lui, se distingue par sa forme et non par sa teinte : le corail de l'action
   et le rouge du danger sont à ΔE 22, deux rouges voisins. Aplat pour agir, contour pour
   détruire. */
body.hv5 .btn,
body.hv5 .hv5-btn,
body.hv5 .btn-export{
  border-radius:var(--v6-r-bouton) !important;
  padding:8px 16px !important;
  font-size:13px !important;
  font-weight:600 !important;
  line-height:1.2 !important;
  min-height:40px;
  display:inline-flex; align-items:center; justify-content:center; gap:8px;
}
body.hv5 .btn:disabled,
body.hv5 .btn[disabled],
body.hv5 .btn[aria-disabled="true"],
body.hv5 .hv5-btn:disabled,
body.hv5 .hv5-btn[disabled]{
  opacity:.45 !important;
  cursor:not-allowed !important;
  filter:saturate(.35);
}
body.hv5 .btn.danger,
body.hv5 .hv5-btn.danger,
body.hv5 .btn-export.danger{
  background:var(--v5-rouge-sol) !important;
  border:1.5px solid var(--v5-rouge) !important;
  color:var(--v5-rouge) !important;
}
body.hv5 .btn.danger *,
body.hv5 .hv5-btn.danger *{ color:inherit !important }
body.hv5 .btn.danger:hover:not(:disabled),
body.hv5 .hv5-btn.danger:hover:not(:disabled){
  background:var(--v5-rouge) !important; color:#FFFFFF !important;
}
body.hv5 .btn.primary:hover:not(:disabled),
body.hv5 .hv5-btn.primary:hover:not(:disabled){
  background:var(--v6-corail-2) !important; border-color:var(--v6-corail-2) !important;
}
body.hv5 .btn:focus-visible,
body.hv5 .hv5-btn:focus-visible{
  outline:2px solid var(--v5-encre) !important; outline-offset:2px !important;
}
/* ═══════════════════════════════════════════════════════════════════════════
   V6 — TOUTES LES ACTIONS PLEINES, PAS SEULEMENT .btn.primary.
   Relevé sur les écrans réels : le bouton d'action ne porte pas la même classe d'une
   page à l'autre. NAP Check utilise .btn-mint, l'accueil .ob-btn-primary, les exports
   .btn-export.primary. Trois listes géantes de sélecteurs les renvoyaient toutes vers le
   vert, qui était l'accent de la V5. En n'habillant que .btn.primary, on aurait laissé
   la moitié des écrans avec un bouton vert au milieu d'une page corail.
   On les nomme donc ici, une fois, et seulement celles qui sont des BOUTONS : les listes
   d'origine mélangent des badges et des pastilles, qui n'ont rien à faire en corail.

   🐛 Trouvé au balayage des onze écrans : `.btn-ink` (« Enregistrer mes sources », NAP Check)
   sortait à 1,00 de contraste — vert sur vert, un bouton parfaitement invisible. Il n'était
   dans aucune des listes. Un relevé à la main les aurait manqués tous les deux. */
body.hv5 .btn-mint,
body.hv5 .btn.btn-mint,
body.hv5 .btn.mint,
body.hv5 .btn-ink,
body.hv5 .rp-cta,
body.hv5 .btn-primary,
body.hv5 .btn-pri,
body.hv5 .btn-send,
body.hv5 .ob-btn-primary,
body.hv5 .f-cta-mint,
body.hv5 .hf-btn-primary,
body.hv5 .catalog-add-btn{
  background:var(--v6-corail) !important;
  border:1px solid var(--v6-corail) !important;
  color:var(--v6-corail-encre) !important;
  border-radius:var(--v6-r-bouton) !important;
  padding:8px 16px !important;
  font-weight:600 !important;
}
body.hv5 .btn-mint *,
body.hv5 .btn-ink *,
body.hv5 .rp-cta *,
body.hv5 .btn-primary *,
body.hv5 .btn-pri *,
body.hv5 .btn-send *,
body.hv5 .ob-btn-primary *,
body.hv5 .f-cta-mint *,
body.hv5 .hf-btn-primary *,
body.hv5 .catalog-add-btn *{ color:inherit !important; stroke:currentColor }
body.hv5 .btn-mint:hover:not(:disabled),
body.hv5 .btn-ink:hover:not(:disabled),
body.hv5 .rp-cta:hover:not(:disabled),
body.hv5 .btn-primary:hover:not(:disabled),
body.hv5 .ob-btn-primary:hover:not(:disabled),
body.hv5 .f-cta-mint:hover:not(:disabled),
body.hv5 .catalog-add-btn:hover:not(:disabled){
  background:var(--v6-corail-2) !important; border-color:var(--v6-corail-2) !important;
}
/* ═══════════════════════════════════════════════════════════════════════════
   V6 — LE BANDEAU DE L'AGENT (posé par scripts/bandeau-agent.js).
   Son style est ici et pas dans le script : une couleur écrite dans un fichier JS est
   une couleur de plus hors du système, et c'est précisément ce que cette refonte défait.
   Le bouton blanc du bandeau porte son encre en !important : la feuille colore tous les
   liens en vert de marque, et « Parler à Bolen » sortait vert sur blanc au milieu d'un
   aplat jaune. */
body.hv5 .ba-bandeau{
  display:grid; grid-template-columns:minmax(0,1fr) 150px;
  border-radius:var(--v6-r-bandeau); overflow:hidden; min-height:150px; margin:0 0 20px;
}
body.hv5 .ba-bandeau .ba-c{ padding:20px 24px; align-self:center; min-width:0 }
body.hv5 .ba-qui{
  font-size:11px; font-weight:700; letter-spacing:.08em; text-transform:uppercase;
  margin:0 0 8px; opacity:.92; color:inherit !important;
}
body.hv5 .ba-p{
  font-family:var(--pf-head); font-weight:600; font-size:19px; line-height:1.3;
  letter-spacing:-.3px; margin:0 0 16px; color:inherit !important;
}
body.hv5 .ba-mot{
  font-size:14px; line-height:1.5; margin:-8px 0 14px; opacity:.92; color:inherit !important; max-width:62ch;
}
body.hv5 a.ba-parler{
  display:inline-flex; align-items:center; gap:8px;
  background:var(--v5-bulle) !important; color:var(--v5-encre) !important;
  border:0; border-radius:var(--v6-r-bouton); padding:8px 16px;
  font-weight:600; font-size:13px; text-decoration:none !important;
}
body.hv5 a.ba-parler:hover{ background:var(--v5-survol) !important }
body.hv5 a.ba-parler:focus-visible{ outline:2px solid var(--v5-bulle); outline-offset:2px }
body.hv5 .ba-bandeau img{
  width:150px; height:100%; object-fit:cover; object-position:center 30%;
  border-left:5px solid var(--v5-bulle); display:block;
}
@media(max-width:620px){
  body.hv5 .ba-bandeau{ grid-template-columns:minmax(0,1fr) 96px; min-height:0 }
  body.hv5 .ba-bandeau .ba-c{ padding:16px }
  body.hv5 .ba-p{ font-size:16px; margin-bottom:12px }
  body.hv5 .ba-bandeau img{ width:96px }
}

/* ═══════════════════════════════════════════════════════════════════════════
   V6 — LA SÉLECTION QUAND C'EST LE PARENT QUI PORTE LE NOM.
   La règle générique de l'état sélectionné exige une classe parlante SUR le contrôle
   (pill, chip, seg, tab, per, btn, filt). Sur Évolution, le bouton ne porte que `.active`
   et c'est son parent qui s'appelle `period-toggle` : « 6 mois » sortait donc blanc sur
   presque blanc, 1,06 de contraste, et rien ne disait quelle période était choisie.
   On nomme ici les quelques conteneurs qui portent le nom à la place de leur contrôle. */
body.hv5 .period-toggle button.active,
body.hv5 .periode button.active,
body.hv5 .evo-periode button.active,
body.hv5 .seg button.active{
  background:var(--v5-encre) !important;
  border-color:var(--v5-encre) !important;
  color:var(--v5-sur-accent) !important;
}
body.hv5 .period-toggle button.active *,
body.hv5 .periode button.active *,
body.hv5 .evo-periode button.active *,
body.hv5 .seg button.active *{ color:inherit !important }

/* ── 19/09/2026 — LA SÉLECTION RESTE ENCRE, ET S'ÉCRIT EN CLAIR ───────────────
   Le vert du thème est devenu le corail de l'action : --v5-vert-encre (le texte posé sur
   l'action) vaut maintenant l'encre. Or plusieurs grandes listes plus haut donnent cette
   encre à des éléments SÉLECTIONNÉS, qui sont peints en encre depuis la V6 : encre sur
   encre, mesuré à 1,00 sur « 30 jours » (admin), « Tout » (Veille), « Générer l'article »
   (Mon blog). Une sélection se déclare ici fond ET texte ensemble, en dernier. */
body.hv5 :is(button,a,span,li,label):is([class*="pill"],[class*="chip"],[class*="tag"],[class*="seg"],[class*="tab"],[class*="per"],[class*="btn"],[class*="filt"]):is(.on,.active):not([class*="pane"]):not([class*="panel"]),
body.hv5 .ha-filters button.active{
  background:var(--v5-encre) !important; border-color:var(--v5-encre) !important; color:var(--v5-sur-accent) !important;
}
/* Ces deux-là sont battus par spécificité, pas par position : la liste plus haut
   (`:is(button,…).active:not(…):not(…)`) pèse (0,5,2). `:not(#_)` leur donne un identifiant
   de poids sans rien viser de plus. */
body.hv5 .ha-filters button.active:not(#_),
body.hv5 :is(.period-toggle,.periode,.evo-periode,.seg) button.active:not(#_){
  background:var(--v5-encre) !important; border-color:var(--v5-encre) !important; color:var(--v5-sur-accent) !important;
}
body.hv5 .f-cta-ink{ background:var(--v5-encre) !important; border-color:var(--v5-encre) !important; color:var(--v5-sur-accent) !important }

/* ═══ 19/09/2026 — TABLEAU DE BORD, MAQUETTE A ═══════════════════════════════════════
   Dossier « Happia-back-office-pour-Claude », proposition A. Une priorité en grand dans la
   couleur d'Orvan (cet écran est le sien), Orvan debout, puis trois synthèses et la suite
   du plan. Les données viennent de dashboard-hero.js, aux mêmes adresses qu'avant.
   Sur cet écran la priorité PORTE l'agent : le bandeau d'agent ferait doublon. */
body.hv5.a-hero-cap .ba-bandeau{ display:none !important }
/* espace-client.css masquait le « Bonjour » dès que le bandeau des actions s'affichait : la
   maquette A le garde, au-dessus de la priorité. */
body.hv5.a-hero-cap .copilot.dh-accueil{ display:flex !important; margin-top:0 }
body.hv5.a-hero-cap .copilot.dh-accueil h1,
body.hv5.a-hero-cap .copilot.dh-accueil .cop-sub{ display:block !important }
body.hv5.a-hero-cap .copilot.dh-accueil .plan-row{ display:flex !important }
body.hv5 .copilot.dh-accueil h1{ font-size:clamp(24px,2.6vw,30px) !important }
body.hv5 #heroCap{ margin:0 0 24px; display:grid; gap:16px }
body.hv5 .dh-prio{
  position:relative; display:flex; align-items:stretch; gap:16px; overflow:hidden;
  background:var(--v6-ag-direction) !important; color:var(--v6-ag-direction-encre) !important;
  border-radius:var(--v6-r-bandeau,16px); padding:32px 0 0 32px; min-height:236px;
}
body.hv5 .dh-prio-txt{ flex:1; min-width:0; padding-bottom:32px; align-self:center }
body.hv5 .dh-kicker{ font-size:11px; font-weight:700; letter-spacing:.12em; text-transform:uppercase; margin:0 0 12px; color:inherit !important; opacity:.92 }
body.hv5 .dh-prio-t{ font-family:var(--pf-head); font-weight:600; font-size:clamp(22px,2.4vw,30px) !important; line-height:1.2; letter-spacing:-.02em; margin:0 0 12px; color:inherit !important; max-width:26ch }
body.hv5 .dh-prio-s{ font-size:14px; line-height:1.55; margin:0 0 16px; max-width:60ch; color:inherit !important; opacity:.95 }
body.hv5 .dh-prio-gain{ font-size:13px; margin:0 0 16px; color:inherit !important }
body.hv5 .dh-prio-gain b{ font-size:16px }
body.hv5 a.dh-prio-btn{
  display:inline-flex; align-items:center; gap:8px; background:#FFFFFF !important; color:var(--v6-ag-direction) !important;
  border:0; border-radius:var(--v6-r-bouton,9px); padding:12px 20px; font-weight:700; font-size:14px; text-decoration:none !important;
  transition:transform .15s;
}
body.hv5 a.dh-prio-btn:hover{ transform:translateY(-1px) }
body.hv5 a.dh-prio-btn:focus-visible{ outline:3px solid #FFFFFF; outline-offset:3px }
body.hv5 .dh-prio-ag{ width:auto; height:250px; align-self:flex-end; margin-right:36px; flex:0 0 auto;
  filter:drop-shadow(0 12px 18px rgba(0,0,0,.28)) }
body.hv5 .dh-synth{ display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:16px }
body.hv5 .dh-carte{ background:var(--v5-bulle) !important; border:1px solid var(--v5-filet) !important; border-radius:var(--v6-r-carte,12px);
  padding:20px 20px; display:flex; flex-direction:column; gap:4px; min-width:0 }
body.hv5 .dh-carte-l{ font-size:12px; color:var(--v5-encre-2) !important }
body.hv5 .dh-carte-v{ font-family:var(--pf-head); font-size:26px; font-weight:600; letter-spacing:-.02em; color:var(--v5-encre) !important; line-height:1.2 }
body.hv5 .dh-carte-v small{ font-size:14px; font-weight:500; color:var(--v5-encre-3) !important; margin-left:2px }
body.hv5 .dh-carte-p{ font-size:13px; color:var(--v5-encre-3) !important }
body.hv5 a.dh-carte-a{ margin-top:8px; font-size:13px; font-weight:600; color:var(--v5-vert-txt) !important; text-decoration:none !important; align-self:flex-start }
body.hv5 a.dh-carte-a:hover{ text-decoration:underline !important }
/* La suite n'est pas une bulle : ses actions en sont déjà (le-gris-ne-mange-pas-le-noir.js
   rend d'ailleurs à la page toute surface qui porte la couleur de ce qu'elle contient). */
body.hv5 .dh-suite{ padding:4px 0 0 }
body.hv5 .dh-suite-h{ display:flex; align-items:baseline; justify-content:space-between; gap:12px; flex-wrap:wrap; margin-bottom:8px }
body.hv5 .dh-suite-h h3{ font-family:var(--pf-head); font-size:16px; font-weight:600; margin:0; color:var(--v5-encre) !important }
@media(max-width:900px){ body.hv5 .dh-prio-ag{ height:200px; margin-right:16px } }
@media(max-width:640px){
  body.hv5 .dh-prio{ padding:24px 0 0 20px }
  body.hv5 .dh-prio-ag{ height:150px; margin-right:8px }
  body.hv5 .dh-prio-txt{ padding-bottom:24px }
  body.hv5 .dh-synth{ grid-template-columns:1fr }
}
@media(max-width:420px){ body.hv5 .dh-prio-ag{ display:none } body.hv5 .dh-prio{ padding-right:20px } }
@media(prefers-reduced-motion:reduce){ body.hv5 a.dh-prio-btn{ transition:none } }

/* ═══ 19/09/2026 — MAQUETTE A SUR TOUS LES ÉCRANS ═══════════════════════════════════════
   Christophe : « Il faut faire tout le back office sous le même format ». Chaque écran d'un
   agent s'ouvre comme le tableau de bord : son titre, puis une carte franche dans la couleur
   de l'agent, l'agent debout à droite, un seul bouton. La couleur vient des jetons validés
   (--v6-ag-*), posés par bandeau-agent.js : aucune teinte nouvelle ici. */
body.hv5 .main > .page-head{ margin:0 0 20px }
body.hv5 .main > .page-head h1{ font-family:var(--pf-head) !important; font-weight:600 !important;
  font-size:clamp(24px,2.6vw,32px) !important; letter-spacing:-.02em; line-height:1.15; margin:0 0 4px !important }
body.hv5 .main > .page-head > p{ font-size:16px !important; color:var(--v5-encre-2) !important; margin:0 !important }
body.hv5 .main > .page-head .hint{ background:transparent !important; border:0 !important; padding:0 !important;
  margin:8px 0 0 !important; font-size:13px !important }
body.hv5 .ba-bandeau{
  position:relative; display:flex !important; align-items:stretch; gap:16px; overflow:hidden;
  border-radius:var(--v6-r-bandeau,16px); padding:28px 0 0 32px; min-height:200px; margin:0 0 24px;
}
body.hv5 .ba-bandeau .ba-c{ flex:1; min-width:0; padding:0 0 28px; align-self:center }
body.hv5 .ba-qui{ letter-spacing:.12em; margin:0 0 12px }
body.hv5 .ba-bandeau .ba-p{ font-size:clamp(20px,2.2vw,28px) !important; line-height:1.2; letter-spacing:-.02em;
  margin:0 0 12px; max-width:28ch }
body.hv5 .ba-mot{ margin:0 0 16px; font-size:14px; opacity:.95 }
body.hv5 a.ba-parler{ padding:12px 20px; font-size:14px; font-weight:700; background:#FFFFFF !important;
  color:var(--v5-encre-sur-clair) !important; transition:transform .15s }
body.hv5 a.ba-parler:hover{ transform:translateY(-1px); background:#FFFFFF !important }
body.hv5 a.ba-lien{ margin-left:16px; font-size:13px; font-weight:600; color:inherit !important; text-decoration:underline !important;
  text-underline-offset:3px }
body.hv5 .ba-bandeau img.ba-debout{ width:auto !important; height:220px !important; border:0 !important; object-fit:contain !important;
  align-self:flex-end; margin-right:36px; flex:0 0 auto; filter:drop-shadow(0 12px 18px rgba(0,0,0,.28)) }
@media(max-width:900px){ body.hv5 .ba-bandeau img.ba-debout{ height:180px !important; margin-right:16px } }
@media(max-width:640px){
  body.hv5 .ba-bandeau{ padding:20px 0 0 20px; min-height:0 }
  body.hv5 .ba-bandeau .ba-c{ padding-bottom:20px }
  body.hv5 .ba-bandeau img.ba-debout{ height:140px !important; margin-right:8px }
  body.hv5 a.ba-lien{ display:block; margin:12px 0 0 }
}
@media(max-width:420px){ body.hv5 .ba-bandeau img.ba-debout{ display:none } body.hv5 .ba-bandeau{ padding-right:20px } }
@media(prefers-reduced-motion:reduce){ body.hv5 a.ba-parler{ transition:none } }
/* Les fonds « doux de marque » étaient vert pâle en V5 ; la conversion les a passés en rose
   corail, qui se lit comme une alerte. En V6 un fond doux est du papier, le rose reste aux erreurs. */
body.hv5{ --brand-soft:var(--v5-vert-sol) }
body.hv5 .snap-canon{ border-color:var(--v5-filet) !important }
body.hv5 .snap-canon .lbl{ color:var(--v5-encre-2) !important }
/* La bande fine : sans action à mener, l'agent ne dit qu'un mot du jour, sur une ligne. */
body.hv5 .ba-bandeau.ba-calme{ min-height:0; padding:12px 16px; align-items:center;
  background:var(--v5-bulle) !important; color:var(--v5-encre) !important;
  border:1px solid var(--v5-filet); border-left:4px solid var(--ne-c,var(--v5-filet)) }
body.hv5 .ba-bandeau.ba-calme .ba-c{ padding:0; display:flex; align-items:center; gap:12px; flex-wrap:wrap }
body.hv5 .ba-bandeau.ba-calme .ba-p, body.hv5 .ba-bandeau.ba-calme img.ba-debout{ display:none !important }
body.hv5 .ba-bandeau.ba-calme .ba-qui{ margin:0; color:var(--ne-texte,var(--v5-encre-2)) !important; opacity:1 }
body.hv5 .ba-bandeau.ba-calme .ba-mot{ margin:0; flex:1 1 320px; font-size:14px; color:var(--v5-encre-2) !important; opacity:1 }
body.hv5 .ba-bandeau.ba-calme a.ba-parler{ padding:8px 12px; font-size:13px; background:transparent !important;
  color:var(--v6-corail-texte) !important; border:1px solid var(--v5-filet) }

/* ═══ 19/09/2026, soir — LE SOMBRE ATTEINT LES FICHES ═══════════════════════════════════
   fiches-happia.css écrit ses propres jetons (.fh) en dur, clairs. Dans le back-office ils
   renvoient aux jetons du thème : une fiche blanche au milieu d'un écran sombre éblouit. */
body.hv5 .fh{
  --fh-fond:var(--v5-fond); --fh-bulle:var(--v5-bulle); --fh-bulle-2:var(--v5-bulle-2);
  --fh-filet:var(--v5-filet); --fh-encre:var(--v5-encre); --fh-encre-2:var(--v5-encre-2);
  --fh-encre-3:var(--v5-encre-3); --fh-accent:var(--v6-corail-texte); --fh-accent-doux:var(--v5-vert-sol);
  --fh-ok:var(--v5-succes); --fh-moyen:var(--v5-ambre); --fh-non:var(--v5-rouge);
}
body.hv5 .fh .fh-tag-poids, body.hv5 .fh [style*="#CBE4D8"]{ border-color:var(--v5-vert-fil) !important }
body.hv5 .hc-plan b{ color:var(--v5-succes-txt) !important }
/* Un fond à l'encre porte l'encre inverse. En clair l'encre est noire et le texte blanc ;
   en sombre l'encre est claire : un « color:white » écrit dans la page disparaissait. */
body.hv5 [style*="background:var(--v5-encre)"], body.hv5 [style*="background: var(--v5-encre)"],
body.hv5 [style*="background:var(--ink)"], body.hv5 [style*="background: var(--ink)"]{ color:var(--v5-sur-accent) !important }
body.hv5 .ba-bandeau[hidden]{ display:none !important }

/* 19/09, vérification en production (compte réel) : trois restes du clair. */
body.hv5 .wg-action-urg{ color:var(--v5-rouge) !important }
body.hv5 .wg-action.asap .wg-action-urg{ color:var(--v5-ambre) !important }

/* ═══ 19/09/2026, nuit — SOBRIÉTÉ. Christophe : « trop de couleurs partout et les gros boutons
   marqués je m'en occupe ça va pas ». Maquette validée (« ok go »). La règle :
   · une seule couleur d'action : le corail plein, pour le bouton principal d'un bloc ;
   · les actions répétées sur chaque ligne (« Je m'en occupe », « Sarine peut s'en charger »)
     sont des boutons discrets : fond transparent, filet, texte clair ;
   · les encadrés de commentaire n'ont plus de barre colorée ni de fond teinté ;
   · titres, numéros et étiquettes sont à l'encre ; le bleu clair ne sert qu'aux liens. */
body.hv5 main [style*="color:var(--v5-vert-txt)"]:not(a):not(button),
body.hv5 main [style*="color: var(--v5-vert-txt)"]:not(a):not(button),
body.hv5 main [style*="color:var(--v5-ambre)"]:not(a){ color:var(--v5-encre) !important }
body.hv5 main div[style*="color:var(--v5-vert-txt)"]{ color:var(--v5-encre-2) !important }
body.hv5 main div[style*="color:var(--v5-vert-txt)"] > b{ color:var(--v5-encre) !important }
body.hv5 main [style*="border-left:3px solid"]{ border-left:1px solid var(--v5-filet) !important }
body.hv5 main span[style*="radius:100px"][style*="color:var(--v5-succes)"],
body.hv5 main span[style*="radius:100px"][style*="color:var(--v5-ambre)"]{ color:var(--v5-encre-3) !important }
body.hv5 .bpi-agir, body.hv5 .bpi-hbtn, body.hv5 .hp-btn{ background:transparent !important; color:var(--v5-encre) !important;
  border:1px solid var(--v5-filet) !important; box-shadow:none !important; font-size:13px !important; font-weight:600 !important;
  padding:8px 12px !important; border-radius:10px !important }
body.hv5 .bpi-agir:hover, body.hv5 .bpi-hbtn:hover, body.hv5 .hp-btn:hover{ border-color:var(--v5-encre-3) !important }
body.hv5 .bpi-num, body.hv5 main .ch-num{ background:var(--v5-bulle-2) !important; color:var(--v5-encre-2) !important }
body.hv5 main .callout, body.hv5 .bpi-encadre{ border-left:1px solid var(--v5-filet) !important; background:var(--v5-bulle) !important }
body.hv5 main .callout b, body.hv5 .bpi-encadre b, body.hv5 .bpi-ht b, body.hv5 main .happy b{ color:var(--v5-encre) !important }
body.hv5 .bpi-happy, body.hv5 main .happy{ background:var(--v5-bulle) !important; border:1px solid var(--v5-filet) !important }
body.hv5 main .eyebrow{ color:var(--v5-encre-3) !important }
body.hv5 main span[style*="color:var(--v5-vert-txt)"][style*="radius:999px"]{ color:var(--v5-encre-3) !important }

/* 19/09, nuit — « À faire » : les pastilles « Aujourd'hui » et « Proposé », le levier et le
   « pari » gardaient leurs couleurs. Seul « Ce qui ne va pas » reste rouge : c'est un état. */
body.hv5 .hv5-past{ width:fit-content; align-self:flex-start }
body.hv5 .hv5-past.auj, body.hv5 .hv5-past.prop{ background:transparent !important; color:var(--v5-encre-3) !important;
  box-shadow:inset 0 0 0 1px var(--v5-filet) }
body.hv5 .voie-levier{ color:var(--v5-encre-3) !important }
body.hv5 .voie-pari{ background:transparent !important; color:var(--v5-encre-2) !important; border-color:var(--v5-filet) !important }
